McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 E4 T) B  g& Q. [6 V4 j/*
" P1 q+ R! T0 O' a- N. p/ S * Copyright (C) 2009 Texas Instruments Inc* x5 m- e2 K. p' f
*( p+ T: l7 e: B8 {
* This program is free software; you can redistribute it and/or modify$ O9 a( \! u" d, a. Q3 e) H1 \
* it under the terms of the GNU General Public License as published by
- w3 E! j& d7 T  `0 \1 X * the Free Software Foundation; either version 2 of the License, or
% K; R& M6 e- H$ I: y$ h$ i8 r * (at your option)any later version." A: \! \. b* d2 \8 S! O/ v7 _
*# o' r' U4 l; b; x
* This program is distributed in the hope that it will be useful,$ ~: g+ y  ]% E3 t# B" a
* but WITHOUT ANY WARRANTY; without even the implied warranty of
6 b% P2 f5 c6 @ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 q9 Z( h. P5 d" ]* O) w3 ~& B  o  V * GNU General Public License for more details.0 C0 w1 h: b) K1 H% t( S
*  C/ K! [; d, S/ Z1 _7 u' e
* You should have received a copy of the GNU General Public License
; c' J& s7 _4 d# I7 k) g4 v * along with this program; if not, write to the Free Software4 _: |8 L4 E/ M3 g" T- G6 n; _
* Foundati
2 i9 @+ Y/ n# v; W2 k/ f; Z1 [*/
2 T+ O0 ~5 U* l+ j#include <linux/module.h>7 y3 V" u8 l7 x  G
#include <linux/init.h>9 }8 f' }" b0 B: c; c5 f& m# {' @
#include <linux/errno.h>; Z8 P; t! @. o9 @1 ?! P
#include <linux/types.h>
6 T: D. T4 c1 [; i, y7 H$ l#include <linux/interrupt.h>
4 g2 i4 ~7 J8 l2 f#include <linux/io.h>
/ Z( c" h, x3 w1 v#include <linux/sysctl.h>  X( I3 r. g- v
#include <linux/mm.h>4 p: A4 l& `4 N2 s5 I3 _9 H
#include <linux/delay.h>
) L; `' P! o  v2 [) S4 r2 Y#include<linux/kernel.h>
6 O: k6 B; }( R- ?#include<linux/fs.h>% [0 \8 j! B6 }9 c+ b5 K
#include<linux/ioctl.h>: K; e% ?# S7 q7 j# B6 k
#include<linux/cdev.h>
* E/ Z# m2 l  z% T) k3 U#include<linux/kdev_t.h>
0 }0 P; a) I% h% o! y4 {+ n5 V3 D- o#include<linux/gpio.h>' ]) [; w3 g3 b# t4 t4 x
#include <mach/hardware.h>
; p+ Z7 i: e) ]% F3 X  f& T#include <mach/irqs.h>
7 q# \) a: d- _4 }/ {
. W+ a% k$ O* i$ W$ T% e* L#include <asm/mach-types.h>6 Z- Z( f8 k+ t+ C
#include <asm/mach/arch.h>
  ]. n9 w  |* p' |$ F  B/ n/ \5 e#include <mach/da8xx.h>
0 z' ]. w3 A1 z' v0 Q0 S7 ]#define  SYSCFG_BASE   0x01c14000
9 r: n3 n7 ?5 j3 j2 `4 \, }  E#define  PINMUX1_OFFSET   0x124
$ m3 q$ b, i  a6 q3 f#define  PINMUX18_OFFSET  0x168
5 x$ }2 J- [* R& j- R; {% I6 c* a! V#define  PINMUX19_OFFSET  0x16c
9 w6 U, m5 ?0 j9 o8 u1 R2 v#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR+ K9 ]; z: J2 Y
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
0 u+ O* f9 G% j3 p4 h#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
6 m. @* R5 g% t0 M2 J# k#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR5 i4 j9 n  [( X0 |3 t
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
" c* A1 z- f4 o5 {9 k4 A' E) Q                            ( F% ]" U/ h3 U: F) M
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR# P9 V' z2 l# f
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 G( @* M. Y' X: V) F3 |, F//PSC
" G: p, `! ^' k8 _6 O#define  PTCMD_ADDR   0x01E27120  
$ k, d) y" k1 s  h" y3 Q#define  MDCTL15_ADDR 0x01E27A3C
# V" ~) v" f. [  a7 p2 A/ y% W3 v#define  PDCTL1_ADDR  0x01E273044 W7 w8 t, O5 G$ z& j+ g9 R- A
//GPIO8 direction
* a2 j0 n, B& ?+ K#define GPIO8_DIRECT  0x01E260B0
& n# d$ M: w8 r% V" J#define GPIO8_OUT     0x01E260B4) ^  Y# D9 k1 ^# B) Y
#define GPIO8_IN     0x01E260C0' q( F' r/ W0 p; R$ i

; x$ I6 D) R( E9 Q! l: y& I//#define MCBSP1_RINT    99              9 J3 Q( x, B1 [& R. ?- s
//#define MCBSP1_XINT    100  9 v% G8 i: r, K; i
static int MCBSP_MAJOR=239;0 I" ]  l# Q  r6 P; k* V( Y; B- l' e
static int MCBSP_MINOR=0;! c; a6 [) q" A& V$ Y
static int count =1;$ L7 B# X' o- n! S: ]& J1 Y, `

$ W; H6 b! v5 r2 B, U! K#define MCBSP_NAME  "MCBSP-device"
3 Q/ _0 P; v8 u+ U& w3 m5 z! k$ G' |/ q" Y1 F
static struct cdev *mcbsp_cdev;4 j8 [7 t2 j/ Q* M. r! V$ l
static struct class *mcbsp_class;
" N  e' d/ @' q0 N7 Kstatic dev_t mcbsp_dev;5 w% w6 [3 T' p+ Y4 P, z- ]
unsigned int DRR_data;+ c& B. h5 e) V9 h) s* Q* D7 |1 l9 _
unsigned int DXR_data;/ _6 R3 g/ B% }5 M, g7 I
static int mcbsp_open(struct inode *inode,struct file *file)
4 F7 c3 K5 H  h9 H" {& ?# j{
3 H1 q3 @( d* Q( Y5 Q5 K   
5 |: ], s! s. K/ ?+ e   //interrupt enable,initialized
$ C. h7 ~9 r/ A! w" S: J   unsigned int temp;  ]4 E* w4 u) U+ L, W. B
   //SLEEP_EN(GPIO8[10])---0/ G, Q# l1 P0 m0 w! f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( S$ Z7 L0 O' u! K+ r' }% ]   temp=temp&(~0x00000400);; ^. T; j6 b* r8 o7 D2 B* e9 Y, M  S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
) c8 B4 c; F. Y& n# `5 S2 `5 g  //RESETn(GPIO8[8])----0----1
0 U+ U" n* \# F( u# T7 j8 v   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) `5 b) M8 ]  y   temp=temp&(~0x00000100);& I, \+ j" s1 F3 @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ V# F' \1 Y3 f! C! a9 C   udelay(100);
) l- e: r! x4 I( m   temp=temp| 0x00000100;2 ]0 M) F1 p0 o7 D
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 e, K7 t/ P' \) p5 b; v5 D
   udelay(100);
