|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * p/ }. m/ P/ w! }4 i
/*
2 {) b- x; m% l+ O% m6 I * Copyright (C) 2009 Texas Instruments Inc# ]* k; ?; t8 ?# j: h! x. C
*
% W. ]. L; u4 N$ E# b# R* G * This program is free software; you can redistribute it and/or modify
( n2 T" g+ G! p * it under the terms of the GNU General Public License as published by% ]: \6 q Q N n3 |) k
* the Free Software Foundation; either version 2 of the License, or Q7 K8 O6 U, g& R
* (at your option)any later version.
5 ?; S# K/ P! \& i" b" N3 J *
0 _" g& Q' u$ B8 F3 y, E# @ * This program is distributed in the hope that it will be useful,
5 d" I* W ]4 Z- I5 C * but WITHOUT ANY WARRANTY; without even the implied warranty of
1 ^: T/ ]5 T: B4 N B- U * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 u) Q( w N }! N6 h/ _ * GNU General Public License for more details.
5 K8 }* x+ z+ k% W *% S# x7 q5 J/ _, @4 B
* You should have received a copy of the GNU General Public License
* y- k- ~* n6 } * along with this program; if not, write to the Free Software
7 K o$ P/ d: ^+ F0 h7 a * Foundati3 u& H6 U' ~0 I( ]' g
*/8 s- z3 i: b' N$ P9 K
#include <linux/module.h>$ n+ ]6 M, A2 W3 b$ A
#include <linux/init.h>4 n! z" m( X% ^/ ^
#include <linux/errno.h>6 R! h( f. W' @9 z7 ]) ~
#include <linux/types.h>% n6 {4 \( \, g6 O, j) `
#include <linux/interrupt.h>9 ]! x: } e7 ]% i$ \7 ~* h
#include <linux/io.h>/ ]* t9 N7 E! ^" j3 R
#include <linux/sysctl.h>: I' `' F9 s+ T) U
#include <linux/mm.h>/ {& ]7 g! D0 p9 U. I; I: a
#include <linux/delay.h>
2 K$ [7 C& N$ A8 ]8 x, B! [4 M8 B#include<linux/kernel.h>
/ L7 v. {% ]5 f' B#include<linux/fs.h>( i% p( C4 y" ^5 o& ]# _* R
#include<linux/ioctl.h>
0 u( V3 I, J0 l+ j# `6 }#include<linux/cdev.h>
]# ?/ t9 N* ?4 v+ { n' R- c! }#include<linux/kdev_t.h>
9 t' B+ ?3 ^! d( \+ [. S: [, [#include<linux/gpio.h>
, f) p& y5 h" N2 _#include <mach/hardware.h>
- O& R% t$ h$ T7 c#include <mach/irqs.h>
/ w: c+ Y- k5 I0 c# c, X6 X5 F+ V4 ?" h+ v
#include <asm/mach-types.h>
2 X. [. z0 I) {0 ?#include <asm/mach/arch.h>
/ |) u; b! E3 z' a3 P' o) b6 o#include <mach/da8xx.h>
* V7 B1 w9 @- w" U, Y3 K) r#define SYSCFG_BASE 0x01c14000
o; T! d6 \9 M) b#define PINMUX1_OFFSET 0x124
; m& K/ ~ G& D# ?8 l#define PINMUX18_OFFSET 0x168
, d/ C5 {- ?' X' P#define PINMUX19_OFFSET 0x16c( R6 t' |3 s. d) L* _. M, m6 A
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) r" t$ D% S) y1 I1 b; n1 w#define RCR_ADDR 0x01D1100C //MCBSP1_RCR8 C, E5 W5 }4 a6 G0 E! F$ L& z2 w
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
3 ?5 c- o) e( _7 ?. B/ D! {#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR0 j5 ^6 _' U' Q1 l
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR7 E/ [( e# b- u) G+ f: x) ?
: F' v5 Q6 z6 {9 g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
0 F$ Y3 o2 K4 s. Q2 I8 f#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 ^3 D( e' `" U
//PSC
# \3 A5 M* U1 q' @. z" o#define PTCMD_ADDR 0x01E27120 & f7 S1 K! k2 M. p, R& `; e5 U
#define MDCTL15_ADDR 0x01E27A3C5 }; y( a! b- z6 b6 u
#define PDCTL1_ADDR 0x01E27304
& o1 E8 g9 z1 [" e3 w2 `6 r//GPIO8 direction( _1 X ?* r6 t) Q! y% m. P7 }
#define GPIO8_DIRECT 0x01E260B0) ]& V2 h, w3 @ [7 _/ a
#define GPIO8_OUT 0x01E260B4- a) S9 N$ N5 b [6 }' ] ]/ X" v
#define GPIO8_IN 0x01E260C0% V0 E D! ?! u1 B
7 H+ }3 n0 P! p//#define MCBSP1_RINT 99
* y1 r! k6 @1 d6 T# c9 o" i' Q$ \//#define MCBSP1_XINT 100 ( |" a* F; p2 k7 C- d9 c
static int MCBSP_MAJOR=239;& a8 h$ E6 V6 r5 b
static int MCBSP_MINOR=0;% M, j0 S9 R, p' a5 y
static int count =1;# i, s+ o! f! H' \ }3 a
( [% v% l) _/ j8 h
#define MCBSP_NAME "MCBSP-device"0 W, W% {( i( s1 c0 G
% y' n- }9 t6 G3 t# g2 Y3 q
static struct cdev *mcbsp_cdev;+ Q: u& }# n6 m, C J
static struct class *mcbsp_class;# p! h. a* {1 l, M& C B
static dev_t mcbsp_dev;
( b& [' F. ]9 W+ M: qunsigned int DRR_data;4 w+ n# J, E: q$ S8 u" `+ H, s
unsigned int DXR_data;
1 [# E" q+ ~. m" ~% Fstatic int mcbsp_open(struct inode *inode,struct file *file)* f0 q8 R+ L2 R; f7 P" k2 |
{! D" y) O& k5 l f# f2 A! V
" Y3 \) g$ k* r$ U( S0 a* _4 v
//interrupt enable,initialized# E1 ~: r0 M% v/ |+ x
unsigned int temp;
5 g) t, O! o i0 @& Z //SLEEP_EN(GPIO8[10])---0! Z9 a* D" O0 u/ q7 J) z3 F; H
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" a4 B, w2 \( G3 x
temp=temp&(~0x00000400);) h- \- L5 M {' d! U5 A5 ^
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& n$ `) l/ |3 S) \. G$ Y2 W
//RESETn(GPIO8[8])----0----1
( o: n9 E0 o* D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, o$ E4 ?7 ?0 B! S G
temp=temp&(~0x00000100);% c( D' ]6 j) b$ v, m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- Q( f) ^4 B% E udelay(100);
; X1 X' B( ~! Z/ f i u7 m& j temp=temp| 0x00000100;
- i0 c) f' U8 U$ c& z- u; m) V. z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ H! {( K2 |% w' |+ l udelay(100);
: a: G* b% W. @7 C: W& ] printk("open success!\n");6 O* l( Q- h" A1 [) ~) g
return 0;
1 P! g/ \; q# i6 F/ q; E M" J& y! i}/ r) n2 X9 M% H! A9 P
: j! ?1 H. M( W/ o6 s/ h( K
static int mcbsp_release(struct inode *inode,struct file *file). B7 i" T( x2 A0 t
{
6 w# _ n9 e9 }/ m printk("release success!\n");
" C" z. n$ o1 p6 H9 u/ w3 `. R4 @7 u; a return 0;% z1 p/ @5 S/ I2 @4 ]8 E
}
) a! ~9 g% c4 g4 Q$ ?
( r8 m5 G% @; |) C3 u5 t( `8 Zstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
6 B) \! V$ _% B) f8 g4 z& k* \{
/ `6 `3 s- A0 f copy_from_user(&DXR_data,buf,len);
: d' }) y; U( _3 W- k1 `& `$ s7 I2 ? iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
; [8 l' j/ J% U; r; p. Y( j9 A return 0;
% B: ?" R$ b3 j& M/ y! L
: x# y) R" z$ w5 i9 a* @0 \, R}% x7 Y/ j: `4 g5 o W
3 ^& K: Y' R8 ^5 Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 Z9 E: c- A# M{ - D+ g7 H# k7 y4 b: g* C% e, J5 O
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));. @2 c% I9 P/ u! ?
copy_to_user(buf,&DRR_data,len);
* L( S5 ~' E# {9 q return 0;3 K$ x; M7 M, D* Q' c6 K
}
8 C1 q. w: T" d, K: ?$ ], E- W4 L# m* |
; M, y! P2 \4 w4 X( Hstatic struct file_operations mcbsp_fops= ]- v. f7 G( A. y+ z% |: o
{
3 e' E& B F2 V5 \1 M7 H) R .owner=THIS_MODULE," B2 N9 y) b1 ?! [8 Y5 P+ r
.open=mcbsp_open, N5 N1 V( k4 i r, V/ c, _6 J1 V; n
.release=mcbsp_release,
' q! w, A# a9 a) T" G# \1 Z2 a .write=mcbsp_write,4 ]2 I9 G! s; b. |5 g
.read=mcbsp_read,
7 \/ W/ \: ^0 }, f7 R};1 X, R. V0 Z" x: m# ~
static int __init MCBSP_init(void)! Q5 i$ @3 ~1 W0 \
{0 f& w4 t9 E6 A2 |
int ret;& M6 O) p: s# }' N7 R2 f
unsigned int PINMUX1_REG_old;
4 o9 L/ L1 H( \& R# r unsigned int PINMUX18_REG_old;
$ s; ]6 v7 N3 ]2 b* _ unsigned int PINMUX19_REG_old;
, S% {+ }- M3 \1 Z$ t( c" d6 w unsigned int temp;
0 O n9 U! ^: J- v if(MCBSP_MAJOR)
1 G# r! M; m& K7 l m! k {
& P- |' w9 h% S! f( o# T7 y mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR); O" ^" b8 G6 f8 V, `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);0 z3 `" N0 A; p8 l- o6 M
}2 I3 z$ b3 P. {& P
else7 K' B1 ~- _0 h5 g
{
4 e5 g$ d) F, ` ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; a& r$ o7 C5 }) o$ r( R
MCBSP_MAJOR=MAJOR(mcbsp_dev);) `, ]+ \& M: F+ q- |
}
- G. t9 s+ k5 I4 G3 P G- W+ L3 p " l' w. r' Q8 E5 H6 l+ N9 D. A
if(ret<0)
8 R& f2 q; M! H* v" q+ X. [3 [ {! S# w: p& _$ o7 k7 {. W
printk(KERN_ERR "register chrdev fail!");
$ d% z, E+ ^+ `( q" I return -1;* v3 \( x1 w% v1 l i7 }
}
( k$ S* `, c% A
V$ v. o; ~$ D2 [, s7 F" y7 A+ m mcbsp_cdev=cdev_alloc();
) {1 {+ h% O7 y$ }
: q' S& F# r) p! H" v if(mcbsp_cdev!=NULL)
8 o* X3 D) ^9 d7 k5 m& @! d4 C {+ ~7 _2 O# \* x9 y$ U3 q1 _
cdev_init(mcbsp_cdev,&mcbsp_fops);9 x5 w% G+ s, G5 S9 q! [
mcbsp_cdev->ops=&mcbsp_fops; D+ p$ A [& i, a8 ^5 ^3 A) v) R
mcbsp_cdev->owner=THIS_MODULE;7 ~; Z% ^2 T3 u4 w
$ J, v e+ w3 b
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): ^3 @) c; @8 L8 B C
printk(KERN_ERR "register cdev fail!");+ y7 b# |* X% |4 Y$ b% q( {0 ?3 L
else
3 r" a$ n# t5 a0 h0 Z printk(KERN_ERR "register success!\n");% G* g# u8 T( M& F7 S7 j
}) f& j3 c! Y' e+ K. f
else; I4 h I4 e; f. Z# _
{
6 i1 L3 d2 r# O' b$ r4 ` printk(KERN_ERR "register cdev err!");
, O0 C/ B8 m- A$ C$ X. \ return -1;, Z0 i# _/ o, H+ O
}4 b7 x/ u3 m( K6 q. k
' k+ ^5 J0 b5 n* ^6 U* r9 s# A mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ F. p2 \" @0 k! k
if(IS_ERR(mcbsp_class))9 E0 R9 K# A; p1 {
{
+ v8 j# {+ O& B+ n printk(KERN_ERR "register class err!");
1 |/ j; m- j/ f1 L return -1;
# t/ R0 E8 r1 T; D) [ }
4 h7 |) O) T0 b' w, ], K+ O device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, G) e+ I# D" _) t
. i2 v7 C3 w9 t& ^& c //PSC6 E' N$ I2 x0 g3 x: p) F7 D
//add Enable MCBSP
9 R+ X# a8 v5 v; d* y //test
/ \5 ^+ m) q; t1 T$ M temp = 0x80000003;7 X5 M' z4 G1 [$ V# y1 M) u
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& R' H+ e1 q/ r temp = 0x00000003;
" {( E `; b h; u3 \, `9 E writel(temp, IO_ADDRESS(PTCMD_ADDR));( c; F. [# {: w+ V; g
, {( [- @& m8 Y5 z$ D6 W# a
temp = 0x001FF201;
2 x. c7 A7 N! ~% j* E1 u$ [3 C' o! V writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 }- f- f& Y" _6 f. `$ Q
' ~# y- }1 o7 b& D; ^7 O7 e2 b //PINMUX
) \* o6 C7 ~% A! J$ E5 z //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( p% r8 q3 f# {, G! E
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 ]0 h/ w" N' r* S/ ]% x) V9 _. H PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, M# P& O% o2 u6 f! X( q. k' I writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. W' S- B0 m4 ^: w
$ J" _5 k& N j3 \5 H
//SLEEP_EN,EPR,L138_SHK1,L138_RC
* N$ P7 c3 U6 y! M' M* X PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( ~0 P( i" D' ^7 ^ n PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
" c$ N' `/ o' @0 X& m( r+ y$ X0 b7 R writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; i2 N5 w5 `' c , R; g9 G" t g0 V
//RESETn,L138_SHK25 _3 q: |- Z3 A
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 6 b" y( i( p% q& ~9 ]
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- C( J8 R6 e4 @2 l writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# Q1 R( `6 ]# E6 I" E
( `& K" g, M" X. r' a$ Q2 Z9 s6 }
4 F* c0 j8 Q2 n4 d U- {6 Q //SPCR Register
7 Q. f; d) x; X; M1 d7 x9 {$ p //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( S2 }3 x1 N$ y1 q( ]% K9 n temp = 0x03000000;//(DLB=0)
* x0 d# t2 ?9 G) a // temp = 0x03008000;//(DLB=1)
; [! m0 X) K: V: [2 s. X6 D writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* {: Z5 Q: ~2 I. y temp = readl(IO_ADDRESS(SPCR_ADDR));8 K* `3 W/ J3 N% |' J: @
printk("temp=%x\n",temp);# S) O B/ _2 e. S) E
+ W1 l- \" r- i7 b. L- u
//PCR Register5 [7 E/ G0 n! u! W
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 U( ^5 H/ E+ e! G
// temp = 0x00000F0F;+ D1 }9 L5 T* Y* M& _
temp = 0x00000B0F;
6 v# C9 w1 b8 o8 Q+ R- { writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 0 G7 J8 a2 o& g0 w8 V
temp = readl(IO_ADDRESS(PCR_ADDR));
$ W# L/ K% c6 v printk("temp=%x\n",temp);
) u* G* l# a; N% `; _2 V //SRGR Register
) Q& `( h- P6 k3 E //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 o/ s. v4 M* g
//temp = 0x301F000B;
; y( P! Q4 p! z# {- T writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
. s! a y6 `- R9 l* \ temp = readl(IO_ADDRESS(SRGR_ADDR));* z3 p! |5 G1 \$ m/ H
printk("temp=%x\n",temp);
6 L- M" W$ \6 k5 }$ z* | //RCR
, Y8 l: l+ G3 F; B9 M" s //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, h0 E: M$ G$ y5 p7 O4 N2 y //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, I# ^; Q. x+ D/ O temp = 0x00440040;
, c* c1 M/ ^$ r1 s8 V* v' k writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
- p& n! u* w9 ]4 ~3 Z9 B temp = readl(IO_ADDRESS(RCR_ADDR));' S3 Y$ g g) ]2 M1 H. V
printk("temp=%x\n",temp);
J+ b% h# k- [9 ?& ~; k ? //XCR
) g3 E% A1 n' N+ z2 s7 B8 w5 { //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% }6 R; W: W$ C1 K* R; Y P
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" M; b$ \. |8 I: m1 a! u) X, Q( r+ G, w
temp = 0x00440040;& f4 I* o5 o# x$ O
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 F0 T g {1 ~+ z4 y+ m
temp = readl(IO_ADDRESS(XCR_ADDR));
/ w) m9 y6 n7 m3 d. ?. R$ g printk("temp=%x\n",temp);2 u# J" D* }7 [1 ~) s/ p
udelay(100);: q" V% V/ v" @* z
//SPCR Register0 A+ q' w; Y1 X/ h) \1 K
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 i& T7 l0 ]) p( B3 O: @
temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 C2 m0 {) m! ]8 y# O% C* k0 ~ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 D; d0 G8 Q3 O( C1 z temp = readl(IO_ADDRESS(SPCR_ADDR));
3 C6 m8 R$ L8 w" H5 k4 z, M6 J printk("temp=%x\n",temp);; d% {" g3 \ l2 \# J3 F- G
udelay(100);
* [* U, ?( v" i2 }
, f; K" I) B# @ //set GPIO direction
* d& C8 X' O$ f7 j* |0 h+ {1 S temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% F @, j( h3 n4 t4 b8 I temp = temp | 0x00000100;//EPR----input
# e4 ?. k( U& p: X! Z* W( } temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 Y! S1 O& j+ b* g( x7 ]- d, \) N __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # v& @$ ]. {+ R0 ?' z( k' Z3 r
4 Q: Y/ i0 ?+ z" z u! V* d
return 0;
. O6 L% O' n# q" A}; M7 S, ~1 \8 b4 G$ l4 L) L5 `
static void __exit MCBSP_exit(void)* N- k: I$ a# ?! Z" U
{; F, `* B% q1 X' b y- s: _
printk("mcbsp chrdev exit!\n");/ Z& y$ _2 g# v% [9 R9 n5 X2 ?
cdev_del(mcbsp_cdev);6 H5 V" r. N6 X: K" N0 y
unregister_chrdev_region(mcbsp_dev,count);
+ h9 J; A& |, w5 t# G" I$ Q; I device_destroy(mcbsp_class,mcbsp_dev);
% ^4 \- Y& [: D: y; _4 d8 H+ }& H class_destroy(mcbsp_class);
& G/ D% S3 z$ a: w/ q}8 q% Y9 i3 D1 u0 r) M
module_init(MCBSP_init);1 h7 a' J. I8 J, o7 I
module_exit(MCBSP_exit);$ `5 l1 c! k- Y9 @3 r
$ w1 o' n8 a+ w& v5 |MODULE_LICENSE("GPL");
' q& d; r T) J+ x# Z- T" R4 Q9 V6 @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' Z2 g; o+ Y0 ?
我的应用层的测试程序如下
( [1 R. C- M/ N) k& t! p#include <stdio.h>
/ a& [, F/ @' d! ?1 c; K#include <string.h>% ~4 ?$ v u* A b* u
#include <fcntl.h>1 n6 q i! n4 s& k
#include <unistd.h>1 @) z) r, w6 \, r2 }4 w
#include <signal.h>
1 s! `$ k) ]3 i2 F6 I#include <pthread.h> //线程. ?! L% ^( q, S: Z
#include <stdlib.h>3 n8 u! Y/ u9 ?9 U; X
#include <pcap.h> //捕获网口数据: z1 b9 L5 I$ M
#include <semaphore.h> //信号% ?7 M3 {5 ^) t4 {9 T9 m) O, x1 d
#include <sys/types.h> //消息对列
) e4 d8 F) n S% [3 n" P- q2 K" \#include <sys/ipc.h> //消息队列
3 k, f. y# _8 d5 G0 w8 Z0 b: c#include <sys/msg.h> //消息队列
3 R! e. f- J' u) j5 i#include <sys/select.h>. ~# Y* W0 J) O
#include <sys/syscall.h> m) ]( N* z6 T- |. D% o- F- b
#include <sys/stat.h>
x: P/ d' X2 F# }% s4 z#include <sys/mman.h> {2 V7 G' K" ?
#define msleep(x) usleep(1000*x)" I0 ]9 j2 f% F& C) s3 U
. d# B% z6 _% r+ |8 xint main(); `, Q* z* Y2 e0 I& C' u+ V
{
* y$ m/ R" H6 D* x: H8 }. ]$ A //MCBSP,ARM与AMBE2000交互设备% J' j$ ~& s: ?2 A+ p! j
int fd;
0 `) h1 R0 d @. r unsigned short data_write = 0x5555;9 Y4 b0 R( D6 E
unsigned short data_read = 0x00;& z; X: l- C3 {; t: }" x- Z
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. o# ?3 |2 ~# i5 G+ j# B) c
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 W* |$ q& H. z/ l
9 v# n8 n0 ~5 x if(fd < 0)
- F# @ P! M5 P0 \" c! f {7 n6 u. H" ^7 q/ s# `0 R
perror("open failed\n");
- [9 i' T8 A7 P8 x8 V: ^7 H return -1;
$ D( z7 k' k q7 y) j }/ F- u) @7 b, B9 G0 Y$ k: k+ k
- t) |$ | V$ I- [ while(1)
, H8 C6 f1 p3 G% @) A, L0 v) a8 V" S {
* m5 X* v- _& |9 x) F : Z- }3 P1 V$ ?) }0 V3 R3 O( T
//AMBE2000每次读写是24个字为一帧
: a/ o4 g( O* B% v //写数据时将数据在底层存储起来,等到中断的时候再发送
& N1 w, h7 Q$ R6 M( | //AMBE2000输入数据是以0x13EC开头的) c; P9 V+ h1 B% n! f3 v
write(fd,&data_write,sizeof(unsigned short));8 X, n" \$ s- |& E+ A- I
' I' ]3 {0 v7 ?9 V) P: _ H2 Q$ i
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ) t- }7 q5 f4 u3 z
read(fd,&data_read,sizeof(unsigned short));
; o2 F& u6 Z W; l. K! A; T
# @( Y5 W' T5 g9 W! K; q" r if(data_read == 0x13Ec)6 G1 G, v$ d$ H% g4 a. U
{+ s0 ~( i0 Z1 U! Y) P: d
- Q* j% E, }1 {
printf("data_read = %x\n",data_read);- K& ?6 G2 b5 j9 Q& p( X( X8 ? _
}- P# u4 q& X3 a( _" ^# R8 _
# _- j( `6 d5 Q5 X
msleep(10);
1 a, L) C8 v2 N+ ^9 H! {/ c N! P
V' F7 A7 ~( M& B /*
8 {# w' C0 X& b6 _8 Y ioctl(fd,1); 1 l5 G) e' b# h! b9 J
sleep(1);
2 m) q5 d" C1 m0 m9 i& u ioctl(fd,0);% y' q# L6 _, |8 \% ^) `
sleep(1);* n# C; S3 L: Q4 d* h
*/
' z) |. M9 I9 W! L$ h& h6 z6 ~+ \ }
/ d) p2 Q" f, l9 u return 0;% ~( a# F! ~( z3 W8 I/ k- o3 w6 L
* O [# g2 z3 @ h
}
$ S+ N5 D9 I, j! [1 P- d0 n2 B& j$ N$ E" l
多谢各位指教,谢谢! 急
3 a e5 [9 r E, P7 l
' e# d' i! O ?! h. ^
6 ?) y, H5 |1 f1 d% p0 }1 L0 Q# N9 q, R2 j7 B
8 |; B5 ]- a9 T
* [+ C: S9 t2 Z
|
|