|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * H+ I* e5 q! Q/ B% |8 F
/*
8 m: a+ w; Z2 G9 d+ E * Copyright (C) 2009 Texas Instruments Inc
6 L$ J X6 G# Q8 y8 M0 ?8 j& R *- Z0 A. W, G* e5 S- \$ ]& V/ r
* This program is free software; you can redistribute it and/or modify
6 }# d; V( [8 y3 \ f * it under the terms of the GNU General Public License as published by9 l! m& a: y4 d, R! e6 a
* the Free Software Foundation; either version 2 of the License, or
( W" ?' ~% A, g * (at your option)any later version.
7 O7 o% X0 b# G% ^& a# x *# x# a+ B1 ^2 C6 [) {% |
* This program is distributed in the hope that it will be useful,
2 o6 g+ a5 k2 O* D' Y * but WITHOUT ANY WARRANTY; without even the implied warranty of+ f# P+ \5 p6 C( n# o s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 E" Q; m7 y- J+ x' Z% I * GNU General Public License for more details.
# X5 V5 i/ ~( H *
5 R, u9 y6 H/ m9 h; X4 f * You should have received a copy of the GNU General Public License. ]; v6 E8 F* T0 h$ A0 \
* along with this program; if not, write to the Free Software
6 N0 }3 p% K& f- O! M) t * Foundati+ Y% Q. ~2 Q/ Q3 r
*// l; f& r+ g8 R6 a1 u1 v Q* [5 ]
#include <linux/module.h>& o% ~8 m2 m7 v+ D+ x1 N" P
#include <linux/init.h>) l, B, t! D/ ]( r, u
#include <linux/errno.h>" D( z" u$ _/ Y" }" V
#include <linux/types.h>4 o# d* c' d# }) Z/ [$ \) }& b
#include <linux/interrupt.h>
! K& ]6 ~' }. _#include <linux/io.h>
4 p* h6 P) _0 j( F7 Z6 g3 [#include <linux/sysctl.h>% j% y8 `# N9 d S1 T; E/ v
#include <linux/mm.h>
: u0 ?5 ~& ^* A. t, g7 t* D0 d#include <linux/delay.h>
- ]6 p( ~6 r: l I# x8 b#include<linux/kernel.h>+ E$ e7 ]1 { ^4 h
#include<linux/fs.h>2 N3 D* ]* y- p$ J" T2 i
#include<linux/ioctl.h> j) r; j" {- I0 P
#include<linux/cdev.h>' l; @. y/ O) D2 j% b# m
#include<linux/kdev_t.h>
% s6 L7 u q- L; h#include<linux/gpio.h>
& h5 t# u8 |, f: W, r( }#include <mach/hardware.h>6 m/ }" S# p7 h7 X6 X
#include <mach/irqs.h>+ n1 G& Q* w# a6 T+ i
V0 y' u) R* K8 @& B7 C# f
#include <asm/mach-types.h>+ X# x Q/ Z, l! E
#include <asm/mach/arch.h>8 ?: K# a L5 N9 D
#include <mach/da8xx.h> N5 V0 }8 U+ ]. O1 M
#define SYSCFG_BASE 0x01c140001 n7 w4 k6 P. L2 A6 }- }
#define PINMUX1_OFFSET 0x124
9 k) G+ U$ V8 ]8 L4 f( Q! n#define PINMUX18_OFFSET 0x168 ) [6 O% F- D$ k1 u0 w( v
#define PINMUX19_OFFSET 0x16c9 c# @0 S% E- e% U3 N
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 T; y' q8 ^* ?5 y/ t
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
' p4 p( N) j1 n#define XCR_ADDR 0x01D11010 //MCBSP1_XCR- @9 a+ y ^/ O# u* Q3 X
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
) j6 {5 Z) s7 M#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
$ I5 r) A! E, ^) ?! k ; v, {& i4 j* ~% b5 Q: N# K+ c
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
3 @% n6 e- x- }! q1 _#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
9 ~2 v7 S( W' X) N% Q//PSC
@* X; U3 A0 h- h#define PTCMD_ADDR 0x01E27120 / A: O( ?+ j3 m
#define MDCTL15_ADDR 0x01E27A3C
3 j2 Z1 b ?- ^& u1 A#define PDCTL1_ADDR 0x01E27304
6 ~; F8 L+ Y2 ~# C6 |//GPIO8 direction: p& a1 M/ y0 w9 N
#define GPIO8_DIRECT 0x01E260B0) ~& P( ]; i5 O) k
#define GPIO8_OUT 0x01E260B4
8 v3 z2 s4 h5 u7 c5 ?3 l8 t#define GPIO8_IN 0x01E260C0
, g: G# F" [/ r6 ~7 w% ^
; u% |( C1 H( E* m9 i y( l3 ?//#define MCBSP1_RINT 99 ; \7 r: U5 P/ \, Y. ]; O0 O
//#define MCBSP1_XINT 100
0 R4 z+ Y1 b1 J' E2 ostatic int MCBSP_MAJOR=239;
+ V# @) @; }0 ~, lstatic int MCBSP_MINOR=0;" L4 U$ \5 I5 Y7 ]3 b7 ]' Z
static int count =1;
, y: i" M8 C8 Y/ q9 a+ n8 P6 P0 m, a' |
#define MCBSP_NAME "MCBSP-device" g7 a& \ q- h" E# g8 w
) d+ _! g% g; {7 u6 X6 Qstatic struct cdev *mcbsp_cdev;" W4 n3 g2 d3 B9 s
static struct class *mcbsp_class;* i+ ]% R/ x C
static dev_t mcbsp_dev;+ \2 H5 [8 C* \; M0 z8 W# u( b5 @
unsigned int DRR_data;! {3 c- ?: l) T9 E5 b
unsigned int DXR_data;
$ c( x( Q$ O+ \; T' L6 lstatic int mcbsp_open(struct inode *inode,struct file *file)* s; w. b o( Y7 [1 g2 r
{' m; G! i# K3 N, v
, C" I# {9 d) X4 ], v% R //interrupt enable,initialized
5 r5 w) S' R9 s" M unsigned int temp;
5 n1 Y$ J. I( |$ L+ H% I //SLEEP_EN(GPIO8[10])---07 j0 F8 b4 x5 v; F7 B% t
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' n- D0 {4 k, E$ p4 R temp=temp&(~0x00000400);2 J" ^: H# ]: \ h
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 N* f1 I, q7 G5 i5 C //RESETn(GPIO8[8])----0----1
+ V" o7 W$ s% \* w9 h8 P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
]; [. g- G( F" h Z temp=temp&(~0x00000100);
3 }1 Q, O% A0 E" q) C0 }7 M0 @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---04 V L: b9 h6 g! O2 H A
udelay(100);
. ]8 u+ q. P% u% | temp=temp| 0x00000100;
" Y6 ]8 Q" V9 [( p6 ^3 T0 X, l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& u8 }2 o% r7 C& w! w, g7 ~" j udelay(100);
7 y8 F5 J1 f8 m7 K& H$ a printk("open success!\n");3 O, s* D7 C6 M! D' j. \
return 0;
) R4 Y+ E( e+ `) m! o- s) N}0 U+ O. C/ s8 n) I- g$ D
3 f7 K5 M7 h! G* B- _0 dstatic int mcbsp_release(struct inode *inode,struct file *file); l1 w: W4 ~" m! Y5 N
{
2 B1 D6 i' D# ~7 l printk("release success!\n");" y- n: H( u& w
return 0;) q, N: H6 }, x1 \( k8 y
}( v9 o+ m. }/ O
* `* c- J Y3 s" {+ A& pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- V* W, U* G$ f% s{+ {# l: S0 T- e, k
copy_from_user(&DXR_data,buf,len);
6 H5 I# Q2 C0 t% I" f# \ iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# m4 ^9 O% R: F7 K6 U return 0;) G+ ~: E" c' K# k R+ d9 E
8 _' s3 o* w2 K* P}& {" x' d2 }7 j0 u
+ p* a+ Z; M- n M8 j( h3 estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* y+ F1 h0 R% }9 e{
) S9 _% g$ E8 C R L% B DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 |% J2 P$ x, F" n& I; B
copy_to_user(buf,&DRR_data,len); ! U# C" i% ]+ d
return 0;! Y, Z9 M3 K0 {: O3 t6 p8 [
}
7 f. }+ t; L5 A2 m
2 A O) g/ h. Z; h; c3 a5 u2 b8 j/ R1 o2 S) e
static struct file_operations mcbsp_fops=
) O4 S$ B; k" h" y1 J{; M0 Q% F; e* d" b- e8 K `4 o/ D- B
.owner=THIS_MODULE,
8 `, m: C; L1 M$ } .open=mcbsp_open,. r0 N' x* T6 U, ^( ?9 o
.release=mcbsp_release,- S8 \$ \* @0 A, o9 q" F5 U
.write=mcbsp_write,
" @7 m k0 z$ }" @- o. y4 e" T" F .read=mcbsp_read,
& U/ z G9 `! S" @! M- K};
+ A F0 r) @6 @! M2 ustatic int __init MCBSP_init(void)) [2 u! C+ O! _0 Q: G
{
; b$ C4 w* h9 N$ X: e I) a int ret;
" G6 `8 t+ [& j# C9 \/ L unsigned int PINMUX1_REG_old;9 k- [9 P9 ]" e& G: a+ M
unsigned int PINMUX18_REG_old;
9 o( |( }2 k* E' V unsigned int PINMUX19_REG_old;: i! g K5 C9 c- \7 \
unsigned int temp; 1 g. H' K7 {9 ~% @: W
if(MCBSP_MAJOR)
4 I4 g$ ~. j) F; }2 C5 B {
2 k( r! ?1 c( h1 }) `7 a% o! y+ g E mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR); H) u% D/ A$ S
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 D+ i5 `- p1 C: B2 t }
2 e* ? ]- T! m, ~ else7 i! s1 U- b- [$ _' \7 H0 {" M
{- p C4 A7 E( V+ p3 K1 S4 E
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# W& c8 Y3 s- A) J/ z$ F, [3 i MCBSP_MAJOR=MAJOR(mcbsp_dev); X5 X x5 }) J! ?4 ]) c& v4 H2 U! E; Z
}6 H3 u' d! C5 p
4 p+ w7 G7 l* ^5 q' N4 ~3 ^, ` if(ret<0)
* s( Y/ c. [* M9 w4 ` {. `5 `4 G, U" ~" J4 O+ W
printk(KERN_ERR "register chrdev fail!"); F0 T9 P/ k7 A# Z2 m
return -1;
% y' p; y* L; Z( C0 Y' s& g } d2 T; R1 f/ V' R4 @/ @' q) S
U; Q& M# l w' D
mcbsp_cdev=cdev_alloc();
0 D/ X) ?, M2 U9 c: ]2 a' j
B) K% k' L8 T" _1 E0 _ if(mcbsp_cdev!=NULL)) O% B2 W- W h, S
{
7 l; ]* Q! [7 c7 z" `- s- H cdev_init(mcbsp_cdev,&mcbsp_fops);
( g% B H5 `! n7 u2 B mcbsp_cdev->ops=&mcbsp_fops;" V7 N; }6 y# U% x: B
mcbsp_cdev->owner=THIS_MODULE;
8 R6 P6 j* k% [/ c1 m& L/ B! i7 D 4 x5 v! g( S4 C6 ]( i) V4 i) I i6 g
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ a1 i" T, R/ T' ~
printk(KERN_ERR "register cdev fail!");* s4 E7 n! |: d3 |
else
4 }$ s+ E! i4 N' k* x# C) ~& v printk(KERN_ERR "register success!\n");
* ]8 I Y; L" t }
: I2 q2 p5 B5 P/ Q else O& T0 d U p8 W, T
{
6 i+ @' {1 d9 E6 O, ]3 T2 F printk(KERN_ERR "register cdev err!");+ V8 h6 V9 Y3 |) @$ u5 [9 y
return -1;
& M# H/ l I2 [+ P }% G2 `' W' @: e) i1 q: z9 X' J7 }
: A* R- v+ A. f; {! }8 m4 G. |
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" ~$ ~% b3 m- }" X: Z
if(IS_ERR(mcbsp_class))3 c4 |" u* e) C
{
2 V$ I! h- q# T5 }; G8 B/ n* q. g! m printk(KERN_ERR "register class err!");9 n" c4 V6 ?% W9 S
return -1;
5 a: N% O1 C/ a1 D }
+ m; w/ L' I0 L device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, u( R/ ]4 \; l3 x, F
# n2 F, A5 \8 S' V' k //PSC
& p E. t+ a3 Y //add Enable MCBSP
9 K3 z0 P6 ^6 |& g9 e2 p6 a //test4 H/ V9 |. v1 V7 G
temp = 0x80000003;
1 N9 J. v/ [0 M! M" r' f q6 h writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 p" t5 B9 l' G& B! `& Z, k. G temp = 0x00000003;& ]* F* ^) f8 N0 T T
writel(temp, IO_ADDRESS(PTCMD_ADDR));' l0 \( r# |' X5 J3 t
& i1 H; s8 C4 S( U5 ^: V4 B temp = 0x001FF201;
$ t0 ~- T( e, W7 y3 } writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 Y `, b, y4 U4 ~4 I$ N! ^* J# r
7 M- i( N6 ~" D //PINMUX
1 H, r6 v, d: l$ [ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) W1 H7 J1 o" e4 ]2 |& z
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; g3 N; h* {5 Q; p* O4 Y3 Z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ! m" A; @( ?; ]- i
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( B9 D: `! T* p0 B' Y- s& A/ s
2 S) y, G, f3 t q1 u x8 g
//SLEEP_EN,EPR,L138_SHK1,L138_RC
) ?' |( U8 ?) _. f& d" f PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 W) E0 g3 |% ]$ T7 B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ; M W/ X4 S" {/ j% K/ |
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# x d: q0 i# f' V6 N+ J8 o & r- t' O$ f) E' x3 | Z+ d
//RESETn,L138_SHK2" f7 }" X4 x3 x/ o
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; |+ n/ |: z* l+ t' n+ Q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
. ~, L5 x3 h# p' A, W: \ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; @. w; p# X5 l
/ [# X6 G$ {$ V; u* _4 _6 S B0 x ]
8 R2 p+ r0 |' ~7 c //SPCR Register
& ^" y1 f( [% r0 O //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" T, Q. T2 D' v8 a; H- \ temp = 0x03000000;//(DLB=0)% D1 n! d c# k5 N2 @
// temp = 0x03008000;//(DLB=1)) Q5 U. Q' u; r$ F+ u& F& E
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset' d3 j* x5 y5 P8 l2 s$ c" p
temp = readl(IO_ADDRESS(SPCR_ADDR));& g `! E) A s8 p) e" k; J5 f
printk("temp=%x\n",temp);
( n. O7 r: o% Z5 ^4 q
# t& x8 [7 T2 T //PCR Register
$ V5 j6 h$ n. C) s" G //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-01 e9 Y: L' c0 ^" m, ]+ I
// temp = 0x00000F0F;* q8 K& b2 @' K- v& F# V
temp = 0x00000B0F;. L* j( P q. v4 i
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
& T: L' z/ q# q. _$ }1 _# n' N temp = readl(IO_ADDRESS(PCR_ADDR));
6 h% i/ e8 A) M: | printk("temp=%x\n",temp);
- i: _5 O# b% g" e //SRGR Register7 V% O! K/ g3 g! Z# x# p
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ Y: n/ ]0 D4 V7 U9 ^1 D4 r
//temp = 0x301F000B;
( M [' ?" h$ b2 H, a A writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ' C4 ~* E; F6 e1 f4 m
temp = readl(IO_ADDRESS(SRGR_ADDR));' H3 \4 M; u. C4 n
printk("temp=%x\n",temp);
% | I% J7 D* v+ }3 _# ~ //RCR, j/ k. o/ J, D1 A" w& ~; S# Q) C
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 F4 i9 w, f: {) w2 X0 b9 R
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
8 W1 @$ o2 r1 [8 p3 z3 Y temp = 0x00440040;6 \& L+ a0 n( e) `
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( \- J: ^' p' z+ r temp = readl(IO_ADDRESS(RCR_ADDR));
! d* v H+ O6 L" I, L4 `" K8 g printk("temp=%x\n",temp);) r* _( o/ ^6 K+ ^* v
//XCR! P! o- z1 g4 u
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( z8 E- C: l1 |
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
e* @+ X- W2 Q, u9 k: H9 O; Y temp = 0x00440040;8 y; H, d0 l% K; [: N) X; m' V
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; \5 ~ l) j" z8 T4 Z7 L1 G
temp = readl(IO_ADDRESS(XCR_ADDR));
) p. ?! Q3 P7 Y$ R$ @: `) B printk("temp=%x\n",temp);
$ t# c& P8 U6 v- E1 e } udelay(100);
2 P) T1 ~8 T7 d: i! ` //SPCR Register
3 {' \# }3 l2 \9 u( d //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- O" \* o, E. X- g8 J# [/ k temp = 0x03C10001; //DLB = 0 VS DLB = 1 [9 K: Y4 v' D/ s- x& P
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled$ e& ~; l/ ~) ~8 r
temp = readl(IO_ADDRESS(SPCR_ADDR));7 x2 a' S! O$ q" k; s% U, x; l
printk("temp=%x\n",temp);
5 b2 X$ w1 Y# L, U; `* i% @ udelay(100);
" T. u7 Q$ U7 V- }
- H6 y1 f8 Q) P //set GPIO direction
0 R3 X5 j4 s% A; x temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& Q$ b+ P- M& {+ v3 y/ ^+ ~6 i temp = temp | 0x00000100;//EPR----input
: q' c2 [7 w# q( b# r- P9 w temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 @& r* s0 L& _2 {, b" Z& {) @ U __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 M0 p N5 b4 r1 t) T 0 n8 @7 `7 j$ X1 s! p e! Y
return 0;7 w! b" T0 M3 X3 E1 w
}, g$ a$ ^' W+ _3 J% ?2 S# h, X
static void __exit MCBSP_exit(void)
8 Q, q, t: y) m4 q6 `, I{
5 m9 @5 C' f; t# T5 X. D" F( ~ printk("mcbsp chrdev exit!\n");
& X3 C6 F; n( p) P/ D) j7 u cdev_del(mcbsp_cdev);
$ E8 v1 E1 `9 A6 @* H5 y s0 o unregister_chrdev_region(mcbsp_dev,count);; J) E' K2 ?' |# F3 a
device_destroy(mcbsp_class,mcbsp_dev);
# S1 Z, Y' g+ ?( X! c! |$ L$ k' R# j- V class_destroy(mcbsp_class);$ l. G) U* W" H% A4 x3 B' ^! ?" Z
}
7 D8 v! J" ~9 Q- `1 @) K, [7 vmodule_init(MCBSP_init);
+ @# i: J' a/ n6 V0 rmodule_exit(MCBSP_exit);
5 B/ k C( [" ]2 J/ j
7 I6 \ d* t. K7 P% B0 cMODULE_LICENSE("GPL");
/ m3 ~- o2 h& ?0 I& l6 y4 l
3 k, J; `% n% l* D% E9 t我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& i2 C. C) y* I* Z
我的应用层的测试程序如下' }9 l3 p4 S0 V% J8 L/ L; A
#include <stdio.h>
" \2 x3 ]/ C+ H8 m1 E#include <string.h>
Y* Y* r9 J& S$ q9 m: `, u: ?#include <fcntl.h>
- y4 Z1 O! f5 \; Q#include <unistd.h>
0 l( g% N1 @; I2 Z u8 g' n#include <signal.h>
' g2 b. o) F ]- m# T) m#include <pthread.h> //线程4 `& j3 R+ E) ?. K' G8 N9 ?! `
#include <stdlib.h>5 @& z0 B% m7 v3 b% e- H, T9 V
#include <pcap.h> //捕获网口数据
; ~' M% f) o6 \; z z$ {#include <semaphore.h> //信号0 K# U. i$ x3 h* H
#include <sys/types.h> //消息对列
: j5 {& z' w) r% `#include <sys/ipc.h> //消息队列: X% _% b7 ?, g; x
#include <sys/msg.h> //消息队列/ a' L1 i8 ?3 ^- Y% }3 ~# |& u
#include <sys/select.h>
6 W* {$ C9 ^* i" g#include <sys/syscall.h>
+ Y* F- f+ f( Q0 E4 ~( m) N#include <sys/stat.h>
% b& ~: o2 o# p0 B% S- X2 k#include <sys/mman.h>
1 `* G& U, z1 U7 D1 n#define msleep(x) usleep(1000*x)6 e+ w0 E+ X/ ^! L0 f
) z1 ?+ |. S3 |8 v1 D% N' R
int main()8 G8 U8 l! ^6 D6 Z
{
+ @: r# q/ y; \6 i: n //MCBSP,ARM与AMBE2000交互设备
3 M* s X, a$ L' @! e- O! v int fd;% w; r3 D" @5 D( z# |. }! C1 f: x# a
unsigned short data_write = 0x5555;- w4 Y+ H$ M" L' O4 s& {
unsigned short data_read = 0x00;
# k) G/ P6 A4 j, k; ?% D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
- l$ I0 f+ g4 _ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; u$ ^# }2 F& g# u
: D1 s% ~6 n# } C! _1 q+ r if(fd < 0)9 w4 R) Z+ f) ] F0 h
{
$ L: E, q: f; b% G9 h' I: c7 ~ perror("open failed\n");
/ h; ^+ B. @" F; H- x# j return -1;
$ c5 b; G( ?2 ^" h) B7 n }
8 l) a4 G/ _3 i, a
) P+ {" ^+ C* \4 ^8 z while(1)
$ a7 r8 S2 K: |8 [3 r {% r, y5 _4 \4 r3 s6 k% l8 V( H
1 @% o$ I P6 {7 }% i, ~# j //AMBE2000每次读写是24个字为一帧/ S& v/ B; u) c, u- `- k; }
//写数据时将数据在底层存储起来,等到中断的时候再发送
; |6 V1 z2 {$ v& \, k6 `7 Q //AMBE2000输入数据是以0x13EC开头的: Z5 b7 G% U) m5 {9 n! l p
write(fd,&data_write,sizeof(unsigned short));
/ L9 v& N# \. `, M% I# R) @8 N* C + {( \- W) f+ I8 W8 M
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ I0 O% o3 p6 q7 e* t
read(fd,&data_read,sizeof(unsigned short));
! h8 h6 Y" T0 J7 T/ E* V0 @ e( }- v9 q; s! J, U7 | O" }
if(data_read == 0x13Ec)
+ v4 [& z! S1 t6 o2 ~ {( f) F% {0 M4 ]! G+ t
* e" a/ q* o7 Z9 ~; _ printf("data_read = %x\n",data_read);9 X+ { }" _+ _& p5 A9 F! Q
}4 ?$ ?2 M2 |. C+ K
u2 ^+ k0 B+ K4 Z% \
msleep(10);
+ U3 B# N; l+ c& E# H! v# G 3 |2 Y0 t( u6 i, e2 U' ]+ T
/*, n$ d* }4 n: S, ?6 I2 }
ioctl(fd,1); " E3 b/ _4 g, [
sleep(1);: r3 [9 L# L0 d7 M1 r4 S1 A; a, v
ioctl(fd,0);# d+ h4 H/ ~! q& a" r
sleep(1);! u5 q; v2 ]; x% c F) f8 O+ `4 j
*/ 6 F7 \$ Z# L& n
}
# F* M7 @) R3 b0 X4 @& @ return 0;
* l9 J; N& z, ]* Z9 E# j, q% m 7 [" S$ ^; {8 a
}
/ o; n& [9 p' R* ]/ b* Y
8 Q. _ H; q# \7 U2 v! o多谢各位指教,谢谢! 急+ g' k6 q; e A
& P' ~! p& x1 E
! p# K7 T* c. d6 g7 q
, O& T( [! j8 Q! V6 c6 t
% v' p4 K% m( S7 T% W
9 l& a# A" B( S# r; J' t |
|