|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: u. Q! p! a' g' O% ^/*, x" j3 ?% k+ A q
* Copyright (C) 2009 Texas Instruments Inc
# h+ x! s+ V; J1 B+ k& l, V *
) `/ R/ P: \% y* x( C+ E * This program is free software; you can redistribute it and/or modify6 ~4 Q; }1 `0 [8 p& z
* it under the terms of the GNU General Public License as published by; }) v' q+ S3 r U5 v
* the Free Software Foundation; either version 2 of the License, or( M0 ?- t# R' @9 z$ p+ M O
* (at your option)any later version.9 v7 `: n) }5 _- O/ N
*
8 u6 W/ S! l6 ?5 W, D * This program is distributed in the hope that it will be useful,
3 W( F; T/ |: ]9 ?4 d; T3 `; ~ * but WITHOUT ANY WARRANTY; without even the implied warranty of: Y% c& E' q2 i' v7 Z- z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 M. G6 o& u$ k: K9 n' k * GNU General Public License for more details.& k. A; O$ O' h% q0 W" x' X
* q# h, V3 `1 }) y
* You should have received a copy of the GNU General Public License1 d0 [: _; y* J3 d- G
* along with this program; if not, write to the Free Software" `# |9 h, D2 m, @7 p
* Foundati# ? q! Z- h, ~/ E. u4 `
*/& N5 d( I4 R ~; p! D" R# L' e. k
#include <linux/module.h>3 N) y" j% w! S7 k `3 Y
#include <linux/init.h>) e# J8 U$ y) \# q" ?/ J% a
#include <linux/errno.h>
$ f. b' m7 R( `8 t( ^0 |#include <linux/types.h>
* c: T% N, A- F& a* }" w#include <linux/interrupt.h>
- f+ Q6 v: W, c9 C#include <linux/io.h>
" _7 |8 Y7 T3 Q" h* T) |#include <linux/sysctl.h>4 B. |- _$ x9 Y7 M. F' R; u
#include <linux/mm.h>9 {9 ?1 E2 a5 ]) d
#include <linux/delay.h>
w5 B/ K8 N& c9 I#include<linux/kernel.h>& ?. [9 D5 x, V+ k: F
#include<linux/fs.h>
: T& N6 k" ^: h4 |#include<linux/ioctl.h>
& U* O. i6 V) X$ n#include<linux/cdev.h>! W1 b2 ^( w- C) U5 y# }
#include<linux/kdev_t.h>8 g% ]7 \& D+ r, d: V! }
#include<linux/gpio.h>
+ j" K9 M8 u; z: y% D+ t#include <mach/hardware.h>
; l5 l3 z( W" n#include <mach/irqs.h>
6 A& F" t$ v* `6 u/ T
+ z* n; M" k7 M: s- h$ x/ w, @% W#include <asm/mach-types.h>& \& q$ u( e, r) _/ j7 d0 |
#include <asm/mach/arch.h>
# e% l/ T7 v& |" |$ T# k3 [#include <mach/da8xx.h>
+ t+ z) }1 U: R1 w#define SYSCFG_BASE 0x01c14000
; G5 l3 U, x+ p! `' R#define PINMUX1_OFFSET 0x124 ( K) `2 Q2 Z$ \6 z
#define PINMUX18_OFFSET 0x168 * l+ L6 |' d7 ]( s; R) J, ?$ D
#define PINMUX19_OFFSET 0x16c1 r3 }/ i4 c3 R; ]+ v+ v5 ^0 {
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR1 R( } Y# ~7 _- _
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
2 P8 X1 `' a; L- j#define XCR_ADDR 0x01D11010 //MCBSP1_XCR. i% B( R9 w9 D& W
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
" I- j$ Q7 Q! S: C7 V#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' b# |% e7 Y% t# O8 A
?; A6 |! d/ |8 }& C4 V9 B) L
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
; q C7 ~ |: J' t#define DRR_ADDR 0x01D11000 //MCBSP1_DRR6 ]5 B& Y3 g( q7 R& M9 v8 S
//PSC" U6 o* k( z- O0 J
#define PTCMD_ADDR 0x01E27120
9 U4 q8 g" y2 J+ n* H#define MDCTL15_ADDR 0x01E27A3C3 `6 D* R+ Q8 W- t+ V: ?0 H
#define PDCTL1_ADDR 0x01E273047 B; L3 R2 ~; Y& U0 E9 O
//GPIO8 direction
& s# i. `4 \9 m9 ^# D& O; r#define GPIO8_DIRECT 0x01E260B0
1 O# K3 V% E% s0 d& K" k! t#define GPIO8_OUT 0x01E260B42 y( L0 G0 L. B1 W$ L* B' l5 I
#define GPIO8_IN 0x01E260C07 M$ |8 J$ L0 ^: \/ v
) ^7 ?# V/ M. ^' E2 V
//#define MCBSP1_RINT 99
- H l" t; E& q1 ^4 c, e H7 x* D//#define MCBSP1_XINT 100
: k' O* {% {8 ?3 mstatic int MCBSP_MAJOR=239;0 L ^2 q+ K- @ A3 O1 P# O
static int MCBSP_MINOR=0;7 s# h; Y% U: b2 r* ^! M+ U
static int count =1;
4 [$ t7 D1 }' @6 \2 }
, S" g# v6 ~# r9 }6 P#define MCBSP_NAME "MCBSP-device"
' a s4 A9 F7 ^3 W, @( p0 k! g; C4 l) V; B
static struct cdev *mcbsp_cdev;: l; o8 G, h) Q0 d* `% F& e
static struct class *mcbsp_class; ~/ `$ S' x+ ^( c; d8 F/ d% o5 g
static dev_t mcbsp_dev;- @' r4 [$ ? g% t; e3 s }
unsigned int DRR_data;
$ c5 N% V9 I4 N& ]/ i- v% D4 ^unsigned int DXR_data;
1 y0 V) ~1 Y! L. l# _static int mcbsp_open(struct inode *inode,struct file *file)
3 D( O; ^) }7 q# \% ~; |/ v{& X0 r8 q' u" U4 v5 l) ]1 b
) |1 S: E! _' D& h. A9 W$ @( t //interrupt enable,initialized$ a6 b0 i% J: L c& F9 {1 w6 V. h
unsigned int temp;
# S2 a# {; J$ S; o //SLEEP_EN(GPIO8[10])---0
) ?- P( N; v$ o" D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: L- \' P, C7 n# H* b
temp=temp&(~0x00000400);# ?9 y, S" m7 d( D! [+ @" ~# c$ J
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 q( R. A) t8 ]! ?+ [5 ], g( p: o
//RESETn(GPIO8[8])----0----1
6 ]) }# w/ i5 C' |/ S( h temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 U& ]) L7 i) ~. ?, g* [
temp=temp&(~0x00000100);
, ] g8 \" D# @( ~/ @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# @( U* v/ J! w0 v6 Y2 Q6 Z udelay(100);" v! C' l4 W- Y5 _ Q
temp=temp| 0x00000100;" q0 a0 f, v. F+ b5 W
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" }' Y: _$ o. H' ` udelay(100);& W. ]" i6 W/ D# U3 E' p
printk("open success!\n");+ C4 h& v3 A! y [; | _6 |
return 0;8 k5 ?6 L: H2 o( [/ X
}, u, h& q- ~9 {: N) X
% J. _1 ^; ?: X; r1 P
static int mcbsp_release(struct inode *inode,struct file *file)8 Z+ D1 `; Z( Z
{) ]' S- a+ ?5 q8 v
printk("release success!\n");
2 o. c% |! }. t" P return 0;
5 A3 D0 `" _8 I}
4 R- C( Q. {# _, ^- u* e$ V) X! j' Y9 D0 h& ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 y# l1 G* @' v- w
{7 s: }( r6 v" J W' S
copy_from_user(&DXR_data,buf,len);
8 K5 B1 l! h7 u* i iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 2 v3 _. }3 @8 O0 W z
return 0;
" N2 j; Y) X% I: r
" E# ?/ \8 D& w5 I3 O9 ~}" ]* Q* F, S) c3 u! O
8 E4 W3 I7 m2 J8 t/ L& v+ |static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( \1 s2 H3 }0 Q7 U" V! x8 F
{ . b' z4 U5 a+ A; n) V. e/ N* k
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: l/ q; L. Z3 h" X0 P9 S0 ^% d4 K
copy_to_user(buf,&DRR_data,len);
9 i+ w& ]. H ]6 B$ U return 0;0 o1 v( W x6 H* q, x7 E
}
# a9 y! ?; r& y- J. `/ _( v2 A( P N
6 B! F+ e9 G1 M4 K }static struct file_operations mcbsp_fops=
& q5 f' F) n+ w& ^8 q s% Y{" y" T2 e8 @( O7 s
.owner=THIS_MODULE,. e u8 p; s/ a3 y$ L% X& b z
.open=mcbsp_open,4 u2 M/ P6 N# n9 M$ k* J5 t+ p" }7 L
.release=mcbsp_release,
R3 M2 {' ~* @ .write=mcbsp_write,
1 @3 M% ]* Q) Y7 B ~ .read=mcbsp_read,/ a9 b4 D u1 D8 R$ |% j5 ~" q
};: {+ y; Z/ q4 k9 ]3 [ U- c
static int __init MCBSP_init(void)3 Y$ C8 J# J, f# Y% G
{* V5 r' E- _) w/ W' h: o
int ret;
% e% p: V1 k& H [/ t9 S" y unsigned int PINMUX1_REG_old;- g$ M9 m. {- }1 H
unsigned int PINMUX18_REG_old;
4 C8 z$ z* D& d+ U( o& W$ d, _ unsigned int PINMUX19_REG_old;3 P( ]6 g6 C! X! t0 J
unsigned int temp; ' _3 ], \! o4 f9 p1 ]1 P6 d
if(MCBSP_MAJOR)( G+ }. j5 C. v Z
{, @. C1 _( i6 U$ R- @! f* \4 x, Y
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* `' v" l$ V+ b# m* q( P+ M% ]% d# E& { ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) Q% M+ F$ W) R- p- E$ w
}
3 w$ Z$ L0 U1 u5 S) p. G else
1 g$ `2 i* p0 r% U+ Q {
$ C# W2 `+ K0 ^% U. x M ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; r! |# W D7 N+ R MCBSP_MAJOR=MAJOR(mcbsp_dev);
v' n5 j+ F- X( ? }
% [* n1 G( r( k, c4 e- C. J) j ( W4 {! W% p! m: T
if(ret<0)0 m5 o) t& E; q
{
$ v5 ?8 V! c& o; x" A- f) H" |0 ?2 M printk(KERN_ERR "register chrdev fail!");
, q0 W8 z6 O- C) ~% o return -1;
2 z6 N) {( f+ }" W! N }+ o8 U' P i8 m0 Q# H
( }) L! }, N9 Y7 c* C& s' H& s mcbsp_cdev=cdev_alloc();
' H: J8 o0 V& e, L- d( w
2 A: Z8 w& O* w1 A: [* @6 P if(mcbsp_cdev!=NULL)
0 n/ T; e+ x) b% Z2 g( H/ d {3 T1 l1 T' O* m: p1 P
cdev_init(mcbsp_cdev,&mcbsp_fops);
# R$ U- x! [* t. D. L; e mcbsp_cdev->ops=&mcbsp_fops;# u! Q" h- P( w g
mcbsp_cdev->owner=THIS_MODULE;
3 _0 h) Q, u8 n! [" @6 K : D! `* ]3 ^$ B* E7 N
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! W) Z( h2 J- P5 [ printk(KERN_ERR "register cdev fail!");
. o# n' t0 s) h( ^# d# C else. g* M0 O" ^; e
printk(KERN_ERR "register success!\n");6 ]+ C, x) A8 U- s8 m$ s1 c. F
}
3 ~5 J" [/ u) R ` else( J6 |7 V; m8 m/ j
{% K# _( K2 S0 t: Q5 F6 ~# X, |
printk(KERN_ERR "register cdev err!");
. y5 P; c2 `1 ? return -1;7 x& C. [- P S, t- f7 G
}) |" h+ [7 l7 f, A) ]0 C! c
& ^' F, w5 A! t* A
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 g' \+ A6 s# a/ ]) M5 n. \; e# G
if(IS_ERR(mcbsp_class))' a# ?+ |; ]" z
{) G7 S7 \0 [; H
printk(KERN_ERR "register class err!");2 `; ~" C5 p$ n, d, E. |; F
return -1;
7 O* J3 |3 `" G/ B }
9 g. H5 N* ?6 @! g; r6 y! C+ ] device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ O1 D+ O8 w$ q
! S2 z9 v6 P8 P& ~+ q
//PSC% g: H: m Q7 G$ s! ~! K) T! ^, r
//add Enable MCBSP
$ t: _, V; G ~3 r: D4 u2 O9 i //test
1 Y- m1 n& I( W& _ temp = 0x80000003;
: F5 h- J, D9 e8 W+ v writel(temp, IO_ADDRESS(MDCTL15_ADDR));
, l% I# {+ M- B' p, o) L temp = 0x00000003;& C6 w; B1 K/ f
writel(temp, IO_ADDRESS(PTCMD_ADDR));; w# m* a& O% g$ k
, i0 t& W% d+ P3 q2 x. A temp = 0x001FF201;
+ Q3 k0 y) v9 }3 I$ ]$ A% w writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 O5 [9 _8 j6 M8 K# ~
/ I) A7 z8 K' l2 J2 N
//PINMUX ) B) V h5 \2 d# h& G+ m$ \% j
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,1 g' Q. ]! ^! C [) M* Y* m
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! \7 c+ D1 u; W+ ~ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , d( p' A, e9 U0 W4 R
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); p- y7 Z8 x& v
, Y& m: b6 i; o8 T: J
//SLEEP_EN,EPR,L138_SHK1,L138_RC& ^; {4 J* P6 f4 U1 `( w
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 6 m: ~: m2 R5 P
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 1 s# M3 r: e0 M# }
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" U1 G+ z$ d% c- y
; C* J" r$ d( v2 v //RESETn,L138_SHK2
3 {- ] n& Y$ u- K, Y7 C PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 Q/ }) w$ ^( n _ Q+ U$ Z# u PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
5 b6 Y! o0 d& T% S$ | writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 b+ m# E: x8 g7 h1 |
5 h3 K) f! h5 n% Z( h/ k' g& V ) Q1 f- n6 Y& [4 r0 B$ z j+ C
//SPCR Register) E3 q8 M5 T C) o- A
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 P) \% L r9 ^9 {# q7 {/ v7 h. g ~/ S
temp = 0x03000000;//(DLB=0). h. q1 v/ E9 V+ W' F
// temp = 0x03008000;//(DLB=1)
3 o5 O( t1 S9 _2 p writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
' x7 @) {. c: x/ R6 R temp = readl(IO_ADDRESS(SPCR_ADDR));, m- `# P( ^+ ~$ q% i2 D
printk("temp=%x\n",temp);/ z4 } x# o$ v7 f: l# O& ^
7 O) D/ d. h$ x# ? //PCR Register: Z4 ~+ ^. l0 i. c i
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
: J% ?2 b* l/ i2 E // temp = 0x00000F0F;
2 ^, i6 J3 u4 E% t temp = 0x00000B0F;* L+ S. y8 Q. P3 a
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + C3 N' C# b% P* V
temp = readl(IO_ADDRESS(PCR_ADDR));0 j, G. |5 {: E2 ?: ?2 l4 Q/ j
printk("temp=%x\n",temp); 0 A4 S# S) y; a* m( H
//SRGR Register
# |9 t D" G2 m //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: E1 f$ r0 r+ I' b, ^ //temp = 0x301F000B; k8 V+ f) {1 |. ]' C1 `
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ( L3 b; Q0 u, J' k/ X
temp = readl(IO_ADDRESS(SRGR_ADDR));
6 _- K' `. ~" {7 m" L- M& N. P printk("temp=%x\n",temp);0 S: z# p u9 }2 E8 a: Z
//RCR
7 K1 ]- m K% d( D: V7 G5 F //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! u, x+ s5 r0 c2 V3 g
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' d5 G# P7 P6 A+ t
temp = 0x00440040;% y, \0 J& x6 U7 d0 x; u1 D$ s3 G
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 3 N& g R: q4 k3 Z) ^# A6 ]% y
temp = readl(IO_ADDRESS(RCR_ADDR));
9 }0 N! M# R% t) A; B+ { printk("temp=%x\n",temp);
' _# I; a( s! f/ v* H% S //XCR
# m& T+ a/ N# K# A3 f. Q0 G/ K //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% J* H b6 M; i1 b0 _
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. L! B) ^$ N6 P9 {* D$ H temp = 0x00440040;
& R, m: v# t3 i- e, X writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized % S6 O9 U8 [0 W4 @: U
temp = readl(IO_ADDRESS(XCR_ADDR));1 s( O9 k$ Y- W* c! D
printk("temp=%x\n",temp);
; J. [) K+ ?* `2 y udelay(100);
1 S+ V7 q- ?* t a //SPCR Register" a2 w! ]7 E1 g! X: ]1 p6 M' H
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ b1 B( g7 b& x- v8 j temp = 0x03C10001; //DLB = 0 VS DLB = 1, e# |! p% _" {& o1 K% n0 F' x
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 p$ X' G" ?. Q$ q4 X/ K6 ], H1 q- t temp = readl(IO_ADDRESS(SPCR_ADDR));& S; l4 h9 X; l* Y, }* u
printk("temp=%x\n",temp);8 H+ S! P" l6 f b- a
udelay(100);
, t) U8 ]' [1 l( Q- q
" e6 r% ?; i8 s; x: I" t2 q5 h //set GPIO direction! p- i3 d, q$ m" W. w. o4 S( F2 W4 F: k
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' g$ _- `9 F; R6 K, j
temp = temp | 0x00000100;//EPR----input
* c R; ?1 j/ P; B8 D, z temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output T" a3 n: D& g2 G& ?$ O- Z# T
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - w6 ^2 @8 z; |& r6 V) A8 X: v
8 U* z4 m/ ^ l0 ^3 i+ ?6 D2 V return 0;. Y. x/ }6 n; u5 {8 w8 g
}
6 I9 r( M# ]9 ]" t3 e8 zstatic void __exit MCBSP_exit(void)4 c" ^+ ^' ~0 F9 o
{& b& t. e5 O' t- b2 z' ? l( Y
printk("mcbsp chrdev exit!\n"); I4 ^4 J6 K5 r) a# D( M
cdev_del(mcbsp_cdev);! T3 R9 z! w) z8 V: s
unregister_chrdev_region(mcbsp_dev,count);* [ m3 ?5 m# U' s7 n) F
device_destroy(mcbsp_class,mcbsp_dev); q$ p, u: |1 S$ z3 T M! O
class_destroy(mcbsp_class);
4 y1 c) u1 h8 g* d4 ^8 E}7 p$ c+ i3 z4 k4 e& b
module_init(MCBSP_init);2 ~" P _! o) b& \( t# r h
module_exit(MCBSP_exit);+ n/ v( Q1 {, j
+ y' ~6 u# K! s+ m }7 l7 M9 _
MODULE_LICENSE("GPL");; j# V9 I( X8 `( E( h
% y# Q( @3 y9 [* m: x我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
8 F* }% t# A- U" n T我的应用层的测试程序如下
+ ^' L! Z, }1 L#include <stdio.h>
/ K I0 ]9 F2 X- a% Z6 d, y. ~#include <string.h>2 }$ `; t# a& i$ W1 g
#include <fcntl.h> ]1 {1 _' i8 b% W e% m( I
#include <unistd.h>
8 W3 j, g: K2 E#include <signal.h>9 P5 E: g$ M s2 y' |8 s
#include <pthread.h> //线程 o+ u% u: R- K2 @/ c
#include <stdlib.h>
# ]( w7 X- j/ t" A5 y#include <pcap.h> //捕获网口数据3 @. s) U; `$ ~0 m: Z
#include <semaphore.h> //信号( x' @3 m$ B V L- y/ J' y
#include <sys/types.h> //消息对列
4 }+ S9 a( h0 y6 V1 h#include <sys/ipc.h> //消息队列3 i% X2 b( j0 Q3 A! ]- S" ?* m
#include <sys/msg.h> //消息队列0 f* u% G1 W9 F2 [6 y
#include <sys/select.h>
# G# x0 E3 S) k0 J#include <sys/syscall.h>) n- d7 N% V( Y
#include <sys/stat.h>1 I, L/ c& X5 T' @
#include <sys/mman.h>8 H. s+ {' h! e; ?
#define msleep(x) usleep(1000*x)
: p! D5 H# f4 U; p: R
n0 Q7 H) {5 P. Bint main()
1 y5 j. T M K$ l. m7 \{
2 g4 h2 I5 V; u# C //MCBSP,ARM与AMBE2000交互设备
7 X2 n( z0 j8 C1 I int fd;3 w U& M2 e- G5 W
unsigned short data_write = 0x5555;& ]+ b* c( Q7 m7 j7 X+ P8 V" ~
unsigned short data_read = 0x00;# c* Z! [2 H# ~6 k5 U9 S3 `
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 x' L5 z5 _. Y1 H // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ i) G* p( Y( N4 e. q: c0 d' B
L J( U# F% W5 \5 _, u if(fd < 0) T( n! K& P) j6 b& [8 b
{0 j5 V# s1 S9 R3 ^, Y# M
perror("open failed\n");
0 Y% \# ?' I, C) C9 q0 L return -1;- d# U( N8 N/ W% x! M9 t
}5 \% W' p2 C4 v/ T. k# D
7 N! q0 k# N8 i6 W
while(1)9 {* O1 \% A% G+ R5 k! U. F7 L$ q
{
8 M+ [% X$ i( u
- ^! G" }2 w M8 f8 r //AMBE2000每次读写是24个字为一帧
0 f) W6 n+ Z* P/ m //写数据时将数据在底层存储起来,等到中断的时候再发送
6 s; @" T4 `& [/ E2 S //AMBE2000输入数据是以0x13EC开头的
3 h2 n. O9 v7 W. {- N& K write(fd,&data_write,sizeof(unsigned short));
) _4 W& Z: V; X6 J 7 F* @: p6 a8 n$ ~+ u
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 0 E6 \6 y' {& P8 y5 s# L+ f% _8 V
read(fd,&data_read,sizeof(unsigned short));, v/ N& r8 [; i8 P/ M( h' b
3 c2 ?* {: k! H9 q$ t if(data_read == 0x13Ec)5 W/ m4 ~. ?- M/ s: ?
{
, A0 C4 y( G/ U. O+ V. n; _
: p9 q, Q" _. B2 Z B& x printf("data_read = %x\n",data_read);* ~) U% `: E# i- z/ J
}. f. Z& R# T0 k* v2 l
7 q8 K ]( `( x; s% X6 U+ m; K- y! o msleep(10);& M+ d" C) ~) V% A' m# C, q
- J9 O2 X/ Y1 V3 U1 w" q9 w /*
: y$ O2 [/ `, @6 A- d# \ ioctl(fd,1);
& z3 O! G! G3 k' n- O. m- Z2 K6 O sleep(1);
+ Y- Z. l! }! k: q0 n) Q ioctl(fd,0);+ _ }% \1 q' z1 l$ m
sleep(1);
7 h; T) I6 j6 L9 i m0 @8 u1 { */ + K9 M7 ?, z/ g8 S
}
9 p9 x" Y4 {) H8 y return 0;$ e8 _9 C+ I7 u2 U( H4 d
0 n9 Z5 P \4 @9 s! v5 k/ p}' E1 p, x. ]5 t* h$ L. o4 C
7 U! j3 u) N) }, e0 V
多谢各位指教,谢谢! 急7 c+ y5 E/ x. Q4 {
% A7 s3 m2 j; t; Q/ @/ \+ z4 k
0 h' h: o; p# F# Q4 q# v% J+ q2 l* U& `7 Y5 b1 X' l; C
& t0 \2 S* A, C9 Q! P( _2 a( v* j+ \
|
|