|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 K2 F. E9 w, h; R2 g5 |) T& u$ N
/*' \) T; {; P/ A# w3 s' S) z
* Copyright (C) 2009 Texas Instruments Inc
) X9 Z& d( e' E+ `; | *1 C9 x& {) L h' d3 H4 g: a
* This program is free software; you can redistribute it and/or modify
4 e1 B9 m$ q% a+ a& k * it under the terms of the GNU General Public License as published by
, v* b/ ^9 t0 h9 ]% I. ` * the Free Software Foundation; either version 2 of the License, or
. P% }: x" S- r * (at your option)any later version.# u E: B# A8 O$ m; {3 f
*
9 j/ f3 a2 }& z5 k* a$ @ * This program is distributed in the hope that it will be useful,
9 J# ]2 O" O4 r7 L) K/ V * but WITHOUT ANY WARRANTY; without even the implied warranty of8 y+ g" E; d, B1 Q" ]
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) }1 {' x; Q' n * GNU General Public License for more details.
4 g0 x3 Z/ M. x# j/ N *
% j) ?# A/ f( o3 _7 n J * You should have received a copy of the GNU General Public License
- x0 Q9 p0 R3 @' o$ O% B1 z, [1 S * along with this program; if not, write to the Free Software
" i" y) F% W8 _) x4 H * Foundati
+ M7 i: B( R9 a; t* ~( l! x- _*/
2 R1 i' Y. T9 M4 E#include <linux/module.h>
) v* F4 P" z4 D. S#include <linux/init.h>5 N* {6 i# W6 l/ G2 c' i; Z
#include <linux/errno.h>5 |/ A! i/ T; [
#include <linux/types.h>
4 ?' X1 W( @% W! J#include <linux/interrupt.h>4 S* G/ n/ _5 s& ^6 M6 B3 }! ?$ h- R
#include <linux/io.h>
- J% Q% U/ ~$ c* O* _7 o4 A2 o; j#include <linux/sysctl.h> t1 i/ q: h. ]4 R6 @2 c
#include <linux/mm.h> h- L( O2 ~' L% @6 e$ H
#include <linux/delay.h>4 U/ Y0 D C/ L( B0 s
#include<linux/kernel.h>- M7 q$ a& k9 C) j% a
#include<linux/fs.h>
1 p; n3 A6 ]2 D4 @ V6 ^#include<linux/ioctl.h>
2 W. U) T" z' `' p8 ~3 ~#include<linux/cdev.h>
/ q- ?: y# X3 r8 N" B#include<linux/kdev_t.h>
( \ [& ~$ @- Q5 m#include<linux/gpio.h>
8 x: q" J* t6 T/ c6 Q" t#include <mach/hardware.h>$ z& c* m' B8 S) @1 V7 d
#include <mach/irqs.h>
& K. o$ v& h9 x! {
j4 B7 M8 a) c6 I k0 b1 z#include <asm/mach-types.h>/ F ~1 ^, F0 k' h) z9 u
#include <asm/mach/arch.h>
. }9 c- l$ z1 G7 K- W" c7 ^#include <mach/da8xx.h>1 Y; j4 i8 \) ~# j" u0 R# [" b
#define SYSCFG_BASE 0x01c14000
g2 w% [' X" e4 |& e! e* Y#define PINMUX1_OFFSET 0x124 ( F1 Q! b# u( k# _% Q. w
#define PINMUX18_OFFSET 0x168 / N( A: }/ c* l" E3 l
#define PINMUX19_OFFSET 0x16c
$ w+ `% _( g8 H/ Z& O, J#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR6 _) e5 S2 G9 q% c) V
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ N$ N1 a. R) O( W
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) c0 F9 j; [6 L. U3 K# M: w7 c#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR$ g7 e# V5 J( z; z3 W+ ] Z
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 @& d) P3 ^4 s# B4 a! q1 \9 n4 J
3 a: d i/ I5 S& e* a#define DXR_ADDR 0x01D11004 //MCBSP1_DXR" S4 J3 p# g4 s( e, N+ R% j" _
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 m7 m9 z. ~1 U7 F3 e" d; Z
//PSC
, r0 A* N; V4 ]! ?$ q#define PTCMD_ADDR 0x01E27120 " B; Z; q7 H% N! t
#define MDCTL15_ADDR 0x01E27A3C
0 C/ L% W7 [ ?#define PDCTL1_ADDR 0x01E27304( x" O @0 y3 J* Z/ q
//GPIO8 direction9 o% r, Z N( h3 D1 f
#define GPIO8_DIRECT 0x01E260B0
6 Y; F+ m2 q1 D) s5 o& C#define GPIO8_OUT 0x01E260B4
- K% O, R6 I9 `! X& U#define GPIO8_IN 0x01E260C0: n! X! C) t6 p7 U, [' k7 \
- j" w2 l1 x! ], k% v& E//#define MCBSP1_RINT 99
6 F( ~0 S! F1 F; H+ M% A* Y//#define MCBSP1_XINT 100
* Q1 ^3 L- i% N" rstatic int MCBSP_MAJOR=239;
+ N! l6 a6 B7 X* pstatic int MCBSP_MINOR=0;
9 L& m& a( ^! L3 X& gstatic int count =1;
3 d% F- O& Y, T
* }/ Y* p1 J, ^0 d0 [#define MCBSP_NAME "MCBSP-device"
* @" u( y6 u# [. E5 h* _. m) s% Z0 N8 p3 b4 N9 @
static struct cdev *mcbsp_cdev;; Y" r) f1 G$ s( E5 y6 F
static struct class *mcbsp_class;
3 x3 u Q* B0 ]$ n* Y( Qstatic dev_t mcbsp_dev;
9 z" `# p7 }$ m0 Sunsigned int DRR_data;
9 |4 v, {# s2 g- ]. `) I6 Runsigned int DXR_data;! Y) X& D) m1 x9 p& g& A8 Y/ C8 n: h
static int mcbsp_open(struct inode *inode,struct file *file)
5 s: o W1 E! ?2 F4 F! F6 _{
9 _% s3 A( J. X) a
. B+ X3 h: ^3 d# z //interrupt enable,initialized7 C7 E, h1 v, ~
unsigned int temp;
0 D. H J0 h/ {/ d! r //SLEEP_EN(GPIO8[10])---0
; |/ Y5 l: K# q; l" E$ q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: x* |; C4 E4 p9 |# m
temp=temp&(~0x00000400);
' f: x4 C [8 n9 \' u5 W. \ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 K _4 w6 c8 Z: u+ Q$ T! x. w //RESETn(GPIO8[8])----0----1
' `/ c% V& y; A* n1 E# F; g9 U5 ~ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( `; j3 v3 |7 j& X: d9 s. r temp=temp&(~0x00000100);9 j* `# J$ b6 z% `
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! H3 q+ x3 Y0 T o. I0 S" s
udelay(100);
% C7 y3 L% z9 |% d/ ]" U/ M temp=temp| 0x00000100;
6 \0 M: U" F# y7 T& V" V' m4 O __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1/ ]! N# X1 D; `1 Y, y( V8 \! M
udelay(100);( [: v7 Q- `$ ]
printk("open success!\n");
3 d2 H0 ^# J0 d! j return 0;8 F2 u* p O, f1 O! U+ {
}
8 C4 z( e- t% d3 e/ v
! L5 {; B y4 g6 N' R J/ X tstatic int mcbsp_release(struct inode *inode,struct file *file)7 E3 k7 v* Z3 d, {3 \) j5 O
{- f3 u) Q/ b$ h+ i/ Z. _
printk("release success!\n");
0 u! _9 ]" M* e- C( {9 ` return 0;
! K9 h9 u) U8 @) _! w$ G}
& | u8 t% J' K, W
. A. d U s. k0 x' lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)% p$ J) o) y# _9 w z
{5 D( T3 F1 h1 j; Y- }; x# W1 n
copy_from_user(&DXR_data,buf,len);8 r, k5 t, U7 `' Y
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 Y- T& d' r! N0 U% K+ d, P8 N" J
return 0;
3 ^: b F4 f4 e! w
% Y) v$ A* b! y @1 z}
1 F3 M1 P7 j" Y% X8 X) L% H2 m/ R9 n6 i( S; V0 O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)0 |8 u3 J. m4 f. e" R: u) s
{
+ W! @0 \3 W$ N' e' f DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 H) J0 z4 j2 U copy_to_user(buf,&DRR_data,len); , N: r6 @3 Y, O1 I, r+ `
return 0;+ T ~: n5 g: H* S8 C9 o
}
% r$ G4 {) Z, T6 }/ q! g2 E) f6 f. a3 s2 k7 v+ F& k/ q
0 X$ ^ E( w0 Z8 X
static struct file_operations mcbsp_fops=
3 G9 Y( G3 P- }/ {: x+ s{
@2 ~2 E" A2 O( ]# i .owner=THIS_MODULE,
, W9 C8 Y: F3 L5 P" W' Y .open=mcbsp_open,
* p5 o Y* x" ]2 p: K .release=mcbsp_release,0 l$ r, n0 Y2 u. u0 o& |" w
.write=mcbsp_write,
: D7 d% A( v0 m7 v+ G* U .read=mcbsp_read,
- a- w; M) T: ?* T: D3 r};) A4 r6 R; `- u/ ]5 G
static int __init MCBSP_init(void)# `, f' }' V" G' ?9 ~+ p
{- k" X( X+ O" A5 W% r' R4 N; D
int ret;
! z+ C4 h; x4 l! p& \! |6 l/ j unsigned int PINMUX1_REG_old;% |! X1 s G/ b/ E, K9 h" _
unsigned int PINMUX18_REG_old;% ?2 t$ A2 o; O- z5 i
unsigned int PINMUX19_REG_old;+ G! I+ L. ?! N- `" u
unsigned int temp; + s; S7 O0 r* @) f' Z9 Z5 F& z
if(MCBSP_MAJOR)
t/ B- y" B+ e8 `) I {0 `1 V6 m) X# B- K/ `+ {
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- E! O: C. O1 V* _4 l1 ~) h ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);# L8 C8 m. f! @( o% R9 l* `
}
. h' \! u# c* i+ p else
% j L* M- R- \# U {
. w8 A3 o' y( P1 P" D: }2 {+ E ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ h1 d- }+ W7 |
MCBSP_MAJOR=MAJOR(mcbsp_dev);
& G0 H* | \' U4 F }
/ N9 b) t" Y- I8 V0 }
; \2 }$ k$ X" V; N$ q: X8 G if(ret<0)! [" v! f: [% k: c0 G
{- n8 A* E4 r% x
printk(KERN_ERR "register chrdev fail!");
8 p- h* x' l1 f return -1;1 V0 t7 }; C0 t5 i3 r, \
}$ C* v3 b7 P6 N+ {/ V3 b: ]0 D
6 H, L4 U* n9 P
mcbsp_cdev=cdev_alloc();5 G+ L; M7 M2 @' C5 [( @! q
2 F2 U* c( q' ^
if(mcbsp_cdev!=NULL)8 t- y) p9 s2 T" F C
{
( }1 ?/ V& q" s, k0 q cdev_init(mcbsp_cdev,&mcbsp_fops);: g6 Q% e$ t/ v( P5 F" D- X" ^
mcbsp_cdev->ops=&mcbsp_fops;
: T' t5 r. m( a$ Z. Q: ~ mcbsp_cdev->owner=THIS_MODULE; O4 @$ W+ L# j- O
; f% N/ S3 l! _7 m" O if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) F0 c* O3 I7 j# @: N printk(KERN_ERR "register cdev fail!");! J6 y# [1 {5 V
else. H4 U, ?. G4 U+ Q" m7 m9 L
printk(KERN_ERR "register success!\n");
2 j6 k- i% T5 W2 L }
5 }6 z; v3 X* P. B; V1 W) S% I* O else" ~6 o% `) Y' ~9 t9 Y
{
, E& m2 L. e$ ~" U printk(KERN_ERR "register cdev err!");: D2 e+ k( c0 `% G* D; S
return -1;
6 G4 W2 x8 U O, A1 m }8 _5 a% X! d& K' N6 L* Z# ]3 V: c
" s1 L- q" o4 m% }
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& T# l7 a0 h4 V" ?
if(IS_ERR(mcbsp_class)). E, }8 U [3 ^/ b' C0 ~. ?8 c
{5 \8 _- @* t3 ~' ~! a7 m
printk(KERN_ERR "register class err!");/ `9 j+ y) I' f
return -1;+ _& y: c% g" E% I. E8 ?
}6 g" R# j. t! I; V, Q- u) e: M1 U1 P
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 V! i$ X/ r9 Y1 H* x' e _
; \* ^2 |+ f# `
//PSC
$ D7 G; P5 P8 J* I* z //add Enable MCBSP
7 K9 v8 U& m% m. e6 d% h1 x0 M //test
1 {/ [8 V+ i, H' \* a4 I6 i/ v, q temp = 0x80000003;) f8 r) O- O3 b- i
writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 u# I3 `2 q: ~: K) p! U
temp = 0x00000003;; [" m- D$ _8 o, z
writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 l) V) Q E, ^3 _- S 7 K. s c* J1 \+ o( m
temp = 0x001FF201;' R; L- f1 ]3 f) e
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: d7 s- r! T3 |. ^ 6 A9 z" y2 _9 d5 m) e
//PINMUX
* e# ~* r% k; C. `# t" I //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! Q5 Y( f! [$ }$ N& z- n
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) Z% K9 ~) W% b9 H: H' g. m# g
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
9 U$ J4 A( G; N; T: l4 D$ i' X. W writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* k: i, R7 M' l m: ?) o
( u% ^! }2 D a
//SLEEP_EN,EPR,L138_SHK1,L138_RC9 j. @3 R, f9 u A4 L' T
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 7 G0 O/ o( T6 L$ Q7 W+ ?1 L
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 4 ]6 f: E, c0 Q: _
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);9 y. r/ n$ J! ^( S2 E$ }& t9 X% t7 S
: m) p8 [: K1 B& s# m- w
//RESETn,L138_SHK2
0 w" i' {* d/ a" F% J$ s PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); / o! S7 G- m3 w. [! G2 Q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- l9 {6 s( m. P+ \3 C$ a7 |, | writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# }( P6 d+ v' u! w
8 \. M/ K! A7 B7 `/ J$ X9 H
$ o& j9 h7 C% B* y3 z4 f7 [* t //SPCR Register
0 _$ S( g# P! B! h# C //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset" w% S9 x3 ?! o# F# u1 [1 I4 f
temp = 0x03000000;//(DLB=0)4 k* x0 P% b# f& @, ^ h# p+ W
// temp = 0x03008000;//(DLB=1)
2 Z7 E, r! W. |2 Y7 p& ^ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset. J) l9 x9 C- z0 c
temp = readl(IO_ADDRESS(SPCR_ADDR)); F2 I6 R( [: E* V- I3 c
printk("temp=%x\n",temp);
/ E' o: T5 e. M8 Z/ m - S' F1 c" U+ {9 }# ` X$ ^# V
//PCR Register
' b3 N9 W) ^0 o5 W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; o3 I6 m6 m, e/ d% V! V! v
// temp = 0x00000F0F;# q+ S: _$ [" B/ h+ R
temp = 0x00000B0F;) P. H. |0 s9 C* x
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ! F) {$ |- Q4 X2 C# F
temp = readl(IO_ADDRESS(PCR_ADDR));
& X1 B+ y4 T2 n printk("temp=%x\n",temp);
. h; B2 ` s* _5 }$ ^- U& W //SRGR Register* e' Q5 z6 Y H. q5 @1 P6 H- G: K
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11, [; {9 y- C1 ?
//temp = 0x301F000B;, C7 V) S6 `. D" a3 X* U! b3 s$ T
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized " f! S# n% ]5 ?2 }# R( \
temp = readl(IO_ADDRESS(SRGR_ADDR));6 t( a3 \/ h% x1 p
printk("temp=%x\n",temp);; ~8 Z P( [6 z. L) r
//RCR
1 h3 v3 I# k' ^" ?% Z //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" n, {! c. h7 P% B- C //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 m' J% q9 g5 S! x# j1 m5 V
temp = 0x00440040;. A& {, a( L) J; G5 \7 G" ?7 ^
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 @3 T( r4 [; ^, v/ z8 M( V# a3 y
temp = readl(IO_ADDRESS(RCR_ADDR));+ {2 W/ x- y2 G; p0 Y" m
printk("temp=%x\n",temp);
1 x9 j4 A" M( m- U- |3 m //XCR
' N, J3 V k }/ _: P3 O0 }# N //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 [, J4 k4 }/ ]
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. B' }& R I& v& p temp = 0x00440040;. L& p) ? |( B( r3 B1 T1 x! f
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 9 f' G O& V8 U% f% f; d' X
temp = readl(IO_ADDRESS(XCR_ADDR));
# l+ m/ j) Q$ S. i( T* y4 J: ? printk("temp=%x\n",temp);& i4 r4 h9 v H2 j; W, F% f
udelay(100); Q( _: ^3 N: X2 q: r& }
//SPCR Register/ T E$ n9 n8 m8 ?! e
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. G- A0 z# x! r. E3 b; W temp = 0x03C10001; //DLB = 0 VS DLB = 1
" A. c7 D: v, |! L5 L* D8 ?7 V1 a writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
( D' ^, @3 U# E temp = readl(IO_ADDRESS(SPCR_ADDR));
- v! u. Q/ p% x; f+ { printk("temp=%x\n",temp);
% Z c5 B) ~) O' d+ w; w* {2 k; V udelay(100);# M2 S! L# a: c) t( h u
' b: C, p* x3 J) N; K* s& _ //set GPIO direction
. j+ f; g4 C( d temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ }7 l9 T" v& [ temp = temp | 0x00000100;//EPR----input% B! d6 G, Z8 _! I3 a
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output' m! K% u0 ?- T9 _5 M
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - w% O% o2 E4 e' I$ b; m! u4 f; |( v( X
3 X, Q+ S5 ^& W z/ A
return 0;5 {' v6 @( h) r6 M) A# A
}
5 R: y! F# l7 u/ ]8 Vstatic void __exit MCBSP_exit(void)
& C1 c' A! k) X/ L5 L+ E1 q6 E' v0 q{1 S0 f# U1 @& g+ l
printk("mcbsp chrdev exit!\n"); W; x9 T4 N* {+ \
cdev_del(mcbsp_cdev);/ A" m7 Q# _# K3 {4 U g, l6 q. h
unregister_chrdev_region(mcbsp_dev,count);
/ Q7 ]9 c" z) J2 ~! R# d1 i device_destroy(mcbsp_class,mcbsp_dev);
% g' \' Q0 [0 J) ]0 T+ F class_destroy(mcbsp_class);" j" Z& v! v# t' k t0 q
}
+ D6 x" c+ B. f" i8 [4 w/ Rmodule_init(MCBSP_init);. u7 Z8 k! Q6 f6 `8 p
module_exit(MCBSP_exit);7 p. [! {" ~) U {( x3 A9 |' b: z. ?
( N2 j+ }1 d$ ^' uMODULE_LICENSE("GPL");/ E; Z; U& I- Z) \8 L
y/ h9 C2 T2 M; I" X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# k5 x5 R6 T2 Y7 f
我的应用层的测试程序如下
. k" Z! Q) m+ m# V& @5 `#include <stdio.h>
' f# W4 P [5 _7 y$ e, Z1 A! l#include <string.h>9 d% Z8 M3 d: U7 P- y! N( e. G6 m
#include <fcntl.h>0 x, C7 H* K* I- U
#include <unistd.h>8 D* v' B0 X( u
#include <signal.h>
! p8 b2 P/ q5 E; S$ T/ j* }# h#include <pthread.h> //线程
% ^0 V0 N2 [. j) q# p3 [! N; u2 Y. p#include <stdlib.h>
. {6 ]# @8 q8 x# j9 S/ _, V' ] D#include <pcap.h> //捕获网口数据! ^, O3 |+ F- f
#include <semaphore.h> //信号1 z4 N- G9 c/ G: k2 |
#include <sys/types.h> //消息对列1 V* u: R! ^( `9 p# B0 p
#include <sys/ipc.h> //消息队列3 W, P' @7 C/ Z `( c7 F) O
#include <sys/msg.h> //消息队列$ s" L. c& t% s& ~
#include <sys/select.h>
2 }9 C ?9 q5 q( V( }: f#include <sys/syscall.h>
* _( ^. }/ y" u6 B+ H9 K#include <sys/stat.h> ]/ x- {0 k8 o- q% r8 ~ W k$ s
#include <sys/mman.h>9 y7 h8 Z& n t0 ~) u& p
#define msleep(x) usleep(1000*x)" R, T; ^ D' ]
a; h' e* m$ W2 Sint main()
i, b; ]/ D) _3 ]: n7 W% Y{
0 w1 a2 ^9 B* h; r# Z* ~ //MCBSP,ARM与AMBE2000交互设备2 B/ j3 r) c6 ^; e; W: L. d3 K
int fd;. P# t9 N2 g4 W
unsigned short data_write = 0x5555;0 f7 V6 I* X) ?% e- s
unsigned short data_read = 0x00;
" q8 Z [4 r: { fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 k! i" ] N5 m7 E: m, j2 | // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);2 `" U$ A) z$ _1 ^
: q- y3 X" L3 S if(fd < 0)/ }. t G7 `6 n# R; M
{
; ^9 q, W# e9 k' V6 n perror("open failed\n");7 o6 [/ K8 D, p6 b4 a
return -1;
' q% [- S, ]: j- \4 K% s& i }
' J8 N. ]2 }6 f; g) a + i' L4 G" _6 c# h3 J t) j' Q5 Y
while(1)
. z1 N" |: Z) \+ ?$ B& K, M {
( t, _7 Y3 S3 B* G4 \ 4 Z1 i( u' k* @) p) B! c
//AMBE2000每次读写是24个字为一帧
+ D* o0 D+ J; A/ L2 x1 U7 E3 h# S# l //写数据时将数据在底层存储起来,等到中断的时候再发送
" R- X! s2 E2 ~+ o* n3 _+ o% U+ G+ | //AMBE2000输入数据是以0x13EC开头的
7 A3 H. m7 N" t write(fd,&data_write,sizeof(unsigned short));
+ O' Q& V% u I- J# g. r5 T
9 {- |: M# w: D+ {; ?, |5 r //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% u- [+ b F5 Q n. ` read(fd,&data_read,sizeof(unsigned short));
9 d! J# [" ^6 b. u" B: o8 P! `
1 I; V2 P; |6 D& U- G/ \/ F if(data_read == 0x13Ec)4 f$ p4 I$ d( x) G5 M4 G- Y
{6 g" | Y7 h: |3 a7 U. V
# K8 J. ^9 R5 d F2 }1 Z4 l J
printf("data_read = %x\n",data_read);; z1 f7 C6 h& {
}2 a) P+ b( J! V4 P, _
+ M \" D+ X1 A4 [1 k, @* f6 _' i# Q msleep(10);8 @9 H3 d) S; ~) T! q( ^/ y
, r7 q) \' ]! X, T( \
/*
, w5 w4 e2 \3 O" D/ g/ r ioctl(fd,1);
+ ?+ n/ [0 l$ `! K3 z; e sleep(1);
* l/ i" M8 g R2 ^' Q+ Q- @! K& I ioctl(fd,0);" t. z/ b3 a- _: y* d0 P- a
sleep(1);2 ^4 b% [, c* R- N; W
*/ 2 C) a9 ?9 ^$ Y/ w/ t" e
}
3 I. |+ ~3 z' C/ [5 N9 A return 0;* c7 I6 r" w5 h3 K; k( j C3 f/ O
- | h/ g a. @6 q
}! T x1 j5 q8 X7 r+ T7 B `
- p6 A! A% `; ~2 }8 g8 T& n) {多谢各位指教,谢谢! 急
. ]6 \. F, Z: P0 A: M9 Q8 c! F* B' l- |5 K9 M) \' F4 D' Q
) c x+ ^/ L$ g
! K( ~- o7 X& n5 ~3 z
8 z6 x# t! U: `* j
p& G* v/ Q/ P* @; U1 g
|
|