|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( P; g+ x0 Y6 {$ F- H/*" q/ D# r8 F7 K7 |" ^' T
* Copyright (C) 2009 Texas Instruments Inc+ Z7 s& Y5 X+ s t" u
*
! L6 ] L* {/ y * This program is free software; you can redistribute it and/or modify
/ Y% W1 |$ a% @: H) l" e * it under the terms of the GNU General Public License as published by% B6 L* ?) w/ P% f' @
* the Free Software Foundation; either version 2 of the License, or
! K/ Z% g0 f# {' z3 p * (at your option)any later version.
$ [- U( A+ N% o, M6 N *: F# u+ J% g3 p/ U& D% J5 q( v
* This program is distributed in the hope that it will be useful,5 [+ p- _; A, H
* but WITHOUT ANY WARRANTY; without even the implied warranty of% \8 ^; F$ p" x. i2 W' `6 C" o$ G
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the. e% x, t2 V, v
* GNU General Public License for more details.
2 v2 F5 x% Q% x, N4 ^; j4 ?9 t *! ^$ f" t& r' ^/ }9 H
* You should have received a copy of the GNU General Public License8 @0 X9 H- r* f9 o$ R
* along with this program; if not, write to the Free Software( W5 M# v% Y. x6 K
* Foundati! y% ~! ^$ P R+ {/ m
*/
3 R4 J( a1 L9 Q! I#include <linux/module.h>
2 A+ h' c8 w# j; ^. I#include <linux/init.h>
: s( @+ O! ~8 h& T2 s#include <linux/errno.h>
( u6 c$ A! x- e `#include <linux/types.h>1 D* Q% b" p% I {
#include <linux/interrupt.h>
8 j- v# l2 n# U* v#include <linux/io.h>4 l/ u7 L- w$ e( R9 t
#include <linux/sysctl.h>
: N1 w' ~4 k6 @6 h8 \. o5 C0 T4 Y: ~#include <linux/mm.h>
|7 p* D5 D" \. l#include <linux/delay.h>
) L! f7 v8 s7 s#include<linux/kernel.h>+ e4 D$ F. |" _+ v
#include<linux/fs.h>% g) Q N, l/ }* h9 o* L
#include<linux/ioctl.h>& Q* {3 `/ p: _- T
#include<linux/cdev.h>
# w2 w4 I4 Z8 {' V- j#include<linux/kdev_t.h>
& }. W, J# M# u/ T0 Z#include<linux/gpio.h>' K$ b, p# t0 n" Q5 F+ q6 v& n
#include <mach/hardware.h>: h: D+ ?4 `) |1 f3 y
#include <mach/irqs.h> l# y, n' q; g6 O
- {, g4 g5 b! |8 b9 x
#include <asm/mach-types.h>
+ t3 i3 |& w1 |; L#include <asm/mach/arch.h>
, L. m* D4 m' u6 J4 h$ k% K9 e8 s7 }#include <mach/da8xx.h>
) @/ q. g8 v8 z) J. I/ s+ Y8 E a. u8 u4 [#define SYSCFG_BASE 0x01c140009 _( }4 Z( Y( o2 E; t% i1 N+ A4 A
#define PINMUX1_OFFSET 0x124 4 t5 U3 o7 y j1 ]
#define PINMUX18_OFFSET 0x168 . W5 b$ X" b H& c0 R
#define PINMUX19_OFFSET 0x16c
z1 D, W" a4 t. n2 @) M( t#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% l; m. K, b) q9 F# ?, a$ |7 \#define RCR_ADDR 0x01D1100C //MCBSP1_RCR/ U) j7 F) x- A% l7 r/ w
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR* U, X4 ~& `7 U- W
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% c5 U7 b3 v4 N9 e" {4 I
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! J# Y$ J& k* u0 o
: w( v" O* A+ Q% o# {* t
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR) }0 W, C# T2 d. a/ H9 G: |/ Y
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
7 `; G" R r0 \$ V) X//PSC2 ^* o u0 N$ D( Q5 L
#define PTCMD_ADDR 0x01E27120 0 F9 H$ [+ l( X( V: z- c
#define MDCTL15_ADDR 0x01E27A3C
5 i8 I) v6 u! H: i#define PDCTL1_ADDR 0x01E27304
# y5 R J) u. u, ^' R9 m/ ?//GPIO8 direction
+ T7 l; L3 D, i6 C+ B0 i#define GPIO8_DIRECT 0x01E260B0
7 g' `- @/ i# L- l+ ]5 J: s#define GPIO8_OUT 0x01E260B4
0 q E" A$ V9 X$ T7 I: G+ R, R#define GPIO8_IN 0x01E260C0
$ S! ^# m O+ r d* Q
V) a1 p3 V$ a8 W- R- v//#define MCBSP1_RINT 99
# X' ^# q: h3 k% X! t//#define MCBSP1_XINT 100
- y( x0 H! \8 I1 _: bstatic int MCBSP_MAJOR=239;6 X" w! v( l9 A& Z3 v
static int MCBSP_MINOR=0;
- Y! I' Y$ O# P' p; Fstatic int count =1;
/ x) q7 ^' [* S$ K
( {) J2 H, {- _1 @% v8 g#define MCBSP_NAME "MCBSP-device". p% S4 B+ y$ t9 B& p9 Q
% S- D8 ]5 Q' b: e, kstatic struct cdev *mcbsp_cdev;
2 y; u7 M% ]/ @! wstatic struct class *mcbsp_class;
$ [$ j. S2 w7 fstatic dev_t mcbsp_dev;% H- ?, w6 M, P1 k3 k7 f
unsigned int DRR_data;
0 G% ?4 d: Y/ H' B/ ]unsigned int DXR_data;' c8 U0 h" @# E! b8 S6 J
static int mcbsp_open(struct inode *inode,struct file *file)
* T% I) s; ~8 p{
5 e9 C' u I+ c+ \# ^( c! p
: i O% m" S" g6 } //interrupt enable,initialized
. J' i' ]! R" v$ A% f' e unsigned int temp;
# u1 Q8 a2 n3 b+ v; e. E //SLEEP_EN(GPIO8[10])---0
9 r4 C' r! A4 o) t) | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% L; _4 D, B5 F* r2 q9 E, k* A temp=temp&(~0x00000400);3 h x% `% m( V5 j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; N$ \, G! l# ]3 F4 N5 {" N6 B //RESETn(GPIO8[8])----0----1
: c* `% n: N3 n9 S* D1 F/ B temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ w6 E1 K' r7 W! T0 ^: _; r" X9 I7 t
temp=temp&(~0x00000100);
# `/ K$ _0 \2 n# [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 Z q1 T+ o6 w5 c
udelay(100);# c& C- H) {1 s U
temp=temp| 0x00000100;
" o+ G+ ?* F+ r __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' R: _. Q. m& P! `- p+ x, H udelay(100);# m) x* `) U) {4 d; {. F( }
printk("open success!\n");
% e: S; A' A: G9 Z2 l# L return 0;
r0 c4 p0 u |( M$ ~0 p}$ M( B$ O6 G& R2 V3 V
$ F8 q6 a7 z0 @1 r6 Z5 \+ F
static int mcbsp_release(struct inode *inode,struct file *file)
: C8 [& j& \2 K! V" F5 h{1 G! `8 X4 P) A% n
printk("release success!\n");
1 p4 ?3 y" [! b7 e. T2 v& @ return 0;/ h' A1 x$ c/ B# s7 H# E
}
0 X f5 v2 y+ p h1 X% q8 X7 g- i6 g2 n, n. {) t
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): b% ^& ]; W* |+ A( K6 h! l
{
" P! Q# |: q$ x# J copy_from_user(&DXR_data,buf,len);( R5 \7 z2 u: P
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 7 b, f9 L% ?( w3 m! L
return 0;
* K5 O# G( E2 w: [/ F. t9 L
8 Q8 B, C* f4 c# o' u}% U0 O ?9 v4 R' I+ ^2 d
+ u# Y. x! n; r7 u, U& z! Dstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 E# A, a" d+ ^( \2 ~$ u2 l1 _{
! j+ J: ]- J- q( l+ |0 l) r) x5 Y DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 `' {6 n, u: u8 b6 E copy_to_user(buf,&DRR_data,len); 2 @- _& c( e" @$ j( I( ?
return 0;
$ f o8 J* e k: t2 K9 y}* d) H6 c: ]$ x6 q6 P
3 k7 F- q8 z# ?- c
' o( M- O" t4 t
static struct file_operations mcbsp_fops=
, q$ \. y( K2 F{
- _0 q4 A4 C( d& P8 j* x4 Y( b3 r .owner=THIS_MODULE,
! y Q* A0 l% S) }% |+ J( q, |3 c .open=mcbsp_open,' x7 c" _# x# a( p: C* [# d8 u: _
.release=mcbsp_release,7 ^+ s4 Y- I n/ J7 D
.write=mcbsp_write,
; a0 d; {8 ~. @% a .read=mcbsp_read,
3 z! M0 L: ]- w1 H# i) D};: I8 T. a( P* j, M; L% L' D" ^0 j
static int __init MCBSP_init(void)
. t4 i* ~' Z2 t' N/ P{
& g E/ ]$ m! K- Y# K2 Y int ret;& W& O. V/ \: Q. b* U- d; x/ x
unsigned int PINMUX1_REG_old;
) r# Y0 p1 B1 @ unsigned int PINMUX18_REG_old;
8 Z. n- K9 U2 d$ z unsigned int PINMUX19_REG_old;5 ~- }4 m. Q7 T
unsigned int temp; 6 ~& G1 K# T/ N9 j' e/ N) H' s
if(MCBSP_MAJOR)1 a+ r$ N4 o# p9 |$ [
{
" E5 c- o7 K' R5 w mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 t7 R k' D- T [; f& o& i* `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( J+ W2 B H# g. H9 e1 `
}
0 w( f2 X$ l0 Z. V7 B else
: Q0 {8 p& a( S {
( l4 S; n2 y. G! w# R1 } ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, K% }/ E; Q& Z& Q MCBSP_MAJOR=MAJOR(mcbsp_dev);
I. T9 h: r- t% v7 G, P( b }
) Z$ q* c9 c% L& k$ h 3 l8 M/ ^6 z; r- D, \$ B- n
if(ret<0)9 P( o9 L" b2 |, ~9 v0 v7 V5 `
{
& I+ H' b' Q$ G0 q' F printk(KERN_ERR "register chrdev fail!");
6 T3 Z- \1 v$ |3 o: l return -1;
! y$ P! ~5 Q; W6 J2 I | P }7 g/ L3 Y6 x4 s% i
4 p' F& j0 [$ t8 U+ `2 J
mcbsp_cdev=cdev_alloc(); @: o% ]( ]6 n8 G. `
% H. k+ ?, h/ n, ?' L$ \
if(mcbsp_cdev!=NULL)" Z( N( l! v2 P& [5 q' U
{0 O( Z" A9 p1 T/ d8 ~6 c
cdev_init(mcbsp_cdev,&mcbsp_fops);# x$ K9 o% P! N7 ?( ~
mcbsp_cdev->ops=&mcbsp_fops;( S" r, ]& d' r
mcbsp_cdev->owner=THIS_MODULE;' E0 {0 ~% S8 H( E
; H8 I b! k0 L) C+ H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- O+ Q" p, Z. \ printk(KERN_ERR "register cdev fail!");$ D" L* v9 @2 s. @, ]0 C) Z
else0 p/ H- M: E* N' w6 H5 ]
printk(KERN_ERR "register success!\n"); f9 `. {$ w& g; A
}
0 \% Y! F9 m9 n, l/ g2 t, \# u+ G else
2 \' |+ d+ k% I4 J {( [0 F+ I1 F" X+ h: f7 G
printk(KERN_ERR "register cdev err!");8 e' c! }9 w' u8 {, Y/ v
return -1;/ A d4 d& x* F
}
) s% q/ a& `0 V4 f * x( F( f {3 a8 p" J1 z4 u
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! s' H: d3 M6 u
if(IS_ERR(mcbsp_class))# L0 y+ b2 Q" m, ~; u: p
{
) p" ~! u: E4 y; U printk(KERN_ERR "register class err!");5 |8 r; R* \) J' k- @" S. \+ s. ^
return -1;
/ n" \* {# P" j- u, z }
" z6 ~9 q) V E device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 u4 d; t/ n) ^
/ S" ], u& F. b# l" |4 P //PSC. T! V2 z) `5 s% t! v# P3 @
//add Enable MCBSP+ c8 X7 Q4 @' K3 i3 y
//test
+ a/ [9 U' [/ r6 B, A temp = 0x80000003;( y8 ^5 O% X% q8 {; A5 M
writel(temp, IO_ADDRESS(MDCTL15_ADDR));' x' }( O: J4 J! F. R. w8 G7 i% v+ x
temp = 0x00000003;
: p; ?- M( z" R1 G& f# w writel(temp, IO_ADDRESS(PTCMD_ADDR));- S" [/ A$ {, X+ a: X/ J( u
& e- S+ D% d) S
temp = 0x001FF201;3 f5 H% Y0 b" u/ ]! H! H
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
0 A- k; |9 S, Q) y2 E" M& r
' _) J$ N$ k: X8 X. c( S //PINMUX # L+ D5 N% ^% c
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. K7 a2 ?) i3 r' C8 Y" J: U
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ Y n* e) y- M/ P' e% a PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; & I- y% D' a) Q) F9 ^0 N2 p9 [; |2 U
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ f/ ^" O2 [2 T _
) E1 o) S! A9 C* K4 L- _1 I
//SLEEP_EN,EPR,L138_SHK1,L138_RC
' j4 T3 m j* c7 `# K PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . S9 t' k7 J# h& ?+ m, S' _
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
4 \& k% D6 ]& {( @# C! R* ~; L+ V writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, ?% m+ v( P5 d0 L+ U8 o
2 s4 U+ f" b. D+ a2 \1 a- _5 m0 E. n) A //RESETn,L138_SHK2
' e/ D+ ~: Y" S- s/ n PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); & w* J, p4 t) c: n
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 }/ E+ l' p4 O" ?+ s$ k9 O& d$ j writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( o- m' Q) u) S4 c {: B- X7 z- c1 D
" w k+ S/ h6 p; \
- V0 r( }7 k5 m //SPCR Register/ s6 F% n. M! u& ~& b7 T
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* c# K1 N- {% ~/ [+ Q temp = 0x03000000;//(DLB=0)
" @ B. \% {6 b6 w // temp = 0x03008000;//(DLB=1)
' { Z( e# j9 I9 o writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
2 e# `9 F& P: V6 a i6 C% z temp = readl(IO_ADDRESS(SPCR_ADDR));
+ o* e; i- V; z8 _4 w/ J2 D! O printk("temp=%x\n",temp);
2 I9 X8 }8 F( W3 t
% T; z5 o. Q5 t' L8 {# P //PCR Register5 C/ u" d7 D3 d0 p! n& C7 @6 P5 G: ^
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ s0 A/ K5 J# N0 T
// temp = 0x00000F0F;
9 u; F+ p" y8 ^ D' c0 X temp = 0x00000B0F;3 _: v# H! X; `3 o F8 t: {, W
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
$ g5 D( z A" G( Q. P4 a- S% ] temp = readl(IO_ADDRESS(PCR_ADDR));/ V# ^/ y" s6 Q7 O. H+ B0 o
printk("temp=%x\n",temp); 7 X+ ]/ y0 x5 b# n$ \
//SRGR Register- f3 }( [$ Z+ r3 @7 v: O$ M8 [
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 O2 M( E& u4 }8 F; s //temp = 0x301F000B;8 m, D8 s) G1 A) N1 c# M' I
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
; P1 R, |. a' B( c& L temp = readl(IO_ADDRESS(SRGR_ADDR));( g# H7 M( E' L# B5 M9 N
printk("temp=%x\n",temp);" A6 {! Z& I$ Z/ a/ k1 b
//RCR
! K" f$ H1 O6 H //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* ~* w& j: m# t# y% I- a0 S
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 J( d/ r1 a0 O) ^7 o. H temp = 0x00440040;
5 @7 |; s9 i: w; ~6 s+ q# b' s writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 5 h6 k( r7 J5 X& S2 p* N) p$ R$ R1 |
temp = readl(IO_ADDRESS(RCR_ADDR));# Q& m Y& H' X5 } W8 {- R/ J
printk("temp=%x\n",temp);/ P; Y' A X$ P. g. N5 C/ }" i+ x
//XCR, c# Q+ j3 p" Y. I2 S, V ^
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 G. \5 }* R5 R& T7 j% }) @
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 S0 l; l, s' }$ `6 t4 o temp = 0x00440040;9 N7 z) v. H ~! J8 W0 C" I
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & J% F1 ^/ S$ f& G2 A
temp = readl(IO_ADDRESS(XCR_ADDR));
) `1 {3 K2 a- [ printk("temp=%x\n",temp);
M* r2 o3 E8 X- ?! l udelay(100);
# f4 h8 n( `4 I //SPCR Register
- o8 |; t& z; S. n1 T8 | //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 M; l3 X$ M' U) H" \# i
temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ }" X( V! S. h' ? writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
2 V8 T% p# A0 y4 F9 g/ b temp = readl(IO_ADDRESS(SPCR_ADDR));
+ s9 f' u l7 ~. T printk("temp=%x\n",temp);
: ^( i) ~% w3 C' l, @+ I1 h/ Z( D- T udelay(100);
+ ?* Y( f4 K7 e# h1 c3 d* w9 v% j4 c' `* k. A: o5 d- ~
//set GPIO direction% \4 |3 Z# a& v' j9 r
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 g& Z5 D* \. x. b! L5 N3 r temp = temp | 0x00000100;//EPR----input
- K) [% t( F1 i5 \ A, b5 J temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 P' `1 d7 r. L) W& M- p3 ^6 m0 X2 h __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); / n4 X2 V, ^2 |; x' x0 x( d
0 n3 j7 x7 @( c1 Z# d# c; P* d return 0;3 Q% A9 l! G- T- M' q+ s
}
4 X! W! M+ r6 g# c/ w0 istatic void __exit MCBSP_exit(void)
7 I% ~" L8 E$ `6 K; S{
) O: k5 _2 s! T! y+ F8 ?7 i printk("mcbsp chrdev exit!\n");3 u+ U- ?) d4 ]. K. W J- p5 U6 `
cdev_del(mcbsp_cdev);
) N* L& W- b' W% ? unregister_chrdev_region(mcbsp_dev,count);
4 o0 ~$ K u/ [. `# q5 v device_destroy(mcbsp_class,mcbsp_dev);% T1 A9 U. D( g: k" w7 L! O
class_destroy(mcbsp_class);
! _5 c+ q9 ?' C1 p5 K$ ^}" x* q2 L. @% w
module_init(MCBSP_init);/ o) a9 d @- {
module_exit(MCBSP_exit);
, @3 x3 \ G# U' `4 ? S: n$ u
; e* F- [- ]+ ]+ q* MMODULE_LICENSE("GPL");( s3 Y$ j- X1 S
1 H/ A' X8 E0 _+ Z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; e. h% V( Z( F7 s
我的应用层的测试程序如下
# P. Y' z2 y9 n5 r" |- U#include <stdio.h> I. y, g2 c$ J- o
#include <string.h>
/ s w* X4 x+ j. L#include <fcntl.h>& W N. f2 }. o1 _0 s+ p
#include <unistd.h>
0 P, K8 e r" y6 X* D#include <signal.h>
. Q( Z0 c' S0 b1 w- Q8 p#include <pthread.h> //线程( V* c" p! j+ t+ w# x: r# k
#include <stdlib.h>
. Z! g* N! B3 |8 {$ I: h8 R. h3 A* H#include <pcap.h> //捕获网口数据+ K2 @7 d/ V$ B9 S; t* t
#include <semaphore.h> //信号5 Z: f, r- ^# E& o
#include <sys/types.h> //消息对列
8 p; y4 U: s9 Y2 z; e p9 d#include <sys/ipc.h> //消息队列; G% r& E9 X8 O- T. d0 J
#include <sys/msg.h> //消息队列* z7 _: X: Z' q; a9 d d
#include <sys/select.h>0 _% e8 s7 J# Y& f1 `4 ]. R. M
#include <sys/syscall.h>4 Q0 r, E- u V/ L/ h$ Y# J
#include <sys/stat.h>! `8 e/ r# Q% l, q& s& }$ R" U
#include <sys/mman.h># i9 A* S4 P6 o8 x8 ~ N @. D4 a
#define msleep(x) usleep(1000*x)
; B, _& D( ^- M. x5 f) s3 X! z- W- m( _* ~* X
int main()
+ j& \6 r" n0 _. ~1 t{
- R0 @) ]5 |1 Q8 K //MCBSP,ARM与AMBE2000交互设备
$ W) F8 _) C6 Z0 r$ e5 G8 h, _ int fd;- d- D0 D9 q$ ~0 j$ a" n1 f3 b
unsigned short data_write = 0x5555;
( |% |% j6 O) e unsigned short data_read = 0x00;" S+ d6 P1 H u, n) ~
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! E6 h G# s2 f; { // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* k& O0 ?* K2 K2 `& @
8 u. U3 z* U! }& K" Z+ V. D
if(fd < 0), J0 t) K- M) S; Z- i1 R
{
0 v& ~: f. s( {6 ^# K8 k C% K) d perror("open failed\n");- w, @4 o5 t% M
return -1;
! _+ G# O1 g! }& p }, L: h2 V/ K4 A$ W
0 N8 \7 S' w! ^- _4 b while(1)
" {2 }8 h2 c. }/ L {
. q- v8 u! H: t 1 ^" L2 k& y l' n+ g. `( }
//AMBE2000每次读写是24个字为一帧
1 i+ }* p- V* ]) \; t1 V p //写数据时将数据在底层存储起来,等到中断的时候再发送
( J8 Z- p9 c5 j" @7 _ //AMBE2000输入数据是以0x13EC开头的
& a8 H0 _3 `' K" K: r; b write(fd,&data_write,sizeof(unsigned short));
" Z+ f7 ~/ t1 u% f# U/ Q4 t7 c4 m 4 s/ u. J/ u/ Y
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 - U# V0 v, Z' ~: D
read(fd,&data_read,sizeof(unsigned short));
5 ^$ z& \. Z3 D9 p4 j4 h
2 x* t3 S4 Y" `0 Y5 w4 Z/ P6 E+ b if(data_read == 0x13Ec)6 h/ j% i& w$ {6 f6 }1 Y% `- c" b
{
6 M* D1 p+ ?/ O
7 r; D7 a8 B% d# m, H printf("data_read = %x\n",data_read);$ l) H7 c1 a3 o; o) i( |) X" s- f
}
0 @" [1 h7 [9 p, V
. L/ u$ c* G0 m- s' u) B) X2 r8 K' f# z msleep(10);
6 u% e9 @ h. C7 _
9 a& _5 V) W; v% x /*
) k, O: G8 ?: J ioctl(fd,1); : H' C8 u5 Y( n# V# J9 H, ]' q& S
sleep(1);* T$ T5 ~# i3 i5 l6 m N
ioctl(fd,0);( L) p" z$ x) p( q, J
sleep(1);0 y3 N3 q. d7 Y; ]
*/
3 j9 Z/ Y+ l, ^) b2 E! O c. _ } / I7 T0 j$ B6 {$ G* p* B9 \" P" [
return 0;2 Y# ~/ M C& r+ _6 }1 ^* r6 {! J
; Y1 M4 v0 P5 @1 J
}8 j$ U, M: _) D4 \" F! x& i, s; O
. B6 |0 V% v8 y H/ [; G7 |多谢各位指教,谢谢! 急
7 b- V. q) K* }7 F8 ^- S
6 u3 m. Q/ J% @* @" z5 \% Q3 b" ~$ C; _8 i b
( I/ {: I" l% x) F! k8 g
( l8 I/ b8 H! U# F5 n: p c b
, N+ D% Z8 d, {: | |
|