|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / [! v& u z( Y7 O) N9 v
/** k0 I, g6 {% S% z3 h1 S
* Copyright (C) 2009 Texas Instruments Inc
' T6 E! m& v, B; H @5 ^) k *" H+ I. X b* G# a* V/ f
* This program is free software; you can redistribute it and/or modify/ Q8 K2 X4 p# [; P; W2 y
* it under the terms of the GNU General Public License as published by1 J& h7 n% D' [
* the Free Software Foundation; either version 2 of the License, or
9 w8 w0 P1 y6 `# U) J+ o * (at your option)any later version.
" w: h# I, X% q- q *" P3 U% x$ X' @0 l" w. ]$ u
* This program is distributed in the hope that it will be useful,
7 p2 w7 e. F y6 C5 A * but WITHOUT ANY WARRANTY; without even the implied warranty of
; N0 s, l2 \" R% o- p l1 }' H * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 {6 @$ e+ m, H- Q+ e; p& I; U * GNU General Public License for more details.
3 D, j; c0 z! Z5 [6 b) t( d *1 ]$ n2 {) r* Q
* You should have received a copy of the GNU General Public License# I) w) v4 W2 H3 K5 l6 ?+ l
* along with this program; if not, write to the Free Software0 S2 C+ x7 ]+ L
* Foundati
9 c. e# _# R& F- a G*/
. N0 N$ y( e& w#include <linux/module.h># h) V1 U: Y' O& ^' p
#include <linux/init.h>
5 P3 y: U" T8 @% j+ Y3 `& Y+ W9 b. X#include <linux/errno.h>
3 _) Q/ r0 t/ ^/ L" A- L4 Q* X, F* n#include <linux/types.h>8 j P& \% _- B) r
#include <linux/interrupt.h>
' M& M" U; T& i7 H' G#include <linux/io.h>
, v5 O( m L0 E6 x- y#include <linux/sysctl.h>* l! X* G& I1 B/ r
#include <linux/mm.h>2 N, h; x* P, p5 x4 M8 D9 P: N
#include <linux/delay.h>
6 @1 E1 l1 f, X6 J( q$ ^. H#include<linux/kernel.h>
) X2 h2 M7 o! z# I: y& m8 ^#include<linux/fs.h>
' D( K! w/ a; s+ l' g) d& N+ Q7 ]#include<linux/ioctl.h>. Z4 |/ S) m: M5 a9 @; x- s' z/ Z
#include<linux/cdev.h>" ^4 d/ |% h7 K3 n: y
#include<linux/kdev_t.h># M! x8 }# p# S+ G
#include<linux/gpio.h>$ D7 T Q5 y7 h' K n J8 z
#include <mach/hardware.h>& |$ }0 ?7 x6 e: |/ W. z
#include <mach/irqs.h>" {4 }( w8 u" j4 g
. X# @; }; O2 E/ \#include <asm/mach-types.h> |9 K9 q7 T1 H2 A i/ ^7 W
#include <asm/mach/arch.h>) w/ p" q4 r( n( L
#include <mach/da8xx.h>
# y" R1 l: U3 }# D. k! p! n! ~#define SYSCFG_BASE 0x01c140003 a0 g& N& a% p
#define PINMUX1_OFFSET 0x124 - z: ?# B# N; T% Q7 v+ j
#define PINMUX18_OFFSET 0x168 * s# c6 Z% b2 Y! V
#define PINMUX19_OFFSET 0x16c
7 V3 _& Z5 l/ R#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR+ g' f; `% T, A; V- \0 O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% h3 j J/ N4 k#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
9 P' Y0 o( e' e# B#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
: R4 D6 y9 Q* W8 O" D5 f#define PCR_ADDR 0x01D11024 //MCBSP1_PCR- f+ P* m' ~6 G6 l
/ @; Q- j X) W2 h W#define DXR_ADDR 0x01D11004 //MCBSP1_DXR5 m# v: J+ _* O w0 U4 i4 T
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
% o8 v M: E; R) t//PSC
& c7 \9 }. C; U. k#define PTCMD_ADDR 0x01E27120 + H' B W! l, W. C3 T
#define MDCTL15_ADDR 0x01E27A3C8 c G5 {, o8 S
#define PDCTL1_ADDR 0x01E27304- I0 e( g3 u- V$ q" V
//GPIO8 direction6 E6 r b' m6 J7 U% Z
#define GPIO8_DIRECT 0x01E260B0
2 F& E; H. ` B3 |! g3 K7 I#define GPIO8_OUT 0x01E260B4+ ?/ h& W" T* n. ?& a; @
#define GPIO8_IN 0x01E260C07 u! R& {) I: C# u% T+ s/ r2 Q
/ h k- E, o1 y- B//#define MCBSP1_RINT 99
% {/ ?# Z7 A) v8 G- R [ ?. w( m//#define MCBSP1_XINT 100
- j' ]( h' ?! ]. q; B: }static int MCBSP_MAJOR=239;. Z3 h% L/ o) E& e7 H) @ C
static int MCBSP_MINOR=0;
7 n u8 c7 K8 C9 ^static int count =1;
D* x4 x" z& C' n, x3 y: ]; N3 B) e
#define MCBSP_NAME "MCBSP-device" u2 F$ @/ [0 B, g. D- B
& I; @& p' R% c2 e" i2 n6 i% W
static struct cdev *mcbsp_cdev;% D4 b7 F; ~; ]
static struct class *mcbsp_class;6 l0 S, e- n' e. O
static dev_t mcbsp_dev;
, e: c2 x8 J% L4 Junsigned int DRR_data;# b# U" f ~( h9 K4 S6 q
unsigned int DXR_data;
: j, S0 |/ ^+ n( }) `static int mcbsp_open(struct inode *inode,struct file *file)6 d- F; l7 @% L7 a2 X+ v
{: C' K5 P; v: Q2 h) D) C& ?; g9 i
; x1 s1 y, E8 B" n0 \/ T: [" | //interrupt enable,initialized
9 {7 w/ Q. c& @4 v, W6 N2 W unsigned int temp;" J, f( J1 u8 c' J: _8 h/ w
//SLEEP_EN(GPIO8[10])---0& ^) u9 `5 U" \3 `$ u
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ \+ U, z* h% @
temp=temp&(~0x00000400);
+ ?8 u$ V! D. q8 s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], \8 s. c' ?+ g: O& S1 S/ r8 A2 a
//RESETn(GPIO8[8])----0----1
+ }9 K c; O7 X$ Q- F# O, ?# G! J temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ v3 B1 l @& ^; u! [ temp=temp&(~0x00000100);+ [7 U4 K7 T0 O! c
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- A0 n( x6 O& g e
udelay(100);9 d y* M# M: ~, D- s# r
temp=temp| 0x00000100;, u) J0 J/ X9 ]4 H8 v: m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1- v5 C0 z% L6 D# {7 w
udelay(100);$ N3 \; [; U/ x% J
printk("open success!\n");6 I- z- [# x# L; P
return 0;
( {5 z0 e* ^/ F, u$ ?}
+ }4 Q4 O q+ Y. q% F9 b# F, H( y, x6 G! k
static int mcbsp_release(struct inode *inode,struct file *file)
& l. k+ Y$ x; t2 e1 R+ V- T{
. u5 M" i2 k% L! V* {6 y printk("release success!\n");
& d0 h9 u$ q! U% _5 t* v7 w1 ~0 B return 0;
- V! f7 ~ o( {' Y}
* Z2 L& O" j- Z$ b+ @1 D
6 b* y2 P t2 l* V4 mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 C m6 ]4 `9 s" }" c6 ~/ Y
{
: D7 @& y6 U7 J& i5 T copy_from_user(&DXR_data,buf,len);. _& Q* S: Y/ L/ A5 O
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
: n: w) b5 c% l return 0;
5 H2 p/ t- G7 i; r" v+ u. ^# M & `9 d1 G1 P# W1 B, N9 D; C( q
}# [( x( a$ @7 L& C: w3 U, t* P- @
1 R; {$ ^8 M4 r+ R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
6 I; R1 y9 X0 z/ K& X1 M4 t{ 9 |* N/ B L3 @4 b% e
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 d3 e; N$ v- x* r copy_to_user(buf,&DRR_data,len);
8 j" f8 O& P& E) w0 B) @ return 0;
7 B, K, b5 G8 {( z}% E0 L$ E* k9 e
3 l4 I, ~5 F7 }
3 b# w/ @- ^- R& x* s5 R
static struct file_operations mcbsp_fops=
- s& \6 V$ c) L: w{
* B$ Y: i. `9 w$ A% c .owner=THIS_MODULE,
3 b l+ {! A" g( w .open=mcbsp_open,
( j, z" k; `- V .release=mcbsp_release,
' l3 H- B7 C! P .write=mcbsp_write,
1 C. e( T$ V' m3 \" [. ^& q .read=mcbsp_read,
5 ]. m4 ^, N6 B};7 M% M5 a: k8 I9 Y& L( w8 C
static int __init MCBSP_init(void)* U* L% F1 U/ i: s9 M6 O# Y% X
{: ~8 M" m+ d# z( c( e, D
int ret;
9 x% d& w9 l% Z( \; `: n/ u unsigned int PINMUX1_REG_old;
% @3 q; r. T% a, E) s6 x0 a8 u unsigned int PINMUX18_REG_old;1 C! I! D# L8 i( }" i. ?- s( ?
unsigned int PINMUX19_REG_old;. X4 d* |, ~0 m( Y5 V) A& o
unsigned int temp;
; W7 b8 X1 T" L8 j8 I if(MCBSP_MAJOR)
# x' f* O! y" ]/ o" ^! M {
" z6 i) Y. R6 n mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);, |: B4 {$ g, N5 e9 S$ z) m
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* \' t( N* A" I0 i& u+ u/ K/ G+ Z( x0 S }
' Z. w) V$ r8 _" u0 n# I else5 ~# a0 i. L7 ]! k6 ?
{
: V t! q# X$ @% q9 n% n; K" a ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 E: L, r/ n6 e8 G9 r2 |3 k MCBSP_MAJOR=MAJOR(mcbsp_dev);+ w+ |$ d2 g! c/ ~0 h- R; }* Q" X( A0 q
}
u/ g- w. w# ?/ _$ ^5 q; g ; W4 b/ o; f# T2 F1 d4 y: s! s; _
if(ret<0)- W% ~( L; f2 Q* b I
{- C; o+ N8 V/ W$ ^7 o) [
printk(KERN_ERR "register chrdev fail!");
0 r6 P9 D' t2 ~9 ?. z% p, P6 G: C return -1;
- Q. U$ ?0 T3 H% b+ p0 `: C( G }6 a. c, e: J8 }) a4 C
- }. Y8 L- a1 z
mcbsp_cdev=cdev_alloc();: H7 Z6 l( @: a* M8 P
+ y4 @% y1 [# m, ^4 g) x r0 q J h" ?
if(mcbsp_cdev!=NULL)9 T1 v$ g/ b6 `2 u( b
{- ^; S1 Y: p4 u: t8 F: k
cdev_init(mcbsp_cdev,&mcbsp_fops);& A+ A V. u6 p" l
mcbsp_cdev->ops=&mcbsp_fops;0 L7 ^: m- p8 y
mcbsp_cdev->owner=THIS_MODULE;1 `! D* F/ G2 k
( e2 o) S! E+ v( a. u% n: A+ Y if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
1 q* N2 B* b' I0 U% Y% h% C; k printk(KERN_ERR "register cdev fail!");( E. `4 v0 W) X% H
else4 `" f" l5 p, p
printk(KERN_ERR "register success!\n");
0 B! i( s6 e+ r7 Y }
2 t* }; c- |0 m1 K: K+ ]9 a1 e else7 }, u2 j& _' ]: B
{
' _. m! b. k) ~8 Q0 a$ u, T; u printk(KERN_ERR "register cdev err!");
: A- |2 t4 K1 q6 W# X2 g return -1;
6 ]2 T! ]9 b# e# y }
8 Q& ?- E% n9 X% y) Y - X; T- w$ |6 K
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 c. x, |- I; V! d8 x. ^# Y5 w if(IS_ERR(mcbsp_class))
5 \4 h' t% u! o: f8 e {' t1 ]3 ]0 X6 _/ p8 b
printk(KERN_ERR "register class err!");9 o! X) S- P3 k# m
return -1;; P1 p1 I2 q: g1 u9 @
}
6 Z" v4 u+ D; f device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME); x7 ^, i1 [& S6 Z
- C1 } }! a3 ] //PSC5 R! y% t$ M) [# v+ g8 B2 F
//add Enable MCBSP
; B/ ?8 P3 F4 O* P- S) @% r; @0 w //test
3 j, } |, x; X8 e; _0 R$ ~ temp = 0x80000003;$ [) h+ N7 [5 s# s9 K- Z% e$ [
writel(temp, IO_ADDRESS(MDCTL15_ADDR));' p3 ^- t' K! z, t/ K2 g
temp = 0x00000003;
" {$ X6 E8 t% ^& X5 y writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 ?1 E8 X6 y X- i Y; u
% d4 U: d9 y5 y- V0 M temp = 0x001FF201;
2 ^ x; t2 w* A' v7 k7 U6 q& w7 E% J writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 [0 z$ T' ]4 E H" E! O* \
$ A! G2 C; U( x- @2 A+ G2 Y0 k //PINMUX % b; m! E6 j, `& _* \- _6 S4 i& x
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ ]8 r; g8 o3 D2 d6 L* m
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ K u* C& x- p! ~: V1 W) J7 d% ]7 M PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ' j! T/ s6 L9 F k
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 [1 [. N% v) R" O: R
, P( S) F" l6 U
//SLEEP_EN,EPR,L138_SHK1,L138_RC6 E' ~# {; P7 P" ]) }3 o: F3 n
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 \0 g( ?& F+ g- G+ ~- K: Z2 Z3 t8 w PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
9 S7 [4 |0 D% E3 g. r$ p9 h writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 Z, l" {1 K. w
6 n3 g; s1 F2 U
//RESETn,L138_SHK2. x8 m3 X* j% ?% d5 L
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); / S. ]2 z: v& }9 m' U" i% H
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 U9 a4 x6 ~& w6 I! Y writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" A; i) P' `- R8 O . I- [ B' c8 \
. h) P2 P+ ]; _+ P, C //SPCR Register
- y/ W2 Y/ z' b9 F2 n/ p2 t; A //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# O; L) H% d; }, p temp = 0x03000000;//(DLB=0); E. m8 N, V2 O& @: T" B; E/ e
// temp = 0x03008000;//(DLB=1)( x; U% ^7 a4 \9 W) g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset K" U' n# M5 g7 ^; W% S& v
temp = readl(IO_ADDRESS(SPCR_ADDR));+ Y7 d+ u1 b5 c: |. W
printk("temp=%x\n",temp);
/ P9 j A: y/ |& z0 b: x3 j8 N, p
; F7 T, N7 o4 P# W% G, g$ |" x //PCR Register
# E( x. O3 R! P( `8 f- }2 ] //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 j2 C: ^) x6 d9 R% \ // temp = 0x00000F0F;
, g# z- m( ` h+ `7 h8 S4 z temp = 0x00000B0F;
7 b! Z m& _: b$ e writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
& n# E3 y$ R! R( O0 _( `* ` temp = readl(IO_ADDRESS(PCR_ADDR));' \. C: ^' a$ s1 G1 u% D s# g
printk("temp=%x\n",temp); " U# f5 J4 N0 X5 R+ ^/ S& H
//SRGR Register/ q& o5 r. r" z: a$ X& b
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 h0 l% s7 ^% N7 f, }( S
//temp = 0x301F000B;0 Z N- t" e' i
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ( @2 @9 I0 _1 Y) @7 z& @8 ^3 j
temp = readl(IO_ADDRESS(SRGR_ADDR));7 Q f( }+ ?: d% G5 o( w' y
printk("temp=%x\n",temp);/ b6 R- S5 c2 l1 P m8 R
//RCR
t% ]$ \" Q3 r# x' g( K //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* P3 K: e3 I+ \% u //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 ]/ v6 H' b* a6 P& t2 K temp = 0x00440040;: E% |2 e6 S# j5 R3 D
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
4 D6 @0 c' ]( Z0 A temp = readl(IO_ADDRESS(RCR_ADDR));; V, }# q2 D- \3 X- W
printk("temp=%x\n",temp);
7 _$ P# }, o1 h1 ` //XCR+ \9 F# A7 Q4 Z8 u+ h* u% g, Q
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
9 K2 q ]! h( R //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# C# a% m- A0 h
temp = 0x00440040;2 \& X6 e1 ?- `2 w' j
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
2 h, E. j' F) H9 T temp = readl(IO_ADDRESS(XCR_ADDR));2 r6 \) u) r0 ^8 _1 E% P F7 L
printk("temp=%x\n",temp);! D9 S: P0 P1 S+ p$ S
udelay(100);0 U* q6 i+ `8 J2 m. _: h; `
//SPCR Register
& x' W; f6 e, f' H& f //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' Y# F. w# W/ [6 P" o+ ]
temp = 0x03C10001; //DLB = 0 VS DLB = 1
+ D, |! y2 E3 n% _ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled. o% z! n4 [7 ~
temp = readl(IO_ADDRESS(SPCR_ADDR));* A9 I6 i, x( { T
printk("temp=%x\n",temp);# Z0 P+ S# x% f( F
udelay(100);* y: x9 Q0 d+ t4 i
9 }5 ]* I. U9 m8 ` S
//set GPIO direction
# k" U! x6 \( B temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 u* g0 w4 L( O! l- ~# v3 M7 K
temp = temp | 0x00000100;//EPR----input
/ {3 e( k( }) ]5 F# s5 I! l) S temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 e* _: G/ C4 @6 {: p9 u
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ Y; z/ a5 H ], K! u
$ z9 }) M9 @- p# L' }( q return 0;) w* g, U& E6 s( L3 p P
}
4 ?) ~+ M$ B! [- @' ?9 H" K {8 e+ ystatic void __exit MCBSP_exit(void)
% B2 q5 e% M( e, Y- t% Q" r{/ }0 Y/ f" _& J' E
printk("mcbsp chrdev exit!\n");' ~0 G+ [6 g8 {5 Q) ]$ g9 W$ L
cdev_del(mcbsp_cdev);
3 o9 @: ^$ B1 {. q+ h5 H unregister_chrdev_region(mcbsp_dev,count);8 P. ^: x2 o' {8 w' V9 i
device_destroy(mcbsp_class,mcbsp_dev);% F) Z. S1 E0 ?" \. b
class_destroy(mcbsp_class);
0 `" ^/ ~/ T' b}
) z9 d% }. M/ T& Dmodule_init(MCBSP_init);
) ^3 i1 |: W$ z' o% J7 t/ @* n0 Rmodule_exit(MCBSP_exit);
" E. n( c' K# Y& k c
5 T1 E# t9 Z. Y7 f+ q; VMODULE_LICENSE("GPL");4 ~! ~+ j( u* O: e: s O
. I; o* s: s) @) J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 `0 X; y* \ q1 m2 B) u0 C
我的应用层的测试程序如下
' r+ G7 D3 y3 v#include <stdio.h>' J. @2 h! o) F& ?" Q6 U/ ?% Z
#include <string.h>
4 i9 ]/ }; j' ?; C6 K9 f#include <fcntl.h>
- f0 Z1 N/ c$ P6 o/ o- L#include <unistd.h>
, l! \6 | b) n3 ~& f( G#include <signal.h>
8 c/ j8 {$ j4 i$ c# f' c* ^#include <pthread.h> //线程
! U/ i+ G$ e5 a& ^0 ?#include <stdlib.h>! h5 E) b. v* E( _) p1 H
#include <pcap.h> //捕获网口数据 z5 D8 I" n# K* ]) P9 \0 T& A( r: }
#include <semaphore.h> //信号
* ^* `, S5 u7 m; @#include <sys/types.h> //消息对列
) N3 n+ d( |5 D; k* J2 M1 T#include <sys/ipc.h> //消息队列0 X& C" \) h/ F) e0 c: K
#include <sys/msg.h> //消息队列
( ?" O7 a6 E2 S- ?$ x#include <sys/select.h>
1 a& |/ R8 z- B5 g* m1 C* c- A2 z#include <sys/syscall.h>
! b1 E3 J* t$ w% j! S8 x& h#include <sys/stat.h>- Q: H0 f: r# I! t5 V
#include <sys/mman.h>
, D$ O( `1 r# |' R#define msleep(x) usleep(1000*x)" P0 b9 F' z' E M- W/ f( V6 g
+ V/ Y1 l& j8 Q& L9 n
int main()
% K# b& T( w: r) l3 e: Z6 h. B{
6 W1 M7 w9 w- F7 h! I! d5 R5 K2 p //MCBSP,ARM与AMBE2000交互设备2 g9 l) {4 w% Y1 j/ l$ ^% d
int fd;$ S: S& P7 i. `! l, S' v
unsigned short data_write = 0x5555;. H- r) D D" ~7 F) G4 S8 D0 e+ m
unsigned short data_read = 0x00;
/ x0 p, m7 y9 r( U% h fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 b/ l2 o+ n; ?6 `) m/ F* k" I$ K // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* s7 Y; t( H" u
2 }: t: y2 T9 ~: n) F7 s if(fd < 0)# x! j& q7 X( {& y2 Q, r& q( f" o
{2 _* R$ A' t/ Z
perror("open failed\n");& s# s5 S0 i2 k% Q# _
return -1;* T& B5 J" [/ r; ?4 }
}
5 C$ Z5 G. z3 J$ [: ?# C$ [4 E
2 w% _" Z* I2 a9 X while(1)
( a" ]/ F- Y( m& Z! I {% n- N7 L: Y( \- l: T
0 b; J$ S0 T3 \2 o5 ?9 {" H3 J
//AMBE2000每次读写是24个字为一帧5 k2 ]# j: e ?- V
//写数据时将数据在底层存储起来,等到中断的时候再发送7 t+ J. S! w u' _ g, U% M* P
//AMBE2000输入数据是以0x13EC开头的
$ |8 A* V% v' H# h& @ write(fd,&data_write,sizeof(unsigned short));
1 ~6 F: U/ O% `
" e) S5 x5 N9 O" W //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 4 j1 J7 E. N) j
read(fd,&data_read,sizeof(unsigned short));
& t6 R+ C, V3 `3 K2 u6 q $ y9 h4 e+ E s% e4 N& e! Q5 ?
if(data_read == 0x13Ec)+ z4 q* b6 m# h1 z B# @
{
5 w& A% U! w2 k& m" P- f , ?. i g$ r5 {# O( q
printf("data_read = %x\n",data_read);
, ]0 {& H6 Y1 J* A' A0 A4 E }
4 } q7 H7 B* D9 A) q$ l( i8 u + U% G8 u, W8 ~, ?
msleep(10);
) }. b3 [8 g4 h' b3 ] % g7 u. v( R$ t% c( |" m
/*
' x. @0 j+ @6 S6 W/ r ioctl(fd,1);
" t! t/ H: ^! ^& H3 A sleep(1);% _" _, e% `( A, X. V3 ?
ioctl(fd,0);
7 @9 D" b, \; C" F+ D' Z6 K sleep(1);& W1 E; C! ^+ |' i; J/ R' ]
*/ 1 o+ ?9 d3 ~4 d' ?3 [ u! A* a
} $ P" r; Q1 W/ w# B/ {
return 0;
" E- q* b. i' i( F
$ ^; s" Z m- f M% u5 [}
$ Q2 y: d9 L0 v) ~# N' k2 U+ w; D! i
1 F0 c+ J" @5 U多谢各位指教,谢谢! 急4 s4 {; m! _% c
. Q' {% A6 s" b4 Y; |
7 |5 ?/ m) H z3 k5 R
) ^# L4 d8 A" ~6 I/ Y7 S1 Z1 E. B1 D/ }! A. k: ]9 r
" A0 l5 P. C, @ |
|