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