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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 0 k' t$ `! {! ]( f' z0 k) u
/*6 f8 y0 i5 V! q9 G. h4 {
* Copyright (C) 2009 Texas Instruments Inc. ~6 k" I: G7 W4 |3 d; j8 D
** a' x0 F" _: @; t
* This program is free software; you can redistribute it and/or modify
' E8 r3 g* t- ~8 f * it under the terms of the GNU General Public License as published by
  I4 g: _9 k' c1 m# v * the Free Software Foundation; either version 2 of the License, or
) z+ f' N/ ^2 t' \8 Y * (at your option)any later version.
! M# d8 d6 w+ H  R *
/ _, c' [+ m/ x# z! J8 ~ * This program is distributed in the hope that it will be useful,
3 m# w6 B2 V) G# m6 d. ?: y3 r * but WITHOUT ANY WARRANTY; without even the implied warranty of  T  x9 m' `' K
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" f: x8 H! f. P& | * GNU General Public License for more details.) Y2 B0 Y9 L' s4 i# B
*
& l4 k6 t6 {! f  a9 F& \, w9 w. r * You should have received a copy of the GNU General Public License
; G4 V! J- [) W * along with this program; if not, write to the Free Software, K  M$ w  D5 u; r  u
* Foundati' W$ I$ g9 |& o7 V* Y7 f
*/0 b& I% `" ]$ l6 ~
#include <linux/module.h>
) X& ?" X3 t. W. k9 W#include <linux/init.h>1 b- e  o0 [% l( R' }0 m! P7 a
#include <linux/errno.h>
) x# w9 X% {2 O# G' s- ]#include <linux/types.h># B4 W3 h' G/ F0 S5 P( n5 z8 J$ v
#include <linux/interrupt.h>
  w. m  y7 i6 P9 t) f$ z2 s- A8 M#include <linux/io.h>& p; o8 j3 z! m4 V1 Q6 `
