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