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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# R+ Z; Q" c( J( j- `% F" J/*
- R/ {6 ]7 i. l" t+ r$ r/ n * Copyright (C) 2009 Texas Instruments Inc
" A8 I! F2 _0 l0 k8 A% r  y *
$ z3 A7 B$ n- t * This program is free software; you can redistribute it and/or modify
# p: ^. W; J  x4 | * it under the terms of the GNU General Public License as published by3 X/ y0 r' Q7 P
* the Free Software Foundation; either version 2 of the License, or
7 G* a4 e" v4 A# L * (at your option)any later version.' F7 |* c* S# r! X. s  j1 j5 m
*4 I- [) F* }# g) N* G& R
* This program is distributed in the hope that it will be useful,
: [2 Y5 O* o$ F * but WITHOUT ANY WARRANTY; without even the implied warranty of
" e9 x, u7 A, {* a$ q& P8 C- P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# d& G8 X" P* {5 D2 I& w * GNU General Public License for more details.
+ s2 G/ X" V2 q; I/ p *
0 N6 B% ~! I5 t- w# V$ w * You should have received a copy of the GNU General Public License8 @, ?. M. U. B
* along with this program; if not, write to the Free Software4 D0 W; M. f; ^: ?' W
* Foundati
5 T4 Y8 y/ w% @7 {4 L*/; Y/ e' N( V3 n2 ~& M7 m6 D
#include <linux/module.h>; j4 F( w6 @; H) Y
#include <linux/init.h>
4 }, V0 z- }" o, S#include <linux/errno.h>
3 O8 W. X: h7 S' B7 q#include <linux/types.h>4 k7 E9 Q+ q' w9 l. [, F" }+ N
#include <linux/interrupt.h>8 Y6 i2 V' L5 T3 p% {
#include <linux/io.h>7 G; F% v5 p) J5 G3 l
#include <linux/sysctl.h>& ^! E( t8 E' ]# Q) H6 l
#include <linux/mm.h>
, r3 ?! }# y6 H3 _4 [#include <linux/delay.h>! w, C; T: H6 I7 z
#include<linux/kernel.h>+ D6 W0 D  Y% \, E
#include<linux/fs.h>: T4 H0 _. w$ O- [
#include<linux/ioctl.h>
6 W0 _& b* i$ b! a" Q) q7 `#include<linux/cdev.h>7 t& O0 T: s# u6 P8 N% w
#include<linux/kdev_t.h>
+ z; [6 w0 i. k, I% G9 O#include<linux/gpio.h>
" v4 v- c0 u" f#include <mach/hardware.h>
' [- k/ V$ J: G9 d#include <mach/irqs.h>
+ J( y# ^/ l5 A5 S* |( r  j! ^' @$ B, `
#include <asm/mach-types.h>, B) T, L( |- X& t! G/ Z+ D% T
#include <asm/mach/arch.h>
8 f6 I. z: q# ~! B9 k- q; z0 n#include <mach/da8xx.h>
% \0 a+ _" R2 P/ O2 @: i1 D#define  SYSCFG_BASE   0x01c14000
1 a7 |% }, }! z#define  PINMUX1_OFFSET   0x124
. ^; L7 q+ k6 o#define  PINMUX18_OFFSET  0x168 . x' [0 q8 z4 q! U  D' [/ Y
#define  PINMUX19_OFFSET  0x16c
/ j; O/ p, z3 t* W* L7 Y#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR4 w& ]$ C8 \' e2 f$ D' M
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
  v, B9 @& J0 e, T, {& k#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 P& J1 h0 t" j4 b* U! g
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
& c% ]* s- q3 P7 ^$ h$ x#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 U1 l/ G) y: A9 y+ p/ G                           
& w9 R' ]' Y9 `) n" {#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
3 A' y$ ?  o( r  [! f#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
* f+ X& U! Q  \5 b$ l//PSC
5 C4 a9 e" \2 t( F' N3 k' ~#define  PTCMD_ADDR   0x01E27120  
" R1 _- f- w4 j+ j3 ^% w' D5 s#define  MDCTL15_ADDR 0x01E27A3C
- U2 r9 V9 p7 i* u7 j9 B% H#define  PDCTL1_ADDR  0x01E27304, l+ T+ i6 ^7 u3 n% g* Y  a
//GPIO8 direction! F4 Q  q, q& ~1 P; a
#define GPIO8_DIRECT  0x01E260B0
. V( t5 x+ ?  Y#define GPIO8_OUT     0x01E260B4
: N! q$ c6 X1 _#define GPIO8_IN     0x01E260C0: }5 S( T$ f& V' [6 {

: |" O9 P6 M" H//#define MCBSP1_RINT    99              
) Q' y! v0 I- ]* w* K2 M, ~# _. @//#define MCBSP1_XINT    100  
, ?; N% p. f$ x3 |* Ystatic int MCBSP_MAJOR=239;
6 Z( {) J! _3 p; I5 m9 Y; Tstatic int MCBSP_MINOR=0;! V1 U9 Q; ]1 x) U& R
static int count =1;5 ^' C4 h1 Z8 U+ X  ~$ b7 _8 \

1 J6 C% T) P0 Y$ v& I5 W& ^#define MCBSP_NAME  "MCBSP-device"; Z% N8 n: h5 _- M

$ I6 r, t( C. n7 e" Qstatic struct cdev *mcbsp_cdev;
: K$ U9 c0 Y5 l% [2 _. p# D1 Jstatic struct class *mcbsp_class;$ T  _5 S# n$ [  e( G; z1 z
static dev_t mcbsp_dev;$ Z% |3 B3 T5 a# U- V
unsigned int DRR_data;
  B6 F* p/ \3 n5 ?2 Funsigned int DXR_data;
; {% a! n0 v* n: b7 k2 bstatic int mcbsp_open(struct inode *inode,struct file *file)1 ]. F3 ^' j6 j2 ~0 h4 v9 _2 R
{
9 ?) D3 a: l. J" \( b% I   % @5 J+ }+ Z- @+ Z( w! o1 q& ^* m5 M, z
   //interrupt enable,initialized& \$ B% r' m' Y9 T2 X' ~7 ~: ?# M
   unsigned int temp;  V7 P* O* {( P' M4 S
   //SLEEP_EN(GPIO8[10])---0
# l" o3 e: H/ P1 r6 i) D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. F' F$ q, h. D. b/ x4 ~3 b   temp=temp&(~0x00000400);/ Q7 h3 {6 J* k, Z+ {1 D& ~( t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]. i, g/ M1 z; L8 L0 d& e; t! \
  //RESETn(GPIO8[8])----0----1
  {! {- d% f4 X' x& W   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 y; ~) Y% n2 L; w6 k  l! L
   temp=temp&(~0x00000100);
8 A0 Y6 ]0 E+ f5 [# [. K" p7 H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 `' j' I; O. J+ Q+ l+ C5 U   udelay(100);% H5 R1 \2 [9 B, i/ d. W+ `9 l
   temp=temp| 0x00000100;- g8 F9 I9 [& g* M: |
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---18 |" p' K9 S& ~  V9 T; c$ l# j/ _
   udelay(100);* c1 C+ a4 v4 @, B) r9 w
   printk("open success!\n");- Q; d2 s! q6 Y
   return 0;
! Y4 u; f/ n; B) K2 J% o}
. |- `% o; t( P  H$ I
; a4 y" y) v- R/ X6 _static int mcbsp_release(struct inode *inode,struct file *file)3 h! k! e1 P6 ~0 u/ E& G, i
{, t5 j* Z% f  y# ?
   printk("release success!\n");
% E0 v' w( g  g& x/ y   return 0;
  \7 A# k( @/ F6 a& a% |}8 l, h; h& e) |" H, d( }
6 y1 l# u, @7 N- ~; v/ n, \; G5 E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' R4 L# q7 O/ c
{: v# g! v6 A' b4 }( F' m6 |
    copy_from_user(&DXR_data,buf,len);
$ z- F5 |0 p% p9 R- N: P. d    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       4 k. G+ {4 _: {0 Q8 q5 H3 A4 H
    return 0;6 ]' _9 \  K5 g) h9 \5 h1 j

$ K/ g7 Z: H1 Z: q}
! s1 O' x0 W: R/ B- ?) j! J* j3 r
: \# Y, Y* |) m# ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 y+ h  s' N  x+ K, e+ P
{
& J' a; o. r* P  V8 W! F2 V# }   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; k& r. |. X7 @$ Q, D  M* h' D7 D
   copy_to_user(buf,&DRR_data,len);
2 m7 j: v. X& ?0 B6 e* U   return 0;2 L0 O& Y' D4 R, T2 H) L0 U; v+ J
}
9 A5 h: d( V, }8 h
5 r. t0 K( U$ S# h$ J0 f* C& T9 f) A0 ^6 X% @* A) R) @0 ~- U, x8 M
static struct  file_operations mcbsp_fops=; D& l+ N8 D5 d) u) c) M
{9 P1 \8 V2 g6 |6 v5 Q0 m6 Q
   .owner=THIS_MODULE,3 b! I; Y2 I$ f
   .open=mcbsp_open,
' G  y" c$ K' n( b( f' B) [) A   .release=mcbsp_release,) @) V$ u0 M& J2 h) m
   .write=mcbsp_write,
2 {. Q3 R. d" R   .read=mcbsp_read,
4 ~2 r% U) X9 O$ t* b  \; u6 V};
6 M0 y: R" Z$ X  f! [, Gstatic int __init MCBSP_init(void)
5 @, h! h* G' `: _{" T. X. R6 {. {7 d: X& u" C  {
   int ret;5 F* H# Z! n- W+ f& u! B6 F# O7 _6 P$ Q
   unsigned  int   PINMUX1_REG_old;
. ]/ C, J# Y8 e# I2 \" {( F   unsigned  int   PINMUX18_REG_old;* ^( f* M& B0 b; R* |/ J. m: O# {7 H
   unsigned  int   PINMUX19_REG_old;
) F! d5 b. v2 G' F. q/ l   unsigned  int   temp;  ; u' ?- j  V6 L% b6 z- @+ _! c) t9 A
   if(MCBSP_MAJOR)
# ~* [7 k" z- o- a+ H* Z7 j! N6 z" T   {/ s  C5 N# N. \2 M" h
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 V# l5 I5 H7 c5 {      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 e7 y3 ]2 t7 D' l
   }
  l; e$ ~7 X- E7 i% [3 J   else; @) w$ p! L6 ^: S
   {5 b/ A8 v& n- f# n0 H8 ?
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 C: g. ?8 S% I" k- E9 D$ v      MCBSP_MAJOR=MAJOR(mcbsp_dev);
9 L& C% F- h9 ^   }& d+ s: K5 D1 S4 g
   / z- K; ]6 D& T1 [; M6 ]
   if(ret<0)% ]- ^& P: N+ T5 s8 A" e
   {$ o* k! U  a* S: ^3 B( p$ ]
      printk(KERN_ERR "register chrdev fail!");# Y$ r) H6 F( w4 c5 t5 Z/ d$ ?  l9 F0 J
      return -1;8 M. d8 B0 h9 P, V* M
   }
