|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( S3 Z! q& _+ s5 e
/*3 f! J" p j0 w$ |8 ]5 P4 L0 c
* Copyright (C) 2009 Texas Instruments Inc l. o, U ^+ c+ D$ }7 M% r
*+ _) e3 P4 w) p2 h7 {- O4 `
* This program is free software; you can redistribute it and/or modify& ?5 c. |6 O$ A$ E8 a5 L/ N5 f
* it under the terms of the GNU General Public License as published by
2 V; r7 O, w. P * the Free Software Foundation; either version 2 of the License, or7 h# @8 H* d3 ?5 @
* (at your option)any later version.8 e0 o2 g* I D* b9 Z4 {
*
1 B( [" I) [; P# ]: K; j$ E9 Z * This program is distributed in the hope that it will be useful,3 Z# i( T/ O! o5 t/ f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
( F8 o/ n2 U7 l) \ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 S' U9 y! g$ C( f; U6 ^
* GNU General Public License for more details.
) o+ b% f& {4 e4 L. v *
9 f7 Z( H% h( _1 K1 Y1 g1 b( Q * You should have received a copy of the GNU General Public License
- s/ t% E& p# W * along with this program; if not, write to the Free Software
# d# W) K7 Z( E: e * Foundati
" [( v, K4 {0 b$ G*/5 Z8 _" `9 G1 Y+ }" K8 ]
#include <linux/module.h>0 v; H1 p& @* k# i
#include <linux/init.h>+ b6 z0 F7 C' T; g' U3 y5 k" h, L
#include <linux/errno.h>2 I' z( n; V7 w$ u0 {
#include <linux/types.h>
. S) w: R: X4 d" K% F+ {$ j7 ?#include <linux/interrupt.h>$ i# K2 B- t, S4 ~, |" Y/ i$ r
#include <linux/io.h>+ j0 G* q; @) A0 ~
#include <linux/sysctl.h>
. c$ R9 ?# N# D* r#include <linux/mm.h>
( A3 m5 Y3 \, G" o- `& I8 b7 I#include <linux/delay.h>
+ a2 t, @! B3 M- ?#include<linux/kernel.h>
1 o( O2 k r* P' i- Z# A+ J1 [' L#include<linux/fs.h>
+ t! b8 k& g/ U; }#include<linux/ioctl.h>' f/ X% U4 Q- @* @0 J9 j/ I
#include<linux/cdev.h>
4 i3 N) b% H; r: S* Q9 V6 C5 {#include<linux/kdev_t.h>7 L, Q# x. R! {7 c t
#include<linux/gpio.h>' H$ Y$ w( ]! A% |, N8 b
#include <mach/hardware.h>
+ ]& t4 J3 i1 M$ k3 ^+ e1 U#include <mach/irqs.h>. M* f# k* L, M2 ^
' e8 D) v; t: l" s#include <asm/mach-types.h>
9 {4 _" l* y' M ]/ ^9 n#include <asm/mach/arch.h>
4 `2 E2 k @: G#include <mach/da8xx.h>0 [! ?% r" G2 v9 A2 x4 p3 t
#define SYSCFG_BASE 0x01c14000
* A! v/ |# c6 S#define PINMUX1_OFFSET 0x124
) _, e1 Y7 }* h, C9 ~#define PINMUX18_OFFSET 0x168
4 @) t* I8 B/ N1 D# A) m#define PINMUX19_OFFSET 0x16c; O* R8 D- n, Q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: L9 W- n7 G# B' I
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR5 H% i; G- |/ u, q: N V
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ f( F0 L$ r5 t" b$ o
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR O7 `; \: f' h
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
: X$ ^7 U- d- b3 q ; w d9 B' v; ]/ C8 x
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
* P P, D% J" C* P$ M7 m#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
1 p ~& v4 v g6 u! ^) t//PSC6 O9 \# ^+ t: ^5 n, w, C
#define PTCMD_ADDR 0x01E27120
% j4 T& Q7 S" E$ v0 Z#define MDCTL15_ADDR 0x01E27A3C, D! ~$ O4 D6 ^) j: U( l
#define PDCTL1_ADDR 0x01E273048 Z2 Y) S# }3 J8 {+ m' V% n
//GPIO8 direction
4 _0 B8 r6 r: h9 H; X0 ]' y#define GPIO8_DIRECT 0x01E260B0' Z4 c; k9 ?0 r+ C& B1 }
#define GPIO8_OUT 0x01E260B4! e- G& `- p, T R1 a& p
#define GPIO8_IN 0x01E260C0* J" k/ C8 n6 B$ r
5 l& k2 ~, E: k& }+ ~2 I% u
//#define MCBSP1_RINT 99
; F4 d: g: N& `" R, t" X//#define MCBSP1_XINT 100 $ r9 S" ]) G9 _5 T& E+ b
static int MCBSP_MAJOR=239;& `" E% S+ p0 f H+ O4 X
static int MCBSP_MINOR=0;
3 i/ N3 X$ ~( @1 ~0 n' o8 N& Kstatic int count =1;
: w. d% k; l, n2 F' V3 ?+ M: r/ U8 r: m" d9 q: U
#define MCBSP_NAME "MCBSP-device"8 E! i9 X) M: ~; f0 v4 y( A& ~
4 p8 J( ]" @2 `+ ~
static struct cdev *mcbsp_cdev;
* M% f! |2 Y. \5 M$ Ustatic struct class *mcbsp_class;
6 f q; F( v+ J6 u" {static dev_t mcbsp_dev;. P) g* s2 t& K* J! F
unsigned int DRR_data;
0 A8 }; Z [" N- Z( Iunsigned int DXR_data;
" X- [& M) C5 g7 ?4 J9 L9 q7 I& bstatic int mcbsp_open(struct inode *inode,struct file *file)
( F, y9 q- x" F# Q5 h2 N6 g{4 Y+ z* N$ B# i4 X( I( Q
* w$ a/ y4 I$ _4 k! J. T* B, {% J+ w- s
//interrupt enable,initialized
0 G6 N. T% O9 f. n/ Z2 V' W unsigned int temp;
6 A( y& V+ v6 q8 }3 o$ X3 \0 V- B) M& o //SLEEP_EN(GPIO8[10])---0" q+ H0 ]' w( s. ^
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% ] Y2 `8 M8 @2 ~0 U2 m$ p temp=temp&(~0x00000400);! M% w; u8 M4 |7 [0 W4 m) [
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 y* C* I1 h4 d+ q9 n# E
//RESETn(GPIO8[8])----0----1
; F {0 J! g/ g: C temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ U( h) x ]( Y5 N4 k7 k
temp=temp&(~0x00000100);5 I8 O1 K7 _* v) t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ q9 P) x7 }& o: J& t udelay(100);
6 |4 D, t) P7 m temp=temp| 0x00000100;
& L2 m- `, l- y; P- n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---10 l1 f% l$ Y& x7 T
udelay(100);* Y$ k {; O5 G/ F+ T
printk("open success!\n");- P: x; u" o: J& @9 \
return 0;
! V" U" K3 o5 X9 _- S. H m P}
( d3 V! T2 P3 F0 V- E6 Q; I$ I, d( Z$ b7 d0 x0 m9 [; F8 N) r3 b
static int mcbsp_release(struct inode *inode,struct file *file)
8 F% L3 b4 a" [/ a4 X0 y{- H8 w' Q& Y/ [1 R; K. h- P1 z
printk("release success!\n");5 H9 M6 S% D$ N. O" V( U: D O! @
return 0;
) X' D% y1 Z. }, N* {, A}! I+ a7 _. E1 h0 L1 X3 R
( {6 q3 K3 u |6 B% F
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
" n4 w3 Z. {% M{% p, X; P: f# ?9 K( N
copy_from_user(&DXR_data,buf,len);8 P# [, N1 ^6 o$ T G
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
- x. a |4 J5 ?: f return 0;9 |% l" }$ I( A: Q
4 H8 N/ V6 c1 b- U: c}
3 [: q1 O8 r* o8 o0 N
7 `4 }% v- Y, L/ \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ E6 e3 O+ q" x* Y
{ 9 c" R/ K @1 z
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 B4 l7 U3 o: P3 W! v. r9 t
copy_to_user(buf,&DRR_data,len); ' w' x2 t3 A+ C, s2 D K
return 0;5 c8 }+ B' y7 z2 h4 j
}& w& F& F0 Y, W' d4 v3 N
) j+ s- F8 J2 b' Q
7 E* F+ `1 h& Lstatic struct file_operations mcbsp_fops=
) ^8 p1 d! c1 e2 p( Q+ l{
0 D) z1 K+ m0 v* ^* m .owner=THIS_MODULE,
# z R+ |- t q5 ?+ E- L. K .open=mcbsp_open,
- ~( G8 p' L) E0 _9 B7 w- w .release=mcbsp_release,
# C- E, J8 r& n$ \+ P .write=mcbsp_write,! q' @) v9 _1 W% X2 v
.read=mcbsp_read,' A$ L1 K8 u* j# p C) W
};
# S, E8 h: m2 g. c2 Zstatic int __init MCBSP_init(void)
7 I0 @. ^' U: O: X4 Y{
7 y7 \, Z$ u! g2 l* X$ M) h int ret;$ { Q \2 o# G
unsigned int PINMUX1_REG_old;
+ Q7 l/ n, W3 n unsigned int PINMUX18_REG_old;- r$ ?! W2 `; A. z
unsigned int PINMUX19_REG_old;
: r* ]' z1 V* U unsigned int temp;
) A) H( b2 m% e! E+ y! z if(MCBSP_MAJOR)
2 j. ~$ n, O* i {
/ n8 d: {- m( a5 G; K" g2 }4 h1 ^ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ _8 E) \ A2 h ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: b2 f7 M# d0 M7 R" h) r }
0 P7 V2 |2 ~: I) y) p: X* s# [ else* [* O& Z9 ]3 p/ R; J: s+ @
{! ?8 }. v9 f8 u0 S+ ~% T
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 x! {0 G% b" ~8 ^2 G MCBSP_MAJOR=MAJOR(mcbsp_dev);* A- a' r% x# ^: O
}9 S$ K, l7 [$ c# t" M2 h1 }5 s) F
( d5 R$ n* x% `# m' w5 { if(ret<0)
8 A R: y! y: ]: Y {
. b; W% U' @- d( y. t- U printk(KERN_ERR "register chrdev fail!");6 Q3 e9 y0 ^0 @9 S- U- M
return -1;
E" Q* m' L9 G }0 s! b9 k2 P/ r4 z) J' q
# w% Y$ i7 u' X! g mcbsp_cdev=cdev_alloc();
, p) ~+ j1 Z1 [. R
. Z: W; ^) ~% q/ u* ]8 v if(mcbsp_cdev!=NULL)+ G2 T5 K8 w0 V0 A5 ~3 d) }
{( Q$ i j& O. }# X" F: L1 @
cdev_init(mcbsp_cdev,&mcbsp_fops);5 z0 }9 y: O1 c8 C- ?& r3 w. r; _
mcbsp_cdev->ops=&mcbsp_fops;
& n9 ~" R: R6 J mcbsp_cdev->owner=THIS_MODULE;- j' f3 P& V* Y/ Z7 C8 d- F7 a
4 c" W6 W2 K3 A" J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ t; \% C3 R% X2 ?9 R5 X' ^4 } _. f printk(KERN_ERR "register cdev fail!");
: i4 k G2 R, r4 Q4 o' y e) | else
7 Z; `; V4 \/ V0 v, b printk(KERN_ERR "register success!\n");
- e7 `2 T) _+ h) U r, q4 n! }7 z }
: q! j" [% G4 G2 f( O) W# A0 @( Y else
( z5 G3 j0 d" F) w9 [ {5 V" J, c' R+ T* i
printk(KERN_ERR "register cdev err!");
! O% ?5 T; d$ F' E9 Y3 l+ n% q& @ C return -1;
: |; C' s+ c' v' U) e* } }
; v7 D1 L5 n, J, |! K6 C
/ Z: _( C# F% G* E& S% c# ]3 Q mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% S' [" s0 D/ Z. F) z8 V
if(IS_ERR(mcbsp_class))
^3 m% B$ O/ T, H$ v {
" C; B7 y8 N9 ^7 k, J+ W printk(KERN_ERR "register class err!");
8 C( B' C2 @! R3 I0 ` return -1;$ b8 n8 o& ~5 ?' n) k. V
}
( I- {, A/ J- k3 p device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' a0 j" G9 X! K5 M, F
4 X4 d7 G" ]3 Z7 M: N- y //PSC2 x8 u9 A3 e4 P
//add Enable MCBSP
- E6 Z4 a3 M4 f' s: n //test$ |# z+ e4 l, u0 e3 h8 l
temp = 0x80000003;! L/ s* q: y) G: o! [+ J# D; D
writel(temp, IO_ADDRESS(MDCTL15_ADDR));: R/ B5 K* [% v5 t7 A2 d7 n, V
temp = 0x00000003;( W; r. p* U- a! ^& h/ d
writel(temp, IO_ADDRESS(PTCMD_ADDR));
; V3 S& P7 f) F7 h. @1 G# U6 H ! u+ b5 j ?: ?2 m$ t
temp = 0x001FF201;! r3 {% B) [8 O- A* s1 x
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' A- U0 t, i4 {5 b6 s
! P, r8 v6 l% b5 e' a# K, O //PINMUX A; [& W+ c2 i1 Y
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,' d D( `0 q. H2 ~1 Q; f% A$ R' [
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 z% q/ x; X: e; u
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 1 b$ {. i5 H( i
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- J+ {# X0 L) S1 F, _
, q- @* k5 d% ~0 } //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 q+ @* n2 M7 e3 h7 @, q' H; } PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; A6 v! D1 U/ l% n PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; * P% L3 L3 y/ z! d
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( b) h: y& ?# _% x; y
, K. t1 S4 P* m6 I
//RESETn,L138_SHK23 f9 p' G. V) J n( O2 E. x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ t. i' H/ i$ C, h5 |5 E f PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ o! F9 z5 E$ S5 E8 c
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 h. Z" s" w# ^4 V & W' h1 v3 K7 b# N
- w( p$ n' j6 \% Q: H, Q! S
//SPCR Register
) k8 r; B2 q" r0 J7 b* G //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" l( j1 [8 {0 ~8 m temp = 0x03000000;//(DLB=0)
( Q8 G4 d1 `( Y1 K9 { // temp = 0x03008000;//(DLB=1)9 ?6 ]( c- Y2 j2 D `9 Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
6 l9 r- s3 s5 j temp = readl(IO_ADDRESS(SPCR_ADDR));
0 }! u. L+ r; Y( V1 o8 H printk("temp=%x\n",temp);+ X: O) A! g+ P( p6 |& W
3 q4 n3 p2 f$ w! B) Z //PCR Register( J' V" u4 i$ c% S
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* P3 p# j3 ~! O; {9 T // temp = 0x00000F0F;
! ~& b( D( L) ^) n0 i( I L! H1 D temp = 0x00000B0F;7 L9 E3 p4 T5 _( h1 J- N2 U
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* z% s' u- u+ X' ` temp = readl(IO_ADDRESS(PCR_ADDR));
) @) N5 x$ L- t( @0 }3 t printk("temp=%x\n",temp); 9 m0 K8 i' y- {7 p7 I; I9 P
//SRGR Register
" f4 t/ x6 W$ C. x. h' V, h" A2 E3 t //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% P5 S$ N: |0 W2 B; A! J2 ^1 H //temp = 0x301F000B;
3 g% G% C) Y1 Y5 a2 O writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
/ Y# E& Y1 r4 w" K temp = readl(IO_ADDRESS(SRGR_ADDR));2 z/ v5 A2 g% ~3 A8 k# @
printk("temp=%x\n",temp);1 b1 E1 v$ _" g/ C9 H3 S
//RCR; I$ L6 o2 o' M, b# }
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 x3 e' X: q# x3 T) D2 S //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. M! a2 d/ ?/ c' A& a! J' F' z; t temp = 0x00440040; H; j7 w4 `/ _" u/ t* [8 g* @
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 c$ t+ ?8 O! R& r# w
temp = readl(IO_ADDRESS(RCR_ADDR));
( D7 t9 P4 Q- T, k$ |5 b; g printk("temp=%x\n",temp);2 g( q+ p/ S1 E3 j: U
//XCR
# z" c& |6 M) J. O4 G4 W1 B+ B7 C //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: {0 _% q0 _$ D1 n8 @/ m2 w
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 i# M) a8 J2 f1 l% S# u
temp = 0x00440040;
* S) ~* c5 z5 P3 \/ p7 L/ C: Z writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
X/ s8 c" H- U( N temp = readl(IO_ADDRESS(XCR_ADDR));
" \/ L M$ [. _! n0 }$ H/ s% J5 ? printk("temp=%x\n",temp);
+ N8 }) e) b% ~* V udelay(100);
' C* e9 x& D6 x5 B8 h) U! n //SPCR Register
) Y8 V( v( s: Y4 F; h6 ?' `2 G //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 c, e* Y8 l: r0 O% t8 w" {5 M9 y temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 R' P. f2 X$ G writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled3 S8 P2 \: g7 |) L
temp = readl(IO_ADDRESS(SPCR_ADDR));5 D! s1 }. s% x0 r( ], N7 y
printk("temp=%x\n",temp);# j+ z) U, M5 h. X- Q) A! R
udelay(100);7 P5 m1 a9 B, I7 i4 x5 U3 ^3 N
! \5 h0 N7 W# S0 ]( s& n
//set GPIO direction- L4 I- K2 {6 |5 @: w- o) r
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
W! J4 W6 x, I8 M* m temp = temp | 0x00000100;//EPR----input& D/ M* `: f# W$ L/ G" g8 `, B
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' L m" S; A" E __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
% W" ]* R) Y0 A: {* l- I7 r- F9 P 9 _+ ~+ D/ X3 y3 ^% |
return 0;
X! A8 u$ b0 w3 y- g3 W}. H. |7 T# M5 f* H: U
static void __exit MCBSP_exit(void); f% D8 g8 c1 {
{
+ S& K2 i6 X( O; Z3 Z printk("mcbsp chrdev exit!\n");' `" I% W/ U9 x! n
cdev_del(mcbsp_cdev);
2 C1 g, f& Q3 V: k' a- }4 u unregister_chrdev_region(mcbsp_dev,count);
' w! @6 E( q- I7 w W8 L9 q device_destroy(mcbsp_class,mcbsp_dev);* C- y' {; \- @2 `
class_destroy(mcbsp_class);2 b) J2 H1 _0 U( ]0 D
}
( J& y" z# L' [9 ]5 c1 y; j- b2 j) umodule_init(MCBSP_init);) t# J' c) q( [0 R0 M6 |
module_exit(MCBSP_exit);
0 P: C- ^/ G( Q6 I$ z3 g; K" `1 i5 ?$ ] l$ ^/ m# \- N: F
MODULE_LICENSE("GPL");- R8 i, y* z( _4 a
- T' ~; F2 R% h9 g; X# h3 H7 e
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! Y! c7 }. i5 ~4 b+ C
我的应用层的测试程序如下% J* `6 D& E* q2 T% D z' s
#include <stdio.h>
7 d6 [- \' q4 h& z- H0 g#include <string.h>' M) c4 D: Z% ?8 @
#include <fcntl.h>
8 [$ b0 @) r' F) V0 K. [#include <unistd.h>
7 W/ Y! K7 L2 ^2 X$ @#include <signal.h>+ } ]5 c7 H4 }. r* F
#include <pthread.h> //线程! e. z# S" H4 [% Z
#include <stdlib.h>; L V0 y3 ?7 h* ^3 v$ c5 v/ N6 `
#include <pcap.h> //捕获网口数据
6 y. D* a! w! q6 A3 n) K& S#include <semaphore.h> //信号
* v m4 p9 Q1 p `0 i#include <sys/types.h> //消息对列/ F/ k% D/ c/ r: {) t( r# J
#include <sys/ipc.h> //消息队列$ O4 [: M1 G' a! k, ~& Q
#include <sys/msg.h> //消息队列3 M2 Z# X7 \9 S6 I* E3 H5 E4 z* R
#include <sys/select.h>6 t, x) z$ f, \! C$ C# ~$ |
#include <sys/syscall.h>
: H6 n8 {2 s: i$ H* h4 g6 j4 ?: e! \#include <sys/stat.h>
- O* A+ o* ?, u#include <sys/mman.h>* q9 L- d. t! m7 c7 R% h
#define msleep(x) usleep(1000*x)
* V. A1 V9 w$ t( b3 B, }; k- ]7 [, S7 u4 Q! \, Y
int main()
( V6 x" P3 p$ p, g{ 0 W0 Z3 l: [2 }1 d) Z+ r& r4 u
//MCBSP,ARM与AMBE2000交互设备
: w! l$ }! j7 D- t+ J int fd;
$ m/ Y( N8 Q! d unsigned short data_write = 0x5555;
; s. @& `9 S7 `1 c unsigned short data_read = 0x00;
6 U. M8 m5 k a" E" D u. j7 H fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; g. j( w7 J( p5 J) F; N
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) c4 V8 D5 k1 z$ a, ?6 W ) @/ X7 _& ~% T" X- v, Y; `
if(fd < 0)
8 Y6 ^, y/ I5 O/ \" K j3 B1 G/ x( { {* d3 M% q# D# Q. L2 a; x
perror("open failed\n");
. y' v6 {; {* z return -1;1 U( N8 `, p* L: [+ {; D
}
} g" H# T* s2 i
" E4 h$ U) ^* Q! c9 D while(1)
7 J5 p% `: ?# X8 V0 |9 T4 e1 A+ h {
3 u# f- u; @% T! I' { & h6 M1 p' G% ~, C+ `1 V
//AMBE2000每次读写是24个字为一帧
- B" D- u. v; v, H //写数据时将数据在底层存储起来,等到中断的时候再发送
) o' E1 h. r* \* M. i$ \ //AMBE2000输入数据是以0x13EC开头的& |) B/ G" K9 V, S5 N
write(fd,&data_write,sizeof(unsigned short));8 M2 I* b9 W1 h5 Q2 W
3 U' c+ O0 x6 P( _; L //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
8 w( Q% K$ Z, x S- R9 [2 { read(fd,&data_read,sizeof(unsigned short));. }! l) z5 f+ y! P5 Z4 r4 W9 k
$ Q, p$ a2 V# L
if(data_read == 0x13Ec)
, N. E7 `* ]# q; y' L {
3 ]! g3 r- }( L; C
& I; V1 O1 g- z7 A, x printf("data_read = %x\n",data_read);3 p# g" E" R% [+ }& a
}
/ G: I# l- R- f8 L1 v% Y: }
9 h; ~( m4 R$ Q6 t4 Y msleep(10);
. O' `% l5 d) b( q1 S
8 @3 @; d8 P( j5 S' X5 k /*
1 d/ t, s) ?1 k" |0 S* c, r# ]+ _ ioctl(fd,1);
# H3 e. t9 C4 n* f sleep(1);8 } C" S0 h4 M5 i `; T
ioctl(fd,0);
2 {! n5 z7 _, F, L7 Q% _2 F sleep(1);
1 g, s' T( D2 n" u3 Q/ l */ . r; M7 k7 _+ V+ s$ K9 z7 R& Y
}
6 L% q0 O5 A& e return 0;8 e; R, ^+ i" h+ S( r
! L5 ~: [' O, S( v}
" K+ C( }! J1 B2 Y1 a8 r; G' T% |
$ ?% |# l8 N* J' N- ?5 u多谢各位指教,谢谢! 急+ @7 p" C" h4 p( U; U9 j% ]
- ~& E- u4 |4 _. i, u; y m8 j& Q7 S# R/ f6 @) E/ @
" l+ A* S* H# c0 e9 U W
8 U' }) t% l: E
/ U0 n7 O* z: N7 Z |
|