|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 x& K8 r0 h- q/*
4 ^& M" U7 `: \ * Copyright (C) 2009 Texas Instruments Inc$ m& u. R. ?5 I) A. O- T# L- |
*: h' L7 l3 m# N7 D
* This program is free software; you can redistribute it and/or modify/ X( k! e' Y' n
* it under the terms of the GNU General Public License as published by
6 F4 B* Q! a9 w' I0 o' M+ q; Q * the Free Software Foundation; either version 2 of the License, or
6 e1 s# L6 T3 K- t3 B8 h) ?" r4 l * (at your option)any later version.
+ c V* [* @5 N( F# e7 V. ~ *
. U4 k5 J/ g7 f# w * This program is distributed in the hope that it will be useful,
/ e2 O: e5 [% m0 H * but WITHOUT ANY WARRANTY; without even the implied warranty of6 r$ V5 j- _* E3 b" {
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# V6 Y* Z* |6 A
* GNU General Public License for more details.
! Y4 I, y+ K) L: U- C' E *
F( m; E7 O" I! l2 K * You should have received a copy of the GNU General Public License
R# H( ~5 d( R* N" C* t * along with this program; if not, write to the Free Software
9 H+ B% n8 l, x6 A- w8 d * Foundati
0 f+ `0 Z1 C4 G3 ?0 c8 N' ^*/
( p9 L2 N1 _2 u$ H7 ^#include <linux/module.h>& C2 m: ^& i% D1 z% [8 V* _" m
#include <linux/init.h>2 p5 z2 x; `: V6 e o% o, o- h
#include <linux/errno.h>
8 M5 t. B# s2 E* L#include <linux/types.h>
2 w# V r0 w7 A# G% g) J$ T#include <linux/interrupt.h>
8 V+ i5 D. I$ O* @6 {4 n; a#include <linux/io.h>
9 H/ f4 y% B# F4 ^" A0 ^#include <linux/sysctl.h>6 i' r; z; f8 M* }2 W9 K7 y
#include <linux/mm.h>
8 X% B4 L& y5 r1 C1 O& v6 j#include <linux/delay.h>
6 e8 Q8 d/ t3 m: Q8 R#include<linux/kernel.h>
0 |& H# ~3 \* V% {#include<linux/fs.h>
! ]& U: E' x) m* W( D: g4 W2 s#include<linux/ioctl.h>4 b% R2 _& r; S# D, C8 g
#include<linux/cdev.h>! s" u% z5 \' o8 @9 B0 P, D% b
#include<linux/kdev_t.h>
# I0 M5 l9 S8 s8 t4 b3 }#include<linux/gpio.h>
6 D$ u5 L8 ?: C& {& ~#include <mach/hardware.h>
! |; H! R! o. p" g, h#include <mach/irqs.h>
, S, Q @) }6 l# d8 I' _2 {6 _6 M8 l7 O$ T
#include <asm/mach-types.h>8 ?! Y2 E @6 i4 u
#include <asm/mach/arch.h>- [; U N& [5 n# h% k+ D
#include <mach/da8xx.h>
+ l Z3 N! c2 J. D! }#define SYSCFG_BASE 0x01c14000
5 B% e# f8 w7 _8 j6 W. q# r3 O) I#define PINMUX1_OFFSET 0x124
3 ]2 y* L; a2 F" ^% C#define PINMUX18_OFFSET 0x168 - _) q5 V7 N9 B1 i) Q3 L
#define PINMUX19_OFFSET 0x16c7 y5 m# o% c; w9 n% }1 U
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR _3 J& j. J8 b, @2 T
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR: P/ C5 |% a A$ N& G+ F& T
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 o% T/ u0 e& q2 @#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
3 ~4 O) F2 ]6 f* l#define PCR_ADDR 0x01D11024 //MCBSP1_PCR/ \! n2 J. `$ T8 B
9 _/ s- w0 O! Y$ {& E2 {
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR4 L6 v, \' l- j& c
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
& m+ u4 `2 N% ]0 B//PSC
2 q1 G7 s0 V6 J8 X, F#define PTCMD_ADDR 0x01E27120 6 |8 ]$ g2 s; ~% [8 `
#define MDCTL15_ADDR 0x01E27A3C$ p) E" ` |% g8 z4 M; E2 u
#define PDCTL1_ADDR 0x01E27304
+ O) a7 B" v0 D! j+ U! J2 M//GPIO8 direction: ^' \# G# \' g" r
#define GPIO8_DIRECT 0x01E260B0# {# @1 M7 t0 X* U
#define GPIO8_OUT 0x01E260B4/ ]* W A) X8 D
#define GPIO8_IN 0x01E260C0
6 @% p+ q2 _/ m# P- ^1 s3 u6 @- [8 J! ?
//#define MCBSP1_RINT 99 / e2 I4 M' h1 x; N/ K4 t: U$ r
//#define MCBSP1_XINT 100 8 [: I* W5 N* L; k5 @
static int MCBSP_MAJOR=239;1 K# Q$ b3 @# W
static int MCBSP_MINOR=0;
# c: z% P. R" L0 k! f% kstatic int count =1;
: S0 Q2 O" x5 E: k! u" K0 s& s4 W1 F1 ~. o
#define MCBSP_NAME "MCBSP-device"
2 |4 G7 B6 P7 P5 y4 S
F, H5 q9 N" t8 Q' A( m0 r2 {static struct cdev *mcbsp_cdev;
5 \8 B/ x. N& o( L h k" S! lstatic struct class *mcbsp_class;
7 v, @: u$ _3 Z; Q5 g( Estatic dev_t mcbsp_dev;2 r) _: H1 Y6 N( r i' r0 G- X# w4 ~# D
unsigned int DRR_data;
9 r a' o6 w( w9 b5 w! eunsigned int DXR_data;) y, n1 I0 |# H* r6 q( |0 L
static int mcbsp_open(struct inode *inode,struct file *file)
, J+ A6 V7 t! ]8 ~; u. G; Y- k{/ X+ T; Y& \/ \4 W! O2 G
, k: T# i- |1 k5 b //interrupt enable,initialized( v1 P% ~" Y& q/ N+ Y$ F1 T2 }1 z
unsigned int temp;$ t4 c' w% J+ v/ c9 ~. h4 p; H1 Y
//SLEEP_EN(GPIO8[10])---0
1 D6 r+ Y" `. A( D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. m1 K# {* _0 Y. f2 z5 ] r( ^2 I temp=temp&(~0x00000400);
$ e& I5 H. `# `- N9 d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; k: J. g# @8 `9 q7 I" `
//RESETn(GPIO8[8])----0----1
: V% ^! ^. j% N5 Y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 J$ k; U4 [ y9 n# Z# f; Z8 A4 I( E" E) E
temp=temp&(~0x00000100);
7 K$ T V$ a6 M __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& \- ^6 |, p9 v. {5 l% g udelay(100);
. L; N2 j. f" y p Z/ Z temp=temp| 0x00000100;
6 U- j: z J0 A/ `1 p% f __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% F# S: H2 G; B$ P7 J% g- B7 O- Z udelay(100);7 a! w8 D% Q- {6 C l1 a
printk("open success!\n");! r; o1 |1 L7 L$ ~) h# w
return 0;9 a* ^' ~9 @ ]8 z! Z* n' } G' z
}
" k5 _1 {& L6 k) r4 l
1 R. W: Z# n- dstatic int mcbsp_release(struct inode *inode,struct file *file)
5 D+ L( V0 r: \& ~4 [{
% V( s% B8 a3 v1 ?9 t8 o* y printk("release success!\n");
0 a* I7 |; Y' e' a. m; U return 0;) y. X. k$ i* m' x; \/ x* E
}
; L9 k* G2 l7 l# D
; d/ p5 c! H! P; p% sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off), G& H; A: T, ~1 I1 V
{
7 u* n9 s+ B7 W" X8 O copy_from_user(&DXR_data,buf,len);6 R9 C& |: J, C( P5 t/ [8 I* d
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 5 _9 K4 X* \ C9 P# D
return 0;6 D' n6 s- C8 Y; v
2 C6 `- ]+ q- G0 c& e. B) I}: k: @0 n F3 H& G7 R: d- v7 B$ H8 v
4 ^9 }2 _/ {& ystatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: B7 Q6 i; B3 F% j( U7 h9 O- ~) q3 b" x& j{
, H3 x: J: b. W5 ] d. d DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 p- o0 b( X; T" ?9 v; m) D
copy_to_user(buf,&DRR_data,len);
7 f" k/ f; g+ w, ^( R$ u return 0;
% \. A& J3 a* k}
: W5 d& [8 }2 z8 F6 S- n9 b! [
' Z: k8 {6 r) z5 ~
6 k, _# M! `/ O5 ~6 a$ \ ]( Xstatic struct file_operations mcbsp_fops=; A. f* g3 q/ g; m9 B/ k! f% e
{
1 K* u6 ]5 `3 x; j$ O .owner=THIS_MODULE,( }8 C0 y& Y/ h. U' i0 c' }* H' k
.open=mcbsp_open,8 e! s4 L% R' O, a% o
.release=mcbsp_release,; R2 W: C; G6 |1 N' ~8 V6 K
.write=mcbsp_write," ^2 J; v$ q3 x. \$ v: f# z
.read=mcbsp_read,4 K! K6 J& `7 I4 P; u
};8 K& T) C2 e, H" x6 e" K
static int __init MCBSP_init(void)6 ~- S' n$ `6 y0 a5 r0 m" [
{8 I0 D- n) s! e. b4 c. N1 [9 A
int ret;; g/ p5 e3 B; A0 z; t
unsigned int PINMUX1_REG_old;; _0 k4 y' N& z3 z: C
unsigned int PINMUX18_REG_old;
0 m# G9 Y3 G: m7 F7 O2 y unsigned int PINMUX19_REG_old;, J* l* I7 x$ r4 G' s: g! y
unsigned int temp;
1 Z* {# p) h; f( u3 Z5 s0 s if(MCBSP_MAJOR)/ \( x+ T) J4 s' k
{
1 f. l( {, v8 S$ j0 C mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. Z( _0 Q( w7 X3 E/ W- g4 h0 |
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% n% J# p2 O, J/ B" e }. ^8 c A0 {0 h
else' g# b Q$ m# ^# u+ }
{
7 ~; c! J w6 V* k ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" g+ J0 H* ~2 u6 M! ~. ]
MCBSP_MAJOR=MAJOR(mcbsp_dev);) ` S0 H& `' Z' S, E& `0 i. ]
}7 b, q3 _ F; N5 g
; O9 H8 z& h! i) R) A- _$ ^
if(ret<0) n. g L! N+ m+ }+ c( @
{
+ N: K" B; S3 y p" ^/ j printk(KERN_ERR "register chrdev fail!");
- `/ _6 V3 C0 c* [" d' O1 O( A; C8 w" d return -1;
, y* m" }( O$ ?# o } l8 K8 R* \* B; R. @
5 E$ p+ A, z# [; s7 S5 d' a5 e
mcbsp_cdev=cdev_alloc();# M% `0 C0 O- Z; \ j
8 i+ n8 j V* N5 P0 { if(mcbsp_cdev!=NULL)
2 M) F4 ?5 q4 S$ } {
- S* [ `1 ?* J/ I! D6 z) S7 }; n$ ~ cdev_init(mcbsp_cdev,&mcbsp_fops);0 h* W! g: M; A# ^! X- W
mcbsp_cdev->ops=&mcbsp_fops;; u# w8 x5 I2 b/ k$ `2 Y! s# Q2 I
mcbsp_cdev->owner=THIS_MODULE;
4 C& P6 Q+ R( x2 G) b; r
- J) B6 }6 N* Q- o, F o6 p if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- _) s; E, n' F' g8 l# e# J printk(KERN_ERR "register cdev fail!");
( c R, n! f: R& R4 @0 l; o else
9 R# c; z0 O- E/ D printk(KERN_ERR "register success!\n");" i, y. p' @" }, @/ d; b+ o! r1 w
}( x! F7 H2 K5 O& P/ m" }
else
- {( ^/ A/ \( Y {' f: X, |- Q/ y" W% o
printk(KERN_ERR "register cdev err!");
6 s# R( {3 L) U' l/ N4 d return -1;
" P7 G3 B; X* {0 V. c$ n }
3 d# y0 |( ^6 L# r3 D+ C
. t0 ~: B$ d( r8 I mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& }' K' S: F3 X( d( D! b8 r1 c
if(IS_ERR(mcbsp_class))" u3 q3 G4 @0 T, U* M. @
{
. x# ?# |+ G7 J0 n8 g printk(KERN_ERR "register class err!");
+ O5 X. Z9 `" I0 _, \3 d return -1;
: M1 D! K# M2 Z" o }
) o" U0 z& h5 N' X1 S device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 F' O9 [: o0 T% U: n; y1 o
: `8 u3 X0 k, w6 D" u# G$ F
//PSC5 p& M' f, V8 C( G4 a9 l) c
//add Enable MCBSP# O6 \* n, B! y. e
//test
5 M T5 A# A* O# a/ I8 q9 W temp = 0x80000003;
D3 p# Q' ]+ V3 |6 T) A writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( J. g1 ?4 Q" c# J temp = 0x00000003;
2 t. |0 l) U' |+ L: t7 L8 C writel(temp, IO_ADDRESS(PTCMD_ADDR));( H) F9 c- r6 T; P' C
5 ~( f: n$ R3 ]$ }5 m( K1 r$ ^
temp = 0x001FF201;% E9 n$ A5 P5 d5 K+ `
writel(temp, IO_ADDRESS(PDCTL1_ADDR));& l" t7 R1 j+ I1 \& z) P
5 y5 M, R0 |! k4 e; S7 {
//PINMUX
5 X C7 i8 e( B" h/ E: Q //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ \6 }* a* W- L7 ?! ?% ^# C
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 L7 |( ?' C# L/ o# T5 [2 }
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 6 z6 |! N4 b$ u7 k
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 s D- B) u5 m' V
8 y4 ^( Q. q0 B) T, F$ I+ @
//SLEEP_EN,EPR,L138_SHK1,L138_RC
. W+ ^: | B; Q. }' J3 v% ` PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 V1 c2 g% m4 y1 P# N* M2 z( J$ S PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ; x- b# n3 I' m% v* X, w. K1 _
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# i9 m) q8 A+ S
: o' N2 Y( Q8 U. \& \; s2 [6 s //RESETn,L138_SHK21 o2 N* i& `5 v5 ?
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 Y" E, A" j% [1 F- N$ w2 {1 a/ K* M% R PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; + Y2 r/ B$ e5 r" T% F1 s: k
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- x/ K: t4 W& s2 @ . ?* E- a" k1 x8 p9 d; \. x7 l
1 h: V" ]- R! G9 `3 r5 a# H; s
//SPCR Register
) W, ~: w% i6 n5 b5 W //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset h% `0 { d" n& v# s% @% u5 N
temp = 0x03000000;//(DLB=0) L- C' d9 J+ V ^& D2 t( D: ^
// temp = 0x03008000;//(DLB=1)- m( S2 O% q0 a1 K6 @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
9 t. A$ \) s* g+ Q& D/ q3 ] temp = readl(IO_ADDRESS(SPCR_ADDR));: x2 r% f. o/ A# f
printk("temp=%x\n",temp);
5 J) [- X- O, h r9 _( i. m
; N7 F/ M' E' E4 g+ E //PCR Register
% q) U6 o( E& O1 K //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ @! ^* e1 n1 R // temp = 0x00000F0F;2 Y7 U. T$ M/ ^9 K& w; v- U
temp = 0x00000B0F;
% b# H0 s s) P( d/ i: [ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
- s2 f: l" s$ f G, N# b temp = readl(IO_ADDRESS(PCR_ADDR));( S7 \/ ?, w% z/ b* i& n
printk("temp=%x\n",temp); $ w/ v% W4 k" p% R3 d4 c- t }4 [
//SRGR Register H% y. L2 S0 Y, ?
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% j) H; ~0 P' m9 Q% o# @4 H //temp = 0x301F000B;
) u0 L: Y! i3 ?, y, L writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * U1 O3 a* b B i$ ~
temp = readl(IO_ADDRESS(SRGR_ADDR));
7 D/ O* P+ l* ]2 e2 q2 u7 f printk("temp=%x\n",temp);. y' A! d3 K: A- w
//RCR
7 {0 i9 V, C* s* ^+ b* Q. r" ` //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 g- K( C" C0 x2 n# `# d6 K //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 F4 l& m5 n. D! o3 ?- S temp = 0x00440040;" N& o% f- j1 G3 ]4 G! k, u7 {, n
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 e( U% p1 q& t% r9 W temp = readl(IO_ADDRESS(RCR_ADDR));
; F+ @1 p0 y' U' c- d, L6 M% L printk("temp=%x\n",temp);
2 p7 f9 V$ m& M2 |, Y5 D9 P //XCR
2 E: _- V! p! a //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ \2 N- P+ X! ]% x3 g7 Y //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' M; v" }2 |) Y5 J* j2 z+ o" y
temp = 0x00440040;# m. t, M, k+ h2 i8 C
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
" g' r7 c. z$ Q) G, G% _ temp = readl(IO_ADDRESS(XCR_ADDR));
6 |, q+ R6 f. W( [& p0 ? printk("temp=%x\n",temp); n, p' F& f4 U9 I; {( w3 ?
udelay(100);' F9 P4 D d+ b- H
//SPCR Register
7 }6 J* c* |" {6 M- A //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 W5 @' P; Y* l( ^
temp = 0x03C10001; //DLB = 0 VS DLB = 1: n& X7 r$ p B
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled) M+ P. h( `4 E7 f: X. I
temp = readl(IO_ADDRESS(SPCR_ADDR));) N: d% O; [: x. r7 K" X- o
printk("temp=%x\n",temp);4 P+ Z# d) P% Z2 H
udelay(100);/ Z4 o1 h, K7 a8 i* k
% \2 y. F2 o' A N0 y
//set GPIO direction7 f* w2 ]2 c( v8 l4 `- Y7 }
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% n+ s; l/ ]. Y; D
temp = temp | 0x00000100;//EPR----input
* k3 ~, P. E) H( o. a% v4 x3 r temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. M$ v0 D j& h# E* c __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - a1 m$ r$ M8 z7 L5 B, N
1 F$ J: G4 L% Y* A* b) R' f3 n+ U# Y return 0;3 w5 T! C$ i8 B6 z
}0 z. w7 v' \2 f& U$ D' I
static void __exit MCBSP_exit(void)1 b: y0 B, a/ Q
{
$ v4 a0 h2 A/ @8 E) d0 y7 a( W( f printk("mcbsp chrdev exit!\n");' x/ |5 y; {! U/ U; {+ @5 f
cdev_del(mcbsp_cdev);) H |! w( f; j6 [( v$ A
unregister_chrdev_region(mcbsp_dev,count);
+ s+ E" b; e6 k, v ^6 ] device_destroy(mcbsp_class,mcbsp_dev);
- {" S0 M" ]6 c: | Z" Z class_destroy(mcbsp_class); F# a' y, ]+ E
}
/ I2 S v9 e7 n# ^" umodule_init(MCBSP_init);
n" _6 x( H% e% e2 i" {& Hmodule_exit(MCBSP_exit);' a% }% p& [3 H' p8 S+ G: D
2 T4 n* E4 A3 H$ d0 C/ f3 c
MODULE_LICENSE("GPL");! _5 R" r7 I. x0 f9 F8 |
) j9 Z2 @! T- @' ^: Y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. _9 h; d% [+ Z: I+ h- ?+ x+ ]$ H
我的应用层的测试程序如下
6 ^" P- l" e1 Y- E2 I7 d7 ]#include <stdio.h>
# X& U/ \" w: ?0 K#include <string.h>1 s9 Q8 z* w6 ~1 I' u, f( m' p
#include <fcntl.h>
! M) n9 A9 Y6 b#include <unistd.h>$ f8 b) H$ D' r5 ]; u. r% @
#include <signal.h>
0 j+ Z$ a7 ^2 z* _6 }#include <pthread.h> //线程
& O" K* T$ G, Y#include <stdlib.h>
8 G5 O5 `6 ^' O" ?/ B7 z3 [& Y, P#include <pcap.h> //捕获网口数据- z$ i/ Z: Z/ T$ x+ Y; O# R
#include <semaphore.h> //信号+ H- \* N8 V/ c! ~) \7 g7 K @
#include <sys/types.h> //消息对列
0 s+ z6 F: g4 ?& d% B$ V+ \: g7 b7 Q#include <sys/ipc.h> //消息队列) l( C! H6 l. z/ }- h2 E
#include <sys/msg.h> //消息队列
: Q0 K; x6 U% B7 H% [2 n#include <sys/select.h>
8 s3 ~6 Z4 R& L#include <sys/syscall.h>
. }4 @( Q( d* R#include <sys/stat.h>) S5 ~1 {2 E: w" f( L. |
#include <sys/mman.h>4 |4 s: g: X+ t; q- m" }1 M
#define msleep(x) usleep(1000*x); r3 _/ w" b. h9 a
F8 a- Z }* l/ \8 O+ ]int main()$ q3 y6 D I) i* ?* X' n5 f
{ , Z3 @1 L U2 e6 }1 x
//MCBSP,ARM与AMBE2000交互设备6 [1 x4 D, M) x- t6 ~* U
int fd;3 {- W9 d. a4 \# @: Z" ]- k) C
unsigned short data_write = 0x5555;
: b$ L1 t; f+ J3 Y4 S) i# W unsigned short data_read = 0x00;
, D" h; o" m4 Z4 i- f fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 f: `! C% j j. G# l( s // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, x. E, N: K% w# S
" w: \8 o7 Z* K: t# ^ if(fd < 0)
; q' k" `) U% c {
; J1 Y" b9 a, c( o8 w0 f) Q perror("open failed\n");2 ?6 g4 ^% W6 g) w( Q
return -1;! n9 A! Y( C& W4 A
}
) U. C2 T( f9 V
" ?4 O. Z- C9 O while(1)
2 [! G* R6 J$ B {: I: [# D- Z9 x; J/ Z/ h( w$ E
' \( }! [/ P1 U% R: { //AMBE2000每次读写是24个字为一帧
+ ^% \ }8 r! s- y6 B7 @ //写数据时将数据在底层存储起来,等到中断的时候再发送
6 r. P2 C0 i0 u1 B3 H //AMBE2000输入数据是以0x13EC开头的
/ `' ?8 p8 }6 _- ]9 c write(fd,&data_write,sizeof(unsigned short));
8 s+ t }- I$ v- F+ ^" ~( `& W+ t. t
/ U4 e1 G8 ~! B- j% T //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ) @+ s" P0 w0 Q% w+ w
read(fd,&data_read,sizeof(unsigned short));0 C+ n6 K' Y% J* r6 u8 N. m8 q: n- H
! A# N9 e; J2 m, M! O3 T8 G$ _
if(data_read == 0x13Ec)$ ^0 J+ @% g3 ~, T5 t, ]
{
0 V( x6 M, y* q. v2 U7 U, b 2 h3 q) Z0 O0 i; g
printf("data_read = %x\n",data_read);& v# }5 H# M0 n: P) o! S
}
! f) o, O% _1 K, [4 @% L' p) J- L. X * { t* M3 Q0 x
msleep(10);* c! S p- X& Y2 t# O6 m0 ^$ Z% Q! c
$ E5 R o* n3 c. I/ w' J6 `- S, n /*
6 O$ Z6 S+ W. V$ e1 F' J; E ioctl(fd,1); / q" G$ K2 @% M3 M: Q
sleep(1);( d2 z/ i n; h' k- g% N* U
ioctl(fd,0); g7 @/ s. ~$ j1 @/ e7 \6 l5 w- @' X
sleep(1);7 G- f, z! l# F
*/
, Q2 `+ `! y u- k9 p, g } : R, W( E3 r% A9 Q" Y$ M
return 0;
1 i% {/ a$ A z4 I2 A , C, Q( M# Y$ e% m+ f2 [+ \
}
W" `6 a0 j* R& p8 w* F$ p* y
) T( c9 ^/ j, w- [; W多谢各位指教,谢谢! 急
: G: Q6 x' j% K( g: j) I2 U) S, Z6 Q2 D3 q1 K
8 {9 k+ p1 d1 R" ^
& I/ G" B- L) U1 Z, v& Y
# V( Q# X& `( s4 f q& n2 |8 ^& x% G2 G w! e
|
|