|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * p' `7 e* p% ]1 h
/*( E/ S$ F$ f# d, ~. n& y& J, k, u/ t
* Copyright (C) 2009 Texas Instruments Inc4 b0 n! S# E. v# c# @. Q% }0 J6 j
*
3 i7 n6 q! T5 b) ~9 w * This program is free software; you can redistribute it and/or modify' T8 Z- X2 i2 L/ {% s% ^# e
* it under the terms of the GNU General Public License as published by
3 w' J9 v4 S$ a6 `* k2 K7 `+ j * the Free Software Foundation; either version 2 of the License, or4 C8 ~5 m3 b2 B2 d& @& M
* (at your option)any later version.
" ~) d9 W: l/ i1 b2 S! z3 J *
# Z" o- ?, P5 ^ * This program is distributed in the hope that it will be useful,6 }) K# m( G$ g5 {+ E+ E R
* but WITHOUT ANY WARRANTY; without even the implied warranty of; N3 V% V5 o% l0 y6 K
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# E. X6 y+ _1 F5 c5 D8 ~" t * GNU General Public License for more details.8 }( T: T* x6 ^# a
*
) g" x/ e$ y4 _8 u; c0 P/ x+ ?! S * You should have received a copy of the GNU General Public License
$ _% g0 z! ~5 }% C * along with this program; if not, write to the Free Software
7 v9 Z; m( ^' Q, w8 p * Foundati0 d! R: c/ g+ w, }
*/
" X7 m( y: Z! j& A( k3 k#include <linux/module.h>+ \2 E3 ~4 N- v
#include <linux/init.h>
1 n/ F8 N& h( K& S#include <linux/errno.h>
6 P2 _1 w$ {- K" s+ C9 j k#include <linux/types.h>
6 W6 n" i* j m% `( g3 v#include <linux/interrupt.h>3 [6 P" Y: _5 p% Z
#include <linux/io.h>
1 U5 i ?; Z/ S" z) y+ A5 T6 z#include <linux/sysctl.h>( j- R+ \ _) l3 n( Q f+ O
#include <linux/mm.h> t# P+ F6 J$ `: F9 D0 I
#include <linux/delay.h>
& H5 d1 h* B0 j4 \% Z#include<linux/kernel.h>! b( C& Q/ |, ?% M
#include<linux/fs.h>
' x% ^& s9 k/ l8 T#include<linux/ioctl.h>: ~3 J! |9 L4 f) x* k
#include<linux/cdev.h>" F& Z9 _6 ]& U" j! \ w) ^2 j2 q
#include<linux/kdev_t.h>4 o3 |4 p- q b7 \% a% T
#include<linux/gpio.h>( n5 P' s! Q3 ?
#include <mach/hardware.h>) Q& g. U0 B1 z/ W3 |% e
#include <mach/irqs.h>
e% L! P3 `( Y, @
7 b3 ]# m8 S/ P9 i#include <asm/mach-types.h>4 B/ Y } U5 c5 N( ^( J: m6 W
#include <asm/mach/arch.h>8 f2 p- I2 Z8 V4 P
#include <mach/da8xx.h>* D: v5 Z. V" Z# x
#define SYSCFG_BASE 0x01c140008 e. ^' ]1 r0 U9 N
#define PINMUX1_OFFSET 0x124
& _9 F$ h F) W9 K; B#define PINMUX18_OFFSET 0x168 ; q# d! O" ~3 w, G; y3 b7 \' G
#define PINMUX19_OFFSET 0x16c! G$ S' X* c+ l7 U
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR* z/ h2 j4 ^" v* r) S I
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 q1 C7 G4 s, H( `8 ~, t#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
2 q/ b! F2 t+ s6 l6 p' D#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR/ U6 F# C7 n5 F$ m# s( S; y2 C
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 y5 z6 @8 F! j# N, e l
+ W# _' Q4 V4 H; g#define DXR_ADDR 0x01D11004 //MCBSP1_DXR" N* g) G2 f* K) G0 Y
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR) r+ V+ [8 t, \) i X* A& ^
//PSC- i, ~' X- w) |2 ?( P) X
#define PTCMD_ADDR 0x01E27120 % M+ a; T2 M9 @: U' ? K
#define MDCTL15_ADDR 0x01E27A3C6 P2 S0 @# I' q
#define PDCTL1_ADDR 0x01E27304
8 A7 {$ c' R, f+ A" f3 d. \//GPIO8 direction
: B% H9 { \- e, f, e. b#define GPIO8_DIRECT 0x01E260B0
( A8 g* T6 j8 w& A; g8 K* i#define GPIO8_OUT 0x01E260B4
) @; D2 S7 w# f$ u! H3 `! b, b#define GPIO8_IN 0x01E260C0. l2 b# R; q' C) g: P
. e c7 q J. h E. G8 W L0 _
//#define MCBSP1_RINT 99
$ A' J8 P4 Z9 D+ A) |, W. q2 r9 Y//#define MCBSP1_XINT 100 : m; e+ _% ?3 A! V8 F
static int MCBSP_MAJOR=239;
' W1 s I& P! N. Cstatic int MCBSP_MINOR=0;
# J! O2 K. W F- l V, Pstatic int count =1;
* y. f/ _* V# i4 y1 q
7 Q$ u" |+ `; Z#define MCBSP_NAME "MCBSP-device"7 U8 m; ^* L) b6 O2 f) p
( P3 v" }2 V+ U7 e5 k6 B% \
static struct cdev *mcbsp_cdev;
/ A; C' I% |9 |+ G" ]& e9 dstatic struct class *mcbsp_class;
; E& D! p h* z+ y* ?0 Estatic dev_t mcbsp_dev;7 V+ }. Q: S( M. B5 v! ]
unsigned int DRR_data;. U* d) N o* f6 ~% K6 F
unsigned int DXR_data;/ Y/ d; {, y; [ l" n1 b6 M
static int mcbsp_open(struct inode *inode,struct file *file)
1 L b- P* S! G* V2 e4 l{
/ a/ D1 H4 b8 v# z2 _/ Q4 ]/ ]
4 ^0 p7 E$ L& V- ~+ W //interrupt enable,initialized- j1 V0 L( |0 `. h9 Q. |; X
unsigned int temp;
& B$ t, k$ f, _' l8 R //SLEEP_EN(GPIO8[10])---0& ]" O1 S- D4 `* u8 a2 o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- m- @* U/ h3 o6 ]" u5 K temp=temp&(~0x00000400);7 e8 F4 w# E. E* R, i# `7 [
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& `+ v! S% F1 c4 y. x- @7 v //RESETn(GPIO8[8])----0----1
/ }- K! u. @: r& M2 Y1 |( p5 W temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 ?& A9 D$ R7 e4 L
temp=temp&(~0x00000100);
5 r- U5 o9 J3 B1 y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
3 @6 P( I+ H8 z9 g udelay(100);
0 P$ ^1 A' P, @2 d temp=temp| 0x00000100;
( ^/ Y! H2 z$ i. m& h$ K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1# W5 P. N/ b! `* R
udelay(100);! G3 R7 {! k6 H/ z
printk("open success!\n");
5 A. ~- F: ~- _6 n/ `6 j- H return 0;
% R& C ^- }7 j}
: _% U5 o- f2 C# j3 v# \0 X- ~0 U7 i0 Z0 R% e2 ~9 l6 [
static int mcbsp_release(struct inode *inode,struct file *file)) p( |4 z% S. ^& Q4 `$ c8 {
{6 U0 v" ^+ m) x5 w' p1 ^ r
printk("release success!\n");+ n, e1 c( r0 w6 A
return 0;
8 l$ i! N J, |' E- q1 a}& g J! G3 c6 @# C3 ^. K0 U) }
; n, ^) M; _& I
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ ^# X/ a% ]8 K
{2 ~. J' q0 D I( `3 ]# ~
copy_from_user(&DXR_data,buf,len);2 e7 k1 Y4 ^1 c3 K( h5 v
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
0 M( W4 g$ E9 d0 Q; | return 0;
! ~/ B( Z2 a- N& y1 @
1 j( D1 h+ k/ s" A6 y}
* I9 Y' S, c5 G( K$ Q; n% n# b' H! M$ n: l& n. l0 _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), n& v% Z6 r. R3 X. z
{
" F7 ?- q+ S, c' x, P DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" w- N9 |2 t: q. O copy_to_user(buf,&DRR_data,len); 7 I6 H' _ u" K' Q
return 0;
4 d9 @7 X3 m6 _; E3 z( O}: j: N4 I# k, E, T3 K
8 v2 P* G2 v* Y
8 m" j K; T+ R& v6 \7 ystatic struct file_operations mcbsp_fops=
9 q4 e9 u) [, U& U) d6 J2 C8 x- T{& @% X7 O: m6 \9 a+ j/ M
.owner=THIS_MODULE, s& w" Z5 Y; J* K+ J. ~# p
.open=mcbsp_open,
8 M& V7 l8 o+ l; ^+ p .release=mcbsp_release,3 y& r! K0 \, u
.write=mcbsp_write,
! Y) W: Y* t- p! V: L! ]5 F$ d .read=mcbsp_read,
$ i$ ]7 m( t: F3 R3 w};
" `7 d+ X( J" \1 d8 L6 d3 ^static int __init MCBSP_init(void)
+ o1 O+ M: J8 a' X{
" j" F. U8 D* X! X( z5 U" A) R int ret;) y3 E1 G' D9 C
unsigned int PINMUX1_REG_old;' s- `' u% K" S6 P2 W' q6 U
unsigned int PINMUX18_REG_old;" e8 K5 b$ B- |' |3 @/ g5 C3 a
unsigned int PINMUX19_REG_old;% W& z+ F3 M- d6 C6 I9 {. b
unsigned int temp;
( N# |( j- U- `1 |6 z2 Q if(MCBSP_MAJOR)
0 C: b9 O* Z; Z" g: p" _ {5 r( C# \$ e2 y& u
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; z9 d; H( _+ ^0 `: C ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ l* }. |+ M7 G. J' O }; z* r4 ]: J5 d! B7 d, T6 V
else0 q! x5 s+ G+ e! @; h$ P4 S3 [
{
& z/ l% z9 A7 f/ |! W( b ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 t8 m7 k( {+ u) F; r8 B; b* ~
MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 O5 c6 \! J# j; S0 m4 Q }# F* P1 V5 W% U% D" d
) u8 i. M# J/ G- T if(ret<0)) |( C- Z; s# s- V1 w# b. @
{
9 ]" x/ L. K; z3 q printk(KERN_ERR "register chrdev fail!");2 g1 q- v+ \. `+ Z
return -1;
" \6 C! ?. v( ~3 o }; t7 e, Z( H. U, C% ?3 Q" E! b
, X A, f+ i1 G0 C7 e) R+ j) D- @
mcbsp_cdev=cdev_alloc();
, E' O4 u1 _! w$ R% K2 P ! | h- d! |8 X7 R4 E2 U, M
if(mcbsp_cdev!=NULL)
' }/ p! \$ O" Z5 ?0 Y7 _; } \ {
& Q& V2 ` Q0 Z1 ` cdev_init(mcbsp_cdev,&mcbsp_fops);# B& w& E( M' Z' H
mcbsp_cdev->ops=&mcbsp_fops;: A; V% O1 i, H
mcbsp_cdev->owner=THIS_MODULE;
8 G% x7 J0 ~# x% Z
. N/ {# s& {; d if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- }2 W& Y8 |( q- P- s printk(KERN_ERR "register cdev fail!");0 c# r' e- P* ~. a0 d% d- i# o+ \
else
, P4 k8 h7 j- F- m6 U9 a& G! D printk(KERN_ERR "register success!\n");
/ w! }% }: b8 [! ^ }0 F* n4 U h$ I
else
7 X. _: m' o$ D$ M {
/ i" Y: S' H* q: u2 @; Q4 r! V printk(KERN_ERR "register cdev err!");
; I$ X& g# f& [/ l; X9 y `) e: T return -1;) {( t& W1 u9 w8 S! n
}
5 E0 v0 v) `) N1 J; i1 s5 r! J 2 Y) y9 g% h! |6 }2 K' U6 n
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ x5 j0 q# N* q$ Y- ~
if(IS_ERR(mcbsp_class))' Y. ?5 o- u$ I$ v
{! n' J2 ]2 w c3 L- e
printk(KERN_ERR "register class err!");
8 ?5 {* ?/ Q$ y& c! X( Y return -1;
- i9 l7 E1 g' ?, O! G }
" _2 U0 y8 h+ E! V, C( z device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; `( I& Q- m2 s1 n s
4 g# Q& X3 Z6 i //PSC3 ^. ~. J( ^. s
//add Enable MCBSP# o/ e7 L" t8 [+ F7 a _/ Q! \2 U
//test# ~: g. q. ^7 B' R
temp = 0x80000003;
* H# }" W0 @4 a9 q, I; e writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 x2 z$ Q3 o! j- A, A' K3 L
temp = 0x00000003;
6 Q1 @6 T# n4 X2 ~0 A; P writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 a7 W4 _' Q( K
) M" C1 Q( x; M0 T6 W% \1 K! F temp = 0x001FF201;1 L3 U1 j, R: g" T7 \( t
writel(temp, IO_ADDRESS(PDCTL1_ADDR));" R D1 C) M$ ~- u8 t U8 L
- L. K+ I! o! M. _% w7 u4 X' r
//PINMUX 0 ~* t& O" S% m1 w* T( S
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 V5 U0 I- p$ s
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, ~. P& [% S! s2 P PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 9 \$ ^) J, y& ~( F
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 B# O2 r4 k8 B" N $ o. e/ I E |% e
//SLEEP_EN,EPR,L138_SHK1,L138_RC% Z; N1 H, {! c7 `
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 z/ t7 q7 O" H [ PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & T1 D( c; m* L8 i# p
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: x& E" S% e5 U" I" ?' U) x, @0 O2 e7 Z
/ k5 y' h) ]5 s: H5 _# g2 v //RESETn,L138_SHK2 f) e% H4 Q' [, b
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 O5 k0 U2 v$ W- @ PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 2 R2 B( l" I8 ~6 _1 \7 _8 B
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. G* v- y% U' m3 T5 v
. k% ]$ X. L& t: r6 a2 }
" ?) k$ C$ U0 n7 R3 F& c- L0 n" Z //SPCR Register- a& y+ R7 ^2 C& {8 p* U) }
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- A( y! z4 _) b- z
temp = 0x03000000;//(DLB=0)
- a l' q. `/ b( | L // temp = 0x03008000;//(DLB=1)
/ R. }( C) ^9 n) q' L writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* u2 K" X% m) ]' d& }' w r temp = readl(IO_ADDRESS(SPCR_ADDR));) |6 L7 j. M% z" Z
printk("temp=%x\n",temp);
" g& \6 }( C, P7 i 8 A' c' K0 O1 ?" r
//PCR Register
4 u0 {& {, P: y* N. [ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 ] ~* [2 d8 C) d- k
// temp = 0x00000F0F;' z! E0 j( t: F; j) Q( A
temp = 0x00000B0F;# _2 K8 S7 c u6 _) x) L# o
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 O6 w5 }, H) F. [ temp = readl(IO_ADDRESS(PCR_ADDR));1 x* I# X. w4 U+ Y4 K
printk("temp=%x\n",temp);
- m$ f G2 m: d! k2 T) W% F //SRGR Register) [' X+ f2 D1 {" }4 I4 F; B, y
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: ?. \8 [( D' I7 W0 m5 w# _ //temp = 0x301F000B;
7 \% m) x2 A% y% _, i writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * v' U8 `1 Y1 ?5 n
temp = readl(IO_ADDRESS(SRGR_ADDR));
& O" N8 w3 \& m" R! W% o printk("temp=%x\n",temp);
! p A# |3 W1 m' a/ T/ l7 ] //RCR$ w7 T2 A0 o4 j" M, L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 l4 e2 {6 }, E! d9 U+ F; S t, t //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" a% f( g* n6 R3 {0 X' R$ Z temp = 0x00440040;
- ^. k. g* B% d* V8 |( w9 ]( x* ? writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
: g# {/ M; s+ u4 K+ t# b temp = readl(IO_ADDRESS(RCR_ADDR));, p) v& R; e8 Q0 f8 s/ ~; h9 }) [
printk("temp=%x\n",temp);
0 W# y+ W; {: y+ _" r6 U //XCR
" p# `- r: t! z9 r //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 X1 {# y' z$ j0 G# d
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
( s9 V/ ?3 I i4 w( T temp = 0x00440040;3 }* ?5 ^ e% j
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : Y {" |, i, E) |
temp = readl(IO_ADDRESS(XCR_ADDR));4 J$ F0 N6 P q0 H
printk("temp=%x\n",temp);: O! x5 Q) |5 N7 y- C8 X% \5 F
udelay(100);
$ J2 Z$ d! g( A; S //SPCR Register
+ J0 Z B4 F) Q/ y //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 U7 d, V! y% `9 ~0 |2 t temp = 0x03C10001; //DLB = 0 VS DLB = 1+ t) k: ]+ u+ G. {- j. v) ]6 c( x. b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ _; D6 Z8 c; s# N8 K
temp = readl(IO_ADDRESS(SPCR_ADDR));
, U+ n$ L( \ k# B2 W8 ^+ t printk("temp=%x\n",temp);
& @; H) m* H m/ \ udelay(100);2 I. U/ V6 Y! t6 ?
- e7 B0 F Y/ f. K" i
//set GPIO direction
& M- e" Z" {# P% [3 K$ [3 w temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 y+ i3 E* W) i temp = temp | 0x00000100;//EPR----input6 X4 Y, l& J( N( r* ?. i
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 J% ~: E( A: g9 [7 m$ }
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 M( V' I* ?( \1 H3 E3 p( \- r
1 M- f7 t3 k$ M; ~. @1 @! j return 0;
- ?$ C3 @" O( |, P$ T}
" {6 b) X X" N1 i, {- lstatic void __exit MCBSP_exit(void)1 ^0 U% R9 k7 i
{5 B D9 i0 Y L, V# T% n4 x b
printk("mcbsp chrdev exit!\n");
6 c# c- O' v; e& `" S* g3 [: S cdev_del(mcbsp_cdev);
9 O$ O2 q+ s i1 q% c unregister_chrdev_region(mcbsp_dev,count);
. O" K# r% k. G( k# f! h n u device_destroy(mcbsp_class,mcbsp_dev);
' b X2 O0 j8 ^# B7 z0 \( A class_destroy(mcbsp_class);
: Y3 N3 b7 }2 V6 k: d; x! R}, t$ k; M' J3 Q+ i9 Y3 F- m
module_init(MCBSP_init);
) A7 J3 y ^# b. F1 ]5 L6 Dmodule_exit(MCBSP_exit);
. ~8 n8 R# ~, `/ _% w
+ Q$ Q" V7 \4 _: L% D; K3 t% }MODULE_LICENSE("GPL");8 ^7 E6 P, @- N2 C. Z$ {. s
9 d3 u/ A' i) B/ }
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& t3 h6 h/ e: x7 o+ _
我的应用层的测试程序如下
, i# `0 x- W6 Y# t& h% W9 Q$ _#include <stdio.h>
" W3 C1 X: E7 t#include <string.h>& w2 `: o0 R6 m2 ~8 I
#include <fcntl.h>( }; \$ r2 l+ C8 n! |
#include <unistd.h>1 y: a" S! m- c) L! H6 r& e
#include <signal.h>" _6 X/ C# I: K3 w
#include <pthread.h> //线程( B) m; i# e" h3 `! \
#include <stdlib.h>- b& U" L7 Z, b( J/ C4 _/ j
#include <pcap.h> //捕获网口数据
/ V. Q# A) } Y5 x3 V) M' j$ H/ A#include <semaphore.h> //信号8 r8 k: {6 A# p3 {* C$ l
#include <sys/types.h> //消息对列
* c) l$ X" j* y1 W#include <sys/ipc.h> //消息队列# v. j8 n% l4 c1 N' X" ^# ]" R
#include <sys/msg.h> //消息队列
& ?( X1 _5 |' R; ~+ @% F$ F#include <sys/select.h>
7 X/ B7 @$ m3 C3 E# t4 ^/ ~ a#include <sys/syscall.h>1 ^, T) P, R- g6 M/ _2 b
#include <sys/stat.h> H# t }/ b4 B/ N6 Y: L( [. H
#include <sys/mman.h>: @) ]) ~- X: }) M
#define msleep(x) usleep(1000*x)9 a, U% W+ `$ V
8 j7 J& [; h1 f! _: U2 C$ [int main()
" V, W- d' G1 a( i, t, Y) Z: C{
) P+ n. t% c( e" `- q) k$ ~ A //MCBSP,ARM与AMBE2000交互设备
, h& C/ I$ C# F! Z int fd;
# Y5 m" I, h' q+ @/ k unsigned short data_write = 0x5555;. n- V5 r$ `& N% E; m. o7 Q. n* `
unsigned short data_read = 0x00;
" b* P) v* j& e' \! ] fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);5 F) s' r' T" W6 ~2 R
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 I# j# |" X2 r+ ]) K( a' i ' K2 X+ ?/ o2 D" c& ?
if(fd < 0)! L4 r7 ?6 I( g1 i) t& e' w5 U
{
L% W! [4 R( F. }, |3 O perror("open failed\n");
1 S1 s9 Y g: s# b$ \9 \: Z return -1;
, M! ]: D9 l# W+ h' B; z }
: s* z0 \ M3 Q! g 7 q3 C7 O. x) ]' g% {
while(1), u/ B8 v0 Y: u1 r5 u
{
8 w* ~9 h8 h: @. f% v
" A J" I& J: M: U. R //AMBE2000每次读写是24个字为一帧0 ~4 K7 F8 R' u
//写数据时将数据在底层存储起来,等到中断的时候再发送
9 b% Y" }: Y% n* E' B6 X //AMBE2000输入数据是以0x13EC开头的
- D, c# M) y& j/ e4 l write(fd,&data_write,sizeof(unsigned short));8 w& {6 k7 U: i% C
! S! J) z% x- n1 Y F. H7 E1 I //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
. H8 z; H# ?3 z' H read(fd,&data_read,sizeof(unsigned short));( A2 o; w M5 y1 B6 h- g
+ W1 @& Q9 k. Q- j
if(data_read == 0x13Ec)) E$ T6 f& J; i1 w+ R0 c q$ l" Q* d
{. I2 K. J% e: W8 A6 F
+ o, y4 ]- V3 J Z
printf("data_read = %x\n",data_read);
$ Z3 V u( ]9 R; A }/ c1 z. d8 r+ [& ]6 T' \/ Q" X
8 e& G) V& v' ?3 \+ A msleep(10);7 O @: j, G" |8 |$ [: |; r
: C4 O0 @4 L+ A i: T8 Y) k9 d' U5 a
/*
1 u; Q4 r. r; D/ B# I ioctl(fd,1);
( K4 h4 z5 `9 M4 c- D sleep(1);
2 f* }! ?, }: S2 J7 x q ioctl(fd,0);# ] Z2 W' z% `3 L5 C
sleep(1);
+ U3 M, ^7 g* \7 e2 s7 T */
# \+ D9 w' T& N" b! U; m: N) Y* r }
0 m8 }- f& J' x% c* ? return 0;
4 S! s# U1 P* n0 l7 |4 ^+ N! ~& f
" ~' o% V1 K" X8 k& X: `}# O* m* p+ ?* N& h
3 S% k& O3 O4 s/ G3 V. {4 ^多谢各位指教,谢谢! 急+ N, b+ f5 @( G
( S7 ~1 b$ j; @' D2 o W/ |+ t
: q6 t$ C1 r f3 H
' p0 i" k# m1 R# P3 h6 O
# |$ X% }# M2 d6 x' \3 l. H( G) Y; z/ p
|
|