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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 Z  h) W9 c$ _0 T# l/*% S5 z7 ^$ f! d
* Copyright (C) 2009 Texas Instruments Inc
0 C; p. {" ]: [' K *
% k. b; C; G& x2 b  g" E7 Y: r * This program is free software; you can redistribute it and/or modify8 R  U! Z9 a/ A9 b6 b
* it under the terms of the GNU General Public License as published by6 i+ S, e5 ^- H+ {0 q% e5 u
* the Free Software Foundation; either version 2 of the License, or4 s! h4 Z$ _4 U' r: i
* (at your option)any later version.
) ?3 M9 q; h2 i. t: V. ]* Z3 H! S+ o *
) P0 c9 G" k# y * This program is distributed in the hope that it will be useful,& }2 I2 z, h; x7 `* f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
) h7 T% A2 @8 _ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  ~) E4 h8 Z) ~1 @/ u4 o# ]0 v
* GNU General Public License for more details.
7 D9 ^. K' P9 | *
2 v% {1 ^4 t$ j2 m: r/ K * You should have received a copy of the GNU General Public License  [7 d* S5 p9 g6 R: H
* along with this program; if not, write to the Free Software
/ _# w$ j+ U9 Q3 f8 x * Foundati% w/ @: F: r$ p5 l/ _' `$ ^
*/' X! r% U, E: ~! T; _, @2 m: P
#include <linux/module.h>
; D/ F& p% S, ^( p; H& ?6 `#include <linux/init.h>$ {' V* t+ @8 d7 n$ Q. V
#include <linux/errno.h>) R4 ?5 H$ L) [+ b  R
#include <linux/types.h>$ V- e& [0 K$ |  i0 g+ Q$ E
#include <linux/interrupt.h>7 G; w5 X3 g& i: g
#include <linux/io.h>, [0 D- U, w0 R0 b! b: N  a
#include <linux/sysctl.h>; u+ k$ j0 z1 a
#include <linux/mm.h>9 W, R: a9 N; X
#include <linux/delay.h>
: z2 {- r' e7 Q#include<linux/kernel.h>: t# h- x* r: M+ p2 d1 p9 t4 j
#include<linux/fs.h>
' [9 D+ o$ m" l  B#include<linux/ioctl.h>
0 a  G3 u! p( z3 J) S#include<linux/cdev.h>
0 z; u+ V- x% h# M7 F2 K1 h" V! F#include<linux/kdev_t.h>4 J& _4 @6 I) M. h2 H/ T3 K
#include<linux/gpio.h>
/ X) ?' V% j8 p# e- A#include <mach/hardware.h>
, w+ z4 s+ [! X' p( M8 `  p#include <mach/irqs.h>1 c- Q7 r) k1 c  p2 x" n: M/ V, p
. B4 s2 \. n0 ?9 T. [, P* C# ?* x
#include <asm/mach-types.h>9 r) [* U5 r+ ~4 R3 {8 }+ W0 l0 Y8 D
#include <asm/mach/arch.h>! p: n' s2 z6 g" M
#include <mach/da8xx.h>8 L; T$ ~9 k. _* N& q
#define  SYSCFG_BASE   0x01c14000- K: @- j5 }) d& m2 \6 X
#define  PINMUX1_OFFSET   0x124 3 k; a3 P, B2 O. U
#define  PINMUX18_OFFSET  0x168 * ^1 q2 i* b. J
#define  PINMUX19_OFFSET  0x16c+ {( o* G: g$ X+ k
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR0 t* l: `6 w% |, x' W2 \( R
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 |$ w7 S; C7 W2 M
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR( y- g( \4 `3 x( b2 E
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR4 d& A! b. }! [* w- s; l: y
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR+ V% ~' |2 T& i7 s7 _" d
                           
* I7 a" q1 S$ k9 v) D( q2 h. s#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
% b2 v% u8 q* G8 L#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- X( D2 T* i4 h//PSC: p) e* I% i: [* U" o% G
#define  PTCMD_ADDR   0x01E27120  $ b7 V& v* x8 y; Q: F$ y3 R% i
#define  MDCTL15_ADDR 0x01E27A3C1 H0 ?$ j$ u' [/ S; R
#define  PDCTL1_ADDR  0x01E27304
0 K6 X& d% F7 Z- q! V* G. g+ c! `//GPIO8 direction0 B$ z0 i) ~2 V
#define GPIO8_DIRECT  0x01E260B00 ]8 D  `1 \6 E, I: ?7 B
#define GPIO8_OUT     0x01E260B4
+ y# Y- l& R- A/ S8 V: v" ?#define GPIO8_IN     0x01E260C0
# D9 H! {* X: w6 n) `7 b$ _" o& ~( y, e8 N" i- x( Y
//#define MCBSP1_RINT    99              
' L& a+ x  Z" r( m# V% r6 [2 `//#define MCBSP1_XINT    100  * A, y5 h6 O$ o& R2 x$ t
static int MCBSP_MAJOR=239;
; Z  U4 d- v# `- Fstatic int MCBSP_MINOR=0;
, |1 S1 A, U0 E  w$ E$ kstatic int count =1;; m0 X6 l$ O% t8 z& H/ K; q

+ I3 d/ q# M0 [% b4 G#define MCBSP_NAME  "MCBSP-device") V" F' d1 `& K# y  D+ R

$ Q* U% z$ \* x0 ]$ W, _static struct cdev *mcbsp_cdev;
5 ]* K2 U$ c5 e, T: F% ?( istatic struct class *mcbsp_class;
) x" C, U& q1 t4 u& o7 L7 U% tstatic dev_t mcbsp_dev;
$ _) X( |, j, ?& d% D: A9 Cunsigned int DRR_data;
8 P0 T& }8 w# L1 I& t7 ~unsigned int DXR_data;% V' W& F7 O& _  Z% G
static int mcbsp_open(struct inode *inode,struct file *file)
/ K3 Y7 Y3 N4 F# ^" |# C6 _3 J{
( O. J4 v8 @% `* W' G( K9 ^1 `   / ]- S/ v6 S1 l
   //interrupt enable,initialized  M1 U2 D5 N) H3 G
   unsigned int temp;) y* m2 X- {  ]" l0 P
   //SLEEP_EN(GPIO8[10])---0
6 f; B8 s. z: x6 A9 {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" I$ q  N' G/ p# K
   temp=temp&(~0x00000400);+ j% I6 [' s4 i7 i& G8 B. x2 H
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, k) d& g- s5 W  //RESETn(GPIO8[8])----0----1
) v9 l$ T9 X  W. D2 s) A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- d) E. o7 v" R) p0 R
   temp=temp&(~0x00000100);
