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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# _; g. H- _5 _, N" h/*" \( _  Q& X) |+ `; W
* Copyright (C) 2009 Texas Instruments Inc: k3 E$ l3 |0 U6 O. x- n( X+ t% H
*2 q0 U' A% a' }7 h
* This program is free software; you can redistribute it and/or modify0 B% J- s" l4 r9 J6 C
* it under the terms of the GNU General Public License as published by
5 r: @$ j' q: `; k, \7 W4 d * the Free Software Foundation; either version 2 of the License, or
4 y1 e6 J2 m8 l$ J  p5 |# f# M2 Y1 ~ * (at your option)any later version.
5 k6 j! y4 }: X( a) l *& P* q* p+ b# W- A7 m
* This program is distributed in the hope that it will be useful,- p) D; h( s: B4 R2 r% Q
* but WITHOUT ANY WARRANTY; without even the implied warranty of8 ]5 i$ E, D- u* ]9 I$ @
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the( L0 F0 s" |  d6 I7 J/ K
* GNU General Public License for more details.
: ~) N3 n2 K5 f3 a2 Y3 j: Q" q *- @. i; w, r1 X/ m' @
* You should have received a copy of the GNU General Public License
1 s' \" u* X; s7 @& z5 v * along with this program; if not, write to the Free Software, u- p4 y: [1 o- }2 g1 P: @( k2 B
* Foundati
% K$ S8 y1 P- U' q- \. {1 Z+ f& v1 ~*/4 W$ K0 h2 S5 T8 _3 j
#include <linux/module.h>
' L  ^: K* d- e9 C- u: s0 J#include <linux/init.h>
7 J) F" F" h& e* k: q& i5 F% i& @! ?( v#include <linux/errno.h>
# S, e, `* g0 i/ _7 I# W#include <linux/types.h>3 Z! ~9 w. b' G9 T- D* e
#include <linux/interrupt.h>& @/ F+ s$ z- h, }: F- r
#include <linux/io.h>
$ F/ k2 n$ e8 S% s#include <linux/sysctl.h>  e8 V6 O8 k; v' d
#include <linux/mm.h>
5 ~6 Y5 b; ^5 F#include <linux/delay.h>
! r. Q, S- C4 f#include<linux/kernel.h>  L7 A4 Z" j: L' j, c: s) P
#include<linux/fs.h>
! D$ F" d0 }: \8 j* T#include<linux/ioctl.h>
& {/ ~6 g" J) w, \#include<linux/cdev.h>- \, k, S: g2 v, p- u" K, o8 q
#include<linux/kdev_t.h>. k5 m) |! h/ m
#include<linux/gpio.h>
( V7 |: }$ n9 ]#include <mach/hardware.h># Q! O% d. j6 x+ Y9 ?
#include <mach/irqs.h>
" i6 C8 Z% U& u6 d0 ?; E. X! f6 }2 m, D; v$ t0 `, s( L3 g
#include <asm/mach-types.h>
4 u. W5 P5 P6 y#include <asm/mach/arch.h>! a' e. E* {( `6 _/ [5 l
#include <mach/da8xx.h># O: Q' g# U$ y8 y! o5 i
#define  SYSCFG_BASE   0x01c14000
0 I) d2 ~$ Z! \0 a4 n#define  PINMUX1_OFFSET   0x124
2 w0 \; X. i0 m5 {& l" b% o#define  PINMUX18_OFFSET  0x168 2 d$ ^; e% R3 T
#define  PINMUX19_OFFSET  0x16c
, L! W# V3 [+ E: a3 C#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR( Q. M" y$ D9 }; ?# L
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 c: M/ e/ E. `& i# \6 b) K4 b
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 I$ i5 E) D3 U- M' q1 ?! [#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR1 M6 {' U; ~) g; a
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR; a; F  z; N1 {* l% V; {
                           
$ y/ y% @2 H( E0 y3 L1 M' f#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 m, T3 t' I' O. @$ G* m#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) n  l7 d! V4 o4 p! B* D/ I//PSC
6 `, ]1 O. [$ M% \! C9 ]#define  PTCMD_ADDR   0x01E27120  . u- s$ \6 {6 q3 U8 O/ K8 Y
#define  MDCTL15_ADDR 0x01E27A3C
! T  D  i4 ~1 `% D7 X; [+ C#define  PDCTL1_ADDR  0x01E27304
8 H' h1 \( T. b" R$ T" n//GPIO8 direction
6 l6 i- c4 M' K+ x% C$ _3 J# f#define GPIO8_DIRECT  0x01E260B0' o1 u. j% v8 S+ S7 ]- W
#define GPIO8_OUT     0x01E260B4
/ S% B3 N6 I8 l, H$ ]. m#define GPIO8_IN     0x01E260C04 p8 j6 S& P. z9 A! u

8 d) Q$ ?2 R; U; G* R# L//#define MCBSP1_RINT    99              
: b0 h4 N% L( o) n; k//#define MCBSP1_XINT    100  0 q0 N1 B4 h- r3 @5 i# L9 I
static int MCBSP_MAJOR=239;
5 n4 B5 x: V, K$ C4 rstatic int MCBSP_MINOR=0;
6 ^( r  W) _/ W+ z' s5 Q/ Y) ?( A1 t) L2 Ustatic int count =1;
6 ^' ?) J/ x# \% a* b5 b- X3 j8 M( u  K7 T! d( |: B- l
#define MCBSP_NAME  "MCBSP-device"
* |6 M% r. k( C+ I* g) G. n3 {5 I& K7 T
static struct cdev *mcbsp_cdev;
' a$ W  R* k! z1 [0 f) ^! mstatic struct class *mcbsp_class;
+ p* D/ A: B& y; |/ h4 Istatic dev_t mcbsp_dev;
# J# W) n7 o' v& T* aunsigned int DRR_data;
" q( H5 N  D& ]$ m1 Xunsigned int DXR_data;
+ E, d8 v- A$ ostatic int mcbsp_open(struct inode *inode,struct file *file)
' z, ^! P+ m, w7 d, [{2 j) S! c+ J, ~* Y& C$ c4 d
   
/ t" e. w& Y  n" ?2 @   //interrupt enable,initialized
4 _1 B; N! K1 D0 m3 Z% c   unsigned int temp;, z) ^/ Z1 s& V  U
   //SLEEP_EN(GPIO8[10])---0
- n) `4 v! S/ {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 K. E0 X1 B) v, E
   temp=temp&(~0x00000400);
