|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% p! ?( X j: L3 W5 g/*
" D9 w" V1 G% E0 E ^: H * Copyright (C) 2009 Texas Instruments Inc
) e9 f4 t6 ?1 c# K# Q7 N *
& P% r( Z | K/ G, _5 U * This program is free software; you can redistribute it and/or modify
6 F7 H" o! b: e' d7 D& i W * it under the terms of the GNU General Public License as published by0 @' ]: j/ i# |" Z1 h5 U6 X
* the Free Software Foundation; either version 2 of the License, or
, y- K& k# c/ Z* ~- O3 B# } * (at your option)any later version.
( {4 r- I% y3 V& W *
, r6 N7 o% u/ _ * This program is distributed in the hope that it will be useful,
& V4 g) F/ t% W * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 j5 ]$ w* r( r5 L3 B. d* f* ^* [ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 o- r* J( U# V x( Y5 T * GNU General Public License for more details.4 x. ?5 k# Z: L; O, r
*
( d; ]1 E v0 ]5 ] * You should have received a copy of the GNU General Public License" O8 H$ H1 v8 x9 n: q$ B/ ^- g6 y
* along with this program; if not, write to the Free Software9 n( Q f. G7 p& ?) L
* Foundati9 A9 g* |, |! l" F# B3 m
*/+ h. D% R8 l( y2 N8 R5 w9 ?3 h
#include <linux/module.h>( M# f8 d8 X6 @ T1 L( t% E
#include <linux/init.h>
: Z( u$ {8 z. e) ?1 G7 k#include <linux/errno.h>" J8 r9 \6 @, p
#include <linux/types.h>
7 t9 a7 m1 N8 m# R& s/ N#include <linux/interrupt.h>
/ @# j' `# ]4 F. e#include <linux/io.h>
% z- t6 A9 W' B8 N: F( x, e6 L#include <linux/sysctl.h>
- E# x$ @1 }) h# h$ h% C' G: i#include <linux/mm.h>8 I$ L! ?$ d' r$ c: G& \
#include <linux/delay.h>
' Q2 v8 ^3 Q8 w2 W! T& K% X#include<linux/kernel.h>
1 z% b8 M/ h- \; H( P: P#include<linux/fs.h>
; B0 U" W% F0 t#include<linux/ioctl.h>
9 h+ W( `3 ?7 b! p, n7 q9 ]- |! E#include<linux/cdev.h>
' L2 ^* l) ^ v9 j# `& T1 e. S#include<linux/kdev_t.h>
" N1 U% S6 E5 Z3 Z4 T#include<linux/gpio.h>
) o, s2 z- C1 P) B& c4 l3 \$ G1 F" K#include <mach/hardware.h># Q' Y& C2 e: ?7 |7 c' q7 l/ B
#include <mach/irqs.h>* j* n& h. b6 {$ j
, K* |) x; p3 p+ v
#include <asm/mach-types.h>
$ }# {- X& o2 a9 R0 C5 I* P6 Q#include <asm/mach/arch.h>- e" G: Z. }3 q% z" z: e4 C& p
#include <mach/da8xx.h>/ [' b. D0 x, L, F c
#define SYSCFG_BASE 0x01c14000
8 c: i" }7 ^% q4 t/ |/ S- w8 ~#define PINMUX1_OFFSET 0x124 ! {9 ~8 M& I F9 c0 Y
#define PINMUX18_OFFSET 0x168
{1 } }5 ]+ t4 g1 g T2 r#define PINMUX19_OFFSET 0x16c
- @5 H' e" A& ^, M, |* e b#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 I+ N* t8 Y4 @& M( {- T1 f#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 R$ O' L/ ^: u3 k* e: C0 Q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR2 E% }8 X7 f' y& G
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" | o6 B6 o3 D U8 ~2 f# ]$ I
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 O) {( c2 P" X9 h5 A- H , ~! K& V- F H" q3 X! s6 b
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& Z" P' I- R; }* R2 B+ Y. v+ Y#define DRR_ADDR 0x01D11000 //MCBSP1_DRR L' W/ I& o2 j, }4 u
//PSC$ C _/ E0 C! h ]
#define PTCMD_ADDR 0x01E27120
6 A; W8 |- ]4 n3 O$ M* @8 H6 i#define MDCTL15_ADDR 0x01E27A3C
, j4 S/ W! l* e0 E+ L* R4 R; Q4 A6 j#define PDCTL1_ADDR 0x01E27304 [2 K5 v" g4 _& c4 i9 G
//GPIO8 direction
6 Q' ?! R! h. ?' W+ P q#define GPIO8_DIRECT 0x01E260B0
% ~# T" _% L1 g3 d#define GPIO8_OUT 0x01E260B4
/ A' f/ c! o' e# s#define GPIO8_IN 0x01E260C0
5 J5 R) j$ v) u+ P" G/ f+ e# D; x+ d3 K7 g. V, S% T0 |$ P: j+ o
//#define MCBSP1_RINT 99 w% K: T Z* J
//#define MCBSP1_XINT 100 , P7 i& g: n# B% v9 V! f
static int MCBSP_MAJOR=239;
! D' ~' c* |1 @2 o$ p* r3 x6 n0 Rstatic int MCBSP_MINOR=0;( G& e- T" c, C* w* i0 o( ~% @0 B! ?
static int count =1;
4 y# w3 B& s- U+ v) u
' j; h/ ?# k8 z( M0 ?+ z#define MCBSP_NAME "MCBSP-device"7 z2 q5 q3 Z& k) l- ^/ `. A5 T. A, ]1 t
: q! u+ j* y0 p6 m. }4 H. C5 qstatic struct cdev *mcbsp_cdev;
; b/ D; ]' G- B6 h* k& H- }static struct class *mcbsp_class;. t# e! Y3 w/ r, w4 [& q, G
static dev_t mcbsp_dev;
3 ~/ e! l/ m# m5 u% y N0 Runsigned int DRR_data;* w! {* [1 @* i- }
unsigned int DXR_data;
1 n! T6 i1 K$ m) I8 ]* Qstatic int mcbsp_open(struct inode *inode,struct file *file) r9 `, d3 T* F0 V
{; b, \) m2 v8 c: c
: g D. c: M. Y% }' F* L //interrupt enable,initialized( {5 T$ G+ H: A% X
unsigned int temp;
: [1 ^0 d8 C8 Q9 H //SLEEP_EN(GPIO8[10])---0
( o3 A% {: Z- z, ]0 ~+ {+ k temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 y. u* X" N/ s8 Z* a) _ temp=temp&(~0x00000400);
. S' D, X: a7 W3 z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& p: T' V8 B% l //RESETn(GPIO8[8])----0----1
1 f9 L2 m* i0 f( ^' `. f temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' H# B2 g" D R# d% Y temp=temp&(~0x00000100);
( G, l5 E$ h& [$ f5 R __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 q& q. D# o$ s1 \2 _ udelay(100);
$ F6 a" z. t1 B6 c) o- n2 K temp=temp| 0x00000100;
6 v+ u6 R, |' c, f __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& Y$ z* I- s, G* k" ^9 X
udelay(100);+ {9 Q( v ^) i/ O; u- L* d! W& x* j# M
printk("open success!\n");/ Z4 s' g( O4 e5 g: f ~8 h% v
return 0;
|( X! O8 m) y5 [. m! X/ P* p}# }3 J! i! C* b# ~1 N1 [
d/ b' S% j4 fstatic int mcbsp_release(struct inode *inode,struct file *file)
' L) Y. v2 d' u! k# a# P0 S{
! Z0 M' ^( ?# R! I- h } printk("release success!\n");7 ^- Q5 }: R0 ^
return 0;
, h5 j# @9 a4 O$ Y}2 c0 k1 H* \1 w! u) _
$ m% d/ C @# m" m& G8 U0 Tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% a) Z; M$ o: P+ \4 L; z{3 a- W% t2 A4 s/ W7 K# Q: M
copy_from_user(&DXR_data,buf,len);
$ \0 c) a/ R4 P0 ~* u. d' x iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
) u! @ l( C7 W- s# D return 0;% ~# U2 o- G4 ]
1 z. e/ g# F/ F3 o( g
}+ s7 v. N$ j9 n/ N! F8 E
9 g6 s5 n8 D6 S# y2 G7 Xstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). ^6 u3 w4 i- ]3 T
{ . U' A3 C3 d$ z# a! \; {
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' B% Y5 d- F: }0 G& E- d: b: ~ copy_to_user(buf,&DRR_data,len);
9 I5 g9 }# A+ \& E return 0;7 ]" k L, u5 D" Q
}$ ?* ^. y7 l9 Q8 r
4 O; c e6 y3 a; P( B q2 f
6 j; f$ n4 S# qstatic struct file_operations mcbsp_fops=4 U# A2 i; K6 `. }8 ?1 p! x
{
" a6 W3 E- ?$ s. e: a .owner=THIS_MODULE,0 A8 j6 X/ U9 L5 N( Y
.open=mcbsp_open,
3 b8 L( J' ^! L5 \- P, d .release=mcbsp_release,; j$ t! p- @ n4 U' \5 I* Q
.write=mcbsp_write,5 ~" l1 s E- A! {( x
.read=mcbsp_read,- ^$ t7 L! W- U. I6 h: W" g
};
! u+ T2 |6 A+ D. O4 c8 x9 Y: gstatic int __init MCBSP_init(void): p1 P* R/ h Z5 e. Y# j' D4 ?; t0 {
{
, B! P" D+ \! c, j0 _: ~3 G y, U int ret;& k# c: R* d3 [) X# t; U8 G- Z
unsigned int PINMUX1_REG_old;. B& }5 E1 J- x% {( C
unsigned int PINMUX18_REG_old;
9 t& p5 m* n: E unsigned int PINMUX19_REG_old;
. R6 J- V2 c9 r3 c' f' `* d5 o unsigned int temp;
$ ]# {- R7 h$ Y7 q if(MCBSP_MAJOR)
4 g9 J$ Z5 g" R( A$ d2 ?: W {. V0 c: M1 }; v2 \" ~
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* a& B$ @8 K$ l+ o( t( u
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); ~$ Y ^$ G) c* A' O3 j
}
7 L7 f2 t3 X5 T else/ R& e' c* v) Z/ X+ h3 ^* l) }" y
{
; o) X4 p( s# \ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 R& z! W! t( I$ i- D4 N# d" H+ m
MCBSP_MAJOR=MAJOR(mcbsp_dev);
4 n" M, p, \/ H( S& s0 z$ N5 i }# Q$ h C( ]) C) G* C
# i/ ~, G) z, a+ O! t if(ret<0)4 S! A" q/ I6 P% `# O2 R7 f
{
8 @8 j6 G7 p* B! v! c5 \ printk(KERN_ERR "register chrdev fail!");
2 Y, s' S/ \ K5 O return -1;
4 H' a% M U1 U }
$ R9 N5 J( V/ ~7 _ ' L8 [8 v$ x/ K
mcbsp_cdev=cdev_alloc();
6 l P( a7 V' W- h
! t9 I4 j [' [! u if(mcbsp_cdev!=NULL)
8 \, m2 P5 V. u# C# z+ N {
- B7 u4 a3 h( C cdev_init(mcbsp_cdev,&mcbsp_fops);
/ n7 w, } z% b7 [) d mcbsp_cdev->ops=&mcbsp_fops;- o7 M" e1 e0 a; Y
mcbsp_cdev->owner=THIS_MODULE;
( ?) r$ `! I7 u* O7 e( Z
$ `7 W: b; Y6 p8 |+ I ? if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), O! q+ B1 o1 w) E8 e- p. s" S
printk(KERN_ERR "register cdev fail!");2 A5 z h* R- H1 N/ d7 J5 q
else
3 }* ~: v8 k$ ]8 D3 ` printk(KERN_ERR "register success!\n");" }7 M4 c5 x4 E2 C7 X( N
}
F( a% ^* [; y! h; T else9 j3 P+ T% O6 d' \' Z$ p. }
{2 h3 d$ y" i$ Y$ [+ h3 e: l* \
printk(KERN_ERR "register cdev err!");
, n2 Q, m! Z+ ]& U return -1;& Y+ R9 P; F7 v# V$ d
}
& S! Y- n4 Z* @4 V4 l( {/ X0 e 4 Y: R6 K' s( R! @7 V
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( M' d# K8 x- R
if(IS_ERR(mcbsp_class))9 r3 K3 {2 c" K8 F: T l" @) @
{5 V7 E' V: s# D# [1 X
printk(KERN_ERR "register class err!");
2 E- U5 S2 S! I( b return -1;
0 ]* g4 j' G2 B- | }
5 |+ t# C, E& R+ D, d device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* a) G+ f! E! y+ R
& R) K/ m' Q% G9 c1 f) } //PSC
b8 S# v9 x6 H //add Enable MCBSP
c7 \" Q t1 b) P: s5 w //test
! X; q m8 s2 K' I temp = 0x80000003;* W' w' y5 h2 \2 s; J! `* f
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 w( U# D* J4 S; \; d5 a0 d" N temp = 0x00000003;
+ B, K: k. d o7 L. {" `# e { writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 [9 V' X, x8 @. }
, k2 P3 z0 m m& x1 ^ temp = 0x001FF201;
7 V+ J6 q4 e: M writel(temp, IO_ADDRESS(PDCTL1_ADDR));; _7 u, V9 a6 j+ X
& f6 y, C( s! k, h" |- l y //PINMUX
8 f! ~7 k9 E1 v //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: _1 N1 ~' u: S- y3 ~( L5 ?
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- }/ @; o8 p. ^5 ] PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; / R2 ^( K9 ^7 i
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# h8 D4 L) v% d- u
6 ^# F. o2 Q6 b$ R* V0 O
//SLEEP_EN,EPR,L138_SHK1,L138_RC
; q3 _# w. Z2 Y" G3 y# Z+ \ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' p; n% }! i& f PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ Q% ?- }+ W# p
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* X! A/ B5 J& r6 c
- N6 v( o/ R# K3 w. U //RESETn,L138_SHK2
5 s' W% A: J2 G2 I7 |) |! [8 R s: ~1 H PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ! \% R' X' p& S
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 {6 z t) t! y6 W U* E writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ {# p7 i. r7 i) z
/ J( Q4 d0 G t9 w
6 L% I4 J2 B ~9 M/ }! Q //SPCR Register; G& [! L; p d* l
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 u7 p9 t" y8 V( a0 t' r; z temp = 0x03000000;//(DLB=0)
3 F0 N: } d, Y; a4 [ // temp = 0x03008000;//(DLB=1)
6 @/ b7 M6 {% @4 }& K writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset7 F' V2 x" k% e" H( l+ v& v
temp = readl(IO_ADDRESS(SPCR_ADDR));: L& a2 j0 w) q* w) }
printk("temp=%x\n",temp);9 c+ }/ _: u& g' ?9 x
! ^, g" z$ T; x5 c6 N3 G- J' i
//PCR Register; @! h5 x/ X. y$ K0 M
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
$ P/ g$ m& u" v* N$ J // temp = 0x00000F0F;
/ N6 B5 t: x0 a9 @2 _" F& J- ]/ b+ i temp = 0x00000B0F;
# W9 g5 T# `' b1 { writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 t* m: \4 ]9 x1 ?9 g- ^% S- E1 j temp = readl(IO_ADDRESS(PCR_ADDR));: n5 `$ ]+ G" r5 Z) B/ T
printk("temp=%x\n",temp);
9 f* B# p! t1 _' m; s- R/ Q //SRGR Register
3 s/ g9 }9 k8 W; T5 K //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
g( A W3 c- p% ^( F) ^ //temp = 0x301F000B;
$ P0 l( C* M [0 b writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * I8 D! X% q- Y# r) p
temp = readl(IO_ADDRESS(SRGR_ADDR));
- O- Q- k# m) ` printk("temp=%x\n",temp);
) h, O$ h% ]( P! [, R& Q$ J+ S //RCR
% Q& r! q. @( Z$ O //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 G6 p+ |8 K M9 o
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 ^( Y/ d4 q$ t3 L+ u2 u
temp = 0x00440040;; \" d1 `2 ~9 F7 I& a! ^6 G
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ( e9 `4 N4 o0 P, t& [
temp = readl(IO_ADDRESS(RCR_ADDR));1 ~$ v' V- d! N& a4 g! D
printk("temp=%x\n",temp);
, M& x5 d7 h9 Z' |9 H //XCR
& f% C0 J6 `& o' x# S //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
2 e- ~5 b/ G: a, t. J //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 _4 T2 t7 u5 H& W3 n" s temp = 0x00440040;- g' F5 V8 ~. j5 B" o
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 5 ?1 Z1 \- s) G. ~- Z' w) w# ?
temp = readl(IO_ADDRESS(XCR_ADDR));
% c/ k c$ z* ]( Y' P. q8 s printk("temp=%x\n",temp);4 b0 w$ Y; C7 ^
udelay(100);. h1 V/ q. L {7 I) c- n: T
//SPCR Register' U3 W5 K& m/ p' [
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 A( [/ u9 E7 n; p% @ temp = 0x03C10001; //DLB = 0 VS DLB = 1
2 x) X: s# h' F6 ` J) D writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
2 U: J$ m+ S0 C% C temp = readl(IO_ADDRESS(SPCR_ADDR));
4 Y8 f! O# `- X6 o! U printk("temp=%x\n",temp);
# I" m$ k2 h$ s7 k9 m0 X( v udelay(100);; C- y6 m/ q8 d/ k
6 [* D' }# |7 Z5 S3 n A+ r
//set GPIO direction3 S- R0 R7 x- w9 h. }; \
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- V) m2 k: l2 D; \& x3 g7 T
temp = temp | 0x00000100;//EPR----input' {0 F9 |9 t5 V
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" k6 D' ?- X& {- J1 U2 l. B
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 K2 d7 ^: m! n, ?
, r2 Z" y# z2 P7 p3 l& g
return 0;
5 L/ h4 u) Z& S3 V0 m% t1 V+ I}
0 o' z8 X- Q) l& T h+ g. Hstatic void __exit MCBSP_exit(void)
* w2 p" d z, u& ~2 L5 f{
( `; N/ O$ k8 o2 f+ J3 Z! a printk("mcbsp chrdev exit!\n");9 H' X4 F- y {! n) n
cdev_del(mcbsp_cdev);5 z5 l5 t G) N5 k; H1 \# p! E
unregister_chrdev_region(mcbsp_dev,count);
1 }% s3 r9 Y: I# l3 x& x device_destroy(mcbsp_class,mcbsp_dev);
$ ]: P& Z- _! |; O- t; N class_destroy(mcbsp_class);
- B7 ~: p, l7 d' L! R* W}
- v( U; V; b0 t' H i5 J( @* umodule_init(MCBSP_init);
' o5 O+ R, S: Qmodule_exit(MCBSP_exit);
4 O' d& w8 X2 d1 x7 N% ]! t$ T$ f; k- q5 v# V
MODULE_LICENSE("GPL");
% o1 R8 ^ r* c
# H' t. T* [5 o9 K2 U: g7 a我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。( ~( t& @0 @3 t5 ?) S
我的应用层的测试程序如下
7 y3 k$ ?- ]/ z# Q% v# q- V+ m% R#include <stdio.h>% ~- m3 E, l9 O3 f
#include <string.h>6 v1 Z* @( I' z. e9 w) S- ?
#include <fcntl.h>
! o9 U( B3 m9 Y9 F! K$ e! v- o' @0 q#include <unistd.h>
4 U. V7 |: p) T6 N7 O8 K#include <signal.h>
: }0 ]- ? X: b; ]# ^- I#include <pthread.h> //线程
0 _* [$ F# \) ]( [: f1 N. H5 V#include <stdlib.h>
& E/ m/ S, f% @+ ~' y#include <pcap.h> //捕获网口数据
0 \0 V" [' [+ k9 w2 v: l#include <semaphore.h> //信号
* D5 a) T& D1 Z# z6 A2 [, I! f#include <sys/types.h> //消息对列
. N y! v7 L' R6 k#include <sys/ipc.h> //消息队列
% s' w" o9 a' [$ O* s#include <sys/msg.h> //消息队列
! U7 ]6 Y0 R, M. q2 I2 v. c#include <sys/select.h>. x9 u5 @+ t7 u7 w0 R/ }
#include <sys/syscall.h>
0 ?! h! F! w5 z8 ?1 p. @- y2 z% `#include <sys/stat.h>9 o+ b8 o4 z6 o6 _6 Y4 o
#include <sys/mman.h>
8 J( O3 J# O; F/ d# t9 J#define msleep(x) usleep(1000*x)+ L6 I' _# |2 t& Q8 b* q5 K
: {( q& y' S1 c1 T! kint main(): _( s) m2 Q( z" c
{ , `* E. ?, j* @
//MCBSP,ARM与AMBE2000交互设备+ e$ n9 {6 S* G% B) V
int fd;
4 p/ y6 i! T) r unsigned short data_write = 0x5555;5 F6 Q# O; v8 h1 Y. e
unsigned short data_read = 0x00;
9 D, S" r/ W1 ^6 l/ {# d fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ g" E% P& @6 C @6 ?
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 d6 {# b3 @" |! N' ~
1 I& K6 d' P5 S) d; X% m& }
if(fd < 0)
( J7 n& |. @/ H: ]; ~ {
6 { m( p+ c$ q; A6 z w perror("open failed\n");
/ Q; E' b# i3 M/ c return -1;
' h, f. M$ s: B }
8 K6 j0 E/ `. k$ }1 a# s# M8 m 5 L# P) O' g' \7 |3 i. L* U6 a
while(1)/ v8 u* J5 c' n# I4 v
{& m; o/ S4 q3 ^0 {! d) J" a
, p' k& k* P# B0 w
//AMBE2000每次读写是24个字为一帧! M4 u, i) D) v- K2 Z: t& A8 e9 j
//写数据时将数据在底层存储起来,等到中断的时候再发送7 r! e; ~# M+ w
//AMBE2000输入数据是以0x13EC开头的" F! c5 {" _/ Q- D
write(fd,&data_write,sizeof(unsigned short));! H$ O/ N' Y3 W2 A6 v
) U- j7 [4 K) p3 p- N
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 / n0 N& j# e; M. i# ?! q: U" n
read(fd,&data_read,sizeof(unsigned short));8 P1 e4 [& G0 [8 S6 c% v7 W- m& `
6 D6 F1 y) r3 V& l! S
if(data_read == 0x13Ec)
/ z, O( {5 X( G { B$ A$ T. F# Y8 N$ E) ?
! T( F$ ]& j9 l+ F: y( g- n$ y. k
printf("data_read = %x\n",data_read);- S. U* J e9 G+ B6 N- X
}
, }0 ?9 J; \5 _5 M9 i5 L/ T2 z4 j - O/ {/ Y' V+ x4 x$ D
msleep(10);% q- ?) n& L& e! z+ Y/ M: q
# }5 T8 ^2 \, X: X$ Q
/*
8 e8 p, t. x, \6 f$ F6 J ioctl(fd,1);
* G, m1 m/ v" l. n7 c9 N; T sleep(1);
+ {% b# X$ b- k; G6 m ioctl(fd,0);
; N. ]5 J/ W# O4 }. ^$ @. Z( L# k sleep(1);/ D$ a' P; t5 h% B4 Y c9 Q+ H0 i
*/ $ U* A6 e3 j( i) n3 i
} # Q3 B, K* t$ c
return 0;6 m$ M/ O2 f5 ^" N! F
1 f; j9 j, B) Q) m) D$ s}
q- [. I3 [& V0 c& F2 I, j) ?# L
- ]5 f+ a' T$ I8 f! U多谢各位指教,谢谢! 急
% G% o7 V) p4 `5 _& N& L( B7 x9 H9 [2 \1 k/ B# I
; O+ P1 L- }; ?7 ^. m( D. v+ v* g% N* s' p: h& K% o
3 s/ A6 c' q+ _) p5 K
* C& J) @" R" y, B7 H7 ~. i2 q |
|