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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 L: Q# @% r7 U! Q
/*
2 T  |6 R, w- N! M  v" m& n  w * Copyright (C) 2009 Texas Instruments Inc0 w& s' M2 h% c' C- z
*
5 s1 l  J4 Q+ f! v/ ? * This program is free software; you can redistribute it and/or modify, f* f6 N8 S/ U5 f( a* s5 b
* it under the terms of the GNU General Public License as published by
" R3 u4 [6 s! E0 p9 G# f6 C * the Free Software Foundation; either version 2 of the License, or( c' A4 j& J* s) B+ w" p
* (at your option)any later version.3 I. E. x# s: s* \+ V4 n
*% l7 s  Q$ C+ n% K2 v6 W. A! U
* This program is distributed in the hope that it will be useful,& e& n3 m* E0 P* `8 s) D# ?
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 E7 s3 _; B2 D( \8 I3 Q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 x% g) P! ]  V1 }. s- x7 z * GNU General Public License for more details.2 h( E! M  w8 y4 o5 n: [& ]% s- |
*
* q6 L% i" k' p* N- Y * You should have received a copy of the GNU General Public License
( p) |  i$ A& k- M9 X% ^8 P+ U3 V( C * along with this program; if not, write to the Free Software
4 ^; a! ]. A" p8 Z* J * Foundati
+ G- d; d* c; B4 B4 ^7 I* ]*/
; w2 z$ B) h8 g' i#include <linux/module.h>+ C& r/ S  ]: B" g9 {
#include <linux/init.h>
; |" J9 @+ s9 ^  w: F0 \4 Z8 z9 _#include <linux/errno.h>
1 a/ f+ p, G: k! s" |/ k#include <linux/types.h>2 c& w& U0 J) T2 r1 Y+ E4 J, W
#include <linux/interrupt.h>
4 y! J% N/ N" w- ^6 c1 s& k! w#include <linux/io.h>
* ?. b- R( c. \  _% Q5 I9 A#include <linux/sysctl.h>
4 t+ |2 z  E4 ~- ~7 N, u#include <linux/mm.h>
0 {6 F4 M# {% Y  l9 t#include <linux/delay.h>
- d! ^. [7 L  }2 h6 Q#include<linux/kernel.h>5 y4 V, J! S8 D8 x3 L
#include<linux/fs.h>$ Y% d3 W7 S; N) L/ Y  n9 _
#include<linux/ioctl.h>7 z2 G% V- B/ w# {
#include<linux/cdev.h>( d& T4 o2 t9 D' w  @( h9 E; c6 G) r
#include<linux/kdev_t.h>' n  B7 R, h  r0 l+ I& ^
#include<linux/gpio.h>: f3 X0 U2 y, {* @9 s4 \+ T& D
#include <mach/hardware.h>. y! ^# i' ]# ~8 E2 ]8 ^9 K+ S
#include <mach/irqs.h>
) p. f7 R6 B8 r4 {/ j1 P" V) W9 |" c0 o% s' ~# m; G+ d
#include <asm/mach-types.h>. d) e( o- I) `9 @1 [' F9 f% l
#include <asm/mach/arch.h>9 H; y/ P, G; F8 i! G: ]8 G
#include <mach/da8xx.h>5 `3 X& J1 B. l( z
#define  SYSCFG_BASE   0x01c140002 }/ T/ e8 x1 r4 [9 e
#define  PINMUX1_OFFSET   0x124 % z! y9 a8 n3 Q. ^1 Q+ `& i& K
#define  PINMUX18_OFFSET  0x168 . V( u9 d) z/ T
#define  PINMUX19_OFFSET  0x16c3 e6 U' N* }' p( p1 X$ t
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR5 A2 T8 W. t1 ~
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
9 u5 d5 ]+ y* T6 B7 a#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& l9 `3 G6 ?; L  v6 \* x( \#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 ~' ~7 Y: S% _6 }#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
7 d, H: `, c- J& }+ W: b                           
% ]* o: B( i: x1 t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
) U) p* L( c$ P/ }9 K: Y#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
7 k5 I+ I$ j( t4 S//PSC
% G' x& S3 c6 g' r- _1 ~#define  PTCMD_ADDR   0x01E27120  6 g$ m/ f- O4 s' S- e: S
#define  MDCTL15_ADDR 0x01E27A3C
' z7 o) A3 F. w+ J; ]* `& A#define  PDCTL1_ADDR  0x01E27304# V4 i% _5 ?& w  r+ @6 \. z- ^# X
//GPIO8 direction; Z" i. H- |# Q/ g& u
#define GPIO8_DIRECT  0x01E260B0
+ Y: ~& ?6 @4 {. z#define GPIO8_OUT     0x01E260B4
1 t9 [; o- }+ b#define GPIO8_IN     0x01E260C06 g* O  r$ p7 q1 \
% u. B7 M% p& \* c* z& B
//#define MCBSP1_RINT    99              
2 }* s: w( n& D% C7 Q. G0 T2 E4 \//#define MCBSP1_XINT    100  
* K& ~% V3 A( _5 a4 Y' gstatic int MCBSP_MAJOR=239;
1 c( _; k4 d% e# C% [7 E* C+ astatic int MCBSP_MINOR=0;
5 F& X. ^" t1 _" F# Y7 _  V% \static int count =1;0 E* y$ U1 V& m' @* p& N) C1 c: v
: z' F( y- w7 y1 r- M
#define MCBSP_NAME  "MCBSP-device". \% R0 @* {% q/ Y  x0 N# o

' f- F4 E" p4 i. N2 H' Rstatic struct cdev *mcbsp_cdev;
/ Z1 M. u6 A8 j; gstatic struct class *mcbsp_class;0 P/ n& A+ A" w+ x
static dev_t mcbsp_dev;! A0 m5 r7 ]9 k; j
unsigned int DRR_data;
. W4 K& N/ y8 Q( Z% H, U) q2 Hunsigned int DXR_data;+ r# w! T! w, F" E6 w
static int mcbsp_open(struct inode *inode,struct file *file)1 G) d# a1 }$ l" x9 {4 P6 p; C
{
4 `" G8 f8 T3 t; m% i! @   
9 P7 c# B6 y4 L   //interrupt enable,initialized
3 E/ U1 @5 x: ?( L6 w   unsigned int temp;6 l; t9 M: v) I' u* e* n1 [2 i! i
   //SLEEP_EN(GPIO8[10])---0
+ @* y1 e% l( P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 Z( ~1 Z  X3 {5 K6 R   temp=temp&(~0x00000400);
& {8 h* P4 a" y7 P7 j   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; @" U6 |% S4 x% g! m# a6 y
  //RESETn(GPIO8[8])----0----1  q  z9 G. O- {% k
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; x0 S. v* P. V; ^4 c7 u+ M4 A
   temp=temp&(~0x00000100);9 q, @/ F5 m2 U9 [7 \+ f5 L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; ~) Y+ I* G5 o  n
   udelay(100);+ W/ e) k  i% p3 J, W
   temp=temp| 0x00000100;
) N2 d0 O+ y1 T. S% o& n4 n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% l( a5 B( W, i) z2 j   udelay(100);& W8 a, D. i. G: _
   printk("open success!\n");
3 c9 H. `$ p# a7 A5 a5 ^$ m   return 0;! O  w( ?5 T9 m" Q5 {3 h
}
/ w3 _/ V7 ?# L& V+ A
2 t/ c. P) o! w* d0 A; Astatic int mcbsp_release(struct inode *inode,struct file *file), ^" M+ ]2 D0 ]8 h, x+ ]" |' u5 B7 h
{
  W  O, E: x$ U. m  M   printk("release success!\n");
& f  N" w2 w+ u4 b* u   return 0;
# H  G: Y( E1 j* ^/ B}( _) N, X) s4 z+ D6 F% Q
- p9 v" i% ?2 C( m0 j8 l
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)# x9 n6 b! ~" _
{) W7 c4 _7 |& L1 x# T
    copy_from_user(&DXR_data,buf,len);
, O. K& c# k1 N% O, Z5 Q    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
' T% o" F+ o$ m0 T1 \6 J( E9 J    return 0;+ \. _% P9 @/ I, k8 ?+ ]6 [! \
0 u& q2 X) N2 p% q. p& `; ^4 b+ V
}
6 S, h0 D' h8 k% I5 G# g" w; `# A( c. z' o) b
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ j' a" l0 c4 M' @5 }  R{ 0 O5 k! I4 b9 F/ \
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( D* J3 {7 X$ y7 r6 f4 x
   copy_to_user(buf,&DRR_data,len); $ _+ G2 l3 h  G' n+ u
   return 0;
+ v4 @0 |/ {2 p% s/ j3 d# |}
" Q3 |3 c' z4 `  |% O; H: e! [; p0 w: B2 @" _
( O) b* b) L* e) ]1 D# |: Q3 V
static struct  file_operations mcbsp_fops=4 F" l/ q7 A, f" r
{
8 V( l, q$ E+ U+ S8 a" O1 J8 V   .owner=THIS_MODULE,: m$ F0 T  m( w; Z6 B2 b" l& r
   .open=mcbsp_open,
0 U0 x% d; H! p/ B   .release=mcbsp_release,
4 ?1 e* w- B2 I2 {: c' r. z9 v   .write=mcbsp_write,1 x7 ?( i, S! B, D/ \
   .read=mcbsp_read,4 H" v+ B; _. H* v$ s% G- Y( }2 f
};; W- T7 u- b+ M0 M# j3 u! A
static int __init MCBSP_init(void); B7 T& n) n' g. t
{
5 J/ l( X2 [1 G% |, A/ N   int ret;4 d# O  U# O( I
   unsigned  int   PINMUX1_REG_old;
" t8 B3 s. c0 m) n' M7 o4 M' Z   unsigned  int   PINMUX18_REG_old;6 q" K5 N9 o* v& }3 K: H9 a& F
   unsigned  int   PINMUX19_REG_old;
8 s. ^+ V+ I  x5 A% M- G# B   unsigned  int   temp;  
, M5 M6 y+ {+ u$ r) h   if(MCBSP_MAJOR)
9 C1 J% ~$ C7 u! ~9 G   {" B6 T7 A# t" Q0 @
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);; t) L( A5 Z' i) l$ @
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ l0 n9 ?& k, }5 }8 ~0 D" I   }
6 d! Q: A8 g, I+ D/ P   else
# r' p# l0 |, d& d8 W9 C9 }6 f& {   {7 k0 F. [8 i  ^+ x1 K7 c' }" v
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ Z3 n/ F' P6 {# i
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ A* K* ^% w2 W& h
   }- W& {  S+ z4 k! b' U
   + x# q; B# K$ d7 ~
   if(ret<0)
, Z0 N5 `. a- v! d. Y0 w& d   {- f  B0 J* Z) p0 ]% E  a
      printk(KERN_ERR "register chrdev fail!");2 I0 u) E% N* S  l, X5 |& ^/ c
      return -1;
% Y: Z, {' @1 d+ G; G   }& w2 h0 T' i& C0 Z
   
8 k6 c& o/ T5 s3 {$ I4 m! J   mcbsp_cdev=cdev_alloc();$ E! ^. C4 _: j# N$ v# \
   , B/ p3 p3 V  \0 E
   if(mcbsp_cdev!=NULL)
0 @+ }5 H, k, E- h! M3 K1 C   {, F3 ^1 b$ A& I  Y  G3 h
      cdev_init(mcbsp_cdev,&mcbsp_fops);
+ g6 E9 E1 W7 k      mcbsp_cdev->ops=&mcbsp_fops;
. i( f, `8 u- E2 X      mcbsp_cdev->owner=THIS_MODULE;6 D. P8 T' A6 y; B; I  S+ |
      
4 e/ q7 T" V, L2 `) m: d& J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
  @8 n# L) ^( T1 n, _4 T          printk(KERN_ERR "register cdev fail!");7 n+ a/ {8 }; w( a4 W, q4 ^2 u
      else. T/ }" K3 o6 l( i
          printk(KERN_ERR "register success!\n");
, u% \" F; d3 J5 S1 x9 H1 x   }
1 ]4 q6 g/ R4 `  \' H: z# z( E) |  N   else" S5 O5 V  s7 f7 u
   {
4 N, S4 L( q4 E6 {! O/ ~7 X$ s      printk(KERN_ERR "register cdev err!");
5 b9 [' t# o% I      return -1;; H7 d2 p& _! @# h7 `% |: w$ `/ f
   }- J9 X5 {" @; c. {" f
   
9 k; E1 ^: a' ]( a- F  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);  \9 J) L& v! w% D0 |9 A
   if(IS_ERR(mcbsp_class))
; }( z7 `+ ^6 `5 F: z6 e  Q   {
: @. \: v' P2 F. Y+ d: N2 e8 p% q      printk(KERN_ERR "register class err!");3 A0 r4 m7 [% B% t3 b" i
   return -1;! _1 ~# \( @. z. b+ f) |
   }& j3 _, I; N# ?' y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ D3 R) {; L; K3 Y9 \$ n8 q- M( L3 T3 D& l
   //PSC3 B6 E. m* w9 p, I1 i
   //add Enable MCBSP
( r  ^8 g: y( R   //test
+ O' O) w! b% X0 i& `   temp = 0x80000003;" r! D: f* \0 T9 B
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));. z; {" a- p+ F, A" Z2 g) ]$ s: u
   temp = 0x00000003;  f; r( {6 A- z8 m) x! d# ~' H8 j
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
+ w( ~5 f7 \1 [
# b5 E% o) o" _: }/ o   temp = 0x001FF201;) E; d" }% \! |. f7 z1 c  A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 O5 _" V9 I& w8 U9 [% Y7 f2 l5 g   # D. `& H0 Q  r3 V: Z8 D
   //PINMUX  
/ [  F  w8 p" ?) x  y   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 a% B- P6 |  @5 ^) O" x   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  + j! u; z2 H2 Y- x2 G& R  m$ r
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 t3 D; ?! X) X8 a" v2 G   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 h  L) Q4 a4 M: v1 n+ C   2 x, }9 E" e' p1 j, k% U! U
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 H. f# Z; ~% g  }( C& D% P
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % q2 u5 Y9 n2 U4 p2 C6 q; R: O
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
0 k/ M- N( T1 d7 |, i7 f8 H% J1 s- u   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 \  {$ V  p' y/ o
5 L+ D5 G5 _- Q3 Y0 d! y   //RESETn,L138_SHK2
- S4 }! b$ G! T$ j- |8 }$ m9 m! [) `+ p   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  9 \3 `. E- z& K7 y6 W
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   . s& b9 O/ ~8 Z# S* h, @) S$ |4 |9 E
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 ]  a+ C3 Z1 k7 W 4 j: `5 j6 _; n
) V* p3 R& X" g8 J' ]5 w- a1 K
  //SPCR Register0 \2 P. T# B+ X4 c
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 }" E5 i7 \# m# d9 q3 T) q6 Y  temp = 0x03000000;//(DLB=0)- H2 l  C9 P/ z0 o
// temp = 0x03008000;//(DLB=1)/ j* q; P" h9 @: t
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
/ K7 n% a7 Q$ K2 j8 A8 z+ `0 l0 R; P  temp = readl(IO_ADDRESS(SPCR_ADDR));
# f8 B# P/ m8 l0 c8 N  printk("temp=%x\n",temp);
/ b! ~' g/ l& Z& P
- V% O4 U# d" `; H: M* B- N* ^) {   //PCR Register1 O4 E. G: P: V; s, h8 I8 a
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 y7 g+ a. M& ~. R3 X& ^/ A  // temp = 0x00000F0F;
/ j( \+ h2 o; ?0 |( m  temp = 0x00000B0F;0 B; l5 o, T; F$ v
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 0 A7 e/ ?+ O& I7 j" b; G$ c
  temp = readl(IO_ADDRESS(PCR_ADDR));* ~0 \" `  O' w: I' j6 d) A+ s
  printk("temp=%x\n",temp);  
2 t  r- }. C8 q1 k   //SRGR Register
7 a4 I" Z6 P) o$ G2 |  R1 }   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 O, S8 n; }. `, [ //temp = 0x301F000B;
1 w: L3 t- q+ A4 f0 f& I4 o2 C   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
5 ?1 F' i  ^/ Y  j  t  temp = readl(IO_ADDRESS(SRGR_ADDR));
2 l1 H) g7 M, Q$ ]+ B% D, @" G- e  printk("temp=%x\n",temp);
/ B$ `7 y3 k7 ~* P8 M   //RCR
4 f& s( h0 P" t' N   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: n" A8 Q/ K! z' y% C   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 W5 v+ S; i  {' w9 [3 A' T   temp = 0x00440040;$ l  ^, j, j7 b. K. d  I6 Q
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   1 }/ E8 G) E6 U6 A9 ?+ }8 e
   temp = readl(IO_ADDRESS(RCR_ADDR));6 t/ _; O/ {. ]# D* e
   printk("temp=%x\n",temp);
  ?% K3 V* }0 I* C. z' d   //XCR
3 s; m0 ]+ K# a. B4 |  D4 y   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 u6 P- A1 P. C. L6 E5 _0 V
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& D0 T+ G4 d$ o: v  h
   temp = 0x00440040;
0 ]. X% t6 L3 R( ~( L) V3 @   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
. y: o& l4 a- t6 _! A   temp = readl(IO_ADDRESS(XCR_ADDR));' U$ M6 l) e* D  S3 U& b
   printk("temp=%x\n",temp);
0 `4 J! Y" ]+ N  udelay(100);
/ e% h4 p1 _/ J- y& V: G' Q% [  //SPCR Register
6 w# ^: e9 `8 F; J) ^7 {  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 m3 o2 A3 j8 s* _/ \+ H9 H  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
/ l  g$ \6 X* T) M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled5 w) l1 E" Z$ G0 I6 F1 B% X% m
  temp = readl(IO_ADDRESS(SPCR_ADDR));# z# d# @- C3 v6 Z- q
  printk("temp=%x\n",temp);1 ~8 k, L1 D4 O! {( K
  udelay(100);9 u2 Q( [& [8 z( X& b0 V, k
: j! C# W; U; T5 g9 C
  //set GPIO direction0 _1 c3 {( `  o0 i
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ ]" Q; q3 D/ h% Q9 X# N
   temp = temp | 0x00000100;//EPR----input! V  |" \( V* O# B) q3 Y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 t" G; V# z4 _% P
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & P6 |# \  J* p, A+ k

8 ^2 x& ]7 D+ h* w8 o% g5 S, W   return 0;6 F6 b2 J: R6 F, A, x5 R
}
! e# m1 Q. d! pstatic void __exit MCBSP_exit(void)& l7 e& C4 A. t. h
{+ g& m2 q8 {2 b# J
   printk("mcbsp chrdev exit!\n");+ B3 M2 p) X& C7 O' ?
   cdev_del(mcbsp_cdev);. W& b: O4 K. b7 e) [7 e3 v; b
   unregister_chrdev_region(mcbsp_dev,count);
% \. i  Y' y, G! L9 t0 h   device_destroy(mcbsp_class,mcbsp_dev);
+ x- U( [( ~. ~' w1 p- |8 i, r   class_destroy(mcbsp_class);
  H: r4 }0 d+ z, i1 x: {* W}
: m' w& S, B$ V8 p9 Dmodule_init(MCBSP_init);% Q+ J/ x% R1 _! k9 ^* B" C
module_exit(MCBSP_exit);6 y( `! K0 ~: ^) X1 O3 K' H6 M) T
  d% W: i9 ]4 z  d: a7 h
MODULE_LICENSE("GPL");
& [4 t( r& c1 l6 l' J
( W9 t& Z( C" `2 O我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; t* z1 U( H! r' O' v) C, s5 D8 \我的应用层的测试程序如下$ A; E! T) Q. D& e/ R
#include <stdio.h>& b. N( \/ s) e/ |; r7 p
#include <string.h>
  D2 Q" K# B$ t#include <fcntl.h>* P- b: T* a+ O/ \  N; q$ o
#include <unistd.h>6 D6 T* O% k" ]8 X5 [% _. p. l
#include <signal.h>/ Y" H, y" u% q! |1 C# t
#include <pthread.h>       //线程
8 c: s+ c( ~( M#include <stdlib.h>
9 B# h$ H2 U6 @( i! _% G$ g#include <pcap.h>          //捕获网口数据" |; c6 ^$ M& s2 Y/ X9 N/ s
#include <semaphore.h>     //信号0 m3 i2 {& ~3 v$ F
#include <sys/types.h>     //消息对列
0 [% }7 f) J6 f3 q% [, j, M) V0 _#include <sys/ipc.h>       //消息队列" t5 S. o" q  ~( }5 r( R
#include <sys/msg.h>       //消息队列# d# I  a" g* j7 i
#include <sys/select.h>" t" v- f5 n, l: R! G  F+ Q
#include <sys/syscall.h>
' Y5 [& X& r2 m  W#include <sys/stat.h>
1 v7 J0 O. m- ^7 K3 r5 c#include <sys/mman.h>9 n- i9 B& y" _/ H
#define msleep(x) usleep(1000*x)
& R3 ?  \% D! L6 `: Z2 D/ w* a/ i' }) J8 H
* l' \& L' Z9 v; T8 g8 `int main()6 K& X. w  z7 t* z! v  q
{ $ I( c* u* e' {- i8 ~% X
    //MCBSP,ARM与AMBE2000交互设备
$ A( X2 H- c6 I2 J! E& i int fd;
/ l6 Y# t! v" }' p2 C* T unsigned short data_write = 0x5555;
: ^* }8 s9 b' L6 ~ unsigned short data_read = 0x00;
$ k+ w& n+ \" E. Y+ f/ P  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 S$ k& N$ d* ~; p) I4 I  i& w //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* Z5 ]$ b) j& m' b0 T   
* [& o. b$ ^" i/ L$ C, ^  if(fd < 0)* m% j; _0 w4 l' y5 F% ]( M; I
  {# w) s- ~, j9 ~, e) Z1 J0 Q5 C
     perror("open failed\n");: f2 C# h6 n  y8 {/ w  S6 t) i
     return -1;
: n# W) h" ^$ h" D) H8 Z, r  }
; J& q2 i1 u9 x" ^% X  Y8 N2 F" ]  
* _& K9 ]7 v1 N) ~$ {  while(1)( F; W6 c  Q6 f) ~
  {
& u( o/ `0 Z+ ]* c5 x, O   : x2 R1 {( \3 G% F5 _* a
   //AMBE2000每次读写是24个字为一帧1 H) h2 c, ?8 R. Y
   //写数据时将数据在底层存储起来,等到中断的时候再发送
+ f# r$ T  `% t/ K- {* _& }; \   //AMBE2000输入数据是以0x13EC开头的
' H' L$ h: w1 q% {# H) I   write(fd,&data_write,sizeof(unsigned short));
/ ^  a( u5 ]" y( k   , H+ {( ?, k0 C+ z
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  2 |3 P) {% r! @2 v
   read(fd,&data_read,sizeof(unsigned short));
' V5 \2 J: `7 d% l   
5 v4 \1 o) T0 t% C0 m   if(data_read == 0x13Ec)
* ^+ f5 f0 t  G. u& |6 A( y   {- B" \0 Q/ z1 V  g
   
' ~. o! I2 N) P4 y9 z6 X    printf("data_read = %x\n",data_read);
7 ?" R% h! H7 M   }/ L" x( m4 w* A* j( c
   / ~( f6 M8 R4 ~9 |1 E0 _! d
   msleep(10);
$ u/ N5 n& H. _8 }% @1 i2 p  0 K+ H/ q# `/ K
  /*$ w$ r' t. M4 g: H; v8 d
   ioctl(fd,1);   
& \1 V7 Q& s/ l/ A6 {# _! s: H sleep(1);: d4 _1 s: _8 i+ ^. H: a! @/ h: d! w
ioctl(fd,0);, V7 {2 Y' C/ H: V. O: v
sleep(1);; C* y8 X2 p+ v! b. v9 }
*/ $ H  ^4 c( l: c$ ?3 v. p
  }   , a, Z! W9 [2 v1 p3 R7 E
return 0;
" u. Q; j& Q: `- i3 r3 U# g 4 w, m& {  h4 z; n
}  Q8 Q7 h7 E- Y% B2 q: N! F

, n# O$ h0 x, [0 ^7 X7 E多谢各位指教,谢谢! 急3 l) z4 x) n9 V0 Y2 E

" r2 a. A9 \& z. Z+ |3 f( G9 |9 P: E9 }4 `% \- g2 @4 i7 U  K
$ m$ y: d% P# Y
" a) Q( V+ A) w/ t, ~6 r
  x; U7 ?* [- w' F+ E5 p7 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 06:25 , Processed in 0.041184 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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