|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' s6 d8 d O# X/ R
/*
2 u; G7 ]! h; W. {! z& r% f( M9 @ * Copyright (C) 2009 Texas Instruments Inc6 l" P; O1 M1 o7 K2 U4 O
*
: k& E8 _% s1 ?( @6 f" a1 f2 A _ * This program is free software; you can redistribute it and/or modify
) W5 n# l5 g. s+ B5 M9 ~3 C0 g * it under the terms of the GNU General Public License as published by! B( H7 ]# c. C& U3 x' U- Q
* the Free Software Foundation; either version 2 of the License, or
4 X+ H7 g0 K1 Z3 f' `5 ]9 y * (at your option)any later version.
% y+ |1 z# H" |9 k! I+ e) a *4 C9 F- {! p8 I" d/ f2 n
* This program is distributed in the hope that it will be useful,( n$ f- p6 A* u7 w* b
* but WITHOUT ANY WARRANTY; without even the implied warranty of+ _0 F* y$ X$ P
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- {. l4 `* `9 z8 i
* GNU General Public License for more details.
! i$ b- G Q; f5 r1 l. t) V0 n *' N# M) i. F: M/ b+ B
* You should have received a copy of the GNU General Public License; I7 x: | r9 K" d
* along with this program; if not, write to the Free Software
) t: a' Q7 a& A8 Z8 ^( _2 @0 [; ^ * Foundati# @7 q$ }9 k2 H9 r `( A5 ] u) s q
*/
" g! J l- F9 k ~7 y4 k* H1 R#include <linux/module.h>$ m% X5 l" S+ w* @
#include <linux/init.h>0 J) P! U, C+ C7 D, S( O }0 ~
#include <linux/errno.h>
6 H* X4 I* p: J2 T9 v#include <linux/types.h>
3 M# y; _1 p @# X4 y#include <linux/interrupt.h>
: O/ L- k2 w/ [' Y/ ]4 j# R#include <linux/io.h>: n$ Z. L2 C. U
#include <linux/sysctl.h>
* G. s" O. R7 `6 m N3 A#include <linux/mm.h>
+ }9 E2 J) L! }* q2 G#include <linux/delay.h>/ |' }, _6 V& k% a0 P' }
#include<linux/kernel.h>* T: b6 X. `$ P8 B7 o
#include<linux/fs.h>2 V) P( ~# A4 @, Z
#include<linux/ioctl.h>$ x1 B4 x! t# Q5 S& M- e0 h/ ]
#include<linux/cdev.h>: ]( k0 d3 B& N. ], D
#include<linux/kdev_t.h>
. `0 O; [* y P4 f, E3 P, Z' d#include<linux/gpio.h>
1 y' h" h" |. D" g#include <mach/hardware.h>
( e, G t4 J- E% b% H6 ~* K( Y#include <mach/irqs.h>
N3 o/ N, o" E! Z' Z; r7 ^0 V+ T% E- b& W& j/ h9 J6 P
#include <asm/mach-types.h>
" H' V& W0 {- X5 }0 p" I; c# [/ f! v#include <asm/mach/arch.h>0 I, r. K( x) c& j+ y) ~
#include <mach/da8xx.h>
% W+ b: O* U0 a- S+ _! I#define SYSCFG_BASE 0x01c14000
9 z, P* Z& @; E5 Y3 [( n. ~( I) `: @#define PINMUX1_OFFSET 0x124 _0 _4 b# ~, y$ x
#define PINMUX18_OFFSET 0x168
( [. g, g9 t2 i- | D" S#define PINMUX19_OFFSET 0x16c: P4 k2 C; T- w- z9 G2 M1 L
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
( O7 z* I, s" O. b#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 v% F# {& @: q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
( F; Q9 A0 f! P9 N: B& Q2 j#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
( v! z* g9 ~ y+ {9 j9 i o7 y#define PCR_ADDR 0x01D11024 //MCBSP1_PCR5 n7 E$ R3 k7 u4 c8 C+ A/ L1 p. t
' N* O: z9 p6 A+ V) x5 M
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR; @' N2 B5 D4 a# @+ I
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 o$ P0 r" q p2 r4 m. s5 H//PSC$ E+ z- l9 H$ `( d
#define PTCMD_ADDR 0x01E27120 % |6 s) @& L" M u& {' C/ m
#define MDCTL15_ADDR 0x01E27A3C
2 O, p* Y$ b" O9 R#define PDCTL1_ADDR 0x01E27304
! q: I2 N+ u2 R6 }2 {% T//GPIO8 direction
- {: y1 b. k) ]' a2 ~4 S# Y#define GPIO8_DIRECT 0x01E260B0 n% r; `; M# x# a# l" G# W
#define GPIO8_OUT 0x01E260B4
# x; v9 J1 M" o3 O" W9 e#define GPIO8_IN 0x01E260C0
* Q3 Z: |# M' K& A. M
) x+ ]' u4 f) J1 x& Z6 A//#define MCBSP1_RINT 99
# x- ~0 P' A2 h4 d+ r//#define MCBSP1_XINT 100 % T4 ?9 i' c. m
static int MCBSP_MAJOR=239;: ^- ~5 J! \6 Q: T0 {
static int MCBSP_MINOR=0;, o a N; G! p2 T0 E( G$ P8 p
static int count =1;* h4 F* o$ z5 X6 e& S& p# X) O
$ v1 B2 Q" N( e+ K
#define MCBSP_NAME "MCBSP-device"% u/ z+ c b8 r( ]( F+ l
9 E/ }2 l6 B- N, ]- Estatic struct cdev *mcbsp_cdev;1 W l. T% h1 ]$ N# L
static struct class *mcbsp_class;) |2 ~% T* L7 C: A
static dev_t mcbsp_dev;5 k- Z5 n3 m- @
unsigned int DRR_data;
- K% S: K% j9 aunsigned int DXR_data;3 I: M/ r4 O. E
static int mcbsp_open(struct inode *inode,struct file *file)
" U2 X0 {. ]1 I' l0 @ h3 K2 `{
" h1 x4 [! D+ C5 L
1 e V8 p# i! F) B7 m" D: k //interrupt enable,initialized
0 R( _, A% s# P! c/ y unsigned int temp;
/ Z9 T. T2 }$ |) r% E$ x" @ //SLEEP_EN(GPIO8[10])---0
! j- u- u7 |6 {; _$ V temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 E5 \! m" Q0 v x$ l* A z- W
temp=temp&(~0x00000400);4 N1 h |( T$ u* p; M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 R) w% w- `. v7 b0 a; z
//RESETn(GPIO8[8])----0----1
m: R8 v4 D' j# B+ Z. f! O* c" Y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# H+ P5 \ _" }$ P
temp=temp&(~0x00000100);
7 { G% g" w4 w5 M2 k1 P/ g0 q8 v( ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. b( E+ _" D& \* O9 d; _1 B udelay(100);! p, _0 u. G) O+ C' I( A
temp=temp| 0x00000100;: X0 t9 H' ~- Q, S _ y' ^1 h
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' R0 X0 z2 k5 x udelay(100);
% A& O5 V- ]0 p' a9 d printk("open success!\n");
* Q1 b+ {" b* O) c return 0;' D/ r% @7 @) K- C- {3 L
}
h5 n; M+ A7 D/ v$ q5 g
: ?& n7 i8 W: d+ K* O' F5 q8 jstatic int mcbsp_release(struct inode *inode,struct file *file)% @6 {4 Y% S/ O$ x/ q
{
7 |5 O& O2 l& J8 J3 ^; T printk("release success!\n");
& V5 Z7 P. z2 O1 y return 0;5 H3 J9 C( Z0 b& ~7 R. {
}% N5 c I: q3 W7 I
; g3 H# N5 s+ y) E3 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 f/ Z: d7 y% {; c; N! x' R# w
{
j- o, j# h% ~/ ] copy_from_user(&DXR_data,buf,len);
! e7 o! m7 m* f4 D2 [ iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); & A% S$ c2 p( X
return 0;
7 m3 ~( i9 ~4 X; O6 O1 L ' h8 m2 Q" v6 g( c
}
0 u. f- Z4 o5 {) Z" y9 J# R- |1 E
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 A: K7 p1 v# J; v{
n" @2 s* u4 ^ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# ?7 ~7 H" D. }8 r* n copy_to_user(buf,&DRR_data,len);
( v8 p: ~! A8 ^2 k- d9 b. Q return 0;
, @5 Y: ^! A& o' r7 U. \}! U; k( ]. h5 `
+ x3 h& q9 Y& G" C( I" L% R1 c
9 k5 r! \* [3 qstatic struct file_operations mcbsp_fops=
5 v7 m, a3 Y- Y! s& _, W% I9 \8 l{* V# v* j8 s q; s
.owner=THIS_MODULE,2 b+ P2 [% R5 l5 O) g
.open=mcbsp_open,; `) s# B: z J
.release=mcbsp_release,% t0 U/ B1 V j7 h* V
.write=mcbsp_write,9 n1 R( u) u0 G" m
.read=mcbsp_read,5 s3 h) c6 H1 r1 u' l& \) i9 `# s
};0 _4 N* j% \5 n* b3 r V+ k
static int __init MCBSP_init(void)- s" x6 i/ x' [: `! w: Y
{
% Q/ U- P7 X* I int ret;/ `5 U% l$ n7 D T( W% k
unsigned int PINMUX1_REG_old;
4 {; a. T+ o; j! S& t; i( x4 A4 {! b unsigned int PINMUX18_REG_old;. ]9 x$ k7 l6 b& U
unsigned int PINMUX19_REG_old;! X$ A) G! m" T) u/ r6 R
unsigned int temp;
- _1 R# _& U1 [: @+ y if(MCBSP_MAJOR)5 C% T3 P# S% a* @& W
{
* h/ O& I8 K: }& }4 c/ J mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& }2 M1 W$ c% a) S3 u0 p
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 g& e- R7 {1 u2 @
}
; K8 y" i# w+ q$ ^3 F0 I6 X+ Z else
$ Q& K" n8 V H& D! K6 v+ M6 E {) S N, ~3 l* \. B7 \
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 N' N9 E# ^* \
MCBSP_MAJOR=MAJOR(mcbsp_dev);
, u5 b7 C2 e% n& B+ a" w& i }/ v4 O: T! |* q7 d( b# q
# T0 {: @" D1 `+ G/ Z if(ret<0)
% K- m6 X" Q6 j- K {
8 O7 G2 G: Y; K1 ]/ B- t% S: H' [ printk(KERN_ERR "register chrdev fail!");
! Q" e" G* ^- }6 Z. B& B return -1;, N1 O! a5 V$ C: U; C' K
}: i$ N4 D, S2 E) G% I* U: e. g
3 n$ F" }1 t- @3 S( [1 j, |
mcbsp_cdev=cdev_alloc();# ~: p, _, w% e D% t
2 C& C l/ o2 L: I% V6 K if(mcbsp_cdev!=NULL)
! R4 x" \" ]% L, k {
9 B( O4 w2 {9 U0 T- ^) X cdev_init(mcbsp_cdev,&mcbsp_fops);$ |4 Z* C# m# P, G W
mcbsp_cdev->ops=&mcbsp_fops;2 X- K) J" U/ m2 t
mcbsp_cdev->owner=THIS_MODULE;
9 e) I6 W9 y& V& m; d$ Y% X0 E8 n
7 l4 o4 `9 |. r' s: i1 G if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% K$ c) n& @ G7 z' |
printk(KERN_ERR "register cdev fail!");
J' C" p7 }3 W- i( K6 g; W& r- E1 a else
8 ]- G4 R2 ?: x9 w }( \ printk(KERN_ERR "register success!\n");
" f+ Z& B; Z+ ^5 |. o" I }
1 n6 Y' w* y+ G/ N9 l else# h2 D8 w: K1 \, h+ G. Q
{) B$ {/ \% D; y1 u
printk(KERN_ERR "register cdev err!");( r( R, D; Y/ e8 |
return -1;/ M$ o) O3 r% g6 T- S4 L( t
}. k7 D, o) M: ^' v+ }' j& c; R! ~. R/ A
( S: Q$ w8 w6 m# k4 k
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; G) \8 p1 }, v
if(IS_ERR(mcbsp_class))
5 \; u! q0 u9 \) W. Q4 q3 G5 P a {
( v( e* j- k( k |" w6 M; g; H printk(KERN_ERR "register class err!");
6 s1 ~% b4 x v+ C5 g/ [ return -1;
. `/ N1 t4 ?: H; @% h V }2 p1 n: l5 g+ B; \1 G/ z
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 E% p$ x+ A' P9 L0 M4 y
6 E3 \9 F6 d0 |! {8 a/ O/ f' X: k2 M
//PSC6 f# J; `9 B5 |. e) X6 P
//add Enable MCBSP4 `' H+ s. z4 v* H* `- s
//test
9 ~& F) ?+ q$ I6 Z temp = 0x80000003;
) K. w, Y9 v; C1 c writel(temp, IO_ADDRESS(MDCTL15_ADDR));2 u" x% k- Q+ W* I. P4 S# r# H
temp = 0x00000003;
! n6 I5 T1 ^. m$ ~7 U* q$ U( ~ writel(temp, IO_ADDRESS(PTCMD_ADDR));, E% j! E" W# g/ C) h$ v
& W8 i5 G6 ~6 V# T8 }" U temp = 0x001FF201;
/ f) P S4 q. F writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# P$ u, |% p K+ b) N1 D b% o, I1 ?3 a! @7 U0 q* i
//PINMUX & ^* L3 v" P: E+ i! y/ L8 T. W- s' b
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 M- X; v$ W: g3 j8 p7 E. G
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); $ z V5 R$ J* Z) n1 t7 q
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ! T E1 E" X3 u; Y6 b2 R
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ O# @/ B) K/ E% n x : N9 T% k+ y# S, a2 G$ f
//SLEEP_EN,EPR,L138_SHK1,L138_RC4 i7 r4 K7 z. P, K9 z- ~
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ! S6 G' y7 z$ _3 s4 [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; l: ~; |: f. S+ G0 M) h5 g
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: e( Y l) o; w3 a8 S ' A5 B: P8 Y/ M! x; F) l& n% i- e
//RESETn,L138_SHK2
+ {& J+ e3 |# z4 d; O8 t& v& p/ w PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 1 n$ F; P7 ~. i) ?7 O- m! s
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ! x1 Y1 E, N; x
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& E- B& v* C$ r
% q$ C8 N, U1 E1 W# j3 [! X $ r' r6 X \7 m O
//SPCR Register3 ?! V9 y/ L4 f4 l# F1 |9 W8 U O
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 F+ g& E% D# @6 x5 c5 @, A
temp = 0x03000000;//(DLB=0)" n; a+ k1 i8 G& N
// temp = 0x03008000;//(DLB=1)) G2 F8 Q' f" o% F+ K) u* y; t
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset% M6 K+ d( {. |- r! O* W
temp = readl(IO_ADDRESS(SPCR_ADDR));
; [" h* m& }( ?1 k4 _+ H printk("temp=%x\n",temp);
; _+ D$ H5 x6 Y : F) |$ x9 V) z& _* F, q
//PCR Register* r% {. f4 V; L* V
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 p1 G/ `8 l5 ?( [6 \; O1 e* y
// temp = 0x00000F0F;
3 w5 o1 y( \' K5 k# @ W4 h temp = 0x00000B0F;
; J9 b. A' P9 q4 C9 T6 b# I2 N writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 S4 a' A R3 [1 J% k" x% U8 ]. \2 t temp = readl(IO_ADDRESS(PCR_ADDR));2 M* H7 \( M1 A1 ^# H# A! m% S; Z4 x
printk("temp=%x\n",temp); ' h0 z9 W5 P1 K# P2 t% D( ~% s3 i& X9 r6 M
//SRGR Register
& @, L& ^1 _' Y //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: m% V3 q9 N7 x, S# r
//temp = 0x301F000B;' W& p) _# m7 l5 ^7 ]6 h
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
# Q$ F! Q% U+ o0 m8 ?/ d/ t temp = readl(IO_ADDRESS(SRGR_ADDR));
: f- C9 ^. i- t printk("temp=%x\n",temp);
) C! `7 D: ]+ U2 w //RCR, R8 K( v* i Q) a
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 ^$ K$ c' r# S //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0) G7 n2 N3 e1 V: q Y5 P
temp = 0x00440040;
% g0 w8 a! E4 t4 H# g9 {* b writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
/ h4 n) c$ Y o temp = readl(IO_ADDRESS(RCR_ADDR));
) r1 `6 Q/ L' s printk("temp=%x\n",temp);
$ d& w) y" W0 l/ C: T5 B s //XCR
s" O9 l" R y9 t7 N: U //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; }1 `2 ?+ _, T4 Y) ?
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) P1 }" h. U+ h temp = 0x00440040;
1 p* K$ o6 J5 T* e. P. u' D& P writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : s6 \# i( k# p# f6 p* R, u
temp = readl(IO_ADDRESS(XCR_ADDR));
( y8 Y4 `6 @. Y9 _; K, I8 i! D: M8 Z printk("temp=%x\n",temp);
; M2 |, [& |) ]4 H udelay(100);
! h, b- V- A, L, I //SPCR Register
2 U3 Y5 Z3 ^8 R6 ^* t+ D) I: q //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-18 q) n6 `5 ~" V% x; h- B4 S, Y1 X3 ~
temp = 0x03C10001; //DLB = 0 VS DLB = 1- W5 m$ F5 J; J! w4 u y* v' v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 Y- p1 c" [/ O, C
temp = readl(IO_ADDRESS(SPCR_ADDR));+ T$ ^2 D* x: Z. _! K$ `/ l- m" j
printk("temp=%x\n",temp);! H% r- R2 N: M4 _2 m
udelay(100);
1 y/ J" E& ^" \$ O; X2 @2 R/ u
% R' e+ d2 M; T- }. M) T //set GPIO direction
4 R$ k. {% P0 t: \; O6 K! w temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( a# f8 `) C8 k+ _' [ temp = temp | 0x00000100;//EPR----input. A5 B( q, @* w! `6 d* H& A
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 c6 I/ q# B# B5 H* i) ~ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : G' P$ W6 R+ F% ^) z( n
! ^: }+ p' y: s/ U! [5 l
return 0;4 x3 h8 m* x* N" O7 {% u
}
1 K* ]+ F" E. u9 M L6 Mstatic void __exit MCBSP_exit(void)3 i- v5 ]7 w' E; t, c
{
! q& f. M; ~$ A printk("mcbsp chrdev exit!\n");! Q8 v9 S2 M4 Q. g5 C6 A
cdev_del(mcbsp_cdev);
! ]0 f6 K1 x4 N. g$ q( l1 i: F unregister_chrdev_region(mcbsp_dev,count);, c9 d1 S0 F3 V" P; a0 e& \, t
device_destroy(mcbsp_class,mcbsp_dev);
9 m9 e b$ x( @0 g( ? class_destroy(mcbsp_class);$ S5 n& [( O3 X; }& e/ o( V5 ?
}" u) U: \' i9 a1 ~9 T
module_init(MCBSP_init);
" b1 v) S# e( ]- Vmodule_exit(MCBSP_exit);
3 g" d3 n; w# ?) ~0 e+ b$ w. c
. o" R% }* e0 E- C3 pMODULE_LICENSE("GPL");2 [' F% {' G! V" y7 M' L+ R
. P5 |: M- g9 n- f我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 D3 K! z4 ^, K, J
我的应用层的测试程序如下( b# a1 Y. i8 Y1 {
#include <stdio.h>/ s, K5 e2 g% z% Q% A# a. A
#include <string.h>, K g! H- s& f9 {5 w1 L6 W& N) n
#include <fcntl.h>+ \0 T( Q& M3 E+ P( u: _
#include <unistd.h>
" W# F& d6 n1 H9 f' E' X; S#include <signal.h>
7 U+ e5 K( h$ ]0 k8 w* D#include <pthread.h> //线程- p; N% a# J; W5 X/ D) J* L+ q
#include <stdlib.h>
5 m9 ~* }' r( ^) s#include <pcap.h> //捕获网口数据
9 s+ I& Z& Z1 H" X- G! D2 \! M#include <semaphore.h> //信号- m# J1 t1 u& M1 N. A
#include <sys/types.h> //消息对列* a( J9 U3 ~( r3 o1 H: s; B
#include <sys/ipc.h> //消息队列
' v0 P7 h, A9 P! j" ~#include <sys/msg.h> //消息队列- H( m8 A6 E. Z3 k9 z/ ?$ l
#include <sys/select.h>( F9 B w9 s2 x, d) X1 d
#include <sys/syscall.h>
2 W7 P# U3 s Z5 l, X#include <sys/stat.h>! v8 G. d3 v' m/ m+ K
#include <sys/mman.h>8 T' x+ ~/ F+ v: H6 |% o" v
#define msleep(x) usleep(1000*x)
5 m8 x; ]' J! u! E; B
4 B( u% h) x/ `int main()
j6 C1 y E. l{
- O( b9 f( O& A3 \- e( P3 `9 w9 A //MCBSP,ARM与AMBE2000交互设备
6 J' @" A& ]7 }' Y9 G9 u2 v int fd;- s: {$ z3 ]$ h9 r8 S7 D) ^7 m: w
unsigned short data_write = 0x5555;3 D1 a3 j/ d4 W7 |# ]
unsigned short data_read = 0x00;- @4 w# A" u' ?1 e: I
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# P& ~/ x# [) _ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ F/ O: F% g5 v
# t! M8 N, }8 i/ e% Q5 V1 o
if(fd < 0)) l$ J' l% n: g A4 x. K# l- L
{; Z' q9 C1 V. i" l, Q8 D+ _
perror("open failed\n");! A5 w, ~! {' t
return -1;- e, v f' t7 w, Z5 X4 Z- Y
}6 v( `" R9 I6 O$ l9 g
8 Y9 v# u! x) e, B) t- }4 Q1 J
while(1), e6 ^' f3 Y8 E, D' H- t6 l5 Q5 C) L
{
( ^! W) v0 F O& `% \7 p1 m3 z ! Y* `( r8 T4 y# L6 s( U9 U
//AMBE2000每次读写是24个字为一帧
7 { {$ w* F) o: p7 g: r //写数据时将数据在底层存储起来,等到中断的时候再发送' K, w! D% o6 @% `3 Q' p9 m( b
//AMBE2000输入数据是以0x13EC开头的 M% R; s$ r$ W! M9 O7 Y
write(fd,&data_write,sizeof(unsigned short));
3 n1 q4 ~$ m* q( Z& L4 w; u
" p' G1 Y" Y" V1 h- V; Q' T //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
& [2 o% E$ A0 C H8 m& M read(fd,&data_read,sizeof(unsigned short));
+ U; H( X0 W+ G9 t 1 e( y" j( v% z3 u; F
if(data_read == 0x13Ec)
# l3 ]0 X, A7 @& ~7 Q% E {+ Y# O1 b& T* U# M8 Z' i
2 ~, w$ q1 x$ E3 g5 P
printf("data_read = %x\n",data_read); g3 C8 G; B+ u8 p* {5 H
}1 R3 M# t5 v. x6 a
5 N' g i v$ q/ ?% n- k0 I msleep(10);
! G& M1 l( N# t/ q N: g
: A O+ |# p# ~- I. ]. i1 ? /*
! _ C4 m9 M; V ioctl(fd,1); * U: B& ~5 O! V% e. R4 a
sleep(1);
/ U% m- U: g. O% `1 o ioctl(fd,0);; u: A5 x9 h; }% I/ B
sleep(1);
6 b# M( U- W2 g* w, c0 J+ e */ ( b) W0 K6 {4 w" m
} ; h4 s! r$ u2 [2 F, }% o
return 0;
. }3 T1 F! g" p3 z
* u. i! p' R" X, X7 L} r8 L- P) T) @* ^; H; @' W
! ~ M0 V/ e% u* R多谢各位指教,谢谢! 急, B$ C8 O( O+ m8 s( z( Z
+ N* Z3 B" Z. T
0 a( r3 [4 P. s3 Z, u$ Z, m' ?- H* ^; U7 Y2 H2 d
+ _$ ?1 u/ I: ~; e
) i3 k+ _: d+ p: v/ R |
|