|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 A6 i% e) X+ a# i( c
/*
! q3 D! I% [! p/ m2 l% N; C * Copyright (C) 2009 Texas Instruments Inc8 V( b( y6 o G0 N2 K
*
& q1 K' V/ H4 m7 O, ? * This program is free software; you can redistribute it and/or modify- Q, P9 @: P2 {8 t
* it under the terms of the GNU General Public License as published by( R. f$ N& D7 a4 J
* the Free Software Foundation; either version 2 of the License, or2 Z$ @7 G5 q/ M9 ?# \2 ?
* (at your option)any later version.
8 X+ l+ J1 E. [# U1 t *
8 f8 ^( q4 P. t: s+ C- J1 f/ Y; g6 B5 x5 U9 r * This program is distributed in the hope that it will be useful,
1 Z$ g/ W) y( z" ~7 _, q1 ?5 b * but WITHOUT ANY WARRANTY; without even the implied warranty of- y. ]8 I% F3 J3 K. Q7 T. ]& e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! ^6 } d0 Z) v, F. _ * GNU General Public License for more details.
$ ?/ G- r/ H& X4 `9 y. f$ z *# Z5 Z3 [; U& N, \( ~9 |; h* ~
* You should have received a copy of the GNU General Public License" R: U% @! x2 d3 a
* along with this program; if not, write to the Free Software
0 v+ g/ Q! V$ j: r7 X1 @# ]3 f * Foundati5 E: c- G6 P* w% Q! g" ?
*/7 I7 h+ R& Q; a/ D, f+ J
#include <linux/module.h>
+ g. n" a. f: a4 W; S; S) D" S$ |#include <linux/init.h>
; K8 w1 D% f- b7 X, c c3 M#include <linux/errno.h>; m/ |' D' _5 J' d3 [1 d n! w; T) T( M
#include <linux/types.h>8 L6 `6 z2 d+ t K6 w
#include <linux/interrupt.h>" Q+ u: m7 n, C8 v
#include <linux/io.h>' m5 u' s) @9 a' Q. I! Q
#include <linux/sysctl.h>
5 Q% w# {5 s9 J- ?* z( X( E#include <linux/mm.h>* H9 J: Y8 O% G, M' r
#include <linux/delay.h>% l, W# D; d+ z$ j* v X! F
#include<linux/kernel.h>6 m, J A" Z" G% T, o3 E! P
#include<linux/fs.h>
( q& q6 O( u( q#include<linux/ioctl.h>* B4 F1 ?5 _0 U7 c
#include<linux/cdev.h>6 t2 t1 ^; g! |6 w
#include<linux/kdev_t.h>
; \* i6 w0 b0 ]& `. W: A! O#include<linux/gpio.h>. D/ r% i8 O5 r* A* l9 v7 [' m# |
#include <mach/hardware.h>1 Z, \7 S5 L: L9 z: ]
#include <mach/irqs.h>
& I4 Q& K3 t' W& X5 {1 r# ]0 K9 Z" ]# @# u
#include <asm/mach-types.h>$ N: h5 H Q, X" W2 B; o2 ]
#include <asm/mach/arch.h>( g& X6 g s# k8 k
#include <mach/da8xx.h>
, _# {# |" V: u: _( D#define SYSCFG_BASE 0x01c14000- O5 s/ p! S2 {! K
#define PINMUX1_OFFSET 0x124
3 p& T( Z5 `8 ^9 w* w/ o#define PINMUX18_OFFSET 0x168 # S8 p* J4 U$ x
#define PINMUX19_OFFSET 0x16c) Z: D8 \, {0 Q. s( K
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
3 O8 Q& e6 U& ~, e' i1 E5 \#define RCR_ADDR 0x01D1100C //MCBSP1_RCR0 x. X! a1 E$ w: S2 ~
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 W1 I2 ]; }4 Z( q r+ M#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
1 z B/ [+ ^. k. P& F$ v0 I#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
7 R% T6 m: ]. S
" G2 M1 Y, `! i+ C- V/ K( Q: G, p, Q6 y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR: O1 ]. ?& u( y3 g
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR. _5 P" {0 d; y* V+ `( w
//PSC b+ U) }; d0 {0 U
#define PTCMD_ADDR 0x01E27120
0 O. x" ^1 k$ C" \4 F/ Z#define MDCTL15_ADDR 0x01E27A3C
4 U* C" n: x" L#define PDCTL1_ADDR 0x01E27304
6 C, J& V l0 `5 o% G. Y. f6 C: V//GPIO8 direction- a f; J" j4 V1 g& O0 u- v- j
#define GPIO8_DIRECT 0x01E260B05 U/ Q& w- y4 }& `6 n/ c1 C
#define GPIO8_OUT 0x01E260B43 S8 f$ z0 v$ D) A1 N
#define GPIO8_IN 0x01E260C02 c3 j0 s4 k" Q, Y
8 T; w9 a6 n5 @/ Z% W//#define MCBSP1_RINT 99
8 X7 ?7 M# G' P# O# {//#define MCBSP1_XINT 100
4 C# Q9 t8 E/ C3 Lstatic int MCBSP_MAJOR=239;
6 n) ?: t1 \9 W: q1 q8 M; f' c5 Estatic int MCBSP_MINOR=0;
% \4 c8 p6 B$ {' }static int count =1;
& i* P; C K# \8 h* e' T. q
* B u2 K8 |1 C( y" t#define MCBSP_NAME "MCBSP-device"8 a7 ?- I( ?: M
6 B( a0 R! C8 W. T: i3 S( c8 `
static struct cdev *mcbsp_cdev;& D6 F3 I" q' o9 T- }5 w- g3 |+ r6 O
static struct class *mcbsp_class;* n4 s7 { t! _5 u, Y% J+ T
static dev_t mcbsp_dev;
# u$ X0 g8 C6 E* Hunsigned int DRR_data;
5 m# V$ W' Z+ |, F. c7 v, {. C% }unsigned int DXR_data;
* w' G0 l, P4 e% ~; Q* X8 Cstatic int mcbsp_open(struct inode *inode,struct file *file). A. R1 d9 Z9 z' F$ @
{% n6 y9 p- D! D8 \( a5 U
3 w. Z7 h A$ O* k; e8 y //interrupt enable,initialized1 s0 i5 ~+ P" @1 F8 `* |7 V
unsigned int temp;" Q2 V2 t+ ?0 L& C- M1 T* e" _" E0 O4 S
//SLEEP_EN(GPIO8[10])---0 Q' V: k* p+ f6 d
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); T# N( ~) w7 O2 |% T; r
temp=temp&(~0x00000400);6 ~, V; d5 C2 Y+ L. C3 D. `9 x
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, U1 R$ g7 r7 c5 y- F6 y4 z, w //RESETn(GPIO8[8])----0----1
; H- @+ T$ A0 l+ ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; Y! C+ ?- e% d8 q temp=temp&(~0x00000100);; w0 P' B* ^: N! z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
8 f! `1 L# R# E# G udelay(100);
" G( W( e: m* I) X! }, E temp=temp| 0x00000100;
1 C n" M1 T8 x, `: V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 {; L( Y, `- \' Y6 I0 F
udelay(100);5 d5 V' M Y7 J1 q
printk("open success!\n");
& W4 x. x$ u8 y [' n' I) `) D return 0;- b5 c! [# L) F8 M& k( u
}
7 p: B: X: |4 \1 D, V' d# k9 ]) k! s J; j- U8 m( l. b
static int mcbsp_release(struct inode *inode,struct file *file)
7 p- u% k0 @4 Q M# d/ J$ c) R{3 ]* B8 U4 G4 F0 W, x2 ~ ^
printk("release success!\n");+ Q4 w1 |1 x7 L+ n0 E8 J& C, D8 V9 z
return 0;( E, i; V* i% }& j$ r( v
}
/ s! Y# _# h8 e
( J2 l8 P7 v' q! S5 lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 `. a$ W3 \& d
{
+ W" a; T) }4 b copy_from_user(&DXR_data,buf,len);
- X' g( I) p, _$ `# Y iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% n8 x" t% N+ \- ]. k1 O- Z, V return 0;- \; l( f8 y2 `3 W+ r2 |
|3 L6 f9 [3 i* `5 L* F
}; ]4 V; i- v, h" u. e3 b
$ o" w' Y: s3 m) Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! D* n2 P0 J+ F5 v9 v3 W{
! i: [( m. H. j& F" E2 Y- S% n DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 w! c) u2 M/ r3 z) W* ]9 f copy_to_user(buf,&DRR_data,len); ) l( b9 a- O6 \* \" j
return 0;
6 q7 H' T* h$ S}
1 X+ ^4 I6 |2 q1 [) l2 Q+ s" e
* c1 h9 ?8 y6 b7 Y9 B
, u9 N; k8 K6 j( estatic struct file_operations mcbsp_fops=
+ W3 s; k T5 a8 F# L{8 d. E" ^ d+ a$ g* Q# X, D
.owner=THIS_MODULE,
2 C# q% j" [7 L3 y9 C+ J0 W .open=mcbsp_open,
. r/ M3 j4 t" X .release=mcbsp_release,
8 r' M& Y! e+ E' g3 d .write=mcbsp_write,
( }3 F( ~) d9 l .read=mcbsp_read,
9 d3 Y- `2 G W$ r6 ]7 u; K% \$ ~};
) M. n$ J& O4 xstatic int __init MCBSP_init(void)4 b- l5 ~+ b4 t) |
{5 v8 I+ K) I7 d9 O9 V
int ret;7 L9 I) B0 \; m' [# S. C' Y
unsigned int PINMUX1_REG_old;3 l* t2 v5 ?0 j- x/ E! w! \0 C
unsigned int PINMUX18_REG_old;# T: F2 X# b: m5 i
unsigned int PINMUX19_REG_old;
" r4 j% Y# t3 f- A: _ unsigned int temp; 9 H4 |' D! d1 ? U2 `: a: N' V
if(MCBSP_MAJOR)
/ q& A; F2 ]& P+ a. Z, Y {
3 D4 E4 `& l( ~# e0 N mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% H' i" G! F9 ]1 Y ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ W% `+ P% p% u! ^ }0 ^5 p; c' ~; Y1 h6 [7 T
else3 J8 }5 `; Y! z+ a* h& h
{
" C# ]6 X) ?! ]3 y; V ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ T8 N+ a; ~6 S/ ?8 X6 M MCBSP_MAJOR=MAJOR(mcbsp_dev);
; x1 f d; i' F: V. [ }/ l% @: [5 z3 r6 n0 H6 L. b! C
3 z, r7 F8 ` \" ? if(ret<0)
" V; \, ]1 J" I& L. W% U" f {
! K2 y( W3 H2 ~1 a n# Y printk(KERN_ERR "register chrdev fail!");! a& s( b4 R$ c B( u0 e; b4 t9 [
return -1;
+ R; p# P$ z8 E' |' @$ ]. J }% p; \/ D0 q0 t+ s
4 r, [; }; |4 O0 ]: x mcbsp_cdev=cdev_alloc();( y/ q5 I' X* u Q4 c( H# V/ \5 \! J
( x4 t9 z% \ _2 h$ B/ g
if(mcbsp_cdev!=NULL)' q& O& X) n* s" A9 S
{, x0 x/ k& h9 M: o
cdev_init(mcbsp_cdev,&mcbsp_fops);
& w0 z9 f8 d+ j o( H mcbsp_cdev->ops=&mcbsp_fops;* f+ W" W3 s( [3 V- p! M* a
mcbsp_cdev->owner=THIS_MODULE;
" `9 v6 S5 I/ Q( S! J 3 w' w5 l. d% l3 N# J
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), r/ q/ X; `* f; J+ q! Q* K
printk(KERN_ERR "register cdev fail!");
2 B' s- v/ h6 D2 D else
9 j D9 P) q3 A/ N3 } printk(KERN_ERR "register success!\n");
: F5 ^2 j4 X4 q3 u }* @3 S& b( d8 O" A; q/ I
else
& s4 T1 v5 w6 w. J9 V z! {7 Z {
5 m9 g8 I/ H8 w# K4 R; C1 R printk(KERN_ERR "register cdev err!");, {) C3 F; g0 I! t2 {& U4 y0 F3 W- r
return -1;
2 K. T7 o* A4 n% v) Q }
+ J, j. ~% O% k' M2 m$ G
% v& O( x" _; o2 i B1 h v mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' P2 s7 d# q/ d: \' y2 ?# _+ I) g$ |
if(IS_ERR(mcbsp_class))
- F6 i* R5 B& P {
8 y6 S8 V* |* S5 X8 o p printk(KERN_ERR "register class err!");1 O! I" S& E+ m7 c- l
return -1;3 d; O3 A( e+ q+ _6 q* c; Y1 o
}+ F& ?. M7 w/ r r
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( g0 C; M# Z! M" y: j
( C3 T, P4 ~% X& Y, V //PSC6 C0 i. Y ~- G/ N0 X9 e
//add Enable MCBSP7 r* G0 j# g+ P F7 p
//test5 d/ v' t' G# |5 k4 i$ H6 S. \# y6 d
temp = 0x80000003;
, i+ u4 y6 \$ Y* ^3 r writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ ^3 |3 J/ O2 g7 Q7 |; s1 e
temp = 0x00000003;: W; n# k$ G3 g }: S8 s
writel(temp, IO_ADDRESS(PTCMD_ADDR));
; G D3 E6 s4 @! [! v2 U o8 f
2 b0 n6 A5 Q" _9 k) ? temp = 0x001FF201;. C# [' d! z% ?3 k4 Z0 T. B+ {' N
writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 P% s8 Z% L+ s0 p
b/ O7 f3 Z. x0 g" K5 F
//PINMUX
5 N- P: v: y7 z1 l //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! E- J5 ^( h! D% h
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% h/ b( ?2 K5 z) E0 H) q PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
' `; {% {! T0 j7 u# C0 Q. |; ~ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 A \$ ]+ I- _
( |3 `$ t; {6 H) M //SLEEP_EN,EPR,L138_SHK1,L138_RC3 }: z& }( z. v# s1 _8 {' X
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ X) u \6 v6 \. z$ w PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ) k: Q; V1 ]. I6 \) }' x
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ @ L& U% ~& l& ~8 j' o
7 a0 N9 B. L' q, t# L: j6 _. b1 ] //RESETn,L138_SHK2
$ F! i3 m: K/ B- M PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 9 H! ^/ k3 |7 w$ P3 L- l
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
/ @# v& I3 \% [% Q4 Y writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 v2 y- F5 x: J 6 _$ f, w" b+ a$ g
^5 p) r# `0 m( W3 R //SPCR Register
' ^6 R, C# w4 d6 s+ U) ?0 b W //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset W( N1 ]4 i9 a3 N: [
temp = 0x03000000;//(DLB=0)0 K+ X9 k+ X6 O, C, Z0 e9 p- N
// temp = 0x03008000;//(DLB=1)
7 w+ {$ n- k8 [7 E$ B writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, }9 | D% U/ t% Q7 C0 z temp = readl(IO_ADDRESS(SPCR_ADDR));2 B& n Q0 d$ g, `8 B | o
printk("temp=%x\n",temp);
5 b% s8 G# m V2 {% F) i8 F! R) I- j
6 G: N: b9 ~5 O: T1 s //PCR Register/ x& ^2 R7 ^) `- e0 N( x1 L/ m3 X
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 |/ f* O( {4 T* {4 l6 ]; f
// temp = 0x00000F0F;
& O4 q# I0 n Z5 A2 X2 M7 q( M temp = 0x00000B0F;% E' F& T. |5 Z% ~
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
0 P1 O" z4 m3 G5 [( B7 x temp = readl(IO_ADDRESS(PCR_ADDR));
) d" Q3 D9 v, l- t3 V; o, U X" S( M( C printk("temp=%x\n",temp); ) f) [4 ~ r; `- S/ c
//SRGR Register! y9 a' S3 n. C5 d' _
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! I3 ]- w; z3 J2 K. l2 d6 x //temp = 0x301F000B;) d" E- v) g7 W/ n5 \& d- ?
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 3 u: m% k( t7 \1 g) o& m9 s1 ^
temp = readl(IO_ADDRESS(SRGR_ADDR));
. q7 I' _8 p% X2 g printk("temp=%x\n",temp);% o# `! R$ I' U0 f) v H
//RCR
( i* j T0 b# m) M9 p8 c; y) z- h! [ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& |9 ~! s* l) x( y' u
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, Y; P; V* |5 q( X' q6 e
temp = 0x00440040;
% _) M; A1 V+ v! d P' U1 q writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
u6 o- a! T, Y |/ _ temp = readl(IO_ADDRESS(RCR_ADDR));. V8 n4 ~/ |$ K, H9 u
printk("temp=%x\n",temp);& {: a8 B% h/ ^2 k& `& f, ^
//XCR! \8 Y' u& G+ H& R2 s8 L6 Y; T
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# M7 X- N$ l) g/ l# t
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" x+ z0 ]7 t* f temp = 0x00440040;
; n! M' k1 `; P. ~. B writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 o9 Z1 Z4 {/ x7 w- ]/ t) l
temp = readl(IO_ADDRESS(XCR_ADDR));$ `- ~, y/ p( x( p( F
printk("temp=%x\n",temp);
; T; D3 C) ?1 J1 W5 d9 [* J udelay(100);
& S0 E9 B$ K! T6 l- J1 ^ //SPCR Register& m9 T' K$ X8 A/ j. Q4 R" |! W
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 T' i4 {( O* b: W temp = 0x03C10001; //DLB = 0 VS DLB = 1
8 x: ^& V3 R. P1 _ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 o, F/ x* q& C/ H temp = readl(IO_ADDRESS(SPCR_ADDR));
# t! W# ^& Q0 E' b printk("temp=%x\n",temp);" E$ o1 _) z! q2 v1 Q* H/ [" B% r
udelay(100);
, x2 O- Q. V3 M8 g3 c1 t* h7 w1 Y6 y
//set GPIO direction# E. L$ ]* {0 x: G2 E
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 Y' ^0 @* h3 [- }5 Z9 s temp = temp | 0x00000100;//EPR----input' | d( y' N; [7 M* o. \- \- w
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ K2 Z+ ~& W) e+ Y) l
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- L) w5 w1 s4 G/ K
4 O& ^7 X+ g8 @+ c) J return 0;
+ ]2 o$ N1 s0 c" v}
0 L8 M+ t: s" }0 w, ystatic void __exit MCBSP_exit(void)7 z% h: \$ _4 Y9 S' h
{
O% d# Z- H! h3 M9 Z1 w; W& C5 I printk("mcbsp chrdev exit!\n");/ j2 L1 x9 u* k% k
cdev_del(mcbsp_cdev);
+ t* U$ e: u( p$ e unregister_chrdev_region(mcbsp_dev,count);3 t. M/ M3 w) f n0 _4 z% o, B2 @4 }
device_destroy(mcbsp_class,mcbsp_dev);, j/ {# G9 ]8 Z2 a) q0 L
class_destroy(mcbsp_class);' j, K" k; ]8 @# [' {
}
G3 w, c! s4 X! }! Y7 lmodule_init(MCBSP_init);: l# `& y' K8 X0 z3 T* n, s
module_exit(MCBSP_exit);
/ L0 ~* h$ e7 }3 T
5 d; e( a( e; l4 M: f) eMODULE_LICENSE("GPL");
b# j$ b$ i$ x6 a7 y0 T" O& m8 U# v8 w, k. Z8 D: {% T0 D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' G8 r% f0 v# E- _: C5 s我的应用层的测试程序如下! f# ~4 [: O: x, u5 I/ ?
#include <stdio.h>
: e. V3 ]) N3 w& ]0 B1 d1 z$ X$ s#include <string.h>. a! ^. R9 x( |) _/ f
#include <fcntl.h>
$ i7 g( [: | H+ G/ m1 F4 {#include <unistd.h>
1 A2 B9 M% N! Y4 A2 r! a#include <signal.h>
7 N( P5 R% F" Z$ R% q! F1 A6 q" a3 G#include <pthread.h> //线程! h+ `$ C* [9 {
#include <stdlib.h>
8 d3 Z/ M, _# x% d1 N2 i#include <pcap.h> //捕获网口数据
6 I7 e- ^% S5 K- @) p#include <semaphore.h> //信号0 v" z( U5 q7 X
#include <sys/types.h> //消息对列
/ X, b: z" D/ f+ B6 i9 s#include <sys/ipc.h> //消息队列6 L; X1 B D! T5 S
#include <sys/msg.h> //消息队列5 c: e0 p/ g2 t: Z
#include <sys/select.h> g4 [ N5 p0 L
#include <sys/syscall.h>) A6 L. X2 L/ J) V7 `* g4 t/ L+ c* n
#include <sys/stat.h>
7 [* \6 s" |; H- J: k) p#include <sys/mman.h>
. x; Y9 o7 j7 s#define msleep(x) usleep(1000*x)
) c6 o- {( _, q: V# _% I$ n3 ?. X3 W$ b% T/ `. F
int main()
8 X8 S3 N7 k! y) j2 W C8 }# u{ 9 ~) }/ C/ A9 }; m
//MCBSP,ARM与AMBE2000交互设备1 \& ?3 V5 Q# i" B
int fd;; C1 [3 }2 g# z3 c# q# J0 t+ k) U
unsigned short data_write = 0x5555;
! N1 B6 J7 j; J! G6 [( U+ i& s unsigned short data_read = 0x00;
; I3 X6 A3 ~, m% a L3 \4 M fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 X: N5 S3 p1 D; g; B, v // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
! Y2 L( [. M/ t( Q5 T" m
9 g6 W0 @* E9 Y( o if(fd < 0)5 Q V( ~# d2 j& e+ w
{
% i; K( ?7 ` l1 \) Q perror("open failed\n");
9 S9 R% l; K" ?/ o4 k6 Q( {0 V return -1;
' ^, A7 M! ~3 b; X% e0 ~. K }1 {; v! m$ \( L6 ]& i9 X
' A1 {( k) K( T6 t4 B
while(1)
# M+ F$ S. f0 X( ]" a/ C8 m ^$ S {
$ R! M( e4 u% r' M+ l# P1 x* ^ 2 F0 L( C' p# ]( j2 Y& Y% o! I* C
//AMBE2000每次读写是24个字为一帧; r! y3 @0 H: y! Z B3 {
//写数据时将数据在底层存储起来,等到中断的时候再发送
* h8 O$ f( [; r* e+ j7 I+ e //AMBE2000输入数据是以0x13EC开头的
5 I* P+ ~6 m3 `9 p, r write(fd,&data_write,sizeof(unsigned short));
2 @% L# X$ i N: V' r; w
' J1 I& ^2 E0 E( N: v T8 ]; L //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ) A6 R* O) h; ]8 A5 Y
read(fd,&data_read,sizeof(unsigned short));
. |0 K; w# t0 M
) v+ r8 k) J$ p) W4 \ if(data_read == 0x13Ec) Y# d) N" o! r, c
{
+ ]* b6 }& O2 f7 f 1 e9 }5 s, `- {& {
printf("data_read = %x\n",data_read);+ r0 f4 w$ a# r9 P- c
}: X W/ P- N' o( C/ `2 h
$ i. \/ {7 N! Y8 K8 P
msleep(10);
+ r9 f& ?6 |/ ~ % X: l8 ]0 N3 c
/*9 }9 d4 k, ? @" J& J
ioctl(fd,1); # U7 J1 i m7 `
sleep(1);
6 Z: J7 s9 t! k! {) I y u ioctl(fd,0);7 J% N* J+ Z* K1 X/ h! U
sleep(1);
\7 K9 r) I7 x4 u */
* _7 |7 n7 L8 x N( B }
5 U$ b" D) P: t1 ]* `# f return 0;) Y& x- T5 i. s- Z
+ k+ k$ Z* G& E0 \4 N9 ~. ~) ~}# M: p+ h" W4 u% i5 q: ?
5 q* C- M, V2 ~$ N2 V多谢各位指教,谢谢! 急- u; H& X. q+ W' y4 V& K' w
7 _& P0 Z9 {/ X5 W: `
; }, B1 e" h) N) Z5 d! U j
9 m( e: _! [# A" X6 l# [
% \) t- I/ z @ V7 j" b: K& `" t4 ^3 y4 C7 e
|
|