|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % T8 z9 B% X' j" ^$ d
/*# H1 s5 s4 m" `
* Copyright (C) 2009 Texas Instruments Inc, x* H8 ^* T9 ^# D: S+ [
*0 C& N3 c/ Q: h
* This program is free software; you can redistribute it and/or modify5 U8 t8 B& }& a! j2 N
* it under the terms of the GNU General Public License as published by
) X. {1 J A/ _! | p, X9 n K/ ` * the Free Software Foundation; either version 2 of the License, or) D. a2 l4 f5 c$ p
* (at your option)any later version.
* w9 K6 o! E7 O+ C* k *5 h8 O8 V/ x" f/ H$ t8 D
* This program is distributed in the hope that it will be useful,! _! V& g' V8 m5 G! x T. X
* but WITHOUT ANY WARRANTY; without even the implied warranty of
& r1 K# K, Q9 n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
, g8 k4 j- k1 M' }& a! I * GNU General Public License for more details.
9 B5 j& w& E( R *1 h5 Y6 a% Y5 y
* You should have received a copy of the GNU General Public License
B* d3 H$ ~! @3 j) @" D' H * along with this program; if not, write to the Free Software
9 [6 L+ |% F& a; q* J/ J! P * Foundati& r$ o8 D" J0 V5 X7 X0 G$ w
*/
* |9 m: r/ _, z, l: x- ]#include <linux/module.h>: h2 J. x% G1 U: Q& V, ^, l
#include <linux/init.h>
$ R2 P+ b/ a' W/ h2 {' x#include <linux/errno.h>; L5 G/ W. l. g+ p
#include <linux/types.h>$ M) C) o' P8 ?$ ?! E( z
#include <linux/interrupt.h>
9 R) e8 I- ^1 C$ j7 `: _#include <linux/io.h>* P" T: y. W m/ _5 N' m
#include <linux/sysctl.h>- O/ N8 J, ], k& G
#include <linux/mm.h>8 ]% k! i4 J5 L" Q5 T
#include <linux/delay.h>/ G+ B7 D+ A& N5 `. W+ N
#include<linux/kernel.h>& q. T' v* k" ]3 c4 G: s9 p" w
#include<linux/fs.h>, z! a* G% q/ M3 Z4 V: F
#include<linux/ioctl.h> F; T; i8 J# f
#include<linux/cdev.h>
' G( m8 [0 R- W8 G0 o7 K( ~#include<linux/kdev_t.h>, p' d( @, b! q4 \, R
#include<linux/gpio.h>2 V9 o6 h% L- V! K/ l
#include <mach/hardware.h>" a7 r1 a5 E& j
#include <mach/irqs.h>; g' h5 S, Z6 _! R. g
# M) [, [' Z. S+ O% M R#include <asm/mach-types.h>
b+ G5 `# N1 J( n% ^+ b#include <asm/mach/arch.h>
' W. N: f% @' E- Y6 Z4 \#include <mach/da8xx.h>
1 n/ |* H3 r% ~" B0 F' s: n#define SYSCFG_BASE 0x01c14000! X, R; D2 g/ Z8 B8 A' g
#define PINMUX1_OFFSET 0x124 s, P5 x/ W) y4 G
#define PINMUX18_OFFSET 0x168
5 j/ v, b' N! G( {, w#define PINMUX19_OFFSET 0x16c: [$ ?9 T7 B% D& j5 D- V
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
8 T J% v: F! {5 E3 V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR# F3 `! Y& }) q1 H
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
- F; v" m' U/ m#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR6 I; p, W: w* E9 q) u, g+ \" u" q
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
& p8 y* P/ p# F5 D: ?+ C
' \* |4 A2 C+ S& _% Y$ g/ T6 Y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
" v( y8 a6 ^2 D N#define DRR_ADDR 0x01D11000 //MCBSP1_DRR) k( ?# f% G- p7 ] T
//PSC) D$ u+ D; h6 a# o# s
#define PTCMD_ADDR 0x01E27120 + n* r7 z! [* i
#define MDCTL15_ADDR 0x01E27A3C2 r4 o: ^1 H9 F; T
#define PDCTL1_ADDR 0x01E27304
. a# l* a8 D- \, r0 L K: c$ ]//GPIO8 direction9 }) r! d, ^ B o
#define GPIO8_DIRECT 0x01E260B0& D2 I# E: u, M; ^# v
#define GPIO8_OUT 0x01E260B4* N. r1 |* z9 I5 j' A' `
#define GPIO8_IN 0x01E260C0
4 Y3 }+ d6 o. f( I; p7 U, R' e. s3 A% h# t, m/ J! x: z
//#define MCBSP1_RINT 99 $ D7 e8 z, N: L: i1 K
//#define MCBSP1_XINT 100 " b3 s0 P+ O! }+ z
static int MCBSP_MAJOR=239;
% t4 g, J! C9 R7 L: ]static int MCBSP_MINOR=0;
0 J O8 D" E7 S( _1 v( g6 B, istatic int count =1;, n' B0 \& N4 g4 ?) \+ }6 M4 w
+ M7 K' I; a+ i) h3 t5 U7 o
#define MCBSP_NAME "MCBSP-device"
8 R: ]2 V/ }- g5 I0 @1 E
) i; T& b' M5 H) f4 H* zstatic struct cdev *mcbsp_cdev;. C+ O1 K7 i! [* L
static struct class *mcbsp_class;
y& U$ p8 v2 C0 ?0 y5 e% f2 m% P* J2 `static dev_t mcbsp_dev;# C; O) j, Q9 q$ W: ]' ^
unsigned int DRR_data;8 m" C* V" O0 F1 U; j: a. A% ^3 N
unsigned int DXR_data;
/ r* f5 V. o4 j6 mstatic int mcbsp_open(struct inode *inode,struct file *file). ~0 E* P* m) N. J6 O+ C
{) G9 A: e1 e# {# ?2 Y+ y9 W# W
" B e' B# x" r- p) m //interrupt enable,initialized! \/ z5 m6 e) {" D% T* O9 n
unsigned int temp;
6 @+ E/ |0 n2 I& H) W4 O m( Y //SLEEP_EN(GPIO8[10])---0
3 x0 X$ S' T: @9 R temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ t; r) T* A4 A" u1 Q) ~ temp=temp&(~0x00000400);
6 K% g. B- ^# e( S+ P. o0 y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; o2 N2 p/ V* R0 K
//RESETn(GPIO8[8])----0----1
& W. `* J. y0 W' z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. H, ^5 @ V3 q temp=temp&(~0x00000100);$ m2 K5 E. [6 N
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& M# s7 r6 Z" |2 P! e udelay(100);
1 ~2 T! q2 i* v# |+ m0 b8 x9 W temp=temp| 0x00000100;5 O- \+ [# U5 B- H H9 X
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; i, U' j+ L4 a: N. V% A3 Z
udelay(100);
8 P1 m) _& t' V printk("open success!\n");
1 R4 ^' ?/ e6 [ return 0;
2 }) m/ [. n4 a, D}
9 k9 B. P }0 `0 G! m. {* P3 I/ e4 c: Q! D3 S! d& X
static int mcbsp_release(struct inode *inode,struct file *file)
7 w$ v" p1 k7 f, m{0 o: i A1 a, k
printk("release success!\n");5 r3 T8 ^" {0 D4 W
return 0;' t& [; D1 E8 |# M, d: q
}
; g* m& f% K2 l3 @) w9 I- s, s. _# w& Y1 a/ w) i; n. O
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" e$ j) [: {1 t7 r$ |
{8 ^5 u+ t# e/ l/ [* u- g& N9 z8 D
copy_from_user(&DXR_data,buf,len);
: Z- f0 S- {+ a* q iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); * ]1 y) W) V/ u
return 0;
2 x5 E( c* F5 L) [9 C9 V; B- U
, U* n* _( G% I* E}8 D4 E' p2 f7 p" P
4 H- J2 ]. ^# n; ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)# ^5 j: `% h; K- E, h( u# T5 k
{ & m5 [) ~" O4 J4 ?% ` d7 K
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));. e* s, R* F, V( J a
copy_to_user(buf,&DRR_data,len); % L4 I# d3 Y/ r
return 0;
o* W( o4 n% v}
3 f9 S. i! x0 l. Y. T3 r' `- r
$ l d# N3 Q9 Q/ P+ u$ k2 J* `( r1 c
static struct file_operations mcbsp_fops=
' f6 w5 `% ^) E, j$ f3 M{3 e. @8 `. F& J" `* A5 v9 k
.owner=THIS_MODULE,. a8 j. v5 b4 B5 M# C- z
.open=mcbsp_open,
Z$ z" `) X* h" |9 o3 g3 d .release=mcbsp_release,
2 F" w! _; T# b/ V: y5 h .write=mcbsp_write,
% ]' {4 i" F7 R) L: M+ i .read=mcbsp_read,
! m% }0 b( h- C N k4 s; n};
- M6 @/ @+ V0 s# E- astatic int __init MCBSP_init(void)
% a9 R0 h! y& L5 D8 ?- `{
- a, ^5 m' D% g9 @1 b int ret;; [0 r' O( J5 `2 j) V) D: f& { A: O5 u
unsigned int PINMUX1_REG_old;
/ h/ Y7 M+ r/ g* J1 I: M unsigned int PINMUX18_REG_old;
4 j7 [( ^4 K# u9 R! p; P; v/ ? unsigned int PINMUX19_REG_old;
/ R4 C: a7 m/ u# m, }: t2 `! O* s unsigned int temp;
2 {* U$ u7 ~1 n k ?1 r, V if(MCBSP_MAJOR)9 _+ v$ w# {, y! }4 v( b7 \8 A6 |8 m/ U
{
; l4 ?/ K6 q) X; U! b9 {9 d5 t% n mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- c+ V9 g! D2 J- A' G) w2 H! J
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 Z; u) O1 q; P9 Q1 Y }
! p k( y: q7 K% n* Y6 p else) \- h. ?0 F# Z i: X. O$ M
{
2 o' L: z/ P4 R5 s d ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ i# z% \1 |# R
MCBSP_MAJOR=MAJOR(mcbsp_dev);
) D1 t$ Z3 i" E }
9 _: K' V2 Q2 }
' M# t/ v, Q* }) d5 T6 G. V if(ret<0)
* e' a9 H& w+ K' \( T: H) D {
4 K% e& a* @% D9 a printk(KERN_ERR "register chrdev fail!");" D# L3 n/ x9 [( ~! }
return -1;
% s6 g$ ]6 Q3 u- w }
$ ]4 P. ~" R" i) s
$ ~9 w: d5 W, k E) X! ^' U" A2 F mcbsp_cdev=cdev_alloc();
; j* q- R1 D7 V4 r" J& h: a
) ]6 a6 W4 f+ t4 u if(mcbsp_cdev!=NULL)
4 O% Q5 o3 C" `' X) U8 C( P8 g Y2 E: p {
. T3 [6 T. I& N. ] cdev_init(mcbsp_cdev,&mcbsp_fops);
* n* W) d; o4 z4 T. W7 k mcbsp_cdev->ops=&mcbsp_fops;, o' O( K% Y, ]+ U* O4 o$ p+ |0 Q
mcbsp_cdev->owner=THIS_MODULE;
! k; y6 b3 n' ]: K u + j( H3 L3 s9 j8 j5 g
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
: j4 `" O3 l* Q, H5 Q% W- t! z printk(KERN_ERR "register cdev fail!");9 U! q3 t3 p% f$ J
else7 p. Q6 R- {. c$ d( I5 e0 D2 N1 k
printk(KERN_ERR "register success!\n");* ]* K/ E# B q8 D0 e6 d7 J5 g
}# f5 l$ s& S: O3 l* \
else/ C. t/ f& h' `+ D* A
{- P4 c8 U8 |0 `
printk(KERN_ERR "register cdev err!");1 L% Z G& K; y- Z) M* {8 F
return -1;2 J r9 a3 O& Q2 v$ v- @
}
/ L. x% \; Z, b% J
' x' O9 n1 i+ y' P. q* [7 f% z0 w4 D mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
% M' [6 ~5 e$ W7 ~. ` if(IS_ERR(mcbsp_class))- o b0 h: T; A# O/ L
{
2 T# z$ q- d! h k printk(KERN_ERR "register class err!");. D+ X, R$ L1 u; r+ q! S
return -1;% m. w1 [( J" n: g( i
}4 t2 ?3 E+ k7 @3 o
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 ~8 p3 H( H+ o, Y: l
- L* C1 A* n) [$ ^6 @# l! f
//PSC' ?6 x$ ]( s, X8 I
//add Enable MCBSP3 P$ p m6 x, ]) t8 g0 e9 u
//test
# M- h3 y$ j3 e# H9 n temp = 0x80000003;$ k* g0 b6 }8 J
writel(temp, IO_ADDRESS(MDCTL15_ADDR));; m9 V9 Y5 a) G
temp = 0x00000003;0 Z ^6 G+ G o5 M S+ X; |
writel(temp, IO_ADDRESS(PTCMD_ADDR));& {1 ?( z, w' r: c7 x; k$ l9 k4 @
% t! `4 v/ U2 E
temp = 0x001FF201;
& D. c6 w% e! S* s8 Z X writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ V+ W1 y. H+ {. n! `8 {
* N; w% p8 y$ c" t* L8 G0 E4 _5 G //PINMUX
: @0 D# O9 N& K) ]) i: P* N //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
9 \2 s( T6 r4 {; Q7 I PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 w" S6 y# `/ l: N( b* `6 |' p
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; / V: d4 `% j, k3 [( A+ C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 ~. C( X2 B; m9 e 8 p: ^& ^* y$ p3 P( K5 c- T
//SLEEP_EN,EPR,L138_SHK1,L138_RC
' ?& X' d" |* n& u |& C" Y+ j PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 5 ?6 r; d5 L! h* i: s K9 f# r
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; % P6 q) R. P" U/ y8 ^
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) C& @/ m4 l3 P( P
( _; n: k) \# S9 t* k //RESETn,L138_SHK2% d3 Y- d: t5 j
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 F+ Y9 L$ L* B3 y+ l" r PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 2 B& Z0 z/ x6 U V6 O/ O
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ @/ V- X5 r; _! J: Z$ b- R
, A6 b7 X R% u7 |& k0 E
6 c+ p3 x( z, x' o& _+ z) i, n( i
//SPCR Register
5 ~) p) b# V$ u! @ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. a4 O$ A2 N# v1 H8 y% \ temp = 0x03000000;//(DLB=0)
0 {2 B" g6 _. x$ h: g // temp = 0x03008000;//(DLB=1)
- p6 ?/ a* y; A) l9 C6 M% f% } writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset0 W* m$ k3 o4 _# R$ s4 B7 U
temp = readl(IO_ADDRESS(SPCR_ADDR));
8 x. I- B; y9 i. L2 [$ m printk("temp=%x\n",temp);+ I" T6 W$ w6 @" l* L
4 } [! q4 H4 n! o( |1 L //PCR Register1 X% }6 Z- I" `! e; V" U' V
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0( a7 {3 Y- y: ^
// temp = 0x00000F0F; v0 d, x0 I7 |" `" z
temp = 0x00000B0F;
, d: q: \/ Q$ C% F writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
|1 M) ~0 l3 p* a7 H: O. G x temp = readl(IO_ADDRESS(PCR_ADDR));# d) y, Z( j( K1 G
printk("temp=%x\n",temp);
' K# g) d; S- b% o) G3 ^% ~ //SRGR Register
' X% m# d% u$ ^. O0 Z X //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 z2 e$ O1 B: a9 _' i! | //temp = 0x301F000B;
3 s4 a* g7 f# Y" b5 j writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
. Q+ Z# e# X- n$ V3 a _ temp = readl(IO_ADDRESS(SRGR_ADDR));
7 X; M) o' _) o# S& `" i printk("temp=%x\n",temp);
$ I! e( R6 P( I% [; `, Z9 J //RCR
) ]+ [! b$ a; ] //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" a% [, ~$ j0 C& {3 f //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ L6 {7 w& r$ b) t
temp = 0x00440040;
8 N8 R) |1 G% d/ { writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
% H3 G! ?+ r7 q/ b! W/ ~ temp = readl(IO_ADDRESS(RCR_ADDR));
! i: b" M$ N0 _5 y printk("temp=%x\n",temp);
/ |+ A: L9 |8 ^5 k+ U* ]- [ //XCR
% E: A' c- b/ E/ M) p6 ? //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 s% k u/ d' ^* Q7 O/ V7 Z //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0 r) w) R9 C" Y, t2 D& m
temp = 0x00440040;3 F6 I/ B: r2 j% ^* z9 f
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' g" X& t/ G) u- Q) r& [
temp = readl(IO_ADDRESS(XCR_ADDR));
: z8 a5 ?# X, i printk("temp=%x\n",temp);
- C! M/ D$ c+ S6 c. W udelay(100);
/ F8 X2 G9 W. L3 l7 j6 f: h //SPCR Register8 P5 x# M- L& ~( k* H
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 C0 Q- E( O6 C$ M" k" r8 c
temp = 0x03C10001; //DLB = 0 VS DLB = 14 A3 \# A: M: O. c& Y& F" |) s
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
+ i0 z& F0 n* M4 U/ W6 z% o B temp = readl(IO_ADDRESS(SPCR_ADDR));+ F# K! a( a6 Z p7 L4 ~
printk("temp=%x\n",temp);
! K' g0 _/ A: D+ Z3 S# | udelay(100);
0 j/ W6 ~5 S1 X9 l( i
! P8 s4 V7 Z: {. {3 G //set GPIO direction
w2 u/ ?) g/ @4 H# Y1 b& ~0 Y temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% S6 [- |1 F5 _$ V7 l/ e. i1 W temp = temp | 0x00000100;//EPR----input, I7 Z- E! W( x
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; e* A/ f* S3 d' F; j7 F7 Z __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 B; V0 `6 S! N9 ?! h: ^- F9 ~
. C4 [$ @1 M4 i/ _0 ` return 0;. a `" a* l' k5 _# Y$ A
}$ `+ O6 b( O# W* H
static void __exit MCBSP_exit(void)7 ]: n+ d. Y% Y3 N- ~
{
, D6 [! H5 v2 N/ U8 G8 { printk("mcbsp chrdev exit!\n");* P4 J+ {1 q/ o0 t) Y; K
cdev_del(mcbsp_cdev); J" U: z6 Q9 v) Z8 S/ W- g
unregister_chrdev_region(mcbsp_dev,count);
9 c0 t) n# _. r; N device_destroy(mcbsp_class,mcbsp_dev);
. K/ {7 u6 A, ~& M1 H/ h7 f* Q class_destroy(mcbsp_class);
- |( d l! m; A: ?}" r$ a4 o7 d+ R% b
module_init(MCBSP_init);
q' {# t) r" ~module_exit(MCBSP_exit);
* X) T L1 p) m1 G( `: g
9 [) @* B0 H8 {% N- d, |' AMODULE_LICENSE("GPL");6 r2 V$ w6 b9 R8 [% r
; N# q- r: i) S+ K4 z1 M) ]我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# I- [# i" V( L: ?0 v4 b& S
我的应用层的测试程序如下
( d3 W/ r+ n1 L% J/ s, r#include <stdio.h>' C/ Q# H4 a# j- ]
#include <string.h>
9 K1 s# X- Z8 _4 Z; ^8 P" l#include <fcntl.h>
$ f7 d( R7 `5 T+ B" O; Y, S! F#include <unistd.h>2 |& _8 L, k) c6 s5 o/ Y
#include <signal.h>
4 r* J4 m5 q7 [: P#include <pthread.h> //线程) i+ F h" {4 R! Z4 z9 `
#include <stdlib.h>
7 A) g; D3 m- r& R1 @#include <pcap.h> //捕获网口数据* s- R0 O$ Z5 o' N, d7 _
#include <semaphore.h> //信号
- l7 g/ E# V1 N/ O! }6 t( |' V2 P#include <sys/types.h> //消息对列1 Y* w5 B& v- ?+ o, Q
#include <sys/ipc.h> //消息队列
, W' ]& Y1 I! y#include <sys/msg.h> //消息队列
5 Q1 V+ ~9 M( U2 o9 H) }! u, j#include <sys/select.h>
8 ], }; W/ E2 C9 F) o#include <sys/syscall.h>
2 v6 a, W7 d, _9 b#include <sys/stat.h>2 J3 @0 q/ w3 w# b( i( i
#include <sys/mman.h>. ?- J( |4 k/ F, O; J( X" z0 H
#define msleep(x) usleep(1000*x). Y7 _6 z' |% A
0 d6 q7 }" n0 U' qint main()
1 Y' W1 ?5 F$ f r* ` ^{
2 \4 x! g D) [# r% A8 e H2 N //MCBSP,ARM与AMBE2000交互设备
! h ]1 j& {7 p1 O% b- { int fd;, x( B0 b9 b* _" G4 M# h7 {! s
unsigned short data_write = 0x5555;
- T' z1 s: ?% p2 X# ] unsigned short data_read = 0x00;
+ g4 k$ R7 j' y+ q fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
; W4 Z3 S5 Z! ] // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ ? ]2 ^2 d2 f/ T& d: a' \" f
2 @0 r% V9 O. N/ t* z if(fd < 0). z, L1 C. v5 y2 @
{8 `6 w( h" u1 d5 y- c' ] H
perror("open failed\n");
" R- R8 C0 v2 z# N+ e return -1;( @0 o/ F. P6 b( _
}, r) E4 w, X- q; e! ]# x
6 k4 m4 C( L% P2 r+ L while(1)+ N& X4 v# v3 G" S& x6 w
{! E3 O8 _8 t0 z+ @$ N! l! w
/ ^3 ]# H5 S9 _; W9 |, h, @ //AMBE2000每次读写是24个字为一帧" F; e( |8 e* }9 g _
//写数据时将数据在底层存储起来,等到中断的时候再发送4 c- c# A, _- B! D( j. H% T+ L- [
//AMBE2000输入数据是以0x13EC开头的4 A- W0 J; F$ j" g) m* w
write(fd,&data_write,sizeof(unsigned short));
, V" f+ o$ \4 Q8 p5 L# Z# { 6 G( O, z9 |8 ?5 n5 |/ ?& K$ M
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) X- U. E9 v! _ m) ^0 A read(fd,&data_read,sizeof(unsigned short));
4 ~8 {* J8 H( U! Q4 y) x) ^8 O0 r ! l% e# l( r% F7 V3 [
if(data_read == 0x13Ec)- G# A* v) b8 G
{$ H$ N% J2 i. z1 w/ v
* Z+ n" a3 Q3 U2 d6 ~# z, w printf("data_read = %x\n",data_read);
5 D0 x) Z& m. R3 H$ E. ~! |, a }
- P3 Y7 z" I5 f9 F% i5 g2 b. V 0 \) }" y8 l6 T7 _. j
msleep(10);3 M" f9 l3 a* h# X
0 X" m X5 `0 K3 ]: {
/*
$ m8 o, k& q n0 d0 y ioctl(fd,1);
; O3 J+ e$ ]. {3 } sleep(1);8 d% R) \: E3 t1 c
ioctl(fd,0);2 L! x; Z$ H& d5 Z$ z {
sleep(1);( W$ d; A( y1 \
*/ 7 S4 M* S, t7 ~9 W
} / D, [. P x( {/ I0 C: s
return 0;
: p; l* f. s: ~$ T
) _' U2 |8 k5 P. D" J8 s0 B}
! I: |7 q! h$ W: v0 I& E+ m( a" I$ U# c
多谢各位指教,谢谢! 急! r5 G D; J$ }, y3 F8 K% ]7 H& h/ K6 v
6 N; p" G( F+ e. ]: ]
, ~" _ D& ~2 d' {& N, C1 S3 I; Y
]! Y/ `# P* E9 r3 h, g) Q" m! f. K ~
# [9 g. t7 C. `! I: ^ |
|