|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 E4 T) B g& Q. [6 V4 j/*
" P1 q+ R! T0 O' a- N. p/ S * Copyright (C) 2009 Texas Instruments Inc* x5 m- e2 K. p' f
*( p+ T: l7 e: B8 {
* This program is free software; you can redistribute it and/or modify$ O9 a( \! u" d, a. Q3 e) H1 \
* it under the terms of the GNU General Public License as published by
- w3 E! j& d7 T `0 \1 X * the Free Software Foundation; either version 2 of the License, or
% K; R& M6 e- H$ I: y$ h$ i8 r * (at your option)any later version." A: \! \. b* d2 \8 S! O/ v7 _
*# o' r' U4 l; b; x
* This program is distributed in the hope that it will be useful,$ ~: g+ y ]% E3 t# B" a
* but WITHOUT ANY WARRANTY; without even the implied warranty of
6 b% P2 f5 c6 @ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 q9 Z( h. P5 d" ]* O) w3 ~& B o V * GNU General Public License for more details.0 C0 w1 h: b) K1 H% t( S
* C/ K! [; d, S/ Z1 _7 u' e
* You should have received a copy of the GNU General Public License
; c' J& s7 _4 d# I7 k) g4 v * along with this program; if not, write to the Free Software4 _: |8 L4 E/ M3 g" T- G6 n; _
* Foundati
2 i9 @+ Y/ n# v; W2 k/ f; Z1 [*/
2 T+ O0 ~5 U* l+ j#include <linux/module.h>7 y3 V" u8 l7 x G
#include <linux/init.h>9 }8 f' }" b0 B: c; c5 f& m# {' @
#include <linux/errno.h>; Z8 P; t! @. o9 @1 ?! P
#include <linux/types.h>
6 T: D. T4 c1 [; i, y7 H$ l#include <linux/interrupt.h>
4 g2 i4 ~7 J8 l2 f#include <linux/io.h>
/ Z( c" h, x3 w1 v#include <linux/sysctl.h> X( I3 r. g- v
#include <linux/mm.h>4 p: A4 l& `4 N2 s5 I3 _9 H
#include <linux/delay.h>
) L; `' P! o v2 [) S4 r2 Y#include<linux/kernel.h>
6 O: k6 B; }( R- ?#include<linux/fs.h>% [0 \8 j! B6 }9 c+ b5 K
#include<linux/ioctl.h>: K; e% ?# S7 q7 j# B6 k
#include<linux/cdev.h>
* E/ Z# m2 l z% T) k3 U#include<linux/kdev_t.h>
0 }0 P; a) I% h% o! y4 {+ n5 V3 D- o#include<linux/gpio.h>' ]) [; w3 g3 b# t4 t4 x
#include <mach/hardware.h>
; p+ Z7 i: e) ]% F3 X f& T#include <mach/irqs.h>
7 q# \) a: d- _4 }/ {
. W+ a% k$ O* i$ W$ T% e* L#include <asm/mach-types.h>6 Z- Z( f8 k+ t+ C
#include <asm/mach/arch.h>
]. n9 w |* p' |$ F B/ n/ \5 e#include <mach/da8xx.h>
0 z' ]. w3 A1 z' v0 Q0 S7 ]#define SYSCFG_BASE 0x01c14000
9 r: n3 n7 ?5 j3 j2 `4 \, } E#define PINMUX1_OFFSET 0x124
$ m3 q$ b, i a6 q3 f#define PINMUX18_OFFSET 0x168
5 x$ }2 J- [* R& j- R; {% I6 c* a! V#define PINMUX19_OFFSET 0x16c
9 w6 U, m5 ?0 j9 o8 u1 R2 v#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR+ K9 ]; z: J2 Y
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
0 u+ O* f9 G% j3 p4 h#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
6 m. @* R5 g% t0 M2 J# k#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR5 i4 j9 n [( X0 |3 t
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
" c* A1 z- f4 o5 {9 k4 A' E) Q ( F% ]" U/ h3 U: F) M
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# P9 V' z2 l# f
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 G( @* M. Y' X: V) F3 |, F//PSC
" G: p, `! ^' k8 _6 O#define PTCMD_ADDR 0x01E27120
$ k, d) y" k1 s h" y3 Q#define MDCTL15_ADDR 0x01E27A3C
# V" ~) v" f. [ a7 p2 A/ y% W3 v#define PDCTL1_ADDR 0x01E273044 W7 w8 t, O5 G$ z& j+ g9 R- A
//GPIO8 direction
* a2 j0 n, B& ?+ K#define GPIO8_DIRECT 0x01E260B0
& n# d$ M: w8 r% V" J#define GPIO8_OUT 0x01E260B4) ^ Y# D9 k1 ^# B) Y
#define GPIO8_IN 0x01E260C0' q( F' r/ W0 p; R$ i
; x$ I6 D) R( E9 Q! l: y& I//#define MCBSP1_RINT 99 9 J3 Q( x, B1 [& R. ?- s
//#define MCBSP1_XINT 100 9 v% G8 i: r, K; i
static int MCBSP_MAJOR=239;0 I" ] l# Q r6 P; k* V( Y; B- l' e
static int MCBSP_MINOR=0;! c; a6 [) q" A& V$ Y
static int count =1;$ L7 B# X' o- n! S: ]& J1 Y, `
$ W; H6 b! v5 r2 B, U! K#define MCBSP_NAME "MCBSP-device"
3 Q/ _0 P; v8 u+ U& w3 m5 z! k$ G' |/ q" Y1 F
static struct cdev *mcbsp_cdev;4 j8 [7 t2 j/ Q* M. r! V$ l
static struct class *mcbsp_class;
" N e' d/ @' q0 N7 Kstatic dev_t mcbsp_dev;5 w% w6 [3 T' p+ Y4 P, z- ]
unsigned int DRR_data;+ c& B. h5 e) V9 h) s* Q* D7 |1 l9 _
unsigned int DXR_data;/ _6 R3 g/ B% }5 M, g7 I
static int mcbsp_open(struct inode *inode,struct file *file)
4 F7 c3 K5 H h9 H" {& ?# j{
3 H1 q3 @( d* Q( Y5 Q5 K
5 |: ], s! s. K/ ?+ e //interrupt enable,initialized
$ C. h7 ~9 r/ A! w" S: J unsigned int temp; ]4 E* w4 u) U+ L, W. B
//SLEEP_EN(GPIO8[10])---0/ G, Q# l1 P0 m0 w! f
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( S$ Z7 L0 O' u! K+ r' }% ] temp=temp&(~0x00000400);; ^. T; j6 b* r8 o7 D2 B* e9 Y, M S
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
) c8 B4 c; F. Y& n# `5 S2 `5 g //RESETn(GPIO8[8])----0----1
0 U+ U" n* \# F( u# T7 j8 v temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) `5 b) M8 ] y temp=temp&(~0x00000100);& I, \+ j" s1 F3 @
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ V# F' \1 Y3 f! C! a9 C udelay(100);
) l- e: r! x4 I( m temp=temp| 0x00000100;2 ]0 M) F1 p0 o7 D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 e, K7 t/ P' \) p5 b; v5 D
udelay(100);
9 O" R* Y" ]4 T printk("open success!\n");! X" }3 s: s1 b. B( F; S; g
return 0;
. F# |& A0 B% b) C) o6 x}+ F. T' v8 d( T D5 ^. Z8 K
: g, y* p9 W: a) s; p
static int mcbsp_release(struct inode *inode,struct file *file)
, T( q' m" a6 m& L1 a5 y{7 T; Z0 M8 g6 B$ g2 ~9 v
printk("release success!\n");
/ I, u4 ]9 C) \* a9 |4 i return 0;
: [' D: j. H% f" a# `* _}
, U P. D; t! o# T; |; ~" k5 z! k+ s, P8 U. ~8 K h. U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 h* I2 i6 ~6 v7 ^
{. H: a3 c, J- d
copy_from_user(&DXR_data,buf,len);
" G2 ]8 T& g! v4 N3 k iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 Y& |' j& C e2 {8 S! } return 0;
M1 F1 w7 I9 T4 o8 V! j) X' C 8 u5 q8 ^& F! o V3 w$ c4 n H
}1 s/ [$ `9 [, W1 \6 r% F0 S$ C* ?
0 E) [3 l% I, N+ R4 q3 P2 y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* V/ \; n$ A+ ^- d4 W/ D. V" ]. {' V{ ' c% d% Z" [# T' @. z7 Q$ \% E
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 U0 A; E; q- X1 s
copy_to_user(buf,&DRR_data,len); , O7 M; d9 S2 M6 z9 l* ]
return 0;' e/ Y' D( l# Z6 B3 G% W; z
}# i" @# t' e! E, \ c9 m. o( C
- P' L z& S0 Z( j' b/ x+ v
+ N. o, H: J2 k; x& @( U4 s
static struct file_operations mcbsp_fops=0 Z" u. | i* Z6 d1 O
{
. j- {1 [8 G; [( h; \1 X/ b .owner=THIS_MODULE,
5 |! } @# l3 o7 P0 m .open=mcbsp_open,
6 f6 P8 F- H3 f7 M' C6 _" L% n% e' P .release=mcbsp_release,
2 x" l+ S5 t8 Z3 W% @& o f) Z .write=mcbsp_write,
" O/ ~. t1 I- q$ u7 V .read=mcbsp_read,
: Q; M, A$ @5 ~' P" U};
) W- O3 X9 b/ m! ]static int __init MCBSP_init(void): } \' |# B( N1 ^; J# t
{" U" m; @$ H0 ~! }2 f4 w8 V
int ret;" i8 }: r7 K- g
unsigned int PINMUX1_REG_old;
6 K& U6 J0 N. A/ j) l9 `7 m$ h unsigned int PINMUX18_REG_old;, U1 k4 [: f4 M* ~4 b
unsigned int PINMUX19_REG_old;
" q# M1 G+ {+ O6 p# S( c unsigned int temp;
: v) f6 d5 H, n6 H if(MCBSP_MAJOR)
* ]6 ~6 H2 j* u- _ {
# k7 g1 d) q1 \7 ~+ t: ]% Q mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; f6 r/ h; h$ O' h7 j ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- o, S6 ^$ Y: [/ s
}
& J& t. z% j1 c, e4 u6 N else; K6 b% P( H4 K; k
{2 o! M" V" u- s& b, L3 M
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 m: Y, c# C' V* Z
MCBSP_MAJOR=MAJOR(mcbsp_dev);' i; o5 c* }+ d+ {, y/ h) }
}/ K5 U" \) J W: Z8 v
) [8 \3 J' O5 l$ @ if(ret<0)
; g" P1 E9 Q6 l V {
. U6 T. ^! r+ G* u3 e8 b printk(KERN_ERR "register chrdev fail!");& y# a4 A7 X9 d+ o% @) c7 k
return -1;- W5 S; v+ y( ~% l1 H% a( J' v
}4 n: b8 u3 y# P) J% R
" z5 s8 E1 O# p& r mcbsp_cdev=cdev_alloc();2 \" c# S* v6 V3 G, F) L9 m
( G+ j& ]& ~) r* A- Y2 ^; d4 l if(mcbsp_cdev!=NULL)
\2 ?% @* J9 H! k {
, c, y+ i1 f7 w3 D6 X cdev_init(mcbsp_cdev,&mcbsp_fops);9 t8 H% F: r* W% N& Y8 @+ a
mcbsp_cdev->ops=&mcbsp_fops;9 r9 g8 r [: I
mcbsp_cdev->owner=THIS_MODULE;% [6 a I3 |- F. ^- j" g" j
/ x# }& H# O2 C' \/ u
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( H" W$ O* l; X% o/ a5 L0 g printk(KERN_ERR "register cdev fail!");9 O+ V" |; y. Y5 n1 p3 T
else
; ?0 g/ i) N4 Q, a printk(KERN_ERR "register success!\n");
+ P2 B% i4 W p a7 I) s( O2 d }
+ e2 Q+ s, \( g4 \' Q% l, C else
" w0 E! O/ t l0 b) B {- X. I6 R6 a( Y. I6 Z! O* e2 P
printk(KERN_ERR "register cdev err!");2 C% ]/ L6 F q5 u3 \3 F
return -1;! U2 W# `+ W9 H% O: @: a0 N( d0 f
}
) x* _0 M; C. S; ]' z- i
0 F2 p0 ?, O3 k6 x X# h mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); ?' V8 \2 `" X y; l" d
if(IS_ERR(mcbsp_class))
- G7 ~8 J/ Q7 S1 }4 B" n* v+ G. X {
# `! m T& p9 i3 N, e printk(KERN_ERR "register class err!");: M9 |9 {% P1 I1 [
return -1;4 T' N/ ?9 O L( W
} n0 m0 a l5 W9 a/ V
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. r# X4 q6 i1 e9 l% M
: S6 v \- x; f3 @$ ^% b
//PSC
2 ?+ G) ~1 k/ ^ //add Enable MCBSP. C- {* a1 `% d" f) R3 o. P4 b5 ]
//test
' M( X+ ]% ], Z- ? temp = 0x80000003; C+ w; o* ^& [# p) H& g5 [
writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 z; l) T8 D0 E6 k+ w6 I
temp = 0x00000003;: l- B# }" X$ w/ m$ w$ Y8 R
writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 r3 |, L( t8 ^ ~7 g. B
8 c' ^! I* Z' J; h temp = 0x001FF201;9 A P6 `3 p$ B: T f
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ N b4 R. m; Q8 o3 t' d
( f; g' s2 `$ X8 I //PINMUX ( B O- r% D% [' I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 H# S0 t% u/ R" y+ g2 P$ O PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 \( l. Q: v- |5 ^ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
2 Y6 k& E+ i, P( \/ |9 r: x* d, { writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: l2 L. N4 P5 W G* N/ v 2 _" k" D2 J+ n0 l, ?( H
//SLEEP_EN,EPR,L138_SHK1,L138_RC2 Z3 |6 i: m% a% e+ o( e
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& Q1 d8 P# O- g8 S6 c PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / \# Z: f$ t5 Z: R) c4 B/ `0 W
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 I6 D3 j2 K1 \/ l9 ?9 G
( ~1 R; c: \6 d2 A. h //RESETn,L138_SHK2) v; y% `# J& z9 R
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 2 q6 k6 q6 F) x
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; : F* p! n$ D" ]1 J* U
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
' ^! i! R; H+ X5 W: T$ p! y
, M+ m2 C& `: E7 g7 {9 q
* o5 D5 x/ \! x4 \. b8 c+ | //SPCR Register5 R! d3 ~% A% k- x5 {% I& o
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 }' o1 L, l; M, ?+ ? temp = 0x03000000;//(DLB=0). }9 H8 Y; X- ]
// temp = 0x03008000;//(DLB=1)( z- z+ o1 W! ?4 n4 t! |0 o- C3 d
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
0 U6 z8 L5 X; B# T1 o" d6 @ temp = readl(IO_ADDRESS(SPCR_ADDR));
$ j# q! w; w9 C" ^& }$ u7 I7 U printk("temp=%x\n",temp);
& v& v5 Q6 s% h* q! Q. s* _ ; y7 }# _% {6 D
//PCR Register
$ L. E2 H! i8 C //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 o/ |/ v# {1 K! j // temp = 0x00000F0F;
2 ^. j$ |; \2 v temp = 0x00000B0F;$ T& H p3 k% Z K
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized & F/ M9 k; ]" d( c5 {
temp = readl(IO_ADDRESS(PCR_ADDR));
, m: A/ Y# A/ e/ M% Y6 L printk("temp=%x\n",temp);
4 n1 s; _) o0 ^: q9 l5 |+ T, P+ m/ d //SRGR Register
" l' c _) h, j @& q9 O, b //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11& }5 R4 @8 F! ^3 b; n6 J8 F, h
//temp = 0x301F000B;- Q, U1 J& l" m1 ]' G9 T
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ' W8 j& C9 O1 z& U- {* N! p
temp = readl(IO_ADDRESS(SRGR_ADDR));
# s' B& W- v; G printk("temp=%x\n",temp);
) b) E3 k7 Q s! R. u- A2 f //RCR
1 Y# e$ I5 ^- R //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 v& J# Y* t2 F' e2 G! G
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 c* S4 i( [; I$ M temp = 0x00440040;7 \ c, z9 y0 S0 X
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
1 x4 m9 S% u5 h+ V! g+ K temp = readl(IO_ADDRESS(RCR_ADDR));+ d) o1 \5 n. v: K9 S' s
printk("temp=%x\n",temp);
7 S2 p+ r* Z! O6 v //XCR
; r3 v% S3 t; i8 W. u# P //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 `+ s& o* g. }: e3 z; a
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
! A/ \ E9 C9 x4 l! s2 W temp = 0x00440040;, F% M6 t# x7 k3 c
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " S* F& ]0 X% C1 G
temp = readl(IO_ADDRESS(XCR_ADDR));( H# K, x+ X* \, q4 {' c
printk("temp=%x\n",temp);
, {; p# D3 F! _3 `$ d! I! U. [1 x udelay(100);
5 b7 E( u# H3 h# o3 V v //SPCR Register0 y+ M) t& D8 j: R1 @+ P. j
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& Q: w" p# ]) ?+ g! I: x H) f temp = 0x03C10001; //DLB = 0 VS DLB = 19 f: \5 K" L* R! h2 c+ y
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 P- i$ g+ B5 ~ `4 w- h R temp = readl(IO_ADDRESS(SPCR_ADDR));
7 i0 N5 j8 v( X. I. w5 l4 t printk("temp=%x\n",temp);% \ A& c& C+ d) ^6 W* y
udelay(100); _# A2 n: y; l3 c2 |- t6 g
$ A8 n9 ^; G/ Z' F //set GPIO direction
& |' d) h4 P: Z9 O5 @ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 C8 D$ Z8 S5 x temp = temp | 0x00000100;//EPR----input
3 |6 P8 `" @! C% V temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' D u, L1 C8 W9 `# I/ k __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # V2 o6 c, |0 u( L8 B
$ R) T$ i/ `1 i* A2 K g return 0;/ O! O2 g& T: X; ?
}* v2 y+ K* s) U! h) c
static void __exit MCBSP_exit(void)
5 N$ T2 ^1 z0 ^) f3 }{* p6 d2 J! @. J7 | B
printk("mcbsp chrdev exit!\n");
1 K$ C: F, C, ~* i4 D cdev_del(mcbsp_cdev);2 I+ t' m: l6 h; q$ `6 T
unregister_chrdev_region(mcbsp_dev,count);
8 k: Z9 E* n4 G/ b device_destroy(mcbsp_class,mcbsp_dev);' c3 k M# g( p+ [; P3 l
class_destroy(mcbsp_class);$ x9 a2 g: W$ T/ }
}
' Y: o/ `2 e9 q7 d7 r- d' \0 E$ Amodule_init(MCBSP_init);8 a& [5 V- N) _0 k
module_exit(MCBSP_exit);
/ F; d$ P3 P! g: f1 e( s
1 `# Z8 C) t( zMODULE_LICENSE("GPL");& D8 i; A1 R) x" \6 b( m, n$ C
/ U2 n1 o. W& W. }4 j# F( f4 q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 k+ @! x( q S
我的应用层的测试程序如下
5 Q% Y1 W- u: m/ j5 X ~#include <stdio.h>
C' k, d2 i, x, }8 ]% P$ t; ]#include <string.h>
, `' m$ Q. y: O# Y9 p#include <fcntl.h>
$ U8 R# Z5 |% o# m4 I: Z }#include <unistd.h>
, C1 l$ ~+ l$ T#include <signal.h>
3 Z% Y: g4 W4 O! R; R1 z#include <pthread.h> //线程6 b6 L0 B7 d$ A6 ]3 d6 Z# W
#include <stdlib.h>% Z# r& {3 x4 `" p! |7 S5 C' m0 u8 h
#include <pcap.h> //捕获网口数据$ _. D' P ~( M& P
#include <semaphore.h> //信号4 _5 c1 i( k w: }9 a+ I. G
#include <sys/types.h> //消息对列
5 n' k% b6 n ?# U/ h9 w5 z#include <sys/ipc.h> //消息队列
1 |( H/ k2 t; J! m2 ?& J#include <sys/msg.h> //消息队列
2 g4 C/ O% Z, d) O* M$ x#include <sys/select.h>- i# s6 f8 Y2 C6 G* k& @
#include <sys/syscall.h>+ V) x1 A& T6 ^
#include <sys/stat.h>& X' ~/ N! V2 W) |% n$ a
#include <sys/mman.h>
% U9 H& v9 z+ ^4 O#define msleep(x) usleep(1000*x)
+ ?+ }* Y f7 n& H! M: f8 ]; z
& K: p M9 s' ~int main()3 B- i; m3 b: e' m5 O, o
{
5 s& Q5 x& ~* t //MCBSP,ARM与AMBE2000交互设备) S* P% t) u3 `8 f' }+ S7 T- `
int fd;
( i) l& V; Y5 n+ P. D unsigned short data_write = 0x5555;
8 L2 v$ e+ V2 R3 s unsigned short data_read = 0x00;& L$ A+ o5 E0 {+ y: q4 Y e: V+ u
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 k A! E+ \6 \ x) b' ] T
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; i7 D! W9 L9 q
6 K5 ?9 f5 f8 l# z1 V9 l if(fd < 0)( `7 A( {3 J! G$ L U' z( A
{/ p1 |* L" Y$ e
perror("open failed\n");
( s3 ^& G2 Y. c+ \% E% _1 H3 J# H6 c return -1;
, B- P z8 R9 f- A! t& l }
' q- Y0 U G. O! h6 i2 b 1 i# q$ S- g0 }* H" K9 X
while(1)
- q1 o9 c# I: R$ j2 O {1 R5 ?6 S: O" Y7 @& U, i* N, ?
2 k* L U2 \( W1 [ //AMBE2000每次读写是24个字为一帧
4 o! [8 P/ n7 `/ E$ s# Y: Q) i //写数据时将数据在底层存储起来,等到中断的时候再发送
* W6 `# @6 E$ D' {$ B3 s //AMBE2000输入数据是以0x13EC开头的
& @, J4 L8 N( Q! ^ write(fd,&data_write,sizeof(unsigned short));
, H2 l/ d" S. n4 n' ~4 @: v! r$ ] / f5 W% l4 e2 M( D1 b
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
: \' T! W* f8 a& [/ o( s# x read(fd,&data_read,sizeof(unsigned short));
. @. ?+ a, |) y' u( j' P: u 3 X: @% ^, z s' @- q+ V5 n Q* H
if(data_read == 0x13Ec)
% k: c6 h) e. u3 t, g5 F& q {
( Y4 n0 m0 ~0 F0 L" b; k( ~+ r 9 \5 l4 y8 A/ {) U* Y, ?- d4 x: Y
printf("data_read = %x\n",data_read);/ x9 w! H9 J+ E2 h- _
}2 S8 t9 V9 j6 ~( A+ x/ E4 Y
) }$ C4 ~7 Y! E1 J msleep(10);( t+ J8 G: U. M7 X, J2 K" _4 f
. x! Y8 X5 ]* w" o
/*
, K# q( E4 b3 a" Y+ y& A ioctl(fd,1); ) g$ {& N% `/ i+ T7 s" ^9 m/ `/ P
sleep(1);
" R9 B/ j/ z% x$ ? ioctl(fd,0);* [$ u: h+ @4 q5 Y4 U. H3 n) S
sleep(1);5 [" n) s4 f+ u3 g
*/ # p, X9 r$ D9 A4 ^! s
} 6 r$ o$ @7 y' E, w/ ^( j
return 0;2 A, X5 j ^; Z1 z& v" ]" r
' s6 X u9 H) ~/ x$ n}: b) _# g- J1 h; r# n
% e1 O2 l/ }; F! N% J
多谢各位指教,谢谢! 急; N" m& l# b3 g
2 W) |1 @$ ~7 u7 z! q2 P4 b
: E+ M- W0 B/ Y, ~; {+ p v, b3 Z: a
5 ?+ q' \. h! A8 P6 y
( F0 ]2 A# y) P |
|