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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:   _# S8 B1 q- s
/*3 Z  i8 h- s' l1 W& e$ o/ ?0 H
* Copyright (C) 2009 Texas Instruments Inc
& _" F& g* Q& ^  I' V! i0 d *
" w1 `3 D# S0 y& t$ r * This program is free software; you can redistribute it and/or modify0 H5 l3 B4 j* ?* G' _: T
* it under the terms of the GNU General Public License as published by6 ?: w! N% u6 p& d
* the Free Software Foundation; either version 2 of the License, or: h1 K* `! f# U$ H( b) z# F
* (at your option)any later version.
" c* J0 X, M  z& U  V8 Y7 ]  u& W *- F* O# ?) ?2 d
* This program is distributed in the hope that it will be useful,; q7 D. C+ ^' `% E6 F( `9 W9 Q0 P
* but WITHOUT ANY WARRANTY; without even the implied warranty of2 @2 m4 x# j" e/ F& _$ i9 w
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" u- T/ ?2 ^4 P; H * GNU General Public License for more details.) v$ E3 |/ V( ^; D
*6 q8 ^6 G) ?' Q
* You should have received a copy of the GNU General Public License
) }0 H& U8 v7 `' F& F" F, S1 l * along with this program; if not, write to the Free Software
2 j; e! H! a% Z) O! |( ^ * Foundati
( \5 J. p  Y4 s' T*/
1 Q6 o; i- u8 R  X( E#include <linux/module.h># N, d( h( j7 T" J0 @3 v& |3 ]
#include <linux/init.h>9 c4 z/ W2 _0 d( c
#include <linux/errno.h>
; \. R3 f- j- `2 m) K#include <linux/types.h>9 ?! T" ~$ Z( C, b5 p8 T$ L
#include <linux/interrupt.h>3 z7 q; n5 F& X1 \* P0 p$ D  Q
#include <linux/io.h>
2 }6 ~, }+ E  Z0 l* q& D% |#include <linux/sysctl.h>
( |" |  G+ _# s2 p& H+ b% Y! C; l#include <linux/mm.h>
* ]0 W; H. c$ O: z' }' m1 W#include <linux/delay.h>0 c2 W8 X- P; c. i: |$ V( f
#include<linux/kernel.h>
* m8 ^5 G1 f' x9 Z7 O#include<linux/fs.h>. B8 }% h/ K  j& }( ?
#include<linux/ioctl.h>
: a6 c! W, P7 F: j( d, d#include<linux/cdev.h>+ W1 f, L* y; q9 ]
#include<linux/kdev_t.h>" P# R; U/ }% ?: D6 i
#include<linux/gpio.h>
/ ]' X8 ]0 Z: F1 @" V#include <mach/hardware.h>% E1 ?" u5 C' Y% A; v# f. B7 f
#include <mach/irqs.h>
# _$ J: |' D' _2 {" W3 y
2 f, b7 }$ K( O#include <asm/mach-types.h># \- m9 Z- F$ x
#include <asm/mach/arch.h>+ ^) O0 w6 m$ z) X% b2 Z- Q  V
#include <mach/da8xx.h>4 f8 y$ a9 v# a; e
#define  SYSCFG_BASE   0x01c14000
6 d+ D2 c* S  W) j8 ~#define  PINMUX1_OFFSET   0x124   `% J0 p9 H7 P& a% n& Z9 F
#define  PINMUX18_OFFSET  0x168
7 Y  H% f, E* \( }#define  PINMUX19_OFFSET  0x16c
# z+ e) t" A1 |#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR# X3 @7 F% _  L4 @
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
7 r" R* p  u/ Y. u1 C#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
2 \0 y6 s, T6 Q; G) l8 J" h#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
3 F1 a7 T7 m4 a6 r#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
7 A; U' a* S1 Q, M- Z/ K5 z7 B6 h) a& A                           
# K& A0 H5 ^; M2 c& @1 a( G#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ H' J5 B9 O- d& W7 `
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR4 p. O  f$ `5 Y+ H3 j5 l3 y
//PSC) v* f/ p- W$ W  b
#define  PTCMD_ADDR   0x01E27120  
7 z5 f# m3 M- T- l#define  MDCTL15_ADDR 0x01E27A3C( F3 U) V+ L9 t& w9 I
#define  PDCTL1_ADDR  0x01E27304- W6 i8 Y7 T, r5 S6 C, D$ [  U
//GPIO8 direction
2 L# g9 `4 A# X( a& H9 @  r#define GPIO8_DIRECT  0x01E260B0
, b: r% x$ E) ?& T2 y7 @3 {1 g& `! {#define GPIO8_OUT     0x01E260B4
* Q1 r: @5 T' Q1 l# s#define GPIO8_IN     0x01E260C0# U! v' i& j, H! b5 ~

' |1 d' T, k' K4 Z1 P1 D8 `//#define MCBSP1_RINT    99              8 d9 O# l( u, j' L9 E
//#define MCBSP1_XINT    100  
+ G3 ^; e4 ^" jstatic int MCBSP_MAJOR=239;
+ o) V8 q- K( C& xstatic int MCBSP_MINOR=0;: N: V5 [$ i- S9 c# B
static int count =1;8 \% |- {: s: o
$ @: ^6 T+ w' v0 Q: G' L( q  ]  x7 H, z
#define MCBSP_NAME  "MCBSP-device"1 i" X& f% s$ H% ^
0 ]* N0 P' Q9 x
static struct cdev *mcbsp_cdev;
! U9 s% ~) q# g7 ]2 sstatic struct class *mcbsp_class;6 K( D; i5 v0 K- v
static dev_t mcbsp_dev;, j- M3 A) j8 Q* n* b* R0 b
unsigned int DRR_data;& _9 O( k4 H1 i3 {0 m' \
unsigned int DXR_data;
% z# n- M; {$ I' O, o* o/ t+ jstatic int mcbsp_open(struct inode *inode,struct file *file)
0 H0 |% f8 ]( F8 d! X5 ^9 h{
, ]1 F' Z# n* c& [  w$ G7 D   
% J% n4 {+ H* t) v   //interrupt enable,initialized
1 }1 O3 Y5 t. h2 J+ B. x! M   unsigned int temp;+ u# A& _, c/ v7 L, t5 R) }  F
   //SLEEP_EN(GPIO8[10])---05 _6 r5 O! E( }: W6 t* H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 t6 {1 Q" t% i1 B1 |2 Q' @
   temp=temp&(~0x00000400);
7 U5 m  ]' e" f8 q1 H- m) ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& i# T' }5 h# M, s: ]# d  //RESETn(GPIO8[8])----0----1% x2 s( \( s2 k0 A6 j' b% U
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& g* p( s+ C; o1 T% {' W% B+ w5 @5 z
   temp=temp&(~0x00000100);2 |+ Y8 e  \. o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 P: r& m' T' b! |  i/ h' _  c- L
   udelay(100);
4 S  ?7 F& V: ^: i   temp=temp| 0x00000100;% D' J5 [2 a, u3 n; ~4 r3 W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& ^1 V( \5 I5 `  ~* S9 ]: n   udelay(100);+ O- H3 E) Z! Q
   printk("open success!\n");& w$ [) i$ p5 T& n) A% J8 j! n
   return 0;( o9 ?/ F) o3 `) Y% l& |  c
}
; h6 c, W" Q' V1 f( i) j1 R* p7 b, |4 G9 ?: \
static int mcbsp_release(struct inode *inode,struct file *file)* N) g0 _) ^& p5 S
{
! \7 U  v  m" F! @7 t   printk("release success!\n");
' z- j+ o- L  `- d   return 0;
  g, M$ {* Y( N' ~+ U6 Y}7 i+ E* U" }8 p$ s" T
+ ?9 \) j3 Q; `7 J/ q+ i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); W. P; s! T* M: E+ K6 Y: K: R
{
, ~0 G8 @6 T5 t) P( o, w    copy_from_user(&DXR_data,buf,len);
3 s( V+ F& a3 a6 p  u5 D  _" O1 K    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       8 {, Q( w, w5 h9 Z% A+ T7 _. v
    return 0;, r8 F' W3 _. Z4 [! K7 Z3 {) L: \

  m, \5 E+ g$ A  P  y}
6 o! e1 @$ o3 k) N4 W( @/ F' l, }4 e, H3 ]
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). J( _* H- d3 i; i% f5 Y+ Q9 B
{
4 e/ G, k- Q' ^+ b0 t   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. h9 j0 W/ L. _8 H; N5 i" C9 O, f   copy_to_user(buf,&DRR_data,len); 7 H& H8 [  M  q9 `% X: n
   return 0;# w, U* ]* G6 @( _6 C$ _' q6 I
}! N, m- S& ]7 }2 F
) P; u8 [1 m- |& b  h2 H

* Y# }) [6 I: m. x9 Bstatic struct  file_operations mcbsp_fops=# q9 Z  `' Y, b  D% c, }# Z; n; D; |# l6 A
{# t; [8 _3 H1 a( d
   .owner=THIS_MODULE,& K9 x- B$ w+ }3 f- Z
   .open=mcbsp_open,5 s3 k9 f, p% k! f6 G+ R/ @- h: \
   .release=mcbsp_release,
0 B) t# S, e8 C1 g7 ^   .write=mcbsp_write,. B1 [, q' t& I+ b+ e" U
   .read=mcbsp_read,( _1 D7 I! t4 c( x
};9 _1 o  x. Z9 C
static int __init MCBSP_init(void)
! ~" D0 [8 L6 B& O  K{* M  T, Z  f! ?4 M3 g
   int ret;
6 j) f! q9 C, s3 \! }1 V0 O   unsigned  int   PINMUX1_REG_old;" h- W* X  O2 M; f
   unsigned  int   PINMUX18_REG_old;6 b( q; p& Z+ S1 m* z  u7 ?
   unsigned  int   PINMUX19_REG_old;) ^! A3 a' g! \( c7 e) f( n  E
   unsigned  int   temp;  " |$ V! j% F8 A' h
   if(MCBSP_MAJOR)
