|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
* t" e, n' T% O, _( D0 q; R- O/*9 E! h4 x: g! s8 o
* Copyright (C) 2009 Texas Instruments Inc
, _9 i" A8 Q, d* D *
/ b% G; G5 U; J; G0 g * This program is free software; you can redistribute it and/or modify
. e: G6 u" y) c7 Q0 [ * it under the terms of the GNU General Public License as published by" \5 q/ v4 i% i; P2 b7 @$ _
* the Free Software Foundation; either version 2 of the License, or
' [( f$ b# V9 U" L * (at your option)any later version.9 x. l/ r: E0 P+ x* E
*: i5 q9 y, `% c0 p. e$ m% A# ^
* This program is distributed in the hope that it will be useful,; v' P$ z/ k0 n" j; U+ V! \
* but WITHOUT ANY WARRANTY; without even the implied warranty of
7 f: M' ~+ }0 h+ @ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
, v+ O! I6 J- l$ b" O* B! q * GNU General Public License for more details.
- I' l H2 K$ g7 ]$ S5 L8 a ** V" q( c; F" O+ q: l: [
* You should have received a copy of the GNU General Public License+ s3 O( t, s# z- O& e. D
* along with this program; if not, write to the Free Software: j& m+ F2 d3 h- g% L8 w/ c
* Foundati$ W; X% h' b" d% B' i' `( o' I
*/4 C9 z& @+ R; c4 I. F" J5 {1 J
#include <linux/module.h>
7 |* t- p4 k: Y* P" L#include <linux/init.h>4 K& M1 a) o0 t
#include <linux/errno.h>! K+ }& i4 g1 z( a* B
#include <linux/types.h>
$ B& G4 i- M. k% a2 ?5 n#include <linux/interrupt.h>: T) v# J8 ^0 J8 k' z
#include <linux/io.h>3 G6 X, g4 p# R
#include <linux/sysctl.h>
$ I) b+ t! C" A9 ^3 n#include <linux/mm.h>; S4 z: J) c2 z( s2 ?# w6 {
#include <linux/delay.h>
0 n- [. C7 m! l( t#include<linux/kernel.h>1 o i0 T, H: u$ L, G; C
#include<linux/fs.h>
. E3 {1 i9 r: E" w: v" d#include<linux/ioctl.h>
: n, H Q m4 }) Z3 j& B#include<linux/cdev.h>
* u* j" w1 c% v- e#include<linux/kdev_t.h>8 T" u/ H i3 [5 K
#include<linux/gpio.h>
) r, z5 N1 X3 i: T) {#include <mach/hardware.h>8 |$ ]* [2 h3 U1 a6 H
#include <mach/irqs.h>
6 ?! w8 H: \( u. b
4 ^% p) A. q* W, m; p% W#include <asm/mach-types.h>
8 b0 W/ h' s3 |# G#include <asm/mach/arch.h>
! M- o9 a7 c2 G$ B% v- n#include <mach/da8xx.h>! v0 Q- w( D8 P" @& P% i
#define SYSCFG_BASE 0x01c14000
: f- N' b; k* O( Q3 G4 e7 a#define PINMUX1_OFFSET 0x124
4 {) x/ ]! `: ^* y2 }#define PINMUX18_OFFSET 0x168 9 o1 Z7 Q3 m% c9 g0 c0 h3 A
#define PINMUX19_OFFSET 0x16c
$ ~* g" O, v6 s* I N#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 K7 t+ O# c. H9 {+ D
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
2 o M8 u" ?: l. F/ t3 G#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
2 B1 ?/ {1 h" f#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
' a6 w0 ]$ r6 m#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 `: I6 B6 u7 @. E6 U( o8 ?8 V4 S. ~ ' i+ M8 A9 w) S! w Z( M% e. ]
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
3 S; |8 W$ k% w% z1 v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
; ^# j, S, `5 A$ ~//PSC1 S, N6 U* a" j% I6 U N. t
#define PTCMD_ADDR 0x01E27120 ) g* F4 h! ~. |* J$ n( f
#define MDCTL15_ADDR 0x01E27A3C
- L& {; ^5 K9 |) v( \#define PDCTL1_ADDR 0x01E27304
& s% ]- a# w% a' c4 R//GPIO8 direction+ U; f: B) D: e9 H* H3 [
#define GPIO8_DIRECT 0x01E260B0. Q# r" G1 |. T Q" Y
#define GPIO8_OUT 0x01E260B47 M2 ], O; r4 l
#define GPIO8_IN 0x01E260C07 R% t/ e9 _/ t2 f
' y& m: {& d {/ e8 R7 L3 D//#define MCBSP1_RINT 99
& m" V) C) h9 T0 J//#define MCBSP1_XINT 100
' V+ w% t# w N5 vstatic int MCBSP_MAJOR=239;
* N) R( c2 P; i- R9 ~, s/ ustatic int MCBSP_MINOR=0;8 W f4 t( y U6 O8 B+ R- c
static int count =1;
- j; N5 I7 k# N: P& Z
5 ~5 |2 a! R! y#define MCBSP_NAME "MCBSP-device"
. {' {) d* G I. U4 a* |3 @. {7 A& N L+ b& H/ F' D2 N1 L5 t7 G7 I
static struct cdev *mcbsp_cdev;
/ }7 o3 z( z; ]3 F# p0 Qstatic struct class *mcbsp_class;! f* d) q9 e3 p: S$ u# @9 Z( z
static dev_t mcbsp_dev;
% x* F( C% I' O( O, n* D) d% i5 iunsigned int DRR_data;6 w# }2 U" R8 ~$ b% M3 u9 \6 V* U5 V. P2 t
unsigned int DXR_data;- D0 i8 \0 o* a% Q
static int mcbsp_open(struct inode *inode,struct file *file)
( k# B+ x( b6 {{; j. M s) H4 r' \ l; H4 }
7 W! e5 @! J% v8 ~ @0 Z" x //interrupt enable,initialized7 T3 M2 S+ Z9 h, |0 o+ m4 f
unsigned int temp;
: w1 u# g8 D1 X& r" V3 b9 v //SLEEP_EN(GPIO8[10])---0
* y" N) M; p8 O8 F/ L/ K temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" {: i4 V! Q# f5 ]% a* N8 E5 i, n
temp=temp&(~0x00000400);
% @$ a" T j: ~. Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ A$ T" [+ S' Z) }# w2 Z9 L! g //RESETn(GPIO8[8])----0----1
4 ~' M( C4 L- e t+ S temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); s1 J6 e+ W( e6 w2 f$ T
temp=temp&(~0x00000100);
+ X" P P, F0 M. F" G; s; G __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ r- {. B3 N$ B( @
udelay(100);
, U9 y, P* Y; q9 M* ? temp=temp| 0x00000100;
4 O* L% Z# v2 a __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ `& J1 A T9 g G& n udelay(100);
( z' Z7 f" V. r! Z3 a printk("open success!\n");
( g$ ? M! I( f# J' w G0 a return 0;! t. v7 E/ c A) |3 ]- I$ i. Z4 X
}
$ m1 r3 g+ F9 V; v7 h* ]
/ o: ?. E7 g5 h: E$ ~static int mcbsp_release(struct inode *inode,struct file *file). t. Z3 b% Q8 V& h/ X
{
& S; c0 m* L$ L. @/ V printk("release success!\n");) I4 d) }& d( v( P% V0 m3 T
return 0;
0 U! B. Y$ b$ A3 {}( |. Q2 S w# X- ^; S. t0 ~/ t
7 ~: G3 b5 | J* s7 q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& A$ P3 S. y1 Y/ k* x- r+ l) W
{3 ^4 S0 x0 I" i1 i5 b3 |& \
copy_from_user(&DXR_data,buf,len);0 `6 W. S7 Q- Y: ]* A3 o- V
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
& c! _1 V; s6 j+ F% c/ q# ? return 0;& t$ [: j" x4 n
j/ d" G( M& A& A+ E$ \}5 I, L, x9 m) \. B
0 ]. D: y! w4 ]9 _# y) ]8 L8 h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)0 Y( I0 F8 O- J% ^+ Z, Y
{ ( D) H& H* `) p5 o- F9 ~6 |
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 |6 d8 k9 X& r! ]# Z* J copy_to_user(buf,&DRR_data,len);
/ ^* M9 O( }+ i8 N, b return 0;# j' b( i3 e1 @) K& @, f& |. t
}1 P# q; f3 ]7 u9 a) h, l3 J
! Q" ]/ s7 A6 }5 _4 S
& W5 ^, p4 ?9 Dstatic struct file_operations mcbsp_fops=' D0 d! `3 ~4 h# n
{
: c, h; A/ @+ ~5 H0 Y$ \ .owner=THIS_MODULE,. G+ x4 U, J" |9 Y& g6 {7 [9 }
.open=mcbsp_open,
' Y( y% N( e% N! u .release=mcbsp_release,
) R) d8 u* e" P5 H G .write=mcbsp_write,
) ^8 b7 ?/ i4 K; P. N .read=mcbsp_read,
' g" `% ]' K: X* h3 d, e9 O};
6 l( g) S0 x& t: E' Cstatic int __init MCBSP_init(void)
6 i& _, w1 a# E$ J3 l: Z2 C7 A; f{% h6 ?# P5 C5 |, ? R1 A- N8 j
int ret;: S L) w6 v7 m1 S9 @! l
unsigned int PINMUX1_REG_old;, o* F6 @5 ]" {- a4 O9 |5 j
unsigned int PINMUX18_REG_old;& z/ n' B& W* c4 N6 a
unsigned int PINMUX19_REG_old;+ m' ~9 s7 E; L5 X
unsigned int temp;
! M! c4 n+ A! @ F if(MCBSP_MAJOR)2 m9 ]9 U" ?) l6 ]* D( ~( D
{) e B+ g* L$ s2 Y' f! _: i
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ k$ k" n: T3 \3 T! v" }( o$ }7 R1 G
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
, X& U: m7 M7 ^ }
& H6 e0 W% V! u& [5 A1 u else" H# |% H6 @4 q2 _
{/ q* R4 m h3 J' i$ o4 e+ i
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' Y; z4 T \! G. `
MCBSP_MAJOR=MAJOR(mcbsp_dev);2 f: F) O/ D. A# G
}$ T: e/ s' P+ X% n, B' H& {
, q6 W# A0 b" P k; K& h' D if(ret<0)1 N+ o3 t2 z8 s+ ^2 V7 |
{2 c0 u. h0 R0 b! A( k: m. i- ^
printk(KERN_ERR "register chrdev fail!");
6 Y# {6 { ~0 [& L* \, z& S! K return -1;( G6 G4 t1 X+ _: X9 Q. Y
}
! I" E/ e: J: a5 @9 G
0 T, }& l& S$ o mcbsp_cdev=cdev_alloc();" M! ?: R4 a) ?. U$ Z* [' M
9 m' y# F5 ^" e9 |, z
if(mcbsp_cdev!=NULL)# h. V" y# o! _! x4 e6 f+ z3 D! J
{
( U$ m0 ~, z! d! @. P" m. X cdev_init(mcbsp_cdev,&mcbsp_fops);
+ D+ h3 x* n0 J0 V mcbsp_cdev->ops=&mcbsp_fops;
( h# u. O) N( v mcbsp_cdev->owner=THIS_MODULE;
; p. [7 w8 c T q0 c
4 K5 N% P3 p2 f- @& h) d- l* p u if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); @. m* S( e- e1 ]& b, M, X
printk(KERN_ERR "register cdev fail!");0 I5 v+ k1 X6 Y& L3 r$ ?
else& m/ B+ M% ]- I1 S# h
printk(KERN_ERR "register success!\n");, o( }4 L% [( }
}9 W5 @" {. M" P8 u9 t0 m, U4 s
else
$ o2 z& f) d! P5 Q {
% g& }& W6 ^$ y3 z printk(KERN_ERR "register cdev err!");7 a" n4 ~( |1 Y6 R3 l* Z X2 T( R# h
return -1;$ x1 N) p5 n. b' c Y' M' y8 p
}0 ~. N. F9 P9 S+ D: z6 r
7 g6 l E) Z' \2 M& |/ E' T
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. V3 W; {/ U$ y" S% u! ?
if(IS_ERR(mcbsp_class))
' |" v0 B8 y7 [, M" y {
% T/ a+ G7 |' n# l V$ F3 [; O printk(KERN_ERR "register class err!");- t! i% g1 Z2 }2 i1 d
return -1;( v5 x: c# U1 N* P3 {9 W
}. Z! o, M7 S; o: |1 m
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# d0 m9 e+ A0 t! N e2 W( I
* T7 b8 Z4 V& B
//PSC4 V% l- `2 Q) p
//add Enable MCBSP& v. R1 }' Q) j1 c: W
//test2 V2 A% ]0 p, h- d
temp = 0x80000003;7 x& b' R3 @/ M* X9 p) e l
writel(temp, IO_ADDRESS(MDCTL15_ADDR));* X, A/ l& }: W6 \! u
temp = 0x00000003;+ P4 m6 l5 Z* L6 }5 ^
writel(temp, IO_ADDRESS(PTCMD_ADDR));) |$ P. [9 K. Z$ a: m7 H
/ G0 f+ H9 ~* k# i temp = 0x001FF201;
* L) F3 g& ^0 z" d writel(temp, IO_ADDRESS(PDCTL1_ADDR));! |5 a" S( t9 K; g6 M% y8 m
z6 I$ g T! g. a1 V //PINMUX " c1 [5 T: R: l p( ~ s2 K
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* U" @' y5 q/ p0 H0 o PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: m) C, B6 q. W" N# E" I4 z2 Z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
$ L+ c$ B; h5 h* e, C writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# M1 {7 A7 O+ a4 N
: D, v# ?3 U f J. E) F- v3 i
//SLEEP_EN,EPR,L138_SHK1,L138_RC9 ]% c3 n9 s- o3 n5 _% l1 X& z+ S: g
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& C! }* V$ G: L/ }0 d7 w9 q. b PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
* m$ R2 x( z5 k6 q, Z writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);0 G9 V4 F5 a/ f/ K8 g% a
+ U }$ R0 F) R3 m' W1 w
//RESETn,L138_SHK23 K) W9 S/ t* @1 g x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 0 L* S" p% r; L
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
) V8 d: p7 [7 N/ S writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% p& z W/ ]3 R" o' A 0 m; N1 I- G9 B8 i9 }2 Q
7 D' z* G, M! m* |, X; E! ~. Z //SPCR Register( h, Q9 W- z& N# ^, x, S, T
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ o# a/ f, |) k8 A temp = 0x03000000;//(DLB=0)
% a# ` k4 c7 b) M0 E // temp = 0x03008000;//(DLB=1)
3 ?1 w% I y( U' Y4 g writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset& i# z) Z6 [* {( W/ G
temp = readl(IO_ADDRESS(SPCR_ADDR));! T) L& |+ v$ k% M( b, T% ]
printk("temp=%x\n",temp);
* Z7 f' e7 Y* W6 n; k& d ; D3 e# _ f# _# s4 K5 R& x# P7 N
//PCR Register
+ q! [$ d+ o- q5 v! |. g0 k9 H: { //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ j& a/ ~( S( L3 @' f // temp = 0x00000F0F;) E1 l0 u# j9 a0 k( I
temp = 0x00000B0F;1 w T1 q- w; b& i
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* G5 ~, L* L* v( L4 v temp = readl(IO_ADDRESS(PCR_ADDR));& f3 i3 o8 Z6 P$ |" M% J: y
printk("temp=%x\n",temp);
" c( ]/ N X+ {/ a8 B' k" m' c% Q //SRGR Register
- w& ]0 ~ ^# R! H; g //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
/ s$ m# P! U$ \9 m3 E; p0 k" I* U //temp = 0x301F000B;
j$ U/ P* J/ h/ C3 |( S writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 t0 F8 o/ J9 m6 D
temp = readl(IO_ADDRESS(SRGR_ADDR));
& B3 n9 u( P+ _+ s5 J printk("temp=%x\n",temp);4 S) }/ Z- j3 V) I. i8 \9 T
//RCR
( h) m' u G9 [, u6 w! F //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
# p3 L6 [+ w: `* v1 o/ h //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 _6 M" h9 i5 H9 J6 z- h! [. j( c" P temp = 0x00440040;7 f- I8 ?4 B; a
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 Z. i9 G- W3 m4 X+ x2 R( Q
temp = readl(IO_ADDRESS(RCR_ADDR));
5 {% H/ f. \0 G Z9 S3 m printk("temp=%x\n",temp);5 R$ P' f# V' p2 a8 n* n8 _* m3 x
//XCR
8 B+ d" l! U2 K' V //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1. i5 O0 d; ]( ?" S+ S
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 ~. ^2 W: p8 y temp = 0x00440040;" s2 B k' J7 T8 F$ J6 q/ z
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. R9 R* R2 b) Y$ _+ w' f temp = readl(IO_ADDRESS(XCR_ADDR));3 i* }& R+ E7 I1 X. Y: Q$ n$ ]
printk("temp=%x\n",temp);
- r- g9 c2 U! |9 Y1 Y udelay(100);
' l# p0 z) }" \# i2 @ //SPCR Register4 `& X$ t ^% z( Z% R" t8 G. Z" x
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 O% c3 I% z6 `" `" e
temp = 0x03C10001; //DLB = 0 VS DLB = 1
f' x9 I- t7 M" s- ~7 t- E writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled- T2 B6 v% @" s" v
temp = readl(IO_ADDRESS(SPCR_ADDR));' ~4 @8 M( T, Q
printk("temp=%x\n",temp);$ r+ n/ n/ u; T6 b! ^
udelay(100);
; I# P) u: X/ R' |0 N7 Q4 p$ A6 N. @, T
//set GPIO direction& B6 Q5 p& C) e/ a
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" Q0 a3 \7 z/ g3 Z5 n( q temp = temp | 0x00000100;//EPR----input- i; m! U; d* D% j1 q: k
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output Z& v4 n5 |% l1 ?3 x+ z. R
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
: Y( P! ~8 R$ q0 D4 @8 @# e
) T( h! }% V& Q4 I4 R+ C; Z# | return 0;0 y) J6 g0 o5 q* P8 T: `& K
}& l) I) ^3 H# g1 _$ h* ^
static void __exit MCBSP_exit(void)& d5 [8 a- @3 `- s$ Y
{4 e2 ?+ j0 x* B' m
printk("mcbsp chrdev exit!\n");
3 S! ^& D1 F9 Q& G; Q' j cdev_del(mcbsp_cdev);8 V6 |# s* [( M9 J1 [
unregister_chrdev_region(mcbsp_dev,count);
( ]+ {1 x& t% i d& _! L% M device_destroy(mcbsp_class,mcbsp_dev);
. ?7 [. p" ~: q- e- N class_destroy(mcbsp_class);
0 @3 n. D& N/ f8 V6 t} D. D* R$ P) G: f2 ^2 N5 A
module_init(MCBSP_init);
+ y& N% q1 t) Y$ Z0 \. hmodule_exit(MCBSP_exit);! f0 G' Y) K+ l3 g) }
7 w* v! y8 b a0 B1 M1 `: c/ `1 l
MODULE_LICENSE("GPL");, p6 [) j! U* ^5 ~
$ P: d+ H/ z' R- x& b我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。% i, V% R2 ^: L+ h
我的应用层的测试程序如下
1 t0 W' ^4 Z7 K1 U8 O" r* J# @#include <stdio.h>
& j) x" V% |+ h( U#include <string.h>6 D" a3 o" {! o" J6 _3 u+ p$ Q9 H' M
#include <fcntl.h> B1 u7 a! n- g
#include <unistd.h>
- X' S, X/ I Y# Y4 n O+ b#include <signal.h>
8 {* r' U7 q/ b#include <pthread.h> //线程: {* h1 H( C& R: {( a, O" {2 n1 `
#include <stdlib.h>/ Y" {9 I% t- @( B" Z+ q
#include <pcap.h> //捕获网口数据
8 n$ C! K$ H: m) b, t' P7 }! c- E#include <semaphore.h> //信号
- E' j8 f; H9 y5 q' |0 o#include <sys/types.h> //消息对列
2 v5 n* H# s. }6 w d- c#include <sys/ipc.h> //消息队列/ K8 r7 z7 \2 f
#include <sys/msg.h> //消息队列! l0 {+ f/ r! S8 l& A8 A
#include <sys/select.h>
: \# o1 b% `7 A) `! R+ f#include <sys/syscall.h>
: l" _' m q0 u4 C. t#include <sys/stat.h>
; a0 V( l9 f% O6 g8 Z$ o#include <sys/mman.h>
9 ]" I, `8 Y1 U! o#define msleep(x) usleep(1000*x)
# ?3 ]) R; E* l) y2 w
i/ w# \. s" X3 T( c7 s: c+ @int main()$ G! J+ F9 ~2 y1 C' T7 _ r" s
{
2 E7 f8 y" `8 c* x //MCBSP,ARM与AMBE2000交互设备2 l2 E* P- S" ?3 F0 H; a
int fd;
j5 y: ?4 X6 J! w( r F2 A. F) ? unsigned short data_write = 0x5555;' I0 d; ]" _# e( F: R+ X
unsigned short data_read = 0x00;$ N. z; _7 t. F+ m: @0 d; H, p
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! b1 _6 ~* d1 P% C$ w$ | // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 Z) p: N8 W" V . ~3 M3 C2 ^' S
if(fd < 0)
0 d) p& } p; ?; h( p {
7 p1 x( H: H* P+ c! e perror("open failed\n");
6 K/ o8 P. e3 j+ V- l3 T return -1;, m/ e/ J! X) ^7 j+ s, z; M
}" K7 Q7 q/ h5 w" _# Q8 ]
k0 j3 q6 @# N1 w while(1)
+ j0 e+ e9 ~9 k& u" c {
4 G/ y) ]& X a9 Z9 l9 u2 c, q
; e* v; i& u; H6 g/ m //AMBE2000每次读写是24个字为一帧
* t! K9 }$ }5 S //写数据时将数据在底层存储起来,等到中断的时候再发送) c1 T( }& W0 V1 ~9 x/ h$ O
//AMBE2000输入数据是以0x13EC开头的; w. b$ ?% R+ V! y$ h9 a6 n
write(fd,&data_write,sizeof(unsigned short));8 o( i8 F# F% r
) w: `* N8 V2 i' X- o8 O //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) j% ~) `" m) E2 h read(fd,&data_read,sizeof(unsigned short));% R: F: b, S( i
" Q" s# T9 t' l( f6 _ if(data_read == 0x13Ec)0 c5 [1 z9 K- e' I" @8 T! {& h
{* `- w' n, I' [* P
c, Q5 \) o3 Q d# J
printf("data_read = %x\n",data_read);
. O u) x3 `+ Q1 a. _& r# i4 @ }
7 W: g4 s# |. z & \9 f0 \) d$ ?# O/ U7 o( L
msleep(10);
[, V7 F% k; ^# A8 _
& c5 @! k3 [1 Y# S5 { /*
- z( o( A3 r0 g% _# [. k ioctl(fd,1);
% B; t- R) u8 M sleep(1);
3 k- A* N2 |; D2 J+ o( F+ f# ]0 \" C ioctl(fd,0);
. ?" ?* M0 f& b/ v sleep(1);
- m6 J" U* x1 y" j2 R */ " v: r7 O' h: [3 G+ U( e9 ^
}
8 N4 k3 K7 m Q return 0;
4 b; s1 J6 k0 \: N9 a# B& P; J 3 j G9 ?% R) U
}
1 }) [0 n1 n( q- a4 M/ U/ H+ \0 s' X J; ~, `. p" X7 C
多谢各位指教,谢谢! 急
, }( G- K9 q/ T+ V
6 B$ q7 D5 V7 N
: t/ z6 K4 @$ F. l: H2 u
* X# b' o, R0 v* c+ F# G) o/ B
* o% J/ J, i$ T. U3 G1 r
$ c. b- S0 d4 ^& i1 t# N7 E9 Z |
|