|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * y# _. a# I! m% P& A G
/*
7 |, z2 x: B% `, D$ P) i% R% b: h * Copyright (C) 2009 Texas Instruments Inc
8 n" `2 X- ^! k: C% U' G6 h *3 i* A7 x: g& n Y& i1 q5 |
* This program is free software; you can redistribute it and/or modify8 ^! D; c# \7 b- T5 c" z1 }
* it under the terms of the GNU General Public License as published by
0 v7 r0 \5 R& b' b! S# b8 v |% q * the Free Software Foundation; either version 2 of the License, or
" |- G% H# G/ ? * (at your option)any later version.
2 n- B Y, c6 U0 V *
) M) N9 P, q; ~- G8 c' Z * This program is distributed in the hope that it will be useful,
: s' t5 c i& p * but WITHOUT ANY WARRANTY; without even the implied warranty of
5 I% _7 S; U6 E+ Z7 o * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( l" N; n% {/ C# S/ b. a9 h * GNU General Public License for more details.
( C9 y4 {3 a2 j( y5 N *2 i! G* h" ^1 z
* You should have received a copy of the GNU General Public License
$ a$ M" \# K6 m4 \ t- H3 L/ n * along with this program; if not, write to the Free Software
9 Y; I: G7 a8 f$ L; j& ? * Foundati0 q- n& a/ m H/ W4 y/ F5 I3 T- m/ {
*/1 ?8 T% c" G6 i+ E5 z) |( w
#include <linux/module.h>
8 y e( C0 r# }1 ], ~1 Y#include <linux/init.h>
$ y/ r. D1 m: F0 ^ e& a- }#include <linux/errno.h>
' X8 t4 S. I5 g/ B- E7 [#include <linux/types.h>( _1 y- ]9 s5 C* Q2 y# Z
#include <linux/interrupt.h>8 L ^4 C6 q2 H( }
#include <linux/io.h>$ D# H3 M8 M1 C4 N* ]" x" L* W
#include <linux/sysctl.h>3 [8 r# a" ^! w
#include <linux/mm.h>" y: Y5 W5 w$ d0 s
#include <linux/delay.h> g$ e3 Y8 \* e! k
#include<linux/kernel.h>
# P2 E8 k- x* y; v; s#include<linux/fs.h>' ^: g2 C! ~0 A9 W3 ^$ [
#include<linux/ioctl.h>$ i, F3 |- U B, J" J8 M
#include<linux/cdev.h>
! ]8 Y9 l* ]6 e0 f- ]4 k#include<linux/kdev_t.h>
' ^ a( w: ?. d4 Q- I#include<linux/gpio.h>$ x& L1 r7 y) b+ \
#include <mach/hardware.h>8 f' s. F/ @5 K. D/ y+ g
#include <mach/irqs.h>) N, w$ l, i) z+ j: f* a& \
2 O: @' w) l( C) {7 B5 o1 ^#include <asm/mach-types.h>0 t* d& m1 s. \5 f+ N, g8 Y6 Q
#include <asm/mach/arch.h>
/ A# {( V, [# n8 T#include <mach/da8xx.h>
8 Z9 G0 t! o+ e i4 p. x#define SYSCFG_BASE 0x01c140004 L e* G& n, g
#define PINMUX1_OFFSET 0x124
, l3 ?$ N& n+ Q" K#define PINMUX18_OFFSET 0x168
+ P4 M, S8 [8 P U" B6 Q4 k& @7 f#define PINMUX19_OFFSET 0x16c) N% l1 L6 `2 T3 N5 G9 u
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR; I G; @" O. a" k& i
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
' e: y4 J$ z0 R' a# S#define XCR_ADDR 0x01D11010 //MCBSP1_XCR2 ?' ?% ?' Q. r L, k |1 ~0 R
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
& M6 r8 {/ z. t* `) p#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' F+ u0 J+ f4 L2 H 6 J& P0 d$ j; D2 I" n4 b9 h' w4 U# B
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
9 Z& q8 O5 G0 @4 s6 Q/ R#define DRR_ADDR 0x01D11000 //MCBSP1_DRR% [( N0 \/ a2 R% F! [# o
//PSC& r8 t5 ^9 S- S6 x+ A3 g" ]' {% |
#define PTCMD_ADDR 0x01E27120
4 C) D/ c1 c5 | |#define MDCTL15_ADDR 0x01E27A3C
9 _4 p4 }! N% Y- o) N, W1 l#define PDCTL1_ADDR 0x01E27304+ K# |% H- n! f- g8 ~/ N
//GPIO8 direction
- E' [+ ~; X$ g. v; X#define GPIO8_DIRECT 0x01E260B0
$ R1 u" {- f. O#define GPIO8_OUT 0x01E260B4
/ M2 P3 g- R' {( q#define GPIO8_IN 0x01E260C0
6 [4 v/ v$ N+ j* T+ s0 k# } z) b' L- N R$ ?9 R
//#define MCBSP1_RINT 99
- U' A% i3 d" z0 x( v1 k( I/ C//#define MCBSP1_XINT 100
1 h; s' T$ u$ |0 I4 Zstatic int MCBSP_MAJOR=239;
) U) E6 \3 ^ R' a; qstatic int MCBSP_MINOR=0;
% F3 g: F" b4 H4 y* {6 Sstatic int count =1;
1 D8 ]5 R' }* q$ S5 d; N$ V: a6 o8 ^& y1 C: ~3 k" Y( v. X
#define MCBSP_NAME "MCBSP-device"
/ G- w( ?# v1 m7 A1 c S9 F6 ]1 F% D- B+ F9 k
static struct cdev *mcbsp_cdev;5 n. c) K: k: |$ }% }
static struct class *mcbsp_class;, J( q0 W; f% p: e- K8 Y
static dev_t mcbsp_dev;' Z. ]+ s5 J/ o, r
unsigned int DRR_data;% v2 ~4 m* `. d0 e( A
unsigned int DXR_data;- \0 l' o% u- i( ] o, c* b; x
static int mcbsp_open(struct inode *inode,struct file *file)4 I. ?0 V( E7 X3 ]3 v
{/ w+ a i# H6 v4 T
- j4 b. b6 k" Q3 u9 h# e
//interrupt enable,initialized+ t4 |2 T* b" a5 i# s Q. a# a
unsigned int temp;
. P( T# E* g2 M2 ]* y/ C6 a, U //SLEEP_EN(GPIO8[10])---0
& s$ ]; C$ V( x( o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 d3 I" Q% Z8 v9 e) Q' |. _! Q5 k/ W
temp=temp&(~0x00000400); ~8 s4 m9 Q* {- E! l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 e# y( a+ P( k& w: F1 ]
//RESETn(GPIO8[8])----0----1
% Z( e8 b/ q' J* F temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 o6 o# T" ?0 f8 b) A, g
temp=temp&(~0x00000100); s) V( n7 w( c: n2 s) w
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
' N/ C0 z1 E( @ c8 T7 q" [ udelay(100);
+ ~, m A& Y3 Z8 j! i temp=temp| 0x00000100;
) ^5 L( G5 u# o% i2 N- R* l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 @1 `8 B L7 N8 U# G
udelay(100);
) O( t# n/ M) j printk("open success!\n");0 o. o! b) N7 d1 F
return 0;
6 i9 N' C' o4 i7 J2 p7 T" G}( R0 \: R$ y% c9 `6 V5 X
) Z' \, B9 v1 @- Nstatic int mcbsp_release(struct inode *inode,struct file *file), q3 ], `( Y/ q. `! _, z
{
5 F. W8 m. I. d% I' u printk("release success!\n");
4 v# e" Z0 `& `5 w) M- F" s return 0;& t7 v& ]. D9 O' C& b1 n
}$ f1 f% r3 w8 ^" d5 i+ J, V
2 a4 T1 k7 ~( i, B1 D3 x; u6 g2 fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 Z3 |+ Y( s4 U! f, y6 K, F5 I{4 t% ~% ` f+ }8 V
copy_from_user(&DXR_data,buf,len);
* j+ K' V5 u' d( l% X! A iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# c/ S) L# b2 d2 a+ j% U6 H return 0;
/ F% W8 K' M$ k0 e
6 C: P6 x) t, T, b7 z}
2 W. P1 I! {& R8 K! `0 k* n: o3 |" d ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: C9 s% S' \0 y/ m4 }{
7 K& f# ]4 c: x$ K! c DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
$ Q7 K7 j( b0 |2 M copy_to_user(buf,&DRR_data,len); ( i! g0 V7 B O3 |7 |4 o
return 0;
1 {3 f1 u4 l( H; W! L4 }}" c8 W: ^( p4 b5 L3 w
8 x7 y8 X7 W$ T: W5 I* m
! p4 y$ S9 e& u" lstatic struct file_operations mcbsp_fops=# J9 v) A' Y' Q
{
# r2 i" R2 R+ o! c H9 F .owner=THIS_MODULE,5 F. R. L4 t, ~% K
.open=mcbsp_open,3 ?0 i: ~5 z3 V' W, E& b7 Y
.release=mcbsp_release,- Q* S5 h: y0 O
.write=mcbsp_write,0 k, q- r( y3 @# C. \
.read=mcbsp_read,! S# G7 H/ @' g# R/ K }
};2 a1 ?- m2 C5 A; U6 U3 p
static int __init MCBSP_init(void): |- q7 I# Q d s* L: ~& d
{' V1 C0 b }5 Y4 I2 [/ w3 {2 x
int ret;
+ j/ e$ N1 |8 m0 f unsigned int PINMUX1_REG_old;
- _9 D5 M* H* u+ s7 ` unsigned int PINMUX18_REG_old;
' ^: I! {# i9 m. j" _ unsigned int PINMUX19_REG_old;
: p/ y9 H! @/ M& f" o unsigned int temp;
3 U, q5 n2 P7 ]7 l9 f if(MCBSP_MAJOR)
( u. M& H# Z( t; r% k {! r$ W) P( W' z8 D; u) C
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 [) M9 A; S- L8 W+ Y ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) B: a, B8 T2 q0 p c
}: J# \% R# z/ r( G$ Q6 d% S
else# z% s0 l1 Z7 }! j
{6 {) n) v2 s! f: e: \7 r/ }9 Y
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 T( ]1 Z, m" R5 B5 G7 ?( ~% B; L MCBSP_MAJOR=MAJOR(mcbsp_dev);8 v, K3 ?3 G* |9 k) {! ]3 @
}8 X3 p5 y" H2 } M4 \
5 B9 t; l7 D' X: M5 y0 E if(ret<0)& U1 W3 I3 h+ u; u/ {
{" s( U# D) U* g6 _
printk(KERN_ERR "register chrdev fail!");2 D% f( Z. T/ c# k7 v8 Q9 G
return -1;( p0 G6 k. B y+ O% |
}) N: R1 ~4 l5 }+ e
2 S2 l% r8 k! c/ p mcbsp_cdev=cdev_alloc();
" h, m/ k: ^/ t4 |' }8 D! M% b/ F6 a
2 k( o2 k. t2 `9 n if(mcbsp_cdev!=NULL)
: ~6 d. d' n9 g, g$ m$ E {% T: n! S4 X ]& [$ H
cdev_init(mcbsp_cdev,&mcbsp_fops);% \- N" ?0 ]) m% k; K
mcbsp_cdev->ops=&mcbsp_fops;
6 {: g" I0 p6 @0 E; z' j. w! }0 m mcbsp_cdev->owner=THIS_MODULE;
! S' \# G) f4 _& a: {' S
2 p: U4 Y' ?6 M if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H+ Z) N: ?; U# C' w4 }# W3 |: z printk(KERN_ERR "register cdev fail!");
9 f2 `, C9 B* Y4 I% I! T else
o; Q5 _+ m! O printk(KERN_ERR "register success!\n");% s% \1 u( K! M/ j: ^. A
}0 i3 _5 A* x/ j* t
else0 v7 P) r. l" U4 C m
{
+ d: m% d1 t" {7 k: s: d8 U7 t/ u a printk(KERN_ERR "register cdev err!"); l) k* L2 T7 K5 ~* a" h
return -1;
: e( z5 L* k$ h, _- g& { }1 K. u [9 {2 j1 b1 V+ f Z0 l
( X& r( H. F# y" r. U6 F, d# |1 I mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; V7 {3 p7 V! L% K* B; j
if(IS_ERR(mcbsp_class))
' I q& T# F' n/ X( ~* m- z+ Q {
" ~" A- y0 I" r$ M1 I6 w printk(KERN_ERR "register class err!");
8 v/ D. ~+ g. _7 }3 i4 p# x return -1;
0 V. s2 ]* T" F& S }
- [& ~, R$ A+ K8 d$ z: }; i device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 W, E% v' {: Q1 _. m5 R, s0 V! ~: `& s: Y, G. A8 R/ r0 i1 T% e
//PSC1 Q% H& E3 Y) Z3 i
//add Enable MCBSP
* V) G# e4 R! L# J2 ` //test
5 O. L- |* {5 F# | temp = 0x80000003;7 e7 K; _& ^$ `; q& _
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 `) T( H3 y. E' Z8 F* m temp = 0x00000003;
' M1 F; r. E8 e$ }1 Q" S2 Q, @" K writel(temp, IO_ADDRESS(PTCMD_ADDR));' q' B4 u& F4 c/ R _1 ]& A: p7 l% b
4 v* d& Y& g* A+ J$ d7 U temp = 0x001FF201;4 |1 j- j) l# m% A. Y A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));! T' p: G; a6 Y7 H# ?" Y6 t3 \$ D
9 O, \, \% B1 y1 P% D$ t* q //PINMUX 1 v, i" j% ^6 R# G0 Y
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) }6 h- i: @# T5 s5 C7 K3 [
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); : d) o) s; E! r) s
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
' ^( ~& C# V" S writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 |+ e- D" Z0 N6 x+ M$ f
. o% Q9 `# X9 ?9 w4 U //SLEEP_EN,EPR,L138_SHK1,L138_RC, M5 o5 i$ j; P) v: t: h& ]
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ( M! t9 ]0 C% F2 F( u
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ _, S8 o# G7 [/ x- `
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- n5 g* z6 [; x
9 @3 E7 H) j$ S //RESETn,L138_SHK2
6 K3 V. c" w% x, M5 i; ` PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 T* Y6 X' m( a' b) p PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
! [) n+ |5 f; Y7 w writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% Y5 ^, F( \# i- ~ b
; q3 `+ R- n) T* s 8 q! H3 J6 ~. g. y9 }
//SPCR Register- ?& w, U, r4 _0 H3 D; O, U1 i
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# I! I2 J! ] U4 _) ~$ j6 ~* R' J2 ` temp = 0x03000000;//(DLB=0) |( e0 J( H* D6 B1 `/ v8 ~
// temp = 0x03008000;//(DLB=1)
0 g0 V. k0 y7 \) V( j* O; u/ d! z writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset1 {1 \2 C" h( b( L5 L# v5 Q$ `
temp = readl(IO_ADDRESS(SPCR_ADDR));: U5 ^. t' G. D% ^/ o# e
printk("temp=%x\n",temp);" V" l3 v3 M/ H- ]6 A# M0 e
8 r- k! a; {( K( c2 M1 I3 m //PCR Register' ?1 [2 x; R, O5 k% O( R i5 W
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
" ~; N9 C! W4 B& W- q2 H // temp = 0x00000F0F;
9 w3 ?) K9 w, Y$ Z$ M5 V temp = 0x00000B0F;
! t, O8 ^9 A- @+ d writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) T8 u- I$ k# \% ^
temp = readl(IO_ADDRESS(PCR_ADDR));
$ E/ m1 U5 {) O4 ? printk("temp=%x\n",temp);
+ P6 O( Y% ]9 V O$ G/ O! N3 t: u4 X //SRGR Register2 T( S; u0 G7 `/ w- {) f
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- Y& X7 P! W+ {# w //temp = 0x301F000B;
6 }4 W6 T9 e7 q8 A& j. h/ X writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
: ^+ g4 D* K; S3 x, o: x9 N temp = readl(IO_ADDRESS(SRGR_ADDR));& @$ w9 Y V* i0 T4 w! }; P% p
printk("temp=%x\n",temp);
6 B4 b/ |, e' Y: n //RCR
# w J0 @' g) e% V, V4 ~ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ _$ C) i: l$ d4 Q/ f* z' d
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0) X7 D! M; v( m3 C |3 q8 ~
temp = 0x00440040;
: O0 q9 n- }. A5 D" S writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 G7 ^3 E6 }( C8 D
temp = readl(IO_ADDRESS(RCR_ADDR)); d6 B+ F) t" }3 H) W
printk("temp=%x\n",temp);9 }0 [4 q) ^! ?
//XCR
6 e, p/ ?7 d# K" m; ?! J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; x1 @7 g4 N ^( X \
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* e8 ^6 ]' u4 F temp = 0x00440040;2 h. Y3 ]2 I# K* n. a
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
* W9 v& N6 b/ \' a0 f2 N( W, l) h temp = readl(IO_ADDRESS(XCR_ADDR));! U0 a G9 W0 A$ \- F4 Z7 d7 d
printk("temp=%x\n",temp);
1 K7 x0 M' {0 `: E7 i" x- { udelay(100);) _5 c" x2 a4 P5 ~) l
//SPCR Register
. E! H. f" \) U1 u4 b8 B //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" \/ r/ g4 z5 {" Z$ f/ e temp = 0x03C10001; //DLB = 0 VS DLB = 1
: S2 c8 x" v1 P7 M0 M( v- C writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 m. |2 O2 f- {: ]& V7 _" S temp = readl(IO_ADDRESS(SPCR_ADDR));
! A+ I7 W# L2 _ printk("temp=%x\n",temp);, G f- s8 J9 X6 l
udelay(100);
3 M9 E3 P* r3 C4 w0 g9 W2 I0 S0 w4 G! J
//set GPIO direction9 P. j! F' p* O1 k8 h
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( `! a M9 A6 g. ^* S2 h H temp = temp | 0x00000100;//EPR----input
# b1 T/ ^/ m4 A% s G/ V: c$ ^ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) O" x6 L4 Z* e+ b2 l( L5 _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& r% C% M$ k ~
: U, m5 ^# U. m, J& D5 V return 0;
4 Q, ?2 t( g$ h; U}
( S: D' G( d8 W9 @' vstatic void __exit MCBSP_exit(void)5 P3 O; ~3 u. \+ \" p! z+ d
{
( W+ J6 Z- t' z$ a7 ]5 W printk("mcbsp chrdev exit!\n");
% u0 R1 s. K( x) ^ cdev_del(mcbsp_cdev);
( f6 d6 y D' y; i6 l unregister_chrdev_region(mcbsp_dev,count);/ O) P- F5 j, K9 A4 t; Q
device_destroy(mcbsp_class,mcbsp_dev);
7 `0 t+ O6 P+ p1 R6 P class_destroy(mcbsp_class);
) n+ f ~0 w$ e) I- Q}
+ F/ y: I& t7 W/ \' }5 M. [/ Vmodule_init(MCBSP_init);
. ]1 Y# u- E- Q, o* s- j% _5 \module_exit(MCBSP_exit);
/ b z: E# O J7 v# m d! i, _/ N0 `+ Z6 `, j% S1 \' y; G- `( a
MODULE_LICENSE("GPL");0 s U. I- Q9 r. `# ^2 }" \2 f
3 a6 O# f" p5 x- |# w
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。( f1 r. ]2 k: B1 \; J" N6 C- E
我的应用层的测试程序如下
& R. X9 V! p/ ?- y' @#include <stdio.h>
5 w6 t. T! t6 E: }#include <string.h> e! [2 k, i4 r+ @6 Z
#include <fcntl.h>
0 \1 U4 |/ n* R% E- U8 j; [#include <unistd.h>; `- o4 Z2 D: e9 {/ [6 R
#include <signal.h>
: l3 p9 C1 L: w0 q8 l+ A% i#include <pthread.h> //线程. R4 W3 S( v; b" T" m# d
#include <stdlib.h>. s9 l K7 r4 h0 x" S' o1 J
#include <pcap.h> //捕获网口数据
! L; s9 ?7 ^; V) v8 \* W#include <semaphore.h> //信号
. F9 A; m4 p* ~, B4 ?# X#include <sys/types.h> //消息对列& j7 |+ T- S3 E) E; w4 t; }
#include <sys/ipc.h> //消息队列8 C+ G: M$ v" O# L! D, e* s
#include <sys/msg.h> //消息队列
( {4 {- l) A8 `' o# {/ q# U#include <sys/select.h>% ]2 c( `1 `0 B# i5 W* q- A& y6 o
#include <sys/syscall.h>
1 p+ z: o. ?2 h/ p#include <sys/stat.h>
+ p, ^' C6 |1 ]#include <sys/mman.h>
1 j6 Y2 q3 T' U( @; @8 ^8 o#define msleep(x) usleep(1000*x)
: ?; ~' a$ J- e: H* H7 H( i9 B
) J3 Z3 e1 U3 a+ C* d) I5 J/ B' p% ?int main()
) l5 q" e- w: y: I{
4 J, C0 C, _2 [1 y' R1 Z4 \3 h //MCBSP,ARM与AMBE2000交互设备
: o) y' z1 r* a5 T/ _6 Z0 w int fd;# e; b E @3 ~9 F6 b2 F9 h
unsigned short data_write = 0x5555;
% t1 ?! E- S5 ^: D% z unsigned short data_read = 0x00;
, u+ }( G5 C* f8 j# C& n/ u8 @ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& v/ D) B& e: r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 P& a) U- Q: v o/ _; Z2 Z+ |
2 ^ q; d6 |! c if(fd < 0)" \) U- \, M# e8 T9 L
{
) W8 u2 H* q1 L0 R! ] perror("open failed\n");, \) w! j1 S }2 V; H
return -1;
9 v4 P1 q/ L# s2 l! L6 g }3 S4 b) N5 j+ s- P
3 k# r# }1 l. |. ], B3 c
while(1)
/ E: u9 F6 y( D* \3 E {2 ?1 r& Z }; H0 M1 n- r
# o; d# O' |1 q" ?& ~ //AMBE2000每次读写是24个字为一帧
4 {! D! w* a( B& z4 R //写数据时将数据在底层存储起来,等到中断的时候再发送9 i0 s1 ^; m3 V3 b3 `
//AMBE2000输入数据是以0x13EC开头的
5 [1 q( N6 A2 M2 B write(fd,&data_write,sizeof(unsigned short));6 C: {1 B8 a8 s
; f N1 V' _9 }+ L" b# h
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
1 f- G5 d' X$ @$ A9 O read(fd,&data_read,sizeof(unsigned short));" a$ o" x( e+ S: {. w3 z
6 x1 G$ W) b+ Q1 d9 ^' L) ^ if(data_read == 0x13Ec)9 a- i' S( G1 `
{
# ?: A/ _. S+ }/ o/ c; Q n5 `
- j j) l4 L! }. E: ~ printf("data_read = %x\n",data_read);3 _. N3 K* T1 S4 ]9 A
} l; H2 ]! E+ M9 f+ ?) y: h7 }
/ M4 _# B: ^. ~- ]8 q: ?2 V8 |; ?( L7 n
msleep(10);
! |# F& f0 q1 B8 K P) p * N4 T4 W9 ^; [
/*
4 i/ j, V! u4 G ioctl(fd,1); ; I- P p) W- A A) z' l
sleep(1);
! P* {- y# C4 u ioctl(fd,0);
/ Y5 Y) s8 K2 ?) p `3 d. B sleep(1);
) L& G& L5 N, ~# G9 T */
# U/ E K$ {; v; T1 v }
6 i/ |/ T+ j2 k: g$ Y return 0;
3 u5 M% K, F. D# R/ P 8 d5 \8 h: m% n% `) h- k
}
3 t4 T! c9 N% i' q/ p, E+ V" ~/ ~5 E
) Q! }# [7 s- V# q+ B多谢各位指教,谢谢! 急
9 L9 r1 n* Z) }, V2 Z2 m$ _+ p: }, z& s+ p! W
7 ^' Z3 G C r. N( {& z( B! |# h
* v+ A0 j8 p: K9 ~
% J$ A! K9 b& z1 q h |
|