|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " `1 ?- B/ W; }- _8 X; z$ @
/*
& j% ^5 n }7 S, {+ C * Copyright (C) 2009 Texas Instruments Inc
2 f- E1 ^+ g! ^( L8 M! Z$ a2 j, g( V *( N y' z' {! [) F
* This program is free software; you can redistribute it and/or modify
) m) I+ B1 Z2 g2 [; c# C R8 c * it under the terms of the GNU General Public License as published by/ d# v& \4 r/ \- i
* the Free Software Foundation; either version 2 of the License, or
) D( b+ T6 D% g I+ t * (at your option)any later version.( C2 Q: s# n* D& F! U
*1 ?8 Z3 F6 k9 ?. e8 x; f s% j, K
* This program is distributed in the hope that it will be useful,5 H7 x4 x6 L3 T! I
* but WITHOUT ANY WARRANTY; without even the implied warranty of% K9 F- h' T" `1 h" p: c1 x
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) w) r. \, a. T, f+ _7 M! Q * GNU General Public License for more details.
0 T/ k* l8 s8 m0 F' | g- l% ^$ z *
0 D; |1 R7 h1 p8 F7 _5 ] * You should have received a copy of the GNU General Public License/ M! }( L& ^, N8 a+ x2 R
* along with this program; if not, write to the Free Software
' E' F3 ^. v1 P; x9 E) g# c * Foundati6 P+ |" \/ j2 ]( w f; y
*/( V6 g( s1 l9 a1 \
#include <linux/module.h>
' A9 V' O! e( L% j#include <linux/init.h>8 P6 j" N4 ~3 _6 K
#include <linux/errno.h>* P: O8 y7 _0 u; H% G6 T
#include <linux/types.h>
. |) M/ s+ y/ o$ ?) U#include <linux/interrupt.h>; _0 F* J: X+ q$ H( o- [) m
#include <linux/io.h>
( C M" |* u* q X" t#include <linux/sysctl.h>
* U' ~6 o# a. Q8 ~# X#include <linux/mm.h>2 D+ F2 z( i; u, d' ]
#include <linux/delay.h>+ f& c" s7 }& v. ~' \" w2 b
#include<linux/kernel.h>) H# E+ `0 E9 G2 r7 |! j9 ^2 S" B
#include<linux/fs.h>% M4 q. J% K. ]+ t! y4 ~& _
#include<linux/ioctl.h>
5 [ p3 B" D# D3 K6 O#include<linux/cdev.h>
3 B' ?0 i1 K9 s( j5 q9 [! b7 J% B#include<linux/kdev_t.h>
9 s2 U$ a% B9 N: v# l A6 E#include<linux/gpio.h>
! g! y. m2 T. g! V* j7 s5 N+ _#include <mach/hardware.h>
) y- M. b$ n: @- |" V2 S. f) ?#include <mach/irqs.h>
! c! ~# m; g8 ~5 J( s7 R
* k) I1 m/ u7 R5 F& Z7 v#include <asm/mach-types.h>/ ~; v. g* R& o% q0 k5 L* C( {* ]
#include <asm/mach/arch.h>
% b4 o; E# ?9 ~ `$ d2 b#include <mach/da8xx.h>
" @( P, T) B7 C9 i#define SYSCFG_BASE 0x01c14000, H0 S. i* S3 q9 U+ @, Q% h$ ~
#define PINMUX1_OFFSET 0x124 5 U, f% d* a* p# H* l! ^# a
#define PINMUX18_OFFSET 0x168
, ?! E, j' G! M8 a0 a) I$ h [# |#define PINMUX19_OFFSET 0x16c4 ], d; Y3 |5 A" v9 \" }, {0 N
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
; L+ \) D3 `6 i# h& K9 q! u, h' J. V6 f#define RCR_ADDR 0x01D1100C //MCBSP1_RCR" Q6 H* C2 N) `# A
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 p, }8 j& z" t1 E2 C! p$ J& O
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
; g/ h4 w2 V, W# W/ I0 J8 p6 L' b' v#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
$ Q; z# m& i- A+ G4 a
: y8 Y! c' Q; e) Z" o#define DXR_ADDR 0x01D11004 //MCBSP1_DXR1 L$ N+ A" F5 r1 h7 I
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR3 v$ m1 H T& N9 T
//PSC+ P9 \6 ^8 ~1 j1 j+ l. B
#define PTCMD_ADDR 0x01E27120
% q2 Z% N9 z- S#define MDCTL15_ADDR 0x01E27A3C( C, J7 \8 f; b; G
#define PDCTL1_ADDR 0x01E27304* r$ g6 S+ ]0 s# p4 @+ T0 n
//GPIO8 direction
% ~( X7 F( ?' Y1 R# I5 j) z#define GPIO8_DIRECT 0x01E260B0
. p F: A! r* e* e5 y#define GPIO8_OUT 0x01E260B4' k& `$ X1 c( b- J2 G* l
#define GPIO8_IN 0x01E260C0% E3 _7 }2 J$ Y# i. l
7 f% _4 A( x6 f" N0 ^//#define MCBSP1_RINT 99
( |5 c4 t" P# G//#define MCBSP1_XINT 100
; [& \% f$ B+ P. Lstatic int MCBSP_MAJOR=239;# Z. A5 W; ^/ R) O8 g7 u5 [
static int MCBSP_MINOR=0;
4 f8 X8 {6 Y) a4 O8 `5 c# Xstatic int count =1;- i! E3 M4 q, g( P4 i( r+ U
7 L$ f) |& e% W. ]! }2 E& u#define MCBSP_NAME "MCBSP-device": s3 l' _, a1 N/ H! X' P, r
) C+ ?& c2 E* |7 D7 k
static struct cdev *mcbsp_cdev;
* }. V! E) g8 h, ]) f1 e# `/ Ystatic struct class *mcbsp_class;$ C$ O9 u* Q9 y+ e
static dev_t mcbsp_dev;
6 K( E! `$ S8 v2 F) q: V# W3 punsigned int DRR_data;2 c' c# ` l# E- P
unsigned int DXR_data;( F2 s" G( w4 E/ O
static int mcbsp_open(struct inode *inode,struct file *file)0 h6 M+ {3 [* u/ G) n; e
{' x: O. A: X) a3 m
$ j+ h" Z$ a! O# l //interrupt enable,initialized7 M3 j7 |* c4 z
unsigned int temp;
S4 t, k2 B8 `/ i/ d. T/ Q //SLEEP_EN(GPIO8[10])---0
* |* w( b+ q0 [0 X! D- o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ q- @# n3 P. ?: @& h0 j temp=temp&(~0x00000400);0 z K1 X- F" D) B T
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 v& ^+ H5 @: U* x; N
//RESETn(GPIO8[8])----0----15 U8 n0 i2 E q, l$ R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: p* K# M$ P" \ m) u
temp=temp&(~0x00000100);0 o& N, ]& \% C2 u4 A2 ^8 G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; E* }& J! i; H2 h
udelay(100);
' s6 i! o8 A, H: U temp=temp| 0x00000100;( |1 T3 l, n# @% R6 M. R
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ T+ @4 a' }) u2 P3 Q+ e
udelay(100);$ O' q% ?0 |7 L+ d; z8 i
printk("open success!\n");
# C6 `% ~! C$ K+ M5 E0 G return 0;+ B7 g) `$ w* ^' a
}
" `3 _, |# P: a- W) J& ]( ?& _9 m; \/ u) [
static int mcbsp_release(struct inode *inode,struct file *file)) u2 U& T. P0 |
{, w/ E# ?0 b9 L% z I' g- f
printk("release success!\n");) A* _' U j0 j: N3 E) i
return 0;
7 t6 U, x: ^! D. ^5 I}
, T; {6 ?$ a) t8 X( u' e% f: Y K4 Z9 S
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 Q3 ^0 m6 F% A$ B3 `5 ?2 D4 x{
1 o9 ]( }; u g; ?4 k x2 G6 C copy_from_user(&DXR_data,buf,len);
4 W7 k/ a) a4 k: C% u/ e iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
+ E9 Y3 C$ F: Q' W2 P return 0;" }; ^$ g1 D, F! M! E& [
8 v) J, M! I! d8 q8 Z! t}
9 k8 C' ? H( t$ |: o/ n' S6 _
& x' M; N1 G4 y# A% ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 ?9 I2 ?+ ?) o/ C{
+ w# M' L o8 m+ D DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! G5 R7 h6 Y! M8 H: E3 a
copy_to_user(buf,&DRR_data,len);
+ B# \0 D- P: _& i1 z( d+ f return 0;, e' X( |+ a! A* j1 J% }4 U( n! l& s( t
}
4 A' b5 _- b% [! A
; F0 D' A0 M, F
. p) R1 p! d* p7 H* E7 Z0 wstatic struct file_operations mcbsp_fops=
& G7 f$ _' }4 |6 [1 _4 e) f{
9 N" a* J6 W6 [" A. x5 [/ N .owner=THIS_MODULE,% U7 H9 m) G5 m4 i5 h8 ], d- E" P- d
.open=mcbsp_open,
( y4 U: D: P o% z! Z1 u .release=mcbsp_release,* D* R) @3 q$ h4 x/ D* y' ]1 V3 i
.write=mcbsp_write,
) G5 j4 j# U" h7 h w .read=mcbsp_read,: M5 F; W7 B( K3 E' [/ c
};
% o+ F$ r- Q7 }static int __init MCBSP_init(void), P, _5 G- S* |* f4 n. P
{5 a9 g. r, [2 _( `4 g' j
int ret;% J1 ^3 Z1 {0 }3 G
unsigned int PINMUX1_REG_old;
5 K+ |! @6 u" i unsigned int PINMUX18_REG_old;" t, {7 \) y, O5 Y
unsigned int PINMUX19_REG_old;( b* O- R# x9 U1 T. X% f2 S) c
unsigned int temp;
; s8 M& o& K" ` if(MCBSP_MAJOR)7 U+ h. C+ A/ l" N: ~* W% W# ^
{
9 Y% s ], i, w4 ]* g* _+ Y' n; A mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ N2 z- u. [5 y5 b. X! x. p- }
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* l* F: J7 H7 L8 A* {& n# e }
h0 \ J* f8 s else9 q) G2 A8 M1 E) x! K
{
6 h; c" k8 I- h# X U8 D0 g+ ^5 v ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, }4 g2 @/ y; J% I2 N; ]& \ m8 E MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ O* v4 O- _! `0 V c }6 U. N* p& {; s( f: o
, {! u( m: M9 C if(ret<0)% z/ r0 \4 w; }6 n! p* I
{" g% X- \% v6 k8 n$ D
printk(KERN_ERR "register chrdev fail!");3 c9 M$ t2 g" h2 p! B, x
return -1;! Q: j! W# D% B' _
}
; n( n9 R7 N- `1 D9 I9 r, w
1 B* H8 t+ }0 I: ?+ |/ \* ^ mcbsp_cdev=cdev_alloc();
' C$ P5 ]% \2 H# X$ H
/ v% A2 z* z$ V, l( k4 h3 l if(mcbsp_cdev!=NULL)) k& a6 W8 Q: r, i, G3 V1 g
{* ?# e9 W" N. R8 z
cdev_init(mcbsp_cdev,&mcbsp_fops);
' m6 c5 W3 B! O" ?' F- K% Y mcbsp_cdev->ops=&mcbsp_fops;
7 w& P3 F" N0 P/ ^3 L d' R& \" l mcbsp_cdev->owner=THIS_MODULE;
, Y8 _4 p M6 K3 g
& e# w! f$ V1 C# ~+ ?0 D if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 ~# U( o0 x2 s; b( ^5 V, E7 A$ c
printk(KERN_ERR "register cdev fail!");
0 `9 V3 l* w( p% k. l else, B* B3 d+ T8 ~& e
printk(KERN_ERR "register success!\n");
) ]( x. f$ L* W: k. c- ?( W. Q }
2 z' k# {( k: k' Y, T7 P7 C4 { else& C; I' a' T5 @6 I3 \, s) d% S
{5 R3 w1 E. }6 q. @* I E: q7 Q
printk(KERN_ERR "register cdev err!");5 A k- p2 p" n2 x
return -1;8 [7 E/ }0 m$ l
}
! U' H. n' f% b4 l
& i0 G6 ]! _' q* p mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( o; I4 A$ ]) U2 \
if(IS_ERR(mcbsp_class))
& m! z# j* Z* s8 L {
7 l0 T5 F( r U* |5 u8 I printk(KERN_ERR "register class err!");, _2 Z1 S, F' k
return -1;
% }( ?) p7 b4 S7 D4 d+ V% a, i% z( H }
/ R( u9 D9 a, l* V device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( n# s0 s" T% y3 J: g: B, V
2 Y6 e1 v% ~2 P( l% x! W( R2 M //PSC
9 K& n' W0 M @ ~" O //add Enable MCBSP$ i# C/ O- U7 [" V, b
//test
" U" L) a1 [3 k8 ?2 n% T7 h temp = 0x80000003;
* p8 z) z7 e# d. G writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 b/ Q2 X, R1 k: W7 _: @ temp = 0x00000003;
& i- i# N8 x# S writel(temp, IO_ADDRESS(PTCMD_ADDR));1 Q# O+ K) A: _0 s/ `
* k/ @5 O6 l/ c: w! c1 z# D
temp = 0x001FF201;
* ]) I! b4 G+ v- l writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ U1 T1 B# p; Y$ x6 L( V# W
; `! v0 _6 I' E: L4 l# X N+ O //PINMUX
# L$ j2 E9 F! Q( ^7 @- t //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- ~) {5 H k, o: R
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( u% w/ {' {# n# c2 S' { PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 U% {7 a" }) i# H writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. l* S, _; r. |6 M
3 y! k8 W. K: v/ J' O: p
//SLEEP_EN,EPR,L138_SHK1,L138_RC# A1 ^& J, ~: f# k: K9 G9 p! r
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% h2 s) S. r/ o2 Y1 n( S PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ M( q; {7 K1 d/ n0 y0 @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) d* i5 f% b. A( y6 y
! M- T8 t# U* W) Q
//RESETn,L138_SHK2# k0 c% n; g9 {8 {% p6 y6 n% g& U
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ b R' s1 u( n4 O/ _6 \. _8 [
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; . G" }+ a% P; g( L" N: r, \
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 i- P; x9 N$ W+ l/ D$ v( {0 B d " {+ F: `5 \0 F$ Q' F; F
5 W; ?% e* S6 ?1 G* ]5 U- P- n
//SPCR Register' e* X! f: S. u3 G/ i( P+ N
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 K$ G0 J0 z; \+ e' p3 D+ z' U, K
temp = 0x03000000;//(DLB=0)
/ n2 |8 ^- B0 [5 D: L+ [ // temp = 0x03008000;//(DLB=1)
% ~9 Y& l( d, l2 ` writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
5 t& P0 i+ D" [) w# \, @1 P temp = readl(IO_ADDRESS(SPCR_ADDR));5 S/ v# z* t3 R* _0 p) {/ q
printk("temp=%x\n",temp);; J7 y2 a0 J/ e
. ~+ O8 V! M# K# N5 E0 H& {
//PCR Register7 o5 h Z: ~1 W
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 r7 b3 h& @$ y0 G: z+ y8 g5 Z! M
// temp = 0x00000F0F;; a r7 G! O3 V* X( X
temp = 0x00000B0F;
; J) f, `- B( F writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 Y/ J1 x" ^, f6 a temp = readl(IO_ADDRESS(PCR_ADDR));
- T( F6 {. E R/ k8 ~ printk("temp=%x\n",temp); ' W9 y! b3 }( U1 Y( I
//SRGR Register2 d& P: O n+ q' b& j
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 |' L( a# v" X8 e2 ` //temp = 0x301F000B;4 z# B" H7 u% A: D; r. W
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 E- S& O2 V0 L# J$ C temp = readl(IO_ADDRESS(SRGR_ADDR));1 \$ D6 O3 X3 ?( k
printk("temp=%x\n",temp);
- q& `+ c* y0 { E //RCR
0 ?8 C. Z* t& \# R2 ? //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: C8 D3 N# e1 m% F% ]' g //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 m: T7 }& Q* c6 S4 C, o2 L
temp = 0x00440040;
+ x; Y2 C, L* D9 \# A C writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
' K4 D+ a9 R2 b2 G" X) x' X$ } temp = readl(IO_ADDRESS(RCR_ADDR));% {% @% M- K% L6 @+ y# W2 p- D
printk("temp=%x\n",temp);7 I. _; X7 E. V6 m9 E: E3 n
//XCR
* J4 g) {8 e( R% b+ _# Z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- I' H o( d9 X8 }! W
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* U* K" d \; ]( v. x" W
temp = 0x00440040;
6 E Y# P+ G3 _+ q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 k8 J. f4 v4 \% d* `) W4 H
temp = readl(IO_ADDRESS(XCR_ADDR));/ G; L6 U/ [4 V6 P+ F, b
printk("temp=%x\n",temp);
( z7 ?" w/ [% K6 ]& u udelay(100);' w* [2 S: ]# m' }7 f% ?
//SPCR Register
+ |7 f: N: J2 B) S) l/ q" ]' W+ o //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 K1 B9 Q) r8 A
temp = 0x03C10001; //DLB = 0 VS DLB = 13 n: K ?8 @8 K) D1 g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
8 I0 T9 F: {7 x6 ?5 [( Z temp = readl(IO_ADDRESS(SPCR_ADDR));
% _+ ^3 a4 p" r printk("temp=%x\n",temp);# N* t, f: A8 }+ ]% ?
udelay(100); m1 c) k, U# ]+ L8 s5 Y& W2 Z
/ X7 @+ d0 I0 `* O7 C0 u: ~
//set GPIO direction
/ X: i7 F1 Q: x% Q" d3 l7 Y temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 y6 p( @4 a! V9 @ temp = temp | 0x00000100;//EPR----input
3 z/ \6 q- v8 C. |# B temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
g6 m1 r6 C( O! |( F& W __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 R: @: w% F) C# h
p$ H5 @$ b9 W" P+ @. u
return 0;6 I3 p6 ~2 M' l8 S
}" T# a! W2 D5 a
static void __exit MCBSP_exit(void)# q5 R/ f B, z* h( [. h* U
{
' P+ R" H, }: @ printk("mcbsp chrdev exit!\n");
( g& \* W/ S9 _4 M cdev_del(mcbsp_cdev);" o! Z8 g" f6 }$ ~
unregister_chrdev_region(mcbsp_dev,count);
8 f2 e7 ^ ~6 g& F' u device_destroy(mcbsp_class,mcbsp_dev);
% v% D; \: F0 M: ]" J class_destroy(mcbsp_class);
" D& ?6 v) h* r5 r, s. ^$ L}+ M$ j) x/ B- s. k3 d
module_init(MCBSP_init);
8 G, J" k! ^3 O7 Y& W& F, @module_exit(MCBSP_exit);5 j: f6 ^+ p3 H+ y
: S" L, U+ {; p' f. n8 RMODULE_LICENSE("GPL");5 R5 v9 D* F8 f# w
4 a0 a1 h, Z/ f; p4 g4 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. W: {, x! A6 C我的应用层的测试程序如下
' A, ^; ?/ h9 X p! `; n" f+ G#include <stdio.h>
! s) z/ l C6 T4 E2 P, j/ R#include <string.h>
3 B: M" Y# S: h+ i% k#include <fcntl.h>
- Q k' w# \: C5 u#include <unistd.h>
6 T6 s2 I+ B: t# {#include <signal.h>/ Y r8 ^1 D" R }1 v& g' L
#include <pthread.h> //线程$ K1 e, f1 G& T! g1 ?
#include <stdlib.h>
. Z' t1 X0 Q- L" @$ I4 D/ S8 T& A% F#include <pcap.h> //捕获网口数据1 g' q1 k# \5 E" r. A4 l
#include <semaphore.h> //信号5 ~- N0 h- Y w/ _: H2 V+ I' G
#include <sys/types.h> //消息对列. s" R. E; m3 S L
#include <sys/ipc.h> //消息队列3 I* m% V4 X; v& {7 f
#include <sys/msg.h> //消息队列+ O* A. x6 @" G/ e! k. R
#include <sys/select.h>0 a% F( ]" N C. s+ x
#include <sys/syscall.h>
" n* b) S/ N; B) h5 ~$ v; A. B#include <sys/stat.h>
9 f9 T% _/ q% K6 s#include <sys/mman.h>& ^3 `9 B9 n0 {
#define msleep(x) usleep(1000*x)9 g7 W8 R, D! ?1 A7 ~& @; N$ L) T
4 N% ?! z1 T* h/ b8 P' O! Yint main()
8 r8 c% z N1 }* E7 Q{ + k) t5 n' u, m7 m9 ]
//MCBSP,ARM与AMBE2000交互设备* |9 w5 |9 T6 D% ~
int fd;8 ^# T G/ R/ |* s3 \
unsigned short data_write = 0x5555;: A# V2 u" P" k2 _9 `
unsigned short data_read = 0x00;; a( M! d/ h9 e7 @4 j2 E$ N0 ^ c
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC); K" U: v0 u2 f* p; o9 t% z
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 Y4 L1 X* E) Q8 T/ [3 X& h 6 j+ D. f y/ f
if(fd < 0)
. q4 { n9 V. N) `2 E {
. B7 ^7 w7 x7 X- P/ c' u+ L- u7 } perror("open failed\n");
6 G9 F5 k5 k) }0 f return -1;& P. b5 Y4 h5 X+ d5 ?0 B! a3 i
}0 F# h' Z0 i2 X- S1 Y
7 ^& {6 h: e1 f8 y# o while(1); r# X. }* g, {" b& z: a* S
{/ V! Z9 j' }" e; [" d+ f! e
& n! e* F! q5 u( H5 S //AMBE2000每次读写是24个字为一帧
. B) L: S4 Y8 B$ s //写数据时将数据在底层存储起来,等到中断的时候再发送 B5 n' y' d. f% X( G J$ o
//AMBE2000输入数据是以0x13EC开头的/ ~( ^, R$ ?* s! H( R Z" @" h; c
write(fd,&data_write,sizeof(unsigned short));; ^9 T6 T% ?9 K2 [+ L: R, |: W$ \' I- n7 U
7 A3 X1 r* p, q3 ~7 K, |6 P //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 / r. t- z# B+ w! o/ s. o' k, @
read(fd,&data_read,sizeof(unsigned short));
$ O* s3 q9 I" q# o; |7 }7 c
3 w3 ?3 u3 m- Z) z4 k a- e5 @6 } if(data_read == 0x13Ec)$ }/ z. K5 F9 H
{6 q& Z' ~6 g2 p) S; o! D- w
( _: y: C; V( J. N5 }' T printf("data_read = %x\n",data_read);0 Z, w: j8 P/ H4 L
}
5 F8 \# q6 Y5 c3 q. }% X( | 4 w' e0 U! Q% I8 }# H
msleep(10);
3 {5 l- n' r5 I: H
5 g2 U# ^9 F ^1 g /*. g( {/ X T2 T% R% b
ioctl(fd,1); 5 a; L- F; J5 m- a9 U0 W0 Y
sleep(1);1 @" R0 ]5 I7 S; K
ioctl(fd,0);
- D1 M5 m9 k5 U$ M$ D, I O& ]: O sleep(1);
4 D' O3 q) b I7 F5 M# o */
) R E' g' s- b. f2 e% e+ e } / L! T+ D1 D- W" e; p, }/ f+ Q
return 0;
3 i7 [$ S- {& j3 `6 V/ M6 y : t5 Y2 R, p Q% m8 O6 @0 J
}. c+ E1 H, b/ _5 n
/ W0 s G8 f! k( ]2 E7 L4 [* g
多谢各位指教,谢谢! 急
( I: \7 r7 R; j. j
5 H- ~' \- |6 F- a- I) D$ v8 z, {- N" p. ~7 ]$ p
* V3 G( a8 y9 S6 u; W1 D% X7 E0 r3 L( }! q( k: P3 _
! `' P% ?. d" v- [) Q; g |
|