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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - [5 Q. M4 N) {6 A& ?
/*
& U6 U/ E5 k! t3 H * Copyright (C) 2009 Texas Instruments Inc
' Q( ?$ q# l4 X+ ?* S% a5 q *
8 v# K( F/ H! ?! A * This program is free software; you can redistribute it and/or modify. ^) U4 V! c2 ?; k6 \& C5 u
* it under the terms of the GNU General Public License as published by- F' K  f7 O7 b) N0 \! p
* the Free Software Foundation; either version 2 of the License, or8 C' |- r" T5 f" Q: V
* (at your option)any later version.& ^% g& V8 _0 R3 }) I  t& x
*% z+ T; z1 b) ]& \$ G8 `* r
* This program is distributed in the hope that it will be useful,
0 b8 E% p/ Z  b" y+ O2 \ * but WITHOUT ANY WARRANTY; without even the implied warranty of" j& d5 ~- l; }+ W6 \
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ `0 t6 C7 }8 l: _
* GNU General Public License for more details.
" Y! W2 v' {+ k  `# E  d- S' s; G! | *4 e& F% Z9 T. k/ k% F# V) G
* You should have received a copy of the GNU General Public License( Q1 ]1 [0 G$ `) W+ [( S
* along with this program; if not, write to the Free Software1 C/ p# a8 n0 X, A% F' g' G0 F" {
* Foundati
0 D. @4 s6 v- r$ q+ r*/
! Z! |( _& m; z  }8 S#include <linux/module.h>
9 K) I! X6 C, i; a4 E3 k" P#include <linux/init.h>
& K7 f9 _5 x1 @#include <linux/errno.h>
4 B  Z& r% h  ?# Z$ O#include <linux/types.h>9 g2 X; z! F& S8 e- R4 ^
#include <linux/interrupt.h>
! V" x5 Z2 i% L2 G' w7 x+ M#include <linux/io.h>, \2 m4 v% U; b0 n9 e
#include <linux/sysctl.h>
) \  Y2 G8 H/ }2 x, n2 _+ V+ q#include <linux/mm.h>
$ z, E0 ]  s3 @( K#include <linux/delay.h>- `1 k6 X: S! e! v0 a, Z9 {
#include<linux/kernel.h>: L7 o; v4 [( B* e. H' [
#include<linux/fs.h>
6 ?7 i( D7 T  e' `#include<linux/ioctl.h>
  v2 b5 \6 t& X; |* d& [4 \2 U#include<linux/cdev.h>
! K6 E3 b. j" @8 V+ W( g#include<linux/kdev_t.h>( R+ r1 [  o; h9 F- R
#include<linux/gpio.h>
2 P6 ^) Z) w/ ~) S7 J#include <mach/hardware.h>: H% j0 G6 f1 g" ]! K
#include <mach/irqs.h>: t( Q9 o. D. O* }

