|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 8 J' T0 F2 ^# {. H4 J# M% A5 ] ?
/*
: Q+ E3 A7 L2 Z/ B9 I * Copyright (C) 2009 Texas Instruments Inc6 Q* p$ P( C. _% S
*
' v3 i9 D" K2 c+ a6 _* x9 I * This program is free software; you can redistribute it and/or modify6 i# C% }% e# a$ ~5 p
* it under the terms of the GNU General Public License as published by
" h. t" X* }: d O( V, x * the Free Software Foundation; either version 2 of the License, or
1 o" o* X6 M- p( G$ x * (at your option)any later version.
) g7 a4 z- d; f) X6 u& ? *
6 Z6 b# V* S! _% K8 C4 i. s' k * This program is distributed in the hope that it will be useful, @: P9 D7 V/ f# \4 p
* but WITHOUT ANY WARRANTY; without even the implied warranty of
$ a" f' ?0 b5 J2 T% O' t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" r' I( S/ L. D$ f; T * GNU General Public License for more details.8 B% [* Z; ~/ b# T3 f
* L/ o0 r$ ~) M* u" \9 F
* You should have received a copy of the GNU General Public License
) k9 P1 r7 v9 B0 [* Z) h$ `+ v s * along with this program; if not, write to the Free Software
: J* g4 v T5 y * Foundati8 b6 A y+ L6 k; y- C$ o% i0 B
*/
% u! w/ i& R% R5 g+ \7 Q" F#include <linux/module.h>
- l# Q0 A* |, l" B#include <linux/init.h>* {; A, D/ ]& P3 w
#include <linux/errno.h>3 o& E# t& M3 R' U+ W6 L) S
#include <linux/types.h>5 F q' o; t( P' ] \+ m Y( b
#include <linux/interrupt.h> @/ h) O7 U: Q2 ]! M% v
#include <linux/io.h>
7 I# j& J% }+ y) m; U" i6 o#include <linux/sysctl.h>
& z2 ?" c( p2 X#include <linux/mm.h>
2 n& n5 n: P. C; w* ]. L#include <linux/delay.h>
1 r3 c1 b: x* l. C#include<linux/kernel.h>3 `* ~: L I8 {: @: B7 v
#include<linux/fs.h>+ E3 h+ g4 q+ f1 i
#include<linux/ioctl.h>6 L# r( U9 a2 p' U
#include<linux/cdev.h>' B# I: g9 F" W: J
#include<linux/kdev_t.h>
. R+ m- ~9 y0 B/ o1 J) x( V, x" o$ U! g#include<linux/gpio.h>* U* ?; R6 @& R6 U8 A
#include <mach/hardware.h>
$ M0 b# Z P* c v! N#include <mach/irqs.h># B1 S1 N0 ~, H, x% O
# m m: B1 F# E0 d" v#include <asm/mach-types.h>
+ g; O, R# e, E2 ~1 a0 {#include <asm/mach/arch.h>6 l3 L6 [: K9 x6 G" y
#include <mach/da8xx.h>, ^6 p* D+ s B# o5 q6 Z* G* z; |9 D
#define SYSCFG_BASE 0x01c14000, E, H$ U. ~3 j- ?: U0 C7 e( e
#define PINMUX1_OFFSET 0x124
2 E8 k4 ~& F+ L# ]- d- V- f#define PINMUX18_OFFSET 0x168 : l: A, k h9 O7 T/ y
#define PINMUX19_OFFSET 0x16c
& x1 K- b) m* ]3 {#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( P& u# t% U, K% E- d$ E
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
9 k0 V1 L5 X r0 V#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
' M. f. N" o" ]0 n) B#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
E2 ]* ^$ P* c. g#define PCR_ADDR 0x01D11024 //MCBSP1_PCR3 V$ p9 X" N9 z/ k# Y
7 W5 Y) D: H* ?, Q#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
: J) O& n! k! q% D( K) w#define DRR_ADDR 0x01D11000 //MCBSP1_DRR: B5 n0 x% S# b% w9 @: Y
//PSC
p/ \& m" z/ T. M#define PTCMD_ADDR 0x01E27120
1 X. |4 d4 u) ]& f#define MDCTL15_ADDR 0x01E27A3C7 Q6 K$ {, R" q9 _9 B* ]
#define PDCTL1_ADDR 0x01E27304$ s, {/ A. Q! M* b* f/ Q
//GPIO8 direction2 z# \ ?# a2 ~6 n/ N5 q2 j
#define GPIO8_DIRECT 0x01E260B08 K U. v2 ?$ D0 c+ k( y0 Z
#define GPIO8_OUT 0x01E260B4( E# L2 z* `' E6 h4 |8 t
#define GPIO8_IN 0x01E260C0$ K2 i( R$ e: W0 U i5 d
5 p# Z: D& k% [2 C+ P/ ~5 I
//#define MCBSP1_RINT 99
* o; \& S4 l+ o5 c* ], d- q//#define MCBSP1_XINT 100 1 i+ p, {+ \( u/ I
static int MCBSP_MAJOR=239;+ C! j. [& o. q! N1 F5 b
static int MCBSP_MINOR=0;
' ]4 I$ c5 d. b& \static int count =1;7 D. Q! H. j7 ^: y
4 Z1 y- n U3 t& F
#define MCBSP_NAME "MCBSP-device"
$ }+ `( t* l1 a/ Y6 T9 { A, j2 l5 E1 L- y3 E
static struct cdev *mcbsp_cdev; m- B/ M+ a2 g( O: U: l' v( q( P
static struct class *mcbsp_class;% A% l W3 M* G0 G( s7 w
static dev_t mcbsp_dev;) q6 j4 E) ? c! M
unsigned int DRR_data;2 d7 H) k7 i1 f" B
unsigned int DXR_data;& _- W' ]" |# P) e
static int mcbsp_open(struct inode *inode,struct file *file)3 n* x8 z! V" Q* R5 P _; G. r
{' I2 w. ?1 o0 m8 l( @
+ m5 A1 }! x1 B2 M3 S! p6 H* v
//interrupt enable,initialized# I8 Q: L; z5 Q: S% a5 c
unsigned int temp;: f( ^: \7 B- a4 Q$ }7 s
//SLEEP_EN(GPIO8[10])---0" J0 k, b. E( e( H( X6 j/ W$ {
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: C: o( ^7 d8 J. \ temp=temp&(~0x00000400);
) H/ m$ A1 S; m' e: q( g __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" }% N; M3 U: A
//RESETn(GPIO8[8])----0----1& N1 ?" Y) x3 R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) u* ]" [2 d$ Y temp=temp&(~0x00000100);
' M0 \; ]7 G E! Z: o __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& n% \ B; F: h8 N+ v6 D3 o udelay(100);
: P' X. r+ m' l" U temp=temp| 0x00000100;
( P; l/ h4 ~7 P8 S+ w4 l$ b4 ~ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---18 Q# c( c4 _* W/ H
udelay(100);
, o* B% O8 A+ O/ T printk("open success!\n");- n, w2 S6 h q' u
return 0;* u: \ S6 a3 N8 ^2 d/ X. M0 {
}6 I" f; \, w) c
; V3 ]- c- A8 W) c' p+ G: Pstatic int mcbsp_release(struct inode *inode,struct file *file)$ ^9 {3 f6 V# @3 C
{
) ~6 R U* }+ q5 b( @3 A printk("release success!\n");8 ?* a1 ?# h4 M+ h9 Z
return 0;" `& w! U6 q0 e9 o% h
}
7 n, r% V( o4 S( o4 P, I
! K2 O0 a% f4 [' gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)$ \! D5 w9 q9 W, M/ O8 v
{
% Y" {) [! n" p, W3 | a8 d6 ^ copy_from_user(&DXR_data,buf,len);
2 |% O, J% r3 U& }' G! ]) g3 C iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % a2 a: G9 a. E" u3 b9 k5 J5 d
return 0;7 s/ B% p5 ?& y% r2 O
6 K" m+ J9 t6 h6 _7 [# r}/ l D; Y- B) M
8 L$ ]% Y5 u& K5 U5 Q& Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 w- x; A$ {, o' b
{
" H( N0 a) [# g n+ q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 M5 A' J4 S# R copy_to_user(buf,&DRR_data,len);
7 B* [6 Q& m, T$ v, ~/ _! [( K return 0;
. t0 t6 @6 R3 n* N9 G- t4 D}
& a1 D z# `! E! {! h' r
4 j0 M- N( ]+ E% l
* O" u# ?# K3 Kstatic struct file_operations mcbsp_fops=; x$ M, a7 |3 A7 S! \
{' T/ w: w4 Z* V# I+ |; m, s
.owner=THIS_MODULE,
/ D" g6 X+ B4 G, }) ?" o4 M .open=mcbsp_open,/ T( I; i( A9 y( B/ d0 k
.release=mcbsp_release,
7 \+ B0 @1 N. P9 s x .write=mcbsp_write,9 ?7 T& g0 |* q( Q
.read=mcbsp_read,
5 {$ j% M1 F9 x: V" |8 `};
% v) ^- N; w9 G2 L# v2 ostatic int __init MCBSP_init(void)6 [7 |7 {( i3 L6 a! U
{& ?7 k" q6 `3 j$ {) `
int ret;
8 v- v" M! v( d" c; _# a4 C unsigned int PINMUX1_REG_old;
* h8 Q0 w& C! {( v, G+ w+ |8 h unsigned int PINMUX18_REG_old;
' H+ F9 ^: s: p d1 @' x9 d/ a% C unsigned int PINMUX19_REG_old;( G' R1 C" R3 C7 y" k+ D$ C
unsigned int temp; * n) t2 U b: Q% h' D2 c- w
if(MCBSP_MAJOR)) ^; V( ? E; Y' D
{, [/ ?- r5 ]. |; z% u/ t
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
+ o+ ^+ h9 {/ v/ ]' l ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" W; k a* m* F; |; R. i: u' R# C
}2 J8 c/ @3 \* `' J8 x* \
else0 k# w' [; g( N( f/ `( O& _; E
{. K! Z/ @- n! @. f. K- `' ^) S* ^
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- U' q1 O8 q1 i4 l: u0 ~9 ] MCBSP_MAJOR=MAJOR(mcbsp_dev);4 w. n! K$ z8 v1 h8 X4 F* Z
}
2 O( x) Q$ c9 u' O, Q7 l ' m6 k) X8 [2 Z/ G
if(ret<0)
! ^: B6 Y* Z, b( l/ ` {
2 _) R" \% n9 P7 P printk(KERN_ERR "register chrdev fail!");/ a" E; }9 Y# ?
return -1;& ]' D1 A' p6 I* j
}
6 X6 p) d& }/ u/ N * M& ?1 i2 T5 ^0 L' c6 ?
mcbsp_cdev=cdev_alloc();
, x: V9 m: B+ D# n* B
# p8 y1 H$ v: K* ^# D6 m if(mcbsp_cdev!=NULL)* R) U; q2 R$ W3 I; O
{' X+ e$ J2 p3 U& n7 l& S
cdev_init(mcbsp_cdev,&mcbsp_fops);
* V) A, X' }7 P+ g mcbsp_cdev->ops=&mcbsp_fops;, C* j0 ~( X. c& L; r0 w
mcbsp_cdev->owner=THIS_MODULE;
4 d" a+ T* I% |: i6 _: o @ ' ^/ L- G3 G6 D+ N1 Y: t
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! _" b. f4 \' p: A1 p% ` printk(KERN_ERR "register cdev fail!");
* P: r. [; {& _. Q' c, y else
o+ q2 ]& q3 v# d" \' N. j printk(KERN_ERR "register success!\n");9 p$ `2 X8 v, @- A
}" k* S+ A3 m/ {
else+ v2 M( K* ?" k
{; u9 Q: v' R! v5 v( ^
printk(KERN_ERR "register cdev err!");# D9 p" L, u9 \, R- s7 d
return -1;+ z1 Z ^0 B6 e
}
9 F" H0 \3 P8 N# H3 ^" Z, E! u
4 P( l9 P0 u9 O1 ^) S( P3 P mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 A/ Q* r2 w" z& M- ? l9 Q if(IS_ERR(mcbsp_class))" O! n6 {2 X0 j$ t- }+ y
{, o2 |# H( K8 P) \
printk(KERN_ERR "register class err!");
5 p+ ^ ]8 }. V0 f# A return -1;
, }7 b( T8 ^3 ]' S4 [% d" f }
% i S7 ]6 o8 A; u4 @ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# P! _6 G1 j+ c( H" g2 g! `/ ]/ _+ p
[5 x2 J5 \ u8 a //PSC9 ~3 t& Y! X3 H) R, o4 o' w2 }
//add Enable MCBSP
7 L/ | _" h2 S# h //test& J/ ^. K% c) D
temp = 0x80000003;( a6 y, U7 D6 @- S6 s& M' I
writel(temp, IO_ADDRESS(MDCTL15_ADDR));& C+ E: z6 N" f% p' b7 ~1 T1 C
temp = 0x00000003;% C T: f7 D6 z- c% C [
writel(temp, IO_ADDRESS(PTCMD_ADDR));% h4 ?% ]9 g- ?* D1 c. h% z# i
8 Q, m1 n; I5 ^5 i6 r6 _
temp = 0x001FF201;; q3 d6 Z9 t0 s9 `
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 d/ `+ s7 n8 C* X# R
5 Z9 p9 }! [- }. \# {$ Y! e: ` //PINMUX
( l8 J+ g6 Q9 z3 \. r$ ] //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 H @" J) M- H3 C2 V PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! }& O2 z% D# T1 ?) z& k; d" t' h PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! l7 V4 T) d$ R3 a) V$ o/ |( j writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 |) J7 x/ T3 [0 }% c2 {% j 8 c/ Y# w' N! U
//SLEEP_EN,EPR,L138_SHK1,L138_RC7 Y' j$ ?7 }5 D! b# M7 b1 p3 \" Z
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % k7 ^* T" V* O' \0 `) t
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
* B% y4 C- y& `! M writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 A% K6 M- A2 R- ] , a2 M' m: |: R/ G! l1 {4 _
//RESETn,L138_SHK23 E$ G4 L9 E# @; {2 ^
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 A4 m) v1 k7 B" [ Q( b' v PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 9 e( m! I9 o% Y B& `$ L
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 H& [, @: K; A: Z; F ; D8 ^7 w/ z2 T; L# `
! o0 H, a& h B
//SPCR Register8 \; H4 I, I* o; u; M3 W
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset ]1 U4 o" C: E$ U
temp = 0x03000000;//(DLB=0)
5 ~7 v8 r! D* k7 X s4 I% V3 { // temp = 0x03008000;//(DLB=1)& ]* K/ c. c1 _
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
0 a9 @) t$ d; p- H temp = readl(IO_ADDRESS(SPCR_ADDR));; p) O2 }7 g$ J
printk("temp=%x\n",temp);
- D( J: f$ b" |8 x m
0 d7 S3 S+ {: ?% Z' s( o2 @ //PCR Register
+ i* \# z: k, s: j+ x& c9 k' e( } //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) G" z0 `: A! F6 L // temp = 0x00000F0F;
4 c7 U1 V# _( Z temp = 0x00000B0F;# `8 Y- }5 r3 x m
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ' L" d1 {. W( ^7 T# B
temp = readl(IO_ADDRESS(PCR_ADDR));( P$ S2 H! E9 b
printk("temp=%x\n",temp); % P* ^7 I% K) P8 ^# o9 V1 I' v
//SRGR Register0 a8 d4 V/ L4 x- F5 g& Z4 D: G
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! w. Z* H, }2 I% D //temp = 0x301F000B;, q* w3 T4 ?7 y1 ?9 m' {6 y) ], F
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" b" B* r9 D6 v, s' V temp = readl(IO_ADDRESS(SRGR_ADDR));
6 d/ X' |# \' J; k* w( ] printk("temp=%x\n",temp);
! B) G. B$ R# o$ V( M* L) |. l" f //RCR7 ~) n2 T0 L% D9 u
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 w8 _$ s/ {+ N) S, ]$ ^ //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0: F6 G; U/ I! }8 r( Q5 H& v
temp = 0x00440040;
/ J E: `; D( ]- [& t- c* C; f; n* b writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 T, t% v& v2 N temp = readl(IO_ADDRESS(RCR_ADDR));& I2 M8 _$ a* U+ ^+ f3 z- F- G1 g; y8 M
printk("temp=%x\n",temp);+ o" B7 P2 L6 e; a2 N; G; ?6 S" k
//XCR- i" {5 w$ B2 I+ F
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 N% G9 _" a. ^$ I4 Z7 E9 N //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% n& d+ R; G, m8 P; n4 Z
temp = 0x00440040;- R, @0 m8 S0 v7 i) @: {
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized $ d& u2 L% |9 |' T
temp = readl(IO_ADDRESS(XCR_ADDR));
1 O% X" ?* l$ E printk("temp=%x\n",temp);
5 b+ M5 |4 }! f+ L) ^) u udelay(100);0 c# Y" X+ x% x, ]4 [ n3 X$ E
//SPCR Register/ L% [' S8 ~% w
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-18 H0 {; `6 g. q
temp = 0x03C10001; //DLB = 0 VS DLB = 1
5 ^* s9 m5 e% D- T writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
& |$ g; S$ X6 w2 D temp = readl(IO_ADDRESS(SPCR_ADDR));
# z2 _) p9 ?% ^+ ` printk("temp=%x\n",temp);5 i" J& F9 r! w2 ]: W# o
udelay(100);
^# j2 h4 q/ A; K4 Y7 U/ L, h* @4 o. _1 X6 ]6 j8 w5 e
//set GPIO direction5 s& D6 O6 X0 L+ a
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 ?" Z) l, c/ ^+ k& u2 s! R temp = temp | 0x00000100;//EPR----input1 m: W/ }; ]' {
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% m( h- { h- @" K
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( y. Z& q4 n0 ]" I5 l! J/ ^- G* r% E) Y ' E9 R3 ~2 O7 o
return 0;5 e" X) a% l- S" d, s! n7 F
}8 z4 D9 X/ y o1 E y- T
static void __exit MCBSP_exit(void)* D0 Y1 n! _' p& X, W7 K' C! g
{% x% j- g9 |' e3 q3 z
printk("mcbsp chrdev exit!\n");
0 Y; H$ ]! y9 q9 p2 ]) N E4 n cdev_del(mcbsp_cdev);
5 b* K7 ?- P4 t, m2 T& J4 @ unregister_chrdev_region(mcbsp_dev,count);3 k; u V) P; F; O& i. a5 R
device_destroy(mcbsp_class,mcbsp_dev);
) X* X% N; Q; k class_destroy(mcbsp_class); S4 i5 S d" _/ x# X6 P
}2 u! p: R3 \9 H, {9 W
module_init(MCBSP_init);, \$ j8 O: [( ?2 f+ K! m# O
module_exit(MCBSP_exit);' q8 \9 V$ U2 D8 B3 D( H1 B
+ ^$ A4 _/ p; R) E
MODULE_LICENSE("GPL");
Y7 K1 y6 G/ F+ Q, j2 P8 F8 `) Y: R3 G/ L9 d% J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& ^; ?$ D( s) p E# }1 U9 D+ c
我的应用层的测试程序如下
" W3 v7 B" H9 Q1 R" [#include <stdio.h>
) ~ r3 x$ R" C1 N( q+ u#include <string.h>
* j4 J0 M2 Z8 ?( n* h- H#include <fcntl.h>& `& y" M3 x0 L* Y
#include <unistd.h>) m! n+ u& U0 q1 `# H' `0 x
#include <signal.h>$ _7 b& {/ Y; F. c' h3 j
#include <pthread.h> //线程
5 J5 a1 w$ d& b7 S! @8 l& l/ i4 o( d, H#include <stdlib.h>4 h4 g4 Z. F b; q" m# C: `. {
#include <pcap.h> //捕获网口数据
S; c, F/ x% L7 _, l+ ^#include <semaphore.h> //信号8 P' Q# }8 }' H3 \
#include <sys/types.h> //消息对列
1 w: r+ @4 Y& S, G7 ~: Z#include <sys/ipc.h> //消息队列
. \: b- v/ V8 w( ]#include <sys/msg.h> //消息队列: ~$ J$ f6 H5 N f g2 j: u6 I- r
#include <sys/select.h>: \# C( m8 V q& n0 q) d- g
#include <sys/syscall.h>
' j' K. M9 L9 g1 e8 W9 Y#include <sys/stat.h>$ ]' F5 a7 L& E) g7 q
#include <sys/mman.h>
5 j. Y( L% O$ M" N#define msleep(x) usleep(1000*x)
( n( k) S, Y7 W3 e0 l
# d; g1 r1 U% H7 ~$ |; dint main()
4 `3 I2 e; T/ C, y$ O- R{ . u4 d1 p; N. B% v7 X
//MCBSP,ARM与AMBE2000交互设备
, U6 c2 g; {( B [4 K int fd;
8 s5 |* N4 c# v/ P; Z% p unsigned short data_write = 0x5555;
' r" x9 A* A+ B% _" ]# {2 H unsigned short data_read = 0x00;
, }9 \9 k1 J9 D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC); g5 r7 b$ l% d, m
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 J' e$ Q1 Z9 s$ D" d! x , x: c& Z& y/ O. e, R
if(fd < 0)2 {! X7 m) Z) |! e* }
{, T& T7 B5 s) @) p; s
perror("open failed\n");
: m, a6 P. C/ ?# w return -1;
6 i$ o+ V7 t. i5 E }6 t3 a" T i0 ?0 |" I8 g
2 F; {% X8 ^% d while(1)
" |- J* M# N7 L( ?5 D* Q: |. K- a {2 @. P$ r* u, p7 v
$ i, g0 X+ e3 z, |3 T5 Q //AMBE2000每次读写是24个字为一帧
. F$ f& }$ A; w1 ~# F, [& f2 m //写数据时将数据在底层存储起来,等到中断的时候再发送5 f4 P2 m, B+ v; r0 M
//AMBE2000输入数据是以0x13EC开头的
! A W* o% M/ K! } write(fd,&data_write,sizeof(unsigned short));4 \! b. j2 q- X+ i9 f
& j+ [$ D# T7 w$ D3 b //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
; F+ S7 `* X% O* b read(fd,&data_read,sizeof(unsigned short));# Q) V. Q* A- u' W! B; B& C8 \5 P0 s
* n9 Y( m, x( T, Y
if(data_read == 0x13Ec)
6 Q( `" J; {: N& E$ w2 ` {- p7 D) i8 @ Z, {; Q- ? ^( ^
4 }1 N( i& V! F( k4 v9 V/ \" P printf("data_read = %x\n",data_read);& l# \1 \; z3 k3 a
}2 d9 S% z: H% w2 v; v
1 u! r) \8 L$ A. [0 A
msleep(10);, Q8 }! y6 ?* Z; f0 `
; v& L! C% _+ [0 q* R& }# u /*
4 Q# |; S* J! o6 P0 j, h! w4 `* l ioctl(fd,1); ) |, Z* y; e. g {6 Z- o! v0 @/ d
sleep(1);/ Z) h n# t+ D" g
ioctl(fd,0);; W9 ?/ M. }) c% D: R, Y6 i
sleep(1);
" D* S5 y# M Q6 D, N1 X */ " B* |3 b& g7 \ D- ]9 Y2 A
}
' R N. \- C6 A' U0 e3 E5 K return 0;" P& |6 e9 E3 ]- }$ a1 C
/ _4 @& J3 N! c; V
}
& ?+ {5 Z8 E( s1 e4 s' L2 P E; v+ _6 t9 q$ m
多谢各位指教,谢谢! 急
: D6 b/ I. \- @# b
' d& u) Q- i& m, ~" |! k
. Z/ L; o: A% c0 q. i+ a% J
1 a ^& B6 U* j# V; Y" A) @
5 |0 g' ~' K' ]" |+ w4 ]8 W6 X2 Z; Q/ @0 C1 `% D/ P! q- s
|
|