|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 r! S$ ^7 a9 {2 [
/*6 u E$ v3 ?+ J2 X
* Copyright (C) 2009 Texas Instruments Inc
: c/ ^1 j" j8 Z2 X$ w' M4 a! Y5 D * n! Y+ M* m. ^" V
* This program is free software; you can redistribute it and/or modify
6 E) }# P% j6 X8 X8 E# w * it under the terms of the GNU General Public License as published by9 A. v" Z* E0 N/ z8 V9 T
* the Free Software Foundation; either version 2 of the License, or
1 h" o3 I; Z( R. K * (at your option)any later version.* ]7 g5 ]; f* `/ i8 c* o
*+ e. M/ k0 ~3 a7 _3 v! P3 ?
* This program is distributed in the hope that it will be useful,
5 ?$ C- F; b4 }- C1 J * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 W4 o4 [- Y' w* y8 A6 C * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 w& E- L% b# y- k
* GNU General Public License for more details.9 H0 v6 w/ D! R, n
*
6 D; L: d. C+ q5 z% ^4 Q' h * You should have received a copy of the GNU General Public License! L5 h9 m0 z; Z' P; v, P
* along with this program; if not, write to the Free Software/ A, I* Z- }8 d
* Foundati- e) i% g2 [ C( \
*/
6 G+ F, M( O2 C; S0 j, _+ `# \/ K' Y#include <linux/module.h>
; d0 d0 t3 ?" ^, V4 J7 u4 k#include <linux/init.h>
. H0 k1 g, S7 W3 t# ~#include <linux/errno.h>
% |# G% v! w9 p7 L# z#include <linux/types.h>2 N9 c* H) l& A% K
#include <linux/interrupt.h>
5 ~. j( W p- d( J2 e#include <linux/io.h>
1 ~5 E" m+ s D& U9 o9 Q h#include <linux/sysctl.h>: t- {. y9 n- I0 P4 ~- \
#include <linux/mm.h>
/ Z' z9 M% x) z ~+ n' b#include <linux/delay.h>
8 b7 q' P1 n9 X/ Y8 r5 `+ S#include<linux/kernel.h>2 M! k8 k& o# w% I9 X# @4 F
#include<linux/fs.h>2 x+ v b k# ~/ b! o
#include<linux/ioctl.h>
6 d, h& s/ |8 J2 H' @#include<linux/cdev.h>
8 r x- M" ]3 R$ z- h& a#include<linux/kdev_t.h>, U; b# P7 r# V7 y2 T
#include<linux/gpio.h>2 |7 N4 n% P0 q& i3 v/ `9 B6 Y5 x
#include <mach/hardware.h>
. x% o, L: c$ V: z+ @, \#include <mach/irqs.h>1 ~5 X3 L2 P. G) J3 p$ ^
' N+ G' d/ v' [ g" P
#include <asm/mach-types.h>
8 |5 w$ }8 p6 r d, J#include <asm/mach/arch.h>5 p8 D1 Y9 @* I2 K
#include <mach/da8xx.h>) _1 R9 f0 g5 }$ q$ ?
#define SYSCFG_BASE 0x01c14000! a, @/ z l# ^% E" k u
#define PINMUX1_OFFSET 0x124
! c# V$ Z- x: I$ T) m! K" e! v! a#define PINMUX18_OFFSET 0x168
: D# [2 r% Y4 m- u# D, _! |1 `+ u#define PINMUX19_OFFSET 0x16c
. K2 R" q- r, V0 L a# m#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
0 d5 [* X0 Q4 f& T+ {#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
+ Z8 K6 \/ }% U6 `) Y p#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
6 D! \* ^' ~/ ?% e" i& e#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR4 u. f3 Q) J5 @
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
; H5 ]3 D' g1 r t 6 N) e: y `2 V6 P" J. f) Z ~
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR. N1 b& J# U$ L" {
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR; e/ v/ M- @/ f8 {/ l. ^4 p
//PSC
% q. M" w; }7 ]#define PTCMD_ADDR 0x01E27120
& ~; g* \8 y% Y) r. B6 u#define MDCTL15_ADDR 0x01E27A3C5 F& `9 H7 ^% Z2 ~ K# G
#define PDCTL1_ADDR 0x01E27304
9 d) v) ^/ n: o( c, ]0 A//GPIO8 direction8 r2 s5 C, V; J( v3 H
#define GPIO8_DIRECT 0x01E260B0
& z) @% P& a, E6 K0 Z#define GPIO8_OUT 0x01E260B4+ [! o9 C& t) T' T
#define GPIO8_IN 0x01E260C01 a2 o+ w6 i& w7 D& i
( C, q* s4 ? {8 [ i//#define MCBSP1_RINT 99
. Q$ W5 r- t/ z9 u+ L//#define MCBSP1_XINT 100 - S5 W/ H5 v, o' u' W8 \
static int MCBSP_MAJOR=239;( H9 H5 z: X7 P. c
static int MCBSP_MINOR=0;
( v& [( M: e$ R! Z& w J3 Istatic int count =1;
8 v; H: S3 b F( i9 l. p# V3 W5 r. z% q% r
#define MCBSP_NAME "MCBSP-device"
/ {+ ^ J. Z$ F* }' j: }6 I, t7 X& e- l; y
static struct cdev *mcbsp_cdev;
6 k: D5 _; R" ~/ O9 cstatic struct class *mcbsp_class;; g2 T% d- s+ i% O8 Z
static dev_t mcbsp_dev;( |8 w9 J$ I9 L( [
unsigned int DRR_data;4 ~) o6 @1 Q3 B4 D8 D+ |) H
unsigned int DXR_data;
- \# J$ o/ T6 [: \1 f4 Hstatic int mcbsp_open(struct inode *inode,struct file *file)
4 o6 J) U5 d' T9 \{
( |" r6 [! p- [/ e / M5 ?3 O5 k" Z) i+ |
//interrupt enable,initialized
' g {) }! v, C6 r F z$ D9 y7 e unsigned int temp;
) s' f7 \% I3 Y7 ] //SLEEP_EN(GPIO8[10])---06 M* H* Y/ N2 N; G& F$ J; H% H
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; g/ ^3 u# i" n+ W5 j temp=temp&(~0x00000400);& d( S+ C3 ] Y0 d4 a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' Q. {1 w, l p/ [6 F7 l0 Z
//RESETn(GPIO8[8])----0----1
' ?' W3 M+ q# b temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 D3 c5 n4 c( A1 O7 S, V
temp=temp&(~0x00000100);% J% D" J: x. Z4 K
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' U4 p/ U( o+ n6 ]5 e7 ^% o( S
udelay(100);
, y8 o6 n; J% k4 y6 J% N temp=temp| 0x00000100;; G( G0 c+ |3 a/ N" y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 a& X! M0 M/ e7 M udelay(100);9 g% o# ]3 D9 R: b: i
printk("open success!\n");
6 c, I: w( r' {, p8 `6 }) }2 F8 h. U return 0;
1 v3 @* M) P; L0 w}
7 @! g3 x' o/ k6 h0 O
; V$ z" |) V! R4 Astatic int mcbsp_release(struct inode *inode,struct file *file)
; K/ a0 P2 R, _% m' g B{- ~. _: j) h$ x3 |2 ^5 f/ x: G
printk("release success!\n");
% W5 ^* H* V, d! {$ N# l h( N return 0;, `& v, R; l7 z2 O5 m& V2 T) a
}
( V i, H: {; ?' |
+ |; E5 A: D1 q1 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) b- [' n) Q: l% u) j
{4 {. `. C" O* `/ P. O( W
copy_from_user(&DXR_data,buf,len);
# y. e3 }3 B) X0 e" c% c$ X4 _, Z' d iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
3 T& b( B% o, s8 P2 ? K) t0 S return 0;! e1 Y" }: i/ H
3 S# e: B8 b$ H4 Q7 w& L' k$ w}
- j8 o/ X5 Q3 h+ J q& i* B/ v
9 B3 ?2 Z! Z, F3 Lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ \" w B# I/ n1 f4 [$ h& s/ x
{ 8 h$ \& u0 \7 G7 A
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; `7 @9 X7 l; g ~ copy_to_user(buf,&DRR_data,len);
|4 j9 G$ L" } P& w. e return 0;
E4 q8 i: l& Y' E0 _' q1 |}1 S. |& Y$ D$ b6 Q* l
* r' T! M( V9 [' _1 o
, F' W# t# O P9 }
static struct file_operations mcbsp_fops=
4 b! v+ o) l* D; P3 b3 G9 R4 ^- t{
8 B# c" K+ v# @+ X) j- j .owner=THIS_MODULE, X' C& L7 X T$ ` p# F
.open=mcbsp_open,
( j, R' P7 Z1 b* x/ B2 E- q7 t .release=mcbsp_release,
7 K9 A7 m2 A$ t7 S7 W .write=mcbsp_write,
* H1 r9 n( b8 t5 c' u8 L* V .read=mcbsp_read,5 I9 u, K: f5 x7 O( }: z
};) C3 v: C- u, O6 J5 Q& p
static int __init MCBSP_init(void)
" R" X. ?! H6 {" d+ B' I{9 W5 v( B) [6 m* F% Y3 Y. z
int ret;4 Q, V8 n/ ?3 G1 T W* z
unsigned int PINMUX1_REG_old;
8 C; m2 q5 b3 C: K$ L7 x/ l unsigned int PINMUX18_REG_old;5 {* n" T. P3 M' }6 Y s: J/ j+ U
unsigned int PINMUX19_REG_old;% ~8 S- {. ]7 F& n* Q7 F8 Q }# p
unsigned int temp; . }0 O* X% Q( R9 R
if(MCBSP_MAJOR)
' f: x( c/ f3 O9 d) W. D {
) t3 G" k6 p( M4 J) j$ y mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ W, U. H4 C f7 L
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, [- w6 @8 c. G
}
+ D5 }7 a" x1 @2 l: ?# ~. C else
3 g: q6 Z1 z; D7 q g9 ^ {
, V2 x( u f1 V7 ]3 L) {9 m ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
`; m0 P" g. [ MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 D3 J' R3 s- ]" Q( M }
- D1 x X8 A5 ~3 v( g0 M2 _% |
1 E) {# m' G9 r& n' W) U5 z if(ret<0). u0 \! z) F* H) c, k; ?
{
) m M# e% D6 i" f: V; W printk(KERN_ERR "register chrdev fail!");) M0 n2 g8 Z, u, C
return -1;1 H$ O8 \% w' w1 H
}, e; Q! ]+ G/ k0 h6 c
3 x6 X+ u2 ^* n8 g0 l$ b1 P I/ [
mcbsp_cdev=cdev_alloc();
* E, {5 B2 C" j - s0 V5 L4 v1 L. @6 r% M1 j7 s
if(mcbsp_cdev!=NULL)+ d6 [" V) ]5 V# r1 ?
{# k- T' N3 x# \" K( R
cdev_init(mcbsp_cdev,&mcbsp_fops);* n7 [2 x4 X: C" T5 h" `
mcbsp_cdev->ops=&mcbsp_fops;: c7 ^$ u& H/ S
mcbsp_cdev->owner=THIS_MODULE;
2 O! O5 f+ A& P+ g; V1 a" C
* N$ |/ L' y3 `! h7 }. _& J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! y6 o" ~: v& p1 o# x" [+ c
printk(KERN_ERR "register cdev fail!");
. N* k) K6 q; B9 Q& F5 U else) [& N$ `' l& I- j( W! X) t* R
printk(KERN_ERR "register success!\n");
% O" {% a) @- m* p }! r- i. F4 f, |$ Z/ l' f! ~& p7 S
else
2 G9 ]0 n% _8 l S {5 g. n4 c" k9 I; ~6 ~, ^7 c) u
printk(KERN_ERR "register cdev err!");
. ?" l1 G* w8 F7 g return -1;
7 P, W! J5 m1 u7 f$ a7 R }
, H/ j2 w. ^' W b. G
& |8 \) N/ ]0 w mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! @% M; J/ K2 g$ S% ^ M& C6 e0 Q
if(IS_ERR(mcbsp_class))
& T4 S% A( `; @ {
9 h" Z/ n0 u0 T0 H/ ~ printk(KERN_ERR "register class err!");
1 q' j0 u; S9 H return -1;7 q. O4 A+ f4 Q8 B5 ^, y/ k, L
}
$ ~8 D: Y$ P3 I/ m8 [4 D2 W5 {. Z device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 m3 D$ t8 E0 d
! O7 O; |) B5 F. h7 D: A" u //PSC) s# k! w3 C( R4 G( u
//add Enable MCBSP, W1 S/ d/ x8 b3 o0 F8 y7 P; \* B& `" m* }
//test
( D9 b9 h' v8 b* M' D" |3 z temp = 0x80000003;
/ E( g' c: C# P: N writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( _. k( Q9 V# g temp = 0x00000003;
5 v) v. X* w$ s& q6 f/ o3 O writel(temp, IO_ADDRESS(PTCMD_ADDR));* f9 Z4 S: B6 `4 L: i- h
2 g6 z, `1 e3 _" k, A
temp = 0x001FF201;4 F( u7 F- V. d7 L
writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ `+ z6 W4 X- |: X6 f
1 G+ L2 b N k2 A //PINMUX
, n1 T9 u+ I0 p& \! }) r //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* d8 g5 h$ g" z1 x/ T0 q" m3 h: S PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* S( E& f7 D0 L: K- T0 u PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) X6 E2 p/ p$ e) g$ A
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! y/ y0 ^( S a1 M8 U2 d; t' e h4 }" H. e' ^, g
//SLEEP_EN,EPR,L138_SHK1,L138_RC
& P! q8 P9 F, Z6 R6 o" X PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . x5 O0 z @4 C5 h
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
8 f" B& J' }4 y5 u* _$ a. R: { writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; S9 O0 j- m$ ~1 ^
3 S4 v$ |) D% C1 @- L' J9 E //RESETn,L138_SHK2
8 K! X$ q4 j. }) U, T/ s( ? PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( d( g1 u% w$ ~# U* u PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 J2 ]7 _, l. g. O writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
R' E( M5 h' ? {+ i
7 A; \3 k: U- b8 w: e- o: w' t
& M& v6 E$ L, s" S ^+ n //SPCR Register
% j+ S$ H& G, j `3 m //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) n: ^! k% n8 B7 n. ]; J. O5 R; k# H
temp = 0x03000000;//(DLB=0)" C! z. h( D. Z/ Z! w/ q
// temp = 0x03008000;//(DLB=1)
+ N( U& |; x8 P h, i$ y% }* z: k: } writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset3 a" X$ o1 o4 F% O
temp = readl(IO_ADDRESS(SPCR_ADDR));+ c" b1 l$ }5 f+ ]& X# m9 x; K
printk("temp=%x\n",temp);; a- K% t5 g( ^' S1 L* v
$ f+ R3 J1 {% @6 B8 V //PCR Register0 N& U3 @% k0 Y4 g% h6 i; j. B$ ]
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 P5 k/ T V3 I: X4 e; L- l! s1 Q // temp = 0x00000F0F;
+ O8 B% |, ]" I" |6 ^: } temp = 0x00000B0F;
' B, \ \* V7 s) x/ ?2 i* V writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
0 A, q+ `/ ?+ N0 P$ I! s temp = readl(IO_ADDRESS(PCR_ADDR));
7 j; S/ a `# `$ H printk("temp=%x\n",temp);
% r) K4 b- z7 h( b //SRGR Register7 A0 n# v b9 r4 I
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 L$ U* X) m$ ~0 x
//temp = 0x301F000B;! J/ d' V6 F r, B# P
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 I% U2 S/ s* L7 ^7 E temp = readl(IO_ADDRESS(SRGR_ADDR));1 L0 ~1 u1 C: u# C* u* G/ m' m& D+ e
printk("temp=%x\n",temp);+ o+ R2 K1 A6 w* l) V9 y$ T
//RCR
' u4 C3 a: j- G& R' N* @1 x //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 R" _2 }6 f% I" p
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, q+ H9 M3 O7 y. f temp = 0x00440040;9 N/ U: r6 B# A2 Y8 u) X
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
7 T T/ r/ H: I# L. E6 X) |6 G$ ` temp = readl(IO_ADDRESS(RCR_ADDR));2 ] y3 ^1 n8 `! D1 m: D# R
printk("temp=%x\n",temp);2 S+ ?5 X! Q+ v
//XCR
' D8 H, `& ~! ^, J' c( O K6 z) d0 t //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; b1 J2 {9 n( R* v
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; l+ ^) q) n% z
temp = 0x00440040;( U' I7 F5 K$ b# R1 d
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
3 l1 _; a8 @) K temp = readl(IO_ADDRESS(XCR_ADDR));
' _- L+ g, R1 E' N; j+ A printk("temp=%x\n",temp);+ F6 w& r. v0 [, ~ F
udelay(100);
1 _' Y' b/ r6 ? //SPCR Register
1 c* Q) A( E- N3 c+ t3 ` //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% T+ D% ~, A* i: x, [( x temp = 0x03C10001; //DLB = 0 VS DLB = 1
0 u- x" ?/ v( g- P$ I0 j writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled% O1 k2 ?; o/ p, E9 Q [+ K: P
temp = readl(IO_ADDRESS(SPCR_ADDR));
/ c5 C C" }8 O7 ?$ g: P) @' x printk("temp=%x\n",temp);8 O6 K# d( V! q+ I) O- s4 q
udelay(100);
7 M: u, E/ p+ ^# M" F$ L4 R2 R
0 n) [* q. G. n6 I X% v //set GPIO direction
7 |: `' I4 E1 h* X. m: \8 ] temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 A; J S) z5 W' P7 k
temp = temp | 0x00000100;//EPR----input! t( P/ \# N8 P) T d9 X
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& n: _8 } C. Z, {# k __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * q' i- Y' c/ B/ ^* o
; V& v4 f: z4 k: A return 0;( J6 y3 S8 A) h# A7 @: |0 Q- L
}
+ b7 B2 n3 V+ V4 M. \static void __exit MCBSP_exit(void)
* F# n& {4 G p9 g8 N{
2 y; q& I7 {% ?6 }3 T printk("mcbsp chrdev exit!\n");
3 ~( |( Y$ O# [- p! L0 b3 `2 J" F cdev_del(mcbsp_cdev);) V c9 v6 e; Q: U1 |
unregister_chrdev_region(mcbsp_dev,count);# z F, Q- {. [6 y) d9 k5 S! ]4 ^
device_destroy(mcbsp_class,mcbsp_dev);
% u" g2 s* K3 b" I5 v class_destroy(mcbsp_class);/ o1 z2 t2 E9 X* `! z
}
* H6 p; b9 @- b" u P* P% vmodule_init(MCBSP_init);3 R% Y/ i) K5 X( T2 c( x/ F+ q
module_exit(MCBSP_exit);* h* {; B# H/ y, u6 a
9 Y* I) ^. o2 {2 s6 K$ U; aMODULE_LICENSE("GPL");
+ y) m4 ]& s$ U5 V4 |* ^7 }* z7 I- k7 X# P0 V8 v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. y, ~% S. _2 ~. Y
我的应用层的测试程序如下
! n, x# J9 ?/ y# h#include <stdio.h>! ~1 o; U6 i! r/ n
#include <string.h>
: S5 s$ V" \9 g, ?4 y. u4 S#include <fcntl.h>
, P, A( Y) {9 U; i. Z, S! K$ U N#include <unistd.h>
; V# w) {9 @4 d6 T#include <signal.h>
3 g! K: d# |4 h3 o" Y& P% F; M#include <pthread.h> //线程
( c8 B( O/ F( T" J#include <stdlib.h>8 d$ r! @# ^. |5 I, ?
#include <pcap.h> //捕获网口数据7 q: w6 e( \7 F0 i
#include <semaphore.h> //信号
: {0 `# d" E8 |" T#include <sys/types.h> //消息对列4 K2 U; a% E, g; `$ L) Z
#include <sys/ipc.h> //消息队列( S& D1 H4 ^8 K/ |2 q: R
#include <sys/msg.h> //消息队列/ a* K4 T2 \4 }
#include <sys/select.h>% B) ^) h' f- w6 Y
#include <sys/syscall.h>
" B: l8 R+ L& d) c. f7 Y#include <sys/stat.h>
- {% z2 k: c2 K5 v#include <sys/mman.h>
/ C7 `# C( X2 H! r#define msleep(x) usleep(1000*x)
1 Y2 Y* g! w/ J) ], T
. I' N) H3 L" ?; yint main()4 y3 O5 |' S5 F W( r3 U2 C
{
' ?, ]# t- Q# R+ @4 o0 O3 o& ]7 B //MCBSP,ARM与AMBE2000交互设备# I- V1 V* i3 C0 Z# t
int fd;! o% M; T5 ]2 }$ G! D7 w
unsigned short data_write = 0x5555;
: A [' E, j6 m. ~; g G$ J unsigned short data_read = 0x00;
, |. ~, m" e& M" m, s6 y9 n1 o( ? fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& ` U$ [3 j6 |! O
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, Y3 D6 y1 B" `) F
8 {/ x, y5 _/ s, D' `/ x, y2 I3 S if(fd < 0)
4 A# o/ S: y$ C {
' ^. L2 A; [6 Y3 M7 K perror("open failed\n");+ i; m& b% D9 k+ `5 C* ]# q6 L
return -1;. ]7 e% v6 a% j8 _# ^6 Y3 X
}
/ ]% |9 r" p! N$ w
) |- I* q; M/ D! @ while(1)7 q9 V5 y( x* @& Q
{
7 Y! D2 X! I8 |, [: l2 _1 v' ^
. H8 L6 y+ ]1 g8 o0 p //AMBE2000每次读写是24个字为一帧
! G, F, Z' h* [# `# X- u //写数据时将数据在底层存储起来,等到中断的时候再发送
- A7 h0 Z7 ~6 L/ U5 U //AMBE2000输入数据是以0x13EC开头的
. }6 Q, I5 B( t4 ~/ m. u write(fd,&data_write,sizeof(unsigned short));4 j3 P6 B# ^9 N0 ~- w; W0 g3 d
7 ^8 ~# Z. o9 }; Y! S% z* q
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 \% ^) {( Q" j, C4 U
read(fd,&data_read,sizeof(unsigned short));0 Q( @) n8 a; O. f
2 y2 @+ t6 V' _4 I/ e if(data_read == 0x13Ec)
% d! P, b' F$ L% Y) F {
! b% @6 B, P0 n* @" _
. G9 q W+ N' D6 e printf("data_read = %x\n",data_read);8 ^4 ^% F6 _3 u
}5 {4 \# t8 b8 R6 J q8 \
* Z. v6 F( g6 T; j
msleep(10);
4 s) T. l; ~1 R& ?! ~# q: s 1 f2 N$ G4 j, q$ L! c3 A! h: T
/*
( P. B# @4 W- W" n( Y- N/ B ioctl(fd,1); 5 f& l% w! `4 ?! \2 H% V4 X) z* X
sleep(1);2 Z! I) @* E1 b
ioctl(fd,0);
! _/ {; Z2 s) o. q" R sleep(1);! y7 E2 Q- l6 e& _& y2 D
*/ 7 ?2 D# K7 ]4 }3 y7 X( _
}
% g' q# g4 L- z8 F return 0;
6 P- w) o3 b. P) Q" G# d) M
* a- R4 U& |7 S' F, I0 K4 Q}: N( X3 O7 F7 }( c% S! b! H- p
% H( v0 R/ {* O3 ^) y. d, z
多谢各位指教,谢谢! 急( G& [1 Z' B' v$ |, P8 b0 Y; r
4 \0 ^ t( T: M" y5 v2 `
9 s0 F: h4 q! n* c7 W, N
0 P) ^# k% [3 V3 v* _0 c
% ~! G7 B& z3 r: T1 y4 H
9 g" n* E; w* k6 E! h |
|