|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * H/ S& \! h* l5 r/ s1 L8 p
/*0 r1 L- G0 `% I3 v
* Copyright (C) 2009 Texas Instruments Inc
5 `5 {/ e, P+ W *
* r9 q M1 p! P- L5 E9 p+ ` * This program is free software; you can redistribute it and/or modify/ }3 b: k, T9 ]) i
* it under the terms of the GNU General Public License as published by$ X1 Z+ Z/ }' B7 ?" _" ]
* the Free Software Foundation; either version 2 of the License, or
( x, n0 N, d+ ^1 s; Y$ o0 U * (at your option)any later version.
( Y! Z4 f) e/ J *. l* C' f& V, j2 F
* This program is distributed in the hope that it will be useful,1 K L9 Z) g a: Y# f6 Z h" i
* but WITHOUT ANY WARRANTY; without even the implied warranty of
' v. N* H: k8 Q" y( k * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; _7 ~1 T& d( i' Y9 S * GNU General Public License for more details.
$ m$ ^1 Q0 @2 r1 }6 i! `$ r0 D *
8 n S9 {) S- x, O6 d$ [, H1 Z * You should have received a copy of the GNU General Public License
0 I, D+ E2 F$ N8 L7 H0 B7 e! ]% w * along with this program; if not, write to the Free Software4 E- r6 w( Z" @; U1 v
* Foundati+ c# _& Z: ^' @ }2 f
*/$ W8 g0 O( L- m M* E5 F; m& n
#include <linux/module.h>' k- q1 W3 e: P3 F9 q
#include <linux/init.h>
+ ^! B6 A3 o2 w: s, R: g#include <linux/errno.h>0 R/ ^/ Z- _$ t$ u' i9 ]' ^8 {
#include <linux/types.h>7 |% M2 \- I, r M8 z* s
#include <linux/interrupt.h>- d; j* K: a7 \4 p% H8 s$ A0 h
#include <linux/io.h>
/ ~. b4 l: ^% C) ~0 j: n#include <linux/sysctl.h>
* x t5 c- [% V0 { ]#include <linux/mm.h>
. `' P: S/ ~0 @& f( ~# _" _#include <linux/delay.h>+ i2 n5 y9 d7 V5 @
#include<linux/kernel.h>
( f' r% K0 e1 r2 d6 @#include<linux/fs.h>
; ~/ q- s$ L4 a8 X2 b$ n& j% Z W#include<linux/ioctl.h>
6 [5 q R! |* z# o! P#include<linux/cdev.h>" A2 n, K) ` n# f1 D
#include<linux/kdev_t.h>
/ T3 C& b% W' E( _#include<linux/gpio.h>
" V- H! F Y5 S! F#include <mach/hardware.h>! I& u7 S# c: }2 [! u: I$ X
#include <mach/irqs.h>1 \ }: S$ G ^$ J" |
0 `! L7 v2 D# I7 \
#include <asm/mach-types.h>$ q) E+ D) N _, a# y8 o
#include <asm/mach/arch.h> E) J8 S7 T; y ]: E x. l
#include <mach/da8xx.h>, V, g' M5 E6 `9 Z8 a& C
#define SYSCFG_BASE 0x01c14000( |5 b8 a' v8 l; S9 v+ l
#define PINMUX1_OFFSET 0x124
2 b* L: A, I% B0 A. W#define PINMUX18_OFFSET 0x168 4 B2 H( j* u8 j* U8 y# Z2 B1 q$ g
#define PINMUX19_OFFSET 0x16c; ?+ i3 I- X9 P" d6 I! J! t, R
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
: a7 ] _) U4 g: i4 W: t9 u% A#define RCR_ADDR 0x01D1100C //MCBSP1_RCR6 P6 m* d X1 Y+ D
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR% K0 u( ]9 `$ B& P
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR! z$ \5 u* G4 w# Z) d
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 k3 l. D# x4 e5 T9 Z! O
3 ^1 g3 M: j9 _" j#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
- p6 B+ M1 m: G' W7 l2 ?#define DRR_ADDR 0x01D11000 //MCBSP1_DRR2 [" A% y1 `# T0 v; p4 I( m
//PSC' b' D% k5 F5 G
#define PTCMD_ADDR 0x01E27120 5 u; o) b) M W6 q
#define MDCTL15_ADDR 0x01E27A3C! {6 {* ~: t3 U* Y: c1 j
#define PDCTL1_ADDR 0x01E27304
" K0 ?7 t5 m. M$ c' _//GPIO8 direction# m/ h5 e) V: C# l6 ~. v! o) Q
#define GPIO8_DIRECT 0x01E260B0
* c5 k" i& n# E$ F#define GPIO8_OUT 0x01E260B4
a! i# f# n& s/ Y#define GPIO8_IN 0x01E260C05 L0 J$ Y% ^2 H
, ^9 [9 P7 J0 W
//#define MCBSP1_RINT 99
8 I5 A) M) U2 R" ]8 h, c//#define MCBSP1_XINT 100
! K5 A" O' g9 Y, X! k& ]static int MCBSP_MAJOR=239;
% [# l1 p% |( {6 C, w$ J" e2 estatic int MCBSP_MINOR=0;! K T2 {& a1 U
static int count =1;" J2 d" N' g z. b
! V3 G2 p/ N3 T1 h0 ~/ I
#define MCBSP_NAME "MCBSP-device"
' Q0 B# B z- m# U% Q* H
A0 j5 l" r0 i/ D. T+ ostatic struct cdev *mcbsp_cdev;. ^9 R2 Z C9 Y
static struct class *mcbsp_class;
# T3 C! a9 |1 i' rstatic dev_t mcbsp_dev;2 A# ]4 @0 t3 [1 W
unsigned int DRR_data;6 b# Z1 z+ Y' D6 Z' L3 t: o9 J9 R8 y
unsigned int DXR_data;9 c X9 f, k. O5 R" c7 B9 x8 M5 T) `
static int mcbsp_open(struct inode *inode,struct file *file)! N S4 g. h$ g$ L: a8 U
{8 V$ Z) _( v1 s6 i6 Y* E1 Z) o
! ?. u" v# E: o( x7 r
//interrupt enable,initialized6 I# ~8 E, E. b/ r0 E! V
unsigned int temp;
, h# Q1 S4 ~% F0 G //SLEEP_EN(GPIO8[10])---0
& |8 X) L" A. {5 A0 B temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 W5 v0 v( v% |8 \4 f) _8 |2 D7 i
temp=temp&(~0x00000400);* m8 r0 A; E! H. S
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ i( G- s; [9 B: C- {$ D) R# |6 @3 p( E
//RESETn(GPIO8[8])----0----1
7 e# {! Q& n# o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; y) [8 h3 C2 D2 ?5 J: D. ] temp=temp&(~0x00000100);2 ^" L) P( P* t A. d; x% U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
1 f- W z$ S; A# j3 o" G udelay(100);
6 \8 L5 o T3 z1 C* j r) T2 t temp=temp| 0x00000100;$ ^; G) v' M) t% U' [; }% r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 x: J, A. i4 Q8 I& q1 c. M0 [
udelay(100);0 Q+ `# p# l/ |& B! T# b# a; g
printk("open success!\n");
$ r6 y5 ?- k& W2 g; F return 0;
5 H3 Q: `0 `0 L}
' C; h3 k$ P# R3 z
( i# d. p: S1 {# [static int mcbsp_release(struct inode *inode,struct file *file)
& r. ^% x3 H! c) B{
0 B3 i. Q" q( t' q7 l& }; K printk("release success!\n");
8 f# |8 T6 T- Q- E. T+ g- W# E return 0;( I! _! U' \7 F3 L y- \, M M
}) s( d8 }! d, r% ~- c& g1 w1 X
2 L2 F, r X& }! {9 p3 A1 nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 o' {/ z" _) n7 t' ^( a8 O5 s: j{( L' W$ M! U. Y* ]: d6 w B5 F4 W
copy_from_user(&DXR_data,buf,len);
' J+ r6 {3 T5 y" V1 Y+ M iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. A+ {# ^* ]/ ]& { return 0;
; [% x: {: x! H4 J ; t) X9 E; G" k9 f0 S
}# R/ g O1 S/ L1 _
0 q( O& n1 Y3 `. n7 R3 A# |6 R {9 y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
6 ?& p: V& u2 }{ Y& k1 f/ f: G8 o1 g a
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) C6 j: y: {2 ~$ i% m, O) R copy_to_user(buf,&DRR_data,len); & Q1 r) s/ c6 T! ]
return 0;
* D# c3 s& H- p! |$ C}
) H# r# P' u" P2 P2 G j6 h7 w# e% o8 u6 j& g* v. G
7 t9 j8 }1 p' a5 n% Zstatic struct file_operations mcbsp_fops=
5 R/ v& J8 o( O: A{" k1 ^. F9 b4 R
.owner=THIS_MODULE,4 b" i) c0 j/ w$ l& f0 Q3 p$ L7 u
.open=mcbsp_open,
- E* t$ k* H5 P .release=mcbsp_release,# U( X5 Y) b7 U! \5 |2 |# ?
.write=mcbsp_write,
2 j6 z6 ]/ E& M .read=mcbsp_read,+ v1 h N- ]" n2 A; n
};
2 Z: |9 |- k& C4 {7 t pstatic int __init MCBSP_init(void); e7 O- e5 `& @; W& S; p
{
" e& _/ U4 h' C; W" r7 X ^ int ret;
: E0 l. M# \- M- L9 V" H unsigned int PINMUX1_REG_old;
2 Q3 g+ A& E- Z2 X unsigned int PINMUX18_REG_old;; J: c6 {& [7 ]; J& D
unsigned int PINMUX19_REG_old;8 n7 n% [. f& S* W* R6 d
unsigned int temp; 5 `% L f0 \1 ?5 z% g9 f6 ~
if(MCBSP_MAJOR)
$ v4 e7 q# `) S# a {7 q0 k1 N( M& R, |
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% {% @5 c; c' C
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 `# ^' j9 _$ G+ ^4 g }7 w1 v$ B5 m0 x5 _3 e
else3 h1 W1 y% X, I" a
{
6 w* |& E0 X. S; z0 R7 w ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" a! Z% P$ u( y% X9 v2 \1 ^: z% ] MCBSP_MAJOR=MAJOR(mcbsp_dev);2 Y; b' k5 s: E* z7 P m" H
}
$ ]) _: g6 w* _2 d2 A, d: o7 R3 ~, h
$ c) m. I0 ^. ^9 C% o* W) t' K if(ret<0)
" V/ `' Q" a% _# U+ n {
4 s. A/ M8 B4 X6 _ J. G" m- c$ [ printk(KERN_ERR "register chrdev fail!");
5 c& _$ o4 s3 e0 s4 A return -1;
9 M* M: B* J, t' l7 d# s0 Q) R }
% B9 h% i1 @; C0 o4 Y/ ]6 L
, E; ^. J3 S8 b; {. U# O1 v mcbsp_cdev=cdev_alloc();% C+ I; ~& A, g2 V. k0 m/ k
% L- ?& f. p5 d
if(mcbsp_cdev!=NULL)& u; B* Q* s9 r3 g
{
: _/ ]2 H9 `& F# n+ S5 X cdev_init(mcbsp_cdev,&mcbsp_fops);) M- ~1 W/ t! X7 z
mcbsp_cdev->ops=&mcbsp_fops;
9 k# M( f5 N; |! L8 b5 _ mcbsp_cdev->owner=THIS_MODULE;
8 g& e. N) B% h9 @6 o8 h3 r$ T
' G; f" I4 _9 m/ D3 ~/ {# W p if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
D! v' r! J0 v) D5 q printk(KERN_ERR "register cdev fail!");, J! _3 |$ }. k' i% ?- y' ^8 e
else; M; H/ ^$ S5 m' F# ^
printk(KERN_ERR "register success!\n");1 b# R4 q6 K. i, {$ \
}
1 _. B0 f9 b# P3 T7 a' e8 n else) d+ T5 n" F p) V
{
, j8 _5 ~+ q, E) z+ }& Y* M printk(KERN_ERR "register cdev err!");7 E% x1 h! t& R/ c
return -1;4 i$ b6 e( j3 r: ?& d6 {( D
}
& b, ]0 B; E0 W . v8 l( [4 A2 I$ j
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) a4 B# B! j" s, \" J8 T
if(IS_ERR(mcbsp_class))" N. F9 Z7 T! y- L4 h# w8 @
{
M% n' Q7 r7 u% u2 N printk(KERN_ERR "register class err!");7 H8 @ ]5 p1 \2 L. w; G4 X# Z: H
return -1;
; _3 a2 Z) Y$ V; S6 f+ M& J& u1 x }) G* h" i/ f" D: l
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" t8 _* @8 O5 ^% c
; p; g# T$ n) d2 A2 n) {" c: i4 H
//PSC8 n" v; B1 C4 |' p7 I
//add Enable MCBSP5 @" r1 ?! B' p0 {
//test8 a; e5 P! F, C- \0 c3 Q- g
temp = 0x80000003;1 `, J+ s$ j% R8 F* l
writel(temp, IO_ADDRESS(MDCTL15_ADDR));* _& }( s* Z' z/ y
temp = 0x00000003;
9 b1 S- M" U8 ]% U, @" P writel(temp, IO_ADDRESS(PTCMD_ADDR));
& G6 [/ W$ U5 [
}2 F/ ^" A1 d1 \ temp = 0x001FF201;
. f9 N( X- e! F" X: } writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 }: k( {/ Z2 ~2 _
6 ?2 y% |+ Y4 Y% w P //PINMUX
0 r! f! E W+ z //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 ^0 b$ I ^2 d' v
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 @/ E" `# I4 Y; N0 I3 e6 F* L9 b
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
) N. K) n+ c6 {$ |* o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: b/ x- X" q! E0 s. I 6 z2 P$ r2 T- U5 q
//SLEEP_EN,EPR,L138_SHK1,L138_RC
' a0 V. Y" q# |3 j PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 s) f2 K$ q# W PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 1 I6 ]. j- v" S- X" w+ r5 F) ]
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 }, K" x% r3 E; F 2 C5 g0 t2 f9 t% p' ?& h
//RESETn,L138_SHK2 `* Y; `* n* F
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - z; m) }5 }4 o% L# O7 p# S
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 8 p3 T0 l4 E; c# a
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ X; S' |# w& s1 {8 d3 D 1 ^4 _+ Z/ Y2 j- m2 f3 R" L
, P T- f$ ~2 A
//SPCR Register" |! p8 ]" N" Z/ s9 [
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 A8 r3 H1 I- B# h% q temp = 0x03000000;//(DLB=0)9 {# Y: _, D) b. L
// temp = 0x03008000;//(DLB=1), S" i) e3 t- X' I0 m, F; x
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
5 C1 v! z: V3 E; p4 I- s temp = readl(IO_ADDRESS(SPCR_ADDR));
. W! O! I& I, t6 X4 R printk("temp=%x\n",temp);
2 q# A! ]5 r' _) l 0 P" W' u) x, c& u. h
//PCR Register, O# C7 @3 `" N# @
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ j R) y, x( `5 e0 c% G$ @- Q // temp = 0x00000F0F;
6 c5 K* j2 ]" q( E temp = 0x00000B0F;
7 L1 p4 `! y9 I& q9 m) h writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
2 ~1 f9 P* v* [0 p& {# i+ l9 c F. g temp = readl(IO_ADDRESS(PCR_ADDR));( }. K: P1 }8 I m6 N9 ^9 _5 s
printk("temp=%x\n",temp); " D( K+ ]/ J. I$ {3 G
//SRGR Register4 X( V w/ A# |% h
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 j3 k; Y5 Q. ?7 F( L. r( g, d# |% N //temp = 0x301F000B;
- ^: b' Z' c8 F. r writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
) B0 ?! U Z a, G% P+ b temp = readl(IO_ADDRESS(SRGR_ADDR));: o2 ] r3 m$ I, t V. i* M) u
printk("temp=%x\n",temp);/ B3 h& l/ U# v* k* o) [
//RCR( G- {; E" F+ m- b
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 `# ^5 w# r6 q& }0 x# y
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0/ s. I) k9 Z" I T
temp = 0x00440040;
5 W7 W0 e6 [2 p writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 |6 w- q3 q+ Q
temp = readl(IO_ADDRESS(RCR_ADDR));
* k" m/ V8 z; o; d3 v) S3 u$ V1 C7 _ printk("temp=%x\n",temp);1 G1 F3 G0 x+ ?8 B# i
//XCR
* k9 J4 U$ @ J( L$ w- w; [ //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
( x" ]" s" C" j7 E //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ m/ O& L1 T2 y4 K" I3 P8 s9 H* F0 }
temp = 0x00440040;; g' |* D1 [+ E Z1 i5 q4 d
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- Q- y6 @" m0 D& g5 K# S temp = readl(IO_ADDRESS(XCR_ADDR));) p. |9 }, R5 N" T @5 {% Q" f
printk("temp=%x\n",temp);
% n/ F# k3 m" o9 S9 |. l* p7 U udelay(100);
P: p8 o' o1 K0 T; N# _ //SPCR Register; x0 E6 C) j; @4 x
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1% ]( Z( M5 e4 p: _4 }
temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 b) S0 ^0 V1 ^& n writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled8 N* ?% B- ~# [
temp = readl(IO_ADDRESS(SPCR_ADDR));
3 c( I5 x: M; d printk("temp=%x\n",temp);
) Q5 h: }2 K8 F2 v7 r6 x* M udelay(100);
4 @' K* a6 P5 _
+ P2 P+ ? W2 ]/ j' ]" w //set GPIO direction5 D2 f! p9 }: E: Q% a& G
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; ?! ? ?- E0 ]0 ~. r temp = temp | 0x00000100;//EPR----input
( M/ a- ~- {% P( [: q' _. }0 |* d7 G* H temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 e" t8 |* |) H5 a" R! y
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 B. t; b1 _, c- \0 P' w2 U; w 6 @- \6 P: U( r+ B* a
return 0;
; J! o$ R6 m8 F2 S% W}# J5 o1 V Y: g. C1 h
static void __exit MCBSP_exit(void)" S! H. F9 s2 N6 N
{0 a0 p4 }9 @7 @6 X- O3 B: y
printk("mcbsp chrdev exit!\n");
5 X1 k( V, h1 a. O# u/ N/ J( [2 q cdev_del(mcbsp_cdev); N% N' `+ d q
unregister_chrdev_region(mcbsp_dev,count);8 ?. y- X! N: _4 x, E" i
device_destroy(mcbsp_class,mcbsp_dev);
& ~' Y4 a8 I) E/ ?% k9 }6 Z class_destroy(mcbsp_class);9 r, O7 V9 B' |2 N
}9 i( {; Z5 X! r' n1 @$ X
module_init(MCBSP_init);
) U7 `. ?# u# V- k `$ q/ j# ~module_exit(MCBSP_exit);
9 i4 \; O) r+ ^* h2 F- r/ M9 m! _0 C& c3 j9 ^4 T0 m
MODULE_LICENSE("GPL");
7 ~- |: B7 {( } Q* R' h
% V" k8 V$ `: y8 R$ S/ ^ \: w3 Q! E) @我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 _9 d" E4 {7 z" @/ l7 b" x; e- O
我的应用层的测试程序如下- f7 k9 T5 q1 E8 G9 }
#include <stdio.h>
7 V3 p, c* O, K* m) \/ W3 `#include <string.h>
- U0 c. k5 R' L: f8 ~+ z/ E#include <fcntl.h>& s5 T# R; q; r( A& P
#include <unistd.h>7 S$ S9 C- z6 x& `
#include <signal.h>& R- o. _ Q% q
#include <pthread.h> //线程4 I5 t9 P7 I2 I) c L" H
#include <stdlib.h>0 ^2 a6 y* c$ ~# h
#include <pcap.h> //捕获网口数据
1 I! Q$ D; ?6 I5 }" T7 `. |& X7 _+ [#include <semaphore.h> //信号6 Q( P r. P8 u1 F2 L" D+ b. d C
#include <sys/types.h> //消息对列+ I* V% P' Z% \- t
#include <sys/ipc.h> //消息队列
& d n' L9 n+ M# a5 ]#include <sys/msg.h> //消息队列
: N, I; _, H5 v/ o2 o; J' W3 x#include <sys/select.h>1 i0 J4 P$ `/ F' ~* c
#include <sys/syscall.h>9 i7 q q5 ?- H. E2 J1 J
#include <sys/stat.h>
# z2 ]0 x) a- {! q; C3 A0 {#include <sys/mman.h>
! i; J- y0 l$ y/ e2 g' h. N* l#define msleep(x) usleep(1000*x); U) p8 B2 G5 I- a6 G1 H2 I, M; @
1 q2 I! Z% v) y6 b+ z' vint main()2 y) z- }. {) k Z. W+ a
{
. O) x, r" F3 N, W) y. E //MCBSP,ARM与AMBE2000交互设备
. S5 F9 v% W1 k3 V5 v8 ? int fd;
Z& T B: A9 R5 H' W2 { unsigned short data_write = 0x5555; z, z' l( M" C# e- y
unsigned short data_read = 0x00;
+ `$ M6 \8 w5 w) T fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 Q* I. |3 W! j9 ?1 Y7 p5 ]
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' L' v- q8 v) K. C: v0 o
) ]- a/ q0 _3 T1 Y6 y0 ] if(fd < 0)
7 K3 A& ] ?. ]2 U1 N' v- f" X {
0 Q! ?" z" Y0 x: R5 y p; N perror("open failed\n");
; _0 U2 j9 }$ m6 w- x return -1;% t9 j& a) R' }* v) K
}
. x4 V6 V' l# r. r# i) X ^
& `, u* d3 R( U2 n9 j while(1)" O! B, n5 r* A3 F2 X$ ?' |0 `: N3 e1 T
{+ h; j4 _ v U* H2 Q
' I' w$ L A" ?1 W9 ?* a3 t- G8 V
//AMBE2000每次读写是24个字为一帧 L1 L* B8 b |- q& I5 f; U
//写数据时将数据在底层存储起来,等到中断的时候再发送
7 C0 V( _# L6 L+ }+ i- v1 j) }4 F9 i3 n //AMBE2000输入数据是以0x13EC开头的
+ R {" @. Q4 e* G write(fd,&data_write,sizeof(unsigned short));
3 [: l. p6 L/ e* m / ~8 I0 h7 ^2 t5 w
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ! ?2 N C( u. Y1 c( r- }
read(fd,&data_read,sizeof(unsigned short));0 P, N3 I ?0 d1 }' h
4 q; o3 \; P. I6 o* P if(data_read == 0x13Ec)$ b1 p7 e) O) E3 u3 ?) H; G& f" A
{+ X+ I* e6 P: l ^
5 t' @) Q! i+ o/ q+ o; {" {
printf("data_read = %x\n",data_read);
3 L0 R! z e4 A* K5 v/ O" g }/ ?0 c- p8 i+ x- m- t
! Q7 u2 T( w1 j
msleep(10);
" l3 m$ q8 ^2 y$ z4 e 7 @4 r) m1 n. t/ t) {- j% p) w
/*# N& U) U& E4 {( g
ioctl(fd,1);
7 z# e5 N, q, Z sleep(1);. @. U: h3 }: S
ioctl(fd,0);
% w0 @; Z6 Y6 L4 p+ Q sleep(1);: D2 A3 ~8 B1 U9 |- n& S2 ^
*/ * k' D3 i+ z7 E& ?& F5 u
}
, T2 |8 E7 ~; ]5 t- {4 E return 0;6 L, ^ R; ?0 \1 E
& t) |& u8 _% q1 L}
/ p3 Q) {/ v- F4 G4 M! p, r7 W% ]6 q6 l1 x$ t( S+ Y) I
多谢各位指教,谢谢! 急
" o# x" y' d1 o0 Z
! _- r1 Z- _7 E% D+ [
0 T$ e7 \& v6 s! Y) R
# e, W, k( H* f( {# I2 Y# b5 I, W+ a" V" N( {$ C# X: b
4 a$ {* c$ G% o* d! t4 J* ^
|
|