|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - [5 Q. M4 N) {6 A& ?
/*
& U6 U/ E5 k! t3 H * Copyright (C) 2009 Texas Instruments Inc
' Q( ?$ q# l4 X+ ?* S% a5 q *
8 v# K( F/ H! ?! A * This program is free software; you can redistribute it and/or modify. ^) U4 V! c2 ?; k6 \& C5 u
* it under the terms of the GNU General Public License as published by- F' K f7 O7 b) N0 \! p
* the Free Software Foundation; either version 2 of the License, or8 C' |- r" T5 f" Q: V
* (at your option)any later version.& ^% g& V8 _0 R3 }) I t& x
*% z+ T; z1 b) ]& \$ G8 `* r
* This program is distributed in the hope that it will be useful,
0 b8 E% p/ Z b" y+ O2 \ * but WITHOUT ANY WARRANTY; without even the implied warranty of" j& d5 ~- l; }+ W6 \
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ `0 t6 C7 }8 l: _
* GNU General Public License for more details.
" Y! W2 v' {+ k `# E d- S' s; G! | *4 e& F% Z9 T. k/ k% F# V) G
* You should have received a copy of the GNU General Public License( Q1 ]1 [0 G$ `) W+ [( S
* along with this program; if not, write to the Free Software1 C/ p# a8 n0 X, A% F' g' G0 F" {
* Foundati
0 D. @4 s6 v- r$ q+ r*/
! Z! |( _& m; z }8 S#include <linux/module.h>
9 K) I! X6 C, i; a4 E3 k" P#include <linux/init.h>
& K7 f9 _5 x1 @#include <linux/errno.h>
4 B Z& r% h ?# Z$ O#include <linux/types.h>9 g2 X; z! F& S8 e- R4 ^
#include <linux/interrupt.h>
! V" x5 Z2 i% L2 G' w7 x+ M#include <linux/io.h>, \2 m4 v% U; b0 n9 e
#include <linux/sysctl.h>
) \ Y2 G8 H/ }2 x, n2 _+ V+ q#include <linux/mm.h>
$ z, E0 ] s3 @( K#include <linux/delay.h>- `1 k6 X: S! e! v0 a, Z9 {
#include<linux/kernel.h>: L7 o; v4 [( B* e. H' [
#include<linux/fs.h>
6 ?7 i( D7 T e' `#include<linux/ioctl.h>
v2 b5 \6 t& X; |* d& [4 \2 U#include<linux/cdev.h>
! K6 E3 b. j" @8 V+ W( g#include<linux/kdev_t.h>( R+ r1 [ o; h9 F- R
#include<linux/gpio.h>
2 P6 ^) Z) w/ ~) S7 J#include <mach/hardware.h>: H% j0 G6 f1 g" ]! K
#include <mach/irqs.h>: t( Q9 o. D. O* }
2 \4 r7 a: ~) H2 {: |6 x#include <asm/mach-types.h>" }7 g: l4 J) w! L' @
#include <asm/mach/arch.h>& B$ M9 y0 ]* p! v% _( M3 K# _
#include <mach/da8xx.h>
1 j& ~& H y. w( Z: c' U#define SYSCFG_BASE 0x01c14000
! }3 |. @% ]/ o$ m4 _1 k#define PINMUX1_OFFSET 0x124 - N( w( R- Y9 x5 q( O
#define PINMUX18_OFFSET 0x168
" [# F7 @; P) A$ W# J- m- a#define PINMUX19_OFFSET 0x16c; m& F, i8 F% u
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
; d" Y8 M5 y0 c* Y9 K7 y% _9 x# Y#define RCR_ADDR 0x01D1100C //MCBSP1_RCR5 X" ]7 \9 \8 C( e
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR" _% f3 \7 A, ?0 j: P
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR4 x& d' Y$ t* n1 l* a
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 S7 Z5 y/ `# ~+ c
+ |& t/ Y0 B: v& O$ S2 Q#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 |" o0 h; B- x! E+ f#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 S5 b$ U6 a5 P/ B. G N* M9 j, H2 w//PSC! G( d+ D! S! z$ h; i: A- a a
#define PTCMD_ADDR 0x01E27120 S/ W; E6 r8 S1 A
#define MDCTL15_ADDR 0x01E27A3C
9 R' O x0 H( b. M/ X" J#define PDCTL1_ADDR 0x01E273044 c' _' b8 c2 [' ]2 o i
//GPIO8 direction ^. d1 Q: I1 R, ?& e$ W
#define GPIO8_DIRECT 0x01E260B0
" I# }* |: D' `6 a! N( S* r5 g#define GPIO8_OUT 0x01E260B4% p# ]& o! s% l6 h& P% l; X. c
#define GPIO8_IN 0x01E260C0$ A. i9 n4 t3 E0 y; F1 s
+ i9 R9 c% D2 }7 @# I8 U, }
//#define MCBSP1_RINT 99 T) X( {3 k# Q0 o: H
//#define MCBSP1_XINT 100
) V* z$ n' ^0 p9 ]: Ustatic int MCBSP_MAJOR=239;0 b" m7 T! n @* B2 Z
static int MCBSP_MINOR=0; G& ?& ~8 y' G/ W0 P
static int count =1;
# M+ u q: p' I) U9 ]7 u& x' G/ `9 S4 g; j' O1 Z' W3 `
#define MCBSP_NAME "MCBSP-device"
+ X$ c% {. S D# U$ f/ u2 H
( c% U3 H$ t% P a. [static struct cdev *mcbsp_cdev;
6 q1 v& }6 |4 h( l- ^( K: J- {static struct class *mcbsp_class;
0 C# }& g6 _3 }3 Wstatic dev_t mcbsp_dev;
, [$ F. s' f0 u4 x# Sunsigned int DRR_data;) e B+ b( l; l* x
unsigned int DXR_data;
$ [4 a% [; F* e5 ]( pstatic int mcbsp_open(struct inode *inode,struct file *file)
1 }: m7 A a! H' d. B$ R& G2 h( [{
" t: p. k$ M/ I7 D- I% p
$ i: J* _9 y; k7 B1 W E //interrupt enable,initialized9 H t4 L6 q. [- S/ E" K! f- n3 L
unsigned int temp;
/ I& l+ e' x" |4 |- i6 P //SLEEP_EN(GPIO8[10])---0
3 L9 n+ V2 h+ A, a" ^ Y$ p temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 E4 y: E8 L7 I# r7 A; s& L
temp=temp&(~0x00000400);
5 K+ \; {: B9 _, `5 A @# M: j __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% M+ L* Z% i3 W0 q! K" A //RESETn(GPIO8[8])----0----10 M. H) v+ T5 l+ {2 L) _1 ?. s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& V9 |/ t5 ~) F, r7 U: q( m temp=temp&(~0x00000100);
; f7 Z3 h# W0 S% ~4 E __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; b6 }+ h- @; \2 } udelay(100);9 m h) I0 L: j0 }9 S: K$ r V( ]; i
temp=temp| 0x00000100;% ?" j& ?, D7 Q' v# o8 i+ B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* t% f7 ]6 f, u1 r7 n
udelay(100);6 X; z# ^# ?( Y8 h7 e7 X
printk("open success!\n");
% @# Q% a% o! h& e2 B return 0;
. r+ a% J/ M5 ?+ }8 f9 |. L}
4 S; G% i- ~6 J! |& Q P6 y+ }, g, n" ?+ H# v6 ], |( H3 Z( V+ J& U
static int mcbsp_release(struct inode *inode,struct file *file)! w: B- x6 M3 C) }( N
{
2 j3 w# Z, _4 H/ f3 H( b- p) I8 d printk("release success!\n");
* h: j2 s3 J) B& c' V2 Y# E return 0;& Z$ r F5 }! B; l( z1 P- ]
}
, V- A4 _+ W( ~4 J3 \5 y
: f2 h! ^7 s$ b1 Y3 }% xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% ]% u* G$ w; S# Q- \: }8 |{
. X) r/ D* r w+ x, G* E( ^ copy_from_user(&DXR_data,buf,len);5 ^+ C# {/ g. p: r
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
; @, @% I0 G% b B return 0;
- S5 G0 ]8 t2 G# F, E
H$ G: P' ?. q8 b}! e6 p, B9 S5 R- U1 |
) a) F( H/ S1 L2 _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 O6 ~2 g$ p" g5 q2 Y
{
& W% }% v' L( C- V0 r1 W DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ]8 v0 ^0 m- J( e- {8 g9 j copy_to_user(buf,&DRR_data,len); ) ~ A% V8 G/ }& i3 E$ t. {, U
return 0;
) I+ D! V b% F; d}% e8 A$ q" L& }* s
4 r; [2 }' [7 \$ ^/ g- Y: a Y+ b) J; O8 ^
static struct file_operations mcbsp_fops=: a0 l' j+ X8 K& a2 M; G4 t% L
{
% E) U2 `$ X. ]- @, ~ .owner=THIS_MODULE,
4 z6 J; h& g; d: R .open=mcbsp_open,0 p5 K5 t4 q( a, l3 a$ [( y
.release=mcbsp_release,2 n: G& F6 E% D8 R
.write=mcbsp_write,
8 T) d$ {9 ]; J5 z% n4 U2 s( E .read=mcbsp_read,
) o8 [1 v& |& M1 s};
* ~7 `) Z, o6 s! l' `static int __init MCBSP_init(void)
% ?. N z( \* r8 |6 ~{0 y$ {# z6 R) P4 _2 E
int ret;6 l) V2 g2 J& I
unsigned int PINMUX1_REG_old;
R. j( \/ {# T9 h. O& s unsigned int PINMUX18_REG_old;
: X3 O. S% X! J9 ^7 k* b/ W2 { unsigned int PINMUX19_REG_old;
$ W7 p7 L' o6 s; {3 ] ~* [, ? unsigned int temp;
, z ~% H. J, C' c5 D if(MCBSP_MAJOR)
& C" j3 R; `( C {& |8 X1 g% ~& y' k
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' u0 h0 ?" S- H$ {1 e+ u; \6 J* ?2 F) F* P ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% T3 F) o. t8 N: u
}* Q8 {: d6 E7 G' F
else
t) O' X, k- a0 Q& |* s {. T1 N- D5 K) N& x9 J
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);0 u! C, o) n7 f
MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 ^; K+ E8 f4 A* o6 b }
0 H& ^4 ~0 E9 q9 @& d. _8 k# O" p 5 {* l) ^2 w0 b3 e, _" Q7 F" F
if(ret<0)
' X6 U, p; K8 Q6 r; C; w {& m1 g" X3 ?% t n5 o( ^5 l2 _
printk(KERN_ERR "register chrdev fail!");' [9 |& `- @0 d! ]/ \: t+ f1 Y
return -1;
+ t3 Y* s7 [- | }
; @, K" M" f6 U1 P7 i( {. I& ^' q$ A
8 k: k0 ?( H# X S' B3 W mcbsp_cdev=cdev_alloc();
6 N$ H( H! W! O2 B2 U2 V
6 I6 L6 \& p& V( i! n! X% i4 A x* L if(mcbsp_cdev!=NULL)
1 s+ {& R6 {0 k" B# h$ Z {% W! N2 v% w' e8 y$ ~
cdev_init(mcbsp_cdev,&mcbsp_fops);
3 B. j/ k! \0 v: z- V1 e mcbsp_cdev->ops=&mcbsp_fops;
0 H- @7 R' o; r) w: X- l4 [ mcbsp_cdev->owner=THIS_MODULE;
, Z" r$ i; ]8 |! [ ; U2 L5 [( P& B6 ?) N0 D# x. B
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& w q) z: ?1 g! s. p6 k2 r3 K printk(KERN_ERR "register cdev fail!");+ q0 E: b* O8 a1 `
else, h' p$ [) L5 _# g
printk(KERN_ERR "register success!\n");
( n7 B- {. M: Y1 t }
2 H2 w& ~2 B7 ]" a else
, A- i6 {/ [) p! p {
5 K! S8 E! v: F# b9 t printk(KERN_ERR "register cdev err!");
* f/ \# [3 ~" l. j$ l return -1;5 i) j+ A# p& a8 d+ d! X
}
1 @3 |/ h7 P8 A . j6 u0 M) H P& v, A* N/ P
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 w j- z7 ?# ~" e | if(IS_ERR(mcbsp_class))
* X- u; N& S3 M* I; \0 u5 c ]# O; i! T {
4 `+ t& V, \; t6 ^/ X printk(KERN_ERR "register class err!");2 @! K4 Z" K+ Y( R8 Y* i3 Y
return -1;
) }7 g8 e+ F& M' h }
2 u; @8 _, }' o4 |" b- X device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 l5 C7 I! p) t1 W& r( X- E- s5 g% K* C1 C' L1 J. @ k
//PSC
4 R2 _8 W: ~! ~, p E5 S- \0 Y% @ //add Enable MCBSP8 ~) I' N4 _5 O( I6 j, O \# w/ N9 D
//test
/ i( W2 `4 H. N Y( P4 h temp = 0x80000003;. w! h) u4 A! ]& k! J
writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 p+ _( S7 z8 Z0 b9 ^5 Y6 h, Q9 o
temp = 0x00000003;
) B' P2 p$ S v1 ? writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 e5 A% q& m, s! N9 X' f# g n' c / |9 N' e7 L, @: L
temp = 0x001FF201;3 f" Y, z- R1 y. v: p" o* U3 B
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% O& i5 }8 T2 R$ t
' [; Y7 i0 G1 } //PINMUX " z' F/ y: s1 z; {9 T( M
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ ^- i) N! |" z* |! ~
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- l. U- a, |" A1 [) y6 j2 b PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
3 |2 l4 r8 t& t1 k( `! c writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, Q+ o, ~5 K) V9 J/ I, [/ n. P 1 g0 L V8 n: P# c" I
//SLEEP_EN,EPR,L138_SHK1,L138_RC- R8 `8 G5 J% N9 t3 e' Q6 L: p
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. ?/ |3 d6 |& `( M2 Q: x! X' a' | PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; * K0 p& R; A6 M1 L) h( R
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 R# H/ d+ K6 R, y; }3 z
5 t6 D# N: e: O# y' r0 t //RESETn,L138_SHK2( p! C S* O" H8 [) R
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 b0 E; x/ ?9 v, U7 i PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- {, z% J9 B% `' h* ~ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 o P' {8 D4 Z" ^/ T
3 Q' P. O/ ?' Z
. }8 V& e& U6 J. k! @& ] //SPCR Register
1 o& ?9 E z9 K7 V3 Q4 Q1 ?7 J0 [ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ u/ |4 c* T% h+ e
temp = 0x03000000;//(DLB=0)
" F( c) c( v% v0 a8 x+ } // temp = 0x03008000;//(DLB=1)
0 w$ i# u2 w d; \9 a8 ^, h; ?/ I writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% I) y. e }% l7 a0 O- A/ D/ [ temp = readl(IO_ADDRESS(SPCR_ADDR));
& |: x! F" w$ z3 b H# V printk("temp=%x\n",temp);3 o6 W+ y, ^/ e) ?& j' t
$ n# A T/ X5 ` F
//PCR Register
- [. r# A) E- ^7 [ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* n3 Y7 y: d' _' l+ { // temp = 0x00000F0F;
4 Y& Z/ x, l! ]4 B: G: Q temp = 0x00000B0F;
5 M3 ]$ E6 I1 G( g) @) R writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 E- \& |. ?' C+ P" G( I5 W temp = readl(IO_ADDRESS(PCR_ADDR));
# Y5 }' ]: p+ } printk("temp=%x\n",temp);
) t1 e2 _) Y5 ^4 R3 h$ w; I% _ //SRGR Register( ] Y, ]( I8 f
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 P3 W6 \: Y; r/ f6 M
//temp = 0x301F000B; H9 s$ h) M" h1 W
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 3 k# \2 ~2 K0 ?" N% P8 m0 v K
temp = readl(IO_ADDRESS(SRGR_ADDR));/ A( b& o) e% J$ \( J
printk("temp=%x\n",temp);( Q; m( \- a* `( Y3 ^8 h6 b9 E
//RCR
; _9 E# t {- ~7 f+ b" _ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ r7 @$ N# b; g
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( W0 z5 G/ h# v$ |/ k5 ~ temp = 0x00440040;
0 J* x$ P9 H+ G writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 Q' W/ @; l t9 w2 j
temp = readl(IO_ADDRESS(RCR_ADDR));& C5 c( S: g# ~: @" s5 d
printk("temp=%x\n",temp);6 Z. |& D, o+ N. R# f, b
//XCR
3 n8 l* E9 `2 C& ]8 z9 S B! u //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# d6 ]* H l. r
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0+ B. n" p! E3 B$ R9 C1 f l
temp = 0x00440040;
) r% k% j6 Z) g writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
5 \, U! A0 X6 \: M% y7 U' } temp = readl(IO_ADDRESS(XCR_ADDR));
! [7 G, s% Z) T1 G q, q printk("temp=%x\n",temp);0 P# S1 T" w, z# g) G) m# s* Y
udelay(100);
, f* D, x" [( s3 T& s3 a //SPCR Register0 a6 `7 R" c( ` P
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" [2 b+ X# t' W- p' u, t; } temp = 0x03C10001; //DLB = 0 VS DLB = 1
" m" X# o0 a7 f# g6 ^9 d1 m+ o) t6 I writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
( C3 b( M5 `/ J3 x% |7 t temp = readl(IO_ADDRESS(SPCR_ADDR));
8 f" E E+ y2 s+ @) a" S printk("temp=%x\n",temp);
Q$ `. q6 y8 }' f7 r udelay(100);
1 e5 O: X7 s/ u; g' h9 [1 L; F0 T
0 @. v# K, B3 W9 n q; F4 t //set GPIO direction/ l7 z- I- m1 `2 b2 f' ]
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ d: p& T2 H* o
temp = temp | 0x00000100;//EPR----input
, g" L+ q7 y4 Z% N" X/ i6 x4 I3 V temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. |. t" R& p0 W/ R0 }7 X# r! A; ]- M __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 h3 l8 O; C* Y# M! h* y
0 t8 Z. g1 j& }8 d return 0;
9 K$ z9 a+ z W7 f}; ^2 V; D8 e5 v4 Y6 ^. O
static void __exit MCBSP_exit(void)
2 \6 {7 c1 [1 g4 I0 p; g) G9 R. R4 @{2 t) e/ _) ]* v& O- H
printk("mcbsp chrdev exit!\n");( n' i( s; ~. j) B# o
cdev_del(mcbsp_cdev);
# v: x) D& s" Q unregister_chrdev_region(mcbsp_dev,count);. x; H" J) D) {* Y$ X7 b8 g
device_destroy(mcbsp_class,mcbsp_dev);
5 H' N" o9 g6 Q; P! J( u" q class_destroy(mcbsp_class);8 G* h- }" D$ p% C3 H$ l/ u6 e
}9 P) i. o- ?* m2 U x
module_init(MCBSP_init);+ T. k5 _/ V) x0 t% X" d0 L
module_exit(MCBSP_exit);- A* p3 o' h9 g5 K( M
5 S# L! j. l6 z' N" p" [: x. g+ Y& y- @
MODULE_LICENSE("GPL");
! c. T( h- ?0 `5 D7 ^* h+ U" j4 x! B5 a$ {- I) c8 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; a Q) u e- l
我的应用层的测试程序如下+ b: D& v! X# W) a# r3 {0 Y5 B
#include <stdio.h>
0 [0 E$ S# l$ M q- p#include <string.h>" D7 Z3 h9 n& n4 u* E% z, Y G2 L9 {
#include <fcntl.h>9 c9 G4 L- }6 D: F3 X
#include <unistd.h>" m* g- e( X7 O% n
#include <signal.h>8 U5 P' x/ W* X1 ]
#include <pthread.h> //线程 v. n3 f z$ {2 ~* m
#include <stdlib.h>* q6 E' K. |3 n$ o' n0 _
#include <pcap.h> //捕获网口数据
4 Y9 c! v- u5 T. B2 _#include <semaphore.h> //信号9 ~3 {7 y: P% R# `. N. J4 j2 r f
#include <sys/types.h> //消息对列 P9 h) {: d0 H( a1 V( b9 I8 p. W% D0 y
#include <sys/ipc.h> //消息队列1 _2 k" X; N3 N1 ]$ e
#include <sys/msg.h> //消息队列
8 h- a) S. \5 N: T9 |& Z5 [" F#include <sys/select.h>
7 r7 c0 x9 P4 z6 g" h#include <sys/syscall.h># ]8 h' }; J* j+ T
#include <sys/stat.h>
$ w/ N0 K) _7 Q: z/ o3 I9 X) Z+ T#include <sys/mman.h>5 n$ Z6 }, @5 N
#define msleep(x) usleep(1000*x)7 i- A' K Z" ~5 U x
0 x) Z8 m O+ r( R& [+ }5 z# X8 {
int main()
; Q; h5 p; r5 q- f{
& }7 @; i6 n1 X //MCBSP,ARM与AMBE2000交互设备
& T$ Y/ A" m, |* d% | int fd;
: C' L R& e% [# \+ @3 G unsigned short data_write = 0x5555;
1 j6 I4 p- I7 K unsigned short data_read = 0x00;- @( l: h% n: K1 P% l. y$ U2 v
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
- `4 u! `9 ]0 F; J: R. v // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' M N1 Z# N1 x5 V( n# f. z- r% [6 W4 k
( V' E1 M. S- m1 y' T# a if(fd < 0)5 N1 _; d; H) ?; x
{ g: I& h$ T3 K4 ~
perror("open failed\n");9 r4 Z$ K5 \4 p5 O6 I2 {8 Z
return -1;& n5 L2 `7 |+ y3 ~4 f$ g8 A
}& g3 I9 N) G4 O% }/ w: [
: b. A4 {: i$ q3 Y2 e: m% P" | while(1)5 i( v3 f; T0 `
{
, F a& \3 s, }. _+ O; b7 _
+ q1 Y) i6 k- u0 M: q7 v //AMBE2000每次读写是24个字为一帧9 r3 c. V# c. |5 g# S
//写数据时将数据在底层存储起来,等到中断的时候再发送
: F& K+ w6 q* C6 x" S6 e) q //AMBE2000输入数据是以0x13EC开头的+ }' c0 k3 I& s8 G3 q
write(fd,&data_write,sizeof(unsigned short));
" D, G/ a3 v0 i# x5 |, A
$ |# {, E3 |0 q* w6 q7 i //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 9 m4 ~/ B& c% j$ Q0 t, g8 l
read(fd,&data_read,sizeof(unsigned short));
4 S' H: V$ R0 S! Q/ n' d: d5 u , c8 L. E* ?0 W8 l3 G N, A
if(data_read == 0x13Ec)
1 [* h6 O9 B5 n2 x3 _ {% O! f3 A2 O9 F* f4 U
; \4 s2 r% d* x3 y# H) m9 d. K" Q
printf("data_read = %x\n",data_read);
$ X/ J0 Y% e9 U* X6 ?$ j }. ~, y j D4 p# J
4 r, G) _$ [4 a: n4 h msleep(10);# k7 O& f2 ]+ n+ i4 z
( A/ |& m6 Y$ A- ]
/*% `) a8 X: H4 T4 [0 t
ioctl(fd,1); ' B7 @" P' G6 i( F! g. S# M
sleep(1);
( X4 C2 e- h! ?! E4 N1 t2 K/ D2 ]6 Z ioctl(fd,0);$ B' d. F4 M4 k
sleep(1);
; @% w* ^7 U( o( }. m# a n% b */
3 y1 K/ C/ v. T: _3 x }
/ @0 D7 t# y( I& g3 }6 u4 B return 0;
+ D$ C K: d& D, V , e* _. v) t# r# A% u7 p1 Y
}
) F% @) T, s w2 J- A/ v5 l/ L I" f4 m
多谢各位指教,谢谢! 急
( M7 f! U' {; l0 P
1 U. ?3 T! G* {. P! B8 T5 A- M: n: ^3 [ }: Z) `
5 j E1 y X; E+ }4 |7 M
" J c# r2 r+ g w2 ]+ u2 k/ z- I2 o5 |+ I+ K) }4 E- ?
|
|