|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' ?7 J7 k+ O1 s9 A
/*. X9 w5 ^/ n+ y
* Copyright (C) 2009 Texas Instruments Inc, R0 G+ N* H$ P9 H1 V
*
& b- ]% p* q, x" B8 j * This program is free software; you can redistribute it and/or modify1 M% X9 s% {, ?0 o- B2 I* x
* it under the terms of the GNU General Public License as published by; R5 x# X" g, e5 C! _/ E8 j
* the Free Software Foundation; either version 2 of the License, or+ L1 J" t. R' e$ L! |
* (at your option)any later version.5 H- `, H' u8 @+ n0 C" Q) S7 V
*
h% U' f9 ~2 G) h * This program is distributed in the hope that it will be useful,
/ r7 _2 y6 l2 ?8 _ * but WITHOUT ANY WARRANTY; without even the implied warranty of, l3 e9 v& ?4 d( n$ i1 N
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 i. H( V- S6 C4 Z- M, z+ W0 V2 {
* GNU General Public License for more details.
$ f: P$ {) u3 r- Y *
( i( h; L5 K6 e! O, V * You should have received a copy of the GNU General Public License
7 \" g4 ~8 e: o * along with this program; if not, write to the Free Software
8 k8 ]- y+ h0 K: K" |% ~ * Foundati" w5 L5 I) x; F5 G9 j
*/7 t. c) E% c: |
#include <linux/module.h>* P! b$ c# y1 f7 j' P
#include <linux/init.h>
5 H H$ d% e |% U! c5 b% p7 r#include <linux/errno.h>
9 [2 |1 i* k0 b#include <linux/types.h># Y1 D7 q4 T6 L) a W; t2 `
#include <linux/interrupt.h>/ b3 t% Y, F/ f( L8 z' a: R
#include <linux/io.h>" v5 y @1 q5 |9 C0 M7 [
#include <linux/sysctl.h>
" R' i* Q: n. @3 M# V#include <linux/mm.h>0 b( U( [/ ?- X. N% n
#include <linux/delay.h>
! K4 ~; h( ^1 g$ S#include<linux/kernel.h>
" u8 n5 A6 N q! t! x#include<linux/fs.h>
2 R) E) s6 ]% y3 r a, b# L#include<linux/ioctl.h>' z* }. t* ^3 A1 b- W4 J/ s
#include<linux/cdev.h>
; w" w: X( @, J+ C8 E. }7 n0 l#include<linux/kdev_t.h>: z( O2 I; {9 {0 Y% m5 A
#include<linux/gpio.h>
- ]$ z: Z: C) |) T#include <mach/hardware.h>: z' c2 O1 {: I* p
#include <mach/irqs.h>3 e3 [# V! K+ Z( q! {
9 k. J6 n0 @) A) ~
#include <asm/mach-types.h>
7 R x. r/ e" ]1 `" w#include <asm/mach/arch.h>6 S8 T6 D' Y5 l# h
#include <mach/da8xx.h>
7 U! o! O) Y& N7 G: T3 E L#define SYSCFG_BASE 0x01c140001 K5 T; Q9 `5 K I5 m( V' d
#define PINMUX1_OFFSET 0x124
4 t% N5 L; k4 H" m#define PINMUX18_OFFSET 0x168 # s' W1 c" D( J% }
#define PINMUX19_OFFSET 0x16c/ z0 t. G1 @* m; u
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
# `3 A! p0 o6 Y( @6 J#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
' v0 C5 `4 W+ i- k3 A' Y#define XCR_ADDR 0x01D11010 //MCBSP1_XCR7 T' U* l+ |6 m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR$ Q& {6 L' f% Z4 s' a4 q3 {
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' G: G# N1 Y$ ]% q
& X" @7 A& y5 T. ?$ u% s
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
* T5 [2 l( l$ @! ~; }; u9 i$ h5 R#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" U- e, F7 S9 ^$ e
//PSC
: i) e2 _8 ^/ z, I, f5 g& @$ W#define PTCMD_ADDR 0x01E27120 * ]) x# I6 W7 Q/ I
#define MDCTL15_ADDR 0x01E27A3C5 ~ a7 O+ X; v/ Z5 Q. {+ c
#define PDCTL1_ADDR 0x01E27304/ {; H) O7 E2 v3 ~
//GPIO8 direction2 ?# k: `3 j6 I: E; [
#define GPIO8_DIRECT 0x01E260B00 d& P4 c2 g H) J- p
#define GPIO8_OUT 0x01E260B4) I- V X' B) N6 O! G
#define GPIO8_IN 0x01E260C0
6 z5 e( d# J s3 k' P# {6 _. l; @! a7 V
//#define MCBSP1_RINT 99 ( b: `$ n2 L9 E+ J
//#define MCBSP1_XINT 100
. M: V- R( Z* A$ Nstatic int MCBSP_MAJOR=239;
3 v: M; {1 R1 [4 ~static int MCBSP_MINOR=0;+ a- w8 u3 E* |4 ~& u" T! p
static int count =1;
$ _. n3 }! j1 k% E0 m. O; D) D& g' i% R- K+ k& } m
#define MCBSP_NAME "MCBSP-device"8 O! E& L& y5 r& |
, c4 q* S. f. h' x. g+ v5 K# R5 X
static struct cdev *mcbsp_cdev;' d) g% N& ]# y6 w) _/ ^
static struct class *mcbsp_class;
9 J7 p, Y; ]1 I; @+ bstatic dev_t mcbsp_dev;6 O, }8 n8 _5 h. n3 w
unsigned int DRR_data;+ c& @1 O; o$ n) D& b" ?: u( \" z7 I
unsigned int DXR_data;7 U/ r, u+ V$ J0 Y+ H4 z
static int mcbsp_open(struct inode *inode,struct file *file)5 @* _9 w, J M+ e
{
4 {1 f! l) `$ c" P ! y1 B2 s3 F* S/ t
//interrupt enable,initialized
0 ~: e) F. g4 V9 M7 `& N& j unsigned int temp;' i7 W7 ^/ r* r$ h' c
//SLEEP_EN(GPIO8[10])---0
$ a, x4 c3 I. g/ I7 H! Q3 q& p temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# g4 C, r8 ?- d3 z& c temp=temp&(~0x00000400);
, y' Y8 W: M# }7 p) g* e __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ W+ h8 P' X4 X1 J3 i1 G+ P+ z //RESETn(GPIO8[8])----0----1
) I2 P( n" ?/ k9 I* y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. Y; E3 T+ W1 S) c4 K* r
temp=temp&(~0x00000100);
6 l2 p) c) z( u2 t- O. w- k* z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! c: U2 |: i9 Z4 Y( I) S- ~ udelay(100);
) T# @3 v6 t; O2 j temp=temp| 0x00000100;0 V! F3 p. m3 I8 v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 m. S: ?5 {- w# Q udelay(100);
1 m. U+ z2 ]3 F printk("open success!\n");( @7 c! Y9 ~5 v
return 0;3 p- O- X/ y, w y8 O% z! D
}" E5 j O7 t& f
8 J2 i; H; W, Q3 c4 X+ Q% M# R
static int mcbsp_release(struct inode *inode,struct file *file)
! d6 I( t J1 T0 I1 ~/ l{
J" p5 d$ E- ~2 z9 i8 L printk("release success!\n");5 B" R6 v9 _4 S/ a+ o
return 0;
( D [7 f2 K2 e6 P9 v' U+ [}
0 M- ^( z2 A+ \- h' g4 D1 a* L. c) s; U) N Z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 F) | w" ?/ S E{
+ m5 L% X4 e u copy_from_user(&DXR_data,buf,len);! s- n# Z9 _* N1 H
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
3 U+ ?+ c/ j5 } return 0;, T7 ]- p) g; y, @
6 t2 c6 W$ a- u- u: k
}
% c( [8 x: {, `: X: A/ a3 J) n5 {3 `) B1 \
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): w Y& g1 ?" P6 _; l$ f) O3 {
{ 7 S/ v& ]# _8 ] ^# W( X8 ]4 q
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 u$ h7 s0 J6 a copy_to_user(buf,&DRR_data,len); 9 w5 D. b1 [9 j: ]) E" D9 h
return 0;
, E& f' T: j- B% L4 M6 K}
' i+ C y$ w' ? c6 v+ B
8 S( n8 x, t* b: p7 b8 C2 ~. w5 a+ I; r
static struct file_operations mcbsp_fops=6 d5 p5 O9 A* ]' D
{
3 B- v) x9 E$ J" B: [. T9 O .owner=THIS_MODULE,. Q! a& Q9 O! d. l7 @
.open=mcbsp_open,
- k2 j# N3 q- m3 T .release=mcbsp_release,
( l3 n' v# M$ ^& ^4 X6 X$ b0 K .write=mcbsp_write,$ t8 e: ^- W/ q R# H% V
.read=mcbsp_read,
' f7 q" u0 F2 k) l! T};
& _8 L" O3 _7 V) e _static int __init MCBSP_init(void)9 c- w1 J4 Y* c0 W+ E' n4 E7 y, \
{ M- B3 h: }: D4 s/ G
int ret;
( ~, R3 y" V L1 ]; Z unsigned int PINMUX1_REG_old;
& k1 S- C* Y; N7 i' ~ unsigned int PINMUX18_REG_old;" I1 g) Z5 f" z3 F
unsigned int PINMUX19_REG_old;1 Z3 T3 Y4 O5 @( F- C' l
unsigned int temp;
" K0 a: ? R4 @$ n5 b if(MCBSP_MAJOR)9 w' R7 v) F; r& Y
{
' k# I4 z; U) ]9 H" M/ m6 A9 x mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' V$ t0 }( e; i ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( ?# x$ G0 t2 u' E5 f* f }
1 T. Y: C' I! ?1 c1 t F, r else
. ]# b8 R/ j5 W! z/ @# L6 a6 z& q {
& G+ L) |% M$ `! g/ Y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 ]+ Q; C6 J+ Y- x MCBSP_MAJOR=MAJOR(mcbsp_dev);7 g4 ^4 O! }$ ^7 x( g
}
2 u ^" J5 ^- {5 A1 i$ z
3 _$ ?* i; w8 b$ U5 D if(ret<0)& v! _! P9 e7 d& _) Z
{1 t2 {0 |) C' L2 V& |
printk(KERN_ERR "register chrdev fail!");' a0 }) q" T: L3 r* V
return -1;9 {6 C8 Q t) b) S' i! P& N
}
& n% ~! ]; e: X, U
9 ]* p* n, n" P3 \ mcbsp_cdev=cdev_alloc();
- Q3 `- O, V) T- N. W : {4 o/ K7 \6 J& s. Y
if(mcbsp_cdev!=NULL)
9 V, J5 D; P! N {
% }- G# h3 e! Q cdev_init(mcbsp_cdev,&mcbsp_fops);
' U: P7 u" W$ j mcbsp_cdev->ops=&mcbsp_fops;
K6 B" M) j0 C: o, v1 E$ Q6 m7 k mcbsp_cdev->owner=THIS_MODULE;
' A- y! Y9 U/ Z+ s& `9 \& l
7 `0 H* H% m" T! h if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ Z' S* D( E7 \" T
printk(KERN_ERR "register cdev fail!");
5 G h |8 e6 t0 B, z0 { u else1 z7 T. B& B3 r; n5 m+ {/ W N2 K
printk(KERN_ERR "register success!\n");
! ~) z9 e# ~* l* g( B; E( h2 U8 N }
+ K6 p7 u+ H* D7 z% Q else
% R- f* _* p6 w' K6 F6 D8 C6 m' Y% ^ {
F8 \* K: v2 Z printk(KERN_ERR "register cdev err!");6 ?" M: ~ r8 _) i9 s: F
return -1;
: z- R2 }7 R& X2 A; q2 C4 u, q; a }; j; ?4 A: D: c
$ H9 ~( l1 ~$ y: d& e% F. ~# r
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 d6 K. m7 `( m( _
if(IS_ERR(mcbsp_class))
' i2 }8 j k! {6 B M" _ {, Z9 s* }7 F' k3 T
printk(KERN_ERR "register class err!");
8 T1 O- a% M9 e/ E. \& a return -1;) G0 d; @$ z; ?3 \0 G$ X
} P) Q* V( J4 J) \& L; ]
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 f6 x* f$ p) k8 E6 Z# w+ G7 N9 N
2 q6 _0 ?. R" V% Y1 \4 b
//PSC# @/ @' v$ U( ] h$ C
//add Enable MCBSP9 T/ ]( q F" e% T2 V
//test
* A5 p- [ u0 q* m% h2 n& b4 I temp = 0x80000003;
3 r+ d0 t( s( J writel(temp, IO_ADDRESS(MDCTL15_ADDR));, ]0 ]; ~) o9 i7 c# A: _; o. X5 e
temp = 0x00000003;
& e* {% Q! t% L: B# f) \8 j writel(temp, IO_ADDRESS(PTCMD_ADDR));
; V, P3 q' `+ |; o 6 _" I. |- ], T
temp = 0x001FF201;
: D7 F& t/ J% T7 W; Q" K+ s8 N writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 _6 X4 q3 [: t
; X$ h# f2 G6 s6 Y/ ^- H7 @6 x //PINMUX ( |) E/ [, j0 m1 t8 q% Z
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR," I0 @/ G* K F/ t
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); p7 a3 V: l1 i: e
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; * e1 k8 f/ [3 x( z
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 p8 Q, u4 z% f. u. V; D/ R m
% T- {! m4 W( N //SLEEP_EN,EPR,L138_SHK1,L138_RC3 l7 ?3 n% u3 ~) B) ]/ e
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); & @5 M/ v* l# k( z! H o! X9 X
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
/ t7 D3 o) z! w e writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);- [) [: y5 L m7 N6 w' D$ U+ W; S
1 t9 ~( G! p/ ^* t9 J) c7 f //RESETn,L138_SHK2
4 @- H2 a. ^' R$ E PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); # v9 V3 d7 ^, y- D0 ?" B/ I
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 i! V% x4 D5 ^6 ^+ Z+ F- E writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; d7 a( i$ }0 u1 I
, t) V2 w3 K5 o4 j' V4 Z * i, d+ Q: Q+ B) n% N, S
//SPCR Register
4 S& h- ^+ y0 W8 ^6 t4 G( M3 m //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: O: D* f3 T9 K- c$ Q: g temp = 0x03000000;//(DLB=0). J' l9 e! ]. J* X6 H4 Y/ d5 ]
// temp = 0x03008000;//(DLB=1). f6 _9 G0 B5 \; Y+ I
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset) D3 _& s+ k* u1 ]; I- P
temp = readl(IO_ADDRESS(SPCR_ADDR));; W- W, x. Q3 u5 C$ y& W
printk("temp=%x\n",temp);! _5 P9 C! ^! Y6 t+ X
: w. Z9 u; ]" F; O$ \ //PCR Register+ X. B6 ] Q( o+ J+ [# k
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 ^# V" A/ h+ J$ g) [& E. c
// temp = 0x00000F0F;! j5 C6 I8 E( N, m& ?
temp = 0x00000B0F;' T8 a' Y9 {/ [0 h3 y1 a" J
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ; C% |2 n0 t* l: D3 Q
temp = readl(IO_ADDRESS(PCR_ADDR));1 X' o1 e3 [# W! S6 s! }* D
printk("temp=%x\n",temp); ( R% W# C x5 z0 I: j
//SRGR Register
J# b/ w. ^( c% O" d0 y9 P //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 |& g" ^: e3 x/ a //temp = 0x301F000B;2 f# T _3 @6 Y3 y* t
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized # C- }% |8 Y) H! f
temp = readl(IO_ADDRESS(SRGR_ADDR));0 U, |) m ^. r# s% t
printk("temp=%x\n",temp);, @! S$ R" h+ h; c
//RCR
" K8 g% x7 n, j: x //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' g0 _/ J! L i! @2 \& |7 t7 f8 {6 v
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 Y, E- a% m9 j$ {: U- i8 e5 H2 E
temp = 0x00440040;! W+ `4 H* c3 Y, h
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
- _$ M/ _4 N. w2 W# q: x0 |: y3 c temp = readl(IO_ADDRESS(RCR_ADDR));
8 Y7 u) ]" u- f; x- t3 m* ? printk("temp=%x\n",temp);& U& W- l ~$ h2 Z7 R
//XCR
o3 J8 j1 c/ c- }* g+ m- \+ S //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-19 {( ]/ H# t4 H7 k, |
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
( \& _/ F0 o/ W0 J4 s, h temp = 0x00440040;
& x+ @+ [/ a, r1 m9 T writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 B" c8 X a+ }# ?1 N) X3 l* k' \
temp = readl(IO_ADDRESS(XCR_ADDR));+ w& b8 t: G0 O
printk("temp=%x\n",temp);
4 N. o! K; [, b5 Q$ x5 L! ^- D udelay(100);# @7 v: X9 j3 F* s# S) h
//SPCR Register# C( }& d, j3 l( g
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ U) B- J0 z/ l8 f) R
temp = 0x03C10001; //DLB = 0 VS DLB = 1
% k" \5 m, N0 }( T writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
_& j1 r; U- N; H5 i1 O temp = readl(IO_ADDRESS(SPCR_ADDR));( K0 V* l2 i% ~# }
printk("temp=%x\n",temp);& C, {7 p3 T) [. F& k
udelay(100);
( ]& d# h9 p4 B6 e3 [' M+ `% l6 n4 ` d1 J& u8 {0 {
//set GPIO direction
( Y& b8 ]* B& Q* k, S; f temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- ]5 h, Y _8 Q) Y/ b: A temp = temp | 0x00000100;//EPR----input/ u) b6 A, B* K
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* y" r N: w8 D. b. g2 s" E
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) _6 Q& z: s2 S; B% a; n 5 f6 y! u3 L4 C, x. _" C+ B ~6 D
return 0;7 f# o: k7 [7 m! h% x$ s. L9 C3 `
}
( y/ O9 N! l* f7 F2 J$ zstatic void __exit MCBSP_exit(void)9 Q! } g! G! y: q a
{! l7 S3 Y3 [! x% o; _
printk("mcbsp chrdev exit!\n");$ e& S; g1 Q/ A9 {
cdev_del(mcbsp_cdev);
2 t/ g0 Z) o8 q R& |$ u9 o6 l) P4 L unregister_chrdev_region(mcbsp_dev,count);/ p6 r" G) O) w7 u' D
device_destroy(mcbsp_class,mcbsp_dev);
0 i3 d7 _# n( K9 j4 W" f. j class_destroy(mcbsp_class);
0 w& N, G* a* d& g3 G}
. X, r1 _) J8 X, [, [) A/ T- Zmodule_init(MCBSP_init); j/ A7 u. Y4 z+ k
module_exit(MCBSP_exit);
$ q& j1 S4 a" W( l T8 Z$ a4 L( j" X+ n! A3 L4 O8 F
MODULE_LICENSE("GPL");/ m1 [( c# S2 v/ O# c' I% u* F) w
9 q' r; t2 I. }8 W3 s我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( m- ?; k# J5 ]- m( f我的应用层的测试程序如下
2 S# e/ t, N) m0 _#include <stdio.h>
% m+ ?1 M- T: b ?2 ^& i9 d#include <string.h>
9 ]' e _) Z1 P3 j% g9 ^6 S+ i- G#include <fcntl.h>- |( o! [3 |8 Q* t+ u. \
#include <unistd.h>
/ b# c2 C. y( b9 d9 J; i- B' M7 ^#include <signal.h>
) b, L8 `& Q; V3 d4 B#include <pthread.h> //线程
( Z; P: Z. O) H#include <stdlib.h>. k5 E; K( k$ \6 o- ]8 a( ~
#include <pcap.h> //捕获网口数据
& L& h8 ?: C1 X0 ?: |#include <semaphore.h> //信号5 M' c9 L+ B- v t* H, R8 h! i: F- g
#include <sys/types.h> //消息对列
* _% m% D$ G4 Q#include <sys/ipc.h> //消息队列
) T" F) h7 d {4 X; x#include <sys/msg.h> //消息队列; [' {$ ~2 `2 Y1 j8 L6 I/ N
#include <sys/select.h>
2 k% {: C. r6 ~- X0 B' x#include <sys/syscall.h>
; V: g9 C- i p* Q! _#include <sys/stat.h>
@8 O2 E1 z8 m2 }* N3 Y: l#include <sys/mman.h>
# Q# B' e0 e% @6 q#define msleep(x) usleep(1000*x): k! m/ M8 N5 L# D! Y3 {+ B* J
. K: i& @8 x. l0 ^/ m! r4 Kint main()! i6 O' j' `. s1 L
{
?& X6 z, c4 f; M8 R" `) X //MCBSP,ARM与AMBE2000交互设备
* m w# q6 v/ P- l9 y: [) Z4 u# q( W$ B int fd;
7 l; G$ Y. N; i: y5 x2 A unsigned short data_write = 0x5555;; T9 w- x- @& r) w% g
unsigned short data_read = 0x00;( z/ @' i" Y/ U
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ _ Y5 _+ ]9 k
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);8 i' _" [: Q8 V# M) _/ h
# R4 Z: r: R2 B0 R w# D7 d if(fd < 0)2 _% D* r6 x0 h) O( i/ o9 K1 k
{" y; K, k9 ^. u5 @
perror("open failed\n");2 S" z- u' ^. l
return -1;
+ q. d \* P, `( D- U" C }
7 E' U3 Q* R2 ~ w6 A
5 I. G, @1 [0 r% a9 S. Y4 a while(1)6 }' O$ d4 g5 U5 y- I, e. g. \
{, j2 s* x* v0 k& e
% A& _# p# h: |- r+ K9 Y; a
//AMBE2000每次读写是24个字为一帧! n! I+ B/ t0 P
//写数据时将数据在底层存储起来,等到中断的时候再发送' d3 S6 |5 i+ J
//AMBE2000输入数据是以0x13EC开头的! [5 H# z1 J. o- S- i; V
write(fd,&data_write,sizeof(unsigned short));
; ?- f! O9 W% v* A3 S6 |
* J8 s1 @$ B& B; H$ t5 | //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
1 ?, q6 j% v' d4 S read(fd,&data_read,sizeof(unsigned short));) `# z, K3 ?* x3 u
& u- m2 a' z. A K: R if(data_read == 0x13Ec); ]* D/ ?* ]* p% i: @
{
- C* s% D& n/ g# `$ `1 r7 |: l 2 ~+ |4 V& v L( U
printf("data_read = %x\n",data_read);
u7 m: {4 h! z$ T" O4 D9 n" @ }
, Q; ?8 `# A0 K! R3 N
2 }7 f9 y. h) F9 |* S9 a msleep(10);; F! } r# U/ U2 \ J$ F2 ]
! a( t5 t# u. N1 _7 U% A8 m5 w8 T
/*! B* s, T1 {' U5 m- r
ioctl(fd,1); 2 E# V# e! @+ K7 l) A& ]1 V/ x
sleep(1);
7 {9 U. O( K/ `- r# M# \ ioctl(fd,0);7 L5 Y0 v1 ^/ u. o
sleep(1);" V' B. s9 U7 y" g: C* V8 Y
*/
* \5 {" x" I A7 h& W; o }
+ R% ]" y" E0 a: Q- b; T" q- o return 0;( }; i$ J& j: e+ [
: ~7 R8 A4 E2 S' x! j: w
}; A1 \5 m/ U& l( v' O
6 c( a6 W) p) p, e- p8 @
多谢各位指教,谢谢! 急4 @: x( l6 l" p( g
$ V! i( C; T9 L8 u+ ]
3 Q* H/ p. Q/ ?" e; F3 _4 O2 C6 G$ T/ l) x1 z `1 p
7 C7 x3 m+ e1 ~: G+ k- L9 K% z: R
# ~* G. l- L" C1 } |
|