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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' Y; s. d/ Z+ `9 L# y/*
! t: z, i$ l/ C * Copyright (C) 2009 Texas Instruments Inc, m, u; _0 c( X4 i
*
+ I+ B3 q" k# ]3 G: ?: s/ U! q * This program is free software; you can redistribute it and/or modify0 X2 A8 \! L3 p1 A
* it under the terms of the GNU General Public License as published by
4 y5 |) X1 d0 |' `, }5 y8 ^- [ * the Free Software Foundation; either version 2 of the License, or
2 ^/ h$ v9 d% }# P2 T9 r. d5 T * (at your option)any later version.! e& {9 S, \5 B
*2 |6 l5 Q: O4 O" A& ~, R
* This program is distributed in the hope that it will be useful,7 g& I' i. G5 o
* but WITHOUT ANY WARRANTY; without even the implied warranty of! g: k$ W: A& ^* W- K' w
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 j0 n- p& `3 t2 j
* GNU General Public License for more details.% K% b3 q. _( m) J% |' b& Z
*# l  Y: j* Y2 m( A- b0 a* a
* You should have received a copy of the GNU General Public License
9 l. s2 {- _  t0 e8 B" h  g; L * along with this program; if not, write to the Free Software  Z& a( T9 W5 o% I
* Foundati( i! k4 b9 {% L9 a
*/
: W1 D3 B# V. H1 r- P#include <linux/module.h>
# f, j+ s2 F" t( t! B' w. n#include <linux/init.h>
- }/ s" ~- w( Q1 g+ v6 I#include <linux/errno.h>
; R% a: ]3 a8 a  T. g#include <linux/types.h>0 v0 B3 P! A0 N- I; Y
#include <linux/interrupt.h>
' t7 x5 ~4 T0 i, t9 D* z& l2 U#include <linux/io.h>: R$ H; ?& T2 V: q/ n1 ~
#include <linux/sysctl.h>+ T& c6 c0 e0 [  ?& w
#include <linux/mm.h>
4 X. W+ y- z$ Q#include <linux/delay.h>& V  P% d7 R4 r0 d
#include<linux/kernel.h>- M$ E& A5 U; u$ P, |+ ?: ~
#include<linux/fs.h>
/ j& ?$ k1 Z, o' ^( _6 N#include<linux/ioctl.h>6 ]4 f8 V' p2 ~# a% x' U- y
#include<linux/cdev.h>
0 e8 W; p$ D  t, q2 \' i1 G: ?: Z" b#include<linux/kdev_t.h>
0 K% m6 Y& O- Z4 j- l#include<linux/gpio.h>- h( L% M( q, V9 x. y3 e
#include <mach/hardware.h>: ?6 M9 ?' Y2 [
#include <mach/irqs.h>
* u$ H0 o" R' B7 x. {* I; ^6 `- `7 W5 S1 ?
#include <asm/mach-types.h>
6 ?) H$ @+ ~: \) k7 N#include <asm/mach/arch.h>+ |2 @5 Q6 g6 ^7 u, l( N* m
#include <mach/da8xx.h>8 ~% h# R) D) X
#define  SYSCFG_BASE   0x01c14000
. u( n, r- Y) s#define  PINMUX1_OFFSET   0x124 ) ?. m; A( T  X8 S2 i
#define  PINMUX18_OFFSET  0x168 $ @/ l. e4 M, j' s
#define  PINMUX19_OFFSET  0x16c- O$ X! l: F' l( e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 v7 Y. u- h* P# z# ~8 k
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
; r* b: R; u; f4 B" ?7 ]#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. t& l. {- i* p5 N
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
$ B5 F2 _/ i$ }: @#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! {5 J  v+ x' I# [6 c$ w                            , h/ k1 Y8 w! m) ?* t+ f; Q2 E
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR* Q* c1 s9 ?- n0 k. a
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
" u6 h- c( b- _% i$ X" A; V//PSC
) {2 o! C$ E8 D5 i7 S: x; X, F#define  PTCMD_ADDR   0x01E27120  ' @( [/ Z  z2 K# _( R) N, S/ a7 A1 k
#define  MDCTL15_ADDR 0x01E27A3C
! d5 N( G* K; w) T#define  PDCTL1_ADDR  0x01E27304
# W. L2 |6 {/ `/ D% q//GPIO8 direction
8 f6 j& O$ D6 A( W#define GPIO8_DIRECT  0x01E260B0
& @# z& U  j$ V' }- L/ y#define GPIO8_OUT     0x01E260B4  u6 _- }( W! i. o1 \
#define GPIO8_IN     0x01E260C0+ c6 ?  z! t/ u+ v9 h/ [1 [
- }# z+ Y9 }* P8 `7 U$ j: F
//#define MCBSP1_RINT    99              
5 ?3 c) O  V0 r7 E" E  M  `) g//#define MCBSP1_XINT    100  
/ W% K' {. I% T: estatic int MCBSP_MAJOR=239;
% ~7 o& x' M; O- r& r; Rstatic int MCBSP_MINOR=0;
0 X: E  x' _! V) N  Pstatic int count =1;
1 k; X$ j& y2 ?+ b$ Q/ I) C* J" F/ K: D, ~
#define MCBSP_NAME  "MCBSP-device", }3 x! Z( ~/ s. x+ o' m0 _: c

