|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! R6 Z! ?! s% v0 h, h/ b% W/ @! s5 f$ O
/*9 m+ U/ g4 ?! i+ f9 J+ x8 o6 i
* Copyright (C) 2009 Texas Instruments Inc; ^+ i/ q$ e& i/ {
*
2 w" h: W2 e0 b! Z" X9 M * This program is free software; you can redistribute it and/or modify; i) C0 K9 E7 u
* it under the terms of the GNU General Public License as published by
+ ^8 I4 [/ B# n& k * the Free Software Foundation; either version 2 of the License, or9 A# b( X% ]3 Q- _* G4 E
* (at your option)any later version.
: J$ A' q- u1 _( q) }$ C *& l6 L( m+ f, _6 l
* This program is distributed in the hope that it will be useful,0 s, k. U' g+ Y7 j
* but WITHOUT ANY WARRANTY; without even the implied warranty of& p# ?5 `$ w9 q& |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
& [0 y. S: j4 f) ~& H * GNU General Public License for more details.- U4 [" ?$ m: y3 [' |0 _7 K
*# M& j9 z/ @0 X$ p/ i4 W
* You should have received a copy of the GNU General Public License6 Z4 g+ A' Y8 ] g& B
* along with this program; if not, write to the Free Software1 r2 Z2 p" n7 }0 a* X6 v
* Foundati f$ L# F, W9 _& F) Y% z
*/+ l, e) e8 `( e
#include <linux/module.h>
8 I+ d* ^( W0 C#include <linux/init.h>
$ E- w% d0 r1 G& W; g4 L#include <linux/errno.h>
5 E* ]! g8 i; c& A" n* ?#include <linux/types.h>9 s8 h9 q |! N' i6 G F9 S2 q" J( D
#include <linux/interrupt.h>& S7 G9 j; H* c: m9 K; [& r
#include <linux/io.h>
W6 c1 m3 p) |- p#include <linux/sysctl.h>" \5 b+ j; t3 d2 N- H. S5 L
#include <linux/mm.h>
2 z$ D0 q0 D% U. `#include <linux/delay.h>
% A' @6 J! W- B* `$ p a#include<linux/kernel.h>
( h" z! u" a0 h$ m# g% O) C- j, G#include<linux/fs.h>
: z$ i% G& {! C#include<linux/ioctl.h>
) M' O9 W6 E0 J#include<linux/cdev.h>; b% S/ Q% I! ]
#include<linux/kdev_t.h>9 X+ h9 C$ D7 q/ u" {1 i
#include<linux/gpio.h>4 _7 Y* O+ g0 a, S, b1 L
#include <mach/hardware.h># v/ d& \+ |+ M8 I
#include <mach/irqs.h>
. \/ r$ e3 G+ d% P) f
" E6 J- q0 H* v/ o& k9 \8 s3 F! z* G#include <asm/mach-types.h>2 W2 ~2 I' ~( V0 s4 B
#include <asm/mach/arch.h>, J- e! ]) U9 A6 z2 _$ N, P% r, H
#include <mach/da8xx.h>
* O* p# B q) X; C# g c, p3 P) O0 e/ d#define SYSCFG_BASE 0x01c14000: ^1 D% Y5 m O. n" X. H, Z
#define PINMUX1_OFFSET 0x124
, {0 n8 o7 X# J" A9 H2 ]0 f#define PINMUX18_OFFSET 0x168 N3 A/ R: ~6 n
#define PINMUX19_OFFSET 0x16c
7 B# x1 ]9 {/ _4 w$ z1 T#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
3 z0 v4 ~- D% x# p0 ^' R: V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
j- q: V' Y0 a4 g) \2 [, W6 [#define XCR_ADDR 0x01D11010 //MCBSP1_XCR6 F$ H+ ]; f6 ]7 O# ^
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR S& R! [$ {& A" a! s
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
8 }5 k7 `" K2 \# x
, z, U/ X0 O8 P/ V2 I- f#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
( q' i% _; E9 t# I% ]#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
9 z' W, b+ t" _//PSC
( C; L) L* s0 a/ z$ ^/ i; O, z% ]#define PTCMD_ADDR 0x01E27120
- Y( l: Z( h9 e1 V: V) Y& e! B#define MDCTL15_ADDR 0x01E27A3C
, N3 l2 \' D7 o- Z/ B#define PDCTL1_ADDR 0x01E27304
$ X/ O0 i/ |6 @ W# o/ m//GPIO8 direction
4 @) |! Y* t( I( C$ H9 I#define GPIO8_DIRECT 0x01E260B0* D$ m- z+ o1 y
#define GPIO8_OUT 0x01E260B4" F& C; r0 W9 K
#define GPIO8_IN 0x01E260C0- p. E- g) N7 v5 }; H0 b0 U0 o
L: n; _: O9 m7 B' q% y2 F" |
//#define MCBSP1_RINT 99 ( W4 }; K0 e y1 C
//#define MCBSP1_XINT 100
, l+ e$ U6 B" ~! wstatic int MCBSP_MAJOR=239;- l" {! j4 w* t0 k( V0 m' F! h; S/ m
static int MCBSP_MINOR=0;
- y+ F" `( G) cstatic int count =1;
8 x7 H+ b+ Y8 N) n+ |, E1 F$ S
7 Z' C* r; J+ w( m5 |& h- k8 z#define MCBSP_NAME "MCBSP-device"
' p% {1 P0 E# k# J: R+ [
; {. o: S; V; z! Rstatic struct cdev *mcbsp_cdev;/ O7 ?& T- B- V
static struct class *mcbsp_class;
+ M6 V7 J% `0 L# @. v# ?& K6 l! n: fstatic dev_t mcbsp_dev;
7 ^0 Y& D8 B- x& y( H/ y, yunsigned int DRR_data;
" _ P8 {! i8 U. r; `/ \* J/ yunsigned int DXR_data;* w5 K+ F9 Y- O( e. I X2 L P
static int mcbsp_open(struct inode *inode,struct file *file)
+ S# {& Y( C" ^% ~* M* B" [6 [{# f- ~4 [- A5 \; o- c/ x
+ V) R+ @9 {! D. r; c, \. a; C/ n //interrupt enable,initialized5 r8 t6 S9 j7 Q" x3 d& m0 b+ b# h
unsigned int temp;
+ L4 D- b: k! H- m: j% p //SLEEP_EN(GPIO8[10])---0
5 Q8 Q& o6 Y+ p3 W) W, i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 X$ Y L3 M M. r! D# C temp=temp&(~0x00000400);3 p9 u2 A) G0 x& K" D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ v1 R* [& a" a8 ?) W //RESETn(GPIO8[8])----0----1 \* T! b3 K2 c8 s& W2 L" V- g [/ q& W
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 C8 [/ S; Z8 w f
temp=temp&(~0x00000100);
- B0 Z7 x+ j; t, I; F; q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0 x; y1 T% P2 T. q
udelay(100);
4 C3 a) t- {4 i temp=temp| 0x00000100;' C4 k5 K& h7 Q' d8 N6 @8 z* }
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 g0 i' a" d1 H) U% { udelay(100);
: K- c( ^8 d. J& [! Y: X/ l/ g8 R4 X) ~ printk("open success!\n");
. ] j' ?( a6 y4 W% B. I& N: B. j return 0;
& b+ k8 r) I6 D$ Y2 R}
0 Z7 J$ ? q/ T( g
# R) G A+ Q- V& v7 Estatic int mcbsp_release(struct inode *inode,struct file *file)
) |# K/ D5 F+ Q; ~& @1 {+ g{
. h l# O, D5 x5 Z1 d$ C printk("release success!\n");
# _: r0 k( z7 C$ _ return 0;
: ~( Y! O/ A E- U, |* _}
+ b: p" B3 |: I; A+ o* h" I- V; t3 N! I8 W7 {4 F
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). K. l3 d+ G1 I6 A! {
{& M2 f- o; T' v. J% d( i3 [
copy_from_user(&DXR_data,buf,len);0 _) o* q! ~3 @" q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% W$ W% e& e8 r3 k6 ? return 0;
" r1 C; P+ Y- O, L" p" h1 Q
) V9 m# z$ W9 e6 d}
" `. u3 m* W9 e" z6 p7 ?2 h+ a) s% z ?2 l1 ?/ e4 m
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 e! ?& P, S9 @9 m1 p{
' U4 v5 g4 V: v. E2 z4 I) d" P DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% x5 @. N3 a i8 H* j. s" F copy_to_user(buf,&DRR_data,len);
) u' D$ r: S) s; z9 u+ i& E return 0;
5 b( v3 U5 H# o, }( Q$ `}
" Q' y) K X# E. H3 \
: L' R a4 f9 [6 v% H( F. j# f
5 ^6 i. x% K+ P: D1 z6 Ostatic struct file_operations mcbsp_fops=, O/ ?3 z) V/ r: f$ y2 I+ s3 k
{
) R6 g7 ]: ^% b$ K5 a. ? .owner=THIS_MODULE,
" v7 c. t( X' H4 l .open=mcbsp_open,
6 q+ i2 `, k* a$ z- V .release=mcbsp_release,- g, y# M, {) M4 }: Z Q
.write=mcbsp_write,
6 [. `4 Y- r! o- r .read=mcbsp_read,* c* s+ f9 X% O, l1 z6 G
};
. l% O* J E; f1 z" Zstatic int __init MCBSP_init(void)
+ w) L$ W U" Y: Z( z2 p, b* }{7 e4 h) O2 y6 V! ^, x( F; U$ d6 l
int ret;
* N5 J" K+ S1 i# s unsigned int PINMUX1_REG_old;
/ J% P K9 y' d4 ?: n unsigned int PINMUX18_REG_old;
3 M" p' b( i' K! v" N% I, U unsigned int PINMUX19_REG_old;
# Y& D4 F( c: [' l4 { unsigned int temp;
/ P0 o0 e0 o- I* Y7 i" j* y7 h if(MCBSP_MAJOR)
9 A* \0 v3 h3 f/ j: I6 e2 |0 M {
' c4 b j3 W, S% E' h mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% r6 e* {$ w% f# X
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);# p3 e; s' U- Y: E8 k
}% v6 Y5 S6 V6 A
else
# U1 ?( z# x: @6 D {1 M1 I$ s5 {6 C' o! i) F3 _
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) e; J# V; @. F! Y, n& d
MCBSP_MAJOR=MAJOR(mcbsp_dev);
; r. W# I2 u1 t1 m }
3 E" K& g* H3 c' W& u. T
* U( f. w5 f1 Z1 t if(ret<0)& J0 o& o0 }! y" Q. ~
{4 B+ K! A1 q6 Y0 }0 S3 R6 X
printk(KERN_ERR "register chrdev fail!");4 q8 d8 P& a" M& N4 f0 N! L! V* J
return -1;
6 N) H* \* t8 Z. T }
/ ~0 p s( H7 W, c" k2 x' c5 x/ c # v4 J, C! V* ^; G7 ~ X
mcbsp_cdev=cdev_alloc();$ T8 U& Z- Y/ @4 N' q
. O# x' [" g0 _# l" ?/ H8 S' k T if(mcbsp_cdev!=NULL)
! e2 Y/ m4 Q' [* y2 r, e1 n {7 E, V; g! E6 F2 T
cdev_init(mcbsp_cdev,&mcbsp_fops);
3 {2 ]$ r- M0 f. W2 }( i mcbsp_cdev->ops=&mcbsp_fops;) Y5 x* b& h. t% Z$ f& _% v
mcbsp_cdev->owner=THIS_MODULE;- {' U, q9 F7 @! S+ d
/ b8 U9 a1 g9 _ Q3 Z% A( x- b# }
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% j( ?) h% H0 T* f
printk(KERN_ERR "register cdev fail!");. K1 l3 J# s3 w
else
9 G8 d4 X; s$ G3 K/ f printk(KERN_ERR "register success!\n");
$ d" ?0 N2 }* Y }, m7 L- W4 \- ]7 ]8 W i
else
2 @! |5 K4 J c5 d) N {
3 @" G; g/ |- c! c4 z. C# g7 o1 w' S" u8 ] printk(KERN_ERR "register cdev err!");
8 }' A5 f) j K3 ?1 [ return -1;
" l4 I% E: F, [ }1 k. O* h& [" ?
! b9 c2 \! F! P mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. p/ n5 I9 ?4 {: o
if(IS_ERR(mcbsp_class))- X) x) `1 }+ b* M7 L6 D/ \
{/ Q% j$ Z [* H" m
printk(KERN_ERR "register class err!");( W( M7 |$ o5 v5 |# C
return -1;8 r- j$ B- c* a H! V
}
$ L& y, n" m- x1 Q' p* ? device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 v. j9 [. W7 X& D2 [9 q
1 t5 @% O) e6 W" W( F) t" {9 I
//PSC
3 Y- }3 x3 Q* R$ }, h //add Enable MCBSP0 W3 b7 x4 Q$ F( y( f$ q
//test8 T! w2 a( |4 u S: \ |
temp = 0x80000003;( p0 g$ t. v+ J+ s2 }3 ^
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 [: Z3 W0 O, P* i. j temp = 0x00000003;# Q$ C4 m- F: e& ^, q# s
writel(temp, IO_ADDRESS(PTCMD_ADDR));
: J& f% G2 _( l9 ^# Q " \6 g3 D8 H* c( ~, k" T
temp = 0x001FF201;
" V" W' r2 R" h' G4 ]5 b writel(temp, IO_ADDRESS(PDCTL1_ADDR));( W3 \! e7 N2 }9 [! ?# j& _
' c7 k0 I) ^$ L: T# F( i1 t //PINMUX
1 P8 @; u+ E. T0 I: ]3 [1 t //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 ?3 ]# `) s4 V6 [, X% D PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); - U+ B3 H' ^, I. S" O* h
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, M j9 Y6 m( J! B writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" n" v6 ]; q- F& ?/ ?" E) F
: x2 U3 j1 S( {: x$ I
//SLEEP_EN,EPR,L138_SHK1,L138_RC
J& n$ i4 U, W, D PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* ^/ \+ T! q0 P5 G$ w9 S6 t PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
, ~+ f/ E) x4 L, f3 G writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& w g$ c8 f( H0 X, r
, o( k8 ^0 M8 @8 F; W- m //RESETn,L138_SHK2
x% T0 K6 \5 w PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; u( y) I# t F* e! D
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; " L! `4 R8 ]# O& r1 ?8 Z
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 o1 X( H& r3 r- Z 9 d% [' W: ^5 D! b: t) ]0 z' S
; C! `0 j% B8 G) L //SPCR Register
3 V0 ^, x$ y" t9 L- L% R //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% Y- _) u) D) g7 ~ temp = 0x03000000;//(DLB=0)0 V% G3 F; q, v k x% t
// temp = 0x03008000;//(DLB=1)
$ H4 u5 S% O' l3 P9 b1 W writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
' P5 Z% F9 M+ i" f- d temp = readl(IO_ADDRESS(SPCR_ADDR));
4 \" `, y4 A' ^7 c/ o6 z0 B printk("temp=%x\n",temp);" T. b( ~3 X8 [9 M. h- S$ d
5 c: |( [! {. J6 V //PCR Register$ \, S) I* R% n) e; P
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
# T6 F! @3 o5 L1 a2 {8 n; C7 [" e' w // temp = 0x00000F0F;
" r0 M, I# w' ]: g; L temp = 0x00000B0F;
6 s8 N* q. y) v- T: E D9 E writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* e& y* Q- ~9 j1 h temp = readl(IO_ADDRESS(PCR_ADDR));8 M9 S, ^' D/ L1 G& o) R+ N, r
printk("temp=%x\n",temp); 6 Y( w; o F5 ]: u$ c
//SRGR Register
# G9 Q+ s8 \2 ` //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
$ W6 H5 |' U5 Y1 I //temp = 0x301F000B;' q. G- G3 W5 M [
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
% S# l. I! \ N- R3 s temp = readl(IO_ADDRESS(SRGR_ADDR));
6 V1 H+ ]. z0 v& M5 R printk("temp=%x\n",temp);, A, u7 T) w( T+ C$ m$ ?
//RCR& ?+ ]: G4 F$ v
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: R7 s. s- @4 w4 @' D
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& o& [( @/ D9 R3 H6 l6 c( D temp = 0x00440040;! r4 V5 [7 S6 v- }2 Q" B
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 3 W2 E8 Z/ m) L5 x, T7 {
temp = readl(IO_ADDRESS(RCR_ADDR));& }+ T! I" w) f U" F3 D6 J* P
printk("temp=%x\n",temp);/ g5 r7 W; q& f$ K" ?3 Q* Y
//XCR
% q! ]: G& [. J; q0 J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 j3 ^' ?6 y4 d! E1 E- \/ `) c
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: x- q( j$ i' I' L temp = 0x00440040;. W. t/ p! W8 G3 T
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized + V' U) r9 v! Y8 r: E
temp = readl(IO_ADDRESS(XCR_ADDR));0 b1 G, u$ a; J1 C, t
printk("temp=%x\n",temp);. ]5 C) d# ?# F0 q
udelay(100);- z/ k/ ?( R- _
//SPCR Register
" h3 t4 H! l. {8 s5 z. i //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- ^5 E% A4 h, ^3 u: O- H
temp = 0x03C10001; //DLB = 0 VS DLB = 1
+ c, J( `' o8 X% x$ t* K# d writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled" ~% R; c) F' k# t# u# n9 d) r" L' }
temp = readl(IO_ADDRESS(SPCR_ADDR));
+ c( x* R" u6 A% O$ _- p printk("temp=%x\n",temp);
) Y9 M4 E1 H, ] udelay(100);
/ L& \( F/ I2 v( R# @4 e
- L3 p3 N& l( M7 C7 a }1 P //set GPIO direction
: A0 o1 k$ X0 T4 @ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 M' K0 X% `! q' U" K* l+ x8 s5 | temp = temp | 0x00000100;//EPR----input
' U3 \5 j0 u- y" [# c temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output- ^( A( |5 r. Y3 K6 P- }
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( o) Y/ t$ ~/ L 6 J/ Y& m4 c! g9 R
return 0;
+ \7 F u& h) D5 d, u0 f% x; w7 I}
. R% O5 u: {2 d& ?. z9 Vstatic void __exit MCBSP_exit(void)( l" J% p& O1 ^) y
{
# W3 M3 E0 H7 v9 [/ ^7 M! n" L8 X printk("mcbsp chrdev exit!\n"); O, ]5 J9 L" U& E# S; i( \
cdev_del(mcbsp_cdev);& o. S4 k9 A4 v/ Y% g; J
unregister_chrdev_region(mcbsp_dev,count);
4 _1 j& G9 X! g& P device_destroy(mcbsp_class,mcbsp_dev);; p5 Y' S' c+ Y2 R b1 O& o8 P, S
class_destroy(mcbsp_class);+ l; g& G/ ?8 l+ R3 B
}
% o. E% N7 C% cmodule_init(MCBSP_init);; i' ?) u7 S6 n" r" K3 `- f9 H& e
module_exit(MCBSP_exit);0 F9 O4 \% J- ]; _, w( t
( {: O- `, R& p1 l. PMODULE_LICENSE("GPL");+ k1 _- K$ ?. ~
' F& V3 H1 `' v( S我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' U3 U1 A( |1 L$ B; b' A
我的应用层的测试程序如下; p$ F- }8 x% Q0 K
#include <stdio.h>& M2 v# u# p8 J0 x
#include <string.h>
3 e% f3 t1 w( x; O! _#include <fcntl.h>' v4 [6 w, E B* R. Z. y. E: A
#include <unistd.h>. E1 l8 _9 [# T& `' C8 V$ H
#include <signal.h>/ Q+ D; e' M$ _, w
#include <pthread.h> //线程7 z- u/ T- n, s% @# i0 g
#include <stdlib.h>' L$ K, Q2 O! ~
#include <pcap.h> //捕获网口数据: K( q3 Y* e8 c- f
#include <semaphore.h> //信号* ?& t, I" G8 z9 I% \- W
#include <sys/types.h> //消息对列9 y6 ]; @% X; y' J
#include <sys/ipc.h> //消息队列
* w6 S. J7 |. U& P2 U d! d9 R#include <sys/msg.h> //消息队列
5 B3 [) Z. _9 ]. C#include <sys/select.h>& T- C8 Q+ v, j
#include <sys/syscall.h>
, }0 A& r+ ?' Q& u$ w+ t9 D; f) t#include <sys/stat.h>- _5 ]( c& C! K4 E' _
#include <sys/mman.h>1 ] i' R: s% X+ s6 `! P' T* I% ?
#define msleep(x) usleep(1000*x)' ^7 c8 s! k# g( ~
% X4 ^, y3 F9 c' Q+ ?
int main()! i9 o* {. t2 F1 z$ \$ S8 \
{
' u! f; c6 Z& f/ {. Y( { //MCBSP,ARM与AMBE2000交互设备3 {/ S q# U4 E) k- F# Y4 R
int fd;
3 W% W- {- u/ _6 { K% C unsigned short data_write = 0x5555;
4 S, `2 L7 ?1 x k unsigned short data_read = 0x00;5 Z) E! ~9 I, H0 ]
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% D- e; |" y( H* ^/ g. X
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ X- T/ }' S& @. @
. g- H, C+ U; {/ M, H6 E# l if(fd < 0)
. c ], X. _( O+ R4 W$ T( N, { {2 K0 a& _ o0 R
perror("open failed\n");* A5 s- P( L8 w2 M; g* [) H& C; T
return -1;
j# t: Q* _8 L& i, _ }
+ E, p* l# |/ E# z " o4 u1 P; K' r$ q8 @" f. Q
while(1)
& x; [8 N+ b$ a7 f8 c {4 b, ]( P" K G/ f; k0 z [- g
& `6 q5 y% w- S //AMBE2000每次读写是24个字为一帧
2 ?: ^- a2 [1 q4 Z C" p //写数据时将数据在底层存储起来,等到中断的时候再发送+ v3 n9 ^8 i* k8 f% L
//AMBE2000输入数据是以0x13EC开头的
+ c% i! s& Z- i) t2 E write(fd,&data_write,sizeof(unsigned short));
$ e. @* `& P$ B5 A
% n1 O$ ^4 h: Z( _+ k @$ i' Y //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% f& p9 D' X% ?* i8 f' h( @: t1 B3 ] read(fd,&data_read,sizeof(unsigned short));
- W$ Q( e( F# S2 v' B7 ~
7 j5 u. x' Y& Z" T. q$ S4 {- h/ H if(data_read == 0x13Ec)# C) H1 [7 B8 `; a5 _5 t
{) r# q9 z9 _/ c. v6 t( R9 r& W' X
, ]" B4 a) O- D3 }9 W# k% K
printf("data_read = %x\n",data_read);
8 u$ E6 m7 a( `. ~ }
1 Y. i2 W, M3 k, L1 v / k# y: D# m+ |: u% r. }
msleep(10);( v. r k3 o7 _ ^/ Q4 S
+ `; e3 J+ A' E( u9 i1 `% s /*
; q/ e) j- b. W% D2 l- t( h+ ^ ioctl(fd,1);
! r0 W( N" a J, |0 }4 l, G- U sleep(1);8 a) O/ V* ~( ^! s, r
ioctl(fd,0);
( N" x6 b) D! A4 m, g6 r2 y% V sleep(1);! `6 Y& n8 e, Q: o3 g. T
*/ 4 E9 e* L' [/ C, R
} ( b+ r! C% {2 [% p8 L$ F$ _3 ~
return 0;+ M- F" a7 E( r8 a- |* v) U
2 ~* C; q7 I# P: |# H
}1 @! N# a, F: U2 s1 E3 [
4 v& a2 T( o' \
多谢各位指教,谢谢! 急
& E) Y k' V: q7 K. n$ H2 L4 g+ W8 B
, V- ~" [5 L" M# P4 K9 {7 `+ ^5 Z
4 n! N! B6 G2 y! V
4 F& `; i9 a; m) b8 a
, T9 `: s- \6 {7 \& L, P' w9 e
/ |2 d3 X+ s& X g# y: j |
|