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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 I7 Z, r( C& @
/*, Y3 w& c! Q2 J' Q# i
* Copyright (C) 2009 Texas Instruments Inc
$ f" ?9 L! [1 Z  t; N *
* N* |1 ~* A' l9 R- x% }8 U * This program is free software; you can redistribute it and/or modify. w; b' O0 U- h" ^8 k0 R
* it under the terms of the GNU General Public License as published by
; r$ `* e% m, ?1 V$ R3 p. I * the Free Software Foundation; either version 2 of the License, or1 m; E! y' T1 \: l: ]# T( H; T- F
* (at your option)any later version.% ]7 V1 {1 D' S; y- y; e! |
*4 b* r0 b3 a  s, B! u9 K
* This program is distributed in the hope that it will be useful,
$ j( J9 o4 F- k+ e" k7 ^3 } * but WITHOUT ANY WARRANTY; without even the implied warranty of) K7 K0 X/ u) k+ u+ T  Y& M8 H2 u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 Z! q( S# d/ R) O& U/ b5 T% { * GNU General Public License for more details.
0 I1 p* F* t! C# V$ Y6 V *( C' ]2 p0 _5 j2 ]
* You should have received a copy of the GNU General Public License* v9 G+ [) T! V/ R& A3 E0 ]
* along with this program; if not, write to the Free Software4 E$ S% ?0 r* Y5 A3 U, |
* Foundati7 m1 @5 n4 I# ]& ^1 R( v. [
*/
* g! [% F+ \4 G9 l#include <linux/module.h>
" l* c: A2 x+ j( n) y2 V#include <linux/init.h>
( f5 [. r7 s/ T" B  h#include <linux/errno.h>
( G% V9 v& q" R$ V#include <linux/types.h>
6 P7 `) {$ T  K! x# X#include <linux/interrupt.h>
  t* _& P7 V  P7 q#include <linux/io.h>" j& `5 \, }6 g' x3 R- S$ G
#include <linux/sysctl.h>" E( Y& x" [" X4 x" S3 N% i7 J
#include <linux/mm.h>& m* b) r" E% c9 [2 C6 b
#include <linux/delay.h>
* T' Z  q6 C9 A* F* b4 B3 S#include<linux/kernel.h>
+ ~/ q- S  C& R5 [1 D9 C( p; |#include<linux/fs.h>' V& ^. s1 p2 v8 F( p
#include<linux/ioctl.h>
# h. K6 z! {) ~$ x9 q* f* O/ Y#include<linux/cdev.h>
) p+ ~8 Q- [1 I6 t; I$ ]0 g#include<linux/kdev_t.h>
9 \( P7 a2 u4 j/ D1 y. ^, v4 q#include<linux/gpio.h># K& p& e, g  J! \8 D
#include <mach/hardware.h>
+ A/ K# T+ |0 r8 I5 ~#include <mach/irqs.h>
/ ^  |+ Q) B8 {, p+ T$ v: Y
% Z" N9 j) @' F! S6 v$ m#include <asm/mach-types.h>+ T. E6 P. s9 p# C
#include <asm/mach/arch.h>
, V1 Q& _- c3 ?7 \& Q# f: W! K2 Q) H#include <mach/da8xx.h>+ X/ A! H0 U1 x2 S
#define  SYSCFG_BASE   0x01c14000
7 H3 q. `2 b/ _2 w: Q) [9 U# b5 j#define  PINMUX1_OFFSET   0x124
+ G; Q$ n. d' M" R; I. i1 [/ j#define  PINMUX18_OFFSET  0x168 ( j5 m1 ~2 \' l. R5 x# D
#define  PINMUX19_OFFSET  0x16c0 @& s# e* w4 t
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: Z. Z1 }! J$ q#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
' _  W6 p( f1 u1 t- }#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& w5 k$ @, l8 \- b$ l#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) }) k( ]  V. t6 ~/ J  H1 d  x#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 x+ [. S6 |- d* S# O" j7 }                            1 G, x" d- H! X! f$ p
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR  G3 K  O# n, m
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 a5 k0 A6 R4 k' U+ P- H7 Y4 b9 d6 ^//PSC
0 X; P# e5 F: I. P; I#define  PTCMD_ADDR   0x01E27120  
3 ~1 E* I: f) S* c: M. U# I#define  MDCTL15_ADDR 0x01E27A3C) w! R0 R5 L, }% k9 ]/ ?! ~  J
#define  PDCTL1_ADDR  0x01E27304
- I( Y  h* E$ ?3 F$ u//GPIO8 direction( M! b3 p7 f5 ^: V0 b  n0 U
#define GPIO8_DIRECT  0x01E260B0
: {1 S: A5 d7 J& N; u#define GPIO8_OUT     0x01E260B4( l& R- D! h+ U  O( f( \/ {8 v* i
#define GPIO8_IN     0x01E260C0! h# i, W* R3 Z- B9 o
1 F" J6 E' w. j" s9 Z
//#define MCBSP1_RINT    99              ( j$ `$ k2 [& V  k/ b  b! ]
//#define MCBSP1_XINT    100  # R" R( Y9 o2 c, Q+ m, z
static int MCBSP_MAJOR=239;$ m+ n; j8 U2 l. Q+ g, q% W
static int MCBSP_MINOR=0;: _+ [# ]+ ?- [
static int count =1;( t8 T- F- K# @! i

7 A0 e) `* @" z% l) s' k" v8 o4 b#define MCBSP_NAME  "MCBSP-device"
+ i' r7 t" g2 ~& u3 o2 _, B# U: k; i
static struct cdev *mcbsp_cdev;
* H  e6 {9 Z5 c6 j. ]# ~" hstatic struct class *mcbsp_class;/ P& E5 n" n" k* l& k4 S" ]
static dev_t mcbsp_dev;
' ?5 D5 z( r2 Cunsigned int DRR_data;* a/ A% ^+ `0 L* |
unsigned int DXR_data;2 w. N) r: r" S3 A1 N1 ?
static int mcbsp_open(struct inode *inode,struct file *file), ~, ?" F9 u8 q  _% l. k+ t
{( i# X1 p- A4 @, X  x% F
   
; D9 l8 H8 s2 r/ m   //interrupt enable,initialized
6 |4 K, X; w% E& d   unsigned int temp;
+ {/ T+ g0 r" O# |) q   //SLEEP_EN(GPIO8[10])---0. W" I2 `, C7 H3 ^8 A  ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; n0 I, A. W3 _# f& F2 I' B   temp=temp&(~0x00000400);1 T6 X1 @0 t7 c. \- X
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ r/ ~  E7 i1 R2 i% ]  //RESETn(GPIO8[8])----0----1
7 G: I$ }5 \3 y8 W1 p   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& j$ D+ |. p6 o+ A! f" e
   temp=temp&(~0x00000100);4 V' r) @) N8 ^& e# h+ l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0: B* _( d3 ?5 v2 R/ j0 y3 b. h
   udelay(100);
$ n" A: N" e1 A9 R! D  R   temp=temp| 0x00000100;& e& d) O: e, u: K* l+ ]0 l: F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  i4 J. n7 J( v7 o
   udelay(100);
' j3 q' ~) f& g0 U5 C2 ?* D: _  P" C   printk("open success!\n");
) y8 o/ u1 s- ~% @7 V8 x0 L   return 0;
( p2 `, @3 P; b. N& ^+ V}+ S) \& B! N& O9 x! b
& z) G  t6 y' m0 w# d, |
static int mcbsp_release(struct inode *inode,struct file *file)( M; V* A! {4 F0 m3 A
{9 S3 U7 P  t) ^0 {% q( z; u& h( A) h
   printk("release success!\n");
8 I+ Y& q3 I0 ~4 b   return 0;
  Q7 M6 Q1 E& J  V$ Q}
( @4 U5 l9 S4 l, h0 g3 {* J5 g# f# ?9 U2 W7 A: M! a9 c
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( p4 S5 O2 W2 R4 [$ B{' W1 v% q! H) V% R, @
    copy_from_user(&DXR_data,buf,len);
( [7 E; u, N+ B6 l    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
$ i) D1 A! Q5 x, ~9 @* v    return 0;
3 k8 L9 k/ |8 K' `/ s+ F9 s3 d 5 ?: ^$ L) W9 }
}
! V% F  Y) v, |) V0 H  c
( v: K7 l& v: R% J/ G/ hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)% @- A: Z4 B6 |; `% t$ N7 t) P
{ - o: d  P6 J; d& t6 c
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) p; J$ ^7 I: h# d" g   copy_to_user(buf,&DRR_data,len); 7 X. M0 O# N1 N9 |* e& r
   return 0;) ^* m+ [. t* P
}, v# g5 [5 @: A

& L' @  l  X9 H+ _
" b0 G- f2 G8 X7 B4 z- J2 sstatic struct  file_operations mcbsp_fops=" s4 b' W/ O' y% z% q$ \. t' @
{% |3 H) G$ |9 z! S  w4 |) K% I
   .owner=THIS_MODULE,
1 }& r/ g; P$ s$ E2 g   .open=mcbsp_open,
& C% Z( b$ g' O9 J0 g' O   .release=mcbsp_release,# ]1 i; d; r# Z, F, E& E/ W: }; X# L
   .write=mcbsp_write,
& T& u: o: I4 s( u* v: @; C0 ~4 m% [   .read=mcbsp_read,1 ?/ j6 }, O4 I* Z8 c- O! H
};
! E+ A* S. b" T5 M' Rstatic int __init MCBSP_init(void)# d9 u2 ^. ]" e" o$ f+ T$ Q( w) d
{4 |/ i9 k! P6 u' O0 o
   int ret;
+ B% `. G' Q4 F- x  b7 I" a: J0 R2 F   unsigned  int   PINMUX1_REG_old;
( w! b) n4 x6 O& M, h- w3 G! F   unsigned  int   PINMUX18_REG_old;" `' R+ ?$ w; Q4 k/ J! s3 d2 d/ V+ y
   unsigned  int   PINMUX19_REG_old;
9 U( k  o% g5 r7 X+ N1 b   unsigned  int   temp;  
4 v: k/ I- o1 o" y9 I   if(MCBSP_MAJOR)
0 n, |2 N4 e/ x. V   {
, O( `9 ]8 q: ]7 O+ F      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 f, K4 b$ e6 J4 D      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 C; E  o) |) `. k4 R
   }
/ j7 ^4 D3 l2 U3 N. s9 ^$ p! v+ u   else- W" @9 P5 b. F5 A. D* b
   {7 o( L; l- G  c/ }
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 R, r0 O1 L6 r. ~) x- E      MCBSP_MAJOR=MAJOR(mcbsp_dev);5 M" X( M4 r1 L, S! d6 e
   }
2 ?5 x* l9 [: R. H   
+ R8 l( a/ W; z) {   if(ret<0)6 d6 y7 I& B9 ]9 }
   {0 k! _  y5 H6 v  F8 A# A0 C+ t
      printk(KERN_ERR "register chrdev fail!");  s5 I9 ]. [6 g- ?3 n9 m. V( \) U
      return -1;. {. A  O: f. r0 A2 I2 d  A
   }+ a# a$ M: L' b7 r" P' |* ^  u- J- G
   
4 ?! s& ]5 J! m; o2 K   mcbsp_cdev=cdev_alloc();
- R8 h/ f5 ^0 t! J   6 `) z- R2 Z3 _+ y* x! N
   if(mcbsp_cdev!=NULL)" q' S! b: n5 M8 ?
   {% F2 N; p  j! q& Q6 u7 P
      cdev_init(mcbsp_cdev,&mcbsp_fops);( _/ s8 E! d* P& y% h. q: `2 F
      mcbsp_cdev->ops=&mcbsp_fops;# d9 J9 k& W$ W: ?
      mcbsp_cdev->owner=THIS_MODULE;& ?- I5 M4 a2 ]( u0 w. e6 u( A
      , Z/ v# C' R2 x$ ^; O5 x
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 Z. |5 M5 v7 l6 Z. ?7 _* s3 ^2 W
          printk(KERN_ERR "register cdev fail!");
% U% L# `/ P5 ~% {6 i, L- c      else
/ n. z* Q5 k4 U          printk(KERN_ERR "register success!\n");* U3 w5 f/ N! t
   }0 p( Y6 M  \4 M+ h
   else- a" ^1 I% K/ n7 W9 u% \6 T" h. w, R
   {1 |+ E7 }1 F- \0 ^4 r
      printk(KERN_ERR "register cdev err!");
( g$ \) M( t. [9 K! z/ M      return -1;
& k# R0 |, C* A   }: J& R; Z8 {  b9 A3 m& v
   
  B+ Z* |- o; ^$ I( Q  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' S1 D' Q% l7 ^3 a6 r- V$ m
   if(IS_ERR(mcbsp_class))- Z8 D9 `" R+ N/ w8 u* ?
   {9 F( P: {$ J4 G+ t- G4 G
      printk(KERN_ERR "register class err!");/ Z$ l  |  y& Q+ h) j; A
   return -1;& t" d7 H8 s  [: ^+ f, a
   }5 O" w$ w  t9 z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
9 P6 O. o* v0 ~, C. Y, w: O& L  l/ |8 k6 D- P
   //PSC
4 w% }; V+ z8 q4 W   //add Enable MCBSP
4 B% B8 u: k4 f' T) P; K' O   //test2 E7 l+ f0 j& M! r% L/ [
   temp = 0x80000003;7 r1 r! r, u; l5 k7 P8 b
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 [0 E3 P" S: K% v: ^   temp = 0x00000003;
$ ]- l3 p& ^8 k! ~* V/ f% n6 c   writel(temp, IO_ADDRESS(PTCMD_ADDR));/ s4 {7 y) a5 S) m* t. f7 {

4 |$ Z5 U) I# T6 p; ~% l& E   temp = 0x001FF201;: s( r1 d) j0 A; V5 Y6 C
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));  @8 \+ p! g1 w
   
3 E2 S* B, ]6 E7 z/ B5 `& e   //PINMUX  # q5 ?2 J& l3 ?& U
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) N% r$ K# w* {8 K) c  Z   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * \0 R- s/ \0 ~0 {
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
# _+ B3 `& {/ ~5 ~& _   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" `' F+ ~2 B& ^
   6 C+ h1 i: T6 ~& Z
   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 _$ F& G* M3 m" k6 ~% c
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
2 {9 X8 `$ ~! ^8 k. e- n8 S   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
* R5 X6 ?7 m% I5 a6 d5 g: b   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 T1 G$ F* D0 N' R * o0 T3 e; X* C- z' T
   //RESETn,L138_SHK2
( _3 {- p7 R' v; C8 o  b* r   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ) X1 N. k7 W2 a, K# k5 T
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   4 L8 x: D, B: ~& m
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 a$ z. d9 ]1 Q2 U7 f& X. G! w$ W
! @, U3 S6 e+ X$ R# {

. P$ o7 Y! V( X  //SPCR Register; @+ ?2 g0 W( k
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  l9 U1 u7 P$ S* l* `  temp = 0x03000000;//(DLB=0)7 q- Z6 U$ l4 G  S0 J
// temp = 0x03008000;//(DLB=1)) `) U5 Q& o4 n7 Y! z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
' R$ w7 o! N* [: [8 M7 @  temp = readl(IO_ADDRESS(SPCR_ADDR));
" N; W4 S7 h: u$ }  printk("temp=%x\n",temp);
1 |- l: }) }- K 3 M$ p9 [% |5 A3 w) u, l- s
   //PCR Register1 ^- s  D! a( J' C6 ?2 `
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-01 l5 k, z" M/ [6 q1 w
  // temp = 0x00000F0F;+ `# U, h+ {$ z, ~# H3 t
  temp = 0x00000B0F;
8 h5 z) w( u. h0 w6 P1 A  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
. L; E. o+ Y. n1 o% m+ @& W  temp = readl(IO_ADDRESS(PCR_ADDR));
6 q4 z8 T9 q! j4 |- n' T  printk("temp=%x\n",temp);  2 ]4 z) g) K( j5 S) t( e
   //SRGR Register
9 D) v6 F  @( {+ `: z( h7 `/ U   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
# i$ l( T/ S9 `# @ //temp = 0x301F000B;$ H) Z3 ?4 C; u8 `* c
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized # K; M  T- C3 O& |
  temp = readl(IO_ADDRESS(SRGR_ADDR));7 N% D7 |$ u1 f( G0 K
  printk("temp=%x\n",temp);0 c( E2 t! n$ ]2 M1 ]% W% K# b  A
   //RCR" N3 H1 p6 T: p
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, R* U8 W; \* T- ^+ e4 L2 R
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 K0 {' {; `2 }   temp = 0x00440040;% a% z7 X) K; A) k/ K7 g
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& M( i8 \9 A) U+ V$ F6 N! z* k   temp = readl(IO_ADDRESS(RCR_ADDR));
7 }, a+ f. [' N" k- H3 r   printk("temp=%x\n",temp);/ i  K  Y8 t: `$ e4 x- d! B1 o; J
   //XCR
$ j" m' P. \4 Q; l" ^  P! s5 |8 f   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1. M5 M3 m3 b$ \1 V, B" ^: _
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 h/ ?3 G( @! ?0 a( I
   temp = 0x00440040;
" P/ }: j( B2 e4 ^- ?5 _' F   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   4 g5 x6 {3 g' G+ c8 J6 G
   temp = readl(IO_ADDRESS(XCR_ADDR));: B: R3 Z9 l/ A" G5 a" P
   printk("temp=%x\n",temp);% X% h1 `- z' U. _
  udelay(100);: g$ y& X6 Z; @5 o
  //SPCR Register3 Q3 X  ?* o% M8 \, `- Q/ }
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 b. b, k" w- y6 D! S5 i1 q  temp = 0x03C10001;   //DLB = 0 VS DLB = 1% f$ U: T) z, H% A* ?
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: j" Z. W6 d$ ?$ F0 u% ?  temp = readl(IO_ADDRESS(SPCR_ADDR));& g) `; F* Q: q% S. @5 P1 t
  printk("temp=%x\n",temp);
% S* {+ v; P( s6 w9 A  udelay(100);. ]& ?* V9 |) f
) l* s& I) ^0 L2 t9 |6 `
  //set GPIO direction
2 ~1 b9 F" L0 ]$ A+ d   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 T" }" Q, a# C: d2 T: `, G
   temp = temp | 0x00000100;//EPR----input
# r) t! f1 j4 W/ c6 i: J   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" O5 _, K0 x2 z; w( W5 I
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
! E$ {8 J0 G  Z1 M) u/ P
6 r+ V& @6 X1 f- Y   return 0;7 v) I+ m' [; y& T7 N
}
8 q* `- V# [" @- L  zstatic void __exit MCBSP_exit(void)
$ j1 P0 \& k; ~: c# `{. Z0 N) |# s( y; c
   printk("mcbsp chrdev exit!\n");" e: H4 M: P; v' S7 ^& ~( ?3 G) Q
   cdev_del(mcbsp_cdev);5 q- @; {5 ]" z8 F( X' I
   unregister_chrdev_region(mcbsp_dev,count);
+ w8 a: u3 \2 Q1 t4 @4 I+ P- w2 X7 h   device_destroy(mcbsp_class,mcbsp_dev);- M, H* c% K- E/ m  R* @
   class_destroy(mcbsp_class);
9 \7 y7 R  }/ \. a( R}
" c. |, ~" F. l. L6 imodule_init(MCBSP_init);2 t* N; |* _) X) X) G/ h* j
module_exit(MCBSP_exit);
; @- }. j0 x' u4 @9 J
* E0 ]3 \( f& E) }. Z2 D7 Y( V' GMODULE_LICENSE("GPL");+ |6 D* q9 e+ u5 z- s8 \- }
0 k$ f; P* e* m; y8 s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* n, f  W2 l1 t$ |4 v& A! {: J
我的应用层的测试程序如下4 W2 Y4 F9 j8 d7 m1 |4 j
#include <stdio.h>4 v0 Q$ [0 @9 p9 ]2 V0 r
#include <string.h>
" x# v, `$ w  Y0 S' a( q- Q5 V- h#include <fcntl.h>
7 F) X6 J* B) J1 r" v#include <unistd.h>
( ^2 M$ Z7 a8 C! A+ T+ v1 D#include <signal.h>! n& Q8 R0 @; H9 u7 _* [
#include <pthread.h>       //线程
5 G4 c' E. Y8 U. `9 X; h& o6 x#include <stdlib.h>
0 e8 ]& a* ]1 D( N* m# M! c#include <pcap.h>          //捕获网口数据! V2 P1 R( \2 t. A$ G- W& ]! a; O
#include <semaphore.h>     //信号/ @: |, G8 u5 r% |& Q
#include <sys/types.h>     //消息对列
: @  O6 ~/ \$ ^1 U# [#include <sys/ipc.h>       //消息队列
0 m" Y) f" E' C4 l, b7 W7 |% ^) P#include <sys/msg.h>       //消息队列5 U- L* V  d) @
#include <sys/select.h>
- V/ B6 V2 O  [- L7 ^#include <sys/syscall.h>6 x$ @, v7 E& g6 [4 \, E
#include <sys/stat.h>
1 m! V: c9 N/ Z% l! x#include <sys/mman.h>5 @" |! L" W" i! R: W7 Y4 t3 N
#define msleep(x) usleep(1000*x)& H8 y) `( W% \5 }' g3 {, }
4 M6 ?0 T3 V3 V& b, ]) w9 U
int main()% e, W) x) a& O! G9 M3 g4 m
{ , X8 @1 ~# p! o; C
    //MCBSP,ARM与AMBE2000交互设备9 k; _& u. O8 k9 W5 m- d# O
int fd;
4 T) y+ ?7 Q7 K' F9 g" o unsigned short data_write = 0x5555;
# G; ?) i7 f5 f& |1 c: x) p1 C* [ unsigned short data_read = 0x00;
5 a6 w( [' ~6 J7 q  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 G/ k5 y" |& r, v( f1 U6 h //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* U3 r  s7 g/ z$ T' V   
! S9 w2 A. W# J  if(fd < 0)8 c6 t# I4 S( U8 k4 ?
  {" J/ A& o. v- J; x& S
     perror("open failed\n");7 c' d7 N% h& W7 h# Z
     return -1;
5 O2 V. T4 @% [! ]2 p" W  }
7 ^3 x: |# k& A0 o8 m$ F$ J6 ~0 p8 N  
4 k' C6 ~+ P0 P) _* m/ k5 }  while(1)
& Y& S: P8 z1 M. e( v& A  {( H: x: a* l" N" Y
   
; s8 `! \- L& K2 R) X( S4 s   //AMBE2000每次读写是24个字为一帧
& `% O! c* X+ O# n) w( @6 z   //写数据时将数据在底层存储起来,等到中断的时候再发送
) U' d7 K( h$ [" B   //AMBE2000输入数据是以0x13EC开头的
) ?  L" g3 `+ b1 ^% p* \( w: g- n, Q9 t   write(fd,&data_write,sizeof(unsigned short));
$ c* O: G! I, d" F3 w8 Y$ `   7 h: m( Q6 q& m+ Z7 Y2 B
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
2 N6 |1 _, r$ c$ f   read(fd,&data_read,sizeof(unsigned short));
, M  g: c  _) m; {& j   % E1 d. p- z' `( z: A  S, [6 G
   if(data_read == 0x13Ec)
3 I% @' Q8 F) S   {' D/ ^& d! E1 i" N3 g
   ( X2 b, W: A2 ^/ }2 D8 I
    printf("data_read = %x\n",data_read);/ V$ R/ z1 W7 [/ d1 k4 Z  d
   }
' r: w8 U. Q( S/ i* q   ( l% u8 J  f8 ]3 e2 p1 W
   msleep(10);2 v7 ^' F/ ?2 R* e
  0 |' v* x5 p3 d; e$ @; r4 G
  /*7 C6 B- `$ U  i( K7 t
   ioctl(fd,1);   $ y$ G# n" k  R+ p
sleep(1);
  }3 Y, P+ }7 \4 f6 [ ioctl(fd,0);
9 z& a" Q' P( u' O sleep(1);
2 g- r4 G4 N: t2 Q */
* D: Z2 o" ^, Q  }   
. ^) F; s7 P# C return 0;1 o8 l: z" C$ h2 i

# R( Y9 w1 Z& P/ `  c}5 I1 G) s+ M* B* e

( g2 n" h. ~! }) d" C; B1 ~" N多谢各位指教,谢谢! 急
- N0 y1 r/ D1 W/ f% S7 `- G: A
5 F5 a, F  w' I( i7 L  o$ k" {' m* @4 o! f7 U

  b; F8 |& Z& J6 `( V- n/ q* X1 _& f* I8 ^
  |& S9 S8 S5 P2 B8 W  l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 16:01 , Processed in 0.048581 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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