" e. ]. ^; b& W, G1 L- H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! r' }3 d9 k0 d   udelay(100);4 d8 j: ]' _9 c/ B" k
   temp=temp| 0x00000100;' a, N) p+ z, K- c6 n2 }0 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, ^+ q! [8 _% p: h: s" F4 x9 ~( k: g! z   udelay(100);$ D# ^! q/ x$ u. ^8 T
   printk("open success!\n");
+ e6 @/ H0 F. T' d   return 0;# x; f1 U- L0 V6 q9 Z
}/ Z" O1 W* h/ S0 I0 s* |+ Y
% _! r2 s$ [6 T) j0 X
static int mcbsp_release(struct inode *inode,struct file *file); B! h# P$ |! }7 O
{
9 x0 a& l% z! p, {  b   printk("release success!\n");
/ G% g. K/ F$ w$ B1 x/ k( `, u   return 0;9 w# [9 `  y$ z  Q: h1 u$ z% Z0 X
}
( W% O3 l! Y' T7 A( p, e3 o/ J
8 r4 ^; m: y; l4 @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ l6 l, X: `8 T( R2 ~) _$ q{
+ k- e* R5 x+ n) z0 d7 |( q    copy_from_user(&DXR_data,buf,len);) E6 Q! g7 M* u  O
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
' x# L% J1 R/ v5 H0 U    return 0;* ^4 F) O$ v9 \/ D2 e1 F/ R  o
# f. Y  S& o( \# e# ?
}
& C* }* k8 x: X3 O& Y$ l$ f: h5 S6 F. y: a2 H* m4 C7 Q# b, k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* W+ C' q4 r4 b8 n" M{ . ~5 E- E7 R9 }, l3 z7 P
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 \. @; `- H  H6 J8 N6 N
   copy_to_user(buf,&DRR_data,len);
, W/ b* A! Y4 h5 O& ~8 r& [1 u* f   return 0;
) c( l( U; _; j& a}
2 m! P" Q0 l2 |3 J$ d1 Q' `8 F) r# H" e2 p- A3 E

1 }5 ]7 \: c4 X: a5 I; ~  d( j9 K" m) Rstatic struct  file_operations mcbsp_fops=
# n  P6 ]# q7 x3 m9 h  [: X( k{
- r' z, z0 A% A  H  v# B   .owner=THIS_MODULE,+ D; E- l- Y8 t# Z# E4 D
   .open=mcbsp_open,) R$ T. z- R/ n, b
   .release=mcbsp_release,& B7 {0 e* m1 ]4 j' X& r/ x
   .write=mcbsp_write,3 {8 S* c3 @6 Q0 Z
   .read=mcbsp_read,- p( n  v6 o# s& I/ x+ U
};
1 j8 j4 S, U' m3 `) \" j% X! Zstatic int __init MCBSP_init(void)
/ @+ G  E1 w% S6 N7 S4 f" z{: D; [5 y! g+ Y4 J5 X
   int ret;- R8 `, c" C# Q5 S
   unsigned  int   PINMUX1_REG_old;* x( @$ c/ i  f1 q3 w9 l$ ]
   unsigned  int   PINMUX18_REG_old;% ]. `" K2 h) y) q( T
   unsigned  int   PINMUX19_REG_old;# N; k7 _1 F( W7 O% C% e
   unsigned  int   temp;  
+ y- ?8 [* o9 d. S9 d  e& d   if(MCBSP_MAJOR)! c/ c# o8 b; d. x. L3 H: E: m+ O8 I
   {' L+ v; S: R) Z6 w% l: n* t; i/ F
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- _5 I" c$ B9 _: e7 P, Q9 c! ^      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ S1 B; X8 @. d2 Z3 @8 v, W
   }6 T) K) E6 F5 _  s; ?/ _
   else$ l, K7 N3 c# a9 E/ R& G
   {
, O4 r3 e. y% C, u, X+ a/ _      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 H1 Z( J8 K4 x8 m5 L7 `8 D6 m% w
      MCBSP_MAJOR=MAJOR(mcbsp_dev);  o+ d$ x7 ?# ~: a2 V) Y) F! m# I
   }
. N+ a# D7 s6 a6 ?. O- g   $ k5 K& y$ n* G& ^! B* t  d1 V8 r  `
   if(ret<0); U- D; @) ]# w
   {+ Q: D6 [+ F8 g4 T% z' h
      printk(KERN_ERR "register chrdev fail!");# |! T) L- o# T; d2 w* o2 e4 f
      return -1;
3 q6 x! j8 V' }1 X0 }# y- l& X   }
! L$ H0 T( ^9 w1 {; |' m   
. E) F) O& @% Q   mcbsp_cdev=cdev_alloc();
. P' X9 x; s1 v. N( R4 J6 Q   5 J' o  D/ c& n) ~/ q( z
   if(mcbsp_cdev!=NULL)
& n& ^* p9 o# V" r7 X   {, A0 D( {' Z* a4 B% @
      cdev_init(mcbsp_cdev,&mcbsp_fops);* W2 P% c9 C* Y3 ^* d( j& V$ h
      mcbsp_cdev->ops=&mcbsp_fops;1 K: e1 [) ^- E3 S6 O7 R
      mcbsp_cdev->owner=THIS_MODULE;+ C1 G0 Y( A- \  u# S
      3 \5 A! b3 ?) j* b' n6 x
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ z2 C# o( G. a! L% `/ F
          printk(KERN_ERR "register cdev fail!");0 Q6 X; s" d( t, Z
      else/ K9 `$ W2 \$ l2 I* k
          printk(KERN_ERR "register success!\n");
" K" w0 ^5 t4 {; x* n& A   }
6 x/ J9 v7 B2 _   else/ m; ]4 x0 x5 N$ U
   {
3 \. O0 y" G0 W8 [8 a      printk(KERN_ERR "register cdev err!");7 r9 r" }( v& r* p" V7 h
      return -1;
! J: ~0 ]8 H9 w5 ^- S: _% J   }
3 I2 A' C' t3 S) r9 ~6 N7 E, z) B   7 G" P9 Z9 l1 U4 w! J
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ B- o% b9 H" x
   if(IS_ERR(mcbsp_class))
" ^9 m( r, \. m  e) ^3 ~   {
! }8 |& H( v% R& r! S' E! P, `" Q; Y      printk(KERN_ERR "register class err!");
9 W: E7 p: q3 z$ E2 M; O: U2 e   return -1;
; W3 U4 C# a6 E) \# _$ y- f   }/ q5 Y+ `) T  }
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 a+ |& v1 \0 P: d

/ o  T6 D* y2 d1 v* d2 V/ t3 _8 v   //PSC, e0 |' d! g9 c8 w! N4 E0 C
   //add Enable MCBSP. ?! N% Q- x5 w% n' J( P: L
   //test7 u5 M- h1 z5 J9 j9 S$ s$ q4 z; |2 q
   temp = 0x80000003;- v) T* B4 I/ l, L
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));' \0 F* f. R8 [" Q
   temp = 0x00000003;3 Q% K% [  Q3 e# N
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
+ P+ ?: n) k. V9 h
. W6 ~7 G! l+ l) n' f   temp = 0x001FF201;( ?7 O; o: J1 `+ J. U
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 N* F  q+ b- O5 P; [" t, K   * A( Z& z, [, }$ f; w5 x
   //PINMUX  
) E7 R& k$ ?0 v3 j( p1 N8 j   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
5 g$ E, o! l( z4 y9 u' e4 }   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
- u$ H, a$ K% G  K- E/ d3 T+ z. a   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 C% N- ]" F7 u( z5 P! j   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ w* I: M% z" F0 Y1 i   7 t3 P& N5 `  S
   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 X' L! J1 s. a/ i3 D- V4 ?
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 U7 ?9 Y* O+ L% f
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / ]. @% v; ]! \$ P* R
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);$ u' N9 k  f( H$ o# p" c6 h

- I( r" L" i8 \% G7 i& P   //RESETn,L138_SHK2
7 f( G; d& e; O+ z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);    x( p; Z4 J7 t  F
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: E% P% |% c1 D3 N3 ]   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- e, @& D  ?; P1 `. e$ T% o6 |. L
$ {( s" {7 R: E# C, J3 ?# r3 a 5 L2 W; m! K2 N5 {5 U: X$ n
  //SPCR Register1 s" c: L1 X. L% @5 _* X- P0 f* e
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 W+ Y) |8 H  X+ Z, i" h% b  temp = 0x03000000;//(DLB=0)2 h3 T, b; r& N) U% g
// temp = 0x03008000;//(DLB=1)
$ X7 i' O0 g& l2 g6 @% A  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
7 r( r7 _1 a- Q4 s* U4 n% y  temp = readl(IO_ADDRESS(SPCR_ADDR));( H4 w& z" A# N' l
  printk("temp=%x\n",temp);' ?. I7 E4 b" ~' h% G+ ~

: e: |3 ~- ?' x$ d- c  R7 Q   //PCR Register
; ^8 _2 u7 [$ x; w* U' U; T  l   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-03 q6 j) D, h, N2 l& n% r
  // temp = 0x00000F0F;9 @6 {$ m4 q2 V) T4 e
  temp = 0x00000B0F;
. Z) Y; C: @; _9 b) W4 g, h  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 `. T% B; h3 j% k' b  temp = readl(IO_ADDRESS(PCR_ADDR));# k7 S9 j% z' u# [4 x1 A7 v
  printk("temp=%x\n",temp);  
) P/ f4 F% C% c3 Q: G) q9 k6 x   //SRGR Register* n% [4 C" I7 ~
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' A$ v6 u  B7 F5 m //temp = 0x301F000B;7 l, Z5 W( m9 a; _0 O
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
) G8 J$ f9 m. C7 D6 D/ f0 I  t  temp = readl(IO_ADDRESS(SRGR_ADDR));  j' q8 f! p* @
  printk("temp=%x\n",temp);1 R( n. c+ w2 }5 x- v
   //RCR% x# H) k( k1 G! L% r' Y9 }
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, x. c& W" c# v4 x
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& e' U: N8 S9 C8 p/ `1 ]- b- g1 s5 n   temp = 0x00440040;
+ ~9 B4 q8 z0 Q+ S4 j. l   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) i$ z* S3 u- c# }& m5 W1 C6 d   temp = readl(IO_ADDRESS(RCR_ADDR));
4 f% k# a3 Y8 k$ P/ f   printk("temp=%x\n",temp);
) o6 D, b7 G2 ]   //XCR
$ g$ A% r6 G* @   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 \3 |- L1 @: y! E) g   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* N& T9 [, F3 x+ p* k
   temp = 0x00440040;5 @/ G# ^# Y& @' _
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
& @4 H" I/ i  _9 M   temp = readl(IO_ADDRESS(XCR_ADDR));$ A2 s* `5 f' g+ c/ X2 z
   printk("temp=%x\n",temp);) U- u+ l! y2 [* {% d% b# V
  udelay(100);
! y+ O- h7 v1 k: `; |  //SPCR Register; p0 c3 q6 a4 P/ H
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ w. [1 v( i9 d+ Y! u3 M  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  ?% I& [  J* ?) G5 p7 y4 @/ e4 K6 G
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled$ i& e- s5 D& z6 {
  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 S3 L6 Y2 F& ?, f- l  printk("temp=%x\n",temp);
2 t) U& b0 v, }. Z0 M9 }5 i! I  udelay(100);$ C( K3 k; X- L# Y  m( w
$ e# n. e- I- Y/ B1 P) g
  //set GPIO direction
& r& _  Y, D' R! Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' l- y" m8 l9 F) L
   temp = temp | 0x00000100;//EPR----input3 A0 ?% e- i9 ]' a3 Q: M8 G
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output/ Y1 _, @! W* j9 C- _& m! V) q
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 V& [# C: K2 r/ I' h; K9 u
4 C& Q) ?7 X! O9 K' e/ T: L
   return 0;& r8 B( \; K% q# m
}# L+ |6 f3 ]2 G0 V
static void __exit MCBSP_exit(void), w( a# L- i- `( v1 O2 b
{
4 S7 S, }1 |9 W6 A, Z   printk("mcbsp chrdev exit!\n");
$ j/ s( x. N- U4 D1 a   cdev_del(mcbsp_cdev);
' W% x6 Y) X) v  C. t4 `! ?1 e   unregister_chrdev_region(mcbsp_dev,count);) q- d6 P3 [6 W  G" X# O8 i
   device_destroy(mcbsp_class,mcbsp_dev);- u) ~, P; z2 s) n1 _
   class_destroy(mcbsp_class);( i2 U- Q1 |5 l: }5 f  c
}
$ C6 ?" `! M  m5 A0 y" nmodule_init(MCBSP_init);
% ~" r, K! P* c: A' c( a* Fmodule_exit(MCBSP_exit);. a# D+ ]' q1 s) P; z( ?  w$ H, d# q

! n( j8 m5 S& aMODULE_LICENSE("GPL");8 Q- C! W3 _  a* Q* w& y' i8 I
3 c5 e' `+ i3 n) ]$ h3 Y5 Y8 K( H
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! ?: z& |! ]6 c* U" U5 n4 ]/ k我的应用层的测试程序如下; o2 o% V& n5 m4 E/ _
#include <stdio.h>$ s$ e2 y3 c/ k8 U+ P6 ~1 S
#include <string.h>/ G: [! S0 v! F8 \
#include <fcntl.h>! t7 S; @1 [9 m. P  Z% L
#include <unistd.h>
, X% q7 }5 F& n( f- ?# Q#include <signal.h>8 G( k7 i- A6 i2 V
#include <pthread.h>       //线程) @( I$ U3 b4 h
#include <stdlib.h>) i8 n* `6 ~: o' n  V
#include <pcap.h>          //捕获网口数据
+ }7 V8 G2 q7 f1 a- m#include <semaphore.h>     //信号
  f. ^- P: \: N4 a  N2 e#include <sys/types.h>     //消息对列; F" c' _0 d' @, w) @7 V
