McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5648|回复: 0
打印 上一主题 下一主题

McBSP时钟、同步、数据线不正常

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * H+ I* e5 q! Q/ B% |8 F
/*
8 m: a+ w; Z2 G9 d+ E * Copyright (C) 2009 Texas Instruments Inc
6 L$ J  X6 G# Q8 y8 M0 ?8 j& R *- Z0 A. W, G* e5 S- \$ ]& V/ r
* This program is free software; you can redistribute it and/or modify
6 }# d; V( [8 y3 \  f * it under the terms of the GNU General Public License as published by9 l! m& a: y4 d, R! e6 a
* the Free Software Foundation; either version 2 of the License, or
( W" ?' ~% A, g * (at your option)any later version.
7 O7 o% X0 b# G% ^& a# x *# x# a+ B1 ^2 C6 [) {% |
* This program is distributed in the hope that it will be useful,
2 o6 g+ a5 k2 O* D' Y * but WITHOUT ANY WARRANTY; without even the implied warranty of+ f# P+ \5 p6 C( n# o  s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 E" Q; m7 y- J+ x' Z% I * GNU General Public License for more details.
# X5 V5 i/ ~( H *
5 R, u9 y6 H/ m9 h; X4 f * You should have received a copy of the GNU General Public License. ]; v6 E8 F* T0 h$ A0 \
* along with this program; if not, write to the Free Software
6 N0 }3 p% K& f- O! M) t * Foundati+ Y% Q. ~2 Q/ Q3 r
*// l; f& r+ g8 R6 a1 u1 v  Q* [5 ]
#include <linux/module.h>& o% ~8 m2 m7 v+ D+ x1 N" P
#include <linux/init.h>) l, B, t! D/ ]( r, u
#include <linux/errno.h>" D( z" u$ _/ Y" }" V
#include <linux/types.h>4 o# d* c' d# }) Z/ [$ \) }& b
#include <linux/interrupt.h>
! K& ]6 ~' }. _#include <linux/io.h>
4 p* h6 P) _0 j( F7 Z6 g3 [#include <linux/sysctl.h>% j% y8 `# N9 d  S1 T; E/ v
#include <linux/mm.h>
: u0 ?5 ~& ^* A. t, g7 t* D0 d#include <linux/delay.h>
- ]6 p( ~6 r: l  I# x8 b#include<linux/kernel.h>+ E$ e7 ]1 {  ^4 h
#include<linux/fs.h>2 N3 D* ]* y- p$ J" T2 i
#include<linux/ioctl.h>  j) r; j" {- I0 P
#include<linux/cdev.h>' l; @. y/ O) D2 j% b# m
#include<linux/kdev_t.h>
% s6 L7 u  q- L; h#include<linux/gpio.h>
& h5 t# u8 |, f: W, r( }#include <mach/hardware.h>6 m/ }" S# p7 h7 X6 X
#include <mach/irqs.h>+ n1 G& Q* w# a6 T+ i
  V0 y' u) R* K8 @& B7 C# f
#include <asm/mach-types.h>+ X# x  Q/ Z, l! E
#include <asm/mach/arch.h>8 ?: K# a  L5 N9 D
#include <mach/da8xx.h>  N5 V0 }8 U+ ]. O1 M
#define  SYSCFG_BASE   0x01c140001 n7 w4 k6 P. L2 A6 }- }
#define  PINMUX1_OFFSET   0x124
9 k) G+ U$ V8 ]8 L4 f( Q! n#define  PINMUX18_OFFSET  0x168 ) [6 O% F- D$ k1 u0 w( v
#define  PINMUX19_OFFSET  0x16c9 c# @0 S% E- e% U3 N
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 T; y' q8 ^* ?5 y/ t
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
' p4 p( N) j1 n#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR- @9 a+ y  ^/ O# u* Q3 X
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) j6 {5 Z) s7 M#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
$ I5 r) A! E, ^) ?! k                            ; v, {& i4 j* ~% b5 Q: N# K+ c
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
3 @% n6 e- x- }! q1 _#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
9 ~2 v7 S( W' X) N% Q//PSC
  @* X; U3 A0 h- h#define  PTCMD_ADDR   0x01E27120  / A: O( ?+ j3 m
#define  MDCTL15_ADDR 0x01E27A3C
3 j2 Z1 b  ?- ^& u1 A#define  PDCTL1_ADDR  0x01E27304
6 ~; F8 L+ Y2 ~# C6 |//GPIO8 direction: p& a1 M/ y0 w9 N
#define GPIO8_DIRECT  0x01E260B0) ~& P( ]; i5 O) k
#define GPIO8_OUT     0x01E260B4
8 v3 z2 s4 h5 u7 c5 ?3 l8 t#define GPIO8_IN     0x01E260C0
, g: G# F" [/ r6 ~7 w% ^
; u% |( C1 H( E* m9 i  y( l3 ?//#define MCBSP1_RINT    99              ; \7 r: U5 P/ \, Y. ]; O0 O
//#define MCBSP1_XINT    100  
0 R4 z+ Y1 b1 J' E2 ostatic int MCBSP_MAJOR=239;
+ V# @) @; }0 ~, lstatic int MCBSP_MINOR=0;" L4 U$ \5 I5 Y7 ]3 b7 ]' Z
static int count =1;
, y: i" M8 C8 Y/ q9 a+ n8 P6 P0 m, a' |
#define MCBSP_NAME  "MCBSP-device"  g7 a& \  q- h" E# g8 w

) d+ _! g% g; {7 u6 X6 Qstatic struct cdev *mcbsp_cdev;" W4 n3 g2 d3 B9 s
static struct class *mcbsp_class;* i+ ]% R/ x  C
static dev_t mcbsp_dev;+ \2 H5 [8 C* \; M0 z8 W# u( b5 @
unsigned int DRR_data;! {3 c- ?: l) T9 E5 b
unsigned int DXR_data;
$ c( x( Q$ O+ \; T' L6 lstatic int mcbsp_open(struct inode *inode,struct file *file)* s; w. b  o( Y7 [1 g2 r
{' m; G! i# K3 N, v
   
, C" I# {9 d) X4 ], v% R   //interrupt enable,initialized
5 r5 w) S' R9 s" M   unsigned int temp;
5 n1 Y$ J. I( |$ L+ H% I   //SLEEP_EN(GPIO8[10])---07 j0 F8 b4 x5 v; F7 B% t
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' n- D0 {4 k, E$ p4 R   temp=temp&(~0x00000400);2 J" ^: H# ]: \  h
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 N* f1 I, q7 G5 i5 C  //RESETn(GPIO8[8])----0----1
+ V" o7 W$ s% \* w9 h8 P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  ]; [. g- G( F" h  Z   temp=temp&(~0x00000100);
3 }1 Q, O% A0 E" q) C0 }7 M0 @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---04 V  L: b9 h6 g! O2 H  A
   udelay(100);
. ]8 u+ q. P% u% |   temp=temp| 0x00000100;
" Y6 ]8 Q" V9 [( p6 ^3 T0 X, l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& u8 }2 o% r7 C& w! w, g7 ~" j   udelay(100);
7 y8 F5 J1 f8 m7 K& H$ a   printk("open success!\n");3 O, s* D7 C6 M! D' j. \
   return 0;
) R4 Y+ E( e+ `) m! o- s) N}0 U+ O. C/ s8 n) I- g$ D

3 f7 K5 M7 h! G* B- _0 dstatic int mcbsp_release(struct inode *inode,struct file *file); l1 w: W4 ~" m! Y5 N
{
2 B1 D6 i' D# ~7 l   printk("release success!\n");" y- n: H( u& w
   return 0;) q, N: H6 }, x1 \( k8 y
}( v9 o+ m. }/ O

* `* c- J  Y3 s" {+ A& pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- V* W, U* G$ f% s{+ {# l: S0 T- e, k
    copy_from_user(&DXR_data,buf,len);
6 H5 I# Q2 C0 t% I" f# \    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
# m4 ^9 O% R: F7 K6 U    return 0;) G+ ~: E" c' K# k  R+ d9 E

8 _' s3 o* w2 K* P}& {" x' d2 }7 j0 u

+ p* a+ Z; M- n  M8 j( h3 estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* y+ F1 h0 R% }9 e{
) S9 _% g$ E8 C  R  L% B   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 |% J2 P$ x, F" n& I; B
   copy_to_user(buf,&DRR_data,len); ! U# C" i% ]+ d
   return 0;! Y, Z9 M3 K0 {: O3 t6 p8 [
}
7 f. }+ t; L5 A2 m
2 A  O) g/ h. Z; h; c3 a5 u2 b8 j/ R1 o2 S) e
static struct  file_operations mcbsp_fops=
) O4 S$ B; k" h" y1 J{; M0 Q% F; e* d" b- e8 K  `4 o/ D- B
   .owner=THIS_MODULE,
8 `, m: C; L1 M$ }   .open=mcbsp_open,. r0 N' x* T6 U, ^( ?9 o
   .release=mcbsp_release,- S8 \$ \* @0 A, o9 q" F5 U
   .write=mcbsp_write,
" @7 m  k0 z$ }" @- o. y4 e" T" F   .read=mcbsp_read,
& U/ z  G9 `! S" @! M- K};
+ A  F0 r) @6 @! M2 ustatic int __init MCBSP_init(void)) [2 u! C+ O! _0 Q: G
{
; b$ C4 w* h9 N$ X: e  I) a   int ret;
" G6 `8 t+ [& j# C9 \/ L   unsigned  int   PINMUX1_REG_old;9 k- [9 P9 ]" e& G: a+ M
   unsigned  int   PINMUX18_REG_old;
9 o( |( }2 k* E' V   unsigned  int   PINMUX19_REG_old;: i! g  K5 C9 c- \7 \
   unsigned  int   temp;  1 g. H' K7 {9 ~% @: W
   if(MCBSP_MAJOR)
4 I4 g$ ~. j) F; }2 C5 B   {
2 k( r! ?1 c( h1 }) `7 a% o! y+ g  E      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);  H) u% D/ A$ S
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 D+ i5 `- p1 C: B2 t   }
2 e* ?  ]- T! m, ~   else7 i! s1 U- b- [$ _' \7 H0 {" M
   {- p  C4 A7 E( V+ p3 K1 S4 E
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# W& c8 Y3 s- A) J/ z$ F, [3 i      MCBSP_MAJOR=MAJOR(mcbsp_dev);  X5 X  x5 }) J! ?4 ]) c& v4 H2 U! E; Z
   }6 H3 u' d! C5 p
   
4 p+ w7 G7 l* ^5 q' N4 ~3 ^, `   if(ret<0)
* s( Y/ c. [* M9 w4 `   {. `5 `4 G, U" ~" J4 O+ W
      printk(KERN_ERR "register chrdev fail!");  F0 T9 P/ k7 A# Z2 m
      return -1;
% y' p; y* L; Z( C0 Y' s& g   }  d2 T; R1 f/ V' R4 @/ @' q) S
     U; Q& M# l  w' D
   mcbsp_cdev=cdev_alloc();
0 D/ X) ?, M2 U9 c: ]2 a' j   
  B) K% k' L8 T" _1 E0 _   if(mcbsp_cdev!=NULL)) O% B2 W- W  h, S
   {
7 l; ]* Q! [7 c7 z" `- s- H      cdev_init(mcbsp_cdev,&mcbsp_fops);
( g% B  H5 `! n7 u2 B      mcbsp_cdev->ops=&mcbsp_fops;" V7 N; }6 y# U% x: B
      mcbsp_cdev->owner=THIS_MODULE;
8 R6 P6 j* k% [/ c1 m& L/ B! i7 D      4 x5 v! g( S4 C6 ]( i) V4 i) I  i6 g
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ a1 i" T, R/ T' ~
          printk(KERN_ERR "register cdev fail!");* s4 E7 n! |: d3 |
      else
4 }$ s+ E! i4 N' k* x# C) ~& v          printk(KERN_ERR "register success!\n");
* ]8 I  Y; L" t   }
: I2 q2 p5 B5 P/ Q   else  O& T0 d  U  p8 W, T
   {
6 i+ @' {1 d9 E6 O, ]3 T2 F      printk(KERN_ERR "register cdev err!");+ V8 h6 V9 Y3 |) @$ u5 [9 y
      return -1;
& M# H/ l  I2 [+ P   }% G2 `' W' @: e) i1 q: z9 X' J7 }
   : A* R- v+ A. f; {! }8 m4 G. |
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" ~$ ~% b3 m- }" X: Z
   if(IS_ERR(mcbsp_class))3 c4 |" u* e) C
   {
2 V$ I! h- q# T5 }; G8 B/ n* q. g! m      printk(KERN_ERR "register class err!");9 n" c4 V6 ?% W9 S
   return -1;
5 a: N% O1 C/ a1 D   }
+ m; w/ L' I0 L   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, u( R/ ]4 \; l3 x, F
# n2 F, A5 \8 S' V' k   //PSC
& p  E. t+ a3 Y   //add Enable MCBSP
9 K3 z0 P6 ^6 |& g9 e2 p6 a   //test4 H/ V9 |. v1 V7 G
   temp = 0x80000003;
1 N9 J. v/ [0 M! M" r' f  q6 h   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 p" t5 B9 l' G& B! `& Z, k. G   temp = 0x00000003;& ]* F* ^) f8 N0 T  T
   writel(temp, IO_ADDRESS(PTCMD_ADDR));' l0 \( r# |' X5 J3 t

& i1 H; s8 C4 S( U5 ^: V4 B   temp = 0x001FF201;
$ t0 ~- T( e, W7 y3 }   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 Y  `, b, y4 U4 ~4 I$ N! ^* J# r   
7 M- i( N6 ~" D   //PINMUX  
1 H, r6 v, d: l$ [   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) W1 H7 J1 o" e4 ]2 |& z
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; g3 N; h* {5 Q; p* O4 Y3 Z   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! m" A; @( ?; ]- i
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( B9 D: `! T* p0 B' Y- s& A/ s
   2 S) y, G, f3 t  q1 u  x8 g
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) ?' |( U8 ?) _. f& d" f   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
0 W) E0 g3 |% ]$ T7 B   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; M  W/ X4 S" {/ j% K/ |
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# x  d: q0 i# f' V6 N+ J8 o & r- t' O$ f) E' x3 |  Z+ d
   //RESETn,L138_SHK2" f7 }" X4 x3 x/ o
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; |+ n/ |: z* l+ t' n+ Q
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
. ~, L5 x3 h# p' A, W: \   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; @. w; p# X5 l
/ [# X6 G$ {$ V; u* _4 _6 S  B0 x  ]

8 R2 p+ r0 |' ~7 c  //SPCR Register
& ^" y1 f( [% r0 O  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" T, Q. T2 D' v8 a; H- \  temp = 0x03000000;//(DLB=0)% D1 n! d  c# k5 N2 @
// temp = 0x03008000;//(DLB=1)) Q5 U. Q' u; r$ F+ u& F& E
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset' d3 j* x5 y5 P8 l2 s$ c" p
  temp = readl(IO_ADDRESS(SPCR_ADDR));& g  `! E) A  s8 p) e" k; J5 f
  printk("temp=%x\n",temp);
( n. O7 r: o% Z5 ^4 q
# t& x8 [7 T2 T   //PCR Register
$ V5 j6 h$ n. C) s" G   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-01 e9 Y: L' c0 ^" m, ]+ I
  // temp = 0x00000F0F;* q8 K& b2 @' K- v& F# V
  temp = 0x00000B0F;. L* j( P  q. v4 i
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
& T: L' z/ q# q. _$ }1 _# n' N  temp = readl(IO_ADDRESS(PCR_ADDR));
6 h% i/ e8 A) M: |  printk("temp=%x\n",temp);  
- i: _5 O# b% g" e   //SRGR Register7 V% O! K/ g3 g! Z# x# p
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ Y: n/ ]0 D4 V7 U9 ^1 D4 r
//temp = 0x301F000B;
( M  [' ?" h$ b2 H, a  A   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' C4 ~* E; F6 e1 f4 m
  temp = readl(IO_ADDRESS(SRGR_ADDR));' H3 \4 M; u. C4 n
  printk("temp=%x\n",temp);
% |  I% J7 D* v+ }3 _# ~   //RCR, j/ k. o/ J, D1 A" w& ~; S# Q) C
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 F4 i9 w, f: {) w2 X0 b9 R
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
8 W1 @$ o2 r1 [8 p3 z3 Y   temp = 0x00440040;6 \& L+ a0 n( e) `
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
( \- J: ^' p' z+ r   temp = readl(IO_ADDRESS(RCR_ADDR));
! d* v  H+ O6 L" I, L4 `" K8 g   printk("temp=%x\n",temp);) r* _( o/ ^6 K+ ^* v
   //XCR! P! o- z1 g4 u
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( z8 E- C: l1 |
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  e* @+ X- W2 Q, u9 k: H9 O; Y   temp = 0x00440040;8 y; H, d0 l% K; [: N) X; m' V
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; \5 ~  l) j" z8 T4 Z7 L1 G
   temp = readl(IO_ADDRESS(XCR_ADDR));
) p. ?! Q3 P7 Y$ R$ @: `) B   printk("temp=%x\n",temp);
$ t# c& P8 U6 v- E1 e  }  udelay(100);
2 P) T1 ~8 T7 d: i! `  //SPCR Register
3 {' \# }3 l2 \9 u( d  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- O" \* o, E. X- g8 J# [/ k  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  [9 K: Y4 v' D/ s- x& P
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled$ e& ~; l/ ~) ~8 r
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 x2 a' S! O$ q" k; s% U, x; l
  printk("temp=%x\n",temp);
5 b2 X$ w1 Y# L, U; `* i% @  udelay(100);
" T. u7 Q$ U7 V- }
- H6 y1 f8 Q) P  //set GPIO direction
0 R3 X5 j4 s% A; x   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& Q$ b+ P- M& {+ v3 y/ ^+ ~6 i   temp = temp | 0x00000100;//EPR----input
: q' c2 [7 w# q( b# r- P9 w   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 @& r* s0 L& _2 {, b" Z& {) @  U   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 M0 p  N5 b4 r1 t) T 0 n8 @7 `7 j$ X1 s! p  e! Y
   return 0;7 w! b" T0 M3 X3 E1 w
}, g$ a$ ^' W+ _3 J% ?2 S# h, X
static void __exit MCBSP_exit(void)
8 Q, q, t: y) m4 q6 `, I{
5 m9 @5 C' f; t# T5 X. D" F( ~   printk("mcbsp chrdev exit!\n");
& X3 C6 F; n( p) P/ D) j7 u   cdev_del(mcbsp_cdev);
$ E8 v1 E1 `9 A6 @* H5 y  s0 o   unregister_chrdev_region(mcbsp_dev,count);; J) E' K2 ?' |# F3 a
   device_destroy(mcbsp_class,mcbsp_dev);
# S1 Z, Y' g+ ?( X! c! |$ L$ k' R# j- V   class_destroy(mcbsp_class);$ l. G) U* W" H% A4 x3 B' ^! ?" Z
}
7 D8 v! J" ~9 Q- `1 @) K, [7 vmodule_init(MCBSP_init);
+ @# i: J' a/ n6 V0 rmodule_exit(MCBSP_exit);
5 B/ k  C( [" ]2 J/ j
7 I6 \  d* t. K7 P% B0 cMODULE_LICENSE("GPL");
/ m3 ~- o2 h& ?0 I& l6 y4 l
3 k, J; `% n% l* D% E9 t我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& i2 C. C) y* I* Z
我的应用层的测试程序如下' }9 l3 p4 S0 V% J8 L/ L; A
#include <stdio.h>
" \2 x3 ]/ C+ H8 m1 E#include <string.h>
  Y* Y* r9 J& S$ q9 m: `, u: ?#include <fcntl.h>
- y4 Z1 O! f5 \; Q#include <unistd.h>
0 l( g% N1 @; I2 Z  u8 g' n#include <signal.h>
' g2 b. o) F  ]- m# T) m#include <pthread.h>       //线程4 `& j3 R+ E) ?. K' G8 N9 ?! `
#include <stdlib.h>5 @& z0 B% m7 v3 b% e- H, T9 V
#include <pcap.h>          //捕获网口数据
; ~' M% f) o6 \; z  z$ {#include <semaphore.h>     //信号0 K# U. i$ x3 h* H
#include <sys/types.h>     //消息对列
: j5 {& z' w) r% `#include <sys/ipc.h>       //消息队列: X% _% b7 ?, g; x
#include <sys/msg.h>       //消息队列/ a' L1 i8 ?3 ^- Y% }3 ~# |& u
#include <sys/select.h>
6 W* {$ C9 ^* i" g#include <sys/syscall.h>
+ Y* F- f+ f( Q0 E4 ~( m) N#include <sys/stat.h>
% b& ~: o2 o# p0 B% S- X2 k#include <sys/mman.h>
1 `* G& U, z1 U7 D1 n#define msleep(x) usleep(1000*x)6 e+ w0 E+ X/ ^! L0 f
) z1 ?+ |. S3 |8 v1 D% N' R
int main()8 G8 U8 l! ^6 D6 Z
{
+ @: r# q/ y; \6 i: n    //MCBSP,ARM与AMBE2000交互设备
3 M* s  X, a$ L' @! e- O! v int fd;% w; r3 D" @5 D( z# |. }! C1 f: x# a
unsigned short data_write = 0x5555;- w4 Y+ H$ M" L' O4 s& {
unsigned short data_read = 0x00;
# k) G/ P6 A4 j, k; ?% D  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
- l$ I0 f+ g4 _ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; u$ ^# }2 F& g# u   
: D1 s% ~6 n# }  C! _1 q+ r  if(fd < 0)9 w4 R) Z+ f) ]  F0 h
  {
$ L: E, q: f; b% G9 h' I: c7 ~     perror("open failed\n");
/ h; ^+ B. @" F; H- x# j     return -1;
$ c5 b; G( ?2 ^" h) B7 n  }
8 l) a4 G/ _3 i, a  
) P+ {" ^+ C* \4 ^8 z  while(1)
$ a7 r8 S2 K: |8 [3 r  {% r, y5 _4 \4 r3 s6 k% l8 V( H
   
1 @% o$ I  P6 {7 }% i, ~# j   //AMBE2000每次读写是24个字为一帧/ S& v/ B; u) c, u- `- k; }
   //写数据时将数据在底层存储起来,等到中断的时候再发送
; |6 V1 z2 {$ v& \, k6 `7 Q   //AMBE2000输入数据是以0x13EC开头的: Z5 b7 G% U) m5 {9 n! l  p
   write(fd,&data_write,sizeof(unsigned short));
/ L9 v& N# \. `, M% I# R) @8 N* C   + {( \- W) f+ I8 W8 M
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  $ I0 O% o3 p6 q7 e* t
   read(fd,&data_read,sizeof(unsigned short));
! h8 h6 Y" T0 J7 T/ E* V0 @     e( }- v9 q; s! J, U7 |  O" }
   if(data_read == 0x13Ec)
+ v4 [& z! S1 t6 o2 ~   {( f) F% {0 M4 ]! G+ t
   
* e" a/ q* o7 Z9 ~; _    printf("data_read = %x\n",data_read);9 X+ {  }" _+ _& p5 A9 F! Q
   }4 ?$ ?2 M2 |. C+ K
     u2 ^+ k0 B+ K4 Z% \
   msleep(10);
+ U3 B# N; l+ c& E# H! v# G  3 |2 Y0 t( u6 i, e2 U' ]+ T
  /*, n$ d* }4 n: S, ?6 I2 }
   ioctl(fd,1);   " E3 b/ _4 g, [
sleep(1);: r3 [9 L# L0 d7 M1 r4 S1 A; a, v
ioctl(fd,0);# d+ h4 H/ ~! q& a" r
sleep(1);! u5 q; v2 ]; x% c  F) f8 O+ `4 j
*/ 6 F7 \$ Z# L& n
  }   
# F* M7 @) R3 b0 X4 @& @ return 0;
* l9 J; N& z, ]* Z9 E# j, q% m 7 [" S$ ^; {8 a
}
/ o; n& [9 p' R* ]/ b* Y
8 Q. _  H; q# \7 U2 v! o多谢各位指教,谢谢! 急+ g' k6 q; e  A
& P' ~! p& x1 E
! p# K7 T* c. d6 g7 q
, O& T( [! j8 Q! V6 c6 t

% v' p4 K% m( S7 T% W
9 l& a# A" B( S# r; J' t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-2 17:48 , Processed in 0.047491 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表