|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 _2 k& g8 O/ b, C/*. D+ t2 X7 p* A6 n6 a
* Copyright (C) 2009 Texas Instruments Inc. E% b5 J; U# B
*
9 f) {, A( h' G" u* x * This program is free software; you can redistribute it and/or modify) w& N( U# L+ ?% D
* it under the terms of the GNU General Public License as published by
' g5 S" _; X, ~' d) E7 @8 `' l * the Free Software Foundation; either version 2 of the License, or+ l; W- K% C) X3 t2 @1 d! x
* (at your option)any later version.- ~( d0 \' b4 z
*5 V7 z: M/ O: C0 u. j1 R
* This program is distributed in the hope that it will be useful,& i; O# G- n7 K- f# Z
* but WITHOUT ANY WARRANTY; without even the implied warranty of1 ?6 P6 {. S R- K* m
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ k" e) \6 z& C& Q' k6 J * GNU General Public License for more details.
3 A0 P+ W* P$ J" r3 v *
) d# S: y& p. `* }$ { * You should have received a copy of the GNU General Public License
m: N$ B; S2 F, \ * along with this program; if not, write to the Free Software
1 }, M4 C2 w5 f$ S9 n * Foundati
6 C1 L8 G8 u7 @) {$ _5 i' ~4 @6 t*/% X2 X6 ^" p# W2 |! B5 b F7 Y
#include <linux/module.h>
8 i; P( V0 T+ ~! R. q8 e#include <linux/init.h>
3 F, F1 w b1 G+ T3 r#include <linux/errno.h>
6 e7 N6 A9 f# j2 f9 c) \#include <linux/types.h>5 l" c, U* e" l0 ], D/ [
#include <linux/interrupt.h>6 w' d" h# D9 Q+ U
#include <linux/io.h>: q# K6 J( R. p6 A7 t8 l- i& ]7 R
#include <linux/sysctl.h>
- X8 s1 R5 `* I- A( r#include <linux/mm.h>) {1 `& ]1 i6 c3 k9 @% \9 H
#include <linux/delay.h>3 f( W& s4 W6 q
#include<linux/kernel.h>. c( y# C: `! I3 V. K- D* R
#include<linux/fs.h>
3 E& Y! f# o% ]1 r) x#include<linux/ioctl.h>
_- \- i/ Q B#include<linux/cdev.h>
1 o' a. w( o" j2 w2 r2 V1 ^# {#include<linux/kdev_t.h>
; l7 g* G3 f! ?9 t/ ]" n5 ?#include<linux/gpio.h># }& Y: S9 j( C' L. K
#include <mach/hardware.h>
% n! g( F! C7 v5 y. ]' X#include <mach/irqs.h>
# u; C) o- D8 B" H3 [% i0 c8 X
* D; A3 O; C2 m' ]" s, t. `#include <asm/mach-types.h>
5 G( s, E: P1 G- X/ L#include <asm/mach/arch.h>
, ?, K. Q- I" H9 h* H" r- ^#include <mach/da8xx.h>
7 W+ e! d& `0 w- o#define SYSCFG_BASE 0x01c14000
& f( T* w% a$ X& J$ X" ?. P i#define PINMUX1_OFFSET 0x124
9 z+ C- b# Y% n) K/ D#define PINMUX18_OFFSET 0x168
5 H4 w+ m% h+ _ h: P$ l8 J2 e#define PINMUX19_OFFSET 0x16c4 |+ g' T% I5 ]- K
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR6 C' p# o( W+ G7 y
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 H" c* u1 ~6 N3 R5 ?#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 Y% I/ R/ |4 z0 H% w
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
/ i; f6 |; W$ F$ X#define PCR_ADDR 0x01D11024 //MCBSP1_PCR5 ]* l) p5 Y" t) r* |) u: y
; i! _* I" }5 f$ K1 g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ P' y* `9 D: ?1 y* X* s#define DRR_ADDR 0x01D11000 //MCBSP1_DRR! j1 K/ G. X' w. y4 J1 k) i6 b3 i& z
//PSC
8 O+ H; s) _* p: e9 s#define PTCMD_ADDR 0x01E27120 8 c6 T3 r% ^- N3 m
#define MDCTL15_ADDR 0x01E27A3C
, S8 O# f; o# W( b! u e u! R% {#define PDCTL1_ADDR 0x01E27304
% X' h4 a, H& ]7 M+ q" s+ w! E1 x//GPIO8 direction
- B! Z4 Y( \' U2 W' c; ~#define GPIO8_DIRECT 0x01E260B05 E8 w, q% r9 h7 ~6 }! d1 w
#define GPIO8_OUT 0x01E260B4& Y5 n* l6 a: K
#define GPIO8_IN 0x01E260C0
* O/ v5 G7 T8 u/ {% o7 N
8 E2 y& U6 C! d# _) r3 D//#define MCBSP1_RINT 99
; t- g" K- g/ u, @//#define MCBSP1_XINT 100
' ?! R7 K& `& X. O9 p1 ustatic int MCBSP_MAJOR=239;2 u% e2 z& B. r
static int MCBSP_MINOR=0;
0 w* O' `3 [( \9 mstatic int count =1;
/ ~. _7 [1 _! ~" ^) S- k# e* N. E* {$ n1 E7 P3 l' P
#define MCBSP_NAME "MCBSP-device"
" ]# Y7 ?$ s+ J7 u- F W
' E7 }6 ?3 b; ?0 Xstatic struct cdev *mcbsp_cdev;
+ f6 o9 d. i; o3 B* M- u) ]static struct class *mcbsp_class;6 x% S0 F N6 M8 U* v( e
static dev_t mcbsp_dev;* z0 e" r$ {7 a# n
unsigned int DRR_data;
. ^. l/ L# N) P9 `* Wunsigned int DXR_data;
) h9 P, ^- y7 M$ R$ astatic int mcbsp_open(struct inode *inode,struct file *file)
% `+ H' m# ~# z9 s8 y+ W+ e{
+ R2 M. u9 \0 V6 R6 f
! A& e! J, t. C6 G$ L! L //interrupt enable,initialized2 n( i0 ~" o5 r c' k b
unsigned int temp;
9 p( D0 r" z8 e# t4 ]1 Y9 C7 m //SLEEP_EN(GPIO8[10])---0
7 G0 ?; y4 R$ U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 S# \+ E1 [, }
temp=temp&(~0x00000400);4 q, B! q2 F& B) ?& x
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* G* S! h% Q/ U6 w //RESETn(GPIO8[8])----0----1
% y" m$ `, Y. d$ [* N7 Q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 { B* l1 ~3 z! M temp=temp&(~0x00000100);2 R4 G1 w7 Y+ ~' v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ g& h6 |$ M$ |7 s4 m* o* }
udelay(100);- b2 ^, n" j. c. |
temp=temp| 0x00000100;
: n$ M7 `7 C( b __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) H) L0 F& B# v7 ]) c8 t. U udelay(100);
4 F# ^# K; ~! h$ w3 s' Y printk("open success!\n");+ g ?' c5 [2 X' _$ ]( ~
return 0;
# C: f J( V2 o. p}5 F, z8 m8 ?. g/ h7 Z( P) S4 [
; h8 |- N' l8 {4 X' Rstatic int mcbsp_release(struct inode *inode,struct file *file)
4 U* d4 Y- K0 b: x& u{
9 P- v8 W1 ^7 |' M9 l printk("release success!\n");
' H5 D' b$ f I, K; `- { return 0;
7 ?% w( r8 V p, i, |0 a}
" `! N% _' G. c# A+ L5 x# T: T% {5 w! `* z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& Y- r5 e: X } R9 S
{( v( r; {# F" q4 L
copy_from_user(&DXR_data,buf,len);# v/ q2 q# ^% {4 k
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% L7 U; i+ f3 J& [ return 0;
' A/ M' v" Z- u+ T3 U6 e$ v: h * v, r% j r+ w% L7 p
}
: g) r0 T* k( m2 p2 s: V0 F- S; g7 N# p4 z8 `
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; R6 k% U) e e) h# `{ # M" t0 u V ~
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 l, f) }7 \. {3 I0 } copy_to_user(buf,&DRR_data,len); * N+ D6 y/ c( [6 n V Z# Z1 X# K
return 0;3 I# D2 f! o8 S
}
0 G6 E/ o% q7 o6 N2 a8 y& n3 a) F( Z j6 z$ j2 g0 F6 t7 v
0 r/ Q" E' A7 X3 o/ o
static struct file_operations mcbsp_fops=7 p4 Y5 u% r- `' \, j y8 v
{
8 M. i6 h5 f' c5 _. A! r .owner=THIS_MODULE,; }, h* v3 U1 d& }4 {9 G5 y% i* Q
.open=mcbsp_open,, u1 s9 l1 t7 C1 R; c2 D
.release=mcbsp_release,
7 H1 ~. a9 }; ?. v" n7 g" s .write=mcbsp_write,5 X/ m5 s/ m3 j
.read=mcbsp_read,. x$ [$ \7 b: E: r: x3 y- L
};) x/ I4 \' K" w* n/ H! p0 c
static int __init MCBSP_init(void)
: X* M- {- `8 J5 M! F{
3 E8 f( E6 {2 K0 @' _ int ret;1 L/ ?! h" W& R+ S
unsigned int PINMUX1_REG_old;
8 u! n/ p' x, Z3 Z' u$ e6 ~ unsigned int PINMUX18_REG_old;: i! U5 E6 v/ T1 J Y
unsigned int PINMUX19_REG_old;
% e& P- n. i5 W0 e! y$ t9 K unsigned int temp;
& F, [( H& W# u; I6 L* Z if(MCBSP_MAJOR). g+ k4 c1 y# {, |+ z' W
{
+ G Y6 c$ R. h+ T" |0 A mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);, ~2 T, T* X- [/ } n6 I
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- K2 }9 h3 l5 T5 Q8 ~
}* I6 i6 \( o3 l/ t7 @- G
else
0 k8 k# B j0 `2 `! w- j" j {* b% f0 K3 V1 s# J
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& o* B* M5 g$ `* ^& Q2 v# M MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 L5 R( i) i% t+ {& x1 U% q$ t }* o- f) K, j. o* P; Y% m
* b' H3 U1 \/ D
if(ret<0)
3 \7 g9 z- ^2 n6 Z { y. G% c+ G5 e/ o' ^
printk(KERN_ERR "register chrdev fail!");! j" Z1 a! @3 P k# `
return -1;7 ~5 r: k) ` Q1 b5 a" Q
}
! h/ F0 n8 ~# h: ~0 r( m # {# F/ T) D0 ?- E
mcbsp_cdev=cdev_alloc();* g: T$ c! U* u; U+ U! w
) j. a V) @, |( Z& i
if(mcbsp_cdev!=NULL)5 {6 E& j" X& K0 y. |% D
{ a% j$ ]- P0 U$ z
cdev_init(mcbsp_cdev,&mcbsp_fops);2 P( ]) p# M0 ~& l
mcbsp_cdev->ops=&mcbsp_fops;
3 O* g/ M. @3 Z! [ R- ` mcbsp_cdev->owner=THIS_MODULE;) ?* j1 s4 {9 J
- A8 ~& r6 m" s7 o
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 J$ ?4 P; e/ v0 r printk(KERN_ERR "register cdev fail!");
6 s' u& J0 f! E( `+ H else
1 _: w& ?- n8 J4 X( s& b: h5 D printk(KERN_ERR "register success!\n");
- o9 F3 m. p9 U }
* J9 X% S6 |) f7 B" j2 q8 v& P! w else9 q: p9 ^0 k+ k! x" h, d! [
{
2 d7 |* s& I; ? printk(KERN_ERR "register cdev err!");/ A4 D2 A* q$ |! c8 e( I5 w% n
return -1;; ^+ {* Z9 \ K9 ^9 v5 v. f
}
: e" V1 T! n) ]8 ^4 u& r! L 5 c7 y' z* C% P; M" ]
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* ~" l. V5 z" y! x) C
if(IS_ERR(mcbsp_class))
1 A/ X5 n8 J6 z, ] F+ U {
& x4 _3 \. I& ~ d+ a; i0 x, p printk(KERN_ERR "register class err!");
7 t. q% M1 n4 ^+ N m+ u B return -1;
, @2 b/ M; e" p1 }1 ^ }- [3 q& m$ K; Z. z9 w
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( w# {1 D/ m0 n k8 @
& n+ S! l7 \( P2 Q2 d //PSC
8 v# Y8 H7 h" ~6 p3 J- @" _4 ^1 v //add Enable MCBSP
8 _8 A8 I- \! h2 k //test" w* j* G* Q% d9 G$ w
temp = 0x80000003;
, h6 R) r/ m/ n0 r# H1 q+ l9 d* l writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ l Y; L# u/ k+ b4 E/ A) l temp = 0x00000003;$ \" W" C$ [3 m! R0 _6 x3 ?
writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 z' r( v! g. X' R/ ~/ V1 ^
$ \# R9 t& X6 N9 H temp = 0x001FF201;' o- Q' f( a( ?: x
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
c4 v& [! y- R( p' A ` { 8 B. U" m5 N& L+ m0 F$ A t7 ?# \
//PINMUX
1 J5 x9 _: _3 h //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. J) n% Z+ C/ S PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); . w/ o) J6 \8 [+ x7 D) F: v
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 4 U9 ~, Q+ n* l! I. `
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# B. A I6 q5 \2 k! N6 a4 g2 ~
$ ]0 [ M" `% j9 E& |( D //SLEEP_EN,EPR,L138_SHK1,L138_RC0 J) T6 ]) F; C% ]- X
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % K$ ~+ w1 |7 ^7 E# {, q8 k1 [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
' z8 y! }. o, B. E9 G) j" k writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# @7 P9 }+ ^2 e$ }7 Z
i- Q1 e) b9 E8 `, [5 H //RESETn,L138_SHK2! _( }* G2 K, G& g& Z; r" ~0 p
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 s( C4 e" a/ P( ]9 f PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; * [/ ]' }( f" Z; d
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% H/ k3 X% @* {9 s9 I* P a% s
/ X) Q. c, d) Q0 Z1 C) Z0 l3 I
( {' w, r" t' a% O
//SPCR Register
) o1 i, X& c6 _ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: a8 @" ] M- @. O+ i( I; _
temp = 0x03000000;//(DLB=0)
S) K, j, [. ?, \$ [ // temp = 0x03008000;//(DLB=1)
* O) Q! }$ h' r writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% {! d. o' x& P; y) K7 \ temp = readl(IO_ADDRESS(SPCR_ADDR));
2 ^6 ^$ _; n4 g1 k: G4 @6 L1 { printk("temp=%x\n",temp);/ U% t' X8 C) f. B" z0 c; x
& b' G. l. j4 y f: O //PCR Register
' \- |: E B- p f* ^: U% j //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
$ L! s) F/ P; P5 n5 X/ } // temp = 0x00000F0F;
+ p8 N9 O& m; g temp = 0x00000B0F;; U, p, d0 j; o* a/ s9 g T/ w
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
# n7 F f0 Z* g temp = readl(IO_ADDRESS(PCR_ADDR));5 o5 H6 d0 c+ k4 g
printk("temp=%x\n",temp); 6 T/ Q5 Y/ L) r: k
//SRGR Register
O8 T* i- M) x3 B O //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 P A' t+ d1 ]5 U' k3 K //temp = 0x301F000B;* \6 j7 y) |/ N
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 3 r7 d6 f- H* X. ^
temp = readl(IO_ADDRESS(SRGR_ADDR));1 N# X! k& B, O3 R& q
printk("temp=%x\n",temp);
' K) s# u- f! q0 o; @8 \' a4 n, K, f //RCR3 n% S0 @! ^* O4 [0 x s
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
# V* U# n: F& x! Q0 { //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' l& r6 O5 G( a1 c5 t4 c8 _ temp = 0x00440040;
$ C C S! n! e& t& ? writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
2 i. Q& p3 \* u: e7 I7 [ temp = readl(IO_ADDRESS(RCR_ADDR));
: z& q' Y4 o/ y2 H printk("temp=%x\n",temp);% ~- m$ ^3 r# q3 s6 j0 L
//XCR1 z4 u% l; ^7 h/ g" O# b
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" ~. K0 B/ [# L7 ?% }) p+ E# A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 a4 H/ f7 ^& R temp = 0x00440040;
7 y. a- R' K8 G- R writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
8 s) K0 f. s+ d temp = readl(IO_ADDRESS(XCR_ADDR));
; t( t. L# U2 r1 { I$ i printk("temp=%x\n",temp);: K9 s' U! [% ^: n
udelay(100);
: W3 H2 T" M/ `0 j //SPCR Register$ ]5 Y& j: ^4 R/ W7 X$ ]* k# p. c
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 @7 w2 a2 P' V6 e( s
temp = 0x03C10001; //DLB = 0 VS DLB = 1
* z% v6 A J6 G% K) @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled% k, }' s9 l, M8 n# J
temp = readl(IO_ADDRESS(SPCR_ADDR));& f! T( q; f+ L# T
printk("temp=%x\n",temp);6 P# B! I U# m: i, x# J2 @
udelay(100);6 e' C0 W8 m# c& T* j% X9 p- S
% U1 @/ H/ C! \$ L6 ^, }" n$ \ //set GPIO direction
! N* R4 c) I8 x: ?& W/ b' g temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ B: T9 ^% r0 G( @% h' ]' u
temp = temp | 0x00000100;//EPR----input
" U0 |8 U2 O( j temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" Q, t8 z: N/ Z5 F( B( D3 Z: O& j. p" W
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 Z& _% U3 p1 {: l
# z$ A9 {: u2 j return 0;2 ~/ f( E/ q! |. W( k2 Z1 P! i
}
' h* U+ X ? J/ pstatic void __exit MCBSP_exit(void). D. [* u' v. F- c2 R
{/ j+ g" i/ D6 S& P. z
printk("mcbsp chrdev exit!\n");
3 p3 P7 M' Q0 M: T0 I cdev_del(mcbsp_cdev);7 Z# c" @# G3 ^) P
unregister_chrdev_region(mcbsp_dev,count);
' F; ?: w H2 I. i device_destroy(mcbsp_class,mcbsp_dev);4 _1 L* n7 w4 y- k# V/ \
class_destroy(mcbsp_class);
! \1 f/ e: r6 B9 L}8 ]+ w4 e- T7 n8 i# @
module_init(MCBSP_init);
$ g: g1 ] i \" H% smodule_exit(MCBSP_exit);
/ U' G2 p- N2 k6 Y# C% V a% M; L4 H; M
MODULE_LICENSE("GPL");
' g3 m8 j! I3 P+ V! A5 [5 w. Q. g$ d7 f) M) {# x* R; O1 S
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 p* w+ m2 ^( M3 r. u2 P: I
我的应用层的测试程序如下, g( z; m3 [3 g* E; E
#include <stdio.h>
1 k0 i- D' _4 Z0 e#include <string.h>) E7 @5 d& X; H: C* M1 ~5 D
#include <fcntl.h>
8 Z! M+ K& Z# V#include <unistd.h>3 h) G, U) p0 [' H) h! w) G
#include <signal.h>: c/ p8 y @) I
#include <pthread.h> //线程
( V+ G7 `- a1 m#include <stdlib.h>
7 }; X" |* m: H" d( C: F+ R% h#include <pcap.h> //捕获网口数据
, L" D) P5 E: I6 E7 M#include <semaphore.h> //信号
r/ A% U$ ~+ R- q#include <sys/types.h> //消息对列
! D6 F6 d1 t$ T. C5 ], h* y#include <sys/ipc.h> //消息队列
% e. E! H& B+ T8 o6 K#include <sys/msg.h> //消息队列
5 L' z n. z9 w* Y3 f#include <sys/select.h>
/ L- _4 {; r, R4 h#include <sys/syscall.h>! s& W: p2 A/ v& ]: o: F$ ]
#include <sys/stat.h>
" x& @4 t) K: R: h. u- q( z3 j#include <sys/mman.h>
( Y; f: h7 d m! N' _% A#define msleep(x) usleep(1000*x)& x J+ m) U9 N1 \
( G; }4 ?5 W. l
int main()( v4 w# |9 x" q7 Q8 S
{ . z6 i/ A$ h. `, i! N" ]
//MCBSP,ARM与AMBE2000交互设备
/ f$ `$ U5 e3 Y int fd;: R- g, M! `- U
unsigned short data_write = 0x5555;
: r3 K+ t4 D9 V2 A: k1 | unsigned short data_read = 0x00;% ~7 ^; T" z5 S+ B
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: c. K/ n2 d3 r' f // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 Q- c) t; L/ u. `
7 N7 w. S, C. l. c' r5 [ if(fd < 0)* l0 u! m. ]. w6 i! j
{
2 g2 G* y: D5 S a perror("open failed\n");
# u) H9 z* Z+ ?" Z* Q return -1;3 e+ ? _. v! D
}* U; S, h3 T! \
& c! o# x( d: s, W! @$ T8 r while(1)
5 @0 g, p+ `0 f" w0 ^* \ {
1 m1 ^/ Y, [6 i) i
" w! ^6 `: g6 {/ d$ T( O2 W, o. I //AMBE2000每次读写是24个字为一帧9 V W7 b. ]. L6 ]6 ~
//写数据时将数据在底层存储起来,等到中断的时候再发送3 ]% e: k* K( G6 u
//AMBE2000输入数据是以0x13EC开头的
4 _# W5 N5 H3 p a! Z7 \ write(fd,&data_write,sizeof(unsigned short));
- [/ b( _3 S `& q) y4 r ! k3 p. S$ _) m
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( ~) S' f2 C, D' }* k7 c6 A9 r read(fd,&data_read,sizeof(unsigned short));
. |- } ~6 K8 h6 ?
* t$ a8 L3 c9 O if(data_read == 0x13Ec)
4 Q3 J8 H) [$ P: ] {
1 F( d1 g6 ^& B 8 s# J& a; w$ l! z: z7 x
printf("data_read = %x\n",data_read);8 I! f" X) c9 W9 n: V
}' ~% X) A# O& Q! y
& D9 t9 G: Q, g: V Z9 h: q8 V, R msleep(10);
$ C, ^, j3 u, r$ A4 f5 l) n 6 \* r5 p- W4 D. @. ~* Z
/*. Y' w+ @& Q* z5 F u$ n
ioctl(fd,1); b; ~% I4 w- X6 ]' L5 ^% Z/ u
sleep(1);
' X! M$ m! A" I1 g4 s ioctl(fd,0);
4 ]* X N4 d; ^' P! y sleep(1);6 ~/ n. g( Z" ~# \7 \
*/ . I$ Q" Q! n7 j% ?' S' u0 ^
} 2 R( @: {. B$ P6 C2 w
return 0;) o7 {! b$ z9 d
# \; ?) O* a: I. l# g I9 N$ G}
% F& m* T- Z. S
- o( P( G8 |5 R# F8 V多谢各位指教,谢谢! 急
9 L2 y" d w" k" R9 y0 ~* ^) l. u; ~- W1 b/ e( H: W
' k( _+ P5 ^3 E+ \) e2 w( \7 B6 V
. n+ b e+ @+ `% C# b0 z3 K4 R. g$ |" ^* G# B0 I, K( G
|
|