|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
* N3 z) s* v1 s! j; a/*2 R8 U0 ^$ u: z) y3 C0 @
* Copyright (C) 2009 Texas Instruments Inc; \5 |9 a: T4 H; B! p
*$ k$ l& B: a% [ w
* This program is free software; you can redistribute it and/or modify
' U/ B9 _( P5 Z6 l" y0 @ * it under the terms of the GNU General Public License as published by
1 `. L) G9 k0 v9 e } * the Free Software Foundation; either version 2 of the License, or
' c6 U) ?; }2 R * (at your option)any later version.
% k! A4 s4 h& p6 e0 P0 B8 m, H *
/ W2 W4 |, Q1 U& i8 h/ U5 h * This program is distributed in the hope that it will be useful,' m0 ?, S2 A" N) Q" N t5 }! }
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 _/ Z- f- }$ D * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( U' U& ?" ]" h * GNU General Public License for more details.
( ]7 w3 u: E% c9 p( f *2 F0 Y/ B" m: _, a6 W
* You should have received a copy of the GNU General Public License
! I0 ]- H& T! C * along with this program; if not, write to the Free Software
. E# w3 k G6 L$ } * Foundati
) o1 V9 L1 q% l6 f* f*/- x, c5 A! E# w5 @, d" h/ _
#include <linux/module.h>
3 a. Q5 k! Q6 b, [' j- ]& L" N7 }#include <linux/init.h>
, \/ \7 C" ~' f9 F2 B7 i! z6 g# m: f#include <linux/errno.h>
4 M7 h$ V, G I% w1 a# s5 p#include <linux/types.h>5 D( r' E+ m& U, b/ D
#include <linux/interrupt.h>) k: J- ^9 A4 ^ A V
#include <linux/io.h>
6 Z' s6 k' ?3 m- z, z#include <linux/sysctl.h>
" k t- i3 _3 n#include <linux/mm.h>$ m( \/ O2 z/ Q4 r* o3 e/ Z
#include <linux/delay.h>
2 U8 {, T6 Y4 x4 `# M0 p3 V#include<linux/kernel.h>
" K6 n, i" e! S0 \5 W8 g1 n* |4 c8 W#include<linux/fs.h>
- H6 `9 I$ S" h3 H0 Z0 b#include<linux/ioctl.h>) B4 Y# o X- F. b6 b" H2 ]
#include<linux/cdev.h># O8 j1 ^+ l" `! F$ O
#include<linux/kdev_t.h>
3 n, b$ L! [4 I6 r( P1 j% }#include<linux/gpio.h>
3 H% x0 _+ K7 Q#include <mach/hardware.h>& q4 A4 u) j$ N I
#include <mach/irqs.h># a5 U$ z. r, ?+ ?+ w* w
: t/ h. C$ P! Q' Y) v; ?#include <asm/mach-types.h> O+ R5 Y: G8 r6 a
#include <asm/mach/arch.h>
# m z7 a: p+ S#include <mach/da8xx.h>
! t; i8 ~5 \1 ]2 b1 }( ?+ m#define SYSCFG_BASE 0x01c140008 B$ z* o$ J6 U( S* k7 \
#define PINMUX1_OFFSET 0x124
n, k- K3 N8 Y#define PINMUX18_OFFSET 0x168
9 F n A( ~( j5 l#define PINMUX19_OFFSET 0x16c8 i8 i: ?& O5 |/ q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR ~& m X0 D5 s7 v
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 t- @6 [* p9 K5 | d: E3 s/ K! S#define XCR_ADDR 0x01D11010 //MCBSP1_XCR" X' e; P/ n" n7 K6 ?4 Y5 G
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
( B0 y: X% h$ h2 [. ]0 k0 W#define PCR_ADDR 0x01D11024 //MCBSP1_PCR% ?3 a( o( Y* r9 M( o3 j* b
0 C" V" S; H5 }. S3 [" N#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
" v' e k; W. m#define DRR_ADDR 0x01D11000 //MCBSP1_DRR5 z2 A7 T0 r8 T9 y
//PSC% i0 a' R( }/ T k: i
#define PTCMD_ADDR 0x01E27120
/ K9 o9 o' n; o5 n( M! {! D; H- a1 a% J#define MDCTL15_ADDR 0x01E27A3C+ m. v" H% ~9 X
#define PDCTL1_ADDR 0x01E273047 \( Q0 {* c' J, F. K" L& l
//GPIO8 direction
/ L0 @4 P* ]9 P. {0 d2 D#define GPIO8_DIRECT 0x01E260B0# z$ I- z$ c" O. V7 w; o
#define GPIO8_OUT 0x01E260B47 O1 R) O0 f+ o* ^8 G3 N
#define GPIO8_IN 0x01E260C0
" s7 h! A7 r2 V! l
$ w5 J& l# K4 d5 O& O" B//#define MCBSP1_RINT 99 , x: \. u; b: E; ]! m- l
//#define MCBSP1_XINT 100
- x1 }, V: F0 g$ ?% L- H; [static int MCBSP_MAJOR=239;( x1 E& F6 U0 W. [" E/ _: k6 R
static int MCBSP_MINOR=0;
2 o$ R( D G* r: _- B/ vstatic int count =1;$ R7 y* d7 Y) d
! z& w3 `4 I& R9 R! z9 b0 H
#define MCBSP_NAME "MCBSP-device"' g. Z( F( s5 ^8 e y \5 Q9 f
; B# g5 v% ^+ k+ M
static struct cdev *mcbsp_cdev;, n3 l$ O7 Q/ Y: ]) \. E
static struct class *mcbsp_class;5 \9 D. o7 M! h# v+ W, ]; {
static dev_t mcbsp_dev;. ~) f+ M: g U1 Z
unsigned int DRR_data;; `. V$ ]$ U6 j" A+ T" |- V
unsigned int DXR_data;
8 [2 ?% c0 P, g% `8 gstatic int mcbsp_open(struct inode *inode,struct file *file)
. h _$ Y y3 z& r" P. c{/ Z6 e8 q* q) B; S
4 _+ ^; s1 Z5 @6 a ^& D/ D8 Y
//interrupt enable,initialized5 ` z/ S# c) F
unsigned int temp;
( g7 Z$ X, c: S: ` //SLEEP_EN(GPIO8[10])---05 N6 [7 T" Q+ x( \! Y: h
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 W2 f3 u+ G. b, C$ t temp=temp&(~0x00000400);2 e: v6 z9 f$ o, _; C% T1 `
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: k, I" N( u& O' l9 z& p+ }. k6 F //RESETn(GPIO8[8])----0----1
; _' U1 U6 f- Y: P3 z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: ~ R7 Q: L' S1 O1 O
temp=temp&(~0x00000100);" G( [/ d, [0 e' ?- b7 [; T+ d. C/ a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ g6 O: w+ @4 j0 U A udelay(100);. w3 y! w3 o4 _( q6 Z
temp=temp| 0x00000100;
1 N* F4 \4 N! I __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* s, j9 [! w7 i
udelay(100);2 b: |0 g. b4 l8 V% G
printk("open success!\n");8 w1 g$ w' h+ ?' ?
return 0;
6 s& N$ ?" W$ e9 z}, A- c- r/ J! q
$ x( [6 k. _' ~/ a# jstatic int mcbsp_release(struct inode *inode,struct file *file)8 n- G( ]9 n$ e; L- a
{7 p( Y: q! W4 j
printk("release success!\n");
O# x/ n& ?4 M2 u3 R return 0;
7 ~* y v5 u3 U+ l! \$ h}
/ ?$ L7 R* h/ ^& T3 }5 f9 ?+ s5 `# a
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); E8 \/ v, K# }% Q
{
. g/ }4 N8 l' e$ ~! W copy_from_user(&DXR_data,buf,len);3 `( _: z. x8 f) A0 Q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* K8 W& d* ~: ^" [9 y* {/ D return 0;1 N1 d, Y9 D) i8 t
; v* s9 I& ^* j% g9 k}) Z' _$ \% `+ n0 x4 d6 Z
0 `# Y8 b! o9 H2 \1 ^; ~& B
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! E+ }2 h F7 h- C g4 N% V$ H- P
{
# z( I5 C9 Y* i( R DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# R* K) u3 ~! Q/ b0 p8 `' B copy_to_user(buf,&DRR_data,len); 5 v- G, b$ ?( f" h
return 0; l# I# H; r B% O- l
}
+ ^. a9 V& x* c' A I3 `2 }; W. t' l( A8 q; e6 O
8 {0 k5 ^* D$ m6 lstatic struct file_operations mcbsp_fops=) T9 J# ~+ E( ]1 Q5 X6 m
{5 k0 X: P, J- B
.owner=THIS_MODULE,& g- h, {5 k7 ]( Z
.open=mcbsp_open, [9 v6 X9 l5 R: n+ Q1 b) y2 t
.release=mcbsp_release," h& R* y& l- o6 ] Z
.write=mcbsp_write,
N/ e, R6 j% q" S- w, s .read=mcbsp_read,; W7 K1 f) M! Q7 j: F
};
% N# z; ?) e8 E6 h+ h( ystatic int __init MCBSP_init(void)& _9 {+ u5 s0 v3 D
{! T; A% {% E8 |( @0 O7 o5 j7 q
int ret;
, k/ p' `! }7 T; i) q } unsigned int PINMUX1_REG_old;' Y1 c; N. b! F6 r9 O
unsigned int PINMUX18_REG_old;
: x$ d4 c) _: }+ i; } unsigned int PINMUX19_REG_old;
% [) g/ o) \9 w1 f6 l I unsigned int temp; : ]- j- ]6 f* }! d
if(MCBSP_MAJOR)) y7 e$ @7 C% Q8 t0 `: d
{
& p3 @/ Q4 z6 n* ] mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- h& u+ Q% F% f" E, u* @ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
. }+ Q( _- B' W+ K- C1 g$ t4 D J }
j: Q' H# Q6 @9 R! `: f. k else
7 a3 }6 G! `1 Q5 l5 \$ Y& d {
$ a# j, c: q/ s4 R- T ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( c0 `: I) ^; @' p MCBSP_MAJOR=MAJOR(mcbsp_dev);
o, z( N, L( \& t$ o# T' J }% z. }2 M' C' I; s+ f+ z
1 Y z' j; ^* O! e) l. z
if(ret<0)
4 b: C+ P1 u' P8 S {
. q- ~) C4 j' T- x0 f+ D printk(KERN_ERR "register chrdev fail!");
8 z H2 P/ G3 d: ?6 Q; A6 h, k return -1;
( p- n' j" b6 b8 P4 P- c }6 Q5 R. f) t5 _/ O9 K2 e
& D, X T4 V0 l, r8 C! G; X, } mcbsp_cdev=cdev_alloc();
9 V$ R& _3 |& [* M4 r" w 8 ?/ S* V7 k/ S2 }
if(mcbsp_cdev!=NULL)( [6 v' L2 z, S, |: x" m/ w
{
2 F, u! j W! b3 p% m cdev_init(mcbsp_cdev,&mcbsp_fops);2 {6 V! ~2 }. T/ G5 [1 g! Z% C
mcbsp_cdev->ops=&mcbsp_fops;
+ Y: [0 n8 F* X3 O* g. Y7 R mcbsp_cdev->owner=THIS_MODULE;4 Y& e- L$ v6 p9 S- q, ]$ r
+ n0 L. j3 p3 F* y; w6 H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& X Y2 B3 f9 ]2 ?
printk(KERN_ERR "register cdev fail!");
( k- b& R# W L% y3 Q0 h4 x( c9 i else! e1 V. D& z& g
printk(KERN_ERR "register success!\n");
1 B! r0 p t7 q( N+ S }, }& z. X% a5 D# ]
else
6 _& U7 g" y4 k7 k$ }# U- \, s {
- N) A: j, ~+ a5 u) p printk(KERN_ERR "register cdev err!"); r" }; K. m# U6 k
return -1;) W: r, n2 }) q8 `8 H' j5 ^6 x
}
* y ]' Z( F g
P( W I! k- L/ C% E mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( h2 z, N5 W S* G7 f if(IS_ERR(mcbsp_class))5 f: V* p# Z5 _: U) w4 l0 q
{8 ]+ Z( h* a: c+ i4 T
printk(KERN_ERR "register class err!");9 W; ^3 d2 w$ V0 g5 _3 ?4 [
return -1;; v0 k% I7 g: K$ n
}
9 H# ]1 i# P7 [3 c device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 h$ ^: Q2 N0 d4 m
) V& z x# k3 v2 ? //PSC
0 ~, @0 J& J( p* l; S2 W //add Enable MCBSP* N! s6 c7 l) ?6 U' |
//test
( A3 b/ O# M6 U/ z( G temp = 0x80000003;
4 z9 }. R1 ~1 Q# b& `7 Z) C writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 [, x' g8 k2 u( v$ {
temp = 0x00000003;6 w( H8 y% {" k: K) j |
writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ h: F/ Y9 R8 e2 n' f' C
a, y$ \/ E, |& P temp = 0x001FF201;
" k8 l1 p; C% C/ s' w. Y: e writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 A6 b( J6 E* K: d" q9 J6 z, |- ?4 o 4 U' C, j3 P1 s) K& O$ J
//PINMUX
; l( l0 E2 {/ L //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; V5 t) c1 @. O @) d$ l PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); % ^0 G( }$ ]' i! z n
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; + ]9 _# \( W, K8 K
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ n! e/ e- [+ c8 ~3 ~
z# I4 X9 m8 k9 F5 {' F7 a //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ j2 r7 ]1 }5 W PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ B7 Y% m1 n" }" L0 B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
3 E" }$ v+ d3 o writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 n( D2 J7 z1 w# U f , |' {/ O, a `& ]$ B$ W; r! i
//RESETn,L138_SHK2
2 X: A, n- E- G' R5 s7 A& M! [ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ( X2 j3 n3 w- z: r0 l
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ( L, g! l( [) e- X4 X( A
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# r( R' i1 `8 K: }
7 D8 c% w1 V; Z7 a 3 ^6 U2 j. S1 B/ G1 ^+ E& F& M3 b4 j
//SPCR Register
$ h2 O0 L2 W( H, M: w8 P. |( O //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 h( [( g( l# c1 Y! a temp = 0x03000000;//(DLB=0)
$ M5 ]* E1 A( b5 }: ?% F& P // temp = 0x03008000;//(DLB=1)1 c) M+ u8 w% O3 f' e
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset, }. M2 O3 e* p+ U0 v
temp = readl(IO_ADDRESS(SPCR_ADDR));
5 n: i" k+ D$ f2 |" Q" P/ ~ printk("temp=%x\n",temp);0 D0 z& m- \6 }! l- }
1 f6 K( ^3 g2 l
//PCR Register
6 \2 \* Q% G1 z" P* R //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& x- O) b2 I* H! \1 k // temp = 0x00000F0F;
! o: X. q- b0 A1 u, Q7 S temp = 0x00000B0F;
1 M& n! r$ `! @+ P3 b5 _! Y3 Q$ W% J4 } writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 0 S* B! |( z' h9 |( N5 a" a5 [6 y
temp = readl(IO_ADDRESS(PCR_ADDR));- r6 X2 G: K {
printk("temp=%x\n",temp);
: s$ G9 F7 V: w; q* S //SRGR Register T8 o3 d: ?; a9 r
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
]: l) t8 W% u' f8 U z* R& }9 ? //temp = 0x301F000B;
- u0 j# j: K( p% J+ @ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
, }& v' [$ A! u8 Q* E. L" U# x9 Z temp = readl(IO_ADDRESS(SRGR_ADDR));$ [4 `4 q1 f6 N; _" T
printk("temp=%x\n",temp);( C1 _" ]3 ~3 s1 F" P
//RCR
4 ^! H1 V. N. G ] //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 f# ? g# l( w+ h7 Q% i4 W //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
8 K! f7 F4 ]+ j* z temp = 0x00440040;+ G. c# y. I9 w2 W7 z9 o
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 7 z1 L) {, [ d4 C: r
temp = readl(IO_ADDRESS(RCR_ADDR));: C0 V; y" R2 W3 d0 [+ P' O
printk("temp=%x\n",temp);
) [( e! [: A8 N7 N) e5 }4 v- ~ //XCR7 h+ B! }1 }; T$ F, m/ L. O! R
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; x6 R5 g3 e$ ~ F6 Z& A
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0+ N: }' ^, |* B- \
temp = 0x00440040;
+ M& b+ k; f } writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
! i: s u) b& u" H temp = readl(IO_ADDRESS(XCR_ADDR));3 z- X6 b3 l' x# F1 v
printk("temp=%x\n",temp);
2 R) V# z, Y( _5 n$ ^# G( Y J udelay(100);
p: ` k$ l1 g( `4 Q //SPCR Register' a: ]+ Y5 U) w0 Q, N/ N7 _/ o$ U
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
# x# B2 C q7 z% D temp = 0x03C10001; //DLB = 0 VS DLB = 11 z" b. }# a0 u c
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
0 E4 n: @' d5 Z) u P- G temp = readl(IO_ADDRESS(SPCR_ADDR));" u" O9 G" q2 |
printk("temp=%x\n",temp);9 n" o3 | F" \' F2 D7 D% n
udelay(100); I* I, g: u- q6 [ H
; n6 k. j: o. [# }& L; O4 [
//set GPIO direction2 e5 O" R! s* |+ x6 U+ q
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. D4 f' c I) d! P* M
temp = temp | 0x00000100;//EPR----input1 p. @8 o1 [3 u, R- I# I1 m% M
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output A) X. A" H# T: b, b. ^4 M
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 o! G% C' `$ v P6 k3 a9 Q
+ J/ a7 ?& T6 s
return 0;
: ~3 x$ D7 `+ U. f}
0 ]% L$ T. H2 m+ ]6 }static void __exit MCBSP_exit(void)
% j% K# ^7 Y7 D/ Y) r U# B{
! z0 f, W! r( b( A% l* d- s printk("mcbsp chrdev exit!\n");& Z- J) t" M* S$ r) @& A* V3 l
cdev_del(mcbsp_cdev);) ~9 S! s* z& [7 U) _, g
unregister_chrdev_region(mcbsp_dev,count);
( T3 o+ ?6 E5 S/ y$ C( u% ~ device_destroy(mcbsp_class,mcbsp_dev);; R: p* ^' f5 D
class_destroy(mcbsp_class);3 c+ @% l+ Z ? m. L& `+ G
}
( [0 c5 L! k* Z6 a: b* dmodule_init(MCBSP_init);! c; N" b% `$ n( s# C& B5 m% @
module_exit(MCBSP_exit);( a/ K j1 q# i c; K! s; N
5 J6 y3 L7 ^3 @! W% HMODULE_LICENSE("GPL");
: K5 d0 W" z) b9 O' j+ H! v& \6 l
' z$ z0 q1 [. T" z( k, k" o4 s我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
3 R, u, A1 o. z我的应用层的测试程序如下
+ o4 L3 P! r% N W#include <stdio.h>6 L$ E3 J; t; L# i8 a
#include <string.h>- L0 n) q$ c- S7 h* o
#include <fcntl.h>
: e" m# t: V8 [. M* `7 Z D#include <unistd.h>: U8 m2 e6 Z7 J% W4 \4 @9 t! F
#include <signal.h>
/ v4 S; r0 ^6 F; x) y#include <pthread.h> //线程) M+ U8 v. b4 P% \! d
#include <stdlib.h>
7 \9 l' C8 L) v8 I. h) l#include <pcap.h> //捕获网口数据+ N7 N# B5 d) }/ D% y9 w5 d$ j
#include <semaphore.h> //信号 ?2 p4 |4 w! o
#include <sys/types.h> //消息对列" U, {2 C& D# G$ K2 S
#include <sys/ipc.h> //消息队列/ @' S9 @- E2 u) v. N6 h
#include <sys/msg.h> //消息队列 o ?) S- ^' l8 ~9 w* K- K
#include <sys/select.h>2 F- d3 w: k$ i; E! U; r
#include <sys/syscall.h>
* ~: J9 a+ S; [2 k#include <sys/stat.h>- v+ n" O' F# G% Y
#include <sys/mman.h>
# |7 O! H: k/ L7 ]#define msleep(x) usleep(1000*x)
- Q9 A* [! T& ]- Y- N# v* ]4 e# ^- `% n1 p4 y. d2 J
int main()
: ~+ o6 Z1 t7 M1 O" Y{ 4 I) W9 T9 u( M- q4 g8 p& R
//MCBSP,ARM与AMBE2000交互设备
& D* `* s; ]$ @& u) [% z1 e+ t int fd;
# M9 |# l5 }0 z" L& W unsigned short data_write = 0x5555;
6 z2 S' _$ I- B) B4 C9 B8 Y1 I unsigned short data_read = 0x00;
( ]5 X( {, U% c. Q. b( N/ t fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ L( y( \- v9 l1 U. R& L
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% i; E# E1 u1 O2 w+ p
9 e# }9 G% l# P- e1 K/ Y
if(fd < 0)
; [: C: @ ^1 T7 l a/ `8 o. D {
$ |5 r+ y' ~: g% Z8 | perror("open failed\n");' S5 _4 p/ Y, w, a5 x
return -1;( H* c3 @7 K2 b$ R
}6 d w( Z- ^. L. {
, x, d+ Q9 A8 i. k while(1)) s! g" b" ~2 X$ T; n/ A" Q- o
{
6 p0 m" A" G3 A
; B, y& `' G9 u. X //AMBE2000每次读写是24个字为一帧
# `& Q. `7 f7 A3 K9 C //写数据时将数据在底层存储起来,等到中断的时候再发送
) N: l, e1 ~9 m P! L2 m% t //AMBE2000输入数据是以0x13EC开头的' C$ |0 z" I# L3 Z/ X
write(fd,&data_write,sizeof(unsigned short));
9 \. @% n5 A2 _* ~6 ~$ j3 {1 G
1 d3 T$ L1 c6 Q$ c& m( l) p //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ u b6 O9 L6 b& S* a# v; S
read(fd,&data_read,sizeof(unsigned short));1 [; Z+ D" s5 j+ p5 ?# Z7 A+ k
5 W6 `- N+ n/ {& `
if(data_read == 0x13Ec)( P( h0 `" a3 l/ c; h* D; w0 l1 W
{9 h# ]6 J) L% l3 a+ E% C- i
6 O) Q8 y% k' Y
printf("data_read = %x\n",data_read);; r: x/ b. `( C
}
: y/ \( n s4 a0 V . `0 D# \0 v9 m+ Q2 z+ h
msleep(10);: Y5 i% } e* C4 O
+ d6 V4 G: O. d. v /*1 \8 }2 h0 Q! q* {' V5 P( `& @
ioctl(fd,1); * N- r/ b/ X$ L; s9 i
sleep(1);
5 W7 u$ N$ v; L6 Z0 T2 D ioctl(fd,0);
7 ^+ Y/ L9 K' `0 N sleep(1);% l/ `4 x! c: g% o
*/
" k* h3 v7 C4 w7 R+ R, ^' g }
3 Q3 c- [. [2 j3 @+ w! ~ return 0;
0 `, ^% M) A/ q/ S: [; h
! p9 `7 O" _2 F! Y}7 Y' R B4 \# w) A& v
) i7 t# E( |' W% D
多谢各位指教,谢谢! 急
# b2 M7 z7 p- y3 f
, c7 t; u: X" S" }6 c/ e' K+ x: E( F, Y5 }/ o! Q O
4 o5 J: A* W- g) B5 Q
1 @0 b2 _. J! m5 J7 b
7 Q) G" }% H5 f8 n |
|