|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" a" ?# g& C' ]9 ]# z$ }/*
* \' X: _, M# w3 G7 G0 ]. U& F * Copyright (C) 2009 Texas Instruments Inc
8 o" @4 n# a, P$ a2 ] *+ M6 K1 q2 v; H- e1 |/ F- {
* This program is free software; you can redistribute it and/or modify
3 b5 I( V" z" ^. `! o0 r5 d * it under the terms of the GNU General Public License as published by
; _6 \" \. C1 `8 b | * the Free Software Foundation; either version 2 of the License, or( D% b3 [* s. y1 A
* (at your option)any later version.
2 o& e9 [) d+ L( @ *
* t' O) a% L0 p b3 d * This program is distributed in the hope that it will be useful,8 x T: u: e- }0 C$ _3 V
* but WITHOUT ANY WARRANTY; without even the implied warranty of
: g- J7 E! D5 g8 @2 X- e1 s * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 M& h( B: J6 O/ Q7 l( s4 D0 m' y * GNU General Public License for more details.2 a* J* a. P+ t$ i1 Q$ @$ T
*! K, |, }! L0 d6 C, |( w( o. _
* You should have received a copy of the GNU General Public License$ D8 L x6 {# [6 p" @
* along with this program; if not, write to the Free Software
$ P" I4 D( K3 e+ S* e( {8 F * Foundati
. Y, H' ?& _8 Z# M*/
9 \* O1 V" C6 ]+ k#include <linux/module.h>
+ A0 o. o; F# q1 K9 d$ L, N#include <linux/init.h>
( q+ |5 O# W( |# R8 P#include <linux/errno.h>
8 ^/ {7 v' }- @, F) S, E( M#include <linux/types.h>, Q, M! Q' b) ]; g! F
#include <linux/interrupt.h>- K2 }7 Z& _$ Y Y e, ~
#include <linux/io.h>& N( e1 p, V& _3 I; h7 L4 s
#include <linux/sysctl.h>
; u7 h/ ~/ R; S! m0 [1 |: Z$ @: h#include <linux/mm.h>
9 \% O. z, N! D#include <linux/delay.h>
! q# L* n$ C9 W2 u$ ^. t#include<linux/kernel.h>
) U5 Z- I, W3 I# I6 a0 ~#include<linux/fs.h>
7 h8 X5 C6 _9 Y& [#include<linux/ioctl.h>* \1 m; V- q4 g! C
#include<linux/cdev.h>
, Q! \5 ~/ u% F( H3 V! Y#include<linux/kdev_t.h>
8 p$ S+ c1 P" G. X9 M, S. Z#include<linux/gpio.h>
9 I. h& Y- C7 A( R#include <mach/hardware.h>0 |5 Y+ {4 a$ Y- q8 P0 s
#include <mach/irqs.h>7 s# r3 f/ g! V* R6 V( ]( X
7 ~4 w l3 w& K8 ~
#include <asm/mach-types.h>( X x1 g' L- A5 T2 z1 F$ y7 }2 J
#include <asm/mach/arch.h>
9 g0 o' C. i1 F. T* S#include <mach/da8xx.h>
* H7 _9 r+ x* S6 D#define SYSCFG_BASE 0x01c14000$ Q; ^* A9 P) a
#define PINMUX1_OFFSET 0x124
( Q4 b0 o. |. ?7 M#define PINMUX18_OFFSET 0x168
2 n+ p- g2 _: c- d9 @! I4 \( @9 h8 o#define PINMUX19_OFFSET 0x16c
: @* |; K( D a0 E7 a#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( ~, f2 e7 u, h8 C" P% a' K% b7 ]+ ]
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
4 y% L7 C3 a |& U- G#define XCR_ADDR 0x01D11010 //MCBSP1_XCR4 G" ~, P/ W; k' B
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR) L% d- v2 K5 Y" n! K! d; @6 U7 H+ A
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR0 _3 @% I2 o8 n1 h. T
0 u. b) U$ `0 R, c/ r7 l+ m: }#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# a. Z6 k, s/ q P
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
/ W5 t/ k( ?4 l6 A; I//PSC
& Q6 a/ n: q" v; U' F* [; a* {" Y#define PTCMD_ADDR 0x01E27120 - p! A6 |$ [8 y+ Y! t
#define MDCTL15_ADDR 0x01E27A3C8 C6 C- F6 E0 |. k/ q8 {& J
#define PDCTL1_ADDR 0x01E273046 D' N9 \- A( T& v( C6 [9 Q/ T
//GPIO8 direction5 y: X. ^8 _, b, m: s9 _
#define GPIO8_DIRECT 0x01E260B0
+ ^. a9 F" E: G) Q4 y& C* U8 }#define GPIO8_OUT 0x01E260B4% I& O7 G9 @/ t N* ?3 f- N1 e
#define GPIO8_IN 0x01E260C0
$ k0 _, a& Y8 [7 e
0 T. x/ d4 ?" @1 b8 \/ ^8 d//#define MCBSP1_RINT 99
' r" @/ h; X6 k5 Z2 p, m% I//#define MCBSP1_XINT 100 : C$ O6 I8 T9 `; D8 c) Q6 P
static int MCBSP_MAJOR=239;
* c2 B$ T2 K) {2 {8 Sstatic int MCBSP_MINOR=0;! N5 n$ e, F: T& }+ ~- i: n3 z
static int count =1;
: Y! p2 o: y5 o' W6 B) M# ~$ {* S
7 b1 l- b2 g7 P& v, G$ e+ K#define MCBSP_NAME "MCBSP-device"3 F9 ^8 u4 r6 Q' ^* E
( b0 G. n% |2 T& E% X
static struct cdev *mcbsp_cdev;
$ G7 @. j7 B; z6 vstatic struct class *mcbsp_class;' O% ~& g& p3 q% J
static dev_t mcbsp_dev;, D4 Y4 A' ~8 b3 g
unsigned int DRR_data;' H7 p) v4 x, f" G
unsigned int DXR_data;
, Z9 f" {! v2 M6 i5 A( D! M" u& Zstatic int mcbsp_open(struct inode *inode,struct file *file)* ]. Z! |* f: D. W
{
5 ]1 v2 W' s' b* H, A [: e; m' K* M
% w' i! H$ [2 o, o; C //interrupt enable,initialized3 p) q( K8 d m" u
unsigned int temp;9 D1 f$ H3 R( U' c
//SLEEP_EN(GPIO8[10])---0
5 a b$ Q5 e( g, v4 O4 q4 _; v% e temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* N: \- f9 }/ d; i1 z temp=temp&(~0x00000400);
9 W l1 [9 p2 p* P0 ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ s0 v8 I9 u' s v5 T0 D
//RESETn(GPIO8[8])----0----1
9 M: n, E+ v% {. U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 L' M: O$ X [# i8 _( x3 @
temp=temp&(~0x00000100);# ?0 Y% k6 {& c, }9 J' Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! j2 K9 p! n3 \5 P6 E: f$ c
udelay(100);! |( G) p; Q( B0 g, z
temp=temp| 0x00000100;
: N2 F' @* L) l$ d4 h/ C' V! s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---10 Q( e0 e3 z2 ^
udelay(100);1 T) C0 L, `! a. ` I
printk("open success!\n");
I- g0 _- k# K" Y( E8 V% U return 0;
4 ]0 x+ i9 @. y- Y" Y* B}
. j q6 ]7 E$ k* o7 [4 I3 K Q8 F/ _' X, {0 [% g! C0 h3 f, N
static int mcbsp_release(struct inode *inode,struct file *file)) K0 d0 S" T: s( ? H
{
- q% ], p7 X) g& k( k3 _9 f% j4 [ printk("release success!\n");
, Q8 r- J" t' V/ H. Q8 x! ^& s, C return 0;
: [. W# n$ C+ V9 X9 G, |- G}
# Q }$ V$ L3 Q5 b3 R
2 c) U# u9 ~7 Y# e0 V/ K0 ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 c1 @4 _" E7 V2 M{
' a6 o, q! _8 ?3 z8 e+ B! ? copy_from_user(&DXR_data,buf,len);/ {" y. N2 m3 @) g$ ^) Z
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* O7 X# G/ j) G9 } V8 C" ? T return 0;
; P: x+ F- }% b# p% ?
% t5 z. p2 _; l3 @}
7 h J; P3 o& ~
4 y6 f9 L3 ^% _1 [% f8 ?0 h& rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! i. R# i/ f. Z T2 {{ $ M$ |& V5 ]+ g. a2 _6 B9 V9 ^
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 c# r. S# V# ]0 }9 T* m copy_to_user(buf,&DRR_data,len);
% E& C9 S/ y0 [, Y return 0;
: h" i% K/ z* I! D2 A}
% S2 B1 s" t0 @: ^% _+ A2 W7 T& j5 C6 A( E+ F# m5 B
) {( V4 l* H/ }' @9 x* L- I
static struct file_operations mcbsp_fops=
) U6 K# \4 V! V9 j' _0 g{* f5 z7 C& l' V2 q0 c" k$ S, E k
.owner=THIS_MODULE,/ C1 g6 ~% g; F- q, T+ v3 {5 _+ B% V* R
.open=mcbsp_open,- q9 C+ i! s4 ^' D& k3 D, p
.release=mcbsp_release,9 l8 Q2 i. ]. S8 `2 ]
.write=mcbsp_write,; l% a% e& i- V/ K }0 c4 O# u4 W/ y0 m
.read=mcbsp_read,6 S, F# C+ P6 ~
};
# ~+ a" a1 z3 B3 @; x* c! Mstatic int __init MCBSP_init(void). {% k+ X% i4 V0 h; q2 N( a1 [
{; f* \& X% ~# b
int ret; G: {! c# s2 |1 a- ?, M7 M
unsigned int PINMUX1_REG_old;! {2 W; H, j5 L; n! E0 @5 Q
unsigned int PINMUX18_REG_old;
* a) A" k5 D5 s$ y unsigned int PINMUX19_REG_old;; m! h2 f( i; K3 s5 y
unsigned int temp;
( D9 `3 @( u4 j if(MCBSP_MAJOR)
) |* V, { W$ k, d: X {
7 v5 Y9 ^! b. g `) m3 z# A mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# @0 O- I/ X6 a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 p- k7 Y9 @+ l9 Y" H$ x
}& n7 n; C9 b/ d" S3 ]1 t) E6 o
else
: f# s$ t; d* f {" }; {8 g; e8 p! f+ `3 j) K \1 @
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- W+ h( ?6 E/ }6 ^
MCBSP_MAJOR=MAJOR(mcbsp_dev);/ _+ }5 W! F3 v! z! p
}8 C& F2 L& u: ?$ }
: u& c# q& J. w if(ret<0)
4 q9 U8 M" x5 m2 [8 X- ]/ O4 E# `+ E+ B {. {4 i6 D+ r5 a# J
printk(KERN_ERR "register chrdev fail!");( D4 j" D& ]; }4 p# @* F9 ~
return -1;
. K" f- s# y: A9 m' c' E& ^ }/ R2 s- r3 C. [6 G& }; S) X( \) o
# z. r- p6 r- v6 s! L3 n) c
mcbsp_cdev=cdev_alloc(); h2 t# h5 F7 O" l$ b# C) p
. o/ a% r0 ^# u
if(mcbsp_cdev!=NULL)
$ Z, y6 M Q4 [! t; n" i {# p( s' s; L% e+ P. a) x6 Z
cdev_init(mcbsp_cdev,&mcbsp_fops);
( a5 v/ p8 U9 m t! O mcbsp_cdev->ops=&mcbsp_fops;
* J1 F( G" S% k8 @- l- J mcbsp_cdev->owner=THIS_MODULE;; v; e( a3 q1 X6 M
v; f6 ]: E; m/ [; C' H if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( n$ T& B3 D" a f v printk(KERN_ERR "register cdev fail!");
* k0 v8 e" |3 t( i0 G else+ A& a3 u$ O& O! [
printk(KERN_ERR "register success!\n");
6 D/ Q" h' a; [; {* S }- b% `2 w" j7 m- A
else; |1 M/ L0 ^( X! K, a; R
{
' c2 D/ l- c! ^0 V4 h3 u printk(KERN_ERR "register cdev err!");& e; V0 T, w4 w' j! ~$ y$ ?
return -1;
" H+ T5 p @( ^8 j) n( x }" l" @1 V0 q+ a5 p
5 O% `' X" J) F7 r
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& G, j. N3 f" c) ?1 y% V
if(IS_ERR(mcbsp_class))+ H5 B. e* L, F! h
{
6 s$ l& l" T3 K2 s* [ printk(KERN_ERR "register class err!");
2 [ ~) s. s9 q" J1 L' M' r return -1;+ b: n1 ^+ ?. L/ c; B8 M) y9 A
} o" v9 W- H$ i- @
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 i" a2 F$ ?# F5 Y* b1 h, p( L% M s9 Z
//PSC
& S$ m* g4 N( q$ T: P //add Enable MCBSP- T5 N. d3 S7 k
//test. o, I @- [4 d# ?" Z
temp = 0x80000003;
8 q; G' A* v! H! { writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. g# \# y, X$ R2 V/ e5 I2 ~; c temp = 0x00000003;; C% X0 e+ c- j
writel(temp, IO_ADDRESS(PTCMD_ADDR));- z; B) ^+ S$ t7 i. x
5 d1 L' A% x& {5 n# g @9 Y
temp = 0x001FF201;
9 z( j. ~8 l+ `0 Q1 t4 D- R$ B writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# t' ^) _* t9 w1 h5 X: \. R " s0 _8 [( N9 C; o
//PINMUX
; }/ K. u6 V, O. U I8 t( s+ p" J6 X //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,1 k, z# f, F9 Y k* \ X
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( u8 D& B, o: `$ I! w2 T PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
0 v) g2 s" w7 u: X; }# W. j9 v6 p writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
q( }+ g$ F( w, T' e+ y& k: q
8 Z) P& x$ c9 S //SLEEP_EN,EPR,L138_SHK1,L138_RC1 K Q9 s: y# b% q8 n$ ?8 V
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ u; t7 `& D6 R# E& f; b PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; . V: B) b9 p& r: Y3 r
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' c% X0 S) m# p" M
! E$ i7 @! ?3 ] //RESETn,L138_SHK2
$ B j; f; } `1 C- Y* b* n ~ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); & v5 |3 T% ?) }9 j
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
Y, e, d) `: ~) r* S writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- N+ z; z1 O# z1 r# a9 t , v! ^2 u6 i8 i S+ N! s$ L
, x, V: @: A# C8 k
//SPCR Register
U, c, q$ |2 P" n. Y3 l# p6 r //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ L+ y+ O! y {( J& I( Y6 o temp = 0x03000000;//(DLB=0)) v7 G. \/ d& `1 Y; C
// temp = 0x03008000;//(DLB=1)
# X& x2 T1 t& B/ R2 H2 P, r writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
) U9 N8 o u8 a4 o. F# w temp = readl(IO_ADDRESS(SPCR_ADDR));$ R3 g* ^8 J$ ^1 d* s
printk("temp=%x\n",temp);
6 J/ o' g; g. b! w
R8 W: P; K5 n //PCR Register
% ~% O5 h$ k! o# n1 u: v //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 M- u% C- ~4 {- H D( B% n; O) L
// temp = 0x00000F0F;
' t O( p3 [$ g/ Z; y( X( V/ L temp = 0x00000B0F;
8 ~! I, W$ G- N2 I% d9 H0 W9 A writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 5 z3 N( u d/ f! m0 k4 ]
temp = readl(IO_ADDRESS(PCR_ADDR));
& N7 f* `& ~1 {, b& } S printk("temp=%x\n",temp); $ [# G: F! }& }( ~0 o; X
//SRGR Register# y& v+ Y; E0 i4 E
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 [: c! B- d( E3 j. Y //temp = 0x301F000B;2 j+ g+ V$ @$ S! o; n) P. w
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
3 Q `3 P+ q+ m$ e+ E6 D temp = readl(IO_ADDRESS(SRGR_ADDR));8 I: V7 s: O! J# b, @
printk("temp=%x\n",temp);
& D7 i3 {* f3 S5 s4 [ //RCR& U% Z4 t& u/ w' `
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* W5 z6 r: K* v/ A0 A8 S //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ r/ E. e- L/ x9 Q8 `$ \) E temp = 0x00440040;
* g3 S2 a7 `5 \3 z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - {5 |. e5 K: Q0 H- F* s, U
temp = readl(IO_ADDRESS(RCR_ADDR));
$ I% k# O0 a" o printk("temp=%x\n",temp);' N8 }" M4 i2 F0 G: x( I
//XCR
0 n1 C/ |+ |5 Z0 n* L9 l9 s$ ? //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 P: _) P$ `. y7 P# l1 H //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 e. K, v+ y( D9 {
temp = 0x00440040;
2 O# M/ f3 e5 G9 b) C8 e writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized v( x! d2 o* \0 b7 v6 O3 x. d
temp = readl(IO_ADDRESS(XCR_ADDR));
3 J8 g5 r4 ?" h, m; w printk("temp=%x\n",temp);" S! Y" k' x: N! |9 W& `3 z
udelay(100);3 }/ @& M# X+ C0 R. Q
//SPCR Register6 Z: n- B( ? n! R
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
! \( p: s' e) v! {* F- p temp = 0x03C10001; //DLB = 0 VS DLB = 15 ?! w# i1 c2 p# U% Z$ ?; w
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
\- Y$ u8 O2 H: u7 \0 E temp = readl(IO_ADDRESS(SPCR_ADDR));2 ~5 ?- i3 U. a) P5 m
printk("temp=%x\n",temp);
& n. N" m4 s4 c udelay(100);
a6 s% t; _9 M) E3 Z" s/ k& g. }0 ]! C
//set GPIO direction3 k6 X7 n q- A+ [
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 I! X+ O; B9 o7 X/ m+ y
temp = temp | 0x00000100;//EPR----input
+ L. x; b! V1 s. G7 X5 _ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ X% F) }/ S/ Z9 |
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : Q2 _# G' ~ L' Y
! U( H, e( U4 f
return 0;+ o! g# Y0 j; g! U0 Y9 W, _
}
8 B2 g+ } y6 x) ? kstatic void __exit MCBSP_exit(void); Z o B" T- K- C v; p
{
7 I/ [, B0 N9 z k, a& {: A printk("mcbsp chrdev exit!\n");
5 t# V1 Z3 ?) H. s6 Z cdev_del(mcbsp_cdev);& I8 r1 G' _2 Y1 ] x
unregister_chrdev_region(mcbsp_dev,count);* O9 K9 j* W# ?, u( z0 T7 r% [: {: e s
device_destroy(mcbsp_class,mcbsp_dev);
: \2 @2 e3 f# B. Q class_destroy(mcbsp_class);" H4 K' a" e6 B$ J
}
( o' w7 K* n' ^9 p- g' Hmodule_init(MCBSP_init);. a9 k u+ M% ~% _& h
module_exit(MCBSP_exit);
/ ~- s1 u0 Q# b6 O
8 D, o0 h! C. Y, N% @$ ~5 AMODULE_LICENSE("GPL");5 T) n/ Z$ f1 a2 e
6 O) @ U/ }8 |) }% K9 K; q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 }7 ?2 V( h! H/ }
我的应用层的测试程序如下
5 T, ] h$ S) t- O$ {#include <stdio.h>7 T( Y9 b- @" C- {3 n4 Z
#include <string.h>
1 n( V! e0 {5 B4 [#include <fcntl.h>
/ a: N% }9 o: B#include <unistd.h>
* }" K q t1 C( {5 d6 Z#include <signal.h>- e" @- {! x! ^! i$ W
#include <pthread.h> //线程
, Z4 a) }8 d) U' M#include <stdlib.h>, B* h- A" `" ^: O
#include <pcap.h> //捕获网口数据$ G5 A' j4 B, `4 D5 W8 ?. f% F
#include <semaphore.h> //信号
* r. d7 {6 S: U" r# J) l#include <sys/types.h> //消息对列5 g* @# f7 Q& A* a
#include <sys/ipc.h> //消息队列
, h) Z7 {3 w; f) @) c6 ]#include <sys/msg.h> //消息队列5 R" I5 g. R+ Y% ?
#include <sys/select.h>( D9 f2 Z& l6 V- j! _% a; B4 {6 y
#include <sys/syscall.h>. t1 b* f4 x+ Y7 R
#include <sys/stat.h>
3 k8 ^6 O+ }; W#include <sys/mman.h>
+ a' f3 E* L% s: V+ V#define msleep(x) usleep(1000*x)
* N- _# b3 ]( E1 [# k9 k L6 j% j& X+ F+ Y6 [& M
int main()
" c+ g' R! ]( s: x% d& M5 y0 A{
; i& i0 A, T4 d' w+ t //MCBSP,ARM与AMBE2000交互设备3 T+ D% q* v& n' b$ S
int fd;* ~5 S$ ]2 ]8 c' ]8 U
unsigned short data_write = 0x5555;0 B/ f! C7 v; d0 ]0 p9 R
unsigned short data_read = 0x00;2 I% \: O9 W& x8 K6 h( K6 j
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: c+ B) L8 b3 i // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* n5 R9 p, I- j/ a! x
/ w# T# r Y3 @ if(fd < 0)
5 Y: _; n, u* |1 j5 D5 w* e: e; Q% d {4 m! N. I L5 E1 K9 D+ k
perror("open failed\n");) q* m0 {3 s% }) D
return -1;6 w6 P: J' k% o% X3 A
}
% d6 y9 x2 v2 b- n9 e
0 z6 Z5 j* M9 s& G! S while(1)1 N. F) T8 w- c Q* c: Y( _7 V) ^
{
) j& f- i6 o# H* ` 4 K7 W, X' z0 h) g
//AMBE2000每次读写是24个字为一帧6 }8 `% t1 w+ h! J7 R! y+ p& a
//写数据时将数据在底层存储起来,等到中断的时候再发送
) J" T, \( `+ J+ f //AMBE2000输入数据是以0x13EC开头的
% m" v# m. ~* @$ P" }6 ] write(fd,&data_write,sizeof(unsigned short));
7 _# O9 s- v6 S4 G8 ~* V6 K 2 E1 c1 |3 q+ Q/ y3 j: i! m% T: ^
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 / q3 F: d" T& d
read(fd,&data_read,sizeof(unsigned short));, L' q$ o- ]3 B
0 B! }9 t5 d$ D" p" r$ d
if(data_read == 0x13Ec)
! b5 I1 }# @8 @0 C7 k! | {
8 k( Q/ A' t3 U c; {0 j/ Y& n . a- u9 q j8 R
printf("data_read = %x\n",data_read);
8 L9 S# Q0 ?8 @/ h. f }
* W3 W. _# y. `9 M/ w# p9 S6 W; \ ! J. R$ O3 k* A& r$ Q+ V* }
msleep(10);& I5 k+ `+ `, X0 w7 n' n' _% R* _
5 Q" I; r. V: M" w6 M1 s, V
/*- ?7 m# L; x( }
ioctl(fd,1); 8 b/ O; [* y) D" x. X; L
sleep(1);
* h( ?6 ~/ B$ S/ ?4 D V" F ioctl(fd,0);/ v, |- M' u( P* a" k
sleep(1);0 M; w3 O5 y( H5 M. I+ D2 N2 t" G6 I
*/ ' Y& [5 p" i6 w
}
2 d w/ _5 g+ W/ E6 r return 0;; w" g7 i0 a) \! y5 z0 S
* O& ]2 \6 T2 X+ f; M! M3 ?
}* _3 }- a$ M! K1 G
/ B. U1 l, f# b多谢各位指教,谢谢! 急2 ?- D# V" V0 Z+ ]6 H
; Y* C) ]9 J: n. u6 X& }; L$ y0 z
) S& ~. j7 p* A$ T" W; R. F
% M2 t: |3 b' D8 \- z- m, W
, j: g7 M) U8 E( \
, D4 V' h0 h& Q/ P, t: [ |
|