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