|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# _; g. H- _5 _, N" h/*" \( _ Q& X) |+ `; W
* Copyright (C) 2009 Texas Instruments Inc: k3 E$ l3 |0 U6 O. x- n( X+ t% H
*2 q0 U' A% a' }7 h
* This program is free software; you can redistribute it and/or modify0 B% J- s" l4 r9 J6 C
* it under the terms of the GNU General Public License as published by
5 r: @$ j' q: `; k, \7 W4 d * the Free Software Foundation; either version 2 of the License, or
4 y1 e6 J2 m8 l$ J p5 |# f# M2 Y1 ~ * (at your option)any later version.
5 k6 j! y4 }: X( a) l *& P* q* p+ b# W- A7 m
* This program is distributed in the hope that it will be useful,- p) D; h( s: B4 R2 r% Q
* but WITHOUT ANY WARRANTY; without even the implied warranty of8 ]5 i$ E, D- u* ]9 I$ @
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the( L0 F0 s" | d6 I7 J/ K
* GNU General Public License for more details.
: ~) N3 n2 K5 f3 a2 Y3 j: Q" q *- @. i; w, r1 X/ m' @
* You should have received a copy of the GNU General Public License
1 s' \" u* X; s7 @& z5 v * along with this program; if not, write to the Free Software, u- p4 y: [1 o- }2 g1 P: @( k2 B
* Foundati
% K$ S8 y1 P- U' q- \. {1 Z+ f& v1 ~*/4 W$ K0 h2 S5 T8 _3 j
#include <linux/module.h>
' L ^: K* d- e9 C- u: s0 J#include <linux/init.h>
7 J) F" F" h& e* k: q& i5 F% i& @! ?( v#include <linux/errno.h>
# S, e, `* g0 i/ _7 I# W#include <linux/types.h>3 Z! ~9 w. b' G9 T- D* e
#include <linux/interrupt.h>& @/ F+ s$ z- h, }: F- r
#include <linux/io.h>
$ F/ k2 n$ e8 S% s#include <linux/sysctl.h> e8 V6 O8 k; v' d
#include <linux/mm.h>
5 ~6 Y5 b; ^5 F#include <linux/delay.h>
! r. Q, S- C4 f#include<linux/kernel.h> L7 A4 Z" j: L' j, c: s) P
#include<linux/fs.h>
! D$ F" d0 }: \8 j* T#include<linux/ioctl.h>
& {/ ~6 g" J) w, \#include<linux/cdev.h>- \, k, S: g2 v, p- u" K, o8 q
#include<linux/kdev_t.h>. k5 m) |! h/ m
#include<linux/gpio.h>
( V7 |: }$ n9 ]#include <mach/hardware.h># Q! O% d. j6 x+ Y9 ?
#include <mach/irqs.h>
" i6 C8 Z% U& u6 d0 ?; E. X! f6 }2 m, D; v$ t0 `, s( L3 g
#include <asm/mach-types.h>
4 u. W5 P5 P6 y#include <asm/mach/arch.h>! a' e. E* {( `6 _/ [5 l
#include <mach/da8xx.h># O: Q' g# U$ y8 y! o5 i
#define SYSCFG_BASE 0x01c14000
0 I) d2 ~$ Z! \0 a4 n#define PINMUX1_OFFSET 0x124
2 w0 \; X. i0 m5 {& l" b% o#define PINMUX18_OFFSET 0x168 2 d$ ^; e% R3 T
#define PINMUX19_OFFSET 0x16c
, L! W# V3 [+ E: a3 C#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( Q. M" y$ D9 }; ?# L
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR2 c: M/ e/ E. `& i# \6 b) K4 b
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 I$ i5 E) D3 U- M' q1 ?! [#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR1 M6 {' U; ~) g; a
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR; a; F z; N1 {* l% V; {
$ y/ y% @2 H( E0 y3 L1 M' f#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
4 m, T3 t' I' O. @$ G* m#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
) n l7 d! V4 o4 p! B* D/ I//PSC
6 `, ]1 O. [$ M% \! C9 ]#define PTCMD_ADDR 0x01E27120 . u- s$ \6 {6 q3 U8 O/ K8 Y
#define MDCTL15_ADDR 0x01E27A3C
! T D i4 ~1 `% D7 X; [+ C#define PDCTL1_ADDR 0x01E27304
8 H' h1 \( T. b" R$ T" n//GPIO8 direction
6 l6 i- c4 M' K+ x% C$ _3 J# f#define GPIO8_DIRECT 0x01E260B0' o1 u. j% v8 S+ S7 ]- W
#define GPIO8_OUT 0x01E260B4
/ S% B3 N6 I8 l, H$ ]. m#define GPIO8_IN 0x01E260C04 p8 j6 S& P. z9 A! u
8 d) Q$ ?2 R; U; G* R# L//#define MCBSP1_RINT 99
: b0 h4 N% L( o) n; k//#define MCBSP1_XINT 100 0 q0 N1 B4 h- r3 @5 i# L9 I
static int MCBSP_MAJOR=239;
5 n4 B5 x: V, K$ C4 rstatic int MCBSP_MINOR=0;
6 ^( r W) _/ W+ z' s5 Q/ Y) ?( A1 t) L2 Ustatic int count =1;
6 ^' ?) J/ x# \% a* b5 b- X3 j8 M( u K7 T! d( |: B- l
#define MCBSP_NAME "MCBSP-device"
* |6 M% r. k( C+ I* g) G. n3 {5 I& K7 T
static struct cdev *mcbsp_cdev;
' a$ W R* k! z1 [0 f) ^! mstatic struct class *mcbsp_class;
+ p* D/ A: B& y; |/ h4 Istatic dev_t mcbsp_dev;
# J# W) n7 o' v& T* aunsigned int DRR_data;
" q( H5 N D& ]$ m1 Xunsigned int DXR_data;
+ E, d8 v- A$ ostatic int mcbsp_open(struct inode *inode,struct file *file)
' z, ^! P+ m, w7 d, [{2 j) S! c+ J, ~* Y& C$ c4 d
/ t" e. w& Y n" ?2 @ //interrupt enable,initialized
4 _1 B; N! K1 D0 m3 Z% c unsigned int temp;, z) ^/ Z1 s& V U
//SLEEP_EN(GPIO8[10])---0
- n) `4 v! S/ { temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 K. E0 X1 B) v, E
temp=temp&(~0x00000400);
. S2 s6 n3 O v( Q6 o3 x __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 e' Z$ Y1 I0 v% R$ P* S) U //RESETn(GPIO8[8])----0----1
+ h; k m Z, r) z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ S, S) P. w2 C7 C
temp=temp&(~0x00000100);) Z$ v, R3 b1 U9 J4 Y. s; J; \$ T; \: G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---04 u7 D! `& m; [% h. ^, Y9 @
udelay(100);
, E8 }1 F- b- s" g7 w2 t" x6 F* g temp=temp| 0x00000100;' K8 {4 c- ^5 M" y$ u; e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 Q4 z% H2 z8 j- W udelay(100);
7 d0 D2 G& L; \- I+ a( r* r printk("open success!\n");1 S/ e7 n+ ?( d) y5 v) c2 R7 h
return 0;
0 ]5 q4 { ?- b u1 C}* ^3 d% x$ u; l% V0 V3 @
2 P. V$ q# I. g) w* o. K- V
static int mcbsp_release(struct inode *inode,struct file *file)
" q Y2 }' s, i j8 g0 x4 W{
% c7 r C; s2 v% ~& }+ ] printk("release success!\n");" H! S7 _# L" D5 G
return 0;, J! t3 ~5 j. `8 i
}- {- z6 p5 E9 _/ \/ m6 e
8 d* R5 ?. C- |, ^. i" {static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 Y0 |/ C& O) k' Q7 Q{: g) d9 V- J( Q; x( A4 T& w9 {+ T
copy_from_user(&DXR_data,buf,len);4 p9 O) _4 Y e6 f0 @% `
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
7 a# G' f. K! L6 f: n! ?- G return 0;
) D1 s K0 O* X$ j4 I . s, S) h" z+ Q8 l8 R: O: E1 ^2 a
}
7 O" r1 E+ o _2 h2 S) q* J% S- [. ]
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 O4 d0 d7 h2 i5 N$ e" @
{ j# ~4 v- W/ f- R3 F9 \3 M
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; O0 Q3 i" g- H1 i4 q- R* p copy_to_user(buf,&DRR_data,len); 1 z7 p0 M" ?) c3 o0 p
return 0;1 ]3 c, I! o% v' u6 _: g5 s9 x
}
$ r3 l4 ~2 e g" }; t5 V( `1 b/ }3 f. L4 N
) I+ c4 B& o$ ~ h) S
static struct file_operations mcbsp_fops=
! [) |" t/ W/ |2 E{6 G( c( v/ X( ]* |& P: g& \
.owner=THIS_MODULE,
$ T+ R! [3 i8 z( j, e .open=mcbsp_open, l: I2 @) i" ~, A1 K7 }% v0 L$ L
.release=mcbsp_release,; M# C) r2 J8 }- P( b+ h
.write=mcbsp_write,8 F5 V0 j5 l" E4 r h% R
.read=mcbsp_read,, s' l& b& d1 V
};
8 y7 r4 Q2 ]( a. jstatic int __init MCBSP_init(void)
" g) {- A C8 ~. \2 h# g{) D5 n, l0 y- Y9 T `; K7 Q
int ret;
* H* P/ g: H$ E6 I2 D4 D4 c unsigned int PINMUX1_REG_old;: K& Y( p {& F; h1 E+ }( K, B
unsigned int PINMUX18_REG_old;
& T9 e2 y8 {" ^9 D' E) h$ i: s unsigned int PINMUX19_REG_old;+ r' x' J' G* L" d+ K$ r
unsigned int temp;
- H* K+ e) D& t" V# Q if(MCBSP_MAJOR)
* w* D! K7 s1 ?: C8 d3 `+ c/ b {
: J% n$ \! F2 Z1 z j; B" ?4 k0 }) r mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ H4 }' W/ N* y/ r- Q7 N) G+ R; @ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
- u6 j, h% ?& e6 o& g% y8 p }
" Z1 j* U) j2 h- \5 u else
3 E5 u$ D+ g& t: m0 h {7 l' H$ e7 U3 V2 F; v; }2 t' J- D2 ]
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! W2 Y5 c2 s2 b" m( q MCBSP_MAJOR=MAJOR(mcbsp_dev);/ \, n& H9 ~7 F) o& d
}
7 F1 P3 @" [3 c% a M/ T# S0 l+ s
if(ret<0)# q) n; o0 K4 B. R' _( a8 e9 w' i4 l
{
" V3 t' A+ C1 h& L7 u! V2 @/ ` printk(KERN_ERR "register chrdev fail!");" B3 [- E3 G }) [$ }
return -1;
' j8 L. t- g9 q! ^% C+ E1 v }
$ K- X# ?6 |9 \! S {- t ! j2 q" B# o9 |
mcbsp_cdev=cdev_alloc();' D7 ?( _: T& N& o. b/ O' m
8 `( X; ^! D; r; }- U0 ]
if(mcbsp_cdev!=NULL)) ^$ K E0 c9 h: X6 k
{# I3 M6 b" M6 ?) g1 R
cdev_init(mcbsp_cdev,&mcbsp_fops);% B$ O9 P, f4 e1 b% m9 h9 d
mcbsp_cdev->ops=&mcbsp_fops;
& ]' e$ [- j' \ mcbsp_cdev->owner=THIS_MODULE;
' N: A' H5 g# w+ A
0 r2 @* Q( b* ?, O- i' k& h if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# m$ R. w1 ]9 t0 G3 N* @
printk(KERN_ERR "register cdev fail!");
3 l: Y t: Y9 a& J; t6 n else
2 H9 C- X0 O+ B: u* S/ B, I printk(KERN_ERR "register success!\n");! U6 t3 I( f* P- h: p- Q
}
) b( F" Z6 B# v; h; `4 y3 D( a else
& J1 x# q/ ?- @7 h2 F M {2 H! a1 t3 [6 |- Q* w& Y
printk(KERN_ERR "register cdev err!");
# t2 a y, e. ?4 Y9 F T return -1;! G3 r! k6 ] T9 E8 f$ z
}; v5 z4 a) E# U7 z- J4 d" s: p+ |
' {: Z' I, p2 o' W, J& X& [ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
$ u; B$ g9 ^- i V if(IS_ERR(mcbsp_class))) J( f l& i% J
{
( g! J# W" z9 ? printk(KERN_ERR "register class err!");
8 q# O. S# H: `/ I$ \$ r: } return -1;# f' o' ]: h) w1 q( i X' o3 f( Y
}2 L C' T) e: J# W
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' C8 X4 T0 D; |' k, d2 L
% n# I6 ]9 ^) a4 i @5 k5 _1 _* q //PSC
. G# H& H! e% C7 h //add Enable MCBSP
/ u3 _+ j+ p P. D //test
. S7 s, k2 [6 `* n$ W0 N5 [& C; t temp = 0x80000003;( a2 t0 k0 |0 y, F$ H/ A! K
writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 R7 N8 b( p2 Y
temp = 0x00000003;
6 f% D# \6 g2 \3 a( h" s, v writel(temp, IO_ADDRESS(PTCMD_ADDR));9 H/ j, T, v/ d: i- B
$ d& i! c9 K P; \1 [. s7 N; [ temp = 0x001FF201;& n; y( R1 }( s% S# b
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ e% V3 |" K5 [: x. b; _. G 5 s o9 X; x I. }( `( X( S
//PINMUX ) g. M1 [- D% y% _ \
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" h) |$ T( M; ?5 s m3 }3 w& Y PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# k* p" R. U3 k) T3 y! v PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
; G0 ]# }) Q, r; b8 Z3 w5 C$ [0 W: p7 o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);/ _: A( G a& `$ |8 G+ r0 {) e
/ @5 C/ o- e$ z L, U& \ //SLEEP_EN,EPR,L138_SHK1,L138_RC
, J1 M7 }$ F) a) @ O PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& I, F+ ?% o( k$ w PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
; f- ~" w% N; ` writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 U# C( V4 u, D. h+ o
1 r0 Z8 N+ H/ ~; K Y3 Q ~
//RESETn,L138_SHK2- y1 O- c, |1 L* @
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 7 F5 o+ T9 N: J4 _+ b) b
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
+ r' U) v, l0 F8 R4 l% r) n writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# r) O( G# {: z* g; K6 {6 d/ O. a+ V9 j
7 u( E/ e$ ~7 ]& H& p/ f
, V' n" [3 M% z% r: e* z, O4 [
//SPCR Register
; @( f' d0 ^' h) q( Y //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' h% s1 ], r1 e2 @( D( k. |: j! P temp = 0x03000000;//(DLB=0); r! n& e2 ~9 w$ g e* S1 W' k
// temp = 0x03008000;//(DLB=1)
5 H _7 U2 d- c* k0 k* V writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset2 c' F1 R B% t& ^+ S4 q& A
temp = readl(IO_ADDRESS(SPCR_ADDR));
( f( n+ Q3 B. e( z) q( B0 n5 ? printk("temp=%x\n",temp);
, M/ E" J' t2 q( G( G& R
7 q5 V2 y) V! ?2 u, x3 n //PCR Register% `% e8 ]6 r0 A0 F0 i
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0& D- H% |0 V1 {* r% D
// temp = 0x00000F0F;. P6 h% p& c( N8 H. u) Z( i" N: d
temp = 0x00000B0F;
6 n& v% h1 i' |6 r) t. Q! h writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ! D6 B; S4 z5 S- ^" ?
temp = readl(IO_ADDRESS(PCR_ADDR));" `. G0 S0 N- B& x$ B+ l& s
printk("temp=%x\n",temp); k0 Z) _4 E, ^9 V4 L
//SRGR Register
; [1 ]2 o, J+ t7 ~; A/ x/ _ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ C1 K; Y6 B" H# ~. w& D
//temp = 0x301F000B;: @+ y% H+ K+ z$ E) e) M
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
3 a5 C) o; F, p: ^- \ temp = readl(IO_ADDRESS(SRGR_ADDR));
" ]+ ]) v( z q5 n n2 q printk("temp=%x\n",temp);
- |: j: t! ?$ F3 m! b& S //RCR+ w( O; n& ~, n/ p
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
% M3 T s3 z' s& M, A //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 ]' S$ p! r6 f: c+ U
temp = 0x00440040;
2 s/ p2 a' k; `4 N) I# B writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 b S' b: t1 ~& j% H+ Q
temp = readl(IO_ADDRESS(RCR_ADDR));
G3 R) V6 A8 l& l) { J, m printk("temp=%x\n",temp);! j8 _. y: l! B3 A% t1 x! D& J
//XCR
7 s$ `7 W M+ p //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: U, M8 m4 ]0 u- u' @ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! Y% {- p( ]8 \4 Q
temp = 0x00440040;/ o$ {* Q) y- S" @ q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 7 N* s4 Z$ H9 p) b; w* U1 o" u
temp = readl(IO_ADDRESS(XCR_ADDR));7 R w3 n8 b- m( ~
printk("temp=%x\n",temp);- M5 _$ S: W6 s& o; T9 B9 X
udelay(100);3 A& f4 q: Y8 _+ X5 A7 d5 M
//SPCR Register
- }) M! I' i4 x2 L8 w //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 h; B3 _5 e L7 V% ~6 I* M
temp = 0x03C10001; //DLB = 0 VS DLB = 1
; w* r7 v* Y- q& k8 q. r writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
H! d* G" h5 o H( y, Z/ R& u temp = readl(IO_ADDRESS(SPCR_ADDR));/ |: t% k/ F% k
printk("temp=%x\n",temp);! z; x5 b& T) v" T# W9 o; J$ a
udelay(100);
, i, ~7 l, Y3 H1 q: D, K. b- D4 b% O: h! @/ Y+ v
//set GPIO direction
6 m# K& {& g6 Y9 P: Y8 d2 t temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
2 O: N; f, F5 J& W temp = temp | 0x00000100;//EPR----input& U% M* y6 _ Y' v) s
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ N& b+ W$ e. x __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
, ]7 `+ K* c! i& i, w$ C+ G 5 R+ ^2 j# C: ` n9 u5 J- K( X/ m
return 0;6 X# W1 p# {9 G% f: l3 Y4 y
}
: H" ?& l' Q/ {, T0 [static void __exit MCBSP_exit(void)
2 U- X" X" X1 D$ I5 t+ r{
" Z( o3 j) m+ X3 F4 Q8 p9 q printk("mcbsp chrdev exit!\n");2 `* j y0 j# z& C" x; d
cdev_del(mcbsp_cdev);
: K G# H- @, z unregister_chrdev_region(mcbsp_dev,count);
6 Y5 g' B% n+ n& W/ ] device_destroy(mcbsp_class,mcbsp_dev);& C8 X( Y$ I) R- V- J; M
class_destroy(mcbsp_class);
3 K# W5 f2 a% H, P0 a2 \% L}
& {) X1 M5 |5 Y" B7 V. L# Bmodule_init(MCBSP_init);0 M. b7 S y! ~6 M
module_exit(MCBSP_exit);/ k. [2 I' r0 w7 [3 G
& |( H* p% x0 h* f& i
MODULE_LICENSE("GPL");
1 k" M$ K- p4 @8 a( p0 Z4 R6 p! M) k& B, V( d
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" u% y& S1 v* T% k7 t0 u$ \1 u
我的应用层的测试程序如下
3 H* ?& b+ c2 P s#include <stdio.h>$ C9 \8 ^1 R! R' h2 X+ a: W+ u7 l: t
#include <string.h>4 y+ }# H7 x+ S# {: t; \% X0 `
#include <fcntl.h>
. |$ s6 }" V" M' @4 J#include <unistd.h>
$ k8 C( k. U# v#include <signal.h>% N d( U+ J$ z) h4 G; y
#include <pthread.h> //线程' m/ W' x+ h/ @) D
#include <stdlib.h>- X" h: W& j5 E* j% s$ T T; D( ]
#include <pcap.h> //捕获网口数据* w( \9 e3 d6 \" C- ~( B4 d
#include <semaphore.h> //信号
+ i9 s/ e6 p C. [ K#include <sys/types.h> //消息对列
) w' M" L! v5 o: P#include <sys/ipc.h> //消息队列* u, c6 ?9 b+ g! n0 E$ Q( x
#include <sys/msg.h> //消息队列' V7 D1 W: P& u
#include <sys/select.h>
! F2 A* c0 D6 @- b% O#include <sys/syscall.h>
' X ]5 c% T8 ?#include <sys/stat.h>
& Q' |0 `" t, U. [1 b#include <sys/mman.h>
# U# a! S H; i' i: M% _#define msleep(x) usleep(1000*x)
7 ?9 Z) f$ I; @ U- K" Q: z4 H
+ E! W% a$ i$ ?. t/ \9 B2 xint main()
\0 t4 u4 D. @{
% [6 c, a$ m" |3 C1 M; r- | //MCBSP,ARM与AMBE2000交互设备4 f$ C+ u# C( H# I8 ]- P
int fd;. r& j% E; s. |1 [* L/ Y# l4 w
unsigned short data_write = 0x5555;# p* Y6 @4 {4 Y( Y( U6 c t, i- z
unsigned short data_read = 0x00;9 R# B/ R) k2 ?
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 \2 |9 s9 L* ^, b& [
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* L3 ?/ {9 Z0 o 4 h" T) ^" T- C% L
if(fd < 0)* k4 n) X7 `; M/ q& R; o0 Z$ i9 w8 e
{7 V1 ~/ ]9 l: ^ w ~
perror("open failed\n");8 S& a6 D* Z: [( H6 z1 x
return -1;
. m/ z& `3 T3 g$ _, N/ t7 M1 W }# ^3 a) i, ^9 G- U- D; Q
$ k! N; _7 e" H( O
while(1)
2 j1 }$ n. Q3 ^& p$ X: U {
- J) X0 R. W# d! E) t) |+ ~. M
% u9 d8 u3 Q# j( W o( I //AMBE2000每次读写是24个字为一帧! _6 n- `/ Q* Q8 S: d
//写数据时将数据在底层存储起来,等到中断的时候再发送
: H! k) l" z, @: q6 A H# r) S //AMBE2000输入数据是以0x13EC开头的+ _, P. ?; e9 x0 g, w
write(fd,&data_write,sizeof(unsigned short));1 w9 R! K+ z5 x7 ?* e
9 y+ z7 Y* M% o* l/ j
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 - k8 x; I+ e; U
read(fd,&data_read,sizeof(unsigned short));
% R) y- a* f D* [; ~ 5 C+ C7 |8 l0 _% t) \" L' y
if(data_read == 0x13Ec)
; t4 X( v4 ~% c, m- j$ p& a {, p" y( D$ l; Y9 B" d( N, k3 o
2 {. L% O, t) l0 \! L5 J, q printf("data_read = %x\n",data_read);2 J6 S& W" i! g/ a
}
' x* |$ P; H: t# X `# ~
4 w, L* s) X: e msleep(10);
4 {7 u! I6 _- k* u; w * J2 c4 i! w2 d1 `( B% A
/*
4 U q1 ~8 O9 V. T( b2 i q9 y ioctl(fd,1);
/ Y, L+ Z+ Y8 v) y+ O* c Q: ` B sleep(1);
- k: q" S" m( Q4 X ioctl(fd,0);1 ?$ w% L5 | d0 T1 l
sleep(1);
7 f4 Q5 q2 b: _ */
: Y9 s! ]5 y# L! g- ~ } , o0 c: L2 u! F
return 0;
# u5 a9 @' l, { % N w8 y1 G/ j3 h/ O
}& C+ C6 ^. }. W) o+ Z
: q& k0 T9 e- j. f! v1 M6 }# H6 O5 C
多谢各位指教,谢谢! 急4 k; `0 [9 X: W6 Y* T9 b" v3 j8 I
( U, X" a, H& n8 [( I8 y
, ]% h% L2 @* O3 U6 U3 D1 v* S2 i; W3 b" k' k) a
! o9 j5 S) `4 U$ q2 e' p' W
3 g, q; b( S' w1 v |
|