|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% q& z0 [) s/ R# o6 ^/*
$ L% |. G) d# N: {# Z. W. a1 C * Copyright (C) 2009 Texas Instruments Inc0 a( o$ w0 k; }! r3 F9 K
*4 @ z; ?" U. l. z6 F& J6 T
* This program is free software; you can redistribute it and/or modify0 D/ @' w- Z4 ?- L+ ]( _
* it under the terms of the GNU General Public License as published by4 K. @! i9 u0 ^6 N
* the Free Software Foundation; either version 2 of the License, or
1 Q" i2 r4 D5 V+ p * (at your option)any later version.$ s5 y1 Q" g" Y- ^2 g
*$ N5 ?9 v% o, l2 C
* This program is distributed in the hope that it will be useful,9 R# T" ^/ W3 u( A; I
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 L L& _+ a; ~9 G; a
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
, l* |7 Q. f! ~ * GNU General Public License for more details.
7 \2 T9 c0 B+ p( W( t *
4 M7 z2 S( E0 R5 L * You should have received a copy of the GNU General Public License8 L; Q5 F e) y! o
* along with this program; if not, write to the Free Software4 h5 y+ ^6 D1 A4 h/ x/ h
* Foundati
# w9 o- _- s) o; K( _*/$ M( y; z1 k6 G8 \2 ?$ M+ w
#include <linux/module.h>
! L/ J$ ^4 Q* h# D. s6 I, D#include <linux/init.h>
2 M, f6 g: |3 I1 `2 k n( r#include <linux/errno.h>
) {0 Q/ o& P Y#include <linux/types.h>
7 [+ d; `0 |7 A9 H# b#include <linux/interrupt.h>. s3 W$ T, }; j: C+ i# W6 d
#include <linux/io.h>
0 @8 j3 @) u7 h0 p7 {#include <linux/sysctl.h>
9 N5 M- h5 h! J' s5 s6 K" r#include <linux/mm.h>
( J& {. [- i: [5 `( G5 i& M1 a#include <linux/delay.h>& ^" r* {5 L) [+ x
#include<linux/kernel.h>& p4 |- M" ]& l$ X3 G
#include<linux/fs.h>; b- x0 o2 s4 n% ~
#include<linux/ioctl.h>0 }+ R' U# T0 K; [0 [$ J. O% y
#include<linux/cdev.h>
0 @% e' z* Y. c! e" N& J#include<linux/kdev_t.h>
9 q1 o9 N7 b1 D+ l' f3 ]& m#include<linux/gpio.h>8 k) z# t9 b" W. F6 m' p
#include <mach/hardware.h>8 f* B4 J. T9 B6 k; X$ @7 D4 N. v
#include <mach/irqs.h>
$ Y3 B. m9 J* L+ S5 F9 h* R2 l4 t Y, Q6 ]
#include <asm/mach-types.h>
0 q* S/ e4 [2 O' {7 j* c#include <asm/mach/arch.h>- w+ E) B- a g, l) ^# ]6 b' V" @
#include <mach/da8xx.h>
- k$ X3 N# I# \& f5 Q8 ~, E#define SYSCFG_BASE 0x01c14000
) V0 M \2 G0 k# p" v3 d#define PINMUX1_OFFSET 0x124 7 y9 c/ R d3 g! J
#define PINMUX18_OFFSET 0x168 5 b) h. g2 E0 \) z
#define PINMUX19_OFFSET 0x16c
$ s' j& X' C t#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
4 Q; k; k" h, y: H6 F* @#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
) P M7 ^% A- u T# @6 o! @#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
" f+ s5 ^* A8 c#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
\4 s! M. H4 \7 A#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
4 N* Y3 C2 q/ F
; J2 U9 l3 z3 Y# ^% f, y* L#define DXR_ADDR 0x01D11004 //MCBSP1_DXR% `% p; f/ X! A' X4 a( Y
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
/ Z# Y! M3 F' V2 j6 i( [//PSC) a. y) X& ~" \* b9 a) }5 a7 o
#define PTCMD_ADDR 0x01E27120
0 c2 D# w+ p( H#define MDCTL15_ADDR 0x01E27A3C$ b/ ]3 i* n, B: \8 f
#define PDCTL1_ADDR 0x01E27304
3 i# J5 N( u/ C9 S& y9 d//GPIO8 direction7 H! a! r& Y* s) l6 v; j/ g* B
#define GPIO8_DIRECT 0x01E260B0* J; A. x }9 a5 o0 V1 K
#define GPIO8_OUT 0x01E260B4; q r" h; L; O; T5 l2 a; q+ k
#define GPIO8_IN 0x01E260C02 x! G+ L# a" [: l9 @
- f! }$ x/ C1 _//#define MCBSP1_RINT 99
% X* K$ ?2 J0 C" _( Y7 f" ?//#define MCBSP1_XINT 100 # W( ]4 p. ^( K1 s5 l) }; ~# N
static int MCBSP_MAJOR=239;; C- a# q( s' S3 b2 h6 P% Q
static int MCBSP_MINOR=0;
4 B. m/ W k' V% ?- mstatic int count =1;
% _3 o H E& V
( u$ C8 B F' A$ ^$ e0 m G5 B8 q#define MCBSP_NAME "MCBSP-device"0 `. }: Z1 S+ Y
' n- b6 B& k$ ? Y, q7 h5 G
static struct cdev *mcbsp_cdev;
' V0 @' r% I& |/ a; h- q, w) istatic struct class *mcbsp_class;
9 W* x# d1 M4 zstatic dev_t mcbsp_dev;
9 j# N2 b+ W+ |; x- N; i' x% G) {unsigned int DRR_data;4 h% x5 ]: N! A0 C- h; ?- a
unsigned int DXR_data;
+ Y v' a, S* f0 G" L9 Fstatic int mcbsp_open(struct inode *inode,struct file *file)
8 W: N& s2 G$ U3 v- F2 Q2 d1 `{; f6 R% w( {, K ?% g
- C2 N) Q$ R: U$ L6 N //interrupt enable,initialized* ^+ S7 e P+ X, U/ [# N; w6 U5 h
unsigned int temp;
1 L( C( d1 v r2 E6 } //SLEEP_EN(GPIO8[10])---0
2 Q' N; c4 D. V) t& t+ {* F% Q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, Z6 P( p: E( u( L temp=temp&(~0x00000400);( o7 @8 q0 _( s; r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( o$ G% \- ~/ B7 ^# a
//RESETn(GPIO8[8])----0----1$ N% n& k! w! o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' o% p3 N) ^' p ? temp=temp&(~0x00000100);9 t: e) u. u7 j* n
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ [2 ?. y4 `3 f/ M( d+ [
udelay(100);
+ O* ^* I& a" \3 A6 s4 Q' q temp=temp| 0x00000100;' V( L; o N- e6 C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1 j1 k# k" @5 ]
udelay(100);
) Y$ L1 z/ m0 J printk("open success!\n");0 G( w% N$ }* {3 x: e/ {% `
return 0;
, \. v8 K9 {1 g: H}. c' ?' v9 Q* s" t8 @- {
9 V% i' }# K- i5 N% A5 m4 O
static int mcbsp_release(struct inode *inode,struct file *file)
1 I ~! b0 E7 O/ z{8 N: i7 m8 m- f' |
printk("release success!\n");
/ E' q9 ]3 w/ a% `' d/ R return 0;
% L, y% u) `5 i$ F/ e; l+ c}
! `5 R+ G/ ]8 q4 B% L7 p; [" H9 j# p. z7 A8 X. Z8 ]: g v9 H
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 _1 V# ] i6 j' W; B
{
5 s2 d4 u% X: }1 j/ N5 _ copy_from_user(&DXR_data,buf,len);) m K. M4 I) }1 C3 g2 C
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* ?! ~- p8 {* B9 G( o9 _- B return 0;
! Y' N4 s4 m% t B8 N6 _1 o9 _ 5 `% A: ~4 C- P) L0 J6 W6 O# U, ~
}# a9 T& Q& V- L1 _2 B' {
; d: o# ?0 J4 {$ R7 W# S! G, s+ W( P8 estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 `" Z& ^3 [) Y; R{ + ?! Y9 M! _/ b8 ` R
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: g7 C* w- ^: P# f- _ copy_to_user(buf,&DRR_data,len); 8 z/ G+ I9 |0 \1 C7 V" |
return 0;
3 \4 p$ t! I5 s H}
9 Y, \; d6 {. n! S) P9 q2 @0 q8 O% Q( Q3 d' X! v/ M
6 `* W3 y* J( n% d. ^, K6 n$ ystatic struct file_operations mcbsp_fops=
+ l& {$ U$ z; D( X% t% R{) q( l/ t7 J$ y* b* {
.owner=THIS_MODULE,6 t# w1 Z' M; M" `0 [. s4 n, b
.open=mcbsp_open,$ D5 r& b7 |# ?- N5 K- v7 F
.release=mcbsp_release,
8 C+ I" b- p( D9 M6 ]6 M! l9 d+ h' l .write=mcbsp_write," P. g) P; x0 e$ n0 M& g
.read=mcbsp_read,
" V3 ?" [0 t9 Y% \# b0 L};: V* M4 c( `" I. @3 w# ` @
static int __init MCBSP_init(void)4 f1 n7 s3 k& Y4 s1 p
{
( ]0 i! f- ~0 A& c! R int ret;# c9 g0 A# T! ~; |3 Y1 b& a7 z1 E" \
unsigned int PINMUX1_REG_old;
% S3 ?. z; M5 p( Z/ W unsigned int PINMUX18_REG_old;- I, C% P) t% t; v
unsigned int PINMUX19_REG_old;/ B) F0 Y2 O9 c
unsigned int temp; : S0 k: m8 \3 C! x
if(MCBSP_MAJOR). ?& J: K, U0 B5 o8 i
{
# c! R! c$ a) S6 T mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, N- P$ v" L# C" s/ v ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);+ N$ |! w. s' w# a- M1 t* {
}6 ~7 D/ G+ ?; ?/ M9 T- h
else' ^' G8 P* h5 x
{5 c" h$ S% M) F4 E/ _, e& s4 y8 X# M
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) X$ W0 |/ x1 H! n
MCBSP_MAJOR=MAJOR(mcbsp_dev);) y4 H4 E0 y; }2 {# V+ i
}
( a1 x7 R+ p; ]1 U p7 a* q$ O
& u) Y9 o& c2 j1 g3 D: o if(ret<0)
) e2 P, D% ^2 {! L {2 R* b+ ?6 Q& }) s, O1 I& X6 w
printk(KERN_ERR "register chrdev fail!");/ D9 l) c% z+ k7 I' R$ l
return -1;2 s* N( p( r W9 w
}
. Y) J1 S0 V& J0 [ A! ?; e) H( q ) c" s& r4 U8 D7 n( C; s1 k' B1 d
mcbsp_cdev=cdev_alloc();
$ X2 O: |& F! _3 ?: Q8 w 2 a8 X5 A8 B( P
if(mcbsp_cdev!=NULL)+ X! c9 }2 Q0 H9 u& w6 C- v
{4 h3 k, X/ G9 z, D0 }
cdev_init(mcbsp_cdev,&mcbsp_fops);
+ }2 S" q1 k* C1 E mcbsp_cdev->ops=&mcbsp_fops;
* y0 _- e& R+ T- i, }4 ?# h mcbsp_cdev->owner=THIS_MODULE;' {* B* C8 @+ d* H7 r2 x+ D' ?& Y
/ a6 Q# d! i6 S- m' Y5 Z! f if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 i- }% P, _* d
printk(KERN_ERR "register cdev fail!");" P$ X% y4 v, S. s/ x4 D7 A
else) b9 G4 l* F+ [
printk(KERN_ERR "register success!\n");
- h4 U4 v& a' i" V }& M( C' W0 O0 z, U4 ? q) U2 M" c
else; U" o ?$ v' t' q' I1 P$ \
{( H9 b' C% p S, W3 ?& \; \8 F
printk(KERN_ERR "register cdev err!");
: u! q* \ S1 A4 s return -1;. P8 {/ Z+ B0 h2 {1 b( V
}
3 E9 v& `) {& n3 ]' }
0 _: ~* w w9 X# O mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 k. W" X# j5 T if(IS_ERR(mcbsp_class))
+ _1 @3 I8 l# e7 L. O$ {% | I2 y {6 z+ `* f/ W* ~
printk(KERN_ERR "register class err!");
' c; F7 ]: d9 N return -1;- W( W5 n) Z/ a' q, ]9 u3 }
}% C4 g+ o3 b1 L9 J$ X1 t4 h2 r" ^
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- Y, _+ V; I5 e& K7 b& Z% G
3 ^$ W& t7 }8 N. o0 p //PSC
% W8 k2 J R7 h7 k; w6 b5 K0 f //add Enable MCBSP
3 H' @: @2 L* ^8 d% I //test
$ u; h" j$ K8 T Z" L temp = 0x80000003;$ H% ~& E/ v) x6 k" {9 N) Z
writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 O# e4 Y1 S" S" y
temp = 0x00000003;, B* _5 \" m1 E- @5 @5 }8 A
writel(temp, IO_ADDRESS(PTCMD_ADDR));
& j3 f8 c! v3 X5 O8 t" ]1 p+ K
4 Z- X5 R+ p1 q) T3 e temp = 0x001FF201;
* `, M0 x' @/ [) L- R" ? writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 s9 t3 u7 z( i2 J( ]3 M& X
, H3 I7 D# q9 |. X/ F //PINMUX
8 f8 L" G* P; k; z0 V //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, N$ f$ L+ d2 Z/ W PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); - {( [8 `: n& ~& }( T' `5 t& N6 h
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ! ]; ^2 E" N# g2 _$ \ _
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* P. F/ }$ c" j% F1 c+ w) { # r5 {& o/ J/ d" f
//SLEEP_EN,EPR,L138_SHK1,L138_RC2 p" h6 s9 P! F, U5 J* I# c* z
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. c/ k v L# W0 H6 ]. J PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
7 F8 D0 M: j( M0 R: f writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
X2 f: E, b1 M
) o, B- u O# m! Y- H! c //RESETn,L138_SHK2! Q1 z* ?# I5 C0 X8 ]8 Y
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 a" m$ r! @) O3 y* Y PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
& X! F8 ^% p& N2 j8 C. d writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 _/ l6 [, ]* n & L; r# i; U) e4 T% \2 `
5 j0 s2 B; ^% I1 v //SPCR Register/ s+ v3 t" Y8 N
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset' o) q* G! W% m- V% [, x" Y( U: a4 Q
temp = 0x03000000;//(DLB=0)
* ? j0 L1 F' n( j // temp = 0x03008000;//(DLB=1)
# S" J& s+ ^- N" ^4 j writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
& `; K: v3 L% a temp = readl(IO_ADDRESS(SPCR_ADDR));2 ~6 |( R( x# J& x0 ?7 q$ R: @! p/ }
printk("temp=%x\n",temp);, G8 |3 M% I, C$ G
% y- n; _. n+ ?; o
//PCR Register% H. _3 v! O6 w$ K
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ V! s1 t' [# d1 S1 g. _- Q
// temp = 0x00000F0F;& R. t, j$ b0 f
temp = 0x00000B0F;
; o$ P. \% r* @# v! I) M) v2 r) W writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ( f+ `$ U7 W8 X6 r/ E7 g' v& l* y
temp = readl(IO_ADDRESS(PCR_ADDR));: `+ r" P, }/ s. d9 L
printk("temp=%x\n",temp); : F% l6 B, j( X* A1 _* H
//SRGR Register
1 S$ w) |- Q& S" G* }5 d- P //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 K. a+ B" ]! Z4 D3 Q
//temp = 0x301F000B;' i# V" _5 u1 r6 G) n8 e3 b9 `, @
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
x, P& v) q1 l5 c/ i temp = readl(IO_ADDRESS(SRGR_ADDR));' @8 T. a/ S* j, Y- K* ^
printk("temp=%x\n",temp);
! t! U, i( q5 g) b/ W //RCR
+ x4 E4 o) d" L$ i0 i; M1 ~ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 B3 W* W7 t0 b/ z& Z P1 ?. ^5 P% _ //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 C3 \+ ~. a" z
temp = 0x00440040;
' u" K- i9 n3 p writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized , K0 | x3 C& o1 @" ~8 U$ w
temp = readl(IO_ADDRESS(RCR_ADDR));6 E, u* B1 J5 I2 n+ I
printk("temp=%x\n",temp);
' a2 C) m& ]9 {- k( l/ ?4 f //XCR
9 u& T6 _, D A- P //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
# Q7 x) @5 d. b% O3 U- s //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: v! E6 O- n0 G8 v F. B temp = 0x00440040;
8 }* w6 Y& s0 h9 N$ j3 o5 ~ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ o9 [8 D- E6 U' |, w5 q6 N temp = readl(IO_ADDRESS(XCR_ADDR));5 n- L6 ~' x: R" g: X
printk("temp=%x\n",temp);) C2 V& `* Q; s0 ]
udelay(100);
. t* @: L/ A2 s$ M //SPCR Register' c* E- w1 A, z: ?" e
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: y6 Z, ]4 n9 W" H; C: }* O
temp = 0x03C10001; //DLB = 0 VS DLB = 1' i# d# I9 r" S6 V2 C
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
" t4 @: u" [2 |* x; F9 d temp = readl(IO_ADDRESS(SPCR_ADDR));
8 K+ V- P, Q$ e: | t' _# P- s printk("temp=%x\n",temp);
. S4 G+ I. l7 @ udelay(100);
! G ]3 @$ a5 C$ H! J; O0 z# }) {# E! S
//set GPIO direction
- { D+ S! d, c& n' `/ ?2 c temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( q+ h( z! `, {1 w8 f
temp = temp | 0x00000100;//EPR----input( v) H" W) N3 c# i
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' H! c; |1 v7 p __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
8 M* e" C9 X1 f) v7 }% B1 s1 t. W1 B
8 U/ {! C9 [: @# q+ G. P return 0;* D5 z& C9 w" f1 R
}" A( r) L: e" e- \
static void __exit MCBSP_exit(void)+ E3 e* _. u: m9 N4 y: I: w' e
{
" A! v. ^' m( Y* ~ printk("mcbsp chrdev exit!\n");) o% ^) R! ^5 J" d4 K/ U! r: I
cdev_del(mcbsp_cdev);
( |. {9 D7 x* n( T9 a4 L: | unregister_chrdev_region(mcbsp_dev,count);
C" p0 Z9 T8 q" b- W device_destroy(mcbsp_class,mcbsp_dev);. x" L( B; q: e4 c1 Q
class_destroy(mcbsp_class);
}: X2 x+ c1 W! x3 u. l}# Z! u' }5 W$ U4 f/ s! V% i! j+ J
module_init(MCBSP_init);
1 x; c8 ~9 O2 V, ~6 Dmodule_exit(MCBSP_exit);0 \: c) o2 l$ H' M+ y+ q7 B1 x
( B: q: @3 u/ g/ sMODULE_LICENSE("GPL"); A4 I* Q( U( r; S+ {
9 Y5 j g5 h. o- C5 }' Z
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。5 P& a3 S9 r: w9 ^, q: p* _
我的应用层的测试程序如下) K q @5 S K* K9 `) ?! F
#include <stdio.h>
% X# j! X# o. a5 ?/ b#include <string.h>8 U' r4 P+ F K* x9 s
#include <fcntl.h>
% o+ Y3 P! B% Z9 q( s#include <unistd.h># |9 @& Q1 p7 { w
#include <signal.h>( k0 w/ i3 m. V- o' b
#include <pthread.h> //线程
- v! n i' Q. |( |+ F#include <stdlib.h>
: Z: {4 i+ L0 e3 c2 n8 Z5 N#include <pcap.h> //捕获网口数据
: v1 w! m2 V0 g, T0 V#include <semaphore.h> //信号. n5 m+ R1 ~! X
#include <sys/types.h> //消息对列
" L( S& R; \* [) I" ]9 ~% t#include <sys/ipc.h> //消息队列
0 x+ h" t; G% b7 Q' }#include <sys/msg.h> //消息队列: p& a. x9 H7 v w
#include <sys/select.h>
' \; {+ `$ J8 ]: S; W0 y#include <sys/syscall.h>! j& {) p7 F$ V1 q0 L8 y# {% {+ E
#include <sys/stat.h>- r9 r9 J+ Z4 t% j" l/ Q
#include <sys/mman.h>. W6 w3 _/ Z% a y3 U6 n
#define msleep(x) usleep(1000*x)7 m0 n1 V/ O; s7 l
$ ^, K' J$ }6 V" q# Gint main(). E; D5 x( m/ @3 ~$ B
{
l% N* Z! i$ x4 C# A6 R //MCBSP,ARM与AMBE2000交互设备. b- }( G n* H7 |5 V( F- R" j2 @
int fd;. a4 B% \5 U7 w1 J, |" O
unsigned short data_write = 0x5555;
M- e% @4 D1 w: U8 S2 d unsigned short data_read = 0x00;& W( s6 R! U6 E0 k, a0 m) Q `
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ L" o" p0 F1 r, }& X" d. l
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) f& {( d+ i: L) O- p ( n+ O' L+ L% |; J4 O3 t
if(fd < 0)2 a: u3 Y0 `* A$ [7 H
{4 ~& z: z; X. P- d! r/ A5 K
perror("open failed\n");
* ?: P; I4 ]: N7 s1 f, v. v/ W return -1;0 R& l7 n6 J) q7 z2 g
}
# s+ u( p7 s$ K( O3 D ( H4 C6 o; |/ t( u
while(1)2 U! c4 X2 i$ E7 Y/ [8 o+ I; e
{
! u4 }- Y9 q' I. f9 K9 E
; Q7 M1 Q8 N) Y8 B& e1 |/ P/ [ //AMBE2000每次读写是24个字为一帧
& s1 b1 ^1 Z- F/ A% x) h //写数据时将数据在底层存储起来,等到中断的时候再发送
4 a# L' H, B% Z //AMBE2000输入数据是以0x13EC开头的+ ^$ m" S: g! A3 ]5 E
write(fd,&data_write,sizeof(unsigned short));
) }" f0 Q: k- y& s; |* Q$ O3 e
; M' q; q2 X) l. C' ^ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 B9 w9 a3 d+ H; A: W
read(fd,&data_read,sizeof(unsigned short));
% [% m3 C5 v. j- E6 ~) s5 b( k+ i- y # o4 T4 a `. a/ D
if(data_read == 0x13Ec)" v& B9 ?, W0 f
{
9 U: m0 a) G; h( `/ ^/ K" V 5 Y' \+ M' W. V* _3 E4 { O
printf("data_read = %x\n",data_read);
1 Q; P- F! d; t" a% R }
! V! ?1 W) T. `
/ x: ^2 k9 W) |) ~ msleep(10);+ r3 v( N6 H) `: ~) J. Q
. A- s' S) K6 @# v /*
2 ?$ B' D0 U( q/ k+ s" V% e ioctl(fd,1);
, @" C7 g% ]0 T" G" H, c sleep(1);8 [+ x! @9 J1 X1 N0 t/ L. V
ioctl(fd,0);6 w- o% g" U9 S( S0 F
sleep(1);
: [3 |. e$ J% r. N) s, L* \ */ 2 P' l M4 K" }
} 2 v4 h& v* J% o- K" e; I& o' Y
return 0;
6 x9 u' m& w* E4 Z4 ?/ c3 B
- B) Y/ b) A4 U# f0 c}
9 _. p' i0 c9 S' Y" J
- X k0 G# d* k) C _$ W2 b& t, A多谢各位指教,谢谢! 急
( A/ d$ C, b: O% Q' ]- n% H% O" S
: ?" J$ O0 \2 y. j, Y/ z7 O9 T! f' M# I$ w5 ]
' m6 L6 T+ q; j* r; w/ U; N% b) w( m5 S
/ u0 k/ m! Q5 W) _- \* m: Q- | |
|