|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: b6 n- }( y! N) {
/*/ b; w5 u8 a, O
* Copyright (C) 2009 Texas Instruments Inc# s6 G2 D! x' i [5 Q
*6 ~" k0 T1 p+ o8 ?
* This program is free software; you can redistribute it and/or modify
* T+ b' ]9 g7 B* t% I3 I2 N' g- F$ q * it under the terms of the GNU General Public License as published by! q$ c' z5 `" `* O* |
* the Free Software Foundation; either version 2 of the License, or; A$ P: e2 D3 b0 S$ E# g
* (at your option)any later version.% R7 M+ f$ m' P& _" l8 [
*
) ]6 k) j( _3 t5 v2 z * This program is distributed in the hope that it will be useful,. }3 E& R5 m# m% v6 Q
* but WITHOUT ANY WARRANTY; without even the implied warranty of
# m* [% W2 j$ G" h! \ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 Q: B, M9 X; L( n3 ~9 u * GNU General Public License for more details.
; C8 C1 m5 ? ]" C3 P *' z9 m( a9 s" X$ G8 i' `
* You should have received a copy of the GNU General Public License' j c% j* n( W
* along with this program; if not, write to the Free Software
2 {# D4 f) m& M' S# O' X, ?% k$ P: _) ^ * Foundati" F4 j1 b$ D W7 `6 H
*/' Q1 a" \7 r( M* r
#include <linux/module.h>
. Y; {7 g7 y0 z; E#include <linux/init.h>. f& x# q5 [3 Q* X5 M$ E
#include <linux/errno.h>% y+ P$ @5 a9 f/ L5 n% Y. @' y% r( b
#include <linux/types.h>
. I! z7 O9 f+ O$ q0 `3 y#include <linux/interrupt.h>; G& n3 u! o3 c% `! ^
#include <linux/io.h>3 i0 I' ]( b* H D! K/ m
#include <linux/sysctl.h>4 e/ B% }0 m8 V$ [6 a& b1 I
#include <linux/mm.h>
1 o- {! r+ b" J% S1 `* V4 P#include <linux/delay.h>8 `5 [. C: R9 Z) j8 @
#include<linux/kernel.h>. z: o9 Z4 o& a# I6 w
#include<linux/fs.h>% T0 _' o$ c, L3 [
#include<linux/ioctl.h>$ J/ b! w" Y4 i' }2 Z- L' Y
#include<linux/cdev.h>
$ K7 J" Z7 o Z T" a+ Z9 i7 {#include<linux/kdev_t.h>
5 ?! t* j& |4 B; v6 U#include<linux/gpio.h>
$ J- P: ~0 N; ~6 \" B4 X+ o#include <mach/hardware.h>4 `# Y9 w; Q6 h5 G* _+ w
#include <mach/irqs.h>% O k- {/ ^# j$ V* V
2 w* E$ K1 q% c: j3 F
#include <asm/mach-types.h>. R/ ]8 V' \% K1 m* ~( u
#include <asm/mach/arch.h>' p: t R/ b: i, v
#include <mach/da8xx.h>
4 k* L% h9 o3 N A$ v6 s#define SYSCFG_BASE 0x01c14000* p3 f5 Q6 V. e+ [* j& [
#define PINMUX1_OFFSET 0x124
1 d- Z* H6 R6 C2 {; {0 k#define PINMUX18_OFFSET 0x168
6 |: }/ q! M( ~#define PINMUX19_OFFSET 0x16c
2 r* x# @/ ?2 w# j6 s#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR8 k& U! i5 E4 R4 Z \
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! o# b% r( T# E* D B N) N2 p
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR+ L' _& l$ X7 z! d
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR7 _2 a W) P" {
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
( R. _9 f' T& {% P, Z9 e' d & c: Z7 H; G' W
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR0 M- P3 Z E4 `1 }/ E5 I; _ E
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
; h/ h+ E& w* {+ R//PSC
8 R& r; O* F1 C9 {0 o2 v#define PTCMD_ADDR 0x01E27120 - t. r8 D% L% V$ N# J3 [3 R0 }: H
#define MDCTL15_ADDR 0x01E27A3C9 r% i4 R/ o5 d4 J0 C( G
#define PDCTL1_ADDR 0x01E273049 s) e: H' e. @0 Z R
//GPIO8 direction
6 f0 F8 D( a$ T9 m* z* o8 g#define GPIO8_DIRECT 0x01E260B02 |+ O/ P, E. S4 Z- I F
#define GPIO8_OUT 0x01E260B4
+ w+ k# K- y2 Y* C#define GPIO8_IN 0x01E260C0
) L/ p; A, _1 S: ]" @5 e6 |6 g! K4 G3 C5 \. K9 e2 q! I
//#define MCBSP1_RINT 99
! B- n8 o$ K5 G/ s//#define MCBSP1_XINT 100 & G6 h4 z9 n& O/ \5 C( Z
static int MCBSP_MAJOR=239;
( H4 c2 t( J3 |8 m ?0 w4 `static int MCBSP_MINOR=0;
4 b/ X2 i2 ~3 u8 z4 y- Lstatic int count =1;! |1 R: T6 @7 P
; q6 @7 p5 F; {+ F9 z* g; T
#define MCBSP_NAME "MCBSP-device"- o( P, r* l- L
3 J( F& @0 G' k( _+ F' P) c1 o" Vstatic struct cdev *mcbsp_cdev;
) F- O6 t h; l& i H7 cstatic struct class *mcbsp_class;
. f, Q2 I6 I# G, N9 Ostatic dev_t mcbsp_dev;8 ^. M) q& y4 m
unsigned int DRR_data;2 T2 L. `* u) [7 I5 q! d1 A
unsigned int DXR_data;
) z5 I7 Z! n+ N/ istatic int mcbsp_open(struct inode *inode,struct file *file)
: p6 y( E+ E2 P/ ]0 p' p! D{# N/ y9 ]( u5 c5 R3 l0 x y" o
: N y# b7 i5 O6 C, x9 M: V //interrupt enable,initialized
- l6 S! m! Y" b# O unsigned int temp;7 e* l, C- I9 U: S5 }" v, l( [1 a
//SLEEP_EN(GPIO8[10])---0 }: a" {' s& @
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& h' O! g T# {- h9 y temp=temp&(~0x00000400);. ^; v* X5 h( r1 j% b
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
# G, r& U3 A6 q8 u. s0 G; C+ K7 C //RESETn(GPIO8[8])----0----1
; F r' s3 k7 t. K) [9 t) o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 S( I# F' T: r; |' R( y
temp=temp&(~0x00000100);/ d; G6 h8 h1 c
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' J9 _! Y- C6 C- o2 q
udelay(100);
q# K t% q E8 k+ X' N! S temp=temp| 0x00000100;
; g/ `/ c% f0 \# Q- H' l! s6 W __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 E: ?% D+ f) r5 |3 h7 ^. ]
udelay(100);
9 t, Q. m! l6 z1 R& N- l; p printk("open success!\n");/ ^1 z* U& j. w1 r1 `
return 0;
! ~$ ^; p, m0 C: K}
: _ b6 M' z6 O7 Z/ _0 W6 ~! k0 w" i+ N X
static int mcbsp_release(struct inode *inode,struct file *file)) |$ J1 b/ E7 u' H$ h
{
( q6 `' ]2 r+ S; k& r, Q# ? printk("release success!\n");
. C) P6 C6 L( V; R return 0;
+ G0 K: F' p3 _. n5 V}; h4 q- g. |: _
8 H5 m3 m, g: m! y jstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 |& S( T* i3 @{
4 @2 e+ W- _3 m) u2 Q, F; c5 w8 E copy_from_user(&DXR_data,buf,len);
1 ?5 r# K* h( p iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% d- o ~; K |, X2 z$ }! B4 l3 y return 0;
C3 F" h$ i) ~( V9 y 5 q- p* H( e H
}
, [/ V! V1 P+ e3 G ~ R4 @+ T; h$ a9 y1 y4 j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). g0 y- `/ {7 j3 E' f: C
{ ' G/ H$ P+ F4 ]9 \( k0 r+ [: q% o
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" X: e9 R. m+ R1 b2 D copy_to_user(buf,&DRR_data,len); 6 g; N; ], E/ a( [8 i
return 0;$ R" p+ O! v2 }+ z$ Q$ e2 V
}) A% F) W9 [! V8 I; J0 [& y5 v! c
a4 L5 ^6 C( }* U/ R) p
( ~, W( Q% g, l3 ^! T% ?# y6 tstatic struct file_operations mcbsp_fops=& U+ f5 A0 N- Y) y1 X
{% w$ l7 H# n1 v
.owner=THIS_MODULE,
0 L: q0 \7 g$ r5 g& [+ ] .open=mcbsp_open,6 |" U, A, C ]$ o1 q5 H5 G* g; G, e
.release=mcbsp_release,
/ h4 ~1 t7 Y) j, U .write=mcbsp_write,0 [: }& \) e" j! p I( K2 _. F2 C
.read=mcbsp_read,
- F: M: n" Y" \6 F0 j};/ D! w Y& _- v
static int __init MCBSP_init(void)5 e3 N& P( h" ] Q+ S
{4 f8 L. [( v/ H9 n2 n, @
int ret;
/ w {6 I5 S8 u! J" E unsigned int PINMUX1_REG_old;! [9 W- W5 z# w5 x
unsigned int PINMUX18_REG_old;) w) L0 z( F" k" I# m, m
unsigned int PINMUX19_REG_old;% c( H% y- j! n
unsigned int temp;
+ R x, @% P% e+ U8 k if(MCBSP_MAJOR)
5 r% l) N) m( k {
, Q1 `2 g0 g: n' A" w* j/ h mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ u/ W$ V3 S& i& T ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 }' \. M- }+ P' B
}
4 G' j; Y' A, k3 C else
' _6 F4 L; L0 \# ~, l5 h; N {$ Y2 I' B' J" {5 C0 Y7 |# T
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( @1 Q" R/ f# k) W7 ^1 F: N MCBSP_MAJOR=MAJOR(mcbsp_dev);
) {2 p% r% Z4 Z9 G6 O }
+ N' ` v6 l+ o* u3 C0 J " ]9 n! |: r' o
if(ret<0)2 @( y$ m9 K# u- j
{0 o& c8 |- K9 l9 U+ q/ ^
printk(KERN_ERR "register chrdev fail!");1 p; H Q3 I. d: l& u4 s( t
return -1;3 h8 P% H' N' _7 s: r, w# C
}5 B( j0 j1 U; ~ p S" M0 M) i. z
) ~% Q7 _% S& g; Q
mcbsp_cdev=cdev_alloc();5 t# P1 ^: p+ p3 f, L2 K
2 H' h# r v3 z7 S' }1 [ if(mcbsp_cdev!=NULL)
, d( O5 i6 K/ p# c# d' k. ` {7 j) g6 j' S0 ~2 ]" R
cdev_init(mcbsp_cdev,&mcbsp_fops);
% W0 W% }2 p+ u. ~0 Y mcbsp_cdev->ops=&mcbsp_fops;- y# D4 [3 J; y+ u: k& Q
mcbsp_cdev->owner=THIS_MODULE;( K% k: c x% S; @7 k$ V
/ P$ d. e6 z/ A1 S" N9 E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! g) m9 |+ ^$ {/ P
printk(KERN_ERR "register cdev fail!");
9 R( @. O# r' i3 \4 O else
: [" j: A6 e) k2 F y4 @ printk(KERN_ERR "register success!\n");
5 S, S1 [5 c% M7 M6 P" r& j } c* H- W$ x( O8 N B
else% @ _5 M+ e2 E' }% W% {
{8 A: H# ^- m3 t* l2 y6 \
printk(KERN_ERR "register cdev err!");) X. i% p8 _6 b2 J( E) e- v/ T
return -1;! a9 D7 P3 M6 w
}
$ N4 a# Z2 ~9 a- c . _2 w7 u B7 f: ]( x5 A* a
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); E6 R' n8 O8 C$ f) R
if(IS_ERR(mcbsp_class))- N. V) C) B. v6 o4 W
{( ]/ j0 x) m: T( ~. a# G" P
printk(KERN_ERR "register class err!");" F) h# D+ B% i! B. {$ V E
return -1;
+ n1 D/ z( N( d6 R6 N% G }" b, x$ E" T* A2 j9 r
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 A# k1 d8 W" l2 z% W; T
/ `) }9 `- L" D- h7 r6 Q( z //PSC6 X' Z8 I' e/ O4 x# L' a" A! h
//add Enable MCBSP! Y/ t3 S' h0 T- h1 z, ?
//test
; H$ |% p0 c; D9 x2 @ temp = 0x80000003;: f4 ~7 G0 g; C6 T! V
writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 k% |( K: n7 h; j6 @
temp = 0x00000003;9 l& x% {$ V3 F i$ b h
writel(temp, IO_ADDRESS(PTCMD_ADDR));
! w @/ `2 k' b O: }. j) P6 ?
( o; v5 ~9 R! `& d temp = 0x001FF201;. b2 I# g( ~7 j+ I: c$ F
writel(temp, IO_ADDRESS(PDCTL1_ADDR));& S( X3 q- ?% C# {2 O
8 ^# b; ]$ t. G3 ]5 k/ G //PINMUX
) U& Z4 U( F q' g6 L2 N1 | //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,1 y1 J( A+ }1 G5 V. O; ]6 E
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); + V! k9 S4 v: K4 C) X
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ; O* U8 V, @7 a; A% j
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: e( b' f: H6 C* h' f0 b4 f0 q ' `0 ]* N2 L. P4 ]3 ?% s$ I
//SLEEP_EN,EPR,L138_SHK1,L138_RC7 G7 S$ Z) Q# E
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
E F* T5 ^; T" ^* Q& ]6 C4 y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 }5 I, L5 k' e+ D" J* ]
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( F- k) \# J* C
- n$ H/ o5 u# d( _ //RESETn,L138_SHK2! A3 j8 {: s, x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); " a) ?; }2 y& H9 Q0 g2 m- H- n
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 9 ~) {; y* j$ Y/ K
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( a. p( r% v, Y% p! A! H
# D1 P( p. I7 r
' C2 k; u T9 R& M" v
//SPCR Register1 G7 u# _8 y+ n" ]* H4 s9 I
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ N- J$ Z: x# V* a temp = 0x03000000;//(DLB=0)" Y( `5 `: @6 S6 x" u
// temp = 0x03008000;//(DLB=1)( m. V9 D4 N }$ H
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! D+ ]' y+ P0 n) H0 v temp = readl(IO_ADDRESS(SPCR_ADDR));/ N# C# [ {5 t: n- S, Y& |9 W4 k
printk("temp=%x\n",temp);8 J d s G* b. l9 S
7 ^ k- }% k0 [- A //PCR Register
" t8 k, |: ~0 A //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 e6 U- A7 ]* ~; \# d // temp = 0x00000F0F;
; w& j' }1 B! d temp = 0x00000B0F;& I- c$ l& z/ Q% y$ d# l6 F) N
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " i. L+ b6 W: }2 @ a# E
temp = readl(IO_ADDRESS(PCR_ADDR));. [ y. A: k& U0 }: v. `
printk("temp=%x\n",temp); 3 [9 M' l# [: {7 @& l
//SRGR Register
( p) V; F- x4 k; `& S //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 I' z' w: s9 {: F
//temp = 0x301F000B;
. v) [% N# `+ k9 N writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized . @6 y' D- Z: l* N6 T4 o4 ^
temp = readl(IO_ADDRESS(SRGR_ADDR));
) f7 A, b) L0 T printk("temp=%x\n",temp); R6 A* R8 Q9 p
//RCR
$ g0 A- r2 k( X8 X5 P //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- h0 y+ | y9 ~/ m8 K' Z- X
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ v/ }# p8 H2 c8 e: w temp = 0x00440040;9 E: {5 X( B* z9 ?( ^
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) \$ f- Z4 L, i8 \ temp = readl(IO_ADDRESS(RCR_ADDR));
- C1 r ~- P5 S, V printk("temp=%x\n",temp);! |1 l. O0 ~' Z0 s. ^8 G
//XCR/ h8 g$ @8 @- {3 @( I: R7 h- R6 G
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
6 l4 Q' {' g/ v2 H! v% } //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ a/ r, a' V' v6 S0 \' ]6 n G* d0 C temp = 0x00440040;# N& ?0 R4 o. U2 U
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
3 N% k% `' {( B5 y$ S8 s. Y temp = readl(IO_ADDRESS(XCR_ADDR));
: [4 E$ T6 Y8 G printk("temp=%x\n",temp);, H* e8 k) T: k' F" B
udelay(100);
P! ^7 a4 u8 P) U3 \. D! J //SPCR Register/ m9 q; U# ?) n/ U, X# j) k. g
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% x9 e. V' l: T% L! O0 ]4 i temp = 0x03C10001; //DLB = 0 VS DLB = 1+ `7 ^$ F8 w8 h+ Q* u7 e8 l
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
9 ^& A% {0 o& D4 ] temp = readl(IO_ADDRESS(SPCR_ADDR));
1 b: l7 i/ [6 j: j, p; _) y printk("temp=%x\n",temp);3 P/ `/ I' U) W- }; F$ w5 E
udelay(100); K- J3 S- t6 I0 u1 Q
. N0 f% @7 s6 J //set GPIO direction3 V8 a- @+ z/ f% s" @3 w
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# j1 ^% j3 l1 X8 Y2 [ G
temp = temp | 0x00000100;//EPR----input
+ w! k- Y3 ^7 g. K- p9 z temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 C `# m; j. F& j
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + B; e- v* b2 t9 W n( \4 W- D/ o
- U0 N6 ?4 L# p+ t. g+ y
return 0;
, N$ A! e F- D8 S3 U}1 g9 q$ v+ p# g+ H1 [- H1 N
static void __exit MCBSP_exit(void). J7 E s# N& f: S" s+ @: i/ \
{
3 `- @/ n9 u" C6 [- E* M; k9 E P printk("mcbsp chrdev exit!\n");
0 D# G0 V6 q& ~/ n& l6 T# k1 b cdev_del(mcbsp_cdev);
; n0 ^1 w& m( K+ s: L# }6 g' F unregister_chrdev_region(mcbsp_dev,count);* k* Q2 f9 s' T1 X3 ?. x
device_destroy(mcbsp_class,mcbsp_dev);
4 L* b9 K* S: H! S class_destroy(mcbsp_class);
0 b& ^. d2 N/ ~" c, @" f}' A, i5 t* |( u( E- p# @+ i
module_init(MCBSP_init);3 \' l# f" |+ y3 [. W
module_exit(MCBSP_exit);
+ F: B! s" n" Z, u
+ E# q* P1 N1 U8 CMODULE_LICENSE("GPL");
8 b; T: R- _0 r* C% @$ l$ R: e) N
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 X) w k+ w" L; c# x) [/ ]5 ]9 E
我的应用层的测试程序如下) s4 Y5 J, U# p1 G$ [# `; g
#include <stdio.h>
6 v/ p4 A* h8 o#include <string.h>& w- @3 P3 X6 s0 V' W' R
#include <fcntl.h>
! O0 B# o+ ^# O) z( j# j#include <unistd.h>
( E8 T1 U3 D3 p+ t2 _) _9 B# s#include <signal.h>2 ~- T7 B _, o9 G; S
#include <pthread.h> //线程+ K1 O" H* O: `8 s" i
#include <stdlib.h>& o0 t) X8 @4 [- `. {6 S
#include <pcap.h> //捕获网口数据
" \5 ~# `# B4 y% z* |#include <semaphore.h> //信号. o! z& T! r$ C' W5 \) \, ~
#include <sys/types.h> //消息对列" e3 _1 p" s- Q) i& p, X
#include <sys/ipc.h> //消息队列
2 v2 V. @ z, e: `, r. E; v2 u#include <sys/msg.h> //消息队列# p2 @' F" S W. l- \# Y
#include <sys/select.h>) D" t' D0 \. r3 k# W
#include <sys/syscall.h>
8 } E ]3 K4 w#include <sys/stat.h>9 U; w. k) I( [6 f9 m, Y/ t
#include <sys/mman.h>
5 \& k- h+ i* i/ Y3 d* b#define msleep(x) usleep(1000*x)
. d$ e: k( K r1 ?# T( c. m" _( [+ k) }9 j8 M }
int main()
- `# p7 {' R# C# H, D0 w2 C{
1 M( M9 ]- P: S% C //MCBSP,ARM与AMBE2000交互设备
# S% H# E% Y9 K( w* V; t$ x c int fd;
7 ~/ s/ S( d% X, U' c9 t unsigned short data_write = 0x5555;3 a3 T+ @8 I; a* `: P( v
unsigned short data_read = 0x00;- L6 Z2 Z" r9 W2 u2 J
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( w' q: ?) @$ p2 _7 P( t" \3 c
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ x: Y4 {: E3 \- a
Z( ~& m+ e' W! d
if(fd < 0)$ x. q. Q; w/ V, K. [0 V3 \0 C& } T
{0 u. t) P h' R% L* w0 V
perror("open failed\n");! p* G# _$ `$ c; ?
return -1;
/ K1 s* l9 q6 K) [2 D }1 }+ {" _ \$ x( C% I9 ^3 o* b
2 m( L$ B, x+ g while(1)
0 w6 N( w; ^4 T {/ g- P, K* F# q( O
3 l* g, b, Y6 \+ F2 _# g
//AMBE2000每次读写是24个字为一帧
3 ?3 y, K5 b' }% Z: Y* \/ E //写数据时将数据在底层存储起来,等到中断的时候再发送1 }. }. c% ?. L- Q7 @' m
//AMBE2000输入数据是以0x13EC开头的
r4 h0 w. T1 c5 @7 P" } write(fd,&data_write,sizeof(unsigned short));
9 p4 C4 L. `7 i W! T
/ @. n; r% P( t5 |/ D9 K //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
* U7 @: F$ Y O" ~8 l. n read(fd,&data_read,sizeof(unsigned short));
& V, f6 |6 ?+ u; C- O" U1 I
0 ?; ^: t' ?+ _! g5 a: k+ \6 I3 w if(data_read == 0x13Ec)
3 h7 q }) G& f) u$ e9 C# A {8 n, H1 B# \( @# M; N
% s3 x. ~) g. P/ ~( |) a! w
printf("data_read = %x\n",data_read);
. W0 H7 r0 R2 S5 y }
/ ~2 {3 s: }* f% k- L
: {, G$ C( e% o: L M+ s msleep(10);8 t2 e3 [5 j' w6 X& b/ M
/ p8 H6 U- @& g) k: M/ B+ L /*0 t+ i9 W' c/ ?; A# ~. {
ioctl(fd,1);
4 b( s+ l0 l( y. @ sleep(1);
9 [9 z0 F' B/ [6 j' D3 r ioctl(fd,0);
+ z* l6 N. R6 }: O5 J1 k sleep(1);
C/ o" d; Y- r" { */ 6 `- ]7 _) C6 U
} ! s' [) s9 ^/ i: s( o, O
return 0;
! K4 n2 x9 V1 s8 k # H" B& v* @* l3 Z( s% b' H
}
7 K$ x* B' L9 S+ o V& M
! k* v$ b$ Y5 |+ N! ]) i+ {多谢各位指教,谢谢! 急. `, P2 n1 u* M0 A3 {) [
3 K6 i5 {5 d2 R+ C
( l& v2 O* f y3 e) G
! W3 t) F3 ~7 s+ R* V7 v+ [& W
$ i% _% w* K5 C, r; \
- `( R: M" J5 F/ J* u. g7 I |
|