|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; l. z# ?; w- `; f' Z
/*0 j- m$ B. S& X V
* Copyright (C) 2009 Texas Instruments Inc
, {6 T, K: P8 t6 O *0 \" }$ O% S! ~8 Q
* This program is free software; you can redistribute it and/or modify
: v" x; x. o5 t2 N * it under the terms of the GNU General Public License as published by- o4 `. V2 s/ C/ X3 s4 Z: o. G
* the Free Software Foundation; either version 2 of the License, or
) U9 s% G6 |7 V * (at your option)any later version.9 P& _+ R( y' H: W4 @; H6 X' j
*, H* d: q4 z9 m* ]% {& [
* This program is distributed in the hope that it will be useful,
% k2 X8 [+ ~$ O$ X+ A2 S" y0 x * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 _) H% g/ @' I, a' C! v2 P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 w: F3 C6 ]1 a1 P: O' `) L1 M * GNU General Public License for more details.
, q! l5 k3 o6 P. S" M. e *
, `* f3 f2 Q( g3 ?# i& C * You should have received a copy of the GNU General Public License
+ }# j; s7 r% A9 v* h * along with this program; if not, write to the Free Software1 t, t5 K4 w; [( `/ J& D
* Foundati
9 G: P1 ]8 M" P( e! q2 \+ O*/
8 M4 I4 F5 O* `1 Q- W4 A#include <linux/module.h>
- e" P& b' a8 _! `, T7 K% B3 t: R#include <linux/init.h>
# [; G/ v. F0 K4 [/ |#include <linux/errno.h>! L2 J6 g/ z! t5 m: X9 E& |! M5 t
#include <linux/types.h>
, X# \1 X# T7 K& @, q" ~& e#include <linux/interrupt.h>
5 ], j# R! g1 h9 _$ k#include <linux/io.h>
4 u1 K! o, ]; i( j) P2 Q: o#include <linux/sysctl.h>8 {# J1 s: U; m& w, D/ b" |+ R
#include <linux/mm.h>
. i: T- S) _+ w/ f% O#include <linux/delay.h>, y- _; N- F$ c0 m4 D( n# Q
#include<linux/kernel.h>
: \1 }& X1 C% Y4 P9 M$ s#include<linux/fs.h>* ?; [) E- ~& i2 A W! e9 S
#include<linux/ioctl.h>
: k! h8 A+ d" J, }#include<linux/cdev.h>
' p8 S4 J9 Y+ t. ~% q( P( a; J* K% [! i#include<linux/kdev_t.h>: I7 E g- W1 S7 T
#include<linux/gpio.h>
+ [; K1 ? ^2 r# x- c#include <mach/hardware.h>
$ n5 d u& ?. [#include <mach/irqs.h>; `* x( i1 m0 p7 G( o& ]
6 o& \0 J, W0 o4 ~% m9 M! x' n& X" y' I
#include <asm/mach-types.h>( t. C$ E! r# I$ ~ C( p
#include <asm/mach/arch.h>
6 ~* }# x" J. I* k#include <mach/da8xx.h>
7 ?8 s) R# ^7 k* \, m" Y#define SYSCFG_BASE 0x01c14000& G- p" W9 R0 ~ D8 o1 u
#define PINMUX1_OFFSET 0x124 7 |2 g- y6 P: N9 c& ]( C) [6 M
#define PINMUX18_OFFSET 0x168
* n* G* m9 B- [7 G ~6 c5 |2 D#define PINMUX19_OFFSET 0x16c! g. _6 L, I; o& j
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
+ t0 R7 c& u+ D#define RCR_ADDR 0x01D1100C //MCBSP1_RCR P% [, f$ `5 f5 c1 A; i* f
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR T/ X; n* d3 V0 H' P+ U9 l9 y( p
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
' E+ K6 v) V1 s! @( N#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
" W `, l7 X( v; l. x) k 5 d2 Z" N+ T% p V M; b
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
; u, C( i- \/ a1 S, P#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. k$ _ K3 f+ M. Q% Q- U//PSC7 m, u5 n8 v% C0 S* z! c' P
#define PTCMD_ADDR 0x01E27120 1 i( g" M) }; c' \: K: v! T
#define MDCTL15_ADDR 0x01E27A3C! S5 T% a& [9 N0 F
#define PDCTL1_ADDR 0x01E273046 o) q# O7 r* }$ O& r' L
//GPIO8 direction4 S7 g' |; o: }6 V, @* \( n F
#define GPIO8_DIRECT 0x01E260B0
$ h6 a% c" K# p. u Q7 r* i#define GPIO8_OUT 0x01E260B4
; b5 z! }+ I- V1 _0 w2 Z7 t#define GPIO8_IN 0x01E260C0 D" {8 G+ m: N
! A& U# R* j7 f& h0 r, r//#define MCBSP1_RINT 99 1 c4 S8 U4 u+ X' V
//#define MCBSP1_XINT 100 $ Y/ M9 E9 L" ?) W, d L) ^
static int MCBSP_MAJOR=239;9 L: H [: l% _/ I/ E
static int MCBSP_MINOR=0;/ T9 U- M$ k g1 Y
static int count =1;
8 f6 E0 ^. p- i! S* ]9 {9 l7 ^' @
) |- H! D# e2 S$ Z( V; [" f#define MCBSP_NAME "MCBSP-device"1 _1 g5 K7 K" ]2 L
& W) R/ x q( S: b3 }! D
static struct cdev *mcbsp_cdev;
* s; ]; R6 x/ p( mstatic struct class *mcbsp_class;# K; f4 c3 y- T
static dev_t mcbsp_dev;) @3 ?6 {* H/ `, i
unsigned int DRR_data;8 d, Y, I3 @2 a$ \& u# T
unsigned int DXR_data;: n. N( }; a- }# R$ @& T; N7 R5 j
static int mcbsp_open(struct inode *inode,struct file *file)
" u- E$ s- A- [: `- w7 l: \- F{
: P3 S) s8 \! Y8 G* Y) f
4 N& Y- k& I% { //interrupt enable,initialized+ b0 P4 P( |9 |- u2 b8 Y( K
unsigned int temp;
' D; n3 F6 M2 I5 [7 J) a5 y' z //SLEEP_EN(GPIO8[10])---0
, v! @' |2 O+ j4 f$ E' d temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ L# h2 S7 o9 w+ ~7 ~
temp=temp&(~0x00000400);
3 Z2 L0 W* z; u% a C) z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], }% B8 U1 z1 V' P. ~ O& u' j1 e9 @
//RESETn(GPIO8[8])----0----1' s+ y. F3 z. h& A+ M
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 Q4 I, d2 d2 a" m$ ]- u' D+ f
temp=temp&(~0x00000100);$ T# W t) N! O! X) w8 O+ v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ Z$ a f! s0 S" t) O5 R! d udelay(100);& b. t# {2 A5 g' j2 v# o
temp=temp| 0x00000100;& b/ \8 h7 l+ I# H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 ~: i# r1 d$ `- ~ udelay(100);
+ \# M4 W/ m1 b7 G8 m h printk("open success!\n");6 ?3 Z) z3 Z7 s) |
return 0;
2 z8 Q# r. l# f- u) i4 f; n) J}
E0 X; o; }8 l) U
5 z3 s8 l5 g3 I- W# }static int mcbsp_release(struct inode *inode,struct file *file)9 d- A8 F" r* }0 c" e3 B: P
{( a, V( ~, C5 R- _6 u7 v8 u& c0 O
printk("release success!\n");
% }( Z1 i3 T4 I) g1 g& b& ~ return 0;
: @4 L0 l1 Y& P' }' j" E}
0 {/ [2 Y9 v$ u" d" D. m S' X# t6 a
/ W9 h: x- t: l3 Gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" P O" @+ l5 O q: n; Y
{4 _5 @5 U- x/ x4 x/ J
copy_from_user(&DXR_data,buf,len);/ u" p. M L W2 X
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); . B( S8 Y9 |" n) b
return 0;2 M1 y) w$ m0 b
: j+ K; m; }' e r/ l}
2 ?6 Q8 y& _' M0 D4 I6 p$ v$ |; \
{: ^1 e1 V8 K8 @static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
/ }$ d' k) L& b( g% [* @{
R9 x. W/ ~: f5 X: S# V' Q8 j DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ w+ s7 Z9 Q) ]5 d7 W3 T/ d5 b+ ]
copy_to_user(buf,&DRR_data,len); % m" h& e# z; l
return 0;
2 e8 F& Y( l4 L* B9 N, l4 {$ I/ y}
- _* H4 O/ ]) L+ i9 k0 \( F
6 G" h# q2 v1 c& L$ |, y# z) @. ^9 d; G3 U2 R. Z$ Q4 x
static struct file_operations mcbsp_fops=
2 D) @+ R' L( S' i) g$ w. M{
$ O) g- j# s3 c* Q .owner=THIS_MODULE,; }7 I3 y* ?% D4 h& S
.open=mcbsp_open,8 j3 n+ U+ X: ?( _+ t6 v2 K
.release=mcbsp_release,
2 w- ?* B, M6 y' M# |7 k4 G4 d8 D .write=mcbsp_write,. A2 n$ c |$ x" ]; r1 |
.read=mcbsp_read,
5 t4 Q" [* n6 F: u; O3 O};4 F3 a4 T: x1 ~+ G) }2 C
static int __init MCBSP_init(void)6 E: ~5 R. t, e: ~( @
{4 L: t! `" p0 K; e% L
int ret;
, W6 b' q% D1 w0 n# M( n unsigned int PINMUX1_REG_old;$ C: W; j6 ?7 }3 h
unsigned int PINMUX18_REG_old;
) ` z7 j0 n h5 @7 s r unsigned int PINMUX19_REG_old;
/ k2 I% ~4 }+ p/ ^/ G unsigned int temp; / S5 B& @1 |: E8 M+ b3 E
if(MCBSP_MAJOR)8 K) d; D: \1 k/ N
{
0 T/ y' O5 F$ d# X. G, X+ j mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ K, H# K, ~9 q
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& r7 ]2 |# G4 ?! K9 [ }( t" z7 ~, U, _& K
else K2 O: |. R. y: `
{
/ P; x! X* F( l" r( ] k" ] ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ Y( ^/ Y1 `; T" s MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 K1 O B* h2 X5 x. p) m }
. C, Z, I% F8 C' L2 Y
& [% I3 I6 Y% x: r if(ret<0)) W# z8 G$ b2 E8 }- J: T" o+ B
{
- P, g- `7 j& V. l printk(KERN_ERR "register chrdev fail!");
& B5 x+ _/ b: C" y: E3 O, B return -1;. M `( e2 s# u9 O( x0 ~
}
4 U* P# p9 J5 z" o5 h; s
7 ?0 x( H5 F$ ~! k/ G$ p7 f( A6 I mcbsp_cdev=cdev_alloc();
0 c+ j2 T/ O8 k+ |6 H
. d* w3 y1 ]3 G9 l: d" P' H if(mcbsp_cdev!=NULL)
g# S/ d6 O( a: z5 [/ I {
7 @* l: u8 e% ~$ e7 ^ cdev_init(mcbsp_cdev,&mcbsp_fops);
1 t0 B: u; v2 B. e% \ mcbsp_cdev->ops=&mcbsp_fops;
K% b0 a3 _+ B' L. j* w mcbsp_cdev->owner=THIS_MODULE;: `9 J2 _4 g7 ^7 g T
8 M4 t" V9 I# G if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ v7 H! O& {7 w _
printk(KERN_ERR "register cdev fail!");7 s2 i' o1 A0 x: ]
else
1 _+ }+ J1 A) F6 X9 C3 E: V" \ printk(KERN_ERR "register success!\n");3 c* B$ c& ^: j
}
# W2 r4 z& E2 K. L% o else, u7 Z Z/ T+ A% e' V
{+ m5 p: n# l h9 j, @4 \
printk(KERN_ERR "register cdev err!");3 k) T8 @$ S# i1 Y* j
return -1;
' E' r, ?+ P) U. a/ i) z }
9 r6 \$ l% C8 f; T* q/ p* e$ G 9 x6 K u2 W0 Q$ ]( ]2 E( ?
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 F `- D- S: y- a1 x if(IS_ERR(mcbsp_class))
) Q8 {5 s3 d" B& H4 |2 P5 l {! K( K0 i) X- l
printk(KERN_ERR "register class err!");- I9 D/ R7 L) v3 U- @' \7 w
return -1;( Y3 o' _7 V4 k3 {5 ^
}
% |7 E1 Y- M' s1 ^- ~ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ V1 e/ d; l# s$ }
& N3 a7 i& q: I: h //PSC1 F9 G1 R! J* w4 ~! t
//add Enable MCBSP6 o: b: A1 h2 T; T' e$ h1 M$ G
//test
4 a9 J' k$ n- A6 f9 _ temp = 0x80000003;7 T. u+ s2 q u s; T
writel(temp, IO_ADDRESS(MDCTL15_ADDR));. r5 o7 ?; k" t4 f
temp = 0x00000003;$ C3 K( B# L2 j( N
writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ l/ _$ a# o3 c& h6 ]$ ^. v - K8 p1 @- g# o. _: U) T
temp = 0x001FF201;# d, F P. R" }& g
writel(temp, IO_ADDRESS(PDCTL1_ADDR));( ?9 j7 K! q( q! g
, Z! y8 F! h5 u- ?( d% s //PINMUX A+ m; f. x- K& l- u
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( d$ }2 H l+ @& g8 T
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); # G+ C# ]6 O6 z/ S8 V1 n0 \
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 5 w2 ?* }: L3 j# V+ ]2 I# v) f
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 g* M9 N& ?; i5 X: I* O ! C8 x" I/ J* I9 C
//SLEEP_EN,EPR,L138_SHK1,L138_RC
+ h! w, b( C- A# `- q3 H PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 Y0 P/ f5 d7 i, r3 B+ v p, t$ T PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
6 x; p7 \8 k P5 W* t/ g7 ~/ @! [ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) R( V3 m+ u. A9 Z
3 Z* E% h. t8 |! f' |3 j //RESETn,L138_SHK23 O# Z6 K3 j4 [' t
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); " X) c, j+ R) I
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; / L l2 k3 P9 S4 F. b$ P) n0 u
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, w8 ^; B8 {" J5 T+ C
0 R0 H8 D2 ^6 b9 h- Y
, d' V' Q4 Z; b" Z8 B. y: | //SPCR Register
" `1 h7 m- C7 g a% B7 r; b$ U //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset ^9 O) d3 M+ q- B
temp = 0x03000000;//(DLB=0)
8 Y+ h: Y3 h; b( j2 t // temp = 0x03008000;//(DLB=1)
+ D" {5 ]0 h- w; o, r3 n' i writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
& |0 }' l( d9 y temp = readl(IO_ADDRESS(SPCR_ADDR));
7 q( b9 C2 D6 p# U printk("temp=%x\n",temp);: v" m# ^7 ^: `: a. `4 D$ e
/ e) F1 E. Z. R
//PCR Register( P3 u7 K+ F9 Z- R
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
1 M4 D) T. B$ c // temp = 0x00000F0F;% z8 e# w+ @6 j# ~2 Q- `& Y
temp = 0x00000B0F;' G$ e/ ]7 f+ h' J% z0 n
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " K& g( |* f$ A2 ]
temp = readl(IO_ADDRESS(PCR_ADDR));& _! H" w2 L9 j2 I
printk("temp=%x\n",temp);
- T' g/ P( {) r, h% ^0 M* n$ i% ~ //SRGR Register/ z! {2 }% J" l X& H$ t4 D0 k
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11 J) |. _" O, w0 v6 i
//temp = 0x301F000B;3 l6 u/ r; P$ C3 O: m4 M# k
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
: i( ]5 A- {+ [6 J7 h8 Y temp = readl(IO_ADDRESS(SRGR_ADDR));4 T5 ^0 i: {5 z- S! V$ r
printk("temp=%x\n",temp);
$ P7 x% z0 a* Y# S3 V+ K# a //RCR
) ?) B# R. Y. o+ m. d7 w, Q //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 j- u8 S$ T) d% i1 h9 f: \ //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 [3 T5 W7 r' G8 I' X r8 o
temp = 0x00440040;% S7 q6 o5 ?! J9 H) j
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ) v* E3 S# [8 y: B* N9 I
temp = readl(IO_ADDRESS(RCR_ADDR));
- N+ n/ Q$ g: k6 b1 C7 k printk("temp=%x\n",temp);
/ w% f4 w0 L7 Y9 A+ Q, d; n) }, | b //XCR
5 U! r0 c; t+ h* I6 u4 r! L f+ O //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- `! ] T M1 U+ Y; `
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* |; p" Z1 A% U7 e+ k6 V temp = 0x00440040;
& e6 z, p% Q5 d$ `5 ] writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 4 J7 T6 Y6 T* ^8 s
temp = readl(IO_ADDRESS(XCR_ADDR));
: G0 } j, H5 \ printk("temp=%x\n",temp);7 g" G7 I6 n; h+ v. k4 |' {
udelay(100);: I0 Q( r* p( I
//SPCR Register! c7 d' p8 t) L0 l: u/ A
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ M3 f7 J# g- v N% R w } temp = 0x03C10001; //DLB = 0 VS DLB = 1
0 v6 \8 U$ K) g+ X$ A3 S writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
* P5 _1 w5 m: D M* Y+ k( x( \ temp = readl(IO_ADDRESS(SPCR_ADDR));
; a- ]/ w9 o' b. C& A; ^ printk("temp=%x\n",temp);
t- k' g. A; N% J# z, A udelay(100);2 J# M3 t% N# P6 k% e2 i
# g% @2 H- r9 H4 Q. e //set GPIO direction- O; O( t( K# d* c
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: B* v: A% Q# K: B& j& w( c3 c temp = temp | 0x00000100;//EPR----input
$ [: U/ n2 E" y* w temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 m K& U0 W/ r3 c2 g __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 |3 Y" b1 p+ W2 X$ g % f' p4 V+ x: s y. g% n
return 0;
, e% G1 k+ V1 X}' Y# ^6 ^9 O! v: R* n& e% \
static void __exit MCBSP_exit(void)
# V% [/ h; f+ p{
) {# L; \- J( K0 S5 K printk("mcbsp chrdev exit!\n");) E- B' W6 t+ U6 ]
cdev_del(mcbsp_cdev);
% n3 E# X9 F7 J. h, v1 | unregister_chrdev_region(mcbsp_dev,count);
* m' w6 }1 V% Z- \ device_destroy(mcbsp_class,mcbsp_dev);
3 x% @: }8 Y& `7 E- B/ l) ?0 ^" W class_destroy(mcbsp_class);
v* C0 G% Q) y; w+ {}
$ }2 H$ I1 I; R; c1 _4 A$ v- Mmodule_init(MCBSP_init);
' v9 E" T! m3 bmodule_exit(MCBSP_exit);
* C8 y& a7 |4 h3 l, |" r5 {5 d+ R u7 R5 b" N
MODULE_LICENSE("GPL");$ B& C+ R, M+ J9 h- S) i7 j
" S% @2 _5 s5 k- P6 a
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" [+ j5 u# K/ q1 c q$ H O我的应用层的测试程序如下
" ^; P) n6 \/ Y7 t( j#include <stdio.h> `8 p1 g5 }4 I, m
#include <string.h>
) h; g" t4 M2 Q* X#include <fcntl.h># g4 {) F7 I0 D3 b- ~' ]. f* S
#include <unistd.h>
3 D; O% }8 z" O! c4 H8 W#include <signal.h>& _' C0 b1 w7 {' l
#include <pthread.h> //线程
* g. A% O3 i2 G* _. C9 J#include <stdlib.h>
) x! S/ J' z; I2 `3 v#include <pcap.h> //捕获网口数据/ q/ S! Z, Z( d
#include <semaphore.h> //信号6 h/ A9 y2 D% Z1 M: B6 V
#include <sys/types.h> //消息对列
+ x* ~; L5 |- N#include <sys/ipc.h> //消息队列
# e- d- `! T4 W* U5 N) }5 w#include <sys/msg.h> //消息队列/ m% D5 w* T8 b4 J
#include <sys/select.h>
0 S& S1 [+ ?/ L% j8 q5 V. D#include <sys/syscall.h>
4 S6 G0 {; h, u6 v# b" K' ?#include <sys/stat.h>
r( ~, r1 G/ ?. W9 @7 l#include <sys/mman.h>. O8 Q) h% M. c, Z! V6 b
#define msleep(x) usleep(1000*x)2 `6 c, q4 @ Y- \$ ?& @: y/ s
1 X' [/ h% c4 w$ B) k# K9 H4 n" G
int main()
7 ]1 Z- J& f4 l1 b{ 1 P: ?: T! M( D) R
//MCBSP,ARM与AMBE2000交互设备
9 s3 V9 ]+ q9 P4 `# r h int fd;
! B$ i/ m' j7 ~7 j) i5 M unsigned short data_write = 0x5555;! Q8 w8 a4 ]( s
unsigned short data_read = 0x00;
; u) y7 B# X+ v6 `6 {( T fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
; m9 \" q4 R$ c" w3 H/ K // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 r/ u3 b& u+ a. U, X9 ^
0 G& E2 X/ B4 R# l7 n" P if(fd < 0)
+ Z6 B4 E; b# K/ ?- b" X/ @7 `) Z {+ K5 m1 \$ v' d5 C. E! [$ Q" O. }9 J
perror("open failed\n");
" \* G7 R2 k5 c9 Q, @0 F return -1;
* m9 c8 M7 f/ z2 Q2 L }
6 Z" [2 e3 f% W
2 ]( e% f/ d) A2 N' h4 | \ while(1)
/ L- D3 ^! }/ V k8 S {$ ?" l* Q2 s' z6 B2 U0 g
, B' n' t& ^4 f //AMBE2000每次读写是24个字为一帧) h2 Y, | n/ M( Z* L
//写数据时将数据在底层存储起来,等到中断的时候再发送9 \0 V3 m% S5 f$ @
//AMBE2000输入数据是以0x13EC开头的5 w T5 a1 H* U9 q: ~ T
write(fd,&data_write,sizeof(unsigned short));
, F7 J( P6 H3 A% y2 p1 X 4 l X4 Z4 Z! S6 f
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
5 z6 @: W( H9 P$ p; i2 D read(fd,&data_read,sizeof(unsigned short));: j$ H/ M1 Y+ r7 w: r9 n" o
$ ]5 X* ^1 ~9 t$ k2 B8 e" r# B if(data_read == 0x13Ec); z5 X1 i/ s6 ~' z* ]/ v" @7 h: r
{
: {% a9 |' M. ]. l: L. d }
6 U( }3 q% {) Q* {3 h printf("data_read = %x\n",data_read);
6 K) F7 M: ~5 X! w) O }
2 ?; Z" b% N2 F# i + u! k' S7 ^6 s {2 V4 r
msleep(10);* e4 m$ r" o% K& o( V, n B$ E
3 Z$ z* h" M8 T! q& n) E+ v
/*
0 T! V! M1 f9 E* M2 ~ ioctl(fd,1); 9 K' d$ `8 _% ]! R
sleep(1);
! E- ?* P! _5 y. k q b ioctl(fd,0);
) a" Y8 q- ?% m3 I- b0 Z0 v sleep(1);
" _) \' r$ P. [* S4 L' x* l6 e j& t */
; q6 Z. a% _& A. d } : Q+ A3 W% U3 C9 u* a' ~, _
return 0;5 @# U* |! _8 P
, P. M |$ y2 W' o8 N}! ?5 f+ V. j1 }3 }2 O* J
; y( R$ V& `+ P) ~1 Q- D/ c- L9 X多谢各位指教,谢谢! 急
- o) B# ?: I2 z! D; e: o5 Z y8 ]# Z. L+ l1 {5 T9 o6 H' f
6 e3 H! r* \) z$ d* v
/ q) F" _& c! W/ q2 X
+ P4 N& Q0 f) k' C8 f9 |# V1 _7 K8 K
|
|