|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ R; }' |( m3 W- D6 V3 f2 `/*/ z8 n: i% ^$ y/ V
* Copyright (C) 2009 Texas Instruments Inc W i2 l- W0 |) _0 V. V
*
. J5 b; t' a0 J * This program is free software; you can redistribute it and/or modify
/ X0 w, x7 T$ d3 ]0 W' { | * it under the terms of the GNU General Public License as published by
8 W7 ?) w* g$ t0 A, s# m( @ j * the Free Software Foundation; either version 2 of the License, or. _8 g3 g! c) |; Z5 L
* (at your option)any later version.
~$ m: h$ L8 I; P *
5 E' w% R4 c% j! T+ q- \$ ^ * This program is distributed in the hope that it will be useful,6 o! r+ D4 N. S* g
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 g# R. s: O: C" J * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( X9 L; Y0 i6 i' C5 I * GNU General Public License for more details.0 } R* u# v6 [/ i) C6 R
*
: i- ?5 S) X. X- ]0 y& b2 [2 e4 s * You should have received a copy of the GNU General Public License( X8 ^* q; M8 G3 g
* along with this program; if not, write to the Free Software
2 I8 F& [5 G8 R- a+ |- l, { P * Foundati( p! G" _* k, Z3 R& v4 S3 |& e# @
*/5 L f) j. h0 c! w3 t; f; y
#include <linux/module.h>
( S# d* [% j# I5 G+ T2 ]* [#include <linux/init.h>
+ H6 m, s8 i3 j8 O* U7 L#include <linux/errno.h>
3 B1 `3 H5 _( o+ y#include <linux/types.h>1 L# U' K# S9 o- i; K ]
#include <linux/interrupt.h>5 ?! }9 W* U9 i9 ~. o# |
#include <linux/io.h>
8 d1 A4 b, x- V( a+ s; h. G, T0 p% L#include <linux/sysctl.h>0 ~# X' U7 G: g- d" s4 v2 G$ ]+ n
#include <linux/mm.h>" i% g) }3 d( y% i
#include <linux/delay.h>5 b/ j- o8 B$ d/ ?
#include<linux/kernel.h>
" G! ^0 D& i% x6 _! G9 ^9 W# w#include<linux/fs.h>
+ f9 r' q, z2 |& |* T#include<linux/ioctl.h>7 K- \, R9 b4 a
#include<linux/cdev.h>
. j* Y D5 J `#include<linux/kdev_t.h>
! p, h% l$ s2 i* u#include<linux/gpio.h>
7 ~/ i. p \# t% ~#include <mach/hardware.h>. ^* j, h, K8 i
#include <mach/irqs.h>) n& v5 C" A' e, ]2 |
0 T% Y0 ]) t+ R0 @
#include <asm/mach-types.h>
* X! i2 q9 Z" N8 f8 E#include <asm/mach/arch.h>' I" M4 p: c# W6 t' C& c! N8 U
#include <mach/da8xx.h>
( E4 y- g. _$ l# t l#define SYSCFG_BASE 0x01c14000% a: f8 w+ L% ?% ^- h& O
#define PINMUX1_OFFSET 0x124 0 }: @4 X' |' |: K' J/ ?
#define PINMUX18_OFFSET 0x168 ( p) i7 H# Q- b- r3 n7 ]0 X' }2 b" I
#define PINMUX19_OFFSET 0x16c
/ u. ]( @7 ^4 n3 Z7 r [#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR6 [' n) ^+ ~" t
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR* [5 R1 w+ |3 ]: Z% n7 V8 m
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
1 N/ V7 n9 c# d#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
# ?* U. |: _$ [9 H! I: P#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' U( v( U. u X) ]+ K
5 b4 _0 O; a, @, \) S4 t7 x: U# v
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
! {$ W' a: f& C/ ~" h/ H: ?# [4 e( H#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# ~' c5 t6 V! {$ C8 y' _6 ?0 y* U
//PSC
" U' r$ N4 P& ?2 A7 a#define PTCMD_ADDR 0x01E27120
+ `- l6 H, Y$ q! N# U" P! R* A#define MDCTL15_ADDR 0x01E27A3C
9 C6 F! z# x$ F3 q% T#define PDCTL1_ADDR 0x01E27304
9 [1 K2 N* t! s//GPIO8 direction
% l3 J- U7 [' X#define GPIO8_DIRECT 0x01E260B0
+ W0 I% x) E3 Q) L#define GPIO8_OUT 0x01E260B4: B1 o9 _* Z0 Z' ?
#define GPIO8_IN 0x01E260C02 M X" H) u9 C* y! q
5 Q0 y. k" {, r; C
//#define MCBSP1_RINT 99
: D" G) l3 m" A# |2 r* }" c//#define MCBSP1_XINT 100 * J M. R0 b. I
static int MCBSP_MAJOR=239;
! J% Z. {$ M9 V& ~7 Astatic int MCBSP_MINOR=0;
) p# s. m5 t! T+ x Lstatic int count =1;
[+ g8 U! w8 T2 |! N! h
! A! p: `, o. {2 r7 r& n* ]#define MCBSP_NAME "MCBSP-device"
1 y; j: L0 u& w) u. l2 E
9 x: l, u; _3 W1 n) Cstatic struct cdev *mcbsp_cdev;7 Z Z* H0 D# T( M! N# Z
static struct class *mcbsp_class;
* f0 d) O7 x* S, o/ g- i, f, }static dev_t mcbsp_dev;
1 R* ^! z- b- I" W, A6 Iunsigned int DRR_data; M3 Q7 C: w0 G6 J
unsigned int DXR_data;
" C& Z' d' e/ J+ O/ A4 }static int mcbsp_open(struct inode *inode,struct file *file), [: J; V' J- o% L+ `8 A+ i
{5 x5 x: P7 n& P0 i
# C: j( S( Y$ }: C u X
//interrupt enable,initialized
H% u+ q0 j/ E: M( R1 f- x unsigned int temp;+ _7 B4 J& X6 D5 C T2 s! ]
//SLEEP_EN(GPIO8[10])---0
( a# F1 ~ Y0 u* @3 r, r# ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ c" P3 S- o; \( J% S+ B# ? temp=temp&(~0x00000400);
, i' [8 }5 a9 z* K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 M/ M0 p5 a. S4 s( d7 ~& L //RESETn(GPIO8[8])----0----1
* A0 w( w. b* {/ s+ Q2 ^* P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 V) Z" M5 }# e2 _7 U# X- i3 K
temp=temp&(~0x00000100);
. a5 n% m0 D% @% c2 g- c __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% l' p5 i# ?, E$ ?1 w4 V udelay(100);
5 b/ T- K& p. {4 G+ ^) B temp=temp| 0x00000100;, q4 G( S1 b! f
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! r3 W) ~+ M2 x, G$ ~9 w4 r: M! ~
udelay(100);5 Z" K. o3 b/ g( V
printk("open success!\n");
$ R1 \( Q' O: G6 }4 J1 p: `, T return 0;
5 M1 b. @# B' Y& g: c% u% E% Y}
+ f3 Y. l8 H( o" ~8 o- d) X. a" a/ x+ x7 u" e' p
static int mcbsp_release(struct inode *inode,struct file *file)4 |# H+ f* S5 I) K
{0 u- t9 g P5 B4 ^
printk("release success!\n");6 P) p. E4 q0 ^
return 0;
6 c- i7 @% `5 ^3 {+ ^. u}. W5 u# D9 U- y r% X
t- X1 g; q1 B- K8 p$ nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 s* U; e1 P+ `: Z/ d( ^, C2 X& W{9 a4 R9 z, ]/ o3 l
copy_from_user(&DXR_data,buf,len);, o8 T% a9 Q0 c9 s3 X
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); - F) S1 I, l# A7 j- u$ f7 t) a$ W
return 0;
: H8 E& n4 v0 G/ ]. V1 ^$ a
$ y: B; A6 H; J}/ u+ w9 s$ W# ?* u/ _7 ?& C. E
3 t+ X; m* a0 n' M# x) X. ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ s2 R. i/ o1 M$ j4 L
{ ( k5 I: T: n4 h5 c$ t
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' R( M" w4 U4 {/ X, @, R% P: ~* [ copy_to_user(buf,&DRR_data,len);
: Q8 L( e" K' e1 h. N; K ` return 0;! n3 _7 L& b D' g F& J0 B4 U
}
! j% A- p8 n1 k; d; R% U
$ K; d- @; d2 {9 _ {7 H
% m: W2 b, |' M8 K0 _& @. l; ostatic struct file_operations mcbsp_fops=- `5 L# I! _( W5 u
{% c! I, c7 p$ a T
.owner=THIS_MODULE,
4 t& G" T0 g9 m1 x .open=mcbsp_open,) M1 E3 A$ g1 H2 m4 K6 Q% \
.release=mcbsp_release,
1 M$ |, e& v0 l8 E, B: d/ t .write=mcbsp_write,2 F: S8 @! S- U. |( c' O
.read=mcbsp_read,8 a ~3 w0 S' z: Q2 i R0 M
};" k1 ]2 q; J9 f* F! A. H a
static int __init MCBSP_init(void)
. j$ v4 R/ t5 K' g8 w' B{
1 Z6 P4 I; `( @7 a: `+ | int ret;
3 Z: s% f4 C0 @8 a4 n/ C4 f unsigned int PINMUX1_REG_old;
) G8 e V; B) }& f s7 T unsigned int PINMUX18_REG_old;
) Y7 S% ^4 j }. K% A unsigned int PINMUX19_REG_old;
# s9 j0 x3 d$ L H6 O/ ^. E unsigned int temp;
& r, {( D6 h5 r+ p8 @4 ~- [9 x0 v if(MCBSP_MAJOR), I9 p2 l7 F: o7 S ]
{
. X6 G. H; |; v7 E) X* U mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; Y0 ]- g; v! ~, E ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ }( R% @) L% C+ p }+ u/ J! U7 o. l l8 k2 K: Y$ K q* i) v
else/ C- Q+ A9 _( A, P, l5 A
{! c) v* L0 @( a8 U' m/ z- W' u; Z# s
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; V W8 ^: D; Z MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ W7 C* n& U0 l& S0 C K+ P; R }; S9 H, J ?* R6 k0 H! @+ _: Y
) H( T* n. a7 w" b, ~5 k$ e0 c7 h# y% E if(ret<0)5 G8 q, R& I7 J
{" d; C; y+ ^9 u2 I3 b4 }
printk(KERN_ERR "register chrdev fail!");
& V, ] [5 W. S! c7 r return -1;" W, J6 K4 `8 {
}
% }" X" L% r- n4 O: |
* H) ~) t3 x" J0 B0 Y" U mcbsp_cdev=cdev_alloc();
i$ K9 }' P; P+ n6 N" R
- l3 {4 r( Y1 d) I$ c, N8 H# v; _- N if(mcbsp_cdev!=NULL)
) M" w8 p# U7 s4 E+ C( Q8 A; ~0 n {
( E1 w5 X% ]$ \2 a& ?5 d cdev_init(mcbsp_cdev,&mcbsp_fops);& j6 \* t' x. `
mcbsp_cdev->ops=&mcbsp_fops;5 Z" d: P/ G% T
mcbsp_cdev->owner=THIS_MODULE;
1 o, u" a) S; q 0 o% ]! D: t5 P. a9 [; a$ ^; O
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* O7 M. p( c( h! j) U- V printk(KERN_ERR "register cdev fail!"); z1 S( @$ q1 O+ [6 l2 l0 h( c
else
" z% N- H5 z7 m% K& f' w printk(KERN_ERR "register success!\n");
( O# o7 R. n. k7 [; ` }6 J9 |9 q( Y2 }/ a$ d! c
else. y) @& q" ?; j) Q
{
, J. C+ h, C3 Y5 w- ^ printk(KERN_ERR "register cdev err!");
' S3 n5 k) L/ t4 s0 y; u* {5 @ return -1;: l; V) o) G3 H$ X, y. O
}& g( }3 [) Y( w/ e
% k7 M; A! |* Y1 A4 I
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
+ `2 L. @5 u8 j5 n4 m6 ^ if(IS_ERR(mcbsp_class))# I( f2 `( C, M5 _/ _5 }
{4 t: B/ c2 ?4 ?' x& T( J
printk(KERN_ERR "register class err!");
7 P% Y$ B* i( e3 a7 j5 O return -1;& t! G7 Z8 S$ `
}
% _) B4 g7 K \8 `3 K device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 w7 t" A& X; A4 }" y) R" A9 l$ F
. T4 T$ i6 H" e' C6 ~2 U0 ?7 h //PSC
; O' `+ o7 G4 t0 S9 M4 P$ R9 Z //add Enable MCBSP0 T. Q5 K$ v. Y5 N1 G
//test7 y2 l( p5 w, F
temp = 0x80000003;
7 @( r2 m& f% C! U writel(temp, IO_ADDRESS(MDCTL15_ADDR));
8 g6 [) V5 v% D) d( G+ W2 L temp = 0x00000003;" ^! G. X: S: `$ ^
writel(temp, IO_ADDRESS(PTCMD_ADDR));8 T% F5 G! \) }
6 v! } A1 J! `; |; a5 l# g
temp = 0x001FF201;# p. A; M3 O* h) I
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 K$ ?0 D' B: Q g
_6 J& o. S- F ~2 x' }+ o0 v0 A //PINMUX 7 Z1 V3 `5 l9 X0 i5 `
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ B# {! r. \/ R! p9 u
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, F1 T2 h' n2 P R6 x7 I* E PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ! F" |* n# k; _3 I
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 l @2 ?, s# {( x) @4 m& b2 [ / Q5 @0 |$ z3 j B' H& d' U! w
//SLEEP_EN,EPR,L138_SHK1,L138_RC9 ^% b0 N& Y) x2 N9 o) ?. U
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" U+ Z5 b4 X1 m h, s8 ~( z PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
( J3 g+ x4 @) |9 K; z writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ P$ y8 K* c+ k9 E$ t' Q8 X# ]" P6 e 4 X Z) o) v3 j, i* U
//RESETn,L138_SHK26 U+ T+ v1 m8 K0 K& x$ e; l
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ L e) _1 u) F
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
B( q, r1 ~: r' ^( I6 g- p/ b writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 M; g! U2 `6 t4 z & u, d, u! p" o* q2 t" [
# N0 I# @) \2 w5 s7 x //SPCR Register' O5 R$ n' H% T& g+ W( N5 X
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 s/ s7 ^: F% @+ d temp = 0x03000000;//(DLB=0)$ P! A& g! L. ^& L6 `' ?) P
// temp = 0x03008000;//(DLB=1)1 l3 r3 U5 ]2 v% x% s
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
6 l9 J0 x. l+ }' `& ` temp = readl(IO_ADDRESS(SPCR_ADDR));
6 Q) b H8 }: a% J" q6 U printk("temp=%x\n",temp);' V+ m9 H1 j9 T2 v! _, G
! V8 k$ G1 {; P8 O
//PCR Register4 w/ U1 x1 p/ o& k/ |
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' s6 t" f$ O8 W- g7 f
// temp = 0x00000F0F;
/ a! {( S9 R+ Z' Y& ^. s( C temp = 0x00000B0F;" C$ m3 r* k3 k* e( c& N3 G3 r
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized / ^& b: |3 m& {( T" s" p7 q
temp = readl(IO_ADDRESS(PCR_ADDR));4 `5 k3 G# I8 | R3 P
printk("temp=%x\n",temp);
8 A' _) U7 s% g //SRGR Register
$ x( \3 ?" ?- X/ j% D8 e //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11% f- L% @' G8 r/ L2 K' M) f) Z
//temp = 0x301F000B;
! p, p) Q3 B& O. ~ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
( x' o1 f3 Z1 s7 Q/ b0 }- `% h temp = readl(IO_ADDRESS(SRGR_ADDR));+ e: Q3 _$ H3 c) G
printk("temp=%x\n",temp);5 ^2 N! ~' x9 Z; l
//RCR
t2 j3 d7 V; ~! n* N7 b1 i //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* X1 U7 I6 F6 H! ~! r6 S
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" m3 X* `, H9 A( r
temp = 0x00440040;
$ Y( h2 ]+ G4 i" `) r3 S5 d1 f writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
* w$ Y6 \! P2 M' b( C/ p temp = readl(IO_ADDRESS(RCR_ADDR));# G$ R3 m0 _0 x2 L$ Y
printk("temp=%x\n",temp);
$ f9 o9 H. Z% E //XCR! m, I/ y5 j: V' y( }. R
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 t9 W0 ?' ]7 h& M2 ?' O. l( Q
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
- X; S8 R# v$ v4 L temp = 0x00440040;8 i. I, `9 B- [8 B& j3 V
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
3 a: x' K$ W' A temp = readl(IO_ADDRESS(XCR_ADDR));
4 j! I; A: x; l& W printk("temp=%x\n",temp);, r" A) I( k+ q5 N$ M" y9 w0 L: [
udelay(100);# A' A9 j. Q7 P" G
//SPCR Register* r0 a% f+ O1 o1 C
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 e8 o2 c8 E( P7 d$ r
temp = 0x03C10001; //DLB = 0 VS DLB = 19 I1 V8 k6 J; `& F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
2 v" }1 I3 C+ _5 L2 A6 T4 k7 Y temp = readl(IO_ADDRESS(SPCR_ADDR));
9 \0 G$ w, ~6 ` X- S printk("temp=%x\n",temp);" l. I6 p+ o" m# X$ t) y
udelay(100);
9 M! v p1 h3 e: X+ g
3 K$ y- l4 i8 a: ~ //set GPIO direction
( {% b' M+ ^( E) {# B) } temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- u/ H( G3 l$ M: v9 Q
temp = temp | 0x00000100;//EPR----input) h7 O( C6 U0 n( d9 e
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* ^6 m* H8 t, B' T
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # N' P! j+ @ t) k6 n& q6 g
& j1 L! z5 a- g. B6 b return 0;! U3 N; b" ]% `) C' Z! W
}4 k( q' ^# k' L; E; K/ K
static void __exit MCBSP_exit(void)
3 C8 S) A" d1 W, t{2 Q. n( T' p8 L* m N
printk("mcbsp chrdev exit!\n");$ r5 j* |3 C6 B7 [/ M4 k
cdev_del(mcbsp_cdev);
1 l) b- R" t: ~ _! H unregister_chrdev_region(mcbsp_dev,count);
4 \' z: y: v1 N A) R9 L7 o device_destroy(mcbsp_class,mcbsp_dev);, J6 j( w3 I5 F0 R' j
class_destroy(mcbsp_class);& ^" ]: {; N1 ^
}
. u% k; S8 v, ? Tmodule_init(MCBSP_init);% s$ \% d' q( N3 p$ F$ G) b7 |
module_exit(MCBSP_exit);
' |+ V P- ]3 @: D0 q' D$ D) [. [6 _; T6 F( W" J) ~5 V+ a. C! l
MODULE_LICENSE("GPL");% }5 j; n' g. E$ I
0 Y9 ]9 i$ ~* f3 v( p$ h; n我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ c! m1 c9 W9 p, Z# p% y
我的应用层的测试程序如下
4 ^- e- P' j: Q' ~. `* A#include <stdio.h>" ]+ a- r8 d8 Z+ E0 C/ m
#include <string.h>1 A+ z/ D* k, g! D/ {
#include <fcntl.h>
+ j# `5 k. y9 H7 m#include <unistd.h>) ^, j- S$ o- E
#include <signal.h>' W6 b0 z# G- |
#include <pthread.h> //线程0 a. b5 e! o/ s. I; Q& {, j$ C
#include <stdlib.h>6 W; Q- a, {- g9 R9 ^$ ]
#include <pcap.h> //捕获网口数据 Y( g" u9 t5 \- h7 y$ c; w
#include <semaphore.h> //信号
* q: L# c9 W0 Y& y1 |1 f& }#include <sys/types.h> //消息对列
+ W- I7 n0 r, T2 e0 o+ i#include <sys/ipc.h> //消息队列
9 N% F6 T$ M, i/ J& ~- k#include <sys/msg.h> //消息队列9 u3 D( a$ C; _9 K( N+ N7 ]
#include <sys/select.h>0 A6 r8 h# g [* g) I
#include <sys/syscall.h>
) p8 x1 s* }: Y( [; t( F3 y- L: V#include <sys/stat.h>5 G; B0 c5 W3 b) e& }( ?
#include <sys/mman.h>+ i9 e% r. q0 M- `8 p' o c
#define msleep(x) usleep(1000*x)
8 s& S4 m& ?; v O- X! _
8 ]# Q$ k; s Y' i5 i, A( Pint main()3 } j5 Z: \. p( ?: b
{
2 c* i( M, E- S% p. L //MCBSP,ARM与AMBE2000交互设备8 [7 _; I5 ] v9 B
int fd;4 f9 w) N' s8 q( t- A. I
unsigned short data_write = 0x5555;
' z$ r* `8 H) t4 k" R0 Q unsigned short data_read = 0x00;; p( q- \5 m+ p! s: Q/ @! w
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) e w! x: j0 ^4 _$ }7 t- K
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 r& U/ L1 K" j+ G
4 [4 b- I' E+ H' w6 ? if(fd < 0)
. Z8 V% I* p( D% K) A2 U% K {
# y) {& Y2 Y/ { perror("open failed\n");# S; f. B6 a# K6 u6 T5 k/ a9 E0 t1 V
return -1;
- Q- |8 q3 _! e! g1 t }
. ?( w$ K, A, O: _1 h- m! P 9 {3 y4 F8 E4 P
while(1)& s1 K3 p, p7 R, {& M0 |
{
+ h0 k9 q# `" D& R5 I" @ 2 U6 o" |4 L1 u6 }
//AMBE2000每次读写是24个字为一帧) \! z( `/ A& j) H
//写数据时将数据在底层存储起来,等到中断的时候再发送
4 Q, n+ z3 d7 b+ m% }5 {/ y9 ?4 f+ i //AMBE2000输入数据是以0x13EC开头的
. ], y, \4 D' C- J$ O6 y+ f1 E write(fd,&data_write,sizeof(unsigned short));
6 g, p3 ~# m5 ^2 d
, w; `/ \# g4 [2 ?- z) N //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 , _6 n' ?$ n7 h8 c% ^
read(fd,&data_read,sizeof(unsigned short));( g0 U3 j M' ?' H6 r
0 R8 G3 Z( E: Y! G6 S, T! M if(data_read == 0x13Ec)
6 b, f: Q0 M2 j* p {1 Y) Z! E7 h4 B7 |% q
. \/ x# x' u7 Z* z- { printf("data_read = %x\n",data_read);0 v: ~6 w, o$ ]) ]: O# e3 S
}: E. ^* S, f7 k" [8 B$ J7 Z
6 W+ o5 k3 o- a msleep(10);, D2 I; a" Q' P1 h) ~; L T# i8 w- `
5 d/ Z. ~5 p% H5 X5 X4 L* l$ _+ e& Q /* o3 m' ~( y$ I0 ?+ Q5 F. F3 E
ioctl(fd,1);
0 ? N4 W! q" U& u: Q- c" e: c2 N sleep(1);/ P; S1 J- Z, ]! E
ioctl(fd,0);$ G! ]/ r- |5 w4 z3 R
sleep(1);
& ~3 L, S$ W% ~, c! X+ @ */
7 u% K, o" m x2 P }
: ?* B6 a. F" ~5 B3 Y return 0;: O: k* r1 E5 r2 G" a
9 s. c! ?8 P p% X! g3 g$ Q/ H}
5 z% R: R) l! `! ~9 o4 h3 k- S6 J y5 H9 F
多谢各位指教,谢谢! 急
. d* P$ P, J0 w u( R2 i" ?' M* M
& k8 g* T0 I5 L6 M6 x. E& N- p' @7 j; u6 }- N
, c( a8 d4 x' J9 _. q
) n/ h( R% _2 `: {. ` h* H |
|