|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 E N- K7 l* ^0 z/*
9 Z! V" d- P2 _ * Copyright (C) 2009 Texas Instruments Inc
4 i" H% @# Y& {$ z' |, m* Z$ n *
. P+ Y, }3 i6 k% v5 j; L * This program is free software; you can redistribute it and/or modify! [4 H5 a* J* f/ ]
* it under the terms of the GNU General Public License as published by2 l& S$ T5 E: g! B1 n( n5 X
* the Free Software Foundation; either version 2 of the License, or
! U4 m0 v {% ]& [6 ] B * (at your option)any later version.
0 h# d8 k5 i% m, i *
- J: N% m1 c% W- K" v2 @ H! o * This program is distributed in the hope that it will be useful,0 @" G% d6 B, r0 e* O5 H
* but WITHOUT ANY WARRANTY; without even the implied warranty of0 I ?/ @ w5 X T y/ L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& w9 _1 P$ W$ u! D* T1 H0 M
* GNU General Public License for more details.
, `; ^4 h: L* p3 C0 ^. { *& q/ [: \& m! [9 Z$ }4 I
* You should have received a copy of the GNU General Public License
; M: ^3 X" K2 \+ b4 | * along with this program; if not, write to the Free Software
# o2 i* ]) w; c& C1 M4 \ * Foundati4 I9 B8 w( W! o% [9 D
*/
# H4 p% {! g. {3 F$ e9 S#include <linux/module.h>' i% E# x6 y* Z5 P+ r
#include <linux/init.h>+ L) K% O3 ~3 h8 k1 X
#include <linux/errno.h>
% G" h* B. T6 j, K, M! n! Y; ~#include <linux/types.h>3 @+ {* C- } z( ~1 c6 D" f8 j
#include <linux/interrupt.h>
+ ~: E: Y; e; P# e$ z& r) D#include <linux/io.h>- L% E# h/ f. o. F( h2 ~5 I
#include <linux/sysctl.h>
5 g, I: s' n6 V9 j$ w0 E#include <linux/mm.h>9 w) A7 e8 H' N
#include <linux/delay.h>; u2 ^# q! x6 P V% A
#include<linux/kernel.h>
: ~+ x e' ]5 G#include<linux/fs.h>
0 ~1 \ h& U( L8 u* _- i#include<linux/ioctl.h>
% |. V* S$ F$ @) e" J#include<linux/cdev.h>/ p) E, \- r2 L j0 v: \
#include<linux/kdev_t.h>
* v& @9 Q( u% u7 Q! E#include<linux/gpio.h>
+ g7 @; z9 ^ H* s#include <mach/hardware.h>+ S# H' z$ k0 ]+ B) r) A
#include <mach/irqs.h>' E4 @7 L, c# I
2 t" M k2 E. z0 O1 d7 |#include <asm/mach-types.h>$ G R! x# W2 x" a; a: X
#include <asm/mach/arch.h>
9 y5 X d S1 S, K8 z3 b#include <mach/da8xx.h>% I/ }: k0 l& V' f6 U
#define SYSCFG_BASE 0x01c14000
' e3 B2 W% f/ F$ {. ]6 P3 p) B#define PINMUX1_OFFSET 0x124 0 H: `& @) v4 j( i% W
#define PINMUX18_OFFSET 0x168
' s+ Q. e4 S& t0 \( k$ |. }#define PINMUX19_OFFSET 0x16c
& G. n: P1 B9 V" q3 ?#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR; K$ S1 a- ~" U6 w
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! A" P9 E0 s+ i; l( D6 T
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 w6 a, n7 u0 [
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% f* C( [' D) g" E5 b#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
$ @2 Y; x# o5 X$ ^2 m ! g0 }" i* [; V$ g8 a/ }2 n
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR" b9 O3 ~* r1 ?. c2 T
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
, L3 x: I5 T3 V$ b; S5 ^# J+ X//PSC
4 C( y& t2 p- j* z) R#define PTCMD_ADDR 0x01E27120 - j: L A- Y7 W* S* m8 O
#define MDCTL15_ADDR 0x01E27A3C. l- F1 F1 J9 y7 I0 I" g
#define PDCTL1_ADDR 0x01E27304. I: M; J. o5 Y- K* d& r8 L* I' ?
//GPIO8 direction7 W/ |! n$ m# @# i" [, `
#define GPIO8_DIRECT 0x01E260B0
0 N+ v1 r9 W X. B0 u- j( {) l( f0 T% U#define GPIO8_OUT 0x01E260B4) i ^7 M% I5 ]% o* K7 H
#define GPIO8_IN 0x01E260C0
1 A! P+ b7 M+ W1 z8 C! w
* d" K) B+ `% y" `! t, J% K$ P//#define MCBSP1_RINT 99 9 x6 Z2 a- Z3 J" K; p( g
//#define MCBSP1_XINT 100
, f- O" N6 |9 x+ x& hstatic int MCBSP_MAJOR=239;
X' X: o( t$ j6 e6 ~8 _static int MCBSP_MINOR=0;
5 C7 _0 g; @1 e4 _8 b% j6 zstatic int count =1;3 \$ k# V8 B" O) [- e( ]
: |/ h6 R* y( z% T( ^9 m4 v#define MCBSP_NAME "MCBSP-device"# [: b$ p6 l! g! {: ^
, @" f6 M: a* ?6 z/ k2 j7 _$ S2 ystatic struct cdev *mcbsp_cdev; _( j5 a& b- f6 _' j
static struct class *mcbsp_class;
5 u n) e. {! D; wstatic dev_t mcbsp_dev;
- B7 l R' c) Qunsigned int DRR_data;. I* g1 _& ^! n: C
unsigned int DXR_data;
) N4 a4 A/ T4 gstatic int mcbsp_open(struct inode *inode,struct file *file)3 s1 w7 {8 u0 o5 J1 Y, E7 I% N
{2 D% H0 `; U7 P% \: R
/ {6 e1 c* @6 {' M" N% o. M: R //interrupt enable,initialized( s! E5 _( C1 x1 o* r2 a
unsigned int temp;: r6 ]4 [8 X3 U: S" b6 U: f
//SLEEP_EN(GPIO8[10])---0
" v- g2 U" P1 K$ G* g1 ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 h& w6 `' ^9 {# } temp=temp&(~0x00000400);
}/ P" e0 n1 j1 h# N __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: p) [0 Q0 q$ e1 A //RESETn(GPIO8[8])----0----1
0 t) K h. t) \7 o) |" V# W7 h: N temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( {. `: k3 j9 b. `: k) U8 C
temp=temp&(~0x00000100);" O' J/ I$ s) f# h9 {3 p' t$ P/ K9 c7 N
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
z8 S6 [# `) _: i udelay(100);
0 _( o! Y+ }' f% S( V4 P temp=temp| 0x00000100;
0 g" l" u# G/ N, ~/ H3 o; f/ A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& }) X% ?7 w+ }
udelay(100);. x" J: u5 V6 r& f @. \! { [) d
printk("open success!\n");
0 j4 ^+ u. v' n- Y1 r# ~ return 0;
. s% J$ B. y7 i: z% S}0 c' ]+ X8 l; U; s9 u2 z% w, w3 |
$ h! I' ?( V( J# P( J# A
static int mcbsp_release(struct inode *inode,struct file *file)
# |. X. \# O$ t$ z8 W7 Q( N{
) K" b% R5 K7 t; O3 s: c printk("release success!\n");: C4 b; r9 f |2 a6 k0 p+ o
return 0;! @: u |6 ?" Y! ^/ H) ^( q
}0 O# w& C: i0 x% N6 J
" F* m3 [5 \' p) b) w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
6 V. _6 Z. F `6 L7 U{
! L- G' w" }' F( x) v" n/ [" J copy_from_user(&DXR_data,buf,len);* @( A0 a# h! j6 e8 V Q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 9 R& q: p+ {# _
return 0;
. ]3 I1 [7 @( } % t- ^7 |1 {, f6 i- t- Q2 X
}, G; E* c" I5 }4 \) h9 \: A! H( }3 A
9 b; X3 M% l2 T+ Z1 G _/ m/ j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) A0 G# b! _ z5 y( c0 {
{ : X) L: H- I* l
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, d0 H6 x: e. ]0 O7 n
copy_to_user(buf,&DRR_data,len); # J& W0 I5 j4 u6 B) v) t
return 0;( n1 e. r6 N6 ?- Y1 R) u% ?
}/ {/ [- y3 t; L' Z% q
% I6 S4 c* j5 I L; C3 x7 i: u9 E/ ]( R9 N G
static struct file_operations mcbsp_fops=# i5 a7 A: W0 x# ]
{
/ |, k+ u ^: O8 u( ] .owner=THIS_MODULE,
2 l( @/ ?4 L2 r) b& `7 i .open=mcbsp_open,
9 B* ?! o& g. @2 U& \ .release=mcbsp_release,
8 N: T6 f9 U: Z. g+ Z .write=mcbsp_write,
/ D; t) j+ r; E' N# w .read=mcbsp_read,
* B; C/ A1 d0 V, f};, b* X4 i6 V2 S/ h
static int __init MCBSP_init(void)% q' Q. b# O( i9 y5 E$ H5 `
{
) G, G- D# x# ]0 |' t- w6 b7 y int ret;4 u: R, s& ]; L8 ?. J, }) U
unsigned int PINMUX1_REG_old;
6 l) E2 p7 n! A2 a3 I6 D; h7 ? unsigned int PINMUX18_REG_old;
$ n) ?/ {2 | T- w8 \ unsigned int PINMUX19_REG_old;
! ?0 w- @6 _ M: o Z- N* Q W unsigned int temp; 9 Z; k6 M' ~6 w, j
if(MCBSP_MAJOR)
3 D) m- x' b7 H( s, s2 H" X {
9 R( W$ V! O' w! {9 ^ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 L" }; ]- q# T( r4 o/ f ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ x; w$ \" o7 }5 I9 ~0 a/ u }9 ^5 [* ]$ I" ~, X4 p, _
else7 ?# T2 `/ x+ q% `7 x9 X% d+ ~$ o6 o% K2 t
{: n+ F; C: e# L
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
: I' F6 C3 \. j4 E! O5 C MCBSP_MAJOR=MAJOR(mcbsp_dev);/ {7 b- v# `: C! A- Q
}7 H8 z. C% h2 S" O5 h/ z
4 B1 y% ]1 X( k% z4 |
if(ret<0)
. z$ c* D* F7 a" S7 h2 w& V {& U( p3 s6 J- B, z3 p; ]2 r
printk(KERN_ERR "register chrdev fail!");
% W) p# _) A, P, e3 G6 e+ x0 x return -1;
1 q9 ^) v( L. V# g3 W5 p) `6 T* t }
2 S, N+ o' p! b5 y/ b, A* G 2 B0 F9 c5 w& W! U/ L* V9 X
mcbsp_cdev=cdev_alloc();
) ?* l. l' w t1 F% w! g+ @9 e& ]
6 x, ?/ j( Y- e7 z3 d if(mcbsp_cdev!=NULL)0 {- A: j8 n1 O- R6 ^3 g; L" V6 m7 |
{
* U+ L4 i- w8 _7 F. {% ^0 [ cdev_init(mcbsp_cdev,&mcbsp_fops);$ l0 k+ A: ~* e' x
mcbsp_cdev->ops=&mcbsp_fops;
; ]/ s1 D5 w6 j9 p5 z* B( ` mcbsp_cdev->owner=THIS_MODULE;* D5 T8 O y2 `& @/ e6 h
, Q' {6 R9 v$ u$ R" W
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( p; ?& k3 `- ^' h printk(KERN_ERR "register cdev fail!");& o3 g) ^# K+ y/ t6 _
else
- Y$ c8 _! u/ T1 B printk(KERN_ERR "register success!\n");8 u# _/ ^% N9 V
}
2 l3 J2 `, k" P5 p- I, a, p& ^7 L else
3 {* ?- i. }" n! U' M3 T! F$ i {% M+ f! P* @& B* `4 n
printk(KERN_ERR "register cdev err!");8 b) H- Z" l: J. s8 x7 s
return -1;
! a8 V- n5 S3 f' f3 q } H/ S0 c2 H- V0 @1 {# C! B9 b
7 S+ {& u1 v3 M* l% K! r) \ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* h" K. p% J2 i% E5 _
if(IS_ERR(mcbsp_class))
/ a. J1 v* N/ D6 G7 ? {! ~3 e& a6 g! @2 a3 J5 k4 @. t
printk(KERN_ERR "register class err!");8 A. U! O& F7 }- T; b. F
return -1;
* O0 `) b; G, ?: O6 j) p }
b4 B& z/ N# H# L; k device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; ~/ C7 n' m" N; G1 A
) t1 x- N# Q1 a2 [+ f
//PSC
8 {9 V, D ~0 z- w* e //add Enable MCBSP/ g% }7 a2 O1 n# s8 q/ G* A
//test
1 v: v9 b' n5 b* ?# R* @, _# H* } temp = 0x80000003;
( R! B8 Y# L. g& q; @2 e& p writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% f% W3 S$ m: F- W& i' G3 a temp = 0x00000003; Q5 d1 o W" O. q
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 j7 i' k. r% f' u' }+ Q7 k4 D# G
) u, t' O' D7 i }# @$ D" s0 I( T temp = 0x001FF201;: M% m u9 M. Y# J9 W
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: \3 e( i1 B" P& ~& C$ `+ L" P 5 R0 o+ {, F7 o" f9 i
//PINMUX
6 H/ z) g( G, g0 J) l& O //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& f$ j) p3 K2 z$ V' Y2 w, S) d
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); / Q. {! }/ b5 ?; x3 w' R8 o7 a; k& }
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
2 r( [5 e6 C* g writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# w: I5 Q ~$ L
S- X* g6 x+ f/ x* ?1 |
//SLEEP_EN,EPR,L138_SHK1,L138_RC: M/ Z$ `. d/ ^. _+ ~: w$ E
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ( t4 \) q" n- |( E5 p
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 0 U! G- e% `; P1 w2 D) Z
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* n `6 C$ K0 N! [- p
3 q4 R6 o# W0 H+ U$ g4 k9 m( J5 y //RESETn,L138_SHK2
, s: [4 k" z, X7 X PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : ]7 b/ J* D$ b5 ?0 L
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 5 \# i2 O2 a! n) G* Q) ~9 P8 @
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 o9 X+ S1 N" Q 3 e9 a& \4 h+ M' F
3 q4 c8 B& V- _ K$ D* |6 g& u+ J //SPCR Register
& v3 s& S6 X# Z' D; g$ ] //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 ~1 P! R6 E7 B4 U) m& x" u% X$ \ temp = 0x03000000;//(DLB=0)
7 N! E0 e( }: h7 A8 b2 M // temp = 0x03008000;//(DLB=1)# ?- @+ ]& B9 w8 F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
T7 m Y! Q7 B3 `9 @3 t# x; L temp = readl(IO_ADDRESS(SPCR_ADDR));. o5 I) k7 ?1 Y0 N8 a+ L" R
printk("temp=%x\n",temp);. ~5 G' G5 A) t& Y/ e& S
3 m$ ?. h0 C) o
//PCR Register- M) e4 z. o, |/ x
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% z6 K* v' t4 I7 T! P, M // temp = 0x00000F0F;* N# _4 I) y3 e' B8 t* x9 `
temp = 0x00000B0F;8 X) _6 }7 `( V. z% E
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " o% o# Y7 ^5 D" m d
temp = readl(IO_ADDRESS(PCR_ADDR));
. \9 D( Y: y% F- F8 s( T' J6 ? printk("temp=%x\n",temp); ( A6 d1 T Y+ p5 t& o8 X" J
//SRGR Register$ c; Y! U; X+ h" D$ |" I7 o6 R
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* ?, R, c- f s; k
//temp = 0x301F000B;/ Q8 E+ R% T6 ^1 d% b2 i
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
! Z& ~) j6 b1 R+ W temp = readl(IO_ADDRESS(SRGR_ADDR));+ S6 u: {- S) I7 Q1 W
printk("temp=%x\n",temp);
# Z% w& B7 [* a# k& V6 G //RCR) X4 \- A- y; @ ]" i
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. g G3 @/ c- p8 R) M, l6 F
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 N8 _" K2 d! I; j- e) M temp = 0x00440040;
+ X) O, ^4 C. ~- @5 p writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
4 y/ g3 {$ X, h2 N- E temp = readl(IO_ADDRESS(RCR_ADDR));
5 Z- A& o; {7 A printk("temp=%x\n",temp);
2 E: k0 E3 `' W( E. w. E //XCR' b: D% b: x* ~+ |4 g! @/ s
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 D% y, m: g, `5 p) q //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) z- b. {3 j3 {1 {3 r
temp = 0x00440040;
s7 ~, n7 [: O5 V% i9 Q- [# } writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized + n6 I: z" l8 e' s+ @5 V& J
temp = readl(IO_ADDRESS(XCR_ADDR));: O1 T1 o7 r; N7 n* [# @
printk("temp=%x\n",temp);$ W# e, }: K2 ]( v- w
udelay(100);
* m$ K% `4 u7 ?) W( Y //SPCR Register
7 q, \* A" b4 f# x$ @- f" z //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! u; f- k0 t* J6 |
temp = 0x03C10001; //DLB = 0 VS DLB = 1( ] ?. G/ p: c2 z! `
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled& z) N" @' ]! V+ f X$ S
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 b, i/ M8 Y9 p* h4 t( L printk("temp=%x\n",temp);
2 P! J% t7 k; Z. O' O, X udelay(100);; @6 m" I" n2 _5 x6 H9 {
# D3 W4 O% C% {. X! {/ y+ Q: y$ \3 b- l
//set GPIO direction' w1 z* y r ^ @. L. u
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ b0 Q( g. X& z P# R temp = temp | 0x00000100;//EPR----input
$ F2 Y& j6 I Q6 ]; [ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ R V8 c% W8 {3 J: X __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 W2 |: ]5 X$ ~% r ' \$ R* x' X. z, l i( Z
return 0;
2 ~% ?6 o& p6 P) s1 w+ H}
0 \8 ^( F' f; K2 Vstatic void __exit MCBSP_exit(void)
6 {' F8 S V* z- m5 d5 F; W{* S: x2 Y3 K4 x( E) H7 u
printk("mcbsp chrdev exit!\n");4 u- o: m' F; Z8 c" z" x% c, Z
cdev_del(mcbsp_cdev);
' u% v) p) f5 N2 D# w5 J unregister_chrdev_region(mcbsp_dev,count);, J& ~. r# e3 N) W: Z- ?$ C2 ?
device_destroy(mcbsp_class,mcbsp_dev);
6 T) q9 B; Z1 K# W8 T& A. Y class_destroy(mcbsp_class);+ A& s) r( h& W
}
* V" v( O: }' T' j3 o' f* J7 Lmodule_init(MCBSP_init);
# o8 M, T$ @9 d+ ?module_exit(MCBSP_exit);
0 u& Q% o; M4 l, Z. _: f) f) ~. z2 A; `% x* Z: k8 o
MODULE_LICENSE("GPL");) f: \* p9 O, U: ]
6 ]( d: [3 }) e我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- m; A, M; d" c' n/ |7 ^我的应用层的测试程序如下8 g. `! t' B, ?7 _' N
#include <stdio.h>" `+ d! l5 V7 y! d+ c6 @
#include <string.h>
' h ^( L4 r; A7 q5 s' x, ]#include <fcntl.h>- N8 T) K6 \ k
#include <unistd.h>
$ b& l7 u* ?1 H/ }3 b( a7 B0 A#include <signal.h>
6 r# c) I& J6 T$ |5 C#include <pthread.h> //线程8 o( W' F4 f6 {1 S, p" ?
#include <stdlib.h>4 s2 I) n0 N& D& d9 R
#include <pcap.h> //捕获网口数据
; } E% q7 }, w, T& z* Q, V#include <semaphore.h> //信号$ U# K( N) I& a' u9 y! B7 Q/ @
#include <sys/types.h> //消息对列
: J) K, M0 H& v, M6 p#include <sys/ipc.h> //消息队列& X, z, q! n, Q7 }
#include <sys/msg.h> //消息队列
6 H M5 M2 |8 c) A4 Q#include <sys/select.h>
! t; ?. X$ z7 h) U) y! D) {#include <sys/syscall.h>
' b( Q1 o. [# e% W, b#include <sys/stat.h>
' E G* W N% q+ p! S#include <sys/mman.h>
- m0 e) K" y3 Y7 ~+ F#define msleep(x) usleep(1000*x)
+ @7 Z9 ]/ z8 J" r* Y$ U/ m( Y6 a# s
int main()
. R6 i% l6 X/ D5 Y- A) v{
" A* V/ ?% J$ `$ t; L; I //MCBSP,ARM与AMBE2000交互设备- [) i, u, [$ w# W# \) v, Q
int fd;2 O! ?5 N3 b* G R8 E" {2 |; w
unsigned short data_write = 0x5555;
9 K7 J; Z. G9 ~9 I" m unsigned short data_read = 0x00;
8 I( N: z, V" x4 D- ]. n3 L' E0 V fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. l) T0 B) K9 G1 W // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ W4 r! \+ U l7 O- e/ `
' c8 [2 s& L' B. R, ]. q6 \& f9 X if(fd < 0)' M( W; @3 ~2 j- t
{
5 q7 {: S& C* o7 i$ {2 P) Y perror("open failed\n");
" y1 G# s3 h1 Y7 Y \% \" W return -1;: \& e0 @; d1 d7 U9 R
}
% ~) \9 L1 L" Y2 _ 1 q- L* l9 R, n% ^4 ] F+ i9 t, x
while(1)/ b; e7 \- z8 R! ~/ ]& A
{
0 }" j5 {) [1 F2 t2 m7 j & q9 h# y3 ^: x! l* ^' ?
//AMBE2000每次读写是24个字为一帧, W4 k3 H& L6 \. @
//写数据时将数据在底层存储起来,等到中断的时候再发送2 d$ ^; h) m8 G
//AMBE2000输入数据是以0x13EC开头的! j: d9 q' I; P0 U# X# o
write(fd,&data_write,sizeof(unsigned short));8 t, a- ]' x$ G* |* f& z* c7 h! W
8 k- r: w+ s3 @/ k8 V //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 & J3 T0 |+ B: j( F6 w$ O" E
read(fd,&data_read,sizeof(unsigned short));- p. C t6 P" o. I, P( p% z
+ c$ Q$ |# `; M" V7 [$ \+ B7 a3 q
if(data_read == 0x13Ec), Z: p+ k. G8 b) ]. C
{$ x* q4 s& I! W
5 R$ U! }% j6 }7 E
printf("data_read = %x\n",data_read);
) o# N G6 F M7 N' y* S, C0 N }2 h N% r9 \3 S3 E+ `! b# n7 D' O
* M. E9 v S2 O3 _2 p msleep(10);
; C1 a0 b2 ]* v* Q A% m# z5 u" Y
- Q/ e( N7 O6 _9 C /*
# |( L; p- U2 j c1 b9 Q ioctl(fd,1);
8 |, t- o% S3 |8 P8 P# @ sleep(1);1 m) U/ r6 a' U l( v$ n
ioctl(fd,0);3 m& B4 e2 v! H$ r
sleep(1);
: K( A5 Z+ A* J: s */ + Y, `4 ?# F/ w4 f( f6 `
}
) ?! y* R9 ?" R" l return 0;
' N% F2 B1 D3 g! ^4 l) n
# Q, v R7 D3 D8 ]% v}
4 P. S- p! @/ D
- j1 [0 x0 A( {! z+ r: i/ L9 m多谢各位指教,谢谢! 急* B/ H* m- T4 i. u- s. S
3 ]( B4 i+ l) T& U# a# o6 Z$ X
% T' I' J) L1 {4 _: E3 @* A5 Z& ^6 M7 W' B( u# J
* Y( c" r4 f# y; x# }3 [7 |
# I: [( s7 _! J% X h9 v6 V# T! B" @
|
|