|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 8 q2 z7 y% g U4 X# w4 S
/*0 I# g, C" m B) T0 `
* Copyright (C) 2009 Texas Instruments Inc
) g7 P( N8 s7 ~" n e9 H' W( u! j, S7 m7 L *
& V7 h3 C8 y( t" N, z * This program is free software; you can redistribute it and/or modify
' x9 `' q s& Z& t+ ~+ v3 x6 b * it under the terms of the GNU General Public License as published by
! g# v" E. a& S0 h7 e! E8 k * the Free Software Foundation; either version 2 of the License, or: e$ @3 |7 Y7 [ Z+ V
* (at your option)any later version.1 t% R& I$ e O' Z9 j
*. b5 \% c# |2 p5 T
* This program is distributed in the hope that it will be useful,
. u3 |* X7 `& u6 P8 i) X* ^& r * but WITHOUT ANY WARRANTY; without even the implied warranty of# y' G/ D1 y4 `4 L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% L ?+ z- t. b) G& _* c * GNU General Public License for more details.2 v* x% M4 N3 B6 L* n
*
* R# {5 Z& W2 f- _& C, }2 O- K& I4 n * You should have received a copy of the GNU General Public License3 }6 e1 C g. r- K. D! x% _
* along with this program; if not, write to the Free Software
3 [8 j& R: Z$ q' y$ l * Foundati
$ f" Z% Z; H0 @+ [( I4 r*/6 y' c2 N, y9 e" V1 ^3 O
#include <linux/module.h>
. S+ V9 w, ~1 g( C, g- U1 \#include <linux/init.h>8 Q( U, p2 d0 x$ i# P/ A
#include <linux/errno.h>. y( k [, g* O
#include <linux/types.h>: c- @7 E" R/ X' K; j% H4 a
#include <linux/interrupt.h>0 w3 {; |& X' f& b7 B
#include <linux/io.h>
( ^- g2 q5 C9 @( j2 ~#include <linux/sysctl.h>! @- Y0 R0 M+ q B# v8 y
#include <linux/mm.h>: U7 ], k0 z, W0 ]/ [
#include <linux/delay.h>+ x% j( y! A2 e% h: x
#include<linux/kernel.h>( e6 p1 h( q; [2 l+ z- B
#include<linux/fs.h>
! ?# C8 T/ ?2 d8 h. G#include<linux/ioctl.h>0 T6 N, E( @8 [. n5 f1 \# S
#include<linux/cdev.h>5 @0 `4 w: U2 O5 O! D
#include<linux/kdev_t.h>
' _3 K7 U8 d, O B; N. J. c) T#include<linux/gpio.h>
, D1 Q* W6 D" w% S9 f1 {% {) |#include <mach/hardware.h>
3 K- {. F8 D4 r* \$ c& }5 p#include <mach/irqs.h>
* F# s, V9 U; n* X
: W) b; s- H. f+ M" d3 u. g#include <asm/mach-types.h>) k0 u. Q( z, u( n
#include <asm/mach/arch.h>
9 D1 c# U( ?9 u, Y- t#include <mach/da8xx.h>* R2 A: u# a6 l5 J4 S% I# Q$ N
#define SYSCFG_BASE 0x01c14000# e$ n; }) \) ?5 v6 H! D
#define PINMUX1_OFFSET 0x124 * c% M2 |+ Q( @
#define PINMUX18_OFFSET 0x168
3 H( S5 \3 P. ^4 ^: ^' ~+ c# Y#define PINMUX19_OFFSET 0x16c4 X! a6 D4 Q4 R+ l( l5 Y4 f" M
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 }+ a0 F: ^0 s" H- {$ [
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ c$ _3 H1 I- F, k9 Q& V9 z# |6 V
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR) s1 w/ }3 }7 Y8 j" @
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR9 Y" {2 ^$ r9 t8 M( I* R2 P. q
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' _3 h/ S4 g8 D, Z5 E ! Y1 _7 s/ e r
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
, p" W, L( S' g6 ^& V1 o/ ]#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" _8 }7 }$ h4 `5 V/ Y& o
//PSC
3 N1 H# I; O/ l9 [6 L#define PTCMD_ADDR 0x01E27120 * d- M: Q8 D3 P# f+ b" S# T
#define MDCTL15_ADDR 0x01E27A3C. }+ |4 |1 }/ @3 A
#define PDCTL1_ADDR 0x01E27304
# ^5 s# a7 A" i7 ^//GPIO8 direction* ^, S" ?) K6 N1 B
#define GPIO8_DIRECT 0x01E260B0
m2 z- M. f: l( H- l4 h1 [# c#define GPIO8_OUT 0x01E260B4
- Q0 q( J# m& ]. z- j9 h#define GPIO8_IN 0x01E260C0
; b, G9 p! r; W: m$ U8 Z6 m, ?# Y' V a+ s5 z
//#define MCBSP1_RINT 99 , o7 z& @3 l0 v3 z- |
//#define MCBSP1_XINT 100 " p& w! v$ z! ?* f: }5 i
static int MCBSP_MAJOR=239;
' C2 z4 j. b/ X+ [static int MCBSP_MINOR=0;
' j2 o5 e5 d% jstatic int count =1;
3 L( ^1 U4 [0 t& r0 L! n6 @/ E* ~/ L* l: R6 ]# d$ o# P
#define MCBSP_NAME "MCBSP-device"
9 u5 P( U. q4 r: W5 [/ a$ z& H: n3 x/ u' X# E1 ~
static struct cdev *mcbsp_cdev;, E( ?* V1 |* X- M; E1 `
static struct class *mcbsp_class;
( c5 ~% i/ ^! c7 H, w' b; bstatic dev_t mcbsp_dev;
; b9 V4 K9 A5 g5 n& L y# ~unsigned int DRR_data;
; R' ?' [. @; y4 m9 h& runsigned int DXR_data;
! Z: p3 x( H; ^# P1 \9 a8 T ]static int mcbsp_open(struct inode *inode,struct file *file)
. F8 w5 R7 V* M0 f9 o6 k% ]$ y- u{
/ B4 h( s0 M* D& b' O; J ) P5 k) }3 f! @: x# Q" W' y
//interrupt enable,initialized; U5 S. _7 M9 u; c
unsigned int temp;' q& d! [8 C9 i5 T
//SLEEP_EN(GPIO8[10])---0- \9 e7 `+ P9 a0 u
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' a9 C( I" Q" A# c$ v temp=temp&(~0x00000400);, P. E: z' H3 A- P( T
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: Q o9 X+ L3 b, \; [ //RESETn(GPIO8[8])----0----18 u/ L' R& A/ \( _# w" b& @$ s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' _3 N1 T5 b6 l$ A; `! _4 F temp=temp&(~0x00000100);
+ X# D/ H* `. j) N; c- \$ l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ c# D8 @) F- |8 [: ?: u
udelay(100);
% e& \1 x& f5 A, S# M temp=temp| 0x00000100;6 C$ s, r L) }/ Y7 r" ^; r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 D6 p! p7 d. Z udelay(100);6 ?' T$ G7 {# K+ x/ b- r' R4 e
printk("open success!\n");& H/ G7 Q' j4 o# y7 b
return 0;1 Y0 D% {; [& h' x
}5 ~5 ?3 M* }) r% x" j3 y. S% v
( _4 k3 k6 U* w/ u3 N7 v: ]! ?
static int mcbsp_release(struct inode *inode,struct file *file)" l0 g0 T% G2 `5 [
{2 t, @; e1 {: O2 s
printk("release success!\n");
$ r! b3 k8 [2 @ return 0;
6 T) c9 M- c; u5 X}
2 H' r/ t0 ^( c( v+ q t6 M8 d& @3 ?# {- E8 _
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 I# b5 F# [, `% h1 W& u: {
{# ^+ G; `: \5 A" }# F& X% s
copy_from_user(&DXR_data,buf,len);5 q. Z" T+ O* r. J9 ~
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); $ J4 |* C: t8 ~
return 0;, P/ ~( Z# a$ B, B6 v& c3 Y
& B( [7 z1 F& @6 B* V
}
l8 z+ H0 v7 w7 d
. x* U7 B7 ^5 y. w! rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 A; p" U9 \/ |9 D8 `. J; i
{ 9 E6 V9 }/ d# ?# \5 q
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( _- t9 Q. J6 T U W* \( k
copy_to_user(buf,&DRR_data,len); + f1 w" v! u2 \0 L8 D/ n# Q% n
return 0;6 y8 p0 x' ~: y. y" P- ?; J, Q
}
: }& x0 f- p3 W! o3 e, _1 m, q" {2 B6 U
+ G( b# R, P* p4 g& Zstatic struct file_operations mcbsp_fops=
( t9 \$ {# A/ _& L( ^{
. b" n" Y3 j7 R .owner=THIS_MODULE,
$ C* \. D2 K$ R5 w a .open=mcbsp_open,, `" @4 j, X1 q+ r
.release=mcbsp_release,
- n* C) u5 w/ b7 ]+ N9 J# g! h .write=mcbsp_write,! Q0 z7 r. Z I2 f, R. i9 ?
.read=mcbsp_read, B* r: G: u! ?8 v4 y2 i
};
' I0 i1 m) l$ @ ^6 p' G, G5 G* Nstatic int __init MCBSP_init(void)( R2 ^8 F1 a# b
{. H/ T+ b% a( z2 Y" l- |8 n4 z/ [7 j5 x
int ret;
( o3 b2 I* G2 M3 G unsigned int PINMUX1_REG_old;" X! k: u. Q$ P/ @7 x+ f+ a7 Y
unsigned int PINMUX18_REG_old;
% r( @0 j( o) `# p7 n unsigned int PINMUX19_REG_old;4 s: y8 M7 u8 U/ y) t+ X
unsigned int temp;
8 ^6 Q% L/ ]) l if(MCBSP_MAJOR)- I' a4 J% P& a7 M3 ]
{
4 b. Y1 s6 N& t: B mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 u$ z: ?' Y U8 p: o' G0 v
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) K" M- b% |8 i* y8 x" L
}
! n) M5 m; |! a& k6 o0 ? else
8 M: [* `& L3 x {
. D8 R/ e3 D% a% j) F ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 F1 F, Y) ~) s7 w
MCBSP_MAJOR=MAJOR(mcbsp_dev);) b) `# W f, L; Y# i
}& n; k0 k; O/ t
, C* W- |' P7 c- g3 P0 [ if(ret<0)
, {2 H8 Z) M# z; |; y" T b {) r9 f- C1 ?- P5 d: R
printk(KERN_ERR "register chrdev fail!");) _* I( f# c( z
return -1;
3 f4 o) K; g3 n5 Y9 x D0 d }4 p# n: i" I3 R' }% O
% P1 ^9 S: f) }/ D; ` mcbsp_cdev=cdev_alloc();5 E; A) s) Z: c# F$ I
1 R6 N3 F& x7 P! P) I+ d, Q
if(mcbsp_cdev!=NULL)4 a$ E& ~# ^% a' b3 | Y
{
/ w' w5 h) d5 `* W% f( e' S( ?, l cdev_init(mcbsp_cdev,&mcbsp_fops);% W' x. u3 c0 S& @* j+ {8 c
mcbsp_cdev->ops=&mcbsp_fops;* [* z" H4 F( r& q4 F4 V
mcbsp_cdev->owner=THIS_MODULE;
( e7 ?/ d2 {& Y - ~0 x' F# t% E7 [% b
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 v* x& O' [" I; U8 ]5 x1 ` printk(KERN_ERR "register cdev fail!");( E6 n/ i( |- |
else4 c X; I: l2 a9 @. h5 g; W
printk(KERN_ERR "register success!\n");6 ]! z# g$ f) l* ]! x
}
; @0 u* I" u) ^) u) Y9 x2 A else
$ {3 [0 T( v l$ l3 X! H, ? {
8 H- _0 U- E D* b9 y0 p% V. O printk(KERN_ERR "register cdev err!");
3 c& B% d( @. a2 c" S return -1;
. p; S2 _5 B. l% r5 ^% u% [ }" y& J7 t" O4 @+ P
9 p4 @9 D) K" ~* @, Z0 \ b* s: {
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 n4 o5 W" g: a* ^9 N( }
if(IS_ERR(mcbsp_class))) u; H8 k7 o1 v0 a
{
+ x; b7 ]# D7 |5 F6 z4 _! t printk(KERN_ERR "register class err!");
$ ?1 n4 H# P1 j% j+ d1 U0 v return -1;8 u' X' g O/ A& F
}
/ e5 f/ `. V1 F' E. I# j. A5 K: C device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 s' a, I# ~1 m/ h- r/ E- P
% j; J+ v: I( H6 k \& P4 A //PSC" ~# P* s" d8 q$ Y' H
//add Enable MCBSP- v5 U p; a8 [( C6 C
//test9 ]" F8 O" r/ Y1 I( \& t4 M
temp = 0x80000003;
1 ^' ?6 `7 I* K writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# r( \9 S- V+ ?# V) ? temp = 0x00000003;
. w, Y, E3 X8 j' R: A: S writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ s7 a" [9 {4 e, w
! f" E! U' L# ~" \ temp = 0x001FF201;
! h! ~3 y! k: G( @, y1 w writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ U9 g: o& R/ j/ S/ ~/ ~+ g$ {
5 y8 u0 \5 I# e2 r. ~1 b9 b: f
//PINMUX
* J" {; B* H- e% o0 A- P //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- \" l& t7 }. r1 B' I
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); # r9 Y, K7 D$ C( W0 b: h
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 1 g/ d+ |# o" I) r! b7 |& @
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- T7 f9 R8 x1 {/ \+ d
* _. {4 {* e* o# u1 D
//SLEEP_EN,EPR,L138_SHK1,L138_RC
) n9 ?8 C; B* z2 ?! Y0 j! M+ f PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; ?. Q8 I. O0 I: U- y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# G6 M4 w+ R6 f% F writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ T& G6 \ @8 H% a
( u: E% P$ ?3 p7 \) y) H //RESETn,L138_SHK2 r3 f, K# y% r# Q% D7 \# B0 ~' p$ g( u5 J& v
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); , x, A1 a: a6 K; I' w8 m
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 X! D" O2 P$ C3 k7 W writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 w2 l, \4 z. ^& F2 S# M* d9 p
" K) y6 u3 i7 f
; V- X$ b8 B* i5 p2 M! g
//SPCR Register+ J; u, a% W. k' i* B K
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- |( A0 y a2 P/ d7 V# @, A
temp = 0x03000000;//(DLB=0)+ A' V* v( c0 v; e8 P) b+ k
// temp = 0x03008000;//(DLB=1)
. t+ @0 R+ i- ^ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset0 V+ ]+ T c" U- K
temp = readl(IO_ADDRESS(SPCR_ADDR));" H9 N+ O" _% D$ @( ^
printk("temp=%x\n",temp);& t5 ? h$ k- ~
; _4 k: a) R" ~$ Y //PCR Register
( F7 C) i) d' p' \7 M //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 k) U3 v) D/ l+ }
// temp = 0x00000F0F;! w& ~ |; t- \/ r
temp = 0x00000B0F;3 B' v4 L# d% \4 X4 H
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
# m6 ^2 H3 K. `' e! Q0 \ temp = readl(IO_ADDRESS(PCR_ADDR));0 E% b) P4 ^9 o% j; a0 V
printk("temp=%x\n",temp); 9 Q+ x. D2 E) [) \2 ~
//SRGR Register* b: p$ G; e l! j6 x9 G
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: [" H% g- n0 A //temp = 0x301F000B;
; c, p1 A: _! F$ R ? writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 8 Q `- o4 J; L+ J& h* }
temp = readl(IO_ADDRESS(SRGR_ADDR));2 P9 S% S% W5 [: {% L
printk("temp=%x\n",temp);
1 Q' f5 ^8 F2 r3 i7 B7 K* n: N //RCR6 s. `% W! m" ]+ z& x6 @
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 A" o% {: T- A7 i' v
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! X5 _2 T3 F# C7 L temp = 0x00440040;
3 ?/ y2 F( A: F) O5 { writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized , o) A( X8 K% _4 m5 ~! M
temp = readl(IO_ADDRESS(RCR_ADDR));+ G7 Y0 M3 c0 [- X
printk("temp=%x\n",temp);
k) \' [" W# D6 B( p. c$ s //XCR2 u# B+ `: F2 m Z2 C
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. \* t7 c H; K2 `+ d+ J# p! ] //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. W) x7 l9 L( q6 J temp = 0x00440040;
1 ]" }3 Y; ^/ k, S$ U9 j( } writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' R4 Y# d) X3 g" C
temp = readl(IO_ADDRESS(XCR_ADDR));; \* X4 W/ w$ F$ l' J, C
printk("temp=%x\n",temp);
8 y1 h3 M7 P/ s$ ? udelay(100);) l, t/ N. q1 R0 o4 ]
//SPCR Register b. X7 U& f$ R1 x0 x! a9 H
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' D1 S& M: `3 ~* `; B0 q
temp = 0x03C10001; //DLB = 0 VS DLB = 1
) P. \2 @" K4 W: f' Z! Q writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
0 L' }8 _! {/ M P9 \1 b# n. z temp = readl(IO_ADDRESS(SPCR_ADDR));
2 E% r4 x6 _+ K4 R& J, e printk("temp=%x\n",temp);
. W; e$ I1 n0 y udelay(100);- ^) Z# f& D( L: L- C6 \
: ? i" Q, i1 f; p" m
//set GPIO direction1 v& E% z o: H: ]0 U( V' R% Z( d
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ }$ v" j2 w9 J3 T! s5 B temp = temp | 0x00000100;//EPR----input
v, a' a3 E4 |7 G temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- J; E0 @- {- J6 K0 B __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; X1 h( I8 R9 p8 s8 x& ^
- L- Z) c& @; E r return 0;
* O% R" x: r6 G3 t# p' \}% l( B+ r- G$ y) {2 T$ I. Y
static void __exit MCBSP_exit(void)
1 J5 ~5 P% ?2 V{
! b. F& M/ j' U8 t: K printk("mcbsp chrdev exit!\n");
- H! U* V3 X- K0 O5 N cdev_del(mcbsp_cdev);# n% w; o4 t' i
unregister_chrdev_region(mcbsp_dev,count);0 m" t* J3 x! t+ [6 t4 M
device_destroy(mcbsp_class,mcbsp_dev);
# f0 g, z0 W& g+ m class_destroy(mcbsp_class);+ N4 Y$ U# m8 r" l* a& ?
}' D* y! |9 K- Y: l! a, `
module_init(MCBSP_init);
2 V' u& B) V( i) b, n' P2 a- \. hmodule_exit(MCBSP_exit);
% X) f. g3 {$ e1 I- K( x% ?3 B$ W9 g
MODULE_LICENSE("GPL");
! X1 ^7 Q# D, c' @5 V4 e- o. {( O; p: G/ M
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; X7 U# x8 F* i我的应用层的测试程序如下
+ E x6 B3 T5 S& X+ \: O$ Z#include <stdio.h>
2 c2 s! ?. P# U& R#include <string.h>% t2 C7 ?+ L( {7 |, s" w
#include <fcntl.h>1 k3 J/ z# }! l; `& G
#include <unistd.h>
; [+ k* a& J2 L+ J+ o#include <signal.h>' Y9 w0 Q3 e8 Z6 I* A' P' ^
#include <pthread.h> //线程' A" n' [ U& r0 t8 [
#include <stdlib.h>
. \6 a; x/ W" k1 u5 w2 w, G, ?. x#include <pcap.h> //捕获网口数据
* M/ F) t7 K. Q#include <semaphore.h> //信号8 M" b% i K- x- M7 t: Y+ s, W
#include <sys/types.h> //消息对列( s9 T# t/ U& x4 S
#include <sys/ipc.h> //消息队列
9 A/ i: k, H3 V/ `#include <sys/msg.h> //消息队列" ]/ Y, C: S* p+ |/ [ U3 p
#include <sys/select.h>
' f* [6 z, u' k+ e. j f9 {#include <sys/syscall.h>
* V/ @& P% r4 g#include <sys/stat.h>/ j; @ w( }& E' l7 t6 q
#include <sys/mman.h>. A4 a1 _+ | f' h
#define msleep(x) usleep(1000*x)" `, t: V$ ~2 r
( x5 r2 d: v* T: V; Y
int main()0 y- E, U2 g1 e- m5 p7 f k
{ + p( N; G9 O/ F& z2 M- ^4 |7 q
//MCBSP,ARM与AMBE2000交互设备1 C h& }' i+ I- Y+ z+ m l
int fd;
8 y* T7 S* H; H! w' ?' d unsigned short data_write = 0x5555;
0 p+ v5 B9 j8 u$ T8 s: N unsigned short data_read = 0x00;
$ r# p; _5 r2 S, J( M& |: B- b fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- q$ R- g: h" i8 e* j: F) C
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) H$ p3 s7 R9 N/ }* Y. X6 p% ` O+ }& C& @) ~ D6 b* g' @! s
if(fd < 0)
! J3 j: X, Z% d! V+ k7 w' v {
& X2 q7 ^8 U) O) m% x0 K% m7 ? perror("open failed\n");
* w: }+ R' g- H return -1;* K% o8 u: d O0 m
}" N# `3 J2 ~) M- }
2 O+ _0 [- q9 v" a4 }2 Z
while(1)
0 U* w+ Z& c$ T+ m {, v: {7 s( T+ ]# `6 e/ \& X
' o7 K+ @5 I! r& r$ p
//AMBE2000每次读写是24个字为一帧
+ z* w* O8 m5 V4 u //写数据时将数据在底层存储起来,等到中断的时候再发送+ S7 C$ r: i3 l3 {2 h. ~
//AMBE2000输入数据是以0x13EC开头的
6 v T" _( y6 Z write(fd,&data_write,sizeof(unsigned short));
9 o( A6 H0 c1 o# _: p& M 3 F* {7 w9 s# C5 I1 s# M
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
Z. k( j0 T1 i% Y/ C+ C read(fd,&data_read,sizeof(unsigned short));0 p2 ]" K5 y& {, v' ^3 V
! y5 L# Q3 w2 a) I
if(data_read == 0x13Ec)
0 b+ s& H2 U1 Z& C% X {6 J* b# b& Z9 u( V2 b
- ]! p7 x% o: {) E2 N$ F printf("data_read = %x\n",data_read);
* v/ j3 n7 p# s/ Z b }( I2 V5 q4 ^: _" c- g
: F/ M& H: [8 s/ L
msleep(10);+ e' u: \) X1 N
3 J( k( U# V$ {& u! O+ ^) ~ /*
# s. P0 v4 H% S, W" v. ` ioctl(fd,1);
5 v8 V/ r$ g+ F/ G sleep(1);
$ S* C5 ~- D( ~ c( d$ E9 _ ioctl(fd,0);
/ w u4 C( u u6 ~. `, T sleep(1);
& H( q) X O8 B0 O" c */ 1 g* J% i2 ~ ~
}
* \. g; u% _# s$ c) ] return 0;
0 K: L' }9 @8 F3 {2 Y! f: s% J- p
4 l3 d' ~# X3 x. {7 P: [# V}
: X9 T* ~$ n4 {; v {7 p) M( b; E: o9 P
多谢各位指教,谢谢! 急- W' p4 \, |: p z m% t
" Q, w( L2 d3 z! }
0 Q% `8 i! W0 j& i, j/ `3 C
! M5 p- O- X' X6 P
; y: M, Y" ?, \$ Q3 s% ]9 T, V! l
) F5 C+ C' X4 w4 b) [% ?* |4 S7 ^+ s |
|