|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ O/ p2 N+ {' p8 s/*' j) A8 g* G3 k
* Copyright (C) 2009 Texas Instruments Inc
9 o1 y" P& G+ J, @; f+ x* T" }" p! u *
! K }6 B Q. b! M * This program is free software; you can redistribute it and/or modify
" J2 U4 z; p( `+ V, [& q$ x * it under the terms of the GNU General Public License as published by
/ @- v3 Q% s! t/ `) @' _ * the Free Software Foundation; either version 2 of the License, or+ T2 ~ W- z4 y# Q% F6 ~4 R! i
* (at your option)any later version.
5 y' Y: b& _6 E* L *- n X" l& _4 O
* This program is distributed in the hope that it will be useful,7 [! j% l8 L2 N# G( S+ w9 n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
) A& B! l, F" `$ P+ f; m6 j/ u * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 ?: T/ j9 I I. u. u5 H: a: _& u' a9 p * GNU General Public License for more details.) h1 D% F+ `' }! O3 s4 x# ]5 l; q" \
*
" `0 k1 f4 P1 j * You should have received a copy of the GNU General Public License" ]) m, X# R$ u( `9 \9 v% d
* along with this program; if not, write to the Free Software. E" z+ P. |) `
* Foundati: M! V* M0 ]" f( p1 ~ j
*/: [" U1 v- N( x# ?
#include <linux/module.h>+ W9 D- m5 F; E
#include <linux/init.h>. x& c2 {8 ?9 H# G: w3 y+ p
#include <linux/errno.h>
6 z) l) q" E, v8 r+ r; B) l6 s#include <linux/types.h>
5 V$ c: K& d, Z#include <linux/interrupt.h>: c& E4 t; u, k' j
#include <linux/io.h>2 M& C( ^4 |# N4 k e/ n
#include <linux/sysctl.h>0 w# p& F4 L8 O& p9 w
#include <linux/mm.h>9 | k3 A4 R8 T; `" @9 H7 ?
#include <linux/delay.h>
$ p4 r8 E' I7 P#include<linux/kernel.h>- e4 r2 X; A3 }7 Z. v8 Z% W. [
#include<linux/fs.h>
% |, Q: R: T2 Y M/ T3 q- s#include<linux/ioctl.h>+ D8 \5 T3 q/ u' R- I4 j! Q
#include<linux/cdev.h># w9 {& [; X% z
#include<linux/kdev_t.h>
* Q+ i% O( V# u4 ]2 W% `" f3 V#include<linux/gpio.h>
! _0 Y- F/ m5 H, Q. ~#include <mach/hardware.h>
! H, }, F. K8 G) q7 k G#include <mach/irqs.h># u) u) N2 i ?1 Y& ~
8 M0 ]5 s( ~7 R; [
#include <asm/mach-types.h>
8 M$ y& C @# z7 ~#include <asm/mach/arch.h>
/ `; T) l6 H& E/ J#include <mach/da8xx.h>
2 M. {2 s$ T: T8 @) Z% q#define SYSCFG_BASE 0x01c14000
" d) I5 o8 c- O h8 Y0 K#define PINMUX1_OFFSET 0x124 8 y$ f% _: `0 o q( Y
#define PINMUX18_OFFSET 0x168
/ a( |; N! [/ v9 p1 m#define PINMUX19_OFFSET 0x16c! |5 L# y( `7 G% {. `% ]' {* H
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR# G V0 r, Y" e) d1 o. z
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 Q2 C$ `* O: d$ r6 f, q9 u* e#define XCR_ADDR 0x01D11010 //MCBSP1_XCR' T( O7 [2 {( \; F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
9 m! j1 f1 t `4 e$ c#define PCR_ADDR 0x01D11024 //MCBSP1_PCR% ~: ]" n" r t( g! h1 V: v9 A
9 J. k/ }: u# q" }3 ~
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR! Q- G, h; w5 `( x$ W8 M0 D
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR( L4 b1 F9 G: ^: f# p
//PSC
9 Q# p" K+ j' F* m" E% i! e#define PTCMD_ADDR 0x01E27120 1 b# q5 P d) i1 I$ E/ d7 J1 R8 F: Z
#define MDCTL15_ADDR 0x01E27A3C
. r! N* e3 y Y. [#define PDCTL1_ADDR 0x01E27304: d: L* E; [% q1 q
//GPIO8 direction+ D$ A/ x- P, L* y' b& |: q
#define GPIO8_DIRECT 0x01E260B0( V) J5 p% j# V% c$ n
#define GPIO8_OUT 0x01E260B4
, p; H* j& I) N* g# L2 o#define GPIO8_IN 0x01E260C0; M) F. T% O+ ]) R; X" U
9 {+ Y' _( y/ N4 [- J/ m
//#define MCBSP1_RINT 99
, m1 D; T" X- n* L//#define MCBSP1_XINT 100
9 Q! W7 O1 F, R; c1 g) ~static int MCBSP_MAJOR=239;
% v- X' b2 T; m4 [& l3 z. @: k# J6 astatic int MCBSP_MINOR=0;( \3 ~: o- c( Q. p& }
static int count =1;
9 g* D4 U! k1 u( v" F8 n: B; d* _# {$ P- F- Y" L
#define MCBSP_NAME "MCBSP-device"
# P' L7 I4 A1 b* w
6 P; m$ M9 j% c# B3 @# Qstatic struct cdev *mcbsp_cdev;2 H4 G5 t/ ^/ q B
static struct class *mcbsp_class;
+ H( K2 e3 H, t6 I" l# Dstatic dev_t mcbsp_dev;
6 r* b* q& t3 h( Eunsigned int DRR_data;
" R5 I d1 e* \; B6 k: G7 Gunsigned int DXR_data;
5 W! s5 J6 b) \1 h! d& o1 Sstatic int mcbsp_open(struct inode *inode,struct file *file)+ h% |1 R% y f- }; N v
{
: J- R. {1 R% @" L* g! |
( b5 `5 n, }/ ^3 C" a P //interrupt enable,initialized O( x1 k6 ?/ w) o
unsigned int temp;( b3 c0 j7 \3 a* j6 U/ [
//SLEEP_EN(GPIO8[10])---0
: ~2 s. @- O1 {8 O) A& o9 n; B temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 t/ h5 l& k7 c! z
temp=temp&(~0x00000400);
3 [ D/ Z/ b/ X K. Q: {* ^ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" S* v6 z4 s' c* r) P //RESETn(GPIO8[8])----0----1
+ `3 \8 Q% H; k; E _2 s temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; v, i, R, Z) A5 G2 `4 u temp=temp&(~0x00000100);3 u j5 j3 L( h8 ]& p
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---03 Y+ J! S1 i* ]( C3 Z9 N- F. d
udelay(100);" O; d1 h1 {6 v& g2 x
temp=temp| 0x00000100;
* l2 K$ h2 l4 C4 q: r __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---16 n& E; h1 n3 o5 \6 ~
udelay(100);
6 w& z$ p: |8 P+ S6 w printk("open success!\n");
- P; A" s8 q* {2 `' a. x+ @; d4 q5 E0 X return 0;0 R/ _: D+ C- L, r/ F
}
1 _1 z: m2 _# h6 w1 v+ N$ T8 U* G* x) D% Y
static int mcbsp_release(struct inode *inode,struct file *file)
* ^ S9 e1 t. ~* E3 K0 s/ M{7 S( u& @. S7 o
printk("release success!\n");
; G! L! M- a! r, Z, O return 0; Q/ G5 h. b% d( {( \
}
' S/ Z* Q& w7 K3 U# V, H
% Y/ @5 g) o+ gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
) C! ]+ h" t( R! ~/ n8 L{% B, L e7 r* K I3 i6 Z
copy_from_user(&DXR_data,buf,len);3 _; V( O: r; i
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
: _3 i& o0 d- X: l; b1 R return 0;* v- n+ A5 l4 r
2 T5 i+ o$ j. G/ k' u& W; g}
! C, K1 L: h0 T8 C! @' o$ W$ X+ U
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 t- c! } {) C' Z
{ 6 C1 f1 Q$ D. r
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
& B y. r: @' ~# g( p; q+ o copy_to_user(buf,&DRR_data,len);
. j8 @1 P3 }+ h) r q2 ?+ d return 0;0 {8 u1 w9 y V' X; J9 f7 }5 a
}
. H' ` H" m# D
5 z& B4 x6 x ~- H" i1 J6 W+ d3 n
static struct file_operations mcbsp_fops=7 q& H/ B7 N4 t- F& f
{
$ u/ u" W( H( x% f .owner=THIS_MODULE,; [5 r) K; T, S1 n
.open=mcbsp_open,
" j/ }% B, I; S5 `7 [ A9 x .release=mcbsp_release,
# o4 t2 Y: w* K9 O4 E/ w1 `6 D9 j .write=mcbsp_write,* o% p) ~* T4 j b: q7 f3 ]* `
.read=mcbsp_read,: V8 D1 e0 ]3 I! u, e
};" q4 [. _8 h& o! L5 D- J
static int __init MCBSP_init(void)$ x$ |1 L, e! h* R( L
{1 |/ |) w, |3 G+ M: X& C
int ret;* R; M* }, F* T( z. @
unsigned int PINMUX1_REG_old;
# |7 Q& w# D) m0 h! C9 q% M, K unsigned int PINMUX18_REG_old;5 m, l1 q) K9 p+ H O
unsigned int PINMUX19_REG_old;
% n" X0 d. q* M) d' q unsigned int temp;
8 P# B& j" k- n$ s if(MCBSP_MAJOR)6 X; h) V; z- i: g
{0 x& g$ d/ J0 P" H L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 v$ U+ i6 G4 Z6 m6 l3 m8 }
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 z3 \# y/ m" m; f; C% _2 Y
}# L# o: c7 g5 \! }9 C
else
8 S. M' T: c" Q) c* `) l {: f- s% N1 A3 {/ R" T
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% X+ C* ]* O% Q" C* `8 x, N2 O MCBSP_MAJOR=MAJOR(mcbsp_dev);1 z4 Z! V1 G8 z' g8 d8 m8 g% ~
}1 a( n: i! V5 ]: a- ]
7 V, ]' }: X5 P+ i: V8 J if(ret<0)
) b, ?1 O8 V! l# u8 e$ } u {
0 @! y! t5 i9 R) b! D8 [ printk(KERN_ERR "register chrdev fail!");
! `+ `. u0 W. _ return -1;
) n# x, s( v1 L' q1 N7 T }
1 y" W1 D) k& k" A* N% d( c5 c 8 ?" k5 P) F3 B8 f2 z8 x9 E
mcbsp_cdev=cdev_alloc();
- W' N6 P" V1 }( _# @
, R! G! \/ B( u3 j- W7 ? if(mcbsp_cdev!=NULL)0 B6 k) k# ? O
{
/ @3 t, N8 F0 H# a cdev_init(mcbsp_cdev,&mcbsp_fops);: L0 Z2 j- i u% F6 J/ `
mcbsp_cdev->ops=&mcbsp_fops;
# w$ I8 x! e( r. Q' U9 s mcbsp_cdev->owner=THIS_MODULE;$ B& d, _6 W$ m9 O5 h0 E% ~0 G
3 U" D1 y+ i# K+ h3 ]" @4 F if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 A' Y+ W6 J f, b
printk(KERN_ERR "register cdev fail!");
( J# ]3 x: m9 S$ Y' L else1 g. g7 M3 E! J4 u; z' X% y$ o
printk(KERN_ERR "register success!\n");
; \# H+ s! i+ h# {- L. R; h, X J }. H: p; L7 [1 `; _
else
0 v; _5 M- y$ g9 s! N" v {, n+ ~6 T7 z9 h- k* M) p$ `
printk(KERN_ERR "register cdev err!");
|" G; h2 X8 J" y% f. E return -1;9 }8 t6 l0 C; X
}) A8 I6 w1 x5 G$ g
* U* O# Y3 b7 ?" S. _) `% k5 t* C3 w' i mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 D( o' s* r! z7 p' L if(IS_ERR(mcbsp_class))# I6 H. o3 \3 _9 w! y
{& ?0 z. V7 {4 c
printk(KERN_ERR "register class err!");
! @( J8 k3 o' x return -1;
7 g2 L: G$ P+ e! l4 v }
% c g8 [( e3 [ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
" W, e+ _) Q9 x* y. a1 ?; l3 j& f: ?3 M5 `$ `6 E
//PSC: m8 t& v; U! N; R
//add Enable MCBSP
" D/ j2 l; |7 Z3 S- w1 [4 G. W //test9 n" L4 @3 j9 w% z" P* i
temp = 0x80000003;
; G6 I; ?9 T- W3 U7 m writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! H! |' `4 C" j temp = 0x00000003;
" q1 D f, D+ u writel(temp, IO_ADDRESS(PTCMD_ADDR));) C( n% |! k2 P
7 b4 x$ R; m9 }6 n3 r1 V8 b
temp = 0x001FF201;
) x F- q. S+ V2 \5 \ writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( F+ ^8 T) j+ ?8 |0 o
; T% L. G1 @+ B7 I, u* w //PINMUX % A, c7 F2 b# e5 R" X$ g3 q& A
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* D$ g) {# v: P- P+ T& B PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! ]4 _, F: D8 ~" A1 i+ s) c) }' Q PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) s% F7 _) u k5 d
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& r& S. Y8 v$ n
8 G" q/ | i5 T1 X& l, }. U3 A# ]. W, K //SLEEP_EN,EPR,L138_SHK1,L138_RC$ e! R5 H. K% W1 ?' ?+ g
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); / H* n3 \* R, B1 ^3 W4 m
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
+ l: o+ c# B7 ^8 m1 Y6 t1 ] writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' h0 @: U/ i$ k' s+ \* T( X4 b
& u' n2 i6 ]3 L5 h# o4 u: I$ Q
//RESETn,L138_SHK2
/ x H( N4 I$ ]* ~7 e8 r PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. H; l$ u) r, a6 w: p PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 3 O% q7 j# p2 K, x5 l- W4 r
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; s7 s, B1 s( S( @ C0 e
% q- s5 i6 c$ L
z% ?7 G4 N5 A4 Z& \ //SPCR Register
4 G/ @' |: {% ~; m- A //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 I" `3 o) M1 K* K5 `4 v+ X" E% D temp = 0x03000000;//(DLB=0)
. q8 ?8 m8 L/ Y6 _+ w2 } // temp = 0x03008000;//(DLB=1)" j* j! k0 K9 Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset$ _! s8 N! y/ g6 e" y( W8 B
temp = readl(IO_ADDRESS(SPCR_ADDR));' U8 I2 i% @+ b9 J
printk("temp=%x\n",temp);+ U: W9 w3 j, q4 f
. N7 t" c$ S! q% I2 U* M
//PCR Register) O) o3 _2 ^" P: [9 |8 w2 k1 V
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) ^1 G* u" F+ ~( A+ M, K
// temp = 0x00000F0F;
- i2 x N3 q1 G4 u* f+ l! ~ temp = 0x00000B0F;) N0 F: X1 g) s2 W3 M4 x3 Z2 N
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
# C% G$ T/ U0 S temp = readl(IO_ADDRESS(PCR_ADDR));
; s; e5 K7 X0 N6 J printk("temp=%x\n",temp);
" R/ b# m4 l- c; }( M. O //SRGR Register
9 I! o4 k4 z" S& {. \ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 z6 O, P4 @: b1 Q
//temp = 0x301F000B;3 N+ w5 @8 W8 N$ ~$ u
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
( g* [: g7 B4 t& `, Q1 V temp = readl(IO_ADDRESS(SRGR_ADDR));
' b: r" i/ d- \& |* M printk("temp=%x\n",temp);
* Z; K2 _5 J/ b: @ //RCR
; B8 a. q6 U1 F$ C) j! Q& m //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 h& J- u9 d, X8 N
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 [. m' z$ G x" v S5 C temp = 0x00440040;
' U/ c) C& P3 R" ^' @. n" W writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized , I8 v, g2 \7 ?4 }5 B! ~2 p3 G" e
temp = readl(IO_ADDRESS(RCR_ADDR));
# \/ p0 W& E: E W$ C, |- h printk("temp=%x\n",temp);
6 m2 s1 J e7 j9 G( n //XCR- v2 d2 m6 v% ~! q2 R
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& ^: v: Y7 k* Z1 j) r7 t, n //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 a* i! H3 v- ~ temp = 0x00440040;
: w3 s* m# Y) H. U& @7 q j writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 d' P7 b2 I9 J* P
temp = readl(IO_ADDRESS(XCR_ADDR));' l' I& Y; j& O0 R# T) ]7 J
printk("temp=%x\n",temp);
: s/ [! z1 W+ q2 E+ E6 g udelay(100);* M1 o3 |0 E5 H9 b
//SPCR Register" ]/ f5 D0 _. z& u4 V
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- Q( r( R2 A% k+ w' p% D7 T+ w
temp = 0x03C10001; //DLB = 0 VS DLB = 1/ R, G4 T3 f2 n2 ]. [1 U, M
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled) v: i" o8 S n- M6 K3 r
temp = readl(IO_ADDRESS(SPCR_ADDR));
3 K* U( {. h- Q: G0 D0 s printk("temp=%x\n",temp);
2 R0 c1 f( I; ~' W2 i+ z udelay(100);
7 p% \0 [! V4 l
0 j* O6 Z1 I; P: [2 q9 ? //set GPIO direction
3 {$ |% j9 q+ O% F: r& S1 m temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 e V; o( |7 c: l! H) G6 l1 b$ X% e+ E temp = temp | 0x00000100;//EPR----input
- ^+ G% Y7 I& ~. ?4 v8 h" r v temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 d4 j; b5 A3 ^: ~$ K9 f __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 ]( r+ f& k1 }) W) [" P, f
5 Y/ j" L* s4 e7 C+ t
return 0;$ P3 J! c; J2 k6 G
}
6 w, b( Y. d* f. k; z5 Z" bstatic void __exit MCBSP_exit(void)' q* j. C4 I D- X, q
{
2 [4 j R; u, ^8 ?+ K! U/ b4 C printk("mcbsp chrdev exit!\n");
2 a4 L0 ]5 {4 y/ d6 a: n7 g$ [2 t+ T8 H cdev_del(mcbsp_cdev);
2 H# k2 F7 O/ v; c6 V6 ]0 Y8 D unregister_chrdev_region(mcbsp_dev,count);
' I$ s& c, Q5 q1 w4 u; B+ P7 ^7 X device_destroy(mcbsp_class,mcbsp_dev);
y2 W' G5 X) ` class_destroy(mcbsp_class);
U; A1 J+ y+ [}
& H3 [5 @4 i% M2 G0 N0 i9 j# ^module_init(MCBSP_init);
- z; t9 {" f% b4 e9 j t; V xmodule_exit(MCBSP_exit);
5 {" I( y" B- g- E W5 F+ k! L7 R! H
& X c6 t6 C2 F$ s/ | nMODULE_LICENSE("GPL");0 F$ o; `( m, p7 H* ~2 r: q
1 G8 K& w: z1 N& g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, z" u& j: l1 i% q+ ~, ]) S
我的应用层的测试程序如下
0 Y+ ^" R0 n l#include <stdio.h>* Z$ ?" g, I0 O6 j, @7 H- h- s
#include <string.h>+ X# X! K$ B" M2 N4 M& e
#include <fcntl.h>
# R) b5 \. B: c5 l#include <unistd.h>
) L7 W; L6 k5 w4 o2 b! `#include <signal.h>- W, w& B; O. v: _
#include <pthread.h> //线程
+ K1 {2 N8 Y( ~+ c' R#include <stdlib.h>
% z T' h" ?! N#include <pcap.h> //捕获网口数据
1 J+ |+ y7 e# x5 Q0 W, H6 ]#include <semaphore.h> //信号% o# T! C. `5 y: o D$ Y
#include <sys/types.h> //消息对列$ u7 q" `7 r, [6 Y: O1 u# e9 u: m
#include <sys/ipc.h> //消息队列, t& Y# A. j* U& H( `4 s _% z9 M
#include <sys/msg.h> //消息队列
; t5 b5 T* h) z#include <sys/select.h>0 }& T* l( K/ y# m
#include <sys/syscall.h>( m. n5 f& O0 ?( j# I# P1 O6 e- p
#include <sys/stat.h>7 a1 j% v; M0 B# N
#include <sys/mman.h>
! L8 L+ T0 J- r/ j: ~4 R7 ]3 m#define msleep(x) usleep(1000*x)
6 [0 {2 I$ Y4 X- {( ?2 n5 n; G t# q) F: U1 {7 S7 f- N6 H5 y
int main()& J' Z7 q7 V! c/ Y
{ ) _9 E9 T N6 t# `/ r. I
//MCBSP,ARM与AMBE2000交互设备
2 j z9 R& r5 ?8 e- @5 Q int fd;9 {: e8 s C$ f( Z) J" s
unsigned short data_write = 0x5555;4 k7 A$ j/ ], j1 i; ~
unsigned short data_read = 0x00;" X) ~* Q9 r( m% B0 ?3 D1 r2 O
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, H* ^8 x# }" H! z4 P$ V! a" g9 v1 r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ x( ?% |0 z3 |! v" a
5 j" v- H& q {: Z3 r if(fd < 0)
) r) ?2 e' @6 J: M1 k {- e# g) P8 b; ]% z) C/ Z
perror("open failed\n");
$ `2 q9 H! S" z9 h! ~ return -1;
: l4 Z; N4 d+ k D6 c }
; l, {" R5 u" @. K! b# D
; c/ O ]( r* e- u# u while(1)
; F+ O1 \7 n# W5 B! R {: O" _5 G$ u& y- I
* W+ s. ^% k% R. M3 Y9 I w+ [
//AMBE2000每次读写是24个字为一帧! r1 \. z9 P# D* b/ \
//写数据时将数据在底层存储起来,等到中断的时候再发送3 @) @0 S( G0 w1 c8 E x
//AMBE2000输入数据是以0x13EC开头的; H: }+ O7 T8 O" w% M
write(fd,&data_write,sizeof(unsigned short));% [$ X, d4 E6 z* u& a
5 \/ s! h2 w0 u" c- `) j% c& V //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 % Z$ W0 C$ X3 Q C6 r
read(fd,&data_read,sizeof(unsigned short));
3 D4 q- z7 a5 j" M' R
* a" _' u/ i. q( Z/ v; E% | if(data_read == 0x13Ec)
: {0 W9 `& Q" E. i6 u- Q7 | {' y* G) r# K2 |% x
# d+ T1 J6 T0 X% K printf("data_read = %x\n",data_read);* M' Y/ N+ d; z+ a' z% ^' t/ m
}
' {7 [" c" j8 i% l; C8 @' ^; u/ d : ^6 W9 ] x9 J
msleep(10);9 R0 z' d' {) {
], v, T# C- s; E9 G. V& X) U /*
/ f: R r. r3 m4 q3 \* H1 A ioctl(fd,1); ; N. T; v& h3 L1 `6 @: Z8 @, M
sleep(1);6 U. y$ Q. N+ N3 ?& n+ I5 X/ P' i
ioctl(fd,0);/ J8 R, k# D, c4 q" J; T
sleep(1);
, l- }$ l( [9 g- a2 K; [7 L! r8 Q0 x */ 8 ~) I8 P$ n4 K( [4 t2 L
} ) s3 U2 Q7 Z$ e5 P/ B. z
return 0;5 _: j6 |3 I0 [
0 m# w3 F) T4 p' u' j0 @- x0 A$ r
}
9 {2 v% @$ H9 o2 k7 q/ H& d* T4 \# j6 _& \" [- ^1 ~6 P
多谢各位指教,谢谢! 急
, _; K9 e2 _3 ]( A) Y0 W! q8 u) M' U, Q. R7 k* ~
3 X3 T# I: B: k5 a& ~: J! x" \0 b# W
: A6 I( P+ _% [- q- e
3 I! ]$ ^7 K R" L |
|