|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 t3 p% s; }- e; ^( k0 u
/*
( Y7 A( [/ o6 U U+ g4 k! @. j V; ^ * Copyright (C) 2009 Texas Instruments Inc
* \/ g; g9 m9 r1 k' J *
8 H, ^) x8 W9 A W2 X) u" |1 N * This program is free software; you can redistribute it and/or modify
6 w, |- i- X2 s * it under the terms of the GNU General Public License as published by B9 |9 r7 | t; \( o& D4 C: r, z
* the Free Software Foundation; either version 2 of the License, or
5 z, E* [( p; k: a4 }0 i * (at your option)any later version. E! i! Q1 N: h+ ?! N6 c. a
*3 v, [9 G' Z) p+ m/ ?6 X# O
* This program is distributed in the hope that it will be useful,$ N" O, v# [0 a) |; t9 K0 b
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ N# J% W. G8 Y& N" a8 H0 K4 @; A* e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 q0 F; _* c" x1 w * GNU General Public License for more details.! p: w! Q3 Y1 X- X4 G6 R9 f
*, O( ?% J1 Y9 @
* You should have received a copy of the GNU General Public License' c, E; B U/ J w8 J% B
* along with this program; if not, write to the Free Software3 V3 H, z! d8 x8 v4 R
* Foundati
b$ }* p; N" A9 Y) u*/
5 c$ p* ^0 g- I) s' o, a0 t#include <linux/module.h>
/ i% n, L+ i' Y" f( E: o% Z#include <linux/init.h>
+ e" X5 F6 G" P( X#include <linux/errno.h># {7 F/ T) T) _0 R
#include <linux/types.h>
; O' O) V) @) y" F* E! _( B) G#include <linux/interrupt.h>
$ S! w* `1 u. _; t+ H! g1 }" d% C6 F#include <linux/io.h>
' m+ a3 N( }1 b#include <linux/sysctl.h>% f* w' @1 q R8 N6 A
#include <linux/mm.h>
K9 _1 D2 M3 _+ W#include <linux/delay.h>
2 ]4 | a) T' @5 _7 ~, n5 ^#include<linux/kernel.h>4 H6 S8 i+ u z2 l% V0 n/ m. w) q$ w
#include<linux/fs.h>. f, m4 }6 I" h4 @" b
#include<linux/ioctl.h>
8 D+ a% o& e) [) M p+ } k#include<linux/cdev.h>3 J- `% o% O+ p4 s# I; d/ ?
#include<linux/kdev_t.h>
% @+ R: S+ B) U5 I#include<linux/gpio.h>0 o1 K6 f/ X, E* J- X
#include <mach/hardware.h>
% @2 I! G: h4 [/ b#include <mach/irqs.h>* e/ _9 [( x8 W% X4 x( J* M+ ]
6 T. Q3 |' n( q P
#include <asm/mach-types.h>
5 j- B: l- I3 [6 L6 \, @#include <asm/mach/arch.h>
/ Z6 t" O8 e& h6 ]( H7 ^#include <mach/da8xx.h>
+ E9 g" d1 F- q$ d/ p7 ^#define SYSCFG_BASE 0x01c14000
0 f9 e3 n) c, y4 t#define PINMUX1_OFFSET 0x124 0 [5 B4 F8 o' v, |: \3 {5 M; _) c& C' Z0 Y
#define PINMUX18_OFFSET 0x168 ( B: U8 K. s ?1 F- A+ B
#define PINMUX19_OFFSET 0x16c2 ?4 l6 @ @5 q0 w7 a; A. x/ x
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 l. s# ~6 D) L5 Q#define RCR_ADDR 0x01D1100C //MCBSP1_RCR; c$ v. h3 h5 W- `# f
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
. v5 b. K# c+ x, ~+ p* F2 N#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
' V" P* _7 R/ V# } P% i: k4 Z( Q1 k; G#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
# n, r8 e) W f% H/ g
5 }0 G; [4 u1 x' H0 f4 f#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
4 k5 B* y! V4 A- a#define DRR_ADDR 0x01D11000 //MCBSP1_DRR& \* W! G# H$ ]2 y' ]7 h& z: q
//PSC. b! [5 Y( |8 u5 G) f, a. L
#define PTCMD_ADDR 0x01E27120 ! ^/ ]& @7 z* X3 Q+ H
#define MDCTL15_ADDR 0x01E27A3C8 J+ r F4 I* d6 h9 J4 E
#define PDCTL1_ADDR 0x01E273048 X; g8 ^& O# b" K5 W7 M- B
//GPIO8 direction
' l" t7 G5 l; N4 n- q1 V#define GPIO8_DIRECT 0x01E260B05 t: d6 I2 Z5 l
#define GPIO8_OUT 0x01E260B44 O4 ~- T# n' v
#define GPIO8_IN 0x01E260C0& [9 S% R! q/ t7 y9 y
9 U! p0 J0 _& e# P! T) F4 y//#define MCBSP1_RINT 99 4 |" m$ z3 `# j* r% l+ t! s4 \3 u
//#define MCBSP1_XINT 100
" @# i: Q. Z8 k& @, f$ @4 qstatic int MCBSP_MAJOR=239;9 N- G$ R: ^$ I# U( }5 e% k
static int MCBSP_MINOR=0;
" z3 y# H" ]) @3 C/ g3 Q7 istatic int count =1;. K1 v$ I4 I# }4 y. T" ]8 l% [& a5 u
( f% f* [ d! ]+ \#define MCBSP_NAME "MCBSP-device"8 A ?1 K0 G& e' l; b# v/ j
$ a; t1 `/ ~% E7 s( w9 P
static struct cdev *mcbsp_cdev;
+ w5 n5 S' l- e' i+ i" X; xstatic struct class *mcbsp_class;
1 y' l8 y I% D" K7 Lstatic dev_t mcbsp_dev;
4 y. K& b) Z' I' W1 L Q) c; r- gunsigned int DRR_data;
8 a* F. P! A4 w. N2 H& z2 V. C$ Ounsigned int DXR_data;1 `5 A) Y5 C3 I5 s S/ a3 v1 W
static int mcbsp_open(struct inode *inode,struct file *file)/ B4 `4 M) o! d: v3 }8 |. Z
{ \8 h/ E/ ~6 `! {% o9 ]* `
) s) t5 m6 ~7 Y# J/ _ U0 ^
//interrupt enable,initialized
. h8 p8 \1 e* M/ [1 G unsigned int temp;
/ u1 W/ j" f9 u$ M* ]5 z5 B3 e //SLEEP_EN(GPIO8[10])---05 ~( Q3 \4 H& w8 H6 H( q( I
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( F2 m+ I6 ^0 D$ @' x
temp=temp&(~0x00000400);
d! F: ?2 g! N __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" T! L: O l! S
//RESETn(GPIO8[8])----0----1, N( |9 p5 @/ [" T6 T" n2 M8 z# M- i
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ |9 J* z4 y3 w+ u
temp=temp&(~0x00000100);/ O3 s |9 r' s0 t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 u, D5 x0 u2 X6 ]4 _8 _
udelay(100);
/ f0 d! e" P% V! o' q) x, j temp=temp| 0x00000100;3 E; m( g. X# J: z! S
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" o. K+ M2 G8 p6 O udelay(100);
/ r( w+ H3 J4 t printk("open success!\n");8 V9 I% R8 K, f4 {! t) \
return 0;
$ k: v$ C' V# c; q# i+ o# w}; _4 p+ X3 s2 S# b! F
3 v# j( [: L8 g3 O( Q
static int mcbsp_release(struct inode *inode,struct file *file)
2 y- {+ @; j' G2 f{$ R# U7 e4 M8 X8 u4 J! N* H
printk("release success!\n");5 @7 n, G: C% O" V! @ R; T
return 0;
, O2 a; n' q+ Z4 y( f}
2 a/ t: w. p4 \* V% J/ w w
. B! o/ X7 c1 a0 O& Y- cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 ^. n1 a8 d6 n& h0 A$ D
{
0 f5 _4 P- o' Y* ` copy_from_user(&DXR_data,buf,len);
6 m5 `' c/ `* p: F/ H2 F6 [% C iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
2 p/ u. B. x+ S* x& l# e( \ return 0;
4 U3 s6 s0 e0 v s
: Z. O) _8 Z" O}# ?3 S% E* l4 a- {# H
% k. k! E; \+ j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 e ~4 M4 Y1 z/ }
{
) _1 b' k0 R. G DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( @, t; ]- h [8 t& P% [
copy_to_user(buf,&DRR_data,len);
+ } Q! P- c; F return 0;+ P+ b2 p8 K# q" o/ I
}/ f7 C J( r. k* G$ g5 ?2 `
# ?% e7 k: z. Q2 w* W4 Z0 t* E. T/ A. H- t a; L2 w
static struct file_operations mcbsp_fops=3 ?# e8 N, |; o) ]/ u
{ }7 C* N& U! R; r' U
.owner=THIS_MODULE,/ M( U7 Z. g2 U0 o/ d, l6 A' d! m
.open=mcbsp_open,
" H' I: I1 t( W .release=mcbsp_release,
- D2 W) ?3 ~' s .write=mcbsp_write," Z+ }* M/ f. P) N" F
.read=mcbsp_read,
# D; j$ l) H$ ]3 S4 i: c};: U) K) h6 v% ^) `5 D( ~3 l
static int __init MCBSP_init(void)1 ?0 O" F% J6 }. q7 g j; r
{
5 T- |( h+ C5 _1 C$ R int ret;
; ]- G' x- k9 T y( C; \5 H" b unsigned int PINMUX1_REG_old;
: ?4 M9 [* N4 @2 y) v Q: g unsigned int PINMUX18_REG_old;' |. v0 I4 i R. U2 f( m
unsigned int PINMUX19_REG_old;
% N& Y+ ?- c3 K6 L, e unsigned int temp;
: M0 R% g6 N/ s: l if(MCBSP_MAJOR)5 |8 T: i+ t5 _! X, j( g/ L
{
& S% J+ ?2 d& q* a [7 y mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ e0 P6 G g5 c6 V" L* [+ [
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' ^+ z" E' z h
}
- s9 p% W& Y/ T# S7 |% E% E/ f else. @$ k/ g3 D7 O& O/ A3 u/ J
{! V6 Z* ]/ ?3 r1 x. A- S
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, G2 \/ T& }' E6 \* w
MCBSP_MAJOR=MAJOR(mcbsp_dev);6 F v; W c$ D; \" h
}
4 o9 s7 h. F f6 K+ W , s* x& r& B* o$ T
if(ret<0)+ D4 {3 u- k7 u9 c
{
) X9 N! J6 J0 R0 Z4 I L printk(KERN_ERR "register chrdev fail!");
! U& n0 G* @5 v/ N return -1;
8 x) A. n( h" p% J }
" S- R. O: V% Z8 E Z
F# L5 l( _) K ^; Z& z+ `2 W mcbsp_cdev=cdev_alloc();
- j& A' l2 [' j" A 8 @9 [3 t2 O" L* k, Z+ s- d* E
if(mcbsp_cdev!=NULL)2 b7 h3 B; \* T1 K6 E
{9 q) ~. m4 x" h; W7 u% Z
cdev_init(mcbsp_cdev,&mcbsp_fops);7 x1 \; u6 ?# }) Q* L1 k- e
mcbsp_cdev->ops=&mcbsp_fops;
% d9 b( M4 ]9 @# C+ f mcbsp_cdev->owner=THIS_MODULE;4 B) i8 |0 z; V( z9 x
- Q' o' _) ]+ d1 r if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 q: b8 ]' e2 G, |, F& I% r
printk(KERN_ERR "register cdev fail!");% D6 D7 r2 p$ d/ r+ i
else
- I; I' s$ t4 r* b printk(KERN_ERR "register success!\n");
$ k2 o$ s9 v; P- @ H }: f. [0 J4 l' `$ R {
else1 b& U0 P a# n0 d+ p y7 }+ }
{
4 H8 a \& E0 m5 x) } printk(KERN_ERR "register cdev err!");6 c# u; J6 T- W& ?
return -1;2 w1 U: ^2 ?/ x8 R0 A8 o- T6 ~! D& k
}+ L: e& H9 u! S
( b1 L- w% U; K# ^' ? mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& g( |; E9 `* u* q( I P! V) T
if(IS_ERR(mcbsp_class))
; |, _: f! l2 |4 y {
* q3 E' N# \7 A5 l printk(KERN_ERR "register class err!");
5 m2 b! ]. Z8 L3 N5 | return -1; Z1 Q) p" O+ V2 t! D; v
}/ \" d S0 X0 y3 \2 A
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! n u. o% L3 c* A. i8 z6 n1 S" E# T/ ?, E9 u2 F |6 z& @
//PSC
8 W$ w; ~: ^/ Z //add Enable MCBSP
2 C9 m* C4 h( B, G$ e3 G! n5 L# J8 S //test
* C* x' g/ i% \% t3 m temp = 0x80000003;. p4 [# k; _ y/ d
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 P1 m" t3 p1 g. B) a temp = 0x00000003;
& _: [ V+ p6 a writel(temp, IO_ADDRESS(PTCMD_ADDR));" S" n. m$ {/ Z/ v0 a# C
0 ]. n M& m4 H4 D( W. y
temp = 0x001FF201;
* V r/ B( j. \: I5 n( w# @ writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ Y+ [4 n7 U/ X- ? ) g+ v4 C- B! i5 g' n! C- X: i' ^
//PINMUX 0 m4 e! @: g9 U( s3 C
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 E% ^: ?; t4 G( ~; v" ^, x
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 p% W( P0 R7 h2 P3 i- s PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
" ?( ^& e9 r# h( t+ _ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 T+ b7 _% z3 b4 [; D
. B8 {& o1 ], y3 ]! y1 { //SLEEP_EN,EPR,L138_SHK1,L138_RC
' \& ^. h$ |$ \8 m6 ^" M+ e2 O PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* z; l; M* a4 _( V% k6 E PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; # z, @/ Y8 I3 y) J! I
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); r( `& E& _. i; j0 Z, ]% `$ |
" f# |% t8 `. w1 k
//RESETn,L138_SHK2; v8 s4 p; S, p/ d
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 P- b7 ?; i0 G PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; , L/ C+ { J- X1 G
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 u! U1 T- }3 ]7 D7 v! D. P
0 w% A7 I" T% D1 L; P$ c) n% _
4 c! z( C. K0 F% V. F
//SPCR Register
; H4 a: Y U$ z/ d! ~) m) \0 i //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ l5 B5 S. r$ b1 T- D5 r5 f temp = 0x03000000;//(DLB=0)
) J7 u b7 Q( k3 H. }# w // temp = 0x03008000;//(DLB=1)
9 E, ?: h. Q5 Z& F) n2 j& [$ q, y writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ W& w8 P! f% r, c temp = readl(IO_ADDRESS(SPCR_ADDR));/ u P# h. A/ ?! z
printk("temp=%x\n",temp);
# \8 V! m, M) u; e- w* G 7 x, i2 L D' ~" ]% v0 g
//PCR Register
7 Q6 q; g0 q# V1 i //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! x1 H1 {& c& g$ H% ]
// temp = 0x00000F0F;! \. @& p3 ?4 s4 W: b- y
temp = 0x00000B0F;4 y6 I; ~; L+ Z- k& w; w
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ' }+ @& M% s0 J. ?: u
temp = readl(IO_ADDRESS(PCR_ADDR));
5 O N4 L; n$ Q( H# s4 v printk("temp=%x\n",temp);
5 Y( G. W2 W' q: U //SRGR Register5 |3 p7 A" l7 n: m! a
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( B U% {/ D, `+ }* `+ z
//temp = 0x301F000B;
c8 V' X. ]/ m. ^ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 2 s! I: _) l* m/ W p
temp = readl(IO_ADDRESS(SRGR_ADDR));# @* s6 p+ V; Q4 x" Q3 m
printk("temp=%x\n",temp);
+ R7 ^5 C( [: T( j4 Z# Z4 I* k //RCR
1 x4 ~8 K% X6 Z Z1 {8 [) _ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
$ ~/ t: e8 W3 R, b, j //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
7 L1 g1 u" V- a* n) T temp = 0x00440040;. x) l0 A$ M* x4 B& P
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
; p' M" e, t. a5 Q: v temp = readl(IO_ADDRESS(RCR_ADDR));9 w4 [3 m8 O; v+ ?- u
printk("temp=%x\n",temp);
' r' J- ~' X5 K9 n4 B& C //XCR6 o! j% _; k* e. p% {
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- q3 \. F# Q- ]- l
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* |; S$ B( b1 [0 v! S. N; q4 B
temp = 0x00440040;1 ~7 i4 A, C, \3 M* o
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized * E+ e- |; M. w4 M% U
temp = readl(IO_ADDRESS(XCR_ADDR));
8 B$ @: g) K, }) R9 r* ~% @6 c/ ^, g printk("temp=%x\n",temp);
6 s3 {2 x1 p' x4 \) u2 l5 C" M' ` udelay(100);
. V" k" l3 m) [& _ //SPCR Register; U" \& P& o& G' H' H5 p1 A
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( b1 G6 k1 x& H8 B: d8 @
temp = 0x03C10001; //DLB = 0 VS DLB = 1
" R3 R, L+ S" M" s) \ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled1 ?' `, F3 f$ H9 t) ^$ `1 o
temp = readl(IO_ADDRESS(SPCR_ADDR));
* D5 p7 O# X6 b, R# h" x n/ H printk("temp=%x\n",temp);& V! ~2 G4 Y) {+ a
udelay(100);* d. }2 V! ]1 ?- v
- q7 I* ~' m+ |' o //set GPIO direction
5 | b0 l1 o" y$ F( ?. L temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 q0 \6 v/ X: z6 R) ~" g7 p temp = temp | 0x00000100;//EPR----input
) I* k+ T# }; R temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 P! H% D J/ H8 t A. `8 {9 h8 U __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " s& O6 F; y8 S" u+ o ]% k
& t, h' v2 a/ g% w9 U8 A, c# H" `
return 0;
0 [# Y( a3 @9 m}$ o3 ^7 R9 X$ q) ~+ B) h8 m
static void __exit MCBSP_exit(void)9 J; I% N; c. R7 B, R
{
* ?. C0 ~5 M$ r& U& w& R' `) H printk("mcbsp chrdev exit!\n");0 F. _2 z$ f( A5 l3 |4 b/ U
cdev_del(mcbsp_cdev);
# r' I9 k( ^$ z7 z( H unregister_chrdev_region(mcbsp_dev,count);
1 j0 L% u0 a* f- \& k7 B& O device_destroy(mcbsp_class,mcbsp_dev);5 J, i4 d+ W. q
class_destroy(mcbsp_class); v" |% q+ ?& j: M
}
! h0 J9 b4 i' o5 x, D1 Nmodule_init(MCBSP_init);
! W0 ]( W2 ~$ P- ]0 j& R8 G: ~module_exit(MCBSP_exit);& j! S |9 X( ~/ }; O9 g1 o
+ t9 y5 }" ]& \ {/ J9 d
MODULE_LICENSE("GPL");
& _" |* ]: X" ]! b) C1 w
3 }& s4 X# f/ {9 ]% Z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! P+ ~/ \) X# o) x$ ~
我的应用层的测试程序如下
$ ^4 E+ l3 _1 u#include <stdio.h>
7 Y) y- [2 {1 z c% s1 C7 w( X#include <string.h>; u3 ^" U2 O3 j+ s' @. ]
#include <fcntl.h>
; r3 O$ b6 w& U) s% ]" u" ~#include <unistd.h>9 e0 _1 c( t& c- G2 D* i9 t
#include <signal.h>
& E* R3 k$ S3 q: P! E. t1 U#include <pthread.h> //线程
1 ~2 s# V" ?: l1 N: P1 }#include <stdlib.h> z( T8 s( p, G
#include <pcap.h> //捕获网口数据
`2 P3 x9 t) u# u#include <semaphore.h> //信号. r) @; a. N' X" W9 N5 m; h
#include <sys/types.h> //消息对列$ Q/ ~2 @4 P x* _% G9 t, S
#include <sys/ipc.h> //消息队列
9 R* @1 }' R) p5 F0 M( J. N#include <sys/msg.h> //消息队列8 [+ |7 {$ b' Z& P
#include <sys/select.h>+ e8 a4 q% \, y. ^% [
#include <sys/syscall.h>! G3 `4 d% ]( F' }9 R* _* w `
#include <sys/stat.h>
" P; _: Y: i9 s. s1 d1 l- v9 C#include <sys/mman.h>
i; c; s0 Q. b4 ?/ X3 ^/ \#define msleep(x) usleep(1000*x)
L- N+ Z5 ~4 v# s' F3 K
* U7 c7 n- e( o [6 ~4 f7 p3 G3 Kint main()9 \5 s* s1 D2 J
{
+ }! G% O. Q1 L1 K' c) L& Y //MCBSP,ARM与AMBE2000交互设备
7 {# n$ m4 e# G$ G int fd;. e; c) F! m8 ^2 y; j
unsigned short data_write = 0x5555;
9 Q Z- j9 N' [7 ~" {& K1 ^ unsigned short data_read = 0x00;
+ s5 W; U8 a9 O6 h8 S& @ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 \. Z/ y' I; `6 l- q2 m
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% {6 n% v8 A/ s
* ?/ J( @ e2 f if(fd < 0)
4 |% q0 s8 f3 C7 N: {! E+ s9 c {
; C' T) R$ \/ U. J perror("open failed\n");
) ^5 i/ c' I5 O# H return -1;
9 N9 b l1 b. ~ }9 |: m% B3 T9 `2 }' O) c, j9 p
* R1 O& J! S1 A* U
while(1)3 V7 a7 b, n0 W. ^
{9 n+ j' Q6 v, o, \. K
6 T6 @5 Z! m! i# x
//AMBE2000每次读写是24个字为一帧: W. I$ V7 S' S' N( z
//写数据时将数据在底层存储起来,等到中断的时候再发送
) t2 ^3 U' d u) a //AMBE2000输入数据是以0x13EC开头的
3 J. X5 s0 B4 o" n. O4 ~# `1 } write(fd,&data_write,sizeof(unsigned short));/ _9 q* r* d8 e
4 Y0 c6 C5 O( x I //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 M7 l2 }7 u, A7 `+ H# Z" g" x
read(fd,&data_read,sizeof(unsigned short));
! G$ D7 l# z, o* p M" T) p2 F/ v3 ?" x5 T& W9 n
if(data_read == 0x13Ec)
& V, |7 B& I& s! X# D {- k% m1 o- a/ Q; t5 W3 w
% R7 u3 x3 R% u9 _& m- G printf("data_read = %x\n",data_read);0 S( ^+ E1 b K! y! p4 J
}; a. T0 k9 w; U/ ]
( \/ q5 y8 y. K1 U
msleep(10);# G& O0 M/ ?8 k5 z" H! W9 c
/ c% P) n4 s& q7 X
/*
- s0 S& c3 m9 J/ o ioctl(fd,1); 6 U0 a- q7 N7 N! Y
sleep(1);
( t- G' v& m- k; y) @ ioctl(fd,0);: k) `* k% c" M7 c# X; }, S
sleep(1);) H$ U3 ^. a$ T- |. N; R
*/ 5 G9 B/ P% b) Z* |! A1 B0 X
}
1 e) ^9 m9 C: {9 O1 B# ~/ R5 } return 0;
3 L9 M; X+ U$ [7 R / L% X5 S3 o& H$ S
}
/ H3 Q% r! C8 q1 K
0 D# |$ o% r8 k9 ]+ n) W. @' b多谢各位指教,谢谢! 急
1 q5 q& Y7 z% a0 W3 M) U( C3 C
) V. }: C1 G8 b; |# r! a
" [( @! ?& ?5 k5 v$ a( R% m
! T J9 Z- s4 R0 Z
1 `0 `9 ^: k. z0 X) Y |
|