|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 E( ], a( b1 r1 X/*
& H7 `% f( J, Q9 F6 y * Copyright (C) 2009 Texas Instruments Inc
) v" b1 i4 _$ [ _ *
4 v( p+ S5 @# F$ N * This program is free software; you can redistribute it and/or modify! _3 R W3 b! ?' Q: c
* it under the terms of the GNU General Public License as published by
" b$ |2 Z# L/ m5 M * the Free Software Foundation; either version 2 of the License, or
5 K1 }2 `4 ~, j; s( _6 K$ Q * (at your option)any later version., O4 Z% H, C& a B
*
0 P# ~6 S+ c' ?1 z/ U2 w * This program is distributed in the hope that it will be useful,
2 v& S3 j$ D/ n; d: m * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ z% y# m- [0 h! q1 o * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) L2 J% h F8 B _7 S+ x, V- | * GNU General Public License for more details.8 y7 B9 S3 a6 b& K( w
*% `) g' j9 p9 R8 \
* You should have received a copy of the GNU General Public License
}/ s, S6 m' d8 ^5 A: q# @ * along with this program; if not, write to the Free Software
" @1 [; b% C! }; i$ W1 o * Foundati' r' I; @1 @% _2 z7 _ I& n+ x
*/4 \2 D9 f; x. g2 @
#include <linux/module.h>5 ]1 Z" }0 a$ W" i- l
#include <linux/init.h>
" g& r3 Y$ @# l, ?! Q4 l9 C* q#include <linux/errno.h>
/ Y7 n& H. J' ]- E9 e- ?#include <linux/types.h>
) z4 U8 C7 ~, R6 o! J#include <linux/interrupt.h>" |% A* y' K3 N ?+ f2 k
#include <linux/io.h>
/ U/ c4 y4 J! P5 I9 `- Q#include <linux/sysctl.h>
$ ?" K' D& \3 N2 d( i#include <linux/mm.h>
0 b/ K0 m. u& ~# t& r# q#include <linux/delay.h>
+ r/ S; ]! @8 M, f4 l) w#include<linux/kernel.h>' t/ \( l: F5 f
#include<linux/fs.h>
( j4 [+ _6 P3 L2 {#include<linux/ioctl.h>6 t) |: R3 |7 t& P6 M# r+ b# U
#include<linux/cdev.h>
% ]& B: F# M! a; U& y9 q#include<linux/kdev_t.h>
t2 A* ?* S4 U1 q4 K* S, q#include<linux/gpio.h>
5 v, O. p% n9 G& x1 s+ f2 M# G _#include <mach/hardware.h>" u7 A3 k4 W1 |! \0 h
#include <mach/irqs.h>
' N6 Y+ ?/ z) C2 K+ y
! M) m. L1 p P#include <asm/mach-types.h>' q* j% p- l: ^
#include <asm/mach/arch.h>: X: m9 p4 e6 n5 G6 D4 P
#include <mach/da8xx.h>
! d3 F q8 ]7 R& I; g, v#define SYSCFG_BASE 0x01c14000
s. o/ i. t. A) q/ g#define PINMUX1_OFFSET 0x124 5 a; c1 s3 x, R; V
#define PINMUX18_OFFSET 0x168
9 e+ G- o9 |* ?% v#define PINMUX19_OFFSET 0x16c, q7 c* [- G+ {7 y. h; _3 Z
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
( J- r2 _4 y1 _$ { t$ g#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
" v# S- d# C. J# X5 k" y#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
4 o. F, b5 M1 W5 b3 c#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
1 \- Q8 a$ q. W% ^#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
3 j7 ^+ U: Q4 e' D. M! t0 H
7 |- `7 m j Y' Y; q#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
( P6 M( _: [1 K9 w+ v! F* p/ ?#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
8 J' @. f# N7 Z* a0 ?//PSC
! I7 @& g$ c" b#define PTCMD_ADDR 0x01E27120
+ n) {% [2 ^( t5 |7 @$ ~! y9 O# i#define MDCTL15_ADDR 0x01E27A3C
4 ^$ n8 D( ^2 K; u& q! a8 Z/ ^#define PDCTL1_ADDR 0x01E27304
2 }# q, m( \5 n% M//GPIO8 direction1 P; S: G, r5 b/ \3 W& [
#define GPIO8_DIRECT 0x01E260B0
1 K* L9 i+ i7 {# e#define GPIO8_OUT 0x01E260B4
7 C( d0 t1 t' b* G- w0 O#define GPIO8_IN 0x01E260C0# ]; i- ^2 k- g; ~4 y0 ^
7 a& B9 M+ O7 u3 W
//#define MCBSP1_RINT 99 & M8 H( O" @. j _' M
//#define MCBSP1_XINT 100
5 v& B2 x4 l9 D0 fstatic int MCBSP_MAJOR=239;9 N7 T* l3 ] L$ S
static int MCBSP_MINOR=0;% w8 B5 v: {- ~2 \8 T
static int count =1;8 |( v( N1 }# ?6 ?
0 r, w h) w/ I- V
#define MCBSP_NAME "MCBSP-device"2 O* j7 N7 T0 @4 F. O4 }
5 G2 T' [! @+ z9 K( b) u' Ustatic struct cdev *mcbsp_cdev;3 R. X( ^& O# v; F
static struct class *mcbsp_class;
8 s1 A+ g3 [" w# H* {static dev_t mcbsp_dev;
, i$ K) {5 ^* l. ?& d- ~unsigned int DRR_data;
2 G5 U, ~, S+ | l8 H0 F" Nunsigned int DXR_data;
& P9 j3 A# r* X) j( M( m" U7 k, |static int mcbsp_open(struct inode *inode,struct file *file)
t2 `6 b' a* Y! Y+ a+ R5 G{
. t# ^, f1 C. L! i2 o: G0 l/ }* L . Z. Z. L' O( ]7 ^+ ?3 W& s
//interrupt enable,initialized
9 X' |8 w0 s5 X3 t% u0 x/ B unsigned int temp;
* L) P' j2 W& n, f/ a n //SLEEP_EN(GPIO8[10])---0
2 L! z8 [& {: b# e/ T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 F+ h& z3 |% V2 W2 h- ?5 g9 e
temp=temp&(~0x00000400);
+ |! C- V1 F* }$ {/ U __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 \" y8 A* C8 t, p/ @$ a+ p; e //RESETn(GPIO8[8])----0----1
( R3 C, _9 C* H0 X temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 ~8 n% _7 d* |+ ?
temp=temp&(~0x00000100);* O9 N/ P3 S; h5 f1 c' t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, N5 P3 |, ^; M
udelay(100);
/ G0 e/ a. d8 D* A5 J5 }# | temp=temp| 0x00000100;
; C8 }! Y. {/ u; t m: C __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) a9 G/ q/ q& W2 M udelay(100);
( A5 @9 v2 ^* d" R) I) o5 U printk("open success!\n");
3 x- V; L( _# f1 i! I return 0;5 [- W4 s3 ^" k
}/ d9 F. c+ d/ Z
& S! ?( _$ S$ \5 z6 q! |$ s) i
static int mcbsp_release(struct inode *inode,struct file *file)
; b; e& S2 v6 b( S. \( t$ N{
. M9 e7 B% K4 o2 s/ R4 b$ V printk("release success!\n");( m0 Q4 U! G1 Q7 k; y
return 0;- t1 q+ L4 R( _1 q% r, M
}
+ a2 O" o3 b1 ^9 P. u8 I, C# _
7 a. K; X z$ [' ^) ^static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
C, [- A' T; g{
, w# ?, s' p2 { copy_from_user(&DXR_data,buf,len);. c! l3 a. U% N# C2 @1 Q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
i; Y3 K, L+ l return 0;) {+ C8 |+ C$ V8 n
6 ]$ D9 I$ r& \# p0 G5 A
}! {% p* p8 h2 y5 N( m
4 l! t0 D( {6 o6 f+ k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( a, ?9 K }0 F{
. g( m9 L1 `- w/ \' Y2 O- c DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# p* i) d" s2 P% v7 V1 Y9 x& s5 K1 C copy_to_user(buf,&DRR_data,len); - m" k, J& O, n% m/ H/ u8 H& S e; z
return 0;* e; |1 @4 s5 X/ X
}# O$ ~1 h# W) N$ t7 B
& s M t* g& _. d) I
, ?8 z$ ]9 {: K0 l, d* zstatic struct file_operations mcbsp_fops=
( T4 s7 i' R8 W1 J$ y! o9 ?) z{( B9 \1 R0 u$ \: k
.owner=THIS_MODULE,
, \ y0 P: o8 B# c# p; y .open=mcbsp_open,1 I" u8 t# }3 [* r4 f9 O' R0 \8 B
.release=mcbsp_release,+ H+ T# i/ A( B9 }1 t4 I
.write=mcbsp_write,
/ M) {& w4 @! K .read=mcbsp_read,
) L6 L, A4 l7 Y( e) W" m2 ?};* z0 p. I0 e) V1 z& O
static int __init MCBSP_init(void)
& ?- f( M. S: O$ [+ P+ c{' |5 P, ^2 ~: a+ x) _
int ret;6 `0 u" f; J' f! F
unsigned int PINMUX1_REG_old;1 k" q. B F2 |% n. I, M& c
unsigned int PINMUX18_REG_old;
0 E4 A# l* U! R0 I! K6 _% P. ] unsigned int PINMUX19_REG_old;
o5 J9 T: p( V+ X4 Z O4 n unsigned int temp;
: [2 P" {+ a( v7 R" g& f if(MCBSP_MAJOR)
' R% o! Q4 ^# K& W+ l" | `0 R {
9 q6 Q$ r. C1 L# x! o% P mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 Z/ U) }6 J+ D8 F0 w
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
i4 S5 C$ k" w& h" n% E }4 a. ^* S* X$ z" x n9 w T; V: B+ X- d
else
, F- _; |/ q/ h- w {
* a: t( a8 n' ?# |5 [; } ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( j0 F* K3 a/ B
MCBSP_MAJOR=MAJOR(mcbsp_dev);$ e" M, w+ ?; c+ {1 g
}1 f y7 }' m5 B% x/ i! i
3 [: Z8 w8 Z! _( S if(ret<0)) K" ?! r# ]8 F+ I
{
8 h+ _/ k. t8 a/ ^ printk(KERN_ERR "register chrdev fail!");4 _; e, x1 E3 q$ p- } f0 k! Z! l
return -1;
) ~" Y& n, ]6 P- Z }6 Z, e2 G Z$ O+ Q
# M' N3 F2 E) y2 K- |# {( r
mcbsp_cdev=cdev_alloc();
- y, ~% J& t3 t6 ]: F0 F 7 i: @ y' b" V
if(mcbsp_cdev!=NULL)8 [# k: g% V2 h5 s
{
: u. A1 p4 j% q( J% f/ _9 G% v cdev_init(mcbsp_cdev,&mcbsp_fops);
/ | u5 }2 G, a# g: B. ?* ^0 G mcbsp_cdev->ops=&mcbsp_fops;
2 A" J2 {4 r$ h; h {4 C mcbsp_cdev->owner=THIS_MODULE;
* `5 J2 I' g3 s# F/ P* C2 B/ T
; L; m* ]3 Q* W j if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
6 T. @0 o% R+ j( h. e3 \/ G printk(KERN_ERR "register cdev fail!");1 |6 C2 F, @1 `6 q+ B0 M0 ?5 U9 A
else
+ G- w5 E( n5 ^+ f+ a printk(KERN_ERR "register success!\n");8 ?( l; q1 }7 A5 y7 m3 H
}2 S6 A+ D# F8 u( e' O3 m4 K
else
& L0 p' _- f7 l' q6 }$ a. Q: L' F {
* q9 N' X$ X0 x* z6 w6 ] printk(KERN_ERR "register cdev err!");
* q* c* ^# y% k return -1;
0 Q* u: h; ^6 N }& e* R/ g! q4 Z. s1 e8 v: U- \
4 {; G% j7 @( L4 `1 L' m mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 E' g; U Q* C, c; Q3 g if(IS_ERR(mcbsp_class))
/ ~& u7 o! f+ x {- D( N7 q w1 `" w! ?! _4 [
printk(KERN_ERR "register class err!");; f/ l9 J6 P1 X$ Q o2 r& k+ G2 _
return -1;6 n1 B7 ]7 u) `) i/ j4 w* b3 H7 O
}$ I$ X3 K2 H) [- a: K; B3 [) L, o
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 Y# T- U* Z3 a( a4 g5 e/ K
* W- Z% n, y: C: p //PSC
: e, f: y5 n0 O) S //add Enable MCBSP$ @$ }0 W; p" n8 c6 O2 M/ s
//test: @3 C4 q8 Z( O& k& n1 t5 h' w
temp = 0x80000003;$ N$ u+ _) h Q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% P' g! E) |1 }. `+ C( s' x! a4 l temp = 0x00000003;+ M& o- m4 a/ o/ U
writel(temp, IO_ADDRESS(PTCMD_ADDR));8 g8 C+ z+ E9 _' f. F9 }
# x1 M. R9 T# U% k
temp = 0x001FF201;0 l @( J7 L- ?& I
writel(temp, IO_ADDRESS(PDCTL1_ADDR));* s0 S1 o/ M s2 B2 i9 X
1 d0 d5 s( S! I
//PINMUX
3 q$ `- F/ ]$ M6 P9 C //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( I/ K4 l# A _* }- ~
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 _! e( `0 Y1 Z# I9 S$ h PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; # ~& S- s/ o3 }% M5 Z' X4 H" d& i
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ }1 b5 a* T) ~( U7 ?
6 P# `+ o& @& s% W1 [1 [) n7 s2 j //SLEEP_EN,EPR,L138_SHK1,L138_RC
; t. W6 p& Y2 n PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- C0 d/ ~) N/ I8 h" K7 X3 T PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ ~8 R7 |3 p9 `9 c& h
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: r$ P/ d7 L( W
7 O# J0 S9 X# F* z //RESETn,L138_SHK2
/ d/ m3 \; S. C1 F PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 W' r# y( l5 Z) a1 M9 X* w% [ PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 2 V( d/ [) M7 F+ h: G9 \" q
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
{) h0 J) H4 ?" W
' x& D$ z% Q! x3 Y5 ?7 {, K. b ' w7 Z! f* O, u( f: u
//SPCR Register
6 i* B/ A! z0 t/ S* A2 O //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ y# W/ j3 O& n' f6 o temp = 0x03000000;//(DLB=0)
+ G# b- I7 ]4 P" b+ J // temp = 0x03008000;//(DLB=1)
; G) r1 } j3 M- H' T writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
4 l: E) H. Q) Z0 N temp = readl(IO_ADDRESS(SPCR_ADDR));$ L7 T* G. {# a# H) f* x
printk("temp=%x\n",temp);
! o! A8 v3 @- m- _
' w3 V& ^; s G7 U+ @ //PCR Register
* c2 W, K6 |7 P$ ~+ V5 g/ O1 D //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
' e- [ Q. a6 L- Y' l // temp = 0x00000F0F;
3 M( L5 a& {3 q/ ?2 z U temp = 0x00000B0F;
8 L+ r; j5 j6 s {; Z) n- C2 ]# U writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 1 t/ d' H3 k% N5 ?" Q( k4 \
temp = readl(IO_ADDRESS(PCR_ADDR));( a. A* a9 X+ }
printk("temp=%x\n",temp); 5 e& L k/ f; k6 i1 I
//SRGR Register4 g8 X) W* B7 n5 y$ D; \" f# ^
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 i1 Q Z6 |: Y* p$ O% m
//temp = 0x301F000B;
8 K& {! k! D+ C, f2 y7 X writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 Y5 }( l8 d2 R$ N
temp = readl(IO_ADDRESS(SRGR_ADDR));$ U, w: A! K$ l9 e
printk("temp=%x\n",temp);1 H- i4 n* a& i: {/ }
//RCR
9 W3 o# Y. v v Z9 h5 K" y; @ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ n7 k( x8 C7 O //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ X; n4 ^8 e* g9 P% e
temp = 0x00440040;
7 r. K( {3 @* Q* e# h writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 E+ i! p2 E2 R
temp = readl(IO_ADDRESS(RCR_ADDR));8 @ w& Y) }+ k
printk("temp=%x\n",temp);
7 P1 e, Z8 r [" F+ [ e4 M; l //XCR! x' I% W8 n" y
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 C: W" A# X7 B7 \$ E Q+ T //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ \% w/ D4 H8 Z7 o temp = 0x00440040;) H$ w' r) ^4 ~% L: M1 z( w- g
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & O' ]% n8 j2 X: |, t, |
temp = readl(IO_ADDRESS(XCR_ADDR));5 c9 Y+ T+ T) R
printk("temp=%x\n",temp);4 C9 E% @, j* q" w$ [2 l
udelay(100);/ p2 `9 L& ?7 B; n
//SPCR Register
- @. r) R$ N2 u //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- u; N6 V* [7 z7 | \# ~. Q temp = 0x03C10001; //DLB = 0 VS DLB = 1
( `% ?+ f, ?) e# D& e. k writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 C" h. f/ a9 S$ I9 v temp = readl(IO_ADDRESS(SPCR_ADDR));& A" `8 a: Q3 N# e3 D
printk("temp=%x\n",temp);/ U0 H+ t% Z" O4 m! w# d
udelay(100);, z8 ?* }. U* Z
& R: e( k T; K9 _# ?% I$ [+ u //set GPIO direction. U# F3 g; a/ ~7 `% `% v
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% T9 E$ i: o+ O- q
temp = temp | 0x00000100;//EPR----input$ Y+ d1 {4 D& T1 M6 z6 u
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* I# N( a9 A# L$ F0 A8 l% l
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; w7 o6 V+ k7 \: d% _" W 8 t3 u% ~7 C M7 m) }8 J9 [8 ]% F$ z0 A
return 0;
( f+ E: q8 Y4 \6 E}0 e" H) @! B7 L9 B
static void __exit MCBSP_exit(void). Y8 ^( Q' {3 R7 C
{) r* r0 b, f3 |, y! d' @* e5 S
printk("mcbsp chrdev exit!\n");
, k( e2 q8 o0 C$ `. f- d4 j cdev_del(mcbsp_cdev);) ~( ~0 H) L; k) b5 |
unregister_chrdev_region(mcbsp_dev,count);5 C4 q' J2 C% N5 [, @& O" M: Q
device_destroy(mcbsp_class,mcbsp_dev);
( s! R! P' I5 D# c class_destroy(mcbsp_class);
$ f1 L* ?0 D* n# ?# y, u}4 I/ v* T$ F6 D: W) z$ i, e$ P
module_init(MCBSP_init);
! S7 S2 I7 }* S3 j9 l' Mmodule_exit(MCBSP_exit);( z9 E* X1 |' T) Y$ M) {9 z
+ V( B* l7 y# f% b" D2 {
MODULE_LICENSE("GPL");) W' R: `( v" W9 r- ]2 N
* }4 a) ]. P. ^
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. m- {. t) \3 f* W+ [! ^我的应用层的测试程序如下; h& n3 x x! Y/ T( g8 v
#include <stdio.h>
4 P/ _7 z/ r; Y8 K#include <string.h>6 s6 P: Q; m* h! t! ^
#include <fcntl.h>- W1 F% |, d, x9 w
#include <unistd.h>
N0 K, g$ }% e#include <signal.h>
7 k! ^ ?% J( {; O#include <pthread.h> //线程
0 E2 L. X4 Z$ `, B5 }; {8 v" v#include <stdlib.h>
6 p% R2 i# G( y' _% `#include <pcap.h> //捕获网口数据0 \8 D1 y) J0 }8 T' X+ e
#include <semaphore.h> //信号
# ?6 P! s( N& O: Y#include <sys/types.h> //消息对列
, B3 n6 b5 {9 J' P& k8 b, \9 \* b3 B#include <sys/ipc.h> //消息队列( f1 O* \* o2 A4 [
#include <sys/msg.h> //消息队列* ~. q1 ?/ }6 ^7 H+ l; r) a
#include <sys/select.h>
- p; o% m5 F2 s$ f4 [# f#include <sys/syscall.h>/ @# M0 W! k8 }
#include <sys/stat.h>4 z3 x$ z& ?( _" X8 ?2 I9 Z
#include <sys/mman.h>
. H# \% k* W) y j#define msleep(x) usleep(1000*x)
9 q6 y/ \. ?0 L0 s. ]) R P8 n. u& {' y! a* |0 X' f
int main()
+ p! q* |; c% d{
6 @3 R+ D. q; I //MCBSP,ARM与AMBE2000交互设备
9 c0 [6 r; ?7 v% P( o+ I0 K int fd;; ~' q: l7 C8 t
unsigned short data_write = 0x5555;1 i I: A. g5 i3 W' t8 `9 ?
unsigned short data_read = 0x00;
$ g& F* D9 P9 p0 L; v fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) O5 s$ A# y* b i
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 F/ |: e. N- H $ a( g, A5 Y8 I& l; z/ ~
if(fd < 0)
J, a, Q& Q( {( T, K1 I {& D/ ]3 ~! P; A" N e2 c+ @
perror("open failed\n");3 v( u+ `, u/ X0 O9 n" h" ^
return -1;
. w$ Y* T9 Q9 k& \, a; k P }
/ U( y: T- A4 n# q
9 k! a3 `/ K8 Y" w while(1)
" X6 Q* h% b3 R: v {7 I9 U' x$ E3 l2 {4 a
9 j9 X8 f7 l9 w- E# v' S' y8 M //AMBE2000每次读写是24个字为一帧, \: B$ @. G6 r% I
//写数据时将数据在底层存储起来,等到中断的时候再发送
; B, q* H6 G1 L //AMBE2000输入数据是以0x13EC开头的
8 Y3 Y- ]* ]2 q write(fd,&data_write,sizeof(unsigned short));3 s: g; d* U" u: h- D
- @' i- k; B/ ^0 h9 H) k
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ! V) e3 _3 C8 _' U( W q
read(fd,&data_read,sizeof(unsigned short));
' j4 G$ e1 b3 ~
2 b4 f% Q5 g* Y6 W, Q if(data_read == 0x13Ec)
+ r- [# z8 s, O: R' S w {
2 t+ O& M v& P0 a$ t: B 9 q( x4 b M3 f+ A
printf("data_read = %x\n",data_read);6 i) d( e- R6 T* D
}
: L3 T1 ]8 v. V, M4 I4 A/ @ D( Q$ J* P4 ]& p* ]
msleep(10);
1 d3 x" E3 e- d9 N9 K, E4 C Q- ]
* J5 \/ A# w. H' Y /*5 K9 L- y9 r: v# Z e+ B' Q: b) s
ioctl(fd,1);
0 V, o/ |, ~8 H# P( J) Y2 E. W4 H sleep(1);
0 k) m% D* V1 f( u1 L9 ? ioctl(fd,0);: p: x. Z! e- c3 W2 h8 e3 q
sleep(1);
' f# ?2 C$ \& o( v; x! n */
8 ~2 P: A0 o; A+ T- L } & b" T$ n- {! p: c5 Y v6 `. t
return 0;
" c8 d; G7 e( P# x; B; Q " \( ?- }. h8 d- u- `
}7 k4 ~7 y# l1 k, V8 H. r
, l) y+ e8 \- n v* b. }5 m
多谢各位指教,谢谢! 急" E! d6 z, g: @ {" l% g! j
! |7 U* X) L$ L) \- p3 S; y2 x& e/ L# G! K' D
- r2 {7 i" ~! ^4 \* N
% ~& D1 }5 |+ a7 q. w
: H/ U* b( D- K# }9 y2 F |
|