|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: # h5 D9 X' u# ?/ t6 b* A
/*7 j( W0 n5 v5 b* P j, z7 a
* Copyright (C) 2009 Texas Instruments Inc
5 X3 G& {: Q9 ?4 C: l, ] *: A& k, w( Y$ B- z
* This program is free software; you can redistribute it and/or modify
- u1 i0 C) _" W5 T' {) i2 { * it under the terms of the GNU General Public License as published by
8 ~+ y( N6 [6 E" C * the Free Software Foundation; either version 2 of the License, or4 G% b$ C6 s) \# J# l
* (at your option)any later version.
; U* P7 V( d4 R8 W9 s *( s# y( x) z6 C. \6 Y% ?( g) C7 Y
* This program is distributed in the hope that it will be useful,3 U+ T: [2 R5 M7 g! E7 J- q
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 Q3 u. R- K+ u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, V. r: P; [5 z( [/ G
* GNU General Public License for more details.
5 j) Y- Y4 x* r( `6 N5 v- W% F: s *
3 z7 k: a0 U* s3 _. r * You should have received a copy of the GNU General Public License
: i! O) H6 A9 C- L" l/ w! B * along with this program; if not, write to the Free Software; x4 q8 M9 q2 N
* Foundati+ S% g/ b. d- C6 c
*/2 C, @( O* z3 Z
#include <linux/module.h>
) m5 w) W$ `; u#include <linux/init.h>
; J5 X* _' r6 N4 S#include <linux/errno.h>) G* ^3 q- s; U- @: K0 x
#include <linux/types.h>/ X% P; ]8 G1 S/ W9 B) v
#include <linux/interrupt.h>/ l5 K% a6 ]3 ]1 ~, q; f
#include <linux/io.h>
! d7 \6 u2 B6 ]9 r5 y$ h+ t( z2 ^#include <linux/sysctl.h>
5 p9 Z8 `5 F& h3 O% k. i#include <linux/mm.h>
( o5 t8 q; U. r* X+ ~) d#include <linux/delay.h>
( @- G# i C: d8 K% {4 {4 T- T+ r#include<linux/kernel.h>
/ B8 a1 ^' o0 e#include<linux/fs.h>1 u3 ?7 u0 c4 ~- {. Q, e
#include<linux/ioctl.h>" W; |5 \) U$ T% p) U( k
#include<linux/cdev.h>* I# X- n Q3 ~" f0 i7 O: K
#include<linux/kdev_t.h>
7 g% h) E. X/ K4 X#include<linux/gpio.h>
# K ~3 q" Z" W5 }0 c#include <mach/hardware.h>
/ a9 M# k: A. L9 u2 c! `#include <mach/irqs.h>
% g- c/ s* m; K+ a. V7 K& S
! v+ Q, q/ R% P#include <asm/mach-types.h>
# h$ j# w, e. {3 p$ S#include <asm/mach/arch.h>! {7 m; _8 \( }, u& l
#include <mach/da8xx.h>' ]+ g+ S- u, e: G$ X! I" G+ t- ]. |
#define SYSCFG_BASE 0x01c14000
G* }) Q; D' |) _9 G#define PINMUX1_OFFSET 0x124 ) v6 W* e/ M, ^& M5 ?3 H; T# I+ J
#define PINMUX18_OFFSET 0x168
/ R% ^! g' O1 H#define PINMUX19_OFFSET 0x16c
; X6 f" T, ~) ?" a& x#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: ~, e& @( {* q& U; P
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR/ o; n" K" A P% N( k
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
7 h% o0 X' ?/ z+ X: N' _% p#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR9 |. | C& k- L: j/ \& v2 U" x7 s+ ~
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
4 @# s4 a ?/ P7 l$ D: o6 v
% w1 p6 ?# v4 U) l3 G8 E9 o! J( ]#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
- L' w- E& e& t+ W#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
8 N" o5 B# H' [//PSC
, L4 C( M; u0 \5 Y#define PTCMD_ADDR 0x01E27120 u1 J% O/ ~4 f! r, U, O
#define MDCTL15_ADDR 0x01E27A3C
1 f2 b* e5 g- i, b4 K#define PDCTL1_ADDR 0x01E27304
. R2 t" R& `% u( Z3 Q# B; x//GPIO8 direction& `$ ^5 c, q' p. E
#define GPIO8_DIRECT 0x01E260B0/ u/ x0 t4 @2 w( U" S5 S2 B
#define GPIO8_OUT 0x01E260B43 a% W8 `% E7 H% n6 [/ ?6 Z
#define GPIO8_IN 0x01E260C06 V- N1 i4 A- T6 q' t$ z' [
. o* {+ t0 r8 P% r. l
//#define MCBSP1_RINT 99 9 K, j' e, ^; k, H
//#define MCBSP1_XINT 100 ! }: k M! y' L# ]
static int MCBSP_MAJOR=239;
* L6 X/ G8 F/ Qstatic int MCBSP_MINOR=0;4 F* R/ O- ? e: v {3 d
static int count =1;
4 G B" Z# [& x( B9 ~1 @! _8 Q0 q3 p6 r$ E+ Z) _+ I
#define MCBSP_NAME "MCBSP-device"" D- ^ B7 E D6 Y; S: L" C
' u2 r- k( ~ v/ L6 D. {. }8 F( n' y
static struct cdev *mcbsp_cdev;
! w$ o9 V: B& e; A5 Estatic struct class *mcbsp_class;1 {, O6 Y; r6 B, j1 B8 ~
static dev_t mcbsp_dev;( [. f9 Q0 p+ ~' r; F
unsigned int DRR_data;
! `2 ^' m; s0 q1 c3 F1 uunsigned int DXR_data;
0 K+ A" P& g3 {: Sstatic int mcbsp_open(struct inode *inode,struct file *file)
; N" W' n, x+ Z) z7 Z+ j6 p: ^{
3 b u9 Z2 f' z: W: ~ 9 q/ y [9 A# E8 L3 [( f
//interrupt enable,initialized
! w" i& X* g; `9 H7 o. u unsigned int temp;
/ u1 v( K1 ~/ [ //SLEEP_EN(GPIO8[10])---09 `. u/ k' B9 h7 o% e7 t3 Z9 J
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 ~0 m3 q2 t! |0 k# N
temp=temp&(~0x00000400);" I' W$ f; j2 N0 v. w* Y/ U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ |+ R9 _5 E, K
//RESETn(GPIO8[8])----0----1
& u, `( ~; k/ ~* l7 G temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 B+ l a- J% ^6 r( q temp=temp&(~0x00000100);
2 `! ~- b3 t2 P6 G& U __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, t A7 |, |: w2 i udelay(100);! z k2 q: j% I2 i9 \7 @& U, J8 [
temp=temp| 0x00000100;
8 z. m: Z3 w$ k- F1 @3 Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! y% v3 Q, M3 v; W, i( T" ^
udelay(100);
) B! U0 s& O3 c3 c8 }4 N printk("open success!\n");4 d% `8 z+ z+ X1 a
return 0;7 n- K5 i: F0 L- X1 W
}
7 D5 ?- \0 ^" x, w) ?8 }. S5 |8 z6 T: D- S' g
static int mcbsp_release(struct inode *inode,struct file *file)7 I2 T6 B0 M7 m) w7 s
{3 Z" V6 b+ m3 J
printk("release success!\n");& t9 E( P( N5 q3 |
return 0; s. z- U9 ~5 I4 X8 E$ Y
}+ }9 }- B: [* Y" {
3 J$ Q' L$ V' D% [7 C
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
2 |/ P( r0 \4 o{
* I; n5 M* B$ @5 d' J9 w4 ^ copy_from_user(&DXR_data,buf,len);
* d% c$ e( [5 f1 h) T } iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); , _! X6 k+ d0 F
return 0;6 ]' [: a o: d% P" d8 V1 e) L
! E. }6 W1 w6 \) {* w) L
}
) p; D: H; r+ B+ l7 _4 J F& q; ]1 ~0 p$ S& {" R* J9 Y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 _$ u* P( h- u9 N
{ % c8 A/ @3 ^/ R) n" |, Y3 [8 U @
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! Q! q' }& R% Y1 Z8 L' B
copy_to_user(buf,&DRR_data,len);
9 E& n: o1 W( u9 e4 ` return 0;4 W3 q' v% [" M8 v1 Y! {
}" v* R" { ?$ R9 c
) l" ~/ s9 F6 ^6 u
% Q- a" n% H6 t9 Z5 c0 p; Zstatic struct file_operations mcbsp_fops=1 Z1 R/ M! q, D
{) z5 x% q, T8 w- f5 @) K
.owner=THIS_MODULE,
5 M( l* R* ?. s2 ~, G& X$ G; X .open=mcbsp_open,
7 r& q: R; c% k8 o! }+ | .release=mcbsp_release,
0 v/ J' a# s0 c$ A. Q .write=mcbsp_write,* c7 A j) T. v6 L/ e4 J' c' o) Q
.read=mcbsp_read,
+ o' b* S9 X+ ~! c};
/ x$ g' h; m! T# ostatic int __init MCBSP_init(void)
# n, L8 J: H* ]; \! Z, z{8 E" ^: n ]8 L+ m0 t. J) E
int ret;5 s; ^' i2 k' k) J% y- {5 ~8 E
unsigned int PINMUX1_REG_old;
H# \& w0 k l* ]; [2 k unsigned int PINMUX18_REG_old;
* R& c+ O- ^ ~ unsigned int PINMUX19_REG_old;5 y4 {3 W- p4 Z3 ?# }
unsigned int temp; & `. w3 o( P3 m4 [' ^
if(MCBSP_MAJOR)/ a& k% _8 E) x
{
: i0 C- d+ `' G } mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 d! y7 s1 m. q
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ V4 ?, a7 U2 I8 m. I
}
- |; q+ A" G- t! ^/ B: h. | else
6 C7 N1 {7 M2 X7 b# r {
$ |1 o; e! C$ `3 s8 [6 k- r ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- \/ Z5 n. [) j( X v J* u2 E MCBSP_MAJOR=MAJOR(mcbsp_dev);7 g; B& I9 d% k; P5 ~' S
}3 w9 n# S/ W; t5 S. g, `& h; } O
$ i3 C0 y2 t( m1 G7 [ if(ret<0)
* g+ C$ q# ?- B& y, J {
3 C7 D- j8 a5 A% D( z7 R printk(KERN_ERR "register chrdev fail!");- V% V/ L5 n" Z* R7 I7 _7 U
return -1;1 _+ A; V, T8 z) H4 J' k" z
}3 U, ?2 |( z) s
' k& j: I0 w: V/ _1 m8 e
mcbsp_cdev=cdev_alloc();
2 m7 W! ^3 c; G$ M% h) L 6 j$ E8 `; B; I9 b" t7 n1 ?
if(mcbsp_cdev!=NULL)
+ m. X; N- p0 C {
% L! n$ l2 n" S+ f" Q8 R- g cdev_init(mcbsp_cdev,&mcbsp_fops);, f* P4 f* D/ Q: w& r- U9 `
mcbsp_cdev->ops=&mcbsp_fops;
% p2 S# ^' V" m1 S) g/ l1 |- N mcbsp_cdev->owner=THIS_MODULE;
% j- y( A; z1 S* N6 x; x2 t: @5 ]: i 7 h( c, X% |& P2 E, Q
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). ^% ~: d# T) P- I& V. ^
printk(KERN_ERR "register cdev fail!");' N% Z% O$ `& Q1 a
else
; j } o0 q; c" y% ^. A printk(KERN_ERR "register success!\n");! G7 Y Z( |$ ?1 a7 |
}! D* Q% S7 h+ V. t0 E
else- N" H7 v g' s6 u
{& y1 O) v( N5 I1 r7 B$ C1 x
printk(KERN_ERR "register cdev err!");
/ n. T5 n( L) |( x# h I return -1;6 J2 a A- d; [* h7 f# c
}
, m4 x, j a; w9 B" u7 h; s. C1 f 2 P, u7 _5 x4 [( w& @
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. y, G' h6 }) W if(IS_ERR(mcbsp_class))0 V5 J8 v1 w4 ~3 _% ^" i2 p
{
) N* F- D3 I0 \7 y. E1 j/ I( p6 }! h printk(KERN_ERR "register class err!");
) A! d9 ?) w2 k- l+ { return -1;
4 d" c# u8 a. g& E$ _, e1 |; ^+ W }
( X( s W. ^9 q3 l( J+ d! ~" m device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 @! q9 l- o. b: [# g5 M$ T! r4 b& S/ N" e( D. r# O) D
//PSC" y. t. u! w1 W
//add Enable MCBSP
1 J' b; q$ g( F9 c2 L/ I //test
) e* f$ e1 p' M3 L temp = 0x80000003;
. R3 `4 P5 u+ m. V( T writel(temp, IO_ADDRESS(MDCTL15_ADDR));* K: Q ~7 z+ j& B( P/ X8 Z* i5 Y
temp = 0x00000003;; [! [& M) m% q! k+ B" U: i1 z
writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 m& x" y( P" z% D# K; F ?4 K
. j: I$ d& l0 K ^ temp = 0x001FF201;
8 P& ^+ n) O8 a" U writel(temp, IO_ADDRESS(PDCTL1_ADDR));# B" }. i: Z2 F. J
2 T7 K& u! | t- n) T //PINMUX
. C2 ]- t2 I; W: G, r9 j //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 v7 M3 q; b1 Z8 {! B+ k7 X
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* D/ _1 G; w' Y1 j& M/ h8 Z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 H( a2 J7 b# _; x! k) f p# y writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ \$ C. |4 |' @: I
$ z& o+ i" e9 o/ W //SLEEP_EN,EPR,L138_SHK1,L138_RC5 b5 J. _' T( c$ u$ a- ?
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) I' f8 f4 F+ U8 ?! U# E6 f3 d& i- d PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ e" L6 v( l3 e' H1 ~
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# x4 K; Y* g8 B1 u) q& x
5 b8 k( w: @/ R0 y* l
//RESETn,L138_SHK2
6 z* u2 R5 a* w% W V, Z* c4 j PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); * B! }3 c) g- T: p3 _3 ?: r0 t
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
% x5 g. r3 e+ h3 ^ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ Y* p* A- t, u9 K6 F
6 d6 }8 k5 j) r+ Y( J0 B% S
' Y( F$ ]# E$ ?# Z. X0 \% v+ u) U
//SPCR Register
0 \, e, R5 w3 D" @$ Z //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
~6 A- f2 h8 Y! y; x8 d5 B temp = 0x03000000;//(DLB=0)2 I$ L O' S( r3 R
// temp = 0x03008000;//(DLB=1)
, \* x! k5 U5 @5 p+ G% Y7 W writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
. d/ C, x+ _" x. t. r temp = readl(IO_ADDRESS(SPCR_ADDR));4 g1 O+ {" K- P2 {% S
printk("temp=%x\n",temp);; O7 M+ `8 ~& S/ H
( n7 x' f4 T R1 P* {
//PCR Register* S+ I* ~/ K$ Y" K- Q+ `
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* @+ L' t, |2 ] // temp = 0x00000F0F;* S1 e; F1 y% r+ D
temp = 0x00000B0F;
. u9 K% `; C% A$ Y& W writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
: I( ]" B1 B: g' | temp = readl(IO_ADDRESS(PCR_ADDR));
7 _/ L: g9 {$ K, u# O4 V5 I# W3 q printk("temp=%x\n",temp);
* B, r- W* |( V U0 P* Q4 d" e //SRGR Register
) `3 Q4 y7 D6 J2 `/ D //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. U/ g, k" j' p( E- m5 L* C! Y6 k //temp = 0x301F000B;" R1 q5 g: m0 F( ^0 k7 J1 l9 y
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * g3 b5 J/ C+ C* A: `( s; c8 a
temp = readl(IO_ADDRESS(SRGR_ADDR));
K- |, s. x h b printk("temp=%x\n",temp);$ Q$ Q! M6 Z' _* x# y# U4 T) ^
//RCR5 p. s _# U2 d; W
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( l4 Y6 S* ^* Y; C/ S) Q, G) l' \ //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ h/ Z5 n1 _/ J& U& P temp = 0x00440040;
# k4 X; Q* k8 r writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( u0 I6 n" U: X2 C7 A temp = readl(IO_ADDRESS(RCR_ADDR));8 c0 M0 ^- s6 e2 G: Y
printk("temp=%x\n",temp);) R+ c3 }/ X0 ]1 o
//XCR J3 G7 I+ U9 I* M W; Q5 m
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
% ?" Z9 ]" o3 `8 p //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 w6 u$ J7 e. v2 ~3 Q temp = 0x00440040;1 T) o" L2 g4 [* G- p5 r' o
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & C. Z6 J0 T( v4 b3 E& f1 f
temp = readl(IO_ADDRESS(XCR_ADDR));% X c( ^9 i% U0 Y+ l( L4 _$ }( C
printk("temp=%x\n",temp);
9 ]0 l* {4 ]& l8 ~% ^0 [* T udelay(100);
e9 s( Z! g+ V9 f //SPCR Register: f: I3 _4 P+ y9 A' z
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) B3 Z' s6 x8 T! e/ b temp = 0x03C10001; //DLB = 0 VS DLB = 1
" a9 r' I# s& X writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
+ P8 {4 I* s# r temp = readl(IO_ADDRESS(SPCR_ADDR));
3 D" Q- v( ~8 E) @$ E. X printk("temp=%x\n",temp);6 \" n) W5 {/ C- \. d
udelay(100);. x# T; }+ ^. A& Y4 T6 A" b( L
/ E* \; Y# |* c9 s! A) \! W
//set GPIO direction
! h$ {0 K5 g; r& q temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 H3 e6 N. X( @ temp = temp | 0x00000100;//EPR----input
8 o0 {6 R3 n. b t temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output# y8 x3 j; Y2 q: u* f5 r6 [
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ z" n: e# _% k w2 c* Q J* ?& H# S
% N8 R/ E+ G' K: }/ p1 I Y return 0;( P; ~# S r! r% I/ _, [! M. r
}* O0 H O# V I
static void __exit MCBSP_exit(void)0 e" U1 s% y7 v2 t
{
+ z6 f7 n( ]1 e4 m printk("mcbsp chrdev exit!\n");
2 t- Q' m) s$ G( R5 J2 z cdev_del(mcbsp_cdev);0 a' r" W$ J1 l' I$ U) a
unregister_chrdev_region(mcbsp_dev,count);
+ a2 p5 ^' g6 u! ? device_destroy(mcbsp_class,mcbsp_dev);
4 c. \4 P J2 F- m class_destroy(mcbsp_class);
. b" z1 W* q) G' v- ~& @8 x}
6 j1 O" B) X$ `$ u, D; smodule_init(MCBSP_init);
" n2 ?, b/ t) E+ Amodule_exit(MCBSP_exit);' W- m( p( }& p
. L# Y. `3 f- f8 G( L$ qMODULE_LICENSE("GPL");. d, d/ j/ j2 K. `# i& K3 @: {
+ E( b! O3 e/ A6 t, \' f' G6 H+ ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ ]& ? Z% \- x D/ Z+ m6 t# N我的应用层的测试程序如下
" v: L3 [. X" K: \6 ]5 e#include <stdio.h>
4 }7 ~9 {5 H3 a7 [#include <string.h>! o4 b* s d3 }# l8 E3 Z' w
#include <fcntl.h>
7 c/ x% |/ j) t' Z) k3 C& E#include <unistd.h>
" I) o S( F$ f#include <signal.h>- G1 b& ?8 k# s9 R" Q0 e' B
#include <pthread.h> //线程& ]! ^# T; U! J
#include <stdlib.h>5 m# a3 H* Z3 E/ q: Y* d
#include <pcap.h> //捕获网口数据1 W# l2 H2 A1 k8 N' P
#include <semaphore.h> //信号8 D$ H g& Z/ n) J
#include <sys/types.h> //消息对列
5 @ `( R3 |/ Q, D8 O3 _ X! o#include <sys/ipc.h> //消息队列4 p3 C0 a- i4 h5 k, y' Z% U
#include <sys/msg.h> //消息队列8 _, o Q7 Q' Q2 L4 q* P
#include <sys/select.h>* k) f5 d3 L" W% E, t! s/ J% V+ [0 m
#include <sys/syscall.h>
% d7 \8 ?. U: A3 S. N9 C) |#include <sys/stat.h>+ C/ k" @% {6 G; R' _' a9 {$ y
#include <sys/mman.h>1 Q+ c) M! L- N6 a7 _
#define msleep(x) usleep(1000*x)
4 G- m% `7 J+ Z: K. A( h q) E% |9 d$ p' T
int main()
$ { w) d# Z0 Y% s7 J" a" X7 \{ ( `/ g/ u' q6 k# d; t, f
//MCBSP,ARM与AMBE2000交互设备
! ]# Y/ ^& h" @: z$ P! {4 i* ~, U# T int fd;
0 ?: B3 }& K# b, X unsigned short data_write = 0x5555;3 @+ l7 _; X8 t5 W0 D
unsigned short data_read = 0x00;* c: P1 p; w9 \& f7 i
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# o7 o, i5 r7 I4 Z
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 }4 w+ X" y5 K" i* {. @$ O
6 S9 M! p5 S: v3 h& N
if(fd < 0)' c9 L% C4 V4 d$ l- a( N, q
{
6 \" ]% B+ b, P, H8 d0 o perror("open failed\n");
9 W0 D( V- F( ]# t4 b return -1;1 u8 |$ [6 h* B1 A4 L
}
5 f3 I. V' a5 ?* t7 M & t5 T" N# k- r' y1 E1 Z7 B$ N/ D5 r
while(1)
' }- j, O! n1 I7 Z {
$ R% i' n8 ~: n: H! L8 `
' U1 e! L$ [* h3 }' L8 t //AMBE2000每次读写是24个字为一帧
% A9 O2 x; C- @4 A+ B //写数据时将数据在底层存储起来,等到中断的时候再发送
* j# g; y4 y9 H, _8 B# C //AMBE2000输入数据是以0x13EC开头的
/ i: x2 i5 Q5 W j) i write(fd,&data_write,sizeof(unsigned short));
' |- M2 h% x2 d* n 3 Z0 p( c# I9 Q' i# C0 Z
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
9 [- y% _% y: v read(fd,&data_read,sizeof(unsigned short));1 m+ O7 t1 s$ f# i9 K- [+ k
- E3 X7 [6 b$ `& i8 k$ M
if(data_read == 0x13Ec)4 S# a5 M0 \ ^- ?( R
{
$ L: A# O0 m: W- D0 T( a5 K / q# c3 z% @. k
printf("data_read = %x\n",data_read);
. @; F9 R( L( O' I) p1 K }0 C H+ b. Z0 y& u
5 h6 F E0 ]9 F# z2 R, p- r, A6 a) I
msleep(10);
9 P, v! L: E$ w# z. T* A
9 f. d2 ]: P* C% N/ T! A' t5 u; o /*
: Q& Y+ U3 Z% S ioctl(fd,1); 8 ]1 ?) O h9 @/ |- i
sleep(1);
1 a/ }( k. k8 V* F/ u ioctl(fd,0);
, o6 h5 f H8 M7 u2 O3 T+ K sleep(1);$ ~& n; H5 ?" } [: r0 c1 _ C
*/
/ U% ?; I7 C8 H) H } ( Y9 D; f' I5 u7 z/ x
return 0;
2 f6 x, E2 F3 c) I' t 5 I3 I0 X! V; j& a- h- P& T+ A- h. p
}
. f/ o: w* I7 g' h
, \5 T5 B$ H% v/ j多谢各位指教,谢谢! 急, C! q( t4 ~% Z$ m" [$ f _ X
- f2 A9 N v, R: u
: U7 x' O4 G& D4 I% j0 ]
) r. S( u' [0 w; x
9 ]. d5 H1 O: o0 [+ |# a; t4 s+ z {3 R( e# _+ _" ~
|
|