|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & Y" H* Q1 P$ e* b' o4 Y
/*( G/ \' Y1 d/ c$ D7 G3 G6 p
* Copyright (C) 2009 Texas Instruments Inc
: |2 ]% K$ b+ M8 p1 g& U *# r8 T) ~0 n) u1 {# v r) i$ r
* This program is free software; you can redistribute it and/or modify
; W* c8 {- n3 d8 G * it under the terms of the GNU General Public License as published by$ b: p6 J$ u+ F6 m8 w, w2 M |; r
* the Free Software Foundation; either version 2 of the License, or x' \' x# G5 f/ i
* (at your option)any later version.: Z, e. c/ y7 E6 \* h0 q
*
# D7 G- _& r( c$ U H) Y4 } * This program is distributed in the hope that it will be useful,6 Q& S$ d8 d" ~4 x0 F
* but WITHOUT ANY WARRANTY; without even the implied warranty of/ A5 Y) c6 d: s( H% f
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 m( N* L) X( _$ c# ?& J * GNU General Public License for more details.
& h2 k" a+ v( u *! H- j6 X6 Z# h0 {7 a
* You should have received a copy of the GNU General Public License
! t# n+ M; o$ E2 ~! k$ T! ?5 y * along with this program; if not, write to the Free Software
; D" W1 Z% A9 N) k+ |: P * Foundati
6 J, W8 o6 ?8 G( f" z*/' c) \- Q' h0 R5 m
#include <linux/module.h>
3 `! o9 u- _7 i# j: d. X/ U3 ~#include <linux/init.h>, ?5 t/ x% Z6 G6 d( \) o
#include <linux/errno.h>
6 F2 n& P3 e- Z6 ^2 ~#include <linux/types.h>+ B; x" x* y; s$ C7 M' P
#include <linux/interrupt.h>
0 f2 w) E8 X5 @- h5 d* u5 ^#include <linux/io.h>
2 K- b. B b4 D% A7 u#include <linux/sysctl.h>
' l. {. e: }' i" c l& r+ p( M/ j: t#include <linux/mm.h>
% k' ` b/ ?/ q* R#include <linux/delay.h>
1 z- q) C3 O1 I3 |1 i% ?6 ` u' E& r#include<linux/kernel.h>0 y0 D# |* D! c
#include<linux/fs.h>
& f$ ~# ~# }7 U* o/ M+ d3 w#include<linux/ioctl.h>
9 c) P* D2 k' J& I1 z#include<linux/cdev.h>, V4 E! o/ c9 ~, m$ u+ M+ s& U; l
#include<linux/kdev_t.h># ~+ u/ J: @6 L- X) P5 }. K
#include<linux/gpio.h>
2 t0 O4 u4 p: G' q9 s3 ^% D#include <mach/hardware.h>9 Y3 `4 G3 |4 ]& A+ [5 ]. L
#include <mach/irqs.h>8 e- G! z6 P3 B1 l: S# D
: e( [! K$ O5 h# o! b
#include <asm/mach-types.h>
8 P5 ]3 S! ^; c4 j# `7 A#include <asm/mach/arch.h>
) y p: H* |- U+ B% j! C6 o; b. ]- U#include <mach/da8xx.h>
6 T/ Z9 D# ~ d#define SYSCFG_BASE 0x01c14000
7 {" g, U. L9 g* T#define PINMUX1_OFFSET 0x124 9 b+ i+ k6 Z) `+ q" F) N: R
#define PINMUX18_OFFSET 0x168
: Q7 e; p7 v+ }#define PINMUX19_OFFSET 0x16c% O0 w% y( [; w2 \
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
8 A' P5 B- s$ A; V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR3 g# C* E" q0 X1 |! A* k
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) g7 h7 J. f, a7 p d3 [#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, y! g. W4 G8 c#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 i& w9 D* D+ K- w5 s
: ] W% @: n3 }7 J0 K" j
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
# p/ o& l! z& _7 H, O3 f, y#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
' w( k: Y4 f; X* U- `8 V! ?! _1 T* r. c2 g//PSC& L1 p( @; X, |" h0 b
#define PTCMD_ADDR 0x01E27120 6 `2 W& |6 M" C L0 |
#define MDCTL15_ADDR 0x01E27A3C
0 S9 R- n @1 G2 I* T7 Y#define PDCTL1_ADDR 0x01E273045 a( j8 H# \) [' |- r2 z
//GPIO8 direction: I7 _- Z9 p2 F% j( i. h
#define GPIO8_DIRECT 0x01E260B0/ v% y; v& U* ?+ P2 V w/ D
#define GPIO8_OUT 0x01E260B4
$ O+ V* U; Y% X#define GPIO8_IN 0x01E260C07 L' w$ N' w/ U7 _8 N+ q
. Y, H5 d/ f7 V
//#define MCBSP1_RINT 99
! V3 Y4 X; b, w( }; G//#define MCBSP1_XINT 100
2 W' Q; N8 u$ s$ C( Ystatic int MCBSP_MAJOR=239;; _& C- G: p' U+ i
static int MCBSP_MINOR=0;9 Q) V) L8 _) L
static int count =1;
0 [# X7 Y: G+ G3 d* x; }$ J. o- I' F& c0 V8 T
#define MCBSP_NAME "MCBSP-device"
* {/ d7 |2 }7 k q# J
$ P8 M0 m! F- s. a! p. tstatic struct cdev *mcbsp_cdev;% G: Z% o/ U8 q7 {8 D
static struct class *mcbsp_class;5 k+ Q3 {5 W# a9 Q
static dev_t mcbsp_dev;, ~2 K3 b; m+ q& f) o( Q: W
unsigned int DRR_data;2 r: Z* e+ W' ]% j2 c1 E# q
unsigned int DXR_data;! h( H4 I0 N; w7 d P
static int mcbsp_open(struct inode *inode,struct file *file)
% E6 d0 }+ q* |! \7 a* D$ W{
/ K0 F P# a9 T& f) X( [8 [ & K- P1 w" [; S7 |, t
//interrupt enable,initialized
; c! X4 a, |8 K+ N3 v1 |& | unsigned int temp;
& w" S# i# ]2 E: l6 E3 r/ Y //SLEEP_EN(GPIO8[10])---0* }* [. n1 g: m, `
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' ?; ~3 _# [5 o temp=temp&(~0x00000400);
4 a1 i2 |+ A+ e4 S( `& q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: J+ @+ [( K) K6 ^4 I //RESETn(GPIO8[8])----0----1; E* r; l. F5 q7 ]2 M
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 S- ~, b; }$ R' w temp=temp&(~0x00000100);
2 A& l, @: p6 X/ D __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 Z/ j" W. i% p T6 L0 I$ Q udelay(100);$ F, v7 l: p) I6 C
temp=temp| 0x00000100;" [% F$ ?# s" T7 A$ { }/ x) J+ A
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
: L4 a/ @. k; \" l- M udelay(100);
" p9 u5 Q$ K, D. p( D! q3 K0 E printk("open success!\n");, S+ S) C2 h& F G2 w6 p
return 0;
& a- U$ P0 R/ l( D}
! V6 l/ ?- D7 M9 N+ x) W$ B; \
2 ]" j+ m2 I& @; O! t% lstatic int mcbsp_release(struct inode *inode,struct file *file)( l7 G) b4 F/ i
{) m( I0 \3 m3 Q- g' _$ `
printk("release success!\n");
1 M6 P, N4 k& w+ v) {% k7 v7 n return 0;$ ~% ~9 ^. f& n
}
* D" f, y) S) p6 b4 j) G n" b3 h+ S7 d4 {
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 m2 q; m# y& D' M$ _4 c( B3 V1 t{1 z# s. {+ }* `
copy_from_user(&DXR_data,buf,len);: B+ Z4 W/ e/ P ]4 j
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 u) U# S5 x: T return 0;
# `: G4 H' }* {. A5 y$ J: J 1 r* q# B4 d, ]1 ~
}2 p+ @2 M" y! { N u M3 ], T
* S' u, o9 E0 I9 v3 M- _static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 Q+ x# {* H$ i{
7 m* \: L8 a0 m7 f DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 F! o+ q1 X3 g6 A; @8 h: P copy_to_user(buf,&DRR_data,len); 0 A; D/ N c- D! c Y
return 0;
0 j0 h# @; e0 _0 v: f}; d1 D e; Z8 O8 A; ~1 v$ V
5 `2 i, j* M$ o' ~+ M
' C5 s' Z) j: Y5 P4 T# j# W* i# Qstatic struct file_operations mcbsp_fops=( w' S, X7 F* H( Z. C4 L* c
{8 ^5 C3 }6 i9 D3 P8 i( F5 @0 t
.owner=THIS_MODULE,* q% b2 M2 b% k2 l3 o8 M7 M* J
.open=mcbsp_open,
6 z/ q8 X, w& Z+ T) D3 d .release=mcbsp_release,
6 l7 G: Q* P; \6 i5 H .write=mcbsp_write,$ q9 U b. L/ ?" X: H) J9 K! q
.read=mcbsp_read,
: c" _8 g7 v3 T j3 p% a};3 D0 \! s, b0 Q$ w2 E
static int __init MCBSP_init(void)
- Z( |3 z* C# V/ |4 b{
' X. W% a6 T1 y" x1 i) G5 J- B int ret;: m \6 ~$ _2 [3 [, M7 L& l7 f
unsigned int PINMUX1_REG_old;3 b! q4 `; B" ?4 U+ D# M$ M
unsigned int PINMUX18_REG_old;
4 f# A/ K9 w6 j unsigned int PINMUX19_REG_old;
0 \6 E9 M0 W F3 k unsigned int temp; * E# }$ D0 a. n( |* C
if(MCBSP_MAJOR)$ A6 o& ^5 i! C
{
' A) [- N2 u; m) `, C/ m. v mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( s1 Z: T& Q0 y: z/ H4 M& ` ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( }8 n( W$ R& B: ^$ F- { }' f2 z. F1 V7 A: ?4 g2 o
else" L# j% Y. c4 p* m: | e9 G# W
{
5 N# E' l7 b4 g% @ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- F/ E. v q; F+ F9 T9 e9 Y+ a( P MCBSP_MAJOR=MAJOR(mcbsp_dev);; [, U3 q" o4 H9 ?2 Q& Q( y1 z8 J
}
3 H* C; h9 E" c2 v0 ~
; J, Q3 D/ x, I! k- p if(ret<0)$ l i9 i, D' V& i! n/ w' y
{3 S. Y2 q. S" Q* A
printk(KERN_ERR "register chrdev fail!");
/ r( V8 l. ?5 U1 w# H return -1;
; a0 p" u6 T/ q, y: e, A }
! y) x. b P) L0 }& h
2 J7 r3 X# t3 @) E0 v2 O8 U mcbsp_cdev=cdev_alloc(); v( M# O$ p/ k7 `4 |" `! j8 D
4 d0 x# X' P k& ]# s9 v: D5 ?9 k
if(mcbsp_cdev!=NULL)6 H4 p9 E" a0 C6 B: o8 |+ f
{
% J7 W: r& _, `1 T) b( O. n& V cdev_init(mcbsp_cdev,&mcbsp_fops);) {0 J" W% q" N" w* j6 \
mcbsp_cdev->ops=&mcbsp_fops;% }9 E4 l; l0 e3 w
mcbsp_cdev->owner=THIS_MODULE;6 n$ Y6 A3 r1 m* M4 C* B
6 d3 B: G. ~/ q' O' |# Y& \ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, y9 b# z% Q. D% O* {, |# X printk(KERN_ERR "register cdev fail!");
$ ^6 b, p+ Q! g else
2 S1 \1 z" y. h printk(KERN_ERR "register success!\n");" s$ O! k0 H$ j
}
9 Z% m. t- v! J else4 q- F9 x7 b. |3 Z$ F' M
{
+ p2 \. S8 L2 O+ i. Z1 D printk(KERN_ERR "register cdev err!");
+ [3 A! T6 B2 q/ n3 |, I* d( r return -1;
# Y7 D! l0 D# a& x9 S0 o0 `8 |4 m }
' `& E" ^& D8 ~& {3 k
) r0 E( V( v# v* G mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! k7 _) k; ] S7 o; P! d; E% z
if(IS_ERR(mcbsp_class))
! l p9 F4 @; v7 m) T+ C {' P, ] K/ g" J- n, ?- j& d
printk(KERN_ERR "register class err!");1 W) z# S- d" f' Q
return -1;
* U& X- H: R. x/ X5 T6 c1 N }) v# x" u" T# V$ Z7 C% V
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, d% X1 ~' ~5 |) w0 K- e# i+ \, X( B$ U5 m" ^8 ], G% X! u& E# m
//PSC
2 w- x& a9 V; p. t- \; y //add Enable MCBSP8 S O, N4 p( @2 r7 X
//test
0 i) U0 ~( y) ]4 s- Q# Q5 q temp = 0x80000003;
0 g; f& M: H- t% c- _- l u writel(temp, IO_ADDRESS(MDCTL15_ADDR));) S$ }, i; k7 r
temp = 0x00000003;/ {+ t% p$ S, B; _& s
writel(temp, IO_ADDRESS(PTCMD_ADDR));6 E" O6 ]# `6 [- k# B6 F
' c t4 X9 X. [
temp = 0x001FF201;- t. V) K) ]3 k1 B
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: i% u6 T# |! o. @; t# I. ~
4 J( ?. p1 _$ t; Z/ [ //PINMUX
, m R# R3 p! V# I) \% \. D$ E //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" U/ E! V" n9 q( J, v+ x PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 r- Q# r" J$ \; a PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
) _7 q% l3 R) ^: d6 q5 J writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' ~$ i8 @; g$ @& g- r3 [
! L7 E' \ ^: }9 k& l8 ^ //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 T/ j \* b. ~# _7 p& w1 v PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) ~. _+ `! V# ?7 ?/ l r2 F* U PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
- b4 f1 J5 J+ R writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 S( H4 R+ W. ?" b ( ]; [1 n y( ?4 t0 m5 I
//RESETn,L138_SHK2, C' U/ [9 D+ F5 S: L# u# x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
* v& y, L7 q# k- z3 | PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 O- G4 t- j2 E" a6 g* V writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% K+ o" t! }+ a3 E7 R& k0 ]0 M* k
1 q' i7 h# T) K" _& o- a! H7 k ) h* Z4 c1 q. `; H7 R* z
//SPCR Register# g% G- y" r9 ~! a
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 E9 o! P7 R5 y& S/ V5 u( J
temp = 0x03000000;//(DLB=0)3 E' Q* Z* E2 Y% [; T
// temp = 0x03008000;//(DLB=1)* s' Q# g; q" W" `
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
o9 M9 U- Z$ I temp = readl(IO_ADDRESS(SPCR_ADDR));
8 p, a! J+ T1 g; e6 m2 D' J printk("temp=%x\n",temp);
* T- s2 H. g& \* g
/ {. G! x7 ]9 B. G5 H/ M# X8 P- ^ //PCR Register6 c4 [, ^4 e* c7 J. z
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 C9 U: ?/ t( ?, ?: ^- B: v
// temp = 0x00000F0F;$ b6 l! x' v% k4 f" u8 X4 a
temp = 0x00000B0F;
+ q9 d+ `) q D writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized * p* D" o# m3 D+ G9 r& P
temp = readl(IO_ADDRESS(PCR_ADDR));
3 q2 y/ |, |3 p printk("temp=%x\n",temp); ! D! E1 g- Z: n+ n7 N! W
//SRGR Register3 y! l7 ?0 e$ |: u
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& ^+ y5 h _3 q5 r4 G( \ //temp = 0x301F000B;9 n+ f7 k- q( b/ T8 A: F
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
# R9 B) e9 |% Q& q temp = readl(IO_ADDRESS(SRGR_ADDR));
# k. l6 N' g& \8 D" e5 z* R+ o printk("temp=%x\n",temp);7 S, R/ c/ z0 L6 L; O+ [/ K: A
//RCR
" F$ x. W' e- h //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# J& I; C9 \. n" G' g$ D
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
: _- E5 q* ]( A" @ temp = 0x00440040;. R' C2 g+ }4 q, y) ^. |& o, C
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
7 r5 L2 w( y, P( I3 q8 G8 \ temp = readl(IO_ADDRESS(RCR_ADDR));9 i- A" k4 }3 O) E9 t0 y
printk("temp=%x\n",temp);" i. O Q" i! q4 W5 N! D* g! y
//XCR/ N) [; N8 k! v
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
% I8 h5 R- ^6 V. P* A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( K) B" M9 q/ _! d! w" U7 n
temp = 0x00440040;
/ H: m+ B8 a0 J- n( o9 u" M$ Y writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & H: R+ h; O4 c! @
temp = readl(IO_ADDRESS(XCR_ADDR));
$ L7 \' w9 ?* U* h" \ printk("temp=%x\n",temp);3 f* w, A; Z( L
udelay(100);
9 v/ o+ u' r' W. X //SPCR Register/ @; a( _8 [: p' f6 ~( a4 Z1 U7 r
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) t4 A% [! W) J- u; ~" f% \
temp = 0x03C10001; //DLB = 0 VS DLB = 1
* l+ z( H: c9 L3 w writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
. w" H/ k& L' y% k& d: J% I* f temp = readl(IO_ADDRESS(SPCR_ADDR));
/ p7 d7 y4 m% f' S! B& t5 \ printk("temp=%x\n",temp);
/ F0 @3 j" Z, P8 X1 @& }! W: F; Z udelay(100);/ M) D9 p. p8 E
! D8 F; N9 m# Q; l1 v+ U( ~
//set GPIO direction
! W" V7 f& t4 b; [ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- G# O' ^7 r6 E! ^1 W7 R: ? temp = temp | 0x00000100;//EPR----input) X% S7 {' y& P4 P- O ^9 b; h0 t
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 _9 G% K# |3 _6 O& m' v7 f __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # _: K1 V9 N7 ^
' I: F' X1 i0 R, l9 }8 ~! S return 0;9 A/ ~* U/ ]" k9 Y* }8 ?
}1 ^/ I- X) ]4 y0 |1 z
static void __exit MCBSP_exit(void)
& p. M" J1 [& S+ y# ^! b{
9 v+ G+ I, J7 `. a0 O printk("mcbsp chrdev exit!\n");3 A6 J$ H2 x& p6 e* j& a
cdev_del(mcbsp_cdev);
5 V6 b7 \6 l: a. G unregister_chrdev_region(mcbsp_dev,count);
+ f8 F8 t! G$ r2 o1 A device_destroy(mcbsp_class,mcbsp_dev);
5 b7 o1 j' `2 o. ] O( M class_destroy(mcbsp_class);
. i% M+ g- a) x; S}" \. b) P @6 r
module_init(MCBSP_init);
8 R+ ^) O) a' [) mmodule_exit(MCBSP_exit);
5 Z. }7 @/ c6 m% o M- f9 z1 Z- s% _1 M, M! ^/ {
MODULE_LICENSE("GPL");- r+ w6 N" g/ }
% j: m3 Z4 M* \5 [# h我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 r7 f3 F+ W0 }& W
我的应用层的测试程序如下
2 V# @$ K1 N9 |' S#include <stdio.h>: w& S3 `$ d8 x% v
#include <string.h># ^! Y4 P5 p3 r8 z% d% A
#include <fcntl.h>' E5 {0 O5 J3 z% E+ p$ f$ I
#include <unistd.h>. q" h! o: N( D* G: c% o! \- ^
#include <signal.h>
3 ^ f$ d* _: U# [$ ]; ~! f#include <pthread.h> //线程 Y; d( |8 y2 ?$ V; s% z- `! p5 K
#include <stdlib.h>/ w: U" v# P! J0 {( t% y
#include <pcap.h> //捕获网口数据
; \- J1 W( N' B# L1 u ?* e- H#include <semaphore.h> //信号) h, B, l5 j% z7 ]
#include <sys/types.h> //消息对列& \% z+ l5 d) C4 T& |3 D- e& z
#include <sys/ipc.h> //消息队列& O+ r4 h, Y h5 [
#include <sys/msg.h> //消息队列/ Y0 d9 S0 o" Z& o2 O3 B2 y
#include <sys/select.h>
- q1 U8 g. S% h! ]#include <sys/syscall.h>
7 }1 @0 Y- R$ y( X e2 J. q#include <sys/stat.h>
: {% p2 s& z! {" }% A' n#include <sys/mman.h>9 |, e x. O0 C( O6 z' X
#define msleep(x) usleep(1000*x)
; `4 q$ W% }+ g- _' v7 O1 r+ C) C" f
u1 A" [6 H( q5 ~) zint main()
- e; z" Q% O# k) o. F! _{
1 v( u' i) H/ B' k% z! U. o+ G //MCBSP,ARM与AMBE2000交互设备! |4 F- @! O- l1 V8 M$ P1 ~
int fd;9 ?8 I1 U( l; Q; a
unsigned short data_write = 0x5555;
5 }" q$ ~" S C0 l* V$ k unsigned short data_read = 0x00;
+ `& e' e9 y/ i3 f9 l2 i fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) c5 _7 V3 a7 u- I6 q% v* C0 ~ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" K1 J7 x# ?% f% F" t$ p" m
* v0 u( s! E" D4 r- z( @
if(fd < 0) r0 Y9 G+ g2 ]) w) G7 l
{
" a: i9 n1 n a' O( c+ j perror("open failed\n");
* g0 t/ j F {6 M return -1;
# P1 C2 g2 K% _ }
) R# b# T4 M+ a" J8 J) y
' [, ~% _& d2 i while(1)) i7 h. _# B1 E& [- Q5 q
{+ w* V$ e, R7 R5 D7 J Q
) c& p4 z r3 ], e( [: g
//AMBE2000每次读写是24个字为一帧
1 c& a1 R! ~+ O2 r3 m6 s$ g //写数据时将数据在底层存储起来,等到中断的时候再发送) R3 l# O6 Y+ q5 g$ ?" I/ t
//AMBE2000输入数据是以0x13EC开头的
# q8 L( v( H1 m* A* w! W4 c6 W write(fd,&data_write,sizeof(unsigned short));+ j4 u; n3 f# t5 g( f( j! m
& W$ }: y5 W; ]6 Y2 W) x //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
+ V" ^# E& G1 r' O% i% a# d read(fd,&data_read,sizeof(unsigned short));
& Y$ Z9 A1 I- _0 A, G
) z5 z" r7 o' E7 q. V0 j) B! u5 v if(data_read == 0x13Ec)) x4 S* K s9 W! H3 a
{4 l' s& x$ E7 a# \: |
6 z9 l# N6 X2 E8 A printf("data_read = %x\n",data_read);3 ~. Z/ ]+ m/ Z+ b+ W
}- m3 f# \! g% l3 o
+ B3 {$ H& ~0 Q* @ ?
msleep(10);& T6 Z/ o5 z" s1 [3 G0 n
' _* L' p- c, h9 ^, ^ /*) r! H! E3 d2 p0 C. E/ R1 j
ioctl(fd,1);
# c/ U/ n7 y# E sleep(1);$ U! O, i( Y @
ioctl(fd,0);
$ U0 J9 D9 j( ^5 j sleep(1);" X- d( y: }8 | z- F$ p, R0 R, H
*/
* B7 Z1 X8 y' E5 n0 e& b, l } & w9 w! a4 H( @4 f/ U
return 0;
* M0 D0 f7 U! F H+ }% }* m2 l" G5 ~& \1 \* r. @. T
}( q4 c) i5 [5 w. y/ G9 r
! p5 }7 \, e$ r2 c6 s& X- S多谢各位指教,谢谢! 急
; G$ l( Z; Y. ]0 e
: X; \0 E6 J. y# b* k
- J- k8 D. H+ Q3 T, [6 k$ j6 O! D; o4 R: [0 o$ M- K( ^
+ {2 H; O5 a" P" _5 g: j9 h* Q# f( o+ i1 h C u G
|
|