2 \4 r7 a: ~) H2 {: |6 x#include <asm/mach-types.h>" }7 g: l4 J) w! L' @
#include <asm/mach/arch.h>& B$ M9 y0 ]* p! v% _( M3 K# _
#include <mach/da8xx.h>
1 j& ~& H  y. w( Z: c' U#define  SYSCFG_BASE   0x01c14000
! }3 |. @% ]/ o$ m4 _1 k#define  PINMUX1_OFFSET   0x124 - N( w( R- Y9 x5 q( O
#define  PINMUX18_OFFSET  0x168
" [# F7 @; P) A$ W# J- m- a#define  PINMUX19_OFFSET  0x16c; m& F, i8 F% u
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
; d" Y8 M5 y0 c* Y9 K7 y% _9 x# Y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR5 X" ]7 \9 \8 C( e
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR" _% f3 \7 A, ?0 j: P
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR4 x& d' Y$ t* n1 l* a
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
9 S7 Z5 y/ `# ~+ c                           
+ |& t/ Y0 B: v& O$ S2 Q#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 |" o0 h; B- x! E+ f#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 S5 b$ U6 a5 P/ B. G  N* M9 j, H2 w//PSC! G( d+ D! S! z$ h; i: A- a  a
#define  PTCMD_ADDR   0x01E27120    S/ W; E6 r8 S1 A
#define  MDCTL15_ADDR 0x01E27A3C
9 R' O  x0 H( b. M/ X" J#define  PDCTL1_ADDR  0x01E273044 c' _' b8 c2 [' ]2 o  i
//GPIO8 direction  ^. d1 Q: I1 R, ?& e$ W
#define GPIO8_DIRECT  0x01E260B0
" I# }* |: D' `6 a! N( S* r5 g#define GPIO8_OUT     0x01E260B4% p# ]& o! s% l6 h& P% l; X. c
#define GPIO8_IN     0x01E260C0$ A. i9 n4 t3 E0 y; F1 s
+ i9 R9 c% D2 }7 @# I8 U, }
//#define MCBSP1_RINT    99                T) X( {3 k# Q0 o: H
//#define MCBSP1_XINT    100  
) V* z$ n' ^0 p9 ]: Ustatic int MCBSP_MAJOR=239;0 b" m7 T! n  @* B2 Z
static int MCBSP_MINOR=0;  G& ?& ~8 y' G/ W0 P
static int count =1;
# M+ u  q: p' I) U9 ]7 u& x' G/ `9 S4 g; j' O1 Z' W3 `
#define MCBSP_NAME  "MCBSP-device"
+ X$ c% {. S  D# U$ f/ u2 H
( c% U3 H$ t% P  a. [static struct cdev *mcbsp_cdev;
6 q1 v& }6 |4 h( l- ^( K: J- {static struct class *mcbsp_class;
0 C# }& g6 _3 }3 Wstatic dev_t mcbsp_dev;
, [$ F. s' f0 u4 x# Sunsigned int DRR_data;) e  B+ b( l; l* x
unsigned int DXR_data;
$ [4 a% [; F* e5 ]( pstatic int mcbsp_open(struct inode *inode,struct file *file)
1 }: m7 A  a! H' d. B$ R& G2 h( [{
" t: p. k$ M/ I7 D- I% p   
$ i: J* _9 y; k7 B1 W  E   //interrupt enable,initialized9 H  t4 L6 q. [- S/ E" K! f- n3 L
   unsigned int temp;
/ I& l+ e' x" |4 |- i6 P   //SLEEP_EN(GPIO8[10])---0
3 L9 n+ V2 h+ A, a" ^  Y$ p   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 E4 y: E8 L7 I# r7 A; s& L
   temp=temp&(~0x00000400);
5 K+ \; {: B9 _, `5 A  @# M: j   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% M+ L* Z% i3 W0 q! K" A  //RESETn(GPIO8[8])----0----10 M. H) v+ T5 l+ {2 L) _1 ?. s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& V9 |/ t5 ~) F, r7 U: q( m   temp=temp&(~0x00000100);
; f7 Z3 h# W0 S% ~4 E   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; b6 }+ h- @; \2 }   udelay(100);9 m  h) I0 L: j0 }9 S: K$ r  V( ]; i
   temp=temp| 0x00000100;% ?" j& ?, D7 Q' v# o8 i+ B
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* t% f7 ]6 f, u1 r7 n
   udelay(100);6 X; z# ^# ?( Y8 h7 e7 X
   printk("open success!\n");
% @# Q% a% o! h& e2 B   return 0;
. r+ a% J/ M5 ?+ }8 f9 |. L}
4 S; G% i- ~6 J! |& Q  P6 y+ }, g, n" ?+ H# v6 ], |( H3 Z( V+ J& U
static int mcbsp_release(struct inode *inode,struct file *file)! w: B- x6 M3 C) }( N
{
2 j3 w# Z, _4 H/ f3 H( b- p) I8 d   printk("release success!\n");
* h: j2 s3 J) B& c' V2 Y# E   return 0;& Z$ r  F5 }! B; l( z1 P- ]
}
, V- A4 _+ W( ~4 J3 \5 y
: f2 h! ^7 s$ b1 Y3 }% xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% ]% u* G$ w; S# Q- \: }8 |{
. X) r/ D* r  w+ x, G* E( ^    copy_from_user(&DXR_data,buf,len);5 ^+ C# {/ g. p: r
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
; @, @% I0 G% b  B    return 0;
- S5 G0 ]8 t2 G# F, E
  H$ G: P' ?. q8 b}! e6 p, B9 S5 R- U1 |
) a) F( H/ S1 L2 _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 O6 ~2 g$ p" g5 q2 Y
{
& W% }% v' L( C- V0 r1 W   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ]8 v0 ^0 m- J( e- {8 g9 j   copy_to_user(buf,&DRR_data,len); ) ~  A% V8 G/ }& i3 E$ t. {, U
   return 0;
) I+ D! V  b% F; d}% e8 A$ q" L& }* s

4 r; [2 }' [7 \$ ^/ g- Y: a  Y+ b) J; O8 ^
static struct  file_operations mcbsp_fops=: a0 l' j+ X8 K& a2 M; G4 t% L
{
% E) U2 `$ X. ]- @, ~   .owner=THIS_MODULE,
4 z6 J; h& g; d: R   .open=mcbsp_open,0 p5 K5 t4 q( a, l3 a$ [( y
   .release=mcbsp_release,2 n: G& F6 E% D8 R
   .write=mcbsp_write,
8 T) d$ {9 ]; J5 z% n4 U2 s( E   .read=mcbsp_read,
) o8 [1 v& |& M1 s};
* ~7 `) Z, o6 s! l' `static int __init MCBSP_init(void)
% ?. N  z( \* r8 |6 ~{0 y$ {# z6 R) P4 _2 E
   int ret;6 l) V2 g2 J& I
   unsigned  int   PINMUX1_REG_old;
  R. j( \/ {# T9 h. O& s   unsigned  int   PINMUX18_REG_old;
: X3 O. S% X! J9 ^7 k* b/ W2 {   unsigned  int   PINMUX19_REG_old;
$ W7 p7 L' o6 s; {3 ]  ~* [, ?   unsigned  int   temp;  
, z  ~% H. J, C' c5 D   if(MCBSP_MAJOR)
& C" j3 R; `( C   {& |8 X1 g% ~& y' k
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' u0 h0 ?" S- H$ {1 e+ u; \6 J* ?2 F) F* P      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% T3 F) o. t8 N: u
   }* Q8 {: d6 E7 G' F
   else
  t) O' X, k- a0 Q& |* s   {. T1 N- D5 K) N& x9 J
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);0 u! C, o) n7 f
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 ^; K+ E8 f4 A* o6 b   }
0 H& ^4 ~0 E9 q9 @& d. _8 k# O" p   5 {* l) ^2 w0 b3 e, _" Q7 F" F
   if(ret<0)
' X6 U, p; K8 Q6 r; C; w   {& m1 g" X3 ?% t  n5 o( ^5 l2 _
      printk(KERN_ERR "register chrdev fail!");' [9 |& `- @0 d! ]/ \: t+ f1 Y
      return -1;
+ t3 Y* s7 [- |   }
; @, K" M" f6 U1 P7 i( {. I& ^' q$ A   
8 k: k0 ?( H# X  S' B3 W   mcbsp_cdev=cdev_alloc();
6 N$ H( H! W! O2 B2 U2 V   
6 I6 L6 \& p& V( i! n! X% i4 A  x* L   if(mcbsp_cdev!=NULL)
1 s+ {& R6 {0 k" B# h$ Z   {% W! N2 v% w' e8 y$ ~
      cdev_init(mcbsp_cdev,&mcbsp_fops);
3 B. j/ k! \0 v: z- V1 e      mcbsp_cdev->ops=&mcbsp_fops;
0 H- @7 R' o; r) w: X- l4 [      mcbsp_cdev->owner=THIS_MODULE;
, Z" r$ i; ]8 |! [      ; U2 L5 [( P& B6 ?) N0 D# x. B
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& w  q) z: ?1 g! s. p6 k2 r3 K          printk(KERN_ERR "register cdev fail!");+ q0 E: b* O8 a1 `
      else, h' p$ [) L5 _# g
          printk(KERN_ERR "register success!\n");
( n7 B- {. M: Y1 t   }
2 H2 w& ~2 B7 ]" a   else
, A- i6 {/ [) p! p   {
5 K! S8 E! v: F# b9 t      printk(KERN_ERR "register cdev err!");
* f/ \# [3 ~" l. j$ l      return -1;5 i) j+ A# p& a8 d+ d! X
   }
1 @3 |/ h7 P8 A   . j6 u0 M) H  P& v, A* N/ P
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 w  j- z7 ?# ~" e  |   if(IS_ERR(mcbsp_class))
* X- u; N& S3 M* I; \0 u5 c  ]# O; i! T   {
4 `+ t& V, \; t6 ^/ X      printk(KERN_ERR "register class err!");2 @! K4 Z" K+ Y( R8 Y* i3 Y
   return -1;
) }7 g8 e+ F& M' h   }
2 u; @8 _, }' o4 |" b- X   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 l5 C7 I! p) t1 W& r( X- E- s5 g% K* C1 C' L1 J. @  k
   //PSC
4 R2 _8 W: ~! ~, p  E5 S- \0 Y% @   //add Enable MCBSP8 ~) I' N4 _5 O( I6 j, O  \# w/ N9 D
   //test
/ i( W2 `4 H. N  Y( P4 h   temp = 0x80000003;. w! h) u4 A! ]& k! J
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 p+ _( S7 z8 Z0 b9 ^5 Y6 h, Q9 o
   temp = 0x00000003;
) B' P2 p$ S  v1 ?   writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 e5 A% q& m, s! N9 X' f# g  n' c / |9 N' e7 L, @: L
   temp = 0x001FF201;3 f" Y, z- R1 y. v: p" o* U3 B
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% O& i5 }8 T2 R$ t   
' [; Y7 i0 G1 }   //PINMUX  " z' F/ y: s1 z; {9 T( M
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ ^- i) N! |" z* |! ~
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
- l. U- a, |" A1 [) y6 j2 b   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
3 |2 l4 r8 t& t1 k( `! c   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, Q+ o, ~5 K) V9 J/ I, [/ n. P   1 g0 L  V8 n: P# c" I
   //SLEEP_EN,EPR,L138_SHK1,L138_RC- R8 `8 G5 J% N9 t3 e' Q6 L: p
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
. ?/ |3 d6 |& `( M2 Q: x! X' a' |   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   * K0 p& R; A6 M1 L) h( R
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 R# H/ d+ K6 R, y; }3 z
5 t6 D# N: e: O# y' r0 t   //RESETn,L138_SHK2( p! C  S* O" H8 [) R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 b0 E; x/ ?9 v, U7 i   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
- {, z% J9 B% `' h* ~   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 o  P' {8 D4 Z" ^/ T
3 Q' P. O/ ?' Z

. }8 V& e& U6 J. k! @& ]  //SPCR Register
1 o& ?9 E  z9 K7 V3 Q4 Q1 ?7 J0 [  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ u/ |4 c* T% h+ e
  temp = 0x03000000;//(DLB=0)
" F( c) c( v% v0 a8 x+ } // temp = 0x03008000;//(DLB=1)
0 w$ i# u2 w  d; \9 a8 ^, h; ?/ I  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% I) y. e  }% l7 a0 O- A/ D/ [  temp = readl(IO_ADDRESS(SPCR_ADDR));
& |: x! F" w$ z3 b  H# V  printk("temp=%x\n",temp);3 o6 W+ y, ^/ e) ?& j' t
$ n# A  T/ X5 `  F
   //PCR Register
- [. r# A) E- ^7 [   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* n3 Y7 y: d' _' l+ {  // temp = 0x00000F0F;
4 Y& Z/ x, l! ]4 B: G: Q  temp = 0x00000B0F;
5 M3 ]$ E6 I1 G( g) @) R  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 E- \& |. ?' C+ P" G( I5 W  temp = readl(IO_ADDRESS(PCR_ADDR));
# Y5 }' ]: p+ }  printk("temp=%x\n",temp);  
) t1 e2 _) Y5 ^4 R3 h$ w; I% _   //SRGR Register( ]  Y, ]( I8 f
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 P3 W6 \: Y; r/ f6 M
//temp = 0x301F000B;  H9 s$ h) M" h1 W
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 3 k# \2 ~2 K0 ?" N% P8 m0 v  K
  temp = readl(IO_ADDRESS(SRGR_ADDR));/ A( b& o) e% J$ \( J
  printk("temp=%x\n",temp);( Q; m( \- a* `( Y3 ^8 h6 b9 E
   //RCR
; _9 E# t  {- ~7 f+ b" _   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ r7 @$ N# b; g
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( W0 z5 G/ h# v$ |/ k5 ~   temp = 0x00440040;
0 J* x$ P9 H+ G   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   6 Q' W/ @; l  t9 w2 j
   temp = readl(IO_ADDRESS(RCR_ADDR));& C5 c( S: g# ~: @" s5 d
   printk("temp=%x\n",temp);6 Z. |& D, o+ N. R# f, b
   //XCR
3 n8 l* E9 `2 C& ]8 z9 S  B! u   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# d6 ]* H  l. r
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0+ B. n" p! E3 B$ R9 C1 f  l
   temp = 0x00440040;
) r% k% j6 Z) g   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
5 \, U! A0 X6 \: M% y7 U' }   temp = readl(IO_ADDRESS(XCR_ADDR));
! [7 G, s% Z) T1 G  q, q   printk("temp=%x\n",temp);0 P# S1 T" w, z# g) G) m# s* Y
  udelay(100);
, f* D, x" [( s3 T& s3 a  //SPCR Register0 a6 `7 R" c( `  P
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" [2 b+ X# t' W- p' u, t; }  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" m" X# o0 a7 f# g6 ^9 d1 m+ o) t6 I  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
( C3 b( M5 `/ J3 x% |7 t  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 f" E  E+ y2 s+ @) a" S  printk("temp=%x\n",temp);
  Q$ `. q6 y8 }' f7 r  udelay(100);
1 e5 O: X7 s/ u; g' h9 [1 L; F0 T
0 @. v# K, B3 W9 n  q; F4 t  //set GPIO direction/ l7 z- I- m1 `2 b2 f' ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ d: p& T2 H* o
   temp = temp | 0x00000100;//EPR----input
, g" L+ q7 y4 Z% N" X/ i6 x4 I3 V   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. |. t" R& p0 W/ R0 }7 X# r! A; ]- M   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 h3 l8 O; C* Y# M! h* y
0 t8 Z. g1 j& }8 d   return 0;
9 K$ z9 a+ z  W7 f}; ^2 V; D8 e5 v4 Y6 ^. O
static void __exit MCBSP_exit(void)
2 \6 {7 c1 [1 g4 I0 p; g) G9 R. R4 @{2 t) e/ _) ]* v& O- H
   printk("mcbsp chrdev exit!\n");( n' i( s; ~. j) B# o
   cdev_del(mcbsp_cdev);
# v: x) D& s" Q   unregister_chrdev_region(mcbsp_dev,count);. x; H" J) D) {* Y$ X7 b8 g
   device_destroy(mcbsp_class,mcbsp_dev);
5 H' N" o9 g6 Q; P! J( u" q   class_destroy(mcbsp_class);8 G* h- }" D$ p% C3 H$ l/ u6 e
}9 P) i. o- ?* m2 U  x
module_init(MCBSP_init);+ T. k5 _/ V) x0 t% X" d0 L
module_exit(MCBSP_exit);- A* p3 o' h9 g5 K( M
5 S# L! j. l6 z' N" p" [: x. g+ Y& y- @
MODULE_LICENSE("GPL");
! c. T( h- ?0 `5 D7 ^* h+ U" j4 x! B5 a$ {- I) c8 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; a  Q) u  e- l
我的应用层的测试程序如下+ b: D& v! X# W) a# r3 {0 Y5 B
#include <stdio.h>
0 [0 E$ S# l$ M  q- p#include <string.h>" D7 Z3 h9 n& n4 u* E% z, Y  G2 L9 {
#include <fcntl.h>9 c9 G4 L- }6 D: F3 X
#include <unistd.h>" m* g- e( X7 O% n
#include <signal.h>8 U5 P' x/ W* X1 ]
#include <pthread.h>       //线程  v. n3 f  z$ {2 ~* m
#include <stdlib.h>* q6 E' K. |3 n$ o' n0 _
#include <pcap.h>          //捕获网口数据
4 Y9 c! v- u5 T. B2 _#include <semaphore.h>     //信号9 ~3 {7 y: P% R# `. N. J4 j2 r  f
#include <sys/types.h>     //消息对列  P9 h) {: d0 H( a1 V( b9 I8 p. W% D0 y
#include <sys/ipc.h>       //消息队列1 _2 k" X; N3 N1 ]$ e
#include <sys/msg.h>       //消息队列
8 h- a) S. \5 N: T9 |& Z5 [" F#include <sys/select.h>
7 r7 c0 x9 P4 z6 g" h#include <sys/syscall.h># ]8 h' }; J* j+ T
#include <sys/stat.h>
$ w/ N0 K) _7 Q: z/ o3 I9 X) Z+ T#include <sys/mman.h>5 n$ Z6 }, @5 N
#define msleep(x) usleep(1000*x)7 i- A' K  Z" ~5 U  x
0 x) Z8 m  O+ r( R& [+ }5 z# X8 {
int main()
; Q; h5 p; r5 q- f{
& }7 @; i6 n1 X    //MCBSP,ARM与AMBE2000交互设备
& T$ Y/ A" m, |* d% | int fd;
: C' L  R& e% [# \+ @3 G unsigned short data_write = 0x5555;
1 j6 I4 p- I7 K unsigned short data_read = 0x00;- @( l: h% n: K1 P% l. y$ U2 v
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
- `4 u! `9 ]0 F; J: R. v //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' M  N1 Z# N1 x5 V( n# f. z- r% [6 W4 k
   
( V' E1 M. S- m1 y' T# a  if(fd < 0)5 N1 _; d; H) ?; x
  {  g: I& h$ T3 K4 ~
     perror("open failed\n");9 r4 Z$ K5 \4 p5 O6 I2 {8 Z
     return -1;& n5 L2 `7 |+ y3 ~4 f$ g8 A
  }& g3 I9 N) G4 O% }/ w: [
  
: b. A4 {: i$ q3 Y2 e: m% P" |  while(1)5 i( v3 f; T0 `
  {
, F  a& \3 s, }. _+ O; b7 _   
+ q1 Y) i6 k- u0 M: q7 v   //AMBE2000每次读写是24个字为一帧9 r3 c. V# c. |5 g# S
   //写数据时将数据在底层存储起来,等到中断的时候再发送
: F& K+ w6 q* C6 x" S6 e) q   //AMBE2000输入数据是以0x13EC开头的+ }' c0 k3 I& s8 G3 q
   write(fd,&data_write,sizeof(unsigned short));
" D, G/ a3 v0 i# x5 |, A   
$ |# {, E3 |0 q* w6 q7 i   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  9 m4 ~/ B& c% j$ Q0 t, g8 l
   read(fd,&data_read,sizeof(unsigned short));
4 S' H: V$ R0 S! Q/ n' d: d5 u   , c8 L. E* ?0 W8 l3 G  N, A
   if(data_read == 0x13Ec)
1 [* h6 O9 B5 n2 x3 _   {% O! f3 A2 O9 F* f4 U
   ; \4 s2 r% d* x3 y# H) m9 d. K" Q
    printf("data_read = %x\n",data_read);
$ X/ J0 Y% e9 U* X6 ?$ j   }. ~, y  j  D4 p# J
   
4 r, G) _$ [4 a: n4 h   msleep(10);# k7 O& f2 ]+ n+ i4 z
  ( A/ |& m6 Y$ A- ]
  /*% `) a8 X: H4 T4 [0 t
   ioctl(fd,1);   ' B7 @" P' G6 i( F! g. S# M
sleep(1);
( X4 C2 e- h! ?! E4 N1 t2 K/ D2 ]6 Z ioctl(fd,0);$ B' d. F4 M4 k
sleep(1);
; @% w* ^7 U( o( }. m# a  n% b */
3 y1 K/ C/ v. T: _3 x  }   
/ @0 D7 t# y( I& g3 }6 u4 B return 0;
+ D$ C  K: d& D, V , e* _. v) t# r# A% u7 p1 Y
}
) F% @) T, s  w2 J- A/ v5 l/ L  I" f4 m
多谢各位指教,谢谢! 急
( M7 f! U' {; l0 P
1 U. ?3 T! G* {. P! B8 T5 A- M: n: ^3 [  }: Z) `
5 j  E1 y  X; E+ }4 |7 M

" J  c# r2 r+ g  w2 ]+ u2 k/ z- I2 o5 |+ I+ K) }4 E- ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 05:49 , Processed in 0.043695 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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