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