|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
6 V1 R, d' k/ M9 L1 M, H; \/*% d2 V& H( w' N
* Copyright (C) 2009 Texas Instruments Inc/ G. }' W1 x: R5 ]/ J
*" E: w/ s5 |% Z0 z. u6 v8 ^4 S
* This program is free software; you can redistribute it and/or modify3 |- d! W) }( r# ^; d" e
* it under the terms of the GNU General Public License as published by2 u0 P5 G8 u( q7 ~4 `
* the Free Software Foundation; either version 2 of the License, or
* F; Y, A" |* ]0 I) D * (at your option)any later version." c: K# l6 E$ T4 p+ L% ?
*) s% G' F# i2 {- g5 @8 y: A5 v1 f
* This program is distributed in the hope that it will be useful,: A" N# w O! Y" M5 m! o) {
* but WITHOUT ANY WARRANTY; without even the implied warranty of
7 ?7 Y$ Q7 O6 v5 p/ q6 Y1 P$ i' @ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
$ N. |& {& r/ n * GNU General Public License for more details.2 r+ Y8 C0 n$ B, ~4 n
*
3 l8 H, a& E H * You should have received a copy of the GNU General Public License X& T& Y) h" V4 c& A
* along with this program; if not, write to the Free Software7 n, F% f- ?) s* R7 z9 B
* Foundati7 b- x1 ]! i5 |# Y
*/2 C6 d5 K) m+ Y% V) x
#include <linux/module.h>2 [9 Y4 P) |2 b7 {: J$ v) K
#include <linux/init.h>6 \9 c5 C* V4 h9 ]; }0 |
#include <linux/errno.h>4 g7 N/ m% n3 e+ t7 u8 Z) A+ a
#include <linux/types.h>
! ?5 ]5 L1 E: L$ O#include <linux/interrupt.h>
5 O2 e2 t: |; W1 ^#include <linux/io.h>) b# E' I) @% s6 ]2 C: o
#include <linux/sysctl.h>/ u' Q! O8 w2 R9 j
#include <linux/mm.h>1 K. M8 F2 G: p3 R0 s( T3 E: {* g+ `
#include <linux/delay.h>+ L' ~, `5 K* u0 p. O" a+ s% t+ V1 n
#include<linux/kernel.h>1 ~; F1 Q- x# d; r+ Z% V
#include<linux/fs.h> F/ y) w, q# B6 M5 ~( F3 R
#include<linux/ioctl.h>! n [: b9 Y, {3 X3 l1 t0 k) L
#include<linux/cdev.h>
4 `+ V- \. t; M5 M#include<linux/kdev_t.h>
! S: k$ e7 T- h: Q7 ]#include<linux/gpio.h>
' s6 o! I( F/ S' d2 [#include <mach/hardware.h>
; g' V# @. S/ n#include <mach/irqs.h>
8 [+ ?: j9 g6 B- C9 a8 \8 v6 _2 A
#include <asm/mach-types.h>
/ s9 `; k% |3 F2 b#include <asm/mach/arch.h>
" T. s! m& z$ _# V0 R#include <mach/da8xx.h>. V! f3 M+ \& R- d! i7 q6 E
#define SYSCFG_BASE 0x01c14000
( y6 ?9 q5 K) @) H: [#define PINMUX1_OFFSET 0x124
: c; @" ]' x! i7 V; A) r#define PINMUX18_OFFSET 0x168
_; u6 I# l8 c#define PINMUX19_OFFSET 0x16c" g4 h! v; b5 R1 H' o
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) d, E+ {+ i- U x' A) q: g2 U#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
" A' i4 c$ v- s#define XCR_ADDR 0x01D11010 //MCBSP1_XCR$ ^% M1 N) }( ` C/ f) @
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR2 o) T' {' X F9 [0 L! m# z' L
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR5 N! R0 V( y9 k; B1 n J& L
0 m; F* c3 O% U9 L$ R! w4 Y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR2 x4 e$ O/ k+ h7 s! T
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR$ v+ c" c! y* w& i
//PSC! y3 z9 D N. t; ]# \
#define PTCMD_ADDR 0x01E27120 - I( Y! Y& c1 c+ l! D1 I
#define MDCTL15_ADDR 0x01E27A3C
- k& F. Q0 r5 K& N#define PDCTL1_ADDR 0x01E27304
* Y y' `4 w8 F//GPIO8 direction' P6 Y( V. _% Y( G, ?$ \
#define GPIO8_DIRECT 0x01E260B0
2 u% f! o* C5 G% c$ C* H- @, C#define GPIO8_OUT 0x01E260B4
3 P( ^; W2 e+ Q% H: j. K, L#define GPIO8_IN 0x01E260C0+ L2 N1 t$ I6 r4 s" k0 P
/ \6 T8 ~- K/ W7 Q//#define MCBSP1_RINT 99 ! n" U& g m- J% I
//#define MCBSP1_XINT 100 * _' B" ^! B$ f
static int MCBSP_MAJOR=239;: X! n9 u$ Y) D: K
static int MCBSP_MINOR=0;: z) B* [% m9 \( X) R7 {
static int count =1;
& C) ~6 d3 A" j6 S8 {7 p
8 y; B1 t1 e7 U" z7 ~#define MCBSP_NAME "MCBSP-device"
. I" C- s; i0 ]- }, t6 w3 a
, z+ ~: X# ]6 Wstatic struct cdev *mcbsp_cdev;9 B6 K% ~: [; i: e9 \$ o# O1 R
static struct class *mcbsp_class;: P0 \ B/ K4 H' O+ E+ L( n
static dev_t mcbsp_dev;
. H1 o5 ]* S/ punsigned int DRR_data;( Z4 c+ K; y$ [
unsigned int DXR_data;+ x( f z. }* V9 N
static int mcbsp_open(struct inode *inode,struct file *file)
4 Q5 Y r7 ?; D% T0 t{
* s$ A0 m8 z; J I
/ V: C X# g$ b" U. P //interrupt enable,initialized
/ B: M ]8 Z) K" x unsigned int temp;$ z( h' `7 J8 m0 U! W
//SLEEP_EN(GPIO8[10])---0
' w( n; j; E+ L' p j( q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); O2 E( A/ h! ~( W' B; u
temp=temp&(~0x00000400);9 t; S; |/ ^ s- j2 F
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
9 G" t: a% {, i; b! y) i0 k2 D9 @" f //RESETn(GPIO8[8])----0----11 h+ g0 v$ Z$ K9 B
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# A. [4 y( W f8 z4 ?, `* l2 w
temp=temp&(~0x00000100);
# L7 d3 V/ s9 p# S! E$ g- W __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& C2 ?0 K, V. M
udelay(100);
P7 O9 q- }. P, j temp=temp| 0x00000100;! ^: I n8 |2 f
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1( R; c5 F; a3 l. C0 t/ p
udelay(100); }# X" X2 N. Z5 Y6 ]( ]
printk("open success!\n");6 k/ m& ]5 ?$ x
return 0;
& b4 t# [0 [! A5 S0 V, O7 x. z/ `5 a}2 ^* J' S4 a% C; @! \0 ?3 @* B; J
$ w3 t# y7 O8 `7 l5 ~4 M
static int mcbsp_release(struct inode *inode,struct file *file); ?$ l0 U9 f0 F" x
{
; m5 a |: a, w; M! ~2 _6 W) E2 H printk("release success!\n");
' {* u" T" g+ z3 v6 l( A! l return 0;
% V. E2 z% }' _( z/ b}
/ n' k+ Y; R) A0 w! z3 [
1 |, f+ B V3 }: k8 Y6 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
7 d! |( e e$ h! {" |' p; {{8 |. Y1 ~" E. r# b r
copy_from_user(&DXR_data,buf,len);6 O* I! p) E s
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% x; Y8 ~# I7 Z' F9 y8 v( b return 0;
3 v0 u4 T: P: z/ s- ?9 w ; e& |9 w+ P1 s7 S% D) R
}1 h& E' _5 U( n; Y @
1 q; [- b2 W1 o; zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' K1 z1 c- x# C/ H' u{ 8 s- o2 g; j2 ?0 H7 B9 B
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' z8 E a. `/ ?
copy_to_user(buf,&DRR_data,len);
q" a3 c) q/ K' z" n return 0;
- R9 w E U: k' k}
( [4 H$ F2 c; `( p* i7 C; Q$ N# G
0 V3 _4 x4 k0 Q' [& o/ h [
; f. K" f7 g& I: d2 [, n' m( N: Zstatic struct file_operations mcbsp_fops=7 J1 m, D* p9 s* O9 ^
{2 {% V6 Q3 f9 U1 B2 u( p5 u7 r: J
.owner=THIS_MODULE,
. z% t; C4 M: i .open=mcbsp_open,( Y4 X' } h# Z% n( ^
.release=mcbsp_release,0 n& X2 z1 W# p! m
.write=mcbsp_write,4 `6 Q* F2 e" n1 g
.read=mcbsp_read,
1 k( h% F A# {$ I# X};& X0 O, @5 [4 K! U) {
static int __init MCBSP_init(void)
7 P% Y6 |) }4 E9 a{3 J6 [/ W2 w. \6 W3 L2 R0 S. m
int ret;3 g2 {: m, B6 u3 U) D
unsigned int PINMUX1_REG_old;
. V! S b w" Y unsigned int PINMUX18_REG_old;
4 `+ Q, O" f; o& N unsigned int PINMUX19_REG_old;* Q( [+ c9 H, K7 u" F
unsigned int temp;
9 G- G0 f: b7 y/ m. O9 \" R+ U if(MCBSP_MAJOR)
$ m& G5 B. l* x- H8 {1 l {
2 v9 Z, z! C& A, k- h" P mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 G/ T3 Q) c* k: o7 U. D! Q
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ J1 Y8 b) N2 q: @5 l+ `/ N/ a2 Z
}
* j9 C0 P M/ p) H! j' m; L4 [: n# M else. b b/ B; U" ?* @
{# f; N- @. s. V. T- F
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);/ s1 H, l% F9 q4 L
MCBSP_MAJOR=MAJOR(mcbsp_dev);
# ^( O& u# \4 O6 b5 s }; [* U& p2 \& d! y8 c! b
6 Z6 c2 n8 M; G |4 S5 v& j
if(ret<0)
8 C) c7 u0 D0 V( C: h, f5 y- b" P z {$ K# u9 p1 a2 Q/ k7 B3 m4 L
printk(KERN_ERR "register chrdev fail!");
! o+ }" G; v- L& h9 g* S5 u8 ]/ x9 | return -1;7 L! g$ E0 O8 s$ g: S3 [
}
7 Y I S" B% M3 V
% S6 C" l- n8 l mcbsp_cdev=cdev_alloc();
2 N" }: `0 K2 }; D
8 _ c/ |+ z) H- T$ N f' i if(mcbsp_cdev!=NULL)
+ z9 ]1 d: [: w1 c. r {
/ \' a% B, N! U; u( x! b& z, B cdev_init(mcbsp_cdev,&mcbsp_fops);- Z, R6 @& T) F: }: w
mcbsp_cdev->ops=&mcbsp_fops;
8 {# n Z: K; m( h5 f2 k+ y mcbsp_cdev->owner=THIS_MODULE;% }: e, b R- e
) T, h$ O i G+ Z5 E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 l# \; n" t2 A% R w$ t6 j
printk(KERN_ERR "register cdev fail!");* B3 U$ s G- y, W
else
: z3 A! g$ P' r) T% h printk(KERN_ERR "register success!\n");) J, u& O/ y( c: N2 c5 X: E5 S) j% h
}$ o/ K$ ~; q# T) M& \4 o' R$ x
else
/ f2 S( s0 }' F {
' l4 {" n0 n, ?# L) u printk(KERN_ERR "register cdev err!");
?% w' _2 f0 m `5 U5 t. D return -1;
8 ^' d0 [! B2 ^; v' _/ u2 x }
! {- g! P' M, z+ G# d9 S0 j - Y2 f& W& W) e7 n: M4 F
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 @8 c* I$ A1 y' _, b" w A( j7 c8 e d
if(IS_ERR(mcbsp_class)), q8 i# p1 y9 H+ h7 @& e
{) g& [! n" O( v2 V
printk(KERN_ERR "register class err!");* E' t+ b& k6 Z7 R
return -1;" L9 i: i) ~/ ?1 V: i
}
: z k2 i- ?! E0 s/ _" E device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 h7 }4 z( S8 D3 x* w: ^
& V; i' i# ?' Z4 ] //PSC8 u2 h+ Y$ N1 F/ }# k3 ]
//add Enable MCBSP; A8 x8 R0 b& j }* R5 _
//test
' l9 Q* w& @3 M4 f6 } temp = 0x80000003;
# H/ o1 t j& u5 [3 k# O. P writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 |- a! l4 \2 x3 T4 K3 l( ~
temp = 0x00000003;8 r0 x& v' i$ u6 z$ S6 {
writel(temp, IO_ADDRESS(PTCMD_ADDR));
; r2 [* ]) S8 m V ' R4 c& L3 J" g: V
temp = 0x001FF201;" H2 t" n5 j$ v% \$ O
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 `& ~* `1 | x0 [) o/ `, x$ ]% J2 _
+ M( c$ h) Z: }( R4 d! L/ }: e n //PINMUX
' e& F* z9 R4 I: P+ G //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 u7 I, Y1 Q4 s0 d6 V+ g: B" r7 H$ S0 z
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * {! t( {4 v. ~ B9 B' y
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; . j7 R$ n3 `. i. G: e7 k; h
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ |% n. F) R D- t7 c9 w7 E- ?4 z- Q+ R
. L6 j' E7 |# X( y- o* {/ n+ i
//SLEEP_EN,EPR,L138_SHK1,L138_RC
1 A0 k- w1 q7 T: x) \ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- A2 A; i; J; b7 E PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 1 x4 q$ N0 X( V# g. v, _7 r
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 ^; a% ~1 d' t 2 @# x+ T; v! I
//RESETn,L138_SHK28 I4 Q; S+ H) V D9 n9 C
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 r4 z8 }2 J- L$ o: V5 @5 Z; Q PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 ~( X6 i$ W; l2 I( Y0 Z+ x& v writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 y8 p6 w' H4 v- ]6 y' ]. r
' I% P0 j! u- A" R. T0 Z 0 a+ p# A4 \7 p5 N
//SPCR Register
# I+ H V. _1 d, u6 z+ o. K3 W //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; l% G, O/ F; I5 B
temp = 0x03000000;//(DLB=0)3 w( C% B4 B r0 ^0 c" \6 X* @
// temp = 0x03008000;//(DLB=1)$ ?( m# t6 G% \3 ~$ y( i: g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset* t& _) m% a3 i, o+ ]- i
temp = readl(IO_ADDRESS(SPCR_ADDR));
6 s, u/ n8 M) h3 U printk("temp=%x\n",temp);' o0 h3 r3 Q8 E) v
! ]/ K' `& L. L
//PCR Register
8 P6 b" C- f5 Y" [5 H //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 U" T1 O) h, k7 |9 ~4 n9 K3 |
// temp = 0x00000F0F;
, k' N8 L6 h ?& H& c4 z+ q) ]+ Z temp = 0x00000B0F;
( ^. K# I+ B ~" k, U writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
: P1 G2 b% ]. j& e! U1 v temp = readl(IO_ADDRESS(PCR_ADDR));
$ x' j( Y/ d$ f+ e/ z L+ v printk("temp=%x\n",temp);
$ {4 E0 E5 E+ u0 U* G' b //SRGR Register
* v) d) K: K0 B" {; ]2 d9 M //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 l" |' u& i# ^) K( K' a. F //temp = 0x301F000B;# [& Y5 z0 x8 s9 @7 V
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
4 x: k2 s1 @ Q3 j) c6 ] temp = readl(IO_ADDRESS(SRGR_ADDR));
* `0 c$ ?, h0 ~; e printk("temp=%x\n",temp);
1 f& s! P. L; R) V2 i8 u C //RCR
% U6 l+ [# t: a; p, [ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 E& L- T/ f& ^2 X //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( R7 V$ h) k7 D$ s2 V5 ^1 |5 g temp = 0x00440040;2 [6 z" ~+ d; l+ o# Y
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 5 f; h( E$ q2 g3 X* `4 b
temp = readl(IO_ADDRESS(RCR_ADDR));
8 z" A1 f# a3 g/ H/ G3 _$ | _9 m& N% P printk("temp=%x\n",temp);
3 m# h. e7 t; ]- D. ] //XCR+ \6 u: U1 k, ~- B! h& K
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ @" \& M! r; l& i. H! U0 |) h //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' i1 q" Q4 l# d* G temp = 0x00440040;" y( J w' v- k; Q3 k0 \; |
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
* f; t( \. L+ }9 u temp = readl(IO_ADDRESS(XCR_ADDR)); Y8 t( `9 o1 a' C/ Q
printk("temp=%x\n",temp);
* v/ B d7 v" u0 H- }* Z udelay(100);8 J3 S+ k9 Q+ y
//SPCR Register
O' Y( W# R3 |! `+ Y- U. X //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-14 b T( d% J. q$ |, I5 l
temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 v8 I$ V0 P0 a2 _ ]0 E j5 V4 z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
8 R4 j; w! [( v( N6 J4 h2 C temp = readl(IO_ADDRESS(SPCR_ADDR));/ e- k) u5 L% h4 O; w' i* I
printk("temp=%x\n",temp);
8 W1 C/ v5 K) B: |* p1 [; P udelay(100);
: x. n$ }1 o6 Z% Y1 K; N+ h7 Z' Q x- o+ H2 V& U! ?) a- j
//set GPIO direction
4 y1 Q6 {1 n( l4 D. E# R temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 d9 p; S& e. N) c* ]# D temp = temp | 0x00000100;//EPR----input: m# w/ e, G* h" C5 k% p
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! w4 [4 w* f$ N0 u8 P
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # Z" x6 k1 n R
3 H, o3 c/ l: r3 F/ i; Z$ ~
return 0;
7 s3 ?' d/ G1 C7 @; q# v8 @; _}
6 F- ^2 q' _1 f7 Estatic void __exit MCBSP_exit(void)
( V# U, E9 n& l/ T5 q{ {% ]6 c3 ^, j' d
printk("mcbsp chrdev exit!\n");
5 E3 T" f7 }: l cdev_del(mcbsp_cdev);5 k$ N2 N% O8 h3 I* A4 D
unregister_chrdev_region(mcbsp_dev,count);
( q5 }/ d4 e% j5 j( l/ ?& S device_destroy(mcbsp_class,mcbsp_dev);
1 }7 X2 w* c# S$ X% g2 _6 { class_destroy(mcbsp_class);$ I/ `7 p' n3 Z: C$ T; R# L
}$ v6 B$ v! Q- z
module_init(MCBSP_init);
! T: X$ ~3 C2 x- ^- Jmodule_exit(MCBSP_exit);( _+ w# P2 l% U7 J
) n. r, z: y9 l# P: C
MODULE_LICENSE("GPL");
- i+ B4 W# Q3 [: u) S" A) J7 h" @, n4 t" t8 y* d, M& `
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* k; t/ b9 x8 H( A/ b' \6 Y4 P我的应用层的测试程序如下
4 p% j; A9 H. N( M! h0 t" z8 N#include <stdio.h>
! X4 u4 a- |! m1 V3 {$ h#include <string.h>& {" y2 d+ ^ I# @8 I+ d
#include <fcntl.h>
( O2 Z8 m i- A2 C" r2 T#include <unistd.h>
( S- U; f; p/ Z, M: K( ]- G+ k, ?#include <signal.h>. K5 W: Q0 w( ~; \7 W% V: e, P5 o
#include <pthread.h> //线程
6 O4 X3 V5 {3 u& v#include <stdlib.h>
! Y; y7 s3 B1 y#include <pcap.h> //捕获网口数据9 t' X' x3 b) I( d7 K8 b
#include <semaphore.h> //信号
) y) `& w _' j" M8 K% I. j6 D: a#include <sys/types.h> //消息对列
; m1 {! E9 `3 G9 p7 z#include <sys/ipc.h> //消息队列9 Y6 v+ H; s. P" Q6 K
#include <sys/msg.h> //消息队列4 H7 U4 h. x; ~7 u5 q y
#include <sys/select.h>. N9 O1 c5 j7 u, i
#include <sys/syscall.h>/ ]; c3 v9 e, b+ v: x$ q) |
#include <sys/stat.h>
, l4 h- z. t0 H' d( ^4 V8 I6 K#include <sys/mman.h>
( N/ g2 C4 ~/ i$ C2 V6 Z#define msleep(x) usleep(1000*x)
' G2 l2 g) j, O: S$ U$ T% R+ k9 ]) L2 E O! d
int main(). A$ y, w8 ~2 w; k! c9 H+ V/ P
{
) K B# ^$ t2 `3 b7 N //MCBSP,ARM与AMBE2000交互设备. A7 D0 x4 A+ O3 k5 _
int fd;
1 }2 U: T( e- Z5 q$ _ unsigned short data_write = 0x5555;
9 K1 O4 |8 n' Z$ F unsigned short data_read = 0x00;
. O+ v; r& s& b( F8 c+ T6 V fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: G3 U: Y v7 l% f- _0 { // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 t( S- |- v9 L& B% k( g: Z- u " r6 R" h' |$ F# \* I+ Y6 {, K
if(fd < 0)5 j) E5 z! w5 |4 \. @
{
# x5 e% @# ^+ S1 B2 t4 n* a perror("open failed\n");
' Y+ `* |; \+ w0 @2 b return -1;5 M9 Y6 o* q3 O. G
}7 \3 G1 y' ^2 ^$ ?' c; p
. k% C+ r3 {$ w' G9 a ^! R0 X while(1)
5 L. E* [2 A2 S1 B# x, _ {
' T% q& G5 a3 g J1 \ ' W3 Q9 F: @ t4 P
//AMBE2000每次读写是24个字为一帧- w' q; K. }$ P0 y
//写数据时将数据在底层存储起来,等到中断的时候再发送
! ^% d! |4 }7 o7 ] {4 ^5 k) S* ` O //AMBE2000输入数据是以0x13EC开头的7 } Z |* p- s7 j5 o1 l
write(fd,&data_write,sizeof(unsigned short));
! O/ z% A# d+ e3 s! L" @, j
/ K4 H. z, j& ~. g( T //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 C7 X, T$ i. b( c
read(fd,&data_read,sizeof(unsigned short));
6 a* @# b5 I/ f1 f- W, l/ N+ b! @ 0 E2 X& k/ s- k t+ N j
if(data_read == 0x13Ec)( m2 Y9 r4 w8 ~& W
{3 D# O) `/ m1 W! }& | o% W
! v' F( Q- k1 c1 y
printf("data_read = %x\n",data_read);/ Y6 Q3 C( A6 T- I
}5 h$ W2 R; ]5 N/ j- E/ j
$ `/ x* ~$ s3 N+ l( ^ msleep(10);# ?' J, P" b9 h- Q/ U
: F% P$ z7 z! |8 e- u& T6 O, V4 m: ?0 Y /*
: _0 S) e# N3 P: E* m/ ]- E5 B* O( J ioctl(fd,1); " q- e: L+ A$ r
sleep(1);
6 z" |8 W) o& Q% ?3 S0 D! s9 J8 p ioctl(fd,0);
2 `" _ W0 e: X: L$ r sleep(1);. G) g6 P# b( ?: V8 |. v+ k
*/ ' \7 S' o6 E* }/ \1 Y% C* C
} x; Q/ D+ e4 c2 n, [. M/ j
return 0;
3 L) G. L' N/ Q1 B$ X* r7 C, Q4 d
' k' ?* t/ p( B}8 Q! X: `9 n& H! p2 [9 F1 l* f v
$ i0 i. P1 l6 Y( z0 G D8 W多谢各位指教,谢谢! 急
3 V( u! V# X! _3 t9 D
7 C( K4 K4 R5 b! _5 ^$ H& x
) N1 t! |" `0 |7 l( E* ]6 H1 \8 P) c7 Z* L# S
3 R; I, Q( a8 n& P7 R i$ e2 `( c5 ?: t! j' T! Z1 ~
|
|