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