嵌入式开发者社区

标题: 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 the1 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_DRR4 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  0x01E260B01 X; }7 @( B% o4 |7 S8 a
#define GPIO8_OUT     0x01E260B4; r" m; f1 O# S; m
#define GPIO8_IN     0x01E260C06 ^, 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 Rstatic 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" @: junsigned int DRR_data;
& w$ m! _2 P6 e) |: c% x" o' U9 g  B1 g! |unsigned int DXR_data;
3 |0 k8 L1 F, ^# Qstatic 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])---03 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) wstatic 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# qstatic 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& Vstatic 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 {
   //PSC5 G# Q. Q% w8 q8 i) ~
   //add Enable MCBSP8 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 Register6 ?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 P5 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