; v3 t. v- W0 H  m4 L6 Cstatic struct cdev *mcbsp_cdev;
0 ~% {/ b4 y( U6 \' Tstatic struct class *mcbsp_class;
5 k: }( X+ L6 k: i% Sstatic dev_t mcbsp_dev;
% L( f' G+ }* \/ cunsigned int DRR_data;* |: Q0 b; a1 m$ x% x" s* h
unsigned int DXR_data;
  j/ b8 l3 _5 c  Y& v, K3 u) rstatic int mcbsp_open(struct inode *inode,struct file *file)/ C! y& o# f. ?% P
{
5 d; b8 V  }6 h   6 @, B3 P6 q9 @" L/ H& i
   //interrupt enable,initialized6 v" h" V/ ]. i$ U0 R' ?. F( p! c8 l' q
   unsigned int temp;
6 @9 k* a, b* Q- Z) h   //SLEEP_EN(GPIO8[10])---0
, M/ a- v* \# K/ y# l   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: K5 ~. Z) v9 P/ a  A9 N" t" O   temp=temp&(~0x00000400);
& d( L' e2 Q4 f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 B9 W/ E4 u& J3 n
  //RESETn(GPIO8[8])----0----1/ p9 j- V" t2 L9 u+ h* O
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 }+ ~% l# q/ h1 C   temp=temp&(~0x00000100);" ^/ h2 q7 w- s* `- M
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( V6 J9 y9 f0 L, y, m6 b+ ^" _
   udelay(100);$ X: l* `  D3 g
   temp=temp| 0x00000100;- M( O; r. f0 \% ]! s1 A0 B: @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ A! \+ w6 @+ f$ _9 J" R6 Z
   udelay(100);3 |# d% c$ A! r! b
   printk("open success!\n");$ f9 J" c0 n2 g4 E4 ]6 R8 N. ?$ o
   return 0;
7 j9 E1 O) Z% y7 w) j- @% a}' u/ k. K0 B/ z+ K. t( z

/ o0 I: V6 H$ T. L) B  g' @0 k( Rstatic int mcbsp_release(struct inode *inode,struct file *file)
- U1 ]! ]' d7 g{" P; ]0 ]( l& R' o* p$ ]
   printk("release success!\n");
4 \6 |) I5 p; t& w5 |   return 0;
9 g5 g4 t. d7 H2 X4 b}
0 G* d# v) s( ^
- k* e9 F- z+ F5 W( kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 d5 L0 ], [6 D+ L0 y{$ m4 j3 Z. X7 |* X) ^' E  `" k
    copy_from_user(&DXR_data,buf,len);  {" G9 t( n* v) H* T, R1 A6 I
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. @& H$ U7 J) \9 P9 J# _    return 0;
" d& r: V# Z9 G1 t3 Z( u2 M
3 e* H  H. N/ ?" C}
- P7 S* ]. g9 P# Y% Q
* Y0 H% O- m, S* g* ~- L" kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): A, ?7 u& W  {7 X7 _
{ 5 p3 f  X6 t% W6 j
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' |" c+ \5 a5 h( @   copy_to_user(buf,&DRR_data,len); 2 J9 D$ a0 w( O9 m7 C! u
   return 0;$ s5 n$ e% x% D$ Q( \1 J
}
. F0 q% K$ q4 i/ ?. \$ I9 E
7 |! g% J" _9 u! y% ~* i( c# j
: [) Y( y! l4 h. U7 tstatic struct  file_operations mcbsp_fops=
3 j* `* t% i: \, k! Q{
2 G2 d) S8 [; V8 E8 q9 l! w, T' T   .owner=THIS_MODULE,+ w& y0 d& t2 t# _0 W8 q
   .open=mcbsp_open,
. d1 T9 C. B4 `5 M6 n   .release=mcbsp_release,. }, m. {6 [( d- |' ~
   .write=mcbsp_write,
+ }( d$ J% k! s/ l( f   .read=mcbsp_read,
) G- `" l7 I$ l1 C; K/ M3 C};
3 W$ K0 U: f- B* B- |static int __init MCBSP_init(void)+ t: j3 B6 n- I% r6 A# n& `' f
{4 R- q+ v6 F2 B7 [( w0 P2 C9 ?# X
   int ret;
) f7 B% f. b  M5 R" W& |/ l   unsigned  int   PINMUX1_REG_old;
  @2 F3 w8 p3 U* C1 H+ S   unsigned  int   PINMUX18_REG_old;) L4 w! X9 U# Y6 N6 k
   unsigned  int   PINMUX19_REG_old;
) v  g% A2 f" b. z   unsigned  int   temp;  # H+ o0 m7 I1 p7 _- Q
   if(MCBSP_MAJOR)! V/ x% s( Q* u; D; V" @
   {3 |0 u0 t1 A2 G* E# p+ E- k
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' J" [! o# v( y% f      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& P9 N$ L: i8 W. e& U   }
+ n9 d. O5 r' C* y. v   else2 L# F1 f* H2 R, F6 a0 p
   {# Z+ g  U$ A8 L, v
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! I7 I  h& [; e( U  V5 L
      MCBSP_MAJOR=MAJOR(mcbsp_dev);' s- Y' w  M: y; r
   }  ^& y7 @& M) J' [# A! ^7 b
     m  |7 v% M, }  a/ K8 C
   if(ret<0)  d, a9 j8 k7 Y- @7 N
   {
' u/ B+ }! A( H8 C+ J      printk(KERN_ERR "register chrdev fail!");1 i# r. x7 s8 _8 S6 M$ G4 c  i
      return -1;  x& y- Y* o5 g0 @3 U- V
   }8 y8 G6 c. ]- l: }+ B) z" u
   , l( h' j0 N0 q7 f( J; q7 p
   mcbsp_cdev=cdev_alloc();
# V8 |, N: o5 N; w3 i   
7 G- q! ]- O" z+ |* _   if(mcbsp_cdev!=NULL)2 w6 O! a4 Q3 n  m7 d
   {# Y2 T% E! h- v, z0 I1 m! W# }
      cdev_init(mcbsp_cdev,&mcbsp_fops);
7 z" b9 C! T5 T* W      mcbsp_cdev->ops=&mcbsp_fops;, f- M! Y' Q- i' T
      mcbsp_cdev->owner=THIS_MODULE;2 c, r# y! j3 T6 B* z- B
      ; V1 h$ f9 o/ n
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))  j# ~( K: c! V. I: D! F' `0 d2 H
          printk(KERN_ERR "register cdev fail!");+ M# q" C1 t' T2 j1 _
      else4 ^! I- E$ `+ `0 J  H7 e, E
          printk(KERN_ERR "register success!\n");
" Z# O! `& u/ Z5 ~" S! M+ {   }1 @" U7 A. Q" X. H
   else7 [# _! s9 T$ O3 H7 O* t
   {
7 `1 H8 l9 A4 w, u& [7 K8 M6 B      printk(KERN_ERR "register cdev err!");% o) X1 X" X/ H4 h
      return -1;! D. s$ K9 v# ~
   }
8 w+ b2 T4 w" V, a- E* }   
' K4 X  j% V; C% ?, U3 P' f  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 ^. A) x- A- {9 _6 |. P, g  R9 A6 l   if(IS_ERR(mcbsp_class))
, M& v3 B3 _$ `! q$ k# A3 S   {% W/ T8 {! P( }. P2 y( N4 P6 u% S
      printk(KERN_ERR "register class err!");
; X( G( l5 ^- p   return -1;5 C9 w2 D* b  [3 I8 t
   }
3 V- \0 W) Z9 W) \( S   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# F! @. X: o! T6 v/ ?. W% C( B/ i
   //PSC: q) [3 y1 c9 ]- j$ L4 n! J
   //add Enable MCBSP
& Y8 q2 X" |2 E1 M8 g# R3 S5 O& o   //test
( g* d( e1 E, |2 h  |4 M7 ?0 r   temp = 0x80000003;- P# Q! ^- J8 N  M, D9 |+ v
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; [7 G: z. q5 u6 J" t) `& s6 s! ]
   temp = 0x00000003;4 C4 M6 Q7 k5 m6 \& X
   writel(temp, IO_ADDRESS(PTCMD_ADDR));0 F& C0 [$ R" O; {0 x. o9 s
) }: }) ?. ^" ~9 x& l" D
   temp = 0x001FF201;5 Q2 g- X& \0 F
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 _. I- P# U2 Q4 \) p  i, p" E3 x
   # ~: b/ i$ n$ I4 ]6 X
   //PINMUX  1 f+ c( _1 Z1 Q! B& G. _& z  u! d
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ {% y+ O1 o) p" L5 Q   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
% D. }) V6 \5 s+ N& D2 F8 O, W& G   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   $ h* t9 F  S" A7 f+ p
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 s2 R8 w8 W. t8 T- w
   
* I4 J$ }: ^. Y   //SLEEP_EN,EPR,L138_SHK1,L138_RC
  V( T) u$ v! P  ]5 b. e   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
7 y. m3 @4 [* E8 r3 [6 y  P8 c   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / ]! t# Y. o9 W5 c5 i
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 o* k/ v  o4 B4 Z8 P 3 i9 Q' l. y. k! O8 p
   //RESETn,L138_SHK2
7 U6 B# Z# x  V3 M   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  # y- d, @& L3 R1 F* e
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ( c" V% i2 U+ ~% I" s' @, x
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& I$ Z1 r5 W7 P$ L+ \4 v
! @0 x' i- A) l/ ^' `( U/ x: s
, T. P0 N( A0 l/ _* r3 w$ ^6 Q
  //SPCR Register
3 C! c+ ?) ]7 e  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" A/ n' O( o. `* M. P  temp = 0x03000000;//(DLB=0)% o$ A4 G% d) b& R
// temp = 0x03008000;//(DLB=1)+ E8 T% M3 Q/ P# y  x, p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- O, N- p. n% D8 ~: A3 v2 N  temp = readl(IO_ADDRESS(SPCR_ADDR));3 D* S/ G4 ]1 e' D- S
  printk("temp=%x\n",temp);  i3 q7 x, A4 P! c

* A" f. j+ X) m# \/ {+ t$ i   //PCR Register: I3 i& a, @6 f5 L3 E  Q
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0+ R7 {  A8 O2 I6 V3 X8 \
  // temp = 0x00000F0F;! v6 T5 V  k8 }/ ~0 A* V
  temp = 0x00000B0F;; U( X* ]( j# ]- j
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' Y& z  e1 g1 {; f8 v  temp = readl(IO_ADDRESS(PCR_ADDR));2 @" C* E9 `$ F# S" C
  printk("temp=%x\n",temp);  
' |, O( m0 V+ `# `! n# l   //SRGR Register' D3 Z7 I2 E2 N4 t- W0 U- Z( i
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 m% m+ W5 m6 q- ]! l1 {
//temp = 0x301F000B;
+ T. ~4 y- q. b1 u  O+ a7 |   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. u0 P9 j8 q( f  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 o& i# p6 y. b8 k' u  printk("temp=%x\n",temp);
# N3 `) d( x- A' ^9 T! U( m7 W   //RCR0 L6 E  U' x3 A& s6 Z: L
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 a4 D) a4 {' [1 p
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 Z& b% @0 a. h$ W! e" a
   temp = 0x00440040;$ Q8 N$ r5 w2 x+ t* n) }
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   6 U5 L$ h+ y4 n0 b1 b/ Y
   temp = readl(IO_ADDRESS(RCR_ADDR));. e" Y0 J3 V- g% h0 R5 a
   printk("temp=%x\n",temp);" E1 n1 i8 c9 x! u. {7 }) r# P+ H* u
   //XCR
6 s( w; F! Y) w1 M) t/ i. _  ^   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! z" h, P0 V; g$ e6 C   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 U2 a5 X+ L5 |- s) X5 {3 y! d
   temp = 0x00440040;6 N* ^- W6 C4 M9 ]: K1 s, Y2 A1 m
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 ?0 J, F9 C+ j3 w4 ?, S   temp = readl(IO_ADDRESS(XCR_ADDR));
$ ?6 g5 m4 m" R) `   printk("temp=%x\n",temp);
: k6 V/ B* ^: L3 A6 o! U* t4 X& c  udelay(100);
4 b) U. U) h. O4 L# L% A( G  //SPCR Register
, c! m. T. F! t5 }7 F5 A9 Q: \6 o  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1* [: x5 I4 m7 E9 \9 J* r3 @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- ~  h4 J6 A) Q) O5 ?2 f9 P; F; Q; y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled; a' X- r1 E. e! c
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 o* G( u! v3 n1 m% r# o5 j; Y5 Z9 K
  printk("temp=%x\n",temp);
/ P* n: u5 p6 [. L% a9 o$ h* s. ^  udelay(100);/ A. ]) u: `  }* Q! B
6 p1 i2 c; z  d8 {* G% X4 Z0 G% F
  //set GPIO direction
4 R$ s4 r8 O6 I1 j0 U; f& [( m   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 \# ~% B9 s! m2 B! M/ q   temp = temp | 0x00000100;//EPR----input
3 o3 R9 h# R0 |* Q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ ]' D, x& b- Q: m8 u   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . z+ d$ U$ I9 J- l

  A8 W7 r+ |8 Y" O" j% G5 A" `# n   return 0;
