|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : y& E/ Q# F3 ^1 j
/*& R' C" U5 B- V. u# d" u
* Copyright (C) 2009 Texas Instruments Inc
e2 R) P5 B5 I *7 a: Z% F4 w% }; u' [6 `
* This program is free software; you can redistribute it and/or modify, b" t( v% C" m
* it under the terms of the GNU General Public License as published by& ?0 [5 u$ f4 a
* the Free Software Foundation; either version 2 of the License, or
- A2 `+ m1 s/ u- Y1 W, _ * (at your option)any later version.! U* o( a! G: w9 \+ s* \+ T4 j6 I
*! r; L9 F i ~ U% w
* This program is distributed in the hope that it will be useful,3 O2 x6 G7 e$ F! F9 z
* but WITHOUT ANY WARRANTY; without even the implied warranty of! l8 ~) O. n* J5 f
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 F: \& V0 I9 u* g) Q/ B1 N
* GNU General Public License for more details./ N6 f0 N$ \3 o7 k4 O) u6 z* j2 X
*1 v8 y! c3 V' {
* You should have received a copy of the GNU General Public License: r" [3 N9 G% h6 e
* along with this program; if not, write to the Free Software6 T0 T9 U+ O9 q; s4 t# M1 ^7 X3 x: K( ]
* Foundati
& Q' Y) W0 ]- f6 w/ {1 j*/% A+ y1 R2 S- }$ R3 b1 [
#include <linux/module.h>5 @) R% z) @- F. |7 Q2 d
#include <linux/init.h>) D- b9 S3 r* i$ x: F+ E0 w7 E2 t% y
#include <linux/errno.h>5 ?6 m2 A1 k% ]5 W( j& M
#include <linux/types.h>
S8 v4 Y8 F( s0 F# q& x* T& d/ ]#include <linux/interrupt.h>! A& A, i. U9 D1 g- A2 S
#include <linux/io.h>
6 |. D2 e6 B% ^) O, T" P#include <linux/sysctl.h>" v. F4 k+ b- }( D. g* \+ F* p
#include <linux/mm.h>
% u% H; c5 O& |/ e#include <linux/delay.h>! M+ e+ u) p. n; V2 b* M
#include<linux/kernel.h>
. ~$ Z# M3 O7 ?$ Z5 h/ J% ]4 i#include<linux/fs.h>
: a( p/ b* j$ A+ C#include<linux/ioctl.h>/ X2 u5 Z9 g; c$ c) z7 R, M
#include<linux/cdev.h>
4 {6 a5 {& \; `3 T1 j+ U#include<linux/kdev_t.h>) O5 F. z0 ?* g) X- D
#include<linux/gpio.h>* s, D& y; g d: }" `! x, Z/ L
#include <mach/hardware.h>4 |$ u' C# W/ s1 l/ D) C6 D( k6 I U
#include <mach/irqs.h>
" x/ z" d9 `: u7 d4 ]$ l
* @& Z7 |/ j3 s9 D# a#include <asm/mach-types.h>
* R r# S. |% D# t+ F#include <asm/mach/arch.h>
9 M: @: B- Q( F' K#include <mach/da8xx.h>3 S9 Q% n6 B. T; W2 b
#define SYSCFG_BASE 0x01c14000
1 R" q7 `; k) O" O. e# @' z#define PINMUX1_OFFSET 0x124 3 @* | @/ T$ f; x8 V+ H
#define PINMUX18_OFFSET 0x168
* B: I3 b. Q9 [2 X9 h, y#define PINMUX19_OFFSET 0x16c
+ M, b7 c5 m- f0 X2 a7 C7 P v" k#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
( w6 T1 i+ V% s+ w: X#define RCR_ADDR 0x01D1100C //MCBSP1_RCR6 X$ S3 E1 t, [ v# R3 X
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR* L& }: O- I- F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR- Q7 w: T% X, S k+ i0 F
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' E; ]; ? y' t0 }/ N5 f
, a' T6 |% J/ A+ O `, m
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& h- Y: s, [/ s#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
4 a+ y. s5 j* T' s/ L( y. H5 p//PSC8 S1 H2 [/ }5 K' j6 w" D3 P
#define PTCMD_ADDR 0x01E27120
9 O1 n6 H- }" ?4 ~; A2 |3 s% H#define MDCTL15_ADDR 0x01E27A3C
. _0 [4 C( u1 s. K8 |; Z. w( @#define PDCTL1_ADDR 0x01E27304
& o2 e/ B! D. o ^$ R//GPIO8 direction
4 P" F1 ]$ Q" J0 O#define GPIO8_DIRECT 0x01E260B0
: N& F, ~( y/ U. F' d% X2 V#define GPIO8_OUT 0x01E260B4. J( N. \9 \ P
#define GPIO8_IN 0x01E260C02 j0 H) i3 x, [( p# R
- v4 ^9 K: g+ u; l. Y% e//#define MCBSP1_RINT 99 2 y! W. _1 h, ^4 y/ f2 q
//#define MCBSP1_XINT 100
_ y* S' @* O6 b) p! Rstatic int MCBSP_MAJOR=239;. P% m7 |9 H2 J
static int MCBSP_MINOR=0;
; V/ T* h, N R. n& w" g( pstatic int count =1;5 S6 _" h1 k2 o
0 H3 x. _6 K! ?$ H5 O# s" G* J6 @! P
#define MCBSP_NAME "MCBSP-device"
& ?. ` x- L5 A: s5 {/ M* @! ~: Z% R0 o% V' o
static struct cdev *mcbsp_cdev;5 L9 F8 z- }9 j8 c) @( C
static struct class *mcbsp_class;: r- w7 m0 F- X Z* g R) [- _
static dev_t mcbsp_dev;
4 \6 ^ M. j+ v, B/ \( x% \0 L5 Tunsigned int DRR_data;
. z" i* W3 E; T6 Kunsigned int DXR_data;) ?2 ~' w5 M" ?, Y& y: d* {
static int mcbsp_open(struct inode *inode,struct file *file)
/ y5 g `" U3 }6 m: {{
, }3 l; n) t1 c6 X$ l 9 y/ H+ I% g* A
//interrupt enable,initialized
4 }# f) L# [! r unsigned int temp;! [% r: R$ J, s
//SLEEP_EN(GPIO8[10])---05 y* P2 g4 E6 n7 t
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. S; M [! N: h0 D
temp=temp&(~0x00000400);
9 O( v6 ]6 L2 \4 u, R# ]1 p* C __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" s9 |: m* c# N. q) u- W% } //RESETn(GPIO8[8])----0----1
* h6 z; a6 H6 y3 g2 f% X ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 q4 E2 {- H5 J
temp=temp&(~0x00000100);' [0 T+ j! a) B- D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ @5 X' {" | V* S6 h
udelay(100);
: c2 }1 ~; i6 r0 {4 L) M0 ` temp=temp| 0x00000100;* l) r3 m- I( `% `" y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 u& [5 O! e0 \2 `* F) C" v
udelay(100);4 Y% Y, l' C' q2 }0 K
printk("open success!\n");
: s* f8 W) u# s v5 \8 e return 0;
7 m5 c7 w" {* m8 P}
& F+ R* E# K5 o; L3 g" }# P; I, F0 Z# Z; l- F5 E
static int mcbsp_release(struct inode *inode,struct file *file)
9 h7 |8 Q: D) O \{; M4 i$ S# R# ?! q; l) t" u* ?! z
printk("release success!\n");
" {8 ?% N7 m3 n* u% X: F return 0;
2 o1 u4 y/ v* x1 h5 r& v}" P u4 K# p W- j+ N; f$ ~
; f6 |+ x, k$ f% t' B i5 i( Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; r* X, M/ l4 T$ r{
+ Z$ ~6 I- o4 |5 Y4 ?# k. b copy_from_user(&DXR_data,buf,len);# U+ P) R/ S8 {1 A$ A
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 0 c9 l8 _. G4 ~6 s* A0 y5 s
return 0;
& o/ t5 k$ C7 H! J3 z : e( R O; Q- [, w3 b( k
}
/ t; N, O. T$ ` c3 W j2 [# V9 _% V
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ ^, \3 p+ w$ J% ^; r
{
1 P8 Z; ^- {; L ?' ~ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
8 c9 c* H! Q+ t; B8 e) o$ t copy_to_user(buf,&DRR_data,len); . [ B l2 |1 X- c
return 0;, F+ Q! w/ P4 e0 Z2 \4 n3 W
}
, o' _. ~$ I2 s% z5 K( c" l0 w; F* b$ w) R a Q
* z: w( l1 s% T# R; rstatic struct file_operations mcbsp_fops=
+ b. R1 |# k8 d3 S0 ?{
7 Z% v( c) T, T3 n .owner=THIS_MODULE,
* x0 p. ~7 r& m, t2 C p9 P .open=mcbsp_open,
' Y% @) T) X% ~. q .release=mcbsp_release,$ F Z# C8 J; H8 M0 `6 |* V t
.write=mcbsp_write,+ k5 K2 |7 Y+ D4 g! U) }+ ]
.read=mcbsp_read,
: ~3 O# ^. d7 J! M( Z};1 y: O4 y1 o" g2 B( {& w5 I* u
static int __init MCBSP_init(void)' c& K& C6 z8 M! E9 w6 ~8 m
{
9 z' C+ R. \% x+ Y9 O int ret;8 q' M) A0 U5 k4 r& @, _7 E
unsigned int PINMUX1_REG_old;7 J; O, y2 i5 E; ]7 @: M
unsigned int PINMUX18_REG_old;
* p& k) L7 r) F! A$ d7 F1 |* Q unsigned int PINMUX19_REG_old; P7 o6 J" j& i
unsigned int temp;
* e' x; w' l, ^5 y! M7 x* y Z if(MCBSP_MAJOR)
3 K) ~% F y! f3 r9 M7 e. m% c3 G {
( J% {$ \! `! b& Y0 \/ z* j mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 {0 x- [" M9 C2 f9 a7 g7 N" @ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
, Z4 ?6 n/ i* K- o9 Y# ]' N }
* q7 D b$ ]6 C3 H* v9 S( u else. m3 K& a$ m! J
{/ U4 Q% ~' N3 Q, G% D5 r7 H* K
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& e6 v V0 {, H MCBSP_MAJOR=MAJOR(mcbsp_dev);
! v, K- x) h9 q# N. I1 ] }0 Q1 m. x- S4 ^0 g
* ^9 d+ A4 b2 C# T, w* D" i
if(ret<0)
6 n6 q# z" a+ k$ o/ D {' A- y/ `' ]+ q2 w, I
printk(KERN_ERR "register chrdev fail!");5 k( @' c0 t9 Z: O
return -1;' c# p; @/ R) H4 D; c% J
}
; Q' O3 N2 I! q* k2 G
; |4 _: \# Q% S& x7 J4 C mcbsp_cdev=cdev_alloc();. l8 _4 w$ a; `* I9 V) m
1 {5 H: w& {& c( _* u4 o1 r% W" [ if(mcbsp_cdev!=NULL)" y9 o3 I% ~$ v# t, h
{
% q! L2 O# E6 H' n cdev_init(mcbsp_cdev,&mcbsp_fops);
: w$ W3 P( t7 ~7 s- {' ] mcbsp_cdev->ops=&mcbsp_fops;
# p2 [' G2 @/ \% w/ R' v mcbsp_cdev->owner=THIS_MODULE;
) Y' s7 r" t( y% ]8 f+ `/ L ! L% G. ~4 G0 o( K( P, s# M
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ x; m3 P0 ^3 Y- A3 m* R) ^
printk(KERN_ERR "register cdev fail!");& G( A# Q4 d* \, L! t
else0 \5 H) }& Z7 ^" ]# e
printk(KERN_ERR "register success!\n");1 x' ]' g. P* H; ~8 h2 P" s
}
2 y/ L7 z4 P" u4 O, g- p* q else T! |) \( M- U4 r* ]6 y0 n
{
1 R% B& K+ D0 i) d r8 T printk(KERN_ERR "register cdev err!");/ q, x0 s3 A% y2 O
return -1;
! s$ ^! C& R" g* e& y& V( X }
+ S- W; r( o# j' w+ l7 ]
* V6 B) O' o+ O# b' ` mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
j8 R4 H1 u+ ^# f' n' r0 }: P if(IS_ERR(mcbsp_class))
9 }; c2 t) W$ b7 U; Y v9 R9 S {
. M* A" f8 x: q$ M+ l* h4 q9 ] printk(KERN_ERR "register class err!");
* g2 ^. X+ A8 p/ k1 }% U return -1;
$ T% M* q& c# t( B# p3 P) } }: _& o. e+ H! J! p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 Z- A( D' o$ o# K% i+ P
9 b# b( t' a6 ~ //PSC
& W9 d+ i3 l3 [6 } //add Enable MCBSP
$ Q# h& m2 z3 Q \8 k9 |" X. D //test# ]4 I8 C: n' B G' \
temp = 0x80000003;
$ s! P! L% ^+ U$ J* g writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 L' o7 A- c0 K8 K temp = 0x00000003;
( h$ E+ t- F* \/ M writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 [% I j* ]- o/ p! m, t2 A
; F+ D7 V5 A8 k" Q( _ temp = 0x001FF201;( y$ g! p, Q' M) w9 f
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 f0 L" L) h6 e+ F: P# _ 3 c" O* E9 l7 e' E: a& E5 ^" f
//PINMUX * |9 i8 o! b! j) r5 ~
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' u( e h; K( U$ j0 V, S; f PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( ?6 ^& _6 w. `/ b8 h! L! E8 o3 L0 ~8 Y PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
3 {$ |6 z4 k& L- b writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" I3 N) |' ?: h% C) {
6 D& r+ X# S+ ~& i" V2 o //SLEEP_EN,EPR,L138_SHK1,L138_RC& }9 e, J2 A: S2 L$ a) }
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; X* o6 z2 v/ X* l+ l1 ? PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% b7 K6 q/ J! b: M- w' O V writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" l/ X) X/ O2 e: r
6 k$ ~/ t: o. z, |# \* X& k* Q' E //RESETn,L138_SHK2
4 \4 Q7 H8 G9 G" F8 S2 G* g PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ x9 G% ~1 h( I8 h; Q- |1 w3 d2 @! D
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 i) s) [# X$ O" S5 @8 l* q2 X% ^ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( }% D; O# l% S
6 H) q' q8 D& l; S 7 I% e" ^" b3 R" ~
//SPCR Register
9 F) {0 Q- I0 `1 u# s! G8 q* f { //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 O' e7 D3 T% r1 H* ` temp = 0x03000000;//(DLB=0)
) l: Q* f3 c+ g6 a& [2 b" C // temp = 0x03008000;//(DLB=1)8 }% q; _5 e/ T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset8 y8 v; p% Q) }. L
temp = readl(IO_ADDRESS(SPCR_ADDR));
, M: h0 k N! @( l3 p printk("temp=%x\n",temp);, j3 w& n9 r- |% ~9 X3 ^$ z
V5 C5 Y* F: ] f //PCR Register
$ n6 N% [, V" a' F //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, I% u! y. L+ `, J. c$ K o- G5 k
// temp = 0x00000F0F;
3 J3 e" H2 d% x; I temp = 0x00000B0F;
4 w2 @& K& t. \ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized , @* X( S. `! x# s( N1 ~% o
temp = readl(IO_ADDRESS(PCR_ADDR));$ b, i& S3 t9 R: k' I# x" _* y
printk("temp=%x\n",temp); / C, T5 Z K6 h/ V
//SRGR Register
8 q% D) L, J6 {8 q0 ?; t. ? //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 y [% V2 r, a( m* K
//temp = 0x301F000B;
- z+ |2 k" `6 A" y, Y4 ?) k9 b writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized : i+ P# k1 }8 e* D) @: d
temp = readl(IO_ADDRESS(SRGR_ADDR));
- Q- ?, w# \, d printk("temp=%x\n",temp);
# f# e) @* d+ C& |/ @; O //RCR
9 ]1 E4 L/ j( M2 d" f //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* `. D- C$ z/ y* m* j4 y* O; J" C //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 C; Q; d! m: i* Z+ w: m" O8 s1 U
temp = 0x00440040;" c' P) e- S4 C) e* x( [
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized * Q! q' B# U* G
temp = readl(IO_ADDRESS(RCR_ADDR));
' F" [& S+ @: Q3 q, A printk("temp=%x\n",temp);
! {( u: Z$ C( A1 O2 v% ^7 ~& p //XCR
& y7 W8 N6 Z- a6 ] f0 ]" J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 P7 @" C0 d, }; |3 m- ?) h" i! i
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 Q8 ]/ w" D0 L8 z4 y temp = 0x00440040;
7 q- v& d* \/ t2 R4 k writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
8 d) S: a/ n1 Y temp = readl(IO_ADDRESS(XCR_ADDR));. l) \ S6 N8 \& U
printk("temp=%x\n",temp);7 Z4 H* P* Y5 Q
udelay(100);
( R8 p4 x# G9 e4 N! x. e) g* v //SPCR Register
5 R& R* {& u$ {: n //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 b, r6 T' N* l- I( R/ h
temp = 0x03C10001; //DLB = 0 VS DLB = 1% i; N% n1 U4 T$ G+ B* M: C: V+ D: m
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 v7 V; _+ W- R+ U) X9 j/ [( |
temp = readl(IO_ADDRESS(SPCR_ADDR));1 D* c' e6 C; h. y3 f- p* _
printk("temp=%x\n",temp);
: P4 X1 I2 E) a& t. e. h udelay(100);' j+ R5 U9 n* z G' R3 k) [
; Z( p0 w7 r9 e6 ]7 {! f' ~3 d
//set GPIO direction
2 V0 }: A+ v+ E* Y& m temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. T0 j( ^" J( H" p4 l
temp = temp | 0x00000100;//EPR----input
6 |8 O) Z. u' J1 O& G, m8 ` ] temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 {$ I. o: J! b
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 {/ S+ U2 n" y2 W * A8 F4 Y" O i" \6 f8 w
return 0;+ M; A. G0 w( z. w/ e% `
}/ k! D" C; t/ Q! I% u
static void __exit MCBSP_exit(void)
, @7 [" `1 I: g{
2 b z6 i8 B) a* F8 P8 D1 N H printk("mcbsp chrdev exit!\n");
4 h4 Y. r1 J) q! ~/ o0 @ cdev_del(mcbsp_cdev);
9 I& ?) X, P# U unregister_chrdev_region(mcbsp_dev,count);
: i' x, H! ?2 U/ i/ r: _0 k J device_destroy(mcbsp_class,mcbsp_dev);
' [ O2 g0 t9 z5 X+ |. B) r+ ^ class_destroy(mcbsp_class);
G% I }5 g% {( e}
6 [; D7 J+ v: H8 O+ p, \; emodule_init(MCBSP_init);1 O( L! Z" D# P4 w% W& c
module_exit(MCBSP_exit);6 f+ s$ J8 s* e
% R+ c" K& t! m) dMODULE_LICENSE("GPL");* j) ^; S' z3 S. { n
! E& b% ?- j4 y) l! \# }7 |/ k c
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 u) L- ~! L) V/ x2 J4 L' o0 a
我的应用层的测试程序如下/ Q' G* u1 A* E Q6 I7 r9 o9 n3 M
#include <stdio.h>- X% h& \1 l6 y A" T0 E
#include <string.h>
% N8 S8 e; ]0 i3 {, K8 p#include <fcntl.h>) b) ^- G6 X5 ?0 m
#include <unistd.h>
$ w# Z% k: k9 s9 ]#include <signal.h>
8 [; I4 A# J( n: T8 ?0 Q" ]( z# U#include <pthread.h> //线程& z7 i+ F ]) S+ M! C5 ]
#include <stdlib.h>& K" L4 h3 S/ v/ E9 }* t
#include <pcap.h> //捕获网口数据
( R2 u) n3 ?' P @#include <semaphore.h> //信号
+ B1 n$ j; S1 d#include <sys/types.h> //消息对列
8 A6 t1 F1 \0 X2 Y7 X. _#include <sys/ipc.h> //消息队列
, s4 r* J& q. k1 X ^+ s0 Z#include <sys/msg.h> //消息队列
) _5 b9 p0 B$ p( ^#include <sys/select.h>6 B6 M0 i6 {1 A9 t8 Q
#include <sys/syscall.h>
2 U8 U7 z( a/ k9 C3 E3 d% v#include <sys/stat.h>
6 l9 U8 _6 b E#include <sys/mman.h>
' f! ^6 l* F( l7 U% \* H#define msleep(x) usleep(1000*x)
% m, b: m2 Y) b1 G0 q5 ]$ T0 T. k9 y8 D
int main()5 ^& I! E* e* _& L
{ . `% v% r5 Y& ~' b h
//MCBSP,ARM与AMBE2000交互设备
9 a3 A) P1 i" h( P; V) T' o& j int fd;
% b3 h- @( i6 ~5 f I unsigned short data_write = 0x5555;
7 \ o+ F/ Y) p! u8 J0 D$ V1 N0 {, a; H unsigned short data_read = 0x00;8 L V1 E5 N& u# {
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( q7 a& w( z1 u6 D" Y/ r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# J* H+ X# h. ?) m; ~7 V/ T! c
+ b! H7 \; Z# q# }( K L( Q. m if(fd < 0)
" f" m k0 A7 @0 F {+ u: D8 }' |4 A* S) V
perror("open failed\n");2 j" H$ Q; M! M* Z1 L
return -1;
9 o3 R* g& m+ U$ a }# z$ A% W4 d* i5 d
: d* [" B" Y8 r while(1)0 ?7 ~5 N& D" l" q% w5 O* d0 K
{
9 x# u+ x; @, l0 y# m 4 K2 A$ A |1 Q* ~
//AMBE2000每次读写是24个字为一帧
( Z! Z" S' G8 \9 s" x //写数据时将数据在底层存储起来,等到中断的时候再发送6 ?8 G; C" |% a$ K2 H7 H+ \
//AMBE2000输入数据是以0x13EC开头的# f! A5 G2 v: ~; d
write(fd,&data_write,sizeof(unsigned short));% K3 u( W7 Q" n( M
" h, M" L$ h& O! j7 W6 o, K
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ( q# ?) g; k& \
read(fd,&data_read,sizeof(unsigned short));
% l3 n% a6 \/ b! h* w# d
. L1 \' q5 r1 h: D* w, N if(data_read == 0x13Ec)* |, Q- r' w; u: I8 E" j
{4 X2 h# B% @ t8 e" l. i+ \
$ b; ]8 k* v! d$ [ printf("data_read = %x\n",data_read);/ [# D, J$ }! H6 \) \3 Q! v. w7 |
}1 V7 }! F! g' i- _" E4 [( J
3 g' f5 {9 I) A( o" `
msleep(10);
: J U/ F( H9 Q' h7 f. b + I( W4 R$ D: D1 a
/*
5 r/ n2 s: {2 u2 _3 ^% r- M# X& k ioctl(fd,1);
3 k: y0 _. j* d: p* ^1 {$ ? sleep(1);
8 C- k1 h5 `/ g+ w ioctl(fd,0);
$ ^$ A" {6 O4 i& a sleep(1);: s- E* l% t9 G6 \2 T
*/ 1 K) o" y. s0 g& P/ Z
} & C* R0 f0 @! \" a* A1 l# P
return 0;2 U0 Z3 l$ S9 D$ T3 G/ J; Y# m
# }# j& \/ H" R
}
& i: r3 n' z5 {+ f u, a- j0 @
多谢各位指教,谢谢! 急
l- S$ `* n- s2 l0 D* r4 W' z6 s; f
8 e3 u, ?" w e: d. |* E& w! E
E, M2 M$ L# ]7 ^
8 N$ n& M4 i) W! W1 V4 A/ _! D; v, L- a5 t. D) w* @2 w3 l" B# Q, f
|
|