|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# f+ O9 p0 r" s# X8 p* f) N2 ^/*
, c! i* E. ?; R* L1 M2 z * Copyright (C) 2009 Texas Instruments Inc$ w. ~+ `% ^/ O
*
" t- H5 w9 {. l) c( r * This program is free software; you can redistribute it and/or modify8 t2 _% l6 K8 K5 [5 T
* it under the terms of the GNU General Public License as published by" s r" a/ ^ \, m5 P! r" H! W8 ^
* the Free Software Foundation; either version 2 of the License, or
, {! A& d' C0 w# K' E * (at your option)any later version.7 y! X+ {# _2 x
*
' K- X/ T' m, r0 ]6 l: v * This program is distributed in the hope that it will be useful,
' O+ C) e& B4 B X! P K * but WITHOUT ANY WARRANTY; without even the implied warranty of
, n" G ^% O5 g * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ v. Z- T% H, |6 G* p
* GNU General Public License for more details.
+ |( Y2 V1 [3 ?) v& e *
# H X' R* L4 D# Z * You should have received a copy of the GNU General Public License- \: V0 {; T$ [( `: q2 U& A
* along with this program; if not, write to the Free Software
; U, f( K7 L% G, f# O * Foundati1 K- {2 p% v3 p( E, B$ {
*/
- l n8 ^& F- F" I9 a* v) L#include <linux/module.h># o$ a8 A' m! n5 v, b3 t
#include <linux/init.h>( w# @- }5 A6 P5 A
#include <linux/errno.h>
! \& A7 k( X& R# r0 O( ^5 N) E" S#include <linux/types.h>
& m/ [, ?2 G% ~0 P#include <linux/interrupt.h>" H2 A4 u2 R& f; u7 @1 \4 b S
#include <linux/io.h>" |* b5 q5 m0 K6 R/ R
#include <linux/sysctl.h>
# G6 O7 M0 q! e; h* {$ ?9 k#include <linux/mm.h>
" }+ w( y' S* I: b#include <linux/delay.h>3 C( J z- }5 b* U+ ?+ [" M. }7 @" `
#include<linux/kernel.h>7 D; c/ X' M4 C" \, H
#include<linux/fs.h>
; B5 l" r7 j9 u: p#include<linux/ioctl.h>3 t9 b( k9 Y K4 O
#include<linux/cdev.h>
( g" S* J9 l4 G* \9 Z#include<linux/kdev_t.h>
5 Y2 C& }/ r& } e4 _) b1 r6 O#include<linux/gpio.h>
2 M! M, |, [) k#include <mach/hardware.h>
/ U# W8 P- Z+ P" w. ]5 l#include <mach/irqs.h>. o5 Y( P3 \& j9 V; K% a) W% E2 ^
2 c8 Q: V0 r l% K- [; C# r
#include <asm/mach-types.h>/ O" G* r4 U6 Y7 [$ ~5 ]! z
#include <asm/mach/arch.h>
3 p" d) \% ^! R5 O#include <mach/da8xx.h>5 {; }0 m& x& J& i& n; i& `" I0 u
#define SYSCFG_BASE 0x01c14000
1 h# ?/ U) t. ?1 B8 @#define PINMUX1_OFFSET 0x124
, p6 O7 ^1 I4 G& r, a8 U: a#define PINMUX18_OFFSET 0x168
' o1 s+ w2 }' [5 v C' ~; E#define PINMUX19_OFFSET 0x16c
S! J( F& E3 V- i% L0 g5 W" b#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% L( g3 f3 i% H2 Z#define RCR_ADDR 0x01D1100C //MCBSP1_RCR4 |9 l) L- [$ T7 S* g7 u
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
/ k5 l2 e8 e2 ~4 [) i) ^9 j) t; L#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR9 x& X- X/ n6 c! q
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
- j& P( _$ n2 {; [9 N1 x. M! A% m
9 S8 N, A- N |7 @+ }& M2 p#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
) z4 K0 U7 d' Z" z5 q( z#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 z: t- R# I0 d1 P# R//PSC, ]5 b# ?+ j; s% v% W" y9 k+ Q
#define PTCMD_ADDR 0x01E27120
% b9 I; h9 F7 u3 S' N8 U" i! ~#define MDCTL15_ADDR 0x01E27A3C
8 l4 }- Y* c h0 e#define PDCTL1_ADDR 0x01E273042 Z0 F8 K# {/ }" a5 o6 b1 u
//GPIO8 direction8 ~/ X+ i! Q$ A6 I
#define GPIO8_DIRECT 0x01E260B0
1 w: f$ _! p, I& `5 c( @#define GPIO8_OUT 0x01E260B4! S) `1 E" z+ V: _& r% V
#define GPIO8_IN 0x01E260C07 J. O4 r7 |6 j; F/ ^2 `$ h! }0 ]
( E4 ~: t3 U8 ~3 I- R( y* _2 S, ~/ q//#define MCBSP1_RINT 99 , D; p- T" d: l7 h. T( q4 _; z
//#define MCBSP1_XINT 100 7 f: P% o" T9 n& m; s- P
static int MCBSP_MAJOR=239;: N' J3 J; C$ a$ i) n" z
static int MCBSP_MINOR=0;: \' Y" Q4 i9 H/ v& g/ O
static int count =1;
/ p4 \( ^0 A- x9 }% }0 C$ V3 I2 \
& e0 Z, ~) v* [# g#define MCBSP_NAME "MCBSP-device"
7 Y% {$ ^- t2 |; s
7 d" a7 G6 V% H+ o8 P) x8 p8 t6 O- ~/ jstatic struct cdev *mcbsp_cdev;+ ]8 m6 X" W8 o4 T; K" ~4 [* Q$ {
static struct class *mcbsp_class;
7 A+ i& ~$ [3 J0 s6 E' |static dev_t mcbsp_dev;
# B& b- c) m' l: i& cunsigned int DRR_data;1 @! _1 { U5 ` f7 C* ?; @- \; w
unsigned int DXR_data;
! q8 n4 C) a3 [2 q6 Estatic int mcbsp_open(struct inode *inode,struct file *file)1 I; a! l$ ]! z: @
{
1 Q5 K% g2 [* T: J U& q ! ?: w0 F* d3 _) B% X6 H
//interrupt enable,initialized
$ x- s( V" T8 X. h3 X: n% _6 s unsigned int temp;4 q. M: |# Z6 j8 \
//SLEEP_EN(GPIO8[10])---0
. J6 |* R8 M; ?; O2 x temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% p0 @. s% B: l1 `; m0 T% n+ [ temp=temp&(~0x00000400);; C D6 ~, ^' T- M+ F
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 R( a! H* @( I1 Q0 N
//RESETn(GPIO8[8])----0----13 s6 i: L% [ x5 x; \3 n; E; Q) I
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: x) m" z& L, a temp=temp&(~0x00000100);# C2 a, F/ h& v% {+ `4 n
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---07 p/ X3 ~# r7 D% l$ a8 v
udelay(100);
+ k; Q+ P* P2 `1 D0 c# W0 g temp=temp| 0x00000100;/ q7 J+ `' V B% n8 D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" Q2 i( \: @7 r6 y udelay(100);
/ [ [4 B% z7 B3 Y O0 }3 } printk("open success!\n");
/ G! \$ _) ^ H% `* z: v return 0;
9 ]+ ^& @# U% ]6 `}
" i- S& {6 \! M! D, N0 T0 B! k6 k$ F" R
static int mcbsp_release(struct inode *inode,struct file *file)/ l2 U) P7 g8 P0 Y
{( t2 m8 U S0 w- @( `
printk("release success!\n");9 h; t h+ R6 k L
return 0;+ w' t+ w8 L7 O9 w$ K
}5 Z/ D. l2 ?% P, K( B
4 g: ]3 Q/ Z* U4 S' f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ x5 Y \0 O8 e. f
{$ l6 r% u- O! o# B. W
copy_from_user(&DXR_data,buf,len);$ H$ b3 l. N% V2 V) v$ ~" P' ^
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% o' W1 a" y, N5 A c return 0;4 J. Z( g* l" @5 G) @$ @9 H
/ \6 m: T4 x( u% j}' j9 I7 j `& x9 ]' X; Q; n" @
! x" F1 L& I& b3 l6 l! O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( [* m6 s' D/ Y9 k2 Y& b{ # y) b4 ^+ L4 f7 v
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' S0 t3 h& v; Y: u8 l$ w0 K! T
copy_to_user(buf,&DRR_data,len);
1 j# b& S. X9 f( w' `8 f return 0;( j! q( I* q3 b0 x4 ~, W8 g+ T
}6 i0 x8 ]7 S: T2 s
( }4 L, R* D. a9 U
# l8 }* ?2 z; w4 Y
static struct file_operations mcbsp_fops=- v7 h# b* T& @. x8 E
{. U4 w9 Z) @5 H& r4 ^! {& q' m
.owner=THIS_MODULE,
( s/ b- _1 E: a) X" b .open=mcbsp_open, j% L1 ?# m9 e* h- h& o
.release=mcbsp_release,
- E: m! z! V: B0 h .write=mcbsp_write,! q% G* h0 w3 X. Z
.read=mcbsp_read,
5 z- P- q0 |6 S" [% `3 _, X, K};
8 _6 _7 c7 C2 B$ i0 @0 Tstatic int __init MCBSP_init(void)
/ i" h, K- m* c/ G9 y/ Q{
) k1 \' V8 e2 y: l) A D$ @4 y int ret;
* M* y; ?; }( Z s+ g, P unsigned int PINMUX1_REG_old;$ c: n, A- Y8 b7 R" A( U! l! r
unsigned int PINMUX18_REG_old;
" j% ~2 \5 \" O! x unsigned int PINMUX19_REG_old;
8 `6 X/ p% u0 s& j8 B7 s7 Q unsigned int temp; 5 k& W) n6 N9 y
if(MCBSP_MAJOR)% I- N$ N: t( C
{# Z& B. ?7 @1 p* C u" e
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
& q5 h( X# ?' z* O4 _, u ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- i9 l" y1 A, Y0 ?" b+ Z' c
}, @7 D/ D5 e! C
else6 b. A+ u1 `! r, W+ s/ ?
{
' h4 Y2 T( i0 o7 s7 y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: s7 E; P8 h" w3 o3 v) i7 f4 K, U5 `6 `
MCBSP_MAJOR=MAJOR(mcbsp_dev);
& f5 D3 j9 `7 b& d3 T- O: e }
: B6 C& Z! Z( L |8 L . _ Q1 p+ ?0 X# c
if(ret<0)
( j: ^. t3 _+ l4 J6 i5 F4 e {1 ?6 q5 @) X! _7 y
printk(KERN_ERR "register chrdev fail!"); q) N2 ~2 X8 ~7 d/ i
return -1;
; k& f! ]$ u& n5 u h }
0 v0 Y, x+ m8 V' l% T" j D& S) ^ , E' ~+ {% a7 V& T1 e
mcbsp_cdev=cdev_alloc();9 J" _3 q6 M1 `# ^ R0 G3 g8 m
8 W" x: l: n. C! e; @! m! ?
if(mcbsp_cdev!=NULL), v$ G9 o. G% {" p1 _
{
& w; A7 |- c: \ x7 K! S4 V) t cdev_init(mcbsp_cdev,&mcbsp_fops);" v" }& f! K u4 k+ P [/ U
mcbsp_cdev->ops=&mcbsp_fops;& z* ~ j) m3 R8 ?; G% |4 l' |: x
mcbsp_cdev->owner=THIS_MODULE;
$ p8 e9 W9 X) F' U9 O# X+ \, z
+ e' [. k r7 e# \ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ S# M: E# Q) p+ k( H% M1 _
printk(KERN_ERR "register cdev fail!");7 W9 ]/ A) j. ?% l9 Z
else) ^+ u& E7 L2 T
printk(KERN_ERR "register success!\n");
+ @& i1 j; z7 e: e. l }* r& Q2 J, }, }
else. w2 J5 D8 x/ H) J) f
{
+ J6 | P+ N2 B" G7 W printk(KERN_ERR "register cdev err!");
: A. ~- G8 z. o( ~1 o e" R1 v return -1;
& `, S$ ^, X; U4 b }
* l! A. C6 z2 S5 [; Z( \
$ [0 d$ ~% v4 N3 a0 } mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) P: N9 u7 R m% Q$ a% [ if(IS_ERR(mcbsp_class))* |+ E1 G+ P' E8 r- p8 |4 j# m
{" h6 `# m% d( X, s2 m& T' Y; _/ {
printk(KERN_ERR "register class err!");
* D4 O9 W2 Y! g. g( n; T return -1;
& f: H1 W$ `+ ? }+ r9 `4 d' m, V+ p# v. D
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 W, }* W `0 r5 S
/ \5 G* W- F& l' g //PSC1 K9 ^8 ]7 f- c8 i4 M
//add Enable MCBSP c: _5 b& m( y( K' z
//test
( L8 m& t0 y) s% H6 N/ r" ? temp = 0x80000003;4 m3 v* j7 N M6 F' v
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. S: d! G! H/ I4 ` temp = 0x00000003;6 I5 y3 H# e( e5 f% Z' v1 V+ J1 W
writel(temp, IO_ADDRESS(PTCMD_ADDR));
) y V7 \5 c( z( s6 _
/ v- z& i/ q: d( ^ temp = 0x001FF201;' t% G G: h# q; y
writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 c2 K& I3 G8 e/ K( |3 v: i* Q( E
2 V6 K8 L2 S' g* B1 i. Y) v; a //PINMUX 2 L, r7 L' b% I% M
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" X- K8 e0 n3 }) L- h PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * j$ S! M7 }; v: h1 ^6 i- T0 M
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
- b7 W6 c" H7 o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" C$ S- J% C D
5 E' o0 v1 o5 t- F9 v A //SLEEP_EN,EPR,L138_SHK1,L138_RC% |" j$ m7 F8 w
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); " I* H: L6 V+ T
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
: g5 O+ [8 e3 { writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# ?" {# d$ O" K
a3 L$ I- m" }4 E( {0 D9 v# t //RESETn,L138_SHK2
: [1 ]! }1 K+ K3 S: C- l8 t( { PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); q( b0 I/ P! R! L
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; , v/ v3 {9 g! ]1 s- C+ X
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. e2 c' W* t0 i 9 _/ I* U! d6 A) G7 V
. p; L7 W4 j/ P) ^" P% \
//SPCR Register
8 A8 P" l: F( _. M) ~8 ]+ y% h //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 r" P1 _$ @+ ^- g: t" S3 n temp = 0x03000000;//(DLB=0)+ [) z0 i1 [. k- J2 x
// temp = 0x03008000;//(DLB=1)/ B6 c+ J9 H; \! A0 i6 E
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
x0 a- l& ^- y6 z+ T8 W temp = readl(IO_ADDRESS(SPCR_ADDR));
! e+ _ c6 r- x) s- z) K printk("temp=%x\n",temp);
* _9 D8 n$ e! o1 L
* D: ?& n! ]" A9 y" k; } //PCR Register( ~5 |$ r& x% D. `
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
# |; n% w2 D; u0 l# J2 |2 d // temp = 0x00000F0F;1 M. T* C9 x% b7 B
temp = 0x00000B0F;
, V7 _! k, g9 U1 j) X writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
) [2 E3 d6 n7 \$ [$ H! F. @ temp = readl(IO_ADDRESS(PCR_ADDR));* r+ u' k X! k
printk("temp=%x\n",temp);
$ U$ D3 c, r$ m3 ?1 w/ f! e h) b //SRGR Register
! R. ^0 b4 a3 H5 Z; R* h //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11% n3 M% W% O4 [9 d5 Z1 L
//temp = 0x301F000B;& A9 m: C( ~, V( V. z7 P# ?- M
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ! O- F; d7 t5 f- p
temp = readl(IO_ADDRESS(SRGR_ADDR));
, [6 ]- ?0 b5 A" {0 W printk("temp=%x\n",temp);7 I% e- u& y! t4 x# J
//RCR
; G! [$ {! y9 c% b* Y+ _; K //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 N9 Z( V: J+ H- y' z; x //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! O' ^; E* e w! }( t- r8 U temp = 0x00440040;
+ T: h: Q3 w: Q+ r/ _. ^8 a2 a; g writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized : V. N- i! G3 O3 ~
temp = readl(IO_ADDRESS(RCR_ADDR));
& `7 d7 s# j0 W5 A" m9 a1 s printk("temp=%x\n",temp);# Q, v5 a v6 \% L" W( R7 r% f
//XCR
: N4 }8 W5 n9 D9 T" J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' b) d( I U# d) T
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 Z. M) T5 b' r& [ X+ U5 P
temp = 0x00440040;
0 c( T1 ]1 U9 o0 d8 d( B writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized + m' } T; A6 N5 @8 X
temp = readl(IO_ADDRESS(XCR_ADDR));
+ L4 p9 E1 E) p0 V @, s printk("temp=%x\n",temp);1 X* c' Z9 `: {) A5 l0 s5 |
udelay(100);
3 d5 _. [; g: F! `2 R //SPCR Register4 y. d/ G" }* o1 m/ d
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: T" r/ t; L' Q* u: A8 b
temp = 0x03C10001; //DLB = 0 VS DLB = 1
; u6 f$ ]. k5 U$ I writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
! n- m7 x, W6 G3 G# e$ L temp = readl(IO_ADDRESS(SPCR_ADDR));+ m2 k3 `+ o9 o% ?- C
printk("temp=%x\n",temp);
2 F- e* `1 f1 w% ?/ `3 y) R3 _ udelay(100);
8 v" I2 w! i5 G9 p- x4 l! X! O: M q' W/ I8 z
//set GPIO direction: z& ]: \, B4 Q9 B5 v. n
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# P- y! n' \* f3 V/ {: b temp = temp | 0x00000100;//EPR----input* H0 [3 K& Z/ i
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output ~* t, X6 E% L* o
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 r" c2 B3 q5 N2 G" P
. R/ Z9 O% {* x. J% j$ @; X
return 0;
4 G6 @- C# _2 a# ^) |, O}1 I' p/ i' M+ z3 q9 i
static void __exit MCBSP_exit(void)
- c- Y5 A/ z% l{
! ~6 ^9 h2 e' i; O& g. Q printk("mcbsp chrdev exit!\n");2 g+ q: t$ \. T) o! {1 x; u( |! V
cdev_del(mcbsp_cdev);& t7 Y5 q) [; x: h# R+ s
unregister_chrdev_region(mcbsp_dev,count);
, J, h1 B4 P9 X device_destroy(mcbsp_class,mcbsp_dev);- b: _% P$ @9 D I7 r8 {
class_destroy(mcbsp_class);! Y. [6 J+ `+ Q
}/ i! |# u8 t: p% C: i [
module_init(MCBSP_init);$ P- B8 q2 j* p% Z+ n% m" m
module_exit(MCBSP_exit);, W% v, m9 V6 [2 J C( h
* A6 C7 f: _- F7 O: F2 C
MODULE_LICENSE("GPL");
- s8 ~: }7 S, B+ y7 X0 q- w$ D" \
9 l9 ~, Z: V; `! x$ g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. f$ g2 [; ]+ E. W" Y7 I4 r2 L. I我的应用层的测试程序如下* M$ I" U' _! e! X k+ l ]
#include <stdio.h>4 n9 R9 {- u, N% m) K
#include <string.h>$ ^7 o5 b$ Y! s0 y. L
#include <fcntl.h>
( o4 f- H8 t2 X#include <unistd.h>7 L& x! |! B1 v! d1 |% A
#include <signal.h>
$ Z( ]0 G1 |; ]. @% `$ O, }+ z: p2 l: H#include <pthread.h> //线程
/ x5 ~9 g* G# @# ]4 W#include <stdlib.h>
4 Q9 v- u( e3 F6 Y3 n0 Y#include <pcap.h> //捕获网口数据0 J" r% v; Y3 r& l+ S+ t
#include <semaphore.h> //信号* _5 Y+ s' Z' M7 J# A
#include <sys/types.h> //消息对列
& Q0 w4 `, D6 @; _( [7 F1 u9 Q* ~#include <sys/ipc.h> //消息队列! `. k* n s9 Z! M: X( Z$ n9 m6 L
#include <sys/msg.h> //消息队列
) q6 t; j+ ?9 `# i7 \% f7 ?; p H5 U#include <sys/select.h>& X; V+ Y2 x# L! R0 d
#include <sys/syscall.h>) S$ ^* G6 S! E: B, v f6 f& n
#include <sys/stat.h>/ r. j9 K! K% B2 Z* o: k- j
#include <sys/mman.h>1 P$ J' ] ^! ~! N% Q1 k/ D
#define msleep(x) usleep(1000*x)2 ^, _7 W# `/ e. _$ g
' b$ H l Y) q9 l
int main()
) j% p1 D9 D% z{
1 ~5 D9 J( N( a2 k! T, e5 |7 g5 x" v' k //MCBSP,ARM与AMBE2000交互设备
8 z) I+ _2 c- d9 g3 R2 L int fd;
; P; W$ e$ u6 G. @ unsigned short data_write = 0x5555;' A9 ?- Z3 {# B% e8 w3 z1 r
unsigned short data_read = 0x00;$ e1 U. H- G( n0 X
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
' }5 B: a, A4 H4 _3 | // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- E, H; k( t: M q. e& o
/ P6 S* \* y& z if(fd < 0); L" u9 a a( k h
{
( v& m. _ F- q# `1 G, S I perror("open failed\n");3 Y7 ^. G' N% G
return -1;' M) q- S; n/ p5 g. Q# d
}
( t5 g7 A" k8 ?3 o6 `- L) H5 Y $ A8 |5 }' m$ h& C
while(1). M1 h+ a) x6 Y Q0 s% P& K2 i2 h
{
- [1 V. a* D2 i. F! Y! k. X . r# e* ^" e7 v/ s3 h+ X! w
//AMBE2000每次读写是24个字为一帧8 U2 C3 M. H9 s+ f
//写数据时将数据在底层存储起来,等到中断的时候再发送
: @$ f2 Y. J5 U b1 N" f" ~ //AMBE2000输入数据是以0x13EC开头的
' p# ~ Y9 V3 C) ^3 N. p1 H5 h write(fd,&data_write,sizeof(unsigned short));8 C, T( j' ~! a
7 K2 V7 r6 i+ H( k0 K //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 9 I( h9 W; f5 o, J( M6 d; v
read(fd,&data_read,sizeof(unsigned short));# A9 N R4 l3 i1 y& @
9 V9 `$ K& I4 v* E3 C6 T
if(data_read == 0x13Ec)1 N6 }0 v. [$ H
{ S: X$ k0 z- S
) h7 L& y$ k. ?; k C printf("data_read = %x\n",data_read);
( M; |( K! Z" @2 c- T }2 U( Y; z- J3 f) c' V0 v8 o- _
2 f$ y' T# l( c* Z
msleep(10);
. U7 |' \% o5 Q: L% w$ S( D( F' N( R+ D" m
9 |, B E' @) Z/ ~, Z2 e* @! \ /*& ], ~8 I& L) e6 _
ioctl(fd,1);
9 M5 U8 }) i- q9 v* ]; k sleep(1);
( j7 Y9 z* D8 F% d2 V+ w$ l ioctl(fd,0);
; Y, i- d: w/ X: L" N sleep(1);
' h9 M+ K8 }6 j- ~4 w Z; J */ 7 r W' t- |% }. R8 ^
} : \" X& O3 [. j" `
return 0;
0 h) n7 e; E8 S) ~- ^
5 K# E# k6 a7 ~( D! E}: ^0 D* j9 \8 R M% H% d
& y( g! D2 Y* ~% L- ~多谢各位指教,谢谢! 急/ e8 E, t. b! l" q2 v: ~5 D) p2 t
4 `0 l$ ^" k/ h$ Y/ R+ j# Q3 f7 L/ k$ \3 R% L- K. T& a
: U, _* L; ~' e3 F1 s/ c
) k, N2 b9 _! v4 p* Q+ a \. v0 L( W( G( Y* T
|
|