% Y) g  o  q' S7 _" C9 n   {1 l, u) {7 D0 }
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ S) Q" m  s' j( }: l  q3 W      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);2 n) ?+ q& i: A) v) U4 _( a* h
   }) a4 M& U: Y+ V6 Q' m6 f! @
   else% O, @( C& |2 _+ m" I/ @
   {+ I5 }) h4 h) O
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" J1 h9 \  J) h/ d  F! c  ^, F2 G* d
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) q0 ]" L  f4 w, R3 J/ Y   }. K. B7 f( A6 ]
   - G5 k9 a& }$ @  M* s
   if(ret<0)
; K1 W0 M8 j) `   {: D- f8 s) v7 Y8 C0 a/ Y
      printk(KERN_ERR "register chrdev fail!");
* o6 L+ H5 p8 H/ c" p      return -1;2 ^$ k4 Q+ J( z5 m
   }
4 y- H1 @8 h! o6 d   
  Z3 F: ~. K; j( C$ Z0 e. d8 S( Z* ?   mcbsp_cdev=cdev_alloc();* s- p2 \" F$ v& O+ B, S
   
  _( I) {& b! M' A/ L- c   if(mcbsp_cdev!=NULL)& U5 G4 w) w- d( M# ^6 V5 a
   {
4 z3 B$ K7 _) ]8 K6 U$ w# N  ^. m      cdev_init(mcbsp_cdev,&mcbsp_fops);0 s. {% p% E0 D( r
      mcbsp_cdev->ops=&mcbsp_fops;
+ ], `# x) F* z6 D      mcbsp_cdev->owner=THIS_MODULE;
! L+ _; q) J7 y; N) Z" k      
, W3 V/ R* `' X2 u: ?) p5 X( b      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# ^9 E, q2 b% W3 N, [
          printk(KERN_ERR "register cdev fail!");4 d8 j$ K2 ]' I& |) E
      else9 }8 }! F, Z( }1 t: n) `
          printk(KERN_ERR "register success!\n");. v% S2 i  n% c% L7 ]/ c, [* n, ^
   }
) ]+ X0 ~% s/ b/ D/ v   else
! j6 F1 d  H, \4 K: z$ X. u   {/ V2 H9 p) a1 ^( O1 F' }
      printk(KERN_ERR "register cdev err!");
) w6 P! o8 B% E/ @- f. _" L      return -1;. S5 W" y+ q/ a3 Q5 B3 T
   }
