|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & U; e7 ]. o+ p! J% S, W
/*
$ {5 C( `* ]: E; b * Copyright (C) 2009 Texas Instruments Inc
4 |( ~5 I2 e, E/ J- b4 {. L *
1 E% {( G( J r * This program is free software; you can redistribute it and/or modify4 a. [+ S! O3 }+ f ~4 d. ?* B
* it under the terms of the GNU General Public License as published by- ]2 E" Y( c& ^: T$ d/ G
* the Free Software Foundation; either version 2 of the License, or% v3 c4 l- p* D# F5 c
* (at your option)any later version., L% t3 z# w! `" b& k
*
8 D# T9 K2 W {6 f! @9 Q5 X! z * This program is distributed in the hope that it will be useful,; P* H% |( |) x* f1 k+ F+ K
* but WITHOUT ANY WARRANTY; without even the implied warranty of" E! E1 I# x# ~5 m
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" x0 w3 d* p8 B
* GNU General Public License for more details.- m$ y5 m1 A8 O
*, B2 d! b$ a; F% E5 q3 n: d
* You should have received a copy of the GNU General Public License, N* r* ^' W) V# R
* along with this program; if not, write to the Free Software% E' p% T# f3 q; v
* Foundati
4 C: E" [7 J8 D+ w3 D5 G0 @' O- G*/6 ^- S7 r1 P T. P5 C/ m
#include <linux/module.h>% {1 b+ Z3 M, d6 A! _
#include <linux/init.h>
. I0 d7 r' X" `3 H" j6 c- B$ L& q8 |#include <linux/errno.h>8 c7 ~/ ]/ a1 {5 t. q8 e. Q* N: c
#include <linux/types.h>
0 z' d8 o( z, f8 T3 N#include <linux/interrupt.h>
$ m3 I/ b) D+ ?+ G' x: t& p' k#include <linux/io.h>
! |4 X W: Y+ O1 E1 {& P" _#include <linux/sysctl.h>6 i. Y, C/ `7 u" s) F
#include <linux/mm.h>
# F% o+ a, ?0 J$ z6 f* H+ |3 {2 y) Z; L#include <linux/delay.h>
$ r! ~/ X/ I1 w9 h. W) K#include<linux/kernel.h>. c9 g: N+ W3 P8 p. p0 i
#include<linux/fs.h>2 S( ]) h! ]. w K% |: ?. Q( m' M2 V
#include<linux/ioctl.h>! G ^+ W0 d3 u
#include<linux/cdev.h>0 a' D+ [( @0 B2 F1 q ^
#include<linux/kdev_t.h>6 [7 B! B# y8 X2 q3 N
#include<linux/gpio.h>9 ~2 B, E; R; @, I+ N9 w" i; U- {
#include <mach/hardware.h>. K8 C2 y: v$ N
#include <mach/irqs.h>
2 w0 K- X. U: H- }& h% E* Z4 d6 k! ?1 _
#include <asm/mach-types.h>6 E+ P# G4 I: s5 b$ m
#include <asm/mach/arch.h>
2 O6 |. J3 B0 h3 J/ v#include <mach/da8xx.h>
+ y. I5 _& l: ~& t0 U#define SYSCFG_BASE 0x01c14000
; S. @6 d; [: X0 H8 u) L4 d# Z& A#define PINMUX1_OFFSET 0x124 % [2 K* R4 n4 Z' m0 d
#define PINMUX18_OFFSET 0x168
3 D) W' O4 |8 b# k$ B#define PINMUX19_OFFSET 0x16c
. f9 G( g$ k U* m#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
; v9 \) ` B* }7 a#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 D, H- G W3 \/ B c- l" o" k#define XCR_ADDR 0x01D11010 //MCBSP1_XCR. n: r; o; Y; L
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR- n1 ~& b$ l4 O5 B$ @
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
% b% ^8 H, u6 I, D6 }" }# t# w4 X$ r( l
" d' }6 F; k2 z; w. o# G#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
, Y" U3 J Z+ j: u! M' t" i, r d#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
; c$ r% j" C+ z% I; k//PSC
/ v5 @% ~- Z* K7 u" ?. ?; w5 C' f1 k#define PTCMD_ADDR 0x01E27120 4 W2 j( u5 H$ o
#define MDCTL15_ADDR 0x01E27A3C
$ K' v8 w% t( v9 L( U# ~! `#define PDCTL1_ADDR 0x01E27304
. I. k5 V! I c* @2 F//GPIO8 direction
. c; M! @/ A5 g& W0 B#define GPIO8_DIRECT 0x01E260B0; ^- t/ c# ~1 Q
#define GPIO8_OUT 0x01E260B4
! E" O' R; [) D0 {& l#define GPIO8_IN 0x01E260C00 N6 L+ Q L5 r* V6 b! l
/ `, z- U7 r- `//#define MCBSP1_RINT 99 4 G0 j' E$ k4 O u$ ~1 M9 A
//#define MCBSP1_XINT 100
2 V R1 i* ~- [# l% |static int MCBSP_MAJOR=239;8 X& x, R% d- ? S% H2 ^
static int MCBSP_MINOR=0;
3 g5 ?# o9 J( Sstatic int count =1;7 |; `+ _$ ]4 Y5 ]! m
$ Q4 b* K2 h5 ~) V3 M
#define MCBSP_NAME "MCBSP-device"
: b; `+ p5 e j) g6 X
i/ j' f* }# S( s/ |8 P+ Ostatic struct cdev *mcbsp_cdev;$ c O9 {6 I; Y) G8 F
static struct class *mcbsp_class;
; z$ G. J, k) rstatic dev_t mcbsp_dev;& r' F; M" W) p6 y
unsigned int DRR_data; ?( b( {; O4 S. h* \
unsigned int DXR_data;% U& h: V- D" h5 U
static int mcbsp_open(struct inode *inode,struct file *file)# N' U' T8 {. O) q$ v3 e, G8 u
{
: [; n" Q3 Y/ D+ ?% N
1 f0 I6 \0 k0 q( q //interrupt enable,initialized) M6 u2 d$ g4 I9 V9 Q- `. p
unsigned int temp;
5 Y6 t( a3 W) t/ T# Y2 e //SLEEP_EN(GPIO8[10])---0
6 n; h- x3 a" C7 \ ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 @! W \/ E% L4 \
temp=temp&(~0x00000400);
. X6 r! _9 G9 \0 P+ ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 U0 u& ^" T+ P& O3 x2 v) z$ ~+ r
//RESETn(GPIO8[8])----0----1
6 [ z7 b$ _$ E6 d temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 e' d3 m4 \" t# }" f( Z temp=temp&(~0x00000100);# C6 Z/ t; w+ s# g6 a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( ]& A: a* t; L2 f& k udelay(100);' e w) w! j3 z$ |
temp=temp| 0x00000100;" v5 T/ \3 L' l. K# A$ H H% t0 n
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ F ^( W2 J( }# T! k udelay(100);
" E4 V! u3 x0 Q$ I6 D' |! M printk("open success!\n");
9 c: M4 F& R- Y9 B9 e# |3 K return 0;
1 s# x1 m3 ]7 a0 _ k6 y3 ?} o3 u5 S2 X% k
- P8 b6 ^" X0 Gstatic int mcbsp_release(struct inode *inode,struct file *file)
/ h- M/ Z( o$ @: q5 F: n{. z( E/ ^3 `3 L+ j0 y
printk("release success!\n");
4 H) g& I) D1 i+ ?: {: Q- n/ W( D7 Z return 0;# d. u* m2 z; v, o# ~* w& f* l' f
}
9 a( c) u9 M& l" [. B, J; u6 f- R) u. K
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 X0 c E7 o. m, R. ?
{/ S/ A6 Q& t# |7 H3 j
copy_from_user(&DXR_data,buf,len);
' ]) g: }; Y8 b6 K# z5 l& i8 g iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 7 F% @6 D& A0 {
return 0;( F' U% H5 m7 m9 c% M6 l z
' j* \9 B4 H4 v) y$ K( c6 _
}
" E r, r* `1 M. C9 @$ x1 l5 x& r% h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ U& }9 t2 {( E& t, R8 z( F, c
{ % w. g2 T V9 t2 [1 u
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# |3 T N v R. M copy_to_user(buf,&DRR_data,len); - b, [1 Q4 Q4 J/ E
return 0;. v/ u- Z6 C5 U) T& H1 f
}; I: b2 w ]7 s" k
9 P; N4 i: ]" i& w' o' W' X' e1 V" ^, N
static struct file_operations mcbsp_fops=$ y) R, s* w/ R& S4 J6 y
{
7 [* L6 U: R5 y9 i/ A' S/ C: N/ B .owner=THIS_MODULE,
% [7 P( r# ^/ F E. t6 ~6 ?6 i .open=mcbsp_open,
( L: G* x8 A; M- H0 A" o. A .release=mcbsp_release,* l& y" u! [. _9 U" f
.write=mcbsp_write,& ]7 K& ]/ Y" H# @% f1 C( i
.read=mcbsp_read,
" P) q* A$ [: \};& a) H9 S: ?5 Y
static int __init MCBSP_init(void), t: {! q3 N) ?3 N! A
{( o8 |$ L ~! \
int ret;
) @# G T' Q! I3 _4 E unsigned int PINMUX1_REG_old;% u& c0 K# o: _- K
unsigned int PINMUX18_REG_old;
B9 y! r% v; ?% ]! E; O unsigned int PINMUX19_REG_old;
! n4 n2 t( C6 ^6 _2 q& { unsigned int temp; 0 U# G7 P2 K* |( p" E( f! A4 w
if(MCBSP_MAJOR)' s" X5 F% ?& u9 V8 T. ~
{/ b+ p" Y6 o( Z1 O% ]
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 R; F5 G9 Q) N7 i
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 |5 Y( M/ Y* {1 o% S+ J) r0 G }- U O# H" Y6 f6 M+ _
else
7 t' d3 L( N# |0 Y n% g {/ N4 [; Q. i% y# N9 C7 K9 O; ]
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 F3 ]% M# Q* S MCBSP_MAJOR=MAJOR(mcbsp_dev);' F4 C! h( I5 x# z- B/ l! [
}, J8 |" V$ n) O2 J) \5 E
3 s" ]. a) C! `0 F' P2 k- J2 S
if(ret<0)
4 ~5 n0 U; J; z$ V1 Z$ c) v1 ?' N {4 v5 i0 |& z: X* ^) k6 x
printk(KERN_ERR "register chrdev fail!");
$ O2 x1 N. e& z7 l return -1;" w6 m" U/ I: }$ E8 B" Q" i
}
, e" |2 E4 Y2 x2 {+ @# x {/ x% u+ n
$ R/ u2 o2 ~ c' V( [ mcbsp_cdev=cdev_alloc();
& P3 }2 S; Q f7 h. u 4 G* j1 A S6 {" e2 [, ]# M
if(mcbsp_cdev!=NULL)
{1 z/ `9 P4 T2 R% b! n/ [& Y {
( B3 B: k) {* h cdev_init(mcbsp_cdev,&mcbsp_fops);
: v/ ~$ m6 L0 b7 }% u mcbsp_cdev->ops=&mcbsp_fops;/ I1 Q% h- j6 } w- e
mcbsp_cdev->owner=THIS_MODULE;5 C- Y3 U# y- q' q* {: W+ g
o l) b- D5 g+ c# A
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( b1 L" a1 [2 n
printk(KERN_ERR "register cdev fail!");2 j, w; m t. K0 f; F7 ^" p9 U
else% l8 `) n( x0 w; p3 A2 B
printk(KERN_ERR "register success!\n");) v1 r( _( N. [0 w2 K
}
" N, z! u, \2 p6 ]! i else- q3 m: U9 o. {* G8 ?: i# v8 d9 N
{# W! O' C; W$ b o9 Z7 G
printk(KERN_ERR "register cdev err!");: n6 l( l9 ?' M5 K1 F
return -1;; u( u) Z0 w0 X
}
6 C7 A4 l6 N6 |5 }- g- p $ x' T5 a0 ~/ x
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);1 P8 N" O8 J2 E2 p8 [
if(IS_ERR(mcbsp_class))3 x- J; ]6 Y8 p$ a6 ]) {
{0 o: F, X9 y2 U! K9 v2 ^4 y f/ M1 X% |
printk(KERN_ERR "register class err!");. }$ x7 [! d- ]! E
return -1;
( S, v- l- R+ v* w" w, D5 n, F/ A }
+ U# n0 o3 ~+ n* Q3 I" I4 o device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; O$ O5 ~ W8 C; K9 J" z- @; x/ q5 z# @
4 o0 [0 ]9 N6 a ~$ C1 T4 t //PSC0 M f: P: i, \0 Y0 J, o" \
//add Enable MCBSP2 ]' x g3 `8 a* V; z# Y$ ^
//test
: O; `' M( L- M0 b1 T/ j temp = 0x80000003;
, c% ?5 x* Y+ b9 U$ f$ E writel(temp, IO_ADDRESS(MDCTL15_ADDR));- f2 P. h8 C- y* C1 I$ O7 S( u
temp = 0x00000003;
9 t8 Y8 p9 \2 s* A2 j2 Q writel(temp, IO_ADDRESS(PTCMD_ADDR));0 M6 u2 M+ x" v9 ^3 |
/ c1 b) Y" Y; J V" P( j" n0 g% u temp = 0x001FF201;
+ V' M ?' i9 l, F writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# z9 ]2 K$ Y2 W4 n
" {$ Y$ }) z* E4 v //PINMUX $ t) v, V* r L m2 M( y( J
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ T4 Z" y+ \- U2 T PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ' p" H9 D$ j) N8 F( H* n
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
. g2 q% x( I# B8 {2 y$ z writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! n' K1 d# W) x' B: d6 k1 m
6 |3 b j, ~# ?0 \ L7 W1 t //SLEEP_EN,EPR,L138_SHK1,L138_RC
% U) e# H i" i* m& W$ S$ u, b. V4 R PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 8 r- i$ ~; |7 e
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
4 z; @) s6 n: l' s8 n ^+ g1 j# F4 c writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ {1 b6 I2 e K2 C# ^ / n+ i1 H# d! T8 U H
//RESETn,L138_SHK2# Q% I5 H2 r! O1 n I" H* g
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 3 P# o4 i$ x. q) Z* @
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 3 ~* J2 P4 J: `) p8 }
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" s- c2 J, [$ r D# R; x6 a7 \ 1 v, p. Y- o4 q: z) ~/ h0 l% i4 O
[* l! s% Y4 v4 D9 `1 ~* x0 w% d //SPCR Register
: C' C3 P& I9 p [9 B6 H* ?7 W //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( a3 R& H. w: _% M' ~
temp = 0x03000000;//(DLB=0)8 `$ e0 n2 Y3 X' s. i; S7 z' v
// temp = 0x03008000;//(DLB=1)
1 m3 N5 W% \4 }( x: i/ r writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset! A( }/ H: t( m/ u& D+ c
temp = readl(IO_ADDRESS(SPCR_ADDR));4 f6 H1 J) Q3 {9 P9 g
printk("temp=%x\n",temp);
) W7 Q& @+ W" e `0 @ `
: C) D/ E+ I& J( z4 l# o9 q$ @ //PCR Register# {( x [" C3 a* g) C
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 O: O3 |+ y7 v$ `
// temp = 0x00000F0F;
! \ j; n: M% T& ]0 ] temp = 0x00000B0F;
0 C; P- E6 R: h4 n L; V- J4 O writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) f2 R; B! n) a4 f" t
temp = readl(IO_ADDRESS(PCR_ADDR));$ X" m4 ^9 @- u* m
printk("temp=%x\n",temp);
- V' e( r& @3 U" F( N //SRGR Register
' I6 b+ q, e3 T1 b' b# W1 R/ N- x //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) Y) f. ]# k, D: A9 X+ R5 a //temp = 0x301F000B;8 b% c+ V! [. E* u
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" {. u5 n6 _, @) f9 L temp = readl(IO_ADDRESS(SRGR_ADDR));0 E' N. y1 m: h9 q6 ], V7 g. ^; n
printk("temp=%x\n",temp);
) C4 h5 B. g, E# @ //RCR
, ~, A+ Z% T o% u //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 C" N6 w; v1 W. J- A
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; V( I# P( i- T! J+ Q9 h temp = 0x00440040;
1 L; Z1 N& Z- g writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ) B9 \' T& {; f; \6 O; s
temp = readl(IO_ADDRESS(RCR_ADDR));( J D$ D3 Y/ ]8 a' H3 ~( t; O1 _
printk("temp=%x\n",temp);8 S4 ^ }& h, A& n' W& D
//XCR/ B+ x6 I& ?: b
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 H; L- A4 t" M4 B3 B# B3 e
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" m2 u& R: h5 }! e- G temp = 0x00440040;
* L2 `2 y; F/ N writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 w) ?. F) s! S% f2 g temp = readl(IO_ADDRESS(XCR_ADDR));
' j% x6 O8 a- `! W2 ] printk("temp=%x\n",temp);
6 G" B& V, F; W, N8 D udelay(100);3 {2 V+ S$ w3 ]+ F
//SPCR Register% ?) r' Y* H6 v+ ~) D2 W, j" K
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 t9 M4 u. q# ]3 Q# O4 A% ~ temp = 0x03C10001; //DLB = 0 VS DLB = 1
; D0 _/ u+ f+ }1 m/ b0 i' q writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 l8 ?( P0 B* l1 B2 y! M$ B% N7 [ temp = readl(IO_ADDRESS(SPCR_ADDR));
+ a& E) y/ a, R. T$ a6 X printk("temp=%x\n",temp);7 y2 R/ q( P% M/ p
udelay(100);6 Z6 P7 T# v$ ]5 l: Q
, H3 ]& e7 k* h
//set GPIO direction2 Y% E, x- e# G' Z' v
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ C% A7 _) R6 J4 x3 h% ^1 r5 V& f6 w temp = temp | 0x00000100;//EPR----input
( ]/ G! o& e2 Y+ o; E% h1 k2 U temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: f+ @9 Q4 ?; k% h3 Z, K5 x9 p) P __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
7 d9 C8 a" [; ]9 n4 h2 j4 {/ }% p6 ^ 7 v6 x& W: }# A: N, g: A) a& V$ N
return 0;
# Y+ @: m1 Y7 n, G4 V4 I7 h8 C}
3 u5 z# s( Y d- Nstatic void __exit MCBSP_exit(void)2 _& A& D0 {8 w0 p) r- _
{
+ _8 i1 Z1 q& U4 [ K0 G, G# @# T printk("mcbsp chrdev exit!\n");
9 D. e$ a6 R+ Z, f$ l: ` cdev_del(mcbsp_cdev);! \: w& n) C# e- y: D: k
unregister_chrdev_region(mcbsp_dev,count);& o3 S7 W O6 @- v* T8 Z
device_destroy(mcbsp_class,mcbsp_dev);* ~; `, ]3 r! O4 q1 v
class_destroy(mcbsp_class);4 B" v9 |/ D6 Z: D" z( x/ R, @
}
- U2 m2 `" D/ ?+ F4 I: S1 |module_init(MCBSP_init);& ]- C! S, b8 |
module_exit(MCBSP_exit);
4 n+ |6 M' {4 Y' t1 ^( g' k A. i/ z1 s$ ]
MODULE_LICENSE("GPL");$ W3 B4 S) |& E5 W+ `4 V6 g
7 g: ]. J3 ?8 E3 K" [: \1 H' K
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 V2 {. g* ^9 t4 V$ V我的应用层的测试程序如下' a+ M3 A& b" \- y+ |
#include <stdio.h>4 v8 Z- G9 K* O4 ~
#include <string.h>( |& l1 C; X5 U$ V' z! x, d
#include <fcntl.h>
. \4 G' s5 @' Z- b4 f#include <unistd.h>
9 w9 I; J) ~& _6 K S# c#include <signal.h>( b( J" I& M7 _& E( o) _4 o
#include <pthread.h> //线程
- e4 ^9 f0 y7 V8 w" C6 n- ?#include <stdlib.h>
4 y" ]% m( P* s+ l# v$ G- U#include <pcap.h> //捕获网口数据% u: F6 S& l( m! b2 L2 _
#include <semaphore.h> //信号7 Y o5 _ i- b% s% Y1 t2 {: f
#include <sys/types.h> //消息对列
& V0 R4 a, N' M- `7 v#include <sys/ipc.h> //消息队列
! Z2 E( s/ ] M. e5 r6 y#include <sys/msg.h> //消息队列
& ~3 f [: o6 G) l#include <sys/select.h>
6 Z3 A) A+ N8 s4 g- O#include <sys/syscall.h>4 z6 c- }' P: W# A5 |- j& L
#include <sys/stat.h>* ?; ^% U, O7 \2 e
#include <sys/mman.h>% B$ n) X/ K1 s5 l9 `4 |. L
#define msleep(x) usleep(1000*x)
. i8 a. L3 e) u/ X9 O
" U6 Y+ Q# K8 e; f [/ Y9 Lint main()" L. K. V+ O5 I$ L6 S" g1 a
{ ' P3 Z8 `: A; Y" w5 Y; |! j
//MCBSP,ARM与AMBE2000交互设备" z: a! g7 `! Q6 h
int fd;; _' g0 j7 ]( m" ?
unsigned short data_write = 0x5555;
& s4 \3 d6 a6 b, l/ s unsigned short data_read = 0x00;
. M" I0 j* }3 L' z" h i) S fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ L n. i- P/ u4 N$ y l // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' j6 \. C7 X$ ]8 H o. l
7 e9 m/ f- ~) U, P, c+ K8 d/ u0 j! i if(fd < 0)+ f8 Q2 c0 A: u
{# W- H, d6 o( C0 }& T
perror("open failed\n");
4 H. `3 h& Y9 O9 q# `5 J* e3 D* R9 E return -1;
5 O x' }. @3 _) q. B2 X& P }
3 ?9 J$ Y. E1 b% }/ k# D9 Q
2 a5 y; y& G8 H0 K7 g. O1 J) r while(1)- r2 E; \! U: V* n1 S
{* f4 o# }7 W- g6 B N
2 {" r+ b! @6 M& W( ?; } //AMBE2000每次读写是24个字为一帧3 x5 }) V8 {& a# u4 V5 b* \6 U
//写数据时将数据在底层存储起来,等到中断的时候再发送7 @ T% e' {* e C" j4 j
//AMBE2000输入数据是以0x13EC开头的$ n$ a4 Z b( n$ O3 |2 ?1 y/ ~
write(fd,&data_write,sizeof(unsigned short));) \; Z; n& B6 H# L
; Y$ D! |* q( g2 W: k% e9 {
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
1 E3 a: Y: z& K read(fd,&data_read,sizeof(unsigned short));
* D' [" a& }- ~1 z7 [* h1 s % j& X6 \4 k1 G, b* b
if(data_read == 0x13Ec)
) m9 j4 k9 B' A6 W {
& E! c5 \' e. h, K6 ^9 m
0 \% H) u' Q' E6 k# ` s# k% G printf("data_read = %x\n",data_read);, x9 {' x6 O: A% ~6 d( ]. V
}
, l ^* c3 Y$ e* q 6 a2 [* V# W# \1 O2 I6 a
msleep(10);
]( O5 d4 F j* S/ S% Q" c
, h z% v7 u* Z% f4 J, G /*
0 g$ h: J# R" H1 R ioctl(fd,1);
. Y5 d- y N6 x+ |' M sleep(1);5 r" y" [! J+ c, N8 W
ioctl(fd,0);
: p1 e5 X; C. p5 {) I+ g sleep(1);
( Y" m* g2 Q% C% |! ~" Z */
9 c0 q/ s" v. ^/ v }
3 l4 m3 c S! `! L6 } return 0;
" Z) A+ ^- u) U$ K( k
+ m3 m& ?& M( U0 d$ |}
' w2 l! m7 Q8 U* j% P4 x9 \5 g2 D. [5 x- D% {
多谢各位指教,谢谢! 急2 P+ g: F" w: C/ q5 {) [
7 A/ H, }6 D! S5 \. A" |8 P
, Q. x% M9 G( v& R9 a' |% q
/ u4 u* C* `) h# }) _) i! w% g% t
5 P& f# A3 m" |% M) \' m- l
1 h4 J( D S- m& T! j/ r |
|