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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" a" ?# g& C' ]9 ]# z$ }/*
* \' X: _, M# w3 G7 G0 ]. U& F * Copyright (C) 2009 Texas Instruments Inc
8 o" @4 n# a, P$ a2 ] *+ M6 K1 q2 v; H- e1 |/ F- {
* This program is free software; you can redistribute it and/or modify
3 b5 I( V" z" ^. `! o0 r5 d * it under the terms of the GNU General Public License as published by
; _6 \" \. C1 `8 b  | * the Free Software Foundation; either version 2 of the License, or( D% b3 [* s. y1 A
* (at your option)any later version.
2 o& e9 [) d+ L( @ *
* t' O) a% L0 p  b3 d * This program is distributed in the hope that it will be useful,8 x  T: u: e- }0 C$ _3 V
* but WITHOUT ANY WARRANTY; without even the implied warranty of
: g- J7 E! D5 g8 @2 X- e1 s * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 M& h( B: J6 O/ Q7 l( s4 D0 m' y * GNU General Public License for more details.2 a* J* a. P+ t$ i1 Q$ @$ T
*! K, |, }! L0 d6 C, |( w( o. _
* You should have received a copy of the GNU General Public License$ D8 L  x6 {# [6 p" @
* along with this program; if not, write to the Free Software
$ P" I4 D( K3 e+ S* e( {8 F * Foundati
. Y, H' ?& _8 Z# M*/
9 \* O1 V" C6 ]+ k#include <linux/module.h>
+ A0 o. o; F# q1 K9 d$ L, N#include <linux/init.h>
( q+ |5 O# W( |# R8 P#include <linux/errno.h>
8 ^/ {7 v' }- @, F) S, E( M#include <linux/types.h>, Q, M! Q' b) ]; g! F
#include <linux/interrupt.h>- K2 }7 Z& _$ Y  Y  e, ~
#include <linux/io.h>& N( e1 p, V& _3 I; h7 L4 s
#include <linux/sysctl.h>
; u7 h/ ~/ R; S! m0 [1 |: Z$ @: h#include <linux/mm.h>
9 \% O. z, N! D#include <linux/delay.h>
! q# L* n$ C9 W2 u$ ^. t#include<linux/kernel.h>
) U5 Z- I, W3 I# I6 a0 ~#include<linux/fs.h>
7 h8 X5 C6 _9 Y& [#include<linux/ioctl.h>* \1 m; V- q4 g! C
#include<linux/cdev.h>
, Q! \5 ~/ u% F( H3 V! Y#include<linux/kdev_t.h>
8 p$ S+ c1 P" G. X9 M, S. Z#include<linux/gpio.h>
9 I. h& Y- C7 A( R#include <mach/hardware.h>0 |5 Y+ {4 a$ Y- q8 P0 s
#include <mach/irqs.h>7 s# r3 f/ g! V* R6 V( ]( X
7 ~4 w  l3 w& K8 ~
#include <asm/mach-types.h>( X  x1 g' L- A5 T2 z1 F$ y7 }2 J
#include <asm/mach/arch.h>
9 g0 o' C. i1 F. T* S#include <mach/da8xx.h>
* H7 _9 r+ x* S6 D#define  SYSCFG_BASE   0x01c14000$ Q; ^* A9 P) a
#define  PINMUX1_OFFSET   0x124
( Q4 b0 o. |. ?7 M#define  PINMUX18_OFFSET  0x168
2 n+ p- g2 _: c- d9 @! I4 \( @9 h8 o#define  PINMUX19_OFFSET  0x16c
: @* |; K( D  a0 E7 a#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR( ~, f2 e7 u, h8 C" P% a' K% b7 ]+ ]
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
4 y% L7 C3 a  |& U- G#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR4 G" ~, P/ W; k' B
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR) L% d- v2 K5 Y" n! K! d; @6 U7 H+ A
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR0 _3 @% I2 o8 n1 h. T
                           
0 u. b) U$ `0 R, c/ r7 l+ m: }#define DXR_ADDR      0x01D11004  //MCBSP1_DXR# a. Z6 k, s/ q  P
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
/ W5 t/ k( ?4 l6 A; I//PSC
& Q6 a/ n: q" v; U' F* [; a* {" Y#define  PTCMD_ADDR   0x01E27120  - p! A6 |$ [8 y+ Y! t
#define  MDCTL15_ADDR 0x01E27A3C8 C6 C- F6 E0 |. k/ q8 {& J
#define  PDCTL1_ADDR  0x01E273046 D' N9 \- A( T& v( C6 [9 Q/ T
//GPIO8 direction5 y: X. ^8 _, b, m: s9 _
#define GPIO8_DIRECT  0x01E260B0
+ ^. a9 F" E: G) Q4 y& C* U8 }#define GPIO8_OUT     0x01E260B4% I& O7 G9 @/ t  N* ?3 f- N1 e
#define GPIO8_IN     0x01E260C0
$ k0 _, a& Y8 [7 e
0 T. x/ d4 ?" @1 b8 \/ ^8 d//#define MCBSP1_RINT    99              
' r" @/ h; X6 k5 Z2 p, m% I//#define MCBSP1_XINT    100  : C$ O6 I8 T9 `; D8 c) Q6 P
static int MCBSP_MAJOR=239;
* c2 B$ T2 K) {2 {8 Sstatic int MCBSP_MINOR=0;! N5 n$ e, F: T& }+ ~- i: n3 z
static int count =1;
: Y! p2 o: y5 o' W6 B) M# ~$ {* S
7 b1 l- b2 g7 P& v, G$ e+ K#define MCBSP_NAME  "MCBSP-device"3 F9 ^8 u4 r6 Q' ^* E
( b0 G. n% |2 T& E% X
static struct cdev *mcbsp_cdev;
$ G7 @. j7 B; z6 vstatic struct class *mcbsp_class;' O% ~& g& p3 q% J
static dev_t mcbsp_dev;, D4 Y4 A' ~8 b3 g
unsigned int DRR_data;' H7 p) v4 x, f" G
unsigned int DXR_data;
, Z9 f" {! v2 M6 i5 A( D! M" u& Zstatic int mcbsp_open(struct inode *inode,struct file *file)* ]. Z! |* f: D. W
{
5 ]1 v2 W' s' b* H, A  [: e; m' K* M   
% w' i! H$ [2 o, o; C   //interrupt enable,initialized3 p) q( K8 d  m" u
   unsigned int temp;9 D1 f$ H3 R( U' c
   //SLEEP_EN(GPIO8[10])---0
5 a  b$ Q5 e( g, v4 O4 q4 _; v% e   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* N: \- f9 }/ d; i1 z   temp=temp&(~0x00000400);
9 W  l1 [9 p2 p* P0 `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ s0 v8 I9 u' s  v5 T0 D
  //RESETn(GPIO8[8])----0----1
9 M: n, E+ v% {. U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 L' M: O$ X  [# i8 _( x3 @
   temp=temp&(~0x00000100);# ?0 Y% k6 {& c, }9 J' Q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! j2 K9 p! n3 \5 P6 E: f$ c
   udelay(100);! |( G) p; Q( B0 g, z
   temp=temp| 0x00000100;
: N2 F' @* L) l$ d4 h/ C' V! s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---10 Q( e0 e3 z2 ^
   udelay(100);1 T) C0 L, `! a. `  I
   printk("open success!\n");
  I- g0 _- k# K" Y( E8 V% U   return 0;
4 ]0 x+ i9 @. y- Y" Y* B}
. j  q6 ]7 E$ k* o7 [4 I3 K  Q8 F/ _' X, {0 [% g! C0 h3 f, N
static int mcbsp_release(struct inode *inode,struct file *file)) K0 d0 S" T: s( ?  H
{
- q% ], p7 X) g& k( k3 _9 f% j4 [   printk("release success!\n");
, Q8 r- J" t' V/ H. Q8 x! ^& s, C   return 0;
: [. W# n$ C+ V9 X9 G, |- G}
# Q  }$ V$ L3 Q5 b3 R
2 c) U# u9 ~7 Y# e0 V/ K0 ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 c1 @4 _" E7 V2 M{
' a6 o, q! _8 ?3 z8 e+ B! ?    copy_from_user(&DXR_data,buf,len);/ {" y. N2 m3 @) g$ ^) Z
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* O7 X# G/ j) G9 }  V8 C" ?  T    return 0;
; P: x+ F- }% b# p% ?
% t5 z. p2 _; l3 @}
7 h  J; P3 o& ~
4 y6 f9 L3 ^% _1 [% f8 ?0 h& rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! i. R# i/ f. Z  T2 {{ $ M$ |& V5 ]+ g. a2 _6 B9 V9 ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 c# r. S# V# ]0 }9 T* m   copy_to_user(buf,&DRR_data,len);
% E& C9 S/ y0 [, Y   return 0;
: h" i% K/ z* I! D2 A}
% S2 B1 s" t0 @: ^% _+ A2 W7 T& j5 C6 A( E+ F# m5 B
) {( V4 l* H/ }' @9 x* L- I
static struct  file_operations mcbsp_fops=
) U6 K# \4 V! V9 j' _0 g{* f5 z7 C& l' V2 q0 c" k$ S, E  k
   .owner=THIS_MODULE,/ C1 g6 ~% g; F- q, T+ v3 {5 _+ B% V* R
   .open=mcbsp_open,- q9 C+ i! s4 ^' D& k3 D, p
   .release=mcbsp_release,9 l8 Q2 i. ]. S8 `2 ]
   .write=mcbsp_write,; l% a% e& i- V/ K  }0 c4 O# u4 W/ y0 m
   .read=mcbsp_read,6 S, F# C+ P6 ~
};
# ~+ a" a1 z3 B3 @; x* c! Mstatic int __init MCBSP_init(void). {% k+ X% i4 V0 h; q2 N( a1 [
{; f* \& X% ~# b
   int ret;  G: {! c# s2 |1 a- ?, M7 M
   unsigned  int   PINMUX1_REG_old;! {2 W; H, j5 L; n! E0 @5 Q
   unsigned  int   PINMUX18_REG_old;
* a) A" k5 D5 s$ y   unsigned  int   PINMUX19_REG_old;; m! h2 f( i; K3 s5 y
   unsigned  int   temp;  
( D9 `3 @( u4 j   if(MCBSP_MAJOR)
) |* V, {  W$ k, d: X   {
7 v5 Y9 ^! b. g  `) m3 z# A      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# @0 O- I/ X6 a
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 p- k7 Y9 @+ l9 Y" H$ x
   }& n7 n; C9 b/ d" S3 ]1 t) E6 o
   else
: f# s$ t; d* f   {" }; {8 g; e8 p! f+ `3 j) K  \1 @
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- W+ h( ?6 E/ }6 ^
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ _+ }5 W! F3 v! z! p
   }8 C& F2 L& u: ?$ }
   
: u& c# q& J. w   if(ret<0)
4 q9 U8 M" x5 m2 [8 X- ]/ O4 E# `+ E+ B   {. {4 i6 D+ r5 a# J
      printk(KERN_ERR "register chrdev fail!");( D4 j" D& ]; }4 p# @* F9 ~
      return -1;
. K" f- s# y: A9 m' c' E& ^   }/ R2 s- r3 C. [6 G& }; S) X( \) o
   # z. r- p6 r- v6 s! L3 n) c
   mcbsp_cdev=cdev_alloc();  h2 t# h5 F7 O" l$ b# C) p
   . o/ a% r0 ^# u
   if(mcbsp_cdev!=NULL)
$ Z, y6 M  Q4 [! t; n" i   {# p( s' s; L% e+ P. a) x6 Z
      cdev_init(mcbsp_cdev,&mcbsp_fops);
( a5 v/ p8 U9 m  t! O      mcbsp_cdev->ops=&mcbsp_fops;
* J1 F( G" S% k8 @- l- J      mcbsp_cdev->owner=THIS_MODULE;; v; e( a3 q1 X6 M
      
  v; f6 ]: E; m/ [; C' H      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( n$ T& B3 D" a  f  v          printk(KERN_ERR "register cdev fail!");
* k0 v8 e" |3 t( i0 G      else+ A& a3 u$ O& O! [
          printk(KERN_ERR "register success!\n");
6 D/ Q" h' a; [; {* S   }- b% `2 w" j7 m- A
   else; |1 M/ L0 ^( X! K, a; R
   {
' c2 D/ l- c! ^0 V4 h3 u      printk(KERN_ERR "register cdev err!");& e; V0 T, w4 w' j! ~$ y$ ?
      return -1;
" H+ T5 p  @( ^8 j) n( x   }" l" @1 V0 q+ a5 p
   5 O% `' X" J) F7 r
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& G, j. N3 f" c) ?1 y% V
   if(IS_ERR(mcbsp_class))+ H5 B. e* L, F! h
   {
6 s$ l& l" T3 K2 s* [      printk(KERN_ERR "register class err!");
2 [  ~) s. s9 q" J1 L' M' r   return -1;+ b: n1 ^+ ?. L/ c; B8 M) y9 A
   }  o" v9 W- H$ i- @
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 i" a2 F$ ?# F5 Y* b1 h, p( L% M  s9 Z
   //PSC
& S$ m* g4 N( q$ T: P   //add Enable MCBSP- T5 N. d3 S7 k
   //test. o, I  @- [4 d# ?" Z
   temp = 0x80000003;
8 q; G' A* v! H! {   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. g# \# y, X$ R2 V/ e5 I2 ~; c   temp = 0x00000003;; C% X0 e+ c- j
   writel(temp, IO_ADDRESS(PTCMD_ADDR));- z; B) ^+ S$ t7 i. x
5 d1 L' A% x& {5 n# g  @9 Y
   temp = 0x001FF201;
9 z( j. ~8 l+ `0 Q1 t4 D- R$ B   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# t' ^) _* t9 w1 h5 X: \. R   " s0 _8 [( N9 C; o
   //PINMUX  
; }/ K. u6 V, O. U  I8 t( s+ p" J6 X   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,1 k, z# f, F9 Y  k* \  X
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
( u8 D& B, o: `$ I! w2 T   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 v) g2 s" w7 u: X; }# W. j9 v6 p   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  q( }+ g$ F( w, T' e+ y& k: q   
8 Z) P& x$ c9 S   //SLEEP_EN,EPR,L138_SHK1,L138_RC1 K  Q9 s: y# b% q8 n$ ?8 V
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ u; t7 `& D6 R# E& f; b   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   . V: B) b9 p& r: Y3 r
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' c% X0 S) m# p" M

! E$ i7 @! ?3 ]   //RESETn,L138_SHK2
$ B  j; f; }  `1 C- Y* b* n  ~   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & v5 |3 T% ?) }9 j
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  Y, e, d) `: ~) r* S   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- N+ z; z1 O# z1 r# a9 t , v! ^2 u6 i8 i  S+ N! s$ L
, x, V: @: A# C8 k
  //SPCR Register
  U, c, q$ |2 P" n. Y3 l# p6 r  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ L+ y+ O! y  {( J& I( Y6 o  temp = 0x03000000;//(DLB=0)) v7 G. \/ d& `1 Y; C
// temp = 0x03008000;//(DLB=1)
# X& x2 T1 t& B/ R2 H2 P, r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
) U9 N8 o  u8 a4 o. F# w  temp = readl(IO_ADDRESS(SPCR_ADDR));$ R3 g* ^8 J$ ^1 d* s
  printk("temp=%x\n",temp);
6 J/ o' g; g. b! w
  R8 W: P; K5 n   //PCR Register
% ~% O5 h$ k! o# n1 u: v   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 M- u% C- ~4 {- H  D( B% n; O) L
  // temp = 0x00000F0F;
' t  O( p3 [$ g/ Z; y( X( V/ L  temp = 0x00000B0F;
8 ~! I, W$ G- N2 I% d9 H0 W9 A  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 5 z3 N( u  d/ f! m0 k4 ]
  temp = readl(IO_ADDRESS(PCR_ADDR));
& N7 f* `& ~1 {, b& }  S  printk("temp=%x\n",temp);  $ [# G: F! }& }( ~0 o; X
   //SRGR Register# y& v+ Y; E0 i4 E
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 [: c! B- d( E3 j. Y //temp = 0x301F000B;2 j+ g+ V$ @$ S! o; n) P. w
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
3 Q  `3 P+ q+ m$ e+ E6 D  temp = readl(IO_ADDRESS(SRGR_ADDR));8 I: V7 s: O! J# b, @
  printk("temp=%x\n",temp);
& D7 i3 {* f3 S5 s4 [   //RCR& U% Z4 t& u/ w' `
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* W5 z6 r: K* v/ A0 A8 S   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ r/ E. e- L/ x9 Q8 `$ \) E   temp = 0x00440040;
* g3 S2 a7 `5 \3 z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - {5 |. e5 K: Q0 H- F* s, U
   temp = readl(IO_ADDRESS(RCR_ADDR));
$ I% k# O0 a" o   printk("temp=%x\n",temp);' N8 }" M4 i2 F0 G: x( I
   //XCR
0 n1 C/ |+ |5 Z0 n* L9 l9 s$ ?   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 P: _) P$ `. y7 P# l1 H   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 e. K, v+ y( D9 {
   temp = 0x00440040;
2 O# M/ f3 e5 G9 b) C8 e   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized     v( x! d2 o* \0 b7 v6 O3 x. d
   temp = readl(IO_ADDRESS(XCR_ADDR));
3 J8 g5 r4 ?" h, m; w   printk("temp=%x\n",temp);" S! Y" k' x: N! |9 W& `3 z
  udelay(100);3 }/ @& M# X+ C0 R. Q
  //SPCR Register6 Z: n- B( ?  n! R
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
! \( p: s' e) v! {* F- p  temp = 0x03C10001;   //DLB = 0 VS DLB = 15 ?! w# i1 c2 p# U% Z$ ?; w
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
  \- Y$ u8 O2 H: u7 \0 E  temp = readl(IO_ADDRESS(SPCR_ADDR));2 ~5 ?- i3 U. a) P5 m
  printk("temp=%x\n",temp);
& n. N" m4 s4 c  udelay(100);
  a6 s% t; _9 M) E3 Z" s/ k& g. }0 ]! C
  //set GPIO direction3 k6 X7 n  q- A+ [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 I! X+ O; B9 o7 X/ m+ y
   temp = temp | 0x00000100;//EPR----input
+ L. x; b! V1 s. G7 X5 _   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ X% F) }/ S/ Z9 |
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : Q2 _# G' ~  L' Y
! U( H, e( U4 f
   return 0;+ o! g# Y0 j; g! U0 Y9 W, _
}
8 B2 g+ }  y6 x) ?  kstatic void __exit MCBSP_exit(void); Z  o  B" T- K- C  v; p
{
7 I/ [, B0 N9 z  k, a& {: A   printk("mcbsp chrdev exit!\n");
5 t# V1 Z3 ?) H. s6 Z   cdev_del(mcbsp_cdev);& I8 r1 G' _2 Y1 ]  x
   unregister_chrdev_region(mcbsp_dev,count);* O9 K9 j* W# ?, u( z0 T7 r% [: {: e  s
   device_destroy(mcbsp_class,mcbsp_dev);
: \2 @2 e3 f# B. Q   class_destroy(mcbsp_class);" H4 K' a" e6 B$ J
}
( o' w7 K* n' ^9 p- g' Hmodule_init(MCBSP_init);. a9 k  u+ M% ~% _& h
module_exit(MCBSP_exit);
/ ~- s1 u0 Q# b6 O
8 D, o0 h! C. Y, N% @$ ~5 AMODULE_LICENSE("GPL");5 T) n/ Z$ f1 a2 e

6 O) @  U/ }8 |) }% K9 K; q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 }7 ?2 V( h! H/ }
我的应用层的测试程序如下
5 T, ]  h$ S) t- O$ {#include <stdio.h>7 T( Y9 b- @" C- {3 n4 Z
#include <string.h>
1 n( V! e0 {5 B4 [#include <fcntl.h>
/ a: N% }9 o: B#include <unistd.h>
* }" K  q  t1 C( {5 d6 Z#include <signal.h>- e" @- {! x! ^! i$ W
#include <pthread.h>       //线程
, Z4 a) }8 d) U' M#include <stdlib.h>, B* h- A" `" ^: O
#include <pcap.h>          //捕获网口数据$ G5 A' j4 B, `4 D5 W8 ?. f% F
#include <semaphore.h>     //信号
* r. d7 {6 S: U" r# J) l#include <sys/types.h>     //消息对列5 g* @# f7 Q& A* a
#include <sys/ipc.h>       //消息队列
, h) Z7 {3 w; f) @) c6 ]#include <sys/msg.h>       //消息队列5 R" I5 g. R+ Y% ?
#include <sys/select.h>( D9 f2 Z& l6 V- j! _% a; B4 {6 y
#include <sys/syscall.h>. t1 b* f4 x+ Y7 R
#include <sys/stat.h>
3 k8 ^6 O+ }; W#include <sys/mman.h>
+ a' f3 E* L% s: V+ V#define msleep(x) usleep(1000*x)
* N- _# b3 ]( E1 [# k9 k  L6 j% j& X+ F+ Y6 [& M
int main()
" c+ g' R! ]( s: x% d& M5 y0 A{
; i& i0 A, T4 d' w+ t    //MCBSP,ARM与AMBE2000交互设备3 T+ D% q* v& n' b$ S
int fd;* ~5 S$ ]2 ]8 c' ]8 U
unsigned short data_write = 0x5555;0 B/ f! C7 v; d0 ]0 p9 R
unsigned short data_read = 0x00;2 I% \: O9 W& x8 K6 h( K6 j
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: c+ B) L8 b3 i //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* n5 R9 p, I- j/ a! x   
/ w# T# r  Y3 @  if(fd < 0)
5 Y: _; n, u* |1 j5 D5 w* e: e; Q% d  {4 m! N. I  L5 E1 K9 D+ k
     perror("open failed\n");) q* m0 {3 s% }) D
     return -1;6 w6 P: J' k% o% X3 A
  }
