|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 z: D( Y& [* |4 j$ f
/*7 s8 @2 ?$ x; y+ H4 k, R5 K+ {/ f
* Copyright (C) 2009 Texas Instruments Inc
2 `; [5 s8 {" K7 `0 ^ *
9 I' K1 {( T3 H1 A * This program is free software; you can redistribute it and/or modify
+ @, R' H9 D/ z3 V; C/ ~ * it under the terms of the GNU General Public License as published by$ ~1 K2 Q0 E4 d
* the Free Software Foundation; either version 2 of the License, or0 N3 s& {/ J, @) e" s7 o) E2 p
* (at your option)any later version.
3 Q( ?2 ~8 f4 |# i4 g *% M! w7 \9 j/ U! z2 t! d4 n
* This program is distributed in the hope that it will be useful,( z+ G- d0 i$ x+ D3 E
* but WITHOUT ANY WARRANTY; without even the implied warranty of4 @8 m8 i9 ^1 M$ h- j
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' [% w3 h, k4 n* H. ^. U
* GNU General Public License for more details.1 D2 t2 [( x* O
*- n2 s- M. D6 W$ I. y8 K
* You should have received a copy of the GNU General Public License
u! X, k4 V' W1 F. }# I * along with this program; if not, write to the Free Software) f0 S3 p% C5 n: \! j8 ~
* Foundati# I6 h! w# b: m h* @8 ^+ @
*/9 s1 l5 \ l3 A; P6 S( J
#include <linux/module.h>) r6 V" u& i3 y$ F% k( E: A: _; V" B
#include <linux/init.h>' N" h) r1 f" d4 f% B( Z% L4 u6 a
#include <linux/errno.h>
+ K; E) T# w9 o- m#include <linux/types.h>/ x, e) G% }( ~. @
#include <linux/interrupt.h>
c4 a( |6 N; k6 v5 k) |* j9 G#include <linux/io.h>
/ |. M- |+ G& q) ~% J; \#include <linux/sysctl.h>
1 Y9 @4 d& ]9 e+ V( G5 { L#include <linux/mm.h>
; m, C* `7 c$ e. [; P#include <linux/delay.h>
/ `% G/ E7 c" P, S( H* G% n# `( J#include<linux/kernel.h>$ `1 _+ O4 W+ v# B% J# z* ?
#include<linux/fs.h>: \4 x( ~; ^" ~) U: \3 W
#include<linux/ioctl.h>" A& q& d, r3 {
#include<linux/cdev.h>" C1 d6 W8 i1 j8 n( E. Z/ P
#include<linux/kdev_t.h>
7 q' d9 h( }8 a7 o#include<linux/gpio.h>
+ [; O4 e1 @7 [- G$ P+ x# I#include <mach/hardware.h>
5 S* I/ s) W3 m G#include <mach/irqs.h>
z) F+ k5 y! @/ L' |% K J- p" \" f0 Z
#include <asm/mach-types.h>
8 M& t) A# Q1 U' g#include <asm/mach/arch.h>1 c3 S d' y2 U: n
#include <mach/da8xx.h>
8 l9 Z7 e a4 s/ }#define SYSCFG_BASE 0x01c14000: ]& ?' e- O, b3 a
#define PINMUX1_OFFSET 0x124 6 R/ H C# C" J7 r
#define PINMUX18_OFFSET 0x168 % h2 |& i4 a% ~5 q. z: l! `3 |
#define PINMUX19_OFFSET 0x16c
S0 `* j0 ]+ ?5 ~#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
" Y8 X5 A$ ^# T% n0 |, n9 j1 P#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. p- v% }- v" e* z; X$ |. S& q0 ]5 o; t
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
' P' b$ ~! P& ]5 h#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, p% y7 |. G( H#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 H% T$ {( X- r$ p3 w
; ]" Q: e: x$ R8 E1 d+ z {# g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 p1 m: k7 D' i0 W" s) y* Z
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 n c% X% X! C
//PSC
+ P, |4 ?; \: ^#define PTCMD_ADDR 0x01E27120
$ \1 z4 p' A' e% v* |; `, x0 y#define MDCTL15_ADDR 0x01E27A3C
- ]0 [) u7 ^* k+ `#define PDCTL1_ADDR 0x01E27304
( Z* s" ^. c8 j//GPIO8 direction
' _; @( E3 ]! l3 S3 x9 y5 Z( L6 \#define GPIO8_DIRECT 0x01E260B0
$ i4 A* g6 y7 ^, Q* d#define GPIO8_OUT 0x01E260B4$ d' R" W5 R1 u, r( c( w# T, ~' ^
#define GPIO8_IN 0x01E260C0# Q6 v: q6 P; J/ |* C" I" L6 W
$ N: K5 I5 ` N% i, n//#define MCBSP1_RINT 99 % j9 S+ n% U# G
//#define MCBSP1_XINT 100
+ r) J, q1 x3 J8 v( Pstatic int MCBSP_MAJOR=239;; c' H% H+ B; |$ {5 B2 Z
static int MCBSP_MINOR=0;
" O/ E3 o* c, sstatic int count =1;# @1 d3 w1 y5 G0 V
4 x+ P5 ]# i6 a) I( ?/ M#define MCBSP_NAME "MCBSP-device") Z0 P3 c% y3 `" b+ Q1 U
2 z! z* _( N) k! S6 O
static struct cdev *mcbsp_cdev;
7 R* a4 b A5 ~1 V, T" Vstatic struct class *mcbsp_class;% n `2 s. G5 m6 `/ V- I& o4 c
static dev_t mcbsp_dev;
' ?/ _, b7 a6 T! [5 Gunsigned int DRR_data;
4 e3 T. H/ a( y, r2 f' Wunsigned int DXR_data;
- Y% z$ M8 f7 ]static int mcbsp_open(struct inode *inode,struct file *file)
8 a/ b/ ]' F! |& u{. U" p6 J0 L- z+ `
s& D1 ^( y7 A, \4 u //interrupt enable,initialized
4 @9 k" h; z- ^ unsigned int temp;
; p4 u% }5 M+ D+ ^& w/ ^: f2 \ //SLEEP_EN(GPIO8[10])---0, R% J- w( C, W R/ E+ e
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- V8 f/ b7 d8 n4 o" E1 s; b( o
temp=temp&(~0x00000400);
) i4 a' B. @$ S* V) s% W __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& y; ?* D" d, b& ~$ I1 s% H; ?0 t& ] V# o //RESETn(GPIO8[8])----0----1, e4 m$ U7 m" z
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* p# s' k! B1 H# n) h' L
temp=temp&(~0x00000100);9 L$ u. M6 |( y n' k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' x u$ P# N# W. H! m/ v% K5 ]
udelay(100);
: G' `& Y- q$ t1 K2 I* x: X temp=temp| 0x00000100;7 O- U0 `- H" F% P3 ~& @5 y" U+ X
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% N7 E g" W8 S- V1 o- v- e
udelay(100);6 K0 |% ]3 ~" d; J F9 u; ]# y: i
printk("open success!\n");& o# _. J% B6 A) c0 }( U/ f ?
return 0;
% H& u/ E y5 A}8 c# B6 P9 E* ^3 |5 c5 ~
% P7 S* a; D+ c% Lstatic int mcbsp_release(struct inode *inode,struct file *file)
7 D5 W$ b, e3 m K3 }3 [{: [* k$ E0 H9 m7 h
printk("release success!\n"); m* U8 ~$ E& _7 l( e
return 0;
5 j; a: W1 Z+ H: {}
" _9 D5 {6 F- B/ y; j. X5 H& k- p
- i' S% g* ?# L: [' ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; |( `& Q5 Q$ E* A( `4 T( i{! {8 S, C3 N" l; q# e
copy_from_user(&DXR_data,buf,len);
! |8 _- L$ ?: w iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
2 v( J ?. u) H! s; S& j7 j5 m return 0;$ }9 I$ p7 O8 u7 c4 o+ Q# q
7 e5 f- Z9 }# ]+ J
}! V0 G8 w8 c' |) _2 W
/ L4 c3 z3 P0 K6 l
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ A9 M. A4 ~, V) J; r/ A8 f{ 8 y$ o# e) L( z9 h9 w
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 V) z; o# K! W5 i& `7 m
copy_to_user(buf,&DRR_data,len);
6 l7 l* q5 `* k2 t9 S/ I: P return 0;
+ y1 @3 \8 W+ C}
! W5 j' p( J9 \: [
5 P, E8 J/ I& n- K
7 S; |8 K" X# A7 U( ^ D. Zstatic struct file_operations mcbsp_fops=
9 x$ ^% Y( C B4 S# w{
! l7 w8 `, O; v: S+ e) e. h .owner=THIS_MODULE,( C& ]) _# i" A! n3 f
.open=mcbsp_open,( z. y0 M0 N9 m# k( R
.release=mcbsp_release,! b! M9 ?2 _8 k6 E/ @
.write=mcbsp_write,
# I. Z7 x+ a- m5 n9 e .read=mcbsp_read, o+ O$ M8 j/ t3 c7 [2 h* N$ M
};
. J3 ]% N' s1 s* U( {& mstatic int __init MCBSP_init(void)( i. R1 l( v; g7 O' x+ D! ~& q [
{# J1 m1 b( X4 q1 t) ` s- x
int ret;
$ [9 d, x* Y1 V0 p! M& @: t" M unsigned int PINMUX1_REG_old;
. B G1 Y2 L7 @) x. L* N' B n5 ^: `' Z unsigned int PINMUX18_REG_old;& S+ Q: R G* M+ Q {7 X. T- @
unsigned int PINMUX19_REG_old;
, s' x8 ~8 U9 c {; g6 {( E8 D* H1 q unsigned int temp; ; T4 B1 x: R% g% {! q
if(MCBSP_MAJOR)1 u( W( Y# J( c5 J+ f
{
. w5 }: t) b8 h0 h7 w: G+ Q0 `8 a mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);) a8 c' B. `5 X1 Y
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);3 _+ Y4 b- L/ \) n
}
' V4 X+ n9 D4 e. D: E else
+ }) H: H1 y5 S0 C" Z* A2 v {7 z" Z3 E+ J! t, U
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. K: I: i8 |/ w; H* k1 P MCBSP_MAJOR=MAJOR(mcbsp_dev);; N4 ] z0 k* h9 ~* [, m! o6 s- l7 B C
}: u% w' Y$ G0 v8 S% |/ @' A
: e- h" e2 P) n* V' _) R# U N
if(ret<0)
`! A5 J* j! C2 A& N4 [* F {# u, S# X& y6 P: u7 D
printk(KERN_ERR "register chrdev fail!");5 l( Y. H# Z3 k' T0 M% \/ e
return -1;
% d. C6 l3 a2 @* I* i& Q! s }/ X8 m' h5 V9 D! _3 _7 `
y3 b" [6 A1 \ }
mcbsp_cdev=cdev_alloc();
( k" x% g* b4 F9 Z# {' _& s3 Z / H* B2 y% R9 J& n) Y
if(mcbsp_cdev!=NULL)
1 J2 {0 A: O* S- ? l, U. l$ F {) I) r# M. w; e9 q# N C
cdev_init(mcbsp_cdev,&mcbsp_fops);
) ]# r( d& d3 ^ mcbsp_cdev->ops=&mcbsp_fops; A2 E3 y# C( u) `
mcbsp_cdev->owner=THIS_MODULE;
r K! k$ B5 `0 O; t# D4 C9 a+ k; N8 Q
+ W' z& e3 Y, w: d) j if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ J+ w' W) m2 D2 S6 F j& V( f% g
printk(KERN_ERR "register cdev fail!");
9 S$ ~% B. \3 [/ l; E else! b6 \& w! H% k1 U) e9 D
printk(KERN_ERR "register success!\n");$ R( z5 |4 J* w3 w
}$ a- t' A1 _3 w Z. R6 `& t
else
2 M+ A' B* k' ]5 G! x {
3 A) G- v' P- a x% S printk(KERN_ERR "register cdev err!");
' z& k T( f1 d$ A* e$ L return -1;% Y1 g* e. i/ T5 c5 `
}! ]+ Q& o% |5 S- u
, X$ b7 |' F M+ G; @8 [: n/ @
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
! E2 E( x7 U! @4 ~7 z" j if(IS_ERR(mcbsp_class))
3 d7 j) k8 p& W4 b8 {# f {
: }) H0 n" E: |3 C4 v4 b' B3 U printk(KERN_ERR "register class err!");
& h& M3 y% l4 X! W2 v return -1;0 B6 z, G0 E: |% w0 t' t9 D ?
}
- @1 B* U+ |0 s device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# ?+ ~$ C4 F* C }$ R; A! b2 V! S
4 ~$ N6 G3 l" M# G+ S //PSC3 I! @3 m. C+ c& Q; W( Z
//add Enable MCBSP$ V" _( q) E7 _# O) D
//test
8 T- ~# F: V% s$ y! j5 _* F temp = 0x80000003;5 ^! v2 }! k; W1 z7 ^: ?/ z
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% B/ y m& I, i3 v$ B8 S) Q temp = 0x00000003;
! O8 e6 D) s% H2 n" J4 a# r writel(temp, IO_ADDRESS(PTCMD_ADDR));" g$ I" }# h+ B' M1 W4 Z* t
$ y% h" W2 W6 H: C1 I* o- H temp = 0x001FF201;1 i% D2 p) @5 m. n ]7 U
writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 Z# C* z. S' r1 ]3 I. c
, D# H" P" ^. {$ F: c" Q //PINMUX , p8 u1 F. x/ C1 b+ E
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* F1 Z" L0 c! h5 s+ p" i
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 K% h4 C) h! A! |% x9 ~6 ^
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
" U: S1 E* n% e( O+ L writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. g# k3 s6 V5 R2 ~1 `
$ N6 {: r1 }/ ~4 T+ ]
//SLEEP_EN,EPR,L138_SHK1,L138_RC
+ D% `4 q. b, J9 {) I- z7 Y0 r PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 6 i5 p+ b5 U1 \0 e; n& q
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
, g, v/ A* m6 w writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 y+ O4 M" V1 n8 A: O! R
' c+ E: a5 N9 b9 \0 ` //RESETn,L138_SHK2# |( J+ }! u8 N
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); # q6 ^% J# E- B* b
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; # ]& U3 X" H5 u- d/ J
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% ~ j7 L( j8 M: \4 Z7 U
, O7 f* I) ^0 v" o; J
" F% g Z3 m* y6 [# ` G //SPCR Register# c9 ~. O D/ `
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 I6 c- o8 c, Z- t; b, J. H" O: `
temp = 0x03000000;//(DLB=0)
! F$ [* \+ U9 P1 }; r8 n // temp = 0x03008000;//(DLB=1); `; L; C# ~! S& l8 S4 S: V. y
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset/ f f+ S- i1 F2 N7 J
temp = readl(IO_ADDRESS(SPCR_ADDR));
5 D$ ]5 F, \- N9 B. [ printk("temp=%x\n",temp);
% Y* `2 C# |/ @6 i) }) Y, |
+ P5 ]8 h+ ]0 }0 t( M# X //PCR Register
5 W% _" ^) ?7 H2 R+ t1 v //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
Q3 D( X! B5 w' l# y# I0 b4 i( J- G // temp = 0x00000F0F;
( |7 ^. ?* Y/ ^; F7 d temp = 0x00000B0F;
/ o0 f8 U) e7 _; R+ n writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized - \( y0 Q9 _2 }4 z" _, j
temp = readl(IO_ADDRESS(PCR_ADDR));2 r4 i- X) a5 |+ d% J& d5 T: n
printk("temp=%x\n",temp);
8 x) W1 g( \3 d" n: e- Z //SRGR Register% I- t/ g# N0 x% B4 \4 u+ l
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11 |" E9 p. c9 ?& j4 {0 O. f' D/ E% W
//temp = 0x301F000B;
. g+ v# J# r5 ?9 A5 Y: I4 w writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 6 S! S0 A& f5 z" k* r4 @+ I" m
temp = readl(IO_ADDRESS(SRGR_ADDR));1 Z9 V m% H9 x! {
printk("temp=%x\n",temp);9 h" h- m2 l6 {, ?. R
//RCR$ e5 g, {/ h: T5 w' |0 A+ y4 }
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 d- V$ P( W! J \% g
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 S7 D$ j0 ^# Z x4 _: s temp = 0x00440040;
6 B/ P* u( m5 \5 V writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 R% k( a( z! [" B
temp = readl(IO_ADDRESS(RCR_ADDR));
, \0 B2 z- j: p$ S4 ^/ v$ F printk("temp=%x\n",temp);. ~0 u. m8 l, ~1 C1 K4 U
//XCR
* o) l8 m G' i6 j4 T) e //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! D" A W/ i: Z' W) u+ Q, G* I# n3 I
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( S. g& Z4 r0 d/ M
temp = 0x00440040;1 Q1 t' K2 B! m; t( a, \- i* N
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
9 i, E) N9 j5 y3 Z! v temp = readl(IO_ADDRESS(XCR_ADDR));1 d; ^6 t- D* B/ l w4 f
printk("temp=%x\n",temp);% E1 d5 \& B: `- q4 s* _/ P" ~
udelay(100);) t$ O5 x+ t! t
//SPCR Register% z& v& a8 g4 W, V# V% z1 o
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, a" i: H1 }: ?( p* c temp = 0x03C10001; //DLB = 0 VS DLB = 17 U- f) j1 x3 E$ [2 P" i
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled. w6 p7 h. k) A
temp = readl(IO_ADDRESS(SPCR_ADDR));
# A {+ }1 Y- z printk("temp=%x\n",temp);' B& ]3 Q8 X1 {; R) S9 I4 z/ d) n* P9 t1 o
udelay(100);! E4 ~6 z' a; p* J& ^( Y+ N2 q6 b& G
4 m# ~; w1 w f: j //set GPIO direction
+ p8 a' P' Q% Z& ]7 a8 S temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' h4 e! P) K0 I4 [ temp = temp | 0x00000100;//EPR----input/ }. c- c: U; k0 M
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% n, [" h* N/ A9 u4 o __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) \5 T7 y r, {# x
9 J2 [7 {* z. X$ ~ return 0;
% X4 e% u0 X5 D' A, w}
9 |8 l& ~- w$ Z7 b! o/ a7 [static void __exit MCBSP_exit(void)
" S, Z- ^( T0 z+ Z0 N- a8 H' E{
! z) T$ J7 d9 T printk("mcbsp chrdev exit!\n");7 V2 K- N9 Y+ `
cdev_del(mcbsp_cdev);
/ B9 G2 `. V: a2 {* C unregister_chrdev_region(mcbsp_dev,count);8 K7 S* k9 v: u$ N
device_destroy(mcbsp_class,mcbsp_dev);3 t& u) D0 I& T. h( `
class_destroy(mcbsp_class);
- R" b4 }. S/ z% \}; H* \$ l- r$ Y: v4 G7 ^
module_init(MCBSP_init);) W+ i0 v% U! F" S" }
module_exit(MCBSP_exit);
2 T, Z9 L" V) o: w. {, H
5 a$ ^2 H3 I; I" hMODULE_LICENSE("GPL");
( S; Y, N/ l9 M$ J, ~# R5 j; I; n# z+ f+ S3 k: g0 I2 d: {
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
9 Y( V* S1 y( U: C7 ^+ k9 d我的应用层的测试程序如下6 A+ [! ^/ u* r( i
#include <stdio.h>
# x/ @) ]& s1 A& C3 O#include <string.h>
( {5 C+ }' P0 x! _: |4 P2 K6 g }#include <fcntl.h>
1 s( z# [; k* `#include <unistd.h>
/ |/ K& L) w3 ?0 @/ r/ t9 }$ U0 J#include <signal.h>0 G7 X5 ~% ]/ G' [3 I1 U
#include <pthread.h> //线程8 `- O. Y4 m0 A+ C& ^5 {" `
#include <stdlib.h>
4 \0 E! Y( N* V' p5 a#include <pcap.h> //捕获网口数据# T& N( W2 @* g0 J1 \, ?
#include <semaphore.h> //信号, m% r) z! A% D
#include <sys/types.h> //消息对列' Y* S' r$ @& I' \0 S( j8 i
#include <sys/ipc.h> //消息队列5 R, s- m+ ?# [" k
#include <sys/msg.h> //消息队列
- h! s! n. T* m; q1 f#include <sys/select.h>
5 z7 h* i ~6 u5 ~+ [7 I#include <sys/syscall.h>& D; a4 l9 u1 y# d
#include <sys/stat.h>
5 \5 F" a- ^% W, l! U& U% a; j) x#include <sys/mman.h>7 E7 {9 w z9 ?9 M0 o
#define msleep(x) usleep(1000*x)/ Q p& D L7 u/ F7 T
) E, L0 x2 J7 I0 L7 F0 }
int main()
' D& S8 I3 r8 t5 {{ 9 F. \, A) L. q# X! P# S
//MCBSP,ARM与AMBE2000交互设备5 q6 o6 W% |2 U
int fd;9 [8 i7 v) W1 U4 a
unsigned short data_write = 0x5555;9 ~# I) v; P, K. O; U8 K
unsigned short data_read = 0x00;+ `2 d6 y W4 m) q$ r4 m
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 c, H! J- t! H& M. K! e0 a5 U. N
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- f0 J. @+ M& W( v' t ` 3 f; c% T+ b' `& Z
if(fd < 0) N/ s5 |0 G* Y" O5 e- W( C
{! m1 ^; j6 |7 V% {7 `; ]) X; C
perror("open failed\n");+ H& g+ E2 q% z/ Q6 C. E
return -1;
# I i* E+ G$ d/ D0 d. }2 i }
" f( N1 b) k$ @5 } p' j7 z
% q( @! Q8 k5 W' a2 h: `/ m% j while(1)( ^; {1 B1 e7 A! L+ N
{' h: L8 Z4 j; H; b7 l! K
6 a# x8 q+ ^$ G! x- Y
//AMBE2000每次读写是24个字为一帧% w- v- n8 E0 n& s) a) F0 `
//写数据时将数据在底层存储起来,等到中断的时候再发送
" R/ m+ V* f; @- [+ _ //AMBE2000输入数据是以0x13EC开头的2 r% ?) G+ y; y& }
write(fd,&data_write,sizeof(unsigned short));
, \2 G" I/ H/ [5 v
* ~) B& D2 V* |* E% N //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
5 f0 X/ l( w) x$ H! S4 g read(fd,&data_read,sizeof(unsigned short));
! X: g2 T$ j( W8 i ( Q+ p' r. o! C$ E
if(data_read == 0x13Ec)
5 D7 U2 v$ c. }6 D v {
1 P9 M' m1 T* ~; ~# H# S7 X! k 2 x# S5 Q' |4 r
printf("data_read = %x\n",data_read);
0 I% K/ ^& e0 w4 T9 l }
% ^2 ^% E! u5 v8 h2 g3 u4 l7 {& G + u& b( H, v5 E
msleep(10);
. ?$ L5 z2 t' x. q! u' G1 K4 T
. z ~( ^) H* r9 }8 @5 V) I* b /*
4 ^4 I! }' G( J, L" h7 O ioctl(fd,1); # t% E! L; o5 }4 d$ |0 e
sleep(1);
; k9 A! N: N+ x7 v/ \& p# H ioctl(fd,0);
$ e) \0 s% D4 ~$ M sleep(1);
! l8 G7 T/ ]- ~$ m# M8 X; J */
* K8 f" T9 \$ r+ g2 Z }
. p4 \$ M- c! A, T% x return 0;$ d& @8 E: R5 `6 o% H
$ A0 {; G, I% | w}
' I, C2 s; c- p$ ^7 m6 [; L1 A* o/ s8 Q# j8 s
多谢各位指教,谢谢! 急
' z2 [! {2 B# g- C4 F1 n
! z: f! K- q! s# s+ H4 s C; b
5 Z4 j, E& y" W4 C
, a+ v# v0 ?( q( g8 O, S& E6 V: a
9 d: a* t5 O. t- Z: T, d9 z) E; i' X. R# b7 m
|
|