. ~+ T( K+ v6 l; S$ B7 P2 y* Q) z4 [}7 a$ A2 V; K* Z, r) i0 L
static void __exit MCBSP_exit(void)$ l5 \+ `. a8 _3 e+ ?
{( @7 ]# t, ^9 n' h6 l3 g
   printk("mcbsp chrdev exit!\n");
2 m2 w! v' I- S; C; y$ v   cdev_del(mcbsp_cdev);- k& y1 @2 v# [9 G
   unregister_chrdev_region(mcbsp_dev,count);
8 {8 Q) [* @; H, m   device_destroy(mcbsp_class,mcbsp_dev);
- u- N7 @( J7 N6 P1 Y; p   class_destroy(mcbsp_class);
9 a" g. W$ A* a! i: I9 M}
( I, d9 Z* S3 f: O  e, D/ Gmodule_init(MCBSP_init);
: r( C, X1 J  @. C4 R; }module_exit(MCBSP_exit);
4 b( Y8 s7 r0 }# R: q7 D7 V: ~& _+ J' W1 r) L9 h, h
MODULE_LICENSE("GPL");2 C1 z* E1 Q, c7 r" G8 X! `

* N* s' `7 \' {. [我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' R. Z9 v% }, K$ d1 b9 R我的应用层的测试程序如下
7 `2 U+ G0 j. ^" H#include <stdio.h>
& s& ~9 Z& |8 L#include <string.h>
( l7 w4 o( e) G: R6 ]3 g. r#include <fcntl.h>
- W% E9 V: `% t: L* F#include <unistd.h>
6 Q/ x: J; Y7 Y* a6 \8 `* D#include <signal.h>6 b: `* K* f% r6 M
#include <pthread.h>       //线程- T; Z# ^1 ~8 g" P9 _
#include <stdlib.h>' z  T7 M" S- s2 N+ N- ?$ O! _
#include <pcap.h>          //捕获网口数据6 Z, w+ L; p! b/ E7 L! U
#include <semaphore.h>     //信号
1 h% A' W3 O9 b3 e7 e7 u& O#include <sys/types.h>     //消息对列1 A( `. r9 t# ]
#include <sys/ipc.h>       //消息队列
2 I5 Z) v3 X0 v# ?#include <sys/msg.h>       //消息队列
) @3 V8 Q$ K+ i4 x# u7 ?# d; i#include <sys/select.h>
& |* P# b# @1 g8 w- G% g#include <sys/syscall.h>
$ x1 s' d: \3 {' t+ |! V#include <sys/stat.h>2 v0 n1 X! B% Q* I/ `+ ~
#include <sys/mman.h>+ P8 j5 N/ N. c' ]- y! G
#define msleep(x) usleep(1000*x)
/ D) _- p+ [5 _+ }! S, M: V6 S- t5 J
int main()1 P% n& V: `4 B0 s" _1 e
{ 7 J) @+ u' J3 R( u/ @8 w
    //MCBSP,ARM与AMBE2000交互设备
/ X/ ]2 ?& G8 e% T6 ? int fd;1 l' j' H4 p. f- B: a! K- p4 N' x& b
unsigned short data_write = 0x5555;
0 R- Q1 w2 v+ m1 R4 [* u) d unsigned short data_read = 0x00;8 _$ [; h: v" S
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ ]0 R4 h9 ~# }  z/ J. F6 { //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ h) Y' r7 i, \/ ^  ]9 {+ C9 U3 D; \
    # ?4 [( u# u, V, h9 z( [
  if(fd < 0), d1 }3 E7 U  X3 K; Y0 l8 K
  {( H: M8 k' A- Y7 |
     perror("open failed\n");
! B6 J; n3 \5 T" P. N& a, N" a     return -1;
7 K, E* Y- U- i+ N& ]  }, S$ ]) C; H* q, o
  8 V: O2 r! ?" @
  while(1)- ^8 Z9 V1 ?$ i3 d/ H: G; r9 @
  {$ a: ]  w* N3 {0 d
   : w! Y# `0 {) q, o$ S
   //AMBE2000每次读写是24个字为一帧
