|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. s' p8 c: O. B( n9 l$ }/*2 x4 F0 h+ J7 ?! C. n# \
* Copyright (C) 2009 Texas Instruments Inc
/ x4 L& f) N N1 C ** w* o( Q, T+ j, l+ o6 i+ u
* This program is free software; you can redistribute it and/or modify
1 I3 n" A% O0 J% Z2 X3 a9 X' W1 f * it under the terms of the GNU General Public License as published by: c: K* {- U2 i y/ _% G% J
* the Free Software Foundation; either version 2 of the License, or
$ A! E8 {* q! Y. L2 @ * (at your option)any later version.& A4 _- B/ `4 y1 s: p! o
* P+ O8 k. j0 e8 W. ?4 L3 O
* This program is distributed in the hope that it will be useful,4 h- l& }# R' Q* ]3 f# K2 u, n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ I$ Q m7 F! E0 p" w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 V8 z, f/ R2 [ * GNU General Public License for more details.7 U' \% I0 ~" @. H- y5 J$ J% z
*+ j8 K3 t9 [# s& S# K. I$ m
* You should have received a copy of the GNU General Public License$ |& P; P. W+ h
* along with this program; if not, write to the Free Software
% L# b& l, x, V# f8 w * Foundati1 T" ~8 i1 e3 _0 h( Y2 `
*/
{* m9 |; U6 H. w% O+ }#include <linux/module.h>( L+ |) U- ]1 T( E+ z, w
#include <linux/init.h>! P6 R( v. Y7 a8 B0 ?/ D
#include <linux/errno.h>% B( _. O5 D' g( n) e! d
#include <linux/types.h>
8 o$ a* n1 e- n#include <linux/interrupt.h>6 D" g6 j2 F0 p4 ^: L
#include <linux/io.h>
, W" v2 D# k: Z( b#include <linux/sysctl.h>
$ r* X% g5 i* Y* I#include <linux/mm.h>
3 l3 I: q1 r0 h k- C! C$ V#include <linux/delay.h>
K: v I# I: r& @#include<linux/kernel.h>( q# e' R2 g$ U) m |8 H" T9 J
#include<linux/fs.h>
/ h8 |5 {- X' {! w4 t5 M#include<linux/ioctl.h>
1 A( V" s1 D; Z" \; ]6 X#include<linux/cdev.h>- Q, x$ |" X) Q/ o7 g+ f# L0 S
#include<linux/kdev_t.h>
+ U- s5 M3 @7 y0 y5 X8 z) X#include<linux/gpio.h>
% Z% | k4 M9 {; Q4 X#include <mach/hardware.h>
# n$ v( D2 @. M3 f8 a- k5 \! _#include <mach/irqs.h>
9 p- P) F0 \3 @4 b+ i7 C# _/ w8 [+ A# v) p: V7 K1 g
#include <asm/mach-types.h>% g- B( R) ~& a% Q' k, L
#include <asm/mach/arch.h>
$ V6 h3 ^- Z' ?# y3 t#include <mach/da8xx.h>
0 f+ n: T# h, J4 M1 l6 O c! s#define SYSCFG_BASE 0x01c14000
: |0 m, S- r8 h/ @# B. i( n2 D#define PINMUX1_OFFSET 0x124
* ?/ \0 ^3 |6 {/ F# ]#define PINMUX18_OFFSET 0x168 # q, k h0 a) L3 j# u
#define PINMUX19_OFFSET 0x16c
8 ]2 Z0 n9 \8 W. a& V# j7 r' q' M3 d#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR u, s5 W/ u! s. }! E j. Q
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. E0 K+ C2 P4 t2 n, |
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% O5 R! e5 c1 d" P% X#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR0 x) j/ A- ^* d
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR/ j( J$ V3 Q' A# T& L
) t( G2 t: K3 C2 v* m! N* C) @#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 q0 c4 ^0 D& }" U#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
* `; Z* x6 ]- t# L+ K9 X//PSC
% a% Q6 w; K+ u#define PTCMD_ADDR 0x01E27120
/ b( t& `; V# P9 }+ F: p#define MDCTL15_ADDR 0x01E27A3C
3 C1 \" s6 c9 S2 L, O* Z' m#define PDCTL1_ADDR 0x01E27304
; s- D4 j! e6 m! M8 n: w& _//GPIO8 direction; G: G b4 M- [+ \5 a* A
#define GPIO8_DIRECT 0x01E260B0
% s$ Q, j+ a5 R# q, L1 m#define GPIO8_OUT 0x01E260B41 A) i) V5 i9 M
#define GPIO8_IN 0x01E260C0
8 I4 w: ~! I" H4 I. ~3 ]. R2 ^- a
/ T! Z9 M) A8 y//#define MCBSP1_RINT 99 9 I5 I+ H* J2 R8 n; H9 P6 }& T2 P
//#define MCBSP1_XINT 100 ! t, d9 ~* Y1 ^
static int MCBSP_MAJOR=239;* ]7 E4 n' f3 n0 X) y
static int MCBSP_MINOR=0;
% X/ S& T2 u! p0 d l' C+ x5 pstatic int count =1;& {; q2 O1 f2 o* `+ ]
& h& N4 M4 @ A3 ]6 a! h- M/ V
#define MCBSP_NAME "MCBSP-device"' ?' n9 m) k9 @. s# P; q
( B/ v2 k/ q8 v" u
static struct cdev *mcbsp_cdev;1 k' N+ O5 w, U/ t
static struct class *mcbsp_class;
$ Y: X8 Q# T7 _static dev_t mcbsp_dev;
3 b' z; f; o( l; F1 M8 T. _' K# ~unsigned int DRR_data;( I; c/ ~; \. J4 R v( s
unsigned int DXR_data;
. z% Z0 v* I8 S+ O; qstatic int mcbsp_open(struct inode *inode,struct file *file)) U( p( W: C F8 Q
{
) N* e5 e s* e 3 |+ f( u% A: J P) m
//interrupt enable,initialized1 B7 \: }5 A/ S# P$ N
unsigned int temp;, `4 Z7 A D a
//SLEEP_EN(GPIO8[10])---0
* a+ o( }6 i8 Y# n6 K/ P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) E- ~$ g. [* t
temp=temp&(~0x00000400);
: H' o; k7 ^9 A6 [& C8 E9 Z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 r( l! x0 q4 \: A/ D* B //RESETn(GPIO8[8])----0----1
9 c3 a+ I1 m) N" t5 d+ | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ C: g2 F+ A/ b5 h$ P* s9 `- Q* C temp=temp&(~0x00000100);( r2 O, Q l$ g+ e! i5 o
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 D1 g6 ?( |/ Y" X" w( s; }4 i
udelay(100);
9 W; b/ z. m6 H3 O temp=temp| 0x00000100;
5 P) y& q5 N0 r) a6 X7 t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1. g; c7 U* R. y) I9 l
udelay(100);$ h& l0 g$ ~3 C4 R. C
printk("open success!\n");
. x8 D0 G' r3 K return 0;
+ `; x! }9 d e5 q' v2 S) Y}
) G0 t3 X& y$ U5 V) E7 K6 \
" g' D* |2 ?3 I6 {7 jstatic int mcbsp_release(struct inode *inode,struct file *file) a+ s5 N0 i8 N# b2 P+ h( ~+ }# h$ _
{5 c* u6 T. u; }) [! \6 Z* H
printk("release success!\n");# ~0 ]) {+ |( |% S
return 0;6 V/ e8 C% I4 `0 O% C# v" D8 V
}
" j" N3 B: T; L. I* P% h: @ x7 R7 [- P; N+ E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# b7 M* o# w; ^) y/ z( I{0 c- ]. j) P3 n4 W' J8 b( E+ \+ `
copy_from_user(&DXR_data,buf,len);
% G% c$ j7 z/ K0 R/ e9 F E iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 Q* m+ p. p* F3 @. S" M9 L
return 0;# a: j2 f" w! g: A# h* ]# ]' f
! z+ T W& e( }# g7 ~7 o: A}1 M; H9 x) c" v3 J2 _
* H- V" Q5 j% W! d' X1 O8 W7 h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( ]# |* H4 q0 k+ y! V" ]4 h/ j
{
& X4 k: Z9 ]3 `! n5 q7 G DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" f' k& ~, q$ W9 v4 d
copy_to_user(buf,&DRR_data,len);
: G/ g0 C# e6 r' ~; x; v0 Q return 0;3 q8 C3 p) y" c- b% t
}. k% L2 W& x5 b4 D
- l7 U+ S4 [! g4 `/ Z6 [+ }
; @: l+ M( O& @0 R8 [static struct file_operations mcbsp_fops=
8 G! O7 n! U: x. v4 G" b5 \! o{5 \# Y. O: d) P
.owner=THIS_MODULE,6 X8 s- F6 j9 H. ~
.open=mcbsp_open,8 N1 N: Q4 o; ~; \
.release=mcbsp_release,/ B! ?8 K1 W7 Z! `1 L
.write=mcbsp_write,
% O0 `6 r) Z5 H* |* ` .read=mcbsp_read,1 Q; a7 F: t# e4 v5 G6 R& Z* ~# `! c R
};; h& ?0 A( M' R$ S% L$ ~( r8 {
static int __init MCBSP_init(void)
6 [# d; T Y( x( w( x{4 W3 u% n& ]0 t6 u$ F
int ret;" D# l7 Y1 b9 j. x0 E: W; Y
unsigned int PINMUX1_REG_old;& T7 R( b5 l [/ U1 h
unsigned int PINMUX18_REG_old;
1 L: V7 P8 B' M- T unsigned int PINMUX19_REG_old;' p, Q' O3 f* [6 n
unsigned int temp;
" @1 N9 j) l2 u if(MCBSP_MAJOR)
0 A, G1 ^2 c3 a' T! r/ ` {) |* B( d G; w) {4 [! v5 @
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 h2 h1 \9 A# r
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); Q5 K7 n R9 b/ g* Y
}
0 L2 j1 [" e0 W9 x% l. u else! ~2 t" s2 R) U; Q: U% @% h) ~
{' O5 l7 P6 d9 c" U, {+ I
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" ?& p) U5 L9 n/ M MCBSP_MAJOR=MAJOR(mcbsp_dev);( }" x( S- S) `) Z5 }
}
" V3 S, g) |8 ~8 t7 @0 T1 T $ l5 z* e6 ~- H. E, i% |
if(ret<0)
! B( c2 i: Y9 ^" T {: E: a+ a7 _8 M/ e; ]
printk(KERN_ERR "register chrdev fail!");4 M2 ]# h j* {/ |4 C. n. B! Y
return -1;
+ v+ \: s# u% L( A! R }
5 D1 m, X. ?+ x# R4 e1 }* `
6 c; y: Y3 C v1 \8 F5 A2 B mcbsp_cdev=cdev_alloc();
: X: q' G( i2 W/ ]1 z4 X / K- o6 y5 _1 D" Q! ^& ^
if(mcbsp_cdev!=NULL)
( @1 k' p6 p# D {% H0 g5 L4 @4 Y9 y' f- Y# Q0 L
cdev_init(mcbsp_cdev,&mcbsp_fops);
% A0 u$ H E* N/ C" w mcbsp_cdev->ops=&mcbsp_fops;( Z: q1 m( p5 p
mcbsp_cdev->owner=THIS_MODULE;
" ]) V+ S2 I+ E7 d: X4 o+ i* W+ H
& Y4 L8 x/ `8 w* @ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 Y# v3 G( S6 z) o( k q; r
printk(KERN_ERR "register cdev fail!");
4 G2 w# p4 ]: D, o% O else! g5 U. l1 C! P3 s# ?
printk(KERN_ERR "register success!\n");0 V! ~' ?& H3 _2 u
}/ u) R! X- K0 h9 @1 a1 o
else
+ m% a& L5 |8 |- F5 ] {% h" I/ Z" ^1 m( X% k* I. a' o
printk(KERN_ERR "register cdev err!");6 { a* p5 ]( b$ f& Y9 M8 U
return -1;# U: h" S2 T* l2 K- J1 h/ x- l
}
0 k2 f1 s* f- ?8 h7 r ( y' P2 G* l; ]
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 [& _ I8 l& G/ i5 o$ h' |& ]
if(IS_ERR(mcbsp_class))
$ \% S3 K0 o2 e1 n8 {$ V3 g* P+ D {% j8 U) B( P. f: A6 e
printk(KERN_ERR "register class err!");
) y- T) J* h7 B9 J5 C: b return -1;; b7 s- J- [* l" ^0 }* e9 o) C
}
3 X( M+ S. {5 Q! f device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 K5 L1 s% R* U) q1 j. _% i
" Q( F4 j4 [5 s9 d! X$ c6 F //PSC2 P( q8 u2 s8 K; {! H l5 U* W
//add Enable MCBSP+ w& T& h4 g1 J, Y+ O) G( F9 j
//test$ t, \3 D) z8 Q6 @9 P' f
temp = 0x80000003;
" z6 y6 ^: Y! q8 k- K& w* n writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. `, b1 q& n( R& E% H temp = 0x00000003;3 s, z( N- R3 A& G% V
writel(temp, IO_ADDRESS(PTCMD_ADDR));8 m$ G/ _% S5 n f
, u$ n/ l; m1 d3 k* K& ~6 _% \
temp = 0x001FF201;3 _8 ~" W/ C9 x6 x
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 S( |; ^( t' n$ R2 r
J4 d" i5 {9 b" `$ _, } //PINMUX 0 B* }2 e4 s" Y2 t+ I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 A6 N) z1 B+ A- k PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); z7 K, h# {1 d& `* F
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
) X( |. W3 r+ I% } writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- p) Y4 \! K% x5 ^( d: k; k
. c: b/ q; `) d# N" `
//SLEEP_EN,EPR,L138_SHK1,L138_RC6 u! `5 o2 Y! M9 }
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % ]. p/ r5 [+ u7 R+ {
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
* R5 P7 i$ i9 t# ` writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# F2 M8 I) F( o7 M7 v" N# k
* j6 l# p# x1 D4 K //RESETn,L138_SHK26 Q7 t i% U8 r/ `
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 H+ ?2 s% `" O& [1 Y3 k# v PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 ~ P, {. j8 f/ L5 F3 S2 T& G3 y% a writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ N2 t8 q9 t6 E j3 j6 M, |& a% {- W1 i
$ k; J) P: A) P( M & y. D4 f: ^' r3 q3 \! I/ i+ g
//SPCR Register! t" C3 ] R: d1 ?. ~
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- B0 u' M" I& k temp = 0x03000000;//(DLB=0)
/ |0 T+ t* @$ I // temp = 0x03008000;//(DLB=1)3 D. J7 q& Z* r9 T9 n6 T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset& ]8 w! H6 I# _ V$ m
temp = readl(IO_ADDRESS(SPCR_ADDR));
( t" x6 o) N$ f printk("temp=%x\n",temp);; ~2 O Q; J$ H3 {. ^7 a S
! d# A- Z1 s- ~' f0 ~& e$ ~; K //PCR Register# w* k3 g2 E8 U
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! J& [! X2 H% h: O% \
// temp = 0x00000F0F;* f7 ^/ `4 y( f" d. \' s- d# y; j
temp = 0x00000B0F;
! D+ R7 q- |( ], w writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized m$ ?2 n6 a0 {" }3 I2 D
temp = readl(IO_ADDRESS(PCR_ADDR));
9 c* F, ^4 _8 q% I printk("temp=%x\n",temp);
3 ]2 n9 e8 ^, z- v7 y- R( s //SRGR Register
3 R+ s+ Y2 i p) e8 s2 x //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) _! X' s5 w9 w //temp = 0x301F000B;7 U \ ? q+ j2 h$ w
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized & S6 \' R7 g" [( _; P! a& g
temp = readl(IO_ADDRESS(SRGR_ADDR));
/ T9 p! h, `% ^6 [7 f: S/ Y& a printk("temp=%x\n",temp);' c: r r8 d% C) ?- {
//RCR
' O; ]$ u; W3 \! J( O7 Q9 z' W //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 {& |9 I& x# \& D+ Z! e //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" V* J: n3 D( s0 v6 w2 ?
temp = 0x00440040;" m( J% U ?2 p& M) S' H
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
: B. N7 R0 Z- b+ }; H6 U2 k. K& X0 | temp = readl(IO_ADDRESS(RCR_ADDR));
9 S& j! V( R$ R5 f% N2 P3 m printk("temp=%x\n",temp);. y. c3 p* A. _, c$ F7 f* V& n g
//XCR
( Q. d% h) j2 _$ i# R3 F //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& c8 W' x* n* f# q$ [! U0 ? //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
L4 B2 n& q- C- q5 Y temp = 0x00440040;
1 G' H& P9 C7 j' Z+ ~ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
/ S: F6 [. z- [# Y+ h# L# n1 _ temp = readl(IO_ADDRESS(XCR_ADDR));
$ t' J2 q$ u6 U9 Z. a# c; R printk("temp=%x\n",temp);
- j4 z: C' S3 ] udelay(100);6 ?+ `3 v0 |* b7 l1 U
//SPCR Register. v1 _- F1 B! n t, N
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ a. M# A" A; ~6 |8 v
temp = 0x03C10001; //DLB = 0 VS DLB = 1
; s7 N2 r o8 g+ p- J writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled% ^$ H: ?( [1 r+ y2 G
temp = readl(IO_ADDRESS(SPCR_ADDR));/ d. k* Z( u0 _- m0 v' d2 v
printk("temp=%x\n",temp);4 j7 ]2 o/ w, L9 Y. ]( ?
udelay(100);
5 F0 A/ c6 G4 `- _; M! z4 U, A% m, A8 E7 I0 I& j" l. q9 |* s& e W# {: |
//set GPIO direction) a1 A$ P4 |/ @! G, T$ U A6 u
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! B3 i- R6 l6 N# R. l temp = temp | 0x00000100;//EPR----input8 j; F, {& ~6 n, a$ h2 b
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
# k. x% l* K# @3 e( _1 j, |0 w* H __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 K( I" @2 ?& f
! T5 C" l# k- b& A! _# j, ]
return 0;
# `$ Z+ |! y( v& Q" ]}
- [* [1 S! G# Y, jstatic void __exit MCBSP_exit(void)
% T/ W( \0 N, }) |{8 C. x7 \$ s4 f( U8 l
printk("mcbsp chrdev exit!\n");" v- U. Q. W9 S# M7 c+ m
cdev_del(mcbsp_cdev);
1 D1 @( T5 }( _" ?' w2 u! j unregister_chrdev_region(mcbsp_dev,count);+ r2 |4 w$ U+ p, t. h' U) P/ Y
device_destroy(mcbsp_class,mcbsp_dev);* K O7 p9 i1 {+ p
class_destroy(mcbsp_class);2 ^) h# o, A% G# ?
}
2 e- S' C8 F& y$ |8 Umodule_init(MCBSP_init);
8 J M6 u2 d! W' e2 Dmodule_exit(MCBSP_exit);
k& J& |9 [8 ~6 T! x, k8 H* s) ^7 J1 t, x' o! H+ Z: l5 [
MODULE_LICENSE("GPL");" K% V. k" y( K9 `7 \* C$ b) c
, u' t2 W4 x& y% v# S2 E我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 i, @8 a0 |/ L1 _" u" d
我的应用层的测试程序如下
6 g/ }5 B* _! M( F#include <stdio.h>
# B7 n2 U: B8 @6 ]" s#include <string.h>7 ~# K+ r& u2 j! B9 R
#include <fcntl.h>$ H4 S. d" e$ J! H$ ~9 j: G
#include <unistd.h>& z1 A+ A" g Q( n h; P
#include <signal.h>
Z( y; F$ M( H4 n4 C6 p0 }" c+ @#include <pthread.h> //线程& Q% M4 j! N+ e0 l3 @* F* _
#include <stdlib.h>7 P, s; }- k p' D8 E: ~; ?5 v
#include <pcap.h> //捕获网口数据/ i* F# l3 D* z! p$ Y# `
#include <semaphore.h> //信号
/ s/ x3 a7 \2 d& m8 V; ~ ?#include <sys/types.h> //消息对列# m# E, S. [1 o3 p% X
#include <sys/ipc.h> //消息队列
# r8 y) a0 ~+ Z% W, K7 k: W+ Y' o#include <sys/msg.h> //消息队列- U) Y! `9 G# {" n# E
#include <sys/select.h>
, @7 h2 m9 F1 I4 |/ y2 R#include <sys/syscall.h>
7 f: U4 r& P' W#include <sys/stat.h>; U/ z& n6 n6 o* U" s
#include <sys/mman.h>
) f. c2 U$ W: _$ s( V5 o3 H5 j#define msleep(x) usleep(1000*x)
4 ?& S! \. @# a. s: Y( c d6 K! y$ L9 j2 y7 e
int main(), y& f1 T) O- ~- T J- C: G3 u% |
{ - h" {/ h6 T; R1 ?3 n7 \$ K& t
//MCBSP,ARM与AMBE2000交互设备( [/ j5 Z6 k3 n
int fd;, {7 ^ _3 x) o
unsigned short data_write = 0x5555;2 Z0 i; i" M* _/ v1 s& h4 d
unsigned short data_read = 0x00;
9 ]5 W$ o% T2 \0 B fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 p I) K" U; q# i% f/ C; W // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 @0 c9 ^1 H2 n! U6 ^. E
$ Q3 c8 s* E+ [) s; e. V" |5 S$ K
if(fd < 0)1 W( y& `: y2 S( q6 S
{' ~: W8 H8 | K: q6 z5 \
perror("open failed\n");6 U/ r8 }: k$ |3 p" ~
return -1;
# v8 K, e# A! i* Z9 n w1 n7 D7 T }( }1 X8 N0 t% L$ d5 P. Q+ m6 |
; {( I# w- y4 K5 E7 G
while(1)# |: w2 C7 [' b
{
3 f2 R& ~7 Z& n 8 v# V% L+ A, n1 M. M, \. a" F
//AMBE2000每次读写是24个字为一帧
/ L1 f7 ?6 K: L- H# ?, Q //写数据时将数据在底层存储起来,等到中断的时候再发送
3 W. h7 P3 ~7 Y n' j y) Q //AMBE2000输入数据是以0x13EC开头的' @ C4 z6 ?% q- \
write(fd,&data_write,sizeof(unsigned short));7 i; s) X3 `3 ?2 X, V
8 o4 H9 X0 U) V" @! o //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
! ?& F- O; Q6 h: |8 s8 m read(fd,&data_read,sizeof(unsigned short));
& I8 w6 _" h$ R) r7 V$ S
9 L, u' j% F3 c4 b5 Q; r/ \ if(data_read == 0x13Ec)* J$ o* T. [# j& ?% K* L
{
7 H& o* Q( i" g. W3 g, |, Z; u& X" I
j1 I9 j2 c; L% L printf("data_read = %x\n",data_read);
6 m _1 K8 s+ C* W+ b }" i% Z7 J; h; U7 v" o9 M' a. Y
* U) A; ^1 q$ ?' f4 W8 c
msleep(10); W' g! r/ s! P7 p! j
2 V% H$ q6 ~) ?. q9 J8 R& W /*: p8 d7 l2 ^ [+ U
ioctl(fd,1);
% X/ z; o& z& x# L, n" v, P4 M sleep(1);/ r7 } t( `2 E" j9 k3 e3 s+ O1 \
ioctl(fd,0);
4 N! i9 r& R a, @: k sleep(1);
4 [) ^+ _+ V& p' m! ~8 t$ e */
1 Z2 Q# T" {3 L/ A r) V. i/ R+ C } 4 X3 v/ `' h% w# ~1 ]: t
return 0;
0 x! S- [' @! b
" }4 L& @& f p! J9 R}
/ Z" H7 T5 H6 M
+ X, `, p/ Z# f多谢各位指教,谢谢! 急
3 }0 E! G6 j' G4 f9 ^9 ?
% j; {) K7 x, H( d4 @+ h" G# C
6 i: u' ^0 G4 Q' ^% y* a" }
. s3 S1 _$ G* k. m, `' ? p4 A, A# b. X. M, C) B& J
; l2 G5 C/ H p0 D1 Q
|
|