|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & _4 g, A. f2 j2 I: e1 D9 k
/*7 R- B( s2 ~5 p% v; E& S) o. {, u& n1 O
* Copyright (C) 2009 Texas Instruments Inc- T6 m3 Y6 `: ]3 J0 K. d
*
/ v4 I9 p1 E8 r0 t * This program is free software; you can redistribute it and/or modify8 W' y. d/ s9 Y5 B' n E
* it under the terms of the GNU General Public License as published by& Y0 X' @: I( d, u0 k
* the Free Software Foundation; either version 2 of the License, or) _% j/ C5 p- l" V# |/ g4 F& t
* (at your option)any later version.
& S- }: l, R# v T4 r9 U; a/ B *
. y& o5 O$ b! s* C * This program is distributed in the hope that it will be useful,! z( r1 Y! |, L& S* X
* but WITHOUT ANY WARRANTY; without even the implied warranty of. X; D- B4 o a( y& d: z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 k( {# D! p' {' k * GNU General Public License for more details.
- t" |/ F; J6 Q$ \6 ? *
) x$ l& z: C6 r7 @5 G * You should have received a copy of the GNU General Public License& H/ Y* S* T6 d, \0 @# B% I
* along with this program; if not, write to the Free Software
8 T- _* c* L- s) v4 a * Foundati
# W2 o- p# |# I+ [( c/ f*/
1 p% x* D5 r' s+ C#include <linux/module.h>6 F9 s9 z+ n3 c; v/ }% j
#include <linux/init.h>
6 d$ A% @4 U) U0 ?#include <linux/errno.h>) d/ w8 u8 e% R. r" P6 F
#include <linux/types.h>0 f% d: R8 s. K1 Y8 x S3 |
#include <linux/interrupt.h>
$ I% }7 y( a4 v0 @#include <linux/io.h>
: y" a) O( S( p+ i, ]#include <linux/sysctl.h>1 q* `& S6 F: x# `* R
#include <linux/mm.h>
' m: X1 w T+ @, ?* h. J" ^#include <linux/delay.h>
; }4 X) ?' I1 B#include<linux/kernel.h>. \( r& K7 I/ S/ D; q8 N. |
#include<linux/fs.h>
; A: p! H( U& z+ j5 L#include<linux/ioctl.h>
6 O* e5 F( ^" ^5 @ P#include<linux/cdev.h>
2 u8 V) j; P$ h- v( n#include<linux/kdev_t.h>1 a8 L- | X% G1 h- S; G
#include<linux/gpio.h>
: h9 B; a6 W4 F# y#include <mach/hardware.h>
( R1 x- |3 I9 i2 T2 k- F#include <mach/irqs.h>& p! y8 I+ H1 E8 R; ~; h- G
3 r# t# R; K7 K9 \#include <asm/mach-types.h>, B7 R) a* X* N. e! { G: U
#include <asm/mach/arch.h>4 f$ W/ p& n3 W1 }% A6 W/ E m9 @
#include <mach/da8xx.h>
# b6 j+ P: J( Y' g#define SYSCFG_BASE 0x01c14000& O- _/ p# f8 `2 L
#define PINMUX1_OFFSET 0x124
1 t+ z4 F) v8 C#define PINMUX18_OFFSET 0x168 % h/ [4 X/ M) V9 T$ b2 O
#define PINMUX19_OFFSET 0x16c
8 V( V" ]7 e& U3 L#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
: f( @/ Z& A* q$ I" f#define RCR_ADDR 0x01D1100C //MCBSP1_RCR7 l- ~4 I9 J k: F/ o- D
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) L6 z5 I/ G5 \. |#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR3 ?4 E/ X: P3 ] ?- U- x) X
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 Y1 C2 G% W7 s" u" {7 q, U$ U
+ [2 Q! J0 A5 f#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
6 x" V9 a$ r, [#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( {$ O2 V$ o9 M. J/ F/ O- D//PSC
: G6 \( l# v; H. R& q% l#define PTCMD_ADDR 0x01E27120
! G# l4 o# j) u& |+ O#define MDCTL15_ADDR 0x01E27A3C
0 }2 a8 g# I5 ?* \4 Y#define PDCTL1_ADDR 0x01E273045 Q# I3 r- S/ p+ G. G
//GPIO8 direction
: Q* r: Z" v. E; X$ V2 A$ t#define GPIO8_DIRECT 0x01E260B0; W0 m" I2 r, H& Q: m" q' Y$ }
#define GPIO8_OUT 0x01E260B4
5 V& y) N* C9 t) ]9 ]1 B) Y#define GPIO8_IN 0x01E260C0& s* W: t% Z' e
- l; j. h; g+ R' i9 L/ G& e
//#define MCBSP1_RINT 99
5 v8 v& z/ C u1 a//#define MCBSP1_XINT 100
7 X: C- i0 ~% [* bstatic int MCBSP_MAJOR=239;$ j( K: {' N6 w0 z0 |" e+ [) q
static int MCBSP_MINOR=0;
* f0 G2 V8 ]- i$ ?' ^static int count =1;6 x: {! R! c1 U
$ F; x. B$ J+ t) y( |" ~#define MCBSP_NAME "MCBSP-device". F4 C3 Q4 g* M" V* O; f
/ q# f$ e9 S6 s/ `- u$ Z. C4 X* b9 w
static struct cdev *mcbsp_cdev;
9 M! k/ ?. K* {/ jstatic struct class *mcbsp_class;
+ }8 g6 R# m; r4 k. I. e6 V4 kstatic dev_t mcbsp_dev;: ^( i, |2 J4 M2 \% Q
unsigned int DRR_data;
- s4 M4 p' a3 ~* b" j/ Hunsigned int DXR_data;
" G S0 w; G& x6 z$ gstatic int mcbsp_open(struct inode *inode,struct file *file); @- X& V8 @& M6 Z" @
{ B; N$ J5 Q5 G+ Q1 I$ ^5 f5 P7 A7 L
/ R3 ^0 U7 W5 n `3 L9 ~& A //interrupt enable,initialized
8 L( A Z! B' ^& d2 o) ]( ^: N unsigned int temp; E( }# y* K! v/ E* L# g1 x
//SLEEP_EN(GPIO8[10])---0/ p8 q; F) z6 [& L
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 T" ^& `* G8 _1 E( z# ?% p
temp=temp&(~0x00000400);! I: F% z8 ^, J! p6 b
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 o# c$ }) }5 @& ~( ?& ~/ J% S //RESETn(GPIO8[8])----0----1
7 x6 [8 X! C" l$ p# W- Y: w5 U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- S3 p B7 ~ _* t/ `1 W% a temp=temp&(~0x00000100);
' V# O' N% `; u& g1 ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ w. w x! f, w& T udelay(100);
! T8 ]/ K& D: ]/ ?5 M$ o temp=temp| 0x00000100;% z2 j J" p6 H) ?1 @5 N* }5 Z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 J( x- N [/ Q4 Y+ ]3 P2 J udelay(100);
) ~+ [- q1 V" z% l1 y printk("open success!\n");
! t8 b. Z( j; v/ b return 0;
f, k J N! K- c% V}: g3 D1 ~" q7 f0 r1 V( j
+ o2 y8 h. _7 A. |. {& M, f6 Estatic int mcbsp_release(struct inode *inode,struct file *file)
% B3 l& y: A* B, c{7 B: e ?7 G/ f ~1 ^
printk("release success!\n");3 V0 G) A/ a0 e
return 0;
8 O2 v* ~, z9 r8 G& P7 i) Q4 ]}
* J. m8 k. C2 Z
4 H) u1 e; V) @# A2 M# |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
~: q% Q: V6 W" s; s4 z/ k{+ f0 \: B% u& b7 C& t9 G0 _1 V
copy_from_user(&DXR_data,buf,len);+ Y4 j( m% W& z0 F" z1 \* C
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); * o) J \8 F( A1 O+ ~* a+ C
return 0;
3 M r- L+ _7 D1 j 8 J, p$ F) U! s! ^ e5 _; V
}
r/ G2 x. w. u( f z- A* O+ U* ^. g+ |" D
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& ^& `! g/ i( w, u+ ^) n) {
{ 2 U. x/ S. @: i) B
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ r8 E7 o. d9 Z k/ i
copy_to_user(buf,&DRR_data,len); % q1 w+ ^; \3 V& `3 ]
return 0;1 ~: k- [3 Z" G$ j' E- S% H, a5 D
}6 e( f' W$ q6 W( G4 L
: b, _7 h7 e6 {9 ~
, o8 F( ?. Y" C, Tstatic struct file_operations mcbsp_fops=
; i! u" ]3 f/ n) h4 M. ?{
0 Y/ Q7 I) q8 K: i: A% c/ U .owner=THIS_MODULE,/ o% |: C; {% V: N. _2 ]2 ~1 N2 \( }6 \
.open=mcbsp_open,
6 [- _% m0 W2 q .release=mcbsp_release,
9 A& b+ }% G# w6 [' h2 J .write=mcbsp_write,8 _7 x/ X% D6 f" Q
.read=mcbsp_read,
" `8 W( k5 E. A1 o+ m};) A' y; b$ u$ P/ f! ]! |
static int __init MCBSP_init(void)6 R ~1 G* c. n8 @7 o% `9 P" u9 |
{" |8 [3 U; R% |& v3 k
int ret;; C- C1 h6 K. s8 T
unsigned int PINMUX1_REG_old;" M# U( x/ U- {# z) L2 Q
unsigned int PINMUX18_REG_old;
, r+ {- a0 _% O+ U- I& a unsigned int PINMUX19_REG_old;
" b6 ~$ W7 [ \6 n* t unsigned int temp; 6 g4 C( w. N0 O: W0 }" F/ W
if(MCBSP_MAJOR)& Y+ q& l2 k# l: A2 X
{1 g: u5 }4 a% P% D( o; _
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- ~0 O2 J1 G5 |9 @# p* Q5 l
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);# l9 c- \& a2 {) w- M% o. y) W) ]
}" q _' c6 @8 a/ t% c/ b
else$ s) \6 V/ z6 [, S' K$ ?3 j: r2 P
{9 M7 i* p: w% Y
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 p+ c+ z& X1 x3 [/ i MCBSP_MAJOR=MAJOR(mcbsp_dev);, r9 Z/ k; e7 ^+ f) d7 v2 p
}
1 l3 k2 q! x3 h7 R5 `: | 3 t' {$ t& Y3 _: r8 Y; Y' b M y
if(ret<0)
0 ^4 e, `9 a4 r. H |5 m i4 \ {2 u* D/ X( x% |/ `% Q$ Y* n
printk(KERN_ERR "register chrdev fail!");
- Y3 x( ^( y# i6 | return -1;* [! e/ f+ [, I1 K- P/ v& x
}
1 _4 J6 t) k0 K
$ F9 q( n% @9 p# L% x- [# d mcbsp_cdev=cdev_alloc();, x) M8 w* I& ?0 p# j
6 ]1 F, o/ _2 q if(mcbsp_cdev!=NULL)3 E, C) k l: C1 T: a/ F3 H
{% b: X. u3 b& S2 p% w
cdev_init(mcbsp_cdev,&mcbsp_fops);6 w. i* N2 e7 f9 G9 h
mcbsp_cdev->ops=&mcbsp_fops;
& y" O* k5 `( a! B) L mcbsp_cdev->owner=THIS_MODULE;' A, T( e! `1 W5 s2 D: E
) v/ X5 Z; U3 o+ O. Y3 N [
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): t' l9 a& e9 m4 a* Z# ^6 @
printk(KERN_ERR "register cdev fail!");( I3 U& k8 u' d' p8 ~0 X
else% {' G$ A+ d8 ]2 T
printk(KERN_ERR "register success!\n");
" w& n0 N' A9 b$ Y* z }' [" J: {1 Q* y8 c5 a
else7 r3 F6 _8 r0 ~2 y! a ~8 T
{
" h8 U+ A/ S# p0 g& h R1 l7 Y printk(KERN_ERR "register cdev err!");
) W- X$ f9 d# n$ h& q return -1;6 R. Z6 ~& g4 T) O% q
}' ?$ n& F/ V0 Q2 V- U" q
7 d5 k# W$ i/ V) r" D7 j/ F, Q1 y mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 q" n2 x* y& R; \% m if(IS_ERR(mcbsp_class))
( o+ |: J+ z$ c, S {, E8 t, G- s! B% _. O7 U( x7 I
printk(KERN_ERR "register class err!");
* [& W+ _ U* D. ~ return -1;
U( L0 i$ q- B2 a& _& f1 h$ o }+ U" |& P# e2 _
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
i7 G( M8 Y$ C% P- G
5 c) e) e4 @" @4 _4 s7 G7 m3 }9 | e //PSC" P- p( h" |" L/ O" J0 f
//add Enable MCBSP
2 J" V9 L* l, Q* [* L% c //test" S. O# L* M0 l( s1 E, [/ P2 e
temp = 0x80000003;, D- b; j7 x2 w% w$ G/ |; v; Z+ g
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
3 Y! L1 U- R& ]( D4 a temp = 0x00000003;$ }) f5 U+ d& z$ H) `5 v" g
writel(temp, IO_ADDRESS(PTCMD_ADDR));' x( g. v' w% i4 X1 x0 P% }$ V2 [
2 o w9 E4 G) ~3 Y* H temp = 0x001FF201;
, F2 W+ a: X6 q; i) G( y2 n& e writel(temp, IO_ADDRESS(PDCTL1_ADDR));
5 J; H5 ?5 U. G) b& ?& @% } " e" \! y; n0 I$ o( c
//PINMUX
6 b7 z3 }. G% ~, p //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ t( h5 Z3 s4 \' x$ g; k
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 i* L( C7 m2 X+ V4 z( N
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
6 {7 I' J4 j2 o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" E" ], b! G6 c: |# g0 O, E
3 g! R; w+ i4 J8 l! L2 i //SLEEP_EN,EPR,L138_SHK1,L138_RC
7 _6 L% Q; e9 }3 b$ x2 C9 ` PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 k c' ^' r; ~: R6 S- S" n PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
; J6 s* k; T; S' [8 q writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: {) j& I1 `) Z& r6 C! ^) _
+ ^* [# W+ b3 ] ^1 V //RESETn,L138_SHK2
9 e8 w; }$ h) [+ |7 Q% d PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ) D! y( o. ], F9 k
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; M8 V& q1 r4 y8 x
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) E$ l6 M7 \/ f! [' |+ @, m
- u Q) L% s- [% `. Q5 k4 c) j5 p) p * L& k3 o, ^, `3 D
//SPCR Register9 [% ]) k) r' J* @7 p: V/ J8 S
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 F5 R2 U0 K5 K8 q# ^# K( a1 ^& e
temp = 0x03000000;//(DLB=0)( i% l' _* B9 W$ ]% p8 p
// temp = 0x03008000;//(DLB=1)9 C1 Z+ f5 [2 n1 ]) {& Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset8 A( I8 } Q& H4 f: e" V5 Z
temp = readl(IO_ADDRESS(SPCR_ADDR));& p8 z7 |! ~5 }& G/ B, Y! }
printk("temp=%x\n",temp);7 |) S" j1 T5 B# x- m
+ L3 ^' I2 H6 b" ?5 t* n6 N //PCR Register
, U3 r) W; O. h% B( O8 _ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) g# |3 l& R1 H1 ^/ a
// temp = 0x00000F0F;2 C( l. M) e" z8 q$ t
temp = 0x00000B0F;
2 u- t8 f& ]! N writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 0 a+ X( y9 E7 m/ b
temp = readl(IO_ADDRESS(PCR_ADDR));! B% b% |) B# \7 M5 A
printk("temp=%x\n",temp); 1 l! \5 T) j1 ?
//SRGR Register0 _- ?3 Q1 B L. r" P9 X5 b5 K. t
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; [; `3 v8 q* K4 [ //temp = 0x301F000B;
( m# a5 [& l4 c8 j9 g/ K$ L writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
& |/ b! U7 H/ f0 a' V* ^* ^ temp = readl(IO_ADDRESS(SRGR_ADDR));% j1 n. b3 D# k" ]# m% j3 t, p
printk("temp=%x\n",temp);# N0 k* C4 G) V; Y2 `$ g
//RCR7 y# }0 Z2 q0 P+ D! ]: x: i
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* J) @- m0 Y' \7 v3 ^ S //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" i3 q8 |4 h! ~1 C; ]/ J temp = 0x00440040;. J9 r0 H, L- P) ~
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
1 G% \; b: a% D2 g$ @ temp = readl(IO_ADDRESS(RCR_ADDR));" G1 B, G( `- u i' B2 T/ A% d
printk("temp=%x\n",temp);
/ ^( i; y& r4 Y, ]- K+ P //XCR
; {1 \( E$ Z1 `* v% |$ q: H. f" W //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-19 [' { P' a8 ?$ d+ ~4 T
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. y7 p2 G: ?' c$ O
temp = 0x00440040;0 z6 W" z2 W$ X0 o) m" P: g7 G( }
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized Y! w! z: ?; W1 x, y. L
temp = readl(IO_ADDRESS(XCR_ADDR));
: _- a" r1 v% s) I printk("temp=%x\n",temp);
& z9 t: E$ U: i5 V. j9 f udelay(100);" M$ h# C" h. s1 Z: ]& D! `5 g
//SPCR Register
- k4 F }4 q Q& g% K3 e //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; S6 ^* k4 E- j7 z temp = 0x03C10001; //DLB = 0 VS DLB = 1
\1 Z! x8 h1 o* k+ f8 I) q writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
* O4 m* ?7 D1 d" F& L temp = readl(IO_ADDRESS(SPCR_ADDR));
) ?/ U# u0 O# [( r4 ~' C+ E0 k( \- k8 w printk("temp=%x\n",temp);
s, i9 ^ ?# y9 ? udelay(100);/ k3 @ l3 n; c% r0 m6 z9 N
( R! e+ g4 u* q; x/ ?9 s //set GPIO direction" e5 b7 m3 U% W' j0 ~. @
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" Q; R8 a7 S$ E( i1 F
temp = temp | 0x00000100;//EPR----input
" i& Z# |! { v; x0 `1 d8 y5 _ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ n' d: ?$ P( _( Q& p7 d __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 3 s+ _/ o" }6 |2 u4 o" ^
8 [8 o/ t5 }+ _
return 0;
/ ^# Z7 C5 P( I Y# i+ L}+ H8 v/ m! ^3 i, D
static void __exit MCBSP_exit(void)
/ z& O/ J% m/ M- x{
$ }$ d0 k6 Q e. r! L: o* }+ _ printk("mcbsp chrdev exit!\n");
$ O3 _, Z9 u1 A# i5 J6 Z9 w8 T# `/ M( o cdev_del(mcbsp_cdev);
& q. c, O7 q1 T+ w, k7 B% w- U3 [) @ unregister_chrdev_region(mcbsp_dev,count);
9 {* S9 j o2 q( S device_destroy(mcbsp_class,mcbsp_dev);# E8 M7 X; i) a9 |& H5 J2 ]+ f
class_destroy(mcbsp_class);
^, h$ n R7 o) I$ N}% k' E+ x6 \; R! ?- g4 O9 E/ g8 D
module_init(MCBSP_init);* X6 R( k2 A* V0 O$ e- @
module_exit(MCBSP_exit);
9 p4 a* b8 R" O6 u! i/ y1 F; U5 \; h; E$ s/ V2 s
MODULE_LICENSE("GPL");
" M6 A$ J3 {0 l# ?9 w. [! ^% m7 @1 s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 z( Q: C( q# U+ ]8 G
我的应用层的测试程序如下
; y$ |# }" N4 O2 M1 \, b0 ]- U#include <stdio.h># [8 f/ z/ ^) F' M. h' r4 `
#include <string.h>
/ Y8 p6 L. y- ^; U& z#include <fcntl.h>1 b( {5 I& E( f' ]% z
#include <unistd.h>
. H: J+ F& V. I, Z5 Z3 [' D/ F9 a#include <signal.h>
c* D0 I. G% {1 a; f' w#include <pthread.h> //线程
) n$ u9 K& S3 Q# g#include <stdlib.h>
) }& W! O( e" z; R5 \#include <pcap.h> //捕获网口数据2 c: C6 F+ R+ ]
#include <semaphore.h> //信号4 a( @* }, m3 g% [& [# M4 e( P
#include <sys/types.h> //消息对列1 Q& u E: \; i, e! g% g
#include <sys/ipc.h> //消息队列
$ f' _8 ?3 L, I# ?9 [$ }7 o#include <sys/msg.h> //消息队列- Y' w7 k' H( ~% e: y" W
#include <sys/select.h>5 V+ l( O4 z) k h
#include <sys/syscall.h>
' y1 _% _3 |# `0 ]. @#include <sys/stat.h>5 \! u: I2 N! x: P; l' R
#include <sys/mman.h>
; _, G+ \. X' `1 z; B, z7 w/ Y# D#define msleep(x) usleep(1000*x)& Z. p6 }( b4 k+ J+ v
: J) g% T! S- R
int main()2 m7 u" `/ {) q% \
{ * J7 Y3 n# s/ v/ J3 L
//MCBSP,ARM与AMBE2000交互设备! N: l$ r' y/ @+ J2 @; b
int fd;
: M. R5 Z' \" p# z: [! }0 P unsigned short data_write = 0x5555;
" k% v6 A' v$ r* Z! n unsigned short data_read = 0x00;
6 K6 O# ^1 \7 \. @) Y$ {# x fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! l, N. `, _: ?; i' x
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' w( b" b3 j7 k/ G0 A, J0 c5 E( s, @ 1 i4 Z3 J" P, J1 G( G6 ~# t
if(fd < 0)
- g) C5 d# F* B- a7 t0 C {
# `: N% `6 W3 T: o) A _ perror("open failed\n");
5 ~1 s1 h! _) r$ g return -1;+ |3 y8 C c6 W& Z, ?
}: L2 N Y0 y6 a. @1 L
$ Q: H+ c% k" ^2 k while(1)1 ]# U" t# x; U5 Q8 j3 y& c
{1 U. M# K$ l6 k. n5 U
( F0 }2 t% U @* b( a" C+ m
//AMBE2000每次读写是24个字为一帧. v1 i- a/ K3 A& p; W9 e
//写数据时将数据在底层存储起来,等到中断的时候再发送
0 B) G. F! h' R! G //AMBE2000输入数据是以0x13EC开头的# M f; d6 I3 ?% F
write(fd,&data_write,sizeof(unsigned short));4 n7 f o& Z; k2 E
6 @, K5 T% h$ g n //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 N, C" l) L; i$ a/ M
read(fd,&data_read,sizeof(unsigned short));" s, p+ b' I$ } O
5 O4 h- {+ V& ^9 }8 d4 g
if(data_read == 0x13Ec)1 U2 x' g/ m) z
{9 V _/ j4 g* B/ I" t
6 s1 G1 O& a! k3 d0 d) j' Z printf("data_read = %x\n",data_read);
A7 i( D( h4 G2 k L7 ~/ v/ k }" X6 F0 Y- o) x6 u* w
* h9 x, c5 \ x/ }% x$ p
msleep(10);
7 q6 \8 U8 Y+ p2 ]$ @; i : v. m6 ]4 a. }% H
/*
8 H; h( J2 s% i! m7 S. R ioctl(fd,1); 0 C: B8 Z, ]5 [0 [: e* D
sleep(1);
/ X M! d' R1 `7 W4 R3 h) N ioctl(fd,0);
3 m) d. M) a4 I3 H4 [' g. S* G sleep(1);
5 f3 y! y' Z& n */ 8 k& L3 V+ _: j2 O4 {6 ^& C
} ) S( Y e5 S7 E* ^) l
return 0;
4 D0 k6 ~( X# x8 J9 k+ f 1 p$ u, g0 l. p; D. G- `' p
}/ u1 _7 U- U* p/ O$ g! X$ _. `
7 Q0 F" a, B) D: r; p) _. o多谢各位指教,谢谢! 急
k H2 |7 s$ j" o- }* Q0 J7 z! s/ z* G' z; M
' E& G; E. ^: i9 T; h$ q& B! g, R" A4 ~2 W5 U9 G+ ?7 G* {
( f! x* c2 p8 ~& l9 R( _
w8 v8 g+ u7 w- |! u' {9 l |
|