4 l# H# c7 A- O   //写数据时将数据在底层存储起来,等到中断的时候再发送" j2 n% E! \7 i* v' J" S' D
   //AMBE2000输入数据是以0x13EC开头的
) p8 A& Z/ }( p' R   write(fd,&data_write,sizeof(unsigned short));
3 F' D1 A! d2 I) U/ y4 o   
  A  y9 s6 V) ?5 R# q( m   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( s' i- c  |' i, l0 |, [5 |
   read(fd,&data_read,sizeof(unsigned short));+ D( D* P- G/ j
   : J) c1 Y( l9 I; `- P, T
   if(data_read == 0x13Ec)* V3 z. ~7 U& _8 S& T6 i+ C
   {
* R5 {3 T3 H7 p: L4 p6 \8 F' C4 n   
' {1 `5 W, m/ `, y' w: ?    printf("data_read = %x\n",data_read);4 @1 |2 e/ H2 V! j* q4 m
   }$ u' ^) v. g. _- n
   & L5 J0 l/ b: G* S% l: s
   msleep(10);' @' d) `+ {+ d- a) [9 C. ~
  / {& k* C- ?# U( }
  /*
# J# \' P8 [% [   ioctl(fd,1);   
6 E/ n6 |8 g3 @  L sleep(1);7 R- L% k" @' L, c2 D2 N* s
ioctl(fd,0);
4 e& s( V. a+ D3 F2 ? sleep(1);
# \8 Q2 R& k2 F9 W" U9 ]0 x, ~ */
- F5 O4 T6 s$ O) H6 P) B+ G. s  }   + z( ~' C; h" Y6 W+ A( }
return 0;( v$ Y1 Q8 a( M; M- E7 T! o$ Z8 G

9 z: d' X1 C8 C}& c; J% U9 z9 ^
4 u8 i2 g+ K' z( y
多谢各位指教,谢谢! 急
1 D, y, o* m1 ]9 s
9 _7 S* ]- h. ]$ e- K8 @) @
( K- c, j5 S6 a4 }) C2 ?2 t
6 P3 |$ V8 Z" m  ?! @! ]+ q% |" a' h3 \) e0 R, a4 d) H
) ~0 c/ [2 E4 }, [7 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 04:35 , Processed in 0.050319 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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