|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . o% L) I$ k+ K
/*- R+ }# f( W( h5 J u3 _ z5 f
* Copyright (C) 2009 Texas Instruments Inc
1 H+ ~$ N& d* p$ E *
' ~# R& S3 @3 q2 u* {; V$ w# ]4 O * This program is free software; you can redistribute it and/or modify+ k% a7 E- S+ {: e1 g; `3 y
* it under the terms of the GNU General Public License as published by' s8 C3 `2 K6 A: B3 ?
* the Free Software Foundation; either version 2 of the License, or" C( n: ]5 ]% H3 J" f* x
* (at your option)any later version.8 v9 n, i, M1 v/ I* P
*8 p% e! D) @6 x! M5 V* \; D8 H2 a
* This program is distributed in the hope that it will be useful,; C0 D) b! W! g) ~* d4 l% a! d
* but WITHOUT ANY WARRANTY; without even the implied warranty of" c7 w; J5 m5 K; f. ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: u8 N; J$ m3 m! _. z
* GNU General Public License for more details.
3 Z7 ]1 {+ J% w# r4 b7 g5 N *
, _8 g' R% A0 V. ~ z* n * You should have received a copy of the GNU General Public License
. @- E5 s$ E4 D! m * along with this program; if not, write to the Free Software
/ p- e) ^2 Z6 H8 x9 V4 i3 s * Foundati
3 q# [6 @& u" c% h8 b3 q*/
5 g+ @# j( w# C) O/ @) U H#include <linux/module.h>
- c2 b) ^$ |7 X: U& W: n# ^#include <linux/init.h>3 V" J) D. n/ B; s v, V7 a- o
#include <linux/errno.h>1 V6 c' h5 W, u7 Q+ j" z
#include <linux/types.h>
- I3 B5 S. U3 T% j7 r* b: t* L#include <linux/interrupt.h>
( j E' t T- k3 g#include <linux/io.h>6 l4 v& i, B6 K: @
#include <linux/sysctl.h>& B" T, o3 h+ E2 `" O
#include <linux/mm.h>
; v4 `' X. R: H7 ^: w$ D8 G#include <linux/delay.h>
! L$ c7 i( _& B# W6 i#include<linux/kernel.h>
2 {2 l2 I- K& c# d9 R#include<linux/fs.h>
( V7 V( L8 ]8 G: D U#include<linux/ioctl.h>+ R& O a, h* I6 `
#include<linux/cdev.h>
: r, y. b7 `8 Y3 y( D" c#include<linux/kdev_t.h>
2 o0 u1 d4 O2 u$ e; G6 \$ C#include<linux/gpio.h>! g* w6 K: X J6 H. x
#include <mach/hardware.h>
3 l) ^$ A$ r! [- p: r#include <mach/irqs.h>
( L( e/ L3 `) C% j4 W0 K$ F( ]6 O
#include <asm/mach-types.h>8 C: d& A- t @" `# v
#include <asm/mach/arch.h>) Z* W Q' b2 b! d, S/ z
#include <mach/da8xx.h>9 f2 F% b( _$ a; F! ?
#define SYSCFG_BASE 0x01c140002 H1 w0 _9 P( t& c( B; d
#define PINMUX1_OFFSET 0x124
, u3 p% P% ^! C( u- P* z# |#define PINMUX18_OFFSET 0x168 " I! p8 }& j c- h) M/ |, n& {
#define PINMUX19_OFFSET 0x16c
3 S& f6 U( H2 u6 o* y& U#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR6 z' ?( w6 e* }' W/ h
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
) ~5 G" x N$ f( Q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 p) v& l3 S: }
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR. k, _/ X' B- O, M7 k/ b% [
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
" s# N( V/ b& u9 u3 K8 c
0 L3 y. N6 b* S% t$ k#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
( N# x/ d: G9 U2 L7 s& K& \#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
1 f+ L0 A, O& D x9 ^//PSC
: O/ j) [" a2 u5 B5 }6 z. G8 o# g#define PTCMD_ADDR 0x01E27120
0 T! q, t7 g6 E" d2 x/ m& q$ J#define MDCTL15_ADDR 0x01E27A3C. B/ Y2 ~% L! Y, M
#define PDCTL1_ADDR 0x01E27304' y. ]4 h5 K6 ~+ x# {
//GPIO8 direction: J& ]$ i2 v0 B+ o4 [; k
#define GPIO8_DIRECT 0x01E260B0
/ l3 B$ T# ], u. ]1 X, m8 ~#define GPIO8_OUT 0x01E260B4
' A( P6 v ^) Y" M#define GPIO8_IN 0x01E260C03 T, G$ Q1 _- x( R$ y
1 s9 E2 o/ m! w1 C& d
//#define MCBSP1_RINT 99
7 i' e% s9 ]! g3 e//#define MCBSP1_XINT 100
1 w8 H9 i! \- w7 Mstatic int MCBSP_MAJOR=239;
6 U1 K$ ?( y6 O ?/ _% U g* g/ wstatic int MCBSP_MINOR=0;( k0 G8 r; g) t' }/ V' R1 H
static int count =1;
: Y9 B$ P& _9 N9 a) ?5 m# o9 V& O+ r: Y+ ?+ w3 @% e+ z+ d
#define MCBSP_NAME "MCBSP-device". Y: Z1 ^2 Y- C+ k
+ N9 O' C" k: n( Pstatic struct cdev *mcbsp_cdev;: ~# M$ n" {: H) O# {
static struct class *mcbsp_class;2 g; m& B: z2 C: E( a S
static dev_t mcbsp_dev;5 a+ }8 X. I/ C; }
unsigned int DRR_data;
$ o- U: v6 ~3 w$ v9 K( b- Z5 dunsigned int DXR_data;
6 j2 x& i4 a7 A& P5 O2 v) Wstatic int mcbsp_open(struct inode *inode,struct file *file)
1 j* s# P6 W. h: [ e2 `4 ^{
- P6 d# c2 \" T8 e1 w
/ ]7 p/ F2 z5 b6 \1 w- b# g- V //interrupt enable,initialized8 a) u7 k2 g/ v
unsigned int temp;& I _7 ]5 _* @. x' S! Y
//SLEEP_EN(GPIO8[10])---0
6 X2 k( Y; t4 K/ K temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* G$ t) ~" P4 N" C1 ]( ] temp=temp&(~0x00000400);
& x" U n V+ b8 M- |' X2 g& N __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 F8 D* p# o# ]% \6 [
//RESETn(GPIO8[8])----0----1
7 z) |4 M4 G" ^, k0 q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 T* X$ H# w+ N
temp=temp&(~0x00000100);
q, X$ `& Z, y$ J; A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
9 _3 j- y) O# |- L udelay(100);
7 ]+ j) o9 L4 R! a" d temp=temp| 0x00000100;7 `. L+ J: `( t. F a7 l+ I- C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
l2 L* p8 v2 Y0 m( k udelay(100);) l" x# m9 { D$ x; J& G, I* Q6 Z
printk("open success!\n");
- c [& U$ W$ a return 0;/ E0 L7 Q0 u+ c) c4 G9 D. |
}4 b5 h: Y( I, M3 x6 y
; x5 N( p0 `* y& z3 Vstatic int mcbsp_release(struct inode *inode,struct file *file)% z! l ` X" }; }) B+ o
{. ]9 C- Y; a# o; b0 z
printk("release success!\n");
; L; o2 M# z$ j. @+ w. C$ }6 s. ~ return 0;
# C6 A" M' |0 n# U}& `1 m u( N/ x" V) V; i
) v( C% o. X) i. }$ T/ D
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% ^$ B' W9 B+ a{% s8 ~( N, ]- @- \- P
copy_from_user(&DXR_data,buf,len);
2 C. T2 l# w6 d4 Z, J/ q) K iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 0 w V/ L$ x3 ~ I1 [
return 0;
/ v. ?5 N$ Q! Q( j1 q$ d ; S1 F7 [. ^/ L3 v8 g4 R
}
7 `7 N. |" b3 f- l4 u2 p
' y" x! D/ {6 y) I P0 M4 Qstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 ~1 H+ w- {! t) a/ W{ / k$ G7 a- I/ T- [ t! ]4 `
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- ^# f! J8 b3 \% K- o8 b
copy_to_user(buf,&DRR_data,len); 5 U: Z% I- m5 {) w
return 0;9 p' p' o0 L0 m, r3 {
}2 {& f% M4 O) G6 u; t
( @; ~$ B- a+ x9 Q: E- ^ l. i$ a* ?$ Y& q
static struct file_operations mcbsp_fops=1 U, a6 B/ Y; g6 ^3 t q6 r) n$ k
{
) x+ y* z( G1 z G& D7 W v, K1 S" c .owner=THIS_MODULE,
; A1 a+ p. P! q .open=mcbsp_open,
- t9 N @3 A' Q w& ~1 g! _% s .release=mcbsp_release,
. w& V3 r5 |$ c9 | .write=mcbsp_write,, B: l0 M9 t+ D6 x+ ~& I
.read=mcbsp_read,6 t, g1 r& ^) f# i+ S% P% ?
};. z8 u5 D, C2 `1 x' d' d! A5 y2 j
static int __init MCBSP_init(void)
, v% k' _+ ~$ @ c+ J6 _{
1 G; w3 H5 r5 l int ret;" @! Z1 [$ c" d; ~- Q; \6 b2 \
unsigned int PINMUX1_REG_old;0 [% K/ f) ?4 [% h& [
unsigned int PINMUX18_REG_old;" U ~ v4 O i$ F9 V7 c, s: o- h
unsigned int PINMUX19_REG_old;$ y6 T5 P5 K7 {
unsigned int temp;
, w! _5 ~# ?* l+ e& E if(MCBSP_MAJOR)7 \2 p, ]0 D+ \6 r x' i
{
8 s' R5 E2 o. B" ]' C; b. x mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
4 X) r$ B& \3 z- ` ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% g1 p/ P% c6 O" C
}
+ D# Y" @) H% Y+ X* o. r: U* S else/ x' g' |: W% T1 P" K) C' g* k
{+ d# @* |, |! n. L k9 \5 \4 |
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( ^, L& S: A; {) g) s3 r/ H MCBSP_MAJOR=MAJOR(mcbsp_dev);
* M: i" E/ x$ S5 d; ~ }
% o& c: ?, z3 C! ?* q& u6 j: D/ k
: ]- H* e$ H/ {4 y2 ? if(ret<0)
: L# l" m+ _; X8 V( j. d {; r8 V2 O- ]; U6 e. K
printk(KERN_ERR "register chrdev fail!");
" v. Y! p0 X' f: ]' N% `6 w O' g return -1;
+ w1 l. `' v+ ?8 H }* o$ @# I: Y; |- n( q9 p4 e( x
7 x4 M2 E! M% x; e2 U0 _9 U3 @: A: t mcbsp_cdev=cdev_alloc();! E+ O8 N- D7 W* U3 q0 q2 y! ]
/ t/ a# F. P- V" L5 V if(mcbsp_cdev!=NULL), d% ?+ p: S; C' u4 ^. I. I7 F
{
; N% q1 _3 J: u9 A! H cdev_init(mcbsp_cdev,&mcbsp_fops);+ Q: W# g, _% V2 I: y4 q0 B; Y
mcbsp_cdev->ops=&mcbsp_fops;
4 t' U1 g- o8 A mcbsp_cdev->owner=THIS_MODULE;
: ~3 R g6 D+ j# ]3 v" i U 4 s5 V$ O0 O( g8 f& O
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 |' P, h8 V4 Z+ b" Q8 i
printk(KERN_ERR "register cdev fail!");
8 d ~. m# O) J- R" | else
1 o( q& [! M3 B9 q/ o. y printk(KERN_ERR "register success!\n");
" _0 S) c; b5 ]2 I }+ w$ B/ I- Q5 T' K \
else9 r, S8 a9 O* q* B
{! I' p Y2 K5 S3 Q; {
printk(KERN_ERR "register cdev err!");* ]6 ~( \/ p5 E' ? X
return -1;
0 T/ M3 T& A8 L4 Q! i- J o2 q }9 u, M6 s2 B0 W& E, {$ t
9 _8 }3 Z1 N+ ~/ w; o6 C2 ^4 J mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ D7 F& E0 S& O/ o5 z- W7 c
if(IS_ERR(mcbsp_class)) k& z5 I, Q* O- w- O) L
{) \, A) {% \6 m" m
printk(KERN_ERR "register class err!");
7 p4 l; e! t ~3 L( P2 Q return -1;5 g2 y/ Y& j) i. O [
}! y" T4 c, B( v3 p! H
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ x1 ^4 Q8 b% l: p
3 |+ s) w. Z% M6 }; |5 M2 O //PSC7 w' T! j1 o5 L
//add Enable MCBSP
. E1 l, z" a9 s; R4 y: { //test6 k7 j& `! b3 K7 H/ S+ L
temp = 0x80000003;
- l; U ~ S" ?/ h7 o writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( P* n4 e4 y" d! H temp = 0x00000003;( p" ~* p2 W' k
writel(temp, IO_ADDRESS(PTCMD_ADDR));! W1 D- W/ e% Y8 p& Z
3 x9 F7 v1 w) n5 r; y6 f2 V
temp = 0x001FF201;0 W4 z1 [/ w9 b, Q, j
writel(temp, IO_ADDRESS(PDCTL1_ADDR));) P/ R* k3 c% S$ d: `, A: J
3 n* Z7 L& T1 `6 s* I3 B) T0 z, V //PINMUX
; }, [" O- i5 o( j: a //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
5 q, X( B: k# p# k- l$ t PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 D, m, }+ b5 j. d+ G. d6 g
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; & P! h% j" R- X5 J: L* _
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
^* }- t& F9 ^) n
" ]! ]& \" c8 N$ U7 P //SLEEP_EN,EPR,L138_SHK1,L138_RC# P5 R1 @2 F7 t$ d, c: M0 c
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ n" x! v% y3 r PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
4 H* R* r0 b" b* L writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 p9 G! M- L/ j# d+ d 8 u% \7 v& {5 w: m3 t+ v
//RESETn,L138_SHK26 I& h1 D- k! F
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 2 p2 K& T0 k- ~/ G" E
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
' S. \0 L- j Z& m6 \( Z" J writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' P+ u2 {) ]9 q5 W/ T
: S' h$ n6 Y* y) q
* |3 ]9 R6 I, [& n //SPCR Register
9 _, [, R% |/ j: h% H //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 E! D( I3 f2 e/ s
temp = 0x03000000;//(DLB=0) c4 @8 _$ `- |9 p' X
// temp = 0x03008000;//(DLB=1)/ z# ^6 D! P6 {6 Z; \
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ h1 ]! u" k; k/ y4 ^% U$ ] temp = readl(IO_ADDRESS(SPCR_ADDR));
& I+ C. K3 I) d- f* {, p" v5 \# b printk("temp=%x\n",temp);$ ^) C5 a( N( M/ |: N$ b
6 c4 R/ T0 u, K1 |) G1 h1 b7 N
//PCR Register
# |; c2 y8 A8 a1 F& @ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
U" e7 V1 S! \9 M! p3 D/ p4 ^7 s2 Z // temp = 0x00000F0F;
4 e, [& Z) x) c3 R; u1 ~) C temp = 0x00000B0F;
4 {6 ^* k$ @$ w- P& n: o. r writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 b, z! |+ t) A3 S temp = readl(IO_ADDRESS(PCR_ADDR));
# d2 j- `/ v3 f+ a; E0 M printk("temp=%x\n",temp); $ x6 c2 G0 F( b2 u. H3 T+ M) @
//SRGR Register
5 u; F2 A# W$ z4 U H //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
# S& f. `. s& q# V' ]6 B //temp = 0x301F000B;: j2 a' U5 b9 O: S5 ?0 X0 O
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
: H6 ~, w5 x) ?& m0 p temp = readl(IO_ADDRESS(SRGR_ADDR));) o3 O. Y1 v( i, E+ V
printk("temp=%x\n",temp);
5 A* J) B5 r# T( q( }9 _5 j- l //RCR
5 n- u5 {; c4 j* r9 p ~ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," [6 P7 L7 X. ?" N. l) u
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 n/ d0 [9 M" ~' }$ h% G& E0 U
temp = 0x00440040;) F8 A" y& e) ~9 D$ R- k4 |( D
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ! I1 H5 d" p4 H8 h9 Y4 ^
temp = readl(IO_ADDRESS(RCR_ADDR));
: M( d2 y5 _/ l8 ~9 \$ y. v% [ printk("temp=%x\n",temp);
! P" ?, A4 T8 Y5 w/ E* g //XCR
5 L8 d, s* z8 `4 w; y //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1& R- E* s W4 d& a( o$ ?
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% M0 m& E# M9 _2 ^/ i0 f! I
temp = 0x00440040;
0 X' U: o& a2 w" o writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : ~, a& n' G+ V, [' r+ }
temp = readl(IO_ADDRESS(XCR_ADDR));
: z3 j; V- Z: W+ ^$ q printk("temp=%x\n",temp);: b# `; n. N l3 ] S
udelay(100);' G1 N" J! i% a0 V' _
//SPCR Register
7 P: ?7 Q3 E# z6 K5 H' S //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- X2 h/ y0 s9 U D- u: c temp = 0x03C10001; //DLB = 0 VS DLB = 1
; s! O, p; \7 J2 q: X3 Q" ? writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled+ B7 B: D* n: {1 ?* @$ r- m; _
temp = readl(IO_ADDRESS(SPCR_ADDR));# V/ v! {. Y0 v5 w
printk("temp=%x\n",temp);
0 ]% J( X* o; H# Y9 n udelay(100);7 _7 ?$ O* ~( d7 n) _! y6 [
+ {9 z' O4 H$ H) A2 S5 _ //set GPIO direction
M v9 _$ U, P1 u" c0 ^ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- q" q6 N) K+ ~+ p0 e temp = temp | 0x00000100;//EPR----input: R7 r( t6 q5 m4 v8 s; N
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 b4 w5 M4 u/ Y- k7 b- h% a __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; ~6 V! g- U5 k
, k7 e# L' [% R. g2 Q @/ P return 0;
1 [; ^9 Z5 b7 l) J, ]}
* a1 ]: C" ~) A7 t6 zstatic void __exit MCBSP_exit(void)* ~& I1 J3 M, _# @* h' o$ U; E L2 g
{
0 o$ W3 L$ G) S' X8 p( u printk("mcbsp chrdev exit!\n");' ]2 J; m' G9 Q3 O: h, n. e
cdev_del(mcbsp_cdev);
5 x- @- f1 q+ x( T2 I% I unregister_chrdev_region(mcbsp_dev,count);
/ p2 f3 b" [4 ]7 K device_destroy(mcbsp_class,mcbsp_dev);
- B% F' S4 W% _7 n- q) T7 V class_destroy(mcbsp_class);9 K6 d4 P; p! Q- G! A7 A% R
}2 w/ l3 a/ j+ r- d8 _, v) j
module_init(MCBSP_init);
' y4 i3 k6 k& g: K3 m4 s) Z( |$ Lmodule_exit(MCBSP_exit);
/ d4 u3 T% s, n5 i$ _& ^& ^# [3 b( B8 J, K
MODULE_LICENSE("GPL");
$ @/ x6 q; \. a, d
, b+ K* v: L( V3 l/ q, |+ c4 O* P我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
3 S. d& q1 P7 o4 ^' @我的应用层的测试程序如下; c4 H. e" z. X# t, j4 C# F
#include <stdio.h>
8 F& A$ Y$ P# k# } Q+ x, m#include <string.h>
) q) d7 S2 o! B; o1 s# [#include <fcntl.h>. y! m5 ], a" r; a
#include <unistd.h>* N" Q* S5 \ N% r. X
#include <signal.h>
" G! [8 T; ?' u2 U+ \#include <pthread.h> //线程
7 T$ X9 z( n1 m! P$ i% o' w#include <stdlib.h>
" E6 ^ S+ V" W#include <pcap.h> //捕获网口数据
- B# U% p. @6 ?' C: f#include <semaphore.h> //信号
! o% U) ]* o5 u# h; x/ ^#include <sys/types.h> //消息对列" u& r. a: r. q% k
#include <sys/ipc.h> //消息队列
; x# t7 f' S/ ~#include <sys/msg.h> //消息队列
+ b/ Y6 u6 N9 \4 C+ q9 q( K#include <sys/select.h>, x |- s$ n* j
#include <sys/syscall.h>/ f/ w4 L4 V& G
#include <sys/stat.h>1 w& W0 _+ [2 t( f' g$ D& T: i4 t
#include <sys/mman.h>
' `& y, C2 y K+ A u4 K! `#define msleep(x) usleep(1000*x), v8 X% D3 r: U- c# k
: i+ @3 D- E& z/ ?, x
int main()
8 c/ X" c/ a8 V. W* e{ " ^+ w! `3 f% k' a$ {
//MCBSP,ARM与AMBE2000交互设备4 u1 _% J5 r7 B; O S, P
int fd;% a: l) X5 D/ X) Y+ z
unsigned short data_write = 0x5555; m& A/ m# o) [0 V2 _, p) C
unsigned short data_read = 0x00;
$ d" V3 N( s" C% a, q+ W' H* o. { fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* _$ m$ f! D9 w! F
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ B! x9 ]' Q/ R& v1 L- N' d
% n) E2 z0 E8 M! Z6 C6 U0 I. ` if(fd < 0)
; k: q) ?4 J& w" C- m {
/ w9 v3 D+ I- |! w$ u/ i$ h perror("open failed\n");( I+ x% Q( O+ y- s' Q6 ~: C
return -1;: d' u; H" h5 V: E% v) R7 ^
}2 H ^) l: B1 }4 M8 k! o
! @/ g& o u7 @+ K6 }" {9 x while(1)' S/ p" ~9 j( V* G; D5 l/ g
{
( s" E' K" v' y8 U( ]
U1 M. d }1 B1 c //AMBE2000每次读写是24个字为一帧
$ f# ] r M8 D& E //写数据时将数据在底层存储起来,等到中断的时候再发送& s/ n" ^. \$ Y6 _2 |; Z) W; G+ Y, F
//AMBE2000输入数据是以0x13EC开头的" l* F1 X: B9 `7 R$ Z7 s% {
write(fd,&data_write,sizeof(unsigned short));/ r. E5 f' E* \
7 Z. f* e0 d5 U. P+ M# C //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% W# a' P3 K6 k2 c read(fd,&data_read,sizeof(unsigned short));
. L0 m# X! X* `3 I2 w3 Y
0 R2 z1 A1 ? O1 T. y$ ]8 h2 H. | if(data_read == 0x13Ec)
/ `& j7 Z) h% ^1 Z8 s" F: f4 R. G# f {6 R; }! z9 N) y7 L/ D
5 v! Z0 \2 x! ^6 j1 Z
printf("data_read = %x\n",data_read);
4 P) k6 M: b n) v8 {! k4 K }2 w. I/ y$ l* Q4 P" _' y) R8 i
" j; b) |. t0 ? msleep(10);8 \; s6 g1 z: ]. @; A( ]
. n- W7 B- }3 R. h
/*
6 [! X, A; ]5 i6 F ioctl(fd,1); I# g+ l I+ b
sleep(1);, y; I- S( T0 \
ioctl(fd,0);
/ X& W/ P) l4 T) s sleep(1);1 S9 h+ E3 \* ~4 _; N
*/ ( G* a% C Q) c) g
}
/ A9 E* S5 N' E/ c. h4 u `4 {" ^ return 0;7 E: S: i, f- z2 \1 k
: ?) m' K3 N' d& j5 n% R}
$ X, Z. V p* B8 L' a$ L9 z
6 T0 m1 K: b5 S多谢各位指教,谢谢! 急7 ?0 l! {8 K) e! u5 m
+ b' h2 M) X- g }
3 o0 _7 e. e8 T$ c5 f8 `: @! o1 m9 r+ ]5 M" r5 K
9 d4 P9 S& |5 v( O9 Z Y( n+ x
' q% y/ `' b% j5 \) @
|
|