|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 L: Q# @% r7 U! Q
/*
2 T |6 R, w- N! M v" m& n w * Copyright (C) 2009 Texas Instruments Inc0 w& s' M2 h% c' C- z
*
5 s1 l J4 Q+ f! v/ ? * This program is free software; you can redistribute it and/or modify, f* f6 N8 S/ U5 f( a* s5 b
* it under the terms of the GNU General Public License as published by
" R3 u4 [6 s! E0 p9 G# f6 C * the Free Software Foundation; either version 2 of the License, or( c' A4 j& J* s) B+ w" p
* (at your option)any later version.3 I. E. x# s: s* \+ V4 n
*% l7 s Q$ C+ n% K2 v6 W. A! U
* This program is distributed in the hope that it will be useful,& e& n3 m* E0 P* `8 s) D# ?
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 E7 s3 _; B2 D( \8 I3 Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 x% g) P! ] V1 }. s- x7 z * GNU General Public License for more details.2 h( E! M w8 y4 o5 n: [& ]% s- |
*
* q6 L% i" k' p* N- Y * You should have received a copy of the GNU General Public License
( p) | i$ A& k- M9 X% ^8 P+ U3 V( C * along with this program; if not, write to the Free Software
4 ^; a! ]. A" p8 Z* J * Foundati
+ G- d; d* c; B4 B4 ^7 I* ]*/
; w2 z$ B) h8 g' i#include <linux/module.h>+ C& r/ S ]: B" g9 {
#include <linux/init.h>
; |" J9 @+ s9 ^ w: F0 \4 Z8 z9 _#include <linux/errno.h>
1 a/ f+ p, G: k! s" |/ k#include <linux/types.h>2 c& w& U0 J) T2 r1 Y+ E4 J, W
#include <linux/interrupt.h>
4 y! J% N/ N" w- ^6 c1 s& k! w#include <linux/io.h>
* ?. b- R( c. \ _% Q5 I9 A#include <linux/sysctl.h>
4 t+ |2 z E4 ~- ~7 N, u#include <linux/mm.h>
0 {6 F4 M# {% Y l9 t#include <linux/delay.h>
- d! ^. [7 L }2 h6 Q#include<linux/kernel.h>5 y4 V, J! S8 D8 x3 L
#include<linux/fs.h>$ Y% d3 W7 S; N) L/ Y n9 _
#include<linux/ioctl.h>7 z2 G% V- B/ w# {
#include<linux/cdev.h>( d& T4 o2 t9 D' w @( h9 E; c6 G) r
#include<linux/kdev_t.h>' n B7 R, h r0 l+ I& ^
#include<linux/gpio.h>: f3 X0 U2 y, {* @9 s4 \+ T& D
#include <mach/hardware.h>. y! ^# i' ]# ~8 E2 ]8 ^9 K+ S
#include <mach/irqs.h>
) p. f7 R6 B8 r4 {/ j1 P" V) W9 |" c0 o% s' ~# m; G+ d
#include <asm/mach-types.h>. d) e( o- I) `9 @1 [' F9 f% l
#include <asm/mach/arch.h>9 H; y/ P, G; F8 i! G: ]8 G
#include <mach/da8xx.h>5 `3 X& J1 B. l( z
#define SYSCFG_BASE 0x01c140002 }/ T/ e8 x1 r4 [9 e
#define PINMUX1_OFFSET 0x124 % z! y9 a8 n3 Q. ^1 Q+ `& i& K
#define PINMUX18_OFFSET 0x168 . V( u9 d) z/ T
#define PINMUX19_OFFSET 0x16c3 e6 U' N* }' p( p1 X$ t
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 A2 T8 W. t1 ~
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
9 u5 d5 ]+ y* T6 B7 a#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
& l9 `3 G6 ?; L v6 \* x( \#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 ~' ~7 Y: S% _6 }#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
7 d, H: `, c- J& }+ W: b
% ]* o: B( i: x1 t#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
) U) p* L( c$ P/ }9 K: Y#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
7 k5 I+ I$ j( t4 S//PSC
% G' x& S3 c6 g' r- _1 ~#define PTCMD_ADDR 0x01E27120 6 g$ m/ f- O4 s' S- e: S
#define MDCTL15_ADDR 0x01E27A3C
' z7 o) A3 F. w+ J; ]* `& A#define PDCTL1_ADDR 0x01E27304# V4 i% _5 ?& w r+ @6 \. z- ^# X
//GPIO8 direction; Z" i. H- |# Q/ g& u
#define GPIO8_DIRECT 0x01E260B0
+ Y: ~& ?6 @4 {. z#define GPIO8_OUT 0x01E260B4
1 t9 [; o- }+ b#define GPIO8_IN 0x01E260C06 g* O r$ p7 q1 \
% u. B7 M% p& \* c* z& B
//#define MCBSP1_RINT 99
2 }* s: w( n& D% C7 Q. G0 T2 E4 \//#define MCBSP1_XINT 100
* K& ~% V3 A( _5 a4 Y' gstatic int MCBSP_MAJOR=239;
1 c( _; k4 d% e# C% [7 E* C+ astatic int MCBSP_MINOR=0;
5 F& X. ^" t1 _" F# Y7 _ V% \static int count =1;0 E* y$ U1 V& m' @* p& N) C1 c: v
: z' F( y- w7 y1 r- M
#define MCBSP_NAME "MCBSP-device". \% R0 @* {% q/ Y x0 N# o
' f- F4 E" p4 i. N2 H' Rstatic struct cdev *mcbsp_cdev;
/ Z1 M. u6 A8 j; gstatic struct class *mcbsp_class;0 P/ n& A+ A" w+ x
static dev_t mcbsp_dev;! A0 m5 r7 ]9 k; j
unsigned int DRR_data;
. W4 K& N/ y8 Q( Z% H, U) q2 Hunsigned int DXR_data;+ r# w! T! w, F" E6 w
static int mcbsp_open(struct inode *inode,struct file *file)1 G) d# a1 }$ l" x9 {4 P6 p; C
{
4 `" G8 f8 T3 t; m% i! @
9 P7 c# B6 y4 L //interrupt enable,initialized
3 E/ U1 @5 x: ?( L6 w unsigned int temp;6 l; t9 M: v) I' u* e* n1 [2 i! i
//SLEEP_EN(GPIO8[10])---0
+ @* y1 e% l( P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 Z( ~1 Z X3 {5 K6 R temp=temp&(~0x00000400);
& {8 h* P4 a" y7 P7 j __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; @" U6 |% S4 x% g! m# a6 y
//RESETn(GPIO8[8])----0----1 q z9 G. O- {% k
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; x0 S. v* P. V; ^4 c7 u+ M4 A
temp=temp&(~0x00000100);9 q, @/ F5 m2 U9 [7 \+ f5 L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; ~) Y+ I* G5 o n
udelay(100);+ W/ e) k i% p3 J, W
temp=temp| 0x00000100;
) N2 d0 O+ y1 T. S% o& n4 n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% l( a5 B( W, i) z2 j udelay(100);& W8 a, D. i. G: _
printk("open success!\n");
3 c9 H. `$ p# a7 A5 a5 ^$ m return 0;! O w( ?5 T9 m" Q5 {3 h
}
/ w3 _/ V7 ?# L& V+ A
2 t/ c. P) o! w* d0 A; Astatic int mcbsp_release(struct inode *inode,struct file *file), ^" M+ ]2 D0 ]8 h, x+ ]" |' u5 B7 h
{
W O, E: x$ U. m M printk("release success!\n");
& f N" w2 w+ u4 b* u return 0;
# H G: Y( E1 j* ^/ B}( _) N, X) s4 z+ D6 F% Q
- p9 v" i% ?2 C( m0 j8 l
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)# x9 n6 b! ~" _
{) W7 c4 _7 |& L1 x# T
copy_from_user(&DXR_data,buf,len);
, O. K& c# k1 N% O, Z5 Q iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
' T% o" F+ o$ m0 T1 \6 J( E9 J return 0;+ \. _% P9 @/ I, k8 ?+ ]6 [! \
0 u& q2 X) N2 p% q. p& `; ^4 b+ V
}
6 S, h0 D' h8 k% I5 G# g" w; `# A( c. z' o) b
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ j' a" l0 c4 M' @5 } R{ 0 O5 k! I4 b9 F/ \
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( D* J3 {7 X$ y7 r6 f4 x
copy_to_user(buf,&DRR_data,len); $ _+ G2 l3 h G' n+ u
return 0;
+ v4 @0 |/ {2 p% s/ j3 d# |}
" Q3 |3 c' z4 ` |% O; H: e! [; p0 w: B2 @" _
( O) b* b) L* e) ]1 D# |: Q3 V
static struct file_operations mcbsp_fops=4 F" l/ q7 A, f" r
{
8 V( l, q$ E+ U+ S8 a" O1 J8 V .owner=THIS_MODULE,: m$ F0 T m( w; Z6 B2 b" l& r
.open=mcbsp_open,
0 U0 x% d; H! p/ B .release=mcbsp_release,
4 ?1 e* w- B2 I2 {: c' r. z9 v .write=mcbsp_write,1 x7 ?( i, S! B, D/ \
.read=mcbsp_read,4 H" v+ B; _. H* v$ s% G- Y( }2 f
};; W- T7 u- b+ M0 M# j3 u! A
static int __init MCBSP_init(void); B7 T& n) n' g. t
{
5 J/ l( X2 [1 G% |, A/ N int ret;4 d# O U# O( I
unsigned int PINMUX1_REG_old;
" t8 B3 s. c0 m) n' M7 o4 M' Z unsigned int PINMUX18_REG_old;6 q" K5 N9 o* v& }3 K: H9 a& F
unsigned int PINMUX19_REG_old;
8 s. ^+ V+ I x5 A% M- G# B unsigned int temp;
, M5 M6 y+ {+ u$ r) h if(MCBSP_MAJOR)
9 C1 J% ~$ C7 u! ~9 G {" B6 T7 A# t" Q0 @
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);; t) L( A5 Z' i) l$ @
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ l0 n9 ?& k, }5 }8 ~0 D" I }
6 d! Q: A8 g, I+ D/ P else
# r' p# l0 |, d& d8 W9 C9 }6 f& { {7 k0 F. [8 i ^+ x1 K7 c' }" v
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ Z3 n/ F' P6 {# i
MCBSP_MAJOR=MAJOR(mcbsp_dev);/ A* K* ^% w2 W& h
}- W& { S+ z4 k! b' U
+ x# q; B# K$ d7 ~
if(ret<0)
, Z0 N5 `. a- v! d. Y0 w& d {- f B0 J* Z) p0 ]% E a
printk(KERN_ERR "register chrdev fail!");2 I0 u) E% N* S l, X5 |& ^/ c
return -1;
% Y: Z, {' @1 d+ G; G }& w2 h0 T' i& C0 Z
8 k6 c& o/ T5 s3 {$ I4 m! J mcbsp_cdev=cdev_alloc();$ E! ^. C4 _: j# N$ v# \
, B/ p3 p3 V \0 E
if(mcbsp_cdev!=NULL)
0 @+ }5 H, k, E- h! M3 K1 C {, F3 ^1 b$ A& I Y G3 h
cdev_init(mcbsp_cdev,&mcbsp_fops);
+ g6 E9 E1 W7 k mcbsp_cdev->ops=&mcbsp_fops;
. i( f, `8 u- E2 X mcbsp_cdev->owner=THIS_MODULE;6 D. P8 T' A6 y; B; I S+ |
4 e/ q7 T" V, L2 `) m: d& J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
@8 n# L) ^( T1 n, _4 T printk(KERN_ERR "register cdev fail!");7 n+ a/ {8 }; w( a4 W, q4 ^2 u
else. T/ }" K3 o6 l( i
printk(KERN_ERR "register success!\n");
, u% \" F; d3 J5 S1 x9 H1 x }
1 ]4 q6 g/ R4 ` \' H: z# z( E) | N else" S5 O5 V s7 f7 u
{
4 N, S4 L( q4 E6 {! O/ ~7 X$ s printk(KERN_ERR "register cdev err!");
5 b9 [' t# o% I return -1;; H7 d2 p& _! @# h7 `% |: w$ `/ f
}- J9 X5 {" @; c. {" f
9 k; E1 ^: a' ]( a- F mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); \9 J) L& v! w% D0 |9 A
if(IS_ERR(mcbsp_class))
; }( z7 `+ ^6 `5 F: z6 e Q {
: @. \: v' P2 F. Y+ d: N2 e8 p% q printk(KERN_ERR "register class err!");3 A0 r4 m7 [% B% t3 b" i
return -1;! _1 ~# \( @. z. b+ f) |
}& j3 _, I; N# ?' y
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ D3 R) {; L; K3 Y9 \$ n8 q- M( L3 T3 D& l
//PSC3 B6 E. m* w9 p, I1 i
//add Enable MCBSP
( r ^8 g: y( R //test
+ O' O) w! b% X0 i& ` temp = 0x80000003;" r! D: f* \0 T9 B
writel(temp, IO_ADDRESS(MDCTL15_ADDR));. z; {" a- p+ F, A" Z2 g) ]$ s: u
temp = 0x00000003; f; r( {6 A- z8 m) x! d# ~' H8 j
writel(temp, IO_ADDRESS(PTCMD_ADDR));
+ w( ~5 f7 \1 [
# b5 E% o) o" _: }/ o temp = 0x001FF201;) E; d" }% \! |. f7 z1 c A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 O5 _" V9 I& w8 U9 [% Y7 f2 l5 g # D. `& H0 Q r3 V: Z8 D
//PINMUX
/ [ F w8 p" ?) x y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 a% B- P6 | @5 ^) O" x PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); + j! u; z2 H2 Y- x2 G& R m$ r
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 t3 D; ?! X) X8 a" v2 G writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 h L) Q4 a4 M: v1 n+ C 2 x, }9 E" e' p1 j, k% U! U
//SLEEP_EN,EPR,L138_SHK1,L138_RC2 H. f# Z; ~% g }( C& D% P
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % q2 u5 Y9 n2 U4 p2 C6 q; R: O
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
0 k/ M- N( T1 d7 |, i7 f8 H% J1 s- u writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 \ {$ V p' y/ o
5 L+ D5 G5 _- Q3 Y0 d! y //RESETn,L138_SHK2
- S4 }! b$ G! T$ j- |8 }$ m9 m! [) `+ p PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 9 \3 `. E- z& K7 y6 W
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; . s& b9 O/ ~8 Z# S* h, @) S$ |4 |9 E
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 ] a+ C3 Z1 k7 W 4 j: `5 j6 _; n
) V* p3 R& X" g8 J' ]5 w- a1 K
//SPCR Register0 \2 P. T# B+ X4 c
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 }" E5 i7 \# m# d9 q3 T) q6 Y temp = 0x03000000;//(DLB=0)- H2 l C9 P/ z0 o
// temp = 0x03008000;//(DLB=1)/ j* q; P" h9 @: t
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ K7 n% a7 Q$ K2 j8 A8 z+ `0 l0 R; P temp = readl(IO_ADDRESS(SPCR_ADDR));
# f8 B# P/ m8 l0 c8 N printk("temp=%x\n",temp);
/ b! ~' g/ l& Z& P
- V% O4 U# d" `; H: M* B- N* ^) { //PCR Register1 O4 E. G: P: V; s, h8 I8 a
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 y7 g+ a. M& ~. R3 X& ^/ A // temp = 0x00000F0F;
/ j( \+ h2 o; ?0 |( m temp = 0x00000B0F;0 B; l5 o, T; F$ v
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 0 A7 e/ ?+ O& I7 j" b; G$ c
temp = readl(IO_ADDRESS(PCR_ADDR));* ~0 \" ` O' w: I' j6 d) A+ s
printk("temp=%x\n",temp);
2 t r- }. C8 q1 k //SRGR Register
7 a4 I" Z6 P) o$ G2 | R1 } //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 O, S8 n; }. `, [ //temp = 0x301F000B;
1 w: L3 t- q+ A4 f0 f& I4 o2 C writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
5 ?1 F' i ^/ Y j t temp = readl(IO_ADDRESS(SRGR_ADDR));
2 l1 H) g7 M, Q$ ]+ B% D, @" G- e printk("temp=%x\n",temp);
/ B$ `7 y3 k7 ~* P8 M //RCR
4 f& s( h0 P" t' N //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: n" A8 Q/ K! z' y% C //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 W5 v+ S; i {' w9 [3 A' T temp = 0x00440040;$ l ^, j, j7 b. K. d I6 Q
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 }/ E8 G) E6 U6 A9 ?+ }8 e
temp = readl(IO_ADDRESS(RCR_ADDR));6 t/ _; O/ {. ]# D* e
printk("temp=%x\n",temp);
?% K3 V* }0 I* C. z' d //XCR
3 s; m0 ]+ K# a. B4 | D4 y //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 u6 P- A1 P. C. L6 E5 _0 V
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& D0 T+ G4 d$ o: v h
temp = 0x00440040;
0 ]. X% t6 L3 R( ~( L) V3 @ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. y: o& l4 a- t6 _! A temp = readl(IO_ADDRESS(XCR_ADDR));' U$ M6 l) e* D S3 U& b
printk("temp=%x\n",temp);
0 `4 J! Y" ]+ N udelay(100);
/ e% h4 p1 _/ J- y& V: G' Q% [ //SPCR Register
6 w# ^: e9 `8 F; J) ^7 { //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 m3 o2 A3 j8 s* _/ \+ H9 H temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ l g$ \6 X* T) M writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 w) l1 E" Z$ G0 I6 F1 B% X% m
temp = readl(IO_ADDRESS(SPCR_ADDR));# z# d# @- C3 v6 Z- q
printk("temp=%x\n",temp);1 ~8 k, L1 D4 O! {( K
udelay(100);9 u2 Q( [& [8 z( X& b0 V, k
: j! C# W; U; T5 g9 C
//set GPIO direction0 _1 c3 {( ` o0 i
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ ]" Q; q3 D/ h% Q9 X# N
temp = temp | 0x00000100;//EPR----input! V |" \( V* O# B) q3 Y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 t" G; V# z4 _% P
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & P6 |# \ J* p, A+ k
8 ^2 x& ]7 D+ h* w8 o% g5 S, W return 0;6 F6 b2 J: R6 F, A, x5 R
}
! e# m1 Q. d! pstatic void __exit MCBSP_exit(void)& l7 e& C4 A. t. h
{+ g& m2 q8 {2 b# J
printk("mcbsp chrdev exit!\n");+ B3 M2 p) X& C7 O' ?
cdev_del(mcbsp_cdev);. W& b: O4 K. b7 e) [7 e3 v; b
unregister_chrdev_region(mcbsp_dev,count);
% \. i Y' y, G! L9 t0 h device_destroy(mcbsp_class,mcbsp_dev);
+ x- U( [( ~. ~' w1 p- |8 i, r class_destroy(mcbsp_class);
H: r4 }0 d+ z, i1 x: {* W}
: m' w& S, B$ V8 p9 Dmodule_init(MCBSP_init);% Q+ J/ x% R1 _! k9 ^* B" C
module_exit(MCBSP_exit);6 y( `! K0 ~: ^) X1 O3 K' H6 M) T
d% W: i9 ]4 z d: a7 h
MODULE_LICENSE("GPL");
& [4 t( r& c1 l6 l' J
( W9 t& Z( C" `2 O我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; t* z1 U( H! r' O' v) C, s5 D8 \我的应用层的测试程序如下$ A; E! T) Q. D& e/ R
#include <stdio.h>& b. N( \/ s) e/ |; r7 p
#include <string.h>
D2 Q" K# B$ t#include <fcntl.h>* P- b: T* a+ O/ \ N; q$ o
#include <unistd.h>6 D6 T* O% k" ]8 X5 [% _. p. l
#include <signal.h>/ Y" H, y" u% q! |1 C# t
#include <pthread.h> //线程
8 c: s+ c( ~( M#include <stdlib.h>
9 B# h$ H2 U6 @( i! _% G$ g#include <pcap.h> //捕获网口数据" |; c6 ^$ M& s2 Y/ X9 N/ s
#include <semaphore.h> //信号0 m3 i2 {& ~3 v$ F
#include <sys/types.h> //消息对列
0 [% }7 f) J6 f3 q% [, j, M) V0 _#include <sys/ipc.h> //消息队列" t5 S. o" q ~( }5 r( R
#include <sys/msg.h> //消息队列# d# I a" g* j7 i
#include <sys/select.h>" t" v- f5 n, l: R! G F+ Q
#include <sys/syscall.h>
' Y5 [& X& r2 m W#include <sys/stat.h>
1 v7 J0 O. m- ^7 K3 r5 c#include <sys/mman.h>9 n- i9 B& y" _/ H
#define msleep(x) usleep(1000*x)
& R3 ? \% D! L6 `: Z2 D/ w* a/ i' }) J8 H
* l' \& L' Z9 v; T8 g8 `int main()6 K& X. w z7 t* z! v q
{ $ I( c* u* e' {- i8 ~% X
//MCBSP,ARM与AMBE2000交互设备
$ A( X2 H- c6 I2 J! E& i int fd;
/ l6 Y# t! v" }' p2 C* T unsigned short data_write = 0x5555;
: ^* }8 s9 b' L6 ~ unsigned short data_read = 0x00;
$ k+ w& n+ \" E. Y+ f/ P fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 S$ k& N$ d* ~; p) I4 I i& w // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* Z5 ]$ b) j& m' b0 T
* [& o. b$ ^" i/ L$ C, ^ if(fd < 0)* m% j; _0 w4 l' y5 F% ]( M; I
{# w) s- ~, j9 ~, e) Z1 J0 Q5 C
perror("open failed\n");: f2 C# h6 n y8 {/ w S6 t) i
return -1;
: n# W) h" ^$ h" D) H8 Z, r }
; J& q2 i1 u9 x" ^% X Y8 N2 F" ]
* _& K9 ]7 v1 N) ~$ { while(1)( F; W6 c Q6 f) ~
{
& u( o/ `0 Z+ ]* c5 x, O : x2 R1 {( \3 G% F5 _* a
//AMBE2000每次读写是24个字为一帧1 H) h2 c, ?8 R. Y
//写数据时将数据在底层存储起来,等到中断的时候再发送
+ f# r$ T `% t/ K- {* _& }; \ //AMBE2000输入数据是以0x13EC开头的
' H' L$ h: w1 q% {# H) I write(fd,&data_write,sizeof(unsigned short));
/ ^ a( u5 ]" y( k , H+ {( ?, k0 C+ z
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 2 |3 P) {% r! @2 v
read(fd,&data_read,sizeof(unsigned short));
' V5 \2 J: `7 d% l
5 v4 \1 o) T0 t% C0 m if(data_read == 0x13Ec)
* ^+ f5 f0 t G. u& |6 A( y {- B" \0 Q/ z1 V g
' ~. o! I2 N) P4 y9 z6 X printf("data_read = %x\n",data_read);
7 ?" R% h! H7 M }/ L" x( m4 w* A* j( c
/ ~( f6 M8 R4 ~9 |1 E0 _! d
msleep(10);
$ u/ N5 n& H. _8 }% @1 i2 p 0 K+ H/ q# `/ K
/*$ w$ r' t. M4 g: H; v8 d
ioctl(fd,1);
& \1 V7 Q& s/ l/ A6 {# _! s: H sleep(1);: d4 _1 s: _8 i+ ^. H: a! @/ h: d! w
ioctl(fd,0);, V7 {2 Y' C/ H: V. O: v
sleep(1);; C* y8 X2 p+ v! b. v9 }
*/ $ H ^4 c( l: c$ ?3 v. p
} , a, Z! W9 [2 v1 p3 R7 E
return 0;
" u. Q; j& Q: `- i3 r3 U# g 4 w, m& { h4 z; n
} Q8 Q7 h7 E- Y% B2 q: N! F
, n# O$ h0 x, [0 ^7 X7 E多谢各位指教,谢谢! 急3 l) z4 x) n9 V0 Y2 E
" r2 a. A9 \& z. Z+ |3 f( G9 |9 P: E9 }4 `% \- g2 @4 i7 U K
$ m$ y: d% P# Y
" a) Q( V+ A) w/ t, ~6 r
x; U7 ?* [- w' F+ E5 p7 |
|
|