|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: q+ w' L) k! n7 J. y8 _2 Q
/*5 ?( Z8 P2 y6 ]- M* J* q
* Copyright (C) 2009 Texas Instruments Inc' _1 x7 t2 U/ i% _ V% U/ A% T: a. v
* C/ C1 c" I7 E
* This program is free software; you can redistribute it and/or modify, H1 `& p! A; S4 D
* it under the terms of the GNU General Public License as published by
[+ q8 [1 H9 x' Y/ G8 _ * the Free Software Foundation; either version 2 of the License, or
( I) I% c. a+ m" d * (at your option)any later version.7 T) {1 S% `# ]/ ^: N
*
, o; I/ V# q m9 p2 h * This program is distributed in the hope that it will be useful,
5 O7 z5 q! {0 B3 j * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 E( H- t' f3 z( A% N5 i9 \1 C. S3 W * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# Y; S8 C9 I1 D2 C6 y
* GNU General Public License for more details.
% ^- v7 q# i3 h2 K2 T" N+ s) M. E *
$ n l0 z6 C q# C& g. {0 ^5 M* c * You should have received a copy of the GNU General Public License
8 S7 b$ Z2 x4 H3 J _' n- L * along with this program; if not, write to the Free Software& E) c/ H9 V9 D2 u% S. f$ U( b
* Foundati
. x, _8 M9 w2 a8 h; T*/: a' I7 S- ?7 \
#include <linux/module.h>9 H$ b! O6 J* o/ c+ y) E5 P
#include <linux/init.h>
) r1 B) R* c' d- Q X D#include <linux/errno.h>
: k# i5 y" \+ }5 `- O#include <linux/types.h>6 R; o6 H J1 H, Q% k! k
#include <linux/interrupt.h>8 X; J9 e8 V2 Y5 W' |( U& t9 ]
#include <linux/io.h>
# s" I, b) e3 Q, h2 D" U#include <linux/sysctl.h>% N; u& E# e9 S( d, ~
#include <linux/mm.h>! ?1 b; \' b# u1 }1 b9 |
#include <linux/delay.h>
. W& k* l9 E! A9 D) V: M* G# ]#include<linux/kernel.h>9 G" Z' I8 f( |8 u- ^/ t ^ U0 d
#include<linux/fs.h>
0 ]& r: g$ S% J# s% [9 z#include<linux/ioctl.h>
+ V4 e2 P% X+ x+ ?#include<linux/cdev.h>
" C9 Q6 x. |$ W- m( E" t! r1 b3 d7 H#include<linux/kdev_t.h> H+ r' b: u1 |
#include<linux/gpio.h>
. h6 f: w7 T4 r- H$ L. n5 C/ I4 S#include <mach/hardware.h>
1 z% W3 f; l# e- h7 ~& J1 \- A#include <mach/irqs.h>9 c; x. X& b, D1 M4 ?
1 W" | ~9 B; e( N' \0 y! }
#include <asm/mach-types.h>/ H4 c$ Q2 S5 g! W9 c1 Q# `' b
#include <asm/mach/arch.h>
2 z7 t4 R4 J! ]3 w, P3 B/ \#include <mach/da8xx.h>
0 @/ k: O7 x n, ?8 m#define SYSCFG_BASE 0x01c14000
2 v" Q3 p7 `' s. ^2 U* e#define PINMUX1_OFFSET 0x124
! c( m& ^# f. [& T* z#define PINMUX18_OFFSET 0x168
/ I# k* I r: i( v V: s$ G: i2 ^#define PINMUX19_OFFSET 0x16c
7 g- g. N* g+ d& g- k. Y0 g3 K#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
' N3 R. h$ @9 j6 b#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 _9 r( i& K! ^' x#define XCR_ADDR 0x01D11010 //MCBSP1_XCR3 [3 e9 c7 G( a$ T; \2 }5 V
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR; t) q5 w( v/ ~
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
8 T- x( z" ~2 V- N$ a" L! U, `3 ^
3 S: N$ L3 ]* ^$ Q5 U! V* j#define DXR_ADDR 0x01D11004 //MCBSP1_DXR+ Z4 D- n( Q5 J
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR( d: C+ B. ?* H4 _" O/ ]
//PSC# B+ B4 @# w) S" N% a# w' _. W
#define PTCMD_ADDR 0x01E27120 & W, {/ [5 i* `& ]6 K
#define MDCTL15_ADDR 0x01E27A3C8 l" l7 }% P0 e6 W' a b5 [% }
#define PDCTL1_ADDR 0x01E27304: I4 O8 {! G- k9 w1 f
//GPIO8 direction
9 U/ P5 H) G2 R/ d& M( x#define GPIO8_DIRECT 0x01E260B09 g% {1 K9 B( A
#define GPIO8_OUT 0x01E260B4
! }, n* w7 a" @! L% U) O! o# x#define GPIO8_IN 0x01E260C07 S1 k1 q9 z* Z
^. v2 D9 c D- s5 m
//#define MCBSP1_RINT 99 3 ^5 O9 e' e& M# t" \
//#define MCBSP1_XINT 100 6 w& ]$ i- _9 B$ H6 i4 I; @
static int MCBSP_MAJOR=239;
9 B& J, \( h1 ^8 @; E- w0 q* jstatic int MCBSP_MINOR=0;
6 e, G3 l7 H. C3 A+ _" i8 xstatic int count =1;# u: D) \7 r! i# d) H
8 h0 o8 j; Q' Z; i! E: R0 N#define MCBSP_NAME "MCBSP-device"
2 z( X' _, |$ x' A2 C O+ |
3 P! T% I% L: Ystatic struct cdev *mcbsp_cdev;+ J4 d9 |- h8 T0 F7 t8 k7 o
static struct class *mcbsp_class;( Z) D: M6 i# k) l1 f: P; ]
static dev_t mcbsp_dev;3 O2 {' S/ C5 o s
unsigned int DRR_data;7 h: z4 v0 _7 {1 T3 z& v
unsigned int DXR_data;
$ W4 Y7 b) \$ _/ {" t# _static int mcbsp_open(struct inode *inode,struct file *file)% s$ h" c3 E! n& l( ]( d
{
% V' }2 n% {: Y! F7 y9 n
$ e. H& z) r4 [, g2 s9 ]& q4 h/ F //interrupt enable,initialized
1 S5 q) x5 ~6 r7 R) D8 q, \! i unsigned int temp;
" b6 D$ Q6 j' \. @- v* y$ H //SLEEP_EN(GPIO8[10])---0
D# ]) o3 b1 u; ]5 _+ [% E+ z' g temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: ~, Z# j" ^. \ C" F
temp=temp&(~0x00000400);1 M' O0 ~; E$ x4 ?
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. Y/ o6 u% J8 c# J5 k //RESETn(GPIO8[8])----0----1
, V/ p; E. D! p j6 P* X' I; n temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 p, y0 X2 Z9 X' U2 \# c0 L
temp=temp&(~0x00000100);6 o) d4 E. O/ K u
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* N0 I# x! X8 y udelay(100);* Z" a4 F$ Z- k* q8 I5 a. m" r& U/ r* b
temp=temp| 0x00000100;
1 C" h; M/ u+ j. a+ N. n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ {' l: Y& v) F' {8 h7 k9 v udelay(100);
. Z6 V: b) F3 M& | I/ Y printk("open success!\n");
]0 s1 F4 u. n$ d8 m L return 0;3 X& P& Q# i% f2 K- n7 y9 C
}
0 X6 z2 D8 I2 G- B, l* m% K A
2 ]0 I% \+ W! N* K2 a! N; v* o6 Pstatic int mcbsp_release(struct inode *inode,struct file *file). @3 s$ Q9 Z; B+ ?$ r
{9 k2 @3 z& W( } }" @- h2 k. l" u1 n
printk("release success!\n");
4 ^) _. r' a0 ]2 f0 f& Q& o return 0;
9 j' Y- D! A P9 W. Z) q. f}
' v! [1 {+ X# H; R
0 k% b; O+ @+ a& y' x9 t) tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); A9 n/ |, F" M8 J% t' ~; y
{3 G4 C$ w8 ?+ l9 w
copy_from_user(&DXR_data,buf,len);
2 Q3 U9 W5 o W5 Q- [* w G iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
7 v9 M: @3 ^4 b return 0;9 G: m I$ M# H$ d" p5 _2 `
3 i x/ A! J" A+ B
}8 `5 O. ~! b9 Y* A0 ?
5 D# a; r9 C3 [. ~3 a% k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 \) P- p% f6 Y" }2 m{ ' M" A2 E# I i. X' B% s# p
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 [# | y2 W1 K H# d$ M* \ copy_to_user(buf,&DRR_data,len); , Z6 c4 G8 R. \6 a+ D* s
return 0;
; H; y6 q" T0 P4 a4 {. C% x}
5 l% L* S& ~: j/ n( j2 c, Q: ^9 F& B7 U$ G. i) i
5 X; P7 @! I9 \2 E" I- I3 y- `/ J
static struct file_operations mcbsp_fops=
: `" Q& j' B- A' n{: o9 J( f3 `/ Y! w9 W% c
.owner=THIS_MODULE,
: g+ x7 U, c; K) j. }8 f" V0 F .open=mcbsp_open,
$ B3 T( s8 L8 m, L5 G; Y; Z" y, [ .release=mcbsp_release,( D! @ _! p5 B: `8 W
.write=mcbsp_write,
7 t6 m) v9 d8 H0 ] .read=mcbsp_read,
- B+ ?5 T/ c# o" o- ] p. K; n* F};
* f' ]' H5 B( r. @5 Cstatic int __init MCBSP_init(void)4 P( T* O6 m, b3 R& G
{( b' q" R$ Y7 L' V1 A" u
int ret;
* d" S/ ] b+ E. }1 c# p$ t unsigned int PINMUX1_REG_old;
6 @: e d; u% h8 ^ unsigned int PINMUX18_REG_old;3 z& X6 S! L6 H) m. s6 e e
unsigned int PINMUX19_REG_old;
! h3 e4 I g W2 G- Y% C0 u+ H unsigned int temp;
. n: ?! \* p3 q O2 y/ m if(MCBSP_MAJOR)
/ w9 G: f' [3 E0 n4 P {
8 _! R# [1 J/ k s5 D2 A$ l2 b mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
+ }+ `( x7 F9 p& C5 T7 K ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 ~( U$ z3 h( N$ q) V& h* B }
" V- L {- v. j% x else
& e w' b1 I* W+ h8 q2 M5 p {
6 q2 q) M+ t4 O; c- `/ ~ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 L m: T2 V" ~* Q0 C
MCBSP_MAJOR=MAJOR(mcbsp_dev);( l* A- P7 `* B
}' e( `5 |" F" ], Q, F
5 e: q! z% C; h# @1 T; G( M' U' e3 I) M: e
if(ret<0)* U3 L7 O# F& X2 T5 g
{: j, f( _. \. ^0 N& q; L
printk(KERN_ERR "register chrdev fail!");9 ~8 H- R; d) ] P1 r/ f
return -1;
4 a% X, i2 ]% Z' K/ B# [* L0 A }; `- R" p, e/ Y$ A1 f3 }: d9 \
( o F9 V& ?3 E P; F! w' L- G mcbsp_cdev=cdev_alloc();5 `$ f$ k/ k& l
9 E6 S3 R" n( _& {! u+ m" g
if(mcbsp_cdev!=NULL)
) {' w4 H. L3 ^0 f. Z$ m {
' o; [+ u4 L2 M9 F cdev_init(mcbsp_cdev,&mcbsp_fops);
& h8 M& n* B5 f! ] mcbsp_cdev->ops=&mcbsp_fops;3 N, p k) Q2 n" e8 S) l
mcbsp_cdev->owner=THIS_MODULE;
0 n5 Q/ h3 X; b! ? # K2 q5 l6 `* f" m) W* g6 b
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 N* `7 W+ p3 j
printk(KERN_ERR "register cdev fail!");5 J3 }' j4 d3 \; T. [5 E
else6 f! ]7 T% t' x1 N$ [9 j
printk(KERN_ERR "register success!\n");" y. }1 W* T, S8 f
}1 x* d# z8 ?& G
else0 J. z0 w: W) g6 [. d F
{" c$ F7 h/ g- C1 f8 Y
printk(KERN_ERR "register cdev err!");3 G( |% f* J% n- D6 V
return -1;
0 }/ y2 ]! r' W, q }
, L! U& L9 ]' {$ u 2 c X2 v" z$ i* `
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 P% M, C+ t; M; \+ M& c( h# ^6 L if(IS_ERR(mcbsp_class))
5 Z5 e0 x6 S3 t# S+ }% b {# n* @: k: L$ i" c
printk(KERN_ERR "register class err!");% m: Z. n! j3 e7 _( m, Z
return -1;; Y" @! ~! ]% d
}. |8 N. h2 q) |! }8 b$ L
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 z$ g3 @6 `% s& V1 ~, I
2 j2 ^, i) @6 e: Y
//PSC
0 ~0 s9 V4 T0 r4 T& e& c7 _ //add Enable MCBSP
$ z, b0 O2 V8 R. _ e5 b" ~ //test
! Q5 A6 ]9 w8 E9 j0 b# m1 p temp = 0x80000003;
9 S w3 u' P% n. Z5 E2 z writel(temp, IO_ADDRESS(MDCTL15_ADDR));
/ M7 q, ?' W7 r3 `. A- p- r temp = 0x00000003;
2 O, d; g! c; M writel(temp, IO_ADDRESS(PTCMD_ADDR));- k2 O- i3 P1 m* T2 b
8 y. Q* G" Y2 X9 F6 A temp = 0x001FF201;
. c3 s! [. P6 p- F- j writel(temp, IO_ADDRESS(PDCTL1_ADDR)); F7 l/ O; b8 H" F" i) p4 ~* V
9 Y, ^) {" X Y0 f8 \! L //PINMUX * k9 @5 x/ B5 k" {' _
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,# g. i# {; H b6 X
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 x$ @) P: y- n u5 m" w U7 i PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
: M7 P" e' `% K M, ~; q writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! ^! Q( E# B$ ^; c7 d3 _$ p/ I( `% `
% _; G5 e6 P: K0 u. \
//SLEEP_EN,EPR,L138_SHK1,L138_RC# ^/ ~4 h5 Z, E( r& N8 n
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) D: q+ S) w) e PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 9 U: x5 C; z; Y% Q7 N$ r
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! O7 y/ f* Q. G* T) M" e7 X
. H0 ?# e- w& R- i/ n7 m6 V //RESETn,L138_SHK2
1 H" s4 Y4 l1 c PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) @2 C: U) g. F2 N PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; - P* I4 | C! x; b/ n# c2 I+ N
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 I8 G, m( ]% g3 s" \; W
@0 |% A8 e L4 u
' w8 z; S. |- P5 M9 ` //SPCR Register k6 n' n4 W: Y1 O$ {3 z/ e8 W- E
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 o! V2 o. m3 I% O temp = 0x03000000;//(DLB=0)4 |6 O2 B2 u) i+ t
// temp = 0x03008000;//(DLB=1)
9 f% A. o3 p. R writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
( h# Z; t+ _! ~6 _ N temp = readl(IO_ADDRESS(SPCR_ADDR));
* f2 U4 k3 |+ g' ? printk("temp=%x\n",temp);
8 S( O# V! H" g* A9 A% l9 r% }0 @+ E' i $ ^# }" o) y- o0 t: H2 T! c
//PCR Register
$ l7 g, K+ l* G" E; w2 | //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* w6 x: Y( {2 O7 O- w$ n // temp = 0x00000F0F;8 [! c# y% K; W1 b: ?* {
temp = 0x00000B0F;
, O& ~- ]* z, R0 y6 J# Q/ G writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
% I. M C8 @0 g/ Y5 z6 [ J) a. u temp = readl(IO_ADDRESS(PCR_ADDR));/ [! ^+ J. g! o7 r' v
printk("temp=%x\n",temp);
0 d5 L/ [2 d. _ //SRGR Register
/ b9 |& _% o* }: O4 j //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; C$ g% m) A5 Z! O //temp = 0x301F000B;+ f) E8 m& p' P% S$ x9 g. w/ @4 x
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
$ f% ?' z9 S/ P0 t+ v. _# h temp = readl(IO_ADDRESS(SRGR_ADDR));
3 q- c! `: |* I c8 w1 J2 ? printk("temp=%x\n",temp);6 W. g' K1 i6 M* N, d$ h* G
//RCR
# [" C. F0 e: F3 Q //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" D0 S3 v l7 ~ { //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 P# r4 |- Q* [- ^+ e3 L
temp = 0x00440040;$ ?* l0 c h% Z- w
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( d9 M' N: F6 l2 D) h temp = readl(IO_ADDRESS(RCR_ADDR));
+ Q/ t& x) `" o+ V. C8 S printk("temp=%x\n",temp);- d6 q) ?# e) [$ j) k. B* ~
//XCR
) f- i/ W7 ]0 y0 K# t* Z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# R- C" @1 X4 X
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: l6 C' D7 R0 p# C7 b+ x! F* P$ ? temp = 0x00440040;# T5 e& H* K: b8 Z4 z+ ]( v
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
) e. R1 V+ o, o& N temp = readl(IO_ADDRESS(XCR_ADDR));/ I2 a* G' i/ K8 L; b
printk("temp=%x\n",temp);
/ c9 t% {! m" P5 M( Q& y udelay(100);
5 `" b( ^! D+ ]6 H" q; W+ ^: ` //SPCR Register
/ r# B; @- g& C$ G8 [& l5 P# i9 ` //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) c& q. M% P# i9 C+ K
temp = 0x03C10001; //DLB = 0 VS DLB = 1
" v7 b7 T$ d" ]/ i4 N0 P writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
3 R8 N/ P/ a( D temp = readl(IO_ADDRESS(SPCR_ADDR));
& s( a7 _" e X8 s9 D" ^ printk("temp=%x\n",temp);
" L8 ]& i" }* z2 Z3 f- a udelay(100);
. }. g( ^; v8 j6 \2 S* T( O3 c4 ? g* m2 ]% A- _
//set GPIO direction
: c* U% M0 ~ V9 W. E temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: `+ w% K0 @5 i temp = temp | 0x00000100;//EPR----input% a3 K' L; a( E8 W% F* r
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 g- s9 i5 s/ d% b' |* z9 s
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 e5 T* w" b4 I9 s1 D
/ g. x! G" ~. q; |( O7 ` return 0;% T0 M' u# E* G3 U% `' }& `2 v
}
4 i( s- g% G! T8 gstatic void __exit MCBSP_exit(void)4 U! o8 N6 P0 k, z( }- ~( a+ ]' E p
{6 z- q6 Y* W+ i& t
printk("mcbsp chrdev exit!\n");4 ]- p! x( c9 }/ @/ Y2 M2 p. O5 ]4 \
cdev_del(mcbsp_cdev);
& ?8 n2 a, G# y unregister_chrdev_region(mcbsp_dev,count);
, I& p: ]& m8 R device_destroy(mcbsp_class,mcbsp_dev);% e9 [9 f+ p2 P; G$ N4 _: ]3 N
class_destroy(mcbsp_class); D$ ^+ l6 ]7 w+ R7 {4 t' k, W
}
. I/ W$ s. a$ x; H% o# \module_init(MCBSP_init);, K$ g4 N" {! f! h
module_exit(MCBSP_exit);
' J6 a# t+ U8 U( U1 N/ P6 `& q/ @/ R( M
MODULE_LICENSE("GPL");
" d4 m' j" i9 k& r6 r3 U; P/ [5 Z* ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" O! l/ V, }7 T我的应用层的测试程序如下
' |( o- r5 p ~" U# `; B: ]#include <stdio.h>
( e% o. |3 | ~* p$ J' _#include <string.h>
% T( Z# }1 ?3 Y#include <fcntl.h>0 p" W% K6 L5 C* O( J
#include <unistd.h>* Z4 Q5 c. Z: V( u! ~
#include <signal.h>
% |6 u' D3 I" F4 m#include <pthread.h> //线程
Z q+ n* j" p7 G! ]) M#include <stdlib.h>
% q+ C" G- C1 N6 @#include <pcap.h> //捕获网口数据
5 S. E% V1 Y$ c) q#include <semaphore.h> //信号
+ I1 M5 V5 j- O3 Z( E: W9 `#include <sys/types.h> //消息对列
2 G9 O$ }* p* V$ H8 K: M#include <sys/ipc.h> //消息队列
6 z8 ~- F' V- S5 e& w. @+ K#include <sys/msg.h> //消息队列
3 B$ X L# `+ t$ j( Z#include <sys/select.h>
' G5 \+ q$ N* K" R* r3 q#include <sys/syscall.h>
) e+ P4 U/ b0 X+ O5 i4 E- O C: ^#include <sys/stat.h>% F: p. O: Z! h, ?/ v
#include <sys/mman.h>
" Y# U: Z: `, N" \% k#define msleep(x) usleep(1000*x)3 X! h U) w) m' g. t. D
$ A. n0 `+ U6 a% Eint main()
) J; R, P' w5 g2 e l x4 T& T5 a{ + F ]# D Y$ N, A
//MCBSP,ARM与AMBE2000交互设备3 @' @5 ~5 p9 I/ y7 o
int fd;
* Q) t& j* y2 `$ e' F unsigned short data_write = 0x5555;
, r! P. R5 \+ q& D4 l unsigned short data_read = 0x00;
% ~# Y% M7 G! e1 h6 s fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 n: h1 O# l H1 F+ j
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" I+ r& M" w8 J9 Y0 V$ z
6 n" Z1 I w, T; R3 b# b7 w if(fd < 0)
, Y! \% ?" Z8 Z/ Z {
2 |1 I- V- a1 Z V perror("open failed\n");- W+ r; s1 L% }* e
return -1;
0 w0 ^: X4 K0 e }
. G6 f# d* n. m7 f) d6 \ 0 I- u! l { j! @
while(1)* p3 L, z$ Q& _
{
7 G: l: g& Y' V5 n 1 q" q( t+ V2 Z8 \) ?4 {+ w; R$ ?+ L7 S
//AMBE2000每次读写是24个字为一帧$ v3 x9 j5 M9 L
//写数据时将数据在底层存储起来,等到中断的时候再发送
6 S% m9 v+ g) L+ x" O( A //AMBE2000输入数据是以0x13EC开头的% j! s9 R$ X6 U' d
write(fd,&data_write,sizeof(unsigned short));# M- p3 M- z% i( ~ X
! ]) e3 q4 S/ d. k; |& | //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ! q' `1 }9 ?9 y% ?
read(fd,&data_read,sizeof(unsigned short));3 M: v* V) X }/ r8 q, f
! @; b0 v5 ]# E/ U) V- E8 n: U
if(data_read == 0x13Ec)
; a+ m- {! p" Z8 i {
* ]( G6 r; O1 o$ G * T: m+ Y& m$ I, x
printf("data_read = %x\n",data_read);
1 f' ~5 C( y( |, I0 Y }
* }1 h" b; }5 s
9 h# S# N! o; e F, j msleep(10);7 U |( U9 }9 s
# N# p# R, D6 ^/ e3 J1 d
/*
2 o% ^# C* ~8 a" M ioctl(fd,1); 1 ]. J! h* z) Z+ a
sleep(1);8 E) |3 Q- Q/ J: y9 N
ioctl(fd,0);# Y( u" n5 ?* K3 n* M
sleep(1);
_# ~6 ]5 W: ]4 L$ f; H" ` */ 6 |% w5 a; q4 T9 S3 G# x% q
} - i9 p ?$ G4 o- _% t
return 0;! \& Q9 i. I s7 \1 i( h/ K
1 I& G% V; H' `+ Z0 |/ a
}
0 A; ~" B8 l7 R0 v3 p4 k" \) C# |/ T0 O0 R) ^
多谢各位指教,谢谢! 急
3 @4 j! |5 q$ r: n. _$ o K" J: c8 l8 D4 d) Y
0 @/ _% S! K! c5 G( H
) ^+ J0 e; F/ a
" \% Y0 k" z+ V) r/ Y! k4 y
. n/ j: D1 v& `9 k* T |
|