|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 N+ V* P& t y5 j& G. l0 C
/*
) g9 ~. H! u F+ `4 _ * Copyright (C) 2009 Texas Instruments Inc+ I p0 {$ D5 r- m
*
( ~" S2 w4 P, G% _ * This program is free software; you can redistribute it and/or modify5 K; x$ @$ ~& I! C5 b
* it under the terms of the GNU General Public License as published by9 |/ u( b" e9 D3 W w
* the Free Software Foundation; either version 2 of the License, or" S8 _5 B4 F% [/ f3 ~! ]2 W
* (at your option)any later version.
) K0 ^7 Y# n8 G1 h$ C+ P *
' E1 \/ b" U& x0 f' o# C8 k * This program is distributed in the hope that it will be useful,
* p8 s( ^5 P% V* \4 A0 W * but WITHOUT ANY WARRANTY; without even the implied warranty of2 F" \: A! Z: B
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- g* v3 K/ w; o& _" K
* GNU General Public License for more details.& @* s8 C/ V0 N* G/ X0 D) k: }
** Z" G# z& u" w) w9 V8 O5 i
* You should have received a copy of the GNU General Public License
9 G5 ?4 i- P' C * along with this program; if not, write to the Free Software
, O$ ?, k( f" u& V* m1 T0 O * Foundati
) }+ \7 ?8 Z& ^*/' q, E/ ?: x& a' c! f$ b% k
#include <linux/module.h>
+ t& r8 K$ B L: O P#include <linux/init.h>5 D8 j, X. l' h: s: ?2 ~4 G
#include <linux/errno.h>$ d+ V: n: P: [6 x# p) g; k1 }
#include <linux/types.h>
% p* B9 e( F4 y) b# b8 E3 X#include <linux/interrupt.h>7 G& v3 _0 W5 D9 F( F- {
#include <linux/io.h>6 |2 t6 w- e& C$ N& p
#include <linux/sysctl.h>$ d |' M8 [9 D! }2 U9 o
#include <linux/mm.h>
4 T$ w( I+ L% t& a#include <linux/delay.h>* v. c' B% y0 ~+ p; v3 J/ E
#include<linux/kernel.h>
& F: e" P' }, j#include<linux/fs.h>! D) @! Q0 y! S0 ~. H s. E
#include<linux/ioctl.h>8 L- {4 ?) F+ y7 k
#include<linux/cdev.h>
& \5 w- n! N" @( [) G+ x#include<linux/kdev_t.h>2 c( v, @& T2 {: a- Z7 o% i
#include<linux/gpio.h>
1 f# H; X! E' P- @* E6 z#include <mach/hardware.h>! r& P' \* ~! U- C
#include <mach/irqs.h>
' l& V. y' b; I$ q9 F/ n z. u( R+ d4 g. q2 b
#include <asm/mach-types.h>
: M. |# f6 Y2 N2 _ i#include <asm/mach/arch.h>
' {, I/ \$ a( M" X9 w) z#include <mach/da8xx.h>
2 B% l: u5 B$ B& ~#define SYSCFG_BASE 0x01c14000& \ n: {+ a1 |1 R; }1 R0 y
#define PINMUX1_OFFSET 0x124 , ^/ K, B; @3 ?! ]- `$ G
#define PINMUX18_OFFSET 0x168 . K c* _8 P9 I6 {4 {* n
#define PINMUX19_OFFSET 0x16c
- P Q1 F x5 ]# c+ Z/ C#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR, m0 I" @; t$ S
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR( k7 D4 d' S+ J! Z* g( U* a
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 r! e2 ~. |9 N- R0 [! c#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR8 q. c$ G- `# ^7 }: q) q! |
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
: C& A1 |: N3 x9 Z! w 1 R% x% ]# D9 D
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
) ?* a2 `3 L, m7 R2 e$ ~#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- S. g- U3 X1 S. S a( C//PSC3 K g4 m) {) x# Y! ~ f5 g
#define PTCMD_ADDR 0x01E27120 * X3 s( n! p, G
#define MDCTL15_ADDR 0x01E27A3C0 l3 P/ B7 ]$ B5 e
#define PDCTL1_ADDR 0x01E27304
( G! m# m" }( u7 \1 V2 N7 b//GPIO8 direction
' T! X+ g( j5 Z! s#define GPIO8_DIRECT 0x01E260B04 ~' d' @& m. d/ ^7 V) W
#define GPIO8_OUT 0x01E260B4
8 |4 ~8 k! M+ H9 y9 `#define GPIO8_IN 0x01E260C0
6 I4 r8 K# p3 E3 L( o* k# G2 z- d/ L# z8 P6 b9 G M3 F
//#define MCBSP1_RINT 99
% i+ q: t/ [$ S# m//#define MCBSP1_XINT 100
3 A; [, }* L' F. q, R2 v8 nstatic int MCBSP_MAJOR=239;
: L3 ?: k/ V3 ^2 K+ \/ k( astatic int MCBSP_MINOR=0;5 s4 f. w+ F- Q- k7 e" D
static int count =1;, j! j; L2 j, `5 ~' `+ r
5 N1 w: [: v# L4 i, m: A$ P( S* w
#define MCBSP_NAME "MCBSP-device"
& Z3 m" J! m Q" ]9 ^6 ~: M% p, W5 k9 _! K0 F& m O& @
static struct cdev *mcbsp_cdev;
- X3 K4 f- l# N0 k" z: g. ^ J- pstatic struct class *mcbsp_class;
! b+ b# q. w- Z3 ?' ~& f0 u$ ystatic dev_t mcbsp_dev;
; i# V( \6 V" z3 Q6 @* Dunsigned int DRR_data;
\0 ?' X: H' ~# e* m/ J! Uunsigned int DXR_data;
1 t& Z8 T# S7 J' Z$ U, hstatic int mcbsp_open(struct inode *inode,struct file *file)0 P& M! w9 Q6 P- C1 G( ~' ]/ R X
{3 G) j' w2 Q8 N8 y9 a r3 e0 Q9 [
+ p1 M" q+ {/ Q7 k" `, m2 n //interrupt enable,initialized
# N* p3 R" b" r% C+ J7 h unsigned int temp;- D- d8 ~. X$ `0 n1 n
//SLEEP_EN(GPIO8[10])---05 M# v$ n; G* j( w8 g2 ?+ u. l
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" F" a3 b+ X3 f9 {
temp=temp&(~0x00000400);& ^4 X: N9 Q5 Y) l) m2 C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ V( {# ~* T* v/ c6 |+ f
//RESETn(GPIO8[8])----0----1
4 V, C2 K6 l' j& ^+ j$ _/ | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: ^/ v# _$ R4 H temp=temp&(~0x00000100);% I# t# F8 D, O+ S% [
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) }$ ~. E! j4 S0 }
udelay(100);0 Q& G+ q& j) d
temp=temp| 0x00000100;
/ U" u2 H; J6 @+ |6 \6 H( R3 t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 w8 [. i: Y* p6 k9 f# Y+ ~ udelay(100);
4 ?0 j6 Y" e- a printk("open success!\n");, G/ @' s! [# P: }) G" y" l0 T0 d
return 0;2 n9 _2 [* t7 R' Y1 E. D
}
, U8 ` V+ n. K. ^% C& w( w
( k: |% A `( _# X$ ^ F J& \static int mcbsp_release(struct inode *inode,struct file *file)* R, E$ ~) I n' R# N$ H: i
{
0 }9 e' M" P, k& h, U' d printk("release success!\n");
0 Q2 T# Y+ Q7 o& \ return 0;
, p' i2 X) L: `' h* Z5 x+ F( P}# i# h+ f+ x7 D
3 [7 W# R6 I: P9 ]; y
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- f; C. E4 G0 X/ H g0 }{
8 U. t) G# P9 A+ @( B& R# q copy_from_user(&DXR_data,buf,len);2 L9 X: T- r+ F
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. _* z( @/ F( C9 p" g, j2 j return 0;& `; d" \8 J9 A q0 @7 ?
! ]: g; X. k; n- u}
! z" `5 r: F5 L" A: q0 m5 `% ^+ V. |# |. }$ L5 l% w
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 P- V1 [+ U+ h1 p
{
+ h) Q6 c5 x7 b, {; K DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" Y* O" T& V; T" L/ R/ W copy_to_user(buf,&DRR_data,len);
' n) V8 {! C) A' o. t return 0;
$ b8 R" r1 c% ?- G: D$ E6 s9 S: u}1 X& k! i3 L* i; t m0 D- D
# q, b1 ?9 G8 M+ u
7 R, u' P0 `6 d4 q! Y3 Y
static struct file_operations mcbsp_fops=
; ~; d9 p3 V/ i! M% d, X; A{
: j9 p/ h" \; Z% h+ m4 ^ .owner=THIS_MODULE,7 u: z* u' J! A. L
.open=mcbsp_open,$ l7 b* }, `1 w5 H1 }3 B" L( f
.release=mcbsp_release,9 _' n. D2 d$ R- m& P
.write=mcbsp_write,1 Y3 |" c$ V: v. S; R5 `1 ~
.read=mcbsp_read,% r# d/ d0 }" D0 [" e
};. n/ p1 e, ]$ b# l+ l, l
static int __init MCBSP_init(void)5 q7 t" f; o- k! H4 Z# D# e5 }
{
; t/ I& n6 @3 O* }4 x$ I3 T i int ret;7 J9 u5 y- j. l
unsigned int PINMUX1_REG_old;7 ]6 E$ G% s' f$ D, C1 i5 a
unsigned int PINMUX18_REG_old;
7 h0 s; c! l* y! ?6 G, S unsigned int PINMUX19_REG_old;$ {4 }4 K7 l0 j+ c, i
unsigned int temp;
. A, z5 R8 [/ t8 m- R# a if(MCBSP_MAJOR)
1 N5 ~% L0 j3 M. K4 O {& v! k g- {5 {
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
& C0 c3 j4 s0 A1 C ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* d9 _: s, v+ H, b1 Q. d
}0 o# }' H/ L% G' N+ j
else
' Y2 |* w- j) M8 E {
* m' h6 y+ x% ~% d, @) J ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 v3 X; ], y! C" }, W' ^# H
MCBSP_MAJOR=MAJOR(mcbsp_dev);8 E1 j1 ~1 p) g- o N
}% E g t; F; z& Q
* |9 z2 e `: [! C8 ~% ^/ F if(ret<0)- @ d- a! }( O- F& D7 w
{
# x- V0 b1 e5 o printk(KERN_ERR "register chrdev fail!");
* v* ?8 A6 v& N8 m; d3 z- ` return -1; L, I2 o1 A8 r8 C( x1 E. [1 G
}# b( i( d# B% N, q% P
3 j8 w! e( x: r4 z Z5 I% R8 O
mcbsp_cdev=cdev_alloc();; K4 H! F! b8 Y+ c1 a
/ e. q5 {' Y1 r7 O; ~/ ]( {
if(mcbsp_cdev!=NULL)
7 t1 c5 o% d8 G2 D {
4 x5 {0 [$ U a$ b7 F3 q& ` cdev_init(mcbsp_cdev,&mcbsp_fops);% ^" `; y u9 T% X. y. ^
mcbsp_cdev->ops=&mcbsp_fops;2 }1 _: x; P- L( Q
mcbsp_cdev->owner=THIS_MODULE;
K* Q1 `1 [, M2 P. J+ e 3 r+ x1 w8 k ?: H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' P+ M# S( ~5 i printk(KERN_ERR "register cdev fail!");
! k! ], U" t; } else
$ D- S ?6 d+ {; R7 ~0 C" _4 a printk(KERN_ERR "register success!\n");
( o5 x2 L u' f" a/ F$ ]! h }
, i! P0 X$ T8 m6 e9 D" |9 Q else
( v5 j& j8 W: u1 N: \4 k, _# S {
) m U' t0 Y P' `% R$ b printk(KERN_ERR "register cdev err!");
/ Q( |) R7 }$ v7 F' j k return -1;
& ^: i& J& F. c1 S( B }
: V4 u ~/ i- S; l- l- R9 ?( R& k
% R1 \" p. q: `* y3 W, O. k mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 t: p% z8 l) T; ^ if(IS_ERR(mcbsp_class))+ ^3 l5 Q; [& K4 L
{) L! [. [) }/ S; P8 M% H. f% {- g; M
printk(KERN_ERR "register class err!");' E0 C/ A# ?* `/ s
return -1;" F( i: G! {+ N: l+ N( ^6 A2 o- M
}
: ~9 u; ]) X5 I! J3 C) o0 ` device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
. u9 L, {/ K! U/ w5 j* K2 R& b( T
//PSC
2 u7 @4 O$ R" \. R, p //add Enable MCBSP; W* N2 N- ]4 E8 V+ Y
//test
* @- j% E, J1 S: m temp = 0x80000003;! \* k1 ~& z9 d3 a
writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 i5 u$ D' q# Q$ U+ b
temp = 0x00000003;! ^, X- F% W _6 H1 `- ]; Z; v+ [
writel(temp, IO_ADDRESS(PTCMD_ADDR));7 n4 `+ {1 H+ E& @; m( e
* s3 v Y; a; M
temp = 0x001FF201;% P! X3 j b; B9 W
writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ o! q2 I, S1 X
- N" z# E" Q! S0 K9 F; t' z I //PINMUX 7 C0 f3 Y3 q* R
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 C! u' w P4 g2 F
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& ~: w0 |! N7 R: Z+ o PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; & ~% i2 r. g4 o& R0 W
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: t5 u. k1 r. M% G! W0 _
; R# C M2 B7 s0 @ //SLEEP_EN,EPR,L138_SHK1,L138_RC& V1 [& x, }+ F z1 V
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); $ v! s) Z; Q# A. W0 x: W1 W
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
5 I) S0 p% [0 d I1 G writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& N b6 X7 ] v, y2 S- G- b; `
* J7 ^$ s% i0 B1 o, m //RESETn,L138_SHK2
: W6 B: [3 Z U! d( q9 D# W; p PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 T. t7 S7 R2 ]0 J' l: \- g PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 0 T: N- ^+ _: i- a% t# p* Y1 B
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);0 y# m4 y. b D( t+ H
. J4 P, w. y6 @7 [
& |' G: e, f, _' H2 n& u+ m* G //SPCR Register
( k# \1 [, Q/ n7 ?( M //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 m0 C1 L; H2 X* C" _" b/ O2 w temp = 0x03000000;//(DLB=0)2 l4 k4 z) d L5 I! y
// temp = 0x03008000;//(DLB=1)) Z7 e1 T& F8 A; [" C
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset M+ a5 `; @" @/ z* d
temp = readl(IO_ADDRESS(SPCR_ADDR));
8 S: v4 z3 p& Y! l printk("temp=%x\n",temp);
K- E! v, B/ T6 d5 ~9 Z; J: h
3 X& D2 X" u) a+ R //PCR Register# L% {) u* V" H4 p
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- ^! a }* \0 `: t
// temp = 0x00000F0F;( W: O2 N' K. ^ T) c
temp = 0x00000B0F;4 Y; t- b g0 W: i) A
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized # ~* \' }; P" w
temp = readl(IO_ADDRESS(PCR_ADDR));: g* I7 q) D" S- |# o' G$ `0 N) l) p
printk("temp=%x\n",temp);
- m% P, H1 U4 |( H) @7 m' G //SRGR Register
" S$ a! F9 h% \/ V/ t2 H+ z, t //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; O \/ N9 x7 u) w% x
//temp = 0x301F000B;; m& C+ i' b& p' J* z2 I0 x! U
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
5 e5 c/ Z1 e. w temp = readl(IO_ADDRESS(SRGR_ADDR));' e4 U. |0 v4 f6 {
printk("temp=%x\n",temp);
: g# j: a3 ?3 }, a5 d4 X: F //RCR4 Y( Y& l2 Q, o( S. k3 D" X1 R
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,; x9 C8 @% X) b% x! @2 t
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 E6 w/ I8 J) N# k* Y6 ]
temp = 0x00440040;
! R; v0 J* [" ?$ P writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized / t. J" T( w( t( s, h0 W# a3 H
temp = readl(IO_ADDRESS(RCR_ADDR));
- C9 f" R9 J% q2 e! o/ f# r printk("temp=%x\n",temp);
- V- n% H7 X. R1 p //XCR6 {. P r1 y% O( S: v1 ^5 Q
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ \' N2 ?6 Z! k3 i
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
4 R. L& \5 ]3 H7 n temp = 0x00440040;6 L2 T. a# q5 y6 ]- u+ {: n0 M
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
5 f! b6 k( S, u9 | temp = readl(IO_ADDRESS(XCR_ADDR));/ k6 L5 @ W) G0 K8 c3 j" s' u! b
printk("temp=%x\n",temp);
: O1 t; p }: \9 g/ q% v: |- x A udelay(100);+ v# O( l- ^3 K! I2 `( ?( X, |$ T- U
//SPCR Register5 G# J( K5 z1 w; w a
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 B+ ^7 d8 d& @1 _. N
temp = 0x03C10001; //DLB = 0 VS DLB = 1
2 n: {. j- {1 ], E) a, I* f. W writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
0 | z3 @0 q$ P7 F* @ temp = readl(IO_ADDRESS(SPCR_ADDR));) _1 |9 |0 U# T0 m1 s5 e; S
printk("temp=%x\n",temp);
# ^+ t; d R# S& h+ S3 B% j udelay(100);
# k2 {& [' c- s5 _: e' ^( h
9 t5 `# @+ `3 u- p+ _5 m5 t* t% v //set GPIO direction
0 k6 I" K! V8 }5 w; g3 n/ P temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 b/ a/ H+ w2 ^$ I" L temp = temp | 0x00000100;//EPR----input4 @( Q9 T' \4 d2 \5 ~( U
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output6 F* v2 J1 I) d/ X2 d# o5 R, O
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ |7 d$ t. `8 |7 I: M# w% b3 k
* A: ^' U# q- O4 J3 n7 m
return 0;$ y. I' F: ^- Z7 K. P A+ i/ e
}) N( D* Y. f! q+ G
static void __exit MCBSP_exit(void)0 I% `0 T2 L( f5 _3 \) O
{
7 [& i7 A/ S) L4 ]$ ?( v printk("mcbsp chrdev exit!\n");% z" w2 {; M& Z& R, @+ p$ @
cdev_del(mcbsp_cdev);
$ h# T2 t+ }9 n* G9 C unregister_chrdev_region(mcbsp_dev,count);
2 z# B+ i2 e% X5 p$ T% t. ? device_destroy(mcbsp_class,mcbsp_dev);
2 m1 ~( l P4 i1 e, H* z" }$ k( a! c! \ l class_destroy(mcbsp_class);
7 i: j; p! B3 H8 X9 a}
2 M; i2 C& O; U8 r* z# R5 \module_init(MCBSP_init); A: u) |0 s# ~- c4 {
module_exit(MCBSP_exit);- }0 V2 b& |: o- y3 ~+ {2 i
; W6 e6 U$ E7 j( u% L+ J3 l% E8 ^
MODULE_LICENSE("GPL");
( j) t$ p) t( ^" { |8 U) V8 c* ^+ g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( t' b8 p: [% T. u0 h- p我的应用层的测试程序如下3 ^! g9 C' m$ p: U1 i9 }& E& f9 G
#include <stdio.h>
4 _) e8 w/ s9 R& R! D#include <string.h>1 H! e. y2 X. g, K
#include <fcntl.h>' k( S; _4 s. W
#include <unistd.h>
4 q: |! D4 z0 R2 m; m+ S; T#include <signal.h>7 n4 W3 |- @) |7 Q8 ~# ~, J+ f( H1 A
#include <pthread.h> //线程
) }8 ~' C. ?( J#include <stdlib.h>
! T( S. C: |' h3 S) g9 d#include <pcap.h> //捕获网口数据
2 [+ V" c1 D! _# O. Q#include <semaphore.h> //信号
! B" u! \0 l+ n6 k4 i#include <sys/types.h> //消息对列
' D- U+ ~9 s% o+ ]( R( \#include <sys/ipc.h> //消息队列; C% \: H8 i4 k3 v
#include <sys/msg.h> //消息队列3 }) i( E* O' I7 Y
#include <sys/select.h>, y& P: m+ T8 F# }' y9 x
#include <sys/syscall.h>+ |0 H& w2 ?: Q$ v
#include <sys/stat.h>
) L" T# V" R3 h6 m/ j* r#include <sys/mman.h>
; {2 S* K4 N [& q9 ^9 r#define msleep(x) usleep(1000*x)
/ o# z% K$ T+ Z1 \* r, z( ]
: l* V/ A; ]: y6 {5 Bint main()
3 N2 M* P- D4 m' X: G{ & L; s5 [+ a O6 u8 w' E5 R: ]
//MCBSP,ARM与AMBE2000交互设备
J: q Z" q. E X, ]# o! a6 ^ int fd;
* }! N* P: p" q( Z+ d( C unsigned short data_write = 0x5555;
C; e8 i+ t4 R+ ^ unsigned short data_read = 0x00;3 t6 M& a T, H( }+ g9 ? t
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 X, Q7 \! s" k, ~5 S; c2 T7 H
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 V0 f- t2 [8 w- {8 R) V
g& X/ O. I% W9 S' s if(fd < 0)& g7 v( `8 K M' d) w$ \" m/ I
{
; p, R# U J0 }' R5 ~0 a# F, z. H perror("open failed\n");
; _- `1 Y9 T1 a/ L- ] return -1;
8 u4 W! V" ^6 z0 T7 G }
5 z# t q& d# \! J 1 K' ?4 J) z$ `# A1 v
while(1)( _1 M! g& @" M" o. } F
{, Z& v9 c4 H% Z- c$ T) N7 u" l, I
" t$ x. N$ S3 d' a //AMBE2000每次读写是24个字为一帧
2 P. F' G/ H9 l$ l$ O //写数据时将数据在底层存储起来,等到中断的时候再发送
. s6 C3 M* v- T+ e) X //AMBE2000输入数据是以0x13EC开头的' O+ `5 K! u: E3 G5 r
write(fd,&data_write,sizeof(unsigned short));& _/ C/ |& Y/ l3 Q' F4 l
3 @) i, s) K- D" ]! G% y% y. H
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 ^8 X9 |" j4 f* J. Q read(fd,&data_read,sizeof(unsigned short));
) C) X& [5 F% O' z% }, X 8 K8 d# h# P8 N1 }
if(data_read == 0x13Ec)
# t3 d1 t3 W) h5 z" ]9 I: X {9 ]2 [5 W2 m, M2 y5 ^) C0 R) X
) u: }. n* g, s" ~3 p! F* w$ l9 G0 \ printf("data_read = %x\n",data_read);
6 T& G: i9 ?& ?: {, J }
7 @0 c) a$ i- T! p 5 R0 v0 v) p m- ]
msleep(10);0 H* |; g# _5 K
" [0 Z& a' C8 L; ^/ [# M) B /*
8 L: b0 ?# u1 J' I: R/ x q9 c ioctl(fd,1);
) R6 X. e+ f: J1 Y' A# s3 U% w sleep(1);
9 {, u q6 t- t# R( u/ H/ I/ n# P ioctl(fd,0);
1 z6 j4 S" V0 a, T; }# I$ ^ sleep(1);: ~) _! W5 a# \
*/
0 W& k' n1 h7 O5 y' @& u& X% U! w }
$ ^5 ~8 E% ?; T return 0;
7 ^( O, U+ Z: M2 B. ~ / ~( {+ _ A$ L7 J; N# y1 p
}* I4 K* m/ \8 P1 M1 c) j0 ~
/ n+ Y7 R& z# w6 g, n. A
多谢各位指教,谢谢! 急0 b" V' u+ z& |" q) \2 E( i- c
) F% t! y1 R6 F4 D& x6 O+ i: q+ _( Q$ d& D% F5 B+ E
* ^! K2 K" P! t' |% i2 c
3 E# s; g! Z! U% R
. G3 O* T* u/ V: f7 r
|
|