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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  L$ h- z/ i- J  u. ~' M+ |/*$ u4 ~: e+ Y, e; x
* Copyright (C) 2009 Texas Instruments Inc3 a1 o2 d4 Q, p, c+ t# Z" D
*: R' \2 r( G9 V; G* }: X( z4 Y
* This program is free software; you can redistribute it and/or modify( w; ~9 g5 ?% Z8 v$ }8 w
* it under the terms of the GNU General Public License as published by
8 O- o3 z( I" P. P. S: ]" q * the Free Software Foundation; either version 2 of the License, or( |* C  _) |6 a
* (at your option)any later version.4 z" j+ R) I7 e0 r/ _" u
*7 L7 }" d" X. a, G
* This program is distributed in the hope that it will be useful,
7 i1 Q4 E- Q+ O. b$ v! ^ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 c8 p6 z% M( [7 ?( l * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 ^  D1 n+ n. P+ @ * GNU General Public License for more details.
) C1 y$ n9 r: |% E. L *. E6 G8 D+ w* z$ I* Z1 P
* You should have received a copy of the GNU General Public License
# ]+ T8 \0 T/ M * along with this program; if not, write to the Free Software
6 w) q- q. U; e7 i; A* j4 R * Foundati
( S0 c+ z( i8 O' V5 F# C* m% Q*/0 I- ~4 L( l* ~; I6 ~( J/ k% w
#include <linux/module.h>
2 `* }) k9 ~4 H. A. W4 p#include <linux/init.h>
; r1 m. w+ o3 T' s/ U#include <linux/errno.h>( h+ j& P+ b) `7 ^
#include <linux/types.h>
2 B4 h+ i+ K. f0 ^9 K9 b#include <linux/interrupt.h>( ^  D  b0 m8 H: Y  I8 A' A
#include <linux/io.h>
1 e8 K$ [) Z- m  [8 \: h4 _6 x2 |#include <linux/sysctl.h>; s, \- r" S0 ~4 A/ U
#include <linux/mm.h>. p7 R2 s2 l- F* t5 K1 B, n
#include <linux/delay.h>( s# H* R0 M. [8 r/ i
#include<linux/kernel.h>. [) s8 J* ^  P
#include<linux/fs.h>0 y, ^# M# r! l; s% r& L
#include<linux/ioctl.h>
4 ?0 X! [: d( {6 l% C8 {#include<linux/cdev.h>
8 D. N- b& l5 K3 M, J5 B0 v" z+ I#include<linux/kdev_t.h>
- [6 k9 ^+ G; p+ o! n) f2 p9 @' D0 P#include<linux/gpio.h>
  R, g; n$ V7 R# g3 `2 U" J#include <mach/hardware.h>
) J3 Q7 c7 J% i0 y  Z! V#include <mach/irqs.h>
" T  E# Z+ V+ P- `
# \9 b6 i2 `* K#include <asm/mach-types.h>
. A6 U0 p1 w2 G; f) Q#include <asm/mach/arch.h>
  D; f8 {4 E0 V: f#include <mach/da8xx.h>
4 I, V- Z+ M7 g0 I#define  SYSCFG_BASE   0x01c14000
( K8 D, Q) `1 b8 D#define  PINMUX1_OFFSET   0x124 ) V' |& k( I$ l
#define  PINMUX18_OFFSET  0x168
* i) M- E: N, c9 K#define  PINMUX19_OFFSET  0x16c
/ y- d, J$ f- M9 B( @$ @#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
, R& F0 t! Q/ m7 A#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR% ?% J9 ]1 C! F) e7 [# [
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 x, u. f8 ^# y3 h#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
. i; k4 }* H+ t; v6 Z% }7 s+ N& j#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR4 D5 n+ ?6 g: y4 ~# T
                           
) R& z7 `2 N0 O#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
( i& m9 B7 f8 E7 I#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 K) ]/ d: i3 }- y8 B//PSC
* J5 s* V- K- a5 E, i  k# Z6 T#define  PTCMD_ADDR   0x01E27120  
( U0 x- P% I: B1 c$ `1 ?#define  MDCTL15_ADDR 0x01E27A3C' Z4 H' N. K+ R' V2 h1 @. c
#define  PDCTL1_ADDR  0x01E27304! I! k$ J/ I) N# X4 h; P  N* z
//GPIO8 direction
1 y& }* Z( s$ O, p  I5 o7 V/ D0 ^#define GPIO8_DIRECT  0x01E260B0
9 t' R0 m; O4 y3 [#define GPIO8_OUT     0x01E260B4
8 _3 W3 x' Z% ]  `1 X#define GPIO8_IN     0x01E260C09 }+ \. q) h% w8 s! ]& T/ G  _

( r; B+ i- N, h9 E% \5 v, b; j//#define MCBSP1_RINT    99              9 Y2 ]7 z6 f- u1 m0 X1 [6 W
//#define MCBSP1_XINT    100  
  X0 K0 t4 T+ p. W" dstatic int MCBSP_MAJOR=239;
1 h, t/ G9 q- d- ]static int MCBSP_MINOR=0;) D0 A2 l! R6 s5 @% w8 n' x8 t
static int count =1;
2 j( {2 b  p) ^7 X# t6 B2 S! E2 Y  j, m" W
#define MCBSP_NAME  "MCBSP-device"
+ O( a# p& K3 z3 F/ T  z4 O* [3 ?. [
static struct cdev *mcbsp_cdev;
3 D" \. W. y. z" u5 d& S* _5 w+ Vstatic struct class *mcbsp_class;) V/ }) l1 q( _; ^3 V: o* W
static dev_t mcbsp_dev;" h% Q2 C+ R- B% ^: Q* y) ]" O
unsigned int DRR_data;
* f7 y$ W3 w7 Q7 {# C, Ounsigned int DXR_data;, g9 x8 _0 u  O3 H$ [
static int mcbsp_open(struct inode *inode,struct file *file)
: L. l  W) m$ r6 {' t; V{1 v  b& S. C- J* Z0 Q1 \
   % X. q% v* i0 l" w+ Q2 B
   //interrupt enable,initialized
! J5 r# K- s8 I5 z   unsigned int temp;9 v% ~! O) P( f  Z6 X, G8 Z* @
   //SLEEP_EN(GPIO8[10])---0* s9 [! {; |* F; P) R- L# q+ X8 b
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* B3 {$ r' {% F# a   temp=temp&(~0x00000400);6 q& X) r6 F5 S: x9 i$ C) j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]  G( l& Y2 m  G
  //RESETn(GPIO8[8])----0----1
0 T; [; t: d! f  o; p" ?   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% _: ^7 W' h0 [5 x( O
   temp=temp&(~0x00000100);
, \; R. Q/ U6 p& ^* T3 {   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 E+ j+ b( Y6 R& y$ g" ]0 A* ~
   udelay(100);
9 A4 \2 Z. z, N   temp=temp| 0x00000100;
$ e" \3 m' ~+ z) {; x5 d   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1- L! ~( J+ Q' K7 I" |
   udelay(100);  w2 q9 i: f" d& x* r9 `
   printk("open success!\n");7 b4 ]  c1 [& x; ?6 h+ L& c+ t& v
   return 0;6 v. v* |, ~* A3 c3 e
}
6 Q. ~% y  B! q; M" a# g% z$ p. y9 i$ n2 a) W
static int mcbsp_release(struct inode *inode,struct file *file)/ |0 |) k, g6 k  M6 m
{& t8 i; |/ X5 R6 c
   printk("release success!\n");6 q# g& w" @7 |$ }8 Q
   return 0;3 P- q: Y; S' B9 p& s' I6 o
}0 \5 `$ E. C$ a
* G) z3 O5 m& A, X) [7 r1 l4 \
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- _. k! a3 h0 ^& E0 I8 R/ p# ]
{
$ \$ \; d/ D( ?, T! E2 C    copy_from_user(&DXR_data,buf,len);1 n- I' N4 R/ m% l. E) a6 O
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
- F( e( [' r, u: H" v7 x7 G$ E    return 0;4 z; k+ `7 H! V# P" i$ S

: z2 n  ?; Q& D* P}
: Q) S( ]  q& }$ L/ F, J0 H: O7 W% C( x: B: M
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 J, S/ p( y. z- T* e{
/ s% N% _- J% F7 J& N   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; G7 u8 ?. b1 L3 t7 Y4 _' r
   copy_to_user(buf,&DRR_data,len); 6 E! V" N+ U' t  ^+ ]& f
   return 0;( A0 N: S, m, c1 W- l$ O6 F* T
}
( Z% B+ m8 g4 _5 `/ E0 }, O( w- j) z6 P2 z

: R' q4 `, p  o  b6 d, C" Kstatic struct  file_operations mcbsp_fops=
4 H% {- Z$ e+ X2 Q' O# B* L{3 J! \1 ?9 m9 C' \
   .owner=THIS_MODULE,
7 P5 V* O* A4 a* |7 G1 X   .open=mcbsp_open,
# Q( I+ _/ b  a% T2 \% e# e   .release=mcbsp_release,
1 B$ X8 q9 h+ h' T# O) @& N- N. w   .write=mcbsp_write,
# a5 g' h/ W6 Y   .read=mcbsp_read,9 R2 w& [. E% R/ d! A) S$ x$ e( \7 `
};
: ^, X4 j$ h8 `! W6 ~' C! a. X- Dstatic int __init MCBSP_init(void)( X- h6 [  e: h
{
) G7 Z( M+ e* v, l+ B   int ret;$ u6 x, L' j, ^1 U7 V8 [# j
   unsigned  int   PINMUX1_REG_old;! u( S3 C+ `1 k! {6 w
   unsigned  int   PINMUX18_REG_old;% @) A  v: n% A0 |" c, R) G
   unsigned  int   PINMUX19_REG_old;" @& h5 }: g  X' a- ]
   unsigned  int   temp;  
* C, @: h  e1 S7 c& |: g   if(MCBSP_MAJOR)
! C6 }9 Q3 t6 j% O( I2 {   {
; v, U4 j- ]8 `4 T5 |      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);4 E+ e* E8 k4 ~+ @1 E% C
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
8 i$ ^; p0 Q& r4 I0 x4 ~" Q   }$ f, R. }9 U+ M) v# c
   else9 E8 |% l' s! e% P& F% F
   {
: e! V' g3 R5 v6 W      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- E( W# T+ C, W      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ r8 ]7 W* _$ c/ e$ @. \6 B; V   }7 t' t/ j6 X% L; G5 d% E# y
   
+ a! t5 x& @' o# n   if(ret<0)
7 h) O8 z: Q9 t4 D" m, T   {
- n1 o; o0 J, B  z      printk(KERN_ERR "register chrdev fail!");% X; D8 \; ^8 Q0 [
      return -1;
9 K9 z- ~4 _* i' l6 Q5 h' i- G5 z5 u9 J   }( L: d6 d9 R: \+ `
   $ V/ W: ^% O* M9 E# u4 @5 k9 m
   mcbsp_cdev=cdev_alloc();0 X9 a/ r; i# G8 E; L; j0 f
   * i; I; _0 O7 e2 m
   if(mcbsp_cdev!=NULL). O. C, A' ?4 ~, ~6 c9 y" ^
   {
2 u2 z8 @' z& V  v4 V      cdev_init(mcbsp_cdev,&mcbsp_fops);0 ~1 m) i" b" I/ f
      mcbsp_cdev->ops=&mcbsp_fops;
; {) R( b# [, b/ W      mcbsp_cdev->owner=THIS_MODULE;
+ V; ]5 q2 D( n( J. j6 [$ B& m) w4 y      
9 e9 Q6 _( j( n' S( y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); y4 D* }! C0 T
          printk(KERN_ERR "register cdev fail!");- ~. J0 f. ^% L6 z4 `4 x) d
      else
' L: P' t( Y% T3 z1 s          printk(KERN_ERR "register success!\n");
; ~# B# O/ A) Q+ d   }
  V7 d% @4 Q# t; V7 J8 A) Y   else& t9 p" U6 \0 g$ X2 _
   {7 A9 V5 U* P- F9 @
      printk(KERN_ERR "register cdev err!");' U# r3 l- o3 r5 T) E
      return -1;6 S. x% C$ a1 g; [2 B: [. y* B2 b5 I
   }: p# \+ m! V# m3 p7 J
   
. A& G( o$ t! J9 ~% K  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- _$ e. F: L: W3 s4 w
   if(IS_ERR(mcbsp_class))% {. i/ p7 ]4 U, y" t# }" E
   {- l7 ^* M# H$ K" p+ r. b1 k: x
      printk(KERN_ERR "register class err!");
4 ~4 D) ~% }& v: D2 p   return -1;
) Q% G! D7 a* B2 \7 N4 f   }
/ J% F% v6 m6 M5 n   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);: c1 E/ d  h0 q3 Z6 t& L

& u7 z, n2 d( z; c( `' h/ s( l- ~   //PSC
7 W+ k  r) M6 G% b$ M) ?* r   //add Enable MCBSP/ `* N( g3 ]- }7 T& l0 [0 A7 k
   //test6 _5 ~+ s9 v8 J, y& U3 J
   temp = 0x80000003;8 D3 V3 }0 @3 A* q- [
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ p5 y8 o6 d# I6 b. U
   temp = 0x00000003;; E! J# ?: ~8 ]3 \4 w
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& c$ |1 c" K4 x
- Q$ c4 }9 c+ A/ _   temp = 0x001FF201;. R6 q! l, l1 \
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% |: \* ^8 l4 r& W: b- s. `   " D* x0 G1 q5 {* `
   //PINMUX  
. x9 V% G# b) ~   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,6 {) r' }; s+ h  m1 u; v
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  + w/ e/ U: t9 R2 d. s/ C, j- ]* V! C; _
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - z. |5 u' q9 s: u. D+ O
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);6 Y" E( j: n/ j( R; \' b+ Z
   ) s$ h- m- E/ ^) l& n1 s; T. p
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, e& V9 W1 S7 G" i* I, q* w   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
: p) e. @  Q% |, G2 x# Y% I7 |7 c   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% s5 `. }+ E0 P) y' u1 C+ x   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 N  s+ I. w5 H 6 B# p0 Q- F/ o  A; Y- j: z
   //RESETn,L138_SHK2' d! S: h5 l- k" M$ E" i
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);    z2 u! n) u6 u$ A
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 w' o& G. ~: V" Q   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% I8 X2 A  G9 c 3 F8 j. n  O% e$ ?# x% u
8 W4 m4 e5 Y% O
  //SPCR Register
# h) y2 X, O' ]5 i4 |  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset% r. O) h" [3 V4 I! Z
  temp = 0x03000000;//(DLB=0)
. y/ F0 n" ~8 Q- X // temp = 0x03008000;//(DLB=1)1 C6 m6 ^! o! X
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% r* W! a$ J! i% ~3 c8 D. x  temp = readl(IO_ADDRESS(SPCR_ADDR));7 U$ `/ u+ [: \4 W5 Q5 f% y* C$ c+ o
  printk("temp=%x\n",temp);
7 V. {7 g  h/ E# r
* a6 J* v0 x( S2 O   //PCR Register; p/ I- M% B7 {2 u
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 _7 j0 v+ E- T" Z/ }% ]0 X6 r9 f  // temp = 0x00000F0F;0 `: l% S3 d. X/ P$ d. L1 @3 `7 H; Q
  temp = 0x00000B0F;* Q( c  V% ~3 X- F
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   {# Q& \& T* u, o
  temp = readl(IO_ADDRESS(PCR_ADDR));
( {( H( X; l; R! d  printk("temp=%x\n",temp);  ( q, o( ~3 h& b* q
   //SRGR Register
. @1 G1 i. k( n' j2 b- e   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
1 |9 d  L9 j; \% ^! V5 z' _ //temp = 0x301F000B;
& [( ]/ Z' m5 w, ~" n   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
5 ?8 z- w. q9 E" H- i  temp = readl(IO_ADDRESS(SRGR_ADDR));* m0 }! D% e& L4 p' O9 t
  printk("temp=%x\n",temp);2 c6 U5 }3 A3 k' x# Y
   //RCR
+ B2 x7 V$ r0 m5 S   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 f4 d" ~7 h, v' N* B7 m, p6 Z: x7 z
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0/ @# F  D+ I8 ~' f* s& ?
   temp = 0x00440040;
7 x3 [" B5 j/ B% z( K' b& U, x/ b   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& j" K# ~3 d  o- u; j# \/ w  p   temp = readl(IO_ADDRESS(RCR_ADDR));1 ]$ D% c; |9 I6 C$ t8 ]
   printk("temp=%x\n",temp);& q+ L0 Z% ]$ m0 E! o- G
   //XCR; V6 C! p1 t/ F* i4 I
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 G- a, }2 p0 ?3 Y; z   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) S$ a# C. [7 P0 T  b   temp = 0x00440040;: Y" I5 G( i$ L/ t3 m6 f5 g+ ^6 s
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
, F' p4 D- B% P   temp = readl(IO_ADDRESS(XCR_ADDR));
) }' V/ G& A" o   printk("temp=%x\n",temp);) D+ s% |( c; J. n% m$ F; r  D
  udelay(100);
* O2 V8 e5 x  Z  //SPCR Register
5 y) D  w  o; Q8 W$ i& E* ?6 J  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 N, ]9 f6 Y  P: [  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  V% C8 S) f4 p* k6 U3 }
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled, s9 q3 D3 _' A( B1 V" f
  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 w- U  f2 J) B8 y) O  printk("temp=%x\n",temp);9 g# V, k% N  l* I) z+ U0 ~3 X
  udelay(100);
* n( w4 b/ z9 Y1 R6 ?9 H
% I$ v, ~! J, p3 w5 M8 J  //set GPIO direction
: Q+ S, [) Q9 }" T2 F( E4 G4 q2 R   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- C( o1 }3 B  R" \6 F   temp = temp | 0x00000100;//EPR----input
8 P" M# F7 Y$ f4 m   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; P! |# X2 C0 e7 ^+ \7 G9 r   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 J0 ^, p7 r. N( F9 U8 b % |% S. V0 c  d& L3 V
   return 0;1 j" {0 N$ c' C  j7 `$ V
}1 Q8 k" L! r. g7 k" C7 G
static void __exit MCBSP_exit(void)/ `9 ^3 e9 P% @) d
{
2 j1 ^& G- W/ m3 W* B+ i   printk("mcbsp chrdev exit!\n");
  @) A# y9 l0 E' F' d   cdev_del(mcbsp_cdev);. T1 p/ q. T4 {1 o1 f8 i" x4 j" q
   unregister_chrdev_region(mcbsp_dev,count);) z4 w: h5 {$ M' Y' X0 C* Z
   device_destroy(mcbsp_class,mcbsp_dev);
( w# b" Q& n+ ~5 g% t2 K   class_destroy(mcbsp_class);9 d+ [8 A* ?8 |  o& K6 w5 U. k
}, ]# G, ~4 n# F6 R
module_init(MCBSP_init);
8 a2 |9 C) l' C7 D$ ]+ c/ j" G' Rmodule_exit(MCBSP_exit);
1 M' X, d. c& a
8 L5 L# A8 Q. i; CMODULE_LICENSE("GPL");  e' i. L: E5 M7 D6 {6 f
/ Z. y1 o( I# f' o+ E$ J1 f2 \& G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ R  G  _4 Q4 t9 j7 h$ u+ k9 l我的应用层的测试程序如下
; `: @# W0 Z% b8 M  w#include <stdio.h>5 t: \2 d1 _+ W, q" q  n, J
#include <string.h>6 H+ {7 L- D. ^! c- c
#include <fcntl.h>$ N3 M! }, ]8 L1 B3 X/ X7 S
#include <unistd.h>$ x/ ]5 z8 B! v2 @4 M9 v/ C3 a8 h+ I
#include <signal.h>
1 L9 v& {& G4 @: x. a. q, s4 k5 f#include <pthread.h>       //线程
/ ]0 y( _" G# V- c6 z; Z6 ?0 g- m#include <stdlib.h>7 U5 `2 ~& `4 K2 r1 v; O6 B
#include <pcap.h>          //捕获网口数据) m$ `6 P8 y) E
#include <semaphore.h>     //信号
  q9 t: d/ [3 \% C0 ?3 X2 r#include <sys/types.h>     //消息对列
; W! }. r4 S; f4 Y+ i. b#include <sys/ipc.h>       //消息队列: P% E/ E# [6 m* c: G) P3 U7 S
#include <sys/msg.h>       //消息队列! r- _* h) ^8 `+ [8 ?
#include <sys/select.h>
4 E3 F& G3 ?! O1 d+ f4 a8 Y5 s. Y#include <sys/syscall.h>) T: b7 ^& ?  A  m# y5 n" c4 {
#include <sys/stat.h>
0 N* C) i: A" j#include <sys/mman.h>; O. u3 C2 @7 C, Q4 n
#define msleep(x) usleep(1000*x)- G. V9 H+ B5 c" x+ B
5 W+ E7 T2 k0 ?2 ^! p. B$ |
int main()
' n' H0 e" p5 ?{ ) M& l5 }5 z: i9 M) t4 D
    //MCBSP,ARM与AMBE2000交互设备
' \2 j6 ~) Z8 G1 F2 _. v int fd;: C, n8 w. ~, s
unsigned short data_write = 0x5555;
. I5 A6 \4 `" x( \$ ~  u, p unsigned short data_read = 0x00;! o- w! V" y2 f, O2 v6 D8 O- L
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
; T$ O2 l3 T( \- j, l2 Q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 D" G9 }& f1 H2 |' @3 G$ S      @& i1 [7 r3 R' |. p4 u! }
  if(fd < 0)
0 l5 d7 E2 J! o" w5 r( }  {7 W" o1 J0 U. a0 E. s
     perror("open failed\n");# K5 v/ v0 ]6 P1 q. X
     return -1;( a, {4 [9 i4 l3 F! }$ ~0 V" Z
  }
" T- q8 a1 G/ \! N  
, ~* J0 A) t# @  while(1)
1 ?6 V7 h6 }0 d$ h4 R  {
- y) [. i" d4 `" [5 Q0 }  p   
+ q# b* s6 {, w( M& }! L   //AMBE2000每次读写是24个字为一帧
+ G9 t1 j: F+ D: ^. T3 _   //写数据时将数据在底层存储起来,等到中断的时候再发送
& D% k. D; [5 W0 W+ n- z, X! i   //AMBE2000输入数据是以0x13EC开头的: H6 ^8 V+ I4 x/ x5 x4 Y
   write(fd,&data_write,sizeof(unsigned short));. r" O% O; C0 c0 H- y4 H( e
   , t* U! Q) q& `, |: w( F
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  * D" p6 c+ F! T
   read(fd,&data_read,sizeof(unsigned short));
- ^7 n2 j, ~, s5 _' _   
/ P+ L. L, Q6 N  L6 @( L7 w   if(data_read == 0x13Ec)  O0 k$ v( e5 B/ r9 l6 R3 X8 i* O, n
   {
  w9 N4 h( r1 w, q# {! W   9 A  u6 S+ ^) P; v7 i) \' K9 w' K
    printf("data_read = %x\n",data_read);
5 `% D  A' Q+ x  h   }& K% L. l$ Z; }0 U+ o, S9 [* p6 N- q
   4 v4 B% [9 m7 b& m" J0 e2 \
   msleep(10);
) s( F6 F& ?8 b5 |& c' {  7 {  h, {2 X, {: u9 Z. B- I
  /*$ Z% c* {" Q* w5 y3 w1 L9 o7 v
   ioctl(fd,1);   
- y3 E. }- a- _' z) O7 D2 d& p sleep(1);! {; k  C5 r1 K$ [6 j3 v5 f- g: B  a* B
ioctl(fd,0);
8 p: y7 r- ]0 z) i- K sleep(1);
5 p8 T9 a+ ]2 o" z, F */
: r7 E  Q2 P- [( B0 T# v% b7 K  }   & I% r1 ?: P* a1 U+ b
return 0;) J; ]0 r; a6 K& x4 s. |1 {

* P# G5 v7 Y% g  S  B: v) k}
7 t8 o# @: m8 @: T& a% Q" B/ s6 H) R4 W$ `5 ?
多谢各位指教,谢谢! 急% s4 Y  K1 R( M, J) O. B+ p! l
, @8 h2 o+ q9 T1 F+ @0 R

: a& k6 j( @8 ^" k6 c' r4 A6 i  m4 T/ e" e6 S

# n$ x. V4 f; v9 J! M
% w, H- X' D% }. J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-25 03:37 , Processed in 0.049169 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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