|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ b; e$ Q* } l/ }; {6 b
/*
e7 k- \2 w& f* o * Copyright (C) 2009 Texas Instruments Inc+ D3 f; u C* Y s5 O5 `
*9 \5 P8 T& E: U; U; V4 |( r
* This program is free software; you can redistribute it and/or modify
" q( }! \8 p9 b, \* R * it under the terms of the GNU General Public License as published by
' N. c) ]* v# O( {+ ?8 T * the Free Software Foundation; either version 2 of the License, or
' `7 ?. R$ h1 O; y8 u, K/ { * (at your option)any later version.
8 L3 |0 O; P( H/ Z *
! {4 N0 j- w; X * This program is distributed in the hope that it will be useful,. P' ?2 J' p# o0 g9 n3 j5 T% R6 B
* but WITHOUT ANY WARRANTY; without even the implied warranty of0 O I4 I" E5 q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# I l& ]( X* v, h; _; M
* GNU General Public License for more details.! Y# P C0 b( H0 M2 P( }
*5 B8 Y7 H T+ x# M& `% p6 j
* You should have received a copy of the GNU General Public License$ `( O2 V1 D, G' I2 r1 W: k% t
* along with this program; if not, write to the Free Software) Q" D, J) j$ j# l% @& }
* Foundati- }5 S% e7 f" o) }
*/3 ?! ?4 ?& S7 o. W; Y4 h, f
#include <linux/module.h>
# Q! I8 [8 A2 o; _#include <linux/init.h>
3 n0 T% f, Y& l6 v+ t' Z: L#include <linux/errno.h>
% A: [' H; ?% k0 B/ p#include <linux/types.h>
2 g& r ^5 x5 c3 L' U- P#include <linux/interrupt.h>2 e" W( Z) _% G. z
#include <linux/io.h>
- f9 K5 M8 P5 E: C t6 |#include <linux/sysctl.h>
3 `6 `, W7 Q/ r$ e4 O- e0 q#include <linux/mm.h>
4 e5 y6 Y1 d7 q3 i6 r* x#include <linux/delay.h>% ^% k5 f0 j( _% x
#include<linux/kernel.h>5 w+ C( M! h1 b. w/ c" c
#include<linux/fs.h>
, U! G6 d& ?, P; X9 X K#include<linux/ioctl.h>
4 e/ ~+ M3 u5 g6 d W2 i#include<linux/cdev.h>
; W. I2 t( O' p, j1 R5 U4 a#include<linux/kdev_t.h>! K* _5 R/ e+ V9 m, C
#include<linux/gpio.h>- P: n& o' g8 P! Y
#include <mach/hardware.h>
8 U6 m! s' Z! M3 e#include <mach/irqs.h>
. z* `8 j; A9 N) m3 B' O3 ?$ L% ^# _( K! q
#include <asm/mach-types.h>* P$ D, ^% n# M. D. z2 s
#include <asm/mach/arch.h>
& f* h5 e" B+ c#include <mach/da8xx.h>
$ a2 N7 r3 y7 R9 h+ y8 `5 F% ^#define SYSCFG_BASE 0x01c14000
$ N' j; l: U1 n& m# M1 J& p#define PINMUX1_OFFSET 0x124 2 ` y$ x3 K! h ^
#define PINMUX18_OFFSET 0x168
; f* _1 s f) x0 }#define PINMUX19_OFFSET 0x16c
! k* n" G. d2 C& t#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR, E3 r; g7 w% P. g9 E) b
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR0 w! X: X+ |) g
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR( {+ R8 G. a( F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, E$ N, R0 h5 a$ P0 r& S
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
/ `/ {) z' D/ x4 L. x4 B
& f7 e. q: |! } |# w" ]# e#define DXR_ADDR 0x01D11004 //MCBSP1_DXR3 L5 Q6 A2 Y: P4 S
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" U0 Z4 g3 j8 P- x- i8 x# O, T
//PSC- Z9 S3 ^5 e5 A) F* n
#define PTCMD_ADDR 0x01E27120
. m3 M w4 ^+ U8 F#define MDCTL15_ADDR 0x01E27A3C
) d6 \- k8 g! {# N#define PDCTL1_ADDR 0x01E27304
% ?5 }( {+ ^$ }! | G//GPIO8 direction) @) s1 p6 e1 y1 z; S4 T
#define GPIO8_DIRECT 0x01E260B0! g; R0 I3 f9 [" g A: E! U5 Q: l4 R
#define GPIO8_OUT 0x01E260B4
|8 W+ u0 L( W' \) _#define GPIO8_IN 0x01E260C0
+ h3 j! a4 g: S4 M5 e, ?# A, J3 b# a4 m
`9 A. }$ P3 ~//#define MCBSP1_RINT 99 5 m; Q% M( n7 `6 N
//#define MCBSP1_XINT 100 5 O- u) Y1 ]4 O0 x! H, ]- K
static int MCBSP_MAJOR=239;" s; r6 Y0 |' U! v' y" D' n
static int MCBSP_MINOR=0;
+ b: f1 |& w5 h( I0 ~static int count =1;
" c, @) q! |/ k! U+ y* i2 Q# g/ Y( D
#define MCBSP_NAME "MCBSP-device"( P5 w% W; i H, ?$ i
6 _* J: ~2 l+ _( U
static struct cdev *mcbsp_cdev;
( b! z7 g3 B8 W& |! S% mstatic struct class *mcbsp_class;0 w+ Q; Y- S3 K+ {7 F. C
static dev_t mcbsp_dev;( z% w2 E' Y3 x' R! @% q" g
unsigned int DRR_data;
! [0 p/ x: [# `) E( Q9 ~unsigned int DXR_data;
* i# i' C/ H) g% ]2 |% ^9 e7 rstatic int mcbsp_open(struct inode *inode,struct file *file)2 | \ V. }# g
{1 N( d( y5 s: r; x/ W2 A1 E
( u6 c$ o! M' H6 ~. L7 M6 S
//interrupt enable,initialized
- Z: ` c, r2 W1 A; l' E! } unsigned int temp;5 B3 m, Y1 w5 H7 V# o5 H
//SLEEP_EN(GPIO8[10])---0 {5 k. s& _8 t7 V- L9 ^* r
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" }& q ^+ q5 N5 a% b, F temp=temp&(~0x00000400);
2 I5 }: H) a: u2 i% d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% q9 h* Q1 J6 P" B' ]3 }8 A# ~ //RESETn(GPIO8[8])----0----12 |/ y7 z* Z/ x7 v5 v9 `
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 Q9 M& G. R D4 d3 Y temp=temp&(~0x00000100);0 o! {* J- l" H" @" V8 S: F
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 F* O2 B2 `0 |" t: q/ S( h
udelay(100);# q- ~% M* u2 t: b% }/ F1 I" M
temp=temp| 0x00000100;+ |0 C* R1 C4 J3 k- A5 }
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" N$ P$ ]3 E+ ^9 u/ e! S$ y
udelay(100);
% l5 Y0 z, a! ~* `" ^1 O/ _" T printk("open success!\n");
f" f' p0 y) }3 ?6 q return 0;
+ m1 r* { c; Z. O$ t}
* J6 _, e- K: i/ f D( }; R8 o1 b4 ~2 i% a) B/ w
static int mcbsp_release(struct inode *inode,struct file *file)
0 }" B9 `/ O5 P+ k{
' I, n4 j4 ]9 D9 l" S8 S9 }) y printk("release success!\n");
' @- l, y% t [. z5 \4 d return 0;+ D% b8 f9 X, d. C |( t6 Q$ b' F
}: ]# Y y# e/ @5 h/ L, K1 t
0 j& R/ d; e, U( ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. P/ F+ Z3 Q$ ?: Q1 Q{ E% v+ d. [' K' N4 x
copy_from_user(&DXR_data,buf,len);4 i* i' \- e9 N$ M* s
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
+ ^. y: H j. N: s6 r6 G9 i return 0;/ W |; s2 s: b) ]/ `. U6 N
& U. e. L% W7 i. e5 d/ F* V+ j2 A* W}) D0 y- E. O0 P8 M) D- a
: J& I- u! Y" U O! u8 |
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ _& [4 D x- a: H; h! ^{ 3 j% f9 r2 w4 q( {4 _
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));7 Z/ {7 f! r+ \3 u8 I, c
copy_to_user(buf,&DRR_data,len); * M# U8 N6 |5 [; _0 [
return 0;% Y1 j. q6 y8 D$ b
}2 x9 u- N& q) Q3 S2 ~3 K
$ }, t0 f3 `1 w1 ?# N
( H* q1 p6 u" v7 a6 z- L" J3 lstatic struct file_operations mcbsp_fops=" Z7 u8 v1 x9 |2 v1 `" _+ Q( B$ Q
{+ W6 O1 s0 G- H& T
.owner=THIS_MODULE,6 N! A8 G8 t* K$ j4 V
.open=mcbsp_open,& Z7 f* g7 m: I- z+ O, D
.release=mcbsp_release,% v5 Y, d5 w1 w$ Y9 i2 d% |
.write=mcbsp_write,
! c; d4 S2 q* o4 x; e# B" h .read=mcbsp_read,
0 w& {$ a# F( n& S7 O$ k};& W; b1 O# R4 p/ Y
static int __init MCBSP_init(void)# y0 b- f5 w j2 M
{6 s2 y6 O: d1 I: \5 i# v
int ret;
8 H2 q8 q& D! s( v( \2 q3 m unsigned int PINMUX1_REG_old;% u' Y. O7 ?$ o& H' t0 j. a+ A$ {
unsigned int PINMUX18_REG_old;
: [0 \( p- u4 d0 x. a+ h unsigned int PINMUX19_REG_old;
6 Q: o" z$ W& @ unsigned int temp; 6 a0 d: s0 N% P* F4 m
if(MCBSP_MAJOR)
4 ~& R Y; N5 w0 a% D- c {
! W% P9 n7 K) R! O4 p mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& p! \: ^! y# B4 z/ R* J
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& n5 I8 c, W8 F$ c6 y1 E r }
' w4 q5 F% ~, s$ i else! C) u0 j' ]7 A2 z
{( {( f/ j3 \+ O0 N) J8 n
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 c {9 V! M, z# u$ i
MCBSP_MAJOR=MAJOR(mcbsp_dev);# b6 V& {/ U. U# _# N; }
}" K! U1 _1 n. g. |& x7 O
& L9 G2 k( i m- C* S5 E9 K1 d( s if(ret<0)& b& s9 i2 \3 k7 \- d
{
$ G( x$ t2 [4 Q0 `. m1 \9 x printk(KERN_ERR "register chrdev fail!");
' H( S1 c; U5 P; D return -1;1 _, [9 B" Y: E# D% m
}; Y5 o. D, t j' T6 ~* Z- @$ X
9 {# U% c- r X& z
mcbsp_cdev=cdev_alloc();' T4 C( Y8 j( M2 }' Q7 b: h6 R
( u8 w, u# n) [; E8 |
if(mcbsp_cdev!=NULL)8 [: e, Q/ R, B, m1 q
{
* z: ]6 x V4 I# Q8 q: P cdev_init(mcbsp_cdev,&mcbsp_fops);9 U7 z( @; O4 C+ X
mcbsp_cdev->ops=&mcbsp_fops;; s8 {. k' f% D
mcbsp_cdev->owner=THIS_MODULE;2 D( B/ @2 M w, ?% A+ @
3 u5 k# e' N* S if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
6 h, G, Q+ Y# J6 ]" ]# a printk(KERN_ERR "register cdev fail!");- J1 {. i; O) `9 B# f
else( r. M" t' d& y9 b5 M" \4 i
printk(KERN_ERR "register success!\n");
- e1 X6 D: y# s, ~" s* }' ^ }! O8 Q; }5 E/ n! p6 e; U) z
else
( e$ d" _! B+ R6 n3 M6 o: E {, ~5 q1 k6 q: u. U1 m
printk(KERN_ERR "register cdev err!");) t9 u% h8 `, M( C/ @% U1 n
return -1;8 K. {/ ~* j! F O h9 ]" q }
}4 D7 S9 `5 P I9 t; |
S/ A& t% x ~- K% b% z2 q mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& J, ` U+ Q& Z6 u/ J% _7 m3 D3 n, F
if(IS_ERR(mcbsp_class))( P+ H5 `7 J1 w. h8 m
{
; x2 S; B) M( ~. L& |- N! d printk(KERN_ERR "register class err!");
, V; S& T- G. k5 _6 G1 Z2 L return -1;
% ]: R: J* H) B( w }$ t K) }" Q4 ~" X
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);% C- }; |, y( c
* `- o4 w2 |( L# P* I //PSC
& p O" o. v0 O: B //add Enable MCBSP
" s! x8 J' N% @! w, r& y) G0 N0 A5 F //test* l# D+ _9 ^7 n1 S- _- a ?
temp = 0x80000003;
! ~5 s E7 |% ^7 x' x writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ Y* q2 S+ F& D1 a0 h temp = 0x00000003;9 J# P. C" @8 N. W. g
writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 d1 w" L/ n5 ], ~3 j3 j
$ X% L% z$ |& H2 Q% k( @# W J$ z4 p temp = 0x001FF201;0 A$ i$ c, s# X) E
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 o( z$ g; z8 X: Y+ Z& B
/ S' h; D7 b6 K! J+ L$ ^% S% h/ x //PINMUX
+ u- F3 S& G8 w6 @! Z //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- J! Z4 z3 r8 Y* ~. I. @, ` PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ! y, _0 O T3 C! U, I. L. y! e
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 3 v' p2 G! \6 K$ {1 d: I( X @7 I$ C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 T6 E' m/ i' b! A4 T 8 k" u9 T3 i1 M& u/ a1 H2 y) l
//SLEEP_EN,EPR,L138_SHK1,L138_RC2 l* B! j! r0 H9 n$ e4 v- c8 D. \
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); * F- B. R3 w+ |2 [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; + k& X' k1 N8 ~2 g, i9 @& ]
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ @' F. s( K: C, m% ^
6 f5 @3 A; j; @. \; ]5 n1 V9 d //RESETn,L138_SHK2
/ e# {8 @% r+ M PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" U( k% Z& b- @8 B* F PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
7 a9 O5 m. ~. M% M writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);* K- b3 V% n7 x
, n3 P8 E" D6 q& Y# j
" Q5 P9 |& J5 Z
//SPCR Register0 ]' s2 B$ ~3 c4 A; B
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset7 S/ i% q+ o- u+ o
temp = 0x03000000;//(DLB=0), L& s+ x( W" w' m J: i+ n- x+ d
// temp = 0x03008000;//(DLB=1)
6 ~5 ^/ ]* h: f! ?5 X writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
9 O# i1 e) `. q0 Q) ~# p# ? temp = readl(IO_ADDRESS(SPCR_ADDR));0 V8 w3 r6 x, m6 L2 r# G
printk("temp=%x\n",temp);
2 r5 V$ p \7 {& k
+ C5 D4 B B5 m1 x% } //PCR Register8 P) g6 g1 G; a
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ E5 I9 y1 _! V2 y8 X: f5 s& W
// temp = 0x00000F0F;
2 R3 S" M$ ^3 \5 c, Z temp = 0x00000B0F;' r7 M) ?. v" {+ \
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
h: I" P7 b- S- t6 s+ s i9 G temp = readl(IO_ADDRESS(PCR_ADDR));% _& p5 L7 `, l+ N# g
printk("temp=%x\n",temp);
! x5 L0 ^) X3 m+ e8 Q b //SRGR Register3 C) f K+ m4 z1 n% I, h }
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 E. d$ A4 Z6 U( h
//temp = 0x301F000B;! X( O( B+ ~7 G d, T: q
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
' H4 m, w$ o1 _/ L5 S: A& H temp = readl(IO_ADDRESS(SRGR_ADDR));
" `% {6 Y o6 r( P: l printk("temp=%x\n",temp);
# n! ? I( Q9 z2 i6 T4 s: w3 N //RCR3 `' h( K8 \# @+ J |( x
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 K8 L) c0 j1 p1 a. i
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 Z: e& b3 ~# r7 ?' b7 ~ temp = 0x00440040;
. V+ A& Z, D9 U$ l" K5 j( Z; N writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) K5 L8 m( }7 n5 Y. Z# P temp = readl(IO_ADDRESS(RCR_ADDR));
9 t& i! l4 h$ b- j4 V/ \4 p printk("temp=%x\n",temp);' J, G! F) i4 s. w9 R) r; w+ I
//XCR
0 u3 B+ l) p0 c! u- l. b+ p //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 J9 K* c. A2 C9 N: S; ` {/ i //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& ?+ Z: Y" d8 E; ]1 h( d' E temp = 0x00440040;
6 }& g, m$ a: c! t8 ~) S writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
# r6 W. N; p* u/ U temp = readl(IO_ADDRESS(XCR_ADDR));
* J! W- Q) {* K/ R- n1 ^ printk("temp=%x\n",temp);& M0 Y& ?: }. u7 w& l( [5 g9 g/ X' O
udelay(100);
3 _8 \* C5 H% R* v0 j9 L$ G/ D //SPCR Register" @+ g0 I- w- M. g# s
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ [ }- p: |/ { temp = 0x03C10001; //DLB = 0 VS DLB = 1
, V z" Q8 F) l writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
$ n. q: f$ j. ~, T7 T6 O9 S temp = readl(IO_ADDRESS(SPCR_ADDR));& \" m1 U* i1 y, h: M, x7 ^
printk("temp=%x\n",temp);! V! j3 P8 C' n) v
udelay(100);
+ f" P6 L5 Z1 r! W( A$ @( u
7 @8 H7 x! [5 n5 { //set GPIO direction
2 Z% a8 Q& Y1 B3 e$ {4 [# y* J- a temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& S+ y- V A! I) K# X temp = temp | 0x00000100;//EPR----input9 x) G% f Y1 G8 F5 s1 L/ d& u
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; F" u% i" a! @* S- ?( @5 _ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) o2 F3 C1 `* |
6 M$ d2 i6 f! J' h% x- d
return 0;
0 A: O0 k' N! o2 L" v1 t}" z! A' {: g: n
static void __exit MCBSP_exit(void)% u4 P* @) v# b, T" _
{
$ i3 O; _; P1 e4 o; s; k5 h" T1 Q9 y printk("mcbsp chrdev exit!\n");* w$ l! ]5 G# K: a$ M- V$ ? i
cdev_del(mcbsp_cdev);2 E$ T- x8 w1 t( w# I
unregister_chrdev_region(mcbsp_dev,count);
# U+ K" Y) ]+ \- {9 b$ G, A2 M device_destroy(mcbsp_class,mcbsp_dev);) X( l: p8 F% H7 g! x( J7 |" {
class_destroy(mcbsp_class);
d, S% W8 u8 ]2 X: y9 ?' T* _8 w9 Q}+ T3 ~. [ a3 q
module_init(MCBSP_init);1 d* {5 J+ \9 `, g7 S9 l9 }
module_exit(MCBSP_exit);
% r: v$ F4 A* t7 S5 ?3 w; g z6 L2 M
MODULE_LICENSE("GPL");
+ d1 [+ q n& v+ E; B1 _0 T
5 a5 ^& @) q% m' k+ c我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 @0 X! J0 h" I9 J+ _2 N
我的应用层的测试程序如下: U; O0 C ~) B- i' K" l( V
#include <stdio.h>
! q% u. \( A$ H( A6 r( Z! T#include <string.h>
1 L: ], T3 n \; y6 }/ i' i#include <fcntl.h>
5 z9 _" C& M t+ H3 K: T#include <unistd.h>
4 e/ P/ C. |/ D, C' ^9 u2 I7 b#include <signal.h>
: X+ g+ Q1 h# L# y0 z#include <pthread.h> //线程
3 \# s9 |- R; P6 m) r: e1 j8 G#include <stdlib.h>: K/ _& ^4 }; A1 g
#include <pcap.h> //捕获网口数据0 j$ { f5 L g; |- I
#include <semaphore.h> //信号
- }* G# F0 g* P9 @4 F6 J#include <sys/types.h> //消息对列, u% L9 w) p6 k5 J8 k: {
#include <sys/ipc.h> //消息队列3 `& d4 N7 y( y9 D# V4 r2 ^
#include <sys/msg.h> //消息队列# [& n0 F* E9 D- p7 {2 U6 x9 H
#include <sys/select.h>
& p) g3 H4 w: A2 z; k#include <sys/syscall.h>
8 ]' n: ]6 ]* x5 b. S' J#include <sys/stat.h>
: W6 n3 N+ }- b: y/ @' I#include <sys/mman.h>
& V+ y' ]7 {* q" w) k#define msleep(x) usleep(1000*x)/ M) M2 F; d& b) m f
( M9 a5 H1 a% D$ h& a+ T+ e: E
int main(). k" R' G! j+ Y5 d- G
{ ( S" E- x, I' h; o8 v
//MCBSP,ARM与AMBE2000交互设备2 x9 g4 Z3 m5 x& R
int fd;" ?" \$ b) g+ d" C# g% o5 N
unsigned short data_write = 0x5555;
( J9 z$ j3 k8 g8 J+ [* r unsigned short data_read = 0x00;
% M6 t, _- ^! q# J1 x! k& v fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, w2 {) _7 M$ t0 n- |+ Y8 t' { // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- Z) Y7 V) i" g; `1 F, c 9 ~5 @5 K# D( O! _& c
if(fd < 0)
$ @% G7 g+ v2 M {
1 k5 k0 w4 ]7 V. o7 x3 C perror("open failed\n");
1 u( K. F" @3 s# W6 w6 i m0 m return -1;4 a6 c1 k* l f/ l
}
; C @, S3 ~, F- R* \ + t5 y4 b, D/ s7 M3 w- x+ W
while(1)
1 L# i8 h, M4 W6 E, | {. G' m% t2 \- h. b* j& J
: n2 H/ W o! p7 u //AMBE2000每次读写是24个字为一帧
. v. I1 i- u- W7 A4 r4 H" g3 H //写数据时将数据在底层存储起来,等到中断的时候再发送( p3 H! Q% R. s9 u
//AMBE2000输入数据是以0x13EC开头的
+ ^) l) i) M* g5 L3 U& S write(fd,&data_write,sizeof(unsigned short));/ W3 H( M8 _% ]$ ]! I
* X5 G4 L5 N; b. Z
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
, ^( R7 i0 \8 H2 H3 `% W read(fd,&data_read,sizeof(unsigned short));
2 }7 X2 {5 \9 N, [+ N
9 J, Z* e! T3 |; ~) z* N' ?$ p if(data_read == 0x13Ec)
7 a. Z7 T+ H( ~% [& e: P {8 y3 k6 a/ g4 ~0 E
9 y3 V/ t$ w7 X; _. }5 y% n- E3 R printf("data_read = %x\n",data_read);) Z+ l# S; Z) I" a( A& P. e8 N
}
, z& q: Y/ s# c7 d$ k7 m# d
. I+ x6 I* a2 A$ E% ~$ j msleep(10);. G4 D) w) b' i( G5 _; }
# {; i5 Z6 v8 [% H' H
/*0 n: L) u- G/ i4 s! S9 h" ?
ioctl(fd,1);
8 I% B" u9 f. _+ S' m) } sleep(1);
`$ s+ f+ [8 N! Q4 K e ioctl(fd,0);
% M5 ?2 t7 y8 @2 w sleep(1);; V' |4 E' V1 j
*/ , H6 j) B# J) O. b }: t
} - ~4 N0 d" r. m
return 0;
- ^3 C& ~, y6 {5 u( n3 B+ d4 N5 K
% W( P+ ?& q. @3 ?/ r2 ]}
$ F/ d5 g5 N3 e5 r
- _8 d& [: T7 I: x" H! X6 _! ]0 `- Y多谢各位指教,谢谢! 急
: M1 E ]; K T: u. E) x0 z5 Q2 \
# J8 u5 F$ K- a$ M
& X' e9 n a- a# M
/ G! k9 N' g2 g# s; o/ d" D# L
6 }# K X# R& y- \ |
|