|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 G. A' Q( H% U; R" ]: F9 O
/*
* e5 a% g$ [6 b; g * Copyright (C) 2009 Texas Instruments Inc2 u% T! {: I6 y
*
& k1 e3 x) X! Q6 _+ e; u& U * This program is free software; you can redistribute it and/or modify
) E0 X) E5 c* i$ y3 u. R * it under the terms of the GNU General Public License as published by
7 U% }) o6 | I( M8 j" ` * the Free Software Foundation; either version 2 of the License, or
3 y4 a4 W p$ [$ D6 e, @9 V * (at your option)any later version., Q. t2 x& F2 a) w
*1 a1 ]+ R2 P' x/ |* \7 t
* This program is distributed in the hope that it will be useful,# b b8 a3 Z2 Q$ C7 a
* but WITHOUT ANY WARRANTY; without even the implied warranty of% L2 n9 f7 S) m3 {3 M; T8 x& Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 T/ E8 _% ~5 J. C/ q& G * GNU General Public License for more details.& r- o2 K8 b t4 z
*5 r1 C% M/ O! H
* You should have received a copy of the GNU General Public License! O! T) w8 g7 k. R9 p
* along with this program; if not, write to the Free Software+ j8 `+ K6 c/ O" J" P
* Foundati2 X% H4 Z: k) j# j" s S0 Y1 x% z& I
*/; e0 ~% R) M9 ?2 k! e B
#include <linux/module.h>
8 S+ t, y; l5 b, w, Z#include <linux/init.h>7 [9 g) x b0 S; ~( a) H
#include <linux/errno.h>/ { G9 Z Y9 E+ W
#include <linux/types.h>( O/ t2 a! O* a' j& }% e
#include <linux/interrupt.h>0 ~+ M/ L$ R3 |. i
#include <linux/io.h>1 e$ G; Z* T- U5 h8 u! N7 L
#include <linux/sysctl.h>% B$ u' L0 u7 q- j
#include <linux/mm.h>
' h# H0 _" a( }#include <linux/delay.h>
8 i: J/ ^! E0 a#include<linux/kernel.h>" m" J5 ?8 [5 O
#include<linux/fs.h>
2 u3 P! \" j# K( N' e#include<linux/ioctl.h>
0 v. s' h; R3 E" i: L0 J$ M#include<linux/cdev.h>2 w; [8 `/ |' B& q
#include<linux/kdev_t.h>8 x# G c; j# ]+ h
#include<linux/gpio.h>
+ u0 h4 g" \. T# Z9 g1 F6 ^#include <mach/hardware.h>; K4 g3 A4 M0 a( g2 ]/ C
#include <mach/irqs.h>7 U6 L1 Q; g- N
/ o' Z; t* J1 [, B4 k
#include <asm/mach-types.h>
) n8 w4 K; ~, b2 ]3 q#include <asm/mach/arch.h>
3 O9 x, C$ P/ K4 G- m#include <mach/da8xx.h>
" p% \5 o1 U5 B) Z7 p' ~#define SYSCFG_BASE 0x01c14000
' b! [0 |" p D9 c2 L#define PINMUX1_OFFSET 0x124
+ d- m& p' O( D6 K( S0 ], b#define PINMUX18_OFFSET 0x168 ) l C# }- E6 y0 y! D( i) ?9 ` p
#define PINMUX19_OFFSET 0x16c8 x1 t" U' r# C3 C6 X0 X# l) p4 I
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR! h$ B, [/ |; H2 w$ B4 f# m, b
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR @' T, _- ?: l0 H6 V; w8 q4 k! Q
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
, I! v4 r$ I: _5 R2 z#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR7 {) v7 }6 H( \& ^
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR. {* @# @; E! @) w+ p
7 F# O2 ^2 X: m3 p2 ^! e. W#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
) W3 @/ C& g9 w, m: b n; v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR& r# Y; u. T! `# m) F
//PSC
! U. X' P5 |: l( l: ~2 R) q#define PTCMD_ADDR 0x01E27120 7 p e/ x m' |+ c/ X8 {
#define MDCTL15_ADDR 0x01E27A3C
' d/ i) h, r6 {1 J& X' ?#define PDCTL1_ADDR 0x01E27304* n- W$ p# y1 O* h
//GPIO8 direction
- J3 Z, {, L4 q# Q#define GPIO8_DIRECT 0x01E260B0( ]; `8 z' x2 ~
#define GPIO8_OUT 0x01E260B4
1 U& x! F' \# v2 w$ F8 k. x#define GPIO8_IN 0x01E260C0
0 m) _1 s- H- g6 ^( y
: N ?7 ?2 V/ Y) |//#define MCBSP1_RINT 99
" b8 \, t& P, M- `4 ] y. Q//#define MCBSP1_XINT 100
: D/ L9 ^# b' m5 _% c: istatic int MCBSP_MAJOR=239;. {7 [4 g; ~1 e8 ?
static int MCBSP_MINOR=0;
- q% F) t* q5 ~; G9 Zstatic int count =1;
" L" c+ Q, l. |. D8 ? C' b
0 {" F% O7 o# I$ g! M2 ?#define MCBSP_NAME "MCBSP-device"0 A: M1 [4 V6 ~' }8 D7 _
! c, S& W) m1 q0 cstatic struct cdev *mcbsp_cdev;( \+ l1 G/ n% Y* y7 m6 l/ {8 N r
static struct class *mcbsp_class;, |( T% `+ d2 s0 ]5 \
static dev_t mcbsp_dev;
6 x0 [3 x# q8 s% [* W; v6 hunsigned int DRR_data;
+ Y9 h! s+ C1 C- Iunsigned int DXR_data;, ^( f) G8 |% X; y8 J: R2 k |
static int mcbsp_open(struct inode *inode,struct file *file)$ a5 I0 ^2 I% G* }, H
{
g1 U8 |5 v9 j8 R
# J$ m: i2 u9 B. o$ Y //interrupt enable,initialized) @5 h3 f4 }0 j1 X1 p* K" K
unsigned int temp;" S- ^. `) x2 z
//SLEEP_EN(GPIO8[10])---0
( D2 N$ O6 o1 j/ b3 W temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 o; J: i r6 s& O, b/ N$ _
temp=temp&(~0x00000400);
" ]+ _6 x: _+ y- X __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% a& O' I4 u! e& s7 m6 v
//RESETn(GPIO8[8])----0----1 @& @" d& ^/ S& i/ R, @
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- f, d% C7 c/ C/ }4 u. v. ]. t temp=temp&(~0x00000100);
9 @' a0 l$ h. d7 t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( k- L( `& f, S: U5 M
udelay(100);$ C# _4 u2 n& O3 Q% q
temp=temp| 0x00000100;# Q2 l( G) J! G1 z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) ^+ T. i9 j" C' G- t; M# {0 `, V0 y
udelay(100);' k7 T$ K# Q1 p; L P" \
printk("open success!\n");" z% Q4 J' A3 V7 A. Y
return 0;4 c" Q1 G5 u v4 I4 f8 P
}
3 _1 Q$ H+ }; p* \
. y' s* b& j/ V" M7 Y' Cstatic int mcbsp_release(struct inode *inode,struct file *file)+ j# O- I h+ C& Q
{* z7 z; }! ]6 \0 \1 F6 {3 b
printk("release success!\n");
* W/ }, p$ C0 H: A" J$ s: v/ ] return 0;; m% B( }/ ^4 E3 o8 Z' w3 L$ U* @
}
3 w& K/ ?4 h- |$ Q. J* y6 |5 X! n6 q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 i+ k Y- v3 @5 l{6 ^* u" N; i0 H+ |6 y
copy_from_user(&DXR_data,buf,len);9 p0 d: p4 D% q% n( a3 R
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); " o5 ]1 w- M: K
return 0;# y# m, y3 C& K1 F4 Y+ C
5 n: D" @- n9 ^% _$ U
}! o' Y" e( _1 V. H3 m
- l2 F+ x2 e+ t/ i
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 [" [2 s1 f/ N( l4 F{ e' H% B( r- B9 n2 C1 Y) u
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% |) Y O$ R- c; i copy_to_user(buf,&DRR_data,len); " ]2 S/ U- H# j9 s5 [
return 0;
' e+ q* ]$ m4 l1 }9 h}
- `, v( u8 \/ e" G# S" S2 C: v; X
, g e$ p3 L2 ]( q5 L A- y+ j9 L
static struct file_operations mcbsp_fops=) K" | T- x$ z& Y( ]
{2 r: I4 H" c8 Y5 o
.owner=THIS_MODULE,
$ c& W& i& ^# e# i" H0 e .open=mcbsp_open,, p' l9 i! {# ]' \! b- X3 r* {
.release=mcbsp_release,
0 _+ R$ M3 Q" `8 k% b3 M .write=mcbsp_write,
# r) B( p0 k* ^- | .read=mcbsp_read,) E; p$ w. }8 O t
};
. e! M. S4 m- O$ w! K. s/ |static int __init MCBSP_init(void)4 S0 p" V' @- r6 c8 R0 y: M
{
7 h5 N+ G9 ?6 Y8 ~6 w* P. u int ret;
8 {; ^# q4 l) _ unsigned int PINMUX1_REG_old;. v& n6 m6 p0 V0 W# ~8 _5 r
unsigned int PINMUX18_REG_old;
; Q7 |' w( _* f' z* d$ d3 C unsigned int PINMUX19_REG_old;
+ f& c# u* C" g( v! _0 t" B& f unsigned int temp;
) e n* ^; F* Y# a( @0 n; W if(MCBSP_MAJOR)
) j" O2 T3 `2 Q% T# @ {$ q+ x/ |* }4 ^/ J
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 Y% ]/ g' V# n' o) y8 Z7 R
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
`7 j* u/ I. X: D9 _9 d/ B }, m! _* n; T1 q8 y
else8 ~) Q9 ]$ Y) Q: @% ?7 H" f
{* X4 `- a. C# ?
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; O, }8 W; ]5 y) X( \; X
MCBSP_MAJOR=MAJOR(mcbsp_dev);
" X1 Y; D" S1 T0 e7 ]) i4 p }
, ] @- ~7 |" M& u; s7 o/ G7 ]3 E; P/ W
+ l) W+ ^- W) e8 O$ G; S if(ret<0) _; j: q a4 z" I) s7 _& D
{
! e' |+ L1 n' u, N2 Q printk(KERN_ERR "register chrdev fail!");8 b& U$ n0 L6 O- c5 n1 E1 f* ^
return -1;0 P- V5 G- _; k( e5 Z" C! }* _0 g
}
# h" |8 i9 D. Q7 j/ b
. p: C( {. {- ?' O9 D! } mcbsp_cdev=cdev_alloc();* {9 O5 O: p/ g
7 A; k: X2 U K. x& L) j+ @ if(mcbsp_cdev!=NULL)
- J& U; t6 i( s# @& e; p {
; Y2 x# U4 S" R1 u/ m) N cdev_init(mcbsp_cdev,&mcbsp_fops);
) o! @3 h* b6 I) i1 r) w mcbsp_cdev->ops=&mcbsp_fops;% T/ |0 O% k6 J
mcbsp_cdev->owner=THIS_MODULE;
{: }; S( n+ A' ~0 f
' Z) Z& [1 \; \! x if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' ^9 i7 l8 u7 E9 `8 C" s printk(KERN_ERR "register cdev fail!");3 R) _* i/ Y% }1 D4 z4 z
else; `/ y# q& t k0 }
printk(KERN_ERR "register success!\n"); r+ {, \+ d$ U( \
}& @5 ^' y3 b7 g
else
/ S$ y4 ^+ e n2 p5 t+ M3 d k) [ {
7 a4 K" m$ Y- F2 e6 @& T1 q7 l printk(KERN_ERR "register cdev err!");: f2 ^( t: |* R7 N
return -1;2 O% p/ @# O/ |$ T- H7 n& |) I
}
3 z s- j; l, z# ^4 b8 [" B
2 w8 s" M$ Y$ B* U6 Y$ \ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); @) i) K8 W" m& S) L9 F4 t
if(IS_ERR(mcbsp_class))! {# X: @# f9 e
{
& o0 ^$ v& ^, [' c% D printk(KERN_ERR "register class err!");
3 U( {8 J& ~2 ?0 t return -1;- V. T0 H. M2 v8 o
}
/ _1 v; l7 F, M1 T! u( a0 Z device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 ~3 T! V. o% K0 Y& Z7 S9 V
) j* _ `( n/ _$ h
//PSC
- `# s9 N/ c. q- v; ?6 o //add Enable MCBSP
3 l: F' i$ r2 _ v1 t2 u" {" b //test$ b6 g H; a2 t) P1 I* N
temp = 0x80000003;
; W& q9 P$ @2 S4 F2 x writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 {/ P- P8 q2 d) ~) t, Q
temp = 0x00000003;
. l; f; F! m8 Q, a writel(temp, IO_ADDRESS(PTCMD_ADDR));
* n0 \ Z" j0 S3 o/ S
) k1 g) ^7 J) E& b temp = 0x001FF201;
$ I! }7 H7 h) A5 w0 S/ @ writel(temp, IO_ADDRESS(PDCTL1_ADDR));- V5 x { K& _9 d. r* m- m! G
$ R) W$ X$ G3 L3 [
//PINMUX 5 F8 F# }5 }; Y5 K! Q
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 m" g6 m8 @2 S7 R8 _/ K) H PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ ]; r" j, j+ X5 T5 p PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
. t2 A& [4 Q' V7 j0 w* Y% N writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);7 T/ m: k( C! N/ _9 u, `/ M- K' E
4 E* W# D9 {: S: G) i @; S
//SLEEP_EN,EPR,L138_SHK1,L138_RC/ D2 v( U/ t" ^7 k% f
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 9 n! C& T4 y+ V6 y" {
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 Y) Y: @& N7 L+ a8 m% ^) R& |1 m9 ?
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! s- g# w( D, q0 m" y) B+ Y+ ] U
4 E4 v! f4 Z9 K Y0 `' k2 G //RESETn,L138_SHK27 \/ ~4 k& ^) y7 l" |7 L: [6 Y
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ( R8 }& X, v" D5 S) M
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; " }1 f: S. C5 U. j# {6 P
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);2 f+ G# Q8 a7 m) B/ t( G! z% ^1 e) k& I
/ f( n$ i$ r+ K3 d 7 i8 E" }2 _+ X4 K5 @" S4 w3 d
//SPCR Register
+ A" y3 L% {8 \; q8 Z! n! j9 k6 C //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! K+ R0 A9 o* |) S
temp = 0x03000000;//(DLB=0)
2 X6 P2 S1 a7 M2 ]. h, k // temp = 0x03008000;//(DLB=1)
2 _) s+ E2 p5 H" N" @8 J+ M+ [ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset0 _- \! g" p4 M. K: O
temp = readl(IO_ADDRESS(SPCR_ADDR));
7 P$ X- `' E8 s4 `8 _$ X printk("temp=%x\n",temp);# L: e- ?* T& j! G, v0 Y
1 E& |8 ^2 S% j; d6 F4 {. o
//PCR Register
) v5 h5 J2 X V! s- f //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
9 R8 m5 u% Y" g" r3 N: S2 O* P // temp = 0x00000F0F;; i# {; |! z7 k# K
temp = 0x00000B0F;
* x. L, i" C8 H! X writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 y$ J5 F- t, s7 u& S
temp = readl(IO_ADDRESS(PCR_ADDR));+ N. m- W; Y$ u* u
printk("temp=%x\n",temp);
2 E, w. S6 ]$ k, N9 o$ e1 ?' Z/ ] //SRGR Register' d; _/ u6 X2 @) X$ s: ?6 Q
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
/ X+ k T4 \* O, V, g f- n8 F8 [ //temp = 0x301F000B;. w! g) t' m' p4 j1 W5 D" B
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ; ?9 j) o( z3 D& s" w
temp = readl(IO_ADDRESS(SRGR_ADDR));
1 ~/ f/ X- x/ g$ j4 T4 p* N printk("temp=%x\n",temp);' x1 b4 @8 H# x6 ?. Y+ {
//RCR0 i9 s' T8 B- b& K7 {0 l
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( L0 `0 @' J) X) G b //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' T* Y2 B9 Y3 k4 T7 |& S
temp = 0x00440040;
, n# R. f% b0 v( I: }) z& C" ]' T writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - o3 M& B1 G' @ C2 n* d; `6 m5 U
temp = readl(IO_ADDRESS(RCR_ADDR));1 W! D, f4 A+ v' F
printk("temp=%x\n",temp);
6 K1 d8 Y( V- u) e+ t5 U1 H //XCR
' b& a9 C+ W% S! M o9 l* a7 p6 v //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ {2 f1 W& Q0 H% S9 O //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-04 S: e7 U! F; M. b
temp = 0x00440040;
# K$ s, E* E' Q' q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
% ?$ M8 B, H) i" s) s1 K* j temp = readl(IO_ADDRESS(XCR_ADDR));9 [- }8 w# |0 j! o4 O( j. w
printk("temp=%x\n",temp);; f6 ^) r3 n1 A
udelay(100);
! Q+ l; O1 `' f //SPCR Register
7 U' V1 G- ^, }: o& s& ?- x //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ ]/ ~% x3 ?" r temp = 0x03C10001; //DLB = 0 VS DLB = 1
# \9 S1 M# `% v$ d0 C3 N( W5 ]* l writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled2 ]4 C# @) K" y/ I3 c, [
temp = readl(IO_ADDRESS(SPCR_ADDR));
7 p5 G, k0 ~( }% A: ~9 C& G printk("temp=%x\n",temp);/ |" o* y' [6 V2 b1 R$ B
udelay(100);$ {/ B+ ]3 U) P% `+ J7 D
1 L& t+ p3 S9 I
//set GPIO direction
0 S% K5 y1 P7 o* x! ~; d" D& i( W temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* Z8 c) N( [9 @0 h! h5 J0 b
temp = temp | 0x00000100;//EPR----input
M6 s& n: |3 d h. n temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* p% t# U E; ^2 ?( Q4 m0 Z
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 J* D+ s$ B$ v' a" u& O
7 k* C7 ^: \1 a7 P
return 0;
' k' l, S/ g2 z# A: `}9 u: H. C& @3 i
static void __exit MCBSP_exit(void)+ v$ Q; w$ m, g, u
{
5 S; @" H( ? H h/ D6 b/ ~7 H% K8 J printk("mcbsp chrdev exit!\n");
5 }3 {1 t4 I9 x9 j- \3 B) y' [ cdev_del(mcbsp_cdev);0 l" [# H4 ~. o& [
unregister_chrdev_region(mcbsp_dev,count);' p* X% r% s$ J6 c
device_destroy(mcbsp_class,mcbsp_dev);7 g! a4 W4 U3 P, q! Y
class_destroy(mcbsp_class);
* D( \0 i4 \0 D) s! Z# F" ~# B' l2 Z}
/ _# U$ `: A9 q5 Pmodule_init(MCBSP_init);
& }6 d* s. M/ C. [module_exit(MCBSP_exit);
% d G4 F+ j+ S$ d% k1 u6 F. X1 N. \1 @$ D/ o
MODULE_LICENSE("GPL");
0 p. V/ ~. c& n, r( l: _/ |& l; ], G) k
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) I3 a% q% E6 ]/ ~: }
我的应用层的测试程序如下
6 P9 m- A8 Q* {" H#include <stdio.h>8 H( @0 y2 s9 Y; D
#include <string.h>8 }, q. Q1 o* u; W, L( a- v
#include <fcntl.h>
" B/ m4 p6 v6 L+ ~#include <unistd.h>; T- F0 d6 ^! E3 ?: w; ?
#include <signal.h>
$ D) K& L6 k Y: H2 H+ W#include <pthread.h> //线程
0 _% Y- y$ E& V/ m& x- V; s: N( ^#include <stdlib.h>
7 Y$ U# K* X6 i#include <pcap.h> //捕获网口数据
3 ^5 `$ m8 M2 I#include <semaphore.h> //信号
6 W( G' g4 q3 O9 k6 O# o, W3 _#include <sys/types.h> //消息对列
( t. O% s4 ~# ]#include <sys/ipc.h> //消息队列
5 C# a7 M8 _6 U$ C4 O#include <sys/msg.h> //消息队列! [( P) `& ~1 k k/ N; o% k: ^
#include <sys/select.h>
4 n. x- [6 l4 N4 P: q6 p6 ]#include <sys/syscall.h>
! o7 Q! c6 x2 d w6 u#include <sys/stat.h>; \0 @7 [8 i5 ~! ?2 \" k2 X7 M& m
#include <sys/mman.h>
+ }* l# g# f$ u( ^# S! U#define msleep(x) usleep(1000*x)$ K( F6 p% m! H
$ P* D0 x/ e& Z9 C% V! ?5 H" {int main() P7 [! \" E- U4 N o' O8 C
{ 0 \ ~+ I- m; p g' m! N
//MCBSP,ARM与AMBE2000交互设备
0 Y; s5 c* _5 Q ^7 @ int fd;+ C" i* E) r2 W! @# r% ^# t# i
unsigned short data_write = 0x5555;
1 _9 V- d, l0 `- s unsigned short data_read = 0x00;8 C9 x) b d! ~* p, l
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- _0 k0 \$ C) C- ?$ I( x
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
. b6 Q" } V0 ?1 [4 P # i; Y/ S& a. e* r# {8 ~9 z! E) t
if(fd < 0)
) ~$ w7 w. O( b6 S0 v {
0 T% i, L. {2 y$ v( g perror("open failed\n");
) t+ q8 g2 p' x, v6 |" o. V return -1;
c4 @9 j' o) j: S }
) A+ X! x: X8 ^' s 4 e" p, u( \7 s' D4 C
while(1)
' \5 n8 i4 B' ~ g! b \ {; w/ I5 K7 k' X: F- `
8 e! g6 L% V1 ]3 p; c! Y9 [ //AMBE2000每次读写是24个字为一帧
( \6 b' Z1 S+ A8 _2 \ //写数据时将数据在底层存储起来,等到中断的时候再发送
9 ^1 V# C2 R/ z$ T1 O+ V# u //AMBE2000输入数据是以0x13EC开头的
2 i2 v/ x$ F0 j9 w' @! y! e write(fd,&data_write,sizeof(unsigned short));
# ^3 b3 {: I% r* f2 l# B6 j; l 6 \/ d, G y, f& g
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
! a s' M; z+ w3 {) r read(fd,&data_read,sizeof(unsigned short));) K1 s8 G r) l+ N# x1 f8 ?
$ L( e$ P1 P( D: ?
if(data_read == 0x13Ec)) d: ]7 x; v8 q( I$ K! X
{8 }1 b6 W" b5 X1 z5 n9 c1 H
; q# j7 W, X. y8 h5 e; v
printf("data_read = %x\n",data_read);
& y# e* m) q' \. Y$ B4 t }
/ U5 i- U# o0 b& b4 O! y
& i: n* z1 l7 r, W( o msleep(10);/ a6 p& o) ?4 I* ~
4 |- x2 \* e1 C5 {3 c2 J" T
/*
; X) j( O4 H& V3 u: B ioctl(fd,1);
2 F* q# K! s: I0 m( J; K sleep(1);! j4 o2 {8 f9 q9 K' h& v5 w4 j
ioctl(fd,0);
1 E9 y' y/ n: g6 G$ S sleep(1);
+ B% i' m& v' r; n! g1 R */ 4 q9 _& n! O, ~9 n4 v4 X4 v
} $ b9 v) m4 r; S9 w( V
return 0;; {, {9 Y' [8 f, H2 y& w+ g
2 q2 w# Y8 F) k, f$ n}2 K( b9 _3 k& [( G
. g' j2 g' Y* H! v- D* r k& ?多谢各位指教,谢谢! 急- l4 M7 X# ]8 v/ v
( v2 W% c4 a) R8 J! u: Y7 |. D0 x& z' b5 T
( ?& Z O# x0 n- L9 \
- |9 ^( A9 p- W; u, ?" A: Q/ u7 p# _9 g$ m
|
|