|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- L, k# e) y5 M1 ~; ^1 w9 X/*+ D4 s6 L5 y' n1 x
* Copyright (C) 2009 Texas Instruments Inc4 i6 I3 n5 d. b
*4 I/ Y# \, u2 F: g
* This program is free software; you can redistribute it and/or modify
6 j; ]& r; W ^* [) v * it under the terms of the GNU General Public License as published by
+ `: r t1 A2 I& F4 N: f7 r4 P * the Free Software Foundation; either version 2 of the License, or
m% \) p/ ?/ F0 J * (at your option)any later version.
* f( ~% Q; I9 q" T4 d$ ?+ o+ | *
( o0 Z0 p) B- \ * This program is distributed in the hope that it will be useful,
" \0 \8 Q" ?8 Z4 U( W * but WITHOUT ANY WARRANTY; without even the implied warranty of
! B N; j7 X/ A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 c0 Y( U# }8 |; e. @+ }/ h' v
* GNU General Public License for more details., G$ q; F3 E( I2 _: [- \
* c% l7 L. q a1 u, A9 Z% y
* You should have received a copy of the GNU General Public License H3 ]( k: h! I- M9 p
* along with this program; if not, write to the Free Software; `( L- N& c! y* ^
* Foundati+ H3 \+ d( h' V; q
*/1 K& v. r+ d+ i, n
#include <linux/module.h>4 V `8 }! I6 ~" K. S5 @- a1 {
#include <linux/init.h>
, Y4 {- W* N7 H; I#include <linux/errno.h>
# {! H7 z. ^. c* n o4 }; f#include <linux/types.h>
/ e# a4 J% Z$ w1 j; a/ x#include <linux/interrupt.h>
( _* Q: ]- w2 ]#include <linux/io.h>8 a. W. I, ~# u6 Z; Q
#include <linux/sysctl.h>
& v+ [) Z+ |2 j6 _% Z4 S8 _#include <linux/mm.h>
0 Z. h+ e* b; P( I. u" X1 b#include <linux/delay.h>
6 r" f! s2 p+ i#include<linux/kernel.h>
: C( G" w( ]0 M8 ]#include<linux/fs.h>8 m( n, f6 W* b3 S: H; y
#include<linux/ioctl.h>
: N+ S6 A) M! j#include<linux/cdev.h>1 h6 S. w" q* E+ _
#include<linux/kdev_t.h># P# B4 V" m6 q! ?# s6 f) r
#include<linux/gpio.h>% K3 W) I4 w6 a7 @" z
#include <mach/hardware.h>
0 |4 h, [: ?, L4 Y$ w$ R#include <mach/irqs.h>5 H$ z* p- T) G7 t: u' H
$ p9 w5 s3 }$ I# O. [& P#include <asm/mach-types.h> }! ^. i: U6 e
#include <asm/mach/arch.h>$ M X. y c$ V) }4 b# T
#include <mach/da8xx.h>
6 i3 ]- ~$ ~1 ]- {2 q S#define SYSCFG_BASE 0x01c14000
% |5 N0 [* g6 G#define PINMUX1_OFFSET 0x124
- @3 I, I4 s& l. A#define PINMUX18_OFFSET 0x168 3 `; r2 s/ O% D( t3 [
#define PINMUX19_OFFSET 0x16c
# M3 `- I6 q) g; H) g9 \' X) Y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
\% h( S" W' K3 y#define RCR_ADDR 0x01D1100C //MCBSP1_RCR+ s+ i9 {3 s- P4 B
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR3 t' Y: d: g! P: r$ q) _
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR( Y% ?# t" `4 }4 k5 O' v3 R5 Y
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR0 p# W8 s7 P4 {6 R
5 G& g" o3 l5 t1 t& |7 `
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR% @3 S0 N1 s1 I4 q- _
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR% D4 y9 k4 X; o! N# s3 f: c" J3 v1 Y' W
//PSC$ X( M- x8 n; ]+ ]
#define PTCMD_ADDR 0x01E27120
5 I( A; [! A8 z8 T9 t7 c) c#define MDCTL15_ADDR 0x01E27A3C
& _/ j+ E! Z- t) C6 F#define PDCTL1_ADDR 0x01E273048 t9 i1 A8 Z4 ^$ [3 _
//GPIO8 direction
4 n5 Z6 ?/ w5 B8 H, ?2 w#define GPIO8_DIRECT 0x01E260B0
/ @$ \ L* G" l: b0 T! k#define GPIO8_OUT 0x01E260B4! q* R e8 t7 J: D, ^3 A3 g
#define GPIO8_IN 0x01E260C0
0 i8 ^4 V/ s5 h
' w) Q& K; y7 c$ N! r6 I0 l//#define MCBSP1_RINT 99 2 `/ _! }8 y/ z" e
//#define MCBSP1_XINT 100
! j( Z+ }; F( V, J& L. c5 cstatic int MCBSP_MAJOR=239;
L* {* ?5 N: Q! o% L% `4 hstatic int MCBSP_MINOR=0;
$ g6 Y! T. D# d& n6 T& o8 pstatic int count =1;
- H. Z# ?8 y, f( Q. Y; `) L a# }1 u) y( Y1 s
#define MCBSP_NAME "MCBSP-device"( i* w W$ k3 h/ V8 |2 m& ?9 Y
8 g: G1 q# o& M) q% R6 |static struct cdev *mcbsp_cdev;0 a* J1 d* O4 _ K7 f4 n; Z- D
static struct class *mcbsp_class;
; s1 k; c' a- j' `' @static dev_t mcbsp_dev;+ a U6 \; x! k2 h# G8 v( i" i8 @
unsigned int DRR_data;1 n: L0 J% L, `# j4 a! N* q2 r
unsigned int DXR_data;
/ U7 p0 f9 B1 m. g9 z3 D1 v1 I8 Zstatic int mcbsp_open(struct inode *inode,struct file *file), V' m' M4 k$ K d& h
{; r3 D3 g0 O0 G$ I) q7 U
" L% W; @$ k9 e
//interrupt enable,initialized0 A+ Y6 N: q9 O! q
unsigned int temp;7 e) v1 X6 w) I7 @. z
//SLEEP_EN(GPIO8[10])---04 U, F) j j4 C; u3 r3 g; @
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! x. u; k$ Y, l3 @- z& c. ]1 E temp=temp&(~0x00000400);
; v. _0 z, I# E$ D __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 R. h: q. u9 u* i //RESETn(GPIO8[8])----0----1
U& f: `: f9 D5 j& c- g/ N1 x5 i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 p% w. A" B; d3 q9 B5 i, _0 v
temp=temp&(~0x00000100);
# h& o6 |/ G* W1 r) d# l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
) @1 f; R! J4 s% b8 o. i udelay(100);
5 ]- ?" S; u7 l: H, |6 a0 C temp=temp| 0x00000100;
/ ]8 `* |! P* o% l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; t# |! N: }' |5 b udelay(100);
& Y( L5 X# e, [5 L printk("open success!\n");
7 a. p% {6 H! K" X H return 0;
5 L; E2 Y% @4 T$ o: ?3 b2 m}2 G" n+ i) {8 Z4 ]: ~
2 K9 h, F3 x, h& q, i& m. w
static int mcbsp_release(struct inode *inode,struct file *file)
* p% x1 q0 h( O" O6 t{/ d: t. q( d8 ?4 q! G, [ G1 ]
printk("release success!\n");
# S9 B- [- Q3 w- o- h return 0;$ }. r5 H# `: f
}. p8 n) d% d, Z
) F) ~+ n/ r' h$ m# h4 s& q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- Q8 v; f) s/ A" E C7 ?% B7 k \. ?{
2 G1 Q$ s) Y( E" W& U# n: C copy_from_user(&DXR_data,buf,len);# ~ v: o1 D- H) ^
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
; [# Z2 L; _# ^5 ~& p return 0;
* S& F7 b# T" Y- k) p% j, S; K' W
8 B0 U/ l& z7 v; j1 m}# d& K8 c3 \0 k# n7 {& ~
1 Q6 l: F! ^3 g: F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" X/ J/ A, j* z, _) g" e{ ) p8 W: U2 Y. f/ L; H& z
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 F& y, S+ @1 Q( r6 g7 l( s copy_to_user(buf,&DRR_data,len); : R2 F/ p8 o; H6 r7 U. g
return 0;: k) {) P- p3 A2 t- z2 o0 a
}- t; m& U/ h$ {( w' x9 \
' C3 }. u m! _
. Q& t- e G$ D! e) k& V: x' W: V3 Wstatic struct file_operations mcbsp_fops=2 ]8 R% R: k* F' `
{
R: X6 u, i3 w: y .owner=THIS_MODULE,6 w& P; ^# P8 H* Z: k
.open=mcbsp_open,
3 P$ N( @! v% c: d5 w0 u .release=mcbsp_release,) l; _4 `% x" I; g6 m0 b
.write=mcbsp_write,
; W( K1 o; k5 C0 s- O- g- K0 @% R .read=mcbsp_read,
1 v3 ] o& `7 ?/ b: _};: t, }) Q3 c w$ L
static int __init MCBSP_init(void)
3 R, M9 I4 R R0 j0 ~/ g{. z% s5 c' t/ {4 K
int ret;
, K; i5 @! b. o unsigned int PINMUX1_REG_old;
+ E/ i( v3 W- j4 b" @& H unsigned int PINMUX18_REG_old;0 p! ^: t: E& p0 ~2 _
unsigned int PINMUX19_REG_old;3 b1 l7 Z( `5 O# n3 a
unsigned int temp; 1 U8 l8 l9 X6 T
if(MCBSP_MAJOR)
: A4 v4 _$ J- a. J {
3 A! A0 }( G0 S( |2 y mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- v1 W/ O2 j# X3 N6 m7 L ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 g4 G V6 D7 D1 f
}
) m9 I+ b" {0 ?3 g: J else; i$ N1 |' R. y
{# n2 P* b5 \) ~. S( n4 R
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( D; J6 [* V* z# O
MCBSP_MAJOR=MAJOR(mcbsp_dev);. D$ [( l$ D2 {" g# N3 @
}
) V1 A: o7 s. `* w4 ] / c r5 ~3 c) o
if(ret<0)1 _( d+ k2 j' p# B8 P2 P; E
{5 _ }3 j4 P/ c a
printk(KERN_ERR "register chrdev fail!");
$ |6 ]# |, |3 _0 E return -1;& e1 x8 [ P" a) s+ M1 m
}
2 Q( d* S9 n# z# J% j) a! q ( \5 j) R) A8 f9 p( z, T$ B
mcbsp_cdev=cdev_alloc();
+ ~9 j& [9 w- N' H/ n2 ~
2 T6 b' u( B6 H if(mcbsp_cdev!=NULL)
7 T% P4 ?1 \) z2 |/ c! E {" _/ N: H8 w4 f# W) Q3 [; R' A
cdev_init(mcbsp_cdev,&mcbsp_fops);
. a' Q9 f; M) e2 E/ j5 A mcbsp_cdev->ops=&mcbsp_fops;
/ H5 b) k* S* ?8 E( g( z% v mcbsp_cdev->owner=THIS_MODULE;' ?5 y. f* c- i( y8 ^" l
9 Y; o0 L: Z5 ?1 J# j if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( j) Q% p% t+ g7 [; T8 j
printk(KERN_ERR "register cdev fail!");
! x6 x2 u, t, {8 W' Y. F+ S else
1 d: B V. t9 p8 r+ j9 P+ l& j7 v printk(KERN_ERR "register success!\n");+ k/ u' N! i7 q3 G/ i
}# F" i8 b C Z
else/ k2 C) h7 y2 V) |3 N- `
{
, K, k4 B$ }) y printk(KERN_ERR "register cdev err!");) }2 J, [% ]$ ~3 p8 d
return -1;' ^+ D. [" b% X! F+ {0 h: _6 p, x
}; C% n) }+ {- `
+ L; l+ I( ?3 ]* U! S9 ^& v+ f
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
! }# w* k W w# ]: A$ f/ s4 d. A if(IS_ERR(mcbsp_class))
( E4 `$ s; Y* f: N! U( ~ {
# e1 E' j! e, B- O* A3 e- i printk(KERN_ERR "register class err!");! t( B! b! g0 i6 x
return -1;
9 C% l; `: J* `9 i3 @) X. }( }4 m }2 k% n9 h9 M& f3 G/ c( {3 m
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 K8 t! c( G3 K3 J8 v7 }
: a- P8 i0 a x4 B4 T8 I //PSC
* _4 v$ v; V: X# p //add Enable MCBSP5 j2 T+ {& G1 j, e; ^
//test: t3 k. \5 |* { i, m- N) ?
temp = 0x80000003;& @: h- L& ?$ Z
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 g& j) J% D& H8 f4 y N) p5 @ temp = 0x00000003;
3 M4 X/ v0 ?. z/ k& n& r writel(temp, IO_ADDRESS(PTCMD_ADDR));4 @" v1 A* l. q8 k
1 o5 c' O. o% Z3 U6 |5 N9 N
temp = 0x001FF201;
7 @9 u/ ~9 j [ writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 g- X0 w7 |6 H) O" u- F3 g% ?
9 u! G& K, S" Z& n0 Z1 s //PINMUX ! E+ x/ ^9 P5 |+ f# f* e& E5 g) [
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" C0 y3 k- O+ C v5 b# A4 @ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, c# i- e& L. S6 y5 E% K PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! N+ s) k" m' ]% b8 T2 D# {: p writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# G! W( E$ q# t7 N% D' E
2 i) {3 @# z. J( e% M //SLEEP_EN,EPR,L138_SHK1,L138_RC" Y, p" M7 I2 l$ k I
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 k( S; W: M2 h" _) O, ]9 p
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
8 T. y# W5 m) o0 x2 L9 o writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( ~5 O" Z; k2 R; L- Q
* }( D; B' S7 e& G. [
//RESETn,L138_SHK2. c0 _( U) T5 H) x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - e2 B! t: R6 Y
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ U/ d% f+ d0 y" v. S
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 E5 G4 n4 f0 s4 D 3 w' J0 u5 q$ Q$ Z% D- a& }+ g- H
# f0 {$ }5 a6 O" |! G' E4 P
//SPCR Register: _% [! }$ J3 b, [
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; z6 o& L6 r' A
temp = 0x03000000;//(DLB=0)& ^3 D, F) X0 z3 v' R
// temp = 0x03008000;//(DLB=1)" L- J& z. l n! k
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* |' Q8 _8 J2 c# L5 w temp = readl(IO_ADDRESS(SPCR_ADDR));8 V! A% D$ Q; Z- w2 ~; F. y( p8 E
printk("temp=%x\n",temp);
0 w2 R- g2 E/ ~5 L, Y
0 q0 ~. k0 W7 S& ]' h! z //PCR Register
* ?4 ^1 ^0 |% Y+ k //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0" G" Y7 `9 X& T* O% k# R
// temp = 0x00000F0F; u* c9 Q$ ?) }* s) r0 K% u
temp = 0x00000B0F;2 `1 j2 a5 }" x# k! z) n& q* a
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
9 [/ T$ F; N$ G7 v/ v temp = readl(IO_ADDRESS(PCR_ADDR));& ~- h$ D$ v5 ?) S6 s6 b2 i8 w4 b
printk("temp=%x\n",temp); . l e N. S: M
//SRGR Register
6 e @, ?; L9 J( q* k/ h //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 {6 u# _/ Y6 t
//temp = 0x301F000B;
7 U. u( E) p% C3 |$ i writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 6 R; S$ z! ?- X6 K
temp = readl(IO_ADDRESS(SRGR_ADDR));$ }, |, f& G2 j
printk("temp=%x\n",temp);
( o1 F5 s2 l5 R; _ //RCR* ?( m5 J: p+ K( @- i2 E
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" v) d- z6 f5 p# n- T* W4 d' } //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ t1 H6 d) K) H: T7 q& g! W* r6 X temp = 0x00440040; e5 ]2 b1 W. V2 X0 E% ?( q
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
+ {) o0 g, ^7 e' h8 M temp = readl(IO_ADDRESS(RCR_ADDR));
4 d' M( [- y# b1 ? printk("temp=%x\n",temp);
1 M8 V M s9 g //XCR
4 l' [) Y1 f8 Z3 J- s' p //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 {, Q, k6 ~' C, C9 o" ]+ x( A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ `0 Y7 L# ^4 I temp = 0x00440040;) @3 v& B2 o; }" n$ b
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 @& V1 f: `; ?: I9 n$ O7 f. r. m temp = readl(IO_ADDRESS(XCR_ADDR));) d+ t& s& g. _* s% }
printk("temp=%x\n",temp);; p. m+ x5 D# e
udelay(100);
6 P3 M" ^) m- O9 r l //SPCR Register/ u2 D( K9 u1 X$ }' R/ @$ i
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1+ u+ K( F3 ?* T! E" O- M
temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 Z2 C8 R9 C, [) X, V' C4 t1 a writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled) b) l; ]) V+ [8 ^1 l# i+ A9 f8 S
temp = readl(IO_ADDRESS(SPCR_ADDR));- r: x; e1 }5 B/ J( v# y" }6 Q: k
printk("temp=%x\n",temp);
+ J* ]% {% D# \( w, Y' K udelay(100);
" v' Y$ M$ h: U" q( P+ |8 x# W: H. f1 D8 W4 k4 i( }0 m
//set GPIO direction% A. Z0 W$ U1 F, `' v4 ?
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; v- g2 G- Y, m
temp = temp | 0x00000100;//EPR----input
1 R) n# U4 n5 L9 {5 a; R8 Q/ P temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 G/ A- t0 u1 P, }+ A/ |% ` __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 a& R- I6 k; U% M2 a! n
! i- {% T1 I6 R5 \4 Q" ?2 @ return 0;
& I+ r. f9 s/ w7 S# k}
3 {# \( T. V4 m3 `static void __exit MCBSP_exit(void)" W0 ^4 h7 c9 W8 U
{6 y. k: _, }$ f$ u* f
printk("mcbsp chrdev exit!\n");& o) x6 c/ s# t5 g
cdev_del(mcbsp_cdev);' m' S" ]1 f% @3 D0 n
unregister_chrdev_region(mcbsp_dev,count);1 G* M \: y' f+ a
device_destroy(mcbsp_class,mcbsp_dev);
: _; \+ i& _2 Y0 n class_destroy(mcbsp_class);& Z3 l' L/ J& v5 \% r& c* h$ W+ l
}& |1 X* B. \) I# E) y2 P. b
module_init(MCBSP_init);
3 P0 m3 y; U0 B8 b: O, ]; ymodule_exit(MCBSP_exit);
% C, }8 D* F& _$ Z* |: G8 y( `) V
0 W2 d' e9 A4 N! J& @7 S9 sMODULE_LICENSE("GPL");+ i( }4 _5 A/ `2 Z9 `
0 e L3 L' V/ u( `: O
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ S9 o: M( v% j8 y3 Y
我的应用层的测试程序如下
$ s: g% q7 ?. K4 B8 z3 ]! g1 j#include <stdio.h>
5 ?% F3 W0 q# g( i/ [8 h#include <string.h>
( {9 \/ s, d. P1 J1 x& l# U/ J/ U( s#include <fcntl.h>
+ s" Q1 B5 w- l2 T4 n o$ u+ ^6 j5 Q#include <unistd.h>
: |# y" g8 v5 C3 I1 Y#include <signal.h> j# D* S! o* l) J. I, ?! Q
#include <pthread.h> //线程
0 H; ]# J% L& I! w- w. y/ k#include <stdlib.h>7 C+ N+ ~; `! A6 ^! `+ c
#include <pcap.h> //捕获网口数据' y1 O5 A0 r! w; W
#include <semaphore.h> //信号5 k" O* u( L2 g
#include <sys/types.h> //消息对列6 f( v8 i; y% f1 M- [# m" ^
#include <sys/ipc.h> //消息队列
+ f# [" D' D( g! u, R1 `9 P#include <sys/msg.h> //消息队列
! E2 [; j, q9 V5 W8 R#include <sys/select.h>
7 j! s! y9 w- K% N" J1 \" ~#include <sys/syscall.h>4 J8 }2 w* \, P
#include <sys/stat.h>) c5 ^) D7 ~3 p% G( g" [. g
#include <sys/mman.h>$ r' O% f1 i7 L- {, F
#define msleep(x) usleep(1000*x)
2 d) m% L0 R ?
1 s G$ w6 ^) t# [int main()
) {7 _. K% G4 @% E+ N- u{
+ l, Z/ U y- V9 K+ w: b //MCBSP,ARM与AMBE2000交互设备
, J2 D! {1 ?: _& N& A C/ D int fd;" r# E5 p* e7 ^$ ~' D2 L
unsigned short data_write = 0x5555;
5 o2 ~; X. d% A! g unsigned short data_read = 0x00;3 X F& j" c5 X' O
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, H5 w' S$ Z5 W7 ? // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( |. K! Z0 V- J$ i8 l
! l9 }) R7 |$ A' l) Y. U if(fd < 0)
4 }0 ~* D2 v% L, i! y {
9 G% `; Y; X1 \) C) g9 ]/ {: o perror("open failed\n");) X0 b3 B9 |- W: A% y* z
return -1;0 M: ~( r- l9 W: Q
}
: I5 b$ G+ W4 V' _+ J5 R 5 ^3 u( _6 L. I" t0 k* y7 \9 D2 H
while(1)
% Y* @ u8 T& E0 w- k1 ^ {
" a# U. Z6 h* \! C! {5 [
. H v. F1 `6 W% T, z- e2 G //AMBE2000每次读写是24个字为一帧/ e, K' @6 A1 t$ u+ _- [
//写数据时将数据在底层存储起来,等到中断的时候再发送
; d/ i, n1 [* b0 H( b7 V //AMBE2000输入数据是以0x13EC开头的
* S) v4 y% e) Y; f& n" e; O% G% `1 e write(fd,&data_write,sizeof(unsigned short));
! A$ ?7 k% C n- p( c + j' g7 A7 _1 t" p& D/ T4 N$ P5 E
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ ~0 y# }) o6 s% }: K
read(fd,&data_read,sizeof(unsigned short));. V6 [0 J- W, y, R
/ C# ?6 r& S9 O: F
if(data_read == 0x13Ec)5 S* ~ B% y$ i8 D" H
{$ o, Z6 G' w2 |9 L6 Z1 n/ p, s: j
! \$ U" ^, Q; S5 o printf("data_read = %x\n",data_read);
9 i: x7 X% ]: h \ }
$ q3 `1 Y- D5 [7 V" J/ h
- n( g2 y6 ?5 U' N msleep(10);7 `/ r3 |* J( S
' z( I U3 U3 X3 H7 I$ s' B
/*
. N j1 _, t5 K O. `8 C ioctl(fd,1);
# w D& j3 M+ }# |7 e" V6 {( c sleep(1);& R- m% _3 q. b: C
ioctl(fd,0);, d& ~: |; Y0 ?- T" l1 X3 H3 P
sleep(1);
9 g% @5 w% X" u" E7 n: q */
- u' [: G+ @( h1 }6 M( v } 0 V' M, I5 Y( Y
return 0;
# G/ [+ }5 x F/ Y
& |* [* z! G/ h& ^}
) E4 E# c% S) ]" l* H& {( |; [* \4 f! \; p7 d
多谢各位指教,谢谢! 急. B$ n! r5 s( @- I% ]4 i
8 ?8 A+ p9 c' w; V- T! ]
6 n$ E3 o$ T# G" u h6 v z9 |; M" f$ w
7 Z2 F |5 k: }, t) h2 u1 q. A; N; `
+ C2 ~1 l6 `% N2 y6 `$ O& D
|
|