|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: ]* u, K0 A) t9 L6 ^ r& B/*
, t8 Q( j( E/ ?- Y2 A* _3 a * Copyright (C) 2009 Texas Instruments Inc
T$ t- x2 v W0 c *
' n: ]0 U' T( Z * This program is free software; you can redistribute it and/or modify1 e* B- B0 e+ f5 c( d" O; `
* it under the terms of the GNU General Public License as published by% z, T/ y) K1 y5 @: O$ ?
* the Free Software Foundation; either version 2 of the License, or+ E( E3 m/ ?. T) X2 [' c
* (at your option)any later version.( O& |% r2 D5 y7 x
* z6 H+ }( l$ g
* This program is distributed in the hope that it will be useful,$ i) D+ y, \$ r$ U/ h
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 l, A5 K$ U M; B9 r3 G* F- x" c3 n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the0 m" w6 y: ?! l7 v _
* GNU General Public License for more details.
% s. f- R, u5 L1 n2 i *! i' p8 a' j: t" m) n2 R7 o8 u0 K
* You should have received a copy of the GNU General Public License; E: {( u5 h7 K. [9 f$ S
* along with this program; if not, write to the Free Software$ U% ?7 {. W; ~# W' H M$ J* v
* Foundati
' u$ ]$ W6 }/ C: @: B6 ~: u*/9 c; V y8 r* K; H. A
#include <linux/module.h>
- [* D! l3 \2 {9 Z#include <linux/init.h>+ N" {! C5 M* G# M* X
#include <linux/errno.h>
: H; O9 r' K; J#include <linux/types.h>
* c7 ]4 G6 h' k/ M7 m% `# L9 Y#include <linux/interrupt.h>6 b4 K- ?- N1 c9 i: P! k
#include <linux/io.h>
; t+ r) q0 c" @- A1 o" h# b6 ]#include <linux/sysctl.h>6 o8 @2 b0 r/ w- p9 W# ?3 {
#include <linux/mm.h>
6 U% m& ]2 V; z9 y7 t1 e; E#include <linux/delay.h>
8 ~# ^5 h! l" R: ]3 Q6 k#include<linux/kernel.h>
|* r& J: m$ J3 t+ U' l9 B% Y#include<linux/fs.h>( l2 o" f7 S- r7 a" O- `
#include<linux/ioctl.h>! L L3 j4 M$ i- h: }7 p
#include<linux/cdev.h>* f+ K, u, \1 Q! i% R
#include<linux/kdev_t.h>7 [) K3 n) q1 H# a, K/ ^
#include<linux/gpio.h>
( g0 v$ E7 U, B( s0 [* \#include <mach/hardware.h>2 L# e8 W2 a( m, _, I5 o
#include <mach/irqs.h>
6 t8 @- g# ~8 Y0 m. h1 B, N1 [6 t9 _4 h
#include <asm/mach-types.h>3 U4 O7 y7 B( g8 e& _& l
#include <asm/mach/arch.h>5 q& Q! n3 F9 K, u
#include <mach/da8xx.h>
_( Q# V2 ^ F r#define SYSCFG_BASE 0x01c14000
4 j1 i1 x+ E) ?, F+ ]& Q#define PINMUX1_OFFSET 0x124
7 i) Z$ r |6 V1 X#define PINMUX18_OFFSET 0x168
0 I4 {: T, p1 J#define PINMUX19_OFFSET 0x16c
$ M) t: [8 {& F# b$ z6 B#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR* a4 v- X$ R3 {# ^( o. T, q
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR% r* K. U. W# v
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
, v# B2 N$ n+ X, x3 e#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR; n0 A0 m- M7 Y8 P- b5 D
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 y$ P4 ]$ ^' R. R8 i1 Z- ?
; T& @. u7 X. @: T1 g: m |0 C#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 f! A* o5 t0 N V# x3 i7 W#define DRR_ADDR 0x01D11000 //MCBSP1_DRR4 L7 g' |( e4 q) _7 {5 D
//PSC4 C. m4 v6 D* W4 A. l
#define PTCMD_ADDR 0x01E27120 7 \" U5 @" w' d8 d8 b, E
#define MDCTL15_ADDR 0x01E27A3C- I! T2 |' x* d Z* z$ ~3 M
#define PDCTL1_ADDR 0x01E27304
6 M+ v4 ]2 [% m. a" t# }4 q! l//GPIO8 direction
. P5 d7 H$ ^0 @#define GPIO8_DIRECT 0x01E260B05 E c; o- Q1 p* R) I
#define GPIO8_OUT 0x01E260B4
6 K0 o1 @ _. b: |- z5 @#define GPIO8_IN 0x01E260C0
* }/ e8 L4 L4 e4 _) \* _. D
8 a! }6 I8 Z; x//#define MCBSP1_RINT 99
7 U7 E7 B) p1 p5 i+ G//#define MCBSP1_XINT 100
! ]/ J& u+ ~. }9 d5 \' d# v* b; istatic int MCBSP_MAJOR=239;. B! j- F* c8 Z4 U! m8 o' y0 q
static int MCBSP_MINOR=0;1 i: `, B) a1 Y% _2 q
static int count =1;
) `' a5 q5 X4 Y! j0 ~: M, A. N, J& ]& {* X
#define MCBSP_NAME "MCBSP-device"
" e7 U% [9 T. \" X ^# F2 O2 H8 H! e- f. A& U
static struct cdev *mcbsp_cdev;
" P- z1 h3 r) @5 w- B* s9 cstatic struct class *mcbsp_class;/ o q2 n1 Z! s7 v: ?" i
static dev_t mcbsp_dev;" Y6 D1 [% y( r: s O
unsigned int DRR_data;6 ^3 V% q% D) Y9 x: y9 i. [
unsigned int DXR_data;
, T' C" d1 j8 B6 s* f" P9 Dstatic int mcbsp_open(struct inode *inode,struct file *file)4 x% Z9 [/ y; F
{1 x/ D p# x6 w% R
' C3 ?, _# Q9 l) H
//interrupt enable,initialized
9 s8 `8 f, \( D2 V; Z unsigned int temp;* H& d" ~0 B. i( B3 W# V) E' S# S; H+ \
//SLEEP_EN(GPIO8[10])---0
1 q0 g0 U8 ?$ _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 U5 v" A1 z! @1 H8 L
temp=temp&(~0x00000400);6 h# \4 H X, R: K. d# E7 v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, ~0 m r/ F5 b8 N- U) w2 {7 r //RESETn(GPIO8[8])----0----1# V2 F' o; z+ s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" u: S. R# @: |6 W- ^- z# ~2 s temp=temp&(~0x00000100);
! O, h" A4 I" { __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
/ ^3 m- P) M* _* n! F0 L udelay(100);& F/ n0 d9 v; E) U. j! r
temp=temp| 0x00000100;
, x/ o u0 P: N& F- `$ ^; q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ \$ X& h, H' O0 v1 ^
udelay(100);
$ F& {/ a' Q6 R5 }% g% O5 N printk("open success!\n");; K' Y. ^$ I. S8 z2 e w# p' ^
return 0;# b& B0 R# P% @
}& ?7 X O" `* ]& h. K' I$ ~
7 \* s6 z0 ^1 A# k
static int mcbsp_release(struct inode *inode,struct file *file)1 i7 N- N% F1 A0 d& X* j
{
4 d( K3 S ~* e" I$ z. l printk("release success!\n");( c1 W6 s7 C1 G7 l
return 0;
! [/ o, q; _5 E4 T6 K: M}5 M$ F& v7 E' S% S
; T5 E' ^: n% z$ ~9 q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* X: p5 F1 M- [0 D1 ~
{5 k9 F. l3 \/ \1 \, x
copy_from_user(&DXR_data,buf,len);
, B3 Y1 Q* j# \$ v iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" H9 R% [ P5 o2 Q return 0;5 b* h2 Q0 X" I1 a
' D4 j" L/ V9 J* _- ~
}
0 Y8 \8 \- _( ?/ U/ v) C' ~5 u0 A- X2 y) H
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! e7 e3 r. k) t0 o/ {( k1 {
{
8 U$ `' r5 I. U/ k& \( J: Z$ c DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# J* b8 e: S( r3 y$ e copy_to_user(buf,&DRR_data,len);
6 B1 F( n- a f# x return 0;
! o! i% O0 ?$ ]* n6 A, v: t% i}# c( x. o i% G) S8 ^) K* n/ S
$ h: _4 o3 c, v S8 N+ J- z" J
f) g$ Z* P! w/ k, D }6 h" f% A
static struct file_operations mcbsp_fops=
: d4 {" I4 u9 C6 q, D& ~{) P) c4 x/ b1 s5 ^
.owner=THIS_MODULE,
) P$ _ `/ ~7 Z" b" e/ B .open=mcbsp_open,$ ?& ^( ^1 J3 @
.release=mcbsp_release,0 G' p+ p* E5 e: N3 p# w: M6 H
.write=mcbsp_write,; o# ~( o/ J0 X. @# a! V/ i6 U
.read=mcbsp_read,
: W. N0 a6 q. }9 i' y2 z' V};
2 v! s' i2 `! @( o: ?static int __init MCBSP_init(void)
3 t* t0 v8 A# w! L, X5 ~9 Y{8 E i4 F* }, a. {
int ret;( `: B' ?9 F0 l, i+ X
unsigned int PINMUX1_REG_old;
1 E. v: B- O7 ^1 t unsigned int PINMUX18_REG_old;4 W2 P, B6 s8 T. A$ B. `3 C
unsigned int PINMUX19_REG_old;4 f- _$ W" C4 |! j2 M
unsigned int temp; , |# r1 k' ]9 `- S
if(MCBSP_MAJOR)
) b3 Y% K d* u {1 n/ |9 y" U; F. q1 L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 s) t4 t6 x* x* ~" [# B: _5 `) U* H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
; A& |+ L6 T, e" Q9 Q& Q( U }
: K- ^2 W8 m, x4 P3 o+ r else! M! F0 N' Y- }4 H" K
{
" e% E" j2 O) b# U% y+ D- V ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 q' @' |+ v2 I; ~1 i& e3 o" Z) R
MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ r8 R: v8 D8 g5 K }
6 u |( C" _8 h- D; f9 s
( n! n2 g8 q# M$ C' c if(ret<0)4 D! @0 Y+ \: \ G, x
{2 T" N2 l! w: z l5 S( F
printk(KERN_ERR "register chrdev fail!");- K, j% n8 p3 S+ N
return -1;% I3 V V" V0 n
}
% m, p1 n2 u" c" P1 c5 o' d j
) K! o% Y# W& S3 T mcbsp_cdev=cdev_alloc();% k2 g1 z+ _/ I# _
; d) e; B" x+ O" i1 [: B
if(mcbsp_cdev!=NULL)
8 o5 ]7 ~) t4 b" S {& H3 g; Y+ s6 r; o: G& d6 J
cdev_init(mcbsp_cdev,&mcbsp_fops);. j6 B6 h; `7 q. n
mcbsp_cdev->ops=&mcbsp_fops;
: g0 p8 a7 Z$ |/ { mcbsp_cdev->owner=THIS_MODULE;
/ B$ H$ C9 J/ T1 ~/ A1 l/ Q ! c0 g, H, R" D2 @: G
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) X3 V, z2 H8 L3 o
printk(KERN_ERR "register cdev fail!");
$ {, n: _4 o$ P ?) X! s9 i1 n else8 t2 G3 m& f. h3 ?% j/ }* H
printk(KERN_ERR "register success!\n");
% u; [# g- q% x) l }6 @7 j: P% o, M. ~8 E5 ?+ I0 K
else
$ D8 o( Z( }; n6 [5 _1 o% W5 {( J {
c9 `9 S/ W: h" J3 w: Y9 q printk(KERN_ERR "register cdev err!");
7 R2 a' L8 D- t# p1 Z return -1;
! h1 D1 K4 |* ^" ]: [2 V2 b }" N0 w9 ^2 g* D# n% |( }
, m4 m7 Q: E; X) {$ k mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 E1 w! L: A+ {1 ?. x' b4 { if(IS_ERR(mcbsp_class))3 x, G' @' q8 k# z
{
. ^+ a' t" [5 |: H p6 \ printk(KERN_ERR "register class err!");% p& A; q5 Z+ ]3 r8 I! b1 W2 u
return -1;6 Q; s1 Z9 M5 [
}; ]- ]& |6 H8 o
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" z& X1 J$ B) P* n' S" w- D+ M
& R' \- P1 j2 H- G! U+ Y; b
//PSC
( ^) v$ h. f1 C1 H* F, @- G //add Enable MCBSP) S$ G5 o5 ?9 R( N- m
//test
' c3 L5 ~+ D: T* M# H) Q+ X2 ^ temp = 0x80000003;4 w: ~2 m- T) M0 P4 {) A" h
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( _/ m0 w1 M0 D( ` temp = 0x00000003;3 b# ~" T1 l1 b# @
writel(temp, IO_ADDRESS(PTCMD_ADDR));
% `1 ]% H% r' H9 G. \ 5 B9 k8 X( u) N5 h9 r& B6 ?
temp = 0x001FF201;7 `* \% m( @9 H8 c' J
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: X5 F1 Y4 J+ _
4 T- i! X, C5 \) e( [" \ //PINMUX
( Q) m0 o& o. j6 o+ E: L; D- ` //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 @- s; U2 s7 Z1 z: _& r PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 4 N5 {* m4 e) m, L o( D5 }: O0 ]
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; # j7 g$ B9 m& f" Z( M
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);, w- p% {. ^5 L
6 n0 J& W& n( p/ C- F //SLEEP_EN,EPR,L138_SHK1,L138_RC8 ?3 q& c* [* x9 l6 A4 ~' Q
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( }- A% y c6 `. @ PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
2 a9 j! M, A+ V3 [7 k* V writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ i! K4 X; L2 W3 {6 c5 Z
5 A& X( ?& h5 ^4 H7 }* i //RESETn,L138_SHK2
7 B- a/ d; j' H& S+ t& u PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( w+ S f% L2 a: | PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
( \0 }6 q7 b) H7 `9 T writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& k, x* s6 f" o " f, \6 D! ?! [5 M3 @ m& M$ L' S
8 U& ` b, \9 X/ v0 J
//SPCR Register; ^. z6 P- S' m4 Q n) C6 ]+ x
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 [' c' R+ y% i
temp = 0x03000000;//(DLB=0)/ \6 n0 c1 Q( s6 [9 {9 @
// temp = 0x03008000;//(DLB=1)0 g1 ]3 ]' F; ]: \, M- j' q( }
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
1 L- d9 U; Y( }; O1 A g& x temp = readl(IO_ADDRESS(SPCR_ADDR));
# t/ R* S3 l m ?/ t printk("temp=%x\n",temp);
+ _; F, q% z2 i 3 i* f% o- E G) Q- g, { _
//PCR Register3 g7 H4 {: A& Z1 h( O S
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 u: n. G7 Z$ a& p, }( y, U! a
// temp = 0x00000F0F;5 U; E+ a# M9 H/ o5 U, d( h
temp = 0x00000B0F;
! ?, A7 [0 g9 j8 ?& j/ J) c4 D writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* D8 Z" D7 o1 D2 G, m temp = readl(IO_ADDRESS(PCR_ADDR));
2 R/ K; S8 A$ B printk("temp=%x\n",temp); 8 B) ?! F+ F, H% q" R
//SRGR Register2 K; B+ f7 F* S, r
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 b' t2 K5 {: |* g //temp = 0x301F000B;
: G3 ~5 o6 ]4 b" ], B9 y* D writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
% r6 C1 s7 [6 I temp = readl(IO_ADDRESS(SRGR_ADDR));2 u9 H3 q( [: J3 q" m F; Q
printk("temp=%x\n",temp);4 c; X* G+ g+ c9 }
//RCR) A) q& `+ ]' V S2 b( |! U
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( Z9 i6 P! S+ x* }6 N //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 A, J/ q( L* F: h3 D: ^* d! }
temp = 0x00440040;- A3 p: I/ o: {1 t {
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 c: {' k. p' u: e* Z! p temp = readl(IO_ADDRESS(RCR_ADDR));1 H7 }% `, Z( k4 B7 {% V' W
printk("temp=%x\n",temp);
9 M6 g) c* F( v# O4 r6 G2 M9 o //XCR
H8 _3 l9 R% i! D5 x //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- R! m" ~' O) q2 _4 l
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 n I8 b1 _ s$ c7 J6 i" g! y temp = 0x00440040;( `7 N* m; \( Q, J+ i- z
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized . R% o! ]& D9 k8 C4 o
temp = readl(IO_ADDRESS(XCR_ADDR));- G, B: r2 U) m$ `
printk("temp=%x\n",temp);8 F% ?5 z7 l. } u/ Q2 I
udelay(100);
3 j$ P* z6 z! s: ~* V. {* l //SPCR Register
7 w8 a& [+ y% |! l1 o. r //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, Z9 D1 }# o/ S7 d# \( R5 i
temp = 0x03C10001; //DLB = 0 VS DLB = 1
& Q, U! @5 }+ L' G+ m" L writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
" X q5 k4 ~" |! q* e% y7 P8 v temp = readl(IO_ADDRESS(SPCR_ADDR));
( V# U* z( f8 |) l& B# C8 C$ K2 K printk("temp=%x\n",temp);% f) m- C" U' p# U
udelay(100);
6 o4 m! F) H" Y" L; H4 H+ Q1 S- w7 h3 c# Q) u* e [) s7 L
//set GPIO direction7 t+ Y: R$ b6 b' R) R( z
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 x. g+ M' |0 o1 t) x4 a
temp = temp | 0x00000100;//EPR----input( a; I4 T8 L: H4 |7 A7 S& w
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- Q, u% I7 c1 b8 p/ \0 S0 h3 H. Y __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! @6 O6 `: Y8 B' @- V& `+ `3 p
5 f& Y' X4 X' D6 O0 }3 ? return 0;8 Z& l1 E# T( N% y! O
}8 x& C: s( w' _/ h
static void __exit MCBSP_exit(void)
8 y+ z' I- F# ] o( [3 h- m{/ \$ u; }. h9 r+ `6 @, Z
printk("mcbsp chrdev exit!\n");
4 e% z$ o( ?( X# n6 x8 p1 C cdev_del(mcbsp_cdev);
3 J4 K7 e6 l4 V! N5 d2 M, u unregister_chrdev_region(mcbsp_dev,count);9 r: Q( h* }0 k
device_destroy(mcbsp_class,mcbsp_dev);
7 y7 N6 y% ? |6 R* B! K class_destroy(mcbsp_class);1 E, e/ K1 S; k, C \
}4 b0 p3 }$ `9 i; E0 i: k
module_init(MCBSP_init);
. D4 z/ y0 c5 ?' t3 v: ]module_exit(MCBSP_exit);
$ S" @5 V- d- z# V2 V3 `) P1 `2 P
MODULE_LICENSE("GPL");
, W- B) \8 Z1 a6 k+ S* |- I @ l* s% S$ Q% t5 y. Z2 u
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
6 L( D% k, x3 i w' e我的应用层的测试程序如下
, i+ k, ^. o8 W% k! F#include <stdio.h>: y; T4 p+ }) U$ A, [- C
#include <string.h>% L8 v2 E2 g1 h) `2 a) N& }) D. }
#include <fcntl.h>
! k9 E `+ \2 d; }+ |#include <unistd.h>& f- |& ~0 n8 _, @4 k& @! B
#include <signal.h>
5 z" s# v& }9 W3 v" o#include <pthread.h> //线程
% z) W5 z/ S# Y$ H _7 S2 |( X#include <stdlib.h>/ _' V1 @/ P3 W' [* W, Y) o
#include <pcap.h> //捕获网口数据
% r% a) E) w- D) q% S0 _, N* s#include <semaphore.h> //信号
" B, }. f9 I3 y( A#include <sys/types.h> //消息对列2 F4 Y) D. r7 j. E! b" V
#include <sys/ipc.h> //消息队列
. V; |" r" @& i; T2 h0 r; {#include <sys/msg.h> //消息队列
; u* W3 a* U0 a' \9 M% M9 p- Z#include <sys/select.h>
! [/ Y8 e: S; Y# ]4 N0 T#include <sys/syscall.h>
8 v8 {; _* ], m# S; d3 S#include <sys/stat.h># O/ ^2 z/ T. ?" m- T/ ? {+ f, X
#include <sys/mman.h>( Z" o3 ~; U; J
#define msleep(x) usleep(1000*x)) V+ |- g. n' ?
4 n9 l/ W+ r# r9 P& uint main()
. q" v0 j) y3 N8 e{ ( \, i! c! Y: ^4 S, P! t
//MCBSP,ARM与AMBE2000交互设备
# f/ K9 H" |9 D+ L, I8 ?9 [* V int fd;
9 [, N) ~& A I h+ X# N unsigned short data_write = 0x5555;$ O. v4 ^; `! H
unsigned short data_read = 0x00;, w9 T9 ?6 W% e' \ w [: I0 F/ }8 [
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ B$ L+ j) J+ ?- n: y9 z // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 W ]+ l1 M- _: w8 \ C
- ~. a% m. |9 z" L7 c7 K! G; s/ j if(fd < 0)
7 o# S& U! A+ x# L) K {
. ], B+ n7 F3 m0 _8 g. s3 l perror("open failed\n");
3 E: r6 z; L. @6 c! Q return -1;
& m* c; V" q9 R$ n }
% x$ h# [% ^: l' {( O" r1 N 7 o" ^* Z( a [# C- U8 @
while(1)- F2 P: s( h. w* u/ A7 n" e
{3 e) b: `1 K# u/ z3 n
1 g6 Y$ r( ] k5 q3 Z% r //AMBE2000每次读写是24个字为一帧
8 H( k5 I P, g& m //写数据时将数据在底层存储起来,等到中断的时候再发送
& n/ W, r( F. f* h+ U7 u //AMBE2000输入数据是以0x13EC开头的. Q: b: x9 C2 X4 ^' Y2 J! x1 Q4 [
write(fd,&data_write,sizeof(unsigned short));
- b2 _$ Z0 f; p4 S7 x, a3 b; p
. P7 v" E- _5 j' X: Y //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 " J* K8 j, X) Q& o+ }7 z- c m
read(fd,&data_read,sizeof(unsigned short));
/ [8 ] F0 Q; Z; D+ \4 D
; M) k; X% F- q2 D1 B; p if(data_read == 0x13Ec)
, B# K9 B4 Q6 s {
% p& e/ P- \" Q ?2 K. p8 q
/ ^. E# r6 [0 t; H' V printf("data_read = %x\n",data_read);& f0 l# J: K* I) F; d: J
}
1 W6 G+ l" m! p4 `
# Q. [" i$ Q( C# H9 s; B4 u3 t msleep(10);
# o i; i. O) v* {. m9 l0 x " d; }5 K% G$ T. e
/*! h$ A( E+ c* i/ p
ioctl(fd,1); ) ]/ {' n4 T( b% S8 }
sleep(1);( N, x$ [( y6 Y, j8 u/ \! c
ioctl(fd,0);, l+ \; V, R& g- Z+ W' C
sleep(1);
# ?* }. R1 K8 G% I */ . Z$ _ J. ]4 D) v+ y) ~! I
}
5 }9 C1 ]# i7 Q) }* r return 0;# G: P, A6 j1 p8 v$ s
. }1 i: y; _8 \$ \+ @+ z
} W5 ^8 H, p! K. }
$ x, C7 u, T+ p4 O0 Q5 Q$ r多谢各位指教,谢谢! 急
0 J0 R! p0 H6 R( v% s) d8 ^: K, H/ ~# { Y; Q1 f
, C$ N- ^% d( q: b1 _; h
3 m7 b6 ?& e, j& s
4 X; Z( n8 a# e- T; i- |& f; n4 U9 e3 d3 P' h* T7 E
|
|