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