|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- j& l d) [) }, C9 f& f/*9 U$ M; D2 A) B( P
* Copyright (C) 2009 Texas Instruments Inc
' L( W7 n- F/ A5 h/ n/ d *
' Z7 e. j* z0 _0 O * This program is free software; you can redistribute it and/or modify' o; B& h% J3 V. v/ e+ C' q
* it under the terms of the GNU General Public License as published by
8 @! f* v7 @( P0 I2 v1 v% t3 w# h * the Free Software Foundation; either version 2 of the License, or
2 C4 H& t! m$ k" @/ d, { * (at your option)any later version.7 [0 o; O6 w; ]% q. J) n; l" i
*
& d* f# d/ V8 R! |1 l * This program is distributed in the hope that it will be useful,
0 M( ^& O' L4 `8 n * but WITHOUT ANY WARRANTY; without even the implied warranty of! x) H+ O2 {0 Z" [2 q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" l4 k0 a" X+ r- C: {$ X * GNU General Public License for more details.
5 n$ C7 R7 F* m. A7 Y) i *9 z1 {" z; T. s' ^
* You should have received a copy of the GNU General Public License
/ Y1 r( Q1 s; s/ f: Z: d. X' a * along with this program; if not, write to the Free Software7 ?4 {0 X" f7 F5 N, n+ E& j! e0 N
* Foundati, Q& x2 u0 `: [0 B6 P
*/8 D; y5 M$ r, ]! e4 a% u( j" A
#include <linux/module.h>3 Z) M- L' Q9 ]* E2 `" S8 r
#include <linux/init.h>
% o$ b S6 W. v6 A#include <linux/errno.h>' r9 b% Y- n! ~9 u3 Q4 @
#include <linux/types.h>: F# v6 h, g8 h; T( y
#include <linux/interrupt.h>
' m7 v5 S U) J2 [: d f+ f% R#include <linux/io.h>& P& \. |$ O0 V3 z
#include <linux/sysctl.h>3 l9 B& p+ }; Y& |# H
#include <linux/mm.h>
* ~2 q/ l+ v( w9 X; h5 v$ h#include <linux/delay.h>, C& y6 H' ^1 ?9 h; F" s/ A
#include<linux/kernel.h>0 U5 t/ S9 S: G3 n! |: d
#include<linux/fs.h>
8 k0 O1 J0 C2 o#include<linux/ioctl.h>
' l' j9 c& c! g% i1 [ w: M#include<linux/cdev.h>) H! N x0 i" \: E" M; O
#include<linux/kdev_t.h>
% \8 z0 z* `1 [# l- N, w# z% [. z) b* m#include<linux/gpio.h>, k$ ?0 H6 F% W' B( E
#include <mach/hardware.h>
/ K% S2 l K- n; Z4 w* \7 g#include <mach/irqs.h>
; h4 v- T8 X2 a8 [6 i! E& }7 g6 n2 z9 [" N$ o/ d9 n
#include <asm/mach-types.h>
9 ~* {% s4 G: S$ M% P#include <asm/mach/arch.h>
9 |& K5 t+ ]# t( R& n& ]$ s2 r#include <mach/da8xx.h>- g& H5 M8 }$ ?3 k) c: X3 F
#define SYSCFG_BASE 0x01c14000
# U7 J' ~1 J, w3 d6 p8 t6 ]#define PINMUX1_OFFSET 0x124
X5 [8 O! E4 w2 P#define PINMUX18_OFFSET 0x168 + `- V! ]. ]1 B2 I5 P8 |5 L2 s
#define PINMUX19_OFFSET 0x16c
u* x, q& H2 {& m2 m) x#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
8 j2 m# Z2 h; @0 ?- L' S; Y7 n#define RCR_ADDR 0x01D1100C //MCBSP1_RCR8 r7 j* l- K9 p O
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR9 X; ?: w6 C0 m2 T
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% W- y* [. @4 n/ _#define PCR_ADDR 0x01D11024 //MCBSP1_PCR0 a) i3 l: F% U/ Z: \
& o3 O" l& N& U4 q+ l#define DXR_ADDR 0x01D11004 //MCBSP1_DXR* K4 G" U! g! b6 G1 m+ A) u+ [ H1 M
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR0 n6 B9 o; J, J& C
//PSC4 X# B6 q- p# \) e/ {. v* M5 a
#define PTCMD_ADDR 0x01E27120 # }% y& S8 v/ E
#define MDCTL15_ADDR 0x01E27A3C5 a& m" c$ a* c) G
#define PDCTL1_ADDR 0x01E273048 z6 M" p4 G1 D6 P6 o
//GPIO8 direction
2 V! C2 k; c0 |5 r( A6 `8 h8 e: a#define GPIO8_DIRECT 0x01E260B0
9 }# i/ Z8 C/ {. w#define GPIO8_OUT 0x01E260B4
7 M8 }3 A' k' ~2 g* X5 n3 i% U- L#define GPIO8_IN 0x01E260C05 n1 F2 `# i8 k. U
+ {% ?- B* o$ [, k//#define MCBSP1_RINT 99 " V. S' G# }' y( B# C
//#define MCBSP1_XINT 100
+ s; g/ }4 |& v( t& `- }static int MCBSP_MAJOR=239;1 y9 V i2 l) I/ a! m
static int MCBSP_MINOR=0;
$ V# W# }+ s2 v! b$ x7 m: astatic int count =1;4 x7 h8 J& X( B1 o* h8 d
# K0 m/ {% v7 n; o! ?# G# `8 F
#define MCBSP_NAME "MCBSP-device"1 p: t- d V) H+ s5 B0 }) a5 B
! o4 T# g! V5 D3 p7 Q' z$ [
static struct cdev *mcbsp_cdev;
5 L, y. K8 e& P. P, k% o% z ystatic struct class *mcbsp_class;: l& h9 ~5 f. E" |, [. n" Q5 }
static dev_t mcbsp_dev;' P4 E( {' F4 Y- o5 F% D8 ]+ ^
unsigned int DRR_data;
; q8 o$ D: Q* junsigned int DXR_data;
, \" e" t* t* @2 |. \static int mcbsp_open(struct inode *inode,struct file *file)6 G8 `1 k6 f- \ k
{
+ p# E; q( A4 z( t' d
$ C) D6 W% I. x+ D2 ^* |3 F //interrupt enable,initialized; L& V- Y. Y; m
unsigned int temp;$ s! V6 N' `% S+ \1 P( f T
//SLEEP_EN(GPIO8[10])---0
8 R3 i& A; M) n* N4 f9 ?& h( W temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ n9 x3 [4 D, W; r temp=temp&(~0x00000400);
2 r6 d9 x! {& D7 A Q2 e! U2 [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 j- q* r$ ^2 p2 G! m
//RESETn(GPIO8[8])----0----1
! k, t; F. d$ Y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 ^. E/ x* B, u" \6 |! ^# z temp=temp&(~0x00000100);
* G9 d& Q/ r4 U. h$ X2 i __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. q: K4 l, P$ R+ d- E udelay(100);
2 j; d/ G2 A6 ^3 U" U H$ A temp=temp| 0x00000100;
1 b# f7 p. C" L" ? __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* I1 g9 ^6 i) E* y4 q- _4 d
udelay(100);
( I* j5 S$ J' L8 w0 h( i9 z printk("open success!\n");1 @% d4 V- E/ t2 w" @
return 0;
7 f+ f1 B6 b5 N( F# M}
1 }1 l y/ Y* U& z* y, R/ B3 N( X: q
static int mcbsp_release(struct inode *inode,struct file *file)1 I" U: {/ v/ m+ w: F
{8 N5 s* ~/ e' H/ m4 a$ f
printk("release success!\n");
6 O8 l t7 M# ]( k2 W8 `; m return 0;" C, X! ?8 r7 i# X; v ~0 k9 k v
}. A+ b$ k6 q2 ~1 l* x& _
$ ]! A3 h* |( U) p) Y" s
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 j+ ^- J) [9 |$ k! t+ |
{6 R6 i# R) Q ~
copy_from_user(&DXR_data,buf,len);4 l2 Y1 \7 ~" t0 p
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # J* ^+ H& b1 m; G7 ~
return 0;
% I3 r* r) ?7 S. Q, j. Z8 j
6 s6 a9 V- \. k! q7 w+ b}
$ K* i8 d& a& c8 r* R' \+ T( F
- U3 b+ A, P6 ?0 Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
& T7 }0 ~2 v0 R{ {8 J* n: C: m% N
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' T) I9 F& t+ F, k2 I" J copy_to_user(buf,&DRR_data,len);
( s. D& n1 Y7 X! c return 0;2 H. H+ k: ~; E t- o: }
}
4 m& o& f6 f$ f q$ D
9 f0 `2 G+ `% }- M" Z! p7 |0 `7 i, g' r8 j2 ?1 i: F: v0 A9 P& {
static struct file_operations mcbsp_fops=
6 e( X/ d1 @0 K! t2 Z5 O{
- z! a+ R: R, J, _& X" _ .owner=THIS_MODULE,
% _; a( Y; o& H" m/ I4 n$ Z7 V. J .open=mcbsp_open,
8 z$ N' k7 a8 R& Z .release=mcbsp_release, Y# K" i3 }) A9 l5 o& I! p
.write=mcbsp_write,7 ]2 h; m- e2 ~7 B; a% m
.read=mcbsp_read,
3 t5 S! g* ?4 G2 y# ?5 H};! P, h. H+ \& G. c* r
static int __init MCBSP_init(void)+ X% S* Q( ~( I. r
{+ o$ m: Z4 I. f. U! C/ R
int ret;% F" m7 ~3 f y F: A
unsigned int PINMUX1_REG_old;* a0 `3 \7 l# b
unsigned int PINMUX18_REG_old;5 D6 q5 k5 a# n! z+ z
unsigned int PINMUX19_REG_old;
t$ S5 n! C/ t$ b8 A* g6 _ unsigned int temp;
" p0 E4 h" d+ T if(MCBSP_MAJOR)
; G7 j/ q0 H$ s% O2 X {$ h" D3 Z' ^7 \. c1 K( U5 P& i8 c
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 Q9 i/ @1 B, |! k# @
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ _* U2 |- a" b: v- i }, y" F) E) p' c* M, Y
else/ F0 Y" X2 E; l& |. }% Z( Z
{5 Q; S4 [6 Y+ J1 F8 t
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& Z7 `$ ]' @7 k2 P! e, z6 C' l. O x
MCBSP_MAJOR=MAJOR(mcbsp_dev);9 S$ q% C9 X$ i7 ]7 T
}( Y, H- F1 S% H# M, m% v
; O9 B2 o4 E1 C7 Q0 ?0 e8 ^
if(ret<0)' x- E/ M( T- l: V
{$ Z( a6 [+ u* @' I. x
printk(KERN_ERR "register chrdev fail!");
# s6 H4 g% B- Q4 l4 Z; Y4 e& x return -1;' g! B, J& c. R* S
}
5 k r$ D8 |6 r/ ]
; E( y' }+ r- ? ~ N% B8 p0 ]! k mcbsp_cdev=cdev_alloc();% m( B- O2 L u! G/ t, }
7 C6 R! k4 ]* W if(mcbsp_cdev!=NULL)7 P5 k2 h) P0 A% c0 M3 @% e
{
5 o( c4 J! ?* l cdev_init(mcbsp_cdev,&mcbsp_fops);
$ r! n/ u. @0 D6 I% l% ?$ T mcbsp_cdev->ops=&mcbsp_fops;
' V) r7 ?3 F2 w# J5 l mcbsp_cdev->owner=THIS_MODULE;) w/ s+ F- R# }1 X
& r- J7 c+ U! S
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( T V' I' C B& v& w printk(KERN_ERR "register cdev fail!");
/ W% z, u; G, ^* P7 j* m+ e& ~ else$ k) G5 B( \! F
printk(KERN_ERR "register success!\n");% ?3 W# Q$ m& ^+ h4 K' z$ N% f
}" \4 Z8 Q- ?# g
else
5 h8 R. l, {7 a {
4 Y7 N- I' n2 c2 o; Y0 u printk(KERN_ERR "register cdev err!");0 d: G9 Y }2 P4 f0 J/ D
return -1;
Z6 L; u; M% `6 b! y( F }- l) C* p, X6 j' v" v
9 I* | H- s/ ] mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 Z2 B R8 y4 |$ `
if(IS_ERR(mcbsp_class))
, U8 g5 q6 E# o' T, h {
$ Z' W l# ~. X3 C3 y: X printk(KERN_ERR "register class err!");
: M, H7 Q$ N4 Y return -1;, h% H/ o# [* p; r8 l: M. k; w
}
* |3 A8 |6 V* \, m device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 Z& {5 V# p0 }& }: R3 `
" Z3 V% q% H! `* k8 I Y5 E //PSC6 c! b) |7 S$ G2 Q5 o Y$ c/ s6 n
//add Enable MCBSP
. U4 P9 k6 \( J, C O //test4 T8 r3 |$ K; ~' }
temp = 0x80000003;
( t; `, _6 b+ x# y/ ^$ o. L2 Y( j7 P writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ u' Q! P* h4 K+ [. } temp = 0x00000003;
9 f. n7 F6 B3 \* `# ^ writel(temp, IO_ADDRESS(PTCMD_ADDR));$ Z5 X3 y% p& e# v$ M( n
, C) J% V5 L4 V6 y
temp = 0x001FF201;! r, E6 H5 t+ c9 N
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
5 T# z- p* e) U; B7 R; ^' F/ ]6 ~4 O
" f+ n6 c- T5 \ //PINMUX
/ s S2 l5 i6 Q1 z9 {9 H1 @, B4 n //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: m- a# ]9 E* X8 B, M" Q- U
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 V- H* j" s$ L1 N- c# t" o4 U* V PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 2 Q% X4 F G Z
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);/ p2 q! h0 w+ w0 K- A, [
# m5 G6 L* \5 A* p) O' Z //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 {* K- Q# {' J; t% d PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . Q6 J; O, j4 V/ e' j) i8 ]
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 2 L9 b" k% g1 E: v r9 W
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ \- H6 F: C, F! D( K
6 }7 f9 v6 o0 J( D) r9 I- ` //RESETn,L138_SHK23 k/ B2 }8 W+ F, q) I/ c- G: e
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : V0 w+ v+ O- |0 t0 C9 t6 s8 @' _
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
; J; H% u7 v+ W' k4 d writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 f5 i1 b. O* s0 W4 t $ f: ~) X7 ^9 \
8 T6 N/ Y2 ?/ t. l9 t2 I" u //SPCR Register
" b. ?! `% N0 l8 D9 @5 m //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 `5 P! b n1 a+ n8 b1 W
temp = 0x03000000;//(DLB=0)6 O* U2 S% M/ M3 t3 C- M
// temp = 0x03008000;//(DLB=1)
" S1 C, M4 v$ E' E8 Q writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset$ ?, y' x6 F; b% S: l W4 o/ q( ^
temp = readl(IO_ADDRESS(SPCR_ADDR));+ k _- z, ~2 S$ V
printk("temp=%x\n",temp);
8 C) V# q: h% |. p
C3 F0 C3 [; u6 I" @ //PCR Register1 f* S" X2 _& g. r G
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( X% j0 F% {" I. G F5 |* L // temp = 0x00000F0F;* F& L1 v0 v+ w0 k
temp = 0x00000B0F;
# i- h% z3 m8 ^ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
/ i* b0 i, M. G# q4 h$ ]9 S temp = readl(IO_ADDRESS(PCR_ADDR));' I% S/ c' d( g" F2 a4 x
printk("temp=%x\n",temp);
: H/ b% U9 H* w //SRGR Register w. h+ ?+ n) W7 I
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 l0 x2 u3 X u* r. n$ M //temp = 0x301F000B;
5 X' T& v/ }/ \ h" r7 N3 K9 a( F' I writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 8 s$ @, Z. F; x
temp = readl(IO_ADDRESS(SRGR_ADDR)); T x' j( z" T: ~/ z: s9 B
printk("temp=%x\n",temp);$ C7 G' A0 D: B
//RCR: [0 G H. l$ J/ `- l7 p6 d
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 q5 |" i& Q' k9 G //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 N0 S% P9 A$ P$ ]! U8 |
temp = 0x00440040;1 V# P+ N6 m* M
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized + P8 `' R. q/ @. T
temp = readl(IO_ADDRESS(RCR_ADDR));( U2 S( K1 ^* ^$ p
printk("temp=%x\n",temp);
) h' ~& E) }: `4 D: H4 K //XCR& z6 [$ r% D9 F: @, r
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) j! {! d) ]" C1 m- S" |* b% E
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 l. Q% Q5 {! G0 L1 Y, V G temp = 0x00440040;
, \* N; W0 K, m7 n- z; ? writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ \2 f; W0 z* i# x temp = readl(IO_ADDRESS(XCR_ADDR));5 M# `1 w2 g7 W( h$ E7 r" [
printk("temp=%x\n",temp);! b, D' v0 s, Y( w. v
udelay(100);5 x/ e! E+ `; T4 l0 h8 f
//SPCR Register
& a _; y9 ~, m1 b' l1 f //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: M: S& R; u- j( }; V) d temp = 0x03C10001; //DLB = 0 VS DLB = 1
6 N8 m. Z+ u4 J* d! o# W# s" t writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
3 j: N* `6 A/ C( }! ? temp = readl(IO_ADDRESS(SPCR_ADDR)); \3 |4 u* [8 }; J2 i& S
printk("temp=%x\n",temp);/ M& S$ z" G4 s3 m
udelay(100);' Z8 S5 V. F _% f8 h/ P
- I: `1 a/ D2 i0 ?
//set GPIO direction
7 G" |8 {! Y. m: C9 j$ e q9 U temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 w7 R |% d [9 } O0 N: e temp = temp | 0x00000100;//EPR----input
# J' V# \- d9 I$ R8 Y5 K! N0 Q. [6 [7 @ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output7 Z" D. m+ u0 D( g! {- B) U
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + M& S k% t1 h8 ~3 L4 a
+ X9 |5 k) w& x4 c return 0;* P' x* H" B W# K
}% G5 m# u1 L8 n6 k" _6 e" f7 e; ^* m6 a
static void __exit MCBSP_exit(void)" v+ F/ ` B r- T0 F6 i, I
{2 G" Z1 [7 U2 S& d7 h8 U
printk("mcbsp chrdev exit!\n");
, B' p+ p0 n- O, Q6 s, y, ? cdev_del(mcbsp_cdev);5 S/ E3 V, F% v; w$ e
unregister_chrdev_region(mcbsp_dev,count);( W: _0 O2 b$ _$ I1 c" z
device_destroy(mcbsp_class,mcbsp_dev);
8 r$ Q/ _0 t' v: {7 k6 m3 h class_destroy(mcbsp_class);7 H6 a+ K" t# l
}
' R \1 S: ]. A3 N* f0 \module_init(MCBSP_init);
' J: W+ n' J# _+ @' zmodule_exit(MCBSP_exit);
& ?% g( \+ Z }4 I8 ?4 l2 M- e' a9 [ Q$ W7 D9 X
MODULE_LICENSE("GPL");/ b3 N) k+ h5 l' M- U Q8 |& Y4 k
6 J+ ?$ B* T1 x1 B8 _6 g6 C( \4 I我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 K% |8 Q, g! G7 _& z! z我的应用层的测试程序如下) [% c2 c. f* S
#include <stdio.h>
8 e' m# _; g8 _ o* H1 Y# J* W8 N% ]5 Y: ^6 C#include <string.h>
& U+ Q* x- w' s. i5 m g6 e4 U#include <fcntl.h>
" H' C. C% q# i6 A$ D#include <unistd.h>
& Q X+ }$ z) b' H6 z" A#include <signal.h>. L& F, W. Y/ z3 P I
#include <pthread.h> //线程- m! y: V+ N( q' ~& H
#include <stdlib.h>
3 k7 _) S0 v- m/ c#include <pcap.h> //捕获网口数据3 m# U& D2 X' j: h) n
#include <semaphore.h> //信号
# k% |4 H" N6 C* l9 h" s; P#include <sys/types.h> //消息对列
[& Z/ D- I6 B* I" k: O4 V) @#include <sys/ipc.h> //消息队列
! W3 v _, S8 S x8 q* e L#include <sys/msg.h> //消息队列- O3 j9 p' ?' z ]# A, {
#include <sys/select.h>
% n0 Q, ` F$ v9 T#include <sys/syscall.h>
3 ]/ @' q0 K; i- I#include <sys/stat.h>
] T( F* i4 h0 S7 B#include <sys/mman.h>1 Y3 {5 ?6 n3 ]1 l3 z P
#define msleep(x) usleep(1000*x)
7 N7 B7 J6 E& f% V, y
! L4 s3 G' |) i- m% T+ X" J/ Gint main()6 O; X7 a/ ]8 |0 E! r5 h
{
. ~% L0 t2 X( I2 n. [: p //MCBSP,ARM与AMBE2000交互设备1 Q! P9 T+ |* H" T- A6 [; N0 T
int fd;
5 d$ Q5 o9 E' y. o7 G$ l7 x7 J7 m6 w unsigned short data_write = 0x5555;+ o3 T; O4 o' j
unsigned short data_read = 0x00;0 ?1 K+ k/ Y8 j3 i6 `4 c" J2 M! Y9 T
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* `% B$ R1 T5 O& O {' h, X5 j // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 ?2 {' V; l/ B+ E
# Y# d- G: J. \6 u) |! Q9 y; C- p3 k' _ if(fd < 0)" X0 d' g. k" H- C4 c c
{7 f3 P8 j! y) e3 c% O
perror("open failed\n");8 `2 p4 g) Z" \( r- C# R
return -1;0 `; H: {4 z: C; P) `
}! |3 F8 F( J! V# U& t$ O5 _
4 a3 P5 ]9 z+ e" a/ J( Z. d" Q+ ?
while(1)
0 i3 I. }. A! C: ]: {3 B {% s: x4 K, w' |" R# @, S7 K/ m# `
; x2 Z* T; S( D% B- H3 I
//AMBE2000每次读写是24个字为一帧, ^ d6 k7 K" K) O# Y" h
//写数据时将数据在底层存储起来,等到中断的时候再发送+ b+ F0 H% ^, H7 z1 c) p
//AMBE2000输入数据是以0x13EC开头的% t; d( B. A2 i( v" S+ F
write(fd,&data_write,sizeof(unsigned short));
$ h9 S, a! \. Y7 m * ~" N# i! Y: k7 t4 u( d
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 \0 N1 Z5 |' s4 w, ~& V
read(fd,&data_read,sizeof(unsigned short));. [+ | b3 x7 S( l! [
' f1 K' K l5 D4 T( p if(data_read == 0x13Ec)
/ l6 c5 G, f+ i- z {% r1 G7 G9 _$ w8 {* x9 W
- d; X5 C! J" k4 G8 a8 |' l9 d printf("data_read = %x\n",data_read);, E- n O& p2 R7 p2 F, W+ W+ V# n
}
2 B3 o+ d$ p* ~* v
: N! p- A! H! n2 [! b/ M msleep(10);
' r+ i! _; U* O/ K
6 [. C7 p, |/ z/ d; h! Z /*! r% N; a5 `# B9 ]0 G. t
ioctl(fd,1); " W+ N4 C2 g' f' x0 A
sleep(1);
9 d' A/ a f6 H$ Z ioctl(fd,0);
9 A/ v2 n+ X% L) }8 F sleep(1);
+ Y7 \( w" D* k U7 H* _. h */
7 m. Y. Q- ^) F" ]1 }& F } 4 h9 m3 j0 s5 `; ^& t; X
return 0;5 n+ Z- p* S% X+ q4 k0 V
0 T) E) b6 C- m: D7 R1 g
}7 ^% k. S" H# R) g, d" V& M
. R8 i3 Q5 v3 h3 ^- |
多谢各位指教,谢谢! 急
& b$ J' v1 L7 `+ w& L& L
$ ^6 i- O$ e; ~8 |4 D2 t9 t
" a' I- M) ^; R) `# w0 L2 o) a
3 Y5 M: x S; s2 m" i4 [0 l7 Z* W6 P0 ^9 M' Q8 g8 j: m! W/ @
/ c& V/ G9 S& o9 b% m5 q
|
|