% d6 y9 x2 v2 b- n9 e  
0 z6 Z5 j* M9 s& G! S  while(1)1 N. F) T8 w- c  Q* c: Y( _7 V) ^
  {
) j& f- i6 o# H* `   4 K7 W, X' z0 h) g
   //AMBE2000每次读写是24个字为一帧6 }8 `% t1 w+ h! J7 R! y+ p& a
   //写数据时将数据在底层存储起来,等到中断的时候再发送
) J" T, \( `+ J+ f   //AMBE2000输入数据是以0x13EC开头的
% m" v# m. ~* @$ P" }6 ]   write(fd,&data_write,sizeof(unsigned short));
7 _# O9 s- v6 S4 G8 ~* V6 K   2 E1 c1 |3 q+ Q/ y3 j: i! m% T: ^
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  / q3 F: d" T& d
   read(fd,&data_read,sizeof(unsigned short));, L' q$ o- ]3 B
   0 B! }9 t5 d$ D" p" r$ d
   if(data_read == 0x13Ec)
! b5 I1 }# @8 @0 C7 k! |   {
8 k( Q/ A' t3 U  c; {0 j/ Y& n   . a- u9 q  j8 R
    printf("data_read = %x\n",data_read);
8 L9 S# Q0 ?8 @/ h. f   }
* W3 W. _# y. `9 M/ w# p9 S6 W; \   ! J. R$ O3 k* A& r$ Q+ V* }
   msleep(10);& I5 k+ `+ `, X0 w7 n' n' _% R* _
  5 Q" I; r. V: M" w6 M1 s, V
  /*- ?7 m# L; x( }
   ioctl(fd,1);   8 b/ O; [* y) D" x. X; L
sleep(1);
* h( ?6 ~/ B$ S/ ?4 D  V" F ioctl(fd,0);/ v, |- M' u( P* a" k
sleep(1);0 M; w3 O5 y( H5 M. I+ D2 N2 t" G6 I
*/ ' Y& [5 p" i6 w
  }   
2 d  w/ _5 g+ W/ E6 r return 0;; w" g7 i0 a) \! y5 z0 S
* O& ]2 \6 T2 X+ f; M! M3 ?
}* _3 }- a$ M! K1 G

/ B. U1 l, f# b多谢各位指教,谢谢! 急2 ?- D# V" V0 Z+ ]6 H

; Y* C) ]9 J: n. u6 X& }; L$ y0 z
) S& ~. j7 p* A$ T" W; R. F
% M2 t: |3 b' D8 \- z- m, W
, j: g7 M) U8 E( \
, D4 V' h0 h& Q/ P, t: [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 04:09 , Processed in 0.048573 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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