. S2 s6 n3 O  v( Q6 o3 x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 e' Z$ Y1 I0 v% R$ P* S) U  //RESETn(GPIO8[8])----0----1
+ h; k  m  Z, r) z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ S, S) P. w2 C7 C
   temp=temp&(~0x00000100);) Z$ v, R3 b1 U9 J4 Y. s; J; \$ T; \: G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---04 u7 D! `& m; [% h. ^, Y9 @
   udelay(100);
, E8 }1 F- b- s" g7 w2 t" x6 F* g   temp=temp| 0x00000100;' K8 {4 c- ^5 M" y$ u; e
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 Q4 z% H2 z8 j- W   udelay(100);
7 d0 D2 G& L; \- I+ a( r* r   printk("open success!\n");1 S/ e7 n+ ?( d) y5 v) c2 R7 h
   return 0;
0 ]5 q4 {  ?- b  u1 C}* ^3 d% x$ u; l% V0 V3 @
2 P. V$ q# I. g) w* o. K- V
static int mcbsp_release(struct inode *inode,struct file *file)
" q  Y2 }' s, i  j8 g0 x4 W{
% c7 r  C; s2 v% ~& }+ ]   printk("release success!\n");" H! S7 _# L" D5 G
   return 0;, J! t3 ~5 j. `8 i
}- {- z6 p5 E9 _/ \/ m6 e

8 d* R5 ?. C- |, ^. i" {static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 Y0 |/ C& O) k' Q7 Q{: g) d9 V- J( Q; x( A4 T& w9 {+ T
    copy_from_user(&DXR_data,buf,len);4 p9 O) _4 Y  e6 f0 @% `
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
7 a# G' f. K! L6 f: n! ?- G    return 0;
) D1 s  K0 O* X$ j4 I . s, S) h" z+ Q8 l8 R: O: E1 ^2 a
}
7 O" r1 E+ o  _2 h2 S) q* J% S- [. ]
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 O4 d0 d7 h2 i5 N$ e" @
{   j# ~4 v- W/ f- R3 F9 \3 M
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; O0 Q3 i" g- H1 i4 q- R* p   copy_to_user(buf,&DRR_data,len); 1 z7 p0 M" ?) c3 o0 p
   return 0;1 ]3 c, I! o% v' u6 _: g5 s9 x
}
$ r3 l4 ~2 e  g" }; t5 V( `1 b/ }3 f. L4 N
) I+ c4 B& o$ ~  h) S
static struct  file_operations mcbsp_fops=
! [) |" t/ W/ |2 E{6 G( c( v/ X( ]* |& P: g& \
   .owner=THIS_MODULE,
