|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! ^; f/ `* h+ i7 \' O5 k
/*
7 M/ F- w; r. s * Copyright (C) 2009 Texas Instruments Inc
" O+ C0 _9 E/ l% A( P6 s, F *
6 Z# F G1 ^: f+ v l * This program is free software; you can redistribute it and/or modify8 }2 ^ b+ t, n$ q8 F: I2 }
* it under the terms of the GNU General Public License as published by3 W, }) i' x) L: m
* the Free Software Foundation; either version 2 of the License, or
8 f; p. Z( f, T( A; n * (at your option)any later version.
) E; v4 o3 X3 Q) S* P *- j+ g; n( W" [' \: }
* This program is distributed in the hope that it will be useful,
) u6 S6 ^/ w9 a' |% A$ k4 g * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 ^/ K- x v4 C/ ]4 g5 o * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& P E g+ k n) `/ O) C5 a
* GNU General Public License for more details.
7 a# S$ c2 @% U7 z! I. Y *
) S* G3 E* k& F+ i' B7 \7 b * You should have received a copy of the GNU General Public License
3 T' l& p- @# z1 U4 I2 n* ] * along with this program; if not, write to the Free Software
2 e- F _+ S% N3 G7 `. _$ H * Foundati7 O! ]7 r5 w* F
*/
( ~+ n0 K1 ]9 c1 ?#include <linux/module.h>* {1 f1 \) f( ~; L$ _' H( Q6 a1 o+ A
#include <linux/init.h># k2 B. @' p4 y
#include <linux/errno.h>
3 n! R5 [3 _) a, q$ T, w# R. N# |#include <linux/types.h>% f# }; ]3 ~# }2 T- R
#include <linux/interrupt.h>* a& o& V) R0 ?% Y N
#include <linux/io.h>/ V y& u1 H$ }5 d- }; M
#include <linux/sysctl.h>1 d+ t$ o) j# e/ \' w0 f/ f
#include <linux/mm.h>
2 s# k% ^: L" ^$ A& W) {3 Q#include <linux/delay.h>
0 W1 \# U' l! j9 l! S7 w \6 D#include<linux/kernel.h>
" d! s: Y" J. F/ ~8 x; b#include<linux/fs.h>
5 `, `/ x+ s2 \% V#include<linux/ioctl.h>& s4 s2 E0 E* i; \
#include<linux/cdev.h>
0 X7 t* d4 z% h9 C#include<linux/kdev_t.h>* T+ r+ B6 z$ D1 U
#include<linux/gpio.h>
1 {) z" `" @. e, [3 h0 ^ g#include <mach/hardware.h>$ I$ u5 }5 e$ y/ ~
#include <mach/irqs.h>
5 o$ D4 Y) a2 \ Y V, _. B& y
- z) n- j, E" h0 x#include <asm/mach-types.h>, R; c( k) E: z* [1 A$ x
#include <asm/mach/arch.h>- [8 a ?0 W, j3 o# Q
#include <mach/da8xx.h>
! M( S3 \4 D- \2 E- t, F( p#define SYSCFG_BASE 0x01c14000
T* O8 v( `6 [9 l' u `#define PINMUX1_OFFSET 0x124 # N$ J m; O; E3 A$ ^( Z- C- R
#define PINMUX18_OFFSET 0x168
0 [- J) C# H5 Y; U3 e#define PINMUX19_OFFSET 0x16c
6 Y: P, O5 _5 j4 F' M+ M#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) u, R- ~/ w9 e#define RCR_ADDR 0x01D1100C //MCBSP1_RCR0 u/ a7 {7 Y5 ?# G& ~
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ K% f8 Q* M& F5 l5 G
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
. ]# V6 ?. I ?#define PCR_ADDR 0x01D11024 //MCBSP1_PCR( }+ d/ \( m9 i: K1 z3 }
4 i% n+ E9 A2 g+ @2 v# a
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 g$ p! P, [) l* u& E* B2 N# B#define DRR_ADDR 0x01D11000 //MCBSP1_DRR% b+ K: m- X4 k* Z) {
//PSC
& T0 b& H# g5 U6 Y#define PTCMD_ADDR 0x01E27120 1 d7 d4 Y& x3 E, A
#define MDCTL15_ADDR 0x01E27A3C1 s% {. L7 T' A, G" s
#define PDCTL1_ADDR 0x01E27304
- R% w" ]5 ~- U+ e' i" t//GPIO8 direction( C6 z2 ^- \7 l% p* \: B5 s2 B
#define GPIO8_DIRECT 0x01E260B0
+ n7 s5 n+ O+ O( u* R#define GPIO8_OUT 0x01E260B4
+ O) l' o# h4 o8 r# x7 a! c#define GPIO8_IN 0x01E260C0+ {. _: _2 q6 U
7 X: t% t0 I6 n3 q! Z/ c//#define MCBSP1_RINT 99
' n m3 }7 |" ?5 I# g5 s8 Y//#define MCBSP1_XINT 100 ) A5 m6 u! h9 I% t! x9 r% G# |
static int MCBSP_MAJOR=239;
$ }6 R! B( m! Z4 g8 Q. wstatic int MCBSP_MINOR=0;
/ j& ?1 s2 X7 e$ R# D1 H) H$ Estatic int count =1;
5 ]% ?7 A2 [/ s8 K' D; q) p- N7 i% ~7 {4 q
#define MCBSP_NAME "MCBSP-device") d- r7 ~, Z K9 ~
# j+ G# w0 C. [1 \static struct cdev *mcbsp_cdev;; C3 q4 @* ?# g: b
static struct class *mcbsp_class;
; h; F. R& [/ W9 rstatic dev_t mcbsp_dev;
0 R% b V# `! O9 u8 h/ Gunsigned int DRR_data;% g* x3 [( Z4 ?
unsigned int DXR_data;
* ^) g& U' K3 ^2 f+ _& [static int mcbsp_open(struct inode *inode,struct file *file)* w# v1 m+ l% ~& O4 q6 H
{3 V: v+ a5 U4 i7 V
+ V& Z9 s: K" `& F. `8 y7 n //interrupt enable,initialized
, e. x& l2 F, `! V+ G* E unsigned int temp;6 Q2 y" g5 z- f- y
//SLEEP_EN(GPIO8[10])---08 m- F- ?$ {& \$ M+ v. f
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: H! p2 \' y; M temp=temp&(~0x00000400);2 p' a3 q, s. q \& m e2 J
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- A% s8 U2 {! w0 c0 x
//RESETn(GPIO8[8])----0----1) Z- V3 M( w; L ^) h
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. z6 L# |6 H7 p; y& l' t x temp=temp&(~0x00000100);
7 z3 @4 Q- ?+ Y! ^ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 Z( S/ g: {0 e- u% |4 i+ G0 J! A
udelay(100);
6 _9 n7 D d$ t/ l* v6 y8 } temp=temp| 0x00000100;4 y! D$ ?# s) t' t* S/ p/ b
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; s8 y! A0 ^5 m O" i
udelay(100);- a# Q" H/ P* ^, m* t% N8 b5 O
printk("open success!\n");
5 D* x0 d6 M, u6 S3 T8 `5 u2 v1 z return 0;
8 p9 w- a$ K8 P; `- U* R}
, r A" Z3 X# G; N! S
: f) i" ~( p- g. N! nstatic int mcbsp_release(struct inode *inode,struct file *file)
+ m: \2 W1 C+ t{
3 k" g7 @# g/ C2 s" j% I printk("release success!\n");
8 f E0 O2 q ~$ e- J6 t- i2 ?& E return 0;
; R( P3 ]4 _3 h ~9 l! I- ^}+ B, f9 i/ | G2 q9 d* N
. O( S# l5 [5 C0 n {static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) G( }* Q; A% A' H0 b. d4 u
{- O$ x" K; N o' m& ]2 t/ Y/ F
copy_from_user(&DXR_data,buf,len);8 P' D% @* |( o4 K9 T1 e. q8 E' D
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" A, g' D1 v; A$ F& y* @! v/ f return 0;4 o V- C' c8 y, Q
- k4 g, I! h) `0 ]7 Y}
# K! ?; |6 M$ T/ B' v9 {* E, K7 \: k' @# t' D/ e" C7 I7 z0 g& @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% U' \" c0 R. K; _0 G# D{
. E1 X+ V3 J4 V T$ y h, { DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 f1 H; c1 I: y8 Q
copy_to_user(buf,&DRR_data,len); 9 N- w# p% C. O0 A' ]2 p; j! f
return 0;
, k2 v1 t5 U& z4 D}# p b2 ?1 n4 v2 D
, V2 P5 G. Y+ c b0 d B
: L0 P. ]/ ~1 b7 Tstatic struct file_operations mcbsp_fops=$ y2 W% a8 k! @. Y, E
{' G) |. i. {( f7 R8 _$ Z5 \
.owner=THIS_MODULE,
; a6 n3 I6 p3 W .open=mcbsp_open,4 V* l4 _. x2 h7 ^8 K
.release=mcbsp_release,: r# a J4 ^+ L8 `3 l. l( U
.write=mcbsp_write,
# i8 L8 L9 G# Q9 V2 @, o, \! | .read=mcbsp_read,9 O2 X# d- H( I' z. b8 h# F
};! z5 P2 S& z0 N
static int __init MCBSP_init(void)
% [ L/ ?# a: m: j{$ u7 o5 C) a( k7 }2 P$ @% K. u
int ret; b* M9 e/ D1 R6 @9 k" D
unsigned int PINMUX1_REG_old;
' X! p. i# {- w' c' ?2 o- B unsigned int PINMUX18_REG_old;! @9 \7 P5 G" M6 Y6 E
unsigned int PINMUX19_REG_old;
$ Z# E8 T! }$ d v+ M- L7 Z( a unsigned int temp; 1 J" ^( n" }0 V4 _$ Y* K. w
if(MCBSP_MAJOR). k* g, `- J: J
{
6 I6 R' A9 q; r& d$ w; `0 J5 @+ f mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 H* u' m) H4 _* _! X ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 u7 U! k4 n% T# G* i }0 |. G4 E% M& g0 U: Z
else& |* {7 o; K4 t0 _
{
& I6 h7 ^/ a0 M ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ w- X8 K, z5 x/ }% Y$ m MCBSP_MAJOR=MAJOR(mcbsp_dev);
, Q4 {& H7 [6 d6 l }
. i% K+ ^$ s" v, q* j
. f7 W5 I3 m4 w- { if(ret<0)
6 [, V- K0 z' Z1 c ` {
6 I9 X2 d' F1 S/ { D. t7 b printk(KERN_ERR "register chrdev fail!");
% ?5 L- z. i1 k1 p9 K2 Z- _2 | F return -1;8 t4 g: T7 @# F5 S2 j7 L
}
8 g& j1 ?0 Y! w# a8 [
" \5 V' z$ C* F" j7 @ mcbsp_cdev=cdev_alloc();
* y. o1 \3 }0 B# ` / o0 T& j6 P2 D1 _% N
if(mcbsp_cdev!=NULL)% y$ P8 Y" E1 E+ u7 q
{% W1 l2 I! `$ k1 q& P# S i& H
cdev_init(mcbsp_cdev,&mcbsp_fops);
# [! n5 }5 x5 G" g( k mcbsp_cdev->ops=&mcbsp_fops;9 D9 {( T6 J' y: Z- B
mcbsp_cdev->owner=THIS_MODULE;0 X1 o, l/ e7 q. `1 h1 K$ n
c$ L. n: Z( ^ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 L1 V: U% \+ {# d' w2 v" P
printk(KERN_ERR "register cdev fail!");
" _9 Z( W" E* \3 Z4 ?/ o. I else
0 n8 ` q& {1 Q9 G: r printk(KERN_ERR "register success!\n");# Y; k2 V1 z/ ?
}
' D- l3 c0 g9 A/ u" B: D else
5 x7 {* X! k9 b# l3 N" N {
- i1 L' k E" k0 d% [3 k printk(KERN_ERR "register cdev err!");' f$ M. x u5 s7 n4 g
return -1;
4 c3 q+ H) `: f2 `" }# D2 N }. f- L) i: _- U. n0 p) m
. h+ K8 U' W0 p7 J0 k5 ~ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ }) ?$ y; Z; g. q6 c$ p4 G
if(IS_ERR(mcbsp_class))+ P- B! T) `6 S( f5 x
{
- c5 I$ M+ Q' f1 e T: X, _ printk(KERN_ERR "register class err!");
% ~' Z5 [# a; S9 m9 p& l+ Y return -1;9 C& k- [. O, N$ O& y4 Z7 t' \0 O# p
}9 ^# [& ]/ P* e1 V5 r- |# q! p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ E6 n0 ]1 g, q: ]/ U+ ~) \( v
/ K3 I$ z( P5 u4 q5 B3 {! P
//PSC
9 `0 ?3 v% ^& a7 Q% F- o$ p- D, k //add Enable MCBSP) B4 ~) D; f. M
//test
4 c$ T$ {7 a& ^( ` l temp = 0x80000003;
* h4 T1 d' F6 y8 I) S writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 b0 L# X5 E2 X0 S temp = 0x00000003;* |/ w7 g, n$ d0 i( ` ~" F
writel(temp, IO_ADDRESS(PTCMD_ADDR));( b1 M- `, v$ s
9 G( E1 B$ F( S+ o0 {9 Y temp = 0x001FF201;
/ I1 ]6 q# c5 |' b9 _' E7 Z0 b1 W writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 h5 q- u7 E% T- E/ S
! S" V( S; N: s //PINMUX 4 X' D* n, p- P8 `" s8 J, g1 j8 H* l
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. Q Y1 k, C' a9 L) F
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) S5 T6 z! d6 X" Y( X# z$ E
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 a4 g. k/ x6 L6 ^8 ~ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 _ ], n: r! `! g8 F7 C
, p5 s v- ?% _7 v) o5 D- h //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 s/ J! O. e& D# ] PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % v8 A) {. T1 p
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; : o, x" _7 {% Y
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 I' j0 q. {3 \8 z8 X& ]& ]0 p! N
2 Y3 K9 v& u& M; h //RESETn,L138_SHK20 z1 Y' w* H m2 A* w+ |
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 0 o; R# _4 L+ i9 w
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
* A @8 |0 f) ~. k F8 Q W" S: l. O writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: B# X8 ?. T( G# [# |+ h1 X% H
% ~! ]2 @9 }% W# _& c- r $ g% I. q9 f3 {' C; K5 ?# N; N
//SPCR Register+ e+ U6 J6 @- }, t4 f/ ?$ A3 d9 L+ s1 }
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) ^# {" G' ]% ~$ d9 m temp = 0x03000000;//(DLB=0)
+ p' g) R* h! w1 t2 L // temp = 0x03008000;//(DLB=1)8 [7 ~* v9 X# |0 b, S5 V! @# u
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
6 s+ S' G# J4 d0 Y4 \/ \! Y temp = readl(IO_ADDRESS(SPCR_ADDR)); Y4 L: ~* |2 y) l
printk("temp=%x\n",temp);
' b2 o W" [# }0 d1 `
( B# J' ]. G# X: { //PCR Register1 r( {# K# b: |: C( X+ ]8 A1 S
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, Z- N& n/ v f+ x9 I7 U
// temp = 0x00000F0F;
; F- s+ _% P' P4 m9 J temp = 0x00000B0F;
' a0 X m0 _* K M- z writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 4 Q: w. n( {7 T3 Z
temp = readl(IO_ADDRESS(PCR_ADDR));1 f: }& @! V- n
printk("temp=%x\n",temp); ( U; G0 W a9 V4 A, ?
//SRGR Register. t- K- f4 u4 P! }% e k4 X+ T$ ]
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ j. F! k B( Z2 Q
//temp = 0x301F000B;" o* J& O% g+ M. |& Z# ?
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
0 c: y7 i9 K% f1 g temp = readl(IO_ADDRESS(SRGR_ADDR));
- m: X. y1 V9 }& A# v% | printk("temp=%x\n",temp);
3 W Z0 @8 i; O' P //RCR
4 @- U" N; }: v# X& L2 z. U6 M //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ A* P- t( P3 x
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 D, }( `1 Y! p1 s9 Y2 g { temp = 0x00440040;# [3 w' X1 Z; \
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
+ y1 ?8 d$ ]0 G! W7 ~$ [7 K temp = readl(IO_ADDRESS(RCR_ADDR));+ B3 \. U" O9 y. r# S
printk("temp=%x\n",temp);4 P8 d4 n3 D% W2 }
//XCR
" B0 s1 \: s4 V' i- ` //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 V/ V4 W8 O# B4 P# r& ^2 M
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 g+ J$ S' t- G9 Z- J9 H
temp = 0x00440040;
. j! _$ h3 Q4 K' I writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 o. @5 _: ^6 A P: O temp = readl(IO_ADDRESS(XCR_ADDR));- s! \5 X: v/ e
printk("temp=%x\n",temp);
2 y" ?. Y9 k9 Q( [/ y4 o' K6 { Z udelay(100);4 B1 @- {( n/ d2 c3 k# I" N! Z
//SPCR Register! ~; q8 B/ l1 J4 c# `
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 T1 Q# [0 ]& @, v! ` temp = 0x03C10001; //DLB = 0 VS DLB = 10 X) H* }1 H2 }% _
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled. ^2 y: q3 D6 j4 _9 v% H8 p
temp = readl(IO_ADDRESS(SPCR_ADDR));& y, X5 O1 X6 ]$ |
printk("temp=%x\n",temp);/ {# h2 y8 r& F, s& ]) f
udelay(100);9 _5 O2 I0 C( y1 A* q5 r
9 a% n! p5 s J5 ?
//set GPIO direction
% [3 _& M: ?4 T) E2 N! | temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" B8 G# o5 ?. c/ R+ X* K8 Z temp = temp | 0x00000100;//EPR----input# |3 n$ `5 |' a9 o) k
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) P- H y/ L6 K( O0 h2 I9 B __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) n$ t" w+ p* _ 4 B$ B0 P* N& P, W
return 0;+ [: V, w) f4 n2 n3 S+ y
}% m4 |% P5 g K9 K- Y
static void __exit MCBSP_exit(void)
! h: R7 s4 Y7 X: i: R{ ]' x' Q9 `; L5 z- O
printk("mcbsp chrdev exit!\n");% ]) L& |9 L7 @( Y. e& u+ ^
cdev_del(mcbsp_cdev);
- r& u( ^2 n( T9 l' i1 i" M unregister_chrdev_region(mcbsp_dev,count);
9 ~5 e. A) j$ M' _+ r$ Y device_destroy(mcbsp_class,mcbsp_dev);- O/ e: A6 S! c3 O
class_destroy(mcbsp_class);
* C( V2 _6 r$ g* R/ G' `( w}
/ ~& P* {+ G* _5 Imodule_init(MCBSP_init);
; m n# O; v+ xmodule_exit(MCBSP_exit);
f) |( O( Q& U7 S6 i8 k# B' }' U- t5 L2 Q
MODULE_LICENSE("GPL");0 s% @1 m [* H% \
' U! w+ ]8 U' \* E, K我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 U5 x/ u j1 x/ H
我的应用层的测试程序如下4 B" |+ P! N3 R5 ]! ^ u1 i
#include <stdio.h>! l" j6 s& B+ N& z; x; \6 n" j
#include <string.h>2 X7 \# S Q* M0 E
#include <fcntl.h>: z. x) m: u9 y& [- ]4 N: s. w
#include <unistd.h>
N- K5 `0 P4 x7 k#include <signal.h>3 D" A, A0 x% S; j
#include <pthread.h> //线程
1 a9 i: }4 T2 G5 C3 e7 [3 n#include <stdlib.h>- n8 q4 ~6 ~+ u7 Q) x. I$ g
#include <pcap.h> //捕获网口数据' {% \1 ?2 \5 `7 a% n9 J
#include <semaphore.h> //信号( q% ~ y! ^8 d
#include <sys/types.h> //消息对列
6 c/ ?& e. g3 t- H& _4 n- B#include <sys/ipc.h> //消息队列
' O) v3 ]0 V* J# d" b6 i#include <sys/msg.h> //消息队列7 l! P% ^* ^* ~' x i
#include <sys/select.h>
% D' D \2 k+ `' W, o. b y#include <sys/syscall.h>
2 T/ v/ S" T- b" K' x#include <sys/stat.h>3 Z6 t- f2 P0 I& Q( r
#include <sys/mman.h>
$ K1 T* e9 \& b! ?6 `: [8 s6 T#define msleep(x) usleep(1000*x)
8 H- l9 Y3 x9 v) [8 f! y7 {0 ]( Q( ]
8 y( }4 | Y* N/ ~+ [# eint main()% }% q/ O( n& n$ \
{ . Y; p* z, X5 O: o: G, O" i
//MCBSP,ARM与AMBE2000交互设备
6 w5 o! Y* o$ C* \ int fd;
0 Z" w6 G8 D& i" G" _' u- z unsigned short data_write = 0x5555;% H: u1 D Q4 Y5 K: p6 Y
unsigned short data_read = 0x00;" y# J- A$ K& W7 i- x/ x
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( f6 o& k8 r$ x6 P/ K // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 Z/ p/ c0 o# n/ n3 q
3 d# D0 d' a7 I7 U if(fd < 0)
; P3 O8 V/ m U* ~$ Q) G {
0 d# l0 H8 T+ T& [ perror("open failed\n");! G. J' d3 h/ N3 A {# ~
return -1;+ C: ^( `. q( z) S5 @) Q' r. |
}
: j2 P" g& F9 w- B2 k$ I
7 m' Y1 d, @& H3 {! w$ B; @6 Y while(1)
9 h0 @& w0 T$ I, X. C! q4 q {# n) o' M0 D! o! X+ x
8 O9 i/ t$ i1 z. \( s& m8 p; E //AMBE2000每次读写是24个字为一帧% Y. M1 v/ F$ w1 }
//写数据时将数据在底层存储起来,等到中断的时候再发送2 o5 n5 i7 b* ^$ O5 B9 R5 k4 U$ G% K* s
//AMBE2000输入数据是以0x13EC开头的
9 P; A! _+ h6 o, X" G( l7 X write(fd,&data_write,sizeof(unsigned short));
/ z* a' E3 H& `0 v. X, w9 d
+ d6 T: m9 ?2 r/ e9 z$ w //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- c$ b8 J9 N8 b( M read(fd,&data_read,sizeof(unsigned short));
; |% \3 n8 T4 f5 c1 }) J" q 7 `4 p7 x: j. I8 H& p
if(data_read == 0x13Ec): N7 H8 I) p( w
{
( y( i3 G- m6 Y: e! o
s* ~4 |9 ^1 c3 a' s. W printf("data_read = %x\n",data_read);& |% E, F! P0 y p( m4 T& n c D: x
}. {* I7 H5 |/ T. ]5 Q* ]3 t; d8 L
, s. w3 _6 R# C
msleep(10);
% F7 w1 i) B8 Y2 E' l. K+ _: C + H3 j0 n% f8 h; x$ \' z5 N
/*
5 }+ J0 t. x$ U0 O- N$ K& B7 z% a ioctl(fd,1); & Z9 j4 ?" X& M3 G/ ~
sleep(1);6 v7 |- V7 \0 C9 R3 t- I
ioctl(fd,0);
1 J: u" A8 F8 H sleep(1);
s3 _2 Z8 D- B! G */
3 H; |2 ^+ x4 t* F2 ~1 e1 A } 8 J* p5 J! T. \. j2 ` M
return 0;
7 g- G0 z# w h! g & N; c- T5 L9 `% Q( _
}
* [' M2 p; K7 U0 P; ?7 b% d3 [3 p% d, }# F- c
多谢各位指教,谢谢! 急8 ~. _7 j" [& R* Z; Z+ X, g
6 N7 Z4 v/ P9 W3 O3 M, V
; i: |" o9 ?) K6 ]1 {8 l7 \, A7 I
! Z; _3 i3 [) f& M) n0 J8 q# S8 X/ Z0 K
: c% e' T6 C% K5 u( g |
|