#include <sys/ipc.h>       //消息队列- X+ Q% T8 t/ R9 P
#include <sys/msg.h>       //消息队列  p" x( `. h3 S3 B  L
#include <sys/select.h>* K! M; m$ U* g5 f3 E# \% ]/ T
#include <sys/syscall.h>
0 u! c4 p0 k% g0 A8 p3 i& y#include <sys/stat.h># z0 B* j, u+ k' z& U
#include <sys/mman.h>; Y  ~. A! _5 f' d* s
#define msleep(x) usleep(1000*x)9 t  D' J1 O( c% C

7 l5 d9 X3 d7 l; @0 e; l2 ~int main()  i- x  Z2 J/ [# Q, o* e8 b& O
{
( f+ H, _; h4 ?! u    //MCBSP,ARM与AMBE2000交互设备
) _4 ]( N# R, q3 ^5 d: T2 o  ~ int fd;
' ]) Q. {% D6 J- g8 [ unsigned short data_write = 0x5555;" [- Q' b/ f4 d0 O: j* c
unsigned short data_read = 0x00;0 N; G% l& `: B
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* r9 p( @; W  t3 n
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: ^! f& v2 s# K* W
    ; ^$ k9 {7 j9 F# }4 i3 _" Y4 C
  if(fd < 0)# i; d8 I, K6 i* r8 }" K4 t9 e
  {2 d# c$ L3 L7 n5 b4 r5 S' @* h
     perror("open failed\n");
! Z6 w/ Q7 d4 H4 P! H     return -1;& o3 p' l+ Y* o; M; B& O5 u& r
  }
# [+ _/ e& F% o/ T( e4 }  
4 k- X& _! d$ c; P, D5 r+ I  while(1)7 U( i  q$ k* V- T! e4 b/ ~
  {
: }7 A3 R& n; z7 A' z; M! L4 D   - V0 {5 V$ ]8 n- z1 h
   //AMBE2000每次读写是24个字为一帧9 i4 z' h0 H  l. ]
   //写数据时将数据在底层存储起来,等到中断的时候再发送
1 y# ~) m6 z1 U8 p   //AMBE2000输入数据是以0x13EC开头的
; |" ~& I5 I; @6 X7 M- J6 S   write(fd,&data_write,sizeof(unsigned short));6 n+ K4 J! d* z3 r9 e& |
   # a; [7 j: Z, D* ^1 f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  8 w3 [$ v1 T' ~4 W
   read(fd,&data_read,sizeof(unsigned short));
2 C1 |5 w" A0 U. G   
& R7 v& V, G0 R- p   if(data_read == 0x13Ec)% r* Y) f7 v4 k0 Q
   {
! T6 Z4 s1 X7 r   
& W3 r1 h6 M$ y8 S, t    printf("data_read = %x\n",data_read);
8 m( i$ h7 L' q* W. m( c+ {   }
$ ]; m1 }, I7 H. ]% i5 t6 H. b   
& ?! d& f& C4 J" f   msleep(10);
+ F( `8 P* t4 J, ]. ]  , B) z) ]2 I! e& [- d3 V6 T; Q, e
  /*& V2 s% s4 I( F0 q9 |6 _$ E
   ioctl(fd,1);   
, G1 {' K1 q0 j: O) @7 |0 m sleep(1);
+ Z8 i3 z* A9 @ ioctl(fd,0);
0 b$ ]2 f/ G5 B# `9 I+ T! h sleep(1);
) R) F8 Y6 G. T1 n5 x( f0 B */ + M0 t: B' q0 ~; B
  }   
1 p: r8 |" w1 z" K: | return 0;
. R+ o% P% H  m  G4 B $ z( h7 n/ Z" M+ V; K% u
}% `3 ]5 H5 W: L* o( M7 Q' n; U

8 b. Z( y$ g+ x3 n) C# e0 P多谢各位指教,谢谢! 急
; Q2 `! _; M" c: k. S
% [$ [* y0 U( U1 s9 i7 G" V  X+ D8 d7 Q% ~3 p

* \. e! v7 R( V, H+ M
! D0 ?+ x" P: C- Z6 }
: m, l3 _$ J0 o' k- c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 21:37 , Processed in 0.048550 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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