|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& Y4 a8 `- ^) X: {' y/*
" T9 M. |2 H; b2 j * Copyright (C) 2009 Texas Instruments Inc, \5 D' R- P/ ?7 F4 h
*4 I( t3 O9 x/ i' j+ ?, F
* This program is free software; you can redistribute it and/or modify! j' s J9 [+ Z* \5 c3 ?9 m
* it under the terms of the GNU General Public License as published by
6 B w6 X. n: S$ H7 D2 { * the Free Software Foundation; either version 2 of the License, or# ^$ h) M( I1 e
* (at your option)any later version.
. ?: y/ S" M% Z. @# w( J& s0 f) | *
; H) c1 _9 ~# ~5 ^ * This program is distributed in the hope that it will be useful,2 y5 q# O+ @4 `/ e0 [+ x
* but WITHOUT ANY WARRANTY; without even the implied warranty of V0 r+ y) |' i- |3 ]
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; h& _7 |# e. r0 r" {3 f* G * GNU General Public License for more details.8 X9 g) v$ E- n; c7 M# K' _5 n
*
! o4 `! I8 V' u2 T! F! P b * You should have received a copy of the GNU General Public License+ a5 G& x: A( I) F; |1 V) n
* along with this program; if not, write to the Free Software
s7 p% c4 w' ~0 M * Foundati
* [) x$ T: K- A9 ?*/
3 z' d# }1 u# A4 F#include <linux/module.h>
" `, O/ e2 ?5 x6 w; c/ ~#include <linux/init.h>4 G2 C9 e5 W4 O/ v
#include <linux/errno.h>4 ?1 y4 d J7 ]4 `& z0 U3 M
#include <linux/types.h>
/ L+ I/ Z3 j4 o( R- L- f- H* J7 A! H; {#include <linux/interrupt.h>2 {: ?5 p A, Q" ^ W
#include <linux/io.h>
% p4 W( b8 h$ ]0 S% n#include <linux/sysctl.h>
9 ~6 `1 W# V- o#include <linux/mm.h>
; P- s* j6 `, _1 Q! k#include <linux/delay.h>9 S) ?2 Q* y* u* ?
#include<linux/kernel.h>4 d3 X. T9 P4 {* V
#include<linux/fs.h>& m4 M% |! B' X% _1 X8 L* k( [
#include<linux/ioctl.h>
" @/ y9 l3 B& a2 N& s7 b; c#include<linux/cdev.h>3 f6 F7 [0 i* O5 A8 K9 F
#include<linux/kdev_t.h>
$ d7 |6 l6 R" ?0 d/ u#include<linux/gpio.h>* t2 j" M' ^# B6 ]! \; R5 i/ w
#include <mach/hardware.h>3 [8 ^$ p U) O& [
#include <mach/irqs.h>! ]' Y9 c) v* A
l0 y% w) q" V; q; P#include <asm/mach-types.h>
9 e2 Q Z) E$ |/ W( Z8 o#include <asm/mach/arch.h>& e$ q& E; A' f1 }2 n
#include <mach/da8xx.h>
( E8 N6 K+ Z* V1 w k3 u1 |#define SYSCFG_BASE 0x01c14000
0 L0 i- o* ?, ^5 z) J#define PINMUX1_OFFSET 0x124
1 e' a- ^5 S5 @6 b5 ^ c( y#define PINMUX18_OFFSET 0x168
' M. W- j/ v: T' {) v* X8 G#define PINMUX19_OFFSET 0x16c! u# q, e) j6 v2 f2 ?3 `; P8 F
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% G' l$ t7 Q/ X d#define RCR_ADDR 0x01D1100C //MCBSP1_RCR/ e+ N; B/ P4 h
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
& e& z$ M6 |/ }- E: `7 S7 w#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
7 v/ x R5 ~: g& D- `3 _% V- I#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 w/ [. t- V A: x
& _- k! x9 }+ I. t#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
" X) [9 K* ]" z" j# d, S#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 B4 L7 T, ~ N' I1 g
//PSC
9 x' U* _$ ~9 g- G, W#define PTCMD_ADDR 0x01E27120 r0 N, f+ d! b8 J/ ?
#define MDCTL15_ADDR 0x01E27A3C
9 |: f) d. U- h! J4 L+ ^#define PDCTL1_ADDR 0x01E27304
2 B/ R4 K7 l) [+ R$ X+ u//GPIO8 direction0 _& {3 Z7 Z& N9 P7 i% U% j
#define GPIO8_DIRECT 0x01E260B05 E; s- _) h6 t4 ?3 {8 S
#define GPIO8_OUT 0x01E260B4
3 a( F; h. M, J& s#define GPIO8_IN 0x01E260C0) l; @0 I: r* s
' E9 m& n. b2 U& b" }, _; z//#define MCBSP1_RINT 99
+ @8 c* F- o6 |% f7 f) i! p: p//#define MCBSP1_XINT 100
s, A8 Z# J8 D/ n. f. P8 ystatic int MCBSP_MAJOR=239;5 @' j7 E! u2 P
static int MCBSP_MINOR=0;
. Z1 g' Y6 b, a3 E7 Y4 Z2 X9 ~static int count =1;5 D8 @5 ]- p+ @7 N! n+ F" G& }6 Y' U" t
1 Y, z* h' E% A( r1 j, K+ V7 f; r0 t#define MCBSP_NAME "MCBSP-device", ]$ t8 r/ l- C# @9 C# u3 E8 l! ]
9 H/ m2 v2 F4 w, O1 _
static struct cdev *mcbsp_cdev;8 M ?0 r7 I9 l
static struct class *mcbsp_class;; a; c3 b% M7 S' ]$ o# T- G" {
static dev_t mcbsp_dev;
3 C$ f' K; |- Zunsigned int DRR_data;9 E8 ]) O4 n* }# P; q
unsigned int DXR_data;
" G2 z& N/ k/ L9 v0 y$ Vstatic int mcbsp_open(struct inode *inode,struct file *file)2 v2 D( P+ f+ l# F; ~
{) x7 B" J- j! t7 X2 f B% G" Z
$ r* J' Q# I2 L; \; z. p6 K
//interrupt enable,initialized
5 E0 A4 ]& w2 b* w9 O0 [7 V unsigned int temp;
8 }8 Q2 w& z% l( E //SLEEP_EN(GPIO8[10])---05 O9 Q8 r5 R; L/ Q a4 z% G+ i
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 U8 M! v* `2 q' A/ t temp=temp&(~0x00000400);% e1 \- d; k* b; X8 }# M& \
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. S2 T) T+ ?. w9 L! n //RESETn(GPIO8[8])----0----1$ q2 P, g, J2 g. N. |- ~' j0 W6 g
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 p+ J: Q+ ~; i& ] temp=temp&(~0x00000100);8 o! @* r. s* F0 a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 X5 i0 h' q4 W# ` udelay(100);/ c0 G7 E0 m+ t0 B b
temp=temp| 0x00000100;
' l. D* O4 W0 _4 k( ~, d- @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ p2 H+ ?3 d3 }4 T8 _; E" u udelay(100);
8 r& F- d. D, f9 Y3 K8 Q, ^/ T printk("open success!\n"); e5 G4 j+ C: ` l# @" ^' E
return 0;
5 l3 U8 |- x6 Z' S}4 E0 ~ l( i$ ?$ T* Y
' {! N# ~; V" K3 j
static int mcbsp_release(struct inode *inode,struct file *file)
2 c) _! [% z8 `) b{
6 F% H u& g/ Z. v printk("release success!\n");9 f( K& y/ E0 a: d
return 0;7 k7 r. u. [, s ]; p
}1 @1 R$ ~1 P$ a6 J D/ D
: X: n) h8 v& s5 x$ w% f( rstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ T# X8 \, n3 {4 x. P3 y: c
{
5 u: F8 V c. w copy_from_user(&DXR_data,buf,len);' A6 B8 ]3 K% H2 ?$ U
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 8 Z1 i! X5 ]1 D6 V w/ O7 V3 y
return 0;: G% l, n# f2 s1 Q/ a6 `; `) |4 d
1 g+ @0 w- E" I
}
+ U0 d' P @* k+ @; E5 B1 R. H+ R: ^4 q. s1 C
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
7 s2 h. X1 \% L: N{ h/ W" { E; W; S
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( U; ^0 N% E$ u9 [# b
copy_to_user(buf,&DRR_data,len);
2 a$ B0 o6 g5 c ` return 0;" r5 T G* B( o( E$ y* F: h/ r/ ^$ T
}
- P+ X; T* ~+ I& u: u
. L# M1 f0 [, r2 N4 [
$ V" d: Q2 p5 j4 sstatic struct file_operations mcbsp_fops=' p* ?. a/ s P8 C6 a
{4 `7 `2 H& O6 k
.owner=THIS_MODULE,. x- y! {+ h: v* N: F: k5 E0 S1 G$ h
.open=mcbsp_open,' n0 W( O& k6 Q0 t6 ]
.release=mcbsp_release,( E: n3 N P0 V! ^. p! N. a+ ]8 N
.write=mcbsp_write,
- Q. V6 i1 G+ A* w8 m. {) D8 g$ F .read=mcbsp_read,- d3 I+ q3 ^" p. u9 S
};; }' C* @, n' C
static int __init MCBSP_init(void)" e! ]/ W& ?. ?% C/ O9 ]
{
3 ~' T: L3 {& P, ?) f4 ~ int ret;
, b# R4 l# `7 A. i# k unsigned int PINMUX1_REG_old;" ?" {/ H k* n2 P: u) ?8 D5 {- X
unsigned int PINMUX18_REG_old;
& ~1 ]; g9 K% j7 u unsigned int PINMUX19_REG_old;: A( v) ]/ Y) E! ~! \- N M( q
unsigned int temp;
: P/ F' c/ }1 f! {# h if(MCBSP_MAJOR)! K2 X A* B A5 ]8 c1 s
{6 B! [2 t+ y8 b8 O$ p
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. i/ `8 v% K3 F- t9 Z8 p ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 A. g; a; A$ T; `4 }' _! K7 b }
9 }5 n* n9 e; K \5 W else
# o: {( {! n' V1 k% g# h {9 u0 S8 K6 B2 K$ i4 B# J
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 ~6 M: z) i3 ]+ Q( G MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 k& I; X# T/ [" @% J2 Y" V. g }# j: H5 s! \8 ]
% r6 R5 t8 H5 D& j+ c if(ret<0)* A0 q" Y! j; b9 r: V8 @: k
{9 s" Q2 h8 A. @4 z i4 U0 d, Z
printk(KERN_ERR "register chrdev fail!"); |6 Z" [' y' j3 d6 ]
return -1;. v$ J! b |+ I
}
( F) w/ k# e1 h6 y( P + f y3 g# \4 e. e+ v
mcbsp_cdev=cdev_alloc();
/ M) H4 z; E% V" y' @" {; Q; U
8 I3 y T9 d }( `! @ if(mcbsp_cdev!=NULL)
# i+ u o" f0 ?+ o! f. n0 u; ` {" l" @( o9 c5 v+ M' R0 D/ W1 z
cdev_init(mcbsp_cdev,&mcbsp_fops);
! o& f9 N* T; M r; {5 g1 C9 @ mcbsp_cdev->ops=&mcbsp_fops;$ O& N/ X# m0 r. `! g% h
mcbsp_cdev->owner=THIS_MODULE;& s/ Z" V; s# [" o) l T! w
5 ]7 C: B& ?! t, }1 K2 t3 _ if(cdev_add(mcbsp_cdev,mcbsp_dev,count)) D( I' n# R; |- _
printk(KERN_ERR "register cdev fail!");, v* G; l* ` b- _+ H
else
) r4 {% w0 v; ?$ L4 n: w printk(KERN_ERR "register success!\n");
! ^! a6 o, Y s1 l0 V, j }
$ V5 D [( j$ N y/ I else: N: c7 O* K/ }/ c7 Y' t7 L3 `4 ^# i" I
{ z. }" z9 B* _# [2 g, e3 B/ m1 C
printk(KERN_ERR "register cdev err!");
* A& o, m/ y! \6 q return -1;, Q2 I+ u2 N# N9 {
}
4 J0 |/ g* T. w' {9 t
4 n) u, ?8 \* `' S9 B2 f" Z mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, v+ f! _4 L. \2 D. d* d
if(IS_ERR(mcbsp_class))2 x- v) a) H; C) v f/ F8 s
{
. T% \' u% z* L* c5 x printk(KERN_ERR "register class err!");
7 N C5 k$ R. E R! t+ B return -1;8 Q- [2 }1 t( h. N( t1 [2 a
}. {7 A0 @, w# H+ g9 f, }& a
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# _% C- v1 n" u; f2 T ~! e
' P3 N1 P4 C! N% y3 B; n
//PSC3 V2 R( k$ L; ~9 y
//add Enable MCBSP
8 o/ o( E" v* w' L9 F/ X/ X //test
$ }2 M' }8 E/ N ?5 U; { temp = 0x80000003;
& g1 Y( e0 P7 U5 p4 t: e* z writel(temp, IO_ADDRESS(MDCTL15_ADDR));; l3 t5 O+ P9 L& }: [
temp = 0x00000003;
0 y0 w' l! V/ q4 i writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 {+ b4 O& u" @* p+ b5 k
) ]# r$ H/ Q2 N% k& ~) H9 `7 p temp = 0x001FF201;
2 j+ h% R# c8 Q writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' o- j/ P, r) m A7 x+ Z0 E
0 n. C" E z( \% s. d! \! M //PINMUX ( x1 \0 k( f+ `
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; ^$ x+ P/ S( Z& M* `5 H0 x
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ' r( g; Z7 ?$ z1 R
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; - ` h7 h' M: d+ c) a3 p
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. x3 r( |$ o3 w3 |
8 f' T5 i7 j% k6 C U/ D' U //SLEEP_EN,EPR,L138_SHK1,L138_RC* Y. Z4 D! \. p/ A: j# I0 }
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 d3 _+ _ w: o$ }& @ PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; " a3 ^8 l8 \* Q
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ ~+ y7 g' a' j& x
|; d( U$ D. ^+ v D$ {1 \3 O //RESETn,L138_SHK2. f% y6 F8 ^1 \3 N/ X7 M# w2 m
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 f5 Y9 M9 D. t* R2 p PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
7 w4 N# l# K& M q/ o+ b writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 s& D' ~" C ^4 h/ M 6 Y: B3 k1 N) |& |# ^+ W$ z
: r8 ]+ [+ d) z0 x1 L+ |( d4 R //SPCR Register
; p. V# ^& x8 u" o5 y( c //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! v; B1 l. Y* t0 I) ~+ d' U
temp = 0x03000000;//(DLB=0)- N: L9 G$ g" f @& R1 D
// temp = 0x03008000;//(DLB=1)$ A8 X1 i& m" ?* \. e9 a- H" Q
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
4 f, r6 x9 ]% S3 \/ m% `1 G temp = readl(IO_ADDRESS(SPCR_ADDR));8 ]1 l+ s8 e. P
printk("temp=%x\n",temp);3 W' B2 T: f) s. {: Z N
$ b3 p3 \. B; w& S g6 Z3 a) P1 R3 o //PCR Register( T* u& R, h* e" g# T
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 | Y0 l! S! ? // temp = 0x00000F0F;
3 ~" g; g3 Q0 W6 ~ x9 b temp = 0x00000B0F;
+ [" A: o" u. B( E& a writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 c, T8 ]0 A" ]+ E
temp = readl(IO_ADDRESS(PCR_ADDR));: ^8 M" q0 C. V8 g0 C5 y
printk("temp=%x\n",temp);
0 m7 T" d `9 a" p% A6 ^ b //SRGR Register
5 l* L0 m: ?; G3 p' s" Y //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: L" Q5 {' n+ W# J
//temp = 0x301F000B;
|' E, s3 l- z: [ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
' i+ h" N$ t. A temp = readl(IO_ADDRESS(SRGR_ADDR));
/ w* Q% c: ]3 v- O" d, z printk("temp=%x\n",temp);: S+ }5 a/ p( r8 k g$ q. A
//RCR
! E) i$ b1 d0 E9 K- C. L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 E4 l" [4 g/ j0 H
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
V& ?4 i d( f$ H9 @( y+ Z( w) @ temp = 0x00440040;3 p& a* V8 |9 Z3 {8 a! N
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
2 w7 C+ f* F$ g7 n: [" e temp = readl(IO_ADDRESS(RCR_ADDR));
. O& [4 n, C7 u$ A printk("temp=%x\n",temp);
5 V: D# x8 L1 [" ]! R5 Z% x //XCR
) r2 F1 F( P/ D5 n //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! v" W5 O$ O8 l1 }
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
( O& c' \7 U5 e/ M( ] temp = 0x00440040;
! ]# a, d! b1 S4 O, v7 V writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized & Y' ]. Q, }9 G o# B0 X
temp = readl(IO_ADDRESS(XCR_ADDR));
( Z ]& ]- `+ V" ?7 ?9 Q0 l, Y- ` printk("temp=%x\n",temp);
/ @) |9 ?* S) M( }& W- x, q5 E9 x udelay(100);
- \& T$ k9 }: e* V+ |; a8 w //SPCR Register i/ ? y1 W d
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; Z. ]3 g' l4 i" ^ temp = 0x03C10001; //DLB = 0 VS DLB = 1
. W' @& k' @7 O; v writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled7 Y: c% K8 |. z: ]$ Z8 \" o
temp = readl(IO_ADDRESS(SPCR_ADDR));1 ^2 a& L9 m( h+ q1 W. l# A
printk("temp=%x\n",temp);
; h" B1 d, j* K) o5 b udelay(100);
6 T, b# g8 W0 `+ ~" F& C, q( K+ A0 }: Z' S0 i0 H; N( s
//set GPIO direction
. p9 F8 [7 n* w( _ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% P. h, i+ S4 Z5 [% U& t
temp = temp | 0x00000100;//EPR----input$ m* U7 Z, o8 V1 C
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 c$ K, C0 Z9 ~& K
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 K H ?# d: k. U
' V3 T4 O: ^7 g( z: R- Z return 0;
9 a" T# @5 B: s1 b0 V}
" g& a, V& j& q# O( B) Z: c# _static void __exit MCBSP_exit(void)
1 P- [" P( f o; S% S* x- C" s{' D6 e6 ~ R2 s4 m+ N
printk("mcbsp chrdev exit!\n");
0 `6 m7 }# S- h8 q( ^, V, d1 E cdev_del(mcbsp_cdev);
% w7 S+ \5 d3 M unregister_chrdev_region(mcbsp_dev,count);
% }5 C0 K+ H. K i6 H1 l device_destroy(mcbsp_class,mcbsp_dev);& p2 z1 G. M! v# X! b; }
class_destroy(mcbsp_class);
* U: F- g8 W9 E/ q' U' q}
# E+ M% V. F# g! T3 [module_init(MCBSP_init);
: Y) f0 C6 ~5 nmodule_exit(MCBSP_exit);/ \& D# Q' b6 ^4 \+ N& v2 E
7 g2 R7 M3 h* _% Z! {MODULE_LICENSE("GPL");
) k+ r* b: W( Y& D/ R( l& z! O, w4 N+ Y. h' h4 y: O) Y
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 [ w/ f. I5 P- E: Q/ c
我的应用层的测试程序如下
& O3 O ?; D3 s d# l9 Q1 K% D#include <stdio.h>
2 g, T( i) O+ ~* \6 y; q& ^6 r#include <string.h>6 l/ H9 v1 N+ V/ B3 r* K1 }
#include <fcntl.h>
1 U' Y! c* Y' w" \4 r# N4 g5 ~#include <unistd.h>2 i7 }5 g- f0 C& W$ z. T3 H. E6 P
#include <signal.h>& H. v6 o1 M' {' K* ?4 A
#include <pthread.h> //线程! X" E8 z5 l4 }# r: \" t/ }
#include <stdlib.h>9 b e: a0 a( s, Y" ?$ q& U# A
#include <pcap.h> //捕获网口数据
" n7 h' F& T* Z: y#include <semaphore.h> //信号# N" c4 [1 h b6 U7 U
#include <sys/types.h> //消息对列
4 P( K+ w$ B0 c* @6 s% I9 S#include <sys/ipc.h> //消息队列8 p1 f% R/ |. @$ V0 K
#include <sys/msg.h> //消息队列' w- ~7 w" M! j* {- A4 J
#include <sys/select.h>
) M P5 N& f& ?6 H: l" b( `- Z+ X#include <sys/syscall.h>
( l: x3 v" f& `7 @3 n& `3 d#include <sys/stat.h>
' {/ E& }" u* O#include <sys/mman.h>& {: b' M. e- {! _5 f6 d- s
#define msleep(x) usleep(1000*x)
- N' T: F$ a! m2 v% g+ y
8 p! |' M2 M/ s5 c" h% w9 N7 iint main()+ A$ ]$ U! d/ E: s1 u1 t' [
{
, w8 \3 _4 g1 ` //MCBSP,ARM与AMBE2000交互设备
v7 m7 w6 S; j* X int fd;
/ P/ R* M3 H9 U, F unsigned short data_write = 0x5555;
- |% T* {& Q4 e; X. Q. r unsigned short data_read = 0x00;) u9 F/ v6 g/ P2 H$ {* A4 x$ e
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 u9 \; g7 P) P+ V# z! @4 d
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* ?- `( f2 {" m- M" u' ^! D' M
- o2 C. P G- r9 e% o if(fd < 0)
) c+ J/ D0 K& o {; c( s; L ?, N7 @5 ^
perror("open failed\n");
4 g Z r n- A4 o w return -1;
( T3 s6 O; V9 ^( ] }
( ?5 b3 R( Q1 M$ y - ^( o$ }) ` |- S
while(1)" M' u' ] t) Q
{7 i S5 b6 \: u% s9 G) P8 t! T; T
) [0 m( R u/ b* d7 \/ j //AMBE2000每次读写是24个字为一帧9 U9 c4 N* r0 E/ U( T
//写数据时将数据在底层存储起来,等到中断的时候再发送# ]' c3 j$ u% L) c
//AMBE2000输入数据是以0x13EC开头的
+ \! U3 s( s5 R" H0 n5 I% x8 Y6 _ write(fd,&data_write,sizeof(unsigned short));
0 _) O- P# r( k( ]2 x3 r
( t/ N# I) L8 q& _ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
: u+ {+ [. U9 O- W, F, I6 |; c read(fd,&data_read,sizeof(unsigned short));$ _6 l; |1 j0 W+ W
) o2 }/ X" w2 M" N+ U& C; m
if(data_read == 0x13Ec)
% d" n7 b. u- Z% l M1 P" |% z; y {2 Y9 R3 t/ K( ~2 J- \5 K( u
0 }, a% y( i8 n9 e
printf("data_read = %x\n",data_read);
9 s& m# l. }+ n6 G) C/ v! e }
. [' S1 [3 s: h# e 0 O" {' L/ n$ J `4 |+ t% F
msleep(10);
/ [0 [/ g; S, P0 F# j9 h; _
$ H9 t* u3 }! y /*, g3 E/ i" X$ K E
ioctl(fd,1); ' g0 r; K+ ~4 I. }$ n. C
sleep(1);) T1 l# ^1 x( O6 W1 j: k
ioctl(fd,0);+ K. x# Z3 L5 N5 _& X6 v- K* ^6 }
sleep(1);5 }# F6 c/ V1 W Q- N+ D% r4 |
*/ + C% U$ N9 p0 K5 Q
}
# I+ q1 [' H) K) G M& V return 0;8 ~* D) o" X% n. x" F' P
* J( c7 u# K. B& P# W. k# F! Y}8 L7 ~& z- p- Y4 X" { A! M
) [, F5 r8 z7 o* t, T
多谢各位指教,谢谢! 急4 z; I G" p0 O9 `0 P" h! z8 P
. Y3 O" G0 F; i5 J
4 T0 t/ I. K8 _8 W7 k/ n* _
. d$ l! K' _4 ^; `6 F+ s# M1 _3 C
/ g* x/ N1 w E/ d- u6 v. O& K
/ h2 w: {% u# F8 s1 ~
|
|