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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:   U  }# p7 C3 r! l
/*
# u$ A8 B+ d9 z0 P * Copyright (C) 2009 Texas Instruments Inc
$ t9 @+ T; M; Z  O *7 T" X. h4 }6 U) x" y
* This program is free software; you can redistribute it and/or modify
% l4 d; L+ P: [2 h8 w" R; n$ n * it under the terms of the GNU General Public License as published by
( ?! I  e, A7 ~ * the Free Software Foundation; either version 2 of the License, or: w* X; ^6 D* \! A
* (at your option)any later version.5 s9 S- Y) K$ z5 u: [0 @
** j; v- K3 {1 H5 m9 w
* This program is distributed in the hope that it will be useful,
9 `. C2 _2 V+ x! {% G/ d& Q: c * but WITHOUT ANY WARRANTY; without even the implied warranty of! s8 y; N$ s4 |. Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 t% b: N7 R: Y( c! d: L# b
* GNU General Public License for more details.# z8 U$ V. o4 x; V: l
*
  z7 ~% s8 W; y! a& k * You should have received a copy of the GNU General Public License, h) w8 E; }- Z. u
* along with this program; if not, write to the Free Software. U/ u9 q+ l7 j! C3 \  }
* Foundati- S- u) Q) ]& w6 C" L% u0 |; U3 A
*/
! Q, e: g" o; N1 b  Q: D#include <linux/module.h>2 K: }; a) b; G) Y2 r
#include <linux/init.h>- y' d- U4 ^! g$ s, U
#include <linux/errno.h>6 t9 t. B3 F+ A% g& r( K$ O
#include <linux/types.h>! \4 Z6 T# @; V: H( p8 u
#include <linux/interrupt.h>) C2 c% ^" X6 Q  H7 n
#include <linux/io.h>
) E6 f( ^8 y3 t# e' q+ b" y#include <linux/sysctl.h>& Z+ ]5 O( @+ s# a4 C/ |1 j/ r6 o
#include <linux/mm.h>2 e. \5 Y( l* l# j
#include <linux/delay.h>
$ J) R( A, U( P#include<linux/kernel.h>
$ p3 b, }5 F# ]1 h/ g  X#include<linux/fs.h>
1 w$ R# r2 r( M/ r/ h* N#include<linux/ioctl.h>( Q. \, f; k2 H" }9 S! S
#include<linux/cdev.h>
% D, c4 a" t" q* s#include<linux/kdev_t.h>& L/ s" T" \, f
#include<linux/gpio.h>
# ]0 p  U# A6 n# E  k& Z" L#include <mach/hardware.h>, E! F4 `% w2 J7 e# P( x5 R( e
#include <mach/irqs.h>
4 l" U; H* N/ i2 D8 ]6 `+ @* j0 b
#include <asm/mach-types.h>
7 [: G2 l9 n* x6 |9 a& \8 v/ t! B% b#include <asm/mach/arch.h>- ]( k+ C0 Z7 T0 {, I# g
#include <mach/da8xx.h>6 n1 `- b/ P) a% P
#define  SYSCFG_BASE   0x01c14000: p( U: T+ h  A2 O8 j* Q% L8 _( a
#define  PINMUX1_OFFSET   0x124
6 I9 O' m% Y1 @  S0 ~1 b#define  PINMUX18_OFFSET  0x168
* D3 a, b5 S8 F#define  PINMUX19_OFFSET  0x16c0 b: C5 m8 D& z' ?8 V, q8 e9 N0 H
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 I+ s' y( R9 ^0 a$ o, j8 V#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
# B! F! _& Z# K  n( ~  V& ~0 ?+ e#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR, D: N$ c/ p/ N* r! i) Y5 C
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
! O) \& x9 ~1 N# L1 {. f9 ]7 j#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR# i3 ]" K$ h3 @/ B; f
                           
3 q0 K$ K7 n. d4 o3 H% X3 n#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 u( B3 w* i- m8 ]6 U
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
: N3 s# W1 c. Z( ]; L+ o) V6 @" Q' g//PSC
9 E9 T- G0 _$ D8 n# d#define  PTCMD_ADDR   0x01E27120  
4 r8 a, M. {$ c8 B) _! w#define  MDCTL15_ADDR 0x01E27A3C0 n' K  }8 I- h: j  F
#define  PDCTL1_ADDR  0x01E27304/ m2 B. r' n8 e- [5 C
//GPIO8 direction
  }  O6 F4 I- ^& ~, C1 l#define GPIO8_DIRECT  0x01E260B0
