|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * X) J) M; {2 n
/*- v" i7 V7 O3 ?( A- Z5 i1 G
* Copyright (C) 2009 Texas Instruments Inc
5 D1 ]. w8 D# i# n4 p" N *
1 s" L% }2 }0 e; D# h * This program is free software; you can redistribute it and/or modify( q( `" l+ I/ y* r# Y
* it under the terms of the GNU General Public License as published by
& j1 a& D: j7 e7 n$ I2 F * the Free Software Foundation; either version 2 of the License, or
- W- B4 e) e6 b * (at your option)any later version.! ~& G3 Z/ m! A9 g- B0 {9 l/ @
* ^* L0 I5 T. ^, C* E' V
* This program is distributed in the hope that it will be useful,8 X$ k( n- @. H1 [7 n; Q0 F
* but WITHOUT ANY WARRANTY; without even the implied warranty of
( u4 j/ M+ y- d7 }1 Y) H" ?1 J * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 u0 }9 c8 ?- u$ v4 D" O' V * GNU General Public License for more details.
5 F0 z: }+ S. W2 k *
: S2 w# ^/ P/ O* W6 k( \0 g. V * You should have received a copy of the GNU General Public License
/ R! T! F6 d' H: w$ q- D3 K# N * along with this program; if not, write to the Free Software( q+ \; _4 U# ]" n1 ~
* Foundati3 J, @, k& V2 c
*/: z; W4 _& H- n8 J2 H
#include <linux/module.h>
1 o9 l1 b# c! e3 t0 C#include <linux/init.h>
' h5 _+ W0 H' f& }#include <linux/errno.h>8 M/ H9 l( y* d+ \/ ?
#include <linux/types.h>4 h) [1 p7 @+ e, p2 w
#include <linux/interrupt.h>$ Z! B: X% h( H) V* { W
#include <linux/io.h>
" A# Z. G5 w# B8 o5 d#include <linux/sysctl.h>
' w& N: X( [! }( ?#include <linux/mm.h>; p i' L8 @) s+ q
#include <linux/delay.h>
! s# r& n3 _8 a6 ?#include<linux/kernel.h>
3 p0 p4 u* n! V/ F5 T7 D#include<linux/fs.h>
+ q* O: R) C' T+ Z* S" t#include<linux/ioctl.h>
; e5 w$ J0 L# b2 R1 ~# V8 I#include<linux/cdev.h>
. j7 P1 f4 z7 I3 F#include<linux/kdev_t.h>
' D; k8 h/ q- [#include<linux/gpio.h>! t7 {* Z7 C3 |# z0 \7 B2 |5 k# e
#include <mach/hardware.h>
) a) G! D5 m- V5 c1 g#include <mach/irqs.h>- c/ C) u0 b* d: c
0 P, \+ H4 Z5 e#include <asm/mach-types.h>
) I3 K3 a4 o0 E9 a#include <asm/mach/arch.h>
' U+ ?% E, i; y: T#include <mach/da8xx.h>
; t2 R8 m- B$ o& f9 Q& U/ S#define SYSCFG_BASE 0x01c140000 y9 B& w7 B0 p4 o, X
#define PINMUX1_OFFSET 0x124 ) f4 W: s* Y, ~
#define PINMUX18_OFFSET 0x168
9 K/ V3 B5 Y7 E) f [5 C#define PINMUX19_OFFSET 0x16c4 o0 w( h" X% m1 i/ E0 N! `
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
6 X0 M6 h1 A" ~( j#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 H {$ X& A8 }) G#define XCR_ADDR 0x01D11010 //MCBSP1_XCR- f8 U2 f( a0 e( n9 T: |" P
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% r+ _" ]9 p' W$ r- t
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
/ x: o$ y1 \0 e) s: B4 Q
! t- c9 J- ]' o/ x; g `' v/ F, _#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
5 w1 x. ]9 i8 R I5 j$ w% z" M4 d#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- X. J7 d! H, M5 l4 {' @+ i//PSC
- M* O+ Z3 h' }#define PTCMD_ADDR 0x01E27120 * @0 v& S, w5 p- ]8 ]6 H# Q
#define MDCTL15_ADDR 0x01E27A3C
0 _' H. D" O3 z @( z#define PDCTL1_ADDR 0x01E27304. O+ R0 I2 T" [2 l u
//GPIO8 direction
9 d$ H! i8 Y: O& W* P& m8 ?& c#define GPIO8_DIRECT 0x01E260B0! x( |; O) r3 c1 x; n, r
#define GPIO8_OUT 0x01E260B4
% S% M G- K; k1 k- K) w8 A" q#define GPIO8_IN 0x01E260C0
1 v4 T, E/ g! ]# R& {+ W
3 t9 [2 S' h- S, U0 `: k% C1 ~5 {//#define MCBSP1_RINT 99
9 Y5 c% Q9 S0 }, y9 L6 e//#define MCBSP1_XINT 100
) b8 u$ W; ]2 @static int MCBSP_MAJOR=239;
8 n3 ?& L9 h0 Z& ^0 U1 [ astatic int MCBSP_MINOR=0;
& E2 @$ {2 l8 h) dstatic int count =1;9 j) z; V7 p+ o
+ Z' B/ C. s# W. I( h. z1 W#define MCBSP_NAME "MCBSP-device"1 W& S$ t; T- U8 i
0 W. G9 x- h: J! `% C. Sstatic struct cdev *mcbsp_cdev;
" ^; w: ^8 p7 `6 sstatic struct class *mcbsp_class;6 y/ H$ R# B4 ` O/ |
static dev_t mcbsp_dev;
" B D* G' \8 p1 Hunsigned int DRR_data;
% R) |6 Y5 Q- s( ]6 Q+ b& Yunsigned int DXR_data;; u4 [; _$ z' l2 ^, x
static int mcbsp_open(struct inode *inode,struct file *file)% s( w$ F k1 a+ a& g* B% B- k
{
4 D4 Q+ B* e8 T4 d7 h 4 v/ K: s# `9 p" u- s
//interrupt enable,initialized0 _6 C) x. v0 y6 Z& o6 L1 ?
unsigned int temp;
; ]3 R0 @+ C7 s //SLEEP_EN(GPIO8[10])---0- c2 W/ `# m. r5 @5 k
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! ?# g M* q$ y k: ~ temp=temp&(~0x00000400);
. g) r' m% U7 B% l. T __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
) u a6 r' m& { s //RESETn(GPIO8[8])----0----1
& H4 c+ ~) {/ a3 Z6 f6 a2 A, t% k temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ N0 ?, g Y1 @, k1 E6 f6 `5 S temp=temp&(~0x00000100);
; @3 p. d+ Z* ^$ W- D5 @8 F __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, j3 f7 N4 h5 b- H+ e$ j3 a% s5 g
udelay(100);: x1 S0 W. J, }7 e. u, L
temp=temp| 0x00000100;
( G: r1 x! d; v3 A8 S. t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
1 l8 K4 F% S* a! ^ udelay(100);
1 N g$ `' x& C( L: b& z& O' U printk("open success!\n");1 O) `% j. |1 z$ D
return 0;' O6 {5 l: z: M
}# ?: d! _5 R" _3 q
; h+ c# q0 C) w6 dstatic int mcbsp_release(struct inode *inode,struct file *file)/ z% d% s- t; N+ C' P( S: ~" T+ M* Z
{
( F {4 s: P) Z+ r/ g. m) Q* f& m printk("release success!\n");2 \9 x% g8 A9 W: i) N
return 0;6 G+ k: k) S* G' F5 O
}
( {; t S& m+ {9 z% v, L+ \
" X" l$ A5 z2 G! }% gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- c5 ^5 t1 a' X5 j{% X$ {8 Y4 A. p* u& l0 d6 s# \5 A) o
copy_from_user(&DXR_data,buf,len);6 `* l4 Y/ Y4 P6 k- S
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); $ o" p, X: d: T( x$ t
return 0;
" C4 d. m2 e6 f5 N" l + O9 f* a: F7 c1 U; c8 C
}' y5 G: W4 E& h$ g
2 @1 s4 w5 t2 C7 z7 i: [, R- ]
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
i* j& D7 B" s% _2 R& m{
8 z' m( |; J+ `7 @ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. O8 P, n, W) |$ m( Y$ c2 T$ K1 [( h copy_to_user(buf,&DRR_data,len);
# n0 N+ d4 ~ M; x5 r! v return 0;4 n4 o) c3 U5 }4 k2 y. M
}8 |! w% w5 m# V8 f8 G8 u- U
/ c! W# |7 o3 i$ |# _9 t4 h
% K+ a4 a M5 T0 Bstatic struct file_operations mcbsp_fops=) B) ?" E, |3 G* m" P5 L
{
+ |1 _' T" t8 G" A) S .owner=THIS_MODULE,! S3 T$ R" h! `2 S* t0 ^
.open=mcbsp_open,6 n& i! j8 W" g) B5 I9 E1 P2 Z
.release=mcbsp_release,
* w6 D8 `5 R1 u$ H; o .write=mcbsp_write,
j# `! `# A o9 I* Y9 t" ~0 N .read=mcbsp_read,
+ W' T. A3 G& r* i, S' m4 y' I};
$ c @ N" N1 R1 k7 p' Z2 a& @) Bstatic int __init MCBSP_init(void)
/ Z3 P% p# G/ q$ T2 ~6 s8 q: x# M7 u{# J* @ L$ \, V8 t* J. e/ S, T
int ret;
1 Q: _; E% l( Y unsigned int PINMUX1_REG_old;
6 L! b3 f4 m1 L c unsigned int PINMUX18_REG_old;
0 j0 E7 s Z1 x5 W) a6 z unsigned int PINMUX19_REG_old;0 A3 H$ F% ]. b; a/ C7 |2 g" V0 T
unsigned int temp;
8 P/ m) r6 A w! `; N' u& a if(MCBSP_MAJOR)8 [3 [1 d# X' a( U6 X, N2 u
{
- U! j+ |3 N, e ~" h; C- o mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 |7 X3 p9 N; D" [
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 p- R+ ^4 `0 k }
, N% Y1 w a4 [* I else( x! H: R: x* ~1 d! S! x j* c
{$ q* j9 K: {" Y$ n5 @$ o
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# P D" r L4 k1 B$ c MCBSP_MAJOR=MAJOR(mcbsp_dev);; W5 L; [9 [8 B# j
}
2 I! R& X. [: {/ f* Z1 Q( U
9 L2 C. {; O8 j6 u if(ret<0)
" _9 [: u' C- k5 K5 Y {
6 {. k( o* B5 k: ^; c- @ printk(KERN_ERR "register chrdev fail!");
8 D- L% }, ~* _/ u* r: y return -1;
$ X& T+ l2 U2 s) ?1 U9 S7 ~ q }
2 ~4 T7 ~2 U2 {/ l
$ y, v# V, u K mcbsp_cdev=cdev_alloc();0 n* g0 e/ Q% q3 ]! h/ l
, d. @: H* w) W- Z if(mcbsp_cdev!=NULL) N8 k4 t7 }) Z# L `/ w# R
{
2 A, |7 o: ~6 D$ N/ o' D. F+ N cdev_init(mcbsp_cdev,&mcbsp_fops);
* P& V/ |3 y# n3 A mcbsp_cdev->ops=&mcbsp_fops;; q4 M% D0 p6 R5 u, S- n' `
mcbsp_cdev->owner=THIS_MODULE;
0 }% ~: l* E$ V# A & J H8 y0 d- }8 e
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" j8 \% t4 T) g; o printk(KERN_ERR "register cdev fail!");
5 G# {$ w9 ^& k0 \" t! M( e: o else0 R0 h2 x/ _: H1 D! {
printk(KERN_ERR "register success!\n");
( m! N7 f; q9 M, w( r E }* |* }" m* f4 j% Z, a
else1 o$ m) f2 h9 X2 M4 }) V8 |- S
{* {4 x8 L) n* @2 [! U
printk(KERN_ERR "register cdev err!");
+ K5 W) [7 O7 W: i return -1;$ U- p* q h" {3 E* \$ F
}5 g" W, ]" A& t _1 V7 M" E3 a* z
( r! X7 w, _3 ?! N mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
' x( }3 ^7 X( A" C; U9 c2 ~8 x/ ^ if(IS_ERR(mcbsp_class))
, Q4 w- i" P, A7 j2 } {
2 J$ a' r) n$ e4 T" D) I$ i. [5 h5 j printk(KERN_ERR "register class err!");( B$ S! t$ `1 n! p. j
return -1;
/ K& ^, {: j, N `7 G0 ^; W( ] }
, K) p) S6 _5 W- x device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 P3 N1 S/ `. h9 p$ l
7 d0 ^! \4 b1 X
//PSC) R" n; R" }. D3 ]3 M: {
//add Enable MCBSP
: d/ C$ B/ v/ I6 l7 | //test
5 r, U; J) j1 C0 |& s8 U temp = 0x80000003;
~' Q+ J- a) B3 A writel(temp, IO_ADDRESS(MDCTL15_ADDR));* V/ O6 o+ j6 M6 e5 m! P
temp = 0x00000003;" w4 K7 ?" r/ G# M6 U$ s
writel(temp, IO_ADDRESS(PTCMD_ADDR));$ B; ^) T1 ?' e6 z
, P9 c& ~& b/ J/ ^0 x7 P- d
temp = 0x001FF201;
: U% B3 g4 ]+ n- }- F3 C: u writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- [8 u' a+ H b# c& ^% {
) X$ l6 ?# I$ u# e //PINMUX 8 G+ G ~: B- W* J9 k
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# }- E7 q j8 @2 P1 a# w; ^6 F PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 V1 [- u3 u" g PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 3 ?! G& y. R5 f: t% H$ B$ `
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);7 {. t5 ~+ ~* b5 v V5 F, l
% d# m1 I% e1 I# o `% a //SLEEP_EN,EPR,L138_SHK1,L138_RC7 g3 ?4 N3 M0 L) c5 E& j
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # z4 z+ l1 g9 s
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; : x5 F* R+ n& {1 F% R
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% t2 B5 H' S7 C3 _2 c- Q
( z$ W# r3 z' A9 T4 u //RESETn,L138_SHK2
$ T2 M, ~ n) U; \) r8 t! d/ } PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + @) d! O, C( p0 C8 r+ _% W
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 9 _; u# Z4 a l( X& O& y2 y Q5 ^
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) K, a8 u( z3 o0 ] : ?" ^+ d* [; F6 r1 W4 D
+ L; T, u+ @6 m0 E5 y
//SPCR Register
0 B# A* M- m. B" r, t2 P0 C# Y //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 ^ | j/ E8 F9 D* T temp = 0x03000000;//(DLB=0)$ o* H1 C* M8 A
// temp = 0x03008000;//(DLB=1)+ H8 S {% @+ c
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% T! }; R+ o, \5 }& T( v temp = readl(IO_ADDRESS(SPCR_ADDR));
- }" }4 H6 j; Q# S. s- H/ D7 M+ |- n printk("temp=%x\n",temp); z" A, T7 ]- {5 T
9 X5 u2 N- p8 p! f8 _" H5 j E3 @2 u
//PCR Register
# a- I9 k* P$ u- C, U //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 X$ s8 [" g$ U j
// temp = 0x00000F0F;
" p+ b! N+ W% c1 Y2 ?6 v temp = 0x00000B0F;
T6 q( E5 }( v' N. z- M writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) q& _, A( P% ^5 o6 [6 X" V6 d$ w
temp = readl(IO_ADDRESS(PCR_ADDR));1 K' d. r4 f% ~
printk("temp=%x\n",temp);
& s) B& V% s& H' Y+ j! }" a# O7 N //SRGR Register
! T2 P! a' Q# j' M* [$ j: Z& x //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11) t+ P5 A. U) e; U0 [0 F% A
//temp = 0x301F000B;
5 A3 x; u' V: C2 i) U writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
# d t, }4 x/ b! U- X% U+ X2 U% o temp = readl(IO_ADDRESS(SRGR_ADDR));0 w% [ U8 V: \
printk("temp=%x\n",temp);
. {- I; w" f, g7 _& ]5 t7 K# Y //RCR
& u, l5 U2 {4 i3 c6 j //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 C$ g/ R4 b- q. x# n% } l6 {, C
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
% ^" w( m J5 k2 u {& } temp = 0x00440040;" @- m* C+ u6 W! p1 n. \' H
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) B; V* X, Y4 r5 u temp = readl(IO_ADDRESS(RCR_ADDR));
1 o8 K1 W6 C* `% N% N5 v" u+ ?( e+ r5 R printk("temp=%x\n",temp);
. u' A+ }' R$ l4 k* \ //XCR
3 P( u" V1 J: a //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) u, w5 H4 u3 o: k. c
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 I- s2 g8 c7 o, I temp = 0x00440040;
$ X: @$ x' G* {# K4 @ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 8 }" q# ?6 r7 I Q8 q* h2 y8 s/ ]
temp = readl(IO_ADDRESS(XCR_ADDR));
5 \! I6 Y d% |" v V printk("temp=%x\n",temp);* N0 L/ w0 O* R A, |# u4 o
udelay(100);$ y! A3 ] U( M- }
//SPCR Register6 m l3 f8 G, W9 B' V' C
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! h: J# z- Z4 g& i
temp = 0x03C10001; //DLB = 0 VS DLB = 10 H7 `/ z) |, X' Y$ w( @$ o- o
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
) T: U# x0 ]% _* {7 G4 c9 a( H temp = readl(IO_ADDRESS(SPCR_ADDR));
. g" o( W8 c4 U5 {; u3 y printk("temp=%x\n",temp);4 y! S; u! Y4 S3 |2 [+ S
udelay(100);8 B7 {+ E, A+ s# @: m$ @7 g; j. t
9 F8 t4 v7 K2 X8 Q3 o9 \ //set GPIO direction% {2 w) I/ B: l: H3 A- d
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
, [$ {; x0 a3 d% P! m temp = temp | 0x00000100;//EPR----input6 |# }" q- G# T5 K
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* q B! s2 W+ N, {
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " k2 M$ V. y/ e% L$ C. e
! r# U3 Q& o$ H0 s
return 0;+ X: d- y/ e0 r M
}2 n4 A' x$ L" q" v+ V- r. m
static void __exit MCBSP_exit(void)3 I0 M1 S: x m. \& X
{
5 z9 w( P$ s* A printk("mcbsp chrdev exit!\n");
' L+ M( w7 ^$ O9 m9 D cdev_del(mcbsp_cdev);' i6 Q' x& {. C7 W
unregister_chrdev_region(mcbsp_dev,count);
- |$ g, J+ U; U6 k+ Z: w8 n device_destroy(mcbsp_class,mcbsp_dev);
/ T% v/ f! }5 H( z class_destroy(mcbsp_class);! D0 Z" J8 v5 U
}
8 o m0 O1 L$ E% a# R9 u9 ]3 Ymodule_init(MCBSP_init);
' |0 [* [0 Z h2 Y% dmodule_exit(MCBSP_exit);! T6 D' P8 p9 R {& C) r
. r" X M! F3 W% N. ^MODULE_LICENSE("GPL");: Q; {& w( K# [: j4 u
; f5 G: F( u! l; u* ^& J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" O) d0 z4 z5 l0 x9 R- P- n+ l我的应用层的测试程序如下+ t8 @8 K1 j; S4 l
#include <stdio.h>
$ t: z% g& U/ Y5 G5 R4 O#include <string.h>; `* I. {6 i! D9 q( L+ A6 w8 A
#include <fcntl.h>
5 h; i3 g4 R- z#include <unistd.h>
6 r, U* E( O0 H#include <signal.h>
q% H! d8 r3 n- y- a; N1 b# n$ b#include <pthread.h> //线程
4 c% V) S6 Z/ s#include <stdlib.h>( z" v# O9 d% |. I
#include <pcap.h> //捕获网口数据- {8 ]% p; s, T( |1 l/ z
#include <semaphore.h> //信号
: l. a! B3 u) }6 [1 Z#include <sys/types.h> //消息对列5 p2 V( M: N0 U
#include <sys/ipc.h> //消息队列' n3 Z5 _3 Y* A1 G$ o3 M
#include <sys/msg.h> //消息队列
$ H1 \$ B# @2 j) F+ L) T#include <sys/select.h>
% o' c3 G$ b" c" f$ K( y3 g' ?#include <sys/syscall.h>- J- z; j- ^8 Q, j( M
#include <sys/stat.h>
1 m% G0 ]) n+ a4 ^2 M#include <sys/mman.h>0 M/ a. Z) u) H2 h/ ]; a
#define msleep(x) usleep(1000*x)/ p1 g. [* @/ I h
, P \& }. w7 T/ ~+ o/ lint main()
0 [# y! E2 G: J5 x5 T0 {{ : a5 z# p9 r+ n0 \
//MCBSP,ARM与AMBE2000交互设备; ~& g8 b: z) N
int fd;
) `5 O/ d: O0 @) {1 S% `2 Q2 y unsigned short data_write = 0x5555;- l7 V7 v/ q f2 b/ g5 l" `
unsigned short data_read = 0x00;
/ v, y# h: x& Y# y8 i8 X1 B: a; E fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 Z: i$ h7 ]9 W3 s, ?3 ?3 x // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 K4 Q; N5 l6 t( j. W2 D
; a0 j( x H' S) \& Q# q! W; n if(fd < 0)2 `; h& D" \: X6 X# z; L
{4 _. ?/ @- l* ^4 Z
perror("open failed\n");
L; ^0 Z X, g* f3 Q: D return -1;
5 X( S: U- P! N; {; N/ Q }
/ M& b* [& \1 q1 s
1 \8 S1 d# S3 l" o, W. u( a9 { while(1)- Z6 X& l' J& W" d2 D: Z/ Y' G# c
{
# u" u) y2 z* v5 y* Y; b : j2 e4 Y& ^9 y0 i V- s
//AMBE2000每次读写是24个字为一帧) i E( ^: o' P. h
//写数据时将数据在底层存储起来,等到中断的时候再发送9 {# T" `/ x% @% X; d) p. v
//AMBE2000输入数据是以0x13EC开头的
/ N3 i; H" ]* N. i0 H write(fd,&data_write,sizeof(unsigned short));
. W# [/ x& j- Y( y @7 d; H' J5 A/ q3 j% p
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 0 P& ~; \1 x+ b) @5 ]# D. h
read(fd,&data_read,sizeof(unsigned short));- E! J. x1 O+ L( d
# t6 N! y! l5 {) M5 T% z6 S1 m if(data_read == 0x13Ec)4 W5 e" h2 h# p7 R
{
, r% E& r0 ?! k
: W' \- M8 O1 w" O4 }) y printf("data_read = %x\n",data_read);
2 Q) _+ ^" O- ]% F1 C i } }
7 x3 f" ^0 n. [1 { I* s 4 k3 F0 [8 A+ h, `& J: T
msleep(10);
6 p. W1 {* ]- U2 D8 | & u& u& P9 M( k1 N/ H C
/*0 G- p1 P" a7 n! I8 |+ j
ioctl(fd,1);
6 T& ]$ h6 v$ a& l8 v" k% x( G. P sleep(1);
; S4 y- h6 L; f- ~; Z7 [ ioctl(fd,0);
0 P. R4 w( B. ~ g sleep(1);
* r- e3 `' r; P% W' v( E */
f+ ~! e! u; Y! O. E# e* V2 P- D }
1 c& \0 b# e! B& |' u return 0;
+ f& M. S7 E( a: j 0 }" V/ T5 F% f
}( j1 {! e0 k: V6 c+ ]
" p" u G$ C- W多谢各位指教,谢谢! 急8 f* J( r( V- w. Y9 h2 b
0 q7 z& [' R. q' @! C
& V; ~; s) m4 v7 K2 r; t
0 I+ ]' L# q. j7 ^+ G% g5 ?- h
/ C6 r4 }& O3 J0 v3 m0 A
o, l( m7 p/ p# t* ^) K) Z* _* ? |
|