9 O" R* Y" ]4 T   printk("open success!\n");! X" }3 s: s1 b. B( F; S; g
   return 0;
. F# |& A0 B% b) C) o6 x}+ F. T' v8 d( T  D5 ^. Z8 K
: g, y* p9 W: a) s; p
static int mcbsp_release(struct inode *inode,struct file *file)
, T( q' m" a6 m& L1 a5 y{7 T; Z0 M8 g6 B$ g2 ~9 v
   printk("release success!\n");
/ I, u4 ]9 C) \* a9 |4 i   return 0;
: [' D: j. H% f" a# `* _}
, U  P. D; t! o# T; |; ~" k5 z! k+ s, P8 U. ~8 K  h. U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 h* I2 i6 ~6 v7 ^
{. H: a3 c, J- d
    copy_from_user(&DXR_data,buf,len);
" G2 ]8 T& g! v4 N3 k    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 Y& |' j& C  e2 {8 S! }    return 0;
  M1 F1 w7 I9 T4 o8 V! j) X' C 8 u5 q8 ^& F! o  V3 w$ c4 n  H
}1 s/ [$ `9 [, W1 \6 r% F0 S$ C* ?
0 E) [3 l% I, N+ R4 q3 P2 y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* V/ \; n$ A+ ^- d4 W/ D. V" ]. {' V{ ' c% d% Z" [# T' @. z7 Q$ \% E
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 U0 A; E; q- X1 s
   copy_to_user(buf,&DRR_data,len); , O7 M; d9 S2 M6 z9 l* ]
   return 0;' e/ Y' D( l# Z6 B3 G% W; z
}# i" @# t' e! E, \  c9 m. o( C
- P' L  z& S0 Z( j' b/ x+ v
+ N. o, H: J2 k; x& @( U4 s
static struct  file_operations mcbsp_fops=0 Z" u. |  i* Z6 d1 O
{
. j- {1 [8 G; [( h; \1 X/ b   .owner=THIS_MODULE,
5 |! }  @# l3 o7 P0 m   .open=mcbsp_open,
6 f6 P8 F- H3 f7 M' C6 _" L% n% e' P   .release=mcbsp_release,
2 x" l+ S5 t8 Z3 W% @& o  f) Z   .write=mcbsp_write,
" O/ ~. t1 I- q$ u7 V   .read=mcbsp_read,
: Q; M, A$ @5 ~' P" U};
) W- O3 X9 b/ m! ]static int __init MCBSP_init(void): }  \' |# B( N1 ^; J# t
{" U" m; @$ H0 ~! }2 f4 w8 V
   int ret;" i8 }: r7 K- g
   unsigned  int   PINMUX1_REG_old;
6 K& U6 J0 N. A/ j) l9 `7 m$ h   unsigned  int   PINMUX18_REG_old;, U1 k4 [: f4 M* ~4 b
   unsigned  int   PINMUX19_REG_old;
" q# M1 G+ {+ O6 p# S( c   unsigned  int   temp;  
: v) f6 d5 H, n6 H   if(MCBSP_MAJOR)
* ]6 ~6 H2 j* u- _   {
# k7 g1 d) q1 \7 ~+ t: ]% Q      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; f6 r/ h; h$ O' h7 j      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- o, S6 ^$ Y: [/ s
   }
