|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - A ?. b1 n2 Q4 s$ f
/*
5 t7 n3 x& e+ Q- q' _0 _2 @ * Copyright (C) 2009 Texas Instruments Inc
" F& Q/ @" ]. o7 }( V v8 d *
. G( ?' P1 B( K% _ * This program is free software; you can redistribute it and/or modify1 |/ \. @* Q" \& g$ N d
* it under the terms of the GNU General Public License as published by+ w n( o4 { W9 U& |$ j# p
* the Free Software Foundation; either version 2 of the License, or
! y( q7 \! A6 C9 D/ D r * (at your option)any later version.
7 ^' H$ U( h& U1 K *' f9 n9 _, C+ F; I: D" m+ \5 _
* This program is distributed in the hope that it will be useful,# f5 l6 I n/ Y, C- O
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* b& S7 P% @5 ^6 d, ^: ~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
& e" m- m* M% m& X * GNU General Public License for more details.
- y4 g0 M! _% Z5 n- S( Y *
; P# \: x* E8 V; W! P8 r1 R9 r$ K/ N * You should have received a copy of the GNU General Public License
) w$ C: M3 y6 N8 o * along with this program; if not, write to the Free Software3 u& a' [( C) r% z7 n5 P% K2 M. T
* Foundati
+ l0 a5 M; D( m/ H*/' u) k* a8 |( F* a6 t$ m
#include <linux/module.h>
5 J ?: B7 b' h g4 W1 J8 x3 X#include <linux/init.h>! a8 @9 D, ]7 X6 I) q& L8 C
#include <linux/errno.h>" d2 r# v& [! u4 i6 b
#include <linux/types.h>
% m8 a: T4 ^ L; c#include <linux/interrupt.h>
+ ^; Q6 D: F1 D1 X9 [# n#include <linux/io.h>5 F+ M. Q) e2 q3 f& _% C$ v: O
#include <linux/sysctl.h>
$ j1 o: t0 l+ N3 P#include <linux/mm.h>4 h4 H/ z* B3 `7 f* ^+ i2 l
#include <linux/delay.h>
1 E8 k ^1 q2 I5 C& P3 n1 y#include<linux/kernel.h>4 k5 \6 d: V; v
#include<linux/fs.h>
' k3 \: e, m+ X) O( F8 |#include<linux/ioctl.h>" ~. R d; _6 r z# ]
#include<linux/cdev.h>
0 X' A% X' F5 S#include<linux/kdev_t.h>
" I8 |& k6 |1 i* p2 {#include<linux/gpio.h>
; A- \( V* Z+ d P% X: g#include <mach/hardware.h>
: \1 D4 n4 S4 e! Q/ v( a2 k#include <mach/irqs.h>8 B9 k# b/ {7 K( ?
9 _. K+ m9 K' \. ?2 w
#include <asm/mach-types.h>
: c8 u( r i7 D#include <asm/mach/arch.h>. v; @! S, l! \/ N9 G D
#include <mach/da8xx.h>
/ m, x- O$ @6 T" I3 j+ d#define SYSCFG_BASE 0x01c14000
' P6 Z0 K, z3 z1 L' |#define PINMUX1_OFFSET 0x124 5 j. f8 x7 O8 Y( ?6 W
#define PINMUX18_OFFSET 0x168
7 w7 F1 O! Z- }#define PINMUX19_OFFSET 0x16c
' U5 H4 y% N. i1 e#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
. e6 f4 ^- t) e$ L#define RCR_ADDR 0x01D1100C //MCBSP1_RCR+ f& E$ y4 O, l( ]: X5 L
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ s1 c" Z# {) c+ _% X- B
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR0 P" R2 M# b$ Q2 e! f7 J/ n
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR, h) v# Y2 l& i' T1 }
. ? D3 ]; j% L- `( K
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 r7 [" W! z5 _, A- j: V3 ^0 z" ]/ a
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
! h1 R4 n, s4 k, y//PSC$ A, j5 f# G. w! S
#define PTCMD_ADDR 0x01E27120 & h' k8 R" P; J9 i# y
#define MDCTL15_ADDR 0x01E27A3C
, L. n+ {# r0 e/ V#define PDCTL1_ADDR 0x01E27304
5 o$ O' c! P& b1 N. K) q//GPIO8 direction; u. g9 g( q {; B) B/ N
#define GPIO8_DIRECT 0x01E260B0) B: \" L X7 e* ^8 v
#define GPIO8_OUT 0x01E260B4
S8 F2 U: {$ y0 j/ s+ F F* H; Q#define GPIO8_IN 0x01E260C0; r( V3 z/ w1 y. C
, x, u2 ]& F3 |4 [* ]! @
//#define MCBSP1_RINT 99
) d9 J! j8 N2 m) N9 P; v" i% D: i//#define MCBSP1_XINT 100 l. U, P5 W4 A' a& d) u# g* t
static int MCBSP_MAJOR=239;* z7 r; ~+ |; K' f
static int MCBSP_MINOR=0;/ q. E' i/ F# b3 |. k4 c) @/ E$ g
static int count =1;$ k3 m1 ~5 ^1 V! c/ Y
/ O. Z' {2 I* J+ @8 Y#define MCBSP_NAME "MCBSP-device"
" D( p0 d1 o) U/ e/ R/ {4 i6 d0 S. N) c/ r& H7 |
static struct cdev *mcbsp_cdev;
9 t8 V9 _0 F4 r" c' lstatic struct class *mcbsp_class;
4 V. V2 x: y G P2 o( lstatic dev_t mcbsp_dev;
) u& ]1 P" a0 K9 ^unsigned int DRR_data;; D7 a& O+ ~. L p( \
unsigned int DXR_data; P: x9 n- q2 ?; e
static int mcbsp_open(struct inode *inode,struct file *file)" e6 i7 _, E& ]4 l" ~" z
{$ D! ]: Y, I- X/ W; @
, j0 Y& j8 P# O( l
//interrupt enable,initialized- c, W8 V' I$ k6 e
unsigned int temp;9 b5 K8 l) \$ z
//SLEEP_EN(GPIO8[10])---0( X6 `" B- z' Y1 V
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, ]+ E, }0 v6 o! ]. n9 a
temp=temp&(~0x00000400);. B. C/ @- l- `5 Q2 _' t; F$ _. A
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% r# i; d0 g" w //RESETn(GPIO8[8])----0----1
( `( k% n4 q9 Y* K3 V m" k temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! ~$ b. J9 y, D7 G, D
temp=temp&(~0x00000100);# z! c* v9 N$ R8 l0 W% Z( b2 l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0* J: T6 W9 ~+ k1 T" `
udelay(100);
* I( c! ?7 v! F' x: y. a/ _# Q% z temp=temp| 0x00000100;% P, `2 h& ^2 D+ T6 L# u
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. E+ R8 ^( @; { c' S+ S( [: U udelay(100);
! W, ^; j/ G) U, ~ {; y8 l* K W! b3 K printk("open success!\n");$ s& F$ s, Y; i0 F$ S% j( c
return 0;
1 a" ?$ @$ o8 u% j5 o) g {, @}
' s7 Z% _9 J1 _6 D: |% j2 I3 _& K* K! s7 S
static int mcbsp_release(struct inode *inode,struct file *file)( ^% N# I: \2 [( v2 ^! k) R
{
+ a0 r0 u- `; Q2 B' H printk("release success!\n");
# N. C% w4 y& z g& Z2 Q return 0;( z& A# @0 r8 X! Y
}
/ [) |4 h$ P) A" h5 ~% X* |6 D1 P
2 }+ T& M' P# ^9 N( p, Fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). H# A; p! O! ]% n. y" C8 L
{
& t& C- H" X3 `; ] copy_from_user(&DXR_data,buf,len);9 b( X, Z" J3 Q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 C+ a! T: b5 f8 L, q1 |% q return 0;
: O* v' \( p- n/ { - N9 r z2 Q, @2 o, q0 J/ Q4 x
}3 `" w" J2 l v# o X
, S/ a! q; q6 M' C0 W3 A/ b
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
. E k: N/ f5 G0 E* N" s2 u; O{
6 e% O, q( U5 r! D( ~3 |* _ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 n( q! m+ z) H5 g9 i
copy_to_user(buf,&DRR_data,len);
, G/ ?4 l2 ^1 C H return 0;
# P% h7 ~$ d' V d3 m}4 y# s3 y' n+ R7 y' ?: V2 X! j$ C
( D3 `5 w+ @1 ` i4 m/ w; `0 y
) q: U6 ~& ]2 Q) q' E" f, Q$ O% o) {5 wstatic struct file_operations mcbsp_fops=
( \1 R5 M- w1 X3 p- v' o/ P{$ o! ~; j1 d; O! x; S+ w. ~5 r- x
.owner=THIS_MODULE,+ u" h3 s; Y9 n9 S$ E% w" D, ]
.open=mcbsp_open,
; t2 s5 L3 x( `" J" U7 k4 Q3 g5 l .release=mcbsp_release,0 z, V# z4 |, M* Y3 k' y
.write=mcbsp_write,
' B' b8 N3 I+ Z2 Q0 z e- u .read=mcbsp_read,- L/ M$ a( y' c& b% L" ]* a- K
};( H, [9 m, }6 Q9 ~. J3 V2 U u' ~
static int __init MCBSP_init(void)' o# ?8 i& |+ I
{
3 c4 f! y4 E& { int ret;
0 u4 t! E" ?- ?, j; e unsigned int PINMUX1_REG_old;
/ r/ r7 p7 o6 v+ V4 W8 [ unsigned int PINMUX18_REG_old;
$ q( u. `$ A% Y+ H8 t5 o" B unsigned int PINMUX19_REG_old;
& w8 e( ~5 R3 X unsigned int temp;
8 ~/ E |' A' j* }5 {, L if(MCBSP_MAJOR)- i9 j. {( u+ y9 K& b: [
{2 { M9 {$ S: c: y
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 O1 w8 k+ y \; p8 ]
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);3 P. }3 @) ^- c# x. J& s
}
4 p5 y" z" s$ b; X+ y else8 S9 [% B0 h4 `3 p/ p. A( ?# S
{ Z, m4 d) F( a. t
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- G/ a: k( X) e: c) w3 r0 a
MCBSP_MAJOR=MAJOR(mcbsp_dev);. I& s4 e4 s8 ]8 q
}
7 c. x w% }0 |5 y- q
( }" U% i M* b1 _7 W3 o if(ret<0)( L/ u6 v% {) \
{
9 Y% U/ P$ `7 Q' ]; t2 A4 H' T printk(KERN_ERR "register chrdev fail!");
5 [ [- C" H2 ]5 Z) o return -1;/ o% ^+ V" x! o x1 c
}1 I; z5 ^$ x$ p$ P U: d
6 n# `1 W3 v) K" W2 p
mcbsp_cdev=cdev_alloc();3 \, m2 B m- x5 W
, b9 n1 O# [* e" V" C- O if(mcbsp_cdev!=NULL)
/ Y7 s' s" b2 y/ y t {. u% i' Q( m) z& }5 ~' f9 W9 |
cdev_init(mcbsp_cdev,&mcbsp_fops);
8 m& Z8 ?( V& l5 y. ^ mcbsp_cdev->ops=&mcbsp_fops;
m) F/ h: } U mcbsp_cdev->owner=THIS_MODULE;
: t- V. ]" \$ P: ]% ^6 B
, ?3 S: N& I- {% s( s- X! h if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 T- N- H; ~/ D: P5 e
printk(KERN_ERR "register cdev fail!"); z1 B6 Q( W/ M6 H
else
" G7 R% [3 H4 D6 ~0 ] printk(KERN_ERR "register success!\n");
$ F [0 n% D, s }
0 t6 ?" l9 z+ w else
& _( t: C$ C( [7 Q7 [ {
4 b* D3 D& U) O3 f) u m7 | printk(KERN_ERR "register cdev err!");' V6 r/ I; o3 w$ ^1 G3 t
return -1;: d% Y& s8 O( O1 z) ^
}8 n# r( N5 m2 B
+ x) `8 X, _ a8 g
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ A+ T4 K2 {3 }8 V0 C+ {* o
if(IS_ERR(mcbsp_class))& L( G1 E) o: K" ]2 T; H& q8 D
{" V! j7 x5 n' B! w! V
printk(KERN_ERR "register class err!");0 f6 o. p- X, E$ r2 Q
return -1;
* y+ r" h, B) U' f6 p+ o/ p' v }
; u/ A) i$ Q% c4 b; r device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 K( I9 ^. t% D6 @# e7 |
. @0 ]! f1 j- [) O. X: z0 r //PSC5 q- ~) T) r7 Q0 k" Z% O
//add Enable MCBSP
% }, C3 L! M/ y1 [, P% h. x //test
, ~* C7 i* z$ I3 V- R ] temp = 0x80000003;
, ~6 y/ u; K9 P6 W. t writel(temp, IO_ADDRESS(MDCTL15_ADDR));
" X/ _( f/ U( J \0 \ temp = 0x00000003;
; d i: p0 x' ]+ P2 k+ T writel(temp, IO_ADDRESS(PTCMD_ADDR));8 j+ d: z4 n2 w) V! x/ i% h
& ?( q" Y# c$ H! {- y
temp = 0x001FF201;; B& L& I' V" n
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: P4 u# o0 K5 s' v% d) N& v. e4 J
. ^ n' r/ A( T" r! O( f; F! {* U //PINMUX 2 F( b- h& A1 D$ Y
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 M% ~$ B# m/ O0 u PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; t, t/ O% H: I) l PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* ]3 J. p0 I8 w' \# Z writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# g! L7 Y7 p$ | @
P% u9 o9 G: D0 e( l& T( Y //SLEEP_EN,EPR,L138_SHK1,L138_RC
3 Q5 J/ d/ J$ C5 y% _ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 J, a6 j( \" B( x ~+ _0 S" R- u PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% T% N; ]$ S; ], P writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);, i; o. I6 D( B
8 G- A1 M/ H0 U: H
//RESETn,L138_SHK26 v" X. s0 @9 m5 `: _
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 4 g" ^0 ]- }. Y, w& i
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ) |( V' \+ S$ f9 v/ _
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- I$ t+ A+ v$ _
! V( L& Z8 U0 S* ~" _ 5 e6 h; Y5 D# c) H" C' U8 E- j* k
//SPCR Register
( M$ z; h( u( x7 V& q; W8 }5 j //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& l4 {( \# c8 C* F( V, T5 @ temp = 0x03000000;//(DLB=0)1 N$ s( ` Q' Q6 z q7 v
// temp = 0x03008000;//(DLB=1)
1 C+ [/ c, Q$ o writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset& u/ A, Z% r, Z7 O
temp = readl(IO_ADDRESS(SPCR_ADDR));( Z: Z0 H8 {' n
printk("temp=%x\n",temp);& X- }: ^3 H# p# l# f A+ b
4 m7 N& A$ b/ L& W% s& W
//PCR Register
+ ^0 a; D1 E) O0 q$ W1 t5 o0 q3 e //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; ?" N, s& d; y! N4 k$ b2 r
// temp = 0x00000F0F;
- d! \& P8 V6 x' q8 ?/ z4 ]% {" s, S temp = 0x00000B0F;, k. m" n$ w2 ?' ~7 T$ r
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 8 G0 p5 z8 s6 W: \
temp = readl(IO_ADDRESS(PCR_ADDR));* F W; B: Q% t L
printk("temp=%x\n",temp);
0 o, q* g" Q; c; z //SRGR Register
1 z/ N6 a$ b6 K- L. G //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 ~ E$ z/ {: d
//temp = 0x301F000B;
9 ~" r4 a% \/ H. { writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized : S' x' Q& s) r! y6 d1 H
temp = readl(IO_ADDRESS(SRGR_ADDR));
) h3 T+ f% V j3 d! p5 ? printk("temp=%x\n",temp);
" H o* ^6 U3 g4 Q$ j; l' q //RCR
3 |: \& d& v3 a4 L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, s# ]: }+ ~, y$ ^5 ^
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 {( Z) P% y! a: c- I* ^
temp = 0x00440040;2 `: A6 k' j; q8 k
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
& Z" J: C3 M4 Y* C' ~ temp = readl(IO_ADDRESS(RCR_ADDR));! l% w: t" p( x4 a- [
printk("temp=%x\n",temp);
8 V" \! S! }8 ^: e& P$ r% C/ b //XCR
$ l8 Y6 j+ C- p //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* Y/ W' j2 j: n" e6 { //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 \+ T8 J+ {5 e, Q& U0 C% H temp = 0x00440040;" k! g- H# r2 w
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' u7 j: g1 J. q8 e5 v/ z
temp = readl(IO_ADDRESS(XCR_ADDR));
1 [2 a& t7 s/ K- K printk("temp=%x\n",temp); P; E& p* N5 L% a
udelay(100);
, m/ `' K( `( [2 K: q; r //SPCR Register/ t1 l6 T f. V$ p
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
3 s `2 n8 P- ~ temp = 0x03C10001; //DLB = 0 VS DLB = 1
1 k/ }9 a( |0 s, [" C writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled+ Q5 u8 u. N T7 n& P1 P
temp = readl(IO_ADDRESS(SPCR_ADDR));6 x9 x. ?* o4 I+ E0 v
printk("temp=%x\n",temp);" y% _; U1 Q" X
udelay(100);
( x! Z K2 U& k- t7 O& w% d5 i
//set GPIO direction
2 d. q2 W9 |1 ]7 J0 a: F temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* L) {, z3 M {/ G2 v* |- L+ L temp = temp | 0x00000100;//EPR----input# M/ _3 X1 B( b6 F$ l
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( b+ V5 R1 ?/ C U) v5 N5 B- Q. B __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); , r" R' x$ i0 z8 V' y3 g0 d
& A, J. U5 `' C/ Q: r return 0;: _/ A( Z+ |) |- f% G1 }
}' a6 J/ W$ ]9 v+ ]3 w- l' p
static void __exit MCBSP_exit(void)1 {0 Z0 Q% M M4 |$ t7 P( }6 ]2 j
{
" W9 p6 i% ?6 e% u F printk("mcbsp chrdev exit!\n");% O2 v' B. S) w4 G- K3 r4 @3 u2 x
cdev_del(mcbsp_cdev);
# m3 \5 B, \; d9 N/ G unregister_chrdev_region(mcbsp_dev,count);/ f0 r. a& M5 D/ Z. Q$ U! i G0 K
device_destroy(mcbsp_class,mcbsp_dev);8 R, ~, z# c$ I! a6 z. w& ]1 a9 v
class_destroy(mcbsp_class);) x) Q) x* b8 a Q% B& O
}
4 n! r/ j8 f2 ]( R! E* q% }" rmodule_init(MCBSP_init);' V4 _, g8 ? Q
module_exit(MCBSP_exit);; U$ [; s, y# M& j- Q+ X6 `
6 w- Z4 X: h; z* g
MODULE_LICENSE("GPL");
+ E9 m" l: B* I0 m. b
8 V: i) b- r/ U我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 q) z& O. a: k8 X我的应用层的测试程序如下
0 X7 j m2 A1 i#include <stdio.h>
) D* t. \& ~' l1 ]* G#include <string.h>5 S& \6 D6 Z# I# N3 \
#include <fcntl.h>
, x: @6 T: b- G: M#include <unistd.h>+ }7 l/ `9 B+ v
#include <signal.h>
/ u) Z9 p* z; _0 o. }5 }3 U#include <pthread.h> //线程
$ s3 p2 G1 D% ^#include <stdlib.h>
% O8 M# z K0 \' ~5 a7 V4 M#include <pcap.h> //捕获网口数据
) E1 r; p6 B1 \/ F#include <semaphore.h> //信号" w2 J+ R9 P5 K& a7 X: u
#include <sys/types.h> //消息对列
/ ^6 E3 z: R8 L* k1 ^! j( B#include <sys/ipc.h> //消息队列" G3 t5 \# S' ?) ~; X+ b1 ^8 {
#include <sys/msg.h> //消息队列' `0 \/ U' P3 y3 V( A, Q
#include <sys/select.h>
. V9 _) N: t. A9 c/ `#include <sys/syscall.h>
- l9 P, \. Y$ w" ^8 q2 E' j) g, t#include <sys/stat.h>
K. c4 ^3 f" y+ l, f) q! I* S#include <sys/mman.h>
6 j: V. T2 H+ } q* Z#define msleep(x) usleep(1000*x)3 v! \/ K3 a/ X% j% m# v* H
& l g9 I- Q$ }
int main()6 R8 |4 @ C3 U) [
{
, S4 B7 W! W, V4 q5 N, ]; V0 m //MCBSP,ARM与AMBE2000交互设备5 f" ]/ }5 e; i% u$ b+ y
int fd;/ C& E+ y' T% W# Z& }7 P% S i
unsigned short data_write = 0x5555;( O$ Q3 p; }' m' p1 ^- I9 Y
unsigned short data_read = 0x00;" b, q* @$ L# g, ^1 l
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 N% ?6 B/ c! i1 A
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ `9 m0 X7 }/ X ^! z
2 Q1 x; {% ^7 q9 U5 u0 l if(fd < 0)
1 C% E- l7 \. i1 J6 ?, B {
) O( Z& B- Q k+ n; V' Z7 c perror("open failed\n");
5 U# ?9 U: G8 h5 d2 ] return -1;
% B+ q2 z- ?6 N" S5 Y% [ }' T0 b( Q5 W: J' `$ ^# j. M8 c! ~
5 x( j- y, T0 ?: W1 J' i7 Z
while(1)
' | @5 k s! G' b o8 o {
6 R4 l+ C1 X, T/ ]4 V# L 2 e7 U* @, g. l# o$ [
//AMBE2000每次读写是24个字为一帧
3 N/ \8 }5 j) \" |% w! z% n //写数据时将数据在底层存储起来,等到中断的时候再发送9 F9 p* C2 m% _ I" k- C2 H3 c" D
//AMBE2000输入数据是以0x13EC开头的
# P, {$ c. ]+ j2 A& P+ y. N( R write(fd,&data_write,sizeof(unsigned short));; g- J& a0 R8 q0 }- w. R+ x3 G! M& W9 h4 M
! N4 `7 o9 _# d% E! M //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 h+ k- C$ |4 Q' D
read(fd,&data_read,sizeof(unsigned short));" F5 L2 x y+ j& \: [! e) a
8 y4 r5 y3 ~$ @+ \& w, i4 `
if(data_read == 0x13Ec)
+ j0 k" w3 o' {& i0 m# N! X, E {
; V, s) ~, u+ r! K5 A * n. G' \& T4 u! z& Z
printf("data_read = %x\n",data_read);
4 x5 z8 r8 W3 h+ p/ [& i Z }" ]3 c6 A P/ s+ Y& Q
% {+ r: q" R X9 i
msleep(10);- w/ R/ B0 t4 ~1 X! l! [: X* k. i
, {3 O: A7 }! u5 P. i
/*2 F% }. | s$ O
ioctl(fd,1); * W7 T4 z9 U6 l
sleep(1);
+ v! Q# }- @# u8 o: { ioctl(fd,0);/ y# s3 _3 o* m; u" ~% i4 c
sleep(1);9 e" K+ I2 y/ p \6 A5 d; X2 P$ c& m) r
*/ 2 s' n5 b5 m9 n/ K" Y0 Y& g
}
! E- R) D& Z0 o! J. h return 0;
" i2 p; ~" T$ K$ U " E7 `6 k6 t- k; e: ]
}
4 x" g& v2 q/ p
2 H+ n7 w' P @3 H! \ i8 [9 g多谢各位指教,谢谢! 急9 H' S. A( h- K9 Y+ M
# [, K0 b+ k% Q
2 w4 ]3 `6 S& v! C0 b. N" O6 X0 {
3 P: b V' F! w+ S6 H- S, y
& f+ i1 _1 ^5 m1 E4 S
+ X9 d! y7 A6 ^" x$ C' x |
|