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