|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) P5 V4 \% q, t" Z9 M" |- u/ S/*3 U: \: j6 I( n: `% m* a8 a
* Copyright (C) 2009 Texas Instruments Inc
+ ~' Q, h5 v! p9 J8 y5 i. e* I *, o& \) Z9 Q" y9 R5 p8 B; K
* This program is free software; you can redistribute it and/or modify9 e1 U1 F( W4 h1 y5 j8 u4 I, U5 G- S
* it under the terms of the GNU General Public License as published by2 T/ ?7 T A2 w! I
* the Free Software Foundation; either version 2 of the License, or
' J2 H6 Q+ E, l$ ] * (at your option)any later version.: x. p5 s' x. h' s! I
*
- Y1 m# U3 i7 \& s * This program is distributed in the hope that it will be useful,
! c' r/ ?" I/ }( T * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 x( _. A8 ^2 v. h6 _ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 n; ~+ F, N! \& F * GNU General Public License for more details.6 ?+ h) x* K4 c! S' ]
* H1 K5 ~# q) }2 l4 g& r: f
* You should have received a copy of the GNU General Public License
5 D. [) c% P, L: |4 }" q L2 U * along with this program; if not, write to the Free Software
6 f$ d3 i9 {# C x * Foundati$ w- z% c+ g4 T$ m, w. ^/ N+ H. u
*/8 N4 E8 j& l7 U7 w6 r! x T$ V$ G
#include <linux/module.h>- L& Q @* y* R- ~8 I8 B
#include <linux/init.h>0 {& H$ M& F4 F
#include <linux/errno.h>6 @! b1 V7 k& ]/ X
#include <linux/types.h>
9 M3 Y# ]3 L+ q4 I& X#include <linux/interrupt.h>
. h% {" x- Z& b* ^" K7 `! u#include <linux/io.h>: j) A; V7 ]$ D2 [/ K) I7 P
#include <linux/sysctl.h>
- S6 L; l/ a) k#include <linux/mm.h>
, [5 u2 j9 q% Y; {6 G# i$ h6 p#include <linux/delay.h> z* K; D0 Z4 l5 E2 c' @% ^ t! L
#include<linux/kernel.h>1 P4 u$ X; j6 |2 p7 T1 j9 Q
#include<linux/fs.h># ~, ?5 C( X) m3 \8 Y$ w" R5 x
#include<linux/ioctl.h>
1 l* c& a/ w- n; A0 C* x! w#include<linux/cdev.h>
9 T/ S6 `1 t" `$ ~3 u! s#include<linux/kdev_t.h>
a: H* Q* [$ A#include<linux/gpio.h>- [# a) I( V& z. k; T
#include <mach/hardware.h>, `, M: j2 K4 U" \ U( P' S. K# b
#include <mach/irqs.h># G+ g5 E2 t) q. r k& p
, |& u# u$ N' P( o) i4 q
#include <asm/mach-types.h>$ \& g" m4 K% {: u% [- z) I0 S) G
#include <asm/mach/arch.h>
. p1 ]: e; d8 |4 t- Q" r3 s. k& {#include <mach/da8xx.h>0 i* t `* W6 j( u: u% t6 D* H
#define SYSCFG_BASE 0x01c14000
8 N/ _) v# i0 v#define PINMUX1_OFFSET 0x124 , |* B4 E% ^! ?1 Q; @3 E
#define PINMUX18_OFFSET 0x168 8 g1 X, @* _2 }! a8 D$ v
#define PINMUX19_OFFSET 0x16c, R/ y) s3 u7 P
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR* w; K, b' B6 ^ G
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR' e# I% ?( {. t# {4 V M
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR5 {4 K7 N( n) I* I. d
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
' k2 w% @( A4 k#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
0 e9 A0 u* T, t# E0 E% u
6 ^6 O& J7 V: Z6 q, A#define DXR_ADDR 0x01D11004 //MCBSP1_DXR! S: i0 V& O' u( M
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR3 D0 v+ i }7 d% _
//PSC
: W1 u2 j, X# i9 @- C- l6 l1 D#define PTCMD_ADDR 0x01E27120 ) _% c6 v$ O# w A
#define MDCTL15_ADDR 0x01E27A3C
0 ~6 w- l/ I5 t0 e. _#define PDCTL1_ADDR 0x01E27304
) ^5 g8 f1 N! M y& e8 X//GPIO8 direction
3 _, P- u, T5 o$ b- Y#define GPIO8_DIRECT 0x01E260B0
; e/ i+ j; ~* Q+ ?#define GPIO8_OUT 0x01E260B4: J, X# V9 l; D4 I) X
#define GPIO8_IN 0x01E260C05 @+ D) l; X { Y
. h. Q) X* S5 o
//#define MCBSP1_RINT 99
! _+ D2 x0 L1 Q* i( L- O//#define MCBSP1_XINT 100
8 ]$ Y4 X) M8 p! A2 Z. Nstatic int MCBSP_MAJOR=239;
- n8 f( k( E& |static int MCBSP_MINOR=0;
{' O* J! N3 u# _9 p# P+ tstatic int count =1;8 V0 z. t3 R( X) H# o
h+ @' z" N' Y
#define MCBSP_NAME "MCBSP-device"
0 b0 F9 @$ D- ^ F
* T6 a7 ?2 l0 X, Zstatic struct cdev *mcbsp_cdev;
9 b! }, U5 Q; Z/ o0 d3 Vstatic struct class *mcbsp_class;
' s. z1 {8 [% q/ H; J/ ?static dev_t mcbsp_dev;. M" B* ^ {8 L) y( [) b1 `
unsigned int DRR_data;- e9 U. w: e! r
unsigned int DXR_data;2 e( q0 v( E ]; y6 d4 C4 G4 N6 u
static int mcbsp_open(struct inode *inode,struct file *file), [1 [9 Q4 V9 Z: @' v ?) Z
{7 `! @* m) m1 g9 J
: ~3 J/ ?, s0 \2 Z7 W8 z: d! M! m }+ I
//interrupt enable,initialized8 W9 h L0 p/ B# m, S
unsigned int temp;) g- y+ e9 @( I! e
//SLEEP_EN(GPIO8[10])---0
* y$ b0 B4 E) n, I temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ K( H* |0 [* Z: N, ?2 i
temp=temp&(~0x00000400);- _1 B1 \% d6 b7 |# j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ S% R* F' ?1 @9 {$ E; ` //RESETn(GPIO8[8])----0----1
& l* g I7 }! ~, }# f" ?& r temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. I; `7 q5 N" i: s, k) o- T! p8 p temp=temp&(~0x00000100);% m3 m- m& A; L( K, O; H" ^( U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 y0 C4 i3 ]( H$ V! j/ K udelay(100);2 u3 U: Q- R2 R$ S
temp=temp| 0x00000100;
- D; ^) U" k7 F. | __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 ^2 M% Q: T3 o! T m7 Y o" u
udelay(100);
* h; H. |- O1 @4 n printk("open success!\n");
3 [& F9 R1 _; U8 y return 0;
- c% q* p, B$ H0 Q; W}: ^/ \2 E" N0 I6 C* C: q+ O
4 x1 Z+ z; E! I9 {. D( v9 Ostatic int mcbsp_release(struct inode *inode,struct file *file)
5 x$ b+ W7 V( ?4 d3 \9 z{
+ y- t* h: \' K* X, ~3 {* L printk("release success!\n");
4 i+ {2 Q ]. r8 T return 0;( I! Z3 @+ ?$ g6 X% M4 J* G& q& ], Y
}
' Y/ {2 ]9 C7 Z, R {+ ^' ?' h# q* ]
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& T' R& U$ p. T; e* b
{
2 L g* d# a1 b# ]9 g9 m copy_from_user(&DXR_data,buf,len);) n% y# G- [+ Q% X
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* u& e% Q: {$ p1 ?# ~8 L' K1 F) K return 0;
& k" u! y9 |+ t1 w5 Z5 Z3 B
% Z! U, a3 D4 `* b}0 m. c2 M' V$ z& a% m1 j2 P
; b5 ?( L& Y# Q7 W+ C7 gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' t: F: c$ w" T4 D. Y/ l5 K9 ?{
; I1 Y* ~2 t/ T1 v! r DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 {9 |+ e1 D; S$ R* e copy_to_user(buf,&DRR_data,len); ( L/ H7 o! B9 i
return 0;8 Q6 b( a$ n; P7 g/ O( {1 E1 K+ A
}7 F' X" G) j) O+ \& u7 [4 r
8 C3 l, Q0 T2 |& z' w/ v/ q
4 ^/ H; L- D q' _) Astatic struct file_operations mcbsp_fops=, X0 o. X$ J$ t
{( V4 e3 p: i8 a% A. u
.owner=THIS_MODULE,
! L2 K3 w% ?: d9 t6 C .open=mcbsp_open,8 |% r% k) F. G ], S" S' G: W
.release=mcbsp_release,6 c. H4 y- i- {' [" g( r; a6 A
.write=mcbsp_write,& s; z. f2 {2 O1 B9 ^
.read=mcbsp_read,
: A: w! X. l! R7 Y5 _% x- N c};
+ _. v5 e1 Q6 c3 ~static int __init MCBSP_init(void)# V# m( x" S$ k+ Y
{
+ @0 _9 l& K/ t- x" j int ret;8 e& J) T3 \+ `; ]) ~8 y
unsigned int PINMUX1_REG_old;* h/ t, S9 I7 u7 o4 r# G
unsigned int PINMUX18_REG_old;3 r- I* T7 J; N( m# `' x
unsigned int PINMUX19_REG_old;& l$ s; g% e4 J) {
unsigned int temp;
* \ \. E4 Z$ ? if(MCBSP_MAJOR)5 @6 T3 _5 Z* b7 \% |: n
{
6 E% h9 j1 D- c c8 | mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);; k1 G M' ?4 N1 k" `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 e/ A8 L7 q* ]0 c }
3 ]+ X- I8 {' s" \6 \ else
& H' v# E8 l% @& b, }4 ] {5 ?8 A: f2 F) W* j
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. ^4 {7 c1 e& C
MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 Y0 q l( e! W3 s }! q( u# ?5 g) C5 k1 [7 p
7 Z5 C9 [, _" _: w: l' A# ]* U- }
if(ret<0)
( [2 V" A) x/ D! [* u. @ {( s- v$ Y" _. j2 M _
printk(KERN_ERR "register chrdev fail!");
2 i. l) S9 _1 A9 B I return -1;
3 x# H. W, j# V7 o7 Y }+ g3 p: [& I' M9 V6 Q6 ]. ?
) K3 ?+ X$ Y; |, a& g0 B
mcbsp_cdev=cdev_alloc();/ @2 _/ n k' M# d4 ~$ f. p& T
* K5 x/ y- }5 ~( a4 F4 Y& |
if(mcbsp_cdev!=NULL)( z( g) ]( u0 a: {' k3 p- E" J, t' v/ n
{9 ?" g. |, X% I+ |
cdev_init(mcbsp_cdev,&mcbsp_fops);2 V! M; d9 B6 w- b5 I! c
mcbsp_cdev->ops=&mcbsp_fops;
3 Q$ a2 A7 _, O* Y( K mcbsp_cdev->owner=THIS_MODULE;" p; n, B( T/ ~8 C' ^
6 z! T' t6 E, s0 [2 d9 I8 v if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ s2 ^8 P/ b4 L$ C u6 V+ |) S) v
printk(KERN_ERR "register cdev fail!");
. h1 ` F. a: ]# v else7 W w; f5 h% h, A6 d
printk(KERN_ERR "register success!\n");7 c0 I$ v& }0 o/ `1 O, w
}. {. `! E/ J& S
else
# H4 v( ~4 }" @( T# K5 Y {
+ n2 b, k9 n; ^" d( M1 K: v8 { printk(KERN_ERR "register cdev err!");
' @5 }6 C8 v* J! c# A% A return -1;. ^+ h% l. G, B$ t( d0 g
}
0 {1 x7 \+ Q2 [+ ]3 ]; F2 m 7 w$ D% G% D) E- d. S
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 L0 j) y2 K8 u+ d& H8 S' f3 U if(IS_ERR(mcbsp_class)): b. V) T7 \9 o1 d
{
5 m% m+ A8 T7 c% R printk(KERN_ERR "register class err!");
# F" R! @7 ~1 r! V u1 s return -1;
0 ^- w+ j: f( U/ K7 I9 { }1 {$ I1 p% `. m9 F- z* R
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, f3 q# m) m8 Q+ d/ k/ a
- ? o; Q# z+ t% N# g: r //PSC
& K6 p, c- f7 _0 e //add Enable MCBSP
0 R8 G% S/ K2 c* h4 x //test
( p, U1 l/ X) o% x$ U" N* r temp = 0x80000003;
0 n0 S# R4 _4 ~; y, f- A y9 C writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 v0 g' V% X. g2 D! ] temp = 0x00000003;
2 {: f* ~4 W& J writel(temp, IO_ADDRESS(PTCMD_ADDR));% r" S: C( Z2 v. x
- r1 t D/ Y$ |* E6 R# z8 a temp = 0x001FF201;! r& y+ u. z) E5 A# L
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; |- J, r( I. b' n* l: \
$ s$ R8 U: l$ ~8 B" X) } //PINMUX ' \8 o h' X/ n- {: N4 R7 O2 C
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 j% _; T# @/ s( ^. E& P
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. K3 J3 {& T* i5 A7 k' S2 u- [ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 d( |' O; j7 m3 S" C7 O5 A9 ~ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" c; m+ C3 b1 i6 K5 r5 h
N+ p$ u) |4 @) l2 [4 j //SLEEP_EN,EPR,L138_SHK1,L138_RC) P& p4 _% d/ o; |; f$ h2 t
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 |( K$ R8 _9 ~" a& x+ N
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# j+ T+ o. _& ]6 T writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( n$ |0 o8 |( O. z- V
$ U9 t2 X9 U/ L5 k6 C. |* m //RESETn,L138_SHK2
, f9 |. z3 ^2 S PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . @) Q) z! B& T- v) Y
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 a+ C% o6 j! x7 `3 [ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 @! B z- K/ F: O" K, B
# ^; x8 C+ B, ?
+ G3 u& n4 {" _( ^ //SPCR Register0 T( t& f" G7 x/ E. T0 s2 B+ M
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% s5 a9 ~. I3 X' V( f8 Y: E temp = 0x03000000;//(DLB=0)8 X0 C5 g6 r" W: [* U- a3 L
// temp = 0x03008000;//(DLB=1)# L8 U/ ?$ z- h
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 \$ y3 ^4 l. c' i0 `
temp = readl(IO_ADDRESS(SPCR_ADDR));
$ n1 {& ]9 B$ v5 A2 A$ Q2 R" M9 | printk("temp=%x\n",temp);. w# `4 [" I; S6 Z2 t# a
7 J- Q5 e* E. D! S //PCR Register
# f, T, X R! D" f! h3 m1 m //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* F3 y1 f5 G3 { // temp = 0x00000F0F;. v# W0 G, e3 Z
temp = 0x00000B0F; U) ~1 o, {* o2 [
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
Z, R- I1 d4 L/ J8 ?+ \4 L( i temp = readl(IO_ADDRESS(PCR_ADDR));
& r; q1 X2 m) [6 s; ^7 @4 v/ \ printk("temp=%x\n",temp); ; E4 H2 k; d5 f4 u
//SRGR Register; h0 H* Y1 \: L; t- m% r
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 }) F1 c, L3 i. j- @
//temp = 0x301F000B; w3 M! N7 }, O& d s" ^) z
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * M+ N7 Y4 `; t" z3 n& @
temp = readl(IO_ADDRESS(SRGR_ADDR));2 N2 A4 f- M' U' Y0 s
printk("temp=%x\n",temp);% x" [% X. y0 o7 _5 L4 ~7 {
//RCR& C6 o! m4 Y( N4 w9 u' Z: {
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 M$ v9 X! |) `, [. l& U //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' S" |) ?4 {+ d/ I6 K T& i9 V0 Q
temp = 0x00440040;! x- L7 g# v, ~
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - b: h. K1 p' v# C3 k
temp = readl(IO_ADDRESS(RCR_ADDR));
$ C/ a6 O5 _5 g9 I# l# V printk("temp=%x\n",temp);
2 W5 r* ]$ F; K {( S& m% Z //XCR
( Q( f/ g8 |! [1 R/ ^4 o9 y //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 i7 b0 @3 N" \# k" \8 V, [* t. g1 {
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ f) x1 X7 V3 _) c9 o: X6 Z/ K
temp = 0x00440040;
( q0 Z# y! T! U0 T1 [ T0 [& \ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized , s% ~6 R* k5 l& |% D
temp = readl(IO_ADDRESS(XCR_ADDR));
0 c2 @# X8 d% N9 M; J printk("temp=%x\n",temp);
/ H9 I! a, Z b/ G udelay(100);
% o9 E, t, s \4 |: m //SPCR Register9 `9 I5 l6 L% f# {! v
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 s$ L. Z6 x* m& H4 G, M" [
temp = 0x03C10001; //DLB = 0 VS DLB = 1
$ \' V$ s' S# s. g! ]( B! T writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
" B- ^$ _1 ~7 K- T temp = readl(IO_ADDRESS(SPCR_ADDR));
0 `1 T! Q" V7 r G7 W( ^* f; I printk("temp=%x\n",temp);
* h+ M$ t# O% F/ o/ U% C udelay(100);
( O" z+ \9 f+ X# R6 t6 Q: a+ _* v# }% F7 K; W& s
//set GPIO direction
1 S, [0 z$ O$ I temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ F' g, M- t: g1 K+ j+ W
temp = temp | 0x00000100;//EPR----input
3 P; {$ w9 S ^( _ B temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ V$ j* U; u2 v7 e: Z+ `7 E; y __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) a5 x7 V! \3 E
# F2 {% \+ L3 [
return 0;
k- J7 L/ e- V% d& p5 }}0 d. [6 M8 B7 T6 S- u* z4 Y8 \
static void __exit MCBSP_exit(void)8 V; T! X- R- Z
{
6 v! f' Z9 J& @% X. T2 P printk("mcbsp chrdev exit!\n");! m: s4 o# O3 t1 I* m( a
cdev_del(mcbsp_cdev); S% O( R5 S4 J, H& w7 X6 ^
unregister_chrdev_region(mcbsp_dev,count);
) W( B- ^2 h+ P8 K device_destroy(mcbsp_class,mcbsp_dev);& H: u: ]4 C: j4 {8 V
class_destroy(mcbsp_class);* r! G' c3 I; Z
}2 D! @& _: S' V$ z* O" J
module_init(MCBSP_init);7 O" M9 f7 f4 V! G1 @
module_exit(MCBSP_exit);
; A% \; y" d5 o$ m' u7 H" s! z2 H6 P' l1 c6 c! w
MODULE_LICENSE("GPL");
3 s2 V& U' } G* z' E+ V/ f0 p5 k: d) G, [
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 J! Y" X9 O: Y& t我的应用层的测试程序如下8 u, r, E: {1 {
#include <stdio.h>
% O, O, j; ?6 j+ {5 Y/ k#include <string.h>+ ]% V; U: t- A; J* U7 |
#include <fcntl.h>
2 h; }) n' m8 p3 f#include <unistd.h>% j' \/ s3 N! H3 a
#include <signal.h>
0 K$ o4 b$ F; f- |4 ?6 d `#include <pthread.h> //线程, q6 b, M5 H! u5 v4 K
#include <stdlib.h>, `: r. i% Z' }, ~4 G+ l
#include <pcap.h> //捕获网口数据 C7 N1 p4 A9 ]5 Q" U K
#include <semaphore.h> //信号
5 [% p' I& {1 P7 U& X#include <sys/types.h> //消息对列
! b* J0 W5 \9 n$ A2 G, D/ Z% Q, A#include <sys/ipc.h> //消息队列" U5 l% N' X+ H. v
#include <sys/msg.h> //消息队列; J2 p* c) S }/ m3 o* m
#include <sys/select.h>! d. }1 d1 b- J2 O2 R& z$ j. c
#include <sys/syscall.h>
$ Y# j) |3 K9 S0 C#include <sys/stat.h>) b4 \1 B% ? p1 d9 h
#include <sys/mman.h>
# c# O9 M& W; Q. g#define msleep(x) usleep(1000*x)
, X0 K9 v% ]; s) [8 }3 f# h
! F/ F( l# R- Z5 vint main()1 r8 ?, [' d, S) M3 r4 a/ W. L/ }. d
{ 4 k9 b! B9 y/ c; E" q* s3 i
//MCBSP,ARM与AMBE2000交互设备# [, K( x }4 @$ t( s4 Z) F
int fd;/ C: y# c: M# u0 W: v/ G# n6 q
unsigned short data_write = 0x5555;
* \5 t1 t6 v4 V' D( w unsigned short data_read = 0x00;
/ _) z X8 H2 ~" A; d8 N9 ] fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- o8 D4 o- t3 B* U& S- W
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% q6 N' Y( Q3 w: |( m, Y
6 a7 f' b7 z+ @* @7 g- J! v if(fd < 0)
4 b$ @. g/ j8 w) ]$ Q& X: g {
" p t* B4 k5 x2 o1 P/ q5 V perror("open failed\n");
. l0 V* ]7 y7 Y4 B* u( e' a return -1;% M# J# e+ {$ j/ v' r5 l* t
}
* s4 J. @) h/ z 2 t, P3 X% A0 O2 z+ k2 l* }# }
while(1)
# i ?! H. r; t {
2 t" o" f% s9 w+ @( W5 I
- j/ l3 I8 `4 G; H$ @. R //AMBE2000每次读写是24个字为一帧0 O, [/ o, j1 }0 A+ P0 O% P
//写数据时将数据在底层存储起来,等到中断的时候再发送/ X# r0 k# z( A7 z+ X% @
//AMBE2000输入数据是以0x13EC开头的
. T4 k; S( a( K% Q' b! ]) T write(fd,&data_write,sizeof(unsigned short));
) ]( F7 g3 X% N. [
( D$ \+ ?+ K. E3 {+ L; B6 z. _ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
* q. H4 c! ~, X% V, Y& Z9 ~ read(fd,&data_read,sizeof(unsigned short));
. u l( p/ \& G+ S0 b/ k7 c , x9 H% p; G7 F% ^: \7 f
if(data_read == 0x13Ec)
) f1 h V0 B3 I {
( G$ Q' D) U" X/ P+ C m, D' o9 b; m" N) Y! C
printf("data_read = %x\n",data_read);" e! J$ B3 J$ R; S R
}
, m9 t; h& U. [, J5 a ! d/ _% d- x) G& W) q b% N: ~- i/ W8 u6 A
msleep(10);
( E2 }! \6 ~8 o* F0 \
; ^; o$ B1 ], |' W5 r6 E8 | /*
3 r% e' j1 D3 ? ioctl(fd,1);
0 z1 }2 o( W2 g! ? sleep(1);3 m. a: o# N* x4 u
ioctl(fd,0);
3 P! Q. [: _5 T4 [& l; {. q sleep(1);# Y' N4 q% v4 F) y ~; \
*/
6 v4 m( _+ H- ?! f }
' u( u4 N: D0 z1 E, f, _ return 0;
, n9 g; i' h% X0 D% D M0 k3 k
9 I/ v& z6 J2 `, y4 h}
' |3 H7 v: H0 V# W S( r
) S2 }- |) I6 X# e# R5 p多谢各位指教,谢谢! 急- z& U& ?0 I* p$ J
6 |9 \% M% |& m9 O# l
4 ]+ o7 Y9 b p* m6 P: x
* j; Q4 G( h: u
/ H; B1 q7 ]/ x- n) V
6 k3 Z6 q) I$ O9 d/ ^, b# O( B |
|