|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % e6 B+ k7 c3 u
/*
% l# k, D) j' S& F9 `( Q+ _/ v * Copyright (C) 2009 Texas Instruments Inc) ^* A r" c5 [
*& T4 [9 ~) b5 n. w9 A
* This program is free software; you can redistribute it and/or modify% O1 `/ c- X& d/ \% o0 m* W
* it under the terms of the GNU General Public License as published by
! q# U. }/ g6 M. L. K- a * the Free Software Foundation; either version 2 of the License, or
! U5 O* c! D! S: ] * (at your option)any later version.( V1 p3 D9 l' H. ]* u$ I
*- t8 i: e, O& l- j8 q
* This program is distributed in the hope that it will be useful,
! [+ p! t% _! X7 r0 U$ Y: f * but WITHOUT ANY WARRANTY; without even the implied warranty of7 q2 a' \/ G- G' ?5 o! d' E% t3 P' F3 D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 v4 x2 \ d! e: E! H6 b, H * GNU General Public License for more details.
% q7 v& _7 V# i2 }) V1 L! L *
7 v% x9 Y# W* H' \$ y * You should have received a copy of the GNU General Public License
7 V, m& `. p; L) p6 n * along with this program; if not, write to the Free Software
; J& e( ~3 f3 I% o5 d+ |. M$ i * Foundati/ M- W' G7 S5 v# @1 ^. ^
*/! n' [8 o. b& G6 }3 t
#include <linux/module.h>
8 d' N" r) M+ w) _9 z#include <linux/init.h>9 ~0 O. v* Y/ Q& d g9 p# F
#include <linux/errno.h>
' {* l {1 V4 |0 C4 a1 I#include <linux/types.h>
8 `! h) B3 i2 _0 K1 k$ G/ N#include <linux/interrupt.h>
' K6 `& ^9 r# i#include <linux/io.h>0 O5 F# Q4 J) d8 V
#include <linux/sysctl.h>
/ I+ A/ x* z+ ^ I#include <linux/mm.h>
, t& x: U1 w+ G" d8 c% V#include <linux/delay.h>, E" o0 E. \6 s- B* r
#include<linux/kernel.h>5 R2 n' Y3 x5 s3 i1 C& l5 J9 Q* L
#include<linux/fs.h>
3 H: c* E+ m$ \( V. R) B#include<linux/ioctl.h>
' n' l" G; W3 C6 k, ]$ k, X#include<linux/cdev.h>
- v" E7 k: S8 G: Y#include<linux/kdev_t.h>2 y! {) g+ e* }# i* h7 A; w+ I
#include<linux/gpio.h>
8 e) b# A3 w i1 I/ }9 O; }( R#include <mach/hardware.h>
- o% J& W5 u! `! c#include <mach/irqs.h>
, q7 [; y7 h* e2 T% I$ V! D* ^8 E
! A1 t% }1 J- l#include <asm/mach-types.h>
- I, C% c2 x# U3 `#include <asm/mach/arch.h>3 q; W5 o/ q5 w: d) f
#include <mach/da8xx.h>
; g5 S8 q4 c0 e$ \' U8 d* t4 @" o" N1 Y#define SYSCFG_BASE 0x01c14000
" v; K) Y9 n# H* N* _#define PINMUX1_OFFSET 0x124
8 F& A/ |2 H9 U+ N#define PINMUX18_OFFSET 0x168
( J! F% y7 i4 d* A( W" A/ y#define PINMUX19_OFFSET 0x16c( m* k. W7 C# ^
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 r2 }6 B: L! ~2 ~+ ]
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
* W- ~2 L& u7 Z3 g0 L9 Q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR0 `* T" t+ Z0 ^$ i' X8 s* f
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR8 Y' z! ?* f' t' a& z: P' F% ^" t
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 f' \. K- O- {& y! s6 f
' |! ?+ f! _ D; }#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
! l* X4 s6 m: m+ {) v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
2 Y6 u7 c4 K$ k' J3 {//PSC
# {# f, m( X+ P#define PTCMD_ADDR 0x01E27120
) J1 s4 V+ M+ P5 }4 J4 U#define MDCTL15_ADDR 0x01E27A3C
5 i* a+ p, q. E#define PDCTL1_ADDR 0x01E27304
$ U2 B: c) L) a ^; p# {( c' k; l//GPIO8 direction
. e, o; A( p# s; k/ O0 x* s5 x2 f#define GPIO8_DIRECT 0x01E260B05 p' h- T2 \& u: q# T
#define GPIO8_OUT 0x01E260B4) G6 Q0 J+ s( u0 i
#define GPIO8_IN 0x01E260C0
. K0 b7 B* d3 p/ G! R# S0 s, i1 ]$ X- U/ h, A2 Y" r
//#define MCBSP1_RINT 99
* |$ J6 v# K3 W, M! H//#define MCBSP1_XINT 100
' J: K W/ }# y' M: tstatic int MCBSP_MAJOR=239;
7 s9 ?. r' o+ d0 D1 R4 U" kstatic int MCBSP_MINOR=0;
4 ^+ _5 P9 Q0 T/ z; k+ mstatic int count =1;8 U" ?2 y. q" [4 K4 \; Y u% {
( }5 e2 H, d7 v5 Y# d. a0 D2 F
#define MCBSP_NAME "MCBSP-device"/ O- {: ]4 y5 Q, F; ^0 R7 V& @; {
7 b/ f% m, \. K+ V. @& b0 v0 ^
static struct cdev *mcbsp_cdev;
: C: ^( W2 \) f1 \static struct class *mcbsp_class;
. x* V1 r& S! @ S1 ystatic dev_t mcbsp_dev; m+ s- y. s x1 R* b0 Y1 X! `
unsigned int DRR_data;! }% E5 V$ o: j8 T: |! [! K% M
unsigned int DXR_data;
d1 n% l2 r$ {% |6 z3 s7 p3 o" Xstatic int mcbsp_open(struct inode *inode,struct file *file)- f# K; {- ^, ~. G+ D, [
{$ I8 y- ]; p7 I- Q, o l7 w
4 h6 q! c6 F5 u- o! f //interrupt enable,initialized3 K( y- }% j- I! b) ^) W+ Q( Z
unsigned int temp;
. J* S& |! X, |0 ? //SLEEP_EN(GPIO8[10])---0
& |$ E+ i" n0 H; B; A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ H" s* h. L8 ]' { temp=temp&(~0x00000400);
, a0 u- F+ E. q0 F7 s, a __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( Q2 ]( c5 R3 ~1 L4 Q* ] //RESETn(GPIO8[8])----0----1
+ l% b' a' d* a7 }1 d% J, b0 S temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. |: _1 d" w9 |. v/ P temp=temp&(~0x00000100);
# b6 D1 S) l! Y: p% _8 k9 c __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, E# D% m9 g% N2 _3 {
udelay(100);9 n. P/ Q3 T( W
temp=temp| 0x00000100;
: x3 b4 A7 J' Z, Y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 u& ~) w$ b4 W2 o E. E
udelay(100);
, m( p/ L* q: J6 Q6 T1 O+ i printk("open success!\n");
' v8 z. j6 n* P return 0;
4 H7 K9 o$ [: f+ R1 h1 \}* u8 L, W) F) v f I3 X% ^
. J9 [) L8 W0 _# w/ j7 wstatic int mcbsp_release(struct inode *inode,struct file *file)
- q$ h: }; u% ]+ g s{. |. g. a3 `+ |9 w7 Q
printk("release success!\n");
, n8 E2 {; L7 x9 z' @ return 0;
8 Z: ^4 D( ]' e% e. N; c4 T2 r}
( S% B, |! g; T* ^+ N5 H! g0 |
& l, |1 ?- x3 V& c0 ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! q& X" t% i5 h, ~) s# x+ j{8 o% i9 I3 p( c- o* i, C. Q
copy_from_user(&DXR_data,buf,len);
' u+ J' s/ i0 I" T/ h' ^% W iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* ]/ k6 ^. a. R: J1 e, H return 0;9 ~% f, ?1 h& z
+ A+ v5 e8 A" W: W8 ]
}# @$ p' h* H) c# L
! }3 j( a1 \4 B1 Z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
6 l6 v" O% [# O{
% W4 q/ Z: s# S# F7 k0 {$ n* T( \ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- y5 Q% C/ o9 h q$ j' d( c! K5 {
copy_to_user(buf,&DRR_data,len); ( s% X) F/ }3 c. V, b
return 0;& n n# c8 w. _$ @
}0 Q* y' ]* }* E9 b% a
( O+ N0 {% Y8 {8 j/ v" l! y
! C, L% p/ B7 u; t# i
static struct file_operations mcbsp_fops=
1 a1 [# S6 o' `1 |( P4 s: @/ [{
n% `5 n4 k- G1 v .owner=THIS_MODULE,: m% `) ~4 u3 t L& Q5 X
.open=mcbsp_open,
$ G' C) }1 f0 N" J, } .release=mcbsp_release,
! p7 N0 h9 a) f( S2 i0 q* d) t& b .write=mcbsp_write,
" ?" R8 B$ e5 ^1 X: o .read=mcbsp_read,$ L# F. ~5 O4 c, R- n. j
};% ?0 c5 I& Y9 I& b% d$ N
static int __init MCBSP_init(void)3 A* g* e3 O- K+ y6 M
{* p( R% J- }; L' y8 J
int ret;
: b* c J W7 ~) Z, k* ` unsigned int PINMUX1_REG_old;5 m- O' j. ]- Q/ g! s7 _3 S
unsigned int PINMUX18_REG_old;1 ?( C- j3 y! q; B, `( u
unsigned int PINMUX19_REG_old;
b6 U( t! I D [ unsigned int temp;
, a) c' y/ O3 Z% Y O" U8 ^ if(MCBSP_MAJOR)
$ A$ }" p- J) K5 `+ i {
# L+ Y" i0 o' ~$ `5 z4 q$ w5 C. r mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" L% ]8 x- t2 ?* N
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# R" D- O% j$ ]! E }
# s7 k3 w! @9 P% G6 L. L" S else
/ H8 @& p7 G; f# d0 O) w% Z {+ A6 e5 q5 |; [, O/ ?' U
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 W- L. F) b) U2 c7 o# ~
MCBSP_MAJOR=MAJOR(mcbsp_dev);
K2 l, M! O% {& X B }) y6 `& X! ^: g" w/ J) u
$ |9 \# H- K; Y% D+ |7 n
if(ret<0); p5 C1 }# R r6 m2 ?4 H% g
{- t$ D4 u A* Q( w( h
printk(KERN_ERR "register chrdev fail!");8 W+ {1 j `) j4 w0 F% a7 I' S" n
return -1;
% {% K. }. e# j' p% ^6 o2 y/ C' e }
/ _* p) |" P- T3 L( w
+ w6 B0 _* p) [! _) ~6 Q" G mcbsp_cdev=cdev_alloc();
6 A3 Q2 P- _" [" d
' n6 t" o" _3 {2 Q# \8 G( s4 D4 } if(mcbsp_cdev!=NULL)8 c$ {3 q0 ]' |) \' \
{
9 g# Y. {1 O- R( E; p& }5 d7 f. L cdev_init(mcbsp_cdev,&mcbsp_fops);2 f* ~, W1 k& Q) E3 U m& d, y% r
mcbsp_cdev->ops=&mcbsp_fops;
$ s3 k5 d; a; M! e3 h4 F7 b) H% K mcbsp_cdev->owner=THIS_MODULE;' h& k& g4 \' h8 z
/ k2 f' a$ T) C+ W* a
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 b( o+ E& C6 \
printk(KERN_ERR "register cdev fail!");9 D/ p5 `% w3 H9 I9 J
else
9 n+ G) ^! z. C9 ?! O& @ printk(KERN_ERR "register success!\n");1 Z0 M9 L) s0 _& b% Z) @# C
}
/ }+ A8 r8 t' o1 k3 t6 R else+ m( j) R' A1 J+ }
{, |5 P' _: `! l
printk(KERN_ERR "register cdev err!");
0 E$ M$ ]) |. j! C" U$ _ return -1;9 f; n% |# U2 y5 T A5 s% v: S
} I% {+ { D/ P* T
* d1 Z) _8 c/ F, {" h$ u% N mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- L! ?4 Y/ F- {
if(IS_ERR(mcbsp_class))
" S% U6 S& a, I3 @$ Q3 F {; Y9 o# ~: D! F* W' T
printk(KERN_ERR "register class err!");
/ {3 i4 I! c7 K- W return -1;
5 X' b' a# E( V j! \* a3 P }
' p F; a# b2 M+ n# `0 _/ ~( { device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 k' t* J$ ] k; W9 _& c" M' U1 w: J6 a
//PSC x; W. |7 v e |; D- q
//add Enable MCBSP0 T* o3 F* R* O
//test
+ W: }8 g. p$ u% ~/ g. ?3 g5 ` temp = 0x80000003;
# b: x x1 t# v. t$ n writel(temp, IO_ADDRESS(MDCTL15_ADDR));% V; B5 {, z4 L4 U3 ^- C. Q4 \% y
temp = 0x00000003;
' T8 s2 F4 x0 m9 ^4 H! S writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 Z6 n* A$ C7 w8 {& V- t
7 M/ H' i6 y( _ temp = 0x001FF201; S" v* z7 I, _+ e0 y- c
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
A9 v. w; g% Q2 B t
1 f( M8 B L# `; }, P" A //PINMUX
2 h; ]: V+ x1 z; Y0 X2 G' H //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* s5 V/ J/ ~$ _
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ; ]5 `3 R l# m) [
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; - i) e1 \8 Q2 h G8 ^/ F
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% x2 a) Q8 v4 g# p5 w0 [0 N
9 U, z$ Y- Y" z$ p8 D //SLEEP_EN,EPR,L138_SHK1,L138_RC
& ~+ L: q3 ` H! x' T PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % E; l2 n* u7 Q0 M
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 6 D/ p6 J" v8 b1 M# C8 F! G
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);, G# |) Z1 C2 @$ w3 t
( x, a& I2 `9 r E5 D
//RESETn,L138_SHK2
, U) M7 h- R) w% s: K PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- f A& a; c6 f+ P/ Y6 l PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ( D$ M, W: `- Q9 ]1 y3 W8 H
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);! a0 Q. h9 J. Z. P
' [- m& F" c) K( I
+ R6 E. ]* X. C8 N/ u+ W //SPCR Register
! j f5 o+ Z6 F4 S" _# T& i: A: k" L# { //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: k: C# R5 W7 ?4 w& p6 {# v S temp = 0x03000000;//(DLB=0)2 ?- S( ~& ?/ x( M
// temp = 0x03008000;//(DLB=1)+ x( Q0 ?3 w' o
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
- x& S1 q9 j9 P temp = readl(IO_ADDRESS(SPCR_ADDR));
3 G/ [* d7 B s$ j. S6 h printk("temp=%x\n",temp);
: {. X8 N* L [1 l2 Q( G
# h- G5 a5 A w5 z0 Q; n //PCR Register
2 }0 u+ N# ~: ~- @8 O //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# C2 t$ H, q( d
// temp = 0x00000F0F;# O* M1 w# Z" Y! M0 u
temp = 0x00000B0F;% w) o4 b- ?6 p1 x6 @: s4 b8 W
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 T' M: c( u0 C+ H0 K! b temp = readl(IO_ADDRESS(PCR_ADDR));! R% ?$ H8 S8 q3 y& [5 H" P* b
printk("temp=%x\n",temp); , e) ^- V8 k* F/ q" ?
//SRGR Register' U/ W5 v& R0 d2 P: W
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 Y% v5 {9 `# @4 f- O$ e. ~. n, N
//temp = 0x301F000B;
; t. {! r1 j+ c+ N7 g# I writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ! S* d2 [% i# c# Z# z) I
temp = readl(IO_ADDRESS(SRGR_ADDR));2 j6 b( ~" Y+ Z9 t! w4 v" w
printk("temp=%x\n",temp);3 `) `9 E. s$ D+ _
//RCR
& T& j) Z$ R6 r2 x4 h2 p& c //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# z& }. {4 A. t0 w0 M
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# I# B& M# ^, N- t3 s temp = 0x00440040;
, C' q, {7 H7 n2 A2 N writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ( T2 X) D% M7 y, T4 M
temp = readl(IO_ADDRESS(RCR_ADDR));
( N1 A% x. ?' K7 L+ o printk("temp=%x\n",temp);0 e( g: m2 K% a3 E. S9 e& B9 f
//XCR
w$ v) o# ?( p. t( G7 ` //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( Z' w" h% N4 w" |4 i
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: D. k' ^7 y, u1 x7 T( n
temp = 0x00440040;
9 P5 Z4 q6 z7 g; j' F writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
* K" j5 ^6 ~9 `9 k! k temp = readl(IO_ADDRESS(XCR_ADDR));
2 ~$ `4 |, b1 |7 [3 C' e1 I printk("temp=%x\n",temp);
7 U$ a* b/ T; { ?2 `$ v udelay(100);
4 k0 {/ G9 y! c. V7 O' V- i! \ //SPCR Register j1 M l8 R; i- j
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-12 J. z$ L5 ?5 g
temp = 0x03C10001; //DLB = 0 VS DLB = 1
7 e6 ?# Q% t7 j* N5 y7 h writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled4 u- w* [+ v7 ?
temp = readl(IO_ADDRESS(SPCR_ADDR));
) r3 d# f" s% P) r( F/ c printk("temp=%x\n",temp);7 k) h" x4 B9 h b6 J0 I0 k+ ^
udelay(100);
* V0 `0 R! S9 ?# F, H, k0 P# [, Y3 t! K3 c0 x) u) u
//set GPIO direction
8 i% ]9 y2 H g( l: K! V* @9 L temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! y: Y* d6 I" g/ N temp = temp | 0x00000100;//EPR----input
! B3 U7 m) m5 f) c temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* H" n* [: X# I$ v. T
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& }; g# x3 V0 w- N 3 I# A1 f; I' {9 w0 ^0 H
return 0;( r" _' w' k2 b: l; @, c
}
5 V- K# d6 y+ X# H/ ?! D8 u# gstatic void __exit MCBSP_exit(void)' c- ]2 V) P v- ]! K
{/ ~+ m& G' Z; m3 ^/ j ]7 { r
printk("mcbsp chrdev exit!\n");" |+ E$ `# e; p/ e
cdev_del(mcbsp_cdev);
/ a& Y7 p2 N2 c3 Q5 F4 X: s) E' M unregister_chrdev_region(mcbsp_dev,count);, J9 |0 y$ X, M0 n$ a/ u
device_destroy(mcbsp_class,mcbsp_dev);; |) `4 O. F7 ~$ P
class_destroy(mcbsp_class);. q2 z5 g6 N: y6 G
}. P0 ^1 P; {: @) w$ w
module_init(MCBSP_init);
' T0 `! A5 k6 Ymodule_exit(MCBSP_exit);
2 f7 ~: R/ O; | Z/ B8 w/ X$ y
- P; _. @: h+ n$ oMODULE_LICENSE("GPL");0 o+ ?5 A+ D e j: v2 b
$ d8 M8 G$ I/ ^% G6 I5 _
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
8 e2 P7 }1 b8 }" ~' F7 U1 h8 n我的应用层的测试程序如下( Z X: h- x' D, l# q! {8 B x8 ^
#include <stdio.h>) O9 c `3 ]7 Y" H" k2 E
#include <string.h>9 D) l# d3 p! F+ q7 R
#include <fcntl.h>1 z) y# R7 K! {) T0 L/ F8 ]
#include <unistd.h>. r0 T4 T+ ^) R5 i" t# |) u
#include <signal.h>
# J' p6 f7 `1 [- } Q* v#include <pthread.h> //线程1 o, d3 d1 E/ `
#include <stdlib.h>1 _; @( }" K0 _" ^8 V3 ]/ J
#include <pcap.h> //捕获网口数据& n! \, Q! V' \1 a5 l, S# \+ q
#include <semaphore.h> //信号
( H, o/ T+ G. O4 W: k! O: X# T#include <sys/types.h> //消息对列3 n8 t/ {" ?) m( L/ S$ c
#include <sys/ipc.h> //消息队列! [0 y3 G! d0 M+ z, p) [0 X
#include <sys/msg.h> //消息队列
$ P6 E0 a* g; b2 W2 T: V( w) b#include <sys/select.h>
. v1 g8 h6 t: E1 `6 V% d#include <sys/syscall.h>
2 N9 V6 o& ~+ b/ p; r, g7 M2 L#include <sys/stat.h>; Y0 e+ C! _0 Z! X8 w
#include <sys/mman.h>- k# \. u: ^. P2 Q% n0 J% Z
#define msleep(x) usleep(1000*x)3 S% q: y* [$ O+ R: w
: l. r( W0 G: b" S, N8 `
int main()4 t' d* |3 m, _7 e/ w
{ - w, y6 {" R$ p
//MCBSP,ARM与AMBE2000交互设备
) }1 S) e5 ]; i# p int fd;1 |& e, ^$ L: @
unsigned short data_write = 0x5555;5 B4 K4 J& Z8 E4 Q
unsigned short data_read = 0x00;
5 M+ J' b! A# k fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 s& Z. U9 Y0 d# z4 c/ V* q- u" Z // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 h8 Z0 R7 J% t4 d K5 a0 R2 b) l9 ~& p4 B
if(fd < 0)
D# \$ |9 M2 E; Z) ] {
) H6 c2 }; p+ G2 r N: J$ p" b perror("open failed\n");( c+ d: E! L4 h6 Q8 ^, u2 g* `
return -1;- ]; I7 G# x) ~# x: S+ c0 b$ k
}
+ k6 K8 J+ J, V; G; o# O
0 F T X, y3 h8 u( a7 Y while(1)7 F4 _3 z( s0 J% S- s. `; L5 N/ ]
{
: M7 {2 Q3 t4 o8 o 7 S- ~! |5 M8 i0 w1 s; N, m
//AMBE2000每次读写是24个字为一帧
5 N2 e3 G" I4 K$ v) X) |6 |% g% t' i //写数据时将数据在底层存储起来,等到中断的时候再发送5 B* [; F' k/ S9 ~
//AMBE2000输入数据是以0x13EC开头的1 Y. T9 S* J+ z* _
write(fd,&data_write,sizeof(unsigned short));
7 N6 x+ F) b1 F + O% B' Z& o' [1 J- w4 f6 N+ ?
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
3 k2 B/ q# \; R- X) Q7 }2 i. g read(fd,&data_read,sizeof(unsigned short));; G, Y5 ~+ |% j& Z( b: ]& ?
# P0 e2 w/ K+ S, k if(data_read == 0x13Ec). N. |- m, M x0 X
{
/ |+ M; i$ y# }% |4 Y( G
( z |2 n: l0 S' C3 @ printf("data_read = %x\n",data_read);+ O% Z" M+ }! ]0 N9 V# w7 Y6 {3 r
}
' f% K7 S' q) X D; E
5 U( R$ E& X$ {; H0 c msleep(10);, `: k% C8 `' }# @3 L1 Z
; \: t6 K* [& F, x; H /*
6 f' U* M; K( I* P8 T ioctl(fd,1);
6 _: H0 y! n1 J) F sleep(1);
6 V9 t$ c+ e. W' N3 D" U" o6 T ioctl(fd,0);$ n+ ^) t/ \8 ^* l: R
sleep(1);
. d9 B Z# {9 ^ */
! H5 U2 L2 E5 W6 e$ t } : G* {6 g1 t- J6 \9 Y
return 0;* k. F! K* I$ S5 P' F/ _" j) j. @
! Y) |/ t% s2 X# J1 n# M1 v- ]" [}8 A4 c/ g+ o1 ?# I! U
! Y1 A" j9 |( r1 [2 ?
多谢各位指教,谢谢! 急) E, \! E( L. u9 a* y$ P. ~
0 N. s9 N i8 R- b; o$ s# d
$ i, G$ C8 g5 C: V- N
/ M# f' O; T) h9 Y" Z
, d1 C% W, \7 Y: d2 m: O! O' C- [# h- k
|
|