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