|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' Y; s. d/ Z+ `9 L# y/*
! t: z, i$ l/ C * Copyright (C) 2009 Texas Instruments Inc, m, u; _0 c( X4 i
*
+ I+ B3 q" k# ]3 G: ?: s/ U! q * This program is free software; you can redistribute it and/or modify0 X2 A8 \! L3 p1 A
* it under the terms of the GNU General Public License as published by
4 y5 |) X1 d0 |' `, }5 y8 ^- [ * the Free Software Foundation; either version 2 of the License, or
2 ^/ h$ v9 d% }# P2 T9 r. d5 T * (at your option)any later version.! e& {9 S, \5 B
*2 |6 l5 Q: O4 O" A& ~, R
* This program is distributed in the hope that it will be useful,7 g& I' i. G5 o
* but WITHOUT ANY WARRANTY; without even the implied warranty of! g: k$ W: A& ^* W- K' w
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 j0 n- p& `3 t2 j
* GNU General Public License for more details.% K% b3 q. _( m) J% |' b& Z
*# l Y: j* Y2 m( A- b0 a* a
* You should have received a copy of the GNU General Public License
9 l. s2 {- _ t0 e8 B" h g; L * along with this program; if not, write to the Free Software Z& a( T9 W5 o% I
* Foundati( i! k4 b9 {% L9 a
*/
: W1 D3 B# V. H1 r- P#include <linux/module.h>
# f, j+ s2 F" t( t! B' w. n#include <linux/init.h>
- }/ s" ~- w( Q1 g+ v6 I#include <linux/errno.h>
; R% a: ]3 a8 a T. g#include <linux/types.h>0 v0 B3 P! A0 N- I; Y
#include <linux/interrupt.h>
' t7 x5 ~4 T0 i, t9 D* z& l2 U#include <linux/io.h>: R$ H; ?& T2 V: q/ n1 ~
#include <linux/sysctl.h>+ T& c6 c0 e0 [ ?& w
#include <linux/mm.h>
4 X. W+ y- z$ Q#include <linux/delay.h>& V P% d7 R4 r0 d
#include<linux/kernel.h>- M$ E& A5 U; u$ P, |+ ?: ~
#include<linux/fs.h>
/ j& ?$ k1 Z, o' ^( _6 N#include<linux/ioctl.h>6 ]4 f8 V' p2 ~# a% x' U- y
#include<linux/cdev.h>
0 e8 W; p$ D t, q2 \' i1 G: ?: Z" b#include<linux/kdev_t.h>
0 K% m6 Y& O- Z4 j- l#include<linux/gpio.h>- h( L% M( q, V9 x. y3 e
#include <mach/hardware.h>: ?6 M9 ?' Y2 [
#include <mach/irqs.h>
* u$ H0 o" R' B7 x. {* I; ^6 `- `7 W5 S1 ?
#include <asm/mach-types.h>
6 ?) H$ @+ ~: \) k7 N#include <asm/mach/arch.h>+ |2 @5 Q6 g6 ^7 u, l( N* m
#include <mach/da8xx.h>8 ~% h# R) D) X
#define SYSCFG_BASE 0x01c14000
. u( n, r- Y) s#define PINMUX1_OFFSET 0x124 ) ?. m; A( T X8 S2 i
#define PINMUX18_OFFSET 0x168 $ @/ l. e4 M, j' s
#define PINMUX19_OFFSET 0x16c- O$ X! l: F' l( e
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 v7 Y. u- h* P# z# ~8 k
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
; r* b: R; u; f4 B" ?7 ]#define XCR_ADDR 0x01D11010 //MCBSP1_XCR. t& l. {- i* p5 N
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
$ B5 F2 _/ i$ }: @#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
! {5 J v+ x' I# [6 c$ w , h/ k1 Y8 w! m) ?* t+ f; Q2 E
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR* Q* c1 s9 ?- n0 k. a
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
" u6 h- c( b- _% i$ X" A; V//PSC
) {2 o! C$ E8 D5 i7 S: x; X, F#define PTCMD_ADDR 0x01E27120 ' @( [/ Z z2 K# _( R) N, S/ a7 A1 k
#define MDCTL15_ADDR 0x01E27A3C
! d5 N( G* K; w) T#define PDCTL1_ADDR 0x01E27304
# W. L2 |6 {/ `/ D% q//GPIO8 direction
8 f6 j& O$ D6 A( W#define GPIO8_DIRECT 0x01E260B0
& @# z& U j$ V' }- L/ y#define GPIO8_OUT 0x01E260B4 u6 _- }( W! i. o1 \
#define GPIO8_IN 0x01E260C0+ c6 ? z! t/ u+ v9 h/ [1 [
- }# z+ Y9 }* P8 `7 U$ j: F
//#define MCBSP1_RINT 99
5 ?3 c) O V0 r7 E" E M `) g//#define MCBSP1_XINT 100
/ W% K' {. I% T: estatic int MCBSP_MAJOR=239;
% ~7 o& x' M; O- r& r; Rstatic int MCBSP_MINOR=0;
0 X: E x' _! V) N Pstatic int count =1;
1 k; X$ j& y2 ?+ b$ Q/ I) C* J" F/ K: D, ~
#define MCBSP_NAME "MCBSP-device", }3 x! Z( ~/ s. x+ o' m0 _: c
; v3 t. v- W0 H m4 L6 Cstatic struct cdev *mcbsp_cdev;
0 ~% {/ b4 y( U6 \' Tstatic struct class *mcbsp_class;
5 k: }( X+ L6 k: i% Sstatic dev_t mcbsp_dev;
% L( f' G+ }* \/ cunsigned int DRR_data;* |: Q0 b; a1 m$ x% x" s* h
unsigned int DXR_data;
j/ b8 l3 _5 c Y& v, K3 u) rstatic int mcbsp_open(struct inode *inode,struct file *file)/ C! y& o# f. ?% P
{
5 d; b8 V }6 h 6 @, B3 P6 q9 @" L/ H& i
//interrupt enable,initialized6 v" h" V/ ]. i$ U0 R' ?. F( p! c8 l' q
unsigned int temp;
6 @9 k* a, b* Q- Z) h //SLEEP_EN(GPIO8[10])---0
, M/ a- v* \# K/ y# l temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: K5 ~. Z) v9 P/ a A9 N" t" O temp=temp&(~0x00000400);
& d( L' e2 Q4 f __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 B9 W/ E4 u& J3 n
//RESETn(GPIO8[8])----0----1/ p9 j- V" t2 L9 u+ h* O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 }+ ~% l# q/ h1 C temp=temp&(~0x00000100);" ^/ h2 q7 w- s* `- M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( V6 J9 y9 f0 L, y, m6 b+ ^" _
udelay(100);$ X: l* ` D3 g
temp=temp| 0x00000100;- M( O; r. f0 \% ]! s1 A0 B: @
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ A! \+ w6 @+ f$ _9 J" R6 Z
udelay(100);3 |# d% c$ A! r! b
printk("open success!\n");$ f9 J" c0 n2 g4 E4 ]6 R8 N. ?$ o
return 0;
7 j9 E1 O) Z% y7 w) j- @% a}' u/ k. K0 B/ z+ K. t( z
/ o0 I: V6 H$ T. L) B g' @0 k( Rstatic int mcbsp_release(struct inode *inode,struct file *file)
- U1 ]! ]' d7 g{" P; ]0 ]( l& R' o* p$ ]
printk("release success!\n");
4 \6 |) I5 p; t& w5 | return 0;
9 g5 g4 t. d7 H2 X4 b}
0 G* d# v) s( ^
- k* e9 F- z+ F5 W( kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 d5 L0 ], [6 D+ L0 y{$ m4 j3 Z. X7 |* X) ^' E `" k
copy_from_user(&DXR_data,buf,len); {" G9 t( n* v) H* T, R1 A6 I
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. @& H$ U7 J) \9 P9 J# _ return 0;
" d& r: V# Z9 G1 t3 Z( u2 M
3 e* H H. N/ ?" C}
- P7 S* ]. g9 P# Y% Q
* Y0 H% O- m, S* g* ~- L" kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): A, ?7 u& W {7 X7 _
{ 5 p3 f X6 t% W6 j
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' |" c+ \5 a5 h( @ copy_to_user(buf,&DRR_data,len); 2 J9 D$ a0 w( O9 m7 C! u
return 0;$ s5 n$ e% x% D$ Q( \1 J
}
. F0 q% K$ q4 i/ ?. \$ I9 E
7 |! g% J" _9 u! y% ~* i( c# j
: [) Y( y! l4 h. U7 tstatic struct file_operations mcbsp_fops=
3 j* `* t% i: \, k! Q{
2 G2 d) S8 [; V8 E8 q9 l! w, T' T .owner=THIS_MODULE,+ w& y0 d& t2 t# _0 W8 q
.open=mcbsp_open,
. d1 T9 C. B4 `5 M6 n .release=mcbsp_release,. }, m. {6 [( d- |' ~
.write=mcbsp_write,
+ }( d$ J% k! s/ l( f .read=mcbsp_read,
) G- `" l7 I$ l1 C; K/ M3 C};
3 W$ K0 U: f- B* B- |static int __init MCBSP_init(void)+ t: j3 B6 n- I% r6 A# n& `' f
{4 R- q+ v6 F2 B7 [( w0 P2 C9 ?# X
int ret;
) f7 B% f. b M5 R" W& |/ l unsigned int PINMUX1_REG_old;
@2 F3 w8 p3 U* C1 H+ S unsigned int PINMUX18_REG_old;) L4 w! X9 U# Y6 N6 k
unsigned int PINMUX19_REG_old;
) v g% A2 f" b. z unsigned int temp; # H+ o0 m7 I1 p7 _- Q
if(MCBSP_MAJOR)! V/ x% s( Q* u; D; V" @
{3 |0 u0 t1 A2 G* E# p+ E- k
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' J" [! o# v( y% f ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& P9 N$ L: i8 W. e& U }
+ n9 d. O5 r' C* y. v else2 L# F1 f* H2 R, F6 a0 p
{# Z+ g U$ A8 L, v
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! I7 I h& [; e( U V5 L
MCBSP_MAJOR=MAJOR(mcbsp_dev);' s- Y' w M: y; r
} ^& y7 @& M) J' [# A! ^7 b
m |7 v% M, } a/ K8 C
if(ret<0) d, a9 j8 k7 Y- @7 N
{
' u/ B+ }! A( H8 C+ J printk(KERN_ERR "register chrdev fail!");1 i# r. x7 s8 _8 S6 M$ G4 c i
return -1; x& y- Y* o5 g0 @3 U- V
}8 y8 G6 c. ]- l: }+ B) z" u
, l( h' j0 N0 q7 f( J; q7 p
mcbsp_cdev=cdev_alloc();
# V8 |, N: o5 N; w3 i
7 G- q! ]- O" z+ |* _ if(mcbsp_cdev!=NULL)2 w6 O! a4 Q3 n m7 d
{# Y2 T% E! h- v, z0 I1 m! W# }
cdev_init(mcbsp_cdev,&mcbsp_fops);
7 z" b9 C! T5 T* W mcbsp_cdev->ops=&mcbsp_fops;, f- M! Y' Q- i' T
mcbsp_cdev->owner=THIS_MODULE;2 c, r# y! j3 T6 B* z- B
; V1 h$ f9 o/ n
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)) j# ~( K: c! V. I: D! F' `0 d2 H
printk(KERN_ERR "register cdev fail!");+ M# q" C1 t' T2 j1 _
else4 ^! I- E$ `+ `0 J H7 e, E
printk(KERN_ERR "register success!\n");
" Z# O! `& u/ Z5 ~" S! M+ { }1 @" U7 A. Q" X. H
else7 [# _! s9 T$ O3 H7 O* t
{
7 `1 H8 l9 A4 w, u& [7 K8 M6 B printk(KERN_ERR "register cdev err!");% o) X1 X" X/ H4 h
return -1;! D. s$ K9 v# ~
}
8 w+ b2 T4 w" V, a- E* }
' K4 X j% V; C% ?, U3 P' f mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 ^. A) x- A- {9 _6 |. P, g R9 A6 l if(IS_ERR(mcbsp_class))
, M& v3 B3 _$ `! q$ k# A3 S {% W/ T8 {! P( }. P2 y( N4 P6 u% S
printk(KERN_ERR "register class err!");
; X( G( l5 ^- p return -1;5 C9 w2 D* b [3 I8 t
}
3 V- \0 W) Z9 W) \( S device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# F! @. X: o! T6 v/ ?. W% C( B/ i
//PSC: q) [3 y1 c9 ]- j$ L4 n! J
//add Enable MCBSP
& Y8 q2 X" |2 E1 M8 g# R3 S5 O& o //test
( g* d( e1 E, |2 h |4 M7 ?0 r temp = 0x80000003;- P# Q! ^- J8 N M, D9 |+ v
writel(temp, IO_ADDRESS(MDCTL15_ADDR));; [7 G: z. q5 u6 J" t) `& s6 s! ]
temp = 0x00000003;4 C4 M6 Q7 k5 m6 \& X
writel(temp, IO_ADDRESS(PTCMD_ADDR));0 F& C0 [$ R" O; {0 x. o9 s
) }: }) ?. ^" ~9 x& l" D
temp = 0x001FF201;5 Q2 g- X& \0 F
writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 _. I- P# U2 Q4 \) p i, p" E3 x
# ~: b/ i$ n$ I4 ]6 X
//PINMUX 1 f+ c( _1 Z1 Q! B& G. _& z u! d
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ {% y+ O1 o) p" L5 Q PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% D. }) V6 \5 s+ N& D2 F8 O, W& G PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; $ h* t9 F S" A7 f+ p
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 s2 R8 w8 W. t8 T- w
* I4 J$ }: ^. Y //SLEEP_EN,EPR,L138_SHK1,L138_RC
V( T) u$ v! P ]5 b. e PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 y. m3 @4 [* E8 r3 [6 y P8 c PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / ]! t# Y. o9 W5 c5 i
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 o* k/ v o4 B4 Z8 P 3 i9 Q' l. y. k! O8 p
//RESETn,L138_SHK2
7 U6 B# Z# x V3 M PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); # y- d, @& L3 R1 F* e
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ( c" V% i2 U+ ~% I" s' @, x
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& I$ Z1 r5 W7 P$ L+ \4 v
! @0 x' i- A) l/ ^' `( U/ x: s
, T. P0 N( A0 l/ _* r3 w$ ^6 Q
//SPCR Register
3 C! c+ ?) ]7 e //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" A/ n' O( o. `* M. P temp = 0x03000000;//(DLB=0)% o$ A4 G% d) b& R
// temp = 0x03008000;//(DLB=1)+ E8 T% M3 Q/ P# y x, p
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
- O, N- p. n% D8 ~: A3 v2 N temp = readl(IO_ADDRESS(SPCR_ADDR));3 D* S/ G4 ]1 e' D- S
printk("temp=%x\n",temp); i3 q7 x, A4 P! c
* A" f. j+ X) m# \/ {+ t$ i //PCR Register: I3 i& a, @6 f5 L3 E Q
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0+ R7 { A8 O2 I6 V3 X8 \
// temp = 0x00000F0F;! v6 T5 V k8 }/ ~0 A* V
temp = 0x00000B0F;; U( X* ]( j# ]- j
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
' Y& z e1 g1 {; f8 v temp = readl(IO_ADDRESS(PCR_ADDR));2 @" C* E9 `$ F# S" C
printk("temp=%x\n",temp);
' |, O( m0 V+ `# `! n# l //SRGR Register' D3 Z7 I2 E2 N4 t- W0 U- Z( i
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 m% m+ W5 m6 q- ]! l1 {
//temp = 0x301F000B;
+ T. ~4 y- q. b1 u O+ a7 | writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
. u0 P9 j8 q( f temp = readl(IO_ADDRESS(SRGR_ADDR));
8 o& i# p6 y. b8 k' u printk("temp=%x\n",temp);
# N3 `) d( x- A' ^9 T! U( m7 W //RCR0 L6 E U' x3 A& s6 Z: L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 a4 D) a4 {' [1 p
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 Z& b% @0 a. h$ W! e" a
temp = 0x00440040;$ Q8 N$ r5 w2 x+ t* n) }
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 U5 L$ h+ y4 n0 b1 b/ Y
temp = readl(IO_ADDRESS(RCR_ADDR));. e" Y0 J3 V- g% h0 R5 a
printk("temp=%x\n",temp);" E1 n1 i8 c9 x! u. {7 }) r# P+ H* u
//XCR
6 s( w; F! Y) w1 M) t/ i. _ ^ //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! z" h, P0 V; g$ e6 C //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 U2 a5 X+ L5 |- s) X5 {3 y! d
temp = 0x00440040;6 N* ^- W6 C4 M9 ]: K1 s, Y2 A1 m
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 ?0 J, F9 C+ j3 w4 ?, S temp = readl(IO_ADDRESS(XCR_ADDR));
$ ?6 g5 m4 m" R) ` printk("temp=%x\n",temp);
: k6 V/ B* ^: L3 A6 o! U* t4 X& c udelay(100);
4 b) U. U) h. O4 L# L% A( G //SPCR Register
, c! m. T. F! t5 }7 F5 A9 Q: \6 o //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1* [: x5 I4 m7 E9 \9 J* r3 @
temp = 0x03C10001; //DLB = 0 VS DLB = 1
- ~ h4 J6 A) Q) O5 ?2 f9 P; F; Q; y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled; a' X- r1 E. e! c
temp = readl(IO_ADDRESS(SPCR_ADDR));7 o* G( u! v3 n1 m% r# o5 j; Y5 Z9 K
printk("temp=%x\n",temp);
/ P* n: u5 p6 [. L% a9 o$ h* s. ^ udelay(100);/ A. ]) u: ` }* Q! B
6 p1 i2 c; z d8 {* G% X4 Z0 G% F
//set GPIO direction
4 R$ s4 r8 O6 I1 j0 U; f& [( m temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 \# ~% B9 s! m2 B! M/ q temp = temp | 0x00000100;//EPR----input
3 o3 R9 h# R0 |* Q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ ]' D, x& b- Q: m8 u __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . z+ d$ U$ I9 J- l
A8 W7 r+ |8 Y" O" j% G5 A" `# n return 0;
. ~+ T( K+ v6 l; S$ B7 P2 y* Q) z4 [}7 a$ A2 V; K* Z, r) i0 L
static void __exit MCBSP_exit(void)$ l5 \+ `. a8 _3 e+ ?
{( @7 ]# t, ^9 n' h6 l3 g
printk("mcbsp chrdev exit!\n");
2 m2 w! v' I- S; C; y$ v cdev_del(mcbsp_cdev);- k& y1 @2 v# [9 G
unregister_chrdev_region(mcbsp_dev,count);
8 {8 Q) [* @; H, m device_destroy(mcbsp_class,mcbsp_dev);
- u- N7 @( J7 N6 P1 Y; p class_destroy(mcbsp_class);
9 a" g. W$ A* a! i: I9 M}
( I, d9 Z* S3 f: O e, D/ Gmodule_init(MCBSP_init);
: r( C, X1 J @. C4 R; }module_exit(MCBSP_exit);
4 b( Y8 s7 r0 }# R: q7 D7 V: ~& _+ J' W1 r) L9 h, h
MODULE_LICENSE("GPL");2 C1 z* E1 Q, c7 r" G8 X! `
* N* s' `7 \' {. [我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' R. Z9 v% }, K$ d1 b9 R我的应用层的测试程序如下
7 `2 U+ G0 j. ^" H#include <stdio.h>
& s& ~9 Z& |8 L#include <string.h>
( l7 w4 o( e) G: R6 ]3 g. r#include <fcntl.h>
- W% E9 V: `% t: L* F#include <unistd.h>
6 Q/ x: J; Y7 Y* a6 \8 `* D#include <signal.h>6 b: `* K* f% r6 M
#include <pthread.h> //线程- T; Z# ^1 ~8 g" P9 _
#include <stdlib.h>' z T7 M" S- s2 N+ N- ?$ O! _
#include <pcap.h> //捕获网口数据6 Z, w+ L; p! b/ E7 L! U
#include <semaphore.h> //信号
1 h% A' W3 O9 b3 e7 e7 u& O#include <sys/types.h> //消息对列1 A( `. r9 t# ]
#include <sys/ipc.h> //消息队列
2 I5 Z) v3 X0 v# ?#include <sys/msg.h> //消息队列
) @3 V8 Q$ K+ i4 x# u7 ?# d; i#include <sys/select.h>
& |* P# b# @1 g8 w- G% g#include <sys/syscall.h>
$ x1 s' d: \3 {' t+ |! V#include <sys/stat.h>2 v0 n1 X! B% Q* I/ `+ ~
#include <sys/mman.h>+ P8 j5 N/ N. c' ]- y! G
#define msleep(x) usleep(1000*x)
/ D) _- p+ [5 _+ }! S, M: V6 S- t5 J
int main()1 P% n& V: `4 B0 s" _1 e
{ 7 J) @+ u' J3 R( u/ @8 w
//MCBSP,ARM与AMBE2000交互设备
/ X/ ]2 ?& G8 e% T6 ? int fd;1 l' j' H4 p. f- B: a! K- p4 N' x& b
unsigned short data_write = 0x5555;
0 R- Q1 w2 v+ m1 R4 [* u) d unsigned short data_read = 0x00;8 _$ [; h: v" S
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ ]0 R4 h9 ~# } z/ J. F6 { // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ h) Y' r7 i, \/ ^ ]9 {+ C9 U3 D; \
# ?4 [( u# u, V, h9 z( [
if(fd < 0), d1 }3 E7 U X3 K; Y0 l8 K
{( H: M8 k' A- Y7 |
perror("open failed\n");
! B6 J; n3 \5 T" P. N& a, N" a return -1;
7 K, E* Y- U- i+ N& ] }, S$ ]) C; H* q, o
8 V: O2 r! ?" @
while(1)- ^8 Z9 V1 ?$ i3 d/ H: G; r9 @
{$ a: ] w* N3 {0 d
: w! Y# `0 {) q, o$ S
//AMBE2000每次读写是24个字为一帧
4 l# H# c7 A- O //写数据时将数据在底层存储起来,等到中断的时候再发送" j2 n% E! \7 i* v' J" S' D
//AMBE2000输入数据是以0x13EC开头的
) p8 A& Z/ }( p' R write(fd,&data_write,sizeof(unsigned short));
3 F' D1 A! d2 I) U/ y4 o
A y9 s6 V) ?5 R# q( m //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ( s' i- c |' i, l0 |, [5 |
read(fd,&data_read,sizeof(unsigned short));+ D( D* P- G/ j
: J) c1 Y( l9 I; `- P, T
if(data_read == 0x13Ec)* V3 z. ~7 U& _8 S& T6 i+ C
{
* R5 {3 T3 H7 p: L4 p6 \8 F' C4 n
' {1 `5 W, m/ `, y' w: ? printf("data_read = %x\n",data_read);4 @1 |2 e/ H2 V! j* q4 m
}$ u' ^) v. g. _- n
& L5 J0 l/ b: G* S% l: s
msleep(10);' @' d) `+ {+ d- a) [9 C. ~
/ {& k* C- ?# U( }
/*
# J# \' P8 [% [ ioctl(fd,1);
6 E/ n6 |8 g3 @ L sleep(1);7 R- L% k" @' L, c2 D2 N* s
ioctl(fd,0);
4 e& s( V. a+ D3 F2 ? sleep(1);
# \8 Q2 R& k2 F9 W" U9 ]0 x, ~ */
- F5 O4 T6 s$ O) H6 P) B+ G. s } + z( ~' C; h" Y6 W+ A( }
return 0;( v$ Y1 Q8 a( M; M- E7 T! o$ Z8 G
9 z: d' X1 C8 C}& c; J% U9 z9 ^
4 u8 i2 g+ K' z( y
多谢各位指教,谢谢! 急
1 D, y, o* m1 ]9 s
9 _7 S* ]- h. ]$ e- K8 @) @
( K- c, j5 S6 a4 }) C2 ?2 t
6 P3 |$ V8 Z" m ?! @! ]+ q% |" a' h3 \) e0 R, a4 d) H
) ~0 c/ [2 E4 }, [7 H
|
|