& J& t. z% j1 c, e4 u6 N   else; K6 b% P( H4 K; k
   {2 o! M" V" u- s& b, L3 M
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 m: Y, c# C' V* Z
      MCBSP_MAJOR=MAJOR(mcbsp_dev);' i; o5 c* }+ d+ {, y/ h) }
   }/ K5 U" \) J  W: Z8 v
   
) [8 \3 J' O5 l$ @   if(ret<0)
; g" P1 E9 Q6 l  V   {
. U6 T. ^! r+ G* u3 e8 b      printk(KERN_ERR "register chrdev fail!");& y# a4 A7 X9 d+ o% @) c7 k
      return -1;- W5 S; v+ y( ~% l1 H% a( J' v
   }4 n: b8 u3 y# P) J% R
   
" z5 s8 E1 O# p& r   mcbsp_cdev=cdev_alloc();2 \" c# S* v6 V3 G, F) L9 m
   
( G+ j& ]& ~) r* A- Y2 ^; d4 l   if(mcbsp_cdev!=NULL)
  \2 ?% @* J9 H! k   {
, c, y+ i1 f7 w3 D6 X      cdev_init(mcbsp_cdev,&mcbsp_fops);9 t8 H% F: r* W% N& Y8 @+ a
      mcbsp_cdev->ops=&mcbsp_fops;9 r9 g8 r  [: I
      mcbsp_cdev->owner=THIS_MODULE;% [6 a  I3 |- F. ^- j" g" j
      / x# }& H# O2 C' \/ u
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( H" W$ O* l; X% o/ a5 L0 g          printk(KERN_ERR "register cdev fail!");9 O+ V" |; y. Y5 n1 p3 T
      else
; ?0 g/ i) N4 Q, a          printk(KERN_ERR "register success!\n");
+ P2 B% i4 W  p  a7 I) s( O2 d   }
+ e2 Q+ s, \( g4 \' Q% l, C   else
" w0 E! O/ t  l0 b) B   {- X. I6 R6 a( Y. I6 Z! O* e2 P
      printk(KERN_ERR "register cdev err!");2 C% ]/ L6 F  q5 u3 \3 F
      return -1;! U2 W# `+ W9 H% O: @: a0 N( d0 f
   }
) x* _0 M; C. S; ]' z- i   
0 F2 p0 ?, O3 k6 x  X# h  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);  ?' V8 \2 `" X  y; l" d
   if(IS_ERR(mcbsp_class))
