|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / S2 J0 m7 p) }- C) G
/*, H2 F8 U1 u8 W
* Copyright (C) 2009 Texas Instruments Inc y; D( ~1 [% d U- O; B, j! L& U
*8 B, D9 {: ]$ U I% J
* This program is free software; you can redistribute it and/or modify
0 K: l& ]8 F: ~0 P( }/ l; x m * it under the terms of the GNU General Public License as published by" m' e7 U3 n( F4 u) h; D* r4 x; x
* the Free Software Foundation; either version 2 of the License, or
: C) _: W: J3 H" d* B5 X3 c& d * (at your option)any later version.; l4 l1 a( p$ D
*
% p! H `# k4 q4 O0 N * This program is distributed in the hope that it will be useful,
1 d" T0 {2 ?( B/ o( v1 g7 a * but WITHOUT ANY WARRANTY; without even the implied warranty of* H/ J# X, N5 W- z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 A) j! V7 Z- F: A' `
* GNU General Public License for more details.
; I% t8 K" v* |; L4 [3 [ *! A: M: n I* R0 j
* You should have received a copy of the GNU General Public License: E0 [7 m8 Y! X# L1 A7 X
* along with this program; if not, write to the Free Software# f5 O+ b0 `* A2 p& s% |/ G/ I7 E
* Foundati% l& m+ d; U/ D! O! S8 Y
*/
% i7 t# S! `6 U. W* r1 h) K3 C#include <linux/module.h>, Z2 ^/ x4 Y* e
#include <linux/init.h>4 K) {1 O6 W% z- m7 t8 g7 v
#include <linux/errno.h>: L! q/ h, W9 \: x$ i: J
#include <linux/types.h>
1 P5 j$ l# s% g5 F4 O2 L* _7 ~" ]#include <linux/interrupt.h>
% i+ r6 g, v0 e+ I% W8 @#include <linux/io.h>
* I3 v3 i, ]- h w/ j5 N#include <linux/sysctl.h>/ [) M2 c- C4 N( Y1 u
#include <linux/mm.h>3 V& ?1 v( T6 ?' j# L- A
#include <linux/delay.h>
) p: ~) E3 x. U6 X* y( P#include<linux/kernel.h>
: u8 f1 _- G' A8 h1 X8 T1 \7 X' r#include<linux/fs.h>& k3 R% w: j) W
#include<linux/ioctl.h>
) L. }0 ^ C/ Y/ r# {0 G$ g#include<linux/cdev.h>8 h* _) S# L1 x2 @
#include<linux/kdev_t.h>
/ e% ~5 w: x3 Q, z {5 M- m. o7 B; j* I#include<linux/gpio.h>
3 x; ^2 V# M0 w; R#include <mach/hardware.h>8 z2 |$ q' s2 W
#include <mach/irqs.h>+ K, k) C/ J0 q' \( l# g8 x1 ?- w
% [. a N; N- C7 H#include <asm/mach-types.h>
0 P' y7 F9 J7 S" h! M#include <asm/mach/arch.h>
) ?( E& H+ J: @2 H" y( B# j#include <mach/da8xx.h>- c8 C; r. S5 z% I9 E5 C
#define SYSCFG_BASE 0x01c14000: e" w* O- |% R! u; ^
#define PINMUX1_OFFSET 0x124 " x; X- }4 ]0 L _. G
#define PINMUX18_OFFSET 0x168 $ U# ^% Y- b; g. _
#define PINMUX19_OFFSET 0x16c
+ L% ?2 |) q8 v+ p. ~; @' ^" X#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
8 A* D2 _: p1 Z. ?# o* N, |# p( j0 K! t#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. b; ~) A* p0 m) q6 N3 A' {! l1 v
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, R) | u2 m- r
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
5 M' x% @- F$ H7 \* b2 O#define PCR_ADDR 0x01D11024 //MCBSP1_PCR* q9 W: _& f& k" G
1 ?4 W& R9 t, ]; d
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR$ V, T. ]2 E1 J5 \
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR3 f3 J* m/ p1 ], h+ C
//PSC3 w, E# B2 r9 i& D1 h$ v# N
#define PTCMD_ADDR 0x01E27120
, }7 Z$ j5 e; w- K: o1 y8 m#define MDCTL15_ADDR 0x01E27A3C3 M- w! A) Z4 R+ e+ D. F
#define PDCTL1_ADDR 0x01E27304
; S6 j4 [; a" f' b: u; [" q//GPIO8 direction7 C* m+ Q) \# h7 W; z5 [* ]' |
#define GPIO8_DIRECT 0x01E260B0
+ W% m( _ H- U/ Y+ K6 J#define GPIO8_OUT 0x01E260B4
" X2 B( Y% I* m#define GPIO8_IN 0x01E260C09 n f9 n( c+ j* M
" g$ T; A D* ]0 H9 [//#define MCBSP1_RINT 99
# ?+ k# y4 S# Z7 q8 c$ x/ \//#define MCBSP1_XINT 100
, q7 E) g9 b V+ M- d( wstatic int MCBSP_MAJOR=239;& J5 A3 r( ]& z* b( v% W3 z
static int MCBSP_MINOR=0;+ a( Z! [! V- ^ o
static int count =1;
( {3 Z+ z7 j' J! W2 O/ l
6 D! E& i J! i' {#define MCBSP_NAME "MCBSP-device"# _* W/ E( }2 M
1 u+ z% ]/ A# M, T, g: y
static struct cdev *mcbsp_cdev;" D2 \& L) E- c% T& G2 `
static struct class *mcbsp_class;
- `8 r! `$ K5 p" Estatic dev_t mcbsp_dev;% c, u }* l0 W
unsigned int DRR_data;6 V" }3 p8 A0 e/ z# k: b2 W! T1 {
unsigned int DXR_data;) w* {0 S* j, n$ Y
static int mcbsp_open(struct inode *inode,struct file *file)& H! m$ m" ` c
{+ }3 ^+ A9 @8 v/ t
7 `" ~0 v6 q8 w; @" O9 v //interrupt enable,initialized
: Y0 \$ s2 y+ _5 _. J) f: Q8 c unsigned int temp;
7 N* S4 {9 @2 ^3 h; \) s //SLEEP_EN(GPIO8[10])---0& }) X2 O C, X7 C
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 Q4 Y& x8 }& ], f4 x
temp=temp&(~0x00000400);) _$ r7 X7 z: C5 G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ B9 n# f) }$ u% p% Y. Z //RESETn(GPIO8[8])----0----1
: d& q# c7 b5 B1 n% ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, N* f# X( l: y1 K& Q, i temp=temp&(~0x00000100);
3 a3 V" P. f6 a4 r __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& i: O% a/ X# K- N) K5 q2 d* X
udelay(100);" {. I$ @; i0 I0 L5 l6 ^. J
temp=temp| 0x00000100;( G1 X( R L, k! b
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ T- R: L3 Q0 y7 s( a! c8 W- E
udelay(100);2 X V/ l' j4 x5 `
printk("open success!\n");0 R0 S5 n# ^# ?. w
return 0;, W ?$ o/ d" r
}3 R. O8 b% B# [! \: r/ F1 N
2 d* Z% H! ^; H$ z0 W/ Jstatic int mcbsp_release(struct inode *inode,struct file *file); ]- T3 A* B' E: {
{
+ a4 p- W4 ^8 \, D* L' Q# f r$ S! t printk("release success!\n");" Y2 P9 I9 z" n+ y2 J
return 0;% p7 M& ^9 J9 L; F" c! s
}
2 K1 L P$ O: `4 E# r0 E; I; x# Y) i. X
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
' X6 |8 J. o5 }# O- d6 b- w{
- m( h8 R a8 ^; r copy_from_user(&DXR_data,buf,len);
& C8 S8 U. D# n: s+ q; U4 p& `4 q iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); + Q" d1 N+ q/ [9 Y" \+ B
return 0;
2 T( B4 `! j$ Z6 i, e
- z% A% G/ ]: y* p}
5 l q/ O* h: ~" d( d8 w$ c x6 Z* r3 Y# H! V6 k T* U
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: i9 Y- f n3 G) z, L' [9 b{
, i) P N2 P2 E! \* h, g DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 Z0 p% q+ z, I
copy_to_user(buf,&DRR_data,len);
/ d2 w, {# b8 a1 }$ B return 0;
. y+ _# a0 p8 k( {! g5 Y}
. Y a$ m+ N! I( j5 G
$ D' g, K) u% l8 I4 ^
- d4 t X% u( D, B' w+ H* Cstatic struct file_operations mcbsp_fops=
9 C8 w+ [9 d1 `4 R N{
- X/ x$ `( G4 v5 R7 o .owner=THIS_MODULE,$ S, a! f! T! f: i
.open=mcbsp_open,
+ f6 O& w, G$ X" E" W0 c+ L. l .release=mcbsp_release,: Y/ r9 c" c* |; L$ w% b" P
.write=mcbsp_write,
4 Q, e+ u! X! y; V# v) W7 t2 H' T" T .read=mcbsp_read,
# F3 B2 j2 k; p8 t. U};5 d& p. j7 S* T S$ @- N' v0 \7 W2 J
static int __init MCBSP_init(void)
( j4 p T5 g! \1 J$ `8 t{
+ U N/ ~ x X1 l int ret;+ j9 P* I$ s7 Y
unsigned int PINMUX1_REG_old;/ Q0 |, X2 d0 _( @5 A. P0 |9 Q
unsigned int PINMUX18_REG_old;( e; T! F3 a: X
unsigned int PINMUX19_REG_old;
- r0 S+ Q3 Z$ o7 L' w4 f unsigned int temp;
% E# M0 r5 z: O0 \6 c5 Z if(MCBSP_MAJOR)
f" @! ^2 P7 c8 g! T3 f {+ a0 u* k ?: y: [* o- }3 g
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% G: K& g/ O% @2 A3 I
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 u9 R+ \5 }, N5 O; d3 V
}! @3 b7 ^* _/ t
else
1 q5 o" e6 C3 H2 N {8 y0 y# J" M! E7 Z( `* v! w! i
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) H1 t f/ N/ q8 {% N MCBSP_MAJOR=MAJOR(mcbsp_dev);6 k# o+ q. V! h3 d2 r
}" h7 t2 `8 C$ h2 R5 r- ^. S
- E9 V1 d* Y! O: K8 l if(ret<0)* G7 Y3 e. |3 I( d7 I
{( L$ e2 @: ?( i+ @3 _" K3 O: ~
printk(KERN_ERR "register chrdev fail!");
8 o5 t, j: G, p# } return -1;3 {1 @* m0 z$ {
}
( D a* a1 T2 u4 ^ N5 K3 s9 |" \ - w0 b" c# E- ^* `* ^7 ~
mcbsp_cdev=cdev_alloc();
, p3 u* ?) n! \: ~+ I" E & {( S2 D0 a5 S, g8 K
if(mcbsp_cdev!=NULL)4 e. T1 K& S& j- `1 n4 Z5 U
{
L& O2 B8 [! L6 s4 J; v cdev_init(mcbsp_cdev,&mcbsp_fops);; s% B5 }2 k7 Q: J! t" I; \; @) K
mcbsp_cdev->ops=&mcbsp_fops;4 J3 }- x. N* E0 l
mcbsp_cdev->owner=THIS_MODULE;
4 i e5 {" @: }9 R d; P& m " ^* A% {% j/ E" Q! |
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- c$ Y2 q0 H* Y+ D | printk(KERN_ERR "register cdev fail!");# ?" X) ~4 Y/ E s, e. [' X3 I7 X
else
3 h! R5 M: W# _# ^ printk(KERN_ERR "register success!\n");8 T. U4 ^6 R' x$ A: V
}/ Q0 p2 }8 n2 r+ a% V4 U
else
2 }1 K) l0 B; _ {
3 G: x" D) ^2 z printk(KERN_ERR "register cdev err!");
p2 Z: v9 g) o: i! N4 o& N return -1;
/ q6 h! [5 D5 L. Y7 t8 g }
# |* C% D5 O6 Z' W! n* X% E ! c* G) e) i8 \: r* L7 i: A* G& `
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( \6 w& z/ [- [: b
if(IS_ERR(mcbsp_class))
% M) _- Y: h2 _8 ~0 D {, W, X8 r" x: {8 j, {
printk(KERN_ERR "register class err!");
9 U' C s9 J6 r/ t return -1;! V: I) s' j1 R ?8 _7 h
}+ ^, Y0 c. U/ |- B C0 `4 w
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 g ]2 @2 ]/ w( O, P
9 N1 y" B, ?% H% j |7 q9 t //PSC: ~1 V9 U2 j# ] ^3 @4 G5 g
//add Enable MCBSP$ P% H# b- n" z' Q: M. v4 V( h
//test! N: h1 _; G8 p! e% P% K0 h! N
temp = 0x80000003;0 f. x$ y. a" l
writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ ]- x5 v4 d3 R# w
temp = 0x00000003;' W; A, m7 l2 N9 Y4 s6 e3 E3 v& q
writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 o3 s' y: i2 e! ^! w : i7 Q: N9 k8 h. X
temp = 0x001FF201;+ ?: [5 w2 N. V
writel(temp, IO_ADDRESS(PDCTL1_ADDR));2 O- J7 e: Y& G7 @9 g
! V9 l% `4 u- i8 h8 o% D6 N
//PINMUX
/ u7 p# `$ Z$ ]) ]8 P3 s //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
9 ?8 h3 b+ j. W* u PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) Q0 q( h9 ^4 l* {2 ~' ?6 o
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
0 ^: n) @0 n3 O: ?9 o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# N! \$ x2 [/ F- |: ^7 ?
+ q8 r2 ]0 f; {* k+ d7 b1 H0 i7 |7 L
//SLEEP_EN,EPR,L138_SHK1,L138_RC& `* K" G, b( G6 i( P7 r& V% i( m
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 L/ A4 o p: J; x6 ]5 W PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & C8 @; c3 j% k
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- a% V7 e% w. y/ @7 l' ~
7 N) P. e! H5 {% ` //RESETn,L138_SHK2
2 D9 [/ o- p7 W% j/ V# g% H2 L PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 4 h0 x* e0 b3 H7 b, K) G0 H
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 6 ]3 g% B8 T# Y
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% W8 @# H0 _5 @" T" `+ E/ r- t
/ |+ Z' R) b P, w
7 |, ?2 A7 x; t, C: }1 h //SPCR Register8 U. U- m+ l j# X4 W
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; C% l. T ^! | n; \$ v
temp = 0x03000000;//(DLB=0)
1 a: o1 g9 W+ Y p // temp = 0x03008000;//(DLB=1)( c" K. T8 ^1 X+ S3 v( j0 {0 q% v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset2 y$ t9 g+ Q. d6 ~
temp = readl(IO_ADDRESS(SPCR_ADDR));8 \2 _: J3 U- p9 o- R" ]( M4 }) Q
printk("temp=%x\n",temp);, t( d. j+ {( J, f1 z; N
- v1 f6 Z: C# D0 [: `$ j
//PCR Register. p. S- y- T" a+ ~: i$ |- W4 R
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
8 b4 o' {. Y8 C! X' Y' _( c9 O // temp = 0x00000F0F;: H3 n, \; `- L9 a( I& o
temp = 0x00000B0F;4 m3 j8 m0 S( s- `* g, r6 O
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
5 b) g6 h) v% a7 J7 B temp = readl(IO_ADDRESS(PCR_ADDR));# }$ q7 Z. G% p2 J( K
printk("temp=%x\n",temp); ' P! ]' u. {! {! B/ M
//SRGR Register
R! a/ U1 }5 W6 m9 u8 ] //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
1 f, f! j0 L! w& f6 |2 V4 u4 q //temp = 0x301F000B; m' }" j7 u! [5 T; n. l
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ; O. P# W0 s6 B! T- U
temp = readl(IO_ADDRESS(SRGR_ADDR));) P! F/ Y. k2 u0 L- D
printk("temp=%x\n",temp);! B2 L; n ^* R. v
//RCR
/ H2 `$ O0 ~8 a- V( f* j: z //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 U4 @! m+ h/ R" w/ V# a //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. ^& {. n) E2 s# G4 }8 q. ~ temp = 0x00440040;
1 c5 T9 A3 W( L, X writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized `! f o5 ?% B- O3 I
temp = readl(IO_ADDRESS(RCR_ADDR));
' a( Q5 J9 d2 T) n printk("temp=%x\n",temp);) f% }5 c2 v% g# ?) V
//XCR
( f0 b1 C( {) |8 Y, @+ @+ y( { //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ n0 ]9 o5 \/ z& ~9 k2 w/ O. v
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
k$ ?$ w3 j" D- x, m! i temp = 0x00440040;# L, u+ @2 c, `# G
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 |6 d8 t9 _2 d8 h0 I) C: G
temp = readl(IO_ADDRESS(XCR_ADDR));
. Y; T+ v) E* o0 e3 C. P: { printk("temp=%x\n",temp);6 g9 h6 i0 r, ?6 b) C- y z) ?
udelay(100);
; \: p1 S$ x& o# k. i //SPCR Register
. R8 L( w) X- j: D //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% U$ v+ C# k3 G) ~. \) l8 _ D temp = 0x03C10001; //DLB = 0 VS DLB = 1
2 k, M% b: T @, B1 U8 V9 X writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled6 ^$ p. l0 o' G: V& T/ ]
temp = readl(IO_ADDRESS(SPCR_ADDR));
+ U- E! ]/ Z2 S$ l& c4 { printk("temp=%x\n",temp);
. x B* P1 x2 y) ` udelay(100);
$ v6 O& |$ r2 G% j2 K4 ~" X+ l, g# u2 T
//set GPIO direction* \ _$ M2 {# y( i" N
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; l$ x) x6 p5 w9 l, ^7 Z5 G8 W temp = temp | 0x00000100;//EPR----input
- H4 T/ d- y' Q3 {- w temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 e$ Z" u' U( ], n __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
x8 L& G, H8 ]- S$ s) ]
1 D% F; _" \/ s- O return 0;
( d1 K0 h5 }9 k2 N% Z}1 j I! y3 P3 o! E9 P% }2 b
static void __exit MCBSP_exit(void)
4 {( G# h0 U& i% j% \{( e; \5 I8 p" ?/ K ^0 f6 p8 A
printk("mcbsp chrdev exit!\n");
' u7 C! q0 \! q6 \0 e cdev_del(mcbsp_cdev);
7 h' Z2 B; e' p8 o. s# {+ F8 Y unregister_chrdev_region(mcbsp_dev,count);+ _8 o/ P2 f0 Q0 ~% S* Q% }4 ^
device_destroy(mcbsp_class,mcbsp_dev);
2 L7 [+ R8 A- o0 M' |& P) n& { class_destroy(mcbsp_class);
5 x6 F0 O+ @$ v4 J}. Z6 q2 b$ n" e' ?' n) N
module_init(MCBSP_init);
5 @8 b5 b6 ^8 K! J% g; wmodule_exit(MCBSP_exit);
8 F" n$ L( r0 b
2 ]% P. c8 K' w5 B$ N: VMODULE_LICENSE("GPL");
: {: f1 @" X; g3 M: @
9 }1 r$ e* H3 R9 K我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 g( @. @: ?8 j
我的应用层的测试程序如下
+ _- ~. q+ a$ U+ K#include <stdio.h>- s5 B' I1 T" b: Y
#include <string.h>
7 ]+ y/ \: w/ r1 u#include <fcntl.h>
4 n1 z5 f+ _/ x, S#include <unistd.h>- Z- P8 L2 v6 k- W! e) u% {
#include <signal.h>
5 k( t" o$ _6 C" x7 T& K/ j/ W#include <pthread.h> //线程
3 X1 `& ?7 P0 V* [+ D. m#include <stdlib.h># R/ b1 Q. X: Z% C2 j0 {8 r
#include <pcap.h> //捕获网口数据4 O+ |2 M* j3 Z; t# i1 Y0 k
#include <semaphore.h> //信号
/ v! G |1 }! t/ K% V8 Y7 ~' g, a#include <sys/types.h> //消息对列7 c/ D- F) I& ^# H
#include <sys/ipc.h> //消息队列- s. R* q' J$ M( Y% Z8 w
#include <sys/msg.h> //消息队列8 q$ s/ Z! I5 b% _+ |
#include <sys/select.h>
' K H8 ?- o( ~# C# V2 d#include <sys/syscall.h>9 [8 g+ p. W7 X. v8 o$ b
#include <sys/stat.h>' i- F, I' j- t5 v
#include <sys/mman.h>
% z. y7 N9 C8 r1 @0 X: l- ?#define msleep(x) usleep(1000*x)
$ H5 M( Z4 O: i" o" ~5 T q7 c& D( [; u4 n- U' `5 A* W7 w2 d
int main()
) n+ [: _8 N+ a2 h/ r+ O{
/ _4 [4 z/ m/ j' S //MCBSP,ARM与AMBE2000交互设备9 P" s+ g, r: _5 C9 _% q
int fd;0 \* `( L3 ?8 N
unsigned short data_write = 0x5555;
+ D# T5 J- E" u3 k1 n+ ~. e8 d unsigned short data_read = 0x00;. E* A3 f' J k {! R
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* d V4 Z6 v6 ~% ~: |2 a
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 {/ Q3 W) P+ P2 J) x + p* O" \, S1 t+ A
if(fd < 0)
; k0 [& W0 w% b: g- S3 @) F {7 X$ w( k: W9 b
perror("open failed\n");
; ?0 |) ?0 q/ ]$ W return -1;+ ^! x. I3 D3 B& N5 Q9 j
}
( M& h6 J8 u7 G3 l9 E3 J7 I* l
6 E B0 _% v2 I" I while(1)1 n0 J$ f2 l1 Z) h+ g
{
" S l$ n0 v- ^+ R: P 1 e9 w3 w3 `, W% j4 B1 u
//AMBE2000每次读写是24个字为一帧
( T# I/ o) M" @# C* C }" \ //写数据时将数据在底层存储起来,等到中断的时候再发送
2 K" o) R8 e; n3 h I! {& z0 B: S //AMBE2000输入数据是以0x13EC开头的% D/ d; z; E2 e, h
write(fd,&data_write,sizeof(unsigned short));) Z( t: C) J4 W) r
9 O- u- \) w2 ?9 l! X7 q0 n" M
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 G5 @" G6 w- t5 n b( J6 o0 Y
read(fd,&data_read,sizeof(unsigned short));
+ g' f+ K4 T: F% w7 n5 N
2 ^% U/ I' h) W6 }' f% d/ P if(data_read == 0x13Ec)
# J. D) x6 B0 z/ c' R# c' E {
& b5 h3 l0 y% r5 {$ o/ N
) Q8 g+ f# F0 z5 V" ^: Y printf("data_read = %x\n",data_read);
0 I0 _) @( U: U- D/ a: q }
7 _# Z* X& K% g4 d
2 O5 k3 W1 G- S! s" Q msleep(10);. V5 e7 p2 C7 X+ m4 ?6 Z# K% }+ K$ X
H2 f. e7 a& I /** b6 d8 g; H# X; ^* g5 f; W
ioctl(fd,1);
8 I) w- S- K$ t" n+ i+ f4 b' @ sleep(1);/ X0 t& M6 }. ~2 e( R, M/ |
ioctl(fd,0);. G |0 V' d7 T- g8 r( m
sleep(1);" Z9 d0 H1 q/ Q4 v$ ^
*/ ( ?( e$ Z ^3 L' |) u$ B* [
}
! e7 k# z4 _0 @ return 0;4 s* }3 F7 j3 `- R4 }5 t
. V* I( j# P$ ]$ U) x# o}0 _( m* n) l* k6 m
/ o& v2 d) |5 s& f9 k- T8 A
多谢各位指教,谢谢! 急
% t+ M. i# T& n& p* v: B$ I
1 V; J1 W* \5 ]- Y6 E m% ?0 M% a# J' _) X, D% [
3 Q( g! {5 ^) T- X% p `
" j n; V. L f; r
- U5 W) b/ y& Q; Z3 K |
|