|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
H) r& {& U4 F1 J7 h/*! ?! d- {# J0 }
* Copyright (C) 2009 Texas Instruments Inc! }7 f- j$ j; n6 @
*4 j z2 w, U) {& ?
* This program is free software; you can redistribute it and/or modify& ]+ D1 Z' k8 ^0 G0 J2 T6 a
* it under the terms of the GNU General Public License as published by2 N# }* {/ x/ |. \0 d: c
* the Free Software Foundation; either version 2 of the License, or' C: E6 K; C" T0 I$ N [4 o+ e. J
* (at your option)any later version.
3 ?) R9 ~8 q' V' F3 C# b *
! J' w1 A, |0 j: o( r * This program is distributed in the hope that it will be useful,: }# n# a z& T1 c' [8 p7 o& a
* but WITHOUT ANY WARRANTY; without even the implied warranty of
) n! ~' E* y F: ?% l% B * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: A: q1 b0 _# n; C; o) ]
* GNU General Public License for more details.9 Y3 A3 P0 B& X. w
*
' G% C% F1 ~; x6 h+ g5 z3 ]' | * You should have received a copy of the GNU General Public License
5 m4 W3 r4 I- n- I) H% |+ [ * along with this program; if not, write to the Free Software+ q+ @; V# Q7 }! }
* Foundati
- ^, N+ I# Y8 s+ ]6 k*/
! U4 i8 l6 @+ t* q! _#include <linux/module.h>1 J5 m* i* N: e \& {) w
#include <linux/init.h>
5 O* `: A4 @( \! X. D: ^#include <linux/errno.h>
: J0 l: J, m5 n; x7 _6 _! X#include <linux/types.h>( `1 ^. x, }7 S; d9 S! g$ p: z! k
#include <linux/interrupt.h>
. M6 v8 \7 o4 L. n* H. E& H#include <linux/io.h>) A# U5 R4 v4 I# o2 q
#include <linux/sysctl.h>" l2 b! K5 H7 b
#include <linux/mm.h>
- G6 c+ T+ w7 M: w* s4 O7 t#include <linux/delay.h>
3 h+ |8 g3 w$ @% Y#include<linux/kernel.h>
7 g l1 R/ b- z' B#include<linux/fs.h>
" g* e+ q( X$ Z3 l/ _. Y#include<linux/ioctl.h>6 W5 _) U9 v) }5 i b' p3 O
#include<linux/cdev.h>5 g# b4 Y& \/ h" z3 o
#include<linux/kdev_t.h>
, r A' z4 K% s4 ?#include<linux/gpio.h> o4 {. K0 n" u) d
#include <mach/hardware.h>
& Z; G" {$ t2 c, ]8 J" ]2 O#include <mach/irqs.h>9 z; d; F- a7 V/ e9 [6 o7 L0 Z9 l
- R7 z+ q8 |/ E
#include <asm/mach-types.h>
- P) L" F5 C3 s% z0 I; e2 Z#include <asm/mach/arch.h>
B9 ^7 f. Q, F) E#include <mach/da8xx.h>
, x" m* A( d" q+ j#define SYSCFG_BASE 0x01c14000
$ e5 o: Y, X1 y% s0 {- P$ J#define PINMUX1_OFFSET 0x124
$ _ i* G4 J5 w3 @1 y# S#define PINMUX18_OFFSET 0x168 ! N- I5 R1 H4 i
#define PINMUX19_OFFSET 0x16c: b. D) @& Z( g" h Y
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR2 l: n n! g. g ?4 O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
. l+ \/ ]0 S* V5 r* E- j# ]: b$ q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 }! i* J! H) h# u" h
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
" p2 m6 o) C( E' o#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
, z% \1 |( S; Z$ r% x# z
: T4 F/ j! _" v% |9 n: V* l2 _#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ l" I! z' {3 T+ x#define DRR_ADDR 0x01D11000 //MCBSP1_DRR& W- R/ P7 M9 R' E1 z% h" u
//PSC0 J2 g! D" u! _$ m. h
#define PTCMD_ADDR 0x01E27120
6 t3 t- J4 u+ w" K#define MDCTL15_ADDR 0x01E27A3C
$ B# q! Z) x7 R" ]/ @) V#define PDCTL1_ADDR 0x01E27304& Y1 S! m! B; c2 q5 w
//GPIO8 direction3 D' N" V, \6 [* Y3 q# ?% ]
#define GPIO8_DIRECT 0x01E260B0
( [: ?0 K3 P( A9 A- F8 T#define GPIO8_OUT 0x01E260B4- I3 ^! j; B! l W7 z
#define GPIO8_IN 0x01E260C0
i, i5 \! E; R- P! q t# [. }, I/ K* y4 _6 l, R
//#define MCBSP1_RINT 99
/ c5 L h, h' K& V2 F; w//#define MCBSP1_XINT 100
' V4 n9 d) e7 t2 M2 `5 h Gstatic int MCBSP_MAJOR=239;
: g8 D: p4 N1 N2 Mstatic int MCBSP_MINOR=0;# L) }. w6 _" w- {7 k: @
static int count =1;
$ }4 f" T& o4 X: l' r7 ]
: _0 _ U& ]5 e- Z) @#define MCBSP_NAME "MCBSP-device"0 z" H# n4 W. l n. s/ [) T, ]7 r
: Q0 E# V3 m1 i) g( q5 `2 c/ p2 Mstatic struct cdev *mcbsp_cdev;4 G* o/ Y. Y% v6 q5 K
static struct class *mcbsp_class;
l# G0 i* I Zstatic dev_t mcbsp_dev;
% T: l" B$ Q5 @" ~( l) Qunsigned int DRR_data;
% A4 s, h) L& _, w) aunsigned int DXR_data;
* T J! ~# u) t. Q7 astatic int mcbsp_open(struct inode *inode,struct file *file)! ]- l' B6 b% B9 W/ ~) j! U8 _
{0 U; H& t' p$ ^: n* i0 p
- n8 A8 G* L! T c; T
//interrupt enable,initialized
; d) D0 C( G3 `! o, h, V; q+ H unsigned int temp;7 E8 U* }# l6 N
//SLEEP_EN(GPIO8[10])---0
- ]' p" C/ `: z1 ? temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) ]: _* O) K6 N( e
temp=temp&(~0x00000400);
5 M/ ^% @* F7 T% d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' ^' W* X7 K7 t2 R5 c5 O3 c0 j- d8 } //RESETn(GPIO8[8])----0----15 F0 L8 }! e T) \8 F
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ L. f' h, W! q+ ^" ^ temp=temp&(~0x00000100);% m4 L8 f1 D0 [$ v; Q9 X- E
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( t4 H) m6 ^% Y/ A, v; A
udelay(100);3 H) n9 o+ a' P1 U7 T
temp=temp| 0x00000100;
" U/ e* X6 B4 n; h __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& F) H9 r0 j5 ^' Y& N udelay(100);( p! t9 u* q$ D$ k
printk("open success!\n");
: U6 H# I1 y' R( q+ b return 0; `/ O0 F( C/ I: f; ?) v5 _( @
}
) W* I& I9 n: K- E* y
; l5 ^& K! s4 M& V( estatic int mcbsp_release(struct inode *inode,struct file *file)
; H: D! e; n& J: m0 X{7 h: F) ~* R$ ], R% c9 w8 O! r0 q$ J1 F
printk("release success!\n");# q- \" J) }, h2 g
return 0;
! F/ U, u1 | e}5 D9 F2 R. k0 H- t+ T" q
# Q) A" W! L8 Z+ w% Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); W9 C: [# @4 C# _3 Y
{7 B9 L3 d$ a& u
copy_from_user(&DXR_data,buf,len);: ?1 J) ^& l% ^4 o
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" X+ |9 a, s0 S8 S8 ` return 0;) w& ] V/ |) e9 x6 z: T
% l8 L( n% X2 w9 K. x" `. l}
9 A: i% `0 \5 L
- J( O, r- m' J4 |static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 ~ p8 H5 u+ |7 [4 c
{ 3 B1 \. M: t' X0 o
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- [. m$ o: u, Y7 ^, Z copy_to_user(buf,&DRR_data,len); ) p2 }' R5 N" v
return 0;% Z5 H& b6 P: ?; v& h$ K
}
& Q) t1 L; P7 s5 s$ r$ }! k
/ q7 N8 W5 L( [) y% O$ p' f9 S
0 Y5 S7 [# N" K6 u* u+ ]' astatic struct file_operations mcbsp_fops=, W4 h+ v1 J. W
{: V( y/ O7 B, d$ Q4 ^' d: K5 m
.owner=THIS_MODULE,- p! |& I7 x) L, ?; i
.open=mcbsp_open,
2 i+ h3 a/ `0 S$ J# i- ?" P .release=mcbsp_release,
- ~2 I6 y2 g$ w, c2 J .write=mcbsp_write,; h: U& r3 I( p- Q
.read=mcbsp_read,
6 W" u' a- e( |8 x' ]# d};$ w, E, i7 {3 U# R% O0 ?
static int __init MCBSP_init(void)
5 i$ `2 W6 c) h, B8 g7 Q {! T{; u: O9 A/ F) u7 o7 p5 n
int ret;2 \ y; U b, U# {& T: y
unsigned int PINMUX1_REG_old;# H8 w9 ]0 q, G7 a
unsigned int PINMUX18_REG_old;; y* Z" e& R! _% e9 E
unsigned int PINMUX19_REG_old;9 F$ J/ |( I/ J& w, ?- y7 |
unsigned int temp;
5 v) p0 }" m5 z( J/ k. |* B3 @" i if(MCBSP_MAJOR). ^9 L0 ^3 o8 `# d
{4 R) B7 v3 ?! ] e
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);4 ~5 x0 O' q/ K8 T3 s+ \: X. {
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' o( m8 e3 x: B) ?7 t }
+ z6 ^8 c4 k" ~1 i else
u% \( I5 _7 j6 Y7 \6 a {
/ N) U0 e8 f' M# g1 r0 g+ ?, Y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ U2 m5 ~1 u7 Y* u* F$ A
MCBSP_MAJOR=MAJOR(mcbsp_dev);! R$ o6 Z/ a K" G
}/ E+ I& ^6 m1 |1 y+ O _3 k4 ~
: Q6 \, s, E$ ^& y9 [
if(ret<0)7 o9 T8 f/ q1 s% U! d+ k
{; L5 M8 {. I7 B( T% J3 Q8 C
printk(KERN_ERR "register chrdev fail!");0 K! S) A6 `- C" q
return -1;
. D# p. L E% D4 I! @ }
9 Q$ ?0 ]3 d P; u% ?* ^/ N , z g) c6 r& ~2 }+ P* S' G
mcbsp_cdev=cdev_alloc();/ c& l w5 d9 Y
& f: B, j) |' g7 B& c; I
if(mcbsp_cdev!=NULL)
8 { ^' D( r+ _" m0 Q4 \# o' k {! \& Y' R E0 c d$ t( t
cdev_init(mcbsp_cdev,&mcbsp_fops);
& R7 D6 s. l9 h; b( ~$ ? mcbsp_cdev->ops=&mcbsp_fops;
1 n! U* d8 N2 k2 S/ T+ R mcbsp_cdev->owner=THIS_MODULE;$ k9 E/ M' x6 J. x# `
4 p0 U3 L3 {" \" K4 d9 H if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), F/ U' V: Z. a5 |% a0 T
printk(KERN_ERR "register cdev fail!");
/ R/ d) W# a& g, @! i2 G else8 ]: S8 R- ?/ B5 b t
printk(KERN_ERR "register success!\n");
' _: y7 I4 E6 t# {- u; } }: r: v5 X6 C* `6 U/ }; K+ b
else
2 m" B; T m+ {" c {; p. n) T4 m4 P* v# E) h
printk(KERN_ERR "register cdev err!");5 X1 e- P2 |' h( V# ]0 }' }
return -1;* \3 M( y$ R& d; O
}
' x& C3 Y& n# _/ C" f
4 n- R9 @9 a" J. r) n( ^. D. Y! C& A mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
" T- t" O. v# `2 t& b; {: g2 [ if(IS_ERR(mcbsp_class))
: @. j( k$ u; i/ W {( V3 K3 e. Q" ?7 q
printk(KERN_ERR "register class err!");
- M1 _) S# R* z return -1;
6 W M1 Y$ O* r }
3 ^0 l3 K% [* g6 P. ~2 q0 e device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 l+ M' ]5 F/ @! y& @( ?. `3 w* v% C4 B: g- M$ ^7 C
//PSC
/ B' m2 e. V3 K //add Enable MCBSP
. N( u0 ^& \) F& G; ` //test
- D( b/ H1 h7 O- t! @: W3 t temp = 0x80000003;; |& `- t, r8 g+ ?2 U4 r
writel(temp, IO_ADDRESS(MDCTL15_ADDR));( [; P/ e5 z" s( U8 ?* }
temp = 0x00000003;
) E% W: C) q& r6 w5 y+ |% x writel(temp, IO_ADDRESS(PTCMD_ADDR));" R" R- W7 _4 ]
1 V8 \, M5 U7 u
temp = 0x001FF201;6 y; U$ m( R* r/ y5 w8 C
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( |" C, p3 _7 E( z9 R0 b
6 Y( j- E+ k5 Y t" E3 Y' J1 ] //PINMUX
/ j2 Y& h0 ?! o+ z/ b //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 M1 ]& H |- R+ P9 N+ D3 H2 I PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! V9 o* o# K5 f8 n' o3 i PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* u8 i3 S: _' x! M4 x; C, w/ J1 O( o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# b" K% H. h" l6 L! M
" {, p5 r6 B& j. Q' E
//SLEEP_EN,EPR,L138_SHK1,L138_RC
) @7 x4 Q7 {( y! D J9 K PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; S n' b+ D% r- m$ B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; . d! a4 q$ g- j/ I5 r5 D" {( B
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);9 y6 Y6 j6 ?) m' x6 O6 D
+ G% m& m. D, B& U0 W4 t' o, y* J2 } //RESETn,L138_SHK2
1 d% ]! @" c# r. ]5 |! q# ~% L PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! m6 S$ |9 n' U" G2 f PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 6 G8 @/ N. K/ C q
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' M1 s4 U' [3 |# [. B7 V
% ^4 O5 \/ m4 ]/ ~
( @1 b( C7 Y. X# v4 f- t5 C0 L' x
//SPCR Register7 u. |. {- w ?, V% {, G$ u' y
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 W6 M2 e5 w( ]. v) Y; ?( q9 R temp = 0x03000000;//(DLB=0)6 I; _1 q8 A+ j- }$ F& J
// temp = 0x03008000;//(DLB=1)
; U& B8 [ b! E) q/ t4 A/ p9 T writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
( j& h" f: W* X% s/ [ temp = readl(IO_ADDRESS(SPCR_ADDR));
0 s) G' x4 o+ O( ^ printk("temp=%x\n",temp);" t- S( T' _2 v7 p
$ V# [* P1 p8 t0 _ //PCR Register
( A- C5 k/ A4 z1 v" k //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 o/ m4 X1 B$ n3 t // temp = 0x00000F0F;
/ v$ g7 q" `2 i. s3 q% T- S temp = 0x00000B0F; Y5 B+ D4 F* {( Y& B
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
3 a* O* _5 `$ y' d0 Q( f temp = readl(IO_ADDRESS(PCR_ADDR));4 C& a2 ^3 b) D' @" K
printk("temp=%x\n",temp);
% P. q" L2 w5 I //SRGR Register
1 r3 G1 g+ h p- r5 B& I //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 Y9 Z/ c5 f0 _5 _" o
//temp = 0x301F000B;- O" W( F' t/ g, m; v/ o
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" |# ~. _$ O" o1 b% v) Q temp = readl(IO_ADDRESS(SRGR_ADDR));
! E. K( o6 ~# v+ B1 \. u7 _ printk("temp=%x\n",temp);
# q# W% l4 E6 P/ o: v //RCR0 U3 h! X3 R% X% _
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) A$ F- @ }1 t; N. }: Z //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 F8 B |" F( C! v( y. @, I/ S& m temp = 0x00440040;
) r* v3 J4 N0 I; X, m writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 9 L+ @2 G' d, p( Y) D
temp = readl(IO_ADDRESS(RCR_ADDR));* o8 \( m3 k' `8 k9 `5 h& P( l
printk("temp=%x\n",temp);( C. W3 S/ l" k1 ]
//XCR
7 p0 a! \0 x7 Q2 D# L //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( ?0 h% Y$ K4 ~
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& S9 n& @8 \) X2 `; H temp = 0x00440040;! P8 p3 V2 ?& `8 ~
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
, t2 |& k0 n7 V temp = readl(IO_ADDRESS(XCR_ADDR));
( R7 d: w/ u% U6 x% v& J+ k8 X& s printk("temp=%x\n",temp);
4 f0 e' Z. c6 @ udelay(100);
* I" r8 X" t; N1 b9 A //SPCR Register
/ Y: }# W& c; `) V" o h //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 c7 _6 ]. E. L0 e8 P# Y temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ t4 a1 d( A1 }6 |& [ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled+ H3 k5 l; D9 h( J' H
temp = readl(IO_ADDRESS(SPCR_ADDR));
2 l( J: A9 P- u" I printk("temp=%x\n",temp);9 _# N; c1 B. @3 _. |
udelay(100);
( J% l+ A6 c- w6 s
: @) \: z! Q1 ^$ o //set GPIO direction/ Z9 |1 ?! l$ ^) n9 |
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. d' l( p0 p/ u; c j1 X2 c
temp = temp | 0x00000100;//EPR----input
1 N$ h7 K; M, _ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' K+ ]6 i- W2 t/ t8 Q. `, N __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & c0 B9 ?& |: g% i
: q& N' U+ @6 s$ v) o. _
return 0;
& s) Q- W$ K+ y3 O4 G! G2 g- R}
9 T, v3 Z0 L" H( H, b+ C" v" Z! Rstatic void __exit MCBSP_exit(void)/ x( Z5 F+ _' U+ ` W* p2 O( o; J5 ?
{( v; Y( U; l1 O" T% n9 j! {
printk("mcbsp chrdev exit!\n");1 X$ M* m1 x4 B5 m9 I5 ~
cdev_del(mcbsp_cdev);* a) z8 }+ E& k) K6 r
unregister_chrdev_region(mcbsp_dev,count);
3 h4 W. m$ v$ y% q4 v, K device_destroy(mcbsp_class,mcbsp_dev);
8 c }8 X( R% @( e* K/ r4 y/ W% A class_destroy(mcbsp_class);
4 U9 h* O1 X# a+ u0 L3 X# c+ o}8 ^9 T* | T; U: {6 _4 V. M. e D. d" F
module_init(MCBSP_init); s( J! H/ K/ |
module_exit(MCBSP_exit);
N/ m5 ~/ R/ T% K- s& C- U' Z$ {" I- Q& {; w% ]
MODULE_LICENSE("GPL");
( J. H; _( L9 u7 e8 C
+ z+ X, g6 A* P& k: D0 h我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; G+ W" t# ~$ C3 U我的应用层的测试程序如下, s+ p: a. ?) T% C5 O
#include <stdio.h>8 `$ f. j; v2 `2 k3 ~' a3 M
#include <string.h>
5 v; X6 c; U/ E#include <fcntl.h>/ W# Y9 n$ b+ S' `4 O) _, `+ `
#include <unistd.h>+ p# z3 G/ o8 G/ |
#include <signal.h>
5 X, U5 p6 R8 ]! k4 s0 [' p# b4 ^#include <pthread.h> //线程" P, S8 c5 p+ H
#include <stdlib.h>9 y9 K6 @7 e9 K2 J
#include <pcap.h> //捕获网口数据: \/ Q# ]4 n1 @. x" Z
#include <semaphore.h> //信号- Q0 w4 x, n# q* i& x
#include <sys/types.h> //消息对列
; a& c$ q1 U$ {& x% m% l#include <sys/ipc.h> //消息队列
6 j4 c$ ~* E# Z7 U; a1 d#include <sys/msg.h> //消息队列
2 q: L) [ u8 p& w# J7 {#include <sys/select.h>
7 w3 B% T1 u. X5 V, m4 c#include <sys/syscall.h>7 ^* L; U1 d8 t( t' k$ h ]
#include <sys/stat.h>
$ `1 V! ?0 J+ }! b; T5 O" h#include <sys/mman.h>0 H F4 v3 ~9 X( B7 Q. _
#define msleep(x) usleep(1000*x)
! M1 Z2 i/ ~$ v/ u' l" a3 L, ]) D% Y" @3 M2 [1 G0 l
int main()$ q1 F& @9 c5 l1 z2 ]4 C0 ^
{ 5 ^* \ T2 V0 {1 @2 v
//MCBSP,ARM与AMBE2000交互设备 X: i+ F" \; _' M% W
int fd;
8 c6 n. z! n& c unsigned short data_write = 0x5555;$ |( M- ]/ `! M: i0 p
unsigned short data_read = 0x00; Q) B" x! K$ f7 x* U; q$ z
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ m( P& Y8 G s! A y* Q, r // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ @2 V# K1 t3 l- e0 u( E4 f1 ^& K' W% r
* c4 r2 s" H U* n+ E% r
if(fd < 0) S5 I( m9 Y `' B4 N
{
# V: z; k& E5 D7 J% B* S perror("open failed\n");
/ p( J: v2 D+ r& s" b5 U/ r return -1;* V) G' m1 W- C) E; F4 `
}7 B. c5 S" h- m* {
8 x0 t. K6 k! L) {- ~# g ]' N0 c
while(1)
. W) O3 [1 ~1 G9 `; v' c' s {3 G5 x* b; Q9 J( E$ w6 o4 R
3 M8 E; T( U3 f. R# S
//AMBE2000每次读写是24个字为一帧
1 u* Q1 Z, v" H4 }# A d; d1 R //写数据时将数据在底层存储起来,等到中断的时候再发送
9 z& s8 U N7 V2 _! v //AMBE2000输入数据是以0x13EC开头的8 H, D2 ^# V* o" }
write(fd,&data_write,sizeof(unsigned short));% z! u( u1 O v; D
6 a! o$ C5 k( P( k; p# T$ e6 {/ n
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% F1 C6 C! l$ m/ f6 F read(fd,&data_read,sizeof(unsigned short));
0 x/ x; d' |0 i/ H: \5 c) B6 U; l
- ?$ j1 G4 c% i$ K+ v o if(data_read == 0x13Ec) m9 H: c& Q+ t2 W" b
{
1 m$ u7 j" _2 c) U 4 N8 n1 q/ u2 e0 C
printf("data_read = %x\n",data_read);. D% r v A( r& a/ d4 S# i. K' W& D
}( k2 j5 B$ n1 Z5 S
! `+ w5 \3 ^* x% y+ f% N3 W, a; W
msleep(10);
- G% c: k$ H* g- u8 [3 F2 }0 s7 e 9 }( U9 Q. ~* F* N: [1 u% Z
/*
K; \" v7 b$ {) q ioctl(fd,1); $ E# E0 m' F$ I+ I
sleep(1);
+ I* G! m* g2 ?, N# H/ ^. N ioctl(fd,0);; t4 `( b9 D2 I" Y6 T6 l, k X
sleep(1);
1 R9 q b! ~, @. g5 {8 y4 M/ I; V2 x */
* p+ R; n: k, u$ \ }
O# ?- E! r- D9 [ return 0;/ P, g& P6 A/ P: V2 P
+ g/ E5 P% y2 s0 b' N$ X9 ~}3 P# U r% s; j( ~5 x! c
8 L5 Y$ W( p0 v- g! P, w& _* {
多谢各位指教,谢谢! 急
* a; Z7 b( ?) T: n. b0 {
) m* S+ e$ q. D- _! _; F2 y) {, a% B7 U7 s! W
9 k, d ?& ?) o* X# `6 D( o/ c" f$ o% f! {) y7 `) |
) V- k; k$ ?/ V' t
|
|