$ T+ R! [3 i8 z( j, e   .open=mcbsp_open,  l: I2 @) i" ~, A1 K7 }% v0 L$ L
   .release=mcbsp_release,; M# C) r2 J8 }- P( b+ h
   .write=mcbsp_write,8 F5 V0 j5 l" E4 r  h% R
   .read=mcbsp_read,, s' l& b& d1 V
};
8 y7 r4 Q2 ]( a. jstatic int __init MCBSP_init(void)
" g) {- A  C8 ~. \2 h# g{) D5 n, l0 y- Y9 T  `; K7 Q
   int ret;
* H* P/ g: H$ E6 I2 D4 D4 c   unsigned  int   PINMUX1_REG_old;: K& Y( p  {& F; h1 E+ }( K, B
   unsigned  int   PINMUX18_REG_old;
& T9 e2 y8 {" ^9 D' E) h$ i: s   unsigned  int   PINMUX19_REG_old;+ r' x' J' G* L" d+ K$ r
   unsigned  int   temp;  
- H* K+ e) D& t" V# Q   if(MCBSP_MAJOR)
* w* D! K7 s1 ?: C8 d3 `+ c/ b   {
: J% n$ \! F2 Z1 z  j; B" ?4 k0 }) r      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ H4 }' W/ N* y/ r- Q7 N) G+ R; @      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
- u6 j, h% ?& e6 o& g% y8 p   }
" Z1 j* U) j2 h- \5 u   else
3 E5 u$ D+ g& t: m0 h   {7 l' H$ e7 U3 V2 F; v; }2 t' J- D2 ]
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! W2 Y5 c2 s2 b" m( q      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ \, n& H9 ~7 F) o& d
   }
7 F1 P3 @" [3 c% a     M/ T# S0 l+ s
   if(ret<0)# q) n; o0 K4 B. R' _( a8 e9 w' i4 l
   {
" V3 t' A+ C1 h& L7 u! V2 @/ `      printk(KERN_ERR "register chrdev fail!");" B3 [- E3 G  }) [$ }
      return -1;
' j8 L. t- g9 q! ^% C+ E1 v   }
$ K- X# ?6 |9 \! S  {- t   ! j2 q" B# o9 |
   mcbsp_cdev=cdev_alloc();' D7 ?( _: T& N& o. b/ O' m
   8 `( X; ^! D; r; }- U0 ]
   if(mcbsp_cdev!=NULL)) ^$ K  E0 c9 h: X6 k
   {# I3 M6 b" M6 ?) g1 R
      cdev_init(mcbsp_cdev,&mcbsp_fops);% B$ O9 P, f4 e1 b% m9 h9 d
      mcbsp_cdev->ops=&mcbsp_fops;
& ]' e$ [- j' \      mcbsp_cdev->owner=THIS_MODULE;
' N: A' H5 g# w+ A      
0 r2 @* Q( b* ?, O- i' k& h      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# m$ R. w1 ]9 t0 G3 N* @
          printk(KERN_ERR "register cdev fail!");
3 l: Y  t: Y9 a& J; t6 n      else
2 H9 C- X0 O+ B: u* S/ B, I          printk(KERN_ERR "register success!\n");! U6 t3 I( f* P- h: p- Q
   }
) b( F" Z6 B# v; h; `4 y3 D( a   else
& J1 x# q/ ?- @7 h2 F  M   {2 H! a1 t3 [6 |- Q* w& Y
      printk(KERN_ERR "register cdev err!");
# t2 a  y, e. ?4 Y9 F  T      return -1;! G3 r! k6 ]  T9 E8 f$ z
   }; v5 z4 a) E# U7 z- J4 d" s: p+ |
   
' {: Z' I, p2 o' W, J& X& [  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
$ u; B$ g9 ^- i  V   if(IS_ERR(mcbsp_class))) J( f  l& i% J
   {
( g! J# W" z9 ?      printk(KERN_ERR "register class err!");
8 q# O. S# H: `/ I$ \$ r: }   return -1;# f' o' ]: h) w1 q( i  X' o3 f( Y
   }2 L  C' T) e: J# W
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' C8 X4 T0 D; |' k, d2 L
% n# I6 ]9 ^) a4 i  @5 k5 _1 _* q   //PSC
. G# H& H! e% C7 h   //add Enable MCBSP
/ u3 _+ j+ p  P. D   //test
. S7 s, k2 [6 `* n$ W0 N5 [& C; t   temp = 0x80000003;( a2 t0 k0 |0 y, F$ H/ A! K
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 R7 N8 b( p2 Y
   temp = 0x00000003;
6 f% D# \6 g2 \3 a( h" s, v   writel(temp, IO_ADDRESS(PTCMD_ADDR));9 H/ j, T, v/ d: i- B

$ d& i! c9 K  P; \1 [. s7 N; [   temp = 0x001FF201;& n; y( R1 }( s% S# b
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ e% V3 |" K5 [: x. b; _. G   5 s  o9 X; x  I. }( `( X( S
   //PINMUX  ) g. M1 [- D% y% _  \
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" h) |$ T( M; ?5 s  m3 }3 w& Y   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
# k* p" R. U3 k) T3 y! v   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; G0 ]# }) Q, r; b8 Z3 w5 C$ [0 W: p7 o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);/ _: A( G  a& `$ |8 G+ r0 {) e
   
/ @5 C/ o- e$ z  L, U& \   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, J1 M7 }$ F) a) @  O   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
& I, F+ ?% o( k$ w   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
; f- ~" w% N; `   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 U# C( V4 u, D. h+ o
1 r0 Z8 N+ H/ ~; K  Y3 Q  ~
   //RESETn,L138_SHK2- y1 O- c, |1 L* @
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  7 F5 o+ T9 N: J4 _+ b) b
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
+ r' U) v, l0 F8 R4 l% r) n   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# r) O( G# {: z* g; K6 {6 d/ O. a+ V9 j
7 u( E/ e$ ~7 ]& H& p/ f
, V' n" [3 M% z% r: e* z, O4 [
  //SPCR Register
; @( f' d0 ^' h) q( Y  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' h% s1 ], r1 e2 @( D( k. |: j! P  temp = 0x03000000;//(DLB=0); r! n& e2 ~9 w$ g  e* S1 W' k
// temp = 0x03008000;//(DLB=1)
5 H  _7 U2 d- c* k0 k* V  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset2 c' F1 R  B% t& ^+ S4 q& A
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( f( n+ Q3 B. e( z) q( B0 n5 ?  printk("temp=%x\n",temp);
, M/ E" J' t2 q( G( G& R
7 q5 V2 y) V! ?2 u, x3 n   //PCR Register% `% e8 ]6 r0 A0 F0 i
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0& D- H% |0 V1 {* r% D
  // temp = 0x00000F0F;. P6 h% p& c( N8 H. u) Z( i" N: d
  temp = 0x00000B0F;
6 n& v% h1 i' |6 r) t. Q! h  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ! D6 B; S4 z5 S- ^" ?
  temp = readl(IO_ADDRESS(PCR_ADDR));" `. G0 S0 N- B& x$ B+ l& s
  printk("temp=%x\n",temp);    k0 Z) _4 E, ^9 V4 L
   //SRGR Register
; [1 ]2 o, J+ t7 ~; A/ x/ _   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ C1 K; Y6 B" H# ~. w& D
//temp = 0x301F000B;: @+ y% H+ K+ z$ E) e) M
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
3 a5 C) o; F, p: ^- \  temp = readl(IO_ADDRESS(SRGR_ADDR));
" ]+ ]) v( z  q5 n  n2 q  printk("temp=%x\n",temp);
- |: j: t! ?$ F3 m! b& S   //RCR+ w( O; n& ~, n/ p
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
% M3 T  s3 z' s& M, A   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 ]' S$ p! r6 f: c+ U
   temp = 0x00440040;
2 s/ p2 a' k; `4 N) I# B   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   8 b  S' b: t1 ~& j% H+ Q
   temp = readl(IO_ADDRESS(RCR_ADDR));
  G3 R) V6 A8 l& l) {  J, m   printk("temp=%x\n",temp);! j8 _. y: l! B3 A% t1 x! D& J
   //XCR
7 s$ `7 W  M+ p   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: U, M8 m4 ]0 u- u' @   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! Y% {- p( ]8 \4 Q
   temp = 0x00440040;/ o$ {* Q) y- S" @  q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   7 N* s4 Z$ H9 p) b; w* U1 o" u
   temp = readl(IO_ADDRESS(XCR_ADDR));7 R  w3 n8 b- m( ~
   printk("temp=%x\n",temp);- M5 _$ S: W6 s& o; T9 B9 X
  udelay(100);3 A& f4 q: Y8 _+ X5 A7 d5 M
  //SPCR Register
- }) M! I' i4 x2 L8 w  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 h; B3 _5 e  L7 V% ~6 I* M
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; w* r7 v* Y- q& k8 q. r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
  H! d* G" h5 o  H( y, Z/ R& u  temp = readl(IO_ADDRESS(SPCR_ADDR));/ |: t% k/ F% k
  printk("temp=%x\n",temp);! z; x5 b& T) v" T# W9 o; J$ a
  udelay(100);
, i, ~7 l, Y3 H1 q: D, K. b- D4 b% O: h! @/ Y+ v
  //set GPIO direction
6 m# K& {& g6 Y9 P: Y8 d2 t   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
2 O: N; f, F5 J& W   temp = temp | 0x00000100;//EPR----input& U% M* y6 _  Y' v) s
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ N& b+ W$ e. x   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
, ]7 `+ K* c! i& i, w$ C+ G 5 R+ ^2 j# C: `  n9 u5 J- K( X/ m
   return 0;6 X# W1 p# {9 G% f: l3 Y4 y
}
: H" ?& l' Q/ {, T0 [static void __exit MCBSP_exit(void)
2 U- X" X" X1 D$ I5 t+ r{
" Z( o3 j) m+ X3 F4 Q8 p9 q   printk("mcbsp chrdev exit!\n");2 `* j  y0 j# z& C" x; d
   cdev_del(mcbsp_cdev);
: K  G# H- @, z   unregister_chrdev_region(mcbsp_dev,count);
6 Y5 g' B% n+ n& W/ ]   device_destroy(mcbsp_class,mcbsp_dev);& C8 X( Y$ I) R- V- J; M
   class_destroy(mcbsp_class);
3 K# W5 f2 a% H, P0 a2 \% L}
& {) X1 M5 |5 Y" B7 V. L# Bmodule_init(MCBSP_init);0 M. b7 S  y! ~6 M
module_exit(MCBSP_exit);/ k. [2 I' r0 w7 [3 G
& |( H* p% x0 h* f& i
MODULE_LICENSE("GPL");
1 k" M$ K- p4 @8 a( p0 Z4 R6 p! M) k& B, V( d
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" u% y& S1 v* T% k7 t0 u$ \1 u
我的应用层的测试程序如下
3 H* ?& b+ c2 P  s#include <stdio.h>$ C9 \8 ^1 R! R' h2 X+ a: W+ u7 l: t
#include <string.h>4 y+ }# H7 x+ S# {: t; \% X0 `
#include <fcntl.h>
. |$ s6 }" V" M' @4 J#include <unistd.h>
$ k8 C( k. U# v#include <signal.h>% N  d( U+ J$ z) h4 G; y
#include <pthread.h>       //线程' m/ W' x+ h/ @) D
#include <stdlib.h>- X" h: W& j5 E* j% s$ T  T; D( ]
#include <pcap.h>          //捕获网口数据* w( \9 e3 d6 \" C- ~( B4 d
#include <semaphore.h>     //信号
+ i9 s/ e6 p  C. [  K#include <sys/types.h>     //消息对列
) w' M" L! v5 o: P#include <sys/ipc.h>       //消息队列* u, c6 ?9 b+ g! n0 E$ Q( x
#include <sys/msg.h>       //消息队列' V7 D1 W: P& u
#include <sys/select.h>
! F2 A* c0 D6 @- b% O#include <sys/syscall.h>
' X  ]5 c% T8 ?#include <sys/stat.h>
& Q' |0 `" t, U. [1 b#include <sys/mman.h>
# U# a! S  H; i' i: M% _#define msleep(x) usleep(1000*x)
7 ?9 Z) f$ I; @  U- K" Q: z4 H
+ E! W% a$ i$ ?. t/ \9 B2 xint main()
  \0 t4 u4 D. @{
% [6 c, a$ m" |3 C1 M; r- |    //MCBSP,ARM与AMBE2000交互设备4 f$ C+ u# C( H# I8 ]- P
int fd;. r& j% E; s. |1 [* L/ Y# l4 w
unsigned short data_write = 0x5555;# p* Y6 @4 {4 Y( Y( U6 c  t, i- z
unsigned short data_read = 0x00;9 R# B/ R) k2 ?
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 \2 |9 s9 L* ^, b& [
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* L3 ?/ {9 Z0 o    4 h" T) ^" T- C% L
  if(fd < 0)* k4 n) X7 `; M/ q& R; o0 Z$ i9 w8 e
  {7 V1 ~/ ]9 l: ^  w  ~
     perror("open failed\n");8 S& a6 D* Z: [( H6 z1 x
     return -1;
. m/ z& `3 T3 g$ _, N/ t7 M1 W  }# ^3 a) i, ^9 G- U- D; Q
  $ k! N; _7 e" H( O
  while(1)
2 j1 }$ n. Q3 ^& p$ X: U  {
- J) X0 R. W# d! E) t) |+ ~. M   
% u9 d8 u3 Q# j( W  o( I   //AMBE2000每次读写是24个字为一帧! _6 n- `/ Q* Q8 S: d
   //写数据时将数据在底层存储起来,等到中断的时候再发送
: H! k) l" z, @: q6 A  H# r) S   //AMBE2000输入数据是以0x13EC开头的+ _, P. ?; e9 x0 g, w
   write(fd,&data_write,sizeof(unsigned short));1 w9 R! K+ z5 x7 ?* e
   9 y+ z7 Y* M% o* l/ j
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  - k8 x; I+ e; U
   read(fd,&data_read,sizeof(unsigned short));
% R) y- a* f  D* [; ~   5 C+ C7 |8 l0 _% t) \" L' y
   if(data_read == 0x13Ec)
; t4 X( v4 ~% c, m- j$ p& a   {, p" y( D$ l; Y9 B" d( N, k3 o
   
2 {. L% O, t) l0 \! L5 J, q    printf("data_read = %x\n",data_read);2 J6 S& W" i! g/ a
   }
' x* |$ P; H: t# X  `# ~   
4 w, L* s) X: e   msleep(10);
4 {7 u! I6 _- k* u; w  * J2 c4 i! w2 d1 `( B% A
  /*
4 U  q1 ~8 O9 V. T( b2 i  q9 y   ioctl(fd,1);   
/ Y, L+ Z+ Y8 v) y+ O* c  Q: `  B sleep(1);
- k: q" S" m( Q4 X ioctl(fd,0);1 ?$ w% L5 |  d0 T1 l
sleep(1);
7 f4 Q5 q2 b: _ */
: Y9 s! ]5 y# L! g- ~  }   , o0 c: L2 u! F
return 0;
# u5 a9 @' l, { % N  w8 y1 G/ j3 h/ O
}& C+ C6 ^. }. W) o+ Z
: q& k0 T9 e- j. f! v1 M6 }# H6 O5 C
多谢各位指教,谢谢! 急4 k; `0 [9 X: W6 Y* T9 b" v3 j8 I
( U, X" a, H& n8 [( I8 y

, ]% h% L2 @* O3 U6 U3 D1 v* S2 i; W3 b" k' k) a

! o9 j5 S) `4 U$ q2 e' p' W
3 g, q; b( S' w1 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 10:51 , Processed in 0.048987 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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