' Y: n- `" W7 a, C   
9 y& F! L5 |2 E9 A8 J   mcbsp_cdev=cdev_alloc();1 E3 C3 q- W' y# A3 V
   8 O3 @5 i9 L: J; i# [5 I) A
   if(mcbsp_cdev!=NULL)
. U' V# g8 M0 _5 R  x   {7 J( N8 `, o. z# r% |
      cdev_init(mcbsp_cdev,&mcbsp_fops);" b4 d" Y1 o* g2 B5 f8 ]4 Y& H
      mcbsp_cdev->ops=&mcbsp_fops;" |3 T: @- [2 U  [% F- t' ^. T
      mcbsp_cdev->owner=THIS_MODULE;) m  T7 K+ Y9 Y9 }+ _" u" o
      
& [3 F" z* g: ~0 ?  p; t# k# i      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' y1 Q9 [. r, q# k. a
          printk(KERN_ERR "register cdev fail!");' O" p: g! u1 w* r: Z, G
      else
- F: D8 M9 _& l% h          printk(KERN_ERR "register success!\n");
& z1 e1 _0 A6 [9 m' r* b   }' V9 n8 J! X( W# m7 x' ]
   else
; h' H+ j$ D$ \1 J2 S1 o: g   {$ ^" l1 e2 P0 [) c: b9 }- x9 {, e
      printk(KERN_ERR "register cdev err!");
4 N/ W! Q9 e9 s9 `9 R      return -1;1 ^5 ~8 o+ S$ Q2 |; N  p' U0 z" }
   }
1 T8 E' Z0 d  f  i   
2 [. ~, }  \( I& g$ h6 l# Z  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 g# w; I$ Y* z7 v2 a# L: j
   if(IS_ERR(mcbsp_class))
7 t% l8 z. u) R. v0 D' {   {
* d4 \! m  `6 Q+ e' n/ G* N      printk(KERN_ERR "register class err!");$ b! I% o, p) ^
   return -1;( ~  v& ~0 w2 I1 o
   }( T; T; O* w! y. w& z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' j6 H9 b# E0 h- n8 `+ V6 h( m0 Z5 T9 y1 i5 w& C. n6 J. A
   //PSC  J6 s* C: E- @- K8 Y: F2 S
   //add Enable MCBSP$ h6 |) g0 D  g. c8 h2 m: B; @( O
   //test" Y( C6 {! I6 r* `1 V  X
   temp = 0x80000003;
5 U) Z; ^7 F, w+ S" F" w   writel(temp, IO_ADDRESS(MDCTL15_ADDR));7 v. B$ R( W8 K& s$ g& W$ T
   temp = 0x00000003;
2 [( m' B1 T: @7 v" I# R   writel(temp, IO_ADDRESS(PTCMD_ADDR));
. ^1 S' }3 h6 A; Q9 E
0 o  k. \! b8 r8 S0 l   temp = 0x001FF201;
2 d4 B" c9 U) {) N8 m   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. w7 b6 A4 u% D# Q   0 z4 n8 ?9 f5 R/ D( `: j$ F* q
   //PINMUX  ) A) N1 t1 R5 A! x/ U
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( t; P, g2 ^, i9 I+ `5 b3 }( e: P: j   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
! w. ^1 ^4 x% K8 \: [   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
+ \) u7 E. p) V$ s8 O. I: [- m- y: w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 X3 @7 M) @* {3 k, A   
! O& p' a% H# Y. X& S' I8 a# ~   //SLEEP_EN,EPR,L138_SHK1,L138_RC
  b9 @+ d5 G7 p" K, y) @/ P* j( M   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
# }. l1 U6 L4 S4 B9 D9 [' W# e  t   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 r' v/ b7 ?. m! k" `0 n   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. N; ?4 ]3 D% _% c) _+ P: d' v2 x4 A / R: Q. Y& y/ E! F5 @% {
   //RESETn,L138_SHK2
; O# t9 {2 ~4 K  s# b4 Q   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  6 `& R6 ~( X( k/ n6 I
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , _9 B3 n& ^( R1 i" Z1 n
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 M, E" `  d/ t4 N: N
0 O' s! n# _% _1 ^# a. O
9 i3 n& Z. @& n5 S# M
  //SPCR Register
: g" Q$ K2 I7 E  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; c; u  D5 ^4 U/ L8 M$ `, c  temp = 0x03000000;//(DLB=0)- K4 O% E! [/ E( `
// temp = 0x03008000;//(DLB=1)
- R+ F) }6 I/ N0 J# I  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset  l+ r1 }* f8 Q' s
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 D4 d( ]$ i( a  printk("temp=%x\n",temp);: C" A3 T: T0 c$ I! i3 Z

  p3 |3 ^( ~. s, Z, Q" G% P/ v   //PCR Register1 `# w7 Y0 N# L0 f  B) I
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 W  p6 F5 H& ?& C! g. A8 O: v  // temp = 0x00000F0F;5 p) R8 t% t  T  P/ Y+ u8 A
  temp = 0x00000B0F;
$ B$ ?, Q# T; l4 I2 i6 C# R: a  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
# Z6 r& C) l: t  temp = readl(IO_ADDRESS(PCR_ADDR));
" {& j& ^: U: @+ I- [7 [  printk("temp=%x\n",temp);  
6 i( |4 o! k# [# v1 z; G4 g0 R   //SRGR Register
( G/ w6 W5 u. _/ g2 w; @, t# T   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; _& k; D- z) t! q" e$ S
//temp = 0x301F000B;
' t8 b" I1 A1 ~   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
( w- Y+ N9 z  @1 b' |  temp = readl(IO_ADDRESS(SRGR_ADDR));
4 `3 I9 z6 u1 G4 ]2 |  printk("temp=%x\n",temp);
1 e1 l% Z2 K" W  `/ [; _   //RCR
" j$ F! k0 A& E   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ N" _; O8 \# O) A0 i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 P' R  V, _5 I2 |3 W4 L
   temp = 0x00440040;: S3 f' ~7 R# Z$ x
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
" R$ H( n5 b& u) I4 y   temp = readl(IO_ADDRESS(RCR_ADDR));& B: R/ z" j8 T' S
   printk("temp=%x\n",temp);
! U! w/ L; C, x( t. p   //XCR
7 Y2 A  {% k0 M/ I# J& V: t5 A   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# t2 X( N0 Q& y/ {0 K
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
- W* ~7 {, j: ?1 k1 _2 p# M# A6 d! m   temp = 0x00440040;
: T4 H7 ]8 h, \! J! D/ z8 K   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & x7 \/ g! @1 T  J& X5 q; Y% ?+ N
   temp = readl(IO_ADDRESS(XCR_ADDR));" x5 Y7 T# r8 M% b
   printk("temp=%x\n",temp);
. M+ ]$ ^, I7 w* [# q  udelay(100);
" |$ ]* G7 |2 E  ^7 j1 G  //SPCR Register. y* a+ f1 h* b/ a" h8 Q  k* W
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% r. p. A, |! Z/ D4 w2 p$ \, M7 _# B  temp = 0x03C10001;   //DLB = 0 VS DLB = 15 F- c1 R  h9 e" g* ]( U8 T( o- J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
% O6 F+ w, V# d2 C5 W0 l* n0 U% P  temp = readl(IO_ADDRESS(SPCR_ADDR));/ j+ L4 M; e, j# i5 g% z
  printk("temp=%x\n",temp);0 \1 b+ k% r+ l) f% Z0 f- G
  udelay(100);- ?( D7 D. @2 S0 p

0 A, h/ m5 E$ {4 \( g' f  //set GPIO direction
1 ^0 J! a$ r( ~% {* |1 \1 n9 U   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" z) D* @0 t% l! W0 ]
   temp = temp | 0x00000100;//EPR----input
% z; M& v: y& L; M/ h8 f   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- V' k" w/ k# [5 J2 a: _   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& p6 I6 v/ w5 A) F' B6 G, } 7 U* d* h4 u6 ~5 ]6 O4 {
   return 0;- j2 @" g: ^, p5 |6 }- q+ w3 b) V
}
: W( I) r  c2 l- @9 zstatic void __exit MCBSP_exit(void)
) X  W8 _1 b1 @2 m# d! ]{  d9 x; d5 g8 n
   printk("mcbsp chrdev exit!\n");
, x' @& d* [: _& I3 p+ d3 U   cdev_del(mcbsp_cdev);
5 C+ k8 L: W' _3 ^) D( X4 t   unregister_chrdev_region(mcbsp_dev,count);- D+ Q9 O8 I# r- R2 S& Z& P
   device_destroy(mcbsp_class,mcbsp_dev);
7 x  j7 r# o  K5 c: d* A9 ^   class_destroy(mcbsp_class);, Q. R1 R, ?5 G: T0 A6 _5 P% j- a
}7 L. x6 u$ W" a
module_init(MCBSP_init);) h5 Q: Y$ X1 Y. _' @+ o- ~
module_exit(MCBSP_exit);
* P# J% p- G0 G" G6 L4 l0 S5 T" R1 ]* k/ X# |
MODULE_LICENSE("GPL");
, _0 o+ }' U5 B" q
! M$ \; Y. r. ]  c- C# w5 \我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) E: }9 D% e: T. W- R
我的应用层的测试程序如下
0 F. Y2 k5 g9 X$ v# U: z#include <stdio.h>; {3 O, `2 |( L
#include <string.h>
% F' Z. n! L7 X#include <fcntl.h>2 t" m% b1 ?) w1 U' T6 x3 Y
#include <unistd.h>
; C& N5 D; @& w* |4 e#include <signal.h>
0 C+ Z8 u' p- o( ]9 {- A#include <pthread.h>       //线程
9 r9 w7 x" D+ i8 o3 f2 F#include <stdlib.h>
- ?5 f" e, b, b* V6 R#include <pcap.h>          //捕获网口数据8 o$ J  u( S) p0 b9 J# T" L  n
#include <semaphore.h>     //信号4 |/ x! j" C* o! k
#include <sys/types.h>     //消息对列
9 O: B& Z( G7 ?# ^2 R#include <sys/ipc.h>       //消息队列9 e! |5 v! v- R0 w+ G" n  f
#include <sys/msg.h>       //消息队列/ C# i4 O. N$ y8 T/ F) x/ E/ x
#include <sys/select.h>
( D7 E1 [0 G! b#include <sys/syscall.h>, _, J+ k" D: H) b6 y! C/ ~0 \
#include <sys/stat.h>
5 N" o. h" C0 k. O& H% k) Y' i3 H* Y& g#include <sys/mman.h>
1 h. b4 g+ k, G3 X8 J#define msleep(x) usleep(1000*x)
7 o3 J9 m. y1 s7 s, B( h5 L" {$ k
& _* \3 R7 @3 F6 T: A2 pint main()
7 W+ [+ N; K  B6 [* o% p. _{
: o8 q! s  M5 e1 s# H0 q% I    //MCBSP,ARM与AMBE2000交互设备0 Y' r" C6 x; X. ^6 o6 Q- k
int fd;( O+ {& [) q) R3 P: v
unsigned short data_write = 0x5555;( u1 ^5 O% g4 S" m
unsigned short data_read = 0x00;9 `/ H# z5 _. s' w
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 S" w5 \! S$ r6 y1 x //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( o  z6 ~/ v4 t3 q. M' T* s, |    5 W1 \! L5 r# O+ y
  if(fd < 0)
4 o, s# B/ @8 h. ?, W# B  _  {
3 j! \, O6 U2 d& [5 G0 D: y" @! {5 W     perror("open failed\n");
  R0 z: P& [& {. T) A: u     return -1;9 D2 L% B" N. V! l( g
  }
( F! S5 Z: R" v" }8 p  
! K" J4 V# _9 W2 P1 O7 \  while(1)# ?; L$ s7 [4 [$ i& f4 c
  {
' Y; V: ^; g* I% I5 [" m: ^# I   3 R7 n6 i) s! q$ }
   //AMBE2000每次读写是24个字为一帧1 K+ O1 X- W7 O! |
   //写数据时将数据在底层存储起来,等到中断的时候再发送
: {# [- D* N7 I   //AMBE2000输入数据是以0x13EC开头的2 {( ]+ o* Q/ {; X0 R
   write(fd,&data_write,sizeof(unsigned short));) Y3 g2 e: w8 `& l3 U$ m
   
, g* n! L& a, c   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  {: i1 h5 c0 V  W. G& j- I+ r   read(fd,&data_read,sizeof(unsigned short));
5 `: M$ F) z; m" j   
8 x; S# c- \2 R2 ^   if(data_read == 0x13Ec)# Q8 ?7 p" D0 W, P1 [
   {
) x- L4 A$ v/ s( U3 l' I2 i* G' {   
. f- g& z! F! f; ^0 ~4 H    printf("data_read = %x\n",data_read);
9 \4 e8 Y4 ~( N) C, B2 c   }
  I2 {5 M( |3 y+ T) U   - S: x( K  I1 }' y- M
   msleep(10);' j% i) c5 i, x: v
  
# F9 L0 @1 B9 u5 Y; C, Y' `  /*! Y8 z6 ]" g0 p& n# q
   ioctl(fd,1);   3 ?5 f" r. z/ c& Y) E9 g
sleep(1);
8 t- z5 l+ F0 u ioctl(fd,0);9 L( v! Z# s: r, R; E" g: \
sleep(1);
* E; A# M0 K4 E" q! F. T */ . T7 r) |# A2 C3 B# U7 a
  }   
" N' W1 B) O+ Q return 0;( M: J3 L5 I7 I- L# M
# C# L/ C: D8 U7 J
}
8 ~, N. l4 t0 c7 U( n4 E* b1 W
) x: Z: y2 h  `+ c多谢各位指教,谢谢! 急" I% q8 [. W5 ~5 ~
4 a7 I- W; t3 H5 h
/ e, Q$ x4 Z- n  Z  y# H
( I; o- y3 l* Q- ]. z% B

+ K! d! j" |; S9 J
8 k  d% s! n4 \3 w/ o! _% X- s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 09:06 , Processed in 0.043330 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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