|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ f# X/ l# p; k4 ~) g& t/*9 f: `2 }+ W/ A3 O' q( h
* Copyright (C) 2009 Texas Instruments Inc- U5 P: j! V8 J0 m3 N$ o
*+ V& f. A: c6 u. e/ Q9 c/ l0 F; |
* This program is free software; you can redistribute it and/or modify
; o, \- p' {4 z8 E * it under the terms of the GNU General Public License as published by( S$ ~# @( x4 S1 F& s$ y
* the Free Software Foundation; either version 2 of the License, or
) |. I( ^. }: N q" W * (at your option)any later version.
& _" @, x- ~% S) b" W/ W! a; w *
! I* }. n8 k6 |3 V- S * This program is distributed in the hope that it will be useful,
$ E6 k6 g) W `9 v# N * but WITHOUT ANY WARRANTY; without even the implied warranty of7 i# s2 p, \8 J) u. B
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 X. \# n- f' V5 V
* GNU General Public License for more details.
# Q- D2 I/ d. q/ w8 M *9 K6 V2 ` D- m# V8 x+ ?
* You should have received a copy of the GNU General Public License
/ m' R# M( Y3 E* i; @* V# v" e * along with this program; if not, write to the Free Software
5 s6 S; U3 |) {7 Q3 p * Foundati7 s' w' l9 e; B8 Y
*/
X: s5 u2 a0 M$ R* a#include <linux/module.h>
0 R2 T7 t2 i2 S! d5 g2 i+ i: [#include <linux/init.h>% G( D8 i/ \9 G# l0 f' b
#include <linux/errno.h>
( C4 j' C1 C$ T9 W1 n |# M4 P#include <linux/types.h>% w% r" e1 n# g! f: V( Z: V0 T) l* N
#include <linux/interrupt.h>
4 l0 G y6 P) C6 I/ E#include <linux/io.h>
) F2 O) }# _1 H7 E: _#include <linux/sysctl.h>+ c% g( l- E5 A
#include <linux/mm.h>) k" k* W4 H0 \% y0 g, }
#include <linux/delay.h>9 `& z( l' a$ D: \
#include<linux/kernel.h>
" l* a# v& `) L1 D% e1 K" D" U- T#include<linux/fs.h># p6 [7 r3 q4 l2 y" g; h
#include<linux/ioctl.h>- s; B6 e2 n2 @2 G( ]
#include<linux/cdev.h>8 Z- z2 d" j) v
#include<linux/kdev_t.h>
A9 `( ]4 C+ F( w( z/ [9 [; u#include<linux/gpio.h>
$ Y8 s2 s5 L& D4 c& E#include <mach/hardware.h>/ A$ o8 p0 W! G8 n
#include <mach/irqs.h>0 T( _. D; I! E J' o( l
5 G3 p; ]( R4 F8 G#include <asm/mach-types.h>. J5 L0 n; i1 I3 ]
#include <asm/mach/arch.h>
?4 o. C& w# D' T#include <mach/da8xx.h>: u4 t8 K0 N$ W
#define SYSCFG_BASE 0x01c14000
5 b" c7 z+ K/ @3 ^#define PINMUX1_OFFSET 0x124
9 ?. O: w F$ i4 V" g0 [+ F7 H#define PINMUX18_OFFSET 0x168 . S. g6 N" g/ y- M& T" _" C G0 e4 r
#define PINMUX19_OFFSET 0x16c
3 R' B. c, b) ?5 S! r* g/ n/ e+ _1 k#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
7 P& i i" Y8 l' A7 m#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ Z2 U% i: e$ a- W, m; `- u
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR I" r& Y$ L" h' T: x5 w& h) J
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
: h2 j! L: A2 d9 v#define PCR_ADDR 0x01D11024 //MCBSP1_PCR1 ^$ P# T) i5 e: {% k3 l
# p" ~: J+ b9 E f+ ?; ]+ I
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR( {: ]' B7 j, ^. Z
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR4 k& Q5 H# _9 I' V6 m
//PSC# Z$ ?) v- H J
#define PTCMD_ADDR 0x01E27120
1 q! J) K* O$ j3 n& [0 W3 g3 m& y. r#define MDCTL15_ADDR 0x01E27A3C) l) N; X. `6 D y2 ]& l
#define PDCTL1_ADDR 0x01E27304
. U8 I7 x( k3 v' L4 t, q//GPIO8 direction
& a; u0 C( S$ S2 u3 w: Z( S! _1 x#define GPIO8_DIRECT 0x01E260B0
8 |0 p3 M7 r( g) y4 L1 E4 y#define GPIO8_OUT 0x01E260B4
' L4 X; B. W e# }#define GPIO8_IN 0x01E260C0
8 f e X+ R# P
8 ?: S' [$ a* M5 s! ?//#define MCBSP1_RINT 99 8 P7 @2 {# h* j+ e3 B( P) ^9 K
//#define MCBSP1_XINT 100
4 e% h( F$ Z0 N: p5 X5 f0 U- lstatic int MCBSP_MAJOR=239;
2 R$ X$ a: L# S' m5 istatic int MCBSP_MINOR=0;
( L3 z. `' O% [) Bstatic int count =1;$ i s" j7 W! a
& a- f8 p% v5 B: H& _0 n% ^
#define MCBSP_NAME "MCBSP-device"# R$ V& v% B* r# r( }( B
* h8 a, c2 e- M8 r# f' x
static struct cdev *mcbsp_cdev;
; y2 E6 D ? y6 O* i3 mstatic struct class *mcbsp_class;
9 n' F0 e/ R+ N a2 ^. Zstatic dev_t mcbsp_dev;
/ n1 t, ^) A( S# _6 ounsigned int DRR_data;
0 ^0 N- \; C1 t. W) K1 G( F( tunsigned int DXR_data;0 O4 k. o5 `" L
static int mcbsp_open(struct inode *inode,struct file *file)8 x# d R: d V; }/ S$ |
{
8 \( f4 C0 b" w; `
# k$ k' [: H5 W //interrupt enable,initialized* I* ~$ V3 w2 \; ^8 _
unsigned int temp;: c$ l) U; i5 z1 l
//SLEEP_EN(GPIO8[10])---0
# I, i7 w7 j( U q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 o! ]7 D* ^6 c9 E: b6 R temp=temp&(~0x00000400);0 ]0 ]' u$ u+ ^, j( h% K
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]+ S3 J5 p% u. y
//RESETn(GPIO8[8])----0----19 i" s7 N" V6 ^
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 |+ c2 k5 n" D7 n
temp=temp&(~0x00000100);
9 ?% v5 u/ M$ ]( Y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ m3 }6 v! o9 p
udelay(100);
/ d- j: J+ `9 N temp=temp| 0x00000100;
5 l; Q/ l7 t7 \+ Q" d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. I8 x. L1 s7 O. L: q/ S udelay(100);/ W# j2 K( {- X2 h$ N3 U
printk("open success!\n");8 m2 O" k; k, v+ D) u$ R# g
return 0;8 `! q5 Y. h5 H0 j {
}8 h0 o N6 R) A0 p! e' `
5 }; M* W2 p3 V6 B. \( m @
static int mcbsp_release(struct inode *inode,struct file *file) @- R+ C. U) [4 d7 q
{0 o5 d2 r, D5 l; t( }
printk("release success!\n");7 x( W- w! C3 L. u
return 0;
- j# p% J K% u/ b% Y: Z: t7 _3 g}
/ J- ` z* r4 X2 O, C/ u% O* c; c! A7 S6 f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, U% J$ n- D- h0 r6 D- \{
3 t8 v; l. y, n9 @ d1 A9 M copy_from_user(&DXR_data,buf,len);
+ r- D: M# P) z+ L7 h$ s iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
9 O* V0 J) _. n1 A S8 f& G' i return 0;; k* P# v8 P2 j8 \3 c- e
m3 @; Y3 H; X' ?$ n}; ^' x7 P, F. p! V, b& U
8 g( x$ a+ O% o8 I G \9 R5 ]
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, E7 S& Z$ _) M{
3 r3 f6 ` D# m1 I: n5 m DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- O" h8 @ h9 X! ]. q
copy_to_user(buf,&DRR_data,len); 1 D8 _4 F4 O3 {" N' Y" L0 \
return 0;
+ i: [, U: _: k1 V1 K6 ]) m2 c}
) p4 O$ S$ L, E' Z: k1 A8 D# [. N0 x0 o4 c' ~/ J
/ C1 p* f; p! Q* ]. F+ W A- g* z
static struct file_operations mcbsp_fops=
0 _; p) S7 e& I; ?# x4 e{
# K- w+ ~+ _ ^ L6 i i .owner=THIS_MODULE,
, ~* P2 _3 I& s( n5 K .open=mcbsp_open, {) t4 Z: M/ ~5 y8 l
.release=mcbsp_release,4 J- l; v. r: P0 n+ z# G
.write=mcbsp_write,
" `/ d) i o7 x .read=mcbsp_read,3 N1 g7 y7 d7 ~* ]
};
7 z8 Q0 T2 u" R3 m, Bstatic int __init MCBSP_init(void)
5 L7 d9 J6 F- l9 r4 Q{
: L2 M4 ?/ o$ ^9 x8 G0 O int ret;
) w# P% t9 L; L2 z, z2 c unsigned int PINMUX1_REG_old;8 X' ~3 ^: Z& g1 d; Q$ B, H" F
unsigned int PINMUX18_REG_old;
2 l' \% V, `# q5 A+ t1 x unsigned int PINMUX19_REG_old;
( ]0 }4 m4 M- w unsigned int temp;
# a4 h! V1 j4 V/ L6 u if(MCBSP_MAJOR)! r3 y' s0 O1 q0 f8 x
{. Q3 f' @6 j. T8 L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 o* f; T- ~ n( W! f0 }3 n
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);; j6 w5 ] a9 C! i
}
I a% j4 A7 _- `# h4 Y# U else+ z9 f, n) M' F- w8 }
{ D+ Y" R X) q
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 x. @ ]# y* k- ` MCBSP_MAJOR=MAJOR(mcbsp_dev);+ ?+ v8 h1 L! A3 x! l- Y
}/ o5 y, K2 x4 J* T( \
5 N( @% `4 p$ N) }$ o6 ~2 x
if(ret<0)
2 @! W y i/ V3 P {
' u/ d# S# X# l. ^1 @! \# [# g printk(KERN_ERR "register chrdev fail!");
" G1 p) ]- ~, l) _ return -1;
8 s2 w, Y& m* R } C8 B! P( F( G) l/ H" O' S" v
, p/ m! P( ?- @" _) t
mcbsp_cdev=cdev_alloc();4 O* k! ?% [% _ [7 q. f
( H& B; @; X' {7 Z4 C
if(mcbsp_cdev!=NULL)2 i4 e8 C( u8 a8 S' B$ m/ R
{
- j7 C$ ^( r' \) h; |7 p cdev_init(mcbsp_cdev,&mcbsp_fops);
/ b0 z% ^' j1 \: i6 k7 F mcbsp_cdev->ops=&mcbsp_fops;7 H; R. s6 g1 p" t- L: s0 Z) Z
mcbsp_cdev->owner=THIS_MODULE;
4 j( j6 S' |! T! q# Y- }! J( v' m/ v8 X ) E _% e1 {+ C' x- \5 e; e
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 i# e, x% d9 x1 Z6 w
printk(KERN_ERR "register cdev fail!");! ~+ \6 A2 [( `$ {, e" P$ e
else
4 E5 _9 W8 [2 t$ P( Y; O printk(KERN_ERR "register success!\n");/ g4 M& W& l7 g0 R3 c% \( |3 t$ |8 d( ]
}
. @) n; R* b) _/ r( ] J else9 M4 D5 l7 m' F! a8 O
{
2 E5 b; U3 Q5 |4 P printk(KERN_ERR "register cdev err!");& d. W, {; q8 d. F0 o
return -1;
0 s! r, f8 {5 ^$ ?+ A) K1 t7 k1 M% C; ] }
! _! q; d; i. |5 n# V
. D2 l5 o E& B' f- \9 c1 F( G1 x mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
& f3 M- S$ q" ]# a, \ if(IS_ERR(mcbsp_class))
$ {+ K- N# b) Q% W {2 m8 y8 I$ C" I# K* Z6 w
printk(KERN_ERR "register class err!");
% e$ Q7 @+ C8 k; x" D: T5 e return -1;" s5 e1 }, }5 d) k% R; D! U
}
, g3 v$ U) g. Y2 w% |- o& A device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 q' g- t8 Z7 h! a( F1 n9 _4 {# G0 c/ k0 ^% C: z" q3 @, s
//PSC2 ]) |/ W' g4 Q% y" E2 s
//add Enable MCBSP5 _( j9 Q$ V( @2 o3 T/ ]1 S
//test. u* E& G1 E( ?7 {0 v/ U( b
temp = 0x80000003;4 u5 i# U+ f5 z' J; h2 G
writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 K1 d# X, k9 [4 A! Y
temp = 0x00000003;
$ T+ Q: e0 k7 ^3 U3 Q$ ^9 r; N) Y1 Q writel(temp, IO_ADDRESS(PTCMD_ADDR));: x5 \7 M# Q. j ^4 X
! [, O4 d, L. I" c- K8 z: T& r
temp = 0x001FF201;
- @( N8 B) P# l p* s- Y: R writel(temp, IO_ADDRESS(PDCTL1_ADDR));- A9 U" _* _/ M0 T5 C \
+ q) A0 D" v5 W2 \5 f/ _ _8 [ //PINMUX 9 k9 u% L* I* H( v
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,# S1 p, R, g1 S
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) j' S5 f$ r! K
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
# @. ?5 O# E3 |+ D" }! e) h. h$ h writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 r; x# o& z! _, e$ x0 } 3 O l @, ^, ]4 K7 C
//SLEEP_EN,EPR,L138_SHK1,L138_RC# z1 R2 E9 S1 o
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ N- }$ P. X1 J5 R. S- L PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
1 V# J$ T- T& }3 Z6 B* p writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 |+ _5 K: l( L k
4 C, ?( l& L! p) {) P
//RESETn,L138_SHK2
3 ~- d) i: R$ _% F# x% w PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ! i% y4 i* Q1 Y- a) M% P
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 0 r8 U8 i) G9 ?& k: |
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 J% G f) a4 D+ {# q* \8 J
: T1 F4 c+ ]: i( O
- o: ` b3 c' c# Z" n' N( S( f& P; @
//SPCR Register
' W! t, \2 x, n p: Z7 \. {" P. J //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 H9 Q. q, d% \: g7 M6 t8 O
temp = 0x03000000;//(DLB=0)7 N# y/ U# q$ |) U6 }
// temp = 0x03008000;//(DLB=1)6 g. G$ i9 g6 h% a6 F: U2 q) y! S5 M
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
: s0 T( m8 Q' k' C6 @' A4 v7 W% u temp = readl(IO_ADDRESS(SPCR_ADDR));
! f3 \4 v ~) z% z) h printk("temp=%x\n",temp);" G. d f; Z+ v+ v! [
4 c- O0 ^6 F# v //PCR Register. V' N" V3 k! I4 @3 ^. u: O) J
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 i8 J& G/ C5 _/ E+ x
// temp = 0x00000F0F;
8 J; b5 E1 [- X/ p0 P$ j% M# C temp = 0x00000B0F;( U3 W+ _1 R" x5 N& b! P
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 6 y0 s4 q" O; Z! F) G g
temp = readl(IO_ADDRESS(PCR_ADDR));* K: R5 f) M3 Y/ ?# R; P
printk("temp=%x\n",temp);
L$ j; q8 A ~8 t8 D! K //SRGR Register
- h0 s2 m7 P- q* s; H //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 Z% B: j& `5 @
//temp = 0x301F000B;2 G8 W6 {/ E9 q; a9 l
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized b3 Z/ n# \8 h1 j# h! ]
temp = readl(IO_ADDRESS(SRGR_ADDR));
1 U8 t6 i8 G5 S) c2 T! \# \( M printk("temp=%x\n",temp);, }, P4 |- N% \) s7 b( E
//RCR7 Y! ~2 }" M4 X; m0 Y/ x9 M
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 D! f( H8 P4 p9 F$ R //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 _) n6 {% V8 H( ~, { temp = 0x00440040;$ z. H7 y; |2 P
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
. D; W$ ~- k" S* y2 l temp = readl(IO_ADDRESS(RCR_ADDR));" l1 d& M* [0 V
printk("temp=%x\n",temp);- x1 M0 ^+ D: k
//XCR* y6 D8 ]/ z1 l% h. Q1 [- T
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 c% J- r. i* O: e: T/ }: Q. K* V; ?
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" P* F7 m h. g. j temp = 0x00440040;
! p# |, y* @# `$ u9 F0 w writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized * R3 ~9 H. Q# a$ q |- |$ J4 E$ }
temp = readl(IO_ADDRESS(XCR_ADDR));* t l0 i* X8 u" @5 J! D# D
printk("temp=%x\n",temp);- m3 G, z0 N$ X" f4 Q3 A- S
udelay(100);
& g% ] g d# u4 H# J //SPCR Register! K. L) }, V6 A; ~* u5 O
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; X+ Y3 `; d6 B% ?+ C Q+ u& o temp = 0x03C10001; //DLB = 0 VS DLB = 1
. s& v- V( q2 T7 v; u2 K& ?0 z4 r writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled! q5 J& B! A8 a. X3 f& ]9 d) L/ H
temp = readl(IO_ADDRESS(SPCR_ADDR));" B# H8 {7 m0 q
printk("temp=%x\n",temp);% O; u/ U& F. k. L, ^
udelay(100);* b# l2 I# u' A( ]( {
" }' w; j* D$ a: e
//set GPIO direction. ] c6 D+ Y1 i3 c/ o
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& Q+ c* ]+ U* I temp = temp | 0x00000100;//EPR----input9 ~0 h9 g9 N! q- b: Z
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% p* K8 M( q/ K- ^* \- n, H0 @# t& w( ~
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
z4 L/ \3 `) Z, \ S
# _& a# p( C; K H return 0;
" J5 m, A5 x( C}
; O' b- x2 i- y& N' \0 G estatic void __exit MCBSP_exit(void). m# \" A! b1 M, f2 @5 N) j
{
# F+ ~, _% P2 O# m0 s printk("mcbsp chrdev exit!\n");% ~+ m' i# I% K8 Y; {3 A$ _' P
cdev_del(mcbsp_cdev);6 {, o: T0 w; ^
unregister_chrdev_region(mcbsp_dev,count);# }1 P, | }3 u7 I5 {$ Z
device_destroy(mcbsp_class,mcbsp_dev);1 c' `) {" m, D8 @3 {9 a
class_destroy(mcbsp_class);5 D* |4 _0 T5 ]4 F- G7 ]9 \: B8 [1 |
}
( D# @. h: B( tmodule_init(MCBSP_init);
- B+ W# h- s" m/ h4 gmodule_exit(MCBSP_exit);
0 A. D$ R9 F1 J9 h
+ @9 t' Z3 N, X9 zMODULE_LICENSE("GPL");
8 Q. z# u( s. [+ n5 N7 `! |% ~* S* H2 Z9 j1 R
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" F' F( _. v+ E- n" l1 h2 M我的应用层的测试程序如下
6 f# j- K2 D1 R#include <stdio.h>$ ^) N4 f5 c5 M* A2 E0 S( S' D
#include <string.h>; r$ j! v, ^: U8 F& U9 P3 ~
#include <fcntl.h>3 z- R' y4 y2 f% I
#include <unistd.h>/ \; |$ ^, e) A0 }+ H! L; @% e
#include <signal.h>) F& `6 z* U. G; N6 m, |" `% g
#include <pthread.h> //线程, ?; k! C$ N, t8 O# i
#include <stdlib.h>+ Y8 k1 l# R6 K: `) ~# Y. F2 j+ V
#include <pcap.h> //捕获网口数据& x9 p5 F$ }% P f5 k- \
#include <semaphore.h> //信号
( @. j# N) Q7 T#include <sys/types.h> //消息对列
- i1 n! s- u$ B: g: M7 E( i8 C$ ^#include <sys/ipc.h> //消息队列
: [: r" M8 k7 ~8 X5 j, |7 `#include <sys/msg.h> //消息队列
: x2 x6 W/ @8 Y& ]#include <sys/select.h>3 z/ ?" b# n" k. [1 {8 R% }
#include <sys/syscall.h>
$ ?% ?3 z% u% P2 b#include <sys/stat.h>& x% v' e7 e! y
#include <sys/mman.h>
( T+ R% W; w8 U; e9 D [: x7 L1 c#define msleep(x) usleep(1000*x)
! @2 ]3 N/ C) {1 h" W
- I1 z, ^$ P+ Yint main()! x& ~1 \1 e3 @1 ?; Z+ h
{
9 E9 B- U$ r8 G) ]* W4 E6 A; v7 z# T5 o //MCBSP,ARM与AMBE2000交互设备
4 m! @ v- _. W. P int fd;( u2 M, b: [* S4 |% F& d' Y
unsigned short data_write = 0x5555;6 N& I* _+ M w, j4 f; }
unsigned short data_read = 0x00;
2 ^* O0 Q/ n& o8 V; E4 D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 k- q9 K1 j! N% A5 ]9 M // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# u2 K& W R* [/ v) v5 W
8 }# D; |/ ?/ F7 h6 I9 M- a+ _ if(fd < 0)* y/ R3 ]2 V3 t+ o5 j( B7 G
{# ]0 N8 _ F0 Q0 w" z
perror("open failed\n");
# q# S( }1 m8 Y- b return -1;+ n1 ~# p) j7 W
}1 [( D; @9 t8 V) a! n
7 W! `/ q/ p2 _" F2 p( `% K while(1): h4 w' z( [, Y& M
{# t. W# J1 y8 \$ _- T
! ?% ~8 {( J0 h3 e' u
//AMBE2000每次读写是24个字为一帧+ \6 a: p) }! x7 H3 `* D" b, [
//写数据时将数据在底层存储起来,等到中断的时候再发送: M# t- G c" w* R) l" T% z
//AMBE2000输入数据是以0x13EC开头的
& m' e* R: x: H; k- ~ write(fd,&data_write,sizeof(unsigned short));; [: N8 I( _* L9 D1 Y" w
7 y* ^: u \6 W* b //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- `4 D0 ~! ? _4 M read(fd,&data_read,sizeof(unsigned short));
- h6 L' Z3 A' G L& g. [9 e% y' S5 x
) }" c- t2 m! D$ c) l1 y) u' ] if(data_read == 0x13Ec)
h" g7 {# z4 D$ |! `/ N" x& e2 G* o6 U5 ~ {0 q; `8 [+ W' [
" V# ?# j R% R' C) D2 s" W
printf("data_read = %x\n",data_read);" ?; t9 W; i- }5 v" z# T
}2 C t) l1 Q* i: N7 ?
- X1 {) h$ T- C; ~ msleep(10);
4 M/ Z0 e) [/ \0 R 3 C( r0 w7 Z! M# Q
/*
) @! k/ W4 P6 |# s( D ioctl(fd,1); : h0 S8 V0 o; f; k9 V- m9 u2 ~& L5 X
sleep(1);
' E' S7 d( j6 R! N. m% U4 q; J& Z ioctl(fd,0);
+ u1 t# V2 v, b sleep(1);+ S! U0 H, t2 @, i% j# y; @
*/ x0 e: B5 D2 X. k" Z' b
}
! M# g% q/ L0 j4 K( f1 g return 0;, i" ]! [" y/ i( W! X
! h {1 f2 T9 ~+ l* t8 o6 `}$ Z* R- D. I/ s
/ S) R1 |- j! v7 R+ i多谢各位指教,谢谢! 急
6 j* J2 q( n, g! S8 Z$ @3 N, M* {7 E4 ~2 S
% Q }) w- u; o4 [- K& t) Y4 \9 k P& d& Q% `* t" y
7 [. S3 M9 b O! b6 u4 r" Q$ T% W- q- D
1 Z; q' _5 w* [2 v& _
|
|