|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( M/ X" F7 F$ S+ u2 _2 F5 y( V
/*+ [1 G/ j" C* G8 g
* Copyright (C) 2009 Texas Instruments Inc
( J1 [' P5 R6 {) y *
7 l; q4 z( n& R4 N * This program is free software; you can redistribute it and/or modify6 g" e. l% N" e
* it under the terms of the GNU General Public License as published by
8 V5 u- k( y0 U$ \% F; a2 \ * the Free Software Foundation; either version 2 of the License, or- w- |( a7 o9 O0 ?& s0 Y
* (at your option)any later version.
# ~4 y) L8 P4 h0 n1 d( J9 m *
1 K- s; P/ k% u- ^ * This program is distributed in the hope that it will be useful,
3 r# f ^1 G6 D * but WITHOUT ANY WARRANTY; without even the implied warranty of
# ?* w2 X0 a" ^" _+ S8 M * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
M. T% r5 @3 a/ U8 U7 h * GNU General Public License for more details.: s# P! \2 \8 G1 j6 Q+ i' d9 {
*: ]. k. q# N; }& W7 E5 a) Q2 Z
* You should have received a copy of the GNU General Public License
: S; t& p) F8 J+ v" D9 k, d& E9 ] * along with this program; if not, write to the Free Software8 P" u, U1 @% o' w; d" ~5 E) `7 V
* Foundati! i2 E$ a t7 n1 Z( i2 g: Z) U
*/5 ~% e+ _+ k$ `/ x# c4 a* C7 P
#include <linux/module.h>5 p! M1 g2 E" c2 }) ~3 L
#include <linux/init.h>
4 ~: \- e d: ^- T2 S. E/ f2 L9 k w#include <linux/errno.h>
# j: ~- E3 f/ f [( G& v6 {1 b#include <linux/types.h>( d2 D: |: T, d8 G
#include <linux/interrupt.h>
' A- Z/ O2 S; K9 k# k#include <linux/io.h>2 j7 @2 I6 c, F
#include <linux/sysctl.h>- |& I2 E0 @' b6 Q1 U7 w& v( V
#include <linux/mm.h>
7 M# e# k2 s+ e# R5 O" g% f#include <linux/delay.h>
5 L' Q. U# [( ~$ A#include<linux/kernel.h> z3 }5 Z F9 p0 z: {3 j" k. s
#include<linux/fs.h>
) c. [) S3 z: K5 b) t( `#include<linux/ioctl.h>
( }, X" m6 c* D# l$ L# l#include<linux/cdev.h>
6 V2 j7 U5 e4 L5 v$ Y [#include<linux/kdev_t.h>8 |9 Y% R* Q7 S9 I' M1 k
#include<linux/gpio.h>
' a6 u" E5 h- N3 U" P#include <mach/hardware.h>
5 i/ o- S( K1 g& A0 u, U7 w#include <mach/irqs.h>, y& F) `3 d9 x' G' `& p
% L7 h5 S" o* Z
#include <asm/mach-types.h>
$ [* S4 T( @" a#include <asm/mach/arch.h>) D. `( n0 q) X5 b
#include <mach/da8xx.h>
# N' W) P- G$ O6 z#define SYSCFG_BASE 0x01c14000
' ` f" x! T* V% f' P( w#define PINMUX1_OFFSET 0x124
( i; p1 N7 Q0 w& y2 u#define PINMUX18_OFFSET 0x168 6 p- Q' Q' ?" F* q
#define PINMUX19_OFFSET 0x16c
3 i, i5 t( ^% M- N4 M9 [1 Q0 E#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
+ @4 N* a2 r8 q4 K& E x#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% o4 B$ R+ n, L" A& |#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
, \$ E2 U, [1 j* | G8 R! p% ^#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
7 J$ g7 S! Z* @/ c#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 o8 s1 Q3 B9 r6 H% K
) Q) G3 A& J; ^$ H) R+ ^( W+ Q
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR* r3 C& |& I/ Z9 Z8 Q
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
$ u1 } w$ J/ I* p6 L//PSC. b# q' p' W& {3 j6 w( o
#define PTCMD_ADDR 0x01E27120
9 L5 Y$ R1 L7 j- \$ x# z3 J#define MDCTL15_ADDR 0x01E27A3C
C8 b& n8 ]/ b+ F% u: v; d0 o* h#define PDCTL1_ADDR 0x01E27304
% \& _+ N0 J2 a) _//GPIO8 direction
( R0 c! c2 \. ]+ K#define GPIO8_DIRECT 0x01E260B07 `) _$ |' h9 y2 e! a8 ^
#define GPIO8_OUT 0x01E260B4
7 {: z0 ^0 y8 H, X#define GPIO8_IN 0x01E260C0" v9 r( s, O. P! |
$ H) r0 g c* a) G3 c2 u//#define MCBSP1_RINT 99 0 |7 m9 R0 K' c0 i8 q
//#define MCBSP1_XINT 100
7 I7 C ]+ [( l$ a. K d5 qstatic int MCBSP_MAJOR=239;4 E# w7 y1 \4 D. _5 ?6 M: b
static int MCBSP_MINOR=0;
/ m0 f% r) w% Z" F, n4 J. w- nstatic int count =1;% C4 p- c) ]5 V2 o i7 C) i/ o: D
7 Q" p( `0 K3 _- S9 \" C! X' ^0 Z8 i
#define MCBSP_NAME "MCBSP-device"' i6 W$ u6 |2 c; D
( f7 Z& e2 W3 p5 Gstatic struct cdev *mcbsp_cdev;
0 Q \4 s, T' S3 O1 Z% g1 w& Astatic struct class *mcbsp_class;
4 ~" v! @: O" ]8 wstatic dev_t mcbsp_dev;
2 y% F1 K8 {% C1 o! E/ iunsigned int DRR_data;
6 P& h: G, i/ w0 v9 X( hunsigned int DXR_data;0 G# `9 f+ K7 ]$ Q- x
static int mcbsp_open(struct inode *inode,struct file *file)
0 A* @; b G2 K: a v" V' ?$ |{
/ L" H- y/ M& ?
: v/ b- f+ i# N6 f4 ^; B! a V# M0 } //interrupt enable,initialized% H C; U \6 o5 q* A
unsigned int temp;2 @1 }. i. v; b: G+ P3 M
//SLEEP_EN(GPIO8[10])---0: C! J# W! c+ J+ M
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% l: l2 `! I+ N# y! ^7 C) a" ? temp=temp&(~0x00000400);
3 j8 ^& v: q6 h2 s0 n8 s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 [; k" m6 p# t0 o5 v8 g* g+ _ //RESETn(GPIO8[8])----0----19 B& B' \" x; I0 Q3 ^$ \
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; c: L$ ]! S2 D3 p: G8 E
temp=temp&(~0x00000100);
* a& C; P: Q) P5 L. T6 q- { __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
Q: |% c# L* z2 a+ y udelay(100);
* P% ]. \, l( \) {9 Q* f0 c+ D temp=temp| 0x00000100;
7 @% d9 f+ C( Y3 b6 P __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ }7 L% n) x* L. O9 F* Q
udelay(100);% V* F6 R2 \/ K; D% z4 ^$ Z
printk("open success!\n");* k5 l5 }) C, _. n5 ^, u9 i
return 0;
7 z$ ?" Y7 b/ r. x, }}
( C( ^& A$ Q# K
6 t; v L5 V# l% z& ^static int mcbsp_release(struct inode *inode,struct file *file)
3 Y2 Q2 B) o" W& Q{% r2 m: N9 r* X
printk("release success!\n");
4 Z( ~1 a; `' A8 Y2 A3 Y; K return 0;3 \* W' B1 D- t* n) Y8 M
}/ `3 {: {9 Q8 d \; h \
* `7 N4 u) L! x7 _& c5 B7 xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ |, R" ]8 {0 N{
4 R8 ~( n) e% X4 s3 p copy_from_user(&DXR_data,buf,len);
, n2 ]5 p" x/ E3 U iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
) A" K( G. L) H b* ]5 j' D return 0;
9 ^; F1 H" s0 L( [) W
& a3 M; w. ]( \( s! U0 y}
: J% w1 Z$ Q$ ?6 H1 q6 ?2 C9 [. J: [. U
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" q: q# b" b% K0 r: m |
{
; ?; W) C! R2 S DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' F/ q& \; u4 O2 ]
copy_to_user(buf,&DRR_data,len);
+ d/ E; A# w+ N0 k return 0;
/ `3 v6 |5 v y6 Y}
" l% }$ Q& j. n7 U2 s. o+ w, \5 X) z; P5 i0 a7 s. R
' X8 x! y7 U) |# Z9 M- ]
static struct file_operations mcbsp_fops=
/ n: U: _/ o- T& U9 X9 }3 T/ E{
! h% P1 s7 y3 ]$ } .owner=THIS_MODULE,# G* `3 |& G( X; V0 G' J
.open=mcbsp_open,
9 I& p% b/ @( [* D* @9 x .release=mcbsp_release,) d/ D. l7 V |* p9 _0 T
.write=mcbsp_write,
) N) \, }7 j9 B* X .read=mcbsp_read,
: v) @: @& O0 F, C# K- [9 T& p( g};: m' y9 |7 R7 Y2 [) \0 k6 k) j" ]
static int __init MCBSP_init(void)
; R* o: Y W; M; C8 B3 X" g{8 T8 U, T3 |: X) y4 ?9 P- D
int ret;
* I, n/ H/ D+ G8 _8 R unsigned int PINMUX1_REG_old;" j' b2 b# t3 |1 x$ I
unsigned int PINMUX18_REG_old;# e) K" G% U L* U5 K9 v4 B
unsigned int PINMUX19_REG_old;$ D5 A7 p8 E# C% Y7 J" Y
unsigned int temp; 7 } j' z7 D5 s% C W2 {
if(MCBSP_MAJOR)
1 p- S( L$ @, S' H# J7 l% |# {0 A1 L+ ` {2 H x* d1 v C. V: {* Q" c; m
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- J$ l4 Q1 y+ i# A9 C' `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, j3 p$ O- i$ [
}- B5 V. V4 R5 k. ]1 {$ z
else
: M: Y' f m' D- K) K6 _ {) j3 o G. o# f4 ]( ]% Y, C
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( X# M2 J& Y' W: ^( `
MCBSP_MAJOR=MAJOR(mcbsp_dev);3 r: d( p6 c% P7 m$ @2 F
}
, G+ u2 {0 {, s$ T, N" ?
! b3 k6 q+ D2 f5 y if(ret<0)1 B# T1 X7 O& J. S0 S) c
{5 [. f6 a+ s! P, {6 G. w; g
printk(KERN_ERR "register chrdev fail!");
! [( B: u7 R. L5 |7 W$ W return -1;
% l$ |" b1 r, D7 a+ \ }/ F) G; X5 M _9 O v7 D
" a- A) a5 u. F6 q7 z ` mcbsp_cdev=cdev_alloc();
; _/ Q7 m4 s! o% _: C 8 K3 u1 [& c; \, d6 p
if(mcbsp_cdev!=NULL)% I& S5 @) P, y: z2 L) P
{$ q: v% B! a* y
cdev_init(mcbsp_cdev,&mcbsp_fops);/ R+ C/ G3 \7 E1 P
mcbsp_cdev->ops=&mcbsp_fops;$ Z1 l6 N5 l% J
mcbsp_cdev->owner=THIS_MODULE;
* J4 b/ T; q) T& z
/ }; {# M9 X+ K# u0 x: i if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* T6 x- ?" \ `3 |( x printk(KERN_ERR "register cdev fail!");
' h5 W6 e) w6 O- J, `, x- E6 m' @ else+ T% i0 Q; Z, M, g. |
printk(KERN_ERR "register success!\n");
2 u+ k8 x/ i! P( J( Z }
+ Q% j$ l& `4 J else" I% J4 @. A8 o7 o U% x
{
# N% j4 v/ m z+ E9 c# Q printk(KERN_ERR "register cdev err!");
8 {. i" o4 }6 i. u4 f }1 \# [ return -1;
$ i/ q& D! k$ C) {4 I }; K; R( c; D# x
3 X- K' A$ }/ F' a mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% K2 q8 |, p+ G& N9 ]- y
if(IS_ERR(mcbsp_class))
, b1 G* k1 T6 h, p {. g; v' k7 M& I6 a/ D1 b, L$ m
printk(KERN_ERR "register class err!");
# u$ {- v: G- c( | return -1;2 L( ?' T- M+ ?
}
# F6 q4 K+ P, Z: t2 G" C6 p device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ l* i/ D. O* y5 W" c$ x q
' f$ A$ y1 s" ]: x4 k //PSC
! ^; z8 |" R+ p1 | //add Enable MCBSP
& F5 x& x" ?1 k$ V; a+ d& V //test
9 F7 N. U! k3 O temp = 0x80000003; T- M9 A' @/ D/ s6 t
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
/ L/ U' N) O7 `1 d) S5 T( Y temp = 0x00000003;& H& m) l) F( Y" O. {/ q
writel(temp, IO_ADDRESS(PTCMD_ADDR));
% h& H; V, ^; K: V( `: s: I
- Q# R9 `( X7 D' \4 b8 {+ w! C, B* T temp = 0x001FF201;+ _3 P! i5 Y) V# I: g9 |3 v6 y
writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 t. b @( F, H6 t
C2 K. \, l7 w- J3 s$ N- o
//PINMUX ! S8 y' O. U7 T( T0 n4 V6 y2 D+ Q
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) Y4 n2 u+ V! e; | PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); N# Y. e% x, A! N; o0 y
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; % c/ x; m6 f7 I( }- l
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, J+ f7 D' p( z1 O/ M
8 V* w7 M9 ~1 n i# T1 { //SLEEP_EN,EPR,L138_SHK1,L138_RC# N- j( q z6 P0 o2 J8 ?
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, [* B: J r+ O PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
6 E$ d' _# Y# g, Y4 F writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' P% }& R' D6 o! e5 l/ w8 P ' r* z/ f3 q: o9 y& C( H
//RESETn,L138_SHK2
9 K2 I: a% ~( W* o PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 7 L( _% j3 C/ G& ]
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 M$ x" O* R. `$ s writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% t K1 K& ~) r9 i, Y ; ~. T6 E7 w3 c0 O$ ~8 `' w
& E& h7 k# m ]# ]6 w //SPCR Register
7 E$ Z$ M8 T1 e; J* n! B //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
, D/ L5 }& d7 ~' @2 w! X0 P temp = 0x03000000;//(DLB=0)
8 ?0 R; Q% Q% ?: v% U // temp = 0x03008000;//(DLB=1)
B* E2 c3 U2 G9 Y writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ ~4 z" j% M2 l" V6 X temp = readl(IO_ADDRESS(SPCR_ADDR));
+ T6 i% d3 Q5 z+ u8 p2 V& I5 v) o printk("temp=%x\n",temp);
1 y3 ~5 P' ?* y
# `0 U: ~4 Q+ o, e //PCR Register! @% H$ [# b; }
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, n) z8 F* ^& ]2 E! z8 U9 F3 z
// temp = 0x00000F0F;( z. P( x' y' ?, n, k# b( w6 G
temp = 0x00000B0F;. |: e9 R9 O7 B6 T! @( Q$ U
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 5 b3 ~6 l( R/ A/ x
temp = readl(IO_ADDRESS(PCR_ADDR));
; |8 t- b# W* v3 U0 [$ ?6 A* [ printk("temp=%x\n",temp);
8 z1 K+ H" i8 _3 ^5 q& m) k //SRGR Register
2 F+ r! D8 s' e1 b //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( K' l" `# r6 z9 Y) o' E; T7 }+ t9 E* S
//temp = 0x301F000B;6 b* S0 P2 S4 n, h8 h
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ! J, ]1 d" j+ {" ~8 o0 C, O: W
temp = readl(IO_ADDRESS(SRGR_ADDR));
& \: E# g6 m2 [9 N printk("temp=%x\n",temp);- p4 U( e# I+ u5 _2 x
//RCR
0 k- r6 B2 c x2 R% G //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' |6 D! Q3 h7 ?$ |
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 S; Q. x- u$ ^/ j2 J6 ]9 J
temp = 0x00440040;
' z7 n6 P6 N* O- q2 S writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 m3 D& i! w* G$ x' N/ _6 e
temp = readl(IO_ADDRESS(RCR_ADDR));
& H! ~8 v i+ a+ X! D4 j& F4 b printk("temp=%x\n",temp);
: e9 M" k/ x7 O7 V //XCR/ e: \# w* J- t* D& E* A s7 E
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
l5 [# A5 D# p8 ?2 A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ q3 |# h! L0 { temp = 0x00440040;
% m! g) k/ u, y5 }) Q r, A( @- @$ q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 e1 K1 ]! L) h( E% }- [ temp = readl(IO_ADDRESS(XCR_ADDR));) k {/ r7 \" \. S8 g+ D4 g
printk("temp=%x\n",temp);/ Q# a1 x; c4 X9 M/ s
udelay(100);
" v2 w7 k; X( n2 o& [1 h3 _ ? //SPCR Register6 o; Z( r5 Z+ I8 s5 y# u
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. N. k) J7 H J0 b temp = 0x03C10001; //DLB = 0 VS DLB = 1; [+ U( O: t- D& @ k2 ^3 ]
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ H+ }7 ?; q! u R6 T
temp = readl(IO_ADDRESS(SPCR_ADDR));6 l. x/ S2 b( l6 ]
printk("temp=%x\n",temp);
. ]' m$ g4 x p/ L' r udelay(100);
3 e7 D- N" `' o9 g2 I; O Z# @
6 _7 O6 d1 |9 l( P //set GPIO direction
) r7 c) f g7 X# ^+ Q4 q1 | temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
2 P$ A Q1 ?0 S2 h temp = temp | 0x00000100;//EPR----input
2 c' a. L) I' P+ Q. E W( T) j2 M1 v I temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 ~9 Z& s. G, h, t __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 a$ b% @! l0 x* N$ ] * k! b2 G: H8 t7 x2 Q) l
return 0;" N2 u4 ~6 s8 d m6 ?$ t0 h
}
% T# L* q3 ~ qstatic void __exit MCBSP_exit(void), s8 @0 e. S! x. i
{1 l; m: g$ u" X. A
printk("mcbsp chrdev exit!\n");
8 V( f* I0 R0 ]) l- V cdev_del(mcbsp_cdev);
* N4 S7 S6 H3 b8 V) J2 i6 h4 g unregister_chrdev_region(mcbsp_dev,count);
: D2 u" g _! ~% m) @/ F1 b device_destroy(mcbsp_class,mcbsp_dev);
C5 k: e; T4 J- d class_destroy(mcbsp_class);" {& Z r8 d9 v& l7 t
}1 O( i! ]; p7 j" Z! y* l0 w
module_init(MCBSP_init);
# {* W: P/ o8 B; w. P5 L% rmodule_exit(MCBSP_exit);
5 Z" v) S% {; {5 B5 v4 B- X3 b$ Z3 U
MODULE_LICENSE("GPL");1 U% O5 Z2 ^: c0 O
- i& l0 Q+ r$ K# ^
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" z0 n ?* q2 Q) U7 \- F
我的应用层的测试程序如下4 ^) m0 [* n9 |" F8 d; h, W
#include <stdio.h>: E8 Q" t) A3 j/ g# S/ R
#include <string.h>1 a6 S1 ?% _6 \$ ~8 ]$ }6 B
#include <fcntl.h>
8 V. {( n( |5 k$ r2 _+ o7 _#include <unistd.h># R# W9 e4 B% F& v+ \) f$ r; w/ H
#include <signal.h>
: }0 a" H3 u* r! Q" U#include <pthread.h> //线程
8 j, N9 a# z5 C* H#include <stdlib.h>" h+ Q( ?7 [8 ^' ]; V3 T# _
#include <pcap.h> //捕获网口数据& A3 V( P8 w$ o2 l8 G
#include <semaphore.h> //信号4 a, [/ [; m+ ~' @* h3 X( R7 A
#include <sys/types.h> //消息对列4 `8 [) y9 z9 `5 w
#include <sys/ipc.h> //消息队列
* u/ z# Y3 F# i, ~#include <sys/msg.h> //消息队列
8 _$ l& `- u$ n3 v- E#include <sys/select.h>
& h" u! z3 }1 C' s/ q0 _, e#include <sys/syscall.h>: b6 ^) i- d( k, n7 Y- S$ s
#include <sys/stat.h>
- c6 b9 H4 o! u. O& P#include <sys/mman.h>
8 Z2 j9 |' z. H#define msleep(x) usleep(1000*x)8 u4 J2 A `9 [+ Y) W
, g. o6 l! _+ h3 \& v! s% d& @
int main()9 F9 t& F) p$ V( E1 n6 h3 c; X/ H
{
& o" [9 _- E4 o7 h3 _# a9 b! @ //MCBSP,ARM与AMBE2000交互设备' q! k" T. c/ V2 J0 h
int fd;
9 @/ m3 X- D* m! S0 Y/ [( P unsigned short data_write = 0x5555;
. Z0 R7 X" V G+ c+ C% i9 L- y5 ?/ _( | unsigned short data_read = 0x00;
8 J. g' I* u {, c fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. n4 |. `2 f+ c& J8 T0 l: N // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
D1 S+ Y: W8 M" n7 b/ R 1 W9 {# O( t" {4 W
if(fd < 0)1 @$ ^' y0 ^* O. n4 M$ C9 m
{
/ a1 l$ u! J1 r, Z perror("open failed\n");7 { k) ~6 R3 t" k4 I
return -1;+ a7 p/ f5 ?- d" x9 P/ h" }& B
}" S- [6 x( V/ ~) @; E8 M
# X. W$ \" f/ n' S7 f
while(1)
3 @( \- d- a% o! T/ k/ c2 z {9 O- d1 `0 E" X! o
4 c, y2 B, O) T2 _' b //AMBE2000每次读写是24个字为一帧5 A7 o% B1 I/ u4 n+ H( x
//写数据时将数据在底层存储起来,等到中断的时候再发送: I" c% C5 _' f) w8 I. Y8 R
//AMBE2000输入数据是以0x13EC开头的
/ Q% x0 N! Y6 `9 t9 z' W5 a* b( V write(fd,&data_write,sizeof(unsigned short));
, i5 S/ \* v9 h! \, m1 k/ A
( `. |, {+ q8 l4 ^2 r //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
+ W3 @* e6 U( \& R) q P read(fd,&data_read,sizeof(unsigned short));* Q- ~ o- l8 B- }, K1 R1 N
. G& l1 K+ n. j( q+ l6 J( Y if(data_read == 0x13Ec)
$ I1 g+ k, ]" z8 h8 D! p {( y7 s5 Z; Q7 M8 t
% X0 U; V- ^, }( j printf("data_read = %x\n",data_read);
* l& x, B& [/ D. z( g; a }
& w( c( H+ i) p; h. D
$ t. a4 V; B8 b4 S msleep(10);
$ H* L8 l+ J8 F
9 G0 c# B6 f% L% _( i /*. k3 A3 p' V. P! b/ g" r% t
ioctl(fd,1); , {9 N6 X% ?, c
sleep(1);2 _5 W4 R1 m* x( X
ioctl(fd,0);
* W: V/ R- N# M9 @2 K sleep(1);& _4 V& @7 P% y8 ?
*/
q$ q6 Y; \2 ] } 6 S! @7 {/ B0 r2 T
return 0;
b+ \) b, j& j* s& F! E5 N
9 \2 P0 S7 d4 ]( ?9 I% B5 O}" F( y/ Q7 H' z$ T% ]& x3 z
3 O/ O$ _! }% [+ [. _ X1 \# {, J. e
多谢各位指教,谢谢! 急5 c+ M' w" q+ D# m$ L6 Q1 @
) M* {! l. u6 G. H$ X. P i7 ]; k+ H
8 h7 ^& x/ X; U! a- B
4 \& |- F- s9 @- ]4 V7 O
/ y4 A2 b3 H' l# f( D4 e& b$ z$ \$ X: D: W$ E2 p d' C8 |& u
|
|