|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ f: t7 X2 Z) V' Z% w& Q8 _/ h& z2 s/*& q1 z1 ?) v1 a" e5 x+ d
* Copyright (C) 2009 Texas Instruments Inc. d: `: h& v# k3 i( `
*, g" j2 \( r" U
* This program is free software; you can redistribute it and/or modify
' T) M: w9 @/ d* F1 Q7 y * it under the terms of the GNU General Public License as published by
! B% [: X3 ^- P8 H' T( Z8 c * the Free Software Foundation; either version 2 of the License, or0 ^1 U; K9 m# y& ^4 ]
* (at your option)any later version.0 y, |' s' G3 v1 o8 a
*
- o% B9 i! n7 Y8 I( B * This program is distributed in the hope that it will be useful,: @" S( n+ w8 l- s6 f
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ K$ e0 t0 q: i) @3 m
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# E5 W% _' P( V/ U* t * GNU General Public License for more details.+ F' w' b* K& T9 W. r
*1 A8 H6 X6 J" r' h
* You should have received a copy of the GNU General Public License
, V7 P: j7 ~& R$ M/ b Y * along with this program; if not, write to the Free Software) l2 q: s' \6 G, u1 d5 o
* Foundati/ u3 z3 ?( B; v% i& E
*/% k3 y; p+ k" X) e) B9 r; k+ g) r
#include <linux/module.h>/ t0 u- L7 B3 ~
#include <linux/init.h>5 j: r! g! p1 {3 t& _ c& ^" }
#include <linux/errno.h>
7 _5 U d# T' d% c6 ^#include <linux/types.h>0 \" ?/ r. m2 g2 m
#include <linux/interrupt.h>
' ?1 E' M( D0 P8 W#include <linux/io.h>
+ \" j( O e+ v#include <linux/sysctl.h>
0 I2 I) V u8 q#include <linux/mm.h>" i6 V7 D, U6 e) \5 V) _
#include <linux/delay.h>
# F' ^& f9 }/ ~" I7 G# h) n- g- e#include<linux/kernel.h>
- v; n3 G( F( A#include<linux/fs.h>; x) _& Y9 G! X7 r- p8 E
#include<linux/ioctl.h>
) n: e% f: P# w. l1 z! q, P- Z#include<linux/cdev.h>5 |- C' g# W! `, G
#include<linux/kdev_t.h>
! J: T- l% w5 ~4 i#include<linux/gpio.h>+ a4 i, G6 C5 i2 ?& m! A6 r S
#include <mach/hardware.h>4 Y1 N* b/ {/ t
#include <mach/irqs.h>7 o+ J0 F8 ~+ k$ v
1 J9 k, K" H$ j3 G#include <asm/mach-types.h>
. S$ J S8 G) T$ Y y1 c#include <asm/mach/arch.h>7 R$ h, T0 U- Y. b5 P x" m8 I6 j
#include <mach/da8xx.h>
1 e* m- k7 M. V#define SYSCFG_BASE 0x01c14000
: |; a5 s& ]* L4 i0 B+ T9 y#define PINMUX1_OFFSET 0x124
$ f# x2 A* D& l#define PINMUX18_OFFSET 0x168
# Y6 g7 l3 b. ?9 X! k8 X#define PINMUX19_OFFSET 0x16c
& ?7 U& Q; j. Q4 b% a9 [#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR* e0 T/ ?/ M' O( S! P4 c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR7 f" f& [- u7 F5 y$ O5 @
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR2 z+ s: h; [3 R9 Z0 r- k
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR! ?$ B4 W7 l. p r% T# j* V: d: H9 B9 e
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 i% h5 p% B/ V/ I
: ~& M, x1 u9 @* S2 n) Z
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
/ ?5 ?1 [/ U) j' o: C \2 x4 r#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 ]& z3 u4 x% R1 U* k" Q//PSC7 O; f, }$ Y: q! E! i. g3 t, f% ?
#define PTCMD_ADDR 0x01E27120 " L% F/ m" b8 `& z
#define MDCTL15_ADDR 0x01E27A3C% T# L* l; Z/ W' T5 I! j
#define PDCTL1_ADDR 0x01E273046 t6 I" c2 C0 e" ~8 z
//GPIO8 direction- ?( N! Z7 D$ S% [
#define GPIO8_DIRECT 0x01E260B0) W J' s1 V Z4 G) Q' G/ w: x
#define GPIO8_OUT 0x01E260B47 G0 W6 D h5 C( h$ Y* `
#define GPIO8_IN 0x01E260C0& ]! U* y' o% n
0 E2 C+ [# u* v F$ b1 r//#define MCBSP1_RINT 99 ( p T& ~4 U8 M# V5 z* ]" Q& c: g
//#define MCBSP1_XINT 100
9 a) M& i t O$ L! [& zstatic int MCBSP_MAJOR=239;5 N d# ?4 G( j& } \2 m
static int MCBSP_MINOR=0;5 @$ U- ~4 \" L# i) e: ^- ~ `1 c
static int count =1;
* }0 W( }& G2 V/ [7 i
4 S* k8 l' f5 S: R( v- h8 F8 \#define MCBSP_NAME "MCBSP-device"
. P" E! U: m9 P$ N! Y1 @' S+ H; Y, {& h8 ~7 f* `5 a( E$ ~( e
static struct cdev *mcbsp_cdev;
% l7 k0 g: R0 s% S# _0 ?2 f/ ?$ ustatic struct class *mcbsp_class;, e" x% w3 @5 L; a2 c) m
static dev_t mcbsp_dev;
* n3 m3 F/ \0 P% t3 O- bunsigned int DRR_data;
5 N4 ~) B+ j1 w5 l( F, _7 d# D4 [unsigned int DXR_data;7 ~+ s% g1 w' ?4 r2 h" P
static int mcbsp_open(struct inode *inode,struct file *file)% w& h% H$ ?: i! `1 J7 i- W9 u* F
{$ w- Z: V' R. o; R
8 s" j8 H- m% z. w# r& j //interrupt enable,initialized( X$ s: W6 F" g; K8 ~6 I2 E
unsigned int temp;
% [0 H1 d; l5 x1 V: X2 q //SLEEP_EN(GPIO8[10])---0
! D/ r Y. H" j6 T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& S6 D3 O( D" ?4 }! C/ E/ ^ temp=temp&(~0x00000400);
: p( b1 R/ L3 x- M; T5 _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% n1 t0 x6 t8 [0 |
//RESETn(GPIO8[8])----0----1* r5 t' E ~$ }9 ]/ L
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 ]2 Z$ e( {$ U6 W2 r4 ]; w1 L) [ temp=temp&(~0x00000100);
0 t# A9 o; k% s; l# `' z) K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, j8 s+ @; l1 A) y+ a% h! `. N
udelay(100);
% M, S6 P+ j- u2 h* h# j temp=temp| 0x00000100;" S( O- n/ u, r& G1 r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 Y6 a/ l9 r8 e- H2 B
udelay(100);
6 V$ z# E5 F& Q7 m7 e printk("open success!\n");4 ? i( W& Q/ s; x$ I3 U) G+ S
return 0;& r/ Z$ }7 j* u, d
}) \6 k( @3 Q; d% C5 q
5 m3 Q _' z8 |$ }5 ~ ]8 B
static int mcbsp_release(struct inode *inode,struct file *file)8 l; V3 o1 s u' U3 q8 X% d, R ]
{9 y0 m/ U" j0 Y
printk("release success!\n");
4 N3 c2 o- a* y# U, A) k return 0;
2 n1 q0 O- M' L6 S+ s}/ j% T; C8 Q6 F/ U8 `
g) S. D) f1 Estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). P# c: o5 R K
{
^ v- O: c1 G6 m# { copy_from_user(&DXR_data,buf,len);+ x7 w/ q0 l# o4 P% v0 f% Y
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
1 y. I' X2 Q0 C/ j- k0 Z0 N return 0;
" r$ b; c+ H2 k+ d% t" c9 e7 A
( @" O% `$ n, ^}, ?% M. H( u4 L6 `" l1 R5 _
' ~# x! U% S- Dstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: i7 v8 R* |' F; v9 u9 }! ?7 A{ 4 H9 V' X$ Z9 S5 P
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 I! ?+ j A6 d& i& k0 Y5 U
copy_to_user(buf,&DRR_data,len); - N( x, Q/ Z) B' O/ _: w0 A
return 0;8 f$ B2 m. H" Q3 L
}2 G3 a& u& |; }) F% _
7 M5 L2 ]1 Y$ h5 p- R8 |: T% |& o/ u8 c6 `
static struct file_operations mcbsp_fops=
! [7 Y# |# s: }- l' V0 S{
" {; O2 y& d! E) O0 n" S .owner=THIS_MODULE,
3 q+ O' J" K7 F+ s9 n4 n .open=mcbsp_open,& n- N, G {' Z/ ~% k
.release=mcbsp_release,
. a. D4 H; ]. O2 D1 | .write=mcbsp_write,) L+ ]# }; H! p* G& m) _
.read=mcbsp_read,
3 S, f3 r! k' I' T* _ ^# U T8 v};+ U ^+ S( q: `$ n* g- D: h' y& K
static int __init MCBSP_init(void)
8 e, @! ]6 o( P/ H{
/ D( B& t5 r$ X7 B! p int ret;" E8 `1 C: h, A/ B3 X9 u
unsigned int PINMUX1_REG_old;
1 H7 \7 D4 C5 g9 O: t/ d unsigned int PINMUX18_REG_old;
! p% }/ ]8 s; g( ? unsigned int PINMUX19_REG_old;8 m& o# ^$ d. x l5 v
unsigned int temp;
& j" U! F W! J if(MCBSP_MAJOR): _) B8 \7 B3 L& j0 |
{! a: a: Y' n# u& {$ g/ b. E
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. `$ u" G W5 h/ H ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' f& ~, s1 Z! p2 z
}
& r- r: w: C! J! C6 k5 ?0 N0 x else
0 |1 x/ e! z1 t! Q {4 l4 q6 t: ?" }# Q
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# W, a4 q0 `, a, N! E6 E/ w MCBSP_MAJOR=MAJOR(mcbsp_dev); o H+ l; {2 H* V0 a! A1 \
}
+ V+ ]% f: m! A
% T! m- a7 {! m1 f: [ if(ret<0)" e% J3 o. _7 E4 L9 A: v. [
{
4 F X6 @. L6 n; T- ?- J% v; | printk(KERN_ERR "register chrdev fail!");
$ q4 D# y) |/ U return -1;
! {5 N+ N' Z. n; J; {3 {+ s }
/ L" N, C7 w. `# L; C 6 k) N: B5 G/ N
mcbsp_cdev=cdev_alloc();
8 S9 V' t7 s; o. i7 ^; ] + u9 s4 R* G: T/ M. @, h4 }( K6 V
if(mcbsp_cdev!=NULL)! T6 \( z( ^8 @" l/ S1 q
{9 a5 e8 T9 g; N0 }8 C
cdev_init(mcbsp_cdev,&mcbsp_fops);
0 L0 U& }% y0 ?: ?8 w2 V mcbsp_cdev->ops=&mcbsp_fops;
9 Q. k+ J- c( O6 a mcbsp_cdev->owner=THIS_MODULE;
- G; y" B& r% i + e+ d7 l7 Y* H8 T' K
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( t6 w1 w2 L4 d% u
printk(KERN_ERR "register cdev fail!");3 o' w2 {8 [7 g! O& r6 ]
else
3 o1 Z* o& g# _: a/ u printk(KERN_ERR "register success!\n");+ y4 e; y8 [! {
}) c2 i0 J7 J7 [) g7 @# x
else
9 j3 E6 D( v2 |3 z, F7 r/ ` {* u' q$ p$ b7 s
printk(KERN_ERR "register cdev err!");
0 i: ~% M1 p& b2 C7 V# f& \ return -1;* Y3 d8 W4 T0 |; e* T) l8 w+ @6 g: q
}; X6 J# W. ^6 P0 Z
" y4 \2 W1 b# q+ v, t* k mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 X8 B# F. o. I if(IS_ERR(mcbsp_class)). p7 e& Y. q4 a6 `
{% ` W2 j. D+ w( i) C2 W; k2 b
printk(KERN_ERR "register class err!");
" n! V. `" w$ u$ \. M* F. F return -1;1 @! H1 B5 z. J$ J6 i( N( i
}
" K% _6 ~0 \* \ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 S, w. k+ {0 k9 @
9 \' a, B' ]0 O% J. H //PSC1 J2 I3 v- o Q5 _( q: H
//add Enable MCBSP) D: ]4 ~# L$ I4 N! T% u
//test
* [$ H3 `1 x: I6 |( E temp = 0x80000003;. F% w+ ~) Q4 t3 a: ?5 D) i5 l
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
/ I* m5 r$ [3 h+ l( e. z" A temp = 0x00000003;
5 ]" }, }% X9 x2 D& g/ K writel(temp, IO_ADDRESS(PTCMD_ADDR));0 b, V3 {1 z" h& \. q" @
0 g) T8 n* s' G- e6 R! g* o2 D temp = 0x001FF201;; |6 ?- ?5 T; W5 d/ o" T
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
2 U9 q5 o( |' J0 ]$ n- L 0 }, ~% B8 d+ P
//PINMUX 4 `9 r/ I( D5 c5 U7 I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( D9 |0 @, c! P PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) X1 _2 c) k1 X6 p5 G
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; * F+ c# _3 C1 q$ z" h
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);; @# r: T; k2 g$ v6 k
! ?, @! c4 s" e. l9 [* ^' O7 o1 s
//SLEEP_EN,EPR,L138_SHK1,L138_RC
" {) Y5 P4 |+ J$ R( P PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 E! {3 c% R3 B& y& o+ A1 c PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; " Q' Q* F s. t
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% o8 a& R0 V5 c2 p* v0 r
% u( g0 R( x y
//RESETn,L138_SHK2( F1 N5 H, S7 H* d3 p( f
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; z+ A/ f; z% }9 D PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ' M2 _" B u7 q& r* M7 E
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ R8 c& Y, M! I+ h# Q7 ]( f0 d
% v3 f' ~) e+ G; w2 [
, T2 q6 u4 D. e& J' c$ S
//SPCR Register! R# l( }; ]) a
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
@: c' U* |1 I- [2 S temp = 0x03000000;//(DLB=0)5 {6 X0 w0 @ J% b! q# h
// temp = 0x03008000;//(DLB=1)
5 P# i- W& P1 C# `' P* c3 Q& m writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
# u" S7 A2 v" K/ Z* C8 Q temp = readl(IO_ADDRESS(SPCR_ADDR));$ A! P+ ?5 M4 o9 z1 B& @% s
printk("temp=%x\n",temp);2 H) t( m6 K$ a7 n6 Q$ N2 Y
5 I2 Y0 O- E* s; y7 ^ //PCR Register
3 F' ~6 o3 H6 V% C% X4 G+ _ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& B, X. a# m' R) Q7 g // temp = 0x00000F0F;9 x3 m6 T* ?6 _1 T- d& f
temp = 0x00000B0F;
3 |) j8 F4 X# Q3 j9 n) @ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! [! O/ n7 k o8 D$ h temp = readl(IO_ADDRESS(PCR_ADDR));
$ w7 \7 h' j) p$ @& D9 m' a: \4 Q j printk("temp=%x\n",temp); 7 C% O* W O9 d
//SRGR Register$ A P- s4 a% b0 C0 o; ~* q
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11. G2 [4 R8 x: k+ c G4 x
//temp = 0x301F000B;$ \7 g) H. P9 ~! G
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
3 \; y C7 {; M temp = readl(IO_ADDRESS(SRGR_ADDR));
& U4 l% o' ?7 D; s& v! x printk("temp=%x\n",temp);# N; \1 y& M/ x4 g* F8 g
//RCR
1 ]" X6 O( Q& P0 o+ { //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: Q/ w! C' D. u( j$ c4 T
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
0 |0 H# Y6 t, k; v- | temp = 0x00440040;: j- _8 n5 Y8 ]/ ~% M
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized " L" ^0 i2 C/ ^1 z7 M; `- ~* v
temp = readl(IO_ADDRESS(RCR_ADDR));- y% x& i* M* \+ V, _* ]
printk("temp=%x\n",temp);
* W7 X* ~6 [& M* I/ H4 H; t //XCR
5 b3 i6 y& w$ i5 |2 D( u* m C //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 K. C$ q! q# ?# x% E$ O
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* |1 F/ {! ~7 i* V$ V8 ~, @
temp = 0x00440040;# E' Y1 A! ^! I: s2 r1 |' N
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 7 {0 g- I8 l( `
temp = readl(IO_ADDRESS(XCR_ADDR));
3 k9 e$ g% A8 g4 p printk("temp=%x\n",temp);0 n5 ?+ S4 q8 s% A+ a* z
udelay(100);5 S+ L o& E/ u5 Y" R }* b0 c q% h
//SPCR Register
+ B/ h* k6 \, X, M //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 h1 d: A* L9 |) s temp = 0x03C10001; //DLB = 0 VS DLB = 1# K7 f4 e& _7 L- R! L
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled* u0 e/ ?; x( T; P% j' L& E5 ~; o
temp = readl(IO_ADDRESS(SPCR_ADDR));' g* j) U1 W' q ?/ g
printk("temp=%x\n",temp);
& V/ \) U1 C5 k+ v udelay(100);6 ] ~* L6 r- L6 R. `/ g9 K
" E1 I$ G$ z0 r5 H- C, u6 R
//set GPIO direction
6 V1 }" C' i& m4 ~3 Y0 K: ~/ B6 a temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( u9 J% S5 i O U
temp = temp | 0x00000100;//EPR----input
" L- i# i+ _( k- r, @) b& b temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output' ~! D0 z% Y/ a. v9 ?
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- ?) |5 G, T6 M5 @; B % @/ f0 w& F) p' p6 M# U# U# I1 h! y
return 0;6 q# o$ Y( [' | \
}' f: B+ G# S! s- Q
static void __exit MCBSP_exit(void)
" U: g- s4 }" U! F6 U{+ t/ F6 C, v" j! j
printk("mcbsp chrdev exit!\n");
: [* w- D6 v1 a4 a) L cdev_del(mcbsp_cdev);
7 z$ c" S4 v( ^2 G) B. N" U. K1 X unregister_chrdev_region(mcbsp_dev,count);' J8 A6 r8 |, o7 q9 ~) C; b
device_destroy(mcbsp_class,mcbsp_dev);7 n" k4 u9 `! L5 S( b, y5 g- S1 e0 F
class_destroy(mcbsp_class);1 u8 i( G# A: @/ t! O
}
! G y& Z' O( y: K& D7 u( f1 |module_init(MCBSP_init);
3 m3 [4 b% d. D7 u- Wmodule_exit(MCBSP_exit);8 g, Z$ n I) y) w
5 C% m4 k7 ^, \/ U) ?' mMODULE_LICENSE("GPL");
/ w# w0 a, M2 `5 s3 Q2 G! U( E& L7 c; c, J7 j' X. |
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 a$ ?% l* B4 U9 R, A+ d我的应用层的测试程序如下
0 r; i. C- i; b/ S, t& r" C3 _7 @#include <stdio.h>
) Q& l* o1 K0 E3 B6 g. X% Y#include <string.h>) `0 g" M* a6 o* e1 C% ^ t
#include <fcntl.h>3 k0 _$ Z2 I3 a4 f0 X! O
#include <unistd.h>; }5 X7 L! F2 M9 h6 D1 o
#include <signal.h>
- ^0 o2 R4 s, G" b. @#include <pthread.h> //线程
( p' V* ?" e+ J: w6 |+ f#include <stdlib.h>8 h+ _( f/ y8 X2 G6 Z0 Z
#include <pcap.h> //捕获网口数据/ A7 B# X3 G. o* o4 T n
#include <semaphore.h> //信号
m W0 a, e q#include <sys/types.h> //消息对列
, p* D# A& q7 U% J9 g: n#include <sys/ipc.h> //消息队列" _* g% p; J# z* g' `: ~1 Z+ Q" d
#include <sys/msg.h> //消息队列
0 g( E: t6 r& S4 L#include <sys/select.h>7 w( B* D& C( Y2 l- u4 X, W& H0 O
#include <sys/syscall.h>) O. f6 m: z I
#include <sys/stat.h>; Y: E/ A. u8 g' P! ?
#include <sys/mman.h>
6 U0 Z) B2 e3 Q! P/ u#define msleep(x) usleep(1000*x)# u- B4 w" g& b( O; t/ |
3 V7 {8 J, ?2 w/ x u jint main()
/ t3 |5 u; U% a ]: }{ 2 O9 Y2 O7 e8 C3 D1 S
//MCBSP,ARM与AMBE2000交互设备
6 ~) a7 R" @# h+ s U int fd;
. Q( w+ ~2 `- d1 L a unsigned short data_write = 0x5555;. S- L* ^) v+ o" ^' |
unsigned short data_read = 0x00;
5 n/ r6 q# Y. S' k7 d fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, O1 x6 p9 M2 u( X& @% k7 b // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# c& N! w$ Q9 W2 f g2 V8 r
. L5 ~8 E# {: f5 { if(fd < 0), Z, ]8 g6 b- b0 b7 {; X1 J. O2 d
{
, h- Z) I# O1 p( ` perror("open failed\n");% W& x0 T- u, E+ j, r
return -1;. }) H* l# _' d
}
8 _4 d% s8 d# d! I) }$ {0 O& j( v& P' }% V
; Q4 s; a! j2 J8 u' q3 w while(1)9 M# `) Z4 F2 a2 a3 Q6 m
{6 [; ]- q+ N9 K w$ N+ I
. e9 s/ F) P* b& F& m5 l1 G //AMBE2000每次读写是24个字为一帧. W: t2 E2 H6 F$ u3 j. Q
//写数据时将数据在底层存储起来,等到中断的时候再发送; M1 J$ E7 v1 ~( R6 R
//AMBE2000输入数据是以0x13EC开头的
: z1 j- `3 V* e; J1 M write(fd,&data_write,sizeof(unsigned short));" c9 v/ Z: y: L" h7 ~
) t$ q, E5 J3 X t
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 I$ w) E0 o9 {7 G ~+ V# `- [
read(fd,&data_read,sizeof(unsigned short));$ n4 C$ m- I8 o9 c
3 e1 N1 B) F* q1 m, O. @
if(data_read == 0x13Ec)
5 L# f3 ?) B3 k' L# x {
* p# i8 h( X' g/ ]6 g3 D ^ ' ]& S7 u2 W3 V! Y3 \
printf("data_read = %x\n",data_read);
( I) J& e9 ` H }
& t9 f( ^5 }0 j1 y
* g4 A7 m. t: O# A+ n( E msleep(10);1 ?* ]. ?' E; W* z3 F& I5 v- \
: x6 h$ _& E/ p# J- J /*# `$ h4 Z! k+ R+ g# z. D
ioctl(fd,1);
2 M' U0 I! }( c/ p) C sleep(1);0 H% H+ Z0 m8 v$ j( Y
ioctl(fd,0);" r5 R3 R' \' H
sleep(1);) I' g1 L0 I4 G4 R7 j, w# ~
*/ r6 x* D0 ]4 u4 c, j. |- S
} % x$ v4 K, O9 K- D; ?; ?
return 0;/ k/ @5 Y+ |7 n2 l& G
( t- j- r( |8 K- t0 H, ?6 g}) s2 E) s6 t* b6 B: Q. z
2 k7 J/ L+ V& O$ T- Z7 A3 ~+ S多谢各位指教,谢谢! 急* b9 p% o# Q3 w5 f# W9 x3 @
1 M) g' h( Q9 \+ g! J$ v
8 Z1 t4 b; u$ \" Z5 T. b* ?5 N
) }% J7 X" X) Y" `
4 z" B* N+ ~6 ^+ ~& E5 b) J1 a+ ^
' x& \5 s' o2 ^ ]" y |
|