|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 0 k' t$ `! {! ]( f' z0 k) u
/*6 f8 y0 i5 V! q9 G. h4 {
* Copyright (C) 2009 Texas Instruments Inc. ~6 k" I: G7 W4 |3 d; j8 D
** a' x0 F" _: @; t
* This program is free software; you can redistribute it and/or modify
' E8 r3 g* t- ~8 f * it under the terms of the GNU General Public License as published by
I4 g: _9 k' c1 m# v * the Free Software Foundation; either version 2 of the License, or
) z+ f' N/ ^2 t' \8 Y * (at your option)any later version.
! M# d8 d6 w+ H R *
/ _, c' [+ m/ x# z! J8 ~ * This program is distributed in the hope that it will be useful,
3 m# w6 B2 V) G# m6 d. ?: y3 r * but WITHOUT ANY WARRANTY; without even the implied warranty of T x9 m' `' K
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" f: x8 H! f. P& | * GNU General Public License for more details.) Y2 B0 Y9 L' s4 i# B
*
& l4 k6 t6 {! f a9 F& \, w9 w. r * You should have received a copy of the GNU General Public License
; G4 V! J- [) W * along with this program; if not, write to the Free Software, K M$ w D5 u; r u
* Foundati' W$ I$ g9 |& o7 V* Y7 f
*/0 b& I% `" ]$ l6 ~
#include <linux/module.h>
) X& ?" X3 t. W. k9 W#include <linux/init.h>1 b- e o0 [% l( R' }0 m! P7 a
#include <linux/errno.h>
) x# w9 X% {2 O# G' s- ]#include <linux/types.h># B4 W3 h' G/ F0 S5 P( n5 z8 J$ v
#include <linux/interrupt.h>
w. m y7 i6 P9 t) f$ z2 s- A8 M#include <linux/io.h>& p; o8 j3 z! m4 V1 Q6 `
#include <linux/sysctl.h>; | J! O* W- r3 u2 e5 B" K
#include <linux/mm.h># ]. v" R8 @. X$ G% C% F
#include <linux/delay.h>/ w' A# \; W2 S8 c# t2 @, \
#include<linux/kernel.h>! n! @1 Y8 @+ G# O7 b
#include<linux/fs.h>( ^$ e7 d1 e; t! X3 O
#include<linux/ioctl.h>
! }) F1 v5 E4 k0 `# ~#include<linux/cdev.h>7 U9 T) Q' S. l2 U
#include<linux/kdev_t.h>, t3 l/ K3 g! T, Y! S+ a& D
#include<linux/gpio.h>0 C+ b8 @3 p% u ~
#include <mach/hardware.h>1 Y W0 R9 l y+ F/ z+ Q8 ]% ^) ?
#include <mach/irqs.h>1 ~+ z, F7 G! S1 c
P+ i: J+ P9 @( K \" u
#include <asm/mach-types.h>
( x9 b% c. {' l2 A9 j1 v6 L) r#include <asm/mach/arch.h>
{4 i w: t" z: N# y2 o1 Q4 c( h1 j#include <mach/da8xx.h>
* B# A, L' P* i% \#define SYSCFG_BASE 0x01c14000
2 J" b7 e% i9 ]& Y/ M1 B5 P#define PINMUX1_OFFSET 0x124 6 K1 O- W6 O- D- H
#define PINMUX18_OFFSET 0x168
, x8 Z! g3 Q5 E: L( G" a#define PINMUX19_OFFSET 0x16c
: y0 M# N8 U7 l! Z3 r#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
: x3 V$ u6 Q: ~#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
; w2 @3 U# o( L. n$ m#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, P+ g4 r g8 h) H) A
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR( {+ V- \9 l7 K& P& j
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! W* r) t& q+ G) |$ @( ?
1 b. m/ H7 I6 v: O" g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
# R% |% q; V0 ? s A5 m#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. Y* n! v$ y) Q9 _( J//PSC" L6 M0 [4 o- P0 U/ F+ X6 D5 H
#define PTCMD_ADDR 0x01E27120
, v4 u9 J# B: X& i7 o" m0 r#define MDCTL15_ADDR 0x01E27A3C6 B# N; R1 n- {& w9 H
#define PDCTL1_ADDR 0x01E273045 |3 Z1 X8 v/ T7 [ r
//GPIO8 direction( X; N6 B; l4 y9 w
#define GPIO8_DIRECT 0x01E260B0
1 R/ e6 O. z+ C% H, a, y; T0 j#define GPIO8_OUT 0x01E260B4
; K, A1 D3 ^7 N# y5 H" B- } m#define GPIO8_IN 0x01E260C0
3 T4 \( u+ V* X( ~/ N w) ~; t* Z |6 D' ^: f+ p
//#define MCBSP1_RINT 99 ) r( A- z7 h- q+ a
//#define MCBSP1_XINT 100
! v0 x; j9 N% ~' bstatic int MCBSP_MAJOR=239;3 M+ i' K4 |- R: q
static int MCBSP_MINOR=0;
; K" u+ Z8 D6 D% U$ W0 _$ \3 v1 ~static int count =1;( z# T9 B( ]& G- u& Q
0 G: _$ ~4 H$ e2 O4 P g/ h
#define MCBSP_NAME "MCBSP-device"
7 o$ H! g4 j3 m% d8 m H/ p
5 ?% a5 d6 V7 S. u$ j3 k( Dstatic struct cdev *mcbsp_cdev;( P' J! H! H4 a5 ?- S& P1 b
static struct class *mcbsp_class;
4 m4 \& ~$ J) j$ ]8 P3 hstatic dev_t mcbsp_dev;" B- o6 ]1 h) d% z
unsigned int DRR_data;# X |3 T+ T _1 n, G
unsigned int DXR_data;$ H3 v9 V, @; k( t$ ?# G4 d& Z/ L' }
static int mcbsp_open(struct inode *inode,struct file *file)
0 u% M4 \9 o. k1 }( i{6 Z- M& z+ D9 r) I2 z9 V( O
, B1 J* g: X9 @' s
//interrupt enable,initialized
/ K* \" G k- R+ Q ] unsigned int temp;# L) Q) K" D ~, H, m& A
//SLEEP_EN(GPIO8[10])---0/ M+ H! H: E. V9 ^ E/ o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 j! o2 _9 o3 N3 K6 z+ Z+ z temp=temp&(~0x00000400);. w2 L% n6 t8 q9 d% W, P; y1 h+ C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; ^* ]* Z& U; y1 n" ?
//RESETn(GPIO8[8])----0----1. _( @( ?' n& Q7 C" `2 w% q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 t% X3 {* O, ?- ~/ ^6 v
temp=temp&(~0x00000100);0 I9 Z3 X8 Q: S# w
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0# }* B5 N; { Z7 l8 N2 V1 Z+ k6 k+ \
udelay(100); K; I" ]0 V7 }& P6 U* e( c% X) b
temp=temp| 0x00000100;
. M5 H" d" b! n& l2 F. U" [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ X5 ^3 x5 ?! } udelay(100);0 \$ Y w4 [( ^$ |; H1 G. u
printk("open success!\n");
8 v2 X5 D0 {& X: W x" B return 0;
( w' i: I* o# A6 r& c# O6 G}' r8 C G( X+ C( O( A
+ u* R! y0 e: P+ y$ h( M# E
static int mcbsp_release(struct inode *inode,struct file *file)
- T# t Q# U9 E; R{) x, p5 l4 |2 n+ f8 u
printk("release success!\n");
. T/ N0 s G+ V/ J return 0;
) r: c1 o% f0 J7 B7 d+ Z}: l; j; R9 Y7 `; g! C
4 g; C, ~ \4 {) A1 j' Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)7 G4 s& [$ ~! I$ [2 {
{
. ]% q7 m; {8 Q copy_from_user(&DXR_data,buf,len);
- u' } ?9 Y, w2 w7 p3 n$ w2 H6 G iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % ^) u/ q! n8 u8 }
return 0;
" ?: W$ o* J$ i8 w 0 e% K G2 r0 @5 a) M4 L
}
k& r; G* t% e. u+ R4 M" d3 y7 E( o! g) X" W/ u) `( ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)8 [3 ^* _7 X2 q% p5 [+ T% G3 Z
{ , k/ `" T+ Z2 _$ S z; `
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 H0 V. C, |3 c9 N- ^* O( f4 F copy_to_user(buf,&DRR_data,len);
# T) u% v# l& W5 v, n& ? return 0;
3 Z v6 f8 E- E, ?: ?}; C ~0 `; |: K; O& e3 j
% K3 k5 V, e8 G- B6 D' m
d8 w9 T: p$ D5 S: B. Z7 X: G4 i0 astatic struct file_operations mcbsp_fops=
8 T1 U5 |2 f( t3 U3 L8 d{; \6 g8 f# t; R7 ~, Y, x
.owner=THIS_MODULE,
~" L/ u2 P1 M4 R. i: N( V, |& V .open=mcbsp_open," {) p" H1 t8 X4 J7 w7 D& B
.release=mcbsp_release,/ z% q$ A" W; I# h; V4 _
.write=mcbsp_write,
" X9 C& F/ i: t0 D; _ `* P .read=mcbsp_read,
2 A7 Q+ Y: [( P8 q- |! P' o' J};
% m) k. H9 Z4 E% o# Tstatic int __init MCBSP_init(void)
( h; n, h) B5 A& `: \{
6 T: c2 m9 @% N6 W/ B7 w int ret;, m) S/ g O3 S8 k+ j# w) @- e' Z
unsigned int PINMUX1_REG_old;
# \- y" i* L5 j) j1 \/ j unsigned int PINMUX18_REG_old;
, `5 x) E, j9 W# I& F# a unsigned int PINMUX19_REG_old;
+ b4 ^ [% {5 _9 y unsigned int temp;
8 w5 R5 {; ^2 }3 _ V6 b. d if(MCBSP_MAJOR)! g( X, m7 k( v6 g" l6 @
{2 Q) i6 g! D8 q) O& ?! ^, R
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 a+ Q% z! T Q6 h5 ^2 |: ?: d) u
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! E7 R. e+ G# f1 z
}0 G+ o1 O/ x! I/ p0 L* d$ u
else# T# @, q& \9 l+ |9 x3 O1 X
{
; U/ [* q# r8 K8 K0 C6 r ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; _! d" R3 j& p+ A7 Y! o: L( I7 L
MCBSP_MAJOR=MAJOR(mcbsp_dev);
* |2 L" x+ Q* Q9 n; ]2 m, ^# { }
% z1 N' Y& k& t+ G4 H w6 d
7 ]3 D, B0 E3 D" w2 \ if(ret<0)
& a9 k9 u& I+ S, c {
# v, X* y q# [* d$ p6 n1 J printk(KERN_ERR "register chrdev fail!");
/ u- C# }5 w- x( V return -1;2 u5 g4 a8 I- \/ y
}
8 |2 z$ D( c5 T0 m' n " b' Z' ]+ b# B. w
mcbsp_cdev=cdev_alloc();
6 t3 \5 j+ [* H# ~. D 6 R3 O0 L! Q: W
if(mcbsp_cdev!=NULL); g& a- s* l9 I( w' P. K
{
0 h) L' j& E( q, \ cdev_init(mcbsp_cdev,&mcbsp_fops);: B: J2 L- t- h3 N# j5 p# m9 g0 C
mcbsp_cdev->ops=&mcbsp_fops;$ }, W0 K! k3 V" f. m+ v
mcbsp_cdev->owner=THIS_MODULE;9 u* g7 {* }4 Q% ` a5 w4 @
( h( q* U. q* L. M% s+ d6 {
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# `5 M5 x0 P, W3 H. d8 y" W
printk(KERN_ERR "register cdev fail!");
$ |9 I) s+ r8 G+ h# T+ F" I% o else
" ~) y4 P+ y' s printk(KERN_ERR "register success!\n");
$ o6 b; W! E- F. K7 E }: W$ z6 [* m V2 {0 \8 c/ S, r9 Z6 J
else( i$ o5 L- _, }( C
{
9 q; W0 d, E. u# M8 u; @9 l printk(KERN_ERR "register cdev err!");
v+ B# Z# F9 m/ V0 U return -1;
- y2 u% S6 y) J3 [ }1 P4 ~* E; n) }) Q. O
7 y9 @0 I/ {: ?5 b5 h( _$ {
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! P3 ^* H" l$ |: Y a
if(IS_ERR(mcbsp_class))( F" ?! [) {9 u! S# Q# p6 ^
{! i7 k3 M- j, M7 L
printk(KERN_ERR "register class err!");
2 C; Z& }% g# ]( a9 A return -1;6 Y' @3 e9 w1 K7 _
}
7 Y e* S' _4 q2 u( Q device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 {) z0 v( i4 _: d4 B
6 ?2 e2 `% P$ r* ]5 I ?4 A //PSC, _6 h; z- f5 A7 v
//add Enable MCBSP2 t7 E" P) |& |- k) _3 s* c
//test
( V8 {3 r6 L8 L2 B temp = 0x80000003; i; |! n, f. J5 X, ?
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! p. R) ?9 L4 P, g$ V. E temp = 0x00000003;
7 L, C! u) X" T$ M0 k8 l writel(temp, IO_ADDRESS(PTCMD_ADDR));
% @* `0 j. h+ ?; l( p$ N# F, i' M
9 {4 k) \: ^1 J% g) ^ temp = 0x001FF201;1 _& O; O0 c. i$ X u
writel(temp, IO_ADDRESS(PDCTL1_ADDR));& ]8 F: X8 F# x. X8 L& z
& ~, r g) l' x5 t
//PINMUX
2 m1 \' R) d; F/ K7 A //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; D! \; A; D. I( r s PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); & e1 [) e; r0 @8 J' i2 A# Y
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; * l, C% h& w8 E8 h% N- I' `& m: s
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 X' ]4 I: ]5 W) P% f$ m, G
c/ ]# q/ c" D //SLEEP_EN,EPR,L138_SHK1,L138_RC% k5 j P5 J; p% s9 M9 A
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); $ D( H& }9 R. V% I
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / S# y4 K: e" M( q7 V2 @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: l m7 Y; s3 m# u( u) i: ]
7 C9 S, M4 ]4 j+ E) D/ t //RESETn,L138_SHK2
& V2 A5 H3 z& z3 m4 W( ~ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
y% `( n8 r# Q PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ C4 H( J/ g$ C+ h9 u/ q+ ?
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) B8 M; {2 Q* I W B# {3 R* G( x
( }' z$ e- I8 M- Y1 A + J$ T' r9 |3 Y& H
//SPCR Register N& L6 n+ }, a5 G- c
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ K1 c' p( F# [; y3 e, R
temp = 0x03000000;//(DLB=0)
0 Y. x" }8 N+ ?0 q J5 V& J // temp = 0x03008000;//(DLB=1)
8 v( [/ }7 j% S4 l writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
3 l4 Y; z# [* a0 `, ` temp = readl(IO_ADDRESS(SPCR_ADDR));
( O2 Z) W, J Z0 H5 n, o% g- @4 R* P printk("temp=%x\n",temp);2 n! G+ G: I$ ~( u, u2 ~
1 d# y2 U) B8 x1 f/ `; V, d
//PCR Register5 r- D: ?5 R! b0 `9 m& |
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ i- ^ ?# k/ \ J$ c* R# F( e // temp = 0x00000F0F;. F0 V ^: C& J' h- e
temp = 0x00000B0F;5 K- Q6 z$ ?' h) V' W- z l
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 D2 [- @: O( I1 F* ^ temp = readl(IO_ADDRESS(PCR_ADDR));
: j1 F2 ?' ?8 ^9 B printk("temp=%x\n",temp);
2 ^( i4 f% r- X# H& d& b7 z3 P //SRGR Register
3 l+ }# \2 f/ M1 \. W //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- G( d' j, b" W; Z
//temp = 0x301F000B;
* q8 w6 U# I* F2 W6 r( E* L. S5 X writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized P0 P4 S1 x1 [
temp = readl(IO_ADDRESS(SRGR_ADDR));$ Z$ Y8 h- d5 w" S
printk("temp=%x\n",temp);8 {% G/ b) w* H9 _
//RCR
n2 n; ]5 F. D" E$ j: Y, W //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, y) U* [1 W8 p7 l
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. U) j+ H4 X" g2 S- ^; P9 m) S5 y
temp = 0x00440040;
" G, o7 k. n, e q writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 W+ G2 i: }# r! f$ U; O4 S
temp = readl(IO_ADDRESS(RCR_ADDR));
# \# I) o C, c/ w; _* } printk("temp=%x\n",temp);
7 a; a/ i/ g) y //XCR
; u Y/ r1 A- s# K //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! w3 I# \ v4 O' G$ t( V
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. D s+ b' b$ i4 y temp = 0x00440040;0 |& V1 z, f& Q: D8 h5 l
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized * z$ Q$ z ~# G& `
temp = readl(IO_ADDRESS(XCR_ADDR));
3 D( ]1 b+ B5 V& S printk("temp=%x\n",temp);
2 k$ G& R: E+ R' T- u udelay(100);& Y8 F! b8 t Y6 `
//SPCR Register9 X% }6 T: c% w/ A
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, C: G* f8 {- a+ J+ a temp = 0x03C10001; //DLB = 0 VS DLB = 1
[$ C$ C# h* M, W- Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
2 {$ E; G) z. R5 p9 X temp = readl(IO_ADDRESS(SPCR_ADDR));
4 x* n( A7 E8 v. t h B; L2 } printk("temp=%x\n",temp);
/ j. W" ^3 [3 p! |5 t e udelay(100);
' V) ^" }; i& S. ]; d5 Z
2 _* d- d* f6 P# R6 P. T. e/ B //set GPIO direction$ P4 c7 R" c) l' S! W& N* i
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 t8 Q' Z' ]1 b, |$ D# n; c temp = temp | 0x00000100;//EPR----input
6 H m, N2 L+ ? temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. L+ U! t1 H9 u7 i1 {
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ u g8 R) E, }
9 C2 K, v" _0 G4 F# i _8 j return 0;
n. e, Q, F @}
! E7 h. y( t# istatic void __exit MCBSP_exit(void); N* ^- Y: T! h! g8 i1 \+ u
{
5 C! |/ W, G# C, t; S' X printk("mcbsp chrdev exit!\n");: V, U" Q& O4 I
cdev_del(mcbsp_cdev);
) `5 q8 q- _/ C7 f6 d unregister_chrdev_region(mcbsp_dev,count);6 ` T0 u& L+ ^2 |$ W6 ~9 u( N
device_destroy(mcbsp_class,mcbsp_dev);0 Z5 f0 m) ?% }2 ^6 {2 A7 q
class_destroy(mcbsp_class);
4 }3 I* }4 `- |# A$ C) c o/ n}
, d0 z ]9 U4 O# @5 Q9 f$ A2 vmodule_init(MCBSP_init);( Y) z* N! ^. O2 A( f9 g% c" H6 \
module_exit(MCBSP_exit);
! R+ T3 k* ^/ ~
2 t4 @6 k% L; l' ~7 }2 ~MODULE_LICENSE("GPL");3 l6 \& C3 c) i3 ~9 h
6 Y; ?" \5 f$ X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
f* X# C9 @9 s我的应用层的测试程序如下
) t1 l! G6 s. `" i: i/ Y#include <stdio.h>8 D# [% B0 t9 v5 Q F) W
#include <string.h>
; g/ Z* T/ k; F( m. v#include <fcntl.h>
, V7 C/ x- I5 {#include <unistd.h>
( F0 _, E" O) P* J#include <signal.h>
* H- X/ |7 d9 z7 k- t( m. ], S; G#include <pthread.h> //线程- N B/ x( {; \% T# d
#include <stdlib.h>9 M* l# w0 i6 k1 ?% ~
#include <pcap.h> //捕获网口数据
9 @8 ~. }: s% h3 M! V7 O, t( P1 s#include <semaphore.h> //信号& c6 B4 f* {! H, L% E
#include <sys/types.h> //消息对列# M* I+ O# w) r' F& R
#include <sys/ipc.h> //消息队列
5 A+ ^% l: |7 a* S) v4 S2 c- O; o#include <sys/msg.h> //消息队列' F2 F1 X( m) |% Q
#include <sys/select.h>% W8 j. P4 l" x
#include <sys/syscall.h>6 m) Z x# k$ \$ ~7 l9 z2 t
#include <sys/stat.h>
: F( ?3 v# t3 o: B0 r6 N#include <sys/mman.h>5 D: y) S& k. r
#define msleep(x) usleep(1000*x)
5 v3 I( w, x3 f. N
, M# K/ b9 y; V" |- W& K" E2 r, hint main()
2 z: l* t% ~, ^- @0 F{ ( c* Z, a/ I. c6 p1 Z
//MCBSP,ARM与AMBE2000交互设备
/ d ]2 L# R6 d* U1 |) I$ F int fd;# e, J; c8 @4 f8 t
unsigned short data_write = 0x5555;
' L0 @' G) o, A, B& R* o% T0 K unsigned short data_read = 0x00;
; C2 f8 }) x& x& v" E/ c fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) A( C% _$ w! b' [+ F# T // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* H) \& x' N/ W( H . M8 c3 `: O0 W+ o
if(fd < 0)9 T. q, Q9 s% G4 \4 d( g
{
3 W. H1 B: D( j( T( m# v' i perror("open failed\n");& X% `4 ^- T6 g
return -1;
, s3 B# P9 z8 N3 |2 r% a }' n) u+ p9 e v; P# i) N
9 ]; m5 t" t2 J2 J8 z# b while(1); k. }) S$ V7 t0 z4 F) C
{( } l0 u2 j0 Z% w- [
* o% i7 v- ]# X% t6 ^ //AMBE2000每次读写是24个字为一帧
F4 R: A+ b, b J/ R/ \+ u //写数据时将数据在底层存储起来,等到中断的时候再发送# G- Q" {9 c5 L& }0 K5 t
//AMBE2000输入数据是以0x13EC开头的' V6 _+ g6 r0 o* e5 I) ` l
write(fd,&data_write,sizeof(unsigned short)); L6 e2 _( n: P1 u2 r# b
+ [* V# e3 j5 H2 M5 [% k
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 E- @# x9 ~; _+ [) m
read(fd,&data_read,sizeof(unsigned short));
# h+ q- O# k C, b6 E0 L& R' R
! t4 Z+ D% x! y$ `4 M4 {5 d if(data_read == 0x13Ec)( G6 y. V$ |$ z' d ^& X5 m( ?
{
. e N) X: a5 f! G " d( n! S# V$ S, w$ g
printf("data_read = %x\n",data_read);
4 ~( V C! b! Z3 c2 H# O H s; B- ? }
9 X9 I, `! }' P5 k _ d3 i ( y( ~6 ?4 F& [+ b+ N; g
msleep(10);$ b, }; A) C! Z: P6 q. m
4 Z7 ~0 q7 N/ u7 w" o /*
9 J' M/ j6 F3 Q' H* x ioctl(fd,1); ! _4 c! G |) E0 Q; v p
sleep(1);9 O+ Z4 K# x) r7 M7 H
ioctl(fd,0);: T% d3 l& `$ E
sleep(1);
$ l9 M# z. z2 K) J */ + X! a6 a( ~4 X
} . C' n& X1 ^5 G0 a* n! z+ @
return 0;
6 |4 ^! a; y" [# G6 M / o* G; f \9 n' d1 L- E8 q" N
}: c% |" F% n; M! H1 ~, P
' J! ^$ h7 O( x' E' l
多谢各位指教,谢谢! 急2 X7 ~5 B' r1 `+ H K* T( Y
- V5 E0 ]8 |8 p8 f& k; c( p" b+ u6 w! B
% p# B( Y2 b* e4 x$ U! S1 N! I0 o
$ c; {7 B0 B& }" o
, V7 I2 S7 g3 E( z4 o8 v$ M% D
|
|