. O$ K' ?. B: Z, [. W2 e1 R" B2 x   ) e: R: t2 F- d; o& D
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* E& T7 Z5 u) J! W$ X
   if(IS_ERR(mcbsp_class)); L4 a) _+ T+ {! E3 \  h* E) `5 Y
   {/ Z5 a  C7 j+ g
      printk(KERN_ERR "register class err!");
* H7 r5 W* V1 |% s8 ^5 E* ]* ^- j   return -1;
+ x1 L' m" j7 S$ a1 _   }
1 H0 f! S, p9 ~   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 V& ^7 j5 \: D4 `9 B$ L
8 [2 J+ @  H; l
   //PSC7 Z3 C3 x$ g+ N: ^
   //add Enable MCBSP3 W. a0 o4 T3 t: w6 F$ k
   //test
# h- J' r7 v& W' ~* _2 C% ~   temp = 0x80000003;; t: g, c5 @9 W! L* Q: m% |2 ]
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ a+ M3 s; U6 d0 S5 C7 V
   temp = 0x00000003;
# V2 \: ]9 X- O) U6 d" n" k+ u* l0 r   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 \) N7 }0 R, ^2 W# n8 @( w ' c+ _9 h0 Q( Q, u1 t/ e# j
   temp = 0x001FF201;
+ A( X0 }! J; C4 @   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  z) }! [% V+ z   
4 e7 Z7 Z, t; R   //PINMUX  & [2 N+ I5 L+ U) |; v% L# i. X
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 I# j) l& e; J& B   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
6 a  Z4 Q7 O: r7 V) a   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! y0 r3 n8 [4 r: n: P% K2 q0 A   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 i0 l8 m$ x( ^* p5 w
   4 F3 b, M9 U. C
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
9 \9 X  ^! p. f5 i  V& U6 K, {* V   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 j& C# w* c. y   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   1 p8 P6 Y7 }/ _/ Q* `# N$ [* a
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 M; {8 b2 x0 O( k : a! @  U# S$ D, K2 e: m. z+ ~% M& w
   //RESETn,L138_SHK2
! t" A. R: g. N& W% U% x5 O+ m  C   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
1 ^7 i" \7 D, @/ E. }, Q   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
( `' S$ r7 R6 I5 k   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 A  n  Z9 R* n* n % {4 f7 D# s* R4 q

1 M8 \8 b8 Y) h% q( z% i; h: A  //SPCR Register
' K, L: }4 z! y0 L7 S& [  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 H  C! Y. p0 u9 Z! ^; P- u  temp = 0x03000000;//(DLB=0)
  C  o0 `: m( f0 |# [' f // temp = 0x03008000;//(DLB=1)) M/ c  z5 m3 n3 [
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset3 P6 @3 s8 ]& F2 q" u
  temp = readl(IO_ADDRESS(SPCR_ADDR));
! o& `6 l6 T( L3 d$ t' w1 j' c  printk("temp=%x\n",temp);
2 H, z! d4 V5 h8 z* q* n$ c# J
$ `! r: u( t7 i5 t   //PCR Register
, d2 |! H) \8 j/ |8 `1 o% b   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 A7 j! F, S1 c5 S% j! g- m. z
  // temp = 0x00000F0F;. G& k" U# V, m8 `" @
  temp = 0x00000B0F;
7 C" T+ J9 w' S" ^( G  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
7 D, |# R, x( C4 |4 R  temp = readl(IO_ADDRESS(PCR_ADDR));! b9 U7 {) C# W! G  x
  printk("temp=%x\n",temp);  
+ l' w: R# k" j$ Q% y, X   //SRGR Register3 F) m& X) D5 V' `' `5 K; E
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. X+ a, c1 \# P9 ] //temp = 0x301F000B;
. }5 G3 i$ m: k& @   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* x3 X/ O' G' ?# B- Z* [# G: L/ r  temp = readl(IO_ADDRESS(SRGR_ADDR));
6 b2 i. }0 `$ O$ H, s2 J! H  printk("temp=%x\n",temp);
$ S+ ^+ O9 L# m7 {7 m  O   //RCR
- F% e- R5 s4 @+ x   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. P3 ~0 m1 B" c
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 U+ }# v4 Z; W1 e5 j4 X8 E
   temp = 0x00440040;9 p* v0 F& g" _" r! Q
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   2 p7 S5 `0 O9 ]0 L
   temp = readl(IO_ADDRESS(RCR_ADDR));2 [" c0 _5 D) x
   printk("temp=%x\n",temp);; O, H) X# a/ @$ w
   //XCR$ S' v* D1 C0 Y. ~$ {, w- ~
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- H$ l( _5 Q% k# z' J
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 u9 ?( Z$ f6 [0 G0 T
   temp = 0x00440040;7 y# g( H0 }2 b2 P: j9 y& F
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# d) O/ C' n! q6 F1 P6 `" v" t   temp = readl(IO_ADDRESS(XCR_ADDR));; {5 g. \1 O7 a' V) I; s: H
   printk("temp=%x\n",temp);4 O2 J' o5 A2 Q# {" H  l
  udelay(100);+ o! W! p( t8 K2 ?  T! W
  //SPCR Register
+ p6 O% B9 E. {+ J; E; Q6 o  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1. {4 J% b: ?' H; D4 j
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1) P% i  e  }6 u+ J  `! V
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 G- ~; ^7 y6 G$ X" Q3 I- ]  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 H% Z$ \1 Q% c8 w) a* g6 T% z' ^  printk("temp=%x\n",temp);
% b7 ~5 I) d% N  J  udelay(100);
" ?& u) |" Y$ i9 ^6 Y
! O" p  W/ A+ g( ]  //set GPIO direction
7 L$ V& g, C( Q1 H8 C   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 t1 w" ?+ \8 k   temp = temp | 0x00000100;//EPR----input9 T- l" |# h/ R! D, i/ G
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
8 Y! H- o( I. s3 Q7 @' Z3 ?   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 j7 d  L9 i' l6 y/ m7 x
1 `' `' |5 {; f4 ~: v1 X8 v. f5 L8 {   return 0;
  Z/ Z3 t, p# b7 h8 o  G- O# p}
$ Z+ X* ~$ @/ {: \0 wstatic void __exit MCBSP_exit(void)" }# g7 G7 K* ?1 t4 L
{& S: A4 G$ `; N7 O! J6 @& ~
   printk("mcbsp chrdev exit!\n");5 w4 Q0 r; x4 i1 c0 T! ^
   cdev_del(mcbsp_cdev);" G7 C- e7 P5 i1 L. `
   unregister_chrdev_region(mcbsp_dev,count);
) k; r( d$ q* v   device_destroy(mcbsp_class,mcbsp_dev);: ~0 Y; w5 n1 Q) d5 X
   class_destroy(mcbsp_class);
2 p5 ^7 O, i( r# c/ h- O}
6 n* h0 o1 M8 Pmodule_init(MCBSP_init);+ _/ ?4 i7 `9 m' r1 D% J# Y0 Z( X
module_exit(MCBSP_exit);
( g. W# V1 M# ?7 {# i4 a4 M6 ^$ H) d
MODULE_LICENSE("GPL");
' \) r3 @+ {% Q8 X7 M
7 f" |0 h& c. J' x我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 D5 N  L; [( S  }2 j  K
我的应用层的测试程序如下
5 g( V  V6 p  C+ W/ |: j  O#include <stdio.h>
9 L4 o) `+ i; a# `; p1 q#include <string.h>
4 Y: G* w5 r/ H  e  f#include <fcntl.h>
9 x6 F( ?3 w8 d+ `4 m: R8 U#include <unistd.h>  z% T1 ]! E1 T' H1 t0 S6 a
#include <signal.h>9 t2 \% f# m" F. g
#include <pthread.h>       //线程; @/ g1 F' J2 P
#include <stdlib.h>9 f9 |; Q' h7 o% q8 C* a
#include <pcap.h>          //捕获网口数据. Q2 L( R0 y( X7 `7 h' I2 v# I
#include <semaphore.h>     //信号
9 X, y7 `: ]2 G#include <sys/types.h>     //消息对列% ~) J( @+ {) e8 Q
#include <sys/ipc.h>       //消息队列" g- I- @8 Q6 u2 r
#include <sys/msg.h>       //消息队列
2 n! ]. F' A& \4 Y" f" k$ J8 T9 i#include <sys/select.h>
4 r8 ]' C: I+ V" {3 {& o3 p#include <sys/syscall.h>: n% C; V$ o' W' p0 s# f
#include <sys/stat.h>
4 `' z+ o0 M) {& ]$ i#include <sys/mman.h>. P3 e$ y: e' n8 [  |& A( X
#define msleep(x) usleep(1000*x)
3 V+ i! T7 k! o# R( w
" L' s1 w; v+ x9 uint main()* R! K) ]& Z( `. S; y
{
- G: |" W0 R  q" R    //MCBSP,ARM与AMBE2000交互设备3 `; A4 ~5 u& K) N7 k. w) G
int fd;
9 F) ^+ }) Y4 b8 H unsigned short data_write = 0x5555;
  o: U/ f6 U0 [3 D unsigned short data_read = 0x00;
9 W/ m8 f5 v" q7 V8 z5 O  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 `4 M( z& U) a+ b5 A1 N
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 s# W' n* e4 |6 j0 e1 U% I# l    , I: k: [4 V1 \* `! s6 r
  if(fd < 0)3 v  }8 y; m4 i9 F4 X
  {
7 q4 T6 X" T$ l$ Y     perror("open failed\n");
: K9 @7 a) F. S- j     return -1;
  i) d! H$ Y. g  }
  W  n% L9 M; K# x  3 T$ E) T7 y% @- S& S
  while(1)& s' ]/ n8 u4 S6 D. H4 Q# v3 e& @* `# V
  {
# t* D, ~- b! X# y1 x$ {- @   7 o0 C* A' ^+ n5 q5 g5 g6 P
   //AMBE2000每次读写是24个字为一帧$ ?( ?# y8 I5 i2 Y, n: X
   //写数据时将数据在底层存储起来,等到中断的时候再发送
% U; X- a9 `( L8 F- @+ G   //AMBE2000输入数据是以0x13EC开头的
. I( v$ P; n0 c5 p# C, h   write(fd,&data_write,sizeof(unsigned short));
/ l0 E# t! u$ N* W' m& S! f   
# \- W  A3 y; ~2 S7 ]   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
/ v. ~- |/ }& T* W& K% d! _1 p   read(fd,&data_read,sizeof(unsigned short));
  u9 G* P5 M6 i+ H7 I% y   : {5 M1 t5 i, B) _0 _$ s; ~, y
   if(data_read == 0x13Ec)
, v! ~9 d, V* g$ p3 R8 h   {* K7 D5 T- N% U8 w4 p
   
0 g' @' U6 s5 f. K( i    printf("data_read = %x\n",data_read);
5 K9 t, B7 h3 r5 \8 @  f   }
4 M% \9 F* b7 y   
) W- l$ n6 H. X7 u. @   msleep(10);
  |0 e( A  y3 ~* O6 H  
* b2 x8 R  J( e& n  /*0 v2 v2 }3 L6 }1 x
   ioctl(fd,1);   
  B1 W/ Y: g  N% }+ {: g$ @ sleep(1);2 A9 Q3 n3 j7 v! P0 Y1 P) y* u
ioctl(fd,0);
! j2 n$ }( D- u. n( d sleep(1);0 b4 o. y9 v9 _& ]9 B3 O$ b
*/
$ d# {8 f7 p" x) c% S# [# }/ i  }   
' a3 `7 g. \) I5 V4 P+ G return 0;
2 I4 @  f+ H* o# u" x1 u7 ~* D4 k 0 [2 G$ ^, b6 P' n9 n& G
}
0 N3 t% T; n/ P# N; ], w5 N' ?0 J4 r& G; `: l1 ]  X6 \" i
多谢各位指教,谢谢! 急' r8 w. E3 t( k3 I9 N6 N3 U
' o3 t7 ?" \- G% h" d% A
6 a8 W4 ~& [4 `- b

: k! d4 i9 k: l/ z! J: Y0 P* y, G/ \' j9 p1 m! C( ?( g

# |8 h1 O; c) ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 06:21 , Processed in 0.046768 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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