|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) G( @, Z; }, F9 b9 E/*0 @7 r A, v1 J, B% q( K
* Copyright (C) 2009 Texas Instruments Inc7 _8 L4 F% @5 W6 B$ J- N2 I e
*+ w0 |3 U: Y" X: ~ O2 R
* This program is free software; you can redistribute it and/or modify
3 ]5 D6 }; m; G' \ * it under the terms of the GNU General Public License as published by
& J# Z% G% V9 A& r8 O) M. O4 Z * the Free Software Foundation; either version 2 of the License, or- E9 k$ \9 B0 w( c7 I" X- C
* (at your option)any later version.
7 M% b2 d7 G6 c9 G& X. [ *
' u) {# j6 L2 E2 G1 F * This program is distributed in the hope that it will be useful,% I1 R( t) C ] h
* but WITHOUT ANY WARRANTY; without even the implied warranty of
0 ?- _( O) o1 y; F( C! f, m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) m; f7 w4 n) |/ j; n/ Q * GNU General Public License for more details.
, _5 S t# R) v- w. p) e *
D: a9 D% T0 k& w" K1 F, D5 _ * You should have received a copy of the GNU General Public License! a, [9 r* E% s
* along with this program; if not, write to the Free Software
$ }0 a) H i# H * Foundati
2 z1 W0 }/ E4 m8 ^4 l, C4 }! Y4 @: P2 V* ^*/7 t& X2 H0 { \& ~) s t
#include <linux/module.h>
3 B. q" g3 Y/ Y! A( c. a#include <linux/init.h>( n5 w, V( r* Q' v/ E6 D1 r3 L
#include <linux/errno.h>; g% K7 h* j4 e& b4 a
#include <linux/types.h>
, c. x1 d" L; `& g" ]3 o: }# L#include <linux/interrupt.h>
6 m: h4 J% r- s& ^- H#include <linux/io.h>
$ a: R' _/ \$ M! |/ r6 _3 @ G#include <linux/sysctl.h>
9 ]0 f( P- z7 b#include <linux/mm.h>
" B. N, `8 a H#include <linux/delay.h>6 i1 y4 B U* r r5 g. y2 N4 K! C# F
#include<linux/kernel.h>0 r) \& |: m1 r$ G6 j" p) z
#include<linux/fs.h>
8 g: J7 S7 m4 }#include<linux/ioctl.h>5 p* T% w; {$ r' t( ]3 ~
#include<linux/cdev.h>
; I* J8 s9 k6 `* e#include<linux/kdev_t.h> j$ Q r. l/ P2 K T& D
#include<linux/gpio.h>
6 N E5 J5 G' @" [#include <mach/hardware.h>
/ T7 H0 B; N# }2 D7 b* I/ D5 U#include <mach/irqs.h>$ W- a1 L4 V, r2 b
0 ~) @' V$ m3 m% @% W. V
#include <asm/mach-types.h>
' F2 [6 ~$ K+ t+ p#include <asm/mach/arch.h>$ I% Y) ?7 l: l5 j
#include <mach/da8xx.h>; u3 ]( N# Y5 P0 R# B8 A J8 ?- x
#define SYSCFG_BASE 0x01c14000
/ \9 F/ P* r8 D) Y1 j#define PINMUX1_OFFSET 0x124 ( U0 ^4 z% a3 o' k8 [
#define PINMUX18_OFFSET 0x168 2 m4 }/ R1 G% [# j& I
#define PINMUX19_OFFSET 0x16c
6 n7 t8 J& n* B% d, y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
0 d, q0 s/ _2 R4 {#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% u0 G8 i7 U: @% h4 y#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
. I$ N" _1 W" n4 M- g, T& J1 N! u#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR. E) T& |- J/ K9 K. N0 n/ c9 Q
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
! \3 W3 }3 H6 ~' L) Y' S
1 Z b) _3 y! S% |9 i$ u8 D#define DXR_ADDR 0x01D11004 //MCBSP1_DXR2 E7 M3 b& f3 r* V' u
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( B8 s, S* S( A, n5 o0 ?3 |3 D//PSC3 ?. f' b& y# z2 ?7 q
#define PTCMD_ADDR 0x01E27120
: z: t+ @) a' W4 e" f#define MDCTL15_ADDR 0x01E27A3C8 W: J6 g# x* m0 _
#define PDCTL1_ADDR 0x01E27304
! o% Y2 a* o3 G8 v- p- s//GPIO8 direction- X. e2 O/ U+ }6 }# r
#define GPIO8_DIRECT 0x01E260B0
9 n6 z8 g# q2 g% t* p#define GPIO8_OUT 0x01E260B4. N \# {4 d: d) R/ O6 s) Z' v
#define GPIO8_IN 0x01E260C0/ m/ W8 \: X+ `% n
8 M: V: Z1 u! ]7 {! H/ c
//#define MCBSP1_RINT 99 % Z3 }, A9 G& }
//#define MCBSP1_XINT 100 " }" G4 H$ t# I$ b. A
static int MCBSP_MAJOR=239;2 Y0 A4 ?% Y8 R0 T& F0 k0 _/ g1 u
static int MCBSP_MINOR=0; Q! v7 a8 L( @" ?
static int count =1;
8 Y/ v& g. q4 A/ T0 s7 t
7 k6 V! q9 o2 N& n6 f0 R#define MCBSP_NAME "MCBSP-device"0 J& ^" M, ]" f! u+ Z
7 K! d. b' o* s# E6 |
static struct cdev *mcbsp_cdev;4 _9 c. t! _) |( X1 X
static struct class *mcbsp_class;
- W8 a- P- F) I$ u) B/ Ystatic dev_t mcbsp_dev;( c+ ~- F- h4 o' N: ~! M6 k
unsigned int DRR_data;
; S2 k9 M7 a; a' v# zunsigned int DXR_data;
! g$ a' V' E7 o* ostatic int mcbsp_open(struct inode *inode,struct file *file)
6 ?( P5 \/ _/ x{7 g" c+ |4 Q- H0 Z2 t- B
1 p- y( Z' q" t) x! F- @) x //interrupt enable,initialized
$ k: @0 y6 N) X0 p: F. T unsigned int temp;
" f( B6 D, x0 V; w" z //SLEEP_EN(GPIO8[10])---0$ x% l, z! k$ i
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, Z7 p: q& _. n& S( j' Q, j( O5 H temp=temp&(~0x00000400);* ?, d6 _! t& P5 U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; n% \; r) B( w1 x/ {, r/ t& V //RESETn(GPIO8[8])----0----1( ?1 P1 y& [% n8 Z0 k1 ^0 N
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( Y# T( f/ M5 Y; h1 W+ X temp=temp&(~0x00000100);) o7 \0 ?" \) E
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, f7 b1 e3 B8 z: _" A S udelay(100);% m! G$ k' ?2 t7 P; f q
temp=temp| 0x00000100;/ N. ]" |, ^7 G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' d$ W8 X) E. G# h( O, D# z
udelay(100);8 i$ t; E4 D9 C% D( _1 U E
printk("open success!\n");
2 B; }# W- M, Z2 z$ t2 ] return 0;# j! v4 j$ g1 K9 V, J7 {8 [# ?
}
8 b. j) B/ x1 R
! z S, D6 d) y A2 ?9 u. n! ? w' ?static int mcbsp_release(struct inode *inode,struct file *file)# W* @" G" D4 h. C
{6 g' C/ t/ a- a0 |" W
printk("release success!\n");/ f0 |0 |! E' \% G6 H: Y
return 0;
, c, Z4 L4 U2 ^& M/ R, X3 H% K) K}
5 L0 D0 n U1 \- d$ W7 d4 S% |% I. p0 F" j2 j: l- J
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
' B* K" J5 G; {, Z. |& W! H{
. i' B4 n0 i: d: _& R: C copy_from_user(&DXR_data,buf,len);
' W0 X. f) h& b) d% W( V/ H; H9 k6 h iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 G! T: {# C& G0 F return 0;! g: `" L, o/ W' d5 U$ c$ H9 e3 Z) S
( x. A9 h! ~- y9 ]2 @: U; T; J4 a
}
) ?: q( h' @ W3 E; b! w* n: G
" q0 B. {, v, z& x* U1 ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 |3 ^: U- Q5 ~8 O( I: {, A# K{ ^6 c4 l, D; b3 ?
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
$ i8 D5 x5 v) T1 }1 `5 \* D* I copy_to_user(buf,&DRR_data,len); 2 O! P' H" t: T1 l9 I: _
return 0;0 s8 H9 z- e) Y7 _5 H0 G$ Z8 c
}
, f8 O* _. Z; F/ n/ z H1 t4 l+ E3 [/ D' K
5 R& } q5 q4 zstatic struct file_operations mcbsp_fops=
# W4 N! W, n% B# t/ X. J{
# G+ U- h* K( g: J# t .owner=THIS_MODULE,
8 A8 i" c2 ~* I+ I .open=mcbsp_open,$ E p8 l3 q" M3 {
.release=mcbsp_release,) p+ d# H [1 Q6 {" m
.write=mcbsp_write,4 C- O v3 Y1 u: U9 K
.read=mcbsp_read,6 E- A! W z% i+ g) b
};3 F2 j3 a5 w: i( m( ?& ~/ s* S
static int __init MCBSP_init(void)
8 s6 S) v" s j1 {* ]% ]" D{
2 J, S- P( S8 i5 G int ret;
5 w8 W, a' ?% N& ]' o4 N; o unsigned int PINMUX1_REG_old;
0 J$ Z2 V$ B8 t unsigned int PINMUX18_REG_old;2 q) }# @! [! ?9 o
unsigned int PINMUX19_REG_old;
; U" Q! ~" z0 w/ c+ \ unsigned int temp; # O3 ]1 j9 y# e/ k0 P
if(MCBSP_MAJOR)0 @- Q, D0 s- h9 t _" ]9 U
{, `0 S: \. q( ]& T- ~: b( j9 R, X0 I
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 F1 N4 I8 w7 ~2 N ?4 N5 H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
) s; s- R1 e* B/ `/ i } C, F$ I" N6 V+ d4 E' b) V1 y
else. @. ^4 u4 E! D, A7 g' e
{
* C) \! s7 C* S) a# ^ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) A+ K$ Q7 Q$ L' Y- H- Y5 x$ _: k8 h MCBSP_MAJOR=MAJOR(mcbsp_dev);
, d+ P, ]$ w$ Q( T) o }
) U+ E7 j) K5 ], N * l2 x- `/ l+ o0 |
if(ret<0)
# |8 ]5 k. o! ` {- e7 H5 }5 w- {/ G
printk(KERN_ERR "register chrdev fail!");
+ W, g: m7 e! h& t return -1;: W$ A. { n9 L5 H6 ^. w% G
}5 N7 g' F+ G1 Z% } }5 m
/ V; {! W$ e: P& x' Z mcbsp_cdev=cdev_alloc();! F) w! Y1 u, [( X* w0 R% `5 u! T
7 H1 f& h: D4 J3 z' q/ E if(mcbsp_cdev!=NULL)
& e0 z) @- H+ X; Z6 C, L$ Y {
) y. e' ^ f( @0 `& B cdev_init(mcbsp_cdev,&mcbsp_fops);
9 w8 O- ^5 O* R( _; `# R9 u mcbsp_cdev->ops=&mcbsp_fops;+ G. E' @- M- p$ U* ~0 u/ m" P7 s
mcbsp_cdev->owner=THIS_MODULE; P! J2 }* A( k/ c, \9 ~
+ X2 m0 o8 n; _( {+ x if(cdev_add(mcbsp_cdev,mcbsp_dev,count)) |5 y8 |' v5 O9 b0 L5 e! l* z
printk(KERN_ERR "register cdev fail!");
4 a7 a( Z. O% J- \ else, k! [& } |/ e6 _) r! ? A
printk(KERN_ERR "register success!\n");
: ~! [6 D" v P3 E+ L }7 H# [& a! u: {
else
% Q7 ?" K( J. A {0 {) x- E; n* ~% P& G9 Y, _
printk(KERN_ERR "register cdev err!");
5 v' x" k- M& H7 m6 K return -1;
: I. A$ z, T' g: O( W }
. s9 x) w% |: f F# D1 h0 c- E
: v; x0 A8 ?7 x$ N; W mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* @$ C8 b3 j0 X) H8 i9 `
if(IS_ERR(mcbsp_class))8 I. r% u* u$ U
{
1 a: k& d2 n- ?$ e printk(KERN_ERR "register class err!");
h# R, Z8 I8 J0 }8 |. m+ N return -1;( T; u8 d2 Z- \# }2 G8 |" n3 k5 g
}1 N( y( @" \5 b5 L9 E2 p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 W% H" \0 n3 R" N' r7 S
4 L V+ R- q7 u6 j6 C _4 T
//PSC7 A) e8 ^! `' C/ a0 |1 n
//add Enable MCBSP& e. |& p! f p: q7 c+ j# W
//test$ B; r m% M' {& f! {' H) C! u9 K
temp = 0x80000003;! R" F+ }7 X! p& P! I+ w9 ~9 } d6 e
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 b# X; f% f5 r1 Z# J1 G/ v temp = 0x00000003; I( O# }( M4 w1 F, e, u& _
writel(temp, IO_ADDRESS(PTCMD_ADDR));' E; y% K' r7 R, b% j
* O3 b9 |% f6 G; w# T' _
temp = 0x001FF201;0 ?' e7 n. {/ r: a4 v
writel(temp, IO_ADDRESS(PDCTL1_ADDR));2 D+ {) r5 L. S6 Z
- v3 x# A& V, i% P //PINMUX
3 e% N M" w4 A, ]' {9 c //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 h1 i! \. n" }, D* e5 ^( _) S% I/ P
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! R* L2 O2 [* N& Y) U$ G# g6 U PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* m4 o5 }! C, G& l. L! Z' S6 h writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, R8 y A2 m1 [5 d; t , }$ u( p: d" Z0 N
//SLEEP_EN,EPR,L138_SHK1,L138_RC
9 e( H$ N# O* _6 I PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 @0 d* F1 [& ?% @$ k$ T' U
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 2 y2 m& ~! ]9 k9 }; ~
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 p; D3 |8 N' l9 P, K# S$ ] ; P4 b. R6 ^( J2 @: b) J
//RESETn,L138_SHK2
1 v* b* f: D) ~1 H$ D, s$ o4 J& ^ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
' O6 U+ Q+ z. Q& B u4 J PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 n! l, Q: K0 L) ?/ J6 { writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 @* A F7 H+ X1 Z0 ]" b( y* F) V& }+ L
% B( s8 ]; [- y, X& b2 N
' l' B( x6 t/ d- B% v |! y( G //SPCR Register
5 ?/ }; B2 i) m: q! G9 u: e //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 W( N- [0 J" o1 |, S% a4 C* v temp = 0x03000000;//(DLB=0)9 M0 d+ b: Q7 ^* Z
// temp = 0x03008000;//(DLB=1)
' C1 s. }5 u! K writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset5 z9 M2 Z( t' V, H0 e( Q
temp = readl(IO_ADDRESS(SPCR_ADDR));6 k9 E9 e, E( U$ q r5 L% e5 I
printk("temp=%x\n",temp);
- z9 k* F+ s0 D : p V* x c1 |7 i, U) j
//PCR Register
. i2 K+ K) L6 V5 W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-02 K/ p6 g- N; d" A: S: a7 _
// temp = 0x00000F0F;
2 f6 c1 P8 Y3 \3 r1 L R1 b temp = 0x00000B0F;
6 k% O2 B1 R* }# h writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! a) J( N8 t! y2 b5 g5 m temp = readl(IO_ADDRESS(PCR_ADDR));
* V" k- o, ~6 |* g# m6 M3 s printk("temp=%x\n",temp);
0 N' v/ K0 l3 F! E& x4 B //SRGR Register
! t) a3 r5 X$ A( J' U3 `# ] //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 @* U3 F0 M7 y //temp = 0x301F000B;
7 U3 }6 g8 k7 ]5 G writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
$ ^* J( |" I, _5 f temp = readl(IO_ADDRESS(SRGR_ADDR));
h! C/ U: A/ i printk("temp=%x\n",temp);2 z" o, M% D2 C# q& C/ e2 c/ ~
//RCR
" _/ W W0 q# ? _ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) Q4 x1 @3 O# z //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 D2 C9 Z2 e0 S5 A- n
temp = 0x00440040;
8 Y5 n% N7 y+ t( N( }1 h writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 A" q0 U7 q) i: i temp = readl(IO_ADDRESS(RCR_ADDR));
- v) C# t/ S/ d# e! d& M printk("temp=%x\n",temp);
( v6 R8 o1 I ~' s //XCR7 q% } ^% A9 X& o* s m3 f5 D% l
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 l6 {$ h+ K, c1 _6 `' V/ K' Y //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. ?" @$ t( h' |! m0 h! y+ [ temp = 0x00440040;
x" q% t6 j$ j+ P writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
" ]4 k. s) k; v; m temp = readl(IO_ADDRESS(XCR_ADDR));
( ?1 @$ O: L% i printk("temp=%x\n",temp);( P+ a- ?2 K3 r7 Y) I4 O
udelay(100);7 ?$ \8 j: K" t7 A& T+ f) P
//SPCR Register) T1 i# H. x# z, v- K2 {9 u, Z4 Y
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 g5 q( Y2 @( S, P8 Z
temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 P$ l% W3 J" f writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 R( E$ m+ }0 j+ H) @- z temp = readl(IO_ADDRESS(SPCR_ADDR));
+ u& q0 S T- G# n9 l printk("temp=%x\n",temp);2 {% Q/ x+ f/ c
udelay(100);$ Z( c A* r; H! O- h5 t
8 j0 q6 C2 i! A8 ]) ? //set GPIO direction& y) m. `* C, M/ k" S! B$ U
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
. h$ Z7 s$ s$ i$ J$ S2 i temp = temp | 0x00000100;//EPR----input( U! w8 T3 \3 [' R4 h- y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ _' ?2 B6 \/ K* t
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 X2 W. W+ D( K! T8 r+ t d( |# T
; x: O7 v/ {7 k) w" d+ x return 0;3 D+ E! l) u! `0 F% K1 m" i: C
}, g( L, L+ \; s
static void __exit MCBSP_exit(void)- ^" E' p& `4 e% s( ]. R
{
3 s; R/ @# m( X, x# z printk("mcbsp chrdev exit!\n");
" t2 u( a# f1 Z" ]9 }! n cdev_del(mcbsp_cdev);
0 j6 {/ J9 f0 T9 O6 [9 f9 n( Q unregister_chrdev_region(mcbsp_dev,count);0 u! z- X0 F% a& ^$ w
device_destroy(mcbsp_class,mcbsp_dev);" ^9 t Q( v! Z1 ^1 T* R
class_destroy(mcbsp_class);
0 p/ R( z4 v& P' [% u. \) r7 V) N}2 O: `- A2 x/ A* `1 M$ u
module_init(MCBSP_init);& E, ?- v8 l7 Z9 x
module_exit(MCBSP_exit);: y3 H/ w$ X( |) L* B6 H
6 V0 y/ \9 H. a
MODULE_LICENSE("GPL");" N2 S$ E. V2 ~9 k! v" `
4 @" N; e6 X k- D( g2 b我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& m. N" V+ Y& C& T" w: Q Q. G' W. Q我的应用层的测试程序如下
$ X4 q9 C2 W, C9 b/ H8 t! D! `#include <stdio.h>
1 p+ R5 ~6 O5 a6 F, U#include <string.h>
" F5 Z% ` C; Y#include <fcntl.h>
6 e/ u8 @& _/ F, p+ W4 X#include <unistd.h>
% O* `% }8 w4 y b+ q- ~#include <signal.h>
# z7 y M+ f+ V& R, Q3 G1 b; h9 [#include <pthread.h> //线程3 R P1 H2 q2 ?. t6 K( F
#include <stdlib.h>
" j6 m+ h; y. f3 A7 w8 V#include <pcap.h> //捕获网口数据4 q& S, E# o2 D/ ?/ c( q% Q
#include <semaphore.h> //信号
5 o7 I$ }9 @& G9 ?2 {' x/ [; U#include <sys/types.h> //消息对列) J- B7 P) U# C$ @( g
#include <sys/ipc.h> //消息队列
- A2 n8 t$ i: W( j2 E" G; e#include <sys/msg.h> //消息队列/ G% ~8 c) {3 M8 l( J
#include <sys/select.h>$ f3 P2 W! N' R+ G) B+ i$ i
#include <sys/syscall.h>
2 n' B {; z; Z#include <sys/stat.h>* J @3 ^* H; t
#include <sys/mman.h>7 C# g0 n: O/ o# d. o/ X
#define msleep(x) usleep(1000*x)
: Q; h6 z5 k6 n7 k* E
1 H1 a( j# h" Z* E3 Aint main()
' z% A/ k' l0 y{ 9 L- J4 j3 _3 Y
//MCBSP,ARM与AMBE2000交互设备
& k1 }' v5 v# s/ B6 e int fd;0 a" R6 r' ?% O# l) j! T
unsigned short data_write = 0x5555;& v( j9 B+ s3 F4 B
unsigned short data_read = 0x00;+ R& m: }" X3 z* X
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 K' ]/ e- c( R2 C7 Q( u
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' T. L) g: c4 C- @& T) w4 g
6 Q6 y5 `& y- _2 q% v9 n z, I if(fd < 0)
3 p1 g3 R$ X: H$ q {
6 d9 Z G' d! j; u; m+ P" \ t) S" C perror("open failed\n");, B$ `: c! a; E8 }3 n
return -1;
8 G ~2 K$ }8 ]: m2 G% f/ ~ }
. S7 E* V) q2 s 9 |0 {% t c) I
while(1)
4 S$ ]$ I% b0 p! L1 w3 V: y {5 J% \" N- V8 g4 p7 @
! c% d. h' H. F: Q //AMBE2000每次读写是24个字为一帧' ~) O2 @7 q' m1 h& t
//写数据时将数据在底层存储起来,等到中断的时候再发送
3 E3 g( I1 \3 m: H9 |* D8 r6 K' e //AMBE2000输入数据是以0x13EC开头的! _6 O! }) t/ V
write(fd,&data_write,sizeof(unsigned short));+ f/ W1 o2 I$ F4 m, z R- N2 I. l
' V. V: j; n1 h, N
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ! W. b$ Y9 D! B+ G" V
read(fd,&data_read,sizeof(unsigned short));
7 v, }/ ^. w; z; E
, m' n/ D5 K& l& D if(data_read == 0x13Ec)
- V3 i& Y7 T$ R. R5 o' K {8 K6 {- [5 j2 f4 B7 N% I
- u$ V8 q4 L7 D/ t: a; g
printf("data_read = %x\n",data_read);
. ] p% ?( d2 G* U6 d a }
% o% ], c1 W( X, Y
% e0 M: K! P [ msleep(10);& B& b n/ B4 X# Y
: a6 P; w. o$ h/ v/ M1 U) B /*
: B8 f) m1 J' t8 D1 i# U, e ioctl(fd,1);
6 N! E- k9 ?2 o sleep(1);/ w* I0 F8 K0 }# j8 C" H
ioctl(fd,0);
; I( I+ ^9 s+ O' x" X, [ { sleep(1);
( ^4 x6 }( o+ p4 o, ~/ `2 A */
q( e% N5 Q# u; q# V+ R } . {& v; E' {8 g
return 0;) C7 _, |% T; V) s2 H% `3 R
/ T1 e1 n) ^( J} S* Y5 _. d5 Y- [5 Z* h2 i
/ @! Z1 B4 [3 o多谢各位指教,谢谢! 急 e4 ?$ o) Y9 x7 _0 F% b
" e5 n7 p! |/ \4 _, B
" A* V0 P# b- P, V& S" c
1 ?) F! i) t7 ~! H. P
. h1 K; ?7 [& I. s% n$ `
6 r; |# b3 Y2 f$ O |
|