- q- f! u: t4 r$ I#define GPIO8_OUT     0x01E260B4
- R! r5 `" ]3 Q: H) x  ]3 R#define GPIO8_IN     0x01E260C04 P( F  i$ Z' N( X0 l

1 Q; j  ]2 N' Q$ S; S//#define MCBSP1_RINT    99              
* e! K; d; B! o% B' W$ [//#define MCBSP1_XINT    100  + s3 n- {3 ^7 L# ]3 s
static int MCBSP_MAJOR=239;
2 m# g* o9 d9 o5 S" C. D$ L, \static int MCBSP_MINOR=0;
% e& R# |7 p1 r$ T6 H/ Mstatic int count =1;
7 U) S0 K. N8 e% V0 s, E2 Y
- K6 h! R" g7 B  |" p9 y#define MCBSP_NAME  "MCBSP-device"
6 [. h. u" S" P/ U# |' Z
" L$ M2 b, F/ X% Q' \( B8 ~static struct cdev *mcbsp_cdev;/ V) f) g0 [" A
static struct class *mcbsp_class;
, x" v1 H0 R7 O9 r! t% Qstatic dev_t mcbsp_dev;: e1 D) W( q' C+ A+ x8 l
unsigned int DRR_data;
0 r7 E- W2 v$ m, D8 Z' Q9 `6 Tunsigned int DXR_data;0 e3 y* D9 Z# D) b
static int mcbsp_open(struct inode *inode,struct file *file)4 M6 H/ h/ V5 Q1 m! B- G( R; N
{4 k6 P4 Q+ d; j6 e" ^1 ^$ }
   
! o* F, R( I( |" V   //interrupt enable,initialized5 a/ n" V0 i4 l7 r  L
   unsigned int temp;
, m( n3 n9 R0 }, L8 A1 W   //SLEEP_EN(GPIO8[10])---0
% Z. J! B; q$ Z7 x/ ~- g6 v6 U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 h5 C/ ]2 h* z5 E  |
   temp=temp&(~0x00000400);
; w, T, ?; \0 r% u+ k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]: n! y% p2 k) d3 {* a# m0 V
  //RESETn(GPIO8[8])----0----1; I$ w* n8 s/ M$ `7 l$ w
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 [  E; D9 U" J" |5 n" d& [! F   temp=temp&(~0x00000100);" f. I/ m' M. ?! g& o6 ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 W# }- n, q1 ]  f4 W1 U   udelay(100);
5 @! y( h: V' T   temp=temp| 0x00000100;
3 `+ u, R7 o# b8 k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 y( t( X" a$ `, `+ Z   udelay(100);1 q( W7 l* _$ x! o3 t* I; i) `" H
   printk("open success!\n");
* f5 s5 [, v! i4 L1 @   return 0;- }+ ?" L4 @; [5 v" }( e$ I1 ]
}2 T8 k7 ~2 |* ?( C( X) X

" Q& d& P9 {) x8 _# S% tstatic int mcbsp_release(struct inode *inode,struct file *file)1 U7 N' A: p- A- b
{( t* r6 g5 }/ Q% K
   printk("release success!\n");9 g- `# |  @$ b7 ~
   return 0;& f6 J7 c1 D* W/ X5 m- ?4 a# ]
}( ^! x) w" v( w% v3 N

6 I+ w$ v  U7 a8 f: E! C! o/ ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). q3 T. t3 i: ]1 T1 d, i
{
  c1 S; x6 e; l3 Y5 [9 \    copy_from_user(&DXR_data,buf,len);
6 T8 ^+ X* s) ~% F2 l    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
5 j2 [  Q" ]: F! j+ Z" L7 B    return 0;
# t# {" a6 M' K+ M& d 5 K* o. v( I. d7 n% A7 j9 t( n
}
* B3 C. j0 p  l+ Q% ]; L& P' M. J: `+ r
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)+ P+ Y9 |' k7 \, X
{ 8 }* q- R2 N# E4 M. m# K$ ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 A' A, w/ @# X6 w+ l- x* Z; D   copy_to_user(buf,&DRR_data,len); + ?& `* v6 F5 I7 `/ r  Y' d
   return 0;
& @9 n/ }: z. l! L* ]  w5 x}
0 p$ V' j0 S/ S! y& Z
! {0 G- @2 P# k, S+ \0 M: d  M
. f3 O; J. B8 istatic struct  file_operations mcbsp_fops=
7 `: a( W! E7 S* k$ p8 a; D{5 R5 D0 H) S/ c1 C
   .owner=THIS_MODULE,( c5 {; C, g2 s7 D/ X3 y
   .open=mcbsp_open,7 E( p) ]8 R' @2 h3 X. H+ X; {/ s
   .release=mcbsp_release,  z% g8 M( Z5 v! z* f
   .write=mcbsp_write,7 {8 h- @3 Z$ K  n& r  m
   .read=mcbsp_read,
! l% z+ X  N/ _+ R};
4 Q3 f5 K4 [2 z- R8 q6 S, V7 ?1 M' kstatic int __init MCBSP_init(void)( c! Q( ~3 H8 ~7 i/ w- \
{
2 d! W. P: Z/ o0 i' n3 T   int ret;5 g- [1 \8 C0 C7 W& z
   unsigned  int   PINMUX1_REG_old;3 h  A" f( ^' }& m& {9 T
   unsigned  int   PINMUX18_REG_old;
) w1 n3 \9 B, Q6 s% j& \   unsigned  int   PINMUX19_REG_old;- P- s) q% F. v- z; G8 l
   unsigned  int   temp;  3 S9 ?  P9 O2 K, ~  W
   if(MCBSP_MAJOR)) {! e' ~9 F: V2 `% R5 H
   {1 `$ K& n( U  W" T9 L
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 o% E" C9 r7 Z* H
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% {8 @# ~% A+ H- ^   }6 _& \# O' U' _
   else6 D  [( v" K' h( u
   {
- r, c1 I. Z  J0 \# m$ A      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& {4 a+ E* S+ ]- v      MCBSP_MAJOR=MAJOR(mcbsp_dev);# e1 X' t3 ~8 J, }
   }, M  e5 ~$ a4 @* d9 M) C# X
   
$ {" a& b0 J5 k0 t- X9 g   if(ret<0)
; Z/ ?1 a; p+ t6 I   {
/ u2 j# j! K; F- H* g$ h& M      printk(KERN_ERR "register chrdev fail!");
: J$ n2 G# v9 _7 E6 A      return -1;
9 j& h, a- }; a9 C8 U# c- s3 _   }; ^6 r! x+ {/ k0 }8 b* Z
   " C! C! X, C0 e4 ]
   mcbsp_cdev=cdev_alloc();
$ m' V; ]* T& q5 ?1 v# h1 P' o   
' d3 f) N! O9 ~5 _+ X# W. d2 X6 G   if(mcbsp_cdev!=NULL)' X* U5 Z4 d% ^0 x8 N
   {
; L, y# M: k/ c# |) o+ y) Y: |      cdev_init(mcbsp_cdev,&mcbsp_fops);& |2 y7 H. X- m
      mcbsp_cdev->ops=&mcbsp_fops;3 x. O- l( e" {; T8 O* P
      mcbsp_cdev->owner=THIS_MODULE;. @- M! h" C* k# A. O
      
5 U# D+ j2 W+ y; x      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& ~, m, T9 k  H( d          printk(KERN_ERR "register cdev fail!");, \6 }% j; C2 W  w8 z+ ~
      else: S9 [: ?/ ~: ?+ Y+ e
          printk(KERN_ERR "register success!\n");
, M. R, ?3 W) i/ E7 R   }5 ?' p( {: h: |2 G
   else
9 F) L9 a# w( b- X   {$ D0 [3 W' N9 w3 M
      printk(KERN_ERR "register cdev err!");
/ J4 [# A9 Y( r7 |/ i      return -1;- D' I1 p( P0 ]! e* g
   }
2 H9 V7 |  p3 L) u0 h   # j, x( _6 H- r3 K: a* ^% r
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& K% T1 c6 ~$ _. U
   if(IS_ERR(mcbsp_class)), i! T9 [& f: ?1 y0 \( p6 h
   {8 S$ [' M3 p. t, x
      printk(KERN_ERR "register class err!");
, K( s' @4 q* A" `   return -1;
9 G# I" }# Y2 R/ H: D* y   }
: ~1 B8 G% |' Y. }* f; y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- q9 Y8 t: I/ m& o
+ N  x. r( B1 O   //PSC$ @6 k% w1 J  ?! f. }* d# B, }6 ]
   //add Enable MCBSP( f8 d: D/ V4 u
   //test
; z/ x6 M8 j. ^   temp = 0x80000003;8 H. u+ X: Z7 e' `$ g+ x8 M
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 ~# x6 V" b4 U3 A8 q. ~, `
   temp = 0x00000003;
2 i# }$ u/ `" D8 a   writel(temp, IO_ADDRESS(PTCMD_ADDR));
% y9 X9 {, d) D6 Y; D! [ / i3 G4 e& I) }6 ~4 q! V3 P
   temp = 0x001FF201;' A. e. j6 r$ A* w' l( o% I# Z
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
, Y3 g2 ~+ k/ r  w) g   ! H7 t/ l! c9 G
   //PINMUX    l- F. B: i1 L# n7 G7 [
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. w* g; J8 z& B2 c2 l) G
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 }: |- V: p, Z2 ~
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & n- ]5 _" Z9 s  `: s
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ v, P: z- f! X6 W: V   
5 ]" j/ _4 a+ R0 ]+ o( P- D   //SLEEP_EN,EPR,L138_SHK1,L138_RC
1 o# o& `7 c- h- t* b: G. z- l3 {# m2 l   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
$ t/ M8 c0 T; y   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% F! u* ?' p8 t$ c2 G: P3 Z   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ q. s6 T) R0 q
; W, F2 W. d9 o) @9 I) L   //RESETn,L138_SHK2
, ~' ^9 j* m! b4 ]   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! Z6 c$ e6 v: a8 i; Y5 B' }% i1 x   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   & ?4 v; u; x7 X2 e# B( ?5 |
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; ?5 |5 X, l1 v8 L

) c$ w7 G0 G' O. m
) u* r) J4 b, x  //SPCR Register& @; d, ^8 e  J. q+ Y: t  w1 e  ]
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- y9 p" J4 b& j, l( _" A% ~
  temp = 0x03000000;//(DLB=0)
