|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: ]! h4 d7 r' g( ~3 ~4 d9 g/*
! _! D+ g2 @4 U8 G, }- i8 h% u * Copyright (C) 2009 Texas Instruments Inc( L. S3 d! h5 b* ^; \ T' A# r
*( [' x3 }+ I J$ X6 P: L, q$ ~/ ^
* This program is free software; you can redistribute it and/or modify
! z$ S7 R; C! w( }% y * it under the terms of the GNU General Public License as published by
7 K2 b/ I% @* |/ L( _( G * the Free Software Foundation; either version 2 of the License, or
( r5 b. A" p- E9 a0 ^7 O * (at your option)any later version.: a% @2 Z0 ?. h- N. q" I
*
, H7 _$ f# t( h& ] * This program is distributed in the hope that it will be useful,
, e3 b, E5 U* W5 J! f * but WITHOUT ANY WARRANTY; without even the implied warranty of* a W" e7 `( S& a1 V9 u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! r" A+ L3 e: _8 T- ^0 n
* GNU General Public License for more details.
~* o$ K! e- \" g* [# g *
+ W6 O8 d, J3 k+ p7 j- R * You should have received a copy of the GNU General Public License
# W7 I1 k3 R9 f5 ^- \ * along with this program; if not, write to the Free Software
! T h1 I3 A( ]/ G* R * Foundati. B% h% h% d) P* I
*/9 i$ |) O& V& |; n. n
#include <linux/module.h>
$ l' h X: P p3 R#include <linux/init.h>
$ |$ i4 \) |4 [5 M; ^#include <linux/errno.h>/ u5 |! ?. Q% Y b
#include <linux/types.h>5 {* d3 L2 b6 M8 E2 d: G
#include <linux/interrupt.h>
6 m' c' e$ @+ t) F#include <linux/io.h>
1 ?1 y8 e B! t#include <linux/sysctl.h>
& R0 {- Y, a4 p+ w* m4 |#include <linux/mm.h>
' X* C; R* g _+ O+ [9 q#include <linux/delay.h>
2 H9 u3 u6 r* o! s#include<linux/kernel.h>+ A# l/ o4 P+ D3 u/ k
#include<linux/fs.h>) ~' t' |4 [7 m% v# C U
#include<linux/ioctl.h>
! C5 q! d ?0 f0 [#include<linux/cdev.h>
. v/ F5 z5 @; X' b% `2 s#include<linux/kdev_t.h>4 c. C8 `! {' |. s% |
#include<linux/gpio.h>* M- F5 c- _0 K
#include <mach/hardware.h>1 p3 z( d) B8 T3 q5 |, n, L) h2 v
#include <mach/irqs.h>/ |% H2 a, m) r7 i+ r
( w( E. |8 c1 r6 v$ n# k7 s8 q
#include <asm/mach-types.h>: `& D" L( D3 Q) p( g
#include <asm/mach/arch.h># w. @: t- Q6 F! i
#include <mach/da8xx.h>2 o( ~8 m. e: F5 L5 n# K% L7 D
#define SYSCFG_BASE 0x01c14000
3 N1 P( u* o* d* S#define PINMUX1_OFFSET 0x124 - t& G; w2 W( V" `8 N6 e
#define PINMUX18_OFFSET 0x168 ' ^+ N4 n, g ]5 W0 ^! W
#define PINMUX19_OFFSET 0x16c
- F# _5 W4 C8 |3 P% e1 V8 ?, N#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
4 o* D( ]& y5 [#define RCR_ADDR 0x01D1100C //MCBSP1_RCR: n8 ~, O* [1 _7 z4 w3 n; K- e
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR7 W( [9 }+ d$ F0 s
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
! y* _5 g! @; S8 ^2 k#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 Z, h" f5 i; W. R / z5 y* s" q9 A& B d" {0 {. b$ U
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
# L+ |% }: h t5 {- x" ?# W#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 `; W! i1 i. S6 K: {( s//PSC( x- j$ E; N3 N, U, C$ [$ D
#define PTCMD_ADDR 0x01E27120 , [+ Q% i) P& g- l0 O( C& |
#define MDCTL15_ADDR 0x01E27A3C9 { `5 ]+ c/ I3 n
#define PDCTL1_ADDR 0x01E27304
6 V& r8 B M @4 v' R/ r: [//GPIO8 direction- f+ n( ~5 y/ l
#define GPIO8_DIRECT 0x01E260B00 J% ?# ]7 m( F: M: Z" R
#define GPIO8_OUT 0x01E260B4! v+ y3 A [# Z6 l- d
#define GPIO8_IN 0x01E260C0
0 |. K1 e8 ]3 ?* @6 U! e" o8 P$ |* F
//#define MCBSP1_RINT 99
" c& n" B% o, Z$ U! r( G) c//#define MCBSP1_XINT 100
- m! x d0 O4 @2 Bstatic int MCBSP_MAJOR=239;
# C" a3 J4 Z. m: E. G# Fstatic int MCBSP_MINOR=0;$ \$ Q ?1 ?8 N J( e6 ? g- }
static int count =1;
2 e. @$ f ?- f) \5 V3 J/ v0 h! K
#define MCBSP_NAME "MCBSP-device"5 x* ?3 D; I) }) v' @& i
, t2 g2 E' O4 p/ ystatic struct cdev *mcbsp_cdev;( S! l5 M: Y# z4 o t$ [
static struct class *mcbsp_class;& u6 i' m' \% a, L
static dev_t mcbsp_dev;. c* `& f& }$ [
unsigned int DRR_data;6 g8 r0 \ g) ~$ x; _0 m
unsigned int DXR_data;8 u' c' P/ n3 H5 L- g. N7 y
static int mcbsp_open(struct inode *inode,struct file *file)
5 k+ p& y' u! Y; W `{
3 W' { r7 p' _! U ( }; A3 p5 o/ F1 p/ C' h8 N
//interrupt enable,initialized' @# L5 E3 ?- F) X* o
unsigned int temp;
& Q; Z, g6 U0 }) d$ _( n //SLEEP_EN(GPIO8[10])---0
- J T* b" ~ E- [1 O temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- c, F% F1 w* S5 f; L; V6 U
temp=temp&(~0x00000400);
( U8 o' H6 l6 D- t0 ?. b __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; @" y8 k5 n" l: e //RESETn(GPIO8[8])----0----10 H+ [( c1 N: O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( {( L* t$ r3 c! i* Z+ |
temp=temp&(~0x00000100);
3 y# a- x; \& W( K# K. s' ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ }( `9 z7 p; i0 P8 I+ b. ^5 T" L udelay(100);# }1 r# U- w4 S. h' r
temp=temp| 0x00000100;) a" n, M' o# k! l# R D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ |/ H; _- m/ n
udelay(100);; I+ V/ U4 T$ Y2 g
printk("open success!\n");
6 c/ F/ Z% _- Q: G return 0;" N0 I2 H+ \7 c y- x' m
}
# f+ X$ r! P: l3 o
: E& ?. E: t U! ]" Q4 N; kstatic int mcbsp_release(struct inode *inode,struct file *file). _, S; F1 u- t; b% o- C [
{9 {6 a$ ~2 e& M4 I/ A
printk("release success!\n");
1 i2 q- p' S" |0 A1 k$ W- b return 0;
0 e3 R/ {- _# q6 z}8 n5 W9 F) H" r3 Q/ g3 e) B/ T
3 h/ c5 i& ~3 J0 H7 z% i$ Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 L) B) j! O; L/ S8 d) V( v+ x{
* j" X6 G3 N" t! A1 \( r3 U; s copy_from_user(&DXR_data,buf,len);
3 O4 I- D `: _3 {# B iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
7 E8 Q1 K: c5 U return 0;
: P+ m. O, E1 q' T( I 2 z4 p3 L+ m2 Y! t
}: u$ e5 S0 J& p
, X8 o0 i/ @0 B7 Ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* V0 c" r& l4 s0 E o* j; g{
) L3 ?- S9 p* c& g+ A( z' F DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));% p5 X/ D/ G$ B8 ^7 y# K/ @
copy_to_user(buf,&DRR_data,len);
7 h5 h$ \" g+ _- G return 0;
: ] ]! D" R% U1 f" R3 N% _: P}
8 y7 V A+ H& c0 Y a0 D2 x, C
9 ?) T p0 \: N8 I# K3 G. T5 R5 y3 Z9 {1 B9 c# l- ^
static struct file_operations mcbsp_fops=
1 |% f9 c9 l$ O% b0 I W, ^! m( p{
& C' I& R% z2 o .owner=THIS_MODULE,
: e1 Z5 r4 P" Q1 S: A, M .open=mcbsp_open,
! [# X R8 q/ \( ?3 ~ .release=mcbsp_release,9 m0 m; y, {4 J; b$ v, s
.write=mcbsp_write,8 K4 o4 ]3 Y! H( g3 S8 q6 S
.read=mcbsp_read,
( o& ?- G7 J! K1 v; |9 K};, L+ O$ Z. y0 {, n
static int __init MCBSP_init(void)
6 ]9 A0 V! i7 V. Q{; ~: s1 w$ H" d6 j; Q
int ret;2 U4 k/ J* }: u6 y- K8 W! k
unsigned int PINMUX1_REG_old;
: K4 O0 W) J$ f: M1 N( m+ V unsigned int PINMUX18_REG_old;1 S1 I# V2 Q+ g
unsigned int PINMUX19_REG_old;; r3 p4 x7 C) j7 t: p
unsigned int temp;
) H( z8 S4 m5 V! d' t if(MCBSP_MAJOR)
5 e' J( ], r% N9 [ {9 @% Y r- g& U
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 X. o3 G- Q, n
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);. D9 q& P/ m& k1 H' J
}
9 Y8 [+ Q- B, G, x else4 q+ ~: _) Y" e
{
& J- K( g" m' Z+ D! i# N$ |9 s4 ^ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 y! t0 N) B3 A# ?8 E# R MCBSP_MAJOR=MAJOR(mcbsp_dev);4 p j! ~* A$ p7 P2 n, [, ^
}* j ~8 `- S, k$ c- I
5 Y% m# s! Q2 J) @! c4 V
if(ret<0)
2 O8 s% }+ @! c0 i+ z( c {- [2 h1 ]. @- j a; I* t( `
printk(KERN_ERR "register chrdev fail!");
" b8 L/ v; L; s' Q# x3 e return -1;
& W" c5 d" Q: c( s }
0 o0 ?% b& |4 Z$ ]
. Y3 f! ^% T0 e2 | mcbsp_cdev=cdev_alloc();3 u8 Z% l* ~) T$ L
0 ?6 R$ K5 @2 a0 f" v6 L% l, y/ x, @ if(mcbsp_cdev!=NULL)% r* O6 w: ]8 h- J8 W- p
{
4 W U& a* F, X1 [0 i6 [4 { q cdev_init(mcbsp_cdev,&mcbsp_fops);
' ~4 [+ r# m' `( l6 N mcbsp_cdev->ops=&mcbsp_fops;% G! _; V$ h j! d- V9 m9 ~
mcbsp_cdev->owner=THIS_MODULE;
1 x1 A5 E2 m( y6 q* Y% J, W8 o
' K, D, H+ A1 ^/ ~ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 {* u4 ~( l1 L% v( _% C printk(KERN_ERR "register cdev fail!");( h: H& s5 {5 m3 [5 v$ w) d: w
else, X& ^9 I& d k* z
printk(KERN_ERR "register success!\n");
" F3 H. E8 s$ Z2 [+ ]! d0 A* ` } y, T! M; E; J' J S
else9 o% T( u, F- `4 W! L
{
# a( l6 x) h, ^/ w8 V/ b printk(KERN_ERR "register cdev err!");9 k% `7 w& A4 @
return -1;9 i- r8 c4 k$ ^: G7 ~9 J, I3 t
}2 Z1 b) c" B5 a- L; M: M1 k, ]& |
) y9 p2 d# N# G3 e& N mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); k$ ~ P; w5 `( Q
if(IS_ERR(mcbsp_class))
& @6 _8 s" [$ f* b9 B {
6 i# X$ A5 @( X! h+ J8 W printk(KERN_ERR "register class err!");
& I3 {- `5 B. G6 m return -1;
+ q2 Z1 Y" e# Z, F }
- n3 M/ B6 P9 |& P. O+ O device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);& Z8 S0 K1 c% r
$ |4 t" m9 b" r4 E //PSC! e7 x- F4 ]8 Y+ M% S
//add Enable MCBSP( I; k) h! r" W
//test/ S1 q: u, _9 Y( i1 H
temp = 0x80000003;$ b# P" C' \+ i! z' G
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 J) |+ z4 ^9 T8 z0 v temp = 0x00000003; Y9 B8 I6 K" x) G* s" ?
writel(temp, IO_ADDRESS(PTCMD_ADDR));0 h5 h+ y4 l4 |6 f& y
' c( C2 ^ U0 n+ O6 C' C# u
temp = 0x001FF201;" h* j o% B1 ^/ B1 Z
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( g# O- _; m; [4 S
H- Y6 N5 L9 v: q //PINMUX 3 e1 ?1 ~# O- [- u" W% k
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. T1 m3 j, f) x% g1 M PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ X$ S! v" G, N# L+ A PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
/ J5 m" E j t5 r% o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: Y \# s/ s6 u4 y9 {+ D$ D6 n( N
& y1 i1 Q$ E8 g. V* e
//SLEEP_EN,EPR,L138_SHK1,L138_RC
% u5 v, q1 F+ X1 \ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 g( Z0 f' X3 L5 a! O# l- ]0 B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ ~$ G. O- x8 G E
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& f: g' R7 J9 |, d: F- [ e, I. V
6 x6 B6 J: t- ]& o
//RESETn,L138_SHK2, @2 Q/ D" o% n [ q( F
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 c! D6 _9 l( J% D8 R d- W PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ) D$ B4 [. Y* l: j; h2 F7 G
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 k8 I _1 Z5 u5 F
, ]) s0 p% L( f3 W4 a ) d$ H) B ^0 c& t7 g
//SPCR Register& H* Y, f/ z& s/ z: X# l% |7 E
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset* P0 L$ Z! D# y" w$ e
temp = 0x03000000;//(DLB=0)
( I0 I% E# }+ W7 c' a% y // temp = 0x03008000;//(DLB=1)
8 @5 Z7 V {0 k" X/ ]& b/ L& m writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
3 r1 r4 i" f, U. p& n, s temp = readl(IO_ADDRESS(SPCR_ADDR));
2 q, p+ V: ^; o1 s) X: y& p printk("temp=%x\n",temp);
0 |+ ? K% r0 t/ M9 O
8 `/ E# a1 k. V5 p+ u //PCR Register I* {+ t$ S4 G0 L
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
: [% l, d& ]( r& f* m% Q // temp = 0x00000F0F;
- L- Z7 v' l" m: D, P2 Z" [4 i: R temp = 0x00000B0F;
8 ?/ L: M7 E2 m8 W% c writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
' a& i8 d% c& V* [7 }4 Y0 T' b temp = readl(IO_ADDRESS(PCR_ADDR));9 z' e+ J( G" L- r) H0 g
printk("temp=%x\n",temp);
# S, \7 _" K. R8 f //SRGR Register
2 @& q# R% R6 {7 B) X9 T9 ^0 k //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 O% @+ C$ B' E //temp = 0x301F000B;
& ?8 C$ k$ I1 z2 ` writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ' `; W( t* B* P
temp = readl(IO_ADDRESS(SRGR_ADDR));
& c# g4 U6 J8 f- x) t printk("temp=%x\n",temp);
( ?7 p5 }3 `+ o% V& E //RCR
( ]5 p) I5 ^$ p( G2 ]7 g3 N" n- W //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,5 Y2 J, Y5 M5 a0 @4 ^: I( V
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 E) M6 P3 d0 ]& M7 t temp = 0x00440040;, Q7 F+ P, k5 O, p6 y
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized % h v# |- o8 G' C
temp = readl(IO_ADDRESS(RCR_ADDR));
$ H9 S6 }% B5 }2 s$ P printk("temp=%x\n",temp);
8 p9 P- F2 B8 U; O //XCR
& f5 r( ?) _- L) }* q G8 }+ C //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 Q! {4 _- H: Z, L) i0 k& A
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. q, z/ W t- S- {! Q, i; n7 z
temp = 0x00440040;! L2 y) @; R* p: s
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 7 q4 c( E3 Q! m0 D( B
temp = readl(IO_ADDRESS(XCR_ADDR));: Z ]% |! T% c0 Z" O! g
printk("temp=%x\n",temp);1 L9 \- l8 q$ j7 x9 K
udelay(100);
* B+ h G1 X% w" j9 d //SPCR Register
) |& `. C) L* W" G //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 ]8 J6 ? l6 _2 H1 K4 a. x
temp = 0x03C10001; //DLB = 0 VS DLB = 1" [ {( p5 G2 w; L. y9 Q- N$ K; j$ V
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled R8 u( [8 t- W6 A+ ]2 w9 g% ~
temp = readl(IO_ADDRESS(SPCR_ADDR));
- ?/ M& d' N" D% @ printk("temp=%x\n",temp);% R+ u( i6 y f9 J! Q/ t; b
udelay(100);$ I/ E/ E K- X) L
- [! A) x/ H, L0 j8 k& U //set GPIO direction
4 u+ w- O9 V! P+ z0 F% } temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- v8 o# x4 Y& f4 v' i temp = temp | 0x00000100;//EPR----input
9 z3 G% S( ]: q: h3 D temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. P- i* I: ]% m# [
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 d& |* g7 }$ E. c
9 m/ c5 T! U( {
return 0;" _2 }9 ?. i. J+ m# z6 F V
}
0 f% Y. W) q7 e0 Z4 N, N, istatic void __exit MCBSP_exit(void): p, y- z' p2 h
{
' Y4 s+ S$ @2 L% k- s, H ? printk("mcbsp chrdev exit!\n");
6 N6 O/ ~; @( q7 S" I% n9 D, ] cdev_del(mcbsp_cdev);
: K- m( y1 }' B unregister_chrdev_region(mcbsp_dev,count);2 e" y4 w1 R4 \9 R) F9 s
device_destroy(mcbsp_class,mcbsp_dev);
! _- A- M# j9 k& t class_destroy(mcbsp_class);
. c9 v; R: \4 i}
( `8 w# }/ i6 a/ N8 rmodule_init(MCBSP_init);
2 a7 E9 \( n1 C# h- c3 Y1 N {4 Fmodule_exit(MCBSP_exit);" G7 s1 d( D5 \( ^6 r" i, d
4 [7 K3 s" ^+ D
MODULE_LICENSE("GPL");6 b2 D2 g3 e- P+ Q% I& {
3 T$ z- `0 \3 {' G5 p& b8 f* M P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, j& ^- K% h7 x
我的应用层的测试程序如下
# t3 \' J% ]7 B h+ N9 ^" K#include <stdio.h>1 E0 R7 V( C! _9 q" A% {
#include <string.h>* b' V( H/ d$ u" ^2 A( ]
#include <fcntl.h>0 l/ u0 K% o8 ]* r- D
#include <unistd.h>6 t( K7 M# h( b$ L" L2 B
#include <signal.h>
6 [( d6 a2 s" }& U* Z/ c; j#include <pthread.h> //线程
/ s$ M* b8 V E#include <stdlib.h>; W+ A4 s! N! G b, \4 w) C7 L3 |
#include <pcap.h> //捕获网口数据
9 `9 B7 i) ~7 C1 I3 L; v#include <semaphore.h> //信号
2 Q0 y* I; L6 I( a8 n# c#include <sys/types.h> //消息对列( S, y* \9 O* W/ ^# }6 P
#include <sys/ipc.h> //消息队列
2 u2 x7 D! y( K$ r#include <sys/msg.h> //消息队列
2 \2 j$ [% k3 U8 n#include <sys/select.h>
& _1 |1 f4 e: r( t. W#include <sys/syscall.h>
/ f$ E# e! @6 Q& Y8 f#include <sys/stat.h>
( A- f9 {* ~; y `#include <sys/mman.h>
" ~$ _3 a; k- m& [- M% k$ ~#define msleep(x) usleep(1000*x)! i* {3 j0 _2 l5 G" Z& ?: l
# @7 G: U) f0 O' `int main()/ @$ K! _8 K% K6 F) I1 V {
{ _+ C8 `7 d; P! r
//MCBSP,ARM与AMBE2000交互设备
. S: n: X6 L$ {8 e5 E; s# }( q int fd;& {6 `1 m- K# c1 m- e2 H
unsigned short data_write = 0x5555;
. @4 N! Z6 ?, O7 y! @5 h; }+ L; K" G% { unsigned short data_read = 0x00;
/ H- v$ P* j' d. D. B/ |& }* v" W% P fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 E6 G& H8 X- l' E3 C. N // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 F- ~2 T/ U- S
" p. f8 N1 e6 C. j& ^ if(fd < 0)1 u. f4 B& N( W( g$ S
{! s; G4 A/ t U% T; \! C* E. k4 ~
perror("open failed\n");
* N2 w6 i$ {5 v return -1;
8 c" g! A, Q- S7 Z }- ~1 b5 K/ C0 }% o, ?) n7 Z! V0 k/ Z
6 f) ^& I6 o" K4 P5 }' b while(1)& _" r j( _- u2 J) b! p
{
& v3 ?. F3 G7 ?3 C* A8 @ 5 H% z- G3 q5 d
//AMBE2000每次读写是24个字为一帧
1 E- O& r" ~3 b: W //写数据时将数据在底层存储起来,等到中断的时候再发送
0 T& c/ A! p: W1 k! g8 L/ z6 Z //AMBE2000输入数据是以0x13EC开头的0 N5 ?! g9 w/ E; J; b: G
write(fd,&data_write,sizeof(unsigned short));
- F+ Y8 ~& Y/ ?. X4 \$ z
4 q" X) d' T0 f //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 L6 n( N. @5 k) h! f$ A read(fd,&data_read,sizeof(unsigned short));
* G% L; H: X) Q0 c
# N- T+ E, ^# _1 W+ V& K if(data_read == 0x13Ec)
' T/ Z1 ^7 N4 M. Y: ^6 c3 ^ {+ n' k4 R: ]- {, t( {3 c
+ C7 `% [% f( t# e ^
printf("data_read = %x\n",data_read);
, ]# x- I& `# i$ Y$ \ }+ @& ^* ]3 d( J+ |% v- [
9 Y: F2 Y% O+ B$ m3 _
msleep(10);; ], z# @2 S9 P
3 x* Q8 ^; K# |) }8 I /*
3 i+ b; j' j9 ^ ioctl(fd,1); % W& Y* I- L+ P) K, T* M; b4 K) c- _
sleep(1);
2 \% v. Y9 Z' w7 a# j9 | ioctl(fd,0);
- N" M! P1 Y( \& t3 k0 T! p sleep(1);- U# `% |( E. W7 ?
*/ % ^% m) N6 ?' W2 p
} * Z- }7 @- B! W# L8 j. c
return 0;. F3 i* W0 r2 e( Z# ~3 V* Q
% N8 }+ P+ X' u" w( {" |( k
}
4 c7 t( i$ n: E$ k9 z5 u# q6 n+ G0 I8 d( ]
多谢各位指教,谢谢! 急$ ?- v% k# [2 \. c1 h7 _
, Z+ |: N7 W+ z! E8 r( \
. K# r- n# P: {& t
9 |8 }1 f, u) ^, j( V& p$ s4 s& s6 U: @" o& ^& F! L
! G% R: c ]6 p: w( A7 x; I9 ?$ d
|
|