|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ n8 W2 X& {% u
/*! f' c: ?6 z+ k( T0 a( w
* Copyright (C) 2009 Texas Instruments Inc0 @# p) d# v0 n) y
*
3 {! f% b' B+ o# z, y * This program is free software; you can redistribute it and/or modify* {4 v+ W/ @3 @7 m8 t5 C
* it under the terms of the GNU General Public License as published by- z9 w/ b6 _4 `8 G* Q/ ^
* the Free Software Foundation; either version 2 of the License, or# V! p/ Q6 B+ V1 A' k
* (at your option)any later version.
) X, r3 G% o% d+ H *
% [4 L4 q1 e( U" _1 Z! d; s * This program is distributed in the hope that it will be useful,. M$ u1 p9 L7 W e5 \/ L& F5 t* [$ A* `
* but WITHOUT ANY WARRANTY; without even the implied warranty of5 ~( N' ?" C/ G2 F; _9 ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
u- m/ Y1 Q+ l) }9 w1 X0 |- L * GNU General Public License for more details.- u4 P. O4 S8 W0 S$ M8 D: d- I: H
*5 s/ _ {; Y5 N# _1 h- ?; Z7 K) Y
* You should have received a copy of the GNU General Public License; N( Y1 }) k; `2 r
* along with this program; if not, write to the Free Software8 c0 {) m4 K$ f3 f0 {
* Foundati
( x3 Y4 J" J+ Q, `*/; v, k0 ?$ x0 t" F8 e4 ~
#include <linux/module.h>
# p+ j. z8 N! x. E2 H# N/ C#include <linux/init.h>
$ ^9 \/ A; a2 O' v0 e#include <linux/errno.h>% O4 l4 ?6 W6 t; S5 f1 u: i/ E. {
#include <linux/types.h>
% B( Y7 j4 h! N9 {7 n#include <linux/interrupt.h>( E3 o$ N" T8 k0 ]$ @* D7 o
#include <linux/io.h>
6 g' z" t b% s; J. j) L#include <linux/sysctl.h>
& T9 D$ c) x( ~& h Z3 {#include <linux/mm.h>% W) u9 E0 C. ^' Y0 [
#include <linux/delay.h>- _5 w" e+ |1 ]& M" _6 K `
#include<linux/kernel.h>1 k3 K# U( w* E& S" H
#include<linux/fs.h>! v1 p" Q! Y8 o+ s1 e
#include<linux/ioctl.h>
" W" m0 `; @& P6 T# a#include<linux/cdev.h>
i# M' w# Z. M: d# T2 {5 Q5 C( i7 {#include<linux/kdev_t.h>
1 j9 E; U$ X$ m& W0 u#include<linux/gpio.h>
& H" V( i% S# l1 {5 @#include <mach/hardware.h>
9 F p* i) p% D5 d! Z% I: D W#include <mach/irqs.h>
8 u8 N4 t0 O. }/ b7 [' s# J( v% S; n+ \: I( m4 O! V" E0 j4 ?" i( R8 G0 C
#include <asm/mach-types.h>; x' f0 @9 o& E. t' i( X, {
#include <asm/mach/arch.h>5 k6 n& n8 u! }
#include <mach/da8xx.h>/ m; P5 W, K7 |" V0 O. ^0 o
#define SYSCFG_BASE 0x01c14000+ N* B: n# @. V& ?6 S
#define PINMUX1_OFFSET 0x124 $ a' V9 [# i( F! w# N$ y1 W. ]
#define PINMUX18_OFFSET 0x168 / ` R3 Z4 }9 d2 X! Y2 Z4 i
#define PINMUX19_OFFSET 0x16c; B! M' k" t8 M/ U8 d; @
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR, E( K0 H7 @, E3 Q3 n I. c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 r) b4 L# a$ P( i1 c#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
s2 N7 i2 t. [#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR @; U6 ^: T2 }: S1 I3 n* K
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
4 x! y, y, t" [2 P
; W; Y6 F E3 ?! g0 D _9 ?; n#define DXR_ADDR 0x01D11004 //MCBSP1_DXR6 U% N; H% R) i5 Z3 ~ @- B
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
) q/ S6 V, f! L1 P: L( k//PSC/ y. N2 k1 W6 M+ u. B' r
#define PTCMD_ADDR 0x01E27120 ( T3 F( k& b' G& w* ~) _
#define MDCTL15_ADDR 0x01E27A3C* ^$ l$ l3 p# b6 i7 M' C) y9 ^" x
#define PDCTL1_ADDR 0x01E27304" H% ^4 z6 D! }2 }# E( w
//GPIO8 direction
2 j3 C4 ?2 g5 f( }; S#define GPIO8_DIRECT 0x01E260B0
/ Q: u) i- J" O1 p% V6 N/ A' Y* _#define GPIO8_OUT 0x01E260B4
: A3 A; l9 ~' A4 ?* }8 c#define GPIO8_IN 0x01E260C0
+ @! ?; b) M- n
$ _- N- `3 [ g* {//#define MCBSP1_RINT 99 + O+ h1 e N) T! |( U9 I9 r' l
//#define MCBSP1_XINT 100 - u) d2 Q. c% M1 B
static int MCBSP_MAJOR=239;
! M$ o% `$ n+ U/ w& ~) S# }3 Ustatic int MCBSP_MINOR=0;, u* C8 Z( ^: y$ s) g8 r
static int count =1;& f. D1 h/ G7 C& n1 I( {/ A
7 j/ g$ e* K1 x$ S9 ]
#define MCBSP_NAME "MCBSP-device"
/ w! d( \4 a, I. c3 M) D
* Y# g& `- T! ]6 m2 M- z0 }static struct cdev *mcbsp_cdev;
. k3 R- r' N/ X0 M- q4 Kstatic struct class *mcbsp_class;; _, l* y1 H5 Y6 z8 i; h3 }- ?$ t
static dev_t mcbsp_dev;
+ t4 R+ ~1 k3 R3 ^4 ~/ ~unsigned int DRR_data;) S. D c$ Z) X4 y
unsigned int DXR_data;
; o1 t% g7 Y- m; p- |. tstatic int mcbsp_open(struct inode *inode,struct file *file)
. z2 ~. o& i/ ^$ ^8 ^) D' c% t{
l y% y) `% n7 H 1 f! t( o( w: _
//interrupt enable,initialized
. P+ Q( K: k. C5 J& U unsigned int temp;
5 n' L6 z1 r5 A- `6 k //SLEEP_EN(GPIO8[10])---07 l& y u* {' z: d+ B2 c
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# e I/ j! I8 D/ I3 r B temp=temp&(~0x00000400);8 I/ K9 b* }4 {8 v( [( b
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- K7 q4 f- w9 {/ D //RESETn(GPIO8[8])----0----1
z3 \' R' g- t temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" w$ t' W |/ i# V6 w
temp=temp&(~0x00000100);
1 o- A+ x8 U' M8 O8 v+ U __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
3 s2 ]+ Y2 y1 o/ \. N udelay(100);
5 r1 G3 M3 V! M( A C1 d5 t temp=temp| 0x00000100;
8 W3 `$ S' b- y3 G" ~& Q2 I __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1 U' h2 }1 L) B: j/ y# U
udelay(100);7 i1 @! n: p2 }2 o5 W8 Y
printk("open success!\n");* a, }+ ]8 u; |6 B, J7 z! H
return 0;7 Y6 }: I9 l# K7 ^ c+ b+ b
}8 h+ z6 P* v+ F6 B
3 \4 k3 B& g8 y% r* }8 t2 M
static int mcbsp_release(struct inode *inode,struct file *file). ]2 @5 H2 w' {; s4 Z
{
- j; l! f9 F$ c) ~! z$ B6 [7 A printk("release success!\n");
' T! i$ @/ f% T return 0;$ o; e7 B6 o5 \; h) J
}; M; a8 }9 H) V
: l0 q, C( c. n1 U5 a+ l7 g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& F9 V- `3 E) g6 C, C) c e
{9 z* y; Y; t0 U( t' ^
copy_from_user(&DXR_data,buf,len);
# |8 j F: C0 T. ` iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# C: r' d' ~' f$ [ I: h# _- b return 0;$ q- b! c2 v1 @
* Q. v1 H% P. O) X% J* l
}7 W8 Q& Z- c2 h
4 Q# \5 S7 Q# ^0 p
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 e6 V8 x2 s$ n* X/ u& j/ c) S. Z
{ 0 [' t/ t# q6 i6 e5 v0 J; S( p
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' U8 ?: n$ T( i; J0 v! `9 @ k copy_to_user(buf,&DRR_data,len); ; X! C$ X7 g, Y
return 0;
& x, C2 V3 c& D x* t}
: Q A3 N2 r# w. p
1 A, ^7 E R& S, x
* o( t, P, S7 m9 m% ]) B7 l1 Rstatic struct file_operations mcbsp_fops=
* Q; ?) ]0 ^+ W; y{
A! I ^" ^' @" k$ Z1 s .owner=THIS_MODULE,& v1 T- @4 t3 G* Y' O, ^
.open=mcbsp_open,: E- }. _" j1 `/ m! b! l+ o
.release=mcbsp_release,
: Q. o; a: S+ X/ |: w .write=mcbsp_write,
, b$ D9 [/ K0 k# Y .read=mcbsp_read,
g4 v r4 @1 E& W o9 O9 K2 r};7 m7 Y& E! v; x: t$ [ K& |5 M
static int __init MCBSP_init(void)" q; L# D$ C( S1 B1 j- _
{; s9 K! p8 E4 q! s! l% e
int ret;; o8 t! H) b2 j" v: j d, T0 @
unsigned int PINMUX1_REG_old;
`4 n7 _( r" n0 f2 V unsigned int PINMUX18_REG_old;
2 _& e' g; I: P0 ]/ y U unsigned int PINMUX19_REG_old;9 j2 N9 i- c2 p. q. Y* q
unsigned int temp;
6 T, [) x1 a2 ?- r; y4 B, h q+ N if(MCBSP_MAJOR)
5 b& C$ d: K6 v; M9 O9 J2 \; I2 q {
9 B6 y2 f3 J$ d- t$ e" g8 j8 g mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 Q+ m- A0 q$ x ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" M, A' Z" n: ` q1 F9 M+ y
}; U( j7 ~$ a2 T8 k
else
/ |/ K; S* N4 i; P' V {$ R7 D8 }" o9 M/ k5 v
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
4 l8 E5 @8 t; n. u* G MCBSP_MAJOR=MAJOR(mcbsp_dev);
; o0 b0 Y4 b3 T( i' S' M }
: B$ F$ o+ ]8 q& d+ { T! g$ z" w" u , l! ^6 V9 b/ ~+ R& D5 }/ j, |% Q
if(ret<0) r& r/ F' v) b, ?0 S, P6 A
{6 d. F8 O1 y0 R+ R2 E
printk(KERN_ERR "register chrdev fail!");# N: Q2 A6 j7 X
return -1;7 |' \9 Q; w7 k# @+ a/ V9 t
}1 s& S* P7 T6 S1 p$ H% L$ N' L
T* _5 A+ i) P2 l
mcbsp_cdev=cdev_alloc();
: g" G' z, E5 s; p, C$ b8 E
4 |5 [+ c$ R5 Q8 B: x2 P4 e if(mcbsp_cdev!=NULL)
; \* k X6 r; n: L {6 i& H' o7 |8 J
cdev_init(mcbsp_cdev,&mcbsp_fops);
G( q" q, |; a! V3 v. t# [. D7 p: ]$ i mcbsp_cdev->ops=&mcbsp_fops;& r/ E; P8 W M+ R
mcbsp_cdev->owner=THIS_MODULE;
( C5 _/ Q# P, N6 p0 U( C
0 r' x% L* C2 Y if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; p# o7 \3 S: N1 U% K7 f* d printk(KERN_ERR "register cdev fail!");
4 {0 E1 I5 T) y. t. d) U else
$ P7 ~% O7 n1 @' p, \0 s" N printk(KERN_ERR "register success!\n");2 R2 D! u7 E% O8 n- c; X+ L5 I6 j
}1 d: C7 r9 ~, h3 H9 F' J
else, L- x! U5 ~8 ?- f, o
{! l) ^1 w$ E: ]" P
printk(KERN_ERR "register cdev err!");
. e1 M% e l* ~5 @+ _1 Q# _ return -1;: c: G% A2 s' B, `1 k$ ?
}% @% c* F S$ h1 e( z/ {7 N; Y u
; c1 ~4 ]8 y- h* [3 Z; [
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 j& H' N2 W2 ^0 i1 |" I! @+ \
if(IS_ERR(mcbsp_class))
, q E0 v* [) j2 j {
1 p& R; d8 _& p# e& c$ G6 ] printk(KERN_ERR "register class err!");
* J" u1 ]2 [* `2 N6 l6 o- h return -1;
7 h t) g$ v5 H1 ^0 K& Z% T }- ^! Z8 o, o* Z4 C$ w! Y
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* r0 l' H$ W( C. a$ p1 h% d5 {
P. T5 l% G+ g Q9 l //PSC
# G' Q8 _# \! s* O: l: K //add Enable MCBSP
6 \1 }2 h" g( @ //test
; S7 C1 N# i# @* R9 c4 V& {* R- X! g temp = 0x80000003;# Z2 [ ?0 X7 Z3 T
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 t' s6 E: w2 |( q2 l9 V9 O+ D temp = 0x00000003;
0 C: k5 }6 D- V0 Q2 R; f- { writel(temp, IO_ADDRESS(PTCMD_ADDR));
. }- E2 M5 S$ P F( f
; k2 g5 n( M' k# g# ^ temp = 0x001FF201;7 K5 |' `& S: C6 X- D+ i! Z" a
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( L1 Z+ i2 t. g0 {8 |! u0 d
$ Y7 \, |4 q. q7 m- H( v6 D" ~ //PINMUX 0 [9 a! g7 P, Y# Q/ o9 X
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. S# p8 Y# p( W6 x0 o PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ! @8 H0 Y* m+ L. {$ ?
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; - R6 w/ [$ B. y' |. S8 X5 l+ t& S
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% [! j, i; u/ `, R" L2 k
" [6 A: }$ O, \9 M7 z4 G0 ~& ] //SLEEP_EN,EPR,L138_SHK1,L138_RC/ c8 R3 M$ h3 O4 C! k
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 {$ Q K+ |. D7 i PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
: ]! Z! L' C& b1 { writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& x4 h1 [' i8 @* p0 J$ v
+ |; u% }& T7 d0 p //RESETn,L138_SHK2
+ a1 u+ S! z* U: l& I: C9 E) E PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ( T9 [; r) D0 {) |; n* E, s3 k
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 p9 R: N ^1 f; [8 c) x/ m D( Y6 o writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 i0 J. D" G( _5 ], I+ J 0 [ `; ^. s/ k4 r
* ]# A t3 S$ N# a& d) z
//SPCR Register. Q' F& z1 v6 n$ c9 A/ [) n: [1 G
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset t: ?1 @+ C3 }+ @- b
temp = 0x03000000;//(DLB=0)" c/ n+ B( g* M) Z# ^
// temp = 0x03008000;//(DLB=1)
) V) r* B& r' `5 I1 B- c writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
; G5 U3 a3 c8 @7 M I$ g temp = readl(IO_ADDRESS(SPCR_ADDR));6 k- q# q, W0 j8 I4 d; h
printk("temp=%x\n",temp);: [) r0 E9 T+ g# I( j" }
8 f1 n5 F8 a" g) O //PCR Register/ h) L8 U Y9 M( b
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 D7 ? b! B& I; [
// temp = 0x00000F0F; M" l' ^) x9 O- o2 j' v
temp = 0x00000B0F;5 k+ o/ V6 j8 `7 O2 _; q
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
: \% y4 L, E+ _) H) _ w temp = readl(IO_ADDRESS(PCR_ADDR));8 ~4 L+ ?" v3 h/ T. H. {& w
printk("temp=%x\n",temp); 9 @& x8 M2 f( z0 k2 K& ~
//SRGR Register& M D+ a8 E; l3 t3 v" x8 W0 U4 N, g; c
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ k5 D b1 P+ a" F$ k g
//temp = 0x301F000B;
3 j t) }* E3 e4 x0 W writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ' i& q( j0 w6 f/ S
temp = readl(IO_ADDRESS(SRGR_ADDR));
$ O- K7 k* U. N: t w printk("temp=%x\n",temp);; [2 I* M5 F' t7 G3 i( |- l3 U
//RCR
& _! B6 U5 ?# k //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* Q4 r5 }' F" M- v' a3 q //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 |! L8 H6 z7 ]( c
temp = 0x00440040;
1 b$ [/ s& b4 R- @/ o* }1 a writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
2 X+ [# O: w+ o1 i+ ^) Y- Y temp = readl(IO_ADDRESS(RCR_ADDR));
5 c' ^" N# Q0 ~/ G+ D printk("temp=%x\n",temp);% e7 G, V" O" T
//XCR
; W, c" X, P2 b9 o3 m$ {% T: N //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" \ B1 v! r1 A
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& \; b* i8 C2 [+ E
temp = 0x00440040;
- m! B/ n- g# `. l4 K& C4 I8 C7 b writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " D4 E; z7 J2 H; }% r2 D9 y) V
temp = readl(IO_ADDRESS(XCR_ADDR));" ^! t# p- }4 o% E
printk("temp=%x\n",temp);4 q+ O& y6 w" E
udelay(100);5 K5 `5 Y5 E8 ], n' \; z
//SPCR Register
3 A( M# }- I1 n //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% ^+ e' D& p9 U6 M2 C- B4 E: G/ i6 Y. B temp = 0x03C10001; //DLB = 0 VS DLB = 1
. P1 j5 L( o' y& K; ?+ S writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
# y) p- t1 d8 {5 F2 m5 h temp = readl(IO_ADDRESS(SPCR_ADDR));
1 L' Q# P! j' Q$ s! D7 T5 E5 f printk("temp=%x\n",temp);1 y! a4 S1 u s; V
udelay(100);$ }* K/ W3 @$ b$ z; b
6 x, _- b& A8 i# v% f: V W
//set GPIO direction
7 S* W a* J% F$ t/ A4 H) |9 g temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ ^3 X, K* l$ _, N* v1 R3 }% y: f9 |' V temp = temp | 0x00000100;//EPR----input
, W) ?( G( j; u7 g8 H temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
0 W# u) z# R0 g p/ C- U5 _ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 c: w; L* n* `6 e# y* I2 h
2 Z! y4 \; e7 |1 X, [ return 0;; `1 h. `) {( z7 G5 z' _
}! `. v! W9 R( P$ {% @
static void __exit MCBSP_exit(void)
6 F; r D! O- L) \, S& I6 L{; ]/ h, c; L; l9 \# {
printk("mcbsp chrdev exit!\n");
) L4 G1 M! K$ a2 n2 m2 u cdev_del(mcbsp_cdev);
: X0 C2 I) ^; _# U) H: x unregister_chrdev_region(mcbsp_dev,count);
: a, Q$ G* s6 h) y7 \ device_destroy(mcbsp_class,mcbsp_dev);
/ Z) q( w4 s* W( v" L5 ]* D class_destroy(mcbsp_class);# d W/ P- U" n$ n- x
}/ G" }+ a% F" `% g/ e2 `" E$ B; w
module_init(MCBSP_init);
* n$ s0 L" ?! f* b6 z+ Lmodule_exit(MCBSP_exit);
# l, o5 b# \9 L, K3 I6 n
! O4 w s" r2 E0 G, MMODULE_LICENSE("GPL");& n0 R) n' [3 w
, {- P; A+ T% O2 L3 ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ a( D9 ^$ v, Q
我的应用层的测试程序如下- B& i. f, v) W T* a
#include <stdio.h>
' p2 `3 Y5 k& R Q#include <string.h>
- d7 s2 {: h( g6 o9 _7 v7 f" n#include <fcntl.h>
" l( S# a" t( V- a- s/ d#include <unistd.h>
* T. F7 ~5 ~2 p& U, }+ d' E#include <signal.h>' V# b. I5 f- K0 m
#include <pthread.h> //线程
1 U q8 Y9 M2 y0 Q3 h( m4 [6 e+ p- s#include <stdlib.h>
" g7 p( _: V: e& O/ K8 x#include <pcap.h> //捕获网口数据
( X$ a9 X. T& R7 ^6 _7 e#include <semaphore.h> //信号3 a5 S7 y* {7 s1 m, j: L+ ]2 H1 X
#include <sys/types.h> //消息对列
% i( ^: B/ i5 k* e6 {- @' V#include <sys/ipc.h> //消息队列
v) Y& v! e% ]8 S2 A- Y& e5 A#include <sys/msg.h> //消息队列
6 q( L0 n# C, M; Q- f/ U- h#include <sys/select.h>; R( i- y- t# ]5 i$ K! N+ _/ ~( n
#include <sys/syscall.h>
0 z1 I- ]' g* C, M#include <sys/stat.h>, q0 Z) ~% D) y7 Z
#include <sys/mman.h># w3 G, P o9 B
#define msleep(x) usleep(1000*x)6 ~0 {* O$ ^) i1 U6 E
+ n$ {6 z; m6 [$ Z' q
int main()
8 d. `# L/ M& b g" |: P# Z{
9 S! G `" Z9 I, x- s h //MCBSP,ARM与AMBE2000交互设备
$ Q7 e0 A) w$ ^ int fd;
" x, g) F; O% V1 p7 N" n unsigned short data_write = 0x5555;( _6 b% V- `0 h* M% U" v% @
unsigned short data_read = 0x00;
8 T' G, E% ~; }5 }" g fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, S& Y0 i2 o" M3 I/ h* `8 G
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. V2 N4 |* @9 n8 b
1 }. O0 n: v. W5 Y
if(fd < 0)
% ?. [* _% n5 _- ] {8 m+ L" v/ H4 Z- f1 e. ?6 i
perror("open failed\n");
8 }. X$ m8 K. A, a" R9 h return -1;5 \% M& I- `. T. X* [
}
# {' M' @- R! v0 X' H6 B2 _ + c' q h7 O% O
while(1)
: \' M0 `# ^' F {
8 ~$ Z C- I, r' q2 l % R S; S1 ]3 T; ^/ {* |
//AMBE2000每次读写是24个字为一帧
+ e* n$ `! I4 Q) {, i5 K, N1 a( S$ x0 M //写数据时将数据在底层存储起来,等到中断的时候再发送0 H% L% D4 S5 Q
//AMBE2000输入数据是以0x13EC开头的4 v# y+ z0 E; s5 b( ~7 ?2 h8 M: L+ Z
write(fd,&data_write,sizeof(unsigned short));1 J. V* s+ [3 ]! a2 ^( J
& O; ~! z. V3 }
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 & n! j3 u2 R' Y: e9 w0 D- p
read(fd,&data_read,sizeof(unsigned short));/ G# t( @6 w0 A0 R' P
7 e. }8 d- n0 t3 k4 }- O if(data_read == 0x13Ec)3 ]& ^/ V3 b% l' U) o+ n
{
. J) E) ^ t4 I+ X$ G1 E0 g ; m2 P1 M- Y- E! A% u
printf("data_read = %x\n",data_read);2 n' i1 y+ R2 z- N$ _
}& \, T% R6 z' X7 `, D2 z
- `$ d. K5 L& w \; s* |$ f! { msleep(10);
& R) D/ ^1 B: g h7 f 3 |# E* `) ?+ g+ n; Z9 J: n. T8 z
/*
8 m! p8 U% R7 }) n( W0 B ioctl(fd,1);
9 J, v0 O' Q! v! F) U: n: O sleep(1);
/ X, X2 W: `: X7 y- @ ioctl(fd,0);4 V! \* P1 z0 O) {& I! i
sleep(1);
# b5 U' P* D( k$ {5 u* h+ ] */ * l6 ~" d I" ~- ~& X5 T
}
' X) n, h& Z* {4 E6 M9 f( h6 H return 0;0 X& g$ ~" Z/ R) D2 \" {
% _ ^% N% n$ m
}
: k L" q |* D( w7 @
4 f, T$ G8 P% P; w! x- z; [$ {% {( ?多谢各位指教,谢谢! 急3 B( i; D2 C2 h8 ?9 j: U- x
" X4 |7 R1 V( f3 j* l8 _2 T# i3 [& C/ }) v6 l
9 Q+ f/ I8 \- e0 |6 j2 @
( A# }4 u! M W. J, N
* H" g) F# P1 S* k o |
|