|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# }' ^" v& \1 z/*
5 |2 Y2 \4 [: m2 H1 f# |- @5 D. B * Copyright (C) 2009 Texas Instruments Inc$ w6 x/ ^: q8 I. ~8 S# o/ F
*' ]% W/ ^$ e" N8 I8 X, z( A
* This program is free software; you can redistribute it and/or modify
4 B: C4 [# t" R8 b0 N1 z * it under the terms of the GNU General Public License as published by0 x* X( G# Z2 Y
* the Free Software Foundation; either version 2 of the License, or# \+ {+ |/ p; F h
* (at your option)any later version.
2 F2 [0 K( F# D% d6 S2 }5 x *( J. i5 Q6 ]8 s @+ d" M$ Z' F
* This program is distributed in the hope that it will be useful,
0 V+ I! M' l/ G- M3 ^ * but WITHOUT ANY WARRANTY; without even the implied warranty of
. a3 V1 B; G- _ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! X1 o, e* \4 N
* GNU General Public License for more details.' a) I( \4 E# Y5 M+ g( U5 `" d7 N/ S
*. z- z" E) a" \9 ^2 [ b+ g
* You should have received a copy of the GNU General Public License
, H: U* b( [: T) u6 s3 ?" G1 s * along with this program; if not, write to the Free Software- T* z' q3 P( l! Z6 \5 F7 M
* Foundati6 r/ t) d: O9 C3 o2 t6 n
*/+ V- L3 p# Q' z
#include <linux/module.h> h0 @& o) z' X0 q& |. L
#include <linux/init.h>
0 r c I+ E" O3 C2 \#include <linux/errno.h>6 g) r g. ~% [0 K3 r. J
#include <linux/types.h>
( u3 q9 L0 F, Z#include <linux/interrupt.h># I$ e' ]* V4 B: O
#include <linux/io.h>, j) M6 S0 F7 V, l6 p# ?
#include <linux/sysctl.h>
6 _; @6 u- p0 D. t6 v' g#include <linux/mm.h>4 P4 n( x+ ~. l. j- G
#include <linux/delay.h>9 K, S" ^, _- u8 z
#include<linux/kernel.h>$ P4 R0 W" D/ X% L e
#include<linux/fs.h>
- O# K U; U( ~! }7 j h#include<linux/ioctl.h>
$ i& s7 |' J2 M9 ?& L" J#include<linux/cdev.h>
% L6 P! f' c4 q' Q# E#include<linux/kdev_t.h>
: ]! e4 Q6 e8 T. w# u2 p#include<linux/gpio.h>$ D% L& q5 @3 v7 `
#include <mach/hardware.h>3 O+ ~' Z5 U0 d2 h
#include <mach/irqs.h>3 v# o: E* k3 k7 h
, K. ]5 |; m0 e* s/ s- @#include <asm/mach-types.h>2 X' M# w4 U4 D1 x* s, O
#include <asm/mach/arch.h>
8 J) t% u5 f# u2 h( y#include <mach/da8xx.h>
/ o+ e( H" W" s, m; _#define SYSCFG_BASE 0x01c14000
+ q, d. X& g! g#define PINMUX1_OFFSET 0x124
. j T& i Q1 `0 x#define PINMUX18_OFFSET 0x168
% b7 n8 Z" R' _% Y#define PINMUX19_OFFSET 0x16c6 E6 ]( F/ A( L$ k0 o! Z
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
; z4 p% i# V' Q+ \% V/ Z#define RCR_ADDR 0x01D1100C //MCBSP1_RCR) G8 e" C8 `$ m# Y# k( X) f, J0 H
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
+ |# n: W: U, q" a( q9 i6 o#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
# U( v4 r* Y$ c; ~2 x% } r#define PCR_ADDR 0x01D11024 //MCBSP1_PCR5 ~4 f) B+ O+ K _* W" I
6 G, w4 Q ]2 c
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
* C* \' T8 e" I' ?. A/ H#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( x; S5 E' c( F& h//PSC
8 ?$ q$ U1 V+ P: k6 [#define PTCMD_ADDR 0x01E27120
m6 r0 e5 H3 k2 F8 s2 S" U#define MDCTL15_ADDR 0x01E27A3C
' |5 k& l6 i* y; m#define PDCTL1_ADDR 0x01E27304' k( ^( t8 Y- Z
//GPIO8 direction
- H( p' Y3 D& ^7 L, w% R H#define GPIO8_DIRECT 0x01E260B0
( d9 _2 O# D' L% _4 t8 X#define GPIO8_OUT 0x01E260B45 x7 F5 V9 s; {% Z
#define GPIO8_IN 0x01E260C0
% J1 m& E$ t# w! r- p- q( L% w2 S( X" v; v$ r+ y: J. A
//#define MCBSP1_RINT 99 ; J9 W) W! }1 @9 A% A. I) F
//#define MCBSP1_XINT 100 6 U! r4 ~7 {. S/ P: Q$ g6 A: X
static int MCBSP_MAJOR=239; `" _0 Z# m: b& G: U7 x/ I
static int MCBSP_MINOR=0;
. P% ]. u$ v6 G/ @8 @0 q7 m. ]5 Vstatic int count =1;+ i( w' M u. J, k+ z! \6 Y
4 C. V/ j; Y. p+ l
#define MCBSP_NAME "MCBSP-device"
, s- J* d, ~& T+ |2 M
* g. X) _6 ]' M( s8 M/ \9 X6 ` L+ sstatic struct cdev *mcbsp_cdev;9 k6 f0 \' {; l$ m: ]
static struct class *mcbsp_class;
7 N! p u" @+ P0 ]( Q' |static dev_t mcbsp_dev;! o9 U$ F9 w! N
unsigned int DRR_data;
- L" W: f; c( S# o4 ~& Wunsigned int DXR_data;
" l6 G% N! Y N) \3 [ r( Qstatic int mcbsp_open(struct inode *inode,struct file *file)
- n% T# H: I7 ]) H5 g; G{8 w% @2 V p; q! F& q; g8 h
' H5 g: W8 Q: Y* w- T
//interrupt enable,initialized+ w6 F; F# [5 D3 | P2 V$ S4 p
unsigned int temp;( V. `9 F0 c( d( D v3 k
//SLEEP_EN(GPIO8[10])---08 n4 ?7 X$ l$ P! z9 o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ O. N2 E9 k$ p. p$ l temp=temp&(~0x00000400);
# j5 S; m; |' T5 z. ~! E3 | __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 T4 s3 I4 O, X v+ ^ //RESETn(GPIO8[8])----0----1
* w. `; ~. I: n: S' s" _& u temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ V* g0 {, ^ m5 P, y, U
temp=temp&(~0x00000100);
! a* U/ t5 r( B1 F __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---07 d7 m. _% u- O$ j
udelay(100);+ v& M- F: X; [9 L
temp=temp| 0x00000100;
; l _* B0 T7 Y6 D; j* i2 O/ A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
m4 k; H7 Q1 ~' @ q9 h% w udelay(100);4 d, g: j) e5 Y1 W2 X5 G7 e+ L
printk("open success!\n");: R5 X" o G% d$ m) }2 t
return 0;
+ B8 i) M# [6 ~' W6 g: u7 w8 {}
0 J( b9 w F- Z9 P" _
/ ^* s4 Z+ P5 i5 t/ b- M! jstatic int mcbsp_release(struct inode *inode,struct file *file)
# B1 Y E% n/ |4 V8 {7 s r! `% p{2 r3 A- A. ]/ }3 g9 _
printk("release success!\n");
2 h& F; V7 D6 Z7 z- K return 0;; R8 I7 l1 W7 k
}# Z* Z6 Q5 Z' z; F0 ]& J/ c) }
9 ?: T. G; D# h9 j
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 I5 I; {$ t6 t% O{
! S7 W0 m/ t! e2 A copy_from_user(&DXR_data,buf,len);
5 \( T; ]6 {; _0 @, m; o- ]9 o iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); . c0 I% _9 x8 D
return 0;" D8 I4 H' o& v4 y1 j
$ U* G1 p- f. _$ v) L}
7 B8 J6 K9 I- ~8 X( f9 O8 z8 g! y: X! _, ?% |
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" n" P+ R( L0 ]2 X2 d( v: t
{ & F& E# q3 m2 U9 Y) s
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 K; I- s6 ?+ r+ C- H9 k copy_to_user(buf,&DRR_data,len);
# w/ _/ |8 g: R return 0;, W5 F- Q8 G7 Q$ h! w
}
7 i. G: L$ w( `: g9 p0 O6 K+ a/ @+ p6 ^& x
! K7 P, k8 ^ u( M' \
static struct file_operations mcbsp_fops=
6 ~4 w) H# i+ ? ~0 W3 T1 |{
! `3 Z# a' d E& V( A/ T8 d% u) G .owner=THIS_MODULE,
% F9 `3 _" L3 l5 w* b .open=mcbsp_open,3 {1 L; K1 P: H7 h. } I3 ]
.release=mcbsp_release,
- k( k9 B, s7 t! d6 Y% ?* j .write=mcbsp_write,- y+ \7 X5 M# W/ r4 R5 l
.read=mcbsp_read,
5 B" i# W# I! X};
/ K6 F9 u6 s# k( | R; H8 sstatic int __init MCBSP_init(void)
: ?: a# H+ d. u$ X3 S' a- l{ P% t3 Y# B2 K+ F$ I6 w7 _$ W
int ret;
1 a- T( l- h& A: V! T unsigned int PINMUX1_REG_old;
; H* o) ^8 E; v6 t& b, P/ [ unsigned int PINMUX18_REG_old;
0 p+ Z6 H' ]) q! }+ r1 p unsigned int PINMUX19_REG_old;
: q: J& H2 ?. O# z- E: o9 W( [& d unsigned int temp;
+ b' t3 T+ ?9 O. E9 ?, r if(MCBSP_MAJOR): J5 ?. A4 E) m. F# V( e
{
& s6 e: H) c7 o. P! b4 P mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ D1 f# D6 t0 C$ ?1 I ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" D7 E; a4 f* P7 R% l$ V4 F6 }( Q }
* V4 w7 l$ d% D4 K2 t else' g$ F4 G' d) B. `6 V6 ~. G* Z2 j
{4 }3 R) Y+ w7 W1 B& i4 K/ n
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; G& h |8 j. I MCBSP_MAJOR=MAJOR(mcbsp_dev);& u( Z. j4 B3 p3 l8 j$ a
}+ i8 X3 N/ y- T# W
8 s0 Z( V$ ^6 S, D6 u+ y if(ret<0)$ S: i& w4 X/ S6 T
{
0 E- z' A2 s4 L! K6 r printk(KERN_ERR "register chrdev fail!");
0 p: Y; T) P8 R& G& N return -1; E) u( `# o; N0 u$ h( w9 o
}
' l* z& V4 r8 B( v u
/ _; u3 U3 t8 G, u A4 G( v mcbsp_cdev=cdev_alloc();
# H$ ?" d6 N5 ?. z' h
! B0 @5 H( ^5 K8 ], T0 ~. ]( a- W if(mcbsp_cdev!=NULL)# W6 M' u3 _. S7 ?1 f! I# h/ Q
{
$ W4 v6 _4 a! G0 |9 B4 H! p cdev_init(mcbsp_cdev,&mcbsp_fops);
2 N- q9 _# a& p mcbsp_cdev->ops=&mcbsp_fops;- @2 |; Y3 E3 Z
mcbsp_cdev->owner=THIS_MODULE;
1 ] v M) m- z, T3 X$ r
: A$ P% j0 B. d4 G0 J/ E if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% A }8 X3 E7 W; L. I printk(KERN_ERR "register cdev fail!");8 ]8 U% b S# H/ y& t
else
2 ]) }* D5 E1 v. l printk(KERN_ERR "register success!\n");
; F6 j& Y4 h. x }
# O/ i) R7 o$ j2 q" y% m else
, i; T9 N1 F+ w6 h {
4 H8 o: ^2 K& k printk(KERN_ERR "register cdev err!");, A5 W4 S/ Q2 U
return -1;
$ h5 v/ Q& Y, W }
' ?5 q4 _- Q7 y2 A6 a# }
6 a$ [ M# G* F mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);1 q: o$ O4 w. E- X
if(IS_ERR(mcbsp_class))1 t/ O. c3 s' I
{
: p+ _" v& v0 _ printk(KERN_ERR "register class err!");
+ l0 Z+ }3 r3 K5 S' ~ return -1;: Z) A# D& Z5 q0 m
}
8 R9 E6 h. O0 f6 L! l7 O$ G* h" Z7 r device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ Q# n/ R( G N5 ^5 `% `# Z9 P6 q; x, S
//PSC
. T$ Z! t0 J; e2 v //add Enable MCBSP( f: E0 _, Z$ O7 L+ w% e$ d
//test
6 d7 y( O# I! e" F% Q temp = 0x80000003;
8 x/ n- m; Z7 } v$ N4 N writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 {, j( w1 J4 k/ A temp = 0x00000003;1 D% \; Y/ J) S6 i
writel(temp, IO_ADDRESS(PTCMD_ADDR));
% ~* c. i( S) z6 Z & a; B6 y8 Z+ D0 C j
temp = 0x001FF201;
H# ~2 K: X X( u- s$ m+ m! L writel(temp, IO_ADDRESS(PDCTL1_ADDR));, f* `3 N# D9 @* y
. G7 Y: A1 j2 q& L+ h" S/ N1 `. I
//PINMUX
% i' |4 s* T: B5 c: | //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 O6 d7 a3 @6 w P6 U PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ S% w3 v0 Z8 a; Z$ {' [4 V1 O PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; - t* I3 S, q' q- k$ n1 x# e$ b5 F
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* i% ~: o2 K, I+ u1 i6 E7 A0 J
3 \( X# K2 D8 c) c2 X
//SLEEP_EN,EPR,L138_SHK1,L138_RC: [% s- N3 s$ }+ O; K( t
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 a! L+ W) q5 U+ \9 `9 k PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
) ~% X/ Q8 G& G& Z" U- q+ ^ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);, O1 v+ C$ T" `" b2 m# L* ^
" C8 [, u2 A8 U
//RESETn,L138_SHK2( S2 s5 E D* X$ ^$ J
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( C& c; [' Y. z4 u PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 \: E% e( K- x- Y writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 d% y& }) J9 o$ i& T& E; Y, W$ d1 ~
3 L% c Q0 b- ^. W! W
- p1 ~* ?4 |" b% G* }+ P2 g3 M //SPCR Register
4 r/ [2 S1 ]- e. h //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- Q9 x& j2 M5 {( A3 k- X
temp = 0x03000000;//(DLB=0)
7 M* k7 h1 r# r, |+ N // temp = 0x03008000;//(DLB=1)7 {; v9 X" t8 q5 b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 F5 x# D5 p. p8 o. N* K1 a
temp = readl(IO_ADDRESS(SPCR_ADDR));
+ f3 ?% ~2 ^( n4 Z- a6 K, D' ? printk("temp=%x\n",temp);
. X# p9 V9 l4 `$ o5 Y5 @$ y; G9 i
9 v$ K" ~5 }& S, m //PCR Register ?/ r" d" t& [' {; k$ v
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0( E% m7 H& s, A$ a
// temp = 0x00000F0F;
8 W! w" i4 V% s, Y6 y1 h7 c4 c+ ^ temp = 0x00000B0F;0 u# y: J# ?2 b" f8 I' T
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized , _( ^4 e$ J% J% J8 |
temp = readl(IO_ADDRESS(PCR_ADDR));
+ r! {, T, X3 W& g printk("temp=%x\n",temp); 6 G# i1 q% ?. ~
//SRGR Register
+ b% B# u! W* ~/ [1 S9 z //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- m7 e; u' ^! _8 f& b/ |4 E //temp = 0x301F000B;' L/ x2 [, h# ]% `: ?) `# N
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized $ ]2 ~- [* Y3 d9 H+ F! f3 u8 ?
temp = readl(IO_ADDRESS(SRGR_ADDR));, U9 J) e: ~& _/ n; `& `$ x
printk("temp=%x\n",temp);
% Z% y. t0 k8 f3 m% e: p" I. }* W //RCR
, o# Y3 z7 J J4 j6 { //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
/ v8 n6 B& d& H/ } //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 x6 L$ f* e' T1 o
temp = 0x00440040;
1 f* `! P; E" N' `$ | writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized # V8 i8 e$ r& R: X
temp = readl(IO_ADDRESS(RCR_ADDR));9 N* q2 N7 ^$ Z7 R3 U0 H, t
printk("temp=%x\n",temp);
" ^5 k3 i" V: l1 ^+ v( ` //XCR3 \ H& x u- P
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
6 {- R/ v. ~3 m6 ^8 y! ~3 [ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ q; c x g9 O* A temp = 0x00440040;! l. O1 C) O# e
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized p8 `+ v2 K( T7 l. Q# l
temp = readl(IO_ADDRESS(XCR_ADDR));
$ f* E8 D- _$ X+ O printk("temp=%x\n",temp);
+ {' a$ h) i: e, A" n8 }( @1 R udelay(100);# Y! A) `! B) W6 w% i" |
//SPCR Register
9 ?% q4 ]- i/ C' u9 q8 [2 S //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 p6 t8 Z9 c7 u& m6 q" P
temp = 0x03C10001; //DLB = 0 VS DLB = 18 p1 m5 [ ^- Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 f& D; F3 W/ i- M) Q temp = readl(IO_ADDRESS(SPCR_ADDR));8 o2 g f1 @8 ?- O% q5 k
printk("temp=%x\n",temp);9 G+ f- c4 \% O- ]
udelay(100);
# E/ ^) F$ r- [+ G
6 `. o7 j, k' @8 {. V //set GPIO direction
/ y# a# I8 o* z2 c, N- K: { temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));& Q8 o9 i+ _7 @" O
temp = temp | 0x00000100;//EPR----input
6 Z0 a: V" t& Z, Q6 e6 R temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
l3 H$ a3 Y# A) C: M8 |3 Q __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 L# _. Z* ]$ [* X , [: w* g' R8 X G
return 0;
4 S7 l4 W% B: `0 l}
* N v, B7 j1 a7 I0 kstatic void __exit MCBSP_exit(void)# {( Z- T" R% s0 O
{7 y1 ?& k$ V& U K
printk("mcbsp chrdev exit!\n");6 O+ x# u: T- l& e& C* H3 N
cdev_del(mcbsp_cdev);
- H/ }8 c; S+ b9 J6 i" \ unregister_chrdev_region(mcbsp_dev,count);
: r+ v# Q. Q7 l# e5 i- T device_destroy(mcbsp_class,mcbsp_dev);
# l+ v" T0 ~+ B class_destroy(mcbsp_class);
1 G+ k( T3 L0 R, ^1 f4 a$ i) ~}
) v, u2 O1 k5 {2 L, rmodule_init(MCBSP_init);
/ ]) H$ n) k# a7 Z8 e- [module_exit(MCBSP_exit);$ s g8 q7 w2 r
; N5 x( T2 c( W% @4 e1 N" R1 }MODULE_LICENSE("GPL");0 C4 e& J8 i! P& Z
. v, P8 G4 o4 K+ z& n1 ?
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, E3 _( M( T, ?1 B, i3 l
我的应用层的测试程序如下
6 _. Z& ?9 F( `$ k5 g' b) ~! k#include <stdio.h>
: ~- @+ {$ h, R" k#include <string.h>
( |- H# ^. {+ w+ n( S7 \#include <fcntl.h>
7 K# Q% k* L& I8 M+ a f( N3 c$ p- H#include <unistd.h>
/ ?, G. P0 L( e) a* q# }#include <signal.h>
( c' ]/ j5 Y: I; v" B) E6 f# K- o; U#include <pthread.h> //线程1 h8 [- X/ w4 X3 u4 q
#include <stdlib.h> e0 m2 Y- b3 B% K2 S
#include <pcap.h> //捕获网口数据9 |9 t( `& L7 t/ v/ G
#include <semaphore.h> //信号! \7 c0 S {' Q6 N
#include <sys/types.h> //消息对列9 H, N. @, T+ f5 l( A. i. M* q1 S
#include <sys/ipc.h> //消息队列 {' P$ [% ~: x1 l
#include <sys/msg.h> //消息队列3 t. z1 }7 y: R9 ]
#include <sys/select.h>
* {& C( }1 W; d. T4 G9 m#include <sys/syscall.h>: f( K% ]( ~1 t: s# M. q' s
#include <sys/stat.h>1 L; F# J# ], Q) h
#include <sys/mman.h>
5 U0 r1 l8 W& w/ w" d% a#define msleep(x) usleep(1000*x)
8 Q# Q R; A2 h* i* e% N4 L5 r
. |- [( h; N1 S, y/ e8 F% |int main()
4 }: ?! U" g" t3 L9 r$ x{ % Y# I) {# J, x
//MCBSP,ARM与AMBE2000交互设备
B0 M' i' c0 ?& S int fd;6 ] u9 s# u" _
unsigned short data_write = 0x5555;! X# S2 g: K# v& B3 @+ [9 [3 T
unsigned short data_read = 0x00;; t2 A8 {# g& w
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 g& ^$ n$ P5 ~3 X0 o
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. r2 N$ B; V. H3 J
6 G# b; d( V5 C% @ if(fd < 0)
+ S& O) d7 {6 X2 d. x1 y9 \3 P {
' }3 }' N. x) k0 ]% J perror("open failed\n");3 F8 W1 B7 k6 {3 v0 Y1 K0 m3 o: o
return -1;
& b2 i/ H" t% Y# d- W1 b5 ? }
E( v" q# G" o- [
: r! m, g n9 m: H7 B while(1)
. \: t5 C! v. e6 A6 I" v- y { B8 t" A' S! \, w" G* h
5 \- m+ U9 ?4 L5 Z% Q# R; }' t% P4 a //AMBE2000每次读写是24个字为一帧
8 y: E, n) [' S- Z# T7 F. V" x //写数据时将数据在底层存储起来,等到中断的时候再发送/ \; Q% H) B* q8 h5 l) H& p
//AMBE2000输入数据是以0x13EC开头的
" ] d4 h* q; W2 E write(fd,&data_write,sizeof(unsigned short));
9 f6 o" \- U5 ^
* ^ V; w* I+ n$ Z/ |5 s' l //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
9 V, {0 L- w( h, W% Y8 v read(fd,&data_read,sizeof(unsigned short));
$ c7 _9 U9 L& M8 o
8 q. D& C& p! s' U4 V if(data_read == 0x13Ec)
/ M! r8 n' v+ R" o6 G {1 q. B4 y" x H, z
% n5 }/ s, g4 T0 T5 u
printf("data_read = %x\n",data_read);0 T' M% q+ E, g+ z; w: ?" w
}' f- g0 B+ b5 Q* y1 q8 v
2 L8 b) ~* m# a N- U msleep(10);2 v6 z0 m& _* p0 F8 P7 p
& ~$ |0 n: \$ Q M
/*' e/ x% I m1 k+ u% l
ioctl(fd,1); + Y( [4 [) @% Q1 z: T
sleep(1);5 \5 s) J4 N! T# C$ i
ioctl(fd,0);( z) p1 e4 W( G8 Y; ?5 t! [* b: A9 ^4 Z
sleep(1);
) l5 p* b# v1 ?" G9 N) v% J */ 1 i4 ]2 B- v+ ^6 g
}
% p+ g. s C0 g+ }* M) y7 x return 0;
% \4 S1 n+ P, H9 `% u- u* U0 l ; H/ z% N3 ~& r
}
) _0 S% n7 A) ?$ E0 t2 r4 N# q& w/ l3 A; E2 W# O p( C
多谢各位指教,谢谢! 急6 B. V( C3 s1 l" H6 r+ R
, i: h+ z* |1 K' }$ T$ `* |
) q1 H/ Q+ \% j6 i% u8 d
, j# A. z3 T- ?) Q) U8 u4 |$ d* |2 B+ T# K. ?7 k. R
: z' T2 z' C: @# E0 ^
|
|