|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 o7 ?8 E/ z9 r% h# i( \, }9 X. T/ o- O
/*! J; I7 ~# x" b# k. l
* Copyright (C) 2009 Texas Instruments Inc
7 H7 N/ \. H3 Z2 x- `4 Z *
2 \/ d6 o" h/ r. W6 @6 V" ~ * This program is free software; you can redistribute it and/or modify g( v& y% z$ `
* it under the terms of the GNU General Public License as published by
m* K+ A5 h" B) g8 A * the Free Software Foundation; either version 2 of the License, or
6 L, Q4 p7 ~, j9 \/ O; ] * (at your option)any later version." n+ ?4 q$ Q; _# E1 v
*
% h" y) l& c8 z# H5 H( d * This program is distributed in the hope that it will be useful,7 [% ]: K% |2 s9 y) M
* but WITHOUT ANY WARRANTY; without even the implied warranty of- h) k4 L! L, B
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 d1 O. K( U+ S7 q8 Q3 W * GNU General Public License for more details.3 x& l8 u2 o' Z3 z* ?
*
( o, y. x* n- y" F) G * You should have received a copy of the GNU General Public License
' I$ J9 b" v" k% U * along with this program; if not, write to the Free Software* Q2 ]$ [9 i( a Q* S0 |
* Foundati
& t: C7 n$ L, P3 ~' X. a*/" A* e3 B6 S* h6 ^2 @
#include <linux/module.h>7 f% {9 A7 z& N4 _
#include <linux/init.h>
; i: d& R) m8 w8 s% d. o+ u4 I#include <linux/errno.h>
, f' z! k: l0 D# m1 G& }, m( t, a#include <linux/types.h>
5 |5 \0 A3 o3 [3 J4 h#include <linux/interrupt.h>% {1 Z" a" ?8 `& @) _
#include <linux/io.h>
: i: h2 B9 l5 K#include <linux/sysctl.h>
. d' O/ ?' a/ h. s) B#include <linux/mm.h>
4 e3 M- { s1 A#include <linux/delay.h>
4 f/ x8 |3 W0 w, B1 ~- I7 R3 l#include<linux/kernel.h>
& s& C2 n. t% p( Y#include<linux/fs.h>- D0 C5 e# u0 ]$ O# Z5 u
#include<linux/ioctl.h>
3 W+ x: `$ p+ f) h- ~$ U! N#include<linux/cdev.h>: ]0 @, w9 d. e( B7 ~. g
#include<linux/kdev_t.h>
: u% |6 ^ n$ z% a#include<linux/gpio.h>
1 Z0 H- V* F! Z, [#include <mach/hardware.h>9 E9 `3 K, g; y! r7 [# S; [0 \
#include <mach/irqs.h>
1 s- `7 ^' |/ q8 k
* {& c( ]4 l8 x#include <asm/mach-types.h>: L7 n8 [& O- a C' I* k
#include <asm/mach/arch.h>$ e/ |! I9 o2 d" u9 k
#include <mach/da8xx.h>
! l, I# g- H& R#define SYSCFG_BASE 0x01c14000
' E1 L$ M- j6 G: n: y1 i$ z# V+ l#define PINMUX1_OFFSET 0x124 % x, C% N$ L3 G7 g' y/ q1 X
#define PINMUX18_OFFSET 0x168
- B; G: J/ d# ~5 V" Y5 W9 _' A#define PINMUX19_OFFSET 0x16c5 A3 Q" m4 ~! ~* ]! Q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR; J+ y3 f' N3 i6 U
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
$ \3 r! c4 ]9 F, F$ H: Z#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% P/ \* ^3 I& \$ q( p#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR( _4 x8 d/ T; |( s+ R3 {- h
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
# G' i4 o! r& X) T/ |
/ v0 ?- V8 Y: U! m* |#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. _. a& e( m% c: Q) S5 L#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. b" \; j& [; I& a5 @' i0 r$ ~//PSC4 e9 z | }( c6 n Q
#define PTCMD_ADDR 0x01E27120
4 Z3 V" y/ F' J/ T#define MDCTL15_ADDR 0x01E27A3C7 ~ }; S* C2 z0 I
#define PDCTL1_ADDR 0x01E27304: b" I0 T6 [5 n( M. [/ f
//GPIO8 direction! c) H; X( J, M1 T& x& s( B
#define GPIO8_DIRECT 0x01E260B0
( A: w- D$ o$ ^#define GPIO8_OUT 0x01E260B4
7 @6 A2 C5 y/ _7 ]/ c% q5 Z#define GPIO8_IN 0x01E260C0! U1 Z: c) _3 H. ~$ ^1 J
% m% \6 [% a% O/ L5 R& h
//#define MCBSP1_RINT 99
$ q7 g. l$ ?6 _1 ^( W% p//#define MCBSP1_XINT 100
6 e6 R3 \1 X6 \3 g1 |+ Tstatic int MCBSP_MAJOR=239;+ |) M2 j( i, F( @3 v: U, H6 f
static int MCBSP_MINOR=0;) m, ?* W/ E& C/ k5 W4 M/ p8 ?
static int count =1;
( k$ r3 g: e4 X
|# Q4 B/ Z) @% n3 v#define MCBSP_NAME "MCBSP-device"
7 x1 A: D/ _5 U7 v) Y8 s
- K" v+ W) p" a1 m: y; B" v5 G2 h! fstatic struct cdev *mcbsp_cdev;
- `' Q4 i$ H4 K( h. y% h( G" Kstatic struct class *mcbsp_class;' J2 C! J8 y2 E$ g) D$ V6 V
static dev_t mcbsp_dev;6 m- Y3 G5 G: V; v2 U
unsigned int DRR_data;0 c, u4 d( M# M" A. U$ G
unsigned int DXR_data;# c: U' a5 G2 `! G/ g5 I
static int mcbsp_open(struct inode *inode,struct file *file)
! [& F E* H% [{! V8 y5 R9 N; t4 _9 r8 h, d
8 {. c4 o7 E/ k# o2 O- y
//interrupt enable,initialized
4 j. \/ Q, @/ g x5 H; G/ t unsigned int temp;
2 \; p. L$ z# U. m8 ^1 A- ^ //SLEEP_EN(GPIO8[10])---08 e D {9 a' ^1 C7 W
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 e9 }7 j/ f3 @( _1 d/ ^
temp=temp&(~0x00000400);
) {' u6 n3 C. R, X( l7 `! z& u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% n. b' N2 z9 [" |; b //RESETn(GPIO8[8])----0----1
6 h, A+ G1 \6 P1 \; U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 `/ z4 q+ T* M* Z& k temp=temp&(~0x00000100);
4 r! }# Y& D" J% u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0: r4 \* Q" A% H
udelay(100);4 T% j4 C; {( }$ u f, v& V
temp=temp| 0x00000100;, J8 [1 ~" j Z+ a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! g/ @9 W L& v/ J% Q" D udelay(100);
3 e8 K }7 c( o2 A: @' ]0 C# m. v printk("open success!\n");
3 K5 ^ `3 o; E' |! x7 E0 @ return 0;3 i1 f1 q* v$ Q5 I: a- P' S/ C2 j
} p% p6 O3 k. E3 B! @% f& c4 I
( a* X/ n! Z9 Hstatic int mcbsp_release(struct inode *inode,struct file *file)8 b) I. c- E$ \5 z: L
{
# b) v: U' I( e2 u printk("release success!\n");
6 Z7 c3 n* O! r return 0;4 m8 J5 o/ G3 N$ Z1 p
}
& r; C8 S9 ^, o% w" P6 G! n, N# x! _6 o, h7 n$ q3 _; t, O
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 |7 m3 ]! u7 g2 ] {: @) I/ T{
8 l. d0 _; r5 z7 J copy_from_user(&DXR_data,buf,len);# O* y3 g4 `& r$ F6 J0 @, D$ B
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
2 C; _( l, W" r6 t$ g return 0;
/ u- J% ~. {% m$ G3 ?/ Y9 a % {+ H8 P) G: D
}" w, B* H5 c0 G# s
9 E$ L% x$ u% E. O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" d2 H( c4 t! W{
9 f; T1 Q1 E8 Q% Q( a: ^ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: e/ B0 w4 }9 L* P% q3 t) N9 n1 g0 w
copy_to_user(buf,&DRR_data,len); 1 Q) k4 Q, s, C9 j8 K' q
return 0;/ H% H* W" X6 T7 l C- X
}* m% e' ~! @$ Z
( d* I, ^/ o2 a* T! m
+ Z& i. ^$ g; o4 u, @static struct file_operations mcbsp_fops=
- Q2 Z$ e7 C0 b% W% ?{
5 Y# h4 Q* m$ H9 L! D) ?& r .owner=THIS_MODULE,
. @) M$ F* W% T3 U .open=mcbsp_open,
0 |3 h# N* G) J8 s/ B+ } .release=mcbsp_release,
2 W% \( L$ K0 o .write=mcbsp_write,1 K0 f4 R- k- o
.read=mcbsp_read,
+ V1 ?- l' h8 V};
8 ?- p) M: F5 h3 |) L+ S9 ^) astatic int __init MCBSP_init(void)( `5 K! z; L0 d. R
{
) D2 T8 t3 Q7 L int ret;1 q5 ^/ m+ k8 V" ?
unsigned int PINMUX1_REG_old;/ [1 Z) a* Q) b' @" V, N$ P4 q
unsigned int PINMUX18_REG_old;
# ^3 v) x- _4 k unsigned int PINMUX19_REG_old;
2 M3 H0 p% A6 i" G unsigned int temp; * a: B X' r" @
if(MCBSP_MAJOR): Y. v+ C2 V7 N1 i6 y* r
{
/ F0 F4 f/ d0 } mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 _1 l; |. I1 M4 V) p) L/ |
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
c7 T, P: G/ m" ]& b }# ~; i- |+ o! ?% |
else& S6 v$ @9 ]8 l7 @
{
! @ B4 H, d' h- u. b ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) ~& i& r6 W) }( S2 J& \% i& P MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 u" U8 o- ^' I$ b( F ? }- ?' a/ E% i+ L$ I& a0 z7 g& x
8 N+ Q# L; z+ i' \$ x
if(ret<0)/ N7 C- Z( v0 c' O/ A
{" M( T! ~2 P7 ?2 @/ f
printk(KERN_ERR "register chrdev fail!");, r& P7 ]0 O3 H, H1 B, a+ b
return -1;5 _. w) V6 c+ N, B G: r6 w% k
}, B1 V/ q! V' C
) g' T6 K8 e/ m0 a mcbsp_cdev=cdev_alloc(); c5 ~3 K M. k s2 v& Y' Z+ I. ? I
, j, B w7 T+ D$ S# b- o( n if(mcbsp_cdev!=NULL); R6 c9 i) x4 z* m
{
1 q4 h" }3 m0 ]+ t" W) ?0 C4 u cdev_init(mcbsp_cdev,&mcbsp_fops);: _' Z9 w1 r; v' D' V
mcbsp_cdev->ops=&mcbsp_fops;: Q! k" @4 x8 `, O! v8 g
mcbsp_cdev->owner=THIS_MODULE;
Q& s y+ z& o$ D' I# X
3 S' x8 Q. D" D, i0 [ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))* v7 }/ o9 I8 N" L: v3 P7 _
printk(KERN_ERR "register cdev fail!");
0 X. L' s( a2 V( j! x else3 i# {! S2 Y* L6 V( M' H
printk(KERN_ERR "register success!\n");7 f" B' C% ~( a
}
# U7 E4 w( i f) [$ F- R3 {& B7 R else
) W" p& `, @* E {
3 s% k) e6 F& U6 m0 x printk(KERN_ERR "register cdev err!");
, B K% V2 k: B1 m" m) t( N return -1;
) M2 {& E$ o, y, D O }
4 Q4 C. S$ \; X' C, D- a 7 R F; m; r/ X% n# r' ~) S
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' T3 a$ e' V. _- n. T( B* ^
if(IS_ERR(mcbsp_class))
# |) ~' u" E; S# L+ p U& b {! v4 f. n. y' p, v% Q, ?1 X, G/ c
printk(KERN_ERR "register class err!");
& D/ u& a. |9 ~2 r* }5 O return -1;
# N) X5 U4 f6 c1 }+ a }
8 F4 X( v" f, v device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 g- k# J; n. S) m3 {0 l3 X4 j! d7 }* M
j; e' t5 ^6 e q+ | //PSC
4 ~! K; ~& C# ? //add Enable MCBSP& V9 y4 a6 U7 Y3 _1 T8 R: N2 I
//test
2 R! W4 n9 d; k7 m" h$ }. [ temp = 0x80000003;* c# b5 S% G/ p- N6 S
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 V! x9 _! X9 f4 M temp = 0x00000003;" y% D4 V$ g6 ?8 E7 a- }& }
writel(temp, IO_ADDRESS(PTCMD_ADDR));1 t$ S( k+ k% f
( p. Y3 I8 w0 j" p' s6 m [8 h ^+ |6 H
temp = 0x001FF201;9 ]- M6 g/ `$ n/ b1 t
writel(temp, IO_ADDRESS(PDCTL1_ADDR));" }# ~ J) K4 n1 M. \* G' W
8 i8 q: r0 v7 o# W& f, H //PINMUX ( n5 t0 y* d! O
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ O0 N$ G4 c6 W7 U. v1 V
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; y0 N A6 q* ?: E& j PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , n( p$ p4 i( G% j) B2 x2 J
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! v' i7 X3 N2 X0 U @. J' E9 K7 r8 z! P. ~
//SLEEP_EN,EPR,L138_SHK1,L138_RC) @6 Z" K: @/ [" J9 _7 q
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); / }3 f7 N" T. ?0 `& m4 r+ V: g' ]
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
& {) h, p ?0 q: [ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. O7 V) |; q; p9 y
; N5 D/ _5 M9 B Z //RESETn,L138_SHK2: R3 i9 A) K* g9 N1 E/ v
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + a% s. o Z% f% `6 Q1 K# G% ~
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 7 Q7 \& h9 _6 m; {4 r: A, o
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);. C( V0 _6 x) V3 T; e" h x
; V, P2 l0 y" e4 l, @
1 R4 O8 X: k$ T# h/ p) h
//SPCR Register0 @& I9 _, ? y- u+ |* J0 q- \
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ T" c. K0 K2 C: B. R7 b, X U
temp = 0x03000000;//(DLB=0)0 O6 l. O1 p% R9 _, S
// temp = 0x03008000;//(DLB=1)
/ V8 \8 @7 L# m/ f2 R* x writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
' Y2 r+ [5 \- ], s, l5 t$ u temp = readl(IO_ADDRESS(SPCR_ADDR));
0 _, m# v3 G0 ], @; g printk("temp=%x\n",temp);
; H; r. o, w2 C$ R# Z+ E : z: \9 v9 ^0 f3 j
//PCR Register
" a4 ]& U# U' D" G //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% s$ W- k0 T2 b' [+ q0 Q // temp = 0x00000F0F;" K% I% ~& j& O2 O1 x4 g( X
temp = 0x00000B0F;, G( v% W) M( x
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " x: ]: ?- f# o- I# M
temp = readl(IO_ADDRESS(PCR_ADDR)); U& @! C4 [/ S3 e; ]; a
printk("temp=%x\n",temp);
$ X4 W) C8 E( u4 ]% {. n# L //SRGR Register
( W* k0 e# O$ }4 X //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# U3 ~4 O! m2 M% @3 t7 N
//temp = 0x301F000B;: Z' F: ]" ?) i' m. P
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 B# ~% M. r. H5 p, N* o G9 o temp = readl(IO_ADDRESS(SRGR_ADDR));
: F, X4 F2 T6 G2 t/ Q4 e* k printk("temp=%x\n",temp);
1 k! ~+ B" x' |" \: Y //RCR' S2 u3 S1 k6 h* L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. i7 z; F. b1 `7 a6 \7 T( o
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0 M. l* n/ j9 ^( P3 Q' {$ f
temp = 0x00440040;
. |% V0 G3 V# W% j s, @4 x8 T0 E writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ! n& W1 B$ y4 k6 g1 `7 W+ F. n
temp = readl(IO_ADDRESS(RCR_ADDR));
; \# c) N0 B" k( I. v! @ printk("temp=%x\n",temp);
* G, L1 b" L) |6 x9 ~ //XCR
+ C+ S( C: d( N- o6 E$ I //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- [% i1 B9 M4 {1 h
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% N0 s, h7 H) @- [( G temp = 0x00440040;
; M* r- Z% d, |4 Y6 Q& c! j& z% c2 { writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 W* O% X8 U' G( X
temp = readl(IO_ADDRESS(XCR_ADDR));
7 i: J* z# s% c1 ~+ v$ F+ h printk("temp=%x\n",temp);% S: t( y7 @* @/ H& {3 {+ x
udelay(100);
- j( u7 x' Q' B# w. @0 k' ]) m //SPCR Register1 V1 C6 s6 \5 T2 A9 i
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* ~9 [0 G4 \2 C1 g" { } temp = 0x03C10001; //DLB = 0 VS DLB = 1' ^7 j7 `- M- g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
R& T) Y* R& q( K7 p* M2 I+ ? temp = readl(IO_ADDRESS(SPCR_ADDR)); {8 z/ a9 ^. \. M
printk("temp=%x\n",temp);
' `( c7 N% Q3 p$ ~ udelay(100);
7 _9 J0 c( @- D2 d4 n; b n' {$ h/ }# ]# {/ P+ F
//set GPIO direction0 I+ w& J& p! f/ }; i0 \
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 R* \) z, n0 J
temp = temp | 0x00000100;//EPR----input+ {- N& m6 w3 E( Z5 @1 V
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 b' R0 Y: E6 A/ f- z2 V __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ t* F' B3 ]" g: {7 q
. |* b6 Y1 Q- W( |, j return 0;
7 ]: C5 t# O" N}
/ J% r$ m% D# j Hstatic void __exit MCBSP_exit(void)/ C; S) q9 p3 p. `, V t/ R- H4 k* m
{3 y" s [. |; E" Q7 L
printk("mcbsp chrdev exit!\n");2 @: |. X1 @, t5 H3 q( H; Q7 S( Y
cdev_del(mcbsp_cdev);5 c f6 w9 @" m, Y3 V2 }4 D3 v
unregister_chrdev_region(mcbsp_dev,count);" H/ G0 }2 T0 G0 h8 {( k, q
device_destroy(mcbsp_class,mcbsp_dev);
9 l$ s1 \# I+ ^8 `- A class_destroy(mcbsp_class);
$ a" @ F9 s$ s8 O4 {4 D}
2 ]- c+ C" ], O$ B8 r h5 Xmodule_init(MCBSP_init);
4 s* n0 M; {1 Cmodule_exit(MCBSP_exit);
5 g( @9 ^2 C0 i9 f, C+ k P2 v: {: C2 ?
MODULE_LICENSE("GPL");
3 d" z2 t+ m( o9 g% H+ ?7 w
" ]! s" @3 U- V* u我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. L+ v- U3 s) S7 y' m1 k我的应用层的测试程序如下
1 ]' E- g* a$ Y6 t6 T q#include <stdio.h>
9 o3 j1 j8 S$ Q#include <string.h>7 h" N5 H; j6 Z3 X5 @( t
#include <fcntl.h>
7 R6 n5 k( @* b8 h: i: E/ F#include <unistd.h>
, \5 p% i. b. r#include <signal.h>
1 j/ I* h# G9 Q a0 X* v#include <pthread.h> //线程
3 M9 ^6 ?7 Z# E* g# Z#include <stdlib.h>! F1 r0 M3 M" f/ o* F- C5 D# s
#include <pcap.h> //捕获网口数据( Z( K. f! C4 t% I' @5 u
#include <semaphore.h> //信号" C6 E; M) o9 E# d" Y
#include <sys/types.h> //消息对列
0 R3 E2 ~: w X! c; y#include <sys/ipc.h> //消息队列
0 f8 j5 g& G( n' Q#include <sys/msg.h> //消息队列
7 w3 _+ k# b* V+ z/ o9 h#include <sys/select.h>3 t9 v( t! C- z& S3 `/ r2 F
#include <sys/syscall.h>
/ z1 \# y; b" x, Q7 I$ z#include <sys/stat.h>
' `# G5 p, K: w& \; V+ p6 ^#include <sys/mman.h>0 E$ w: O; u* S4 Q9 M4 P k
#define msleep(x) usleep(1000*x)
% H4 C$ G3 b: S, b
, x( j" @" y6 V& s) d& eint main()
4 c8 ] `! Z2 R+ M+ Z{ . q/ |4 ]9 ]- i* M5 k0 k
//MCBSP,ARM与AMBE2000交互设备
2 |0 M0 q' \) P! j$ } int fd;
. z, k( t8 u, B. F/ T3 ` unsigned short data_write = 0x5555;* Z, p! n( y* c3 |! o7 V% Q X/ m
unsigned short data_read = 0x00;- V6 G1 v# U6 t* U1 t
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 s0 o+ `6 C# `' e+ X
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, ?1 |) ^" E/ i2 @3 u) e
$ {/ j1 W: N0 |2 M( n% [. G4 u, h
if(fd < 0)6 `) C6 j9 C6 O8 E! S
{- d/ W: c8 i# V) S& Z9 n( w
perror("open failed\n");9 C/ O1 D) |) W7 q% l# J3 `
return -1;
9 e ?) _& w- Z9 e2 S }4 {! b3 H' m5 o
) ~* p! ?3 e8 ]* d. C s while(1)
^0 }2 O$ N+ A! |3 K) ~ {
" l! r9 B3 ^3 C; _/ _ g! D' `
! d$ v7 k# o+ j" { //AMBE2000每次读写是24个字为一帧0 [+ q: {' J& w3 h: Y" G* I
//写数据时将数据在底层存储起来,等到中断的时候再发送3 Y2 F+ J5 @: n1 t, L4 M
//AMBE2000输入数据是以0x13EC开头的
' E/ f& a( r# G, Y2 k write(fd,&data_write,sizeof(unsigned short));
* R) U7 R" f3 k& H" W # `) d O( n, \& X4 e. ?
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
; b! D" h' O( x+ n read(fd,&data_read,sizeof(unsigned short)); V! y9 ]- t# m; Y2 ]( i
* H- r- ~+ r- l7 Y
if(data_read == 0x13Ec)
- h- A& B+ V5 P I# R; n {
" F. N, [4 C' }: r. i* G5 C: k & \' T2 K* j9 H1 O4 I" o* V
printf("data_read = %x\n",data_read);4 R0 I( y2 D) l" ?( X3 v% @
}
0 R# B6 s: R9 x5 v0 C: v6 f
( v0 Z7 V1 \) b+ U msleep(10);
# |6 V/ N# [3 r/ k2 ]$ E+ Z4 s
|- S5 p0 C6 x" [% {% Q" W /*
( |6 d) ^2 N- P- U( Z; t0 l ioctl(fd,1); 0 J# t- ~- U4 `- M; }4 C
sleep(1);1 N7 ^' Q2 O6 r6 K" P3 E
ioctl(fd,0);! d9 Z6 T# O" b, {0 T; A
sleep(1);0 T! f$ K4 }8 h4 q
*/
; o- ]* S2 k- K9 D& K6 e1 Y6 N } + F3 Q Y' _8 j! _: f
return 0;
9 `0 F1 j7 ]6 T
3 g4 a) N& C( G: J8 {}( F3 L( f; x& d7 n5 d; ~
! c8 j% A! V* ~5 K c
多谢各位指教,谢谢! 急& P& ]& V3 g7 Q- R% g( k% z4 N( z( ^
H+ u' D2 b2 Q
& f' ]8 G* l. x) A/ L
! ^1 }) e$ O$ k7 ]
5 |" a' |! l( |& K
2 X) T& D; E' R. D7 z0 X
|
|