|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; [8 i" Q( H7 x( f
/*
% _/ M) {8 G! L$ t/ P. f * Copyright (C) 2009 Texas Instruments Inc
5 b: |' ]5 z4 b B! V/ c5 N *) B9 \7 _0 ~+ o0 k
* This program is free software; you can redistribute it and/or modify
1 Q& [1 z' E/ Y. }) L * it under the terms of the GNU General Public License as published by6 [/ S; A' M- c: C7 _
* the Free Software Foundation; either version 2 of the License, or
1 C6 B$ q1 a% _2 \" E8 X( S" o# w * (at your option)any later version.
- t a; t; `0 x' o& S0 `; ^ */ T* `2 Q* Z$ @6 ]# d4 R
* This program is distributed in the hope that it will be useful,
, O) U7 Z( h' D, I7 c, k2 V * but WITHOUT ANY WARRANTY; without even the implied warranty of, u+ Y; m8 t7 j
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% K& R$ j$ n" U1 [2 ] * GNU General Public License for more details.. d9 |; w& K" ^7 W5 W3 C% _
*1 T j5 r M* \
* You should have received a copy of the GNU General Public License
2 K b4 J% P' L8 u * along with this program; if not, write to the Free Software$ `2 R/ a- S: Q
* Foundati$ V& f- Y6 k* l3 }
*// F. \# z' n L5 K0 N( L% a
#include <linux/module.h>: Q3 d$ K# z# C/ @7 W, j7 `/ f
#include <linux/init.h>1 o! r4 w# _& _7 u0 v
#include <linux/errno.h>
; }7 h C S D/ L2 M#include <linux/types.h>
- r) T! e5 e, m' H& [4 d6 B#include <linux/interrupt.h>) ]$ g& T# J; @% {' c1 n+ L# S
#include <linux/io.h>$ A- W) J! q# M! s' \
#include <linux/sysctl.h>3 {1 c# ?& J4 ~, U9 c, @4 Y
#include <linux/mm.h>
: e4 X6 [: [, e5 p4 c! _#include <linux/delay.h>. J# }+ V- o5 J: g4 u+ B
#include<linux/kernel.h>
9 N6 B/ H- Y/ d. [7 p# c" K7 P#include<linux/fs.h>
0 R1 |; k2 ]. s9 Z#include<linux/ioctl.h>* q, o4 c: d9 x ]0 A. h/ |
#include<linux/cdev.h>
& d+ ^6 V2 q( z A* M#include<linux/kdev_t.h>; B4 S) f$ h1 F' R, ^
#include<linux/gpio.h>
! f) p+ F, A1 p$ G) _% G6 t#include <mach/hardware.h>
5 q- |' D. H& f1 C5 ]% m#include <mach/irqs.h>
5 e; B. P( s& z6 ]8 p4 y: n3 \
! U8 w0 u: Y8 x" Z) M7 d6 L#include <asm/mach-types.h>8 ]6 d! X2 I# K" S0 S% @4 l
#include <asm/mach/arch.h>
% R+ z' I) e7 ^+ i2 W#include <mach/da8xx.h>, i3 [5 X {" A8 ]& O3 ~' S$ b# t
#define SYSCFG_BASE 0x01c14000
( r+ Y* {* p* V0 y#define PINMUX1_OFFSET 0x124 9 z+ l/ B6 E. O: {8 P
#define PINMUX18_OFFSET 0x168 & u) t. Y9 v/ P3 B( g4 X
#define PINMUX19_OFFSET 0x16c
7 j- F6 i& h5 B H7 O _! `#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 _1 y o' y& A7 h- O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR/ x- p {! [" }$ A3 g, }. S
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 }( q( O; [- s1 R6 H* A
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR6 x; k$ C. W$ V X( a; }- }
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! f7 q `6 }) z) [
4 l0 o% y5 }7 }! @" x#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
6 f6 i" H! ~6 ~5 ]$ v: V& c#define DRR_ADDR 0x01D11000 //MCBSP1_DRR, P1 {$ P% @5 l6 [$ \ ]
//PSC
" |: W) O6 z$ K" }8 t#define PTCMD_ADDR 0x01E27120 ( s- Q& f* |0 J, h/ \! |1 l
#define MDCTL15_ADDR 0x01E27A3C$ ~$ ]' e9 T, r4 ^
#define PDCTL1_ADDR 0x01E27304# G) N0 {" V. P1 w- w! K
//GPIO8 direction w$ d$ z! W! c, w1 T' U# Z' E) z$ Q
#define GPIO8_DIRECT 0x01E260B0
: J8 ?3 R- w8 X q7 p) Y#define GPIO8_OUT 0x01E260B4+ K1 P# d6 F7 }
#define GPIO8_IN 0x01E260C0
0 i' P& o3 t' L9 U0 O1 V, u P- F7 k$ l: i
//#define MCBSP1_RINT 99 9 Q. b, B; a, a: V6 g' M) l0 E
//#define MCBSP1_XINT 100
$ k2 q I! {8 G8 v& r" `# |static int MCBSP_MAJOR=239;: r. C7 j$ X0 ~; Y; Z+ C$ D
static int MCBSP_MINOR=0;0 x/ b8 O) x3 w- B$ X5 q- |# d7 ~
static int count =1;1 m9 \* g% P [! d* o
. d" F7 _# B; n* S& Z#define MCBSP_NAME "MCBSP-device"
& G* V; O/ C. O2 E! e
7 y7 E; u# I; r3 d: L: r. e) Bstatic struct cdev *mcbsp_cdev;
% n# i$ G/ B1 P7 o( F6 {& v; Astatic struct class *mcbsp_class;. d2 m, k; @% e0 x* k
static dev_t mcbsp_dev;- M% ^2 }, h1 P" V
unsigned int DRR_data;$ H$ [4 E( S& S8 n6 ?$ C- `9 b
unsigned int DXR_data;
$ E) s, F# D' f6 u4 o3 Hstatic int mcbsp_open(struct inode *inode,struct file *file)
1 q% {. A0 ?5 X7 X# `{& J, d/ c4 ^" H2 r8 o
; H0 ] s2 ~" G7 n# y- { //interrupt enable,initialized
* j/ A0 F/ H. M* i: m8 W unsigned int temp;
% r1 @& g5 R, E& n ~/ f //SLEEP_EN(GPIO8[10])---0
" ~ J7 K! {+ Z" j( ^1 V/ _3 @ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( x9 L8 i' a& }7 a8 F temp=temp&(~0x00000400);8 f [: c+ |; B+ ?% p
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ C# {' l7 ?$ N: _8 {
//RESETn(GPIO8[8])----0----16 v7 x* x" {) b- E: Z2 E& l
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 r1 V/ d2 R, c7 P6 D$ ^; N& U7 C
temp=temp&(~0x00000100);
& Y* \9 q* W- Q- l U& J __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- h: u; J5 `5 B& E udelay(100);% Q& l% H7 G; ?
temp=temp| 0x00000100;
( y/ w. Y! E5 u+ W) N __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' [3 k. U' H7 y+ ^( U
udelay(100);+ T: V4 ~6 F! W5 q# L2 r" i! J
printk("open success!\n");4 a0 V5 h; K: b) O; `6 ^
return 0;" t" N4 d9 M" H1 G- u! c+ M# ]& p
}# @8 O$ V0 a& c5 U
5 h1 i% r/ R# H& m
static int mcbsp_release(struct inode *inode,struct file *file)$ U. p9 l( |5 n: ?& s
{6 X8 {; F# N: u a* S0 ?& O
printk("release success!\n");
! s3 F+ I5 }1 W" h return 0;
+ E2 U+ K( R; Y7 \}
! e8 ?; U. T! }0 [; l3 v& l( t
, H+ |. O B9 Gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& E: M4 N3 L# C" `" p) _* P/ n% a6 p
{
( O3 u# s4 i4 M6 S0 \ copy_from_user(&DXR_data,buf,len);* P& e, v9 J6 M, ^. W/ w! p
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % r# ~8 d* ]+ D$ u
return 0;
* n! B3 z4 A; O
1 |- ~6 O0 W1 Z7 z5 p2 A}
+ S0 J3 \- O! a- X/ T% T4 j Y w! J- c% M4 @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! d/ p2 @# H7 p. d$ | C
{ , {4 Q/ O2 d" L7 v! w6 M
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 I( M1 i9 c2 z
copy_to_user(buf,&DRR_data,len);
& @' t( P" T `3 h, E return 0;% D7 c- T) w w5 W/ N
}5 E5 B3 E2 u( @: D: j3 g
' D- G: h- @! V7 G+ H. a1 ]2 P+ j9 B3 g
static struct file_operations mcbsp_fops=
1 e/ S# z6 T" O1 e{
+ `4 [" l8 ? d V .owner=THIS_MODULE,
7 U3 J# M8 ~; N .open=mcbsp_open,7 K/ y+ i2 R5 Q+ G# l7 r2 o
.release=mcbsp_release,( `( p" W4 m3 s& B2 K) g
.write=mcbsp_write,
3 U0 f$ C8 S4 |; B2 Q4 c# ]( j" K .read=mcbsp_read,/ L% _7 K7 N2 B Q O, X- Q, [) y+ L! g
};
5 O+ g( A/ T S; j; p( hstatic int __init MCBSP_init(void)1 D. p' ~6 a; m5 T! [: N
{- k+ V5 d1 f- x
int ret;' _% y6 I- B1 U' o
unsigned int PINMUX1_REG_old;" ?- T2 A. d% l; \
unsigned int PINMUX18_REG_old;
& {# q" ~7 ?7 V( T2 A unsigned int PINMUX19_REG_old;4 W6 J7 Z1 V3 ]1 }2 d
unsigned int temp;
, D* Q: ~) j: Q' u6 J% W if(MCBSP_MAJOR)/ Q! A" b [ X. T- Y
{: G$ l, v6 T7 U H
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% U0 K* F/ e2 @6 w* l
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 F' A% k; z; `: t0 t$ o: a0 l
}
: W7 i' m* n4 M% p else
# F$ T7 ~" L/ s4 w) u {
8 P# O& Q4 k: {* J* \8 z( m ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 p; W9 {8 i, l* c1 Q9 Q MCBSP_MAJOR=MAJOR(mcbsp_dev);
( J) q3 Q. i7 q1 b3 n- [8 B }
* l h; Z- q; J2 d0 f" L+ E ' J: ?" v& w& j- x1 [. g' R
if(ret<0)- t& c9 K% M+ [! N6 N: N
{; t8 i( H2 Q, O! ]; Q" \ t9 ?
printk(KERN_ERR "register chrdev fail!");( c6 q, R O5 @; A
return -1;
5 |2 T2 r, \/ E/ S, _; o }
! G$ x6 w( G7 C/ h y0 m1 a+ a8 B3 o- w
mcbsp_cdev=cdev_alloc();4 T. m. }8 R$ p" c) v8 H9 }
1 i! ]# b; U: l) Z3 W if(mcbsp_cdev!=NULL); f" R2 x s* {3 x8 A3 T6 m' I
{
+ I& }+ X8 H0 t% ]* X2 S cdev_init(mcbsp_cdev,&mcbsp_fops);( z O6 r! R2 R
mcbsp_cdev->ops=&mcbsp_fops;
5 t1 W! \0 d6 ^$ ?# T; n mcbsp_cdev->owner=THIS_MODULE;
& ~4 q& X4 E/ x2 ]' v 3 o r1 g9 l+ x. O2 g" n) [
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 c7 T# n- h$ z8 @+ ]2 ^ H
printk(KERN_ERR "register cdev fail!");
$ ~ ~+ d: z) S# r; h, a# J, f else0 W. L2 a) V; {7 W, Y1 L8 K- x
printk(KERN_ERR "register success!\n");: t: r. s/ G$ ?, [* _
}/ Y! M; A/ `8 ~! n9 T
else- m: `* o% O% m2 T- L G7 _1 s
{
/ _* d: F2 n9 h& O& @# o# B printk(KERN_ERR "register cdev err!");
( @7 s" x) j) i return -1;
4 ^, D* j* X" O. E }
3 J4 l( U! l. Q" j4 R, C . B5 P2 y5 C, k6 [
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
+ h" P' B6 @) D if(IS_ERR(mcbsp_class))
& m: Z x0 K8 U* M u {1 }0 _" C# Q: q: p
printk(KERN_ERR "register class err!");
. {2 j: e/ l* ?& `% e0 m return -1;7 @7 X! A8 C" k
}
! u; Z7 j/ r) K4 S7 a device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" s; r+ J" V ?. e; ^8 r- C+ z) m
/ b; i( M! D/ |6 a //PSC: t* I( n( ?" m f
//add Enable MCBSP
' H* g) C1 T# m/ K //test) C# E* J" }6 ~) l
temp = 0x80000003;) C. A/ F' C4 a/ K
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 ?7 W. [* i0 P( P9 h i temp = 0x00000003;
7 F% V+ A9 }/ D writel(temp, IO_ADDRESS(PTCMD_ADDR));7 V M. r0 Z+ l6 c3 m' P; v
9 ^( D7 e0 a8 \6 Q" n1 n( M# K: _ temp = 0x001FF201;
& `: [3 x. b j8 \" [2 _! u7 O writel(temp, IO_ADDRESS(PDCTL1_ADDR));. }- C3 ^. E# \* e2 Z/ G: b; R$ B. T
$ G' O% X6 ~3 I; }0 P- n9 D
//PINMUX " S# d$ V0 M7 B; o" [7 J
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,9 V, W9 y/ n( H! [, Q
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 6 w2 D% ^$ N/ _$ Y. b: `
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, R' N# ^& z" \ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# o6 p& V6 X1 |( e: p 6 e/ Y8 W0 \3 ]& U( H4 K; b) @# M
//SLEEP_EN,EPR,L138_SHK1,L138_RC
' D* t# |* W5 V7 e* e- O: D PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# T. u9 Z V# g2 K PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 6 T0 \$ S7 K% }& e6 B
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
q7 Y. y5 C9 p4 h+ }* e6 h9 X 5 B" V# }3 R7 A: |, g
//RESETn,L138_SHK2
. `% ~/ H: U2 u PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" w$ ~* F, `: u PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 b1 U. h5 L( g4 k* A writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" @( O m) r" r: y, m! V ' E" v* V5 v/ U: D3 p: \
) S" C( Q; J/ Z: `) e //SPCR Register
8 Y2 a6 W- U+ e% [0 O+ n* t //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: r7 M, ~1 L, C+ Q
temp = 0x03000000;//(DLB=0)
) b8 J# c0 N1 s // temp = 0x03008000;//(DLB=1)& a/ c) z3 B8 O F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
. A& k! d; B; y temp = readl(IO_ADDRESS(SPCR_ADDR));4 k* B' z; }9 U' v8 b
printk("temp=%x\n",temp);
/ q- c/ S& U$ q; B5 v5 O5 D
4 j1 ?% V+ k1 S" J, e //PCR Register$ t; u& Q; `# } n
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ ]; L8 B- m# J4 I // temp = 0x00000F0F;6 Z% u$ r& u K
temp = 0x00000B0F;
: D3 U5 g& \4 V9 g i- @+ Z: H writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! p0 h+ |& h8 H! o0 O6 D temp = readl(IO_ADDRESS(PCR_ADDR));8 K( f1 a* R1 d, C
printk("temp=%x\n",temp);
! U" C/ X# R6 H3 c9 P- Z* P5 r //SRGR Register
/ d, i) i" M5 c3 c0 `9 a0 F //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ I9 @- _% G9 l$ {: d' ] //temp = 0x301F000B;
! }- R' b* e, N% o writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
) o3 S! M7 p/ k1 v6 [) p3 J temp = readl(IO_ADDRESS(SRGR_ADDR));
5 ?: v( {- }$ q. Q" }- G" o printk("temp=%x\n",temp);
7 E X7 x. \, x- I. G e$ ` //RCR7 ]# n: A/ U0 P0 c( X6 M4 [
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
# [# b" M, {; m+ |1 w" u5 a8 I% \4 B4 i //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 [$ |+ n1 }% i9 _% `7 V
temp = 0x00440040;: {9 h* ~; j9 f }
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
- ~% |7 x9 o$ p/ Q+ U temp = readl(IO_ADDRESS(RCR_ADDR));; X! F4 I6 v$ A8 o
printk("temp=%x\n",temp);8 w$ P( S) n% q4 m3 f8 G8 T
//XCR
+ b# X* s1 D9 R Z( c0 Q+ ^( Q1 _ //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
1 i) [% T" b& I //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 r v7 W+ Y. v0 s# E3 O
temp = 0x00440040;! y' H- z2 N) p1 l
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
; k6 q5 w$ v3 D temp = readl(IO_ADDRESS(XCR_ADDR));
/ P4 D7 Z( r1 I7 x1 B printk("temp=%x\n",temp);7 {' L/ ?4 R- f; D0 x. B, H
udelay(100);: `$ ~) b y; ]. `1 g. F# ^3 ?
//SPCR Register
9 C: a6 o" M/ d v //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 W; V# c; N+ J# ` temp = 0x03C10001; //DLB = 0 VS DLB = 18 F. Q& V& L+ _: w
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
0 B6 N$ Y6 |' `8 c) X$ ?2 w temp = readl(IO_ADDRESS(SPCR_ADDR));
" |4 y0 P6 V6 C/ w printk("temp=%x\n",temp);( h7 T j! K* j$ {
udelay(100);
+ k& a. v/ O! p+ F5 h6 \
6 H4 d5 H$ m7 O& i( G //set GPIO direction
) ~/ ], V( i; t0 D( t/ D- z' g- M- o temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));! Q* |: i$ h& {( Y6 M! H d
temp = temp | 0x00000100;//EPR----input
7 [: b# I# [3 O3 F6 t temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
, ~! |, j9 x" ^% W0 ^* I4 ]" l __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 {% x) Z. s) |- M: P/ e. ^ 7 _& j7 D l( h, Q, B$ V8 R
return 0;
3 g8 r' d1 `2 R1 ]% H- U( W" {}7 v) h3 e( @2 S- [9 m! A1 K: b4 z
static void __exit MCBSP_exit(void)
9 R) J4 x* K# X8 M{" ?% F4 ]( ]5 P, u
printk("mcbsp chrdev exit!\n");
+ ~9 m# R' U1 B7 s cdev_del(mcbsp_cdev);3 w0 a/ w b( a# c4 j6 n
unregister_chrdev_region(mcbsp_dev,count);
' z9 @! U! n- o5 M8 N' d& r device_destroy(mcbsp_class,mcbsp_dev);: r6 O6 l4 Y+ K: o# q
class_destroy(mcbsp_class);& O7 t; G0 u m; S7 E; ` h
}
: j1 z7 V/ _( J+ T, @4 U* i) Smodule_init(MCBSP_init);
" l! A% W; L5 ?module_exit(MCBSP_exit);: B2 d R8 q. a* @5 q. T
2 [* p) a- @+ W( E" O$ ^- V" V, q/ xMODULE_LICENSE("GPL");
* L9 i7 d- N' j2 N' `- g$ S$ j* [
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 r4 k( Y+ s9 z/ a* T) B+ m
我的应用层的测试程序如下4 ]1 m6 D: h2 f2 R4 a0 C
#include <stdio.h>( n% Z0 W/ @1 @2 [5 O( I
#include <string.h># E% w& n- x, r* w1 }
#include <fcntl.h>
' X* T% H, V7 W#include <unistd.h>! \0 q# Z2 R, c( w) {$ q# H8 Y* l
#include <signal.h>8 d* M5 m- C! }- t% h
#include <pthread.h> //线程
) W8 _; M# R2 [1 `" ~% D#include <stdlib.h>
: K* \) O" b0 R0 x#include <pcap.h> //捕获网口数据
: b0 P5 a+ J8 E* \1 o9 \; L/ D- a#include <semaphore.h> //信号; `. w2 @# ?; S7 I$ y4 M) _
#include <sys/types.h> //消息对列; |* A' U2 r4 L( Z
#include <sys/ipc.h> //消息队列
: N4 t I9 ^# f0 K6 g4 `% F#include <sys/msg.h> //消息队列
: G3 p* I; {, M) F6 ~#include <sys/select.h>7 p+ B4 m( t& c. v' m* T7 @
#include <sys/syscall.h>6 | O. o* B$ F+ f: s5 q! X
#include <sys/stat.h>2 r$ k& E# Q$ Y1 i: R
#include <sys/mman.h>
, T+ k2 u/ v7 X! j6 Y#define msleep(x) usleep(1000*x)$ z8 @' v6 N3 A9 r5 a# T
. ^1 V, Z& g0 G6 u7 E
int main()( Z8 N% ]$ o- @% X+ @! f
{ / m' m, A6 i6 |
//MCBSP,ARM与AMBE2000交互设备: r# O( q' L' A1 j4 B) D/ W+ g
int fd;
" \7 J% g7 R! E" a- D8 ^8 W5 a) \ unsigned short data_write = 0x5555;! m% }# a: h( W" U' Z7 g @
unsigned short data_read = 0x00;
" g- O% ?3 v, q) a8 ^) h fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: T2 f7 P1 R/ }! E // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& }% U) x/ l x( y* x8 F& b
# i+ J2 B H7 W if(fd < 0)0 W/ {0 y* q$ ~7 R
{1 n+ G9 k: Z* _* T9 J
perror("open failed\n");: ~0 D: @! t' ?3 o1 q. W+ ?- m
return -1;
: r$ I, X' c c2 _ }& l) a$ j; C) e: V
6 S" t4 R8 [# ?$ t9 N1 J+ m while(1)
: O" k9 p' c6 i8 M; R# [6 F" a {
& Y0 {# W8 }+ l% Q+ X: O" \ 4 Y) O; f% i% r# L
//AMBE2000每次读写是24个字为一帧& g) F ?2 x/ d; p0 L; I$ h9 d [
//写数据时将数据在底层存储起来,等到中断的时候再发送. w$ I3 s v3 [; J+ V1 ~: y' L& [
//AMBE2000输入数据是以0x13EC开头的
1 d4 o% r7 c' Q' e% X& q write(fd,&data_write,sizeof(unsigned short));
2 F" C8 D M5 S) z, K
; R: x* q# Y8 p" S! @ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
6 B, }2 t1 N# {9 W read(fd,&data_read,sizeof(unsigned short));( Q9 M, |/ r5 u" p9 ?
; f( I" [0 O# F. }3 P- W# ?
if(data_read == 0x13Ec)7 D4 h0 ^* T( M h
{
& E& ]8 f2 V& F; M% \ + k5 o5 m# o. x1 [) B0 j% C q
printf("data_read = %x\n",data_read);. r: a8 N( Q- {
}
% o3 n) t k4 O & A: J8 \# L% {
msleep(10);
& z( } b3 T* _+ w8 o" {8 O- ` + `$ |3 j7 D' L. ^( k& _
/*0 G* ?* I4 E, ^/ J Y. R; A5 p
ioctl(fd,1); 4 j$ l. B+ w( i6 @; `8 t% h( e/ T
sleep(1);
3 r! ?7 |$ c' D: K2 p6 G ioctl(fd,0);
# X/ r) {5 r) f+ C& ^' h8 [ sleep(1);' j2 e" s2 S0 Q& @5 K
*/
' b, Z2 |( |9 o } . k& G: t* j- U1 _% L0 _; ^6 k5 t/ e$ o
return 0;
, k S& R( M5 _ ?$ z; v
. E# F4 t) U7 E5 e2 K/ Z$ o}/ R; \. a* K) R% S5 L) O, w" s# @
! H6 {6 l" T2 j
多谢各位指教,谢谢! 急* s1 K/ n5 K4 N* R' L
' ?) q; [7 p6 u( v7 }" [) I( w) D
0 o; W. d l6 s& g
! p8 x) g" V, I' i6 m, M' Y2 ]; o
% m( ~ H3 p, }+ W% q6 y2 |2 g1 c) E7 O
1 f, o% N! U9 w |
|