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