|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 N+ m9 |5 Q+ c: {' g
/*
! O+ \# [! c) L- h% T# V * Copyright (C) 2009 Texas Instruments Inc0 q* r' K9 |9 z
*
) u* A( Q7 T8 x- x * This program is free software; you can redistribute it and/or modify
9 B5 C. o5 t3 _& `. {, }' L * it under the terms of the GNU General Public License as published by
* H- }5 ^; \/ c, Y$ O * the Free Software Foundation; either version 2 of the License, or4 R9 k4 B$ ^+ B& k1 Q
* (at your option)any later version.* h1 j* z6 G5 F1 v: F- W; u7 O9 i
*! g6 }+ H$ u' I z3 y$ ~/ i- q. V( @7 U
* This program is distributed in the hope that it will be useful,
; Z* F# Y0 d# D" T: I$ w * but WITHOUT ANY WARRANTY; without even the implied warranty of
( P$ V" Q' G- F8 ]$ Z5 Z1 k * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ l* O% }% Q, |
* GNU General Public License for more details.
" M: F- s. K% d S *
6 X3 t/ c2 N. ?$ B * You should have received a copy of the GNU General Public License3 L# O; D7 o) Z b, G R
* along with this program; if not, write to the Free Software& v& M! E2 Z; D* A
* Foundati
" O' j: j% T2 t/ L, x( p# M*/; v! l9 B3 H1 z, f2 A
#include <linux/module.h>
- N, X) z2 Y; I( B" o7 m$ v#include <linux/init.h>
& x+ `) n, F; C( [8 `6 n. f#include <linux/errno.h>
+ |8 B F" \# O3 U! p K#include <linux/types.h>! D; c1 q1 ]+ J! _6 Z/ g/ R; {
#include <linux/interrupt.h>% e1 F8 q/ C4 S$ k; A
#include <linux/io.h>
3 n3 Q( x6 i* u6 ]4 `: Q#include <linux/sysctl.h> A0 s0 C# j- ?7 S: a* K/ r; L+ n
#include <linux/mm.h>2 V4 ^$ x# t* b) Y
#include <linux/delay.h>
7 U9 F" l# G/ C( U3 n#include<linux/kernel.h>- d! c+ o0 N# g
#include<linux/fs.h>) t4 l. ^8 S9 |$ S0 f& y- c
#include<linux/ioctl.h>4 D3 Q8 x& c; I; Q* ~
#include<linux/cdev.h>$ K% }. [9 }4 `1 z4 o9 G: x+ k
#include<linux/kdev_t.h>) R/ T' f: h7 A
#include<linux/gpio.h>+ U# ~4 T) {8 a J0 o! N+ R
#include <mach/hardware.h>
+ |6 n$ r. A/ t' Y#include <mach/irqs.h>' q& w8 N. w/ y0 u' U" N9 f* f- _
# F0 I* X' F, T; B' T% B#include <asm/mach-types.h>
! Z7 W* x1 _( E' p#include <asm/mach/arch.h>
" S# D' J6 h5 U8 ]#include <mach/da8xx.h>* e" V/ N, m. J% e/ i% T+ f
#define SYSCFG_BASE 0x01c140000 {' ~- V1 d( L
#define PINMUX1_OFFSET 0x124
/ F+ k0 ]" E' J+ c. i#define PINMUX18_OFFSET 0x168
0 D9 w' [& `, F5 }; Z8 I#define PINMUX19_OFFSET 0x16c
& u& B$ x: [* h, c% Q4 g9 @#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 ] [3 r# H! ~ D: A4 t$ U
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
* n) N6 n# X4 J$ w$ j5 Z#define XCR_ADDR 0x01D11010 //MCBSP1_XCR! H( J5 Y/ \+ ~! V
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
7 Y' e p( { w: b- w4 B#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
/ h4 ]" @2 n d" u8 @2 a - U7 x0 a r7 h# b
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ g) t: e0 N) n: i) T. x#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
1 [* n% i$ R3 Z) m+ }$ `6 Y//PSC; I. ~7 f/ @) R- `( c! _9 X& g
#define PTCMD_ADDR 0x01E27120 : I* x% ]9 i/ A+ R
#define MDCTL15_ADDR 0x01E27A3C/ P# V8 Q7 {% m, L, p: r i
#define PDCTL1_ADDR 0x01E27304' x+ _, r' L6 Y
//GPIO8 direction7 ~: v1 \6 b1 b. L! e8 U/ e9 l
#define GPIO8_DIRECT 0x01E260B0% K. @/ X' Q* w
#define GPIO8_OUT 0x01E260B4
- {! _5 J; m' z0 b#define GPIO8_IN 0x01E260C0- U! i1 b q3 ^1 p' `. T
+ X# `7 j3 }: b/ N) ]% @
//#define MCBSP1_RINT 99 $ Y6 d9 Z6 c( I; h. U. G
//#define MCBSP1_XINT 100 ( b8 h. u p: e* G: K
static int MCBSP_MAJOR=239;0 X/ m+ D- _ z1 B
static int MCBSP_MINOR=0;0 Y- U6 }0 {0 y/ V$ @+ ~4 S
static int count =1;
5 S4 r; X6 V8 A8 t4 r( T0 x
4 S/ U0 M& x5 G#define MCBSP_NAME "MCBSP-device"% a0 w- Z. Z' U9 K8 {2 Z$ `
4 q" `2 k2 t5 h# F) ?static struct cdev *mcbsp_cdev;
5 L& }9 e( m- ostatic struct class *mcbsp_class;
+ ]8 @& Y' p6 g% g; P) _- g) K; n1 Fstatic dev_t mcbsp_dev; H( ^! q1 v" f& |: s0 N* ^* ]! d `
unsigned int DRR_data;3 ^5 W2 _) X- ~( v" ?8 n
unsigned int DXR_data;, C6 H- \4 v0 y& y; D1 t* e
static int mcbsp_open(struct inode *inode,struct file *file)
5 `5 i3 ~* Y$ j{
4 [8 |* W# v, d; d * Z$ b# O2 x1 Z9 }
//interrupt enable,initialized
3 E' }+ s s6 x, s, J( L unsigned int temp;, x9 d" ]2 B2 {5 R9 D
//SLEEP_EN(GPIO8[10])---0
1 @1 H/ z7 }* k" \- `- s6 z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 v0 b9 Q% _1 J c3 r- c& y/ q temp=temp&(~0x00000400);3 ]7 U8 C9 H4 C2 q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 X. J1 k7 ^, i( L6 o' U" ~
//RESETn(GPIO8[8])----0----1
0 i% r* T |" x temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 |# w; F4 R, i+ b3 g3 ?5 d
temp=temp&(~0x00000100);2 L) U$ F0 R6 n2 m, H) [
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ A8 {; u- W# f: Z" L3 P( ?, @ udelay(100);
8 K6 j$ M+ h9 E0 x7 q$ o, G temp=temp| 0x00000100;
, ~: }5 Y" e; n% }. R5 e. k __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 `7 y1 c6 q' m$ h udelay(100);
, X. A( \' ?7 _5 j9 p3 }9 a* {1 P" W printk("open success!\n");
+ I6 |1 m2 A) a& P8 x2 @$ l8 g) i' N5 P return 0;$ o5 K0 w. B( ?' y
} S, Y8 f9 ^' f! Y
' }( D( s6 W5 T" @0 i) Ustatic int mcbsp_release(struct inode *inode,struct file *file)4 p7 |: T2 n- }" ^
{$ O: A! E1 D. {5 X" r7 {
printk("release success!\n");. L, K1 ^4 N# h' h k
return 0;# m/ p) {9 a8 W/ _3 k" m4 u
}2 p: G# S& x3 S+ g3 t! T
% P9 k) E! ~5 mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 c* s3 T; t5 \ ~& z
{$ J" a8 E9 n; s b) }
copy_from_user(&DXR_data,buf,len);& `8 h8 H& I5 H1 y1 {0 K; x: w
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 Q, |0 K/ _' B4 j
return 0;1 p; H& ~0 c1 f6 f
; ^3 v( H& C6 k, V% d' Q5 J+ W8 x L* Y
}
9 j) M1 Y5 d( ~3 s# F% c" J4 x
+ h3 C7 e% W; o0 m( [& ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 J0 k( e( Z! n* s" c
{ ! i! U" I2 B# d7 M+ X
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; B, o% _3 Q, c7 X8 x9 N
copy_to_user(buf,&DRR_data,len);
) b# {% B& e$ y! Y" e return 0;
3 f6 ]9 R% F# p# [% A B}" U8 O- [) z1 A9 t; p m
9 T. S- Y D" M- Q3 |
% w+ ^$ D J! ]static struct file_operations mcbsp_fops=
" r7 G" M0 o0 L{4 @" O8 R% @8 s+ O- ?1 m0 S1 O' e
.owner=THIS_MODULE,
8 f3 D0 l. i$ @ .open=mcbsp_open,
; d% ?! q9 z. M! E) K .release=mcbsp_release,/ S7 h4 {. V5 A" B8 I$ y6 I* _
.write=mcbsp_write,* ~8 I# q' _4 T4 g
.read=mcbsp_read,4 [5 M- I3 z) G9 I. D+ g
};3 ]" D, r" M3 S- K
static int __init MCBSP_init(void)" V) v" J/ ]) ?
{6 h# \: Z! q# j
int ret;
( X0 m, ]2 f* D1 ~- P, ^8 a7 H unsigned int PINMUX1_REG_old;
$ |0 N9 q$ }, `) G0 T) A- o3 m7 b unsigned int PINMUX18_REG_old;5 L. J; L% `( G5 b! }4 w- w
unsigned int PINMUX19_REG_old;" `" j. R8 u: z% S
unsigned int temp; ( h) |/ F0 Y$ Q$ e9 g/ t! d, W
if(MCBSP_MAJOR)7 C' m4 f; L U" c0 N& d
{: O/ R8 d& e1 g2 ^3 Z0 R+ p$ O7 d
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( E- P7 O/ X/ o: A- V' N! W
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);. P, v. v/ _6 m( o2 t/ l
}
4 B- `6 S' G4 m D7 { else7 V, I2 _( p% h. c7 A
{
6 Q5 A1 j; H4 T ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 Q) r* q( S- L' z [ MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 \- c* v0 H4 @, p }
" Z% U7 f# E$ Y2 W+ `8 t$ n. d
- ^# ^. {7 H( w7 Z* M- y" A if(ret<0)3 e6 ?* f+ ~0 y6 ~( g) z8 p8 T
{: j: g5 n! s- A J1 _% G$ r' D. c
printk(KERN_ERR "register chrdev fail!");, |$ e+ `: U" v/ S9 B6 ]
return -1;
" L% k5 L! L& I r }
8 f6 [) e/ F' V& Y4 o
% A/ b( M2 D2 M$ C# l mcbsp_cdev=cdev_alloc();% [. B7 t( k! o- }
, n5 F$ u% d; e$ D4 N2 V
if(mcbsp_cdev!=NULL)3 Z1 {1 K8 S6 E3 |- Z" ] w" w
{
$ d& F g# G* Q9 F4 X6 S' [6 q8 d cdev_init(mcbsp_cdev,&mcbsp_fops);1 L/ D3 n8 h# o3 b9 K) T
mcbsp_cdev->ops=&mcbsp_fops;
, `# H3 H. \" a mcbsp_cdev->owner=THIS_MODULE;" R% T L0 u/ M/ E" v3 n- p9 M
# ]/ I# @' W. \
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
# m3 c2 x0 t. F8 } printk(KERN_ERR "register cdev fail!");$ ~8 j) \8 a2 t
else
, e5 L6 s" s1 E5 d printk(KERN_ERR "register success!\n");0 t% Z( J- @0 i, ?- y4 Y8 S: R6 E
}; P" _% @* H$ n4 K, i
else5 R% |3 k4 h N& Z8 f) ~
{
0 X" {$ W' d& F) Q/ \: X printk(KERN_ERR "register cdev err!");
4 c& U; v# L0 I) s4 \- L: A7 u# }( }& I return -1;; d/ D$ `9 r% w8 j5 X! s! p4 {
} N1 Y% {1 w- l3 ~$ [
[" F2 A) k0 b. L mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- f+ a Y2 X; \9 ?& O if(IS_ERR(mcbsp_class))3 ]/ {0 P7 r1 x/ Y4 ?' b; @ D
{
7 H* q/ P2 e" n* R5 q printk(KERN_ERR "register class err!");
s9 B$ C& {$ n/ F8 H8 V return -1;
* a6 [; N5 I/ e$ o. X$ \' T9 n }
4 b8 y1 b( }7 B device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! |) \) z( u; L( j
1 {9 a2 F) h4 o( S //PSC
5 r) j5 |8 B6 L0 K# Z# V //add Enable MCBSP* w, E6 i, g: I) [
//test
. S6 f/ k0 M" a7 j( I( ^0 f# Q8 X temp = 0x80000003;
* C( Q6 X8 ~ N( W0 H, B writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 V$ b) g/ t5 v6 k) b/ G, a9 P temp = 0x00000003;# j) l( i) ~& @/ f; I
writel(temp, IO_ADDRESS(PTCMD_ADDR));
- A* O, E1 D8 y6 O
( b* H3 g. ~# b6 @/ P temp = 0x001FF201;5 w/ G6 u+ H- z5 p+ s
writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 W" R+ |( s. L$ o( V- O3 }
) M' d& c+ w* {. \* M. O //PINMUX ( U, ^ C4 m. }7 c% E
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! f: O6 V1 E2 }7 n( k8 | PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, f& i* A/ h) @# r( z! @. B PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
5 P. F- w b K& N writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);2 ?8 w; H; f. A0 y6 k {
Z5 ~5 m8 y- l! A4 H( w: K( j
//SLEEP_EN,EPR,L138_SHK1,L138_RC
( C3 h: J2 ]7 ?) c' O) \/ z PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& N3 ]6 a9 U1 T) H5 q PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; # `, D# ^' j7 Y# \! {( i- P
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ _/ A1 ~" m. Q0 ?% p 0 J n2 q% N" @# I5 }( I, q
//RESETn,L138_SHK2: n' I6 `$ @3 Q' Z
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! k1 u* r K* s% J PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; / J: g$ P+ w. F7 P: W
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 S" D4 a3 R) S' v- j2 T9 X/ U
. o7 K$ D1 z: k" j 5 [# |$ R: d4 Z( \5 E6 k- Y
//SPCR Register
4 i) P% {, b. x4 O* _% U: J4 w //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% _5 f" L; g9 d temp = 0x03000000;//(DLB=0); J- Z z/ N/ N" s
// temp = 0x03008000;//(DLB=1)# X. ? r. x- S- n: U: F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* h# v3 D M) J) n4 f' n temp = readl(IO_ADDRESS(SPCR_ADDR));0 [0 b0 v. q9 M9 C2 T: t
printk("temp=%x\n",temp);
: y2 @) Q K" u0 A0 c
' _. t" O9 h# S$ C4 L: `5 B //PCR Register
% d% j+ b1 }) e* p //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! V( t. E( n% C# s2 L' @
// temp = 0x00000F0F;" p" S/ c/ z; J9 [( f8 _
temp = 0x00000B0F;
- D! d$ C8 n* C3 e8 Z writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
5 C( ]: E) a+ h temp = readl(IO_ADDRESS(PCR_ADDR));
$ P% T9 ]* s& ]' v% w printk("temp=%x\n",temp);
7 V% s l- F, s0 Z0 @ Z //SRGR Register
8 b! H* W* g: Q( g* q //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 x+ e g2 Z _# U, k" v
//temp = 0x301F000B;0 |) t2 [6 b, e
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
0 R' M- O! L2 x. \" X. t7 J2 a, c temp = readl(IO_ADDRESS(SRGR_ADDR));
5 ]5 J5 [: {4 \2 i: } e printk("temp=%x\n",temp);
9 U) q, I8 }6 B5 `7 n //RCR2 Q/ h/ X U J" [1 `% [
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 A: a* `, \, W //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& Y2 u' }& ]7 x" ] ] temp = 0x00440040;6 i& F& q% U* ] P' ^" W
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 u% V( v, S& H2 H! [ temp = readl(IO_ADDRESS(RCR_ADDR));2 o, R) e8 ~. e/ i1 F
printk("temp=%x\n",temp);' O0 C& }3 o# B0 N. u7 m9 s
//XCR
& @0 t7 N ~+ g //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: E, ^2 E: I! h) u# v //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 ~) i+ A, v4 x temp = 0x00440040;4 z7 P2 u, m4 I' t
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- R! i( ^% X1 v# k4 n temp = readl(IO_ADDRESS(XCR_ADDR));
/ T" i6 R4 ~, R5 u% D printk("temp=%x\n",temp);
9 h& A5 B( ?& @" L/ W0 p udelay(100);
! |. Q5 x9 v3 e0 d- `# Z, L" Q //SPCR Register
. P1 L# @8 z1 J4 O5 R' e: I1 X3 ^ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& ^0 \* B9 w. S, y8 M4 z temp = 0x03C10001; //DLB = 0 VS DLB = 1, Z9 L0 I0 v+ _: t$ m) F: c a0 p
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
/ ^ M* Z& A5 d! a- q9 B% E. m temp = readl(IO_ADDRESS(SPCR_ADDR));
- [; m7 o1 O: g7 y printk("temp=%x\n",temp);
& b1 U( M2 O; }8 O2 r+ r udelay(100);
2 Y$ p# w5 a9 Q6 ?' E( o# z3 |- a; Y' A' m. } O, h
//set GPIO direction
; S b+ Z9 L' c+ M, e/ O3 d. _ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 B! K8 ~# V0 u5 a9 h
temp = temp | 0x00000100;//EPR----input, Z4 D3 h ^ i3 v3 l
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ Q2 [" U5 [8 ~% h b9 ~. N __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; H+ E5 j6 H; [( P" x ' c! i* e( Q8 G& E9 {) A5 |2 `
return 0;
3 H/ \3 L2 X5 W2 O}
$ e3 s( d3 s' |6 E& I# ^& Istatic void __exit MCBSP_exit(void)% }6 _& c! I5 z* j
{
) q/ j- b% [5 T, `- m" u printk("mcbsp chrdev exit!\n");
5 i' t0 u0 U% D. G cdev_del(mcbsp_cdev);
, Q, Z* x3 |2 r) E unregister_chrdev_region(mcbsp_dev,count);, ~1 }# G* C6 [/ H- I
device_destroy(mcbsp_class,mcbsp_dev);& }% c8 K5 ?- u1 a1 P
class_destroy(mcbsp_class);! L; |+ H% B" B8 ^
}7 e9 W' ^0 V$ B
module_init(MCBSP_init);
( t! ~- n1 t- k% F. Wmodule_exit(MCBSP_exit);
8 }6 _) A; R* ?; u* p$ v& `2 U
% o. d. \* [, A: w$ [: ?1 x3 kMODULE_LICENSE("GPL");9 d" p& Q8 v, g6 n2 C( m U
0 d8 z& V8 F+ y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
+ M( o5 s" D& D5 l我的应用层的测试程序如下/ Q9 j8 A9 O _* O4 J+ q/ r
#include <stdio.h> b5 w Q* U/ _
#include <string.h>
9 J+ a8 I e* _0 a* m* r' q8 N#include <fcntl.h>3 K5 Z" n$ t/ N, s* r
#include <unistd.h>* B& i2 E5 C3 Q9 @# U6 y
#include <signal.h># T$ |% W+ W/ D4 H. p0 h2 h
#include <pthread.h> //线程& q( H& t9 G( y
#include <stdlib.h>
" q: a1 x0 G8 G- T#include <pcap.h> //捕获网口数据
. C: }0 R$ v9 O, W5 `) y8 b#include <semaphore.h> //信号) h5 r; c! T/ z+ y, c4 G
#include <sys/types.h> //消息对列: c0 z( M. H6 g5 O) b4 `( g
#include <sys/ipc.h> //消息队列
( \; @. X( G$ z" M p) X8 W#include <sys/msg.h> //消息队列
1 F3 \5 p. _: {4 {#include <sys/select.h>
, o4 P8 O3 @7 V$ S0 s5 Z% a7 z#include <sys/syscall.h> `3 W# B Y8 M* h
#include <sys/stat.h>6 t' d$ {% R5 E6 v, V
#include <sys/mman.h>, U" M/ }$ ?$ Y5 q6 r, H* e& X
#define msleep(x) usleep(1000*x)
, }& E& i) D9 ^1 S) a# L1 O
2 J$ ]+ k4 Q/ S' Q, P9 A! u1 Jint main()
" t2 N1 `& W/ i- }5 {' w{ 1 W# t) O {: J. H& E
//MCBSP,ARM与AMBE2000交互设备
+ I, c, }# e0 j0 m4 v# G int fd;( h$ ~* o3 S& V3 ?) o) i1 {
unsigned short data_write = 0x5555;
8 g* f5 s* p/ J, S/ }0 r unsigned short data_read = 0x00;
( {5 N) B/ E1 F fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 e0 S1 }+ y# R6 ^. T
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" |4 b, y! b7 I' ?+ e9 H
8 u6 M% P; f% {3 m" ?& ? if(fd < 0)
) L0 j( r$ @; Q2 ~: v5 J {3 E: p; L, G$ ^" t8 z
perror("open failed\n");9 t2 D6 w! a; e6 R
return -1;
* j$ \6 K2 j, M3 O% v) V3 r }
# T. W% q/ c: |$ ~5 Z3 L$ w/ N
, X% b% `1 a; x! t/ w while(1)9 C5 P1 ]8 S; b7 J. |* T8 x
{9 I6 r; Y, ~1 b# i/ n& v' w* C( w8 s
( K+ k; V4 N9 |2 Y //AMBE2000每次读写是24个字为一帧! R& O: h& ^- k* `# Q2 {, E2 w
//写数据时将数据在底层存储起来,等到中断的时候再发送' N2 S4 u0 M% o9 F* ?# X
//AMBE2000输入数据是以0x13EC开头的- p; n9 L* o. H4 y/ _$ |' ^
write(fd,&data_write,sizeof(unsigned short));" P# t2 w1 J. `7 U4 g+ z
5 M: S; w2 X0 \
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
6 D) |' _! A! d# \5 O read(fd,&data_read,sizeof(unsigned short));
' L$ c0 W, @- {) F5 Q, V) r / R& b- l1 ~2 {% g
if(data_read == 0x13Ec)
& D8 k( ]3 a+ t {
0 e; z7 F! Q/ f% }& A# H u8 Q1 s
# H, X l% e8 j/ s# y# [ printf("data_read = %x\n",data_read);1 z$ y. t: U, S2 l! o
}
! U. G( P. }8 B, _$ E+ E5 t / ~; y8 s. [- ^, c
msleep(10);
6 ?+ q. s3 z# r6 @0 Z( [" R7 y) a4 h : s! V/ p8 P+ V6 N( g9 t
/*) }' S5 Y Z" ~# F5 }* e, i0 {
ioctl(fd,1);
( `" L6 |, v" E7 F0 ?8 e sleep(1);
( @6 n: A" ?% w% u ioctl(fd,0);, ^( a: K+ Z$ x! i" R; x
sleep(1);7 l' d+ x( t3 O/ g+ u0 W
*/
2 R% X$ n4 d5 ~ } ; g' b) o& u$ n4 p
return 0;+ F9 S4 z- L/ j7 d' g S
- g8 ]% u6 E6 u8 E1 U9 p
}
# D) J4 x' B e8 C0 M: N2 b
( _9 A; W! n1 O3 Y9 N多谢各位指教,谢谢! 急
, ~- `( l. w5 w5 _1 t# u/ {+ z$ i) i& ]1 u8 b
' l! o& U. M8 V+ V6 @' U, x
- U& a' }. W' j' H6 S8 P0 w( w5 B' C* M! K4 C# U" r
( k8 H% i9 C/ L, U6 k1 j
|
|