|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" c/ b7 o' f9 w7 m5 W1 P2 _# D/*/ B0 s$ R4 ]! N* v6 O
* Copyright (C) 2009 Texas Instruments Inc- O; R( `: w& G t
*
5 H3 h. B' z* t2 O8 U' W * This program is free software; you can redistribute it and/or modify
! i. t. K! b7 Y4 a1 J9 B$ M& { * it under the terms of the GNU General Public License as published by2 y" p8 i' e# w! {4 N* H# h# D! i
* the Free Software Foundation; either version 2 of the License, or
1 ^) ?0 ^# k! m" Z9 E * (at your option)any later version.
- d0 e* i- n% D- T, ~8 S+ s- k2 [ *
: s5 z O) j) Z0 F9 E * This program is distributed in the hope that it will be useful,
* U* P: ], f! G$ } * but WITHOUT ANY WARRANTY; without even the implied warranty of
. V G2 a* }9 m4 n8 c * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 ^9 V' {5 u# `$ F+ I, B * GNU General Public License for more details.
& ^% H: I, Q5 Q1 G3 f9 L *+ Y/ z3 u; C( D; C
* You should have received a copy of the GNU General Public License" ~! s1 r- }+ H; K& [' Z
* along with this program; if not, write to the Free Software
: @, j+ `/ ?/ k4 }' n * Foundati2 b: v' w. {: K6 a7 \5 u+ K1 g
*/1 G# v2 {9 d9 [7 ^) Y
#include <linux/module.h>
: i4 ? m; J0 ?: m% B#include <linux/init.h>
3 N4 y2 z& ?0 {#include <linux/errno.h>) W1 Z$ s* C& V5 t0 O( Z# b4 M
#include <linux/types.h>
) f3 {, @& ~/ I" ?7 H6 X: i$ D#include <linux/interrupt.h>
1 G5 A, ^ K8 ^: r& G, _#include <linux/io.h>1 G/ h$ K- b& L) g! s' ?
#include <linux/sysctl.h>
1 ]" U+ O" {# E2 `: K#include <linux/mm.h># j% u$ ^* o6 h5 n4 }4 E6 e5 w5 l
#include <linux/delay.h>
# }" G4 `7 y4 `& D; P/ e#include<linux/kernel.h>
4 O& _/ w, F# \) }#include<linux/fs.h>
) \/ d. S; i/ p$ S$ d#include<linux/ioctl.h>
- h: v6 O D0 c#include<linux/cdev.h>
( B7 `, V; G& O4 x+ |9 u8 }$ s- k- o#include<linux/kdev_t.h>$ q/ r9 N3 |3 h5 N5 C" v7 H
#include<linux/gpio.h>
# T' t) E% v. j6 \ J#include <mach/hardware.h>
& E% Q- }& w# |% x, K0 P$ X#include <mach/irqs.h>
3 l+ [$ q& b! I9 m; z4 K Q9 v5 V+ L! s! {* a) X& f6 j2 W
#include <asm/mach-types.h>6 U7 w- y" y' V8 [* ]0 R8 G
#include <asm/mach/arch.h>
& e6 `" S8 s5 q3 \6 [( b% V#include <mach/da8xx.h>
' V* ?# R2 O# }) H0 m1 y#define SYSCFG_BASE 0x01c14000; l* W$ y! @$ {; x) f( r
#define PINMUX1_OFFSET 0x124
% H0 z' R! P) T3 I0 v#define PINMUX18_OFFSET 0x168 7 m d% c# m1 m2 \
#define PINMUX19_OFFSET 0x16c# r; k% h& ~ T
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( c+ Z9 S* O% X, I( t
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
9 |! n" U! Q5 E% ~6 ?' u#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
! I0 u- j0 i$ W2 N2 z, D5 q#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% _4 K4 K/ f9 Q- v" A
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
, e# A, e5 t- v, E: z# L* ~% [ 8 L0 v# W' |8 x4 m
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR& R3 f2 s7 B2 B4 K7 e4 H
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
! T+ G+ q/ _9 |//PSC2 q/ m h; [& x& F ~$ |
#define PTCMD_ADDR 0x01E27120
/ A) c" i5 f$ b* `#define MDCTL15_ADDR 0x01E27A3C
4 F( t+ z. L" [' i; k#define PDCTL1_ADDR 0x01E27304
+ d9 D! X2 J1 m, R% `& I//GPIO8 direction% u, c1 w9 Y$ u3 W, ^7 x
#define GPIO8_DIRECT 0x01E260B05 y% {/ C. x8 ]9 \; a. Y! ^9 S
#define GPIO8_OUT 0x01E260B4; i% k/ D, q* n+ a) H
#define GPIO8_IN 0x01E260C0
+ p5 F0 u2 k, w! {6 L9 L! ]& @) y+ o# `$ B- r5 ^: D
//#define MCBSP1_RINT 99 1 j7 Y- E$ j6 {/ D' W3 Y
//#define MCBSP1_XINT 100 8 b3 V: \! Q" e) I4 P0 x3 ^! x
static int MCBSP_MAJOR=239;' R5 D- Y; P6 d- h# p5 f
static int MCBSP_MINOR=0;# g: O- u4 S8 ]- Z7 ?$ E/ l
static int count =1;
1 z9 S6 c" N4 f* I' x Y% ~) A5 @$ c
#define MCBSP_NAME "MCBSP-device"
0 H, T. g' f; C1 A2 l5 b3 m+ w# o% ^$ k" y
static struct cdev *mcbsp_cdev;1 v* k* e3 U% Z
static struct class *mcbsp_class;
/ p3 ]! O9 W, \9 K: ^static dev_t mcbsp_dev;
& x$ G' G& c! N+ ]" Hunsigned int DRR_data;# u/ [# R* B8 f
unsigned int DXR_data;6 b8 d/ Q# V0 ]
static int mcbsp_open(struct inode *inode,struct file *file)
4 e$ P7 C6 _( h7 \( ~. w$ g' b{6 s; i, u1 D( u3 o2 j# X: d
' _% ~# j( h3 r' W; q
//interrupt enable,initialized
0 S$ h4 |9 h# A8 u6 s( X unsigned int temp;! c. H- Q. T% X# u5 d
//SLEEP_EN(GPIO8[10])---0
1 X, T# E6 |* Q+ R! ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# ^. }: W% x/ B1 ~ temp=temp&(~0x00000400);, v8 u5 z |' N! G# E& G; p5 L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ q8 M' V* X" u8 Y* R //RESETn(GPIO8[8])----0----1) e8 p9 K! d. ~& F4 F7 f. i
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- ^3 V* j7 _4 J temp=temp&(~0x00000100);
% F/ B5 U! @0 u; H% A6 d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* b* ?* a8 R# \' L9 Q: t udelay(100);
7 q& L' S+ c: a8 z. x/ R temp=temp| 0x00000100;! q5 u" J: \+ C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1, W& ^/ J4 Q/ o1 Y- X
udelay(100);
* k/ n; s) o- m, G printk("open success!\n");/ L1 r" [9 B7 Y; {# w
return 0;& @" N1 ]5 ^7 h* ^2 H9 q* U9 J, W
}* D# Y7 }4 u, Y) H8 N
: U3 P" F/ I; h. m
static int mcbsp_release(struct inode *inode,struct file *file)
% i4 [1 h+ J9 L+ [4 r3 [{* W( A: e7 J0 Q
printk("release success!\n");
+ y' n: y) d+ E4 @! ` return 0;$ i, S o) g0 y0 ]( r
}
2 U) E8 y4 h, j' N
# s; g5 S* j$ r* \static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% P+ }, s1 ^ l( b{
6 ] o* J+ x& Y* N- v3 | copy_from_user(&DXR_data,buf,len);# t7 \# u6 S3 d6 T, [% e2 w
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
! g8 d# ^, G6 ]' W% y return 0;
) ]# p6 ]+ E: c/ K$ }- u. Q
4 M |3 h6 ?) b& p h9 X}! [8 a% ^( e( j* {# `7 A8 e
0 |0 F) N1 h, e) {4 x% j: E z2 E4 Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
2 O8 h4 z O0 p& F. T$ o9 J$ ^{ 0 o6 p, p3 i- f, g. M% W+ A
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" N6 U0 B& }# z' g% `" x
copy_to_user(buf,&DRR_data,len);
. X5 P" }3 ?' S' q return 0;5 G" G$ n! k1 E& j' p5 q4 `) Z0 m
}
d2 O& ]6 L# k" G7 q3 Z% O3 y {! J3 P3 \+ U. K2 U
* b! j6 U" K' L+ N8 R2 rstatic struct file_operations mcbsp_fops=
$ l- e; H. l* Y{# |. W0 d F- J; J1 D" A: n/ V. B6 m
.owner=THIS_MODULE,
- t& v j7 ^% m, s+ Y1 x3 N1 u .open=mcbsp_open,
, P1 o8 }8 O2 _" I# K( r, u .release=mcbsp_release,
& @! Q! P7 C) d .write=mcbsp_write,4 D1 p; y* T; c) q
.read=mcbsp_read,
5 m/ n; N) a: b/ b, d$ b- ]& [};& H6 s, ?: v$ t$ `
static int __init MCBSP_init(void)
; s0 B6 ^3 C2 C8 d) N4 V{, h4 v i% b+ s& B, T
int ret;, l! M6 k$ h, z# y; o6 ^
unsigned int PINMUX1_REG_old;! K9 [+ q, M* j' `% I7 Z3 q
unsigned int PINMUX18_REG_old;
# k# v M+ o' E5 X! `5 F unsigned int PINMUX19_REG_old;, f& T A9 A6 I+ ^2 m1 Z1 H; t) H
unsigned int temp; . Y9 T" N" B& K8 n* G
if(MCBSP_MAJOR)
2 `2 f" N! t0 Y6 t$ H, ]/ h {
0 c- E' t2 p0 d, p8 O- ] mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' K) j% O% ]- w" j9 Y% h( B9 _0 _0 C ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' o8 R6 ^7 H$ q ^. ^ }
) \3 T$ T9 ]3 k: P: [0 X' s- F else
5 o$ S3 S+ X- k& a) Q {
. L: F7 c& o- b3 D* R ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 A' b9 [( j9 g( _7 K% M- t: J: G3 k! v MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 C3 i: j0 q3 l6 T; A2 r4 }- c% C( l }
: O7 q( U4 s* Z. }. X+ T' X( E
' z9 x! P' d$ x" c/ \( w# M if(ret<0), T: [7 V7 {$ P' K' ?6 ]5 b7 v5 b, m
{6 ?* ]1 F! k% @- W' q
printk(KERN_ERR "register chrdev fail!");
0 V9 O" R2 G5 I) q! Q/ b( [ return -1;
6 k! _/ [: `; X) e! I8 d }
# J) i, q& O/ P
' f5 B2 h7 r2 @( J" A mcbsp_cdev=cdev_alloc();& H' O- W* E, @) p
: w) d; l$ A% P3 u# Z4 c. ]; q
if(mcbsp_cdev!=NULL)
# B% A6 Q, h" M. {" q: K. _ {
3 X/ Z4 [9 Y5 o) ^# o. I cdev_init(mcbsp_cdev,&mcbsp_fops);
) E- Y! T6 B, u; { mcbsp_cdev->ops=&mcbsp_fops;
0 B2 X5 A* t' b$ H mcbsp_cdev->owner=THIS_MODULE;6 ^3 a) x& a- A( D; e0 U( u
" v. q3 [, i1 p+ m if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* C# u% |) k0 Y( k! W printk(KERN_ERR "register cdev fail!");' \) f( ]. Q0 j+ h: \! V: D6 W
else5 y6 @) t2 H6 G! v$ ?
printk(KERN_ERR "register success!\n");
) i V# X0 ?1 N }
0 v$ x1 K) ?7 c& T! A" W5 Y% W/ r5 c else
# x: S; K' ]# U6 F# [4 S {
& [/ ~5 A5 B. O% g; B printk(KERN_ERR "register cdev err!");
$ B5 x! L7 ?7 l1 J' ?5 R6 h8 L return -1;" [! i$ j$ T: [: J. l1 l6 N
}
" ^" k' r3 j# a2 \ + f1 _+ V: y$ k+ H1 B4 @( n% O
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 `* f8 i3 @* Q/ |
if(IS_ERR(mcbsp_class))
# z( u- y8 G( d' [: f! j {4 `1 O, O w5 o% \. [. ?2 K1 _
printk(KERN_ERR "register class err!");; I$ g1 U4 x1 o) r: Z
return -1;
6 U; m3 e+ \1 _, z* ~( |) U }8 ~3 F1 O8 i$ P1 D* \0 p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ c7 K. k o: M7 l! W' v( u7 u; Z. A: Q# q( ]7 A
//PSC
: T& C$ F. b2 H. C3 i //add Enable MCBSP
4 y. O+ H2 x% P //test( S2 {' `! X) {/ y# u
temp = 0x80000003;
# [* a4 ~% g8 E# M `% d p+ O, O writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 O: |# I% e3 k9 c2 C/ k
temp = 0x00000003;2 D- _" r2 ~: Z7 n4 h
writel(temp, IO_ADDRESS(PTCMD_ADDR));
# e; Q* _( S4 V. Z7 d L& F: U
' d2 u p/ ]$ S( R8 { temp = 0x001FF201;
) o9 S. f+ Z: Y; V7 k: l; g writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 A6 |# `6 m7 J6 Q& Y* z- w* N & \& T! p" o _3 A
//PINMUX 3 c7 ?, J1 o, z p9 w1 i
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
& C9 D/ M% |# F/ Z& D PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 6 f" E9 @+ X7 u" j
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
. J; w" _+ X) @1 M- X; P9 F writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ D& T5 p: f! H* v
- v1 h" q8 P. p- D //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ u8 u- k1 ~+ l1 w PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); : [9 E3 i4 ]8 m. Z, T4 a
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; , q) d2 w) `, y" O7 l
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! [ B ^# P! w5 M8 r( w$ H2 z. M
4 j3 o3 J6 c- N; [- g0 l7 Y //RESETn,L138_SHK2& t6 E' G2 ]* s" z. u! ]6 E7 q
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, e7 `2 Y8 z; q PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 t# u7 q2 H) ^. K writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 o9 s* }7 I) d4 q: V/ }( K. g$ G ]4 g+ J
r- P6 y# m! H' H. C" K$ t# S+ O
8 U: Y+ Q; T2 a. S+ s6 H //SPCR Register
. X6 D! w6 |: h' h- Q8 T: k2 T //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset8 b# u4 M- j3 ]+ R
temp = 0x03000000;//(DLB=0). s* ~$ D/ Y" P8 Z0 v
// temp = 0x03008000;//(DLB=1)
- ?, f" m* M. H+ W3 u writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset* F: N T+ H8 Q3 K$ W- P" ?+ \+ @
temp = readl(IO_ADDRESS(SPCR_ADDR));
; T. e" d0 |" S3 n printk("temp=%x\n",temp);3 s% b2 X0 H- w& I+ S( V
# }4 s( C. [, g0 K //PCR Register; \' ?- o& P$ ~
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( P5 E* n2 O' a# A% R- j3 l // temp = 0x00000F0F;* o/ h% [* t- t
temp = 0x00000B0F;
1 s- k* n+ T2 b, c writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) { R# j" f* Y
temp = readl(IO_ADDRESS(PCR_ADDR));
$ z# T; l1 l) `9 j" b printk("temp=%x\n",temp);
W" j! ~6 c1 ~ //SRGR Register& v: N& F9 L- q6 O$ b/ x
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
$ X0 t$ X+ P# ^$ c //temp = 0x301F000B;
3 J+ h: ?, ?4 O9 e/ H3 I writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized / Y: y& g' T2 r
temp = readl(IO_ADDRESS(SRGR_ADDR));
* d4 \+ n* s/ g' m1 R printk("temp=%x\n",temp);$ }1 L6 B: v, o5 s8 D/ C3 @
//RCR, f. G1 Y/ l' k$ S4 C. I
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: X& o6 `/ x, Y, J7 x- R- t //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 j q1 s. g- d6 |) C* l& Q
temp = 0x00440040;) D; Z: [% x: {, m1 J
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 3 s5 x3 n0 b) S/ V% Y) q0 J2 j2 z! E
temp = readl(IO_ADDRESS(RCR_ADDR));
1 V) m' U4 A% ` F# U printk("temp=%x\n",temp);+ G# I, l1 k0 d- S" P( o+ E* A
//XCR5 e6 x9 ^& B/ s1 E: @' P
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) M; X3 r1 V' C9 W& o
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
# c0 S7 @5 {3 |/ R temp = 0x00440040;
" L' y1 H' b3 Z$ v V% O/ _; g! y writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized . X% L2 m% a2 F/ c! q+ E
temp = readl(IO_ADDRESS(XCR_ADDR));
9 @$ R' U- g1 X/ q! ~7 O" ~ printk("temp=%x\n",temp);
. n# j! { H$ V% A# d udelay(100);
& y7 l" ^2 X3 c8 j //SPCR Register7 q/ H; l; y( J& P, g9 B9 A& |- x
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' O3 `8 B! [7 @8 e7 [ temp = 0x03C10001; //DLB = 0 VS DLB = 1
, O7 p: ?6 n# P! K( S. F writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled" x D/ M5 f6 E) z( F
temp = readl(IO_ADDRESS(SPCR_ADDR));
( a! K/ q5 w: z+ ^ printk("temp=%x\n",temp);; I6 G, j: K$ w
udelay(100);
6 a: M4 y! v6 q# E7 v7 U: z9 J. p9 p$ n' F
//set GPIO direction
3 B% a5 d# Z9 C0 @) g$ K temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 e+ W3 r0 }4 J+ ^9 f1 o" q. o temp = temp | 0x00000100;//EPR----input
2 U& X z. K9 H$ @& a temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 ?. d% N S( d8 v3 x8 g G7 v, D O
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 P2 C$ g; q' l! w* Q
9 P4 f" l) E. L- f+ m/ s6 Q return 0;1 N) `# T1 I1 H* s# z3 v- `& Y
}7 @$ d1 E0 c6 k0 b- Z7 c1 g
static void __exit MCBSP_exit(void)9 A9 W) D& l8 Q* C9 G
{
; ?/ a, m% D% y% ^: i printk("mcbsp chrdev exit!\n");
4 n2 I* n& \8 a2 ~! O+ k5 h. Y5 x cdev_del(mcbsp_cdev);
6 i' r6 i7 C5 D4 y unregister_chrdev_region(mcbsp_dev,count);3 T6 g, k' Z0 y
device_destroy(mcbsp_class,mcbsp_dev);
2 n5 f2 I# g) K9 { class_destroy(mcbsp_class); T9 \9 @9 S7 g4 h9 k# |$ b
}
! Q) z! e5 d, n4 ymodule_init(MCBSP_init);! w8 \+ _; B- ?! R0 |# p& v
module_exit(MCBSP_exit);
3 _' n# i- Y7 H' B5 v( V
2 ^: I/ o) v. D! j: oMODULE_LICENSE("GPL");
; [+ O/ X* f# \ P4 r% v$ v, z% J( Z$ w) y. y ?+ T
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" L& Y/ c, G+ t我的应用层的测试程序如下* W. l: ^9 F- _# m, g
#include <stdio.h>
/ O3 X1 X# e2 {5 ~$ E7 `; A3 |2 z( [#include <string.h>
: e% i- T1 z- a. Y; Q. a#include <fcntl.h>
! U z0 Z( Y p Z L! l#include <unistd.h>$ P& Y. Z% j2 e% R5 n' ?
#include <signal.h>- w; z" C% P0 [6 o8 j9 ]
#include <pthread.h> //线程
- }' Q: j( a; h( t* V7 g: b; b5 Y#include <stdlib.h>
$ I- N$ k' i, P6 u. e, D#include <pcap.h> //捕获网口数据4 i8 V+ f/ }5 g7 p- x
#include <semaphore.h> //信号7 D' t) [8 O8 u! V$ j# m8 D
#include <sys/types.h> //消息对列8 p( K% O+ ^ N1 \' R# `
#include <sys/ipc.h> //消息队列
0 y# u" [( ` n6 S% f- W2 ~#include <sys/msg.h> //消息队列! A7 o' U3 @/ s' n8 L% t6 [
#include <sys/select.h>. i* ~) K* C- g$ B# e
#include <sys/syscall.h>3 [* s# P. n1 P4 V
#include <sys/stat.h>
5 B# p, \( r* ]3 b R/ ?5 P#include <sys/mman.h>
; Z2 R% e7 {& k1 S* l#define msleep(x) usleep(1000*x)( N5 K2 L: } @8 y# P
0 a& {+ e! _. N0 U7 i9 D
int main()8 m) c: w8 v2 e/ g& G
{ # z1 i8 r% W& M' S- s" ~" ]9 {
//MCBSP,ARM与AMBE2000交互设备' p2 F( X. l* S4 ~$ d0 Z- y
int fd;
& s3 W3 D& O7 v; R* g unsigned short data_write = 0x5555;$ s1 |6 o- ]* C$ b: b4 _: u8 T/ ]
unsigned short data_read = 0x00;
! S5 ?/ u$ u" u fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ h2 q P+ r( {
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* j1 X; Z6 d6 q$ s- r N 5 d* U4 ?0 I% n
if(fd < 0)/ g# }5 q4 x. X) Y6 Z8 p+ U# K
{
& i) b0 _" ]1 Q$ J7 | perror("open failed\n");5 o8 R# C z- Z0 v
return -1;3 r; ?7 X* X# x# Z# L: T Z
}4 \3 F, y4 b7 L. P# e
( j8 q5 `; h* k; |. d8 ?# j& `- y
while(1)( ~3 F/ u7 v' L/ T
{
' O6 u) O, u1 q% e+ y 7 p3 q4 x0 P0 f' i! V% q/ S
//AMBE2000每次读写是24个字为一帧) P) Q3 m1 X, B4 s
//写数据时将数据在底层存储起来,等到中断的时候再发送; x3 n7 l, A3 K
//AMBE2000输入数据是以0x13EC开头的. R: H' Q: n0 D: j) Y' @
write(fd,&data_write,sizeof(unsigned short));+ e& `' v/ ~4 m! ?! [# A5 z8 \
! X. `) [& \1 D6 \: \4 }" D2 f$ [3 N
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 3 _9 P1 m# k _7 j
read(fd,&data_read,sizeof(unsigned short));6 h. r4 L; q) w9 ?& y$ Z
+ z2 `& U0 D2 B% N if(data_read == 0x13Ec)
7 O8 R9 f' L q; A) f7 _* x B6 A( | {: G- B* r$ s4 p6 \1 Z$ _3 O S
5 @$ H5 F& ]* Z x0 } printf("data_read = %x\n",data_read);
1 ]1 C5 E8 \9 O* U. p }
8 I- ~$ H( S5 J4 `- r
: {- F8 g' K" k msleep(10);
$ k1 h, a2 R+ y4 c
7 A; u: Q: r9 ~ y# x6 { /*
, `. a, A" M3 @ ioctl(fd,1); : @5 W1 c8 }8 q [% ?/ ?, |8 z
sleep(1);: s5 q& s1 k3 Z& z4 Q
ioctl(fd,0);
9 a5 H8 \4 l# S6 S; \& {: K sleep(1);
/ d, q' N& w# ` */
/ G+ A% n; x" {; H: b2 } } $ e- H: h) ?- i" W8 L
return 0;
" ~6 @ y. {% `1 N! J' d
, [0 C5 T" N! n' C- a% _}
' Y/ B! X% H2 S5 H4 z( @2 G% F" ^1 ^* H% Y6 G2 `
多谢各位指教,谢谢! 急
2 |( {" y; ^+ U' W7 |0 b8 ]
" L0 O, o! ^% c- K R( k
8 j+ |+ g0 @' i6 @! P
# G, B4 U- L; ]7 [- I, A$ g5 v7 [0 O3 \, r7 g4 l6 Q5 j6 O
/ Q' v2 j8 r( p K q |
|