嵌入式开发者社区
标题:
McBSP时钟、同步、数据线不正常
[打印本页]
作者:
gaocaimary
时间:
2014-10-16 10:58
标题:
McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 {, z7 O' A* i q7 [5 A
/*
7 ~( v* z- k# @0 o
* Copyright (C) 2009 Texas Instruments Inc
( |- V0 p! A5 w8 Q
*
, b' i8 l' L1 q2 W: z1 ~7 u
* This program is free software; you can redistribute it and/or modify
# p9 H9 X( c: h7 ^4 A- |+ ~( n
* it under the terms of the GNU General Public License as published by
/ X- l6 I0 [2 J8 L/ d
* the Free Software Foundation; either version 2 of the License, or
! |% |6 G' T- I; b5 h- H* D
* (at your option)any later version.
3 F3 @) F) v; Z5 ^1 |8 c3 A
*
3 c% V1 @' p+ p
* This program is distributed in the hope that it will be useful,
. I/ I. `5 f3 r& I
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ T' y0 N) V$ u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 h7 ~, i' l( g# m% L5 m
* GNU General Public License for more details.
4 E; Y/ _( F+ b# g+ F! F
*
8 D: T$ G8 A) K0 }) u
* You should have received a copy of the GNU General Public License
" s+ L$ j. l6 |4 C
* along with this program; if not, write to the Free Software
; W* ]& |0 b' l4 A6 U# @5 M' I
* Foundati
' \, x+ b! b! k4 j7 `/ I9 V6 ^7 B6 V
*/
; S r0 g7 O9 ^" z# e7 }5 r
#include <linux/module.h>
" J: m. B) l0 y( J' {3 b) V- V; n
#include <linux/init.h>
4 v) K x4 g- o4 @* ~+ R3 `8 ^
#include <linux/errno.h>
( d# q8 g8 w G9 c
#include <linux/types.h>
0 ~ y. D' }1 {
#include <linux/interrupt.h>
4 h: C2 K2 r4 d6 n, T& r- r
#include <linux/io.h>
4 ~* M0 p! {# {7 c; R+ s7 Q( y
#include <linux/sysctl.h>
) m1 V% a" O( ]0 X" h4 l9 I+ S
#include <linux/mm.h>
+ x5 n& e# ]! o- p- Q6 |- M8 p" g8 g
#include <linux/delay.h>
1 X) s. R: n/ M1 D: t
#include<linux/kernel.h>
1 y: P' @& t7 U1 V1 p1 ~
#include<linux/fs.h>
. A7 ?5 S, u5 Y6 p5 x
#include<linux/ioctl.h>
; ^% i- @( T' t
#include<linux/cdev.h>
! k" P: V! A' h( a
#include<linux/kdev_t.h>
8 h$ O, x; O' A/ F$ G9 U5 u
#include<linux/gpio.h>
' b& P. ^, w) n2 L9 ]
#include <mach/hardware.h>
/ Z0 P: \5 t4 K6 _
#include <mach/irqs.h>
& O R" d0 u# p3 u' l/ S2 {$ v. J5 V
" _5 S1 k3 t7 p0 y
#include <asm/mach-types.h>
# X4 u3 ^; N8 D1 }
#include <asm/mach/arch.h>
5 i3 d3 @% h) z; P( R- u# l
#include <mach/da8xx.h>
$ |, ^/ m) j* K8 K! d6 j6 X
#define SYSCFG_BASE 0x01c14000
* q" [* A2 D3 j! @$ }+ v2 |
#define PINMUX1_OFFSET 0x124
. T I# ~, A; ~% C; Q' P
#define PINMUX18_OFFSET 0x168
6 ~" [$ u$ A: r2 K4 S4 k
#define PINMUX19_OFFSET 0x16c
9 X' q* o* C. @2 i3 i
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) m+ T, Q+ X0 _: w: `
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% O s9 J" K# X# j8 E
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
" |# [) k! v4 \. S
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
* ~7 J8 i/ P# w. `2 L
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
/ F b! p7 x% S' |: P, s) F: P
$ k5 R$ x% z* i5 v: @
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
$ U" ^7 ~* {1 E1 y4 H. l- L
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
4 y% c+ X, `" }( `6 U, }
//PSC
" V0 z9 B% g" _. Q) _% F# N- d
#define PTCMD_ADDR 0x01E27120
, G2 ~4 ^0 H5 B7 B; q/ q
#define MDCTL15_ADDR 0x01E27A3C
5 ^8 m6 ~2 E1 _& v+ N8 E
#define PDCTL1_ADDR 0x01E27304
l! q) {! }; `/ F( d2 D! W6 ^( B
//GPIO8 direction
+ U6 N. v. l1 G8 u5 o9 `
#define GPIO8_DIRECT 0x01E260B0
1 X; }7 @( B% o4 |7 S8 a
#define GPIO8_OUT 0x01E260B4
; r" m; f1 O# S; m
#define GPIO8_IN 0x01E260C0
6 ^, w, ~- N' N/ t. {, t
: l/ `" ?' `( t5 t6 m
//#define MCBSP1_RINT 99
, I) k& g& c; h( c5 T' a: M
//#define MCBSP1_XINT 100
' o4 }4 N) A. W9 s
static int MCBSP_MAJOR=239;
0 _6 U: m7 o0 l; t9 a% z3 L2 R
static int MCBSP_MINOR=0;
1 V* ?5 ^3 f& t& j p, k
static int count =1;
9 @, `9 t* m: F$ @# [
8 G4 z: W# ~8 _, T9 D3 q8 |
#define MCBSP_NAME "MCBSP-device"
6 L6 @) Z" g) A( d
& i5 f! d' v* v3 _' E# ]
static struct cdev *mcbsp_cdev;
9 c* B& k: r5 a" R/ b' @3 p. I
static struct class *mcbsp_class;
6 t& t. N- n* _! H
static dev_t mcbsp_dev;
5 x- i* p' J5 O" @: j
unsigned int DRR_data;
& w$ m! _2 P6 e) |: c% x" o' U9 g B1 g! |
unsigned int DXR_data;
3 |0 k8 L1 F, ^# Q
static int mcbsp_open(struct inode *inode,struct file *file)
8 }9 Y9 A- P, |
{
) s9 ]' O5 H2 @& |: {6 K* M) r
, G! U* r, ?" ]" P$ D+ Y0 L
//interrupt enable,initialized
( A7 q% N' ?4 {* @+ j4 E0 J
unsigned int temp;
- V; G( E) ]! H; ^6 c2 {3 L; j
//SLEEP_EN(GPIO8[10])---0
3 J$ O: ^1 H" g' ]5 a8 \0 R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, Z: T/ A& D$ a. F2 B$ P' \
temp=temp&(~0x00000400);
: d# H' E# \& a# N C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; R) G! V$ h: Q9 D% W$ h
//RESETn(GPIO8[8])----0----1
; p' y' o5 L$ q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 b ~ K9 r( A5 ]5 x5 R8 B( L
temp=temp&(~0x00000100);
, A9 _1 {8 Z) | o9 I7 o
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- B2 |" K6 U* Q8 U: l, M
udelay(100);
; b( L1 P; r9 ~1 P, G$ J
temp=temp| 0x00000100;
$ _" D/ K) C# v R8 g
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
$ I- M. C t0 p9 f J M; f
udelay(100);
3 ^+ X* c1 X" v+ L7 b
printk("open success!\n");
: Y' k$ I3 p- m
return 0;
2 G) h' m- C3 O. m
}
+ ^, C' U4 z" @. ~" V
& D3 v7 S+ g2 a) w
static int mcbsp_release(struct inode *inode,struct file *file)
' L" c" l+ v+ d! `* u6 _
{
1 e# ?8 C& i7 D; V2 i
printk("release success!\n");
: }$ {6 g# f8 Q: j9 o. Z
return 0;
0 m9 i f" w b& w6 ?
}
, ^ n1 w' f8 X8 g8 ~
' f& p% d# {1 S7 M# q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% Q8 x+ V9 k" c; ?
{
* U7 }, K& ]4 M! a: z
copy_from_user(&DXR_data,buf,len);
( Z% U, |% q6 ~4 b* Q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
& k( D$ d) C ^1 u- P/ s+ W
return 0;
% I2 Q8 \7 K6 Z1 x
+ E6 F7 {. x) Z% ^3 p7 y% q
}
8 d( h3 N0 x0 @4 b. b4 }) h
: c' W) e1 }+ n& K+ I
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
j8 v! S# K# r4 X% M& k; Q6 u
{
- ~7 T% l! N( E
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
+ b# D, \' {' Y" C; z( b0 r' |$ m/ Y
copy_to_user(buf,&DRR_data,len);
/ d. U! s w3 T4 y( h
return 0;
, ?4 m* Y) }6 ?3 ^( A2 ?
}
+ q7 o9 ?5 D0 D1 K
: G7 `" Z' O3 ^- G1 J. a
& s4 v7 Y8 z, o, S. y9 ?
static struct file_operations mcbsp_fops=
& ~8 w4 s! u" o( _, L
{
% ?# H5 A' C7 M. q
.owner=THIS_MODULE,
& o; i! L" Z- [( L) Z1 @
.open=mcbsp_open,
/ C1 o$ `1 r, m9 B5 g z$ N) V
.release=mcbsp_release,
: r* G) T( r% {! i/ ^& v
.write=mcbsp_write,
1 L. \4 Q4 Z% V1 f5 @5 A
.read=mcbsp_read,
# w2 Y( z Z' @: n
};
, G' \, W6 z/ Q7 S2 h# g& V
static int __init MCBSP_init(void)
+ W. k+ r' `6 M" R% C% `" F$ A$ w
{
! V& t# @# Z! R, S
int ret;
7 K5 z0 h) k8 P" j4 I3 s
unsigned int PINMUX1_REG_old;
4 ~0 x- P4 q$ j
unsigned int PINMUX18_REG_old;
: U1 Q: e- @5 h" ]
unsigned int PINMUX19_REG_old;
1 M+ d0 n: A) b6 @& y
unsigned int temp;
- T; V' _% w" p6 D; X
if(MCBSP_MAJOR)
; E h$ ^& d) q, o% u4 Y0 H
{
& c" q( g( O6 A
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* f. v/ r; G( h8 }7 B) d: a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ o8 \* y. b2 ~! _% G1 [
}
& o! q t/ d* P! `4 ?
else
' f/ P; a' V- B4 M$ N2 e! Y
{
# W9 t1 M5 `5 C4 p) ~+ `
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- `6 \ d1 b. k8 z
MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 i9 x7 H& a8 a6 R1 h
}
# p6 n4 ^9 \9 x+ o3 F
: c/ y& G6 K9 Z0 R: R8 Y+ ?
if(ret<0)
% R0 c: {) M0 Y4 z, y8 X: S3 L
{
+ w$ R1 V/ b/ A1 ]! i6 V' F8 q
printk(KERN_ERR "register chrdev fail!");
* [) s5 J" V9 j4 O: l
return -1;
8 V# Q+ b7 r/ m: Q9 [
}
& l4 t' Y. \3 V
3 f q) K1 H/ ^( i! @
mcbsp_cdev=cdev_alloc();
0 r2 f! a+ d9 g# T- f
, E& [6 }1 ` d
if(mcbsp_cdev!=NULL)
$ o* }" ]9 u: y4 M
{
) n/ n% b. G0 Q4 R% ]' e, A( F3 A
cdev_init(mcbsp_cdev,&mcbsp_fops);
" [; J- k8 P3 O
mcbsp_cdev->ops=&mcbsp_fops;
' o; v i6 L- J1 ~, v0 t# `
mcbsp_cdev->owner=THIS_MODULE;
/ y1 [( \0 q. p, m& p! `* {% J, {
: z1 V2 W% G! m+ ]+ R
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ s* {1 D5 g1 ~9 e+ U* q1 _
printk(KERN_ERR "register cdev fail!");
' D- A4 T) t5 v' f
else
, Q( ~# S4 w Q% I6 G# w: _
printk(KERN_ERR "register success!\n");
/ t; A2 ?# V; R0 T% W7 I4 `5 I r
}
. ~$ _* ^+ k) W
else
- r8 N0 p9 m! N2 H7 D1 b1 x
{
# P1 E5 m Y8 [& x
printk(KERN_ERR "register cdev err!");
$ y/ o* [0 f0 F* k1 B
return -1;
! A' R- U( B" w8 c1 U% w( E$ P' m
}
; M; V8 O, e: k" v, I. a/ N( z
; r8 x) a1 ]9 `8 r6 k5 J$ ^
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, C& t4 f- j7 H' N4 a
if(IS_ERR(mcbsp_class))
$ J( P- \/ V* v1 _
{
; a$ v! ^# G1 s/ ^$ K- ^
printk(KERN_ERR "register class err!");
u0 Q; l( A1 T- \. {9 R+ g
return -1;
2 a' e& G4 G7 r
}
1 u8 {# L& n' X$ b* R# Z; w
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 E+ U1 ? t% i
. M. T; M% p K9 d6 {
//PSC
5 G# Q. Q% w8 q8 i) ~
//add Enable MCBSP
8 Q6 \ _, s( E$ |' c5 j
//test
# S) }! F" D }3 Q7 X8 R) L
temp = 0x80000003;
. t+ Q% {2 y: z6 y
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
) e+ j" z! i0 @
temp = 0x00000003;
4 L8 o7 d) O& R
writel(temp, IO_ADDRESS(PTCMD_ADDR));
) l6 g5 w% `1 J% B5 Y
+ t, m |& v2 n) g
temp = 0x001FF201;
. o) G3 m# H$ F& ~, s# M3 S
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 t" k7 C! ?3 T* M8 L9 ^. @
7 x' Z% y4 F. r' t# v. _4 T- N
//PINMUX
3 U0 g) C6 m0 x/ L! s: u" p5 i5 ]$ E
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
& ?7 k q5 Q) ]6 l5 n0 x
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ E! x R" g4 Q! `
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! }/ _, T4 R, Y$ Z% a
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% h! {* x1 H w# `9 n
2 [% c- a4 x; i/ @4 K; }& ]3 o# Q# }
//SLEEP_EN,EPR,L138_SHK1,L138_RC
, Q [0 ?+ W$ v8 C- S9 F
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 e$ R- J C& v! J6 B9 T3 J
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
9 @1 j* p; Q8 \4 Q
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 P% u5 s% g$ d: w
. Q& h, K; f: }1 d* [0 U! ~
//RESETn,L138_SHK2
; k+ y- K- J8 G4 V' i+ v
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) a$ s8 q! T0 Q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- n! a8 f/ g$ ]: T$ w {- f
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ ?& D0 w/ b8 Q8 C% Z$ \
$ H) `! u8 D Q# O% J; s
! K" h0 x* r6 ]5 U* |; D+ O
//SPCR Register
* ]% A% }8 Y- S$ }' N
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 |5 l+ b( P" a$ c2 S U
temp = 0x03000000;//(DLB=0)
6 {7 D/ r- R! ?" |! T5 q& o/ x
// temp = 0x03008000;//(DLB=1)
( R4 a/ s. L8 q
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
" h" @0 e$ ?5 Y7 G* m# b
temp = readl(IO_ADDRESS(SPCR_ADDR));
- y) K& p4 @" Z0 c0 V8 Q( y2 f
printk("temp=%x\n",temp);
5 f* v/ P. x! y: R0 Z4 D- N
9 l, l9 K. m' J* [5 V* [4 w/ d
//PCR Register
4 m8 H( |8 o+ Q6 f) l( v
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ y) ^; B1 c/ P# d2 o* u- T
// temp = 0x00000F0F;
' m8 e5 X* Y# y9 f
temp = 0x00000B0F;
5 y' l) s0 H, C; I3 [" d! `
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 o( k: \ N# n/ U+ R5 i
temp = readl(IO_ADDRESS(PCR_ADDR));
4 h; B. ~5 u/ ~
printk("temp=%x\n",temp);
0 I6 h+ p% L. M; @) u
//SRGR Register
6 ?9 W/ e6 X8 _1 _
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! ?9 Z! g) T9 V! I
//temp = 0x301F000B;
% x" D/ P) h5 ?- C9 f
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
! A( o: X" T# @6 K4 h
temp = readl(IO_ADDRESS(SRGR_ADDR));
L: ~2 y$ N; U+ z
printk("temp=%x\n",temp);
1 Q, q9 s" ^, r* J9 _) D: n
//RCR
# b4 {3 O) w1 P, G
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 ?+ N% P$ Z- ~. z9 z
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
* L3 v" t. e( G8 k$ C9 c* V
temp = 0x00440040;
6 _$ g6 ~6 L: c3 ^0 q q& U
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
% k) C# B' y0 C2 X5 h
temp = readl(IO_ADDRESS(RCR_ADDR));
7 [ O" q& I$ S. W. [8 t
printk("temp=%x\n",temp);
) v- D d4 H. F: b) e, y% y
//XCR
& y2 q: l5 X* b5 \
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- n! X P6 O% l7 O
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 c. H2 f2 G( u. g' X
temp = 0x00440040;
/ [* D# s, I2 H- [4 W, ^* B- q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
7 C" U- _6 N/ S- [. m
temp = readl(IO_ADDRESS(XCR_ADDR));
- t5 R! d; P/ p' h4 z5 X. l! s+ s
printk("temp=%x\n",temp);
) d- Y8 N: E6 B8 f: P
udelay(100);
* g& z! W+ O$ V
//SPCR Register
- C. H7 H% D' J# h* }% U# |. m
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 y7 A0 j6 ?5 Y( E1 f* h5 Y
temp = 0x03C10001; //DLB = 0 VS DLB = 1
) u7 g7 Y, y7 g7 l7 }* b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
9 c' R' f' T' X* }' b" O
temp = readl(IO_ADDRESS(SPCR_ADDR));
) A7 P: }2 Y- H- p
printk("temp=%x\n",temp);
& q+ O7 l9 e ?* f6 m6 @- ]+ G
udelay(100);
* w! O- a1 g2 w1 {7 x) n
$ f, S% W& {8 E; y
//set GPIO direction
6 I& o# [8 S3 P1 F5 m
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 }$ G2 m) t, e
temp = temp | 0x00000100;//EPR----input
' d+ |2 A7 E, Y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- r# |8 y8 f# c/ R) U
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 E3 ^5 ~ g* G5 ?, ?" i4 x) p
+ ?) ~, T _4 ?# C% J8 U
return 0;
0 ~+ U6 Y- U) p2 j
}
9 }; a6 j7 p; k
static void __exit MCBSP_exit(void)
7 y0 h0 {( a( w2 m% K
{
9 S6 C4 \7 H6 ?+ t) y" }
printk("mcbsp chrdev exit!\n");
% W: r4 f% D8 h, c) d4 G4 m
cdev_del(mcbsp_cdev);
4 ]8 t# v: [' u3 A; C1 M
unregister_chrdev_region(mcbsp_dev,count);
! `/ H' W! g4 r0 p, _/ k, D. N
device_destroy(mcbsp_class,mcbsp_dev);
% M8 l2 w) ]! @. n( I3 E2 @% Z% x
class_destroy(mcbsp_class);
/ s# a) G0 M; H* {0 A7 Y/ q
}
" F* J- }( j" p' q9 \
module_init(MCBSP_init);
8 V P9 P V' G' Q
module_exit(MCBSP_exit);
8 M5 T; L1 Z5 ^3 h9 z8 u7 u5 P
' B$ j( V, A5 ^: e. h* X, ^
MODULE_LICENSE("GPL");
* R% L4 ]! ^; c; u" Q" n
9 s" e2 y4 k K) Y, k+ i. D2 z
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 S* O B) P; T0 L# f
我的应用层的测试程序如下
; e: Y( w7 ~) C+ j6 X2 s
#include <stdio.h>
" }1 g" g; b" T- w* ~
#include <string.h>
6 s4 V# P& X' ]& S+ ^
#include <fcntl.h>
2 T1 c, I0 e$ m( ~- Q
#include <unistd.h>
2 F" N# Q1 {8 o" y- B4 K# F$ h
#include <signal.h>
& l: U, `# Q( {8 |6 x2 s
#include <pthread.h> //线程
/ `' ]% R, U2 \
#include <stdlib.h>
, D" a0 \5 b6 a' O/ m2 [
#include <pcap.h> //捕获网口数据
! i0 W8 Z- e$ z& y: z/ D" J( s
#include <semaphore.h> //信号
2 ^. |. {7 ^9 V
#include <sys/types.h> //消息对列
# V- m7 _. M( ~$ X/ l$ B h- X6 ~8 [
#include <sys/ipc.h> //消息队列
# T' g) N% J% \& }1 a$ k2 n
#include <sys/msg.h> //消息队列
5 c2 p5 U0 F: _& w# m
#include <sys/select.h>
( g, a K' a7 O
#include <sys/syscall.h>
1 a# t" w6 v# F8 t- c, w
#include <sys/stat.h>
# S$ H0 M9 l1 w6 X E# U
#include <sys/mman.h>
' U5 y6 g3 {5 V a& ]
#define msleep(x) usleep(1000*x)
8 l' w+ k1 h( F" _" \( z
/ \- J1 h X# O# ^; i% |. _
int main()
% [$ q0 |1 G8 e8 _6 M0 p. I
{
% m5 D0 B0 s. X5 i2 {) y# e8 {- w" T" k
//MCBSP,ARM与AMBE2000交互设备
+ r4 \3 t8 b- z3 ?( S4 q% u
int fd;
# P1 v& P- G' o L% V
unsigned short data_write = 0x5555;
5 _5 }! k; ?6 T5 U, H
unsigned short data_read = 0x00;
4 C+ h: h' O5 ^2 }3 f ?
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, Y/ Z: L7 u( y, X( m# d
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, G& ^4 V; H5 X0 M/ N P
8 ^4 b5 P+ @# n: [& \
if(fd < 0)
$ s; _2 L) Y8 ?. M1 x" m
{
9 g/ ? m# I) a8 s+ C3 c
perror("open failed\n");
. }* r" F. L& h! k3 I* A7 X# a
return -1;
1 Q9 {8 `( d \/ s) f! a2 o
}
* G( M O- N; z2 g# ^+ P5 x
: U/ k2 P: a( [" `# C
while(1)
- @# @) n3 a1 j1 {- O; K
{
% P K+ K6 c2 ?- g
) U5 d' g9 E- k" D- E0 l6 W3 H* {
//AMBE2000每次读写是24个字为一帧
6 {. k) h, S7 K" S2 f# x. q/ X0 S
//写数据时将数据在底层存储起来,等到中断的时候再发送
; X8 b+ L' m9 [1 C
//AMBE2000输入数据是以0x13EC开头的
7 q% V u8 _8 W
write(fd,&data_write,sizeof(unsigned short));
! V# K1 C, }" P2 K5 u
' A- ?/ Y( @! ~
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
. s5 ~9 `; u8 \, a
read(fd,&data_read,sizeof(unsigned short));
x2 d- B, `& a6 R; M
) v; S8 T! q7 A! N6 C! n
if(data_read == 0x13Ec)
6 v+ }) q; m& ~1 C! r# U' t2 ]* G
{
* K3 ?! W2 R/ a. {' _) c
1 u) C# |9 v5 z- Y
printf("data_read = %x\n",data_read);
, U, G4 n5 X: M
}
. `& G2 N. B0 v# ?
8 [7 [& B0 @- i# P. s
msleep(10);
8 B c M' G$ m# Y! P4 v
" p: S3 c ?, m' F) R9 D. F R# Y
/*
_% `1 }( w' G- v$ b# K3 y
ioctl(fd,1);
- k3 Y, z' ~! C) i( s
sleep(1);
' e# W/ H/ e9 \
ioctl(fd,0);
. d8 U! W+ R* a' r! {0 R+ Q
sleep(1);
0 {# k" Z/ \, G7 \" o
*/
! A/ W% q [) L! Q: R
}
8 `: t3 [/ W; A; V
return 0;
0 H$ S, K/ l) [0 I
, r7 y1 G0 }6 a! z$ f& H
}
( l$ i& N6 [9 T
# q4 }; Y0 { _: [0 E
多谢各位指教,谢谢! 急
$ \* W# {( {$ R* O
g8 n3 z9 A3 {" u
/ U/ T: _' z3 ^! ^9 P
5 r4 ?: \8 S& O' t" J% J7 {3 i
/ e" r+ X" r2 F$ \, a! M% F
7 k5 S: U; m4 `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4