|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 j; l& R- J$ E `( S. m
/*1 @ a' v$ \- s+ L' N; m
* Copyright (C) 2009 Texas Instruments Inc
2 @3 b# g7 ^- X1 ~, v *
! `* {& ?7 x! M# q! T * This program is free software; you can redistribute it and/or modify9 b1 {7 H" o( h9 X
* it under the terms of the GNU General Public License as published by* V- X( Z3 S8 p* B3 T5 e2 s
* the Free Software Foundation; either version 2 of the License, or( z, [/ Q0 q: e
* (at your option)any later version.
$ U# \. K) E, x9 m. e *
( j! k$ R& `) {, n9 m4 p * This program is distributed in the hope that it will be useful,/ U8 O3 S7 L! r7 j7 b1 `- |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
& Q+ w0 g# M% X2 g5 u* d * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 L0 x F$ S; G+ i7 J
* GNU General Public License for more details.
) w8 z, H: g; i *7 _0 g6 n/ L1 T N$ |8 Q* _, [3 Q
* You should have received a copy of the GNU General Public License# U K/ w1 Y2 T$ E& ~; X5 x
* along with this program; if not, write to the Free Software: t5 ?0 G* a7 U8 y3 \
* Foundati( T# X: r% C: O$ B
*/' j& F" C# \6 `# l' V! z) K8 c& g$ ]6 P
#include <linux/module.h>
/ @: P8 D4 T- A. C7 D- K#include <linux/init.h>
) {) u5 `0 D; Z8 Q0 F5 G" j#include <linux/errno.h>0 |2 O: f/ G" I: I6 M1 {8 O
#include <linux/types.h>6 k7 E1 X! N& G4 W: c/ s$ H
#include <linux/interrupt.h>) c4 `9 H! ^' g. _* Z6 e
#include <linux/io.h>
5 n$ [+ v. _* _) U#include <linux/sysctl.h>
: D! w4 w! H1 i" O# k#include <linux/mm.h>7 X, M- ~! w8 |, l* \
#include <linux/delay.h>/ s) f9 |; f/ }& y& a/ W
#include<linux/kernel.h>
) d7 ^8 _- J+ U1 G#include<linux/fs.h>
# P# r8 z7 R% q#include<linux/ioctl.h># D \- ~$ q7 J( f
#include<linux/cdev.h>; y4 Q: A, p6 E1 S- m& D3 ~ r3 p
#include<linux/kdev_t.h>
3 D/ y1 r$ |- M& h4 h3 R#include<linux/gpio.h>- N% h0 K9 N& Q5 G+ i
#include <mach/hardware.h>' d8 Z d( S4 V1 x4 g; m
#include <mach/irqs.h>
k( s% l6 g1 D4 h( G9 ?9 m$ f. |+ X8 m( a( p) i- u/ a
#include <asm/mach-types.h>
3 o! C- N. U, x* Z#include <asm/mach/arch.h>
9 x/ e. ^ k j% B( g#include <mach/da8xx.h>/ x% k" N: z3 b" v
#define SYSCFG_BASE 0x01c140006 m; C* x( s9 e" l2 J
#define PINMUX1_OFFSET 0x124 / r- n# ]% X+ e8 v
#define PINMUX18_OFFSET 0x168
% j$ i& W- @# A7 T" `#define PINMUX19_OFFSET 0x16c% p4 L$ [, e# i5 m/ d' ^, y8 }' ~
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR+ r, h- l- L# u$ g f$ [
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% n7 H$ y% c' m# F4 i; @7 ~; Y#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
* x; m3 ?" i3 ^, W( c1 i H7 b#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% ?4 D* M4 o: ^#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 n% ]" |1 V. o+ V: {4 I $ J0 c, \2 t5 `2 h
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR7 I0 q' s. A9 f( G8 ^& X
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
5 z+ Z3 [& J9 U//PSC
" w8 @0 z( o$ }#define PTCMD_ADDR 0x01E27120 ; n9 X6 I( U2 K# l+ n8 v' F
#define MDCTL15_ADDR 0x01E27A3C2 j9 k% A) z4 q; F/ F9 |- C
#define PDCTL1_ADDR 0x01E27304
2 q8 s+ x& {$ T. s3 f g//GPIO8 direction
0 w; `5 |( v" m" t#define GPIO8_DIRECT 0x01E260B0' [0 j9 l, K8 M7 k- r2 C& {3 k5 _2 @
#define GPIO8_OUT 0x01E260B4) {( {. p& R& y( w! t# j! {
#define GPIO8_IN 0x01E260C0( O& I% _8 W [/ U
" [% @! o0 V2 G1 N; e8 m//#define MCBSP1_RINT 99
8 T4 s# j1 y5 l. h/ } b4 K//#define MCBSP1_XINT 100
( r! ]: P0 T' k9 y: P" |2 H9 Estatic int MCBSP_MAJOR=239;" x" e; c7 A2 A4 U- n
static int MCBSP_MINOR=0;4 V0 U/ o- x' E
static int count =1;8 z: i* W% L! n1 G7 T! O; a
7 U& y( Q, _0 ~6 g* e* w# O& H
#define MCBSP_NAME "MCBSP-device"4 h) e0 e: L V4 V, ^/ f! P/ m) |
& R2 E7 G% t# R; b9 ~' e0 q
static struct cdev *mcbsp_cdev;; m" O7 z0 j9 g7 d+ A
static struct class *mcbsp_class;% w( Y# [& n& u
static dev_t mcbsp_dev;1 Z3 u' a; M. j; w
unsigned int DRR_data;! ?% f, q7 E; g
unsigned int DXR_data;: t4 S, g7 W: f- |7 f
static int mcbsp_open(struct inode *inode,struct file *file)8 A7 g' D2 n: f( k$ V; \
{
' |6 s9 o! {: ?! M8 m" f9 o8 l4 K
+ `) L+ p- M" S //interrupt enable,initialized4 y8 H+ t' L& c$ i8 w+ d p
unsigned int temp;' e. _5 z3 D( F a4 K' M
//SLEEP_EN(GPIO8[10])---0- s! s) x6 V( m. l8 s9 J
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 V6 d6 v( j* {* W* d/ @. D, G temp=temp&(~0x00000400);' W6 d0 l, d3 |" u
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 w# H! y$ a. _- Q5 \
//RESETn(GPIO8[8])----0----1
7 s6 U; L: S; v% Y" c. r! u temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ W7 I; p$ a. f7 @5 W- k
temp=temp&(~0x00000100);
& F& Y: {! o! r( D __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. I0 r2 T# u2 {) F9 B$ ? udelay(100);5 u; t/ \/ |8 d6 e7 g$ q6 p8 _: T7 }
temp=temp| 0x00000100;
( E' P2 H# \0 ~4 ]3 n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ X4 U# @# t2 C udelay(100);2 c7 h* g y" A2 f6 C, O
printk("open success!\n");
4 \, d' B+ f0 o8 ?3 k% H8 w return 0;
$ `! g3 F# v. E2 k! t2 j}
. U; h% H+ l X+ G) a8 f% Z3 [+ i5 `3 D5 J1 l/ S/ t$ d/ V9 h
static int mcbsp_release(struct inode *inode,struct file *file)
! W1 g8 T0 B4 _/ A4 e8 g3 p+ c{2 o8 h8 q; X! A/ C
printk("release success!\n");" a9 \1 q4 u- q8 h8 P
return 0;. U; ]* D; M1 `/ n5 ~
}
/ N& T3 d/ @. i% c1 m" G0 o1 c9 `2 t9 g* Y" L2 A# r3 U0 j U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
$ m& a* g; t7 u{
, `, b8 E3 L1 {1 M' w8 e copy_from_user(&DXR_data,buf,len);
( e. O" L* M- M iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
' V% a6 a/ L- _: ]5 t' l: M2 b+ \ return 0;
0 I$ A, Q* B X; I% {# I
5 C* k4 Q1 F3 A6 B}
' j5 U- Z0 e* ]1 {5 D; j! }/ E& A4 D% O2 A
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)0 ~. j" M6 t% [
{ 6 S' [- V; B# }5 c* Q& A
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: N0 w# `: j: q; N! ? copy_to_user(buf,&DRR_data,len); T1 l) A0 W8 k+ s* p
return 0;
( N' x4 L6 u! _* T/ g3 V2 p}' w% D) B+ k+ c& V3 J" k: O
0 G9 g- i3 D. h3 G# U9 H# s0 @# Z
. B/ O4 z t$ U6 H0 P) F
static struct file_operations mcbsp_fops=0 W, z2 m5 I5 ^' |
{
% y0 `" Y }) v% r2 M .owner=THIS_MODULE,4 \) y8 L" r. a( ]
.open=mcbsp_open,
. U, `- {& A- }+ W; D* I+ a2 G, W .release=mcbsp_release,' o2 R3 b6 @+ o, b/ v! G
.write=mcbsp_write,1 \1 D/ U: S6 b/ s9 F* G
.read=mcbsp_read,
5 Z; ]# o' u/ c& x};
2 t0 ]& w8 N, o* z5 D! w5 `# B) fstatic int __init MCBSP_init(void)! T2 \0 I$ X& m# Y; `
{+ F: m2 e+ v2 v g
int ret;3 n; t: `% A. G- c) A( ]1 q. Q: s
unsigned int PINMUX1_REG_old;
" e8 G# A. p6 d$ V* R" d unsigned int PINMUX18_REG_old;! B- @% I3 f+ B4 | i
unsigned int PINMUX19_REG_old;8 O" [$ H" M! t+ M, s5 u% Q
unsigned int temp; * p& I! Y) l5 N- b2 @7 P; e7 P
if(MCBSP_MAJOR)
& W# t' Y7 M- m e" V. H {
1 R9 G" }+ |/ A; L mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);4 {; e+ ^5 {, \7 p
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: j) x* {7 L9 ~( ` }
; H! P, \, o: j0 r/ @( h) A else
. I" l# b6 R6 M7 ]9 m4 l1 p- X/ g: s! | {9 M$ x! E+ x6 _. ~/ ?: Z9 h( e
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ B5 M' j+ f; A MCBSP_MAJOR=MAJOR(mcbsp_dev);
( d( z5 G0 f* ]8 [+ A8 G }; j4 x) E( s# }, G4 O$ B8 Q
% x- c# b8 y- E% R* d if(ret<0)6 d$ \( K* J1 M6 F# m- E/ J( h
{
1 ^4 C; {4 ~7 ]3 R. s) B6 g: {, l printk(KERN_ERR "register chrdev fail!");: Y! A4 E3 T' w" K7 l
return -1;
+ n( O4 d! \: \6 ` }
9 }3 l. L* u; I0 T# g! m
2 @6 F) ^* A7 w- `! d/ F/ m mcbsp_cdev=cdev_alloc();
/ l5 b6 H2 k9 _ 0 s: r! f# {# k) n3 W1 J
if(mcbsp_cdev!=NULL)( a+ p/ H/ a) `, B
{
7 h( m1 d. c6 I' ]. i* h+ e6 p cdev_init(mcbsp_cdev,&mcbsp_fops);6 ]0 B* d/ z+ }7 n& {
mcbsp_cdev->ops=&mcbsp_fops;3 e9 _( |' p3 G$ c1 z( M
mcbsp_cdev->owner=THIS_MODULE;
4 V, `" S/ y$ p$ |' r9 \
0 i) S/ G: w4 t4 K+ C: q% e: W if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& v6 _+ q* f! Z# c9 C5 G
printk(KERN_ERR "register cdev fail!");5 @: ^4 z% k7 r2 I0 D
else
0 `5 B# \1 K8 f2 M0 x# I: |' Q printk(KERN_ERR "register success!\n");
, X4 E3 x; ~9 O3 O }! V' m4 W3 ?0 \$ f* W
else! C( Z1 S4 F8 g- C, Y* I
{6 k6 X& c7 q; c: P& R6 R, S6 r
printk(KERN_ERR "register cdev err!");& j; w% Y# @) j
return -1;6 V' P2 X8 d( n* y
}
0 {" ]: d* t+ Q( ?1 I3 c * O: Q/ n( a. A0 u- k
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 l" G+ w- q- I0 @5 \5 L; G# f
if(IS_ERR(mcbsp_class))$ y+ T3 O! Z7 y% {
{
o3 g/ C6 F3 F/ C printk(KERN_ERR "register class err!");: @4 U& A: a" O2 J1 B
return -1;
~4 q) t& H' V5 U5 Z2 t, b- A5 y }6 r, f. {' z5 N( k
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 I `; a2 h) N2 l8 L# m
0 l F- S* {1 O/ p9 ~
//PSC
4 j# f- z7 Y+ {7 {$ G //add Enable MCBSP
$ d: J: o1 u0 L$ n" j# f+ x //test. ]# g9 S; B$ h
temp = 0x80000003;! i3 x+ X9 l2 s: ~) s7 n
writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 M K8 V! ~% o& a3 }8 m; a
temp = 0x00000003;4 }3 k; p4 `& T; v3 F
writel(temp, IO_ADDRESS(PTCMD_ADDR));& O7 S1 ^, Q A+ w# G9 m
6 P$ f! j5 W* { temp = 0x001FF201;. P) `1 Z$ \" `% {: Y. ^
writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 s- k# q8 N Z! p
1 C# E. `( g% X9 `1 e$ p; X5 M, ^
//PINMUX & \9 S! r: L. U* N2 E
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! I5 t. _2 I7 a& |, T* n
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% e* A( k) N% s5 R PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
- S) w- @" E2 w) [: N# W @& @8 P writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);7 I. A( B p: z3 _0 I+ r4 U! V# y
' G) Y& \$ Y8 A( ~6 X1 T' L //SLEEP_EN,EPR,L138_SHK1,L138_RC
- v5 | i7 N* X' l" {6 Z6 t! b PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , v0 ~$ y) v+ g( S. _
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
1 l. g: H3 ~" z; K9 M3 c! I& D writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ v$ M! q" u; n$ ^, G1 ?
2 w; v/ v( Q" B) ]- @; d0 [' e //RESETn,L138_SHK2
: m2 F6 w# |+ X& B# T* J* P PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 3 g( u0 @9 L% s+ M& _& U2 l0 Q# D* f
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ! P6 {8 d- `/ Z' p8 \3 B
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 |9 {2 |# e1 s- ~8 d
! x. }4 G6 |/ q3 t8 ^8 e/ W + Q- e' \- w* h* @+ ]8 r) c7 f
//SPCR Register: e& {( Q" r( C9 s: Z/ E" I0 b
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ U5 q- Q4 I E7 B! u temp = 0x03000000;//(DLB=0)
! G5 A2 @. o8 J3 V9 M+ { // temp = 0x03008000;//(DLB=1)
, H# ]1 G1 k- w; p' h | writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
( `6 M/ W( n& D; P7 s% a+ | temp = readl(IO_ADDRESS(SPCR_ADDR));* a; P" j, Z, e H1 v/ ^# R' t; Z
printk("temp=%x\n",temp);
+ O; `$ Z1 o" `) o! B( Y 2 q5 v- Z5 Q* {2 x2 M
//PCR Register
% Z& O* X7 U4 I; C7 C. f) l //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- [+ }, c* W: J' i# i1 r5 r0 A // temp = 0x00000F0F;6 P$ r1 A( [" N) S/ R. Z, h
temp = 0x00000B0F;
3 r+ D, N) b& A. j: s8 F: [ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ( }& [4 V# e+ N; D/ z7 T
temp = readl(IO_ADDRESS(PCR_ADDR));" V6 r3 Y; B7 u, k) n1 t
printk("temp=%x\n",temp); 4 t/ l! q F: H o" L. t% w* ], Q
//SRGR Register; n7 B. X6 E4 z' a
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( F# n4 A+ x6 d: B //temp = 0x301F000B;) ]; y) }; k# w% T
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
4 ]/ C8 D6 t% W6 @8 z# g& t1 L temp = readl(IO_ADDRESS(SRGR_ADDR));/ a U) s1 y3 ?' X+ M
printk("temp=%x\n",temp);
% {1 B& @! v; w //RCR
# C# _# T! I& {3 I2 L) v! j //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 }6 p0 N9 e; j" i5 J* {. Y. T8 G
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 G( j$ t) J% L# Z9 W+ e
temp = 0x00440040;/ _# p1 ^: Y% o; }! _
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized + F" N8 j6 b. s
temp = readl(IO_ADDRESS(RCR_ADDR));
1 @. K+ s5 C6 Q& a3 G/ e" l3 \ printk("temp=%x\n",temp);
: p* Q! D4 O# U5 z //XCR
: x0 O% j0 y" S6 |5 n //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, B5 R$ |; Z$ y3 [ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* q- X! T7 q& a" ~% { temp = 0x00440040;) w5 [3 n6 g+ ^. q' c1 Y
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
! W4 m& \$ F4 |0 S1 h4 g6 \ temp = readl(IO_ADDRESS(XCR_ADDR));( o1 {6 L/ z# ?: b
printk("temp=%x\n",temp);
- S- K- ~/ ^ N- c3 [1 R2 ~ udelay(100);: r/ h d, K/ C9 l& ]- O
//SPCR Register6 Z( j0 E3 Y! ?( H
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 m# b) {* R- F6 { \: A temp = 0x03C10001; //DLB = 0 VS DLB = 1! j% L& L3 @( s0 g6 f3 H6 I8 f
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 Z5 t* D+ o" ^) T
temp = readl(IO_ADDRESS(SPCR_ADDR));
* M- F2 h \) F$ R1 {2 f printk("temp=%x\n",temp);1 |) J( I: n3 A' v" `7 c& N
udelay(100);
* Z- }% k& Z1 o% X6 K# X( z/ x+ s" o7 l s
//set GPIO direction8 {7 r0 Q7 z& M1 Z7 P
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 \9 P4 s& c1 j1 u% K' U8 I) w
temp = temp | 0x00000100;//EPR----input2 }# C* }! `; o) _
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 L8 P, w7 S2 w3 w5 j' P/ M
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& d1 I' `( o1 I$ C9 }
* R# q! ?9 L; y8 n return 0;- Z% O4 n5 x+ ?0 q- w# M
}9 E! r- L4 R- a$ p; K4 y/ [
static void __exit MCBSP_exit(void)
) I! x0 Q6 `2 D3 v; y{7 A, O3 i1 K8 q+ T5 W
printk("mcbsp chrdev exit!\n");$ `# a4 I9 s8 Y; H0 ^7 f& m, U5 d
cdev_del(mcbsp_cdev);( A; ?- d( i0 X: }
unregister_chrdev_region(mcbsp_dev,count);- |# a" x. Q( a0 @8 `
device_destroy(mcbsp_class,mcbsp_dev);8 ^- m/ L. R5 C
class_destroy(mcbsp_class);
( Z/ E2 `2 M4 m}
: _4 Z/ R1 p1 P4 K( O& i7 L6 Jmodule_init(MCBSP_init);. o: b% W* T0 b) [$ I
module_exit(MCBSP_exit);2 f8 M( ]( J j
7 T7 Q# ^8 M" \: ]; |4 PMODULE_LICENSE("GPL");
' m: c x/ X: b3 Q( j3 d2 s, _# P
# b6 U- h# [, Y a! |我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。( [1 y! O& d K- p( ]# A
我的应用层的测试程序如下
9 @. _; X* A& F, B#include <stdio.h>
p6 T) y% l6 d) M#include <string.h>
) G v6 i9 B/ N# D. S4 d. T+ a" r#include <fcntl.h>0 t" K' y% R$ F) i
#include <unistd.h># l4 j" v6 ~$ K" i
#include <signal.h>! M0 F8 [% J) C X, h# `. f
#include <pthread.h> //线程. b6 t7 X; X8 _" u
#include <stdlib.h>
% z" f% _& D+ [7 J#include <pcap.h> //捕获网口数据
" H) s& h4 C2 [- c" E! e#include <semaphore.h> //信号
9 F8 H; ~6 V9 Y: M#include <sys/types.h> //消息对列
& U+ F/ |' F4 d# S* b& S#include <sys/ipc.h> //消息队列2 q, c, K7 E0 w& a, ^8 G$ p9 ?
#include <sys/msg.h> //消息队列
& W) o' \7 a7 v/ d#include <sys/select.h>
- a4 d) t9 S3 N9 d2 m4 F- D#include <sys/syscall.h>
- e4 M% i6 c3 \: I#include <sys/stat.h>
! v7 {" W9 o# I9 u#include <sys/mman.h>' c+ R2 g0 b2 N1 J, {! E
#define msleep(x) usleep(1000*x)- M) z' t5 O3 l4 A f0 g* p
- z: o+ A, j7 Q2 ^
int main()6 q! f1 ^% ^' Z# C& a# T+ x0 i
{
3 Q5 P, a9 l/ K8 e$ B //MCBSP,ARM与AMBE2000交互设备
! W( z& k& A0 e0 t- [" L. f0 z int fd;
' { O5 d" L5 p ]9 ^# \4 W5 T& s unsigned short data_write = 0x5555;
6 E0 K( o% P# J3 k unsigned short data_read = 0x00;
. N5 L) M6 X; b, Z" U% \1 P9 ~7 t fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 S+ C5 R# a% y, p7 t
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) G* }! L, {2 k$ M
; l' P7 O8 Q D) x. S s6 \ if(fd < 0)
( ~- o/ h+ ?+ ]$ \( x {
2 D- J7 s9 |& K: v4 n( ~ perror("open failed\n");
! V9 V$ K. m6 N, d return -1;, T" z7 r! b( G
}% d/ l: h4 f* Q8 F F1 i. q6 f
. R& Z" P9 C" k2 _
while(1)
! ^# z/ o$ y7 v1 V! D {+ n Y, M. ?& ~# n2 ^4 v6 A6 e
4 Q& [8 r6 h; b: w: } H //AMBE2000每次读写是24个字为一帧
0 w/ s' n3 Q) R6 ~ //写数据时将数据在底层存储起来,等到中断的时候再发送7 `5 ~) q/ V# P" }' N
//AMBE2000输入数据是以0x13EC开头的- R: r9 B. O" O2 H1 l& s/ O
write(fd,&data_write,sizeof(unsigned short));
. u' o7 z$ i: |4 p( s9 k
5 n/ U! F- C/ q! x% F; f //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 G: M- O, d0 v1 n: s1 d8 M! B
read(fd,&data_read,sizeof(unsigned short)); o4 U( J. ` u0 u2 k
1 O' R; G6 G8 r S7 e0 R! ]' S
if(data_read == 0x13Ec)6 G' B1 w! h, S! W% U7 t
{' m* ?1 ]9 z) ]8 o
- D$ Y0 K& Q+ v, |7 n printf("data_read = %x\n",data_read);) S- p5 Z* [; q4 H! f4 G7 V" \
}
! n& a) }" k* t! ^! m5 e* f0 u - [5 s- h( \7 p4 l5 b- H, A0 D
msleep(10);
# f9 n- c) ?& V2 t- ~ $ c# p2 m3 V- a; b) f. f
/*
7 z9 B2 ?2 `1 Z- h: j; j p- W ioctl(fd,1);
( d! T r+ Q; M! v; m0 F sleep(1);; r% N8 i& @! M" o$ c
ioctl(fd,0);
8 \; L5 [1 l6 l2 e sleep(1);6 }8 z& s$ m( }; M7 ?) Y. G
*/ , Z0 ~: y% i# B
} 5 G' _3 i2 `$ Y5 Y+ R
return 0;
/ l% |" v2 }' ?" L( w. K+ V
" V- D/ Y: I# n9 g9 x}, y: Z/ ^1 L j, z
' T* R# E/ ?& t: g3 n多谢各位指教,谢谢! 急
- J# X4 s" d( F" ~6 P
6 M! a& X/ ]& G; o
; v! y4 s) c( o ?
2 _& s; T, Y) b5 m* p
* L2 t- v& x2 `4 u, q0 ~1 J3 E$ A+ ~5 f: N* h( G% ~' P+ m* a' u: {
|
|