|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 H: l& ?6 n9 G3 R+ d/*) [7 B) ?3 {( n; }
* Copyright (C) 2009 Texas Instruments Inc
( a2 |* z( F1 G& _0 A/ Q1 s1 O ** k# o3 R. x4 Z
* This program is free software; you can redistribute it and/or modify; R" ~4 i3 v* `
* it under the terms of the GNU General Public License as published by; F2 q- Y+ m3 }0 B6 s, n7 f
* the Free Software Foundation; either version 2 of the License, or
1 R. p, T% H& \ * (at your option)any later version.* S. K. q$ r& I! r, ^
*' [% x, h' c7 {6 a( Z& R
* This program is distributed in the hope that it will be useful,
* M9 B3 ?, B+ H# U * but WITHOUT ANY WARRANTY; without even the implied warranty of
; V r( p$ w v6 o8 a, d- L, B * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" W5 l I9 E% c% p" s9 B * GNU General Public License for more details.+ l, y; W5 \8 u: V2 _
*' X9 c0 i: J: A( L
* You should have received a copy of the GNU General Public License) }& h" Y) Q9 z3 K8 d
* along with this program; if not, write to the Free Software) t% f7 h: w% u" e0 n
* Foundati2 b: \7 K6 B6 y, p
*/
/ C! U5 K, k: \1 ]( } i* @$ }#include <linux/module.h>2 P' v( J, Y1 J! a, M5 c9 D
#include <linux/init.h>
7 f9 o \) i D* e9 Z# |# e#include <linux/errno.h>
, d' i1 P* g* r8 _* ~, _#include <linux/types.h>
, Z+ _7 z8 Y- V) n1 |4 G0 P+ n#include <linux/interrupt.h>: {( k; y4 {( A
#include <linux/io.h>7 g" \# i M$ Z' m$ _
#include <linux/sysctl.h>3 [, n3 O9 \& |
#include <linux/mm.h>0 e9 V$ M h; ~6 X7 o% }# \
#include <linux/delay.h>$ c9 z M: s) [4 i6 x- j0 a
#include<linux/kernel.h>
& F; ]" j5 `0 ~# W' Y0 P+ Z#include<linux/fs.h>
0 Z9 n- S9 R e6 G#include<linux/ioctl.h>
1 @( N( f" f/ s2 C4 @ E3 Q#include<linux/cdev.h>* T0 m/ J! u r6 O' x
#include<linux/kdev_t.h>) A W% }1 Y8 S
#include<linux/gpio.h>0 g1 o8 u# I0 P w3 T/ g
#include <mach/hardware.h># Q7 U+ l* v/ x# [; s2 T
#include <mach/irqs.h>% R" j. l# k# h/ n6 O/ D8 a
9 H& w, m& N z2 z' o2 i& D#include <asm/mach-types.h>$ F5 r0 v# _- h; v/ U2 ^8 s8 I& j
#include <asm/mach/arch.h>- b$ E i; a5 |: Y8 m, K$ m
#include <mach/da8xx.h>
7 Z8 m* }2 l3 _! G" |#define SYSCFG_BASE 0x01c140007 K8 ?7 [; `& A; V" M) E
#define PINMUX1_OFFSET 0x124
3 Y V. O: V. g( Q" r9 m9 J#define PINMUX18_OFFSET 0x168 3 E/ ` `+ D& m1 u8 R3 p* y) F
#define PINMUX19_OFFSET 0x16c W O# P; S5 L/ u
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
" N" z! _; ?, J# u" K#define RCR_ADDR 0x01D1100C //MCBSP1_RCR- K( D" |, G( q1 h9 e3 E
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
2 a3 m* V! W$ B1 d9 P# ]0 H#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 _" E6 W0 ], L5 ], P#define PCR_ADDR 0x01D11024 //MCBSP1_PCR: q. ?3 @: e8 S+ j* |. [* G' Q
1 F, n5 c; X$ t0 I
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
' q1 B' F! {/ c#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
! s/ e5 }" e) @6 I- Z- X//PSC+ q" i/ Q$ G$ F& |$ u" L
#define PTCMD_ADDR 0x01E27120
' E2 Z; w7 U W. i#define MDCTL15_ADDR 0x01E27A3C
4 i2 j- W# q* `$ {1 Q#define PDCTL1_ADDR 0x01E27304. I- r9 e: O1 n
//GPIO8 direction
! D$ s7 K3 }8 X# I# U6 F#define GPIO8_DIRECT 0x01E260B0
* |( l$ u0 P0 f/ f#define GPIO8_OUT 0x01E260B4
9 N, L0 C! @- T#define GPIO8_IN 0x01E260C0 T1 s3 U) A# [. H9 ?5 n& t# R$ w
( p k" z4 @; c8 J# K0 R- ^3 G3 d+ ]//#define MCBSP1_RINT 99
) c& y( l+ U L' Y//#define MCBSP1_XINT 100
& H+ t/ J/ F" Z4 t" [static int MCBSP_MAJOR=239;
; e5 x7 W7 a( {. I9 X1 O5 b" {static int MCBSP_MINOR=0;
; y4 o$ Z+ |8 }6 P3 Y7 D, i2 Kstatic int count =1;
6 D$ ?; S0 ^& g% e; W4 Y0 n5 m {! D
#define MCBSP_NAME "MCBSP-device"' L8 H0 S, z5 N; v: z7 z3 }, N
; t2 p2 u/ ]+ Mstatic struct cdev *mcbsp_cdev;
5 f! q( q4 [) l! s1 i& Q. zstatic struct class *mcbsp_class;: w; N; \# G E7 V
static dev_t mcbsp_dev;; _$ Q/ B+ M7 C4 \& g
unsigned int DRR_data;2 \7 i1 u) `8 e7 @$ t: S0 j7 `
unsigned int DXR_data;
9 `" P' B& Y! lstatic int mcbsp_open(struct inode *inode,struct file *file)
+ i! E9 \, W7 ~+ K/ S, \{8 N& o8 x' e8 d- n! q8 B9 A8 S F
7 y/ y& N( {# {% K# D
//interrupt enable,initialized
1 v7 ?9 V E/ g unsigned int temp;9 w0 t* y# i8 P1 w9 W/ Q2 B7 x
//SLEEP_EN(GPIO8[10])---0
$ t5 ^, m2 ^& N7 t' C2 b" F* p temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 |6 C& @9 L* L* r temp=temp&(~0x00000400);& K3 W3 Z0 i2 |. V# J
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- ?$ ~, N4 W4 e- U* V7 J. _ //RESETn(GPIO8[8])----0----16 } ^; U, F2 O {
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; V( y9 J: e+ ~- {; _0 C: _ temp=temp&(~0x00000100);* A. \* l4 o# }4 g2 a( z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 O5 s- X- p4 y6 {
udelay(100);2 b+ V) B2 e/ p
temp=temp| 0x00000100;' j+ T3 x& b9 z2 V! x/ Z; K6 k2 L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 X; j9 E) n4 ?. }' U0 _" W
udelay(100);
# m3 m& ]; T, g' z8 { printk("open success!\n");4 f" E# d6 v) y* a* A! z/ q
return 0;
1 |: c5 J) \. P}0 }/ O" f) l7 w. j
9 p0 o1 W* d$ o/ s) {static int mcbsp_release(struct inode *inode,struct file *file)) d9 f( a b1 @/ e" \3 @7 Q6 s3 y
{
6 b0 W. a: Y4 \+ b, R0 P$ r printk("release success!\n");
6 Z! Q5 ]6 l3 @' I2 I: P+ n7 n return 0;
& A$ I& G/ l( e+ S s& ^}
! S# o( M% H2 U* j3 u6 E9 O
" i V3 E! _, ^- ^( B3 ]3 ]" Cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)1 N" c; p5 a3 W. N" d
{
; p% N1 Y1 W6 D3 b, z- G) O" \ copy_from_user(&DXR_data,buf,len);
2 S j+ S7 m! Z" A& A iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); - r3 C7 o' l& h) ?4 s
return 0;7 S9 T6 }) i. h. \, g* n( E
2 \0 ^: Z9 E; h8 L' j% |' @ Y j}
0 o. o# C2 ^% Q9 p" N( n- s4 m0 [5 M# R' L/ M% M7 h1 M9 x4 i5 v
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)0 D) @8 c1 K* I1 x& [
{ . i/ O5 W( f; g
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 C1 p# ~" ]! C4 ?* p
copy_to_user(buf,&DRR_data,len); 7 ~) a+ c% s. V* S$ v, g
return 0;; B4 P2 g4 O, p- _. }/ W8 @2 H* n0 o
}) Z N6 D. u, A+ U
5 L. d- l q0 U% X2 ~ T2 S) S4 k7 i# W+ p
static struct file_operations mcbsp_fops=
% S, s3 L, E# ]! ]8 A{
4 ]2 Q7 ~- P2 o# O .owner=THIS_MODULE,' x8 [* {3 x- x; l' K* u- u2 B
.open=mcbsp_open,+ E( _+ } w7 k* y
.release=mcbsp_release,
2 \( ?9 T& D- g .write=mcbsp_write,0 g1 f! }6 H" C7 v
.read=mcbsp_read,: H5 {) ^3 J7 q, g
};
5 _# r/ h) u1 y5 `; k8 z; f" Ystatic int __init MCBSP_init(void)
, M0 p* w% K. j0 w{( x; J3 Z0 J& `0 v
int ret;
; P s' [; a" O0 N$ O- q unsigned int PINMUX1_REG_old;: d9 I1 J$ i2 [0 e
unsigned int PINMUX18_REG_old;7 j3 g7 H& |5 u
unsigned int PINMUX19_REG_old;
1 a9 l# B$ [# @7 V unsigned int temp;
! k$ Y/ A! S& T! M* P# } if(MCBSP_MAJOR)
4 x6 R$ \; g5 w {
8 @- b b5 {+ Q/ _# y' {3 [( [- m mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 w" H5 X- H( S ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* p$ p5 M O( @2 R }1 T- W, n4 E3 B% F* R) P, Z+ t9 C1 S
else+ H: ]6 b$ U6 ]$ k
{
& D1 t/ ?; t/ t1 E8 m ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! R; f- W h4 d$ s" D" d5 e MCBSP_MAJOR=MAJOR(mcbsp_dev);
% z4 \( g/ ^. M+ N( [8 j }$ z9 W/ D; W* A( z( x9 U+ c
0 z' A7 R \2 o0 F1 [6 X3 O
if(ret<0)! M3 @8 w. s& A' y) e8 k9 `3 |/ s
{/ J8 f/ f: h) i1 G
printk(KERN_ERR "register chrdev fail!");
+ M# {8 V0 j% b9 M5 K return -1;
; s$ Z5 L `+ W: o' ^/ K }0 i" P4 S4 K8 J. k! W, e; _
, C: }6 ]0 V% H6 @6 g; C mcbsp_cdev=cdev_alloc();
7 s' U) M4 @ H" m) n) Y: G % c: W& L/ O: q' [9 _
if(mcbsp_cdev!=NULL)/ S: K- l9 l: i" b' P
{/ w; E3 W$ r4 q
cdev_init(mcbsp_cdev,&mcbsp_fops);. @9 m- S# J9 o) Q8 T c6 _
mcbsp_cdev->ops=&mcbsp_fops;, Q6 `4 c+ J+ V0 N( |
mcbsp_cdev->owner=THIS_MODULE;3 I% F/ T% `9 U. T" A
0 Q! C1 [" Q0 i6 V* K& Y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
# Q2 B+ \4 M* q) V4 D" J1 T printk(KERN_ERR "register cdev fail!");
) S d2 s" H3 E( |5 X* J3 \ else& a3 s! B4 n4 l0 w
printk(KERN_ERR "register success!\n");
$ V$ n5 |& ^! g* h( S6 f& x }
* [. ]% i# W9 o9 H9 V# F1 Y7 ` else
# U) L3 P+ g: b! p c; R {$ {8 S% h7 f5 }" A j2 B N' y
printk(KERN_ERR "register cdev err!");( u2 [% K; D+ k0 b I" _% a* F
return -1;
. r" J2 b* L$ R) t" c- J+ k2 N. c }. b. P6 |# ]% x- Z v5 j4 w
4 d. a* X: s5 M& v L6 k* J mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# r \4 V4 q' ~ if(IS_ERR(mcbsp_class))
$ q3 T- [7 ^. h+ K) l3 @% l0 E4 a& Y" W {! H4 u, A( q6 @/ c2 o
printk(KERN_ERR "register class err!");
/ @) l2 i3 h, |6 A* g8 P1 J return -1;
2 ~$ B2 ?7 W4 W3 ~5 h }
% D; I8 v: \/ E1 l( p) E device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
& I* K! X( }, D$ t5 x3 _" o4 c: y5 e( P4 j
//PSC
* E# `9 A. ]* a$ b, r //add Enable MCBSP8 C$ }6 o; @& I3 ^% E
//test
! V' I1 I$ J2 c1 N% k2 X2 [: J temp = 0x80000003;
6 c# w: c6 w; W4 t8 W: M writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( ]! u' f2 x2 ^ _ temp = 0x00000003;1 D5 W. X8 T% ~0 {% p! D
writel(temp, IO_ADDRESS(PTCMD_ADDR));
. t! D1 B$ x( e/ U/ p1 l
9 x) l7 `1 `7 C: x8 _4 x temp = 0x001FF201;
, ?& e8 L3 ?7 u& S4 M: J writel(temp, IO_ADDRESS(PDCTL1_ADDR));
H: L+ _$ o) k/ c3 n! ? O: u* B$ e 5 X/ i1 o4 Q/ V* S# `: g
//PINMUX
( `2 h3 s. \8 V. E# _# e //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 \+ \- e" \# c6 g$ L% Y: o! @
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ Q, z- k# D& m' g" L8 i! q PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
# `, x; F/ P3 P1 z writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 ~' Q6 K" |$ P* @. U) E5 E
0 h! M3 u4 j7 L+ v9 O //SLEEP_EN,EPR,L138_SHK1,L138_RC/ j& M" ~# _$ F0 E! k0 \1 J
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 u$ u5 d+ c0 X8 {; z2 n7 i PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
& ~1 Q5 W, n) W writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- A5 ~1 C+ U8 u) \* j3 x W; l- |
; i, Y# _8 w* Y/ e5 v: ^, x //RESETn,L138_SHK2
g$ \: X T+ Y5 K0 B$ O. Q0 { PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 D% M& c. o k0 [" f' w8 { m, z1 Y PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ' l. E' l0 o: ?( N6 L" Q5 u
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( r( l4 v6 I7 Q' V: w
3 T6 n' V7 R, S
) M0 W1 l$ g+ I. N4 h
//SPCR Register: R$ u( T; n V5 [ a9 s9 z; `
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
4 J* V& ~2 O; q/ G temp = 0x03000000;//(DLB=0)/ W! B1 B d1 q
// temp = 0x03008000;//(DLB=1)
# ?/ n- b5 F) W4 H writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset% g( n9 {/ O. l7 B1 n" s" |! L
temp = readl(IO_ADDRESS(SPCR_ADDR));
' Y5 P) ^ p3 `; n6 ?4 G+ W7 n printk("temp=%x\n",temp);3 c" y+ q8 a, `3 p W% w
* d- A/ u5 W6 z; E1 a _' } //PCR Register6 `; A2 y: N U$ ~
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# V, q& {8 I5 _, F( t; z; q
// temp = 0x00000F0F;
2 W# P/ W) f) \' \2 e temp = 0x00000B0F;& K$ Z) E2 i# o# D
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
7 |. d' m7 F& n+ a0 O+ U i temp = readl(IO_ADDRESS(PCR_ADDR));' o) I9 [$ u7 d5 s7 \7 @/ H4 |
printk("temp=%x\n",temp);
" j0 i# E/ J$ I) Y* ? //SRGR Register
+ u3 O4 n7 r- g4 d8 X) ?1 B- W# d //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ [: d/ u: p% G* b* ]% c //temp = 0x301F000B;
& A. y8 g9 Q0 d writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized " b: D4 X3 K$ C# J6 p
temp = readl(IO_ADDRESS(SRGR_ADDR));
! r( u7 ] j8 Z; X# Y printk("temp=%x\n",temp);7 P3 o8 q2 o B4 q% _% \% L# i
//RCR
0 F* Z8 r0 A! |! L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1, A& v2 t; j/ r2 `# M2 \5 `
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! Z' t6 g& E5 D2 ?
temp = 0x00440040;
1 p9 o$ B/ I9 L( ^- M: w ]4 f6 Z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 3 ]0 w2 q9 u+ l$ [1 x
temp = readl(IO_ADDRESS(RCR_ADDR));0 x5 Q- y9 a5 g9 o
printk("temp=%x\n",temp);
2 |7 e W" W+ L9 [2 m2 r! ^, f2 J //XCR
1 l( I% p: o$ `9 i( _. n4 B //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( U+ q9 p2 K# U4 Z0 ~1 E
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 d, n* j' E. g- i
temp = 0x00440040;
, X8 h: `4 W0 l0 u/ Y) {) G8 t8 q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : g0 }4 J/ y ?0 f+ `% \
temp = readl(IO_ADDRESS(XCR_ADDR));* H+ O: r! P! g: F7 _
printk("temp=%x\n",temp);6 f( D) S Z% l3 u0 d" o
udelay(100);
9 w& ~8 I+ e8 p //SPCR Register
+ O$ t" L' f9 v: @+ ~& [ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' K; I6 m. R9 r9 K% N( x. b temp = 0x03C10001; //DLB = 0 VS DLB = 1, y! A- b0 }+ b6 {
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
( {. ^- B6 ?$ u7 p. l temp = readl(IO_ADDRESS(SPCR_ADDR));
/ a8 i2 Z9 z7 \1 q* s3 V printk("temp=%x\n",temp);
?0 U0 ]2 k2 ^ E udelay(100);/ J" I, h- f4 |; D9 G
5 W& C5 j$ G% N; y: h //set GPIO direction$ _+ w' E* q( o7 L" N7 O
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- l& k0 A8 i0 A# B
temp = temp | 0x00000100;//EPR----input2 j/ U( @3 Z% S
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: T2 u1 E9 D( E% N; H' b4 P; ^1 @
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
* n; g4 @" ]5 { 0 }, j' h- l1 T% k) |/ c: F
return 0;) _% b; ]$ }* N8 A8 A3 G( a* v. v
}
: ~0 i, V6 N" W8 i6 Sstatic void __exit MCBSP_exit(void)2 o8 x( g) y$ a' g, [
{' M7 {: P$ r) s% n
printk("mcbsp chrdev exit!\n");5 K6 k0 h* C0 n
cdev_del(mcbsp_cdev);4 L- v9 x9 n# q/ W- B& }
unregister_chrdev_region(mcbsp_dev,count); U/ p8 [( t' z3 Z6 }, H) Q, e& {
device_destroy(mcbsp_class,mcbsp_dev);' `7 y5 E: Y* r i- e! A
class_destroy(mcbsp_class);
( ^' a1 ^! ^; q. w8 G0 m: b8 M' r: S}9 d3 Z3 W( @6 z
module_init(MCBSP_init);/ R0 y: q% J- f9 q; U
module_exit(MCBSP_exit);, g; g8 m6 T4 w. \: E m
% j3 T8 j# q* s7 _7 @& n) @( CMODULE_LICENSE("GPL");( L. C& I7 S- ~/ o$ J) Y `4 o
' N" s8 U4 i; S. N我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ G& D" o2 O. i% h6 E* k2 e( t我的应用层的测试程序如下) _7 Y, g# o; J& U
#include <stdio.h>9 C+ C: t$ y& n& ^1 ^% }# r
#include <string.h>; ^' k n' @) F, _8 q# @: S {
#include <fcntl.h>
: _7 M, i# a2 ?9 e3 V#include <unistd.h>' ~! j# U4 b4 |% S7 o% i& t/ ` Y; ?
#include <signal.h>
, `, e. ]) f3 K#include <pthread.h> //线程
+ d1 r; j7 A. D$ T4 V+ y$ T#include <stdlib.h>8 C8 u$ B. M: s$ Y7 i8 F7 @5 H
#include <pcap.h> //捕获网口数据3 E- Q* y! h- t, x3 b- O( s
#include <semaphore.h> //信号% _7 z0 E- Y" W& A* H( c
#include <sys/types.h> //消息对列
2 `) Y6 d& C, }1 V2 x#include <sys/ipc.h> //消息队列3 N- K; y9 p9 U Y/ I9 I. b
#include <sys/msg.h> //消息队列; [1 ?3 k- o2 e `8 V
#include <sys/select.h>
9 N0 G+ [5 V; I# Y0 c& Y#include <sys/syscall.h>* |- q& n0 y* H5 D4 L
#include <sys/stat.h>$ B/ v5 j8 ~8 b
#include <sys/mman.h>, P9 t4 {& l* q8 o' e
#define msleep(x) usleep(1000*x)
+ }0 j. m2 Y, }$ X) [& \1 J3 T
) u/ @, J# b+ x2 a( ~+ lint main()7 W6 |: T7 j X" P, C# R
{ % \; H( n# o. K/ x) T+ b
//MCBSP,ARM与AMBE2000交互设备 o; B, _2 g$ {+ y4 d& P/ e# `
int fd;
# u* N1 z4 b8 g# ?3 O9 w unsigned short data_write = 0x5555;
( l1 \# X+ G+ u$ }! _% [* u unsigned short data_read = 0x00;
. U# E* d- b. K fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 Y9 `. j, S1 {, A# V // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);! h0 u3 [# X/ D+ C7 A, k
G/ C& D+ Q& P0 ]! W2 q. A+ z
if(fd < 0)0 \' t4 a( O: @/ B/ c$ }
{8 y9 l) H$ i9 |7 |5 f P
perror("open failed\n");
5 _/ U7 W) p/ P; U. c return -1;
; U- Q! B3 ]! o6 ?4 Z( k }
2 K% W( m1 m, f1 K/ {& c' H8 K
7 p; t, B" g( K- g' e while(1)
9 }" D( s: \% h5 T7 M! O$ R/ J) ~/ M {& q6 f, K/ {* G
2 V, \0 }. B" X5 b8 z: W0 M$ w8 `
//AMBE2000每次读写是24个字为一帧
: y5 N( M$ f: A! H3 `; r //写数据时将数据在底层存储起来,等到中断的时候再发送- \3 W. d$ ~# S& J" a
//AMBE2000输入数据是以0x13EC开头的
* e; U* e. r' i! p7 `8 a5 H- D6 P. ?, w write(fd,&data_write,sizeof(unsigned short));
1 t! ^# a6 f1 _) q
- E# e) C: ~0 v //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 # j% g2 x/ q6 C* [* m8 B1 ]2 r
read(fd,&data_read,sizeof(unsigned short));& @# l& G, n; a/ z/ I6 g8 M4 t5 _9 @
- S, @9 z$ ^* u- u( \+ [
if(data_read == 0x13Ec)
' r5 m# `7 D3 U7 n2 [ {0 I' l2 T. C% h) N
, J7 N) i; v: m2 M
printf("data_read = %x\n",data_read);
9 \0 c8 Q* U6 g }1 C, O" G6 e6 Z7 R" s4 _/ ?
9 h- h- M: d2 a4 c) `3 e; L2 } msleep(10);% J; E" R: Q% y
/ D" y8 ^% O9 ^' A3 Q' T
/*
& |6 K3 e( d% a* ?* W! d O ioctl(fd,1); ( h0 ]& Y# o3 n. [
sleep(1);, n. L; m" V( ?# q
ioctl(fd,0);
3 i! e2 E; o1 R! {4 x. K' G, M sleep(1);
' S V" T3 E+ B- i8 w */
+ t0 n/ C: Z9 W3 c }
! O: }) a3 [! t( W return 0;
# q `" u* D+ s' e0 X8 k 0 \2 \3 h5 `; a2 o. M; N% S
}% v& n" }' B3 I1 R
3 o3 @. j: F# t% U
多谢各位指教,谢谢! 急
. v; x0 v; n4 ]4 s7 V
6 a/ |8 A5 K5 S
* _' S( P* b8 p7 X0 O* ]0 X2 g! ^+ d* D8 p. V% e
3 y# ?! g! M: d8 x$ [
6 |. D/ f; X2 x. r! s9 q, e0 z# f |
|