|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
F# _ B! a# G% q/*
4 w1 Y6 X9 x" H4 F, \2 s * Copyright (C) 2009 Texas Instruments Inc
! y, F) x, o& H+ K/ X W$ u *
& h5 x3 [4 ?( r * This program is free software; you can redistribute it and/or modify
0 Z4 M- n' I+ u, ?& q. G * it under the terms of the GNU General Public License as published by
% C6 K a' G S7 P * the Free Software Foundation; either version 2 of the License, or. E1 ^1 ?6 n+ h# i
* (at your option)any later version.; h. Q, I. K8 X$ ]* p$ Z' |6 E
*
w- ~. s3 b# X0 y9 i * This program is distributed in the hope that it will be useful,/ e3 y/ d. h9 }6 Y
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8 J; M) `( @; l J; x' ^; D% _& O" R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 E" B' u& T* k* k * GNU General Public License for more details.4 `/ C# x2 o5 m
*
9 S7 K8 J5 I. Q; K4 r * You should have received a copy of the GNU General Public License
% }& E/ o; U8 ^2 @) ]" } * along with this program; if not, write to the Free Software
$ v4 g3 Z& C& Y$ O+ p- K \3 y/ e" t * Foundati n# @+ l0 \1 a& L
*/! L! z' H6 p& n: \
#include <linux/module.h>
, s- t- w9 U, V7 f2 L#include <linux/init.h>2 Q6 U! g+ h) n" ~* s5 ?6 R
#include <linux/errno.h>
9 {5 r; M( D9 g5 v#include <linux/types.h>. _( c, ?1 f$ C. }/ A
#include <linux/interrupt.h>
0 n6 ~/ O/ r8 I* I1 Z#include <linux/io.h>
$ a6 C: ^8 x- I$ J#include <linux/sysctl.h>
9 `8 F4 K6 c/ P* ?: r#include <linux/mm.h>+ P7 g6 e0 u/ S$ N6 O0 B3 l P: m4 r
#include <linux/delay.h>8 e7 K3 t' W% x E7 c* P4 N
#include<linux/kernel.h>
3 ^& q1 `- D l) s3 r#include<linux/fs.h>
" R7 ]3 q. @) `$ S8 q#include<linux/ioctl.h>
; p! ~& D/ W% z- [" l3 P0 A#include<linux/cdev.h>3 ~' C1 _: Y/ v$ q
#include<linux/kdev_t.h>( W3 `, Z% S- X5 R" X. f
#include<linux/gpio.h>4 P$ y1 V& x# w& [2 V0 W
#include <mach/hardware.h>% Y4 A& b ]2 l% } ]! S1 u
#include <mach/irqs.h>" I4 x: _! k a3 Z0 x3 G
# Y7 p* j R! z. c#include <asm/mach-types.h>7 Q) G! B0 }: N, H& s
#include <asm/mach/arch.h>
! V' l9 R. ~/ p4 ]; }#include <mach/da8xx.h>2 {" A F9 ^. l6 H% p
#define SYSCFG_BASE 0x01c14000
7 M8 y' e, t6 } c9 p+ v) H#define PINMUX1_OFFSET 0x124 4 R7 {( x0 N; R' h5 E( j
#define PINMUX18_OFFSET 0x168 ! Z8 s6 O3 |- R0 _- h7 s
#define PINMUX19_OFFSET 0x16c8 W% l2 a7 ~( j }' g, N0 G7 r
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR3 r) M6 x, Q6 x6 W; [
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR" ~" x4 Q. R9 L& b9 K- O
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
Y% ]* F* H3 C: c: g9 K( s#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR8 W- I- k$ w6 @- \) T! o- D( N
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
3 h$ J" ~; Z4 y0 q / }) \7 J* D7 {, ~
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR$ I$ ?" U" C: @5 P. f
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
2 r2 N* {% g* a0 s( L//PSC1 s' F# y# E J# ^5 L
#define PTCMD_ADDR 0x01E27120
6 u3 _0 _( _7 g1 r4 H8 ~# `#define MDCTL15_ADDR 0x01E27A3C
- x2 ?6 r% y6 F" Z- w; f#define PDCTL1_ADDR 0x01E27304
+ C( g* B2 ]7 {- s7 @+ C1 e//GPIO8 direction, ^; [- }9 _) a7 B0 z/ }/ D% S* x
#define GPIO8_DIRECT 0x01E260B0! h1 F2 }0 b, n
#define GPIO8_OUT 0x01E260B4
! H5 S& g6 R n& A# `' p6 K7 y1 V#define GPIO8_IN 0x01E260C0
# f$ W6 M5 \. V8 h8 N9 |8 t7 B- c/ Y, ?2 F m+ k, k: \
//#define MCBSP1_RINT 99
; ^, W7 }# K+ E/ R8 U//#define MCBSP1_XINT 100 $ t2 y6 L% ^; k5 {
static int MCBSP_MAJOR=239;
" ?$ k4 ?6 Q9 l7 J+ n: Wstatic int MCBSP_MINOR=0;
' p. S& ^3 `5 q; Tstatic int count =1;: F! W2 p2 W. m% X
$ `3 t0 P. _5 J' c5 e
#define MCBSP_NAME "MCBSP-device"2 J* V# ^" j/ _0 E" ]7 }
/ c' D" r' S1 X5 J5 B1 s
static struct cdev *mcbsp_cdev;
9 ^2 q: s! r8 x5 j# a+ a6 @& J1 Nstatic struct class *mcbsp_class;* v [7 ?( z4 Q3 M" N- }
static dev_t mcbsp_dev;8 a: C( r1 t7 s- f3 N% y% |
unsigned int DRR_data;
9 S" p. m" O5 I& _& x+ Xunsigned int DXR_data;
{- b7 R3 l' }! I2 t2 Kstatic int mcbsp_open(struct inode *inode,struct file *file)
$ a, `! e3 C6 u6 O$ m( _{
1 P, p6 `, ^( {2 P0 a$ N1 B- B5 T 7 ?, K% @2 U2 p& W: x
//interrupt enable,initialized
8 h* q7 a D4 d( _4 E- j unsigned int temp;$ A; T3 U7 X- t* w" s9 A) z. T
//SLEEP_EN(GPIO8[10])---0
2 Y/ c$ D& U2 Q, Q- X/ t temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# O9 t9 h& h& n2 V# C: D temp=temp&(~0x00000400);7 q+ K$ P) }: e+ G5 Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" J, G, m9 ^; d( D7 `0 @, w //RESETn(GPIO8[8])----0----14 ?: T/ r$ d2 v; A) d6 d+ h* w9 s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 Q1 {6 D; E" e* L4 y temp=temp&(~0x00000100);, b2 h* M' N% O% e: S+ x3 H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. @) N+ m' K( X+ P udelay(100);' n7 s* z$ Q, Y$ ~3 P' v. K( o
temp=temp| 0x00000100;
2 d- N; i& r4 v, b1 B& Z5 ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) y( } q q1 k5 \" `
udelay(100);4 f8 W v W. R) v1 ~
printk("open success!\n");
( x: B6 ^, {' M/ ^ return 0;
% o% k8 h- {+ o$ A! H) d1 ?}
) s) g* |) Q/ x d* T5 q
" O- p% e6 D$ estatic int mcbsp_release(struct inode *inode,struct file *file)& [& ?8 j/ Q: C. {( I
{
/ V8 x% N y; c; J% K9 i printk("release success!\n");
\+ C2 j5 w. A9 Q9 n) L; B return 0;8 H5 S" r0 l( z6 J8 E/ I
}1 @+ I% y; H3 L" I3 n/ i4 w% ]
; y- s# b3 N% d, d6 `8 ^8 `: A
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; c0 e) D& ]( w5 Z2 B8 C{% ]/ G6 X; n4 G/ K: [
copy_from_user(&DXR_data,buf,len);+ y; `5 b( E# f" s2 j7 R" S& B, R
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
4 }: ]% b) z, P: t# Z+ | return 0;. ]% n) n6 K1 e$ Y; K5 V
3 R9 h5 }8 R: d% C5 W; B. N} D' J5 o$ ~; u$ E5 G1 I" ?
5 X2 `, f5 @! u* J& G# z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 M2 u+ n5 e! z. M4 b0 U2 @{ - N' t- @# ]6 d
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));1 G% s3 R4 }# u) A
copy_to_user(buf,&DRR_data,len); # Z* w: c& t7 p
return 0;* { m/ S8 h) l$ D9 _
}+ i. U$ `: [" u* X+ F
8 S, { y a9 a+ y7 i% t" j
# g2 T( C" d9 v4 X) j# F* s5 `. D
static struct file_operations mcbsp_fops=
& [. L5 v& b9 M$ b4 e2 j{5 x1 b v |) J
.owner=THIS_MODULE,
0 U& o! E) X. A .open=mcbsp_open,
. ]* @4 I7 a+ Z/ B9 |& v8 I* \ .release=mcbsp_release,
, Y2 l0 K0 Q; c# B& j# X .write=mcbsp_write,
& g" n" b$ [. [3 M .read=mcbsp_read, O; H2 K* P$ v$ ^# H
};
2 G6 b6 C- D" a8 {" }static int __init MCBSP_init(void)8 B R# a" y: q9 w) e6 K) V3 U7 D: ~
{; O# n c$ S0 ?* e7 L% n" V
int ret;- q% ]! I- I: V) v$ D
unsigned int PINMUX1_REG_old;
2 z9 K& j7 h* _ unsigned int PINMUX18_REG_old;8 [- w, }) v6 X" `' ]
unsigned int PINMUX19_REG_old;
! c* r$ j; {0 }3 f; s( v: X X unsigned int temp;
$ W: ~+ F) r5 J X if(MCBSP_MAJOR)
, `; m- X! T1 F, p& B {
4 C* W; c& l7 `7 X0 {1 J mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, A. z4 |' d3 |$ U+ P g+ a2 X ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ q: b( x$ K7 ~# k% \. U
}+ X# {; a6 W% s' G; E/ w
else
! E& T0 T7 x) z. \/ }8 s( F* x {
H0 J1 w; H+ e$ ]9 |* T8 u8 ^& T ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! K% O g9 s4 C" D- A MCBSP_MAJOR=MAJOR(mcbsp_dev);
# r1 m/ f3 a* K# g! F! m: M3 o' ` }! }! _7 A6 c/ E
- ~) ^# o+ s$ p$ a if(ret<0)! P5 E, O" [7 {! l3 M% o6 b3 w5 R
{ a4 X8 G* I8 ~+ ~& V
printk(KERN_ERR "register chrdev fail!");
6 m5 {8 [8 Q7 y, l: \, @+ N0 ? return -1;
3 K% ~2 O9 f8 [' E) f. _ }" X# N: G, Z' @ F8 J- Z
# C( p! I; V6 `( F/ \1 A
mcbsp_cdev=cdev_alloc();
7 l8 C+ J% @3 {& i9 d$ P6 U1 }
+ C% _! d. _$ A. O6 {% d if(mcbsp_cdev!=NULL)
% N, F# E6 B. O: f {
: U. |( x! p% |& T cdev_init(mcbsp_cdev,&mcbsp_fops);
6 v9 b) e& e1 h8 g; Q7 i1 h% d- N0 n mcbsp_cdev->ops=&mcbsp_fops;$ e4 c$ Y- g4 j! D$ B+ e
mcbsp_cdev->owner=THIS_MODULE;
8 P# `' k$ [* Y! B) m
8 `" r! J7 T. N! x$ }& m if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 D z! x& F [& _* Q" {
printk(KERN_ERR "register cdev fail!");8 t9 o6 B( y- b
else
1 c' I3 k7 G3 N8 r" Q# ?, J printk(KERN_ERR "register success!\n");1 {/ R+ t5 S4 _. V& @# m- h
}5 ^; A7 g* r) Y- v
else4 f+ q ~" J: v9 ^* H
{9 o! |& t! q# @; r! j
printk(KERN_ERR "register cdev err!");' V) p% H. s2 B; Q9 ^0 `
return -1;& o* M0 X+ E: o/ N& i, u( h- V, s- {
}# k; D/ G4 o/ r; d5 @( M, C8 y
, {5 ? B. K% h) t } L
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, |6 t; a/ D! n* Q+ b& W H
if(IS_ERR(mcbsp_class))6 }: e% Y) f p+ [
{
* I# j/ I& ?- N: ~' W/ j. } printk(KERN_ERR "register class err!");
2 f2 C5 M. W' V return -1;
1 W3 p1 _. ]% [5 q* a" e' V }
% r& R( B: ?4 m+ s device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 L# |; F {' U5 ^
" ^7 V+ D9 m8 Z8 Z //PSC6 J" X) i0 z' x% \
//add Enable MCBSP0 W) F$ ?/ h6 s; Y
//test
! i* D+ J7 q6 b# _3 c5 q$ Y9 A temp = 0x80000003;& p" N7 v0 A# A7 p- Q* U5 C
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ M( j% c) J* ~& Y( z( p temp = 0x00000003;+ T4 W" k+ Y) e. y# B( X i7 ~/ K
writel(temp, IO_ADDRESS(PTCMD_ADDR));! x9 M/ B2 J) t7 b
* k _. `. n4 |% z temp = 0x001FF201;* @: Q2 o' W1 l( R
writel(temp, IO_ADDRESS(PDCTL1_ADDR));* C) a+ J; g6 t. B
" F& R! K( h" G' B, {$ L& m
//PINMUX
) O* ]+ b- _: u' q' c, N2 | //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ }# |; [$ Q* _7 q# V
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ Y9 i1 r1 t. W( \ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
/ e0 }0 V4 \7 P3 \+ Z( w writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' k& y/ T5 r$ A9 ~- i2 B
1 X, }! e) A1 S2 O# L, Q0 Z' \" x1 H0 i6 a //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ g% b: D" z; ~3 X! u' |. a* v PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 C3 s( L- j! x& E0 g0 c
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
9 n7 K9 e" D4 g- }' h writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# r* {& }7 w% u# C- r2 ~
2 {7 J) X1 m# A
//RESETn,L138_SHK2
. z" U' m; E: R( L PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); , P$ X5 d/ U. G, {) U2 l; s
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
: ]& y( C0 \( x$ J3 } writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 a8 x9 ]. T$ a+ E, }6 t' |7 `$ {8 q $ ?2 z$ \5 K0 ?
0 l8 [1 R0 M7 a' p8 j* g
//SPCR Register
; |* ^/ S4 M' E6 c //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset% _& @& @* H. Q+ h$ u
temp = 0x03000000;//(DLB=0). x4 ?1 V' \8 z' O
// temp = 0x03008000;//(DLB=1)6 A0 q# z3 J* z2 z8 y* y# q4 S; A
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset$ y' t6 f" i% q M% i1 G' N
temp = readl(IO_ADDRESS(SPCR_ADDR));
/ _- L$ i2 x- s3 C printk("temp=%x\n",temp);# j& c& D( H. Z: P$ |
9 R$ q) _0 r& R
//PCR Register4 C; L5 V& z a2 F1 ^- r
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 O- R. R5 @8 a: X
// temp = 0x00000F0F;
, G, e+ u9 Q/ u) t& U9 z; E temp = 0x00000B0F;; `0 R: h8 S/ h
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 3 R# D$ W( J" E" }- a6 X
temp = readl(IO_ADDRESS(PCR_ADDR));
" M$ S4 P% i& ~- B6 J printk("temp=%x\n",temp);
/ V- u3 _3 F$ M. w2 o8 {5 x //SRGR Register
/ B. Q2 w3 ?/ [7 }0 O //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==111 l0 m# U2 t- a5 Y$ U# n) |
//temp = 0x301F000B;
. m9 q9 q$ H& A' f! x: V: S6 m writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
: d8 v) r6 u- @& L& Y temp = readl(IO_ADDRESS(SRGR_ADDR));; |8 H8 X% n! ~3 l0 N; n9 C; o
printk("temp=%x\n",temp);
2 D' c- t' t8 E5 Y" w' s //RCR" ?; W7 M8 c% r% M
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 k' |5 o- P% \3 |$ C //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, f+ c! d) D& I- |& `4 t8 o6 r8 @5 b
temp = 0x00440040;
a( G9 z# K# V& x( G' y% d writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
1 V9 C* |( L( l. k' @ temp = readl(IO_ADDRESS(RCR_ADDR));6 ]9 v0 m/ S# |8 V
printk("temp=%x\n",temp);& f. T7 m+ ~4 J3 a- Z
//XCR
6 ~& } ]7 q- K {& w. f //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, J; r8 R, g L* b ^4 j //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" S3 Z+ j# z8 n# t temp = 0x00440040;( ~ o2 D3 g1 f& E; b3 q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. c# U$ j. G) L, k' P8 x ]! G temp = readl(IO_ADDRESS(XCR_ADDR));7 ^; h1 E: \" ?3 K
printk("temp=%x\n",temp);# k) [! p7 |& y! h' g* e w9 o
udelay(100);
: {$ b8 V# n2 k$ r //SPCR Register6 r% i% E: s4 E, z1 T+ R3 r' Y
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-14 {% F9 u5 I5 p/ [% \# N+ z4 E
temp = 0x03C10001; //DLB = 0 VS DLB = 1
1 x% w8 n2 ^: ]; P% m- d G) w" y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled# ?3 W' U5 e4 v; S& n
temp = readl(IO_ADDRESS(SPCR_ADDR));& M! B) d3 o7 z8 z+ E* w
printk("temp=%x\n",temp);; s( ]4 N5 `7 E: A$ L: y# H
udelay(100);
3 W1 @0 l' A# u2 w# Y8 }1 r: R
% d$ T/ B# p/ b6 T8 O! p2 j! z4 g //set GPIO direction
8 \' O/ Z/ n) D( w. j( i% T) m) s temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; \ s3 x: _1 N) ]9 d
temp = temp | 0x00000100;//EPR----input+ Z% ^6 r( r, y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) a. f/ l H: D! E __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 b! o0 @: k# w' Y+ _4 k& q3 l
4 v4 X7 c2 _0 N/ R) y4 c, Q6 X, \
return 0;' G7 H! W. R }5 E1 f
}- w3 ` T6 s/ W' V* o+ F! G y+ B9 r
static void __exit MCBSP_exit(void)6 J, N/ k; c7 [* _4 O3 P
{
! P7 I& u6 w' e8 P printk("mcbsp chrdev exit!\n");
" ?1 U$ z: Y) ?' W n cdev_del(mcbsp_cdev);
- z, [0 f/ N6 ?9 h# R' h unregister_chrdev_region(mcbsp_dev,count);
3 y& q( N! j& w! h device_destroy(mcbsp_class,mcbsp_dev);" D6 p$ U p1 S7 ^6 u6 h5 R
class_destroy(mcbsp_class);4 o9 e# @ W. u; c4 P" y3 { M) C8 p
}
7 e( v2 _* Q" k5 O3 s; H+ [1 Nmodule_init(MCBSP_init);8 F8 C" z; H" v# L# f/ S/ O6 K
module_exit(MCBSP_exit); D o! k$ c8 a$ u- x7 _" C
" J7 |" V/ x2 F0 H. r" gMODULE_LICENSE("GPL");- Y' }0 V% D: \& |( n4 |; i
1 u. m; w& _5 I+ I0 W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ \+ s: c! ^! |' F% k
我的应用层的测试程序如下3 [( ~1 X+ R, Y4 y/ m+ T
#include <stdio.h>* O W1 p5 Q) t L+ r
#include <string.h>7 T! C/ Z" N% p+ a& ^! N
#include <fcntl.h>/ M( M% t5 [6 M4 C0 v# t0 k
#include <unistd.h>
* F3 y% A4 M8 u8 \( W. p#include <signal.h>: s$ `* Z- z; ?- Q
#include <pthread.h> //线程
" m5 K0 n+ }3 B7 h6 H#include <stdlib.h>
; F2 A* a9 E2 b, Z#include <pcap.h> //捕获网口数据
" i' e6 k g) \7 e, N$ M+ f#include <semaphore.h> //信号
; {2 h' B" O4 e- [% E0 C2 u% c#include <sys/types.h> //消息对列
( b8 h: C& Q$ G# r+ P r- B#include <sys/ipc.h> //消息队列
, ]# K Q$ @4 k8 |; A) a3 A#include <sys/msg.h> //消息队列, r! s0 h' l% Q* v$ I; W1 z4 z
#include <sys/select.h>5 b5 \ H* @. J; u" [2 J
#include <sys/syscall.h>
# {4 y5 K+ J1 U# E9 s' `#include <sys/stat.h>2 R5 K% j6 A) Q+ F1 V7 v8 P2 J
#include <sys/mman.h>
2 _ e7 J2 y. z1 ]! R8 a8 l#define msleep(x) usleep(1000*x). O) X( i+ {- e2 S* m0 Z6 q
$ _1 s; \" ]$ ^4 x3 W4 ?9 g$ uint main()9 q( O' C- f2 W
{
% ~2 P" p8 W- `/ _& }$ ? //MCBSP,ARM与AMBE2000交互设备! q" H+ L" c. }% z
int fd;( ~* Y s4 I, a- ^5 B
unsigned short data_write = 0x5555;$ L5 b# p: s! M; P3 D
unsigned short data_read = 0x00;
* {) e( F! N% l1 s fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" q! ?$ D- J( K // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& @' J( P' K, {: ~$ c
, W1 H# o4 x9 \- R* l
if(fd < 0)/ N/ r& l: K/ g$ I3 J
{( c- t7 T; m2 Z h3 h
perror("open failed\n");
6 I4 w9 y4 H& b return -1;
3 q+ j9 r6 w5 m- I% E6 O, o9 e }4 i& N" D2 W% _& B
0 K; ?/ s% Z9 K
while(1)6 \# a; x, q. e! G3 K0 p
{( m: m; ]9 s* H5 O) [$ i/ ?
) B% T# D N) P2 t# D! _
//AMBE2000每次读写是24个字为一帧, V# P! U7 o3 a* ^
//写数据时将数据在底层存储起来,等到中断的时候再发送
, K& I0 {# l$ x( t: T$ M3 d //AMBE2000输入数据是以0x13EC开头的" M7 z' ^9 r6 H! v! }9 O( C/ m
write(fd,&data_write,sizeof(unsigned short));
8 z6 X( f) v4 Z4 P: Y, o7 k2 v% {
7 M* ?! M& D9 ~# i% N2 H //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 4 j. @9 Y) q* l i% N7 E8 i8 l
read(fd,&data_read,sizeof(unsigned short));4 Y; _. g& d1 h$ p. |
# ^" [8 Z. E u8 d: Q; L if(data_read == 0x13Ec)" s: z7 L5 d. U0 T6 W
{
* \2 q# C( ]# o
7 C* \. W( f l3 d: d# u printf("data_read = %x\n",data_read);
: W$ C. H$ W( @4 E2 t6 o }
0 b [, {( H! ~5 x$ i( [9 W ( k* J) K) D' m8 ?; f# Y: @6 U
msleep(10);6 {9 O5 w: Z$ F
" t+ \: T& z& K) ~2 M7 o9 {
/*
1 h. o, ^3 v: B6 B* a! h ioctl(fd,1);
' }, [# B) a, C sleep(1);
/ d" N8 F; F( i5 p- j+ X p/ K ioctl(fd,0);
5 g) @7 s9 \& n# a) o2 U2 F sleep(1);
2 H% d- r* ?' x */
) {5 W2 O- k2 e; L } W0 T5 w# Z" l) E
return 0;
$ o' a9 F3 ^( n& R6 g! U
6 x' X9 [4 W$ c! y7 e; H}5 h! c/ f% U/ U* {1 l0 X3 y
) a1 O' x/ h2 B7 m1 ~. e8 K# I) B多谢各位指教,谢谢! 急' Q1 ~4 v$ ^- B- K! R
) h4 ^+ N+ w! O ?/ f9 d
/ p3 m/ }9 }. N4 e0 t8 g8 U, \. {) M0 _# X& C, x# m
+ q# ~6 z) I3 f( N1 i, _/ v. v
: [8 d& ^0 v' _8 q) O0 F1 K
|
|