5 S; ^& B) n, O3 e // temp = 0x03008000;//(DLB=1)
0 g# H  R7 v% s8 V) I0 L  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, w. i3 @1 q: O5 q3 D  temp = readl(IO_ADDRESS(SPCR_ADDR));- b- P( ~4 H& Q% _7 Q
  printk("temp=%x\n",temp);
# z5 t8 t$ _5 M( c
* j0 V7 m0 k* |( j" f8 _: n* r   //PCR Register7 S; d- g0 R1 ]- C( x4 m
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: O$ h% M% v, q; R6 I7 U3 Q
  // temp = 0x00000F0F;
0 j0 Q) t) t$ A6 M, c* f  temp = 0x00000B0F;1 ~6 Y  {4 |  w; u8 @7 m
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
; O3 X( g3 O; P7 E. {) s  temp = readl(IO_ADDRESS(PCR_ADDR));! B( T  [: H9 C/ s" s, k
  printk("temp=%x\n",temp);  # k* o3 i9 ^8 C+ J
   //SRGR Register3 n7 B6 [8 x5 X" U9 e# N/ M: B5 T
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 c( f4 n5 j% P. T& a8 o
//temp = 0x301F000B;
- h6 Q: _7 K4 C# g: g* e+ b   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
) N$ @0 m$ X: N3 ^8 I  temp = readl(IO_ADDRESS(SRGR_ADDR));$ E" Q% z1 Z) l3 V7 @! x; B% g
  printk("temp=%x\n",temp);9 w, k! L# b1 ~2 l
   //RCR
+ `( d2 f0 q0 b+ ~8 F- H   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 q  e/ @. U  ]1 M0 j3 @
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" c( L9 }( X7 S( C. x$ L2 t
   temp = 0x00440040;
; W* K4 [0 z, w  t" }- t   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& m6 [+ Y# H: S5 m2 C8 y5 d2 L! j   temp = readl(IO_ADDRESS(RCR_ADDR));7 V1 j2 |+ C/ g6 T( z1 H# z
   printk("temp=%x\n",temp);
4 ]$ n5 T& y, V5 U. b   //XCR
" u3 E) L* p* c( W: `8 i+ e/ L   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 L0 w+ [7 M8 N' N9 g/ p
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% s9 n# O, z% ]% D" T
   temp = 0x00440040;- Y' h, O$ H; x" `
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " I% T' Q' v- i- p  W2 a
   temp = readl(IO_ADDRESS(XCR_ADDR));
) T) D/ }/ ~' E" W   printk("temp=%x\n",temp);: @  m/ k1 C! e% p5 {! }' Y
  udelay(100);
$ r, H6 R/ H0 w( b6 I' w" Z  //SPCR Register5 r4 ~/ P# Y. e( r& d6 _6 Q
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1+ K, K/ v7 {- a8 H
  temp = 0x03C10001;   //DLB = 0 VS DLB = 11 s7 P7 P5 L3 ?" K) `/ g
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 @/ G' t* F# b0 |. W  temp = readl(IO_ADDRESS(SPCR_ADDR));
4 p# K% n7 d& L: S/ b  printk("temp=%x\n",temp);
6 N9 u# m6 S( W. l  udelay(100);
6 F/ B6 ~! ?8 p- {  x- u+ z
0 x0 e" j' J% {2 B  p, }4 }2 c  //set GPIO direction$ o& N; E# H8 M* ?9 h" _% s
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- H/ G, x+ y! M: i   temp = temp | 0x00000100;//EPR----input. R6 A( J; N6 t: b, t# X0 _; W4 g# c
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 n1 ^) z6 R7 j  Z, Q& \   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- A- h: g  }2 }. M; x1 N) J
7 s5 W, H+ R; Q, F$ ~4 d   return 0;# W$ {, ?0 N2 C: P' d* G; n1 o+ I5 Q
}
2 w% p; l: a4 [4 v  m" ?static void __exit MCBSP_exit(void)
: d' Y# `, M7 n- S7 s; m& K$ O2 q{3 q9 N$ n9 I( a$ S
   printk("mcbsp chrdev exit!\n");
; x: Y# P5 \6 |0 s   cdev_del(mcbsp_cdev);9 s+ \* U0 r2 f0 Z1 P2 `- }
   unregister_chrdev_region(mcbsp_dev,count);+ `) w) I% o: C. ?
   device_destroy(mcbsp_class,mcbsp_dev);( s8 q1 L& J: P6 ^* N2 F  }1 B! e2 S
   class_destroy(mcbsp_class);
  w: ?6 o5 W2 a4 Y* x}0 g0 U' M, H% e3 O0 `9 Q  k
module_init(MCBSP_init);2 ~/ m: N8 B6 Q# \2 C# N1 F
module_exit(MCBSP_exit);
: c! ^: ]4 ?( S
  i3 S$ ^4 {3 D( B2 D: G5 jMODULE_LICENSE("GPL");
% }1 _! t, v7 ^8 ?( U* L" \0 z/ @4 g8 `
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* q$ c* q  v5 v2 E: L我的应用层的测试程序如下
7 J+ k3 p8 I6 m$ u' e#include <stdio.h>
7 `( k( w( l, @- H1 g/ H9 b0 ]& ~#include <string.h>& ]/ Q, w, h7 s! ~5 [" i+ f+ J% N* `$ t
#include <fcntl.h>: _, J6 g' G+ I9 E, W9 q& q
#include <unistd.h>* `* D! |  s5 B: D$ U
#include <signal.h>
8 }, ^: a: |. A  _. C#include <pthread.h>       //线程: ^6 f& F& [& A4 [% b. z: N4 n
#include <stdlib.h># W# Y4 \& J) Z9 \+ Z. Z% M
#include <pcap.h>          //捕获网口数据  Y2 i* x2 G  T" Y- G' T: p' \# K- G
#include <semaphore.h>     //信号
' }% d# X6 u1 b! c# ~#include <sys/types.h>     //消息对列6 w& c( N$ J) ~- v- Y; J* l
#include <sys/ipc.h>       //消息队列- B' D% g, M; Z
#include <sys/msg.h>       //消息队列. H6 E% i' V5 g& c4 J
#include <sys/select.h>) l  M4 S  i! s3 O+ x% J
#include <sys/syscall.h>
8 U" O' W# J1 y6 X' K! P- Q! m#include <sys/stat.h>
0 r% \6 l: ^7 X* s; f#include <sys/mman.h>
3 ^1 z- |: b1 I# Y. L+ l#define msleep(x) usleep(1000*x)! \  t3 X) r* Q3 ^9 a& m8 H
& W: n2 |! N9 H2 z/ G7 z
int main()
; x" B8 ?: R4 g{
; N: R; I% K5 z% l2 r    //MCBSP,ARM与AMBE2000交互设备
7 Z. W4 q9 H- F) W8 U6 @+ y9 c% i int fd;
! B% J7 N% ]( ]# R- K# C unsigned short data_write = 0x5555;
- U  t% H: N9 F6 I' h+ Q unsigned short data_read = 0x00;
/ p/ R% k' s3 B  b: M2 M& K" F  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 ?7 }* {/ i  j2 ?; |6 p, K+ j1 G //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( Z9 c6 {4 \1 x. s6 E5 Z3 ~8 S
   
