|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: U }# p7 C3 r! l
/*
# u$ A8 B+ d9 z0 P * Copyright (C) 2009 Texas Instruments Inc
$ t9 @+ T; M; Z O *7 T" X. h4 }6 U) x" y
* This program is free software; you can redistribute it and/or modify
% l4 d; L+ P: [2 h8 w" R; n$ n * it under the terms of the GNU General Public License as published by
( ?! I e, A7 ~ * the Free Software Foundation; either version 2 of the License, or: w* X; ^6 D* \! A
* (at your option)any later version.5 s9 S- Y) K$ z5 u: [0 @
** j; v- K3 {1 H5 m9 w
* This program is distributed in the hope that it will be useful,
9 `. C2 _2 V+ x! {% G/ d& Q: c * but WITHOUT ANY WARRANTY; without even the implied warranty of! s8 y; N$ s4 |. Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 t% b: N7 R: Y( c! d: L# b
* GNU General Public License for more details.# z8 U$ V. o4 x; V: l
*
z7 ~% s8 W; y! a& k * You should have received a copy of the GNU General Public License, h) w8 E; }- Z. u
* along with this program; if not, write to the Free Software. U/ u9 q+ l7 j! C3 \ }
* Foundati- S- u) Q) ]& w6 C" L% u0 |; U3 A
*/
! Q, e: g" o; N1 b Q: D#include <linux/module.h>2 K: }; a) b; G) Y2 r
#include <linux/init.h>- y' d- U4 ^! g$ s, U
#include <linux/errno.h>6 t9 t. B3 F+ A% g& r( K$ O
#include <linux/types.h>! \4 Z6 T# @; V: H( p8 u
#include <linux/interrupt.h>) C2 c% ^" X6 Q H7 n
#include <linux/io.h>
) E6 f( ^8 y3 t# e' q+ b" y#include <linux/sysctl.h>& Z+ ]5 O( @+ s# a4 C/ |1 j/ r6 o
#include <linux/mm.h>2 e. \5 Y( l* l# j
#include <linux/delay.h>
$ J) R( A, U( P#include<linux/kernel.h>
$ p3 b, }5 F# ]1 h/ g X#include<linux/fs.h>
1 w$ R# r2 r( M/ r/ h* N#include<linux/ioctl.h>( Q. \, f; k2 H" }9 S! S
#include<linux/cdev.h>
% D, c4 a" t" q* s#include<linux/kdev_t.h>& L/ s" T" \, f
#include<linux/gpio.h>
# ]0 p U# A6 n# E k& Z" L#include <mach/hardware.h>, E! F4 `% w2 J7 e# P( x5 R( e
#include <mach/irqs.h>
4 l" U; H* N/ i2 D8 ]6 `+ @* j0 b
#include <asm/mach-types.h>
7 [: G2 l9 n* x6 |9 a& \8 v/ t! B% b#include <asm/mach/arch.h>- ]( k+ C0 Z7 T0 {, I# g
#include <mach/da8xx.h>6 n1 `- b/ P) a% P
#define SYSCFG_BASE 0x01c14000: p( U: T+ h A2 O8 j* Q% L8 _( a
#define PINMUX1_OFFSET 0x124
6 I9 O' m% Y1 @ S0 ~1 b#define PINMUX18_OFFSET 0x168
* D3 a, b5 S8 F#define PINMUX19_OFFSET 0x16c0 b: C5 m8 D& z' ?8 V, q8 e9 N0 H
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 I+ s' y( R9 ^0 a$ o, j8 V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
# B! F! _& Z# K n( ~ V& ~0 ?+ e#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, D: N$ c/ p/ N* r! i) Y5 C
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
! O) \& x9 ~1 N# L1 {. f9 ]7 j#define PCR_ADDR 0x01D11024 //MCBSP1_PCR# i3 ]" K$ h3 @/ B; f
3 q0 K$ K7 n. d4 o3 H% X3 n#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 u( B3 w* i- m8 ]6 U
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
: N3 s# W1 c. Z( ]; L+ o) V6 @" Q' g//PSC
9 E9 T- G0 _$ D8 n# d#define PTCMD_ADDR 0x01E27120
4 r8 a, M. {$ c8 B) _! w#define MDCTL15_ADDR 0x01E27A3C0 n' K }8 I- h: j F
#define PDCTL1_ADDR 0x01E27304/ m2 B. r' n8 e- [5 C
//GPIO8 direction
} O6 F4 I- ^& ~, C1 l#define GPIO8_DIRECT 0x01E260B0
- q- f! u: t4 r$ I#define GPIO8_OUT 0x01E260B4
- R! r5 `" ]3 Q: H) x ]3 R#define GPIO8_IN 0x01E260C04 P( F i$ Z' N( X0 l
1 Q; j ]2 N' Q$ S; S//#define MCBSP1_RINT 99
* e! K; d; B! o% B' W$ [//#define MCBSP1_XINT 100 + s3 n- {3 ^7 L# ]3 s
static int MCBSP_MAJOR=239;
2 m# g* o9 d9 o5 S" C. D$ L, \static int MCBSP_MINOR=0;
% e& R# |7 p1 r$ T6 H/ Mstatic int count =1;
7 U) S0 K. N8 e% V0 s, E2 Y
- K6 h! R" g7 B |" p9 y#define MCBSP_NAME "MCBSP-device"
6 [. h. u" S" P/ U# |' Z
" L$ M2 b, F/ X% Q' \( B8 ~static struct cdev *mcbsp_cdev;/ V) f) g0 [" A
static struct class *mcbsp_class;
, x" v1 H0 R7 O9 r! t% Qstatic dev_t mcbsp_dev;: e1 D) W( q' C+ A+ x8 l
unsigned int DRR_data;
0 r7 E- W2 v$ m, D8 Z' Q9 `6 Tunsigned int DXR_data;0 e3 y* D9 Z# D) b
static int mcbsp_open(struct inode *inode,struct file *file)4 M6 H/ h/ V5 Q1 m! B- G( R; N
{4 k6 P4 Q+ d; j6 e" ^1 ^$ }
! o* F, R( I( |" V //interrupt enable,initialized5 a/ n" V0 i4 l7 r L
unsigned int temp;
, m( n3 n9 R0 }, L8 A1 W //SLEEP_EN(GPIO8[10])---0
% Z. J! B; q$ Z7 x/ ~- g6 v6 U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 h5 C/ ]2 h* z5 E |
temp=temp&(~0x00000400);
; w, T, ?; \0 r% u+ k __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]: n! y% p2 k) d3 {* a# m0 V
//RESETn(GPIO8[8])----0----1; I$ w* n8 s/ M$ `7 l$ w
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 [ E; D9 U" J" |5 n" d& [! F temp=temp&(~0x00000100);" f. I/ m' M. ?! g& o6 ?
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 W# }- n, q1 ] f4 W1 U udelay(100);
5 @! y( h: V' T temp=temp| 0x00000100;
3 `+ u, R7 o# b8 k __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 y( t( X" a$ `, `+ Z udelay(100);1 q( W7 l* _$ x! o3 t* I; i) `" H
printk("open success!\n");
* f5 s5 [, v! i4 L1 @ return 0;- }+ ?" L4 @; [5 v" }( e$ I1 ]
}2 T8 k7 ~2 |* ?( C( X) X
" Q& d& P9 {) x8 _# S% tstatic int mcbsp_release(struct inode *inode,struct file *file)1 U7 N' A: p- A- b
{( t* r6 g5 }/ Q% K
printk("release success!\n");9 g- `# | @$ b7 ~
return 0;& f6 J7 c1 D* W/ X5 m- ?4 a# ]
}( ^! x) w" v( w% v3 N
6 I+ w$ v U7 a8 f: E! C! o/ ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). q3 T. t3 i: ]1 T1 d, i
{
c1 S; x6 e; l3 Y5 [9 \ copy_from_user(&DXR_data,buf,len);
6 T8 ^+ X* s) ~% F2 l iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
5 j2 [ Q" ]: F! j+ Z" L7 B return 0;
# t# {" a6 M' K+ M& d 5 K* o. v( I. d7 n% A7 j9 t( n
}
* B3 C. j0 p l+ Q% ]; L& P' M. J: `+ r
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)+ P+ Y9 |' k7 \, X
{ 8 }* q- R2 N# E4 M. m# K$ ^
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 A' A, w/ @# X6 w+ l- x* Z; D copy_to_user(buf,&DRR_data,len); + ?& `* v6 F5 I7 `/ r Y' d
return 0;
& @9 n/ }: z. l! L* ] w5 x}
0 p$ V' j0 S/ S! y& Z
! {0 G- @2 P# k, S+ \0 M: d M
. f3 O; J. B8 istatic struct file_operations mcbsp_fops=
7 `: a( W! E7 S* k$ p8 a; D{5 R5 D0 H) S/ c1 C
.owner=THIS_MODULE,( c5 {; C, g2 s7 D/ X3 y
.open=mcbsp_open,7 E( p) ]8 R' @2 h3 X. H+ X; {/ s
.release=mcbsp_release, z% g8 M( Z5 v! z* f
.write=mcbsp_write,7 {8 h- @3 Z$ K n& r m
.read=mcbsp_read,
! l% z+ X N/ _+ R};
4 Q3 f5 K4 [2 z- R8 q6 S, V7 ?1 M' kstatic int __init MCBSP_init(void)( c! Q( ~3 H8 ~7 i/ w- \
{
2 d! W. P: Z/ o0 i' n3 T int ret;5 g- [1 \8 C0 C7 W& z
unsigned int PINMUX1_REG_old;3 h A" f( ^' }& m& {9 T
unsigned int PINMUX18_REG_old;
) w1 n3 \9 B, Q6 s% j& \ unsigned int PINMUX19_REG_old;- P- s) q% F. v- z; G8 l
unsigned int temp; 3 S9 ? P9 O2 K, ~ W
if(MCBSP_MAJOR)) {! e' ~9 F: V2 `% R5 H
{1 `$ K& n( U W" T9 L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 o% E" C9 r7 Z* H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% {8 @# ~% A+ H- ^ }6 _& \# O' U' _
else6 D [( v" K' h( u
{
- r, c1 I. Z J0 \# m$ A ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& {4 a+ E* S+ ]- v MCBSP_MAJOR=MAJOR(mcbsp_dev);# e1 X' t3 ~8 J, }
}, M e5 ~$ a4 @* d9 M) C# X
$ {" a& b0 J5 k0 t- X9 g if(ret<0)
; Z/ ?1 a; p+ t6 I {
/ u2 j# j! K; F- H* g$ h& M printk(KERN_ERR "register chrdev fail!");
: J$ n2 G# v9 _7 E6 A return -1;
9 j& h, a- }; a9 C8 U# c- s3 _ }; ^6 r! x+ {/ k0 }8 b* Z
" C! C! X, C0 e4 ]
mcbsp_cdev=cdev_alloc();
$ m' V; ]* T& q5 ?1 v# h1 P' o
' d3 f) N! O9 ~5 _+ X# W. d2 X6 G if(mcbsp_cdev!=NULL)' X* U5 Z4 d% ^0 x8 N
{
; L, y# M: k/ c# |) o+ y) Y: | cdev_init(mcbsp_cdev,&mcbsp_fops);& |2 y7 H. X- m
mcbsp_cdev->ops=&mcbsp_fops;3 x. O- l( e" {; T8 O* P
mcbsp_cdev->owner=THIS_MODULE;. @- M! h" C* k# A. O
5 U# D+ j2 W+ y; x if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& ~, m, T9 k H( d printk(KERN_ERR "register cdev fail!");, \6 }% j; C2 W w8 z+ ~
else: S9 [: ?/ ~: ?+ Y+ e
printk(KERN_ERR "register success!\n");
, M. R, ?3 W) i/ E7 R }5 ?' p( {: h: |2 G
else
9 F) L9 a# w( b- X {$ D0 [3 W' N9 w3 M
printk(KERN_ERR "register cdev err!");
/ J4 [# A9 Y( r7 |/ i return -1;- D' I1 p( P0 ]! e* g
}
2 H9 V7 | p3 L) u0 h # j, x( _6 H- r3 K: a* ^% r
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& K% T1 c6 ~$ _. U
if(IS_ERR(mcbsp_class)), i! T9 [& f: ?1 y0 \( p6 h
{8 S$ [' M3 p. t, x
printk(KERN_ERR "register class err!");
, K( s' @4 q* A" ` return -1;
9 G# I" }# Y2 R/ H: D* y }
: ~1 B8 G% |' Y. }* f; y device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- q9 Y8 t: I/ m& o
+ N x. r( B1 O //PSC$ @6 k% w1 J ?! f. }* d# B, }6 ]
//add Enable MCBSP( f8 d: D/ V4 u
//test
; z/ x6 M8 j. ^ temp = 0x80000003;8 H. u+ X: Z7 e' `$ g+ x8 M
writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 ~# x6 V" b4 U3 A8 q. ~, `
temp = 0x00000003;
2 i# }$ u/ `" D8 a writel(temp, IO_ADDRESS(PTCMD_ADDR));
% y9 X9 {, d) D6 Y; D! [ / i3 G4 e& I) }6 ~4 q! V3 P
temp = 0x001FF201;' A. e. j6 r$ A* w' l( o% I# Z
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
, Y3 g2 ~+ k/ r w) g ! H7 t/ l! c9 G
//PINMUX l- F. B: i1 L# n7 G7 [
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. w* g; J8 z& B2 c2 l) G
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 3 }: |- V: p, Z2 ~
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; & n- ]5 _" Z9 s `: s
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ v, P: z- f! X6 W: V
5 ]" j/ _4 a+ R0 ]+ o( P- D //SLEEP_EN,EPR,L138_SHK1,L138_RC
1 o# o& `7 c- h- t* b: G. z- l3 {# m2 l PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ t/ M8 c0 T; y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% F! u* ?' p8 t$ c2 G: P3 Z writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ q. s6 T) R0 q
; W, F2 W. d9 o) @9 I) L //RESETn,L138_SHK2
, ~' ^9 j* m! b4 ] PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! Z6 c$ e6 v: a8 i; Y5 B' }% i1 x PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; & ?4 v; u; x7 X2 e# B( ?5 |
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; ?5 |5 X, l1 v8 L
) c$ w7 G0 G' O. m
) u* r) J4 b, x //SPCR Register& @; d, ^8 e J. q+ Y: t w1 e ]
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- y9 p" J4 b& j, l( _" A% ~
temp = 0x03000000;//(DLB=0)
5 S; ^& B) n, O3 e // temp = 0x03008000;//(DLB=1)
0 g# H R7 v% s8 V) I0 L writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, w. i3 @1 q: O5 q3 D temp = readl(IO_ADDRESS(SPCR_ADDR));- b- P( ~4 H& Q% _7 Q
printk("temp=%x\n",temp);
# z5 t8 t$ _5 M( c
* j0 V7 m0 k* |( j" f8 _: n* r //PCR Register7 S; d- g0 R1 ]- C( x4 m
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: O$ h% M% v, q; R6 I7 U3 Q
// temp = 0x00000F0F;
0 j0 Q) t) t$ A6 M, c* f temp = 0x00000B0F;1 ~6 Y {4 | w; u8 @7 m
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
; O3 X( g3 O; P7 E. {) s temp = readl(IO_ADDRESS(PCR_ADDR));! B( T [: H9 C/ s" s, k
printk("temp=%x\n",temp); # k* o3 i9 ^8 C+ J
//SRGR Register3 n7 B6 [8 x5 X" U9 e# N/ M: B5 T
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 c( f4 n5 j% P. T& a8 o
//temp = 0x301F000B;
- h6 Q: _7 K4 C# g: g* e+ b writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
) N$ @0 m$ X: N3 ^8 I temp = readl(IO_ADDRESS(SRGR_ADDR));$ E" Q% z1 Z) l3 V7 @! x; B% g
printk("temp=%x\n",temp);9 w, k! L# b1 ~2 l
//RCR
+ `( d2 f0 q0 b+ ~8 F- H //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 q e/ @. U ]1 M0 j3 @
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" c( L9 }( X7 S( C. x$ L2 t
temp = 0x00440040;
; W* K4 [0 z, w t" }- t writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
& m6 [+ Y# H: S5 m2 C8 y5 d2 L! j temp = readl(IO_ADDRESS(RCR_ADDR));7 V1 j2 |+ C/ g6 T( z1 H# z
printk("temp=%x\n",temp);
4 ]$ n5 T& y, V5 U. b //XCR
" u3 E) L* p* c( W: `8 i+ e/ L //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 L0 w+ [7 M8 N' N9 g/ p
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% s9 n# O, z% ]% D" T
temp = 0x00440040;- Y' h, O$ H; x" `
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " I% T' Q' v- i- p W2 a
temp = readl(IO_ADDRESS(XCR_ADDR));
) T) D/ }/ ~' E" W printk("temp=%x\n",temp);: @ m/ k1 C! e% p5 {! }' Y
udelay(100);
$ r, H6 R/ H0 w( b6 I' w" Z //SPCR Register5 r4 ~/ P# Y. e( r& d6 _6 Q
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1+ K, K/ v7 {- a8 H
temp = 0x03C10001; //DLB = 0 VS DLB = 11 s7 P7 P5 L3 ?" K) `/ g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 @/ G' t* F# b0 |. W temp = readl(IO_ADDRESS(SPCR_ADDR));
4 p# K% n7 d& L: S/ b printk("temp=%x\n",temp);
6 N9 u# m6 S( W. l udelay(100);
6 F/ B6 ~! ?8 p- { x- u+ z
0 x0 e" j' J% {2 B p, }4 }2 c //set GPIO direction$ o& N; E# H8 M* ?9 h" _% s
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- H/ G, x+ y! M: i temp = temp | 0x00000100;//EPR----input. R6 A( J; N6 t: b, t# X0 _; W4 g# c
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 n1 ^) z6 R7 j Z, Q& \ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- A- h: g }2 }. M; x1 N) J
7 s5 W, H+ R; Q, F$ ~4 d return 0;# W$ {, ?0 N2 C: P' d* G; n1 o+ I5 Q
}
2 w% p; l: a4 [4 v m" ?static void __exit MCBSP_exit(void)
: d' Y# `, M7 n- S7 s; m& K$ O2 q{3 q9 N$ n9 I( a$ S
printk("mcbsp chrdev exit!\n");
; x: Y# P5 \6 |0 s cdev_del(mcbsp_cdev);9 s+ \* U0 r2 f0 Z1 P2 `- }
unregister_chrdev_region(mcbsp_dev,count);+ `) w) I% o: C. ?
device_destroy(mcbsp_class,mcbsp_dev);( s8 q1 L& J: P6 ^* N2 F }1 B! e2 S
class_destroy(mcbsp_class);
w: ?6 o5 W2 a4 Y* x}0 g0 U' M, H% e3 O0 `9 Q k
module_init(MCBSP_init);2 ~/ m: N8 B6 Q# \2 C# N1 F
module_exit(MCBSP_exit);
: c! ^: ]4 ?( S
i3 S$ ^4 {3 D( B2 D: G5 jMODULE_LICENSE("GPL");
% }1 _! t, v7 ^8 ?( U* L" \0 z/ @4 g8 `
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* q$ c* q v5 v2 E: L我的应用层的测试程序如下
7 J+ k3 p8 I6 m$ u' e#include <stdio.h>
7 `( k( w( l, @- H1 g/ H9 b0 ]& ~#include <string.h>& ]/ Q, w, h7 s! ~5 [" i+ f+ J% N* `$ t
#include <fcntl.h>: _, J6 g' G+ I9 E, W9 q& q
#include <unistd.h>* `* D! | s5 B: D$ U
#include <signal.h>
8 }, ^: a: |. A _. C#include <pthread.h> //线程: ^6 f& F& [& A4 [% b. z: N4 n
#include <stdlib.h># W# Y4 \& J) Z9 \+ Z. Z% M
#include <pcap.h> //捕获网口数据 Y2 i* x2 G T" Y- G' T: p' \# K- G
#include <semaphore.h> //信号
' }% d# X6 u1 b! c# ~#include <sys/types.h> //消息对列6 w& c( N$ J) ~- v- Y; J* l
#include <sys/ipc.h> //消息队列- B' D% g, M; Z
#include <sys/msg.h> //消息队列. H6 E% i' V5 g& c4 J
#include <sys/select.h>) l M4 S i! s3 O+ x% J
#include <sys/syscall.h>
8 U" O' W# J1 y6 X' K! P- Q! m#include <sys/stat.h>
0 r% \6 l: ^7 X* s; f#include <sys/mman.h>
3 ^1 z- |: b1 I# Y. L+ l#define msleep(x) usleep(1000*x)! \ t3 X) r* Q3 ^9 a& m8 H
& W: n2 |! N9 H2 z/ G7 z
int main()
; x" B8 ?: R4 g{
; N: R; I% K5 z% l2 r //MCBSP,ARM与AMBE2000交互设备
7 Z. W4 q9 H- F) W8 U6 @+ y9 c% i int fd;
! B% J7 N% ]( ]# R- K# C unsigned short data_write = 0x5555;
- U t% H: N9 F6 I' h+ Q unsigned short data_read = 0x00;
/ p/ R% k' s3 B b: M2 M& K" F fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 ?7 }* {/ i j2 ?; |6 p, K+ j1 G // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( Z9 c6 {4 \1 x. s6 E5 Z3 ~8 S
: b- x8 x" w, B( o. a# l( q if(fd < 0)
5 z# a/ k" X! a5 e% L' ^ {
2 G0 a+ V& A3 j. m, n perror("open failed\n");7 M l F9 M$ h8 I, G$ q" { G
return -1;
5 ~5 Q& k4 _ ~( O r9 m# u F' c }/ |' o- p: Q3 L( C' K
8 R! k) Q' K, V5 V& b4 X' z% T. L while(1)9 e6 r$ T# g: h% K) l6 d; N- K
{/ H; Z+ j) x5 p9 v7 _9 ~6 }
9 a) t% C. Z) `; B" p' H6 @7 f. e! c //AMBE2000每次读写是24个字为一帧
9 D: H: ~ @* o7 o, u, f //写数据时将数据在底层存储起来,等到中断的时候再发送
# ?8 h+ {( O4 x //AMBE2000输入数据是以0x13EC开头的" r7 }. d% G6 w9 G* Z7 o
write(fd,&data_write,sizeof(unsigned short));0 f# p( [ @1 F { c
# r9 W% O' k0 R8 a; v7 z
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 , c# h8 a5 |* t: s8 p( t
read(fd,&data_read,sizeof(unsigned short));! Q# d# R. H* U; E C
& w2 S. r4 }8 Y& O3 y* I$ N' | if(data_read == 0x13Ec)
m6 Y8 m, e$ x: H* s {
' s1 B2 ~8 F9 x) e ' \" ?! r, n1 H& F3 m8 o2 h
printf("data_read = %x\n",data_read);4 \; U, ]( A$ s2 }" X$ h
}
. Z" u6 u9 E* G# I $ w' m1 |# Y* K# U, I. W M
msleep(10);
" J: {0 g% F2 ~. k ) j, \* } Q2 v9 u9 ^9 \
/*/ y8 z8 L3 o2 E* H: n
ioctl(fd,1);
! f" h1 S Y# |: Z9 ]: M sleep(1);
% k6 l) d. r: r0 u ioctl(fd,0);
- v# y u+ c9 U" ~( y sleep(1);; _" r# `5 K7 X
*/
+ v |+ }: R, R7 ^ } ' k l6 m g, b E$ q
return 0;8 z5 p& p5 i5 A' v) {* O
* G+ ~! F3 @6 C" s- q1 L}
i% g% C. @! U" [" h
! M$ L& j& D4 @2 p( |! b3 ]多谢各位指教,谢谢! 急
$ E! B6 \$ {, @) N/ X; `! j5 j! t. b5 g' U' a" v0 F2 z
, q4 |- g9 \% ^9 M, }/ p2 V& E- k
a: o7 B/ \, l: K9 I
. L) z$ K# H% J
|
|