|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; y# ~' L) r: s! U& [
/*
" N6 `( d+ s" S, g1 ? * Copyright (C) 2009 Texas Instruments Inc. y2 Y" P, c7 |* \5 L9 S
* w- s3 W% [* a$ k: _$ f3 L5 W3 ?
* This program is free software; you can redistribute it and/or modify0 }+ u9 W6 P( c( D3 m$ R1 e: |8 S) r
* it under the terms of the GNU General Public License as published by$ d4 `$ `9 L h# w( B( c# m
* the Free Software Foundation; either version 2 of the License, or* s( U% g2 q1 d5 w9 Y$ G' Q6 V; I
* (at your option)any later version.
0 O# x& R# C# Z2 B *. Y) z& _( g" H( @9 X8 `, z
* This program is distributed in the hope that it will be useful," n; o- _5 f% J
* but WITHOUT ANY WARRANTY; without even the implied warranty of' ]! R( B0 _3 \- H7 F9 i
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* P, i S9 Y( E& D
* GNU General Public License for more details.: U6 ^$ g; B ]0 l# J3 _" y# P
*' B! ~, H) Z. ]1 H
* You should have received a copy of the GNU General Public License
5 t, s0 t+ c* z7 K, T6 M * along with this program; if not, write to the Free Software
- O% G% G2 |4 X * Foundati3 r3 B) H; M2 X3 S* j( O
*/' Y. C0 i' Z4 ]5 @- J3 x/ Z
#include <linux/module.h>
1 G( u- E7 s2 _3 T#include <linux/init.h>
3 a% `8 c" J% S' S#include <linux/errno.h>
. q" ~; u" Z P8 l" s5 [#include <linux/types.h>7 s. C: Z, d( n5 j- D1 Y, N
#include <linux/interrupt.h>$ |. w( X8 [# H
#include <linux/io.h>
" r) o6 ]+ H5 [* c, k#include <linux/sysctl.h>9 f0 B1 w/ H1 Z$ w$ I8 j2 C
#include <linux/mm.h>2 W$ |- j0 ]/ x( u
#include <linux/delay.h>5 w! o" O/ L E) y
#include<linux/kernel.h>; M1 l2 e$ z/ [# c% ?* r/ C
#include<linux/fs.h>, _5 t5 L0 z/ T7 |: g
#include<linux/ioctl.h>: w( T" T1 p O1 p
#include<linux/cdev.h>
) ]9 ^* B9 u& b- f$ S0 m o. e#include<linux/kdev_t.h>
+ H3 X, V7 {# Q8 s#include<linux/gpio.h>
/ f) X- H. [0 h( M x#include <mach/hardware.h>4 l: U9 |1 v$ ~( {" C6 M7 L; e
#include <mach/irqs.h>+ y9 w ~" X( L- o
) R$ j" l* j. a- `' A
#include <asm/mach-types.h>
) c5 I5 E: t$ |4 C' ?, k; g5 j#include <asm/mach/arch.h>
0 h+ `# o/ v7 [#include <mach/da8xx.h>/ \7 b# R- z. O% }# a8 Y# K: _2 z' j
#define SYSCFG_BASE 0x01c14000
/ c! b- @2 @# Y' |, A" {#define PINMUX1_OFFSET 0x124 2 q& y' ~& ]2 U& s" ~, j) }6 J/ B
#define PINMUX18_OFFSET 0x168 * Y* M( r& {$ Y% r; G" ^
#define PINMUX19_OFFSET 0x16c4 T7 r. G d* ^3 M, g
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR, T( L) u& z( O% v3 A$ K
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR' C) A2 t4 l8 u1 Z, _+ i
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 B6 j' L4 c3 L8 ~
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR7 K. {4 f* v7 G
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 \) G8 ]0 j" E1 y
& d8 [2 Z0 ]' Y2 v! @/ d% v. b#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
$ p4 v* o4 ?( s9 k#define DRR_ADDR 0x01D11000 //MCBSP1_DRR& I, V' O8 G4 s, T7 Y4 r; g1 u
//PSC
; `- O2 J: X1 d#define PTCMD_ADDR 0x01E27120 0 x }5 ~" q7 [0 E' V, ~
#define MDCTL15_ADDR 0x01E27A3C
' O+ D- s' E* T#define PDCTL1_ADDR 0x01E27304. q* j V! q7 T
//GPIO8 direction
8 A# S- l9 T6 f' R#define GPIO8_DIRECT 0x01E260B02 e/ i8 d: B4 h
#define GPIO8_OUT 0x01E260B4
1 {7 |" ]8 ^+ T1 q2 M#define GPIO8_IN 0x01E260C0
% Y! B/ j- G( ]3 [* c S6 F6 C! {& ]9 _; M T5 M
//#define MCBSP1_RINT 99
7 R) F) Q; D# `+ O//#define MCBSP1_XINT 100
~7 e& R4 I8 ]6 D- n8 y; d8 @( nstatic int MCBSP_MAJOR=239;( a' M" I" p$ p3 {3 B+ J. a8 f' b& a
static int MCBSP_MINOR=0;
# @6 ?. O: e _$ q: l1 {3 Lstatic int count =1;
) K* u b* @, Q" m' [$ E3 i
; m7 a" s& p8 @0 r# X2 H& f+ ^#define MCBSP_NAME "MCBSP-device"
) g: j. U+ @# C* p6 c8 s& n1 z. z% C. C; C0 d* H6 y4 U
static struct cdev *mcbsp_cdev;, z! K9 R+ R3 h/ a
static struct class *mcbsp_class;8 ?; P) G6 F3 o
static dev_t mcbsp_dev;% d% m, [6 |/ C1 t/ y
unsigned int DRR_data;
& m! z" | [- [9 v* X, aunsigned int DXR_data;
8 T7 S" U& B1 D' istatic int mcbsp_open(struct inode *inode,struct file *file)
: p( _$ V/ V: ^{" R0 _3 ~0 s" ]+ r! c
3 z8 I* h- N& i //interrupt enable,initialized3 Q3 @$ ]- _5 D1 m3 {
unsigned int temp;
3 M+ F9 w9 ]7 p X) K9 F7 d //SLEEP_EN(GPIO8[10])---08 S. b4 w$ ^- E& ~
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 B- C& F- U' K; c' J temp=temp&(~0x00000400);/ n4 X, b5 _* G, ?
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 t5 ?9 j9 L0 e //RESETn(GPIO8[8])----0----1
3 J' c( _) u0 d3 c( W3 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 P; g P+ l' @0 N8 o temp=temp&(~0x00000100);; _, ]2 G6 l: K8 a( b# l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 i0 F; h e$ {% @/ G
udelay(100);
+ I1 J3 o4 o5 w! {; A7 ^ temp=temp| 0x00000100;
" a# Q/ ?- {5 V1 ]; h: { __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---14 T# J& k0 Z! j( Z" X# {
udelay(100);
& Z" B" H* ^ X1 H1 o1 y printk("open success!\n");, p9 f( s! _$ c* k" D9 Y0 v
return 0;4 R+ D4 E7 A3 K% i
}& |4 \' [$ b0 H$ o
. t% V- R. n _$ ?9 a+ estatic int mcbsp_release(struct inode *inode,struct file *file)
, ~5 B% m: n6 k6 \8 n{# E. Y6 ~9 A: S) a
printk("release success!\n");
$ `) A7 |$ r* H. a+ ] p o return 0;- r* T: `, {5 K3 n
}
$ y9 @7 r1 ?/ B/ J% }6 @% P8 |- v! O' ~1 T! G v; m& [8 a" E2 `+ ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( s/ y* r9 {$ Z/ v6 A{
3 d+ O# x- O% I0 m* P& y copy_from_user(&DXR_data,buf,len);
3 `# _& ]) [ G$ D# ?' W iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
$ }9 y7 r; k% r: w return 0;4 W/ I8 D: c/ n% |6 F" b- R4 I
+ g+ }$ h9 \6 n" u8 I}
4 {$ [& f4 j% _ Z# N7 q; O' U6 q. l8 j1 Z3 Y$ [; @7 |
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 S# e1 `& ~/ \+ X. H{
- f/ I% R6 j2 B# J- n4 ~! _5 Q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
4 ^2 y( c4 X* C' G copy_to_user(buf,&DRR_data,len);
$ x' B7 X- G! P0 c; w return 0;
' }. c5 [8 [* L6 d& O/ P}
2 @$ T% s; C A9 B# o: c* [ R) w9 X6 L7 c3 G
. X' u0 q: _+ D8 y1 F9 \
static struct file_operations mcbsp_fops=
% A! u4 h3 t' \0 o1 f+ E{) i& b9 L5 G& i: j) i
.owner=THIS_MODULE,
1 U1 P7 m6 ^ p) d .open=mcbsp_open,
2 M- J% X, v7 W .release=mcbsp_release,
! s, I8 s8 `: T1 W# K- x% W& K( A .write=mcbsp_write,
2 ?: o8 B% e! X9 R1 t. d* Z .read=mcbsp_read,
- K& }9 \; m7 X5 A8 R; A};
+ L8 m7 S5 c! Z5 X" g4 sstatic int __init MCBSP_init(void)6 r9 O% P# g6 u8 Z' @1 \1 M: ~) T
{
' r0 C3 {* g3 h e: q* `+ B int ret;; J4 ?1 X3 U' s0 w
unsigned int PINMUX1_REG_old;9 c/ i) n2 k# |7 r( W
unsigned int PINMUX18_REG_old;5 v* s: F ~- r; d! B7 w
unsigned int PINMUX19_REG_old;0 |$ K7 ?: u" n+ ^2 X4 `
unsigned int temp;
/ p" I% ?( v- t& v2 ]+ m3 D0 k9 d: r if(MCBSP_MAJOR)5 z! T8 u, i; j2 C# S7 n
{# H& S4 C1 }* b8 G8 Y! E* r$ Q
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 w* ^0 ], r% Z# w; Q, d; e
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% S6 L* d3 J3 Q }' k9 S. Q: |* X! N; g6 M
else
( x5 w3 T3 N/ D( K8 c {
& U6 n: V+ u, U |0 n% V ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( t# _' S3 u% s
MCBSP_MAJOR=MAJOR(mcbsp_dev);
l& p6 t3 |9 b+ w5 S- F }1 z C5 W+ g0 R
. z; ]% ?, Z, O! C$ S2 f0 ]
if(ret<0)
! l! |# Q$ J* S9 t {
# F. ]/ r U2 { printk(KERN_ERR "register chrdev fail!");
" k0 D+ K8 q3 H return -1;
) ]/ Y& O# ~% ?! C }
8 A# S; w) L$ \8 Q4 N) | " z& o9 W L& u- x6 k
mcbsp_cdev=cdev_alloc();
7 O, p! B$ U4 K n7 B 3 P8 c/ x! I; E C( q
if(mcbsp_cdev!=NULL)1 Y$ S5 [$ ]/ _3 x p& m
{
" N1 v* I' p$ c7 Y1 H5 t cdev_init(mcbsp_cdev,&mcbsp_fops);
3 v, j7 z7 P$ `/ M/ j mcbsp_cdev->ops=&mcbsp_fops;
B; V9 |5 L; Z# }# A6 { mcbsp_cdev->owner=THIS_MODULE;
( C4 L9 a: K6 N& i6 q
' Z4 w, Q) r6 e0 { h if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! V% A$ U6 c0 O$ y
printk(KERN_ERR "register cdev fail!");! F" E# C5 b5 R* f; r& }/ H1 L
else$ X' P( M% ]: B2 s( i& U
printk(KERN_ERR "register success!\n");
4 ?8 M3 F" u+ D8 O$ Y' ~% ~ }8 A6 j# ~0 X* Y
else
1 P; s' y4 y9 a {# j, N7 s9 E/ ?- I: b
printk(KERN_ERR "register cdev err!");
0 S! {7 n1 ]( a' n* E return -1;
4 L! T g: d a1 \ }
! W: l# O1 l, v
/ A% B5 s, y7 w& c mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: v3 G3 Y- _" _
if(IS_ERR(mcbsp_class)). v( m, F' `6 [5 E# F) k9 j
{
7 z8 M; L% d* ]$ `; r1 q, | printk(KERN_ERR "register class err!");! ?+ u( ^6 z0 a6 o* d: `# L
return -1;
9 T! K- {+ ]' O }. C8 H% o! I d
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* n0 I, c# ]" a- }
! y7 A! J) C; Z' Y //PSC
" H; q3 j2 F7 n( H) W5 V //add Enable MCBSP
5 S% m2 i' s: ?1 m# I& l! T7 \3 d //test
1 `/ ~7 n2 Z: G" f& S temp = 0x80000003;
& `4 [/ q5 j' W0 u writel(temp, IO_ADDRESS(MDCTL15_ADDR));, C4 r/ y7 u8 d% f/ g8 h
temp = 0x00000003;* q9 A" x5 e, [, P" q
writel(temp, IO_ADDRESS(PTCMD_ADDR));4 `! B; Q" l* N
6 b2 @# ~; _; g U0 U6 L6 d. O) b
temp = 0x001FF201;! d7 g3 O7 A6 O6 h9 E8 t
writel(temp, IO_ADDRESS(PDCTL1_ADDR));# C: y6 x) Y T
9 z0 a, h7 j- B4 o a1 d4 @ //PINMUX
R) S. y7 H. T) f; a4 J //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ i6 ^+ q+ b# n$ D4 x PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 I& n0 V: A R. [8 h PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) b" ^( i! z" j# w3 H% ]
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* y' d' `8 S* y, f : {8 t, \: r7 H6 e0 B- U2 T A
//SLEEP_EN,EPR,L138_SHK1,L138_RC
$ }: L$ R ]; F9 B% M+ o8 f, j; i! @ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 N* ]/ K! o* U3 G: p# t PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & |; c; S. z# K2 Y/ A" J6 S; q
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 I5 l5 _# y- Q2 p) B- i9 r 8 |) p/ d, J" O* g( B
//RESETn,L138_SHK2
; ]) {5 H3 L3 X9 j1 s! | PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 X) Z" W; N8 R
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 7 x3 _! g' H+ W- Q9 j9 e: i/ r0 s
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 e T/ s* z* Z4 L. w" c) p1 I
7 V+ M& w o9 j9 v, M+ q
9 E1 R" V( ^4 L/ R //SPCR Register6 G0 w2 M- T- _
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ }3 f" T# Y( @2 ~; A* @) H1 |
temp = 0x03000000;//(DLB=0)$ X- y& s) O& X3 n0 n/ j# @# i
// temp = 0x03008000;//(DLB=1)3 e1 c% [# V5 {' q
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset% A( J3 _: q2 @, w# j1 j
temp = readl(IO_ADDRESS(SPCR_ADDR));2 L. d/ n4 M. m
printk("temp=%x\n",temp);0 |: p, H% _6 h; {
1 |9 K* c+ _. L# p" n //PCR Register% ?% e& X3 {% E
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' n5 W6 q4 I, x% ~% a6 z
// temp = 0x00000F0F;
2 E. M0 \" K0 y( c/ F temp = 0x00000B0F;
3 C3 i' \+ ~7 m! P. A writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 y9 x7 v5 P Q: q temp = readl(IO_ADDRESS(PCR_ADDR));
* J; X' ~' s( u: K printk("temp=%x\n",temp); 9 f. S/ ^+ V0 ^# W) L, y! B# g
//SRGR Register
7 {! U7 q$ q8 L- D8 a: ~ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' X' o. G9 h/ j1 e: D6 m
//temp = 0x301F000B;
1 K3 G8 j9 C; g writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
( s5 `( U' g2 { temp = readl(IO_ADDRESS(SRGR_ADDR));
2 S* k) K! o" p. | printk("temp=%x\n",temp);
$ N0 S! W0 z# X //RCR
8 L' _/ R, v' v `4 q1 o# R3 H5 e //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& d0 N" M% p9 F+ G7 F
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, h6 d7 T- c$ v- G3 V8 D3 j+ f$ K( P temp = 0x00440040;, Z' @" Q0 P9 t+ j3 n7 {$ {7 o1 S
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized : [. x; G* V- r' ?" S8 Z' J0 h
temp = readl(IO_ADDRESS(RCR_ADDR));9 R+ D4 |8 @% _$ v' J5 B0 s
printk("temp=%x\n",temp);6 X* B( r8 N# l" x2 N, f6 K- D
//XCR! b/ B/ e. k- p7 ^$ J: E! K3 A. {
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" h9 q7 G( O1 _( E //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 d6 k( G; f& P8 v6 J4 p
temp = 0x00440040;! b$ J$ w7 b, e' ]. S3 `3 m
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
; F7 G8 h8 D; Z# ?* @/ M. g# X" _ temp = readl(IO_ADDRESS(XCR_ADDR));8 {4 A% y6 u3 Z9 _" F0 O" Y
printk("temp=%x\n",temp);
7 c5 m1 j. l* h udelay(100);
2 Y! I e6 H; V! w/ N2 d% A O //SPCR Register
3 t: o5 h @7 Y% i //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 W8 i- L! m, x+ D! @: K temp = 0x03C10001; //DLB = 0 VS DLB = 10 N! @2 L3 z/ b6 X0 t6 E ?) \$ R
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: @8 x2 t, g& g temp = readl(IO_ADDRESS(SPCR_ADDR));; ~6 i1 K1 q# T5 d
printk("temp=%x\n",temp);; p0 `: M$ H; N
udelay(100);
/ x4 b J+ c- G, P$ E: A+ o& p$ |: b2 P _) b8 Y4 q9 n
//set GPIO direction$ r) q! d# Y; C2 s4 L0 h1 v
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; H# Q5 Y" P+ Z) f6 L
temp = temp | 0x00000100;//EPR----input" K/ V* V3 | x& u
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! y" Q* K/ P# i' ^/ J$ t2 T __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 g! C& F9 ]4 ^+ s. [( B0 g% j
& |$ a; X7 [: l2 Z( V return 0;
' D: |, g2 ^4 m: B2 y% B% n}
k# G/ P; k5 ^- hstatic void __exit MCBSP_exit(void)
, B, ~5 Z. y/ C. c) f7 I{
4 K1 ]4 w% d% r* t4 D& R% Z7 l- M printk("mcbsp chrdev exit!\n");
* ~2 A) ]/ ?9 Z* A: f( ~ cdev_del(mcbsp_cdev);
7 i- Y2 R+ s# K. a; M2 I, l2 | unregister_chrdev_region(mcbsp_dev,count);
: B, R. w4 |) x device_destroy(mcbsp_class,mcbsp_dev);
A S, t; ^/ R- E class_destroy(mcbsp_class);
0 ^# \; E7 Q) L& A% |}
( q3 F+ B: _* X0 N/ _module_init(MCBSP_init);
) T! b4 d) |: }module_exit(MCBSP_exit);" \8 j* m: v" R4 j1 r
- C& { n1 L( G' F7 _7 v, |; y. mMODULE_LICENSE("GPL");1 `2 _( S% g) o0 X
; X- g, x: h" @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。: k; Z" ]$ t/ s4 {( m
我的应用层的测试程序如下
8 {0 ]$ Z1 n9 H! e" c7 G, z#include <stdio.h>3 Q) E0 I& a$ z5 f" Z% ]( M3 Z
#include <string.h>' G0 f" |3 C% i" j6 V5 C3 e
#include <fcntl.h>
/ b# L* B7 H& r7 A#include <unistd.h>/ a! q3 T1 w2 B% }, k! \
#include <signal.h>
: |1 u& I, V* h) |#include <pthread.h> //线程
2 [4 \8 F5 }9 e1 ?1 _7 T$ L#include <stdlib.h>
! Y$ a+ ?9 p j$ M9 v#include <pcap.h> //捕获网口数据/ S$ X; [; }4 S* x2 L; z' V+ g, e4 `
#include <semaphore.h> //信号6 C; o# y* n3 ^# T
#include <sys/types.h> //消息对列
0 q1 \" I% j( H#include <sys/ipc.h> //消息队列0 U) u% G' X8 F7 G) M
#include <sys/msg.h> //消息队列
, [* U% @* E2 C2 f/ p& y" ?) ^#include <sys/select.h>
- x% W) G1 Y2 R @2 G#include <sys/syscall.h>* }: [' I( y4 q2 { r$ f1 x
#include <sys/stat.h>) L$ }: X$ v. L% Z% M, \
#include <sys/mman.h>
6 @$ w3 h5 ?- E/ ~ T7 k b9 r#define msleep(x) usleep(1000*x)
) @4 {: z% B6 _% p$ c, S" m
3 j1 R, A" n$ W% D" T* [0 d9 yint main()
, i3 f/ y& G6 d% L& k( z* i{ 9 ~/ s: T0 n" B7 ?! e% @" Q# _
//MCBSP,ARM与AMBE2000交互设备) H+ y l. {7 k6 w) R# l
int fd;
0 _8 |7 I7 r5 ^: ] unsigned short data_write = 0x5555;' K% J- T A2 O! l
unsigned short data_read = 0x00;
0 S/ m' U2 U. ^ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: a: i6 x8 }! `; B
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# ?; c/ i( W, C% p1 q3 K
/ K" U% A, `6 b, X
if(fd < 0)
: c0 P# x1 f6 s) S5 P% L6 Y {
# n# N" M2 z6 d8 m perror("open failed\n");
4 L+ R9 K$ \* c$ Y! R5 o return -1;0 X+ K! K4 q5 t
}
. g. F6 k6 O: C. q $ o5 Z$ H0 q. M& B, `6 n( i3 A- n# J, ~
while(1)
/ }. g( ?2 P2 _# q* H {
" T& K) v u3 o7 v! b ; p/ e* Y# N. J$ {; }* b+ [& i
//AMBE2000每次读写是24个字为一帧4 \9 H# C# c' p# _7 {0 E: y& E
//写数据时将数据在底层存储起来,等到中断的时候再发送
$ m9 x% E0 g7 o //AMBE2000输入数据是以0x13EC开头的; h2 n* z6 a" |' s5 D2 N
write(fd,&data_write,sizeof(unsigned short));
2 P7 s9 K& p" t
) j6 R$ j, E6 l+ S //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 V R+ C1 Q! W$ _ read(fd,&data_read,sizeof(unsigned short));
$ E9 C8 d) S; Y' A. y 3 b) D% j3 |0 C( G
if(data_read == 0x13Ec) K, [, H9 \8 b9 x* P% j8 ^
{7 D7 _, |2 s2 d
, h+ u& w5 ?2 W9 W9 p printf("data_read = %x\n",data_read);
( t p; q1 M/ q8 y }/ I9 a/ f) Q# u5 N9 p
( z/ ]: F- o) X9 T7 [
msleep(10);
! r* t* X" }6 y8 O4 ], E, C9 [
/ \4 o/ P( {' p6 i n$ W0 ` /*, P4 W, J' H1 q- G/ T/ Y/ G1 q
ioctl(fd,1);
7 i8 a T9 ?6 y4 n sleep(1);" e5 W! Z$ r/ ?. n) e, v
ioctl(fd,0);) t9 S9 A- F( J a2 n
sleep(1);4 J8 l" z' M i2 b6 U" j
*/ ( B1 u: g9 c" ^3 h
}
. f' {4 p# M1 L# w! W" x1 R m" [ return 0;6 I4 Q4 k" t. C6 I
3 t# X; U; L% \0 |# M. }% t! W2 F4 u}, x n# G, \! R0 x7 v3 o
" T! |2 `+ n, l2 r多谢各位指教,谢谢! 急
: F m# f; u+ w( n) Q( Y* \" P+ s: c! y o; P8 G
I, U& Z! J w2 ]- I! W
& _0 X( g7 z+ x6 p# i
" c n1 A3 ^3 t" \5 U/ w+ S; m0 s
2 {% k v' a/ U: D0 |/ x3 {
|
|