|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / l/ t7 u; n- [% e. F/ a& g
/*: \7 b2 B+ t" r6 h
* Copyright (C) 2009 Texas Instruments Inc" u& M) e) J; _9 v
*
3 p- T( J3 U$ r9 m5 L9 ^ * This program is free software; you can redistribute it and/or modify5 K. w, c- O% f% ^
* it under the terms of the GNU General Public License as published by1 y# M8 R2 t Y- Q& n' F
* the Free Software Foundation; either version 2 of the License, or
% j0 ^' P( T9 y' `6 u * (at your option)any later version.8 }+ U0 Z2 k& |
*
9 q1 f4 x- v! U* J * This program is distributed in the hope that it will be useful,& ` |/ R1 k3 O. }% g% s. O
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1 t: S6 ~* b' j) x m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 D) E X+ z9 S4 W+ y7 E * GNU General Public License for more details.
- C( N" r" P7 G7 R4 C *4 G4 A+ Z' g) p' W/ `; f
* You should have received a copy of the GNU General Public License
S3 w" m: E" W) B$ v1 [& F * along with this program; if not, write to the Free Software
; Z8 k" O& G: w& a A * Foundati6 W9 p* _. v- G
*/: d+ f" _ p9 z
#include <linux/module.h>9 v9 }4 g/ S7 n1 h$ @4 y6 R
#include <linux/init.h>
N& F; N+ Q! E# p0 U0 y#include <linux/errno.h>6 t. I o$ O; ^9 o$ O5 N2 d
#include <linux/types.h>
& B/ w4 z- `/ b; U/ s H#include <linux/interrupt.h>7 ?9 U0 A6 t8 p3 a3 N
#include <linux/io.h># N M4 W1 T9 l/ D5 h
#include <linux/sysctl.h>% h5 G! i. b( Z5 |6 p
#include <linux/mm.h>/ `# m8 `+ e# o8 ^) X% M9 Z
#include <linux/delay.h>; e) Y3 G" j+ F% M, ~, B
#include<linux/kernel.h>7 ^5 z' \3 N! K: H9 v; J* i
#include<linux/fs.h>) c: g g% q, B2 q
#include<linux/ioctl.h>8 ? Q5 [) T5 g2 P) l! v" E
#include<linux/cdev.h>
4 W. X F" T/ ^: L#include<linux/kdev_t.h>
) Z; C+ d. j) K4 q#include<linux/gpio.h>
1 a" E9 f. v" K5 Y) q9 m' U#include <mach/hardware.h>- X& u0 j3 G. K( I B4 _
#include <mach/irqs.h>9 N9 J+ H7 y9 Z$ p) i1 u9 `- U
. T/ s% S% t, {2 w) p% s- C" u+ W
#include <asm/mach-types.h>- B* D4 `# P& q) l0 E* B! y
#include <asm/mach/arch.h>
; y1 ]# S- E5 t#include <mach/da8xx.h>
# y3 S- G& V, M ?) |. r- A#define SYSCFG_BASE 0x01c14000
" L% h/ L4 l' B; J/ Z#define PINMUX1_OFFSET 0x124
( w/ q2 M4 u" U, D3 b#define PINMUX18_OFFSET 0x168
- f- U& R# g( S#define PINMUX19_OFFSET 0x16c
A( z* A9 q: K6 N* t#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
' a( Y/ d) l+ u. \& v#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
2 S4 K; V C+ x$ ?5 v( g5 p) l#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) B; c- n/ O; k. W#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
7 @" F: F9 I% b$ o" _#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! H0 T8 a- R0 Y' S; C4 s0 _
! U- R1 `, F. H1 A9 L! f3 u3 b#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
, P, p+ S1 O& G: `4 p2 ^& r#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 y9 ]2 Z! |3 U- G# X2 E
//PSC% m6 F; V* v# q, l# E: Z
#define PTCMD_ADDR 0x01E27120
% F# g4 e) j6 y3 A#define MDCTL15_ADDR 0x01E27A3C9 v7 H" U/ z( }! M
#define PDCTL1_ADDR 0x01E27304& C, F1 E% B* [$ O, z; J
//GPIO8 direction9 `* Q6 {8 X8 b" {2 \
#define GPIO8_DIRECT 0x01E260B0 R. O$ w$ Q2 c# _
#define GPIO8_OUT 0x01E260B4) p7 p' I( j3 p. `0 [+ D
#define GPIO8_IN 0x01E260C0
6 G) Z/ @7 ~/ P, }# Z. w L' g8 y) V5 X8 x* n) T0 Q+ f- E
//#define MCBSP1_RINT 99 - L; J) c; U8 t$ A9 Q1 M' Y4 t
//#define MCBSP1_XINT 100
7 D6 a! T' l$ ?7 E; B2 |0 a. q$ Zstatic int MCBSP_MAJOR=239;- O T; Q- |' A7 c0 M, J0 k
static int MCBSP_MINOR=0;
3 a4 |% |( E6 t0 tstatic int count =1;
) H I$ {# v- Z% U, \- f! `
0 D9 d- y: k* P/ Y#define MCBSP_NAME "MCBSP-device"
0 m* k: p) f" ]+ C# x/ h" T
0 v+ R: z D8 \( f% M, L1 w( e0 v5 wstatic struct cdev *mcbsp_cdev;
' v! y+ {* w j. `5 Pstatic struct class *mcbsp_class;
* H7 |9 W# X6 q/ [/ a; Lstatic dev_t mcbsp_dev;3 n9 S0 O% \9 r$ C" K0 H
unsigned int DRR_data;
- |) X1 b ]0 gunsigned int DXR_data;
4 p' u: W3 [* P7 z# nstatic int mcbsp_open(struct inode *inode,struct file *file)% n2 |1 [5 a. G0 g9 ~2 n6 b, W
{3 g. X$ S& l: T+ C! ~* F/ m& t+ C9 `
7 I @! a$ P7 U8 {- H! u& c2 w l //interrupt enable,initialized, }3 A* I" Y/ t1 }$ y) u7 f
unsigned int temp;
$ V' \, u b$ N+ q- X0 b2 Z! d/ ] //SLEEP_EN(GPIO8[10])---0
) k- C+ c) F) Q5 q% r# q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 R1 w9 P2 @! D' V) m# }: u
temp=temp&(~0x00000400);9 z8 L+ k V# n* h# q. x9 N
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- e1 U- |6 v6 _2 V' G* h //RESETn(GPIO8[8])----0----1
0 }* @) b% [# G. J/ B0 N/ A9 z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 L: a* S1 d k- w' c6 z temp=temp&(~0x00000100);
4 ?9 C& b6 Y/ @3 L. w __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 R, Z5 v; T+ L0 e& O. v4 C2 u udelay(100);
U4 x" A( {1 a) c9 A temp=temp| 0x00000100;( D4 z! f G) E# @+ P" K0 y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 g/ S( C& j+ E( V6 m* m
udelay(100);( L0 N1 n) E; l$ a( n2 E
printk("open success!\n");
5 U: ?, @5 J# I( J return 0;
4 j" x1 i- }8 ~}9 C! {" ~9 E& M
2 W8 T: {# D3 c8 nstatic int mcbsp_release(struct inode *inode,struct file *file)( B/ ` I! u1 E, T; s2 t4 V% _
{
9 I- a, E. c# b9 f5 j/ G9 N w printk("release success!\n");$ F: q M `# W3 h: F: @% m
return 0;
1 y( n' c# E4 c% N5 q}0 Y! y5 h7 \* |2 k" u5 n8 S
: ?# r4 Q; M7 Y# g9 e/ m' qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)( N3 {' M) n. p$ F' x/ v; r% z7 E
{7 I' ?: K6 M- M6 S, C
copy_from_user(&DXR_data,buf,len);
& N& J' N5 L! s1 t3 [( _# K iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
) z" p2 h$ W' g4 j2 |7 h return 0;
) `& w5 r, w$ }& U7 U8 z 9 H3 W2 B9 ~- v) _
}7 ]# Q! T5 g) p# P) @2 b" `9 a! B
. W5 Z3 T8 e! l4 T
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 a7 M7 Q7 l+ Y* K
{
& t% y: L: K7 y DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
4 e9 Z( I) a ] copy_to_user(buf,&DRR_data,len);
* g1 o; G( z& X/ h4 P! { return 0;0 Y" Y# m8 p* I* t
}4 u, _+ u- N$ p5 w+ e8 P
2 `- L9 A# N0 p( ^* v
0 E0 R+ e( d6 T5 _- tstatic struct file_operations mcbsp_fops=6 u1 t1 c5 h/ b8 e
{7 A6 O8 C' V6 {4 l0 }) z
.owner=THIS_MODULE,
& j6 d8 K9 c( A' [7 W( ~7 F% v .open=mcbsp_open,
; Z: N3 f" j+ }- @/ V .release=mcbsp_release,; h! b0 ^5 ]* M$ J' l
.write=mcbsp_write,
' ]4 o0 b% ~/ S .read=mcbsp_read,
$ e( v! d, E" }) l/ V, J4 X};3 j1 ?( f) y, e& s& d/ [4 {
static int __init MCBSP_init(void)9 j3 X, R* L/ C2 F6 [
{4 ^9 a) o! a& h, ^$ ?
int ret;
# [# j `4 H( N8 }& B unsigned int PINMUX1_REG_old;* p! O0 K) @ }
unsigned int PINMUX18_REG_old;
& I* n: g1 F, I! I) Q5 A4 s) }; x unsigned int PINMUX19_REG_old;( t& ~: ^0 C1 ~$ b P5 I
unsigned int temp;
/ M" G, K. R8 x% L if(MCBSP_MAJOR)
# d, v: J, Y1 C8 X4 U2 |9 ` {; u2 A. _" j9 f' l* z3 F# @" B6 x
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
n5 N) ~1 u9 J7 Q, A ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 B! ]& c7 F/ A! C$ H* v }
' k i: }, ~+ t. q; ~7 j3 C else
2 R$ Q) _) T/ H {
/ M, [* {- }) N! P4 ]+ a7 Y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 X. R t4 C, F' \# _) C- c0 k- T MCBSP_MAJOR=MAJOR(mcbsp_dev);
, _9 Q; g- P, A8 O }5 E$ ]: [, W4 Y8 X" o, W: ?1 t X
8 X! ~ A! Y8 |# k. Q. Z) r- r4 D if(ret<0)
! i* Z7 \8 f9 s/ g- v {, P; D i# L5 G: b- Y
printk(KERN_ERR "register chrdev fail!");
* ]) q2 W/ C7 l& Q' D- \ return -1;# t3 `: b, L. f
}
* s, U1 P/ b$ f* b, R% k# n
- k) c5 ^( s+ s A mcbsp_cdev=cdev_alloc();4 k) O7 J# g" a* `
+ `- A2 C7 {. d! @
if(mcbsp_cdev!=NULL)
- c2 N) q! Q7 a* ]" _) R# W7 W4 P {
, H# Q s+ ]5 P+ `' l( T6 S cdev_init(mcbsp_cdev,&mcbsp_fops);
( u2 J5 x: b. T) @4 c; { mcbsp_cdev->ops=&mcbsp_fops;+ ?# H! C8 K0 f0 j" l9 r
mcbsp_cdev->owner=THIS_MODULE;
8 b1 v( m- ~+ f5 P# V S
2 m" e# x$ j3 C& G+ O if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! P9 G% q# N4 X4 S( Z7 T9 V: C: L* y4 T# {
printk(KERN_ERR "register cdev fail!");5 t3 Z0 }( k$ H
else
6 |/ w$ @3 R1 c1 ?0 O. H R printk(KERN_ERR "register success!\n");
# W. F; A* i: [/ T$ D, ? }7 B) b: ]4 U5 D7 O+ Q$ Z
else) i5 }- u- Z! e6 Q6 z* H
{
+ c# N$ m; j& r+ w printk(KERN_ERR "register cdev err!");/ b; v! V5 |9 H6 x
return -1;
7 K5 E+ h; t B2 L$ C3 ] }. l+ V/ N) ^1 \& r: S. {3 m
8 I3 g W5 m6 D5 d; X mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 i# E/ K! `% m8 H1 d. e if(IS_ERR(mcbsp_class))5 d* q( y/ H4 x) X
{
8 F6 O# u: ?- N9 O8 T3 E printk(KERN_ERR "register class err!");
+ V: s# l4 s- f' _+ e return -1;" t* w6 U: j% D/ W. R7 _9 x
}
; `' B/ Q* @& k v# g8 W( {# W device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! a! F4 c/ G ]5 i1 C
2 A3 E. w+ y1 z //PSC( ]% @& K" q$ D W* G
//add Enable MCBSP
: S/ R% }: v9 d //test6 `4 m" U' o3 p s
temp = 0x80000003;
3 a) e5 ^& B5 ?9 U6 Y writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 J* ^2 [) b) h/ { temp = 0x00000003;) }" m' u u* D) P# h" E# z
writel(temp, IO_ADDRESS(PTCMD_ADDR));5 T+ a* D+ i% `0 J* f- Q# h
) `+ n6 z! ~# F7 Y, Z. l temp = 0x001FF201;4 x) |# n" \. S! R
writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 j' Z9 V4 z* [ T* ^) P" v
4 {: [& \9 p, v1 Q/ R. @- _$ z
//PINMUX
?$ e! I5 e9 u) I, K //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. B* Y' n% c9 u, E5 D% L8 W PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; L: G2 l f9 \2 s/ W PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 6 X. M! D' h1 {0 r5 w' t* E
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- ]0 W6 h) |5 t D- R2 N 1 F, m# }; R5 Z! N0 d% b" p& E
//SLEEP_EN,EPR,L138_SHK1,L138_RC, C+ d) m* ?; ]/ ?' @5 R. z
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , {& Y d- I- m/ a
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; # F3 K, L# m9 C8 v
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) r1 a" a7 Z: L4 K$ z1 k/ j
! _, z, A3 y# R; D //RESETn,L138_SHK2: {$ N! ^7 {9 E- H H1 l+ }3 p* ~3 F9 x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( g! y6 m2 n8 I PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 ]( c: f8 m* y" ]- f0 c7 | writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) B( W6 o( w8 [- V3 ]& |4 e
5 P5 z0 y4 D6 M- O: a9 v y 3 B/ x$ Z2 i: u
//SPCR Register
, T5 J3 m. k" c: N. a( h$ k //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset, x. Z1 U5 ]' {& g
temp = 0x03000000;//(DLB=0)
s" C% }) w1 A! V/ {+ {! t, T# l; v // temp = 0x03008000;//(DLB=1)3 R3 u/ e8 U# T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset( F% @+ Q" Q; l2 o. |
temp = readl(IO_ADDRESS(SPCR_ADDR));
+ w6 m# f- d# w0 i6 @% k9 j printk("temp=%x\n",temp);7 D" c" f# g8 @; V7 S
2 N2 P1 ]) s# l6 [ Q //PCR Register
7 ^/ W9 y5 m, M; G' w //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- O4 U" H# @+ b, p
// temp = 0x00000F0F;
: W' X+ e* m1 o. K( Z* k. R temp = 0x00000B0F;- i5 z. }1 z# D) [* O
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ( F; g0 y/ O: ^% Y. o
temp = readl(IO_ADDRESS(PCR_ADDR));* j9 D8 d ^7 V
printk("temp=%x\n",temp); ( r! f3 x' |5 U
//SRGR Register9 X1 q* z& h2 X9 [ l
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: a5 S' c/ ]2 ]/ s. [ //temp = 0x301F000B;
$ x) O. [+ S0 K# b6 G writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
+ V3 k' f9 R B8 V8 _ temp = readl(IO_ADDRESS(SRGR_ADDR));+ O% g3 a! b! w0 o
printk("temp=%x\n",temp);( }* m; z3 Y. }) o7 I6 d/ m
//RCR
8 P) v- Y/ _$ z4 o7 G //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 Q; z6 `! Q; L: t) E0 f: y9 i //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0* H ^$ A! S" ]7 ~5 U
temp = 0x00440040;
0 d& o4 q0 d0 s. Y4 Z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized $ E: _0 D+ t0 e6 F+ x4 l, z9 L! R, C- w
temp = readl(IO_ADDRESS(RCR_ADDR));5 a; O6 [6 S$ H
printk("temp=%x\n",temp);
2 K2 C5 z1 Y C6 o1 v, E$ s( {/ g4 m //XCR
" O8 x* y( |/ p8 B //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 S3 x2 ?3 _/ v: l I2 G* k
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* d5 e) ^/ n$ `+ W# j* [0 J4 K
temp = 0x00440040;
) I3 P+ L$ w" T' c3 B% w) _ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized - ?# k% P3 ]7 ^/ y. W W
temp = readl(IO_ADDRESS(XCR_ADDR));$ e# {9 @0 L2 b
printk("temp=%x\n",temp);- v! x; F% S) u5 ?% b$ D
udelay(100);* p5 e ~1 l: u
//SPCR Register
( K. x( p7 D5 I# T //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
W8 [" W' g1 a4 _! j2 A I, H temp = 0x03C10001; //DLB = 0 VS DLB = 1
: r5 ^0 [& {: c) l. x. h X; Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled0 \" t B* E, X( M6 o
temp = readl(IO_ADDRESS(SPCR_ADDR));- O/ L. ?0 v8 |" Y k1 o6 C
printk("temp=%x\n",temp);8 C6 T1 t3 E; ]! }0 n
udelay(100);7 l9 }9 i" |3 F/ e# X+ w( u
# \, H9 E+ z1 Q6 x/ }5 {
//set GPIO direction& H$ {' P: I) U5 p/ Q/ y
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 u2 H% ]. J: q% u temp = temp | 0x00000100;//EPR----input
! s, S8 p2 v, K2 ?2 J1 X5 w( T temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output' A3 I; W- ^6 n: E: E' t8 _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - [6 P( L9 T. E- i+ A% R1 |9 w& |
8 J2 s8 w7 w1 K& \% Y& \$ r
return 0;" n1 j: t) T& u7 \* c; ?
}
, |/ i! o( {0 G! vstatic void __exit MCBSP_exit(void)' [# E% N* J; C5 q" g2 w, ?
{6 d4 z0 S+ t0 H5 Q x& u
printk("mcbsp chrdev exit!\n");
! o# o" j. c0 X7 ?3 U$ A cdev_del(mcbsp_cdev);/ N- |, e0 L7 C" H3 A$ Q d; a
unregister_chrdev_region(mcbsp_dev,count);
2 c8 I* ^9 E/ h' b1 S. I6 N2 } device_destroy(mcbsp_class,mcbsp_dev);
3 T: P5 _# k. Y& Z6 h; F n/ I class_destroy(mcbsp_class);
& H# Y! a* I% a5 k}- i/ t r3 Z/ {
module_init(MCBSP_init);
3 _1 C# D' s4 o8 X7 F A5 N8 Ymodule_exit(MCBSP_exit);
6 N! V* N, x+ [- g6 F/ ^3 s' K: u
3 a; I5 d5 ]8 H- V( lMODULE_LICENSE("GPL");. l0 b; u9 I& N" K1 i
% \0 f# K) C, W( w2 P! u
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ ^8 a1 B& ?( x% z* C& Y我的应用层的测试程序如下
3 m+ B% J( H; i3 | L#include <stdio.h>
8 t; Y7 M% s5 K* a& Z9 u) V#include <string.h>; D# |. A6 u" H" ?; c3 ^) ^$ w# V
#include <fcntl.h>7 I* E- G h+ X
#include <unistd.h>
" `7 v: J6 n* |0 i6 P# o#include <signal.h>* x7 V: Z$ j' e D
#include <pthread.h> //线程4 L# I: z, n; A4 ? |% v
#include <stdlib.h>6 B6 B- j6 P2 S% t7 Q4 M
#include <pcap.h> //捕获网口数据( E5 ~; n- c$ ~% G* X
#include <semaphore.h> //信号
" ^* j F- w8 L! T' v#include <sys/types.h> //消息对列
; ]* {( V8 u- r6 X `9 ?/ A#include <sys/ipc.h> //消息队列
1 n, `* F8 d+ }' c: W#include <sys/msg.h> //消息队列5 V. i* L: A) G" e! g7 s! h
#include <sys/select.h>* ]' _8 J( |2 J z) _/ Q/ S; Z f
#include <sys/syscall.h>$ K8 `9 @. _# b7 r& o6 V9 q
#include <sys/stat.h>% X" q& x0 L7 B6 h/ D7 j) t
#include <sys/mman.h>
o2 V% g& a8 u#define msleep(x) usleep(1000*x)+ U5 i; y0 |3 K3 j Q% v2 l( f" c0 f
' ^, R. |' a Y3 uint main()
* _$ T, I0 O8 Q; E# D9 M{ + ?; q- z! Q Q* G
//MCBSP,ARM与AMBE2000交互设备
" |% c9 o3 o5 P `* O. X int fd;2 S! P3 K. f2 B: o9 E
unsigned short data_write = 0x5555;
) h* K2 l# M( W, |& i unsigned short data_read = 0x00;
3 b3 u1 ~/ D, ?! n! q fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* E7 @! A% ?6 G5 A3 A5 `" g // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 F3 a7 @3 L7 N0 t8 T7 u
. w& b D, j7 B. x e
if(fd < 0), v8 e2 j Z, T" Z. Q# z
{
& ] B( s8 z, {, U8 d perror("open failed\n");. l* T. `' f$ M! U* b
return -1;
* h) H, o$ @0 x }7 V# L1 [$ k U; N8 v
& ~! j6 q8 c" N3 E' v9 f: ^' f3 N3 {. d
while(1)' u4 s& h+ b: I4 ~+ ~
{) C) @9 f. C( {5 g* ~' u
9 ]- r7 P- `+ V" Y) E9 U+ |5 R
//AMBE2000每次读写是24个字为一帧- J% X# x# F/ S; B" D
//写数据时将数据在底层存储起来,等到中断的时候再发送
: g# Y% R$ ^3 L/ O. X. R/ i //AMBE2000输入数据是以0x13EC开头的
; M, z+ J9 s' [ write(fd,&data_write,sizeof(unsigned short));2 q F. ]2 f: c( d
, Z% D6 ?; i) h' e5 S //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 " ?3 A4 x( E4 T; J, c0 ?7 a
read(fd,&data_read,sizeof(unsigned short));
3 A$ Z0 [1 A7 v9 Z " {: i! g, e* P5 i9 f5 E/ f
if(data_read == 0x13Ec)
6 L1 I% x4 E" G/ ? {" H9 o7 Q! @# U* q1 N
* a7 O% e* r( Y- O7 @
printf("data_read = %x\n",data_read);
V' B5 X+ N2 P2 E& N }3 j: ]% u0 X3 _" `7 g A8 O5 n
8 q6 W T, e2 `: w
msleep(10);
" ?/ G5 T* L: Z5 k6 l x0 [7 B; J4 \4 W* u7 j# D2 P
/*+ d7 H5 w t. ]( N; C1 R" G8 a/ {) m
ioctl(fd,1);
. h3 ^5 w. y9 N( {: Y" H9 ` E sleep(1);
/ `: d+ X" q) k: v) F ioctl(fd,0);1 |( G& z* I: z4 P* g: u
sleep(1);
. i; F3 M* X5 k( T1 V6 v+ e2 y */ 3 n# p+ w" Z. h/ s, f# T6 m
} " |7 E+ G# Z! v3 d4 [2 ?6 d
return 0;
- z- C& v3 x6 F9 h8 C) ^& C ?* F- n8 v3 H& W: Z
}$ ?, @: I b! j+ R1 q* ?& R
* y* m9 [' J: R, a
多谢各位指教,谢谢! 急
+ `$ v7 d! k- F. L P
1 P. [1 S2 }# U6 ]' L8 d2 A$ T+ X# V0 X' { T
: {7 T( ^' u8 X4 u; z* _, |4 j3 Q
: b9 z! k8 S4 u6 Q# s* @% ^3 c2 } |
|