: b- x8 x" w, B( o. a# l( q  if(fd < 0)
5 z# a/ k" X! a5 e% L' ^  {
2 G0 a+ V& A3 j. m, n     perror("open failed\n");7 M  l  F9 M$ h8 I, G$ q" {  G
     return -1;
5 ~5 Q& k4 _  ~( O  r9 m# u  F' c  }/ |' o- p: Q3 L( C' K
  
8 R! k) Q' K, V5 V& b4 X' z% T. L  while(1)9 e6 r$ T# g: h% K) l6 d; N- K
  {/ H; Z+ j) x5 p9 v7 _9 ~6 }
   
9 a) t% C. Z) `; B" p' H6 @7 f. e! c   //AMBE2000每次读写是24个字为一帧
9 D: H: ~  @* o7 o, u, f   //写数据时将数据在底层存储起来,等到中断的时候再发送
# ?8 h+ {( O4 x   //AMBE2000输入数据是以0x13EC开头的" r7 }. d% G6 w9 G* Z7 o
   write(fd,&data_write,sizeof(unsigned short));0 f# p( [  @1 F  {  c
   # r9 W% O' k0 R8 a; v7 z
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  , c# h8 a5 |* t: s8 p( t
   read(fd,&data_read,sizeof(unsigned short));! Q# d# R. H* U; E  C
   
& w2 S. r4 }8 Y& O3 y* I$ N' |   if(data_read == 0x13Ec)
  m6 Y8 m, e$ x: H* s   {
' s1 B2 ~8 F9 x) e   ' \" ?! r, n1 H& F3 m8 o2 h
    printf("data_read = %x\n",data_read);4 \; U, ]( A$ s2 }" X$ h
   }
. Z" u6 u9 E* G# I   $ w' m1 |# Y* K# U, I. W  M
   msleep(10);
" J: {0 g% F2 ~. k  ) j, \* }  Q2 v9 u9 ^9 \
  /*/ y8 z8 L3 o2 E* H: n
   ioctl(fd,1);   
! f" h1 S  Y# |: Z9 ]: M sleep(1);
% k6 l) d. r: r0 u ioctl(fd,0);
- v# y  u+ c9 U" ~( y sleep(1);; _" r# `5 K7 X
*/
+ v  |+ }: R, R7 ^  }   ' k  l6 m  g, b  E$ q
return 0;8 z5 p& p5 i5 A' v) {* O

* G+ ~! F3 @6 C" s- q1 L}
  i% g% C. @! U" [" h
! M$ L& j& D4 @2 p( |! b3 ]多谢各位指教,谢谢! 急
$ E! B6 \$ {, @) N/ X; `! j5 j! t. b5 g' U' a" v0 F2 z

, q4 |- g9 \% ^9 M, }/ p2 V& E- k
  a: o7 B/ \, l: K9 I
. L) z$ K# H% J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 04:38 , Processed in 0.048311 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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