|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; x8 o6 ?4 z3 \8 ?5 ^
/*
$ |$ S+ C s5 d0 L% } Y- ` * Copyright (C) 2009 Texas Instruments Inc
- s d1 p5 F9 s) f6 W; G: ^4 c *
2 {7 w$ e# B9 u! \1 ?$ j) r1 {' y: V * This program is free software; you can redistribute it and/or modify
" x. u' D+ w/ M6 j3 ^: y# F8 q * it under the terms of the GNU General Public License as published by
$ ~4 `, B' J$ n * the Free Software Foundation; either version 2 of the License, or
$ o# N6 C: x' ?: |, ` * (at your option)any later version.
3 q L0 E3 c# T# m( S; Q8 @4 S *
/ R! m- s& Y4 l/ V; p0 x * This program is distributed in the hope that it will be useful,
9 n/ |) \# E) \+ |# ^ * but WITHOUT ANY WARRANTY; without even the implied warranty of, U1 }( k" z* _- K' i
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 d% H( _- P1 a: }6 n+ o( ] * GNU General Public License for more details.! x: B8 i( e! Z" C
*4 f& M8 F$ M. }% U3 s% m
* You should have received a copy of the GNU General Public License, }& P. R0 @) _ s. Y W# L( X) @; \
* along with this program; if not, write to the Free Software. B% W8 k' s( ?" m q( u
* Foundati
, _3 c' `5 i2 V' e*/" C) ?6 t1 `0 E, x3 M8 J
#include <linux/module.h>4 y/ p9 _4 J& [' h! a' i* f
#include <linux/init.h>7 [/ r ^& ^ u9 T* b
#include <linux/errno.h>
2 ?$ v2 j3 A) r# l' B$ V o1 ?#include <linux/types.h>3 F/ \9 o4 Y0 Q( y: U
#include <linux/interrupt.h>
1 r+ G9 V' A4 a: i: k#include <linux/io.h>
' {9 o# m$ O" V* S, y#include <linux/sysctl.h>
, Y, |2 T1 l' A#include <linux/mm.h>
! b2 k( y* O' I: d#include <linux/delay.h>
7 I+ W: r% x$ W% b) R. p#include<linux/kernel.h>. a8 q {! [1 B0 u$ t, K# g
#include<linux/fs.h>( w0 i# [) E7 W; s; q; ]; o
#include<linux/ioctl.h>' @0 o' L! d. t: K, F
#include<linux/cdev.h>$ d. e0 z3 n# w! p4 K. U. d3 ?
#include<linux/kdev_t.h>% r1 g, e" ]0 W: z5 h
#include<linux/gpio.h>% e. ]% X+ C/ _( S2 t3 q
#include <mach/hardware.h>
2 B" b x& A* [8 C9 I3 a. a#include <mach/irqs.h>
! F- `6 e, }9 G( H- M! M9 k. v- g+ Y2 W! N, u" o7 `+ p
#include <asm/mach-types.h>: P; E. ?1 Q9 o1 g3 `: ?
#include <asm/mach/arch.h>* ^* ~( I3 \1 Y$ c: w
#include <mach/da8xx.h>
% X9 A- T- M, m s+ [2 f#define SYSCFG_BASE 0x01c14000
+ _! b: `2 A8 H$ N#define PINMUX1_OFFSET 0x124 % N1 u4 x) g) [! ^9 U! R, b6 V' S
#define PINMUX18_OFFSET 0x168
0 k( K/ y; O- k; l# Y# E5 E; `#define PINMUX19_OFFSET 0x16c
5 P! x2 ~& W: N7 O- G% @" q#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( p1 x$ X2 p' j" J" k
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR' X3 e- T/ R3 A% ?
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR% X* r4 e$ T% R. k
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR) \, D3 f, J6 c7 g
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR7 B( k0 d6 k/ E4 N; X6 B5 _3 o
$ E4 Q2 A7 Y& R! |+ R8 b/ H2 e' f6 s
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
: J9 W! W7 [8 U* \1 u/ @- v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
8 M" J1 m4 H4 ?( a//PSC
' N% }7 E3 C. A/ I. @. c#define PTCMD_ADDR 0x01E27120 ( m& b# w7 c! e# H3 |
#define MDCTL15_ADDR 0x01E27A3C
X; f5 Y8 `$ v6 i5 v5 i, O e3 z#define PDCTL1_ADDR 0x01E27304
5 T i6 c# C; q X# I//GPIO8 direction. X; p! [% D: I( E0 v
#define GPIO8_DIRECT 0x01E260B0
2 V7 R% y4 V9 p$ W#define GPIO8_OUT 0x01E260B4
2 K% d- Z7 B& m0 D9 V#define GPIO8_IN 0x01E260C0
: E& D1 Q8 b! T( X" H5 D4 x0 r. ]3 W
//#define MCBSP1_RINT 99 : v4 G5 a& l4 M; W9 }
//#define MCBSP1_XINT 100
; T( c6 ?' q7 h+ bstatic int MCBSP_MAJOR=239;
1 ?3 g- d' U; q7 x) }4 B+ Wstatic int MCBSP_MINOR=0;8 L$ T( x& p* t$ W( I. I. j8 q
static int count =1;
) V8 x8 G+ E+ N1 V
1 S0 ?3 S5 ~0 j/ y, ]" I. p#define MCBSP_NAME "MCBSP-device"
' X, ^7 N* P+ q, q2 u" H, ?* s! Y5 @: }
static struct cdev *mcbsp_cdev;& p* ^6 g! `; v& O7 e1 D) G! I+ C
static struct class *mcbsp_class;4 @# Z% ^% P& |! D6 b. F
static dev_t mcbsp_dev;' V, _. K+ G, X( [2 u
unsigned int DRR_data;
; m+ x4 S/ j- h1 n, J$ J* punsigned int DXR_data;3 M+ y1 c. {0 {9 n0 ~- Y
static int mcbsp_open(struct inode *inode,struct file *file)6 g, J, L2 ^, x. `" ^
{+ ^; B3 V2 m% @# ]* ^
! E# o9 Q- Q2 ?: K1 R U: X
//interrupt enable,initialized, ?0 K: f9 \/ s6 l/ K# Q
unsigned int temp;# R0 F9 s; Z+ O9 j2 U
//SLEEP_EN(GPIO8[10])---05 z0 \; j( o, ]/ U2 ^2 P
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" n6 U, p" K# e0 k
temp=temp&(~0x00000400);) {: t% X1 ], o
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, t+ Q Z [$ {+ @& M //RESETn(GPIO8[8])----0----1
3 z# e, U. {! C; m temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. o0 d' k& m7 K$ k5 D. d+ z+ ~) K temp=temp&(~0x00000100);$ N; i, w P } T+ l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 o0 ]0 R/ r6 f2 m
udelay(100);
4 A+ C& f. Y8 P) C0 m7 w! ` temp=temp| 0x00000100;0 c4 [( X9 P( K5 e/ A9 ^" K( y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( c$ X, W2 O. D6 p# M udelay(100);1 T6 b: c4 g( Q4 i( s- J. _
printk("open success!\n");+ G, j8 \( U: k8 {! Y5 m
return 0;
# G; } u8 Y. o- i4 M}1 J$ ^( J% [$ T: H$ r
$ s6 R: J# X1 |" s& u
static int mcbsp_release(struct inode *inode,struct file *file)% A, W3 C+ ]3 d
{5 A. h. Q2 A) V& o
printk("release success!\n");
1 Q' B4 p" W0 o; S5 K. r return 0;3 T* g1 @# ?$ y$ U' o$ T
}4 y3 e. v+ v) h
: w" G7 S2 D4 F# V! F% d
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* S1 o; I, ~. S' y4 [9 N& L
{
8 L; u0 T4 u/ w- W$ \3 H copy_from_user(&DXR_data,buf,len);$ ]" v3 s4 d4 C0 ], n( G: x M
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
) O: L, m3 t0 [' I/ ~+ d return 0;* [5 k$ }1 ]0 u; M9 y; B% ?
+ J& O/ X8 v. e1 R1 j}( l1 M ^) P. H9 b' a9 _
8 F5 K2 ]6 W# v5 t7 Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 R! j( S$ G M- v) t
{
" d& p4 J6 t/ ?/ i9 a DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( s$ F& o& Q9 X9 w& }
copy_to_user(buf,&DRR_data,len); - N5 x+ q1 D9 R- V" U1 j$ \5 ?
return 0;
+ E5 A9 H3 {" l9 P: V( i}
# {! y" a' j2 w3 H
% S/ a" n. I+ I# y5 l+ _
; x ^# h8 {$ f0 i s) z0 kstatic struct file_operations mcbsp_fops=
, N R) z: a" B4 P$ s{$ ~* o+ g/ v4 S: [! I: `& N
.owner=THIS_MODULE,$ q- ]' P! X% p% t9 R
.open=mcbsp_open,
$ P7 ~4 v# F& r# ] .release=mcbsp_release,
6 {0 U7 Q1 S& s9 m) D9 g; m! L- i .write=mcbsp_write,
; d& ^8 U4 L; |3 f/ C. t. n; M .read=mcbsp_read,7 x& p& k/ [& i% |/ X, T* c
};' W- y- G$ n' r8 d1 u
static int __init MCBSP_init(void)
. F4 W4 S, |) j1 M$ M; w{
( t; E2 w* R5 l( @$ t6 ` int ret;
) Z. q- p! F' t" }4 s9 R( ?7 v. q unsigned int PINMUX1_REG_old;
3 p7 _3 R( ]" J" {% O; I unsigned int PINMUX18_REG_old;
, o7 x- j6 G7 y$ q; F$ h unsigned int PINMUX19_REG_old;0 Y4 g% I' g9 A
unsigned int temp;
( v) [4 U5 n: T. Y% k$ F if(MCBSP_MAJOR)+ W6 A) J& i; F0 q1 W( }$ L L
{/ |9 K* Y( @% k: _5 v
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' i* {# l- U! ] M) p3 J
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- \- E+ }+ G8 b6 G
}
; y& K) g5 ~+ i8 s$ p y0 T else9 ]3 \; B+ v& F) Z* }. ~
{9 D& Q' ]. f" H3 H0 a
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% X6 _3 l: B& o MCBSP_MAJOR=MAJOR(mcbsp_dev);/ M( r6 n. G% F& P' E6 ]: l1 f
}% u5 O. b1 z. V- ^+ m! [
, h# _; M1 T& r' B0 | if(ret<0)
. R2 m$ g# a7 l8 o8 }/ E7 T/ a {
0 u/ C( B: F% x4 E printk(KERN_ERR "register chrdev fail!");5 m+ ?9 ]# M! i& C* T
return -1;
' ^' V# H4 z. O& b: f" C& Y$ m4 I }5 v* v3 M8 e* c8 [1 X- W
3 }; W' N6 s9 u$ H mcbsp_cdev=cdev_alloc();
5 k, ~6 [; g+ @; j# }5 X % X G- K! \' c/ F: G, c4 Y% G
if(mcbsp_cdev!=NULL)- \# D- X8 y0 A8 [9 G5 n; ]- E
{4 O2 S6 Z1 m, T8 F9 G4 m3 T- ^' q
cdev_init(mcbsp_cdev,&mcbsp_fops);
. e( [! y+ o' l! H0 j. v mcbsp_cdev->ops=&mcbsp_fops;
# y- M' a! O6 s& Z8 Z6 e mcbsp_cdev->owner=THIS_MODULE;- u2 N$ f! L: O' h! P
$ C. B# j( O6 [: r if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! L5 @$ _% L! }" g7 i4 q* W8 E& Z printk(KERN_ERR "register cdev fail!");
0 X; }4 X5 c/ o! {2 T8 ]1 a* y else
% r% ^5 S/ q- k/ z/ V printk(KERN_ERR "register success!\n");
6 C# O! V c, ~3 Y6 f }
2 i( `4 D6 m; T. C" @ else, \% \9 ?+ K0 M; z
{
% K# |1 i5 L4 L# v) \ printk(KERN_ERR "register cdev err!");) Y5 Y( p1 l: a; x
return -1;
. ]+ \1 [+ ^7 }# w1 @ }
# o) N1 {' R" x! f) o% ]4 Z' ^ / t& ^% N+ N$ j+ j1 b8 A5 I
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 b# A6 y3 A: e
if(IS_ERR(mcbsp_class))! T* g1 c0 L2 v. ^
{0 t( Z* W3 [/ `; N n* o
printk(KERN_ERR "register class err!");2 {) C+ A3 R* Z
return -1;
) W, E3 v$ v0 P6 U5 f7 U }
0 F: c4 K6 V, ]4 Y device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( H9 {8 U8 N% G0 Z- U p
* g, U( U+ E6 ^; m5 E3 I //PSC
l# C& W3 u" [5 Q7 ? //add Enable MCBSP: o' a" H G* c
//test! G+ _- H' l+ e
temp = 0x80000003;
7 A: R) n: k7 i writel(temp, IO_ADDRESS(MDCTL15_ADDR));) s" |0 T, E4 r) r5 U; s. n: e
temp = 0x00000003;
. |- b) c* V& W+ t/ } writel(temp, IO_ADDRESS(PTCMD_ADDR));5 V l! b: V. v+ m- z
- y- \1 \! V& Q# |, y4 D temp = 0x001FF201;* E; X4 V$ B. R" u6 z. T
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 g& X6 v4 h; w, l
# U2 _# F% K0 Y# O( f //PINMUX . W9 U$ w3 m# `% I, z) L
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 r3 g% Q0 A9 L9 {6 X) u8 d
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' X0 _4 Z6 X$ @! C/ x" L I; Z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 _- s) d- U6 w5 d5 p: j writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! m+ ?) C* O" [& ?3 ~
}4 P2 B* Q& C+ a //SLEEP_EN,EPR,L138_SHK1,L138_RC
% [" }: r' e3 h A PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 0 K6 M% u& i3 u4 X% _4 m8 I( A5 [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
9 Q8 J) ^" ]8 O writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% w& d% o3 K6 A2 a% P( A9 n* c
0 ~ r. ~; z9 @1 T' H% w7 n1 d //RESETn,L138_SHK21 J' e4 H7 O' T2 S
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 2 A4 [, k" Z! _
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
+ Q/ o" |4 r0 |, Q% } writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& L# K; Z" {* T% @' C, D, e9 q; V9 H
0 f' E; E, M4 i- w& d! V6 u- l* i
- A* @) r, D2 k# v8 a6 H8 Z9 r1 d
//SPCR Register
+ q% x' I+ a' j //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ t4 b- E8 y1 A8 ] temp = 0x03000000;//(DLB=0)
6 H9 w* b4 v& J2 k8 t6 q/ G // temp = 0x03008000;//(DLB=1)) N2 N5 C! ` \+ J5 H( v- d
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 M1 H+ Y' b( M6 J0 h
temp = readl(IO_ADDRESS(SPCR_ADDR));) C' e: ~$ e6 w) S
printk("temp=%x\n",temp);/ x8 |/ {: V( s3 H) y$ ?( A
) _2 N0 c2 A3 D, l" q
//PCR Register
`# R, T9 Z" d \* n- U W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 _5 @: p( \, `* a // temp = 0x00000F0F;
! g; Y5 r# b- H" x temp = 0x00000B0F;1 Z( ~* ]& L' @- n% O8 R, @
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 6 i; R& O7 R, `- J" G& q# I7 ^
temp = readl(IO_ADDRESS(PCR_ADDR));' y* l. f- F$ m6 V
printk("temp=%x\n",temp);
, D5 \( T' D) C6 ` ~1 U+ x( M //SRGR Register
% M/ L w% V5 x! U //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- G4 `5 b$ q% B; Z
//temp = 0x301F000B;
* Y3 \: H; G( [ [# K: [" s writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
% x* r9 o2 P9 t3 b( Z; Y# f temp = readl(IO_ADDRESS(SRGR_ADDR));8 j0 E$ u% F) k; o0 C
printk("temp=%x\n",temp);" O. ~* w: y6 Y+ W) x/ x) U
//RCR: n4 }- g3 m j U/ ~4 V
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' I" F& T; a& I# ?4 w( j# \( Z6 P. h
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& N" `3 B) L& E/ r5 P
temp = 0x00440040;
* H0 V$ |7 O6 G7 Z; _3 `2 _. ^ writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ) I' r$ L# R. z1 h- p: n
temp = readl(IO_ADDRESS(RCR_ADDR));
$ f* K; N1 b1 t: s) Q printk("temp=%x\n",temp);
, I0 m" G9 n% x& | }% z //XCR9 t% v4 A" s5 t" h3 r- X
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) K# A* e* w, E" t: C! v# ^, R" ^
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) M& W* f" T& K+ X$ t8 `% j, G4 P
temp = 0x00440040;
. p1 c6 a4 W/ z" K* e' | writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
& n& w% j( t0 J) Y temp = readl(IO_ADDRESS(XCR_ADDR));
5 W) ^' L9 I7 L7 p' X* k printk("temp=%x\n",temp);, ` _- [/ u, ?( g
udelay(100);" f$ S1 K3 V" e; s. X0 I4 f. [
//SPCR Register9 b3 u2 D; V' D" E
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 r7 m+ g7 D' u& @# D temp = 0x03C10001; //DLB = 0 VS DLB = 1
( {! @# w" B7 p. }- v9 W3 R writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled4 E1 L5 f9 A$ n1 F
temp = readl(IO_ADDRESS(SPCR_ADDR));* e) Z- g( R& c/ P6 Q3 F9 t* }
printk("temp=%x\n",temp);
0 s; F$ _3 ]5 @4 V( _ A, O7 q udelay(100);. ^! a! H% X8 o* d+ `
4 [& t) Z$ W" l6 X. I
//set GPIO direction
1 v9 w7 o' B8 u6 @ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
1 K( Q& r2 ?0 O/ E" ~! T( R/ \ temp = temp | 0x00000100;//EPR----input
3 w' D1 w+ {2 O1 g* W% q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& e3 `" P5 \. J$ ] __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. w: {( g. K% n 3 _* Z7 f8 h2 @ v
return 0;
9 Z3 t7 D5 K5 G, t; ^0 n8 e" L}
& x! Z0 ]9 n( c+ Dstatic void __exit MCBSP_exit(void)3 u" o- ?6 w# ]( N2 ^+ u1 R8 d
{
5 U, `! R/ y6 ]0 ? printk("mcbsp chrdev exit!\n");# w* o4 x; G8 H3 d# y w5 c2 q
cdev_del(mcbsp_cdev);5 A# @4 z2 s5 k
unregister_chrdev_region(mcbsp_dev,count);7 U& d5 [" O1 e5 \$ p" e% D
device_destroy(mcbsp_class,mcbsp_dev);/ j& l- `' P% J8 z/ ~* O& i; a
class_destroy(mcbsp_class);
6 M% _7 {# |" P# q0 d: o! Y7 g% e}+ f& E R/ N- v& _* ?& Y' M6 G( y/ `% ]/ D
module_init(MCBSP_init);
# \4 P0 j% B# W6 K5 U) G/ z6 b% gmodule_exit(MCBSP_exit);
) n* e2 y4 `. m8 j* O/ w" x# t; C- P
8 V4 _8 G# N2 s* ^* hMODULE_LICENSE("GPL");' s& `+ L6 i& b8 {$ @ f- o
, C" y+ i+ C* ^: p+ {
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) M$ @( p( f* v9 {% D$ ^1 g
我的应用层的测试程序如下
/ o7 W3 g3 o3 [#include <stdio.h>5 e$ b' A) o9 N5 g
#include <string.h>
6 b/ R5 T6 |- w' ]#include <fcntl.h>+ t ]; U, Q2 y, Q& x' P
#include <unistd.h>
& `2 O& w* S* k$ F1 S0 Q2 Z. K#include <signal.h>+ W# L3 E( x, S( i" j# V6 M" w
#include <pthread.h> //线程' t4 r$ V6 w+ {' S$ F! R
#include <stdlib.h>4 U, Z4 O2 ?4 h3 U4 |
#include <pcap.h> //捕获网口数据
" {% w+ e( L. X1 @#include <semaphore.h> //信号
" z4 S' `6 M* W9 _3 K#include <sys/types.h> //消息对列' q4 W4 q( d S1 h( ?
#include <sys/ipc.h> //消息队列( r1 r+ ]* H2 \9 X5 w
#include <sys/msg.h> //消息队列/ t& n9 L' W, ?" ^- J
#include <sys/select.h>
' k m: r* L! u#include <sys/syscall.h>6 A& i9 {+ f; ^7 ?+ K5 x: \
#include <sys/stat.h>
# N- u8 b7 ?7 f( X! [& ~, a#include <sys/mman.h>
- T9 ^, I9 M) @( V; k$ E( x: U* y1 U#define msleep(x) usleep(1000*x)7 B2 o' N9 V D2 b
) I7 a- }% ^5 S9 H
int main()' s7 R2 ?4 b$ A0 b
{ 6 i3 [4 o. P, o, y" O1 M, m
//MCBSP,ARM与AMBE2000交互设备/ |1 o0 v5 P, g+ A
int fd;" \7 ~8 _! ?$ I$ R; k! G
unsigned short data_write = 0x5555;3 p' K8 g8 l; o5 H! M3 Z
unsigned short data_read = 0x00;
/ B' A3 g' a3 \1 M s; t% v fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" ~! K( R, |5 p& r! g
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ q8 n7 K1 [0 r, u, Q5 m
+ ?& M: ?* r; ^! i6 w2 R( N7 N. n" F% C) w if(fd < 0)
$ G1 ~9 j1 M0 g4 O {! z, M9 Q; O" S A& |
perror("open failed\n");! i, d5 \: j, s# c
return -1;2 N1 C% O% U K9 V/ Q2 s: U
}
9 f4 f6 X: V! u8 v/ O % I5 E2 k2 K* K- o6 V
while(1)* ^& \% f8 o# W0 i' m% G3 p4 X
{' K U' T/ e$ |9 ^$ q
* |8 J a. s A) o. b( @ //AMBE2000每次读写是24个字为一帧) e/ _ y0 `( F- Q+ `9 w
//写数据时将数据在底层存储起来,等到中断的时候再发送
. W/ V% ?& M! Z7 a; ?9 J7 d //AMBE2000输入数据是以0x13EC开头的* e4 a, p2 K0 V# w P" U
write(fd,&data_write,sizeof(unsigned short));6 ?9 L( t" V* n1 B1 d O L9 B. \
% G% s h/ B) M7 M' X8 w //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 . g* h3 W& T2 C6 \2 F1 p+ b* w0 T
read(fd,&data_read,sizeof(unsigned short));8 {$ }3 P' F$ V) e
$ s8 G, O5 n. P9 w5 L
if(data_read == 0x13Ec)
5 [8 p) W6 n6 a* s/ f {
2 \# v$ @3 E; Z- W) r+ g* r1 w4 e
6 w3 t. E& B. [ printf("data_read = %x\n",data_read);% E: H3 q: @$ K1 D o
}
7 U; e/ T% \, o% Z5 w9 L . R3 c% J' G2 S7 |: x3 ~
msleep(10);
8 V0 t5 E! t8 m; k& A- Z( Q
: J3 n M, S0 ~. a7 P( q6 i0 H /*# A7 m! f- w' ?
ioctl(fd,1);
j5 M0 @( E1 V1 X4 D7 a sleep(1);8 F, l8 n; E! T" e% B- s
ioctl(fd,0);
. Q& d$ Q- \; x% F/ ^ sleep(1);1 C! X$ ?/ t% f1 z/ s
*/
0 q7 Y4 X/ w S% \+ z$ ?! d* l } 7 O/ J* r8 ^+ @$ _+ R( \7 E1 h8 v
return 0;# e: ~+ ^* ~: j! L! v0 W5 i0 Z, C, h
0 N' d6 G2 A6 H+ p R; W. L}
# i' M8 g5 l/ t7 v! b
8 G4 m9 O- r# S8 ^. T4 i多谢各位指教,谢谢! 急
# z9 f1 A. w$ {! p+ R: T9 q5 x; A
0 H! f* }4 ?* @9 N6 c/ Q" j6 H- ]; N' Q; y; I5 ?3 c5 G$ e
% C G g) x' z& ]$ J
3 t; M# N1 a3 b" C8 D5 z- y2 D |
|