|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! R. t8 G g4 s
/*
; _% H- S. k& |% c* K8 J * Copyright (C) 2009 Texas Instruments Inc- Q( k6 a1 Z9 a) [2 i Y3 E+ z" a9 T
*7 j" r+ K# ~7 E6 f7 V) r; _
* This program is free software; you can redistribute it and/or modify
[ E* A' X; Y" M * it under the terms of the GNU General Public License as published by
1 I$ z, p- I" d3 Y& J, f6 V* Q9 t- m * the Free Software Foundation; either version 2 of the License, or
* i: @7 e$ C7 ^, U * (at your option)any later version., O: X: c1 ?9 Q# N" n3 Q
*4 I; ]# K, |" u2 w
* This program is distributed in the hope that it will be useful,
+ x' p) j6 F! g7 T' Q! d$ b% o * but WITHOUT ANY WARRANTY; without even the implied warranty of, P" i2 g: `% D5 g; o
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ X. @; ^% V( t) K/ T
* GNU General Public License for more details.
4 d$ t- Y: S/ G- t2 T/ \7 p0 x *# h2 F6 C2 O' ~0 ^8 ^3 L" ^
* You should have received a copy of the GNU General Public License
n2 d0 p/ H* o# m6 r% O * along with this program; if not, write to the Free Software
. l1 a& V+ D1 q/ |! p7 C5 A * Foundati
* \$ F, t+ V- r& o& \& B- x- Q*/
0 L( w/ V- ]9 p M4 L#include <linux/module.h>1 N- R) g3 g" E* G. p
#include <linux/init.h>7 u8 u* E+ p( c, R* f' r) @5 a* d3 |% Z
#include <linux/errno.h>! e& ]( B+ [( F% q/ A( g
#include <linux/types.h>0 m5 M* O" z7 l1 o
#include <linux/interrupt.h>( [; i/ i- F) ^3 x' B
#include <linux/io.h>
4 f% \3 F0 q m+ j( i#include <linux/sysctl.h>3 f- T) B: S3 o: o' L1 D
#include <linux/mm.h>: {+ i# l3 T# v- Z- o- J& K! |
#include <linux/delay.h>
8 z8 f& ]" ]3 [$ D& y" b: [& L#include<linux/kernel.h>
( w4 w# c; W) E5 b9 Y#include<linux/fs.h>2 l4 S9 @" L; J0 K9 [" |& {
#include<linux/ioctl.h>
3 Q! [6 ~# h) a( c#include<linux/cdev.h>. I- k' z2 r* g5 v; B& d, }
#include<linux/kdev_t.h>$ D/ m1 P/ M7 |+ x3 U! _
#include<linux/gpio.h>& S+ s1 h1 B" a, S1 z2 w
#include <mach/hardware.h>0 M& R" b( x0 M B9 e
#include <mach/irqs.h>9 Q; Z) t# E, J) z: a! [1 V
0 z1 S8 }% j/ p) W$ c1 S#include <asm/mach-types.h>
, J. {% h- @/ b2 \#include <asm/mach/arch.h>( q, \4 g. W; `4 P4 D
#include <mach/da8xx.h>
' j1 m3 A+ T7 p0 I& M#define SYSCFG_BASE 0x01c14000 v) b7 g/ M/ z: m5 S% z! K, @# T
#define PINMUX1_OFFSET 0x124
3 t( Y! B$ R' b; ~2 E#define PINMUX18_OFFSET 0x168 , S6 P, a8 J9 S( a) U3 K9 W4 ^% a
#define PINMUX19_OFFSET 0x16c. M+ n5 m3 N" V9 H+ |7 [
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
" }. s1 [2 B1 k8 Z ~' F#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
! R6 z) m) \, S$ p& [, H: E#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
! U$ W! M3 [3 g. E, d6 K. q#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% a; D* ~3 D$ I2 ~#define PCR_ADDR 0x01D11024 //MCBSP1_PCR# D9 O- E$ b; ?5 k# ]& K4 W
; P; K7 j. |, q8 J# S9 m: M
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
4 o5 d; C2 }- s. x$ x2 [* S. \ F#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 ~+ v$ p2 R' Z9 k) n; Q% Z6 v
//PSC! X$ P: I# ]" R5 t$ Q
#define PTCMD_ADDR 0x01E27120 . t8 q5 T6 a) c, J6 { ^1 t
#define MDCTL15_ADDR 0x01E27A3C
% A" @% r# [* e. q; c9 ~4 ^0 T#define PDCTL1_ADDR 0x01E27304
P; |+ F' w% S3 p% G# M//GPIO8 direction
1 F4 l2 J9 X' f1 x+ D#define GPIO8_DIRECT 0x01E260B0
' q0 s+ v+ z5 {5 t: n' Z7 l3 Z#define GPIO8_OUT 0x01E260B4; y6 `8 p8 P8 D9 v' {/ T# j
#define GPIO8_IN 0x01E260C0
5 V7 S/ }" `/ B% I2 r! H* p+ U5 W: V# \2 N
//#define MCBSP1_RINT 99
# y" D6 f9 l/ G& c//#define MCBSP1_XINT 100
3 \, y2 N4 J7 }static int MCBSP_MAJOR=239;8 O1 U6 z( B& z2 d$ f) f3 r
static int MCBSP_MINOR=0;
2 n. H/ S2 S- p) Ystatic int count =1; J$ i- h9 n5 k% b6 M
. M E3 _0 ^ n# E2 R) M; }& S/ B* a#define MCBSP_NAME "MCBSP-device"( x: W+ ~; n0 V0 l
' S4 w% A% G7 M9 y* x$ E
static struct cdev *mcbsp_cdev;
8 v' n, ]- u5 d' Ystatic struct class *mcbsp_class;
+ y3 H) s. k: Wstatic dev_t mcbsp_dev;
' c3 c/ K1 E: L. P9 vunsigned int DRR_data;
* L9 ]+ P+ d# p. R. D' {unsigned int DXR_data;# h- _" Y% }4 K/ S+ k8 [( S
static int mcbsp_open(struct inode *inode,struct file *file)
1 T$ N7 L( W5 t: w. ~. L( H8 o' g{8 t$ _" v2 g7 g
4 L+ Q5 ]& E$ {
//interrupt enable,initialized1 Z, H4 ^* D+ T- ^3 E
unsigned int temp;
3 J* w8 d' `+ z4 ]. J# }% F* H //SLEEP_EN(GPIO8[10])---0
4 `4 n) O3 @- V8 R2 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 f- V/ P' h8 q9 Y& K& y. `
temp=temp&(~0x00000400);
' K ?/ o" e0 x W __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' J$ I/ s0 _* t6 H' j Z( \# j( G# c
//RESETn(GPIO8[8])----0----1' J# c- [, O& q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 N g% V/ T5 k) D
temp=temp&(~0x00000100);; E2 a5 A/ D# y$ A
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) G \" J7 x4 z- i3 C
udelay(100);. y0 q) ^, J, H: d {
temp=temp| 0x00000100;( L. J: m& f! |" U: Q t6 a( v3 I6 T$ R
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& A$ O+ W' |6 e7 S! E) p% U) r
udelay(100);
: T+ l$ Y. x# I$ j printk("open success!\n");
5 v' B8 ?8 _6 i' Z' S return 0;
1 Y6 [; A2 k7 ~2 l7 S8 Z! u}' @! r9 u- c. y. `. z. k. n4 i% q4 b
9 J8 v% W/ E( Z% H+ x& ^' u0 hstatic int mcbsp_release(struct inode *inode,struct file *file)* `5 ], T0 W* y0 M* C! j
{8 i- V' W: n9 j9 e0 u# N
printk("release success!\n");
$ w: f* F- E/ A( r+ G P( M0 ?. D3 j return 0;2 P: c+ K: X; W) z0 m) v- Z* f2 ]
}) ]/ a, x; F! L2 v# R
' O1 H9 G/ c% U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 ~, v2 U& V( ^1 [{ o2 s& q# ^+ g% q# \2 z0 w
copy_from_user(&DXR_data,buf,len);
% }' g) y( `) E9 ~1 H5 W iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); `) O J( l0 |; O5 o6 D" ~
return 0; v! W: H8 u8 B9 P" ^- c* R0 Y
2 o+ v3 b/ `4 k& J) f0 }' l
}4 X2 b0 z6 s, e5 A7 G; T% R
- W4 P1 M0 v; u3 s( ^' w6 z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) B) {# x0 I' v7 b' D
{
2 Q. n; E$ N4 d9 G; s6 w n1 W6 Q0 W DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ |* b3 C7 V2 l& ?- o1 C
copy_to_user(buf,&DRR_data,len); # E( o o6 ]" h& K4 p
return 0;
# f% G4 b* n) H. U4 P6 L% N( i}- _; X" n# c4 O7 u: u" D
+ m" o$ D! t' R0 m/ D4 H$ n* q
0 d6 ], ]. t$ I' Y9 fstatic struct file_operations mcbsp_fops=
7 \9 M2 `4 N5 @, N. H{
e0 y8 p$ R7 C* ?9 a6 v1 T3 @' j! } .owner=THIS_MODULE,& i5 C# b. w0 q1 K8 Z: u5 S& b
.open=mcbsp_open,
. b- C* |6 x: t, c2 y; F .release=mcbsp_release,3 N7 u2 B5 @+ C0 w' U
.write=mcbsp_write,
6 z/ j& T/ M* J. x m. H; l$ L8 e .read=mcbsp_read,
2 Q' o+ n8 n% G) @6 v) f};
- g$ e$ c- X6 u# T5 Dstatic int __init MCBSP_init(void)
. J; G) e c, t1 |{
" M$ f( r8 j' C int ret;' F2 ~! D5 \1 r F) K X
unsigned int PINMUX1_REG_old;3 U3 Z3 U5 f9 ^ N; W$ r9 `% B; k
unsigned int PINMUX18_REG_old;0 {- a1 B: S( Z! \
unsigned int PINMUX19_REG_old;% d- L& `5 X s" U! A
unsigned int temp; " z6 d# U5 i. }
if(MCBSP_MAJOR)
; n: M) o# i* { { K6 \2 b# C' c5 k) ]
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' q/ e& w; Q! ^# o5 _
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& n) _' F3 N9 @8 d1 x3 o3 K
}$ t; _+ z* K! @
else
5 Y6 k: u5 M% U8 n+ ?) K {
P0 A7 x. c5 d1 X/ a3 Q' Q ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 J/ J$ n0 k- T: ~5 U& i, j# Q
MCBSP_MAJOR=MAJOR(mcbsp_dev);
3 z( w& a" Y1 M( f7 ~( o }
) a2 Z5 _5 f" A |. X0 s6 f" J- Q4 D b7 Z2 z
if(ret<0)8 ]6 o$ H4 w; i8 {
{/ ^7 `. H& I7 X J, @& o8 ^) y
printk(KERN_ERR "register chrdev fail!");
9 ^# ^9 ^ a% r return -1; @' R k! G" b, g
}' O' ]9 B% `% l4 ~( k l- i
. Q% i' P( s) L" R1 K4 h! n/ f$ J2 C/ W
mcbsp_cdev=cdev_alloc();: {: C, R4 C1 T5 h
K; K7 K- m9 m- z3 k' S$ u
if(mcbsp_cdev!=NULL)
1 U2 c* _# Z8 k \$ y {! w/ F8 t# Z0 u/ }: ^3 C
cdev_init(mcbsp_cdev,&mcbsp_fops);$ n4 h8 v" E' J+ A
mcbsp_cdev->ops=&mcbsp_fops;
. U L9 F; I7 ]: b. b- u2 A" L mcbsp_cdev->owner=THIS_MODULE;
% p: M; F7 h: C, x6 U5 \7 G ' H) f6 r, j9 X* g$ S
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
$ h5 x1 c: u1 _* w: p3 j2 u printk(KERN_ERR "register cdev fail!");( c" W# R4 O- ?& {8 y6 x) d: l9 w
else
9 W" F* _5 Y# s9 b( r# z printk(KERN_ERR "register success!\n");( D: w/ b6 i- l. v: e L O6 D
}6 P; }. K; e) X2 |, v
else5 q( W* }4 t) ]
{9 H! E3 e8 k9 V% E& u
printk(KERN_ERR "register cdev err!");
z$ C5 t' i+ E) |$ T0 k/ I5 i return -1;
5 G- y- T0 k: ^/ i0 v) r' v }
( H: s% s! N! D: o! M2 l6 c
, k# X- U1 E5 w3 d' b+ p9 u D mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# l2 B: I, }6 M if(IS_ERR(mcbsp_class))
/ f/ ^$ f9 l1 d: Z: \ {
. Y% e& T; d% Z9 R printk(KERN_ERR "register class err!");
3 E0 s1 ^1 _+ d3 L7 K( r: P) _ return -1;: `2 f$ P8 C, V) m; X, v' G9 \
}
8 G9 r. ?/ u: U9 C8 t. N+ V6 A device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
" y. k+ O t3 w! A/ x( h( ^. `5 k7 `
//PSC$ A/ v7 O" q( M
//add Enable MCBSP
/ ^' l' Y/ E7 ^# Z //test
[; R! v$ e% i( k! n/ S+ Q temp = 0x80000003;
. W# p7 W$ ~4 b6 F+ a writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! B% P c3 n3 g! Q temp = 0x00000003;+ C" A8 B3 _8 p, v% s/ t( P) Z1 a# X: {
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 {* s0 o3 E! o; b5 H# t
. U. N8 N5 L) w" V* Y& d temp = 0x001FF201;
) k- h8 Q; J8 y writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 N- {+ G! o4 Q. B, Q
# s2 c5 p6 N `2 b7 f4 @7 t/ d. h8 y //PINMUX ' J) q1 n9 l3 a' Z" K
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 }: p2 h5 G6 L$ ]& Q PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); : F1 a9 d4 F# \
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
9 A, `9 K7 c9 @1 e& H writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 I% k+ q0 K. m+ E8 |
( A( y, i! E I4 n9 `& k& q
//SLEEP_EN,EPR,L138_SHK1,L138_RC
5 s8 v0 w& n& J( ], R# h PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 r& @' \0 i7 D6 q5 _. e2 p+ O" E" X
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 5 ]" f9 N# }& j
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' n2 J1 X c3 P e. a
6 Q$ w7 O0 i9 w" s" ?& w //RESETn,L138_SHK24 Y3 V8 G# F S3 T7 M* F
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . U! d( r- T- z z4 S$ B
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 g2 M' X% C1 [; @. [1 Z- I0 v writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" C& @, ]7 z* g1 |3 p
/ w5 T2 K- x r6 n }; `( I
# `7 J/ i5 I. x7 H5 Z //SPCR Register
, U% U F: h3 O3 K- H% [! X //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset' @: [- \# }8 V. T+ R
temp = 0x03000000;//(DLB=0)
1 g7 C: n6 `# _, Y // temp = 0x03008000;//(DLB=1)
# R2 m$ R7 h5 R! a! y writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
# |- k9 t7 u1 ?. d temp = readl(IO_ADDRESS(SPCR_ADDR));9 R8 o9 P7 g( H% {" O' N5 B
printk("temp=%x\n",temp);
3 x0 X4 Q7 q! h) r. d& Q+ b
' {3 T* M v) q' _3 I3 Q //PCR Register
0 y7 b$ M( ~/ k: l0 k+ h //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 r4 |- s9 A M0 { ]* m
// temp = 0x00000F0F;! i' V9 b$ c; ]
temp = 0x00000B0F;; ]! C$ G/ o; j* g! Z+ V9 \
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ H5 B- {6 S8 c0 c) M4 j. g
temp = readl(IO_ADDRESS(PCR_ADDR));
. l% l3 c3 r0 E* t1 N% `" l printk("temp=%x\n",temp);
( ~6 p5 Z$ D: {& P //SRGR Register. m* E: V( e& |
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 Q$ }# U/ I4 z) w6 y
//temp = 0x301F000B; W, ~% `1 a- z! k' V* V" L
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized : C; p& x& m/ x# S8 [8 q' i6 Z& P
temp = readl(IO_ADDRESS(SRGR_ADDR));1 D; t: Q0 k6 D9 K
printk("temp=%x\n",temp);
; e& z7 N0 ]$ D# Q! F% s //RCR- Y7 q3 W- c" X' d1 X+ g
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# I( }6 f+ \# y" F2 Z2 c
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 h5 @; I; q5 b: F" ?4 ~
temp = 0x00440040;
% R/ R. l+ F1 k3 p$ M) V/ ] writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" H' q' r k- Y+ N& y temp = readl(IO_ADDRESS(RCR_ADDR));' R) X4 z0 Z$ o" Q
printk("temp=%x\n",temp);5 @* M3 c1 F7 o: ~) W4 J! J
//XCR% A! k* b+ v) F5 F9 H
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
1 a1 \7 B2 _0 V' j* O* j* \ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ T+ T2 {8 Q& I* `5 w B# f temp = 0x00440040;$ R1 Z/ C& O5 C
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
( W4 R$ f! h# i9 O" J temp = readl(IO_ADDRESS(XCR_ADDR));1 g1 K, X: Z) s6 V; U% V
printk("temp=%x\n",temp);# j6 z: ^4 Z, E( y; O {. j1 Y! h% c
udelay(100);
8 l f4 G8 n' L" t! M& @8 w& X //SPCR Register- l5 j; _- L; V) B" j: \$ ^$ m
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! @5 w7 R' }1 s& Q3 @& S* [
temp = 0x03C10001; //DLB = 0 VS DLB = 12 m r1 e! d+ B* r Y. q4 P
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled, a, w' v6 w2 t, V6 x
temp = readl(IO_ADDRESS(SPCR_ADDR));% I% A# }6 Q8 Q* X
printk("temp=%x\n",temp);( p8 m. K! w! o! F K& e
udelay(100);2 f8 t. ?; [ F8 O7 ], t- s
8 c: ^$ m5 c8 z/ O0 E- ]4 U //set GPIO direction- W' T) Z# x4 | A' P
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- s/ ?+ H, g/ s6 T6 H7 `
temp = temp | 0x00000100;//EPR----input
* A: F' [' Z; _/ L+ w6 m- ] temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" L H$ g# q' m, }0 v4 H __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
W5 ~# R! E* U( x W% u* |- R
& d: c1 T. i7 H9 O, z M return 0;
! J4 ^. P+ Y/ {$ x+ Y n}
& [. b7 Z w$ G8 n8 c4 b8 s% Nstatic void __exit MCBSP_exit(void)2 u0 t, V* d0 C
{$ |8 |6 a; I1 m& C# s( c0 ]
printk("mcbsp chrdev exit!\n");
3 w) o% W! {9 c' B, q cdev_del(mcbsp_cdev);
9 r! |+ |# \6 D: t0 m3 R unregister_chrdev_region(mcbsp_dev,count);6 m9 q9 t$ B4 }# A5 F
device_destroy(mcbsp_class,mcbsp_dev);: N9 n' ~! p2 W8 w. y$ z
class_destroy(mcbsp_class);- f) C, O) m- ^8 b
}7 [9 t- [3 l& j/ `7 D
module_init(MCBSP_init);
/ r. O& A0 `$ A. e" Nmodule_exit(MCBSP_exit);
: [+ z |! X \- Y/ Z
# D; B: a" O- \, J) m7 fMODULE_LICENSE("GPL");
9 a/ ~3 m) \ {# ~; F4 G& o" d% I9 o3 r2 `
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. X6 U7 T/ P5 y. P
我的应用层的测试程序如下
5 d/ T- l3 o( L+ ~, F+ t#include <stdio.h># y8 ~5 Q$ j; i9 B) Y/ \
#include <string.h>
# ^/ ]) o# b/ O* L, ?( M% x#include <fcntl.h>
, I2 y' P0 a% P, H( k#include <unistd.h>
, C4 z, S7 d5 O: z4 W#include <signal.h>1 ^: }) I$ n; t, K
#include <pthread.h> //线程
2 ~( c0 e9 N# e* ~. w#include <stdlib.h>
+ H5 V: V. ^9 V& n#include <pcap.h> //捕获网口数据/ g L7 f% d, e, j7 G" G+ W4 F/ Y
#include <semaphore.h> //信号
, d T7 q! j3 v/ L# F: h#include <sys/types.h> //消息对列
$ K/ A# d$ S2 V2 m; T$ B) f: ]- \4 b; Z#include <sys/ipc.h> //消息队列
" N# O4 A0 N) t( y5 X( M#include <sys/msg.h> //消息队列
5 V$ j" L& {5 K7 C7 w: o- W#include <sys/select.h>
. E% w7 {. x) h7 T6 F#include <sys/syscall.h>7 |1 t- N0 J0 J- H: P
#include <sys/stat.h>
' c/ U/ L7 ]; `; [, F#include <sys/mman.h>
+ W# g3 C% b9 g. f0 G( h#define msleep(x) usleep(1000*x)" o& F M7 ~; S
3 M: {/ n( h, D- y2 Uint main()' X, @; x2 v/ P3 ~
{ ' o- z( ~# {$ z+ _2 s; V4 X1 R
//MCBSP,ARM与AMBE2000交互设备- E% d- ~; [% l5 i, Z; G
int fd;
4 v; N+ q4 [, q# c" _ unsigned short data_write = 0x5555;
7 g" m3 D0 n. n unsigned short data_read = 0x00;
, k- O- t' Z, r% y4 G) @ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 r5 E! N. B/ A8 l. ] // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);! s( B% s; o0 p2 F
$ h E; R" A0 T
if(fd < 0)/ D+ C5 [7 J( V3 Y0 t$ v
{
! m5 o. G; d" W7 Q+ _4 b8 m( z perror("open failed\n");
# E9 s" c0 V6 E/ @ S+ m5 H return -1;, t. z, s) y7 M; ~
}* R6 ~1 m. B2 V' f0 j8 W
& k f9 g* D+ d; D: V1 W9 f
while(1)
* ?& U+ @: A; [8 i" ?4 m, ^ {
9 G! w5 n4 B% t% h; p1 w9 K u , |/ `# u: i* s: m6 Y' H
//AMBE2000每次读写是24个字为一帧/ H0 p4 ~. i- S) f1 ^; `' ^
//写数据时将数据在底层存储起来,等到中断的时候再发送
, L( O0 I8 b5 h& y" {# E& Z //AMBE2000输入数据是以0x13EC开头的
" h3 q. ?, h) h0 e: U m( Q write(fd,&data_write,sizeof(unsigned short));
, y+ ]" x/ N( M % I: X& ` G, q$ g/ b1 D% A& v
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( g/ J+ D' A3 r" s6 i. Z read(fd,&data_read,sizeof(unsigned short)); k g0 ^3 b: a
; h \' H1 P( `1 L1 |6 Z/ }# B2 n: Y if(data_read == 0x13Ec)
1 A7 V! b w1 \7 |$ c. [ {
' Y X3 h* c. }* n+ A: j. _: k & Z+ z" P0 m% F) e
printf("data_read = %x\n",data_read);, s3 t7 m: f$ K9 ?7 ~' p- i
}
" @8 C& p) P! } s _7 N# w 6 V7 J2 T7 `( x3 r
msleep(10);9 Q6 S3 J+ a9 e, h
7 v c6 g; C% ]- v4 Q* \" s /* Y9 ?% e1 C5 f" H
ioctl(fd,1);
' Q+ h. w ~5 c+ v5 w, f5 Z sleep(1);
1 f' F- Z; N1 ~3 k o( i ioctl(fd,0);0 D2 }- s8 i6 K/ i7 e7 ?
sleep(1);
3 ?; f6 x( F' q: n */ b! l. w& C7 w. q, n
} ) k" o' y! V$ b
return 0;8 H2 l# W% I- U, ]+ K( e
/ F( b; ]/ j2 G) o$ L9 [6 d+ X}
% f0 i: Q1 L( z1 c7 H) I( h7 |+ K% a2 p' U+ Z
多谢各位指教,谢谢! 急
, M+ m7 Q, W8 B. l6 z( r/ O) }2 Y( }4 x% y/ y& g
! c" @( d0 f/ x2 g* n t: S5 C
2 N7 _5 G+ A4 C. |
4 i% G) N2 j( Q8 \; H& h2 V/ }
: k l2 e- y4 g& v5 G0 X/ Z |
|