|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ q3 f% J# {) u/*
! _, v* K/ g- `/ o * Copyright (C) 2009 Texas Instruments Inc: S9 H7 z" f/ k
*
0 h3 U. q9 M6 C! Y$ X | * This program is free software; you can redistribute it and/or modify# k8 [% u& ]) _( P6 f% ^
* it under the terms of the GNU General Public License as published by0 Z. b" b; N9 i
* the Free Software Foundation; either version 2 of the License, or5 G8 s$ \0 r# y5 i, V1 n+ m
* (at your option)any later version.. N7 J: k$ G! _9 ?9 t, U
*: t" h" f$ k5 O
* This program is distributed in the hope that it will be useful,
V" }' ^* D( l8 e+ J * but WITHOUT ANY WARRANTY; without even the implied warranty of# h" ]! j6 H% f* [
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: F8 Y& R/ w; Z/ F
* GNU General Public License for more details.
: {. A. w; S1 r0 v8 C *
7 m+ V: r3 D% t' M# p- {) o7 r6 b * You should have received a copy of the GNU General Public License# P4 U! n, c7 n1 i4 j8 l1 F- a
* along with this program; if not, write to the Free Software
3 T" Z) X7 p- J# i( ?5 q4 z * Foundati
1 ^( Z! N' ^2 m2 h" |*/2 D, _ R% \8 Y
#include <linux/module.h>, `1 P' w) c0 w) W
#include <linux/init.h>" [6 G& l6 T5 l! C
#include <linux/errno.h>* C$ U5 I; m9 ^4 y2 Q. N
#include <linux/types.h>
# y) ^+ a9 C+ ?5 m) n+ ?#include <linux/interrupt.h>
* n! r E! l# A) |+ N. s#include <linux/io.h>+ ~, T% I; n) j g, \& a
#include <linux/sysctl.h>5 P7 `# X9 [0 u3 N& W) i* i4 _
#include <linux/mm.h>
7 }1 Q2 ^( @5 \- s: l7 G#include <linux/delay.h>
9 {6 v; m8 v& Z+ T) I2 Z#include<linux/kernel.h>
5 c2 g1 y/ N ?; q/ p#include<linux/fs.h>
3 l5 _1 {5 W: o* ~/ F4 I3 m/ e: j#include<linux/ioctl.h>8 d! h3 z6 v, ?0 @6 ?& n( u
#include<linux/cdev.h>
' N( S7 u+ @+ ~1 ]/ l9 ~: J#include<linux/kdev_t.h>! N& V( }) \. c) ^
#include<linux/gpio.h>4 Z+ I0 b+ f% x( o, g" g9 L
#include <mach/hardware.h>, f0 S' {) \" t! f, w' A2 h2 H1 G
#include <mach/irqs.h>+ y; r x- G( z) [3 k% t8 y# ?2 h
+ [. U$ r: I1 d' U8 ~2 u B#include <asm/mach-types.h>2 R9 L! y) a1 M) y# G" t2 S! A
#include <asm/mach/arch.h>( [# [' X9 ?' K( h; r0 ` {
#include <mach/da8xx.h>
- D2 j$ f2 j' s#define SYSCFG_BASE 0x01c14000
( E; A& a$ D1 J, F+ k5 Z: Y" f#define PINMUX1_OFFSET 0x124
0 [/ t& J. g" d#define PINMUX18_OFFSET 0x168
! d2 c+ m1 r+ I% q% g#define PINMUX19_OFFSET 0x16c2 t. W. I, n" f5 @# v/ ^
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR/ R4 m0 h" u' i, i
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
' r8 f5 J' B9 D#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: g9 n3 h# [ R& v$ [6 u
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
+ m; d7 Q, s1 @% U+ h3 H* M#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 y& v0 z1 M& k
% p7 i! w0 o* z( w6 e2 z6 F
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR i* }7 v+ F3 Y% C9 N& W3 p
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
% \/ W2 f, v! t. v9 A//PSC
* H0 o: s2 `8 k9 M, ~7 E#define PTCMD_ADDR 0x01E27120 9 d7 N$ M, }# i1 L. @
#define MDCTL15_ADDR 0x01E27A3C
6 I) z3 j# ]& I) q. x# F8 Z. t#define PDCTL1_ADDR 0x01E27304
" F ^* ?5 m4 R2 [- Y//GPIO8 direction! W6 i0 `# z# M& r
#define GPIO8_DIRECT 0x01E260B08 J9 a N6 t, }$ s8 O, o
#define GPIO8_OUT 0x01E260B4
/ z; u. x( z* F4 k+ q- f- p#define GPIO8_IN 0x01E260C0# o0 V1 L+ O1 \: f
9 e. v! Z2 M3 s* A' C0 l' I
//#define MCBSP1_RINT 99 ) v+ w. y( b$ t: X1 E- p' e
//#define MCBSP1_XINT 100
# l7 @5 i+ k( j' | astatic int MCBSP_MAJOR=239;
! a0 T" k; n: ~. ~static int MCBSP_MINOR=0;
8 N3 z; l0 N {: sstatic int count =1;, }8 b& L3 _1 K- R; x& }$ t
- D) p5 y7 @5 [% i
#define MCBSP_NAME "MCBSP-device"
9 Z; I6 m/ F Q$ ~& @1 B8 h) Q5 r
static struct cdev *mcbsp_cdev;4 D& v z3 f" G3 w7 w
static struct class *mcbsp_class;4 c6 E# i, n" y1 R' F! e
static dev_t mcbsp_dev;
! X( V+ F* M a% T- Dunsigned int DRR_data;/ a* I( r6 M; l7 i% N$ v( `7 Y
unsigned int DXR_data;5 R" t6 G% T. _% \. e
static int mcbsp_open(struct inode *inode,struct file *file)
* ?; n4 W. J1 b* l5 [+ m{ M& W/ M% x3 U K7 x
+ p! j Y2 ^5 _" w1 N3 V" o: }
//interrupt enable,initialized
- v5 e1 J1 z1 A" K2 U' h unsigned int temp;
" P7 y0 {: o9 z' F/ B //SLEEP_EN(GPIO8[10])---0, C& ?0 r: r5 A9 g: G1 F
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; U+ z" q0 S, X5 F2 z7 U' l temp=temp&(~0x00000400);
8 {7 _3 r; `; S# [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], z! ~0 ]& V: }8 t8 A6 k
//RESETn(GPIO8[8])----0----1+ W# Z/ f% `- z
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 a: R& T0 B3 _2 M# @0 b6 ~
temp=temp&(~0x00000100);- v5 X: O& S' D2 i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 W4 U: c2 m' a) S udelay(100);" t: x) ]8 i8 v, A6 R$ h
temp=temp| 0x00000100;$ @, ?( a$ Q" C! c2 B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 k9 c' \ j" R5 W( I: B+ ]
udelay(100);
6 u+ [2 r y7 ~. v printk("open success!\n");
+ \- n6 T8 x, p3 t return 0;" M A( J2 n* G1 ?. g
}
2 t; S% D0 h0 i5 l, ?$ G7 ^
, r2 K. B, {! S; T; g# G0 ]4 p) U: Zstatic int mcbsp_release(struct inode *inode,struct file *file)
, {- G7 ?* F4 t2 k+ m' L{4 \% }1 Q }/ P, A, D
printk("release success!\n");/ f4 T/ b. H. y- D) P
return 0;
* C; u) D2 G8 a" _$ o9 W( X8 K}
4 {& f/ s0 p& K( z& [# R j6 k/ G$ ^0 _. R! ^8 D2 Q1 U0 n$ a
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); d% `8 N- b& w1 f7 F$ W! o
{
$ o/ X" q) V' U copy_from_user(&DXR_data,buf,len);
% J5 n# f3 r6 _ iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # l9 R7 N8 S6 u: }8 u
return 0;
# M" R8 `+ I; t' T E: [ " u: j& {' o1 D0 [2 v* i& k
}
7 o& y/ m6 u" Y1 j2 O( Y7 ]" U9 b* t2 ]2 k7 W9 t" d
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ x+ u" C; _7 u" ^" \ D3 i
{
& p5 h3 x2 h3 b) {+ W9 }: } DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- q9 E; }5 u( v( u! w# A
copy_to_user(buf,&DRR_data,len); N! C0 @. d- G5 y& h
return 0;! n k5 g" h2 m8 E
}& k( M. I, S8 ?& i3 ?
6 U# C. e1 _9 A3 Q
! P& ~. b. h: z; h: C/ Q! @, n* U$ v& wstatic struct file_operations mcbsp_fops=1 p+ S8 e; `, l0 O0 Q0 B2 W
{; o: P q1 M/ h& i# e; _; o! g" p
.owner=THIS_MODULE,
' q- q, N1 L) C9 b; q9 b& q .open=mcbsp_open,: \3 N; A2 ]6 R" u) F* B" B2 Y
.release=mcbsp_release, `* I" s/ w6 z7 K1 n1 \& _& B- q0 t
.write=mcbsp_write,4 P& m* H- A& j: v6 X& z* G z
.read=mcbsp_read,
# r; u4 _5 s. P! D4 s3 e, o};
R, ~8 @9 @; L+ [0 L. Ustatic int __init MCBSP_init(void)
& f$ S1 G; b! A# d# n' N5 M' [% g{: a9 T: Z6 i) p) O4 B+ r6 ?7 G
int ret;
! [( v' f8 p+ O- J+ k, V5 j( J' p, P5 _ unsigned int PINMUX1_REG_old;
i' p5 a6 d! Z* V2 g unsigned int PINMUX18_REG_old;& O6 h, k6 N& |# n6 h& ~9 E0 r1 g
unsigned int PINMUX19_REG_old;& I2 F1 X$ [* F( r' Z5 ?
unsigned int temp;
. ]: o# S' z l3 M: w4 |3 o if(MCBSP_MAJOR)6 f4 b' E: s. E+ Q
{1 x1 V' C9 Y9 k* K/ B( g7 u
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ t, B- c, u$ i: A+ t! Y
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& X7 b! s1 ]" `9 u# x3 q q }2 L" V# @6 t2 `6 T
else9 ~3 w: A' \2 f& M# z
{
$ h6 k6 x! C2 g" t4 L ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
F: P; S' k8 v/ Y; d9 F MCBSP_MAJOR=MAJOR(mcbsp_dev);6 y6 q# w" D& v
}# b- ]1 g* Z5 ?/ i
: W/ p1 L T8 T if(ret<0)
! g* M/ q8 c7 s( g, p- g6 o" E+ k {
' J; Y5 S W/ } printk(KERN_ERR "register chrdev fail!");
6 v+ L2 {- @* F% T( x& H3 y return -1;2 x0 ~5 \9 Y3 q. ^- T+ Z
}" i6 d. `3 S2 j; B; e* T4 {
3 H; z" F. }7 P: n
mcbsp_cdev=cdev_alloc();: E# m/ ]9 h' ^: Z) z
0 ]% i C A5 d( I" G7 L0 b
if(mcbsp_cdev!=NULL)
. L" |5 d4 Y/ O8 e8 ]: g/ [ {
! o* M, Y3 F( _8 S; i, p* s cdev_init(mcbsp_cdev,&mcbsp_fops);
- L+ V' \$ T$ I& b+ k& \- U mcbsp_cdev->ops=&mcbsp_fops;: J2 c1 a) Q+ Q
mcbsp_cdev->owner=THIS_MODULE;( ?& U7 k" X9 M) \
& N8 A, K8 L) g) B& P7 Y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))1 U7 F9 L- y- w0 }9 v( u
printk(KERN_ERR "register cdev fail!");
8 Q' ], n x$ M% X5 B; E else
$ f# d4 H8 f; I g/ p printk(KERN_ERR "register success!\n");
; B' i3 t. P8 R2 e# g0 _+ L }
( y0 X! f8 q! a6 j( k# O8 P4 K else
& ?. P/ ], m4 h }% X) Y4 R0 ] {
# s( p4 \& `; r) W n0 c printk(KERN_ERR "register cdev err!");
& r; t; z" g8 w. l, g- m" s+ g* C return -1;
6 d6 _- f+ s( X5 G }
( `; B; F- m3 j; G# z6 C 5 J: |" L! b3 k$ Y; [1 u
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# ~9 \% X1 B* G& a if(IS_ERR(mcbsp_class))
: j3 c7 Y" @9 Z6 R4 z {2 Q. x" K" {! u7 F: I
printk(KERN_ERR "register class err!");( A% F4 L0 F9 {+ K# P6 ~" g
return -1;
4 o& M% G2 o y }$ E1 [& [! o8 `3 V' a
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ [& a/ f; Z) e0 ~2 m0 j. R4 j) t/ x+ b- N
//PSC2 y$ o+ q7 ~* \. V% ]
//add Enable MCBSP
( b7 G, M4 _& a2 I) W5 U6 e) S //test
. H+ i# t# b; c8 W temp = 0x80000003;7 v2 G% ]% N) ~' R$ Q! r% `
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& O% \* p. o5 u! H temp = 0x00000003;
' h* X# }) m% p" @- I/ Y& p writel(temp, IO_ADDRESS(PTCMD_ADDR));6 ?; Z" |9 O, M
6 H0 [" c5 h4 g9 f4 F+ B
temp = 0x001FF201;
# T. Y) a: r1 s2 j$ `* P writel(temp, IO_ADDRESS(PDCTL1_ADDR));) J- k! f) j$ O; T3 I: z0 }
0 F( y# K0 x v6 M8 w$ [& b0 S5 o3 a$ y //PINMUX
* F2 f! Y! R( H$ }& A2 j- K) b2 m //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% C0 L: y8 U. L+ Z% F PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 1 _* \+ b7 k1 a$ F# C+ i4 Q0 D
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; % i/ O, ~* |# C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);9 P5 ^1 U, d( | k
7 n/ g" S6 b& E/ I
//SLEEP_EN,EPR,L138_SHK1,L138_RC6 L7 I: n$ {4 O" B6 u1 d4 G' P
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; e: ?% H% T2 ]5 H. B- ` PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
& q/ a9 o; ^$ M5 h writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ M4 x, w7 {. T8 ~1 ^3 j3 W1 ]
$ |2 u+ |: g5 G6 ^- |/ A //RESETn,L138_SHK23 K0 I3 k$ J' o2 d% a5 e) R
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 H6 u6 m2 {' b- m' C9 L) D
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 n- l2 I7 n0 U3 t1 H, n writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" r9 h8 m+ h, k: v1 X% Y/ M
/ V; X8 u G" _/ i# h3 p; V
& }+ l! L2 G) d) O //SPCR Register* q, W, H6 e# g; ~* }- @( e+ _
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 ]$ U' ]; H3 \$ m. s temp = 0x03000000;//(DLB=0)
% K4 l8 M, N6 i5 A6 O0 ] // temp = 0x03008000;//(DLB=1)! I& a, i4 I: p2 R2 r7 l( ], \$ n4 G+ ~
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
3 f; p$ J2 V( q1 s' [/ K$ h temp = readl(IO_ADDRESS(SPCR_ADDR));
0 t- K" e; I3 M9 c4 C% Z printk("temp=%x\n",temp);
; d$ ^' w# J; n; z& |- m - I0 _, t- `* {5 U
//PCR Register0 ?1 G* g# Q g: l0 q
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% F' |9 B) H" S8 T // temp = 0x00000F0F;$ L' H! Y I# X5 P. M1 _
temp = 0x00000B0F;
# T6 |# D6 c: } writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 5 |% ^2 O' o p4 g# f6 e
temp = readl(IO_ADDRESS(PCR_ADDR));; Y# K$ Z6 e( ^
printk("temp=%x\n",temp); % e% J5 R0 {9 U% O" N( M
//SRGR Register
1 L: H! U5 w& C, Z0 ^ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' S M/ q# l) r/ p
//temp = 0x301F000B;
3 g T: V7 A+ N writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 9 }; ]' {5 f m7 a
temp = readl(IO_ADDRESS(SRGR_ADDR));+ X* z) n% F) n) a: G+ b
printk("temp=%x\n",temp);8 O5 |* a8 V3 H& ~! i
//RCR
$ f) e3 |7 {1 y //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 o+ h: \: N$ c0 r
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 l5 m& u6 j3 Z
temp = 0x00440040;; q+ n2 T# t0 ? G4 Y7 @. _" y, j
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
' {: L d5 ~0 Y; |4 V3 C3 M temp = readl(IO_ADDRESS(RCR_ADDR));
" X/ U1 [+ c/ H- l8 R9 I printk("temp=%x\n",temp);
6 p2 J5 m* r. t //XCR, ?: e+ n" c. ?
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ Q7 ^5 T# D* `1 a% f R/ c
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-04 X% {: y3 {% m
temp = 0x00440040;5 b2 \! ?( J9 _% F/ [3 w
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized + F, U, d! g, f
temp = readl(IO_ADDRESS(XCR_ADDR));
* z" K: S$ K/ N+ c3 j printk("temp=%x\n",temp);+ O0 K9 f* d0 v/ v$ H( V2 M
udelay(100);
2 k5 f. a* I2 Q5 l2 [9 C$ t //SPCR Register0 \# B5 o% }, W3 D+ D' O3 `
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' s) e5 W/ k( U" J6 @6 l6 t temp = 0x03C10001; //DLB = 0 VS DLB = 1
, q/ R) |5 r/ U1 h0 z5 | writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
$ x( X) Q4 z% @* r% O temp = readl(IO_ADDRESS(SPCR_ADDR));
+ U& x+ Q/ d A, c6 I' I printk("temp=%x\n",temp);
* |6 H6 x6 t! D9 U udelay(100);
3 t' F! s# F1 c3 g% Y
% d6 T6 p% P# [& ^9 F- }& b3 Q //set GPIO direction
Y' l0 h! e) A temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
, {! L" Z) x: @! {! |' H temp = temp | 0x00000100;//EPR----input
& ]) O' Y: m6 y3 ~# w& I' L temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, i" e7 ^: i+ Z, I$ A
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
% S( R$ Z4 A# [0 O! F s* | ; w: c( H) p- J& g& O5 w) j
return 0;6 Z0 ?! a. l9 t* o& }& h
}3 `: a' J7 B! v
static void __exit MCBSP_exit(void)! } @- [9 I. w. \9 g& z9 a1 j% u \
{
5 a2 c% U1 w/ o: q, N' j printk("mcbsp chrdev exit!\n");& e; E- w: A; i4 }1 A( ~$ Z
cdev_del(mcbsp_cdev);
" A1 w2 k; o+ H3 K6 ^ unregister_chrdev_region(mcbsp_dev,count);! K" a4 D) F E
device_destroy(mcbsp_class,mcbsp_dev);# s0 w0 `! `6 p7 Q- r" m2 s
class_destroy(mcbsp_class);
( f' S% u+ N' z}
+ E2 h d& _6 [0 `module_init(MCBSP_init);! L$ i$ z5 S P {" ~: s6 w
module_exit(MCBSP_exit);
6 g6 O" `5 `: X b% \) a4 R {: @2 X6 A9 q
MODULE_LICENSE("GPL");: t ?9 p7 X0 _6 N
" K" F1 M0 j+ T" k
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 F; @( ]2 J) c3 t
我的应用层的测试程序如下
" {9 y6 h. ]$ A6 R# C; A' w#include <stdio.h>; w' t1 X; K6 Y" P
#include <string.h>+ |! e$ m/ f1 ^# z2 z
#include <fcntl.h>
: q0 `' b- j" q# z, q' `4 J#include <unistd.h>
/ d5 [0 b' Z* C% f6 u* x#include <signal.h>
5 n* |7 g, I+ ^1 u( c#include <pthread.h> //线程
# w' q, T2 ^/ E5 R( V c#include <stdlib.h># E" T! G M' H8 U: p4 J( a
#include <pcap.h> //捕获网口数据
. f s7 S% P( H. |! K#include <semaphore.h> //信号
: K- X% D3 C' }1 u2 y" F#include <sys/types.h> //消息对列
0 Z# R- i8 c# R) |% B% I#include <sys/ipc.h> //消息队列
. E: s. h3 ]+ n* Q#include <sys/msg.h> //消息队列
, v( C& h! d* z2 d( n#include <sys/select.h>$ ?+ o: N! U A3 v- F$ ^
#include <sys/syscall.h>
$ U# _1 i+ B3 m. O#include <sys/stat.h>
4 a+ z' F) V- v6 X' t+ G/ ?#include <sys/mman.h>. d5 n8 S6 h2 M
#define msleep(x) usleep(1000*x)
: h0 n/ [: o) [
) v- ]/ @- a9 q7 b9 ]1 s( yint main()
' |! o+ M# P/ \: ]* ^7 n. q; }{
! w( t* M( B5 N- H; a //MCBSP,ARM与AMBE2000交互设备
: L/ |2 C0 E/ w$ A" k2 w. H G) l int fd;
+ ?/ n8 ] `2 {6 ?7 R: ~- b* ] unsigned short data_write = 0x5555;+ M. N$ q2 }! E8 {0 R8 G, q/ ` Z: @
unsigned short data_read = 0x00;
2 `& u# N: ]3 W9 r" q8 }6 T fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ e7 s) l! D5 b @) T) C V
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& a9 Z4 m7 ~6 j% R6 p
7 w C& W$ n6 m
if(fd < 0)
3 r+ W) S' k, g9 d X- H( G+ L {9 P' q' N J6 _7 }
perror("open failed\n");
3 o J3 C7 W. Y( I( r return -1;+ z0 w; r: n# |" B
}
7 Q0 K3 r! W( \
# P5 N- V8 R3 R& t6 f/ S' y( v+ _ while(1)+ V. J( F- g8 P+ \
{* z, d+ J, z: ~, h
e2 A! o1 S( R9 t
//AMBE2000每次读写是24个字为一帧
, H3 a$ P) |1 W //写数据时将数据在底层存储起来,等到中断的时候再发送. E' K7 X/ t' C4 }
//AMBE2000输入数据是以0x13EC开头的
: ~" X3 {* v+ H write(fd,&data_write,sizeof(unsigned short));& M* ?1 V# z" Y1 _0 n% }+ k; a
: F8 z1 i0 K* M/ W/ V% @% g
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
! j/ P+ K. o$ x read(fd,&data_read,sizeof(unsigned short));) t$ F) t7 D: b3 l3 A
) C u8 x8 n6 P# O
if(data_read == 0x13Ec), D! g! x8 v5 l7 v& W9 x; C; L* Y
{
$ J5 h5 d0 L s. X+ R. {
. ?; y- i5 D2 T- W/ F& D8 h printf("data_read = %x\n",data_read);
$ f9 c2 h( o, ~) P }
2 ^8 B3 f9 h- d. x. M* \9 g 6 C# n2 b1 f: V+ l
msleep(10);
i3 U; M' c& n3 p; G- Z
' B! w) S, O! {$ j( o& d# O! e. n /*) R3 r" F2 ^2 u. U) X1 e3 w& R* X
ioctl(fd,1); ) }: {; Y& n: e% H% b7 i
sleep(1);
* \0 ^4 Y a& V5 P5 O ioctl(fd,0);
8 U. O$ R+ ]& j/ ^, w) S' \ R0 K sleep(1);$ u2 Y9 \9 e( D h" A4 n9 C, O
*/ % I3 M, U1 K2 j& t4 C
} . k9 U- o9 m; @( X& N0 f1 T, k/ [
return 0;
, w9 N: E4 ~- [, S W
$ K; T& } A. N F: n' N}5 z( a# z1 g" a) f! m) u8 ~( N
# I& E9 ]+ Y+ ] c) {多谢各位指教,谢谢! 急3 Q( P5 J& L1 d
$ n3 @2 ]6 D/ s" k9 K& h8 r9 ?. \6 u$ u; E; X; y$ k
6 }0 }4 E2 F3 i6 X" _% X
! A, z! N! b; H0 ?' b
, [) s1 C" \0 y |
|