|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# R+ Z; Q" c( J( j- `% F" J/*
- R/ {6 ]7 i. l" t+ r$ r/ n * Copyright (C) 2009 Texas Instruments Inc
" A8 I! F2 _0 l0 k8 A% r y *
$ z3 A7 B$ n- t * This program is free software; you can redistribute it and/or modify
# p: ^. W; J x4 | * it under the terms of the GNU General Public License as published by3 X/ y0 r' Q7 P
* the Free Software Foundation; either version 2 of the License, or
7 G* a4 e" v4 A# L * (at your option)any later version.' F7 |* c* S# r! X. s j1 j5 m
*4 I- [) F* }# g) N* G& R
* This program is distributed in the hope that it will be useful,
: [2 Y5 O* o$ F * but WITHOUT ANY WARRANTY; without even the implied warranty of
" e9 x, u7 A, {* a$ q& P8 C- P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# d& G8 X" P* {5 D2 I& w * GNU General Public License for more details.
+ s2 G/ X" V2 q; I/ p *
0 N6 B% ~! I5 t- w# V$ w * You should have received a copy of the GNU General Public License8 @, ?. M. U. B
* along with this program; if not, write to the Free Software4 D0 W; M. f; ^: ?' W
* Foundati
5 T4 Y8 y/ w% @7 {4 L*/; Y/ e' N( V3 n2 ~& M7 m6 D
#include <linux/module.h>; j4 F( w6 @; H) Y
#include <linux/init.h>
4 }, V0 z- }" o, S#include <linux/errno.h>
3 O8 W. X: h7 S' B7 q#include <linux/types.h>4 k7 E9 Q+ q' w9 l. [, F" }+ N
#include <linux/interrupt.h>8 Y6 i2 V' L5 T3 p% {
#include <linux/io.h>7 G; F% v5 p) J5 G3 l
#include <linux/sysctl.h>& ^! E( t8 E' ]# Q) H6 l
#include <linux/mm.h>
, r3 ?! }# y6 H3 _4 [#include <linux/delay.h>! w, C; T: H6 I7 z
#include<linux/kernel.h>+ D6 W0 D Y% \, E
#include<linux/fs.h>: T4 H0 _. w$ O- [
#include<linux/ioctl.h>
6 W0 _& b* i$ b! a" Q) q7 `#include<linux/cdev.h>7 t& O0 T: s# u6 P8 N% w
#include<linux/kdev_t.h>
+ z; [6 w0 i. k, I% G9 O#include<linux/gpio.h>
" v4 v- c0 u" f#include <mach/hardware.h>
' [- k/ V$ J: G9 d#include <mach/irqs.h>
+ J( y# ^/ l5 A5 S* |( r j! ^' @$ B, `
#include <asm/mach-types.h>, B) T, L( |- X& t! G/ Z+ D% T
#include <asm/mach/arch.h>
8 f6 I. z: q# ~! B9 k- q; z0 n#include <mach/da8xx.h>
% \0 a+ _" R2 P/ O2 @: i1 D#define SYSCFG_BASE 0x01c14000
1 a7 |% }, }! z#define PINMUX1_OFFSET 0x124
. ^; L7 q+ k6 o#define PINMUX18_OFFSET 0x168 . x' [0 q8 z4 q! U D' [/ Y
#define PINMUX19_OFFSET 0x16c
/ j; O/ p, z3 t* W* L7 Y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 w& ]$ C8 \' e2 f$ D' M
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
v, B9 @& J0 e, T, {& k#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 P& J1 h0 t" j4 b* U! g
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
& c% ]* s- q3 P7 ^$ h$ x#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 U1 l/ G) y: A9 y+ p/ G
& w9 R' ]' Y9 `) n" {#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
3 A' y$ ? o( r [! f#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
* f+ X& U! Q \5 b$ l//PSC
5 C4 a9 e" \2 t( F' N3 k' ~#define PTCMD_ADDR 0x01E27120
" R1 _- f- w4 j+ j3 ^% w' D5 s#define MDCTL15_ADDR 0x01E27A3C
- U2 r9 V9 p7 i* u7 j9 B% H#define PDCTL1_ADDR 0x01E27304, l+ T+ i6 ^7 u3 n% g* Y a
//GPIO8 direction! F4 Q q, q& ~1 P; a
#define GPIO8_DIRECT 0x01E260B0
. V( t5 x+ ? Y#define GPIO8_OUT 0x01E260B4
: N! q$ c6 X1 _#define GPIO8_IN 0x01E260C0: }5 S( T$ f& V' [6 {
: |" O9 P6 M" H//#define MCBSP1_RINT 99
) Q' y! v0 I- ]* w* K2 M, ~# _. @//#define MCBSP1_XINT 100
, ?; N% p. f$ x3 |* Ystatic int MCBSP_MAJOR=239;
6 Z( {) J! _3 p; I5 m9 Y; Tstatic int MCBSP_MINOR=0;! V1 U9 Q; ]1 x) U& R
static int count =1;5 ^' C4 h1 Z8 U+ X ~$ b7 _8 \
1 J6 C% T) P0 Y$ v& I5 W& ^#define MCBSP_NAME "MCBSP-device"; Z% N8 n: h5 _- M
$ I6 r, t( C. n7 e" Qstatic struct cdev *mcbsp_cdev;
: K$ U9 c0 Y5 l% [2 _. p# D1 Jstatic struct class *mcbsp_class;$ T _5 S# n$ [ e( G; z1 z
static dev_t mcbsp_dev;$ Z% |3 B3 T5 a# U- V
unsigned int DRR_data;
B6 F* p/ \3 n5 ?2 Funsigned int DXR_data;
; {% a! n0 v* n: b7 k2 bstatic int mcbsp_open(struct inode *inode,struct file *file)1 ]. F3 ^' j6 j2 ~0 h4 v9 _2 R
{
9 ?) D3 a: l. J" \( b% I % @5 J+ }+ Z- @+ Z( w! o1 q& ^* m5 M, z
//interrupt enable,initialized& \$ B% r' m' Y9 T2 X' ~7 ~: ?# M
unsigned int temp; V7 P* O* {( P' M4 S
//SLEEP_EN(GPIO8[10])---0
# l" o3 e: H/ P1 r6 i) D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. F' F$ q, h. D. b/ x4 ~3 b temp=temp&(~0x00000400);/ Q7 h3 {6 J* k, Z+ {1 D& ~( t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]. i, g/ M1 z; L8 L0 d& e; t! \
//RESETn(GPIO8[8])----0----1
{! {- d% f4 X' x& W temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 y; ~) Y% n2 L; w6 k l! L
temp=temp&(~0x00000100);
8 A0 Y6 ]0 E+ f5 [# [. K" p7 H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 `' j' I; O. J+ Q+ l+ C5 U udelay(100);% H5 R1 \2 [9 B, i/ d. W+ `9 l
temp=temp| 0x00000100;- g8 F9 I9 [& g* M: |
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---18 |" p' K9 S& ~ V9 T; c$ l# j/ _
udelay(100);* c1 C+ a4 v4 @, B) r9 w
printk("open success!\n");- Q; d2 s! q6 Y
return 0;
! Y4 u; f/ n; B) K2 J% o}
. |- `% o; t( P H$ I
; a4 y" y) v- R/ X6 _static int mcbsp_release(struct inode *inode,struct file *file)3 h! k! e1 P6 ~0 u/ E& G, i
{, t5 j* Z% f y# ?
printk("release success!\n");
% E0 v' w( g g& x/ y return 0;
\7 A# k( @/ F6 a& a% |}8 l, h; h& e) |" H, d( }
6 y1 l# u, @7 N- ~; v/ n, \; G5 E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' R4 L# q7 O/ c
{: v# g! v6 A' b4 }( F' m6 |
copy_from_user(&DXR_data,buf,len);
$ z- F5 |0 p% p9 R- N: P. d iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 k. G+ {4 _: {0 Q8 q5 H3 A4 H
return 0;6 ]' _9 \ K5 g) h9 \5 h1 j
$ K/ g7 Z: H1 Z: q}
! s1 O' x0 W: R/ B- ?) j! J* j3 r
: \# Y, Y* |) m# ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 y+ h s' N x+ K, e+ P
{
& J' a; o. r* P V8 W! F2 V# } DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; k& r. |. X7 @$ Q, D M* h' D7 D
copy_to_user(buf,&DRR_data,len);
2 m7 j: v. X& ?0 B6 e* U return 0;2 L0 O& Y' D4 R, T2 H) L0 U; v+ J
}
9 A5 h: d( V, }8 h
5 r. t0 K( U$ S# h$ J0 f* C& T9 f) A0 ^6 X% @* A) R) @0 ~- U, x8 M
static struct file_operations mcbsp_fops=; D& l+ N8 D5 d) u) c) M
{9 P1 \8 V2 g6 |6 v5 Q0 m6 Q
.owner=THIS_MODULE,3 b! I; Y2 I$ f
.open=mcbsp_open,
' G y" c$ K' n( b( f' B) [) A .release=mcbsp_release,) @) V$ u0 M& J2 h) m
.write=mcbsp_write,
2 {. Q3 R. d" R .read=mcbsp_read,
4 ~2 r% U) X9 O$ t* b \; u6 V};
6 M0 y: R" Z$ X f! [, Gstatic int __init MCBSP_init(void)
5 @, h! h* G' `: _{" T. X. R6 {. {7 d: X& u" C {
int ret;5 F* H# Z! n- W+ f& u! B6 F# O7 _6 P$ Q
unsigned int PINMUX1_REG_old;
. ]/ C, J# Y8 e# I2 \" {( F unsigned int PINMUX18_REG_old;* ^( f* M& B0 b; R* |/ J. m: O# {7 H
unsigned int PINMUX19_REG_old;
) F! d5 b. v2 G' F. q/ l unsigned int temp; ; u' ?- j V6 L% b6 z- @+ _! c) t9 A
if(MCBSP_MAJOR)
# ~* [7 k" z- o- a+ H* Z7 j! N6 z" T {/ s C5 N# N. \2 M" h
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 V# l5 I5 H7 c5 { ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 e7 y3 ]2 t7 D' l
}
l; e$ ~7 X- E7 i% [3 J else; @) w$ p! L6 ^: S
{5 b/ A8 v& n- f# n0 H8 ?
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 C: g. ?8 S% I" k- E9 D$ v MCBSP_MAJOR=MAJOR(mcbsp_dev);
9 L& C% F- h9 ^ }& d+ s: K5 D1 S4 g
/ z- K; ]6 D& T1 [; M6 ]
if(ret<0)% ]- ^& P: N+ T5 s8 A" e
{$ o* k! U a* S: ^3 B( p$ ]
printk(KERN_ERR "register chrdev fail!");# Y$ r) H6 F( w4 c5 t5 Z/ d$ ? l9 F0 J
return -1;8 M. d8 B0 h9 P, V* M
}
' Y: n- `" W7 a, C
9 y& F! L5 |2 E9 A8 J mcbsp_cdev=cdev_alloc();1 E3 C3 q- W' y# A3 V
8 O3 @5 i9 L: J; i# [5 I) A
if(mcbsp_cdev!=NULL)
. U' V# g8 M0 _5 R x {7 J( N8 `, o. z# r% |
cdev_init(mcbsp_cdev,&mcbsp_fops);" b4 d" Y1 o* g2 B5 f8 ]4 Y& H
mcbsp_cdev->ops=&mcbsp_fops;" |3 T: @- [2 U [% F- t' ^. T
mcbsp_cdev->owner=THIS_MODULE;) m T7 K+ Y9 Y9 }+ _" u" o
& [3 F" z* g: ~0 ? p; t# k# i if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' y1 Q9 [. r, q# k. a
printk(KERN_ERR "register cdev fail!");' O" p: g! u1 w* r: Z, G
else
- F: D8 M9 _& l% h printk(KERN_ERR "register success!\n");
& z1 e1 _0 A6 [9 m' r* b }' V9 n8 J! X( W# m7 x' ]
else
; h' H+ j$ D$ \1 J2 S1 o: g {$ ^" l1 e2 P0 [) c: b9 }- x9 {, e
printk(KERN_ERR "register cdev err!");
4 N/ W! Q9 e9 s9 `9 R return -1;1 ^5 ~8 o+ S$ Q2 |; N p' U0 z" }
}
1 T8 E' Z0 d f i
2 [. ~, } \( I& g$ h6 l# Z mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 g# w; I$ Y* z7 v2 a# L: j
if(IS_ERR(mcbsp_class))
7 t% l8 z. u) R. v0 D' { {
* d4 \! m `6 Q+ e' n/ G* N printk(KERN_ERR "register class err!");$ b! I% o, p) ^
return -1;( ~ v& ~0 w2 I1 o
}( T; T; O* w! y. w& z
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' j6 H9 b# E0 h- n8 `+ V6 h( m0 Z5 T9 y1 i5 w& C. n6 J. A
//PSC J6 s* C: E- @- K8 Y: F2 S
//add Enable MCBSP$ h6 |) g0 D g. c8 h2 m: B; @( O
//test" Y( C6 {! I6 r* `1 V X
temp = 0x80000003;
5 U) Z; ^7 F, w+ S" F" w writel(temp, IO_ADDRESS(MDCTL15_ADDR));7 v. B$ R( W8 K& s$ g& W$ T
temp = 0x00000003;
2 [( m' B1 T: @7 v" I# R writel(temp, IO_ADDRESS(PTCMD_ADDR));
. ^1 S' }3 h6 A; Q9 E
0 o k. \! b8 r8 S0 l temp = 0x001FF201;
2 d4 B" c9 U) {) N8 m writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. w7 b6 A4 u% D# Q 0 z4 n8 ?9 f5 R/ D( `: j$ F* q
//PINMUX ) A) N1 t1 R5 A! x/ U
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( t; P, g2 ^, i9 I+ `5 b3 }( e: P: j PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! w. ^1 ^4 x% K8 \: [ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
+ \) u7 E. p) V$ s8 O. I: [- m- y: w writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 X3 @7 M) @* {3 k, A
! O& p' a% H# Y. X& S' I8 a# ~ //SLEEP_EN,EPR,L138_SHK1,L138_RC
b9 @+ d5 G7 p" K, y) @/ P* j( M PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# }. l1 U6 L4 S4 B9 D9 [' W# e t PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
4 r' v/ b7 ?. m! k" `0 n writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. N; ?4 ]3 D% _% c) _+ P: d' v2 x4 A / R: Q. Y& y/ E! F5 @% {
//RESETn,L138_SHK2
; O# t9 {2 ~4 K s# b4 Q PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 6 `& R6 ~( X( k/ n6 I
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; , _9 B3 n& ^( R1 i" Z1 n
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 M, E" ` d/ t4 N: N
0 O' s! n# _% _1 ^# a. O
9 i3 n& Z. @& n5 S# M
//SPCR Register
: g" Q$ K2 I7 E //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; c; u D5 ^4 U/ L8 M$ `, c temp = 0x03000000;//(DLB=0)- K4 O% E! [/ E( `
// temp = 0x03008000;//(DLB=1)
- R+ F) }6 I/ N0 J# I writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset l+ r1 }* f8 Q' s
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 D4 d( ]$ i( a printk("temp=%x\n",temp);: C" A3 T: T0 c$ I! i3 Z
p3 |3 ^( ~. s, Z, Q" G% P/ v //PCR Register1 `# w7 Y0 N# L0 f B) I
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 W p6 F5 H& ?& C! g. A8 O: v // temp = 0x00000F0F;5 p) R8 t% t T P/ Y+ u8 A
temp = 0x00000B0F;
$ B$ ?, Q# T; l4 I2 i6 C# R: a writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
# Z6 r& C) l: t temp = readl(IO_ADDRESS(PCR_ADDR));
" {& j& ^: U: @+ I- [7 [ printk("temp=%x\n",temp);
6 i( |4 o! k# [# v1 z; G4 g0 R //SRGR Register
( G/ w6 W5 u. _/ g2 w; @, t# T //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; _& k; D- z) t! q" e$ S
//temp = 0x301F000B;
' t8 b" I1 A1 ~ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
( w- Y+ N9 z @1 b' | temp = readl(IO_ADDRESS(SRGR_ADDR));
4 `3 I9 z6 u1 G4 ]2 | printk("temp=%x\n",temp);
1 e1 l% Z2 K" W `/ [; _ //RCR
" j$ F! k0 A& E //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ N" _; O8 \# O) A0 i //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 P' R V, _5 I2 |3 W4 L
temp = 0x00440040;: S3 f' ~7 R# Z$ x
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" R$ H( n5 b& u) I4 y temp = readl(IO_ADDRESS(RCR_ADDR));& B: R/ z" j8 T' S
printk("temp=%x\n",temp);
! U! w/ L; C, x( t. p //XCR
7 Y2 A {% k0 M/ I# J& V: t5 A //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# t2 X( N0 Q& y/ {0 K
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
- W* ~7 {, j: ?1 k1 _2 p# M# A6 d! m temp = 0x00440040;
: T4 H7 ]8 h, \! J! D/ z8 K writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & x7 \/ g! @1 T J& X5 q; Y% ?+ N
temp = readl(IO_ADDRESS(XCR_ADDR));" x5 Y7 T# r8 M% b
printk("temp=%x\n",temp);
. M+ ]$ ^, I7 w* [# q udelay(100);
" |$ ]* G7 |2 E ^7 j1 G //SPCR Register. y* a+ f1 h* b/ a" h8 Q k* W
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% r. p. A, |! Z/ D4 w2 p$ \, M7 _# B temp = 0x03C10001; //DLB = 0 VS DLB = 15 F- c1 R h9 e" g* ]( U8 T( o- J
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
% O6 F+ w, V# d2 C5 W0 l* n0 U% P temp = readl(IO_ADDRESS(SPCR_ADDR));/ j+ L4 M; e, j# i5 g% z
printk("temp=%x\n",temp);0 \1 b+ k% r+ l) f% Z0 f- G
udelay(100);- ?( D7 D. @2 S0 p
0 A, h/ m5 E$ {4 \( g' f //set GPIO direction
1 ^0 J! a$ r( ~% {* |1 \1 n9 U temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" z) D* @0 t% l! W0 ]
temp = temp | 0x00000100;//EPR----input
% z; M& v: y& L; M/ h8 f temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- V' k" w/ k# [5 J2 a: _ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& p6 I6 v/ w5 A) F' B6 G, } 7 U* d* h4 u6 ~5 ]6 O4 {
return 0;- j2 @" g: ^, p5 |6 }- q+ w3 b) V
}
: W( I) r c2 l- @9 zstatic void __exit MCBSP_exit(void)
) X W8 _1 b1 @2 m# d! ]{ d9 x; d5 g8 n
printk("mcbsp chrdev exit!\n");
, x' @& d* [: _& I3 p+ d3 U cdev_del(mcbsp_cdev);
5 C+ k8 L: W' _3 ^) D( X4 t unregister_chrdev_region(mcbsp_dev,count);- D+ Q9 O8 I# r- R2 S& Z& P
device_destroy(mcbsp_class,mcbsp_dev);
7 x j7 r# o K5 c: d* A9 ^ class_destroy(mcbsp_class);, Q. R1 R, ?5 G: T0 A6 _5 P% j- a
}7 L. x6 u$ W" a
module_init(MCBSP_init);) h5 Q: Y$ X1 Y. _' @+ o- ~
module_exit(MCBSP_exit);
* P# J% p- G0 G" G6 L4 l0 S5 T" R1 ]* k/ X# |
MODULE_LICENSE("GPL");
, _0 o+ }' U5 B" q
! M$ \; Y. r. ] c- C# w5 \我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) E: }9 D% e: T. W- R
我的应用层的测试程序如下
0 F. Y2 k5 g9 X$ v# U: z#include <stdio.h>; {3 O, `2 |( L
#include <string.h>
% F' Z. n! L7 X#include <fcntl.h>2 t" m% b1 ?) w1 U' T6 x3 Y
#include <unistd.h>
; C& N5 D; @& w* |4 e#include <signal.h>
0 C+ Z8 u' p- o( ]9 {- A#include <pthread.h> //线程
9 r9 w7 x" D+ i8 o3 f2 F#include <stdlib.h>
- ?5 f" e, b, b* V6 R#include <pcap.h> //捕获网口数据8 o$ J u( S) p0 b9 J# T" L n
#include <semaphore.h> //信号4 |/ x! j" C* o! k
#include <sys/types.h> //消息对列
9 O: B& Z( G7 ?# ^2 R#include <sys/ipc.h> //消息队列9 e! |5 v! v- R0 w+ G" n f
#include <sys/msg.h> //消息队列/ C# i4 O. N$ y8 T/ F) x/ E/ x
#include <sys/select.h>
( D7 E1 [0 G! b#include <sys/syscall.h>, _, J+ k" D: H) b6 y! C/ ~0 \
#include <sys/stat.h>
5 N" o. h" C0 k. O& H% k) Y' i3 H* Y& g#include <sys/mman.h>
1 h. b4 g+ k, G3 X8 J#define msleep(x) usleep(1000*x)
7 o3 J9 m. y1 s7 s, B( h5 L" {$ k
& _* \3 R7 @3 F6 T: A2 pint main()
7 W+ [+ N; K B6 [* o% p. _{
: o8 q! s M5 e1 s# H0 q% I //MCBSP,ARM与AMBE2000交互设备0 Y' r" C6 x; X. ^6 o6 Q- k
int fd;( O+ {& [) q) R3 P: v
unsigned short data_write = 0x5555;( u1 ^5 O% g4 S" m
unsigned short data_read = 0x00;9 `/ H# z5 _. s' w
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 S" w5 \! S$ r6 y1 x // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( o z6 ~/ v4 t3 q. M' T* s, | 5 W1 \! L5 r# O+ y
if(fd < 0)
4 o, s# B/ @8 h. ?, W# B _ {
3 j! \, O6 U2 d& [5 G0 D: y" @! {5 W perror("open failed\n");
R0 z: P& [& {. T) A: u return -1;9 D2 L% B" N. V! l( g
}
( F! S5 Z: R" v" }8 p
! K" J4 V# _9 W2 P1 O7 \ while(1)# ?; L$ s7 [4 [$ i& f4 c
{
' Y; V: ^; g* I% I5 [" m: ^# I 3 R7 n6 i) s! q$ }
//AMBE2000每次读写是24个字为一帧1 K+ O1 X- W7 O! |
//写数据时将数据在底层存储起来,等到中断的时候再发送
: {# [- D* N7 I //AMBE2000输入数据是以0x13EC开头的2 {( ]+ o* Q/ {; X0 R
write(fd,&data_write,sizeof(unsigned short));) Y3 g2 e: w8 `& l3 U$ m
, g* n! L& a, c //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
{: i1 h5 c0 V W. G& j- I+ r read(fd,&data_read,sizeof(unsigned short));
5 `: M$ F) z; m" j
8 x; S# c- \2 R2 ^ if(data_read == 0x13Ec)# Q8 ?7 p" D0 W, P1 [
{
) x- L4 A$ v/ s( U3 l' I2 i* G' {
. f- g& z! F! f; ^0 ~4 H printf("data_read = %x\n",data_read);
9 \4 e8 Y4 ~( N) C, B2 c }
I2 {5 M( |3 y+ T) U - S: x( K I1 }' y- M
msleep(10);' j% i) c5 i, x: v
# F9 L0 @1 B9 u5 Y; C, Y' ` /*! Y8 z6 ]" g0 p& n# q
ioctl(fd,1); 3 ?5 f" r. z/ c& Y) E9 g
sleep(1);
8 t- z5 l+ F0 u ioctl(fd,0);9 L( v! Z# s: r, R; E" g: \
sleep(1);
* E; A# M0 K4 E" q! F. T */ . T7 r) |# A2 C3 B# U7 a
}
" N' W1 B) O+ Q return 0;( M: J3 L5 I7 I- L# M
# C# L/ C: D8 U7 J
}
8 ~, N. l4 t0 c7 U( n4 E* b1 W
) x: Z: y2 h `+ c多谢各位指教,谢谢! 急" I% q8 [. W5 ~5 ~
4 a7 I- W; t3 H5 h
/ e, Q$ x4 Z- n Z y# H
( I; o- y3 l* Q- ]. z% B
+ K! d! j" |; S9 J
8 k d% s! n4 \3 w/ o! _% X- s |
|