|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: # p& | Y& {" |; \' ?( }) Q
/*
5 B( {3 b* `9 d$ l0 C4 r * Copyright (C) 2009 Texas Instruments Inc" N( y3 P) R/ ]: e
*
' ~& c9 @. C- I8 c; l$ l( v * This program is free software; you can redistribute it and/or modify
0 N" P* z3 b3 y7 y1 P/ _* Y * it under the terms of the GNU General Public License as published by
# j) s- J D# S * the Free Software Foundation; either version 2 of the License, or
# h) ~5 y# M! I * (at your option)any later version.$ _# L; a2 |1 @$ Q
*. v r+ ]" C: Y0 m- L" V4 z. `" M
* This program is distributed in the hope that it will be useful," Y9 c% k+ u+ n$ n+ B& l! I; M6 K
* but WITHOUT ANY WARRANTY; without even the implied warranty of) B! q4 d3 `* a# \$ A# }
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) B( f8 q3 H, f C0 g * GNU General Public License for more details.
8 l ] o0 x* q9 J *
, [1 |2 E% Y: m5 t. h% k( f * You should have received a copy of the GNU General Public License
* W, d' x% U( U" |- A * along with this program; if not, write to the Free Software
M+ i) ]' O, p9 m * Foundati& }2 N& F6 n5 ^) a+ l6 D
*/2 F! X/ \* E$ x& P
#include <linux/module.h>% k' S; i7 H6 M+ _* C$ e
#include <linux/init.h>6 q7 i# Y. {, s" W6 r# w6 \
#include <linux/errno.h>/ v6 b8 N7 B+ [8 X" @9 I$ H* A9 f
#include <linux/types.h># q# h6 U3 w7 W- d, ?) d& G
#include <linux/interrupt.h>0 X+ d& q. s$ W) x, ^
#include <linux/io.h>
3 I9 ?) _$ m: k#include <linux/sysctl.h>0 |/ Z w; {6 }1 i+ u) B" X
#include <linux/mm.h>
8 |2 u! n1 d( S) Y% T+ ]#include <linux/delay.h>, g: d% e: T% g4 @7 R
#include<linux/kernel.h>& h% z2 H2 G9 j! l/ Q5 W* p, C
#include<linux/fs.h>4 x1 m0 A) V3 @' G8 J! O$ D
#include<linux/ioctl.h>* k0 _! p. a) d: h) ]
#include<linux/cdev.h>& \1 c% y8 @/ x9 i
#include<linux/kdev_t.h>; n2 D& ^( X) } d
#include<linux/gpio.h>/ |$ l2 I5 x1 l, j$ j5 v/ l5 ^( o8 r
#include <mach/hardware.h>
7 T& l0 @6 m# L- a#include <mach/irqs.h>
" M4 U4 f+ |9 ^5 z: e, G- i* b8 y8 j* `. { V
#include <asm/mach-types.h>" g2 b3 q0 @: X; {
#include <asm/mach/arch.h>9 V: S+ M) T* N
#include <mach/da8xx.h>/ X6 p' J1 w# t
#define SYSCFG_BASE 0x01c14000
" b6 W1 ~4 ^8 \* P, v, g# b. m6 {* A#define PINMUX1_OFFSET 0x124
. Y3 k8 |; d) p4 g8 _#define PINMUX18_OFFSET 0x168 @, r+ _& E& N& E& A" V5 h
#define PINMUX19_OFFSET 0x16c W' w' e: N8 j4 W1 U8 `; c9 Q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 @/ Q$ L/ F" y9 E
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! {3 }2 q# E1 ]: i
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& A( ^5 F/ K. i3 ~* b( O% L
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR) V4 i8 ]. S& n) W, w
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
: ]0 H Y) T, _0 k8 |' d( l' \& N " g O# i6 i0 Y' s$ Q
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR! O: u# H" G+ Q3 |. B
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( c& m0 @7 \/ M5 x. u//PSC
5 H J1 I+ s' M#define PTCMD_ADDR 0x01E27120 v" K, a$ A; P# b3 l2 K' M
#define MDCTL15_ADDR 0x01E27A3C
& j1 \. `$ R4 C# n#define PDCTL1_ADDR 0x01E27304
) A! T: q- R3 |//GPIO8 direction
U, P+ @, |$ l; W; ?#define GPIO8_DIRECT 0x01E260B0
" D: C4 g: V5 l) `3 X# Z; T8 ~#define GPIO8_OUT 0x01E260B4- f- [/ v3 F) h3 [/ c
#define GPIO8_IN 0x01E260C0
3 B" `& {' \4 o& J% w8 V2 ]
& }" u0 w5 B* e, n//#define MCBSP1_RINT 99
4 q9 R$ a$ s0 ?) T$ G//#define MCBSP1_XINT 100 . y8 z2 Q1 j- K7 N: y2 V
static int MCBSP_MAJOR=239;
h# O9 E$ Z1 F: q" [# o I Pstatic int MCBSP_MINOR=0;# ~% t$ T, m' D& Y( C" W- H" U/ `/ _
static int count =1;
: L5 I5 N" f! Y7 N7 s% F9 a* d6 l3 I
#define MCBSP_NAME "MCBSP-device"
6 s" W7 s, @9 _6 a! n7 s
) D* |4 i- u- t6 G, vstatic struct cdev *mcbsp_cdev;( m* K8 l. L" p4 g# K! n
static struct class *mcbsp_class;
% I* {' t2 f3 Zstatic dev_t mcbsp_dev;% [# M0 t3 y) v4 D, _0 J4 x0 D; E
unsigned int DRR_data;
0 h7 N: F% ^! ~# `: iunsigned int DXR_data;
& y: X6 w9 k. d. Q1 n3 E3 ustatic int mcbsp_open(struct inode *inode,struct file *file)
, {! y8 d* }4 \{
9 {% z+ N1 h8 `+ S% o: ?% l( D! [ ! v8 O+ T, b5 p5 d. s; c
//interrupt enable,initialized7 h7 k! y4 a1 M5 c) _
unsigned int temp;
$ \% h) E7 ^; k; i //SLEEP_EN(GPIO8[10])---0/ ^$ Z, P6 i8 k. o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 d i* x% w9 m8 h temp=temp&(~0x00000400);
4 u1 [- m5 A. q7 w __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]# h- {* k* _: I: X7 x
//RESETn(GPIO8[8])----0----1/ O+ w+ c9 u3 H1 s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 q4 K$ I; x! s" f1 Y" _% `! ] temp=temp&(~0x00000100);
( N; t2 S1 ?9 T. t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. C# N/ V1 x- k
udelay(100);6 i' V, f9 g) Z: {6 L
temp=temp| 0x00000100;
1 _; d8 i" c5 ]" D __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! D8 {) n0 J3 T, l, O; H7 h! A udelay(100);
1 D- y' ^9 X0 l: m printk("open success!\n");0 d( i; {" Z" M9 q: h, v
return 0;
, a( H, T3 J: h}* \* N7 O% K0 S
" X! j% m4 O: e: g: Q3 I
static int mcbsp_release(struct inode *inode,struct file *file)
/ P8 {/ K; V, {2 a. s& H{$ S5 e: |: ]2 } M. I* {* r' k
printk("release success!\n");8 a+ L( m# v0 I$ b" |) m! ~% Z. i
return 0;
S" G) g& r# Y& Z- G! a0 Q) x}
: l& C6 M" M4 }* z. }) X2 a, _' `
' Q" o9 |$ j. M1 f& ?1 estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
& Y( g0 S: j c/ m& H{- k/ b" @4 l; }# A7 X2 o: V
copy_from_user(&DXR_data,buf,len);$ u& U0 o/ o: S# j7 W
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
4 y6 U$ @) P$ M, q$ \+ W return 0;
3 q% E# j) z0 i& } * f, W* X, L* f- T9 a% s; ?
}
6 D5 P% m C3 B$ z3 S$ w& A3 E) _7 ^4 I# f8 K! R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)) a- [ U7 e% E ^. ?7 |
{
/ R, `1 @0 b+ ~0 v DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));) v' e5 X, @; `, u& o
copy_to_user(buf,&DRR_data,len); ?3 r5 m8 [- o( E3 a
return 0;
$ A# J: @) o2 w6 F3 z}
8 B- C' Z) }+ ]$ X6 L) Z
( c7 R, {# Q. O, G) {/ _$ w& ^" P; w" g& [8 t9 h
static struct file_operations mcbsp_fops=: s; \1 ^# T b1 W1 V' i2 K
{
0 m5 P/ A3 Q" ?" I/ f* x F .owner=THIS_MODULE,
, B% c3 H6 \1 V0 \# V. B .open=mcbsp_open,- u! h/ I7 V/ D; [3 N2 H
.release=mcbsp_release,
+ D' `+ j' C8 q8 W" s/ R o .write=mcbsp_write,
7 y- L0 `# V0 m& F .read=mcbsp_read,
# V; M. j8 e/ O+ c9 _};
2 s* ~* [ i8 Cstatic int __init MCBSP_init(void). W3 c8 V. e7 V$ A
{ o- t7 P( z/ k5 v- q
int ret;
7 s6 E( {4 X( E* S2 j, W: E unsigned int PINMUX1_REG_old;
9 U4 u9 u U9 f0 ^ unsigned int PINMUX18_REG_old;/ P% [& b. u7 T! l/ J% o0 b
unsigned int PINMUX19_REG_old;6 [# K( r2 x3 G3 w) i9 s4 T, f8 h
unsigned int temp;
" N: V1 Y8 p! z9 r+ G if(MCBSP_MAJOR)+ {- O9 C$ c6 |7 o1 l5 K
{2 W( }. ~( Z- I' H7 P
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
7 {3 ]; n" y& \9 {8 Y) a8 z1 D ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);; d9 W# m8 w' |& f; f. q4 a/ _
}& I: }/ g! B; r3 [$ L4 x1 X
else
$ U- P' y& h" a. N. d8 } {/ e& }8 m5 x( H, r: J5 u
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& X1 d: ^$ O' D6 n+ ^0 w MCBSP_MAJOR=MAJOR(mcbsp_dev);4 A, @- D$ p" A0 q6 a; Z. {7 z
}2 k C( u `4 `4 }
G7 F/ u$ P6 ~' F# } if(ret<0)6 n: `2 Z7 h/ ^9 M+ y0 m
{
! S# P5 l& X6 S1 w. {) w, q6 ^; F printk(KERN_ERR "register chrdev fail!");
7 }- o9 B y4 D; c. U3 y return -1;
7 i6 O! E9 Y* Z0 ^& K$ N } `; g2 o& M3 F. {, e" i! U
* r& s. U1 t* r- G! Z n mcbsp_cdev=cdev_alloc();
' ~* u3 H& W) i. U5 R+ J 7 l& m7 H: Q4 S; h7 l
if(mcbsp_cdev!=NULL)( B0 o( {5 T- _2 ]9 T
{- G0 j/ {2 W" L0 h. p4 x
cdev_init(mcbsp_cdev,&mcbsp_fops);
+ c8 L) ]5 _* l/ ` mcbsp_cdev->ops=&mcbsp_fops;
- I2 i7 `, t2 z mcbsp_cdev->owner=THIS_MODULE;- @- F0 L/ `" b/ x) e7 _& ]
: I; M7 c$ l* ^& b+ m8 x, }: K if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
9 x! S2 w$ q& D6 C printk(KERN_ERR "register cdev fail!"); T6 \+ @# A7 |; U; O% _6 @
else
% p/ b/ I' D" Q- s- P printk(KERN_ERR "register success!\n");1 b0 J8 N% j0 q3 X! v
}7 ^, C/ Z- [7 p2 E4 q
else
" ]# U4 n' P& v8 V( H {
2 D+ w+ L+ D f printk(KERN_ERR "register cdev err!");
7 ^/ X0 n! P' S: O2 t0 W return -1;
# g I2 l' y3 P( T' _3 G }
4 j: s. ?/ O! Q Y, E 1 L2 @7 @$ c# r! M3 w7 _; }
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' g1 H% j* P5 R' j. ?4 ?" s
if(IS_ERR(mcbsp_class))
9 Y3 `, ~- F1 q) N, I4 A% s {
1 U3 \1 ~2 |5 G) ^) a printk(KERN_ERR "register class err!");
0 c+ z- V$ h# v4 }- I5 G, D return -1;0 J! e6 k+ e! m, S. I5 n
}2 e. h/ t. Y. e! t6 m) x+ r: \( t
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' n0 R7 R3 A, F% e
: e% s4 E# [& C0 T+ T0 o //PSC
$ h, p8 ]; a- ^ //add Enable MCBSP" ^2 E: S! E' q' ?9 R1 \
//test# E1 a1 x2 N6 C# Z1 Z- N( m, M+ u
temp = 0x80000003;' g) F9 |2 u+ d' s6 J$ _9 ?
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
: n/ _8 J6 x4 M* V3 G% h( L temp = 0x00000003;
5 x1 h) x# y% |$ ?6 y. P5 w writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 ]/ ?( K+ H; ^5 V2 H
: G8 ~9 e( B' Y e; Y0 D temp = 0x001FF201;
) y6 o3 A, A7 _" m! d2 m writel(temp, IO_ADDRESS(PDCTL1_ADDR));
" i3 u: t2 n# [! `, u; G* @ 8 t3 C7 Y- Y' q
//PINMUX 0 U- c; u+ s7 J5 Z! q+ Y+ T9 x' p
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* J- b7 l$ t& K. X2 u, u0 P
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! j6 J$ A* ?' D$ ^1 V PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! h3 J/ D$ r- ?- C% l# ^1 S( [, | writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; t/ \" T2 F& x! W0 ?4 Y, `) D ; e' n z- s4 k
//SLEEP_EN,EPR,L138_SHK1,L138_RC
; L$ Z* K+ z% l; {. Y' \; o PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ) R: a. W8 V8 x. F7 ~$ h& o
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ( `7 X2 b4 l3 U4 \ F# I
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ ]8 }, D8 U0 R$ p
G- A+ y$ K; u5 U
//RESETn,L138_SHK2
6 u' n% f' R2 a" |- S PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); % K# P$ G1 q3 m9 A
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
( \1 R# Y) Y3 p: j writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);8 b! E$ o, k0 Y+ v) g, G. c6 K' V
1 d2 r4 c* q1 Z
0 O m' r' |7 Y3 Q) G: Q //SPCR Register4 n6 z: n5 t. d9 x3 ^
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( v' ?1 Q3 R" Z7 s) S temp = 0x03000000;//(DLB=0)
2 f4 q' M, e) w$ | // temp = 0x03008000;//(DLB=1)6 ?$ r0 g1 F; `' D: `
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
4 a- C! V! c% k8 V' {, }$ T! f temp = readl(IO_ADDRESS(SPCR_ADDR));
/ }/ w* ^) ^6 {3 f3 C printk("temp=%x\n",temp);* x: ?7 R7 t6 t: K
% l! N6 Y" @& M/ K9 I$ L+ B/ P //PCR Register: w3 u/ B" h% N
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 D% ~$ @$ n5 Z // temp = 0x00000F0F;
! {% V$ h* ^: i temp = 0x00000B0F;
% @/ Z4 y- n! ?% C6 o writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ T' K2 o9 L5 M& l$ L7 [+ p
temp = readl(IO_ADDRESS(PCR_ADDR));
; C+ ]' G. m; S9 N5 O printk("temp=%x\n",temp);
8 `( |. M/ f, V5 N$ h //SRGR Register3 [8 t6 g7 ~7 l8 O% _
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 ]2 S9 r# C) v; V
//temp = 0x301F000B;
/ I, k7 C' F) `& e writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
& r: K4 z5 n" P ` temp = readl(IO_ADDRESS(SRGR_ADDR));, k) R+ i7 A: |2 ^& o; h( v
printk("temp=%x\n",temp); L8 @" b( Q% n, h
//RCR6 g1 C) {% Z- j1 [& D2 G
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 W" ^+ ~, u4 \% G/ D) x
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' j# c a# a/ C. r8 q+ a
temp = 0x00440040;
T; s% g9 A) e0 r, ~ writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( m4 u% S3 @& F. j* F temp = readl(IO_ADDRESS(RCR_ADDR));
+ n9 }% k( \+ d printk("temp=%x\n",temp);8 k% _) c( |& B9 v
//XCR. A6 n" B! k% s0 m9 v, _
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 F$ e y* ~; Y* a } Q
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. V# U( u- N V1 l- J7 R) O
temp = 0x00440040;
|( X6 ]$ K7 n( m writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 0 ? i5 l% b9 L! t8 x( }0 P
temp = readl(IO_ADDRESS(XCR_ADDR));
4 w7 g y# }; Z" X* N printk("temp=%x\n",temp);6 g2 X7 O+ D6 T& b2 B
udelay(100);
7 Q5 j. b9 L8 x7 |8 l //SPCR Register$ ]" q& f1 n; F* n a1 Q5 a
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* k" x9 P( [+ y0 f+ X8 H; {- F u temp = 0x03C10001; //DLB = 0 VS DLB = 14 L2 X, L j! w/ z: I/ n4 a
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled' p5 P& I2 F1 @, ]* Y/ M: Z
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 i8 [2 V, b& j- v- E printk("temp=%x\n",temp);: F7 K+ f0 ?& W2 |4 A
udelay(100);1 ^3 ~* O+ `3 ] v% V' v: l/ V
' q( Q. h: L; Y' F0 f5 | //set GPIO direction
[- e5 o4 o( a$ H6 I temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); l2 L$ g2 f/ P0 D# Q# C
temp = temp | 0x00000100;//EPR----input* ~$ F+ U5 ~9 B2 ] c* E: e% e
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ q* L( D9 M4 N4 K) R9 R1 H __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # Y% Z5 H' f0 }% E+ T& w
7 G" T% E$ {' a% z" N
return 0;
& O3 F; R/ c g& w( u& ?; _" o}: X* N) ?" {* h3 M( X
static void __exit MCBSP_exit(void)
( @1 K3 Z7 C2 O2 e+ p* s% u{7 x5 Q% J' T5 [% I" A, I
printk("mcbsp chrdev exit!\n");' r+ I& j* @9 [1 w2 a2 Q
cdev_del(mcbsp_cdev);
5 M! w$ R( ]; m. I unregister_chrdev_region(mcbsp_dev,count);2 A& s& Y( N" C9 y
device_destroy(mcbsp_class,mcbsp_dev);3 U7 [$ W4 o, K8 E6 n
class_destroy(mcbsp_class);
* X; d/ X( I7 _* d1 g; ]. @8 h}: @; Y) N1 D7 t- E( m- _" P' D
module_init(MCBSP_init);
6 L0 o' n$ I9 v0 E# y4 I0 nmodule_exit(MCBSP_exit);
1 h* @4 K% h4 U4 X" T: A# M4 M5 v- \( o2 D
MODULE_LICENSE("GPL");
) w# ~$ G9 _0 @+ r- @/ a# |( i) U& W' B5 `5 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) w5 P7 x- G6 d我的应用层的测试程序如下 [1 ?" Q* L' K0 c+ j0 S8 Q% Z
#include <stdio.h>
" }9 r0 U+ T" E: [' C4 @* Z#include <string.h>! u6 N, }" z+ n, p- P. h
#include <fcntl.h>1 J" ^2 T6 }2 \9 T
#include <unistd.h>
9 {+ r, d6 W) s! C" `#include <signal.h>
( D. ^( ?& d1 \/ z* |! S4 q" i#include <pthread.h> //线程1 s$ I1 V5 |0 p) p! x5 N
#include <stdlib.h>
( p, b D* `+ w8 |#include <pcap.h> //捕获网口数据. F; _; r* X% }* r; A) V) S K
#include <semaphore.h> //信号4 i& v5 v, B. d) a
#include <sys/types.h> //消息对列
) O2 E, r* j$ |& t( u, }#include <sys/ipc.h> //消息队列1 P( c/ G H, P" u# Q5 V
#include <sys/msg.h> //消息队列7 A7 a, K! }2 C" k: }: _
#include <sys/select.h>( J0 O1 r( V$ a) z9 l0 Z
#include <sys/syscall.h>2 `4 u& m9 w$ U3 n7 o* X
#include <sys/stat.h>6 F4 N; z: G5 i% D
#include <sys/mman.h>
; _. F) |4 {, T+ M8 |#define msleep(x) usleep(1000*x)
$ N# e$ _. ~& X; D: ^9 e/ c/ G" L: Q5 H+ q2 C' k+ P
int main()/ ?- |. @1 e% g" i, _8 a
{
: v- r" w$ s& W" a: j //MCBSP,ARM与AMBE2000交互设备8 I9 k! |9 ^- e9 w2 I9 `! i
int fd;
( n! @- n7 w( l/ f unsigned short data_write = 0x5555;: d3 q# Z) P; o* y \0 m' c
unsigned short data_read = 0x00;2 I0 a5 Q1 u! w% {2 z( r
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- V. X" q. W/ E. B9 M3 N& }, D
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" _( f9 p5 e, [9 p( C8 G: R
8 ~" N4 L7 W! \5 V1 S' q
if(fd < 0)
1 Y& ^/ y7 n- J; v* ?+ z$ J {
! j% J5 b0 d1 z$ D" z. p& C4 i perror("open failed\n");
8 \" ]3 q$ E# e7 S# M return -1;
, D& p0 i4 m" y* W% [ }
& q$ u/ f, W; P/ B- _ 0 j8 b* O( F% ]" e3 w
while(1)
. u; j6 a; q) ^# x2 ~) e: R: f {
# V T: F- {( a1 A1 E2 i / I- C/ Z- _) U9 @& c6 y2 l
//AMBE2000每次读写是24个字为一帧
9 B2 G7 W9 P4 z //写数据时将数据在底层存储起来,等到中断的时候再发送
# f3 c6 z- u& j/ f! e //AMBE2000输入数据是以0x13EC开头的8 y" k$ F, I% x* e d
write(fd,&data_write,sizeof(unsigned short));* v$ Z& I( A( U
9 I$ e, g, l1 `9 [; p
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 9 T6 T/ S4 L5 u0 U2 a P
read(fd,&data_read,sizeof(unsigned short));
- s4 L( C& Q# A, w5 W ' H7 w; `& [: y
if(data_read == 0x13Ec)
/ M! _2 F4 p! |9 @' B- C1 T* V9 b {
|5 n+ `2 H9 L# U; Z ) G2 ^# R4 k# g4 q# [% u
printf("data_read = %x\n",data_read);: D5 _' x) I7 r
}" e. h' B7 g9 L+ ^6 R7 N
- O: m- J( ^3 L( V
msleep(10);9 K; f- l6 {$ U' E$ C5 [4 |% N
2 ]( p8 Q4 R' C. d2 Q* R. h /*. e* f* X. P6 ]6 t" W
ioctl(fd,1); / z) Q* e% T2 p9 H+ `
sleep(1);
* J5 n, O. R6 _" b: k' i" e ioctl(fd,0);
5 H4 D$ O: I$ [4 m3 X w# d- ? sleep(1);6 t6 [+ w1 Z" X
*/
* B. i# Y6 U- L2 g& s9 G2 I } , Z& x, ^! g6 O: _7 s
return 0;
$ R, p d5 g+ q' _
' v% w6 c Q6 D}: Q/ [5 c- F, v
" E N* k4 N, Z# N; O; a# T多谢各位指教,谢谢! 急
2 t5 J7 a2 Y+ c. M* H3 ?% u' F) ]; ]: a( H
. c. b9 m& T; t* \( p' p8 ~
, ?. p6 s: ~* m9 i/ Q( }/ b- @4 @$ t0 c- a5 f
M8 W! m a( a
|
|