|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: n! h7 k$ U y3 z$ C
/*
$ ]8 p) @+ o* {4 ? * Copyright (C) 2009 Texas Instruments Inc
8 Z e, ?2 Q M* m. ?/ n' h *
# J" D- E6 `0 G/ D c! J0 |% {- d * This program is free software; you can redistribute it and/or modify
9 [$ D) f- J" O- J. E * it under the terms of the GNU General Public License as published by9 N( y& m7 {% n5 h$ \) F6 v& P
* the Free Software Foundation; either version 2 of the License, or
/ h4 w5 d S# N, I( I * (at your option)any later version.
# K P! O- @) s' q; P# o *2 { S$ E7 k( R2 }8 s6 R
* This program is distributed in the hope that it will be useful,* o0 Z2 d* \" R7 R0 R3 d
* but WITHOUT ANY WARRANTY; without even the implied warranty of
^( C0 P* ], d x * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 N8 B# Z8 Q; K, v' ~6 x
* GNU General Public License for more details." B, H, o8 v" p9 o( n
** \, o c6 K# o @" H {
* You should have received a copy of the GNU General Public License# }$ `5 t$ n0 }% l5 B
* along with this program; if not, write to the Free Software
5 K& E j: n# _0 W7 b& I. p! s* c * Foundati
8 F. |" M$ h) p*/
* Y, M2 B$ `! x, \' g# R9 v+ B#include <linux/module.h>, t" [0 h( P h1 b4 s( C, B
#include <linux/init.h>
* J m0 U' c6 N0 q, o1 r* K s#include <linux/errno.h>, `7 Y' k& _' Z/ M T
#include <linux/types.h>% p: Y' C0 \/ H7 X
#include <linux/interrupt.h> l# z* b3 j$ }% u8 \
#include <linux/io.h>
. o) A. C Q9 ]! K0 y/ L#include <linux/sysctl.h>5 r; t2 s+ X/ z
#include <linux/mm.h>
7 ^: }# b7 F1 |" s$ {! Z# T' e; ~8 a#include <linux/delay.h>& m* L, a& g$ y, I8 r9 a
#include<linux/kernel.h>
# H7 w8 l8 Z- c1 b( T#include<linux/fs.h>
) @. N; F D' Y6 U# v# v. w#include<linux/ioctl.h>
8 |6 m/ A' m& X8 I; z- A+ l6 C#include<linux/cdev.h># S0 \; K* ^ k8 k$ b
#include<linux/kdev_t.h>
; z9 d& \1 `2 H ^( |#include<linux/gpio.h>; P5 d2 x& z" [) y9 P; F
#include <mach/hardware.h>
% ], M6 j; w% T5 U1 K#include <mach/irqs.h>
& O1 R% r5 L+ x
. J$ F; A6 l" x( ~/ o#include <asm/mach-types.h>7 [) d/ U/ N6 `4 q9 a9 s
#include <asm/mach/arch.h>9 V. Q x' p# d( h" K% K$ ?. _
#include <mach/da8xx.h>, g/ v) z% \# e7 p
#define SYSCFG_BASE 0x01c14000
* e, G- C# d# ?: v- W#define PINMUX1_OFFSET 0x124
; W/ p4 n1 o, D8 I, m; Z- l/ |. n#define PINMUX18_OFFSET 0x168
, A9 Q$ u2 }* h! E+ N4 d$ H#define PINMUX19_OFFSET 0x16c! r- R8 ]" A. H- j' M
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
4 B0 y2 Y2 U- Y* j#define RCR_ADDR 0x01D1100C //MCBSP1_RCR; d& S! r" T, b; Y" O5 \2 z
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
8 \" W; x$ T" d$ g, L0 a6 {#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% S( F' H+ @, v7 d! S#define PCR_ADDR 0x01D11024 //MCBSP1_PCR O8 e; Q8 P9 W9 J- s
8 A3 p6 C0 J% A) t4 ~% F. v# s& A
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR' |, G8 V* L: L6 {
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 j6 X5 ` h/ L: l; ?//PSC
8 d/ H" c) {& i3 U#define PTCMD_ADDR 0x01E27120
# k# ~0 E* E* s" Q# F; q#define MDCTL15_ADDR 0x01E27A3C
! p5 Q6 j# Y$ q1 |$ x#define PDCTL1_ADDR 0x01E27304" Z/ ~5 N3 W+ w4 }# c
//GPIO8 direction
) T6 {5 I* k. W8 U" F#define GPIO8_DIRECT 0x01E260B08 {) a, g& j: R, w6 Z+ d
#define GPIO8_OUT 0x01E260B4: ?$ f% N8 `6 K _, y
#define GPIO8_IN 0x01E260C08 q3 ~9 _* G- H
8 m) S9 z9 V/ z5 S//#define MCBSP1_RINT 99 ' H/ `9 |- y* g& q# K
//#define MCBSP1_XINT 100
2 G7 l ~9 s& E( jstatic int MCBSP_MAJOR=239;$ [5 x1 [+ }4 F" v$ S
static int MCBSP_MINOR=0;2 J1 y: j3 e* f A/ R, T
static int count =1;6 `, N; X( B! I6 l1 \6 h4 `# \0 d
4 C! i" `- t& r4 P* H& U- R. F
#define MCBSP_NAME "MCBSP-device"
9 {( B2 B; D1 y: _
3 o# [* Y# J0 z9 d9 D' Xstatic struct cdev *mcbsp_cdev;! l, p9 I/ [5 k
static struct class *mcbsp_class;
2 R0 X/ |1 a3 l+ b( R6 E6 Nstatic dev_t mcbsp_dev;% S v! o+ r6 F* Q4 F
unsigned int DRR_data;6 _. u3 }6 G% ]& k7 y5 O" L; y
unsigned int DXR_data;9 `, d) @' N. [% F! h2 \
static int mcbsp_open(struct inode *inode,struct file *file)' E* E$ I$ A% O4 N2 m2 ~3 U
{
/ ?% w4 `2 P8 @' y " R, a3 K* z7 D# H: w
//interrupt enable,initialized5 y" c: a2 }, m |. m7 B# L
unsigned int temp;$ Z( c* x! q7 Q W
//SLEEP_EN(GPIO8[10])---0
0 ]7 ]" [0 F5 j! F0 m4 X9 Y1 Y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 l: w# ?& ]# q
temp=temp&(~0x00000400); K3 d: t9 J& J9 z" y* q& g3 e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" T7 }0 t+ W7 e4 k! @
//RESETn(GPIO8[8])----0----1
2 }" M1 E5 R! }/ U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
x U! `1 X$ A) c4 b temp=temp&(~0x00000100);
2 _' S& Z6 P2 A- f; [6 _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, w* \( {- ?& b1 r* X
udelay(100);, ]8 N7 A, b& a# P! \2 _: R$ \) A
temp=temp| 0x00000100;
" X3 Z# L, L6 Z# {% ]9 A' ^5 _- K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 E& E8 |8 ]. p5 O udelay(100);
. N1 E: K8 t' }! ~2 r printk("open success!\n");- H X b( |: t0 g' M; A
return 0;8 D+ l: d$ W! h/ G8 F8 n! G0 i! h
}$ C+ d& ]( I4 V8 a! G# g
- J/ M# ~+ A+ K/ N1 J1 y7 Fstatic int mcbsp_release(struct inode *inode,struct file *file)9 n' U. g2 @5 F4 t* H
{
( q, a" u' I. o, b, d$ W printk("release success!\n");
0 c* Y' O6 X; S t, ]. B return 0;
. r% ^$ n, h5 O1 }3 T, X}
0 q$ x: k3 _2 m( N
8 X5 O6 J" h5 P* kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ X7 e% Z/ o% N: _
{5 ?% j; b8 A m' f3 z) h9 w
copy_from_user(&DXR_data,buf,len);
8 A9 w6 Q) O" b0 h. W6 P4 }8 q0 b) Q1 a iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); , y" {6 {! `5 F8 a
return 0;
! ?2 f4 r' R8 J- F+ I+ c ( \/ e% y' ^/ C
}' U& I" \- e& t7 v7 Y* U
0 S. t5 E% G; D1 o$ estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( j |, P' w \! E$ _
{
6 Z) Y; c1 G0 G+ k2 s9 A DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 j$ m3 k! C: P
copy_to_user(buf,&DRR_data,len); ( ^ j6 K* c% ?' g
return 0;
: n: ^ O% W" f( j5 w3 b- i}
" i1 H# x- J1 C: C$ V E. N; N, k( {1 v
' ~& e# O6 U$ {/ @' D( A
static struct file_operations mcbsp_fops=
, I9 d/ `% c; z( @2 s ]1 m{) p/ b# e. \" _* P: i8 Z
.owner=THIS_MODULE," x/ j/ |' q# W J0 g4 v
.open=mcbsp_open,' t1 ^4 V; g4 k' M2 a+ _
.release=mcbsp_release,
/ S' V- X: @- \' ~ .write=mcbsp_write,
4 e$ W0 f4 i( i' `3 o: ^# v7 } .read=mcbsp_read,
. Z: Y+ Z" W0 ?4 ?9 |};" r+ ~ Y. r3 B0 _9 w
static int __init MCBSP_init(void)
1 P/ D/ `3 ^( Z& [4 A$ t{
& s6 j6 d L; w3 o1 W int ret;+ U9 y; z- ^+ t4 g
unsigned int PINMUX1_REG_old;
7 A. G! U( t/ o9 r( P& F: r! ? unsigned int PINMUX18_REG_old;5 l, h: B: m: Q. x7 H
unsigned int PINMUX19_REG_old;
" o, J- L( b. l9 B+ o H unsigned int temp;
- O+ H1 N+ i( P! o if(MCBSP_MAJOR)
8 ^; {1 Y7 J( Z {9 H+ N) f5 t! V8 O* x) c
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% b: ^- F' x/ q% J
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* a' Y j! }" E2 }1 R6 l6 z }) ]( `8 j1 R* ~6 I
else
- d. G- B9 y! X6 B9 x* l {
, j9 [" {7 u/ Y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! Z- u8 r u. {* R' s- L- S: T
MCBSP_MAJOR=MAJOR(mcbsp_dev);. M( L$ c) l: r% A
}0 c& q* w( R" D; M
9 @; V: Y( m5 ^. \ if(ret<0)) i1 j- }3 }" G! X- E
{
+ I( ?: z9 p/ A R: Z( q: P printk(KERN_ERR "register chrdev fail!");
3 ]* r+ Y" |- f3 }" F' z4 [% J8 x return -1;9 f8 N ?* W; i9 i5 a$ a( a
}& k) x. i) D* s, S! A
- ~: M; j! n0 C" J" b5 G
mcbsp_cdev=cdev_alloc();
) V ^4 t$ g" Q) b2 O% `; `
1 X- W! z3 l( b$ C" U if(mcbsp_cdev!=NULL)
/ _3 f. j' m9 p* Y: b6 y" U9 i( w7 a {7 o1 t$ N% w/ i
cdev_init(mcbsp_cdev,&mcbsp_fops);
3 j+ [/ `" ?& A( \+ B7 F mcbsp_cdev->ops=&mcbsp_fops;6 ^1 ~/ C+ h. |
mcbsp_cdev->owner=THIS_MODULE;5 y- g. E9 f7 ?6 g6 G7 n* w
0 F. c" [, R& B+ k/ ?" d
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))7 X* a: T* O% S! { ?3 _
printk(KERN_ERR "register cdev fail!");% J) a0 s& b* Q3 e3 }2 s
else
' r6 ^9 l5 V" @: r printk(KERN_ERR "register success!\n");
1 o! i5 g8 G/ H. L3 E }: \" D6 _' M, v! Z; Z
else
/ i+ _; U$ p0 g* C {
! n- `4 m+ K! R" w: H printk(KERN_ERR "register cdev err!");
y+ H% {4 _8 c B4 ?7 V return -1;6 }, H3 B4 M4 r# z3 n
}' p" a& u' b6 k
& K5 E1 Z* V; Q. J) q, K2 B
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! D8 M/ K! t( v0 T+ m
if(IS_ERR(mcbsp_class))
6 g3 w; s2 M: t5 C/ ?: y! y9 H {
, U, z; Z9 x5 Z& O% x printk(KERN_ERR "register class err!");
1 W( [4 L, N' j% J& _& ], F return -1;
4 I( h4 Y' h( V5 t$ K& _* ]: h$ x }7 j( F8 B- }* L6 K& j- F
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 D. d2 w' f1 e# J5 M ]
$ w3 E: I& b6 P //PSC7 N# P9 V0 h, [( l- g
//add Enable MCBSP
6 I9 z2 I* G% k. ~( b0 @ //test
9 N5 D4 y# X7 A. A temp = 0x80000003;0 z+ p" n3 s. _/ y/ |: q( V
writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 \$ M% k( P7 H7 ^# F! T
temp = 0x00000003;
' T# D3 D( t9 E" U8 | writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 r, X; W9 n% s/ }; W
% M2 t. ]- a4 N temp = 0x001FF201;
" s* }) n/ ?- m( C5 d; K writel(temp, IO_ADDRESS(PDCTL1_ADDR)); [: m% Z# K) {5 g5 i
! \& s! c. l% ?/ a2 w& w0 c
//PINMUX
- s$ |: g2 u) w, A, b$ G //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 e+ v' Q5 S: l PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
Y* r/ {8 x- u PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
- ^( y, L4 ~) `$ |3 j$ k C writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# v1 s$ f& a. `# m
, |" C) H2 b. h$ V: Y //SLEEP_EN,EPR,L138_SHK1,L138_RC
& L9 ^1 P6 d- d+ s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) ~" u! L5 R1 C# [7 { PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ! U" K# [. s4 x! ^& E
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, D. k* c) H1 m/ x( y5 `. m 7 H6 O+ e( ]1 `9 K/ p
//RESETn,L138_SHK2% }; R: N: p8 c4 x& V! j
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
L c2 |. l* E U# o PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 2 y6 F! d0 N( q8 a
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);5 M2 @% a" [+ ]+ {
. Y* {; b5 M4 R& k% S( `5 T 3 w v9 X6 R# y1 ]' N3 K
//SPCR Register
. t% B) n8 ^* e3 u7 ~ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ V9 u% S7 K# ~9 ]3 \* k
temp = 0x03000000;//(DLB=0)
% O7 g" g: x1 U* Y // temp = 0x03008000;//(DLB=1)% Z, m- A5 E) |& s5 I+ u/ \, J
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset) o, u: U* r: u# ]" f/ D) }+ {
temp = readl(IO_ADDRESS(SPCR_ADDR));
; {4 B- j+ c" a* r# h& Z) E printk("temp=%x\n",temp);
* B9 B3 m/ c2 h/ v( M 9 v( n. F7 y* ]0 s0 l& M
//PCR Register
; f# v% b& x3 ^0 k# p U0 k8 \8 W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; W) ^4 N6 T i/ f+ D
// temp = 0x00000F0F;) L3 |( O" ~9 I! @4 n( K
temp = 0x00000B0F;$ e: @6 I- X* s: O/ S3 h2 g
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
4 M M% e6 [% c temp = readl(IO_ADDRESS(PCR_ADDR));1 q! Q r) Z1 D& a: B/ ?4 P6 b& g4 `& \. A
printk("temp=%x\n",temp);
8 Y7 ?% a- u& y+ k //SRGR Register
7 O1 R! n; l9 d: F //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: f0 s. U, J9 i2 T+ W
//temp = 0x301F000B;
2 R' N- e) d+ p; {. f writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
+ T: Z* `5 H7 e' H temp = readl(IO_ADDRESS(SRGR_ADDR));
* _( G8 \) H& h+ _ printk("temp=%x\n",temp);! A o' K1 }1 M/ l% |
//RCR
4 j6 ?. n1 M0 l4 x% r* R) T //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 d% D2 v/ M; F% z* h V/ I //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 {2 h: _0 k" o8 b' c
temp = 0x00440040;' H: F& a8 f5 P. P6 R
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized |6 G) E1 J5 l* y
temp = readl(IO_ADDRESS(RCR_ADDR));# m' K. {. o% b- A6 Q* I& ^8 G
printk("temp=%x\n",temp);
1 U' n4 _8 [* {: x( A //XCR
_ ^! n% H& O2 X6 ]1 B' |; W //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* I( g, k) x2 ~/ D1 v; T //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, ~8 C. I! y. C3 n8 r
temp = 0x00440040;6 J; V O5 ]% F+ W: N
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ! z; e( U% [' k w( f
temp = readl(IO_ADDRESS(XCR_ADDR));
# s7 J, P4 ^' U$ J: K( z- s: b printk("temp=%x\n",temp);
3 G; v& L3 U- H8 w7 G# j udelay(100);$ q" V$ p- q( t; N
//SPCR Register; e D2 } s y$ s* P% A/ b
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1. J' I% s- O$ M6 z* N
temp = 0x03C10001; //DLB = 0 VS DLB = 1
! l+ q" g" A. z! f writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
) [+ W" a" F! l/ L* M temp = readl(IO_ADDRESS(SPCR_ADDR));
. t' y. L8 _+ e" e) C printk("temp=%x\n",temp);
7 q$ P* Z \& f3 C( z: _5 `! \ udelay(100);# d+ e6 U; V) J
) e! L0 k5 Q" K2 J5 R* n //set GPIO direction; c+ k* `5 y5 j4 i
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ ^, O# ^1 @8 N6 Z" h+ J/ ^ temp = temp | 0x00000100;//EPR----input
4 S) f1 ]0 B" t. d temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
K7 X k5 p! U t" R5 W __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 [$ f: R/ X/ \
, K& |6 v! B8 ?2 d5 j
return 0;
- b5 K( c2 X' J5 ^3 y}7 l4 G% Z1 T1 B& k+ @ l5 L3 J
static void __exit MCBSP_exit(void)/ L2 I5 v) S% E. m4 d% \+ W
{; @( T# }' v8 }4 e. E
printk("mcbsp chrdev exit!\n");7 ?1 ?4 \) b+ G/ _: p! q( z
cdev_del(mcbsp_cdev);: v7 b6 C% Y4 ]: C
unregister_chrdev_region(mcbsp_dev,count);
& ?& U6 A- ?* F4 a+ V+ x" D device_destroy(mcbsp_class,mcbsp_dev);
: r5 @* ?, _! ~& @. ~0 z3 z/ y- C class_destroy(mcbsp_class);
! b& D+ M% x8 |3 m: s5 F. R5 p}
# ~" o$ q9 P. Mmodule_init(MCBSP_init);4 D }% \8 X. r
module_exit(MCBSP_exit);
1 _/ o! d0 p6 W" R3 o
* N% [& @3 N% e( c* k8 z+ JMODULE_LICENSE("GPL");
, C7 K! D9 b4 E6 G# P# L" u7 z4 \
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
% e1 V% W( `8 }4 ?( U T' n我的应用层的测试程序如下2 i1 g3 E# c$ F0 {( P3 k
#include <stdio.h>2 j, G# c0 `" h/ S6 M
#include <string.h>
( f' s. f' c% v#include <fcntl.h>
1 g( M% {1 B: F2 B5 r$ m I#include <unistd.h>/ Q- L5 D' C! n2 c1 n
#include <signal.h>
. ?) x% s, Y! A% c+ U, D#include <pthread.h> //线程$ c1 O8 d ~7 m
#include <stdlib.h>! J! p* I) V C8 }3 V' E- c5 S
#include <pcap.h> //捕获网口数据
4 Y& S, e) F6 t: M#include <semaphore.h> //信号6 S7 M- w+ Q. H% v
#include <sys/types.h> //消息对列7 L" P, x# e9 C; @6 |+ B
#include <sys/ipc.h> //消息队列
- K( e0 ]) K( D5 n1 V& Z; O#include <sys/msg.h> //消息队列
) l1 |1 a& ?; N% l4 { N* ]+ d: A#include <sys/select.h>9 [4 C3 m( p$ ^$ H+ M
#include <sys/syscall.h>$ |: @) L8 X' R# a
#include <sys/stat.h>
4 l+ E) J, _, D: Q8 a! s( U#include <sys/mman.h>
/ I V( M5 g! Y4 z1 J#define msleep(x) usleep(1000*x)3 l; N. B/ g7 N4 T+ y/ B. |2 w
$ @4 b9 E5 W. e2 w* R5 w: p
int main()1 ?% l$ h5 w0 l
{
7 m0 v( q7 R2 g! U, j7 |7 }: k //MCBSP,ARM与AMBE2000交互设备
0 c+ V7 Z# G+ C! o. U0 ~ int fd;( P& h3 |+ r/ x) l6 A5 E
unsigned short data_write = 0x5555;, O8 c! L0 [! s/ P C! d; q" K
unsigned short data_read = 0x00;
* H# N! @5 X" R9 ~2 t; _* G fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 u/ v6 p9 {3 X( h% u* _ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 X, O l4 P g6 q$ |! W
1 t# W7 e5 K" e% a4 l* @
if(fd < 0)$ V% Z% p m3 T$ V' C# ^
{
6 \% J I8 r" g$ ]7 I$ d" ` perror("open failed\n");
6 u- N3 N ~; e4 p& J return -1;
' S R' }. ~3 p' l- Y! p7 y }& Y& x+ I; w. Q1 c6 v
% P0 Z8 Z0 Y3 |2 U# T. J. T while(1)% {: ], \5 U+ T. T! M! t" G3 d
{' ?- d3 q% b, v* y+ ?5 h1 f! K
2 `0 E) _0 Q0 h8 n; r( }4 O% R
//AMBE2000每次读写是24个字为一帧2 i+ m* w1 a" G; N7 J+ E. n
//写数据时将数据在底层存储起来,等到中断的时候再发送
. H$ I: `4 ?( X$ k# ]& o //AMBE2000输入数据是以0x13EC开头的2 s5 p5 Y2 I( U' M
write(fd,&data_write,sizeof(unsigned short));
; e! \( n! p3 ~( n! G* ~5 [% R
) _! c/ ?# ~( p N7 @7 |1 D //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
D6 c! L( h/ s read(fd,&data_read,sizeof(unsigned short));
: G1 Q# s8 J, C5 E! F , Z1 ?) R, \! U; D, ~4 |& K' B
if(data_read == 0x13Ec)2 d$ c$ r1 x, o5 ?+ @- z/ e. \
{* P: i+ M/ T& s$ O' j0 T
/ b* D# W4 d g1 v
printf("data_read = %x\n",data_read);* M, V9 p' S/ l* F$ n
}6 e: G1 ~! i a/ N2 s& F7 C
* D$ d4 q6 G' P1 ^/ c! T
msleep(10);6 D3 T, i) X( t& D
" T, l" Q, ~+ }' N; t /*( D; q4 R; @3 V
ioctl(fd,1); . `, p) Y; F9 |# Z6 `9 e1 G
sleep(1);
+ f: p7 m0 S E" F R$ b2 c ioctl(fd,0);9 R) B: M3 A- w: N& c* K3 o
sleep(1);* f9 m( Y* M3 \: |$ q) ?) s
*/ 4 s: {, u2 J5 G
} $ L: y# ^/ V% o8 x, J
return 0;
5 q R$ l0 H/ [' u y# A9 a& J
7 L3 w* d6 ]6 r6 i: y}
. f" U+ H7 o2 p5 C+ q7 `* x; G
% b' H2 q% U6 A多谢各位指教,谢谢! 急9 v3 Y8 @) q3 @& z1 f
, Y+ H6 B% ~4 S8 N) B s$ Y
' R/ V# C' j+ v5 t$ D6 M1 L# y$ R @# F7 Q/ h1 V6 }8 a- J2 k
" K" b0 {4 g& d+ I# W8 Z! V
- e. r6 y4 _3 d& a; `$ N. q |
|