- G7 ~8 J/ Q7 S1 }4 B" n* v+ G. X   {
# `! m  T& p9 i3 N, e      printk(KERN_ERR "register class err!");: M9 |9 {% P1 I1 [
   return -1;4 T' N/ ?9 O  L( W
   }  n0 m0 a  l5 W9 a/ V
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. r# X4 q6 i1 e9 l% M
: S6 v  \- x; f3 @$ ^% b
   //PSC
2 ?+ G) ~1 k/ ^   //add Enable MCBSP. C- {* a1 `% d" f) R3 o. P4 b5 ]
   //test
' M( X+ ]% ], Z- ?   temp = 0x80000003;  C+ w; o* ^& [# p) H& g5 [
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 z; l) T8 D0 E6 k+ w6 I
   temp = 0x00000003;: l- B# }" X$ w/ m$ w$ Y8 R
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 r3 |, L( t8 ^  ~7 g. B
8 c' ^! I* Z' J; h   temp = 0x001FF201;9 A  P6 `3 p$ B: T  f
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ N  b4 R. m; Q8 o3 t' d   
( f; g' s2 `$ X8 I   //PINMUX  ( B  O- r% D% [' I
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 H# S0 t% u/ R" y+ g2 P$ O   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
1 \( l. Q: v- |5 ^   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
2 Y6 k& E+ i, P( \/ |9 r: x* d, {   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: l2 L. N4 P5 W  G* N/ v   2 _" k" D2 J+ n0 l, ?( H
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 Z3 |6 i: m% a% e+ o( e
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
& Q1 d8 P# O- g8 S6 c   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / \# Z: f$ t5 Z: R) c4 B/ `0 W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 I6 D3 j2 K1 \/ l9 ?9 G

( ~1 R; c: \6 d2 A. h   //RESETn,L138_SHK2) v; y% `# J& z9 R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 q6 k6 q6 F) x
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   : F* p! n$ D" ]1 J* U
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
' ^! i! R; H+ X5 W: T$ p! y
, M+ m2 C& `: E7 g7 {9 q
* o5 D5 x/ \! x4 \. b8 c+ |  //SPCR Register5 R! d3 ~% A% k- x5 {% I& o
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 }' o1 L, l; M, ?+ ?  temp = 0x03000000;//(DLB=0). }9 H8 Y; X- ]
// temp = 0x03008000;//(DLB=1)( z- z+ o1 W! ?4 n4 t! |0 o- C3 d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
0 U6 z8 L5 X; B# T1 o" d6 @  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ j# q! w; w9 C" ^& }$ u7 I7 U  printk("temp=%x\n",temp);
& v& v5 Q6 s% h* q! Q. s* _ ; y7 }# _% {6 D
   //PCR Register
$ L. E2 H! i8 C   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 o/ |/ v# {1 K! j  // temp = 0x00000F0F;
2 ^. j$ |; \2 v  temp = 0x00000B0F;$ T& H  p3 k% Z  K
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized & F/ M9 k; ]" d( c5 {
  temp = readl(IO_ADDRESS(PCR_ADDR));
, m: A/ Y# A/ e/ M% Y6 L  printk("temp=%x\n",temp);  
4 n1 s; _) o0 ^: q9 l5 |+ T, P+ m/ d   //SRGR Register
" l' c  _) h, j  @& q9 O, b   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11& }5 R4 @8 F! ^3 b; n6 J8 F, h
//temp = 0x301F000B;- Q, U1 J& l" m1 ]' G9 T
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' W8 j& C9 O1 z& U- {* N! p
  temp = readl(IO_ADDRESS(SRGR_ADDR));
# s' B& W- v; G  printk("temp=%x\n",temp);
) b) E3 k7 Q  s! R. u- A2 f   //RCR
1 Y# e$ I5 ^- R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 v& J# Y* t2 F' e2 G! G
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 c* S4 i( [; I$ M   temp = 0x00440040;7 \  c, z9 y0 S0 X
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
1 x4 m9 S% u5 h+ V! g+ K   temp = readl(IO_ADDRESS(RCR_ADDR));+ d) o1 \5 n. v: K9 S' s
   printk("temp=%x\n",temp);
7 S2 p+ r* Z! O6 v   //XCR
; r3 v% S3 t; i8 W. u# P   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 `+ s& o* g. }: e3 z; a
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
! A/ \  E9 C9 x4 l! s2 W   temp = 0x00440040;, F% M6 t# x7 k3 c
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " S* F& ]0 X% C1 G
   temp = readl(IO_ADDRESS(XCR_ADDR));( H# K, x+ X* \, q4 {' c
   printk("temp=%x\n",temp);
, {; p# D3 F! _3 `$ d! I! U. [1 x  udelay(100);
5 b7 E( u# H3 h# o3 V  v  //SPCR Register0 y+ M) t& D8 j: R1 @+ P. j
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& Q: w" p# ]) ?+ g! I: x  H) f  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 f: \5 K" L* R! h2 c+ y
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 P- i$ g+ B5 ~  `4 w- h  R  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 i0 N5 j8 v( X. I. w5 l4 t  printk("temp=%x\n",temp);% \  A& c& C+ d) ^6 W* y
  udelay(100);  _# A2 n: y; l3 c2 |- t6 g

$ A8 n9 ^; G/ Z' F  //set GPIO direction
& |' d) h4 P: Z9 O5 @   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 C8 D$ Z8 S5 x   temp = temp | 0x00000100;//EPR----input
3 |6 P8 `" @! C% V   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' D  u, L1 C8 W9 `# I/ k   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # V2 o6 c, |0 u( L8 B

$ R) T$ i/ `1 i* A2 K  g   return 0;/ O! O2 g& T: X; ?
}* v2 y+ K* s) U! h) c
static void __exit MCBSP_exit(void)
5 N$ T2 ^1 z0 ^) f3 }{* p6 d2 J! @. J7 |  B
   printk("mcbsp chrdev exit!\n");
1 K$ C: F, C, ~* i4 D   cdev_del(mcbsp_cdev);2 I+ t' m: l6 h; q$ `6 T
   unregister_chrdev_region(mcbsp_dev,count);
8 k: Z9 E* n4 G/ b   device_destroy(mcbsp_class,mcbsp_dev);' c3 k  M# g( p+ [; P3 l
   class_destroy(mcbsp_class);$ x9 a2 g: W$ T/ }
}
' Y: o/ `2 e9 q7 d7 r- d' \0 E$ Amodule_init(MCBSP_init);8 a& [5 V- N) _0 k
module_exit(MCBSP_exit);
/ F; d$ P3 P! g: f1 e( s
1 `# Z8 C) t( zMODULE_LICENSE("GPL");& D8 i; A1 R) x" \6 b( m, n$ C
/ U2 n1 o. W& W. }4 j# F( f4 q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 k+ @! x( q  S
我的应用层的测试程序如下
5 Q% Y1 W- u: m/ j5 X  ~#include <stdio.h>
  C' k, d2 i, x, }8 ]% P$ t; ]#include <string.h>
, `' m$ Q. y: O# Y9 p#include <fcntl.h>
$ U8 R# Z5 |% o# m4 I: Z  }#include <unistd.h>
, C1 l$ ~+ l$ T#include <signal.h>
3 Z% Y: g4 W4 O! R; R1 z#include <pthread.h>       //线程6 b6 L0 B7 d$ A6 ]3 d6 Z# W
#include <stdlib.h>% Z# r& {3 x4 `" p! |7 S5 C' m0 u8 h
#include <pcap.h>          //捕获网口数据$ _. D' P  ~( M& P
#include <semaphore.h>     //信号4 _5 c1 i( k  w: }9 a+ I. G
#include <sys/types.h>     //消息对列
5 n' k% b6 n  ?# U/ h9 w5 z#include <sys/ipc.h>       //消息队列
1 |( H/ k2 t; J! m2 ?& J#include <sys/msg.h>       //消息队列
2 g4 C/ O% Z, d) O* M$ x#include <sys/select.h>- i# s6 f8 Y2 C6 G* k& @
#include <sys/syscall.h>+ V) x1 A& T6 ^
#include <sys/stat.h>& X' ~/ N! V2 W) |% n$ a
#include <sys/mman.h>
% U9 H& v9 z+ ^4 O#define msleep(x) usleep(1000*x)
+ ?+ }* Y  f7 n& H! M: f8 ]; z
& K: p  M9 s' ~int main()3 B- i; m3 b: e' m5 O, o
{
5 s& Q5 x& ~* t    //MCBSP,ARM与AMBE2000交互设备) S* P% t) u3 `8 f' }+ S7 T- `
int fd;
( i) l& V; Y5 n+ P. D unsigned short data_write = 0x5555;
8 L2 v$ e+ V2 R3 s unsigned short data_read = 0x00;& L$ A+ o5 E0 {+ y: q4 Y  e: V+ u
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 k  A! E+ \6 \  x) b' ]  T
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; i7 D! W9 L9 q
   
6 K5 ?9 f5 f8 l# z1 V9 l  if(fd < 0)( `7 A( {3 J! G$ L  U' z( A
  {/ p1 |* L" Y$ e
     perror("open failed\n");
( s3 ^& G2 Y. c+ \% E% _1 H3 J# H6 c     return -1;
, B- P  z8 R9 f- A! t& l  }
' q- Y0 U  G. O! h6 i2 b  1 i# q$ S- g0 }* H" K9 X
  while(1)
- q1 o9 c# I: R$ j2 O  {1 R5 ?6 S: O" Y7 @& U, i* N, ?
   
2 k* L  U2 \( W1 [   //AMBE2000每次读写是24个字为一帧
4 o! [8 P/ n7 `/ E$ s# Y: Q) i   //写数据时将数据在底层存储起来,等到中断的时候再发送
* W6 `# @6 E$ D' {$ B3 s   //AMBE2000输入数据是以0x13EC开头的
& @, J4 L8 N( Q! ^   write(fd,&data_write,sizeof(unsigned short));
, H2 l/ d" S. n4 n' ~4 @: v! r$ ]   / f5 W% l4 e2 M( D1 b
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
: \' T! W* f8 a& [/ o( s# x   read(fd,&data_read,sizeof(unsigned short));
. @. ?+ a, |) y' u( j' P: u   3 X: @% ^, z  s' @- q+ V5 n  Q* H
   if(data_read == 0x13Ec)
% k: c6 h) e. u3 t, g5 F& q   {
( Y4 n0 m0 ~0 F0 L" b; k( ~+ r   9 \5 l4 y8 A/ {) U* Y, ?- d4 x: Y
    printf("data_read = %x\n",data_read);/ x9 w! H9 J+ E2 h- _
   }2 S8 t9 V9 j6 ~( A+ x/ E4 Y
   
) }$ C4 ~7 Y! E1 J   msleep(10);( t+ J8 G: U. M7 X, J2 K" _4 f
  . x! Y8 X5 ]* w" o
  /*
, K# q( E4 b3 a" Y+ y& A   ioctl(fd,1);   ) g$ {& N% `/ i+ T7 s" ^9 m/ `/ P
sleep(1);
" R9 B/ j/ z% x$ ? ioctl(fd,0);* [$ u: h+ @4 q5 Y4 U. H3 n) S
sleep(1);5 [" n) s4 f+ u3 g
*/ # p, X9 r$ D9 A4 ^! s
  }   6 r$ o$ @7 y' E, w/ ^( j
return 0;2 A, X5 j  ^; Z1 z& v" ]" r

' s6 X  u9 H) ~/ x$ n}: b) _# g- J1 h; r# n
% e1 O2 l/ }; F! N% J
多谢各位指教,谢谢! 急; N" m& l# b3 g
2 W) |1 @$ ~7 u7 z! q2 P4 b

: E+ M- W0 B/ Y, ~; {+ p  v, b3 Z: a

5 ?+ q' \. h! A8 P6 y
( F0 ]2 A# y) P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 17:02 , Processed in 0.043536 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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