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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 7 i; e; j- }7 D0 F  Z& H( D! n/ E
/*
8 w. x# p$ I# K, o5 y, E * Copyright (C) 2009 Texas Instruments Inc
. z0 b0 T3 T0 M, g. q *  \) ?- W; a( C' J
* This program is free software; you can redistribute it and/or modify( Z% T8 i/ z4 @2 C/ I6 r  E
* it under the terms of the GNU General Public License as published by
) J+ G  L0 j. N9 _6 V) u * the Free Software Foundation; either version 2 of the License, or. V& T/ Z6 e1 K& f9 X
* (at your option)any later version.
, x* {2 n- \# k5 p *, |. @" e+ Z. ^% J, @
* This program is distributed in the hope that it will be useful,0 x% _% `4 h7 }: s" D2 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
& o8 Q/ f' K  d6 u3 d6 l0 h# ~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 }6 d3 K, W. }# r * GNU General Public License for more details.* ?# G" s" J6 Z  w: O
*
2 D$ h% l* A. p * You should have received a copy of the GNU General Public License7 ?6 j* O+ m- U" ^9 o5 f9 K
* along with this program; if not, write to the Free Software
& b9 X9 ]! X: i3 U- E! y" l * Foundati
$ C2 s/ o* z' @- ], C- D*/
9 ]. }6 u- ~/ ]( m. X#include <linux/module.h>4 Y" `% z# ~/ K3 O+ k
#include <linux/init.h>
2 X% ~* a( ~  [/ T4 Q9 R1 M#include <linux/errno.h>8 y# D5 {0 V. U) g
#include <linux/types.h>
  X$ B4 E" {" |1 ]#include <linux/interrupt.h>4 f6 |" |! E& B1 ?* o1 h8 U
#include <linux/io.h>+ ?+ X( E  Z' G! n1 K5 Z: `
#include <linux/sysctl.h>( t! O- M) |) y: N
#include <linux/mm.h>$ L/ E" }  C$ m9 N) m; R
#include <linux/delay.h>: P4 l) r7 L$ }% ?
#include<linux/kernel.h>; S/ G: h5 A- W
#include<linux/fs.h>5 A$ {0 P  w! M. M) X3 E
#include<linux/ioctl.h>
' o3 O. z$ Y1 p! K7 b& e3 H#include<linux/cdev.h>2 d- v: P" D; t7 H
#include<linux/kdev_t.h>
; B0 ^4 `) b0 e6 o' i5 ~% A( @#include<linux/gpio.h>' j3 {" F$ |) |' I% O/ \
#include <mach/hardware.h>5 C- b) g, c6 p  W& r
#include <mach/irqs.h>8 d" D% {, ^2 Q8 n

  p# C6 t- x8 V! M% l( X#include <asm/mach-types.h># h5 a! ~6 D: g+ ?; s
#include <asm/mach/arch.h>3 u( a- K. Y/ X) n: V! M4 e( ^
#include <mach/da8xx.h>$ \$ [: {6 ~8 S- I9 R0 d* D
#define  SYSCFG_BASE   0x01c14000% ^. N2 B- ^* W. r% [
#define  PINMUX1_OFFSET   0x124
/ n) ~5 m+ o! z$ v: a- m#define  PINMUX18_OFFSET  0x168
0 X7 X! a. x4 [! F! s( K#define  PINMUX19_OFFSET  0x16c
) C, ]2 s5 O3 s8 {9 d#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR$ a0 y: n: @; a3 C
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. ^5 b6 a; N! C- e1 c2 e) R+ h
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR3 Y% E+ d' m& m  r" P" {
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" m5 J4 X, L1 s# d$ G% _
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR2 e0 h  L2 E/ T& ?' @# \% G
                           
- i) I+ A6 ?: w" w#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
% e; ^/ t4 D2 _% p& _4 [#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
+ C% p& b: k4 d- N0 F. r/ c//PSC
8 B6 _# i. i: b" |; p#define  PTCMD_ADDR   0x01E27120  5 X& y/ Q8 k) H- f
#define  MDCTL15_ADDR 0x01E27A3C1 o6 t5 y, q1 V4 y6 A  ?
#define  PDCTL1_ADDR  0x01E273040 E0 {# _$ I1 z; x
//GPIO8 direction0 m4 E" |; P' n/ @, ~: E
#define GPIO8_DIRECT  0x01E260B0  E2 z5 y% O# g+ q! }
#define GPIO8_OUT     0x01E260B4, |( p* X3 ^7 O4 y) r0 x. Q. H
#define GPIO8_IN     0x01E260C0
3 x! G! N6 }& |. ?6 h$ z$ b
" e- Y2 H5 L! A' n1 x9 x" |//#define MCBSP1_RINT    99              # @$ r" g% R, b( D
//#define MCBSP1_XINT    100  ; b0 K/ [2 h3 |
static int MCBSP_MAJOR=239;7 \$ C3 K; X( L1 k
static int MCBSP_MINOR=0;2 _0 U; b- M/ l" f+ b6 @
static int count =1;
1 }( b' u& k7 v" ?; F0 Z( E& b. {( R+ W6 d( a2 u* N
#define MCBSP_NAME  "MCBSP-device"
  q* _, o- c% d* n& }  D
- W) [# o; X5 b* t& ^static struct cdev *mcbsp_cdev;1 [- C' n3 I2 H- Q
static struct class *mcbsp_class;( ]7 m3 _! J1 C$ t" c. @
static dev_t mcbsp_dev;5 _, f4 M# J4 L& y% s$ X% ?
unsigned int DRR_data;6 Y. Z' t1 Y' x) R  n
unsigned int DXR_data;
( _5 C, Y; a" E8 |/ D; e! b/ v( Istatic int mcbsp_open(struct inode *inode,struct file *file). E" h, [5 s5 }0 ?
{
5 W( Y# ?0 @' A" y; W5 x$ X3 T! |: Y   
' Y$ K2 j5 Y9 p. c9 R* F   //interrupt enable,initialized
; X8 L& |- S" {% y8 G$ m   unsigned int temp;( K  M* q. Q/ W) \
   //SLEEP_EN(GPIO8[10])---0
+ j  r) _+ R& ~$ J. D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. h  t6 A3 A0 ], L5 B- H/ P   temp=temp&(~0x00000400);
3 ^: q! H# {1 _( U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]+ i- @- }1 A9 J
  //RESETn(GPIO8[8])----0----1" K# @! `7 R; E2 B% ?$ M
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, i' N' P/ J! s   temp=temp&(~0x00000100);/ Y6 M: Z# w; P, t3 o" E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& ?0 z# l# R/ Q' b( ?
   udelay(100);
0 b4 j9 D- ^0 t9 S   temp=temp| 0x00000100;9 {1 Y" n5 e" O( p0 i* f9 S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. g/ M5 y( K) \% F   udelay(100);
/ r: v8 o$ A' B8 B* i5 {; d   printk("open success!\n");) ~! t4 A+ {. n7 H* o% j
   return 0;
7 B8 p: z/ b% v) r: R% p9 r) U! {}% {+ z6 x7 f( n; ]6 i7 }. F

) _2 }, w2 p6 q9 astatic int mcbsp_release(struct inode *inode,struct file *file)$ Z9 X1 g- N; t* z( E, ?+ S- r/ _
{6 ?2 W' }* U) u5 L* M3 P
   printk("release success!\n");- v$ n8 t& J! {  g1 m( y
   return 0;" n4 K& v; |! {( p4 Z8 O7 Z) K
}4 t% i; k3 }+ r, s# R' M$ Z

7 w! y& I! I3 `* X8 @% e6 Xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 ]) I8 u( d4 h: T3 A{5 ^( b9 I7 l0 {- u5 l
    copy_from_user(&DXR_data,buf,len);
9 d7 g/ G+ ^" x6 E0 {( P    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       4 P9 v4 m+ t; \2 F2 v0 U) Y2 _
    return 0;
+ K( f8 |+ C8 r2 M& A
8 C- U( Q+ q( O}
3 j9 X% }5 n# L+ Q: s; S) s6 ?" C
3 R. s7 w9 G8 Q  B" s7 k* Nstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 l, F/ l; z0 S( V# Z# Y2 C8 {, y{
; y! B: G' _  _; o! A   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));7 K5 G  X# B. K1 k7 g0 X7 g
   copy_to_user(buf,&DRR_data,len); * Z0 y! X& o3 c; k& |; w
   return 0;" B2 ]: T5 Z. o2 |7 @( u8 u7 y% \
}
. m6 O8 ?& W' Y8 U: @0 u9 r
' z# S3 Q- i7 U0 s0 e, A/ W) T7 K  Q
& `# ~1 t& {, l! |! s: c$ B4 Sstatic struct  file_operations mcbsp_fops=
5 o1 j3 K: w, [{# D5 P" e5 a' o& w6 ?% A2 E  Q
   .owner=THIS_MODULE,
4 ~8 P. s8 T* [. R% A  i& V   .open=mcbsp_open,; ^% B8 B$ W7 Y7 u4 @% b. S& G
   .release=mcbsp_release,! D! o3 Y* y$ G2 }" o+ r0 k' @0 {
   .write=mcbsp_write,
* \. N1 I5 p9 ^9 _# G   .read=mcbsp_read,9 s: j6 A6 _* m# o3 P! Y; B
};/ W- }7 ?/ Q2 S, q- n( y
static int __init MCBSP_init(void)7 ]+ {; U1 e/ S, i$ T& a, s/ Y$ C
{
3 f8 X6 B% _3 ]/ o   int ret;
) F6 w' }" x7 a$ `5 e+ z   unsigned  int   PINMUX1_REG_old;
6 E4 b) R! L9 C3 T3 e   unsigned  int   PINMUX18_REG_old;. O0 w2 ~" u5 M" }. R  v
   unsigned  int   PINMUX19_REG_old;) W0 F4 D$ S7 [0 T) ~& s$ o
   unsigned  int   temp;  