#include <linux/sysctl.h>; |  J! O* W- r3 u2 e5 B" K
#include <linux/mm.h># ]. v" R8 @. X$ G% C% F
#include <linux/delay.h>/ w' A# \; W2 S8 c# t2 @, \
#include<linux/kernel.h>! n! @1 Y8 @+ G# O7 b
#include<linux/fs.h>( ^$ e7 d1 e; t! X3 O
#include<linux/ioctl.h>
! }) F1 v5 E4 k0 `# ~#include<linux/cdev.h>7 U9 T) Q' S. l2 U
#include<linux/kdev_t.h>, t3 l/ K3 g! T, Y! S+ a& D
#include<linux/gpio.h>0 C+ b8 @3 p% u  ~
#include <mach/hardware.h>1 Y  W0 R9 l  y+ F/ z+ Q8 ]% ^) ?
#include <mach/irqs.h>1 ~+ z, F7 G! S1 c
  P+ i: J+ P9 @( K  \" u
#include <asm/mach-types.h>
( x9 b% c. {' l2 A9 j1 v6 L) r#include <asm/mach/arch.h>
  {4 i  w: t" z: N# y2 o1 Q4 c( h1 j#include <mach/da8xx.h>
* B# A, L' P* i% \#define  SYSCFG_BASE   0x01c14000
2 J" b7 e% i9 ]& Y/ M1 B5 P#define  PINMUX1_OFFSET   0x124 6 K1 O- W6 O- D- H
#define  PINMUX18_OFFSET  0x168
, x8 Z! g3 Q5 E: L( G" a#define  PINMUX19_OFFSET  0x16c
: y0 M# N8 U7 l! Z3 r#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: x3 V$ u6 Q: ~#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
; w2 @3 U# o( L. n$ m#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR, P+ g4 r  g8 h) H) A
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR( {+ V- \9 l7 K& P& j
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR! W* r) t& q+ G) |$ @( ?
                            1 b. m/ H7 I6 v: O" g
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
# R% |% q; V0 ?  s  A5 m#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
. Y* n! v$ y) Q9 _( J//PSC" L6 M0 [4 o- P0 U/ F+ X6 D5 H
#define  PTCMD_ADDR   0x01E27120  
, v4 u9 J# B: X& i7 o" m0 r#define  MDCTL15_ADDR 0x01E27A3C6 B# N; R1 n- {& w9 H
#define  PDCTL1_ADDR  0x01E273045 |3 Z1 X8 v/ T7 [  r
//GPIO8 direction( X; N6 B; l4 y9 w
#define GPIO8_DIRECT  0x01E260B0
1 R/ e6 O. z+ C% H, a, y; T0 j#define GPIO8_OUT     0x01E260B4
; K, A1 D3 ^7 N# y5 H" B- }  m#define GPIO8_IN     0x01E260C0
3 T4 \( u+ V* X( ~/ N  w) ~; t* Z  |6 D' ^: f+ p
//#define MCBSP1_RINT    99              ) r( A- z7 h- q+ a
//#define MCBSP1_XINT    100  
! v0 x; j9 N% ~' bstatic int MCBSP_MAJOR=239;3 M+ i' K4 |- R: q
static int MCBSP_MINOR=0;
; K" u+ Z8 D6 D% U$ W0 _$ \3 v1 ~static int count =1;( z# T9 B( ]& G- u& Q
0 G: _$ ~4 H$ e2 O4 P  g/ h
#define MCBSP_NAME  "MCBSP-device"
7 o$ H! g4 j3 m% d8 m  H/ p
5 ?% a5 d6 V7 S. u$ j3 k( Dstatic struct cdev *mcbsp_cdev;( P' J! H! H4 a5 ?- S& P1 b
static struct class *mcbsp_class;
4 m4 \& ~$ J) j$ ]8 P3 hstatic dev_t mcbsp_dev;" B- o6 ]1 h) d% z
unsigned int DRR_data;# X  |3 T+ T  _1 n, G
unsigned int DXR_data;$ H3 v9 V, @; k( t$ ?# G4 d& Z/ L' }
static int mcbsp_open(struct inode *inode,struct file *file)
0 u% M4 \9 o. k1 }( i{6 Z- M& z+ D9 r) I2 z9 V( O
   , B1 J* g: X9 @' s
   //interrupt enable,initialized
/ K* \" G  k- R+ Q  ]   unsigned int temp;# L) Q) K" D  ~, H, m& A
   //SLEEP_EN(GPIO8[10])---0/ M+ H! H: E. V9 ^  E/ o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 j! o2 _9 o3 N3 K6 z+ Z+ z   temp=temp&(~0x00000400);. w2 L% n6 t8 q9 d% W, P; y1 h+ C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; ^* ]* Z& U; y1 n" ?
  //RESETn(GPIO8[8])----0----1. _( @( ?' n& Q7 C" `2 w% q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 t% X3 {* O, ?- ~/ ^6 v
   temp=temp&(~0x00000100);0 I9 Z3 X8 Q: S# w
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0# }* B5 N; {  Z7 l8 N2 V1 Z+ k6 k+ \
   udelay(100);  K; I" ]0 V7 }& P6 U* e( c% X) b
   temp=temp| 0x00000100;
. M5 H" d" b! n& l2 F. U" [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ X5 ^3 x5 ?! }   udelay(100);0 \$ Y  w4 [( ^$ |; H1 G. u
   printk("open success!\n");
8 v2 X5 D0 {& X: W  x" B   return 0;
( w' i: I* o# A6 r& c# O6 G}' r8 C  G( X+ C( O( A
+ u* R! y0 e: P+ y$ h( M# E
static int mcbsp_release(struct inode *inode,struct file *file)
- T# t  Q# U9 E; R{) x, p5 l4 |2 n+ f8 u
   printk("release success!\n");
. T/ N0 s  G+ V/ J   return 0;
) r: c1 o% f0 J7 B7 d+ Z}: l; j; R9 Y7 `; g! C

4 g; C, ~  \4 {) A1 j' Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)7 G4 s& [$ ~! I$ [2 {
{
. ]% q7 m; {8 Q    copy_from_user(&DXR_data,buf,len);
- u' }  ?9 Y, w2 w7 p3 n$ w2 H6 G    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       % ^) u/ q! n8 u8 }
    return 0;
" ?: W$ o* J$ i8 w 0 e% K  G2 r0 @5 a) M4 L
}
  k& r; G* t% e. u+ R4 M" d3 y7 E( o! g) X" W/ u) `( ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)8 [3 ^* _7 X2 q% p5 [+ T% G3 Z
{ , k/ `" T+ Z2 _$ S  z; `
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 H0 V. C, |3 c9 N- ^* O( f4 F   copy_to_user(buf,&DRR_data,len);
# T) u% v# l& W5 v, n& ?   return 0;
3 Z  v6 f8 E- E, ?: ?}; C  ~0 `; |: K; O& e3 j
% K3 k5 V, e8 G- B6 D' m

  d8 w9 T: p$ D5 S: B. Z7 X: G4 i0 astatic struct  file_operations mcbsp_fops=
8 T1 U5 |2 f( t3 U3 L8 d{; \6 g8 f# t; R7 ~, Y, x
   .owner=THIS_MODULE,
  ~" L/ u2 P1 M4 R. i: N( V, |& V   .open=mcbsp_open," {) p" H1 t8 X4 J7 w7 D& B
   .release=mcbsp_release,/ z% q$ A" W; I# h; V4 _
   .write=mcbsp_write,
" X9 C& F/ i: t0 D; _  `* P   .read=mcbsp_read,
2 A7 Q+ Y: [( P8 q- |! P' o' J};
% m) k. H9 Z4 E% o# Tstatic int __init MCBSP_init(void)
( h; n, h) B5 A& `: \{
6 T: c2 m9 @% N6 W/ B7 w   int ret;, m) S/ g  O3 S8 k+ j# w) @- e' Z
   unsigned  int   PINMUX1_REG_old;
# \- y" i* L5 j) j1 \/ j   unsigned  int   PINMUX18_REG_old;
, `5 x) E, j9 W# I& F# a   unsigned  int   PINMUX19_REG_old;
+ b4 ^  [% {5 _9 y   unsigned  int   temp;  
8 w5 R5 {; ^2 }3 _  V6 b. d   if(MCBSP_MAJOR)! g( X, m7 k( v6 g" l6 @
   {2 Q) i6 g! D8 q) O& ?! ^, R
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 a+ Q% z! T  Q6 h5 ^2 |: ?: d) u
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! E7 R. e+ G# f1 z
   }0 G+ o1 O/ x! I/ p0 L* d$ u
   else# T# @, q& \9 l+ |9 x3 O1 X
   {
; U/ [* q# r8 K8 K0 C6 r      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; _! d" R3 j& p+ A7 Y! o: L( I7 L
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
* |2 L" x+ Q* Q9 n; ]2 m, ^# {   }
% z1 N' Y& k& t+ G4 H  w6 d   
7 ]3 D, B0 E3 D" w2 \   if(ret<0)
& a9 k9 u& I+ S, c   {
# v, X* y  q# [* d$ p6 n1 J      printk(KERN_ERR "register chrdev fail!");
/ u- C# }5 w- x( V      return -1;2 u5 g4 a8 I- \/ y
   }
8 |2 z$ D( c5 T0 m' n   " b' Z' ]+ b# B. w
   mcbsp_cdev=cdev_alloc();
6 t3 \5 j+ [* H# ~. D   6 R3 O0 L! Q: W
   if(mcbsp_cdev!=NULL); g& a- s* l9 I( w' P. K
   {
0 h) L' j& E( q, \      cdev_init(mcbsp_cdev,&mcbsp_fops);: B: J2 L- t- h3 N# j5 p# m9 g0 C
      mcbsp_cdev->ops=&mcbsp_fops;$ }, W0 K! k3 V" f. m+ v
      mcbsp_cdev->owner=THIS_MODULE;9 u* g7 {* }4 Q% `  a5 w4 @
      ( h( q* U. q* L. M% s+ d6 {
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# `5 M5 x0 P, W3 H. d8 y" W
          printk(KERN_ERR "register cdev fail!");
$ |9 I) s+ r8 G+ h# T+ F" I% o      else
" ~) y4 P+ y' s          printk(KERN_ERR "register success!\n");
$ o6 b; W! E- F. K7 E   }: W$ z6 [* m  V2 {0 \8 c/ S, r9 Z6 J
   else( i$ o5 L- _, }( C
   {
9 q; W0 d, E. u# M8 u; @9 l      printk(KERN_ERR "register cdev err!");
  v+ B# Z# F9 m/ V0 U      return -1;
- y2 u% S6 y) J3 [   }1 P4 ~* E; n) }) Q. O
   7 y9 @0 I/ {: ?5 b5 h( _$ {
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! P3 ^* H" l$ |: Y  a
   if(IS_ERR(mcbsp_class))( F" ?! [) {9 u! S# Q# p6 ^
   {! i7 k3 M- j, M7 L
      printk(KERN_ERR "register class err!");
2 C; Z& }% g# ]( a9 A   return -1;6 Y' @3 e9 w1 K7 _
   }
7 Y  e* S' _4 q2 u( Q   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 {) z0 v( i4 _: d4 B

6 ?2 e2 `% P$ r* ]5 I  ?4 A   //PSC, _6 h; z- f5 A7 v
   //add Enable MCBSP2 t7 E" P) |& |- k) _3 s* c
   //test
( V8 {3 r6 L8 L2 B   temp = 0x80000003;  i; |! n, f. J5 X, ?
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! p. R) ?9 L4 P, g$ V. E   temp = 0x00000003;
7 L, C! u) X" T$ M0 k8 l   writel(temp, IO_ADDRESS(PTCMD_ADDR));
% @* `0 j. h+ ?; l( p$ N# F, i' M
9 {4 k) \: ^1 J% g) ^   temp = 0x001FF201;1 _& O; O0 c. i$ X  u
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));& ]8 F: X8 F# x. X8 L& z
   & ~, r  g) l' x5 t
   //PINMUX  
2 m1 \' R) d; F/ K7 A   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; D! \; A; D. I( r  s   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  & e1 [) e; r0 @8 J' i2 A# Y
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   * l, C% h& w8 E8 h% N- I' `& m: s
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 X' ]4 I: ]5 W) P% f$ m, G   
  c/ ]# q/ c" D   //SLEEP_EN,EPR,L138_SHK1,L138_RC% k5 j  P5 J; p% s9 M9 A
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ D( H& }9 R. V% I
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / S# y4 K: e" M( q7 V2 @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: l  m7 Y; s3 m# u( u) i: ]
7 C9 S, M4 ]4 j+ E) D/ t   //RESETn,L138_SHK2
& V2 A5 H3 z& z3 m4 W( ~   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
  y% `( n8 r# Q   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   $ C4 H( J/ g$ C+ h9 u/ q+ ?
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) B8 M; {2 Q* I  W  B# {3 R* G( x
( }' z$ e- I8 M- Y1 A + J$ T' r9 |3 Y& H
  //SPCR Register  N& L6 n+ }, a5 G- c
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ K1 c' p( F# [; y3 e, R
  temp = 0x03000000;//(DLB=0)
0 Y. x" }8 N+ ?0 q  J5 V& J // temp = 0x03008000;//(DLB=1)
8 v( [/ }7 j% S4 l  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
3 l4 Y; z# [* a0 `, `  temp = readl(IO_ADDRESS(SPCR_ADDR));
( O2 Z) W, J  Z0 H5 n, o% g- @4 R* P  printk("temp=%x\n",temp);2 n! G+ G: I$ ~( u, u2 ~
1 d# y2 U) B8 x1 f/ `; V, d
   //PCR Register5 r- D: ?5 R! b0 `9 m& |
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ i- ^  ?# k/ \  J$ c* R# F( e  // temp = 0x00000F0F;. F0 V  ^: C& J' h- e
  temp = 0x00000B0F;5 K- Q6 z$ ?' h) V' W- z  l
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 D2 [- @: O( I1 F* ^  temp = readl(IO_ADDRESS(PCR_ADDR));
: j1 F2 ?' ?8 ^9 B  printk("temp=%x\n",temp);  
2 ^( i4 f% r- X# H& d& b7 z3 P   //SRGR Register
3 l+ }# \2 f/ M1 \. W   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- G( d' j, b" W; Z
//temp = 0x301F000B;
* q8 w6 U# I* F2 W6 r( E* L. S5 X   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   P0 P4 S1 x1 [
  temp = readl(IO_ADDRESS(SRGR_ADDR));$ Z$ Y8 h- d5 w" S
  printk("temp=%x\n",temp);8 {% G/ b) w* H9 _
   //RCR
  n2 n; ]5 F. D" E$ j: Y, W   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, y) U* [1 W8 p7 l
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. U) j+ H4 X" g2 S- ^; P9 m) S5 y
   temp = 0x00440040;
" G, o7 k. n, e  q   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   6 W+ G2 i: }# r! f$ U; O4 S
   temp = readl(IO_ADDRESS(RCR_ADDR));
# \# I) o  C, c/ w; _* }   printk("temp=%x\n",temp);
7 a; a/ i/ g) y   //XCR
; u  Y/ r1 A- s# K   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! w3 I# \  v4 O' G$ t( V
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. D  s+ b' b$ i4 y   temp = 0x00440040;0 |& V1 z, f& Q: D8 h5 l
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   * z$ Q$ z  ~# G& `
   temp = readl(IO_ADDRESS(XCR_ADDR));
3 D( ]1 b+ B5 V& S   printk("temp=%x\n",temp);
2 k$ G& R: E+ R' T- u  udelay(100);& Y8 F! b8 t  Y6 `
  //SPCR Register9 X% }6 T: c% w/ A
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, C: G* f8 {- a+ J+ a  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  [$ C$ C# h* M, W- Z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 {$ E; G) z. R5 p9 X  temp = readl(IO_ADDRESS(SPCR_ADDR));
4 x* n( A7 E8 v. t  h  B; L2 }  printk("temp=%x\n",temp);
/ j. W" ^3 [3 p! |5 t  e  udelay(100);
' V) ^" }; i& S. ]; d5 Z
2 _* d- d* f6 P# R6 P. T. e/ B  //set GPIO direction$ P4 c7 R" c) l' S! W& N* i
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 t8 Q' Z' ]1 b, |$ D# n; c   temp = temp | 0x00000100;//EPR----input
6 H  m, N2 L+ ?   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. L+ U! t1 H9 u7 i1 {
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ u  g8 R) E, }
9 C2 K, v" _0 G4 F# i  _8 j   return 0;
  n. e, Q, F  @}
! E7 h. y( t# istatic void __exit MCBSP_exit(void); N* ^- Y: T! h! g8 i1 \+ u
{
5 C! |/ W, G# C, t; S' X   printk("mcbsp chrdev exit!\n");: V, U" Q& O4 I
   cdev_del(mcbsp_cdev);
) `5 q8 q- _/ C7 f6 d   unregister_chrdev_region(mcbsp_dev,count);6 `  T0 u& L+ ^2 |$ W6 ~9 u( N
   device_destroy(mcbsp_class,mcbsp_dev);0 Z5 f0 m) ?% }2 ^6 {2 A7 q
   class_destroy(mcbsp_class);
4 }3 I* }4 `- |# A$ C) c  o/ n}
, d0 z  ]9 U4 O# @5 Q9 f$ A2 vmodule_init(MCBSP_init);( Y) z* N! ^. O2 A( f9 g% c" H6 \
module_exit(MCBSP_exit);
! R+ T3 k* ^/ ~
2 t4 @6 k% L; l' ~7 }2 ~MODULE_LICENSE("GPL");3 l6 \& C3 c) i3 ~9 h
6 Y; ?" \5 f$ X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
  f* X# C9 @9 s我的应用层的测试程序如下
) t1 l! G6 s. `" i: i/ Y#include <stdio.h>8 D# [% B0 t9 v5 Q  F) W
#include <string.h>
; g/ Z* T/ k; F( m. v#include <fcntl.h>
, V7 C/ x- I5 {#include <unistd.h>
( F0 _, E" O) P* J#include <signal.h>
* H- X/ |7 d9 z7 k- t( m. ], S; G#include <pthread.h>       //线程- N  B/ x( {; \% T# d
#include <stdlib.h>9 M* l# w0 i6 k1 ?% ~
#include <pcap.h>          //捕获网口数据
9 @8 ~. }: s% h3 M! V7 O, t( P1 s#include <semaphore.h>     //信号& c6 B4 f* {! H, L% E
#include <sys/types.h>     //消息对列# M* I+ O# w) r' F& R
#include <sys/ipc.h>       //消息队列
5 A+ ^% l: |7 a* S) v4 S2 c- O; o#include <sys/msg.h>       //消息队列' F2 F1 X( m) |% Q
#include <sys/select.h>% W8 j. P4 l" x
#include <sys/syscall.h>6 m) Z  x# k$ \$ ~7 l9 z2 t
#include <sys/stat.h>
: F( ?3 v# t3 o: B0 r6 N#include <sys/mman.h>5 D: y) S& k. r
#define msleep(x) usleep(1000*x)
5 v3 I( w, x3 f. N
, M# K/ b9 y; V" |- W& K" E2 r, hint main()
2 z: l* t% ~, ^- @0 F{ ( c* Z, a/ I. c6 p1 Z
    //MCBSP,ARM与AMBE2000交互设备
/ d  ]2 L# R6 d* U1 |) I$ F int fd;# e, J; c8 @4 f8 t
unsigned short data_write = 0x5555;
' L0 @' G) o, A, B& R* o% T0 K unsigned short data_read = 0x00;
; C2 f8 }) x& x& v" E/ c  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) A( C% _$ w! b' [+ F# T //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* H) \& x' N/ W( H    . M8 c3 `: O0 W+ o
  if(fd < 0)9 T. q, Q9 s% G4 \4 d( g
  {
3 W. H1 B: D( j( T( m# v' i     perror("open failed\n");& X% `4 ^- T6 g
     return -1;
, s3 B# P9 z8 N3 |2 r% a  }' n) u+ p9 e  v; P# i) N
  
9 ]; m5 t" t2 J2 J8 z# b  while(1); k. }) S$ V7 t0 z4 F) C
  {( }  l0 u2 j0 Z% w- [
   
* o% i7 v- ]# X% t6 ^   //AMBE2000每次读写是24个字为一帧
  F4 R: A+ b, b  J/ R/ \+ u   //写数据时将数据在底层存储起来,等到中断的时候再发送# G- Q" {9 c5 L& }0 K5 t
   //AMBE2000输入数据是以0x13EC开头的' V6 _+ g6 r0 o* e5 I) `  l
   write(fd,&data_write,sizeof(unsigned short));  L6 e2 _( n: P1 u2 r# b
   + [* V# e3 j5 H2 M5 [% k
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  5 E- @# x9 ~; _+ [) m
   read(fd,&data_read,sizeof(unsigned short));
# h+ q- O# k  C, b6 E0 L& R' R   
! t4 Z+ D% x! y$ `4 M4 {5 d   if(data_read == 0x13Ec)( G6 y. V$ |$ z' d  ^& X5 m( ?
   {
. e  N) X: a5 f! G   " d( n! S# V$ S, w$ g
    printf("data_read = %x\n",data_read);
4 ~( V  C! b! Z3 c2 H# O  H  s; B- ?   }
9 X9 I, `! }' P5 k  _  d3 i   ( y( ~6 ?4 F& [+ b+ N; g
   msleep(10);$ b, }; A) C! Z: P6 q. m
  
4 Z7 ~0 q7 N/ u7 w" o  /*
9 J' M/ j6 F3 Q' H* x   ioctl(fd,1);   ! _4 c! G  |) E0 Q; v  p
sleep(1);9 O+ Z4 K# x) r7 M7 H
ioctl(fd,0);: T% d3 l& `$ E
sleep(1);
$ l9 M# z. z2 K) J */ + X! a6 a( ~4 X
  }   . C' n& X1 ^5 G0 a* n! z+ @
return 0;
6 |4 ^! a; y" [# G6 M / o* G; f  \9 n' d1 L- E8 q" N
}: c% |" F% n; M! H1 ~, P
' J! ^$ h7 O( x' E' l
多谢各位指教,谢谢! 急2 X7 ~5 B' r1 `+ H  K* T( Y

- V5 E0 ]8 |8 p8 f& k; c( p" b+ u6 w! B
% p# B( Y2 b* e4 x$ U! S1 N! I0 o
$ c; {7 B0 B& }" o
, V7 I2 S7 g3 E( z4 o8 v$ M% D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 22:46 , Processed in 0.048184 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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