|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 V, d' I% J9 [3 w/ w1 f% f
/*8 q. z4 `; k8 r e
* Copyright (C) 2009 Texas Instruments Inc
* u6 b/ y, ^! O) F' ` *
5 l% c3 j$ Q, m/ f( L * This program is free software; you can redistribute it and/or modify# I' |& m3 J& \5 C& b$ j( F" m
* it under the terms of the GNU General Public License as published by$ ~/ W3 s+ G/ C$ b4 e
* the Free Software Foundation; either version 2 of the License, or) p; g# \. a. D3 _- p; U3 `
* (at your option)any later version.
4 e+ f5 G7 {0 _/ \1 z8 |8 {% C) B *4 H k" D/ X9 N
* This program is distributed in the hope that it will be useful,; F( f9 a, H+ {$ q0 q) l3 i; O
* but WITHOUT ANY WARRANTY; without even the implied warranty of! n0 S& {, c( Y4 I/ `3 H
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 C2 i z4 }* a3 O; F. D8 W+ Q * GNU General Public License for more details.4 o8 V; V* c2 I: H& h: z7 T2 ?
*
8 J6 I7 F: P' W5 C3 F5 W, b1 L * You should have received a copy of the GNU General Public License
! Y, R1 g$ B" D9 t * along with this program; if not, write to the Free Software' s9 {. r. ~: L, e
* Foundati
% R# G) G7 F5 A9 W" q*/
6 o3 k* `( @7 K0 g5 \5 Z#include <linux/module.h>
& _% R0 I8 u& w: j1 U( s#include <linux/init.h>/ W' f9 e4 n5 g0 v
#include <linux/errno.h>) H0 W) p9 F% s) S/ ^
#include <linux/types.h>: z% `1 K! S7 D! M( F8 P
#include <linux/interrupt.h>, o4 E) [, ]: m6 _2 v6 b- {7 l
#include <linux/io.h>
( E: N: D0 r4 t E#include <linux/sysctl.h>
# l4 }# l }. `" S1 [! E) c#include <linux/mm.h>1 r# @6 e) | y$ | E
#include <linux/delay.h>
3 ]( n# g0 R* }* q. _. |#include<linux/kernel.h>
; S. J; D2 Y9 u0 q: g+ j#include<linux/fs.h>4 D0 E2 @+ j& Q! {2 q8 T
#include<linux/ioctl.h>
. J0 z3 L) w" X0 `) j2 x#include<linux/cdev.h>
2 s: f7 K: M# ~8 ]/ Q" F#include<linux/kdev_t.h>/ x- g* ^" G, U3 ^/ O; M* t4 `
#include<linux/gpio.h>
2 A: v8 P/ Z3 ^/ _& Y#include <mach/hardware.h>
9 J0 Y% ^" K1 A \9 G0 C#include <mach/irqs.h>/ o2 p* u& H! G, K
( `6 ~& o" G; l* D#include <asm/mach-types.h>
! A9 y6 z8 c/ W- Z7 c' f#include <asm/mach/arch.h>
0 Q k* Y2 }' p% J#include <mach/da8xx.h>. B$ r- _8 H* ?" f
#define SYSCFG_BASE 0x01c14000
, ~+ c/ ^8 b" E( z#define PINMUX1_OFFSET 0x124 + [; |, _% G; G. t
#define PINMUX18_OFFSET 0x168 : ~$ g9 D" k5 b
#define PINMUX19_OFFSET 0x16c
) \0 ?9 U; n5 X) n& _" Z8 U#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
/ O: a, X( o1 J- E' {: G0 r#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
7 Y4 C, d8 I6 e5 H2 p* e#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
& c/ W P" S6 m8 m' c+ n0 g#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
; b; R/ k) i! p$ ]; A#define PCR_ADDR 0x01D11024 //MCBSP1_PCR* ~/ {' D% [: v- t1 r
! l! S0 B; w% [6 W) z
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR( a+ |' L6 l1 [. S- m" D3 b
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 E# y1 o! @& W" H& t$ Q4 K4 M
//PSC
- Z. K% J& A- I# x* f" r) z* C#define PTCMD_ADDR 0x01E27120
2 G0 o3 Z: O1 a+ P( F9 v#define MDCTL15_ADDR 0x01E27A3C
/ Y) z# a' a" l' I) B& K% h#define PDCTL1_ADDR 0x01E27304. Z: M, ^" }5 G. ^. q* b
//GPIO8 direction" b4 P f+ y3 n+ i; F# \8 s6 F% S6 [
#define GPIO8_DIRECT 0x01E260B05 f5 T- A$ x+ P) v- E$ Q6 k
#define GPIO8_OUT 0x01E260B4/ n3 X+ S8 {) b( p
#define GPIO8_IN 0x01E260C0- y, o% U5 g3 W* H
0 B) \" h5 f( X# c& w
//#define MCBSP1_RINT 99 6 z% S. t: B C+ P C! S
//#define MCBSP1_XINT 100
' ]1 s) [9 b6 e3 y2 Q1 A9 rstatic int MCBSP_MAJOR=239;
& ?$ |5 o3 Y/ l* u8 `, Ustatic int MCBSP_MINOR=0;
$ E1 B4 b% v: Astatic int count =1;
8 ~/ Y. s1 [5 Y: X+ ^, S4 `4 I+ y+ F4 ]/ E4 B; q' d
#define MCBSP_NAME "MCBSP-device"
8 g* t5 j) F! K2 ]6 x+ _$ t
( C2 w; L2 i8 h; b Kstatic struct cdev *mcbsp_cdev;& M' \5 k1 g2 X" }, R( Y+ a
static struct class *mcbsp_class;
2 p' y* o' Q# Q+ d% [: Bstatic dev_t mcbsp_dev;
% Z+ y1 k8 V% K1 `2 O' _6 }* y e- lunsigned int DRR_data;2 k& V! C5 J+ J( T4 j% v
unsigned int DXR_data;
0 I- l. k' {5 [7 d% L! Hstatic int mcbsp_open(struct inode *inode,struct file *file)
3 w$ L& f- C; a0 j{
& ]2 J8 e, K& a) H( | ) [& Y+ R0 k, J9 `, p; B/ y
//interrupt enable,initialized
+ f- k' `) u# [' I. t h unsigned int temp;9 E% c9 x: c* s; D
//SLEEP_EN(GPIO8[10])---0; I; r9 q G! L; w( X
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 n* f# e2 c" X" E/ r5 |
temp=temp&(~0x00000400);
9 y# p- |) Q) H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 k2 t' I: a0 V9 L3 D
//RESETn(GPIO8[8])----0----1' s S4 _. T: v M
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* R! q0 Q8 T7 T+ s" C- K2 s1 W. m
temp=temp&(~0x00000100);
/ s. ]: }% E4 h __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
) U, g" e0 K1 S) d udelay(100);1 h$ p1 D; J# L3 x, s
temp=temp| 0x00000100;. G! f+ @, {) X
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' H& ^( g, Q# m0 _, z( g6 [* R2 I; O
udelay(100);
+ N) m: j, l( j7 f5 q printk("open success!\n");2 U+ G7 l+ J( p! `; h. U. h7 e' a
return 0;# l" \6 G9 x% p# K$ A1 @7 h9 i' U
}
5 L( |' w3 E8 d9 ~" F) c! k2 e' R+ D i
static int mcbsp_release(struct inode *inode,struct file *file)- S( N3 p9 q) [- v1 _
{/ V1 f, D; B% d
printk("release success!\n");
$ {! C2 ], I( S: s$ i return 0;6 A4 s* Y- `9 I4 b8 s
}- ~) r' b. {- I; w! O2 \
3 v2 y0 `8 e$ p: qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 B- i$ j1 o- U+ X( S; T8 `
{
% J" ]7 j( m4 ~4 s copy_from_user(&DXR_data,buf,len);5 L1 D' J0 }, l0 t/ c
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); * S; [! L: d1 R2 t! i$ _
return 0;: _) k' k; O" ?& ~
6 l/ P& e, a0 W. L}
& H. D4 v5 s9 S9 v+ {' \! {" h2 a& C. k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- H; p* y* f0 }{ ) c7 k7 Z3 K K! x1 t+ B0 r
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! Y0 g6 B) r9 D6 F; s copy_to_user(buf,&DRR_data,len); + }2 o" B; q6 X/ t3 J# p
return 0;! t# H2 J% I1 d& V. P1 o
}# ?% r* K* b l; U: g @
- M, @6 F! m& ^$ ?+ E# }7 l4 C0 F: ^
static struct file_operations mcbsp_fops=
& F& Y) ]$ A( ^; V' N{
! Q1 j$ B. I6 G" X7 Z$ ? J .owner=THIS_MODULE,
/ d- c( I5 M: n) ~# Q2 q .open=mcbsp_open,0 U- B- K. l& G& b. i
.release=mcbsp_release,3 W; ^/ W& Y! G
.write=mcbsp_write,
# I$ T( ], g5 O( k% d .read=mcbsp_read,
2 x; D8 I# l0 L};, Y+ D3 {* N, K7 I9 V% o
static int __init MCBSP_init(void)! n3 p3 r( W: ~
{, s2 ? {/ H9 J9 x$ h* `
int ret;
9 P$ f6 D+ N4 @7 e6 q unsigned int PINMUX1_REG_old;
0 R' ~( T& F: z& j unsigned int PINMUX18_REG_old;
8 Q$ I, L0 V2 T+ X0 V/ d4 u5 w unsigned int PINMUX19_REG_old;
# S) L1 `5 }/ I# x+ f unsigned int temp; ( K- T& _ J6 [' ?/ @' j
if(MCBSP_MAJOR)! q& ^; B* E7 @" Q- z' v
{
. w" k W5 w& ^6 ^$ ~7 [ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 M) _' F( q! J% g# r% ], c
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! b5 L$ }: e- K/ e6 i' ?. L- l
}
9 d% l* U1 [& b a3 ?3 }9 v) I else: _3 ^6 w6 J) K% t1 @
{
$ g- ~1 O: `/ ]8 r ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 [* p5 M3 X k% }2 I5 h f MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 x2 ^2 S! t3 [9 E }% v) q6 j1 q/ L. c5 `
9 Z" i* [" p) T7 G4 Q' W8 z3 _ if(ret<0)
) {3 A4 Q0 s) `0 o& V t {. T6 k! z& I$ G8 C) z2 K* W
printk(KERN_ERR "register chrdev fail!");9 b: R: l4 F5 }" \
return -1;' \+ b. F t7 u
}
, k4 ~3 L% n: ^3 S% Y
- b" V7 B2 ] J! h% w mcbsp_cdev=cdev_alloc();
* M$ e9 J' B$ Z6 F, f 1 u: J, P' G8 ?+ F
if(mcbsp_cdev!=NULL)
7 k8 U# ^) G7 g$ G, \+ k {
( m$ z7 K/ z/ @$ \- l cdev_init(mcbsp_cdev,&mcbsp_fops);# j2 k; j# E' W. ^. G& n* ?% D
mcbsp_cdev->ops=&mcbsp_fops;3 n1 G& S1 J4 q8 y& L$ {
mcbsp_cdev->owner=THIS_MODULE;
4 R+ b8 }- b2 }; l; O* x p& z1 ^- C3 ]0 N; n' R7 S# r
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 t n. N) O: z; n5 ^ printk(KERN_ERR "register cdev fail!");: X5 g1 D! [4 [2 U ?1 [
else
! V; O# b+ ?! S$ I$ h printk(KERN_ERR "register success!\n");
' w% H$ S) _7 r) Z$ [1 t }
: U0 P3 G: K3 S. T! @" J- O! h else5 N0 C9 x) D0 t1 H9 z
{
8 M0 {" ^4 ^4 ]6 i( E: V printk(KERN_ERR "register cdev err!");
j9 P: R. G M. z return -1;
+ v h; _- Z+ y" d$ L8 y }. ~( t; q; ]: F& B2 @
& ]% c5 [1 J) x) f% _ p `$ w4 {
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! A% K9 x, m. J2 ^% [
if(IS_ERR(mcbsp_class)); l5 M! a, w1 e. z& y2 I$ ~4 V
{' i, {* l. `9 R) J
printk(KERN_ERR "register class err!");
O; A& N$ s' M* f return -1;
1 K. |" y: |& A1 F }
0 b, w9 Q8 f) F! p device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! y, G& t* p/ U/ I+ F/ L
2 K! }& A- ~$ a! x5 {( _. |2 {; v //PSC( b' ]6 n% p; |; X2 g8 ]" s# f4 s. ~
//add Enable MCBSP
7 J4 ^* w8 Z( H8 F7 t //test2 Y5 k" }% G& A! o L9 f
temp = 0x80000003;
. C0 f( e. J( C' i' [4 j writel(temp, IO_ADDRESS(MDCTL15_ADDR));
: k7 w' l% m" y/ S3 @ temp = 0x00000003;/ G: q5 ~% p" A" t0 G0 t
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 w3 I" j5 _3 t' a( h" Q0 q $ C$ s8 l* {4 Q3 f4 M+ p1 u0 }
temp = 0x001FF201;
9 ]( S' K$ U5 d* }9 ~2 _ writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- [1 |! y3 ~2 C3 M
4 R* j: {5 _2 T4 ?1 }9 [' y0 c //PINMUX ' F! L. a4 U5 X+ u; d
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- r0 D7 @) C: r9 v# H PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" k% N! _8 v- h4 U* N; D7 K PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , c, D1 _" D, E% F$ f$ W! n/ C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* L7 H4 g7 F, ~# ~5 m9 Q/ }
9 L8 e4 c, R- ]( t# ~0 i1 ~& D
//SLEEP_EN,EPR,L138_SHK1,L138_RC
$ c: n, v( T/ L" k4 z& q; h$ B7 R+ r6 S PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); q. {/ F! }! G
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
6 `+ O; n G9 x+ T/ X J8 r writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' Q9 F: j( G" K( u- G9 Y! F( C
5 F, U0 `% F9 p: Y) Y. H9 l //RESETn,L138_SHK2
! I' s* S2 {5 f9 _3 m PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ' A1 b, ]9 P; g7 q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 1 H7 ^' R9 G" M
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& r0 P3 |5 W( W& f! V
% ]! x0 a! q" k; l- Q
! Y3 I7 x, y- P: i- T //SPCR Register- f& V" R* o. @& i! g
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( b. I7 O( y8 E8 }: f temp = 0x03000000;//(DLB=0)- _* F% ^ ~' v( ?+ k" O
// temp = 0x03008000;//(DLB=1)/ V" V `! N7 _: x: W! q1 W& {
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
8 f6 \1 S: d, }6 U# f temp = readl(IO_ADDRESS(SPCR_ADDR));1 Y3 |( m: A4 _3 x) a: P5 O
printk("temp=%x\n",temp);
, T1 G4 z/ q3 y" O/ _; ^ ) g) Z4 c. @. @, S" i" s
//PCR Register; F* Z+ P/ R4 M U& L% ^
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 r( b5 c) P% \* ?" I u# o8 X6 f
// temp = 0x00000F0F;
( q9 b! }7 P9 k! R& n3 H4 } temp = 0x00000B0F;+ V, z* x% {1 }( v' W
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
/ p* m& t: O, | temp = readl(IO_ADDRESS(PCR_ADDR));
5 V- x, _1 L8 L. \1 l# L printk("temp=%x\n",temp);
6 J" |2 N2 E! _0 X7 x1 W0 Q //SRGR Register
+ |$ {- R$ I( M% e% v, x //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; g& n& a/ [" U; ]0 ], y7 K
//temp = 0x301F000B;8 v |) S! S" w1 G7 _/ e" \
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ( A3 l7 N: }- i2 U0 a6 K/ a
temp = readl(IO_ADDRESS(SRGR_ADDR));
: h) |: D" ^ ? O printk("temp=%x\n",temp);1 c# k" L2 ?* e2 _
//RCR
{' Q- m! b6 W; s' u //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( D* T7 U) i9 ]2 H. a* K //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0# M V, d+ a( [; [" X* `- d, t8 I
temp = 0x00440040;6 S3 J. g4 M- R5 Q
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 5 V/ k7 M& I9 G: ]4 ]0 _1 h( }
temp = readl(IO_ADDRESS(RCR_ADDR));
: ^( C* O# z& ~3 c4 X printk("temp=%x\n",temp);# S8 E: ^0 g. r9 w' L) R. q4 J
//XCR
5 b/ l0 Y! S0 Q" ~% ]4 } //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
6 u0 A, l* H% L, |0 T, R- R //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% j0 ?! D0 k- ^2 W2 N+ v7 @9 ^
temp = 0x00440040;% A- } W, f2 n' L7 Q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ \3 C4 o! K) y7 D' C/ X temp = readl(IO_ADDRESS(XCR_ADDR));
9 v7 X/ d- a! L7 A* R% v printk("temp=%x\n",temp);
7 }. R; h' k- h6 n$ o: ~: i4 q0 ] udelay(100);
- j8 d1 U3 H }8 U% h' R+ r5 ]# s //SPCR Register! N1 }0 ? C, q% U# M& z
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% _$ O: l% s- I9 v) B temp = 0x03C10001; //DLB = 0 VS DLB = 12 _9 b/ E' W: o; ^+ V$ k0 ~9 c
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: p4 t' F$ L0 c3 I) c% U0 l temp = readl(IO_ADDRESS(SPCR_ADDR));
6 _$ \. {- T+ e i printk("temp=%x\n",temp);2 @4 m3 ]/ E% _ Y" ^; c& ]& ^
udelay(100);3 x1 t6 F; g* u! F7 g
# F/ }% @/ X+ Y7 {, J, H( n //set GPIO direction2 Z4 E) s, O. c: v$ i4 g
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 W* D( y) \ u* x; P
temp = temp | 0x00000100;//EPR----input& j& E' U1 t" b2 o- l
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output/ E( j7 E1 u2 I
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - C, K( k: H: Q7 c
6 m5 H, T7 w, S Q8 V' K9 ~ return 0;
; U0 X- y0 @- ]' X6 o4 J}
+ o+ R6 _5 F( lstatic void __exit MCBSP_exit(void) B- S' p' [; M6 F$ I
{/ @8 ^! N- X& P+ z$ v" x- a$ G
printk("mcbsp chrdev exit!\n");5 U% o% i* {' y( ~' W, J
cdev_del(mcbsp_cdev);
5 ? m0 d9 `, S unregister_chrdev_region(mcbsp_dev,count);
" o% T2 Y' ^5 j$ L' R5 B device_destroy(mcbsp_class,mcbsp_dev);2 b$ w: C% M- X1 p, k" l: b& z
class_destroy(mcbsp_class);( b1 d8 \9 {/ Z/ n0 M- j
}3 H* {9 [& q* n+ D# f3 b+ r# u8 ^. M
module_init(MCBSP_init);# k) k- t2 `% _
module_exit(MCBSP_exit);
x/ `% e5 {) i5 ~8 x, u0 @: o, y+ a; B" X: a1 t
MODULE_LICENSE("GPL");0 h K4 C# o& H6 c0 [- @( D& A
3 ?6 c; r0 u% q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。% z2 k# j; Y, r8 E
我的应用层的测试程序如下
# ^: c) ]9 ^ f#include <stdio.h>8 v5 d8 Q, ?- u7 e# e2 ?) k
#include <string.h>; m/ {& E) Q$ z, b! `
#include <fcntl.h>) q7 u7 E8 ^4 e5 Z
#include <unistd.h>2 |' q+ j6 T& m- Q$ s
#include <signal.h>
$ d( m# x2 H1 ]+ X#include <pthread.h> //线程: W' A6 B2 }$ J7 l. [
#include <stdlib.h>3 n$ s _0 w; q
#include <pcap.h> //捕获网口数据
* c: e9 l& i" _ b2 D/ F& ?/ R#include <semaphore.h> //信号$ P$ Y2 S2 b. E0 d6 \, q2 V
#include <sys/types.h> //消息对列: W) }) N( b! N! M$ G! S- I
#include <sys/ipc.h> //消息队列
' t+ m! Z% H$ F& T#include <sys/msg.h> //消息队列" ^$ d. K; M9 y, B# q
#include <sys/select.h>
4 ~( M% @6 D* N) M#include <sys/syscall.h>: b" ~1 W: T4 z) \
#include <sys/stat.h>
$ ~: T1 D% n* k. w#include <sys/mman.h>
" p j9 n ]- D% R0 e#define msleep(x) usleep(1000*x)
/ M( ~5 H/ V+ A8 ]2 ^1 q8 H( j2 T7 y1 T+ g
int main()# I# {5 ?3 ~2 @. Z! t5 x3 [
{ - `+ ?5 T. p/ Y1 D2 L. `' M
//MCBSP,ARM与AMBE2000交互设备
' Z* r, G& S4 `& A; d! l int fd;
& N- z0 q, s* l9 p' c. K6 v7 \9 r& k unsigned short data_write = 0x5555;
. E3 d8 d) J' q! z, P0 [% L/ s unsigned short data_read = 0x00;" H) b" K% ], c
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ Y$ r `1 H4 b // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ _) K6 S3 f& M
+ b- h! ]$ J7 @, |* [6 z if(fd < 0)
3 h$ l5 e4 F' ^* p* y7 ` {
$ M# I& b7 L% E$ d6 {8 o perror("open failed\n");
) p' R: ^- r) C, f. x5 Y return -1;* N9 R* h5 f& n
}
% N. ?& i, @& O0 t5 {" E 3 a9 i2 {' d( L/ p. P
while(1)3 d8 {- H& u2 I2 p) `7 `
{
8 R9 } \/ t; _ [( K- s % u/ \4 b/ l% i# j
//AMBE2000每次读写是24个字为一帧
7 P( G ?0 @) ]1 C1 s1 V //写数据时将数据在底层存储起来,等到中断的时候再发送
6 ?* |6 c, Y6 Q% z+ ? //AMBE2000输入数据是以0x13EC开头的- ]; z- |- ]5 Q2 W* e7 r% m
write(fd,&data_write,sizeof(unsigned short));4 c& x$ W$ Q0 n# P- o' W9 X
2 g; v. D P* D( [5 Z% N //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 . Z7 i8 [2 a2 G) y5 n) {+ @
read(fd,&data_read,sizeof(unsigned short));- r$ u0 R% J; K/ U5 F }& X, a1 ~0 q
0 i' N/ p( T/ h# M
if(data_read == 0x13Ec)
* N( P+ {+ c/ {, a {
% k1 k6 r; \, G. M" l& c4 ] ' V) D# d0 R3 p! W1 J
printf("data_read = %x\n",data_read);" F- y; ?3 _$ T! q9 O
}& |$ W1 W: A8 O4 z
( B" |& f8 ]+ ?4 G& Z8 S$ ]
msleep(10);
. U* W A- {$ J9 @4 | + T! R3 U, ^- L- G
/*) c2 ?9 H v' U+ A, S
ioctl(fd,1); 4 l c* Q, t5 ^9 `/ U( I6 I1 R
sleep(1);
- j. S2 I5 J$ n" e9 b8 B& z ioctl(fd,0);. Z9 G7 U; h7 H! u
sleep(1);2 z j9 d+ m8 J, p4 k
*/ / X$ ]; j J- E
}
8 m- |4 }5 J4 y+ A' ^ return 0;
/ ]4 |9 o% w7 g/ r 4 o) ^/ z4 f9 R, h/ b# M
}
% s f' J6 \3 g8 X4 g, F$ G. S8 R
多谢各位指教,谢谢! 急* S: i& D0 k+ k
7 t9 j( P# \" O
6 V% i' C' C3 F/ b& U# A" W. }. O7 D: m+ e3 s/ h( U* C: O1 _* Y& M8 o3 I
) p9 B8 C4 L* A$ ^6 f4 g9 S/ E3 {( z: ^8 ~. v
|
|