" U" f5 v) W( G5 |   if(MCBSP_MAJOR)
2 v- `' C8 |1 k; b# d' a   {
& x# y; ]1 \. A; N5 }: r7 z      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 w( A7 M, \% {      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% E$ ~8 m0 i( S8 X
   }1 p- Q. a6 k, z" {8 f. ?
   else
/ D6 w& l. Q. i; C  C9 r& }' t   {
- Y! O  q; O( E$ f. z1 _      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 `% a$ `  z: F4 o# I4 w4 `
      MCBSP_MAJOR=MAJOR(mcbsp_dev);3 o0 Y1 O# E4 v7 w- n
   }! x7 N; t0 c- @( [
   " u$ |8 {* u" l+ J- f: Y
   if(ret<0)+ |, W  ]! I% t
   {
' @( L  T: P5 q      printk(KERN_ERR "register chrdev fail!");" q4 Y8 s5 L+ Y5 L8 ]7 D! Z
      return -1;! J5 Y) Q+ B3 w" |3 |
   }
) T4 O: I4 A8 g9 t3 F5 w' K   
  A( h! v8 M) O: j! n" P+ H   mcbsp_cdev=cdev_alloc();" u" s+ w( K5 j4 K0 m& `8 l
   : W( N2 l! P8 Y
   if(mcbsp_cdev!=NULL)/ L) O+ d3 V- C. M
   {( H0 Q* i8 h7 o2 G
      cdev_init(mcbsp_cdev,&mcbsp_fops);( @. S' |1 p# n5 v; _8 s
      mcbsp_cdev->ops=&mcbsp_fops;# Q4 S9 e7 r4 e+ Q
      mcbsp_cdev->owner=THIS_MODULE;
. s. l4 H+ S& L6 X' Q      
/ q$ _3 x; j6 O, h( d8 m4 _      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
. `) t4 _: D8 P; J, m: z          printk(KERN_ERR "register cdev fail!");0 R) D) p1 j5 h) h
      else: ~. E" V+ V5 O+ P3 y+ J, u4 p
          printk(KERN_ERR "register success!\n");
: K. C6 H% s) n   }
2 M! h% Q/ p/ ^3 q; T* P+ M' u  ]& Q   else' c1 z2 S7 Q& N1 h$ V0 h! ?6 ~$ J
   {
6 J, r0 p3 ?" X0 }" j      printk(KERN_ERR "register cdev err!");
. I8 d& w- m0 L# u9 a  O( [      return -1;
- W& Q# A: F+ ~4 G8 U   }  ~* f! R( k0 [% H0 u" @- x% m
   2 p( w" g/ r3 [# s
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: i" r. h& u* h3 q   if(IS_ERR(mcbsp_class))& v* M3 @1 R) b3 a  a
   {6 E# |9 P; z, S  e1 E
      printk(KERN_ERR "register class err!");0 t& U- u2 N3 h  ^& @& @4 q
   return -1;
; j# \8 a" n' b$ }, F   }( V, ~7 f7 [- s
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 \7 }, H  s  U7 X; y4 A; G- _
5 s) w& n8 P) X" ^% h
   //PSC. I& K8 ~+ d( P) P3 ?1 A- d
   //add Enable MCBSP+ H+ i# w9 E. m0 |% o( I
   //test
5 ^8 e# I3 M) j6 V   temp = 0x80000003;
7 \/ R! M  g4 ]! G+ k   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ K3 I7 [2 d0 u" G. R$ o! n
   temp = 0x00000003;
, }+ ^. h7 A; W8 f- Q   writel(temp, IO_ADDRESS(PTCMD_ADDR));. _# [# X$ ^1 p2 V( M0 V! E

) N. T% L- e( U+ {  _* |   temp = 0x001FF201;
+ D/ f" O$ j+ M1 O9 J   writel(temp, IO_ADDRESS(PDCTL1_ADDR));2 X. a9 P0 R6 ^  @) }
   ( n# P3 h, T7 g) X
   //PINMUX  
) {0 d; r+ L- S: u' A   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, Z' q, S. F, M: S) O   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * K* b* q' A, l+ |8 w
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;     \9 C' a1 r/ d2 l3 R% ?* c! J& D% S
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 v/ X; H/ \* n# \2 k$ N   
1 g5 p, s3 \2 V5 [   //SLEEP_EN,EPR,L138_SHK1,L138_RC3 ^$ [7 c6 y5 T  e) a: s$ i
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
3 v; ^7 I  r, ~0 _7 _9 \6 g2 f   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
/ }2 h4 r; m( T% m& A5 X" a   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: J3 b3 w3 W$ N3 {

4 Z% g3 @0 [# _% c) N   //RESETn,L138_SHK20 h. z2 f: ?! ]  h
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
  {2 `, ?4 o1 _0 q( T# b- K   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
, W* f' H1 g9 W6 M* [0 j9 e   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- d8 G; h% O8 W7 V. Z" m' s
% h( U7 t2 o. q7 Z1 {0 k4 w+ P3 z) _ & S4 k3 F) D- @1 P5 t* |
  //SPCR Register. r& `4 t$ z1 A& `5 H" R+ h4 S; E
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- B7 Z) U/ N5 l$ C" n
  temp = 0x03000000;//(DLB=0)  M* F& J2 f% m% N! D
// temp = 0x03008000;//(DLB=1)- v2 B, _. j, v1 i; S3 V) w
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% K; d7 ?  b: @1 Z- L+ J/ G' g! ~  temp = readl(IO_ADDRESS(SPCR_ADDR));8 ]6 N8 y8 Q: ~. a# e
  printk("temp=%x\n",temp);
' Z. P% f# c$ `* B) P0 v
0 f+ m3 T5 Y, E9 H   //PCR Register
' _$ ?% m( c4 c) a, S   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 X- C/ V. B3 T, x! n! Z  // temp = 0x00000F0F;
  e7 e" k7 v5 a9 v" o9 c- C6 x  temp = 0x00000B0F;
( Z1 i7 }2 Q+ x8 c# F  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
3 p" X' K) Z' a5 d) Y8 ^  temp = readl(IO_ADDRESS(PCR_ADDR));7 B  E3 `  m$ n9 O
  printk("temp=%x\n",temp);  
& q& m/ p1 Q0 k5 [; P5 ]   //SRGR Register
4 T  y$ U# C/ S1 @, D5 ]7 w& a/ |! K   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 R8 }$ n2 o7 A* Z //temp = 0x301F000B;3 D8 C& l1 t9 E- V6 q* b& Y+ r
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 J3 d' Y( \- K+ y; V9 u! ?: \  temp = readl(IO_ADDRESS(SRGR_ADDR));4 |( W2 c2 h9 d3 @. q$ L
  printk("temp=%x\n",temp);
! P+ u  Q2 L. f) y, d   //RCR
; \$ H) D  H9 u& ]" }   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 |( i* W; f; j- U) G6 R2 H   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. k) O0 z4 Q+ }1 @+ D
   temp = 0x00440040;
7 J9 H7 D7 ~6 w# I   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
1 J7 W0 |( u8 {% w5 S0 y   temp = readl(IO_ADDRESS(RCR_ADDR));  W' x! a9 Y% F3 V7 |+ o8 m. @
   printk("temp=%x\n",temp);" N2 s" R7 z2 Z( E# Q2 S0 g
   //XCR
& g+ m3 q& D. i7 S   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  g$ L+ |8 K& p% M+ M3 S. F   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" _0 ^4 w. V' w; c2 z, e   temp = 0x00440040;
* R5 {3 K. ~$ x5 n0 J1 ~   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
' D. O, q$ Q/ M/ p5 K   temp = readl(IO_ADDRESS(XCR_ADDR));) P0 Z9 o7 b6 ]% ]5 N) g
   printk("temp=%x\n",temp);, a0 W9 H9 l: N$ x# `
  udelay(100);9 p' F5 g+ d2 X) O0 P
  //SPCR Register
2 D! [2 ^# v6 {7 j0 x, _' }  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1% x; B9 Q) W9 T2 u
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1! e* q8 i  l% C
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled5 s' h4 R  A" ?8 i/ e
  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 j/ S: x' }  c1 Q  \: q  printk("temp=%x\n",temp);
3 Y$ _$ I$ E& M  udelay(100);1 H& t/ \9 P2 R& u" H
0 Y) _; ^* R9 F4 d
  //set GPIO direction
$ F: b8 V; g" M- W' |   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 H, t5 r6 j+ e: F+ Z
   temp = temp | 0x00000100;//EPR----input5 s8 q/ Z! I8 F# u4 `
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! ~" z- m+ N  v( ?$ X4 P0 v   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ X+ u# E0 M7 C, d* ? - a7 K8 J) ?! L/ }  t! a
   return 0;" Z- q4 |$ E1 i' I& f. D
}- n( H: m7 o, [1 S
static void __exit MCBSP_exit(void)
) Z% A. K1 ]0 \( D/ d  I7 o{5 Y) b6 i& J2 x
   printk("mcbsp chrdev exit!\n");5 p5 P1 F  R$ x2 m; h% {
   cdev_del(mcbsp_cdev);) T' {0 U  ^6 X* B6 o3 x! X
   unregister_chrdev_region(mcbsp_dev,count);  z% k6 m9 F0 {, }
   device_destroy(mcbsp_class,mcbsp_dev);
, {$ P8 a9 |5 s   class_destroy(mcbsp_class);
7 n, K0 ]7 X7 U- c; i& {}* c* f  S6 u/ q$ l" }1 F6 \" H
module_init(MCBSP_init);" T) Y$ R, {% P7 g  m/ O$ f
module_exit(MCBSP_exit);: j; T/ x8 k8 A1 K7 _

% N5 f: F9 d4 u- l2 [; UMODULE_LICENSE("GPL");
* f' d' P- R4 @5 J$ }, X( z( V- v" L5 c5 l8 l3 N
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* m+ K4 ?1 Y2 ~5 v: a我的应用层的测试程序如下
* g) L6 j3 {- c: p  r#include <stdio.h>5 O2 ]3 w6 Q8 H$ C4 I( K5 Y
#include <string.h>/ k" d/ q/ B% @- v
#include <fcntl.h>
4 K6 g' z1 |# P. Y#include <unistd.h>
2 L0 C2 s5 l+ _1 P! n, R#include <signal.h>4 H. P0 d, Z4 e& e# K( W1 C# d0 T
#include <pthread.h>       //线程
$ [# X) H" H. \; m7 x#include <stdlib.h>* I* ?& `2 S& V8 z6 Q6 Q* i* `
#include <pcap.h>          //捕获网口数据
/ x/ N+ M! |- B#include <semaphore.h>     //信号
1 H7 |7 Q. w+ @* m# K#include <sys/types.h>     //消息对列9 E+ }7 m0 S# J
#include <sys/ipc.h>       //消息队列
# F$ u  U0 |& x3 |; P#include <sys/msg.h>       //消息队列
, T+ S3 t: U8 V( d2 E+ i( Y#include <sys/select.h>
) ^* _7 m1 e/ k0 V/ G4 s; E#include <sys/syscall.h>
8 k, @0 }; |8 F' ^. Z/ ?+ B#include <sys/stat.h>) j% D+ f# p9 p) i0 L0 \
#include <sys/mman.h>
$ R1 i: J; f6 y, s#define msleep(x) usleep(1000*x)
% W; j5 w6 x8 [+ x  U$ ?' E  ~6 a/ T" |8 p
int main()* N5 C! N; a+ }" J/ \
{   s$ y1 w5 e5 ]1 A
    //MCBSP,ARM与AMBE2000交互设备
" s0 |+ h, |* }3 J) y& x int fd;
- E0 [; n) i- I7 f4 a" A3 j unsigned short data_write = 0x5555;
+ U2 E% q: K8 x9 ~ unsigned short data_read = 0x00;
9 g$ d6 Z% S+ q! `; `7 O& Y  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ j2 G, V* s" O //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; K& b: d. a! r2 A& N' x
   
$ H! F$ O  n. C- _! s/ J  M0 @9 D  if(fd < 0)5 y/ [) w4 }. I
  {
( V! {6 n. T) i7 @     perror("open failed\n");% K+ n* Q; u" C5 o! m- B( k
     return -1;' p# Q" r# d0 y# D1 D
  }
% e0 a: V5 n# n0 Q4 K' o  
& i; W2 ]8 G7 c) E, o, d! j  while(1)
- N% p1 j3 r1 R  @; {' }9 B  {
2 l5 U* I; y" m% T' f' e( }2 X   $ l9 C* I" Q! |7 U2 I
   //AMBE2000每次读写是24个字为一帧0 F/ F& J" O$ p3 L9 j4 ]. Q" Y
   //写数据时将数据在底层存储起来,等到中断的时候再发送
2 C2 g6 ~" F( p+ M   //AMBE2000输入数据是以0x13EC开头的" E1 _" H: r' b
   write(fd,&data_write,sizeof(unsigned short));2 @, ], w( Z, ^) _# x) `4 B0 P/ L
   
; u# `; d- _0 e% B6 N" ?$ }   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- \0 Y4 c6 v! _   read(fd,&data_read,sizeof(unsigned short));
" H7 R* m/ \: ^) Y1 D, v   * [+ y# n2 w5 ~9 Q( _5 m
   if(data_read == 0x13Ec), [$ q4 o  }% f' u( A* H4 s
   {9 w( o: V6 x0 A) f8 J
   
% D* f; f, s$ H4 X    printf("data_read = %x\n",data_read);6 ?1 X0 Y* X* Y- }! i
   }  e( O# Z9 L* m; S+ ~! h. T+ T! @0 l
   
# L0 P% e9 X# ?0 W, Y   msleep(10);
' e  m  w- y6 y  
( D6 s) O1 D' y  /*
2 R% ]1 B8 l. b& S9 }! e  I   ioctl(fd,1);   * V4 g3 i  \/ ^% N% J9 h
sleep(1);6 Z. n1 c6 y( K8 _; }. Q
ioctl(fd,0);9 D0 a' g+ g* Z. p! d3 k# i9 A5 s# h' X
sleep(1);
- E7 l: n% Z/ [: u, [9 v8 f4 c */
; |5 X: f% L* K* ?$ y" e. N& _  }   ( x4 R& L3 v3 N5 @! A
return 0;# L# \1 a! M$ z# u  g1 ~- s8 D
0 X/ ~/ |$ b1 D9 o" ~" P
}. b1 p( B/ L7 y& G5 J% \
/ n4 I5 G8 N0 B
多谢各位指教,谢谢! 急
; |, a" v; Z# O& u# y
' z9 R) z2 M; o
1 Y' w1 ^( y" {# p- {/ J+ o( P0 c" `4 m  E$ T* N  W

2 b7 x4 g4 O3 A! _# `! v  M: W( j- {2 Z- i) I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 05:19 , Processed in 0.046081 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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