|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( o; s% D3 d7 ]7 K/*/ P2 o, a9 I+ k/ B
* Copyright (C) 2009 Texas Instruments Inc5 L% x# k; J+ m: E% M
*+ J% x, W% b: `
* This program is free software; you can redistribute it and/or modify
- U* @0 W" S* c: `0 P * it under the terms of the GNU General Public License as published by
; K- P1 P1 u, ]! j! t * the Free Software Foundation; either version 2 of the License, or
3 \- G1 s6 X8 \' ~3 b5 G * (at your option)any later version.
6 A' l7 q$ ], e' p *
9 }0 |% h0 p" w" S * This program is distributed in the hope that it will be useful,) h* z/ ~& l0 n+ j/ _
* but WITHOUT ANY WARRANTY; without even the implied warranty of k5 @3 A% \* t; K8 m4 c
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 }0 G5 l- {! W( M
* GNU General Public License for more details.! E$ W5 M/ w! s, W
*! D4 u$ S. L' N" [% i) F( c% y, M( p
* You should have received a copy of the GNU General Public License
' e/ ]) o m6 {: G) _ * along with this program; if not, write to the Free Software. t+ }8 A* y# {( l! z# }
* Foundati9 r2 s0 m. F) p% A, K
*/
/ _/ j$ p, c9 n, J#include <linux/module.h>) m3 K# b2 F( D3 L3 W4 T
#include <linux/init.h>
/ N1 e, Z8 T. I. M: `#include <linux/errno.h>% E3 O( g2 V4 a( _7 _
#include <linux/types.h>2 d, V0 L3 v" `' @
#include <linux/interrupt.h>
. Q% c" J; B: }" k#include <linux/io.h>4 M7 k- @1 |& }3 y& r; I
#include <linux/sysctl.h>
+ N* N; N+ }: x3 U% ?#include <linux/mm.h>6 u& m& S( i" q5 v$ m N
#include <linux/delay.h>
& d# i; l0 \3 s4 l, Z: l, }#include<linux/kernel.h>
" }* t" p+ ~! {9 i#include<linux/fs.h>/ P) q6 d0 ~5 `/ v9 @4 A
#include<linux/ioctl.h>
0 ]; K" v% h- G9 ]# X#include<linux/cdev.h>
; Y' |8 A: d8 u5 o8 [3 ~/ U0 z! ?" {#include<linux/kdev_t.h>3 W3 [( B, Y/ Q( O v' }' K
#include<linux/gpio.h>
. V/ f! u$ t" J/ I( N1 Z#include <mach/hardware.h>! ^$ I( _8 v- _
#include <mach/irqs.h>$ d. [# B6 S9 Y2 Y( n3 @
% N3 K' e, M& T7 h# l, W: E
#include <asm/mach-types.h>
% X, T l! b$ d) K0 A8 d2 [( ^ b#include <asm/mach/arch.h>
6 z7 N. @2 o) c#include <mach/da8xx.h>! J( ^7 b) G& y
#define SYSCFG_BASE 0x01c14000
/ i5 D$ l, y% Z8 Q#define PINMUX1_OFFSET 0x124
4 _+ n# a1 X0 K& `( u7 b#define PINMUX18_OFFSET 0x168
w& z, f) H& [! q7 k#define PINMUX19_OFFSET 0x16c. u( B0 r/ o, x
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
1 f |3 W! ~; U; g2 Y- e1 v#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
/ n- O+ c" W7 \: e3 ^ A4 U#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, U# E9 Y; S" [6 H5 ^ v2 h
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
2 y$ Q: J/ h8 B0 c5 E' X2 r#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
; U Y u/ F$ Q) [' r/ R/ [+ W ! c. a# E/ I& i" h
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR4 K! ~2 D: E0 K* P9 V
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. ?( ? j+ ?- D1 o. k$ S4 G+ m//PSC
7 x, ~2 N9 C8 H" h#define PTCMD_ADDR 0x01E27120 ! ^: M! [1 v: a2 [6 x- m
#define MDCTL15_ADDR 0x01E27A3C
3 I1 w, \5 [ H7 W, Q$ I, l! u#define PDCTL1_ADDR 0x01E27304, a9 \2 O7 w. i) y
//GPIO8 direction
+ r+ U% [4 E+ E- s9 N, A- `1 U# b#define GPIO8_DIRECT 0x01E260B0
! a. X" F0 I: v#define GPIO8_OUT 0x01E260B4. N, @. ~" F; B. U+ E' m
#define GPIO8_IN 0x01E260C0
6 f( N" k: a: g/ O. C7 y1 S
% A* N. n P3 x//#define MCBSP1_RINT 99
, ?) g! B6 {% p0 R; Z7 W# @//#define MCBSP1_XINT 100
! _: G/ b# f+ c/ sstatic int MCBSP_MAJOR=239;
9 t9 G& |+ C# tstatic int MCBSP_MINOR=0;
% _; F# R4 n1 E. y/ Q4 Dstatic int count =1;
( I' {9 k/ z% [/ m( C4 E$ A) r5 z9 W) I! d
#define MCBSP_NAME "MCBSP-device" N; I6 i* h6 n- Z7 V& J6 A; `9 X
4 r! m& g& e5 P" `% H( X- P0 ~3 fstatic struct cdev *mcbsp_cdev;* b3 q" E* W Y4 S0 `
static struct class *mcbsp_class;' v, m9 `% X" a/ m U9 V
static dev_t mcbsp_dev;
; H& h& p6 a0 Wunsigned int DRR_data;
f7 v, T' G& \, h2 \" n, _unsigned int DXR_data;/ a$ W3 u1 x6 C! v @
static int mcbsp_open(struct inode *inode,struct file *file)- ~: n7 ]8 v1 B! E
{. s( E$ H; |+ V0 |1 k: u
( i% J- e" R; Q" y" a //interrupt enable,initialized" K; u+ l$ o& N- R/ G4 {
unsigned int temp;
+ B. F% R1 t& W) ^8 B/ W //SLEEP_EN(GPIO8[10])---0
; Q& w# ~" S7 g+ x6 s7 l temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* M( e5 J0 j. Q8 c7 b p
temp=temp&(~0x00000400);! F: P6 @" D( G! o6 r" e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, E' h2 q1 f1 X2 t# n //RESETn(GPIO8[8])----0----17 Z: R r. B$ C
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ c- M0 P! b8 {0 t temp=temp&(~0x00000100);% \7 w9 f, O$ Q& I1 \ {
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ |1 y0 M2 J8 ?! ^$ e- ~# s
udelay(100);7 w+ Q$ Q' V; O+ n; j
temp=temp| 0x00000100;
a, p* X- S' l) }% ]# \ J __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 T6 d) R* F! q- N) g7 t: |
udelay(100);
9 U" J, l# a9 i7 A5 q printk("open success!\n"); D$ F) x H* b; Y
return 0;4 ~7 h6 Y& ]( w. z% A; r
}
+ [/ f! C1 ^7 a3 H4 \$ a: d; h. r8 ~* d R, }- l* w$ @ u
static int mcbsp_release(struct inode *inode,struct file *file)% w2 v/ P6 [$ U, _1 F2 t$ V
{
+ X% S; f# F3 N! m0 B( W% ? printk("release success!\n");4 Y, J& Q0 L; _
return 0;
2 Z; p7 `( W* a: e9 `; I" b}
! C8 W3 n" |) Q- F' l/ W+ R8 W/ G) P* Q0 V. ?/ A) i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 B( h Z! }2 p/ Z- L# P+ U
{
$ `$ @8 H7 A) t* m8 r% R6 i$ U copy_from_user(&DXR_data,buf,len);
5 ~2 k2 s# A' J; z iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* j- d4 R6 l! z/ `, H% y8 T2 A1 l return 0;3 n, w' Q- @" y, X. S% F
/ q4 Q ]$ W# ?: k! U. ]% [}
3 ` _ \- k: R. j" T$ B! f _9 I# c }
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
2 P6 a6 t' J0 n' b{
+ X8 W; X% I& C! v( h DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 x/ ^4 C6 d3 ?3 i* Q0 `
copy_to_user(buf,&DRR_data,len); + w# c8 H+ q: W) p
return 0;
% D3 ~' w! r# [8 L# C) ^, x}
# ~+ M, \. x; A3 A
4 D4 w6 z2 `3 K! I( J7 s% i. ^$ t0 ~% D% y% s+ D1 r, n7 ~+ ~; o* U
static struct file_operations mcbsp_fops=" @3 W7 E/ D" o( b; }
{7 q- |5 ^% a* f5 l% @5 I! I
.owner=THIS_MODULE,
, A: t' d- {6 k( x' Q/ a8 w .open=mcbsp_open,# k9 _* c8 x q% q( b9 ^7 [( \
.release=mcbsp_release,
+ b$ Z1 S- i8 ~3 p k, L+ } .write=mcbsp_write,
3 G4 ~. z& d. @ .read=mcbsp_read,
: k$ G* M: \* W4 }% @};: x! L8 x5 L6 X$ y5 i I
static int __init MCBSP_init(void)
" b0 p/ M F5 t{ j; M6 N0 C4 J8 s$ |* ~
int ret;/ ~7 v& s& v+ t/ ^# p
unsigned int PINMUX1_REG_old;
, t! D4 E6 L/ K+ E7 i6 E$ Q, n q unsigned int PINMUX18_REG_old;! T: l' T0 j. W7 @! j; d- K6 X
unsigned int PINMUX19_REG_old;$ K1 ?1 F# P" l
unsigned int temp; ! J- O% H5 T2 j" q k
if(MCBSP_MAJOR)2 T& v8 f- E: l1 l" |6 ]4 t9 r
{, G. @% J' w. N# c6 X- H$ n
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ _( @, E7 I2 U" v! r7 q) ]
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& c! l* n( y# \0 t/ ~; {! H
}# E' e2 B& u8 m x1 @) q
else8 z. _) q5 t& R3 q3 v
{
* T8 t. k& @/ q- N0 V- \4 o3 _6 E ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
: J( k: ]/ q. `! R4 A" Z$ y5 H! A% V MCBSP_MAJOR=MAJOR(mcbsp_dev);. z: x ~) Q: N; q2 g7 Y: h* O9 a$ L8 n
}$ U2 C) ]# |8 ^
! y* O d$ [& F, Q if(ret<0)6 ]) G) J% r5 S5 c/ W
{. y2 a& l" ^" z) s
printk(KERN_ERR "register chrdev fail!");0 X$ T7 R6 A% R$ N: G
return -1;
8 L8 N2 G/ Z( z }( s' {# Q0 P& t. `4 z6 I
" \. m* k' |# Y& `1 j$ ^
mcbsp_cdev=cdev_alloc();$ B, W& q6 X- _; G. g- N
( g/ I4 V" O& h" F; E: f if(mcbsp_cdev!=NULL)
4 J# {$ L+ v! c( m) X/ v {
$ o u9 {9 V( H: F% M" _4 x8 l cdev_init(mcbsp_cdev,&mcbsp_fops);+ r; g4 m& {+ T( |
mcbsp_cdev->ops=&mcbsp_fops;
: x2 f& @% Q3 `! E* I- n& f mcbsp_cdev->owner=THIS_MODULE;
' J" n% r4 K) U6 y
5 c) S E- \1 s' x8 g6 V if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- \7 ?. S/ t7 q/ D2 {1 d( _, X E: Q printk(KERN_ERR "register cdev fail!");
( C6 Q% R( m* {, }! d0 a else$ r$ N* V: f) X# _8 s# G
printk(KERN_ERR "register success!\n"); X$ L2 O& F- `( ?" @0 z. O/ ~
}
# v+ i8 z! u# H9 C+ s else
- f. @3 a3 R8 k0 J f- {4 t H {
$ A* c, |. Z2 k1 p" e( Z; d* {. g printk(KERN_ERR "register cdev err!");4 ]# Z( A. p- M9 ~4 ~
return -1;* K4 m; X$ t1 y, `. d$ N
}9 P$ o5 i" }( _) J" W% ~8 A
3 ]# i! u% N5 @& c
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ y( m- T; @* N' o! I8 P7 b0 x
if(IS_ERR(mcbsp_class))
* l6 B0 |/ x( |) v5 N/ l* ~ {" A* I4 r+ i6 u! s5 Y0 t
printk(KERN_ERR "register class err!");1 t; u; C2 ?9 T% Y2 \& D' P
return -1;
; x( t, J* s0 _/ _1 ~ }% d0 Y: t* k; N8 B
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 t3 [% c9 [% v$ m
' z) [3 |% h+ Q. W8 T //PSC, B/ z5 O1 Q6 I
//add Enable MCBSP
- Y5 \/ Z$ P9 a2 B* f' b$ o) O& }5 _ //test/ a3 i9 E5 g7 a r
temp = 0x80000003;
7 L' v/ q3 ~8 U/ h+ i$ r writel(temp, IO_ADDRESS(MDCTL15_ADDR));# a0 y3 [& G+ G7 X3 G4 l# l0 v
temp = 0x00000003;
; N' y9 g0 h' B( j f { writel(temp, IO_ADDRESS(PTCMD_ADDR));& f" q# E: N4 B' `
$ p' x& N) p9 M/ [! G temp = 0x001FF201;1 h( W5 l" A; e
writel(temp, IO_ADDRESS(PDCTL1_ADDR));6 |2 p* q+ B: v. m+ U
a# L; _3 j U4 p3 J$ Y1 f
//PINMUX ) k0 ^% W( g1 L( B" C8 T
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
/ [2 B; m% {' }7 f& e0 I PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% R* d) ^; `* I. q1 j. ^' }- Q9 W PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
6 ~% ]# B# g0 |; \+ C% m writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% B# Z, ?8 \0 y. `8 T9 o
, [. P4 z0 ^1 V //SLEEP_EN,EPR,L138_SHK1,L138_RC7 h C, o/ F" h- s$ H
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); / B2 [9 J! L2 f6 h1 U% E+ S3 }
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# \) q6 A# \! R( \& O) O, Q0 o. p: _ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' ]' r3 p ^+ a. p, i
% d% ^+ Y4 Y8 m2 a; O
//RESETn,L138_SHK2
. |% M, E9 i" f4 Y) e0 y PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 Z3 g' g! p, ?. p% `4 v0 w PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 ?/ f4 j, L3 S# j7 }) F writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 y, ~9 o! \& w# `( i+ s
4 g% L! w4 w! o; R) N" Q / E0 m9 m- c$ x& H
//SPCR Register
2 }# S, F, ?: T4 A0 }' f4 ~6 m //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! T) v$ S$ r# O" X. _9 w temp = 0x03000000;//(DLB=0)4 M! J' U5 }' V( T3 ~; H! f
// temp = 0x03008000;//(DLB=1)
- S" Y$ ? P& s/ l% t5 D writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
& X4 n; J8 g/ E' }: ^ temp = readl(IO_ADDRESS(SPCR_ADDR));
2 x0 {5 f4 ]8 J9 t* n# m printk("temp=%x\n",temp);
v9 F* y j9 x2 r: B4 Q ! [# C; Z! g5 I$ D/ Y/ B, s
//PCR Register
! P) h0 ]- }2 g- V: g //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 q/ o8 E$ |' [& z3 V; C
// temp = 0x00000F0F;
# O7 \4 P3 a: k" f temp = 0x00000B0F;) @; Q. v2 o$ S+ C$ U
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized / N P( t" U6 Z0 `+ F/ Q
temp = readl(IO_ADDRESS(PCR_ADDR));4 D! I- p p- l5 E5 m
printk("temp=%x\n",temp);
' D" A7 w' N7 H* @ B b# j //SRGR Register
) n0 G% S+ {2 L1 C* K //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11) ?& l3 g5 }- a% | R; |; s8 h
//temp = 0x301F000B;. k% v, v. D1 p# z/ k1 a: n
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ; G0 Z( a: ^6 \7 G
temp = readl(IO_ADDRESS(SRGR_ADDR));: X3 m; {% G' t1 Z( D
printk("temp=%x\n",temp);$ }& e) S; I8 f" g: n
//RCR
( G" J, Q9 w/ l& x$ x/ M$ ` //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: R/ P5 ~/ @/ g
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ o# ?" Q# j; }( J1 Q temp = 0x00440040;
; f2 A, y% m9 L writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
2 L1 R; |; i3 d/ t- P9 m temp = readl(IO_ADDRESS(RCR_ADDR));
" k( p6 m1 l' Q( W3 d9 |2 |4 i printk("temp=%x\n",temp);
# R: }; C. O8 R a //XCR
) V3 R5 T$ e6 ~. ? //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
# }' O2 q4 x- Z/ K0 { //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' y/ [. v7 w; X( h; X& z, _5 X
temp = 0x00440040;
' b8 ?& u/ o/ ~' A writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized , T2 B& r. H8 ^* L. d) s
temp = readl(IO_ADDRESS(XCR_ADDR));0 {1 T' N/ \7 d$ S! Z
printk("temp=%x\n",temp);
Q1 T! A& A8 y8 h0 o udelay(100);# g" M9 J u( @* Z% ]. N
//SPCR Register
; I7 p2 D0 V. C+ l4 r( L& t //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; f- C3 u3 t4 i" t1 g temp = 0x03C10001; //DLB = 0 VS DLB = 1' [% Q5 J: O7 @8 F' _
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
9 @* H* x, w4 u& `) \ temp = readl(IO_ADDRESS(SPCR_ADDR));8 y7 S! @, c7 E) p
printk("temp=%x\n",temp);9 T0 `1 e- p) H: Y% ~
udelay(100);- R1 V# D1 ]1 b+ b9 x+ g, H2 o; `
% O3 ^/ E0 r0 E( m. j% L' A
//set GPIO direction
9 D- I0 c6 u: Q) \ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' j# \; ~# U9 F0 z& W
temp = temp | 0x00000100;//EPR----input
: n/ }, C0 ]0 _! [# _- d temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 f# k& W- k) r$ |. ? __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) L: r, Q7 I* h
7 P/ Q6 L! e5 T3 w# o8 ~) f; w return 0;5 T L* M. K2 `
}
8 e4 S! W( m# Vstatic void __exit MCBSP_exit(void)
' p- Z N- f& q4 S! O; }2 [0 f{
; y/ w2 t0 F2 _. d4 | printk("mcbsp chrdev exit!\n");. t; R/ N9 {& W2 r& `! ]% f
cdev_del(mcbsp_cdev);0 U6 \+ \# z8 i+ U; j9 @" n% ^. S$ `
unregister_chrdev_region(mcbsp_dev,count);- p$ B9 z1 p" C+ i' I
device_destroy(mcbsp_class,mcbsp_dev);3 P; _" A! n! ]' ^
class_destroy(mcbsp_class);" V; W) ]1 d: U
}
9 j. o! Z, U/ o" Y% G& z$ o7 Bmodule_init(MCBSP_init);
) _' O) ~% O8 @! T7 I. Zmodule_exit(MCBSP_exit);2 y t/ `! S1 ?
" T- x7 X0 M* H5 F. N9 ?. {MODULE_LICENSE("GPL");1 O+ X' q7 i) C$ K# F0 ^* r
O5 G# b. L, x" R
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ V1 S' [/ n/ z" v我的应用层的测试程序如下
5 s9 A0 `$ U0 ^$ h) k& l#include <stdio.h>
6 n& F) ]& F+ M' X8 q6 {#include <string.h>" w; y2 ~4 `$ ?2 a' @3 |/ Q: l
#include <fcntl.h>5 f2 I' `, S* g
#include <unistd.h>
3 N- v% u; \; W; n6 _#include <signal.h>/ `4 k* ]. z9 O& ~) J* J
#include <pthread.h> //线程; A: I: o( b/ R( P: R1 i% U- Y
#include <stdlib.h>
8 y# ?$ z# m6 a- o; g% f#include <pcap.h> //捕获网口数据
; _- @: Q9 @. d#include <semaphore.h> //信号
1 Y0 q8 Y6 ?5 C' m0 V0 P#include <sys/types.h> //消息对列
" G8 j( Q& Q% B#include <sys/ipc.h> //消息队列- Z9 f; b, t9 L6 ]* s, ~) {
#include <sys/msg.h> //消息队列; \( j/ a3 Z! M' \& ]
#include <sys/select.h># n" ?+ z. e3 k2 C# [1 o
#include <sys/syscall.h>
0 v& v* D- r- k! {0 Z#include <sys/stat.h>
+ b/ ~ ?& b, M3 y#include <sys/mman.h>! W/ f. @! E% n# T5 a
#define msleep(x) usleep(1000*x)8 l4 F7 [0 c; N/ ]
. x) N2 T& T- r7 Lint main()
) i, @' b/ J* p" c( y7 C{
' q* A) k- E/ v) o1 K //MCBSP,ARM与AMBE2000交互设备
* a! E" v% R% r% W8 R6 A3 _. p int fd;. P6 A3 w2 e- B, d$ X' K
unsigned short data_write = 0x5555;
* K4 p2 `6 d, g6 ^* f- G unsigned short data_read = 0x00;0 X4 d: p1 w' x/ B) q" M
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# C* @( j5 {: i9 R
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 ]/ H3 [9 a2 o0 K M) q1 W* m
: W9 O; O8 r3 r' ?5 ?, E if(fd < 0)% a% {9 ]4 B: a& U; Y
{
& F( A. ?# h! y perror("open failed\n");
; ?: ]: R( m+ k. m) K/ N7 X return -1;% [1 x. C3 K1 H
}
. h3 h0 Y( {# T0 W& h+ l9 ~
B7 d) ~6 u8 ?4 |6 g while(1)
* s' F( V# v' f, P% j9 O {
; u1 ^; [* H+ t& y) |8 o; e 0 A. W- d: ~+ y: V; A- ]1 m" U1 L
//AMBE2000每次读写是24个字为一帧0 m: f: O& K! N! d: f
//写数据时将数据在底层存储起来,等到中断的时候再发送
! `% }/ I @/ ^- o. j //AMBE2000输入数据是以0x13EC开头的
9 y* ~& j" K4 Q1 m$ F( ?" C8 Y write(fd,&data_write,sizeof(unsigned short));7 l$ Z5 S3 I' Q" E5 K" }+ J7 X( ]
) j6 n* x. H+ v. T1 h
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( n4 i1 r4 R" [5 u$ J read(fd,&data_read,sizeof(unsigned short));( r) y) D- m# }9 n
8 K: U$ p' ]2 _3 o4 c
if(data_read == 0x13Ec)
. y* {9 I, r B. E# t {8 d6 F R) }+ ]
- {; f. K' W- t, g0 f printf("data_read = %x\n",data_read);
; s$ U1 Y1 {; @" N7 Y2 ]; ` }
6 e0 B7 o/ f+ V3 l0 b: E
( E8 J5 l i' ?* B) i& r+ J4 \ msleep(10);
: J! H2 `& g1 V! j' `1 }3 h( x4 R P 9 s% P" v* K( q1 W2 `9 y2 o/ @
/*
9 m0 Z- s( ?* D y/ h ioctl(fd,1); & ~" U5 W0 W. `; P* G$ _
sleep(1);
3 O% F8 t, f, l' j' w, E3 @' r8 S ioctl(fd,0);5 H8 Q" }5 d6 { a% `
sleep(1);
' V) w( I t2 S; q% G0 ^4 g F4 y */ " O* q8 a1 p1 p+ D
} . s/ H! S( Y2 ~8 y9 t) J' k' P
return 0;3 G/ T& s1 S, p
0 n2 k0 s- T0 ~; h/ \' B: ~. E1 {) B1 m
}2 [+ z' o! n7 F9 ~
3 ^* X" f! Y' D5 M0 z' J& H! _: n多谢各位指教,谢谢! 急 k( \. O$ {: a( I. y( [
# I- X4 k& M# b5 b
6 F1 S+ B9 ?% O) Y# E* s' B: K4 p5 H+ r* c
- f. s3 U, m; B7 c7 U# R: g5 s& J5 `/ x9 o* K) ? \: t. N" A# B# V% g F
|
|