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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 Y* O1 i4 }4 W# p% V
/*& j5 i8 [1 d; F
* Copyright (C) 2009 Texas Instruments Inc0 W: }: ^' a  f8 c0 Y( g) I
*
( Q) D& `; b6 R& Y% q6 o * This program is free software; you can redistribute it and/or modify
9 f- p/ `* ]( u, Z * it under the terms of the GNU General Public License as published by
" t0 J2 h4 N. j* {1 f% J' ?! Y * the Free Software Foundation; either version 2 of the License, or# v8 n8 \, k6 J6 ^
* (at your option)any later version.5 h4 e) m* y4 \; a3 B
*
6 O3 B1 F& x# E * This program is distributed in the hope that it will be useful,
+ [% Q$ G2 t. A# f5 Q * but WITHOUT ANY WARRANTY; without even the implied warranty of
1 k/ j7 ~1 ]0 h: I7 j: x- P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5 S. u  m6 {. Y  n8 ~, L
* GNU General Public License for more details.+ W4 R/ b! g  q/ T& V( ]
*& g* a" a3 i: g, R3 ?$ ^" @+ t6 a/ z- m
* You should have received a copy of the GNU General Public License! Z% y3 b4 d& V) m/ J
* along with this program; if not, write to the Free Software- @& U# [% d% m3 @) `; ]
* Foundati  ?1 e$ r. Z# v/ B9 F1 o' M" V
*/( {, e( }) e4 j% X( {
#include <linux/module.h>
' X- A9 k1 B; q0 s% Z#include <linux/init.h>' R* j2 q" J* P" x! {; w' r
#include <linux/errno.h>8 @# A$ k) P* I3 u. x
#include <linux/types.h>
; {+ T9 v6 j& q& O# X/ ~" U#include <linux/interrupt.h>
2 K- }6 B- P4 W% D2 H. q#include <linux/io.h>, `$ S4 Q3 {' r
#include <linux/sysctl.h>, Z. B7 S" R( t4 \( U2 W
#include <linux/mm.h>
* z; g/ P$ ?1 [#include <linux/delay.h>8 G  x6 i  V/ i9 L
#include<linux/kernel.h>0 O' ~9 u; y$ L- F0 U& b4 H
#include<linux/fs.h>
3 I4 `- b9 k% |) q: C#include<linux/ioctl.h>) v; J! F8 Z, y, U# {
#include<linux/cdev.h>; U" h6 B1 n- Y1 H/ U+ P
#include<linux/kdev_t.h>
' G: e8 N$ R2 a; i; L( b) Q#include<linux/gpio.h>. W: ]; L' m% q, y, J  D3 [
#include <mach/hardware.h>, c) m6 q3 w4 L' v7 {
#include <mach/irqs.h>) Z4 H; i& e! A& q5 N
/ j6 x' H% r6 y/ k. x" i3 A
#include <asm/mach-types.h>- g4 W& C$ p6 T1 S; z8 T
#include <asm/mach/arch.h>0 z* z! ^$ ^0 S& o: _
#include <mach/da8xx.h>
- v/ q2 O9 P0 m9 N7 ^5 h* ]! x#define  SYSCFG_BASE   0x01c14000
" e( Q, H/ i3 j#define  PINMUX1_OFFSET   0x124 2 x) b4 U4 L/ u; N: K  v, |
#define  PINMUX18_OFFSET  0x168
( h* Q5 f/ f4 @7 R. \) q+ ^: @1 ~/ j#define  PINMUX19_OFFSET  0x16c
: i: h. e$ I% i3 e7 s#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 g+ `* h, e' [1 a
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
- r$ V2 G  p- u' P! l9 c. e#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
9 E3 T9 O% X: U- d#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" I0 y/ c4 h2 Z; Q- ^: S8 F#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
- V" V+ b; l1 c6 v5 P. C                           
% N' U: `! a; w4 }#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 ~: |" E3 P* v- X1 q7 Q
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
  n, k( O; n. I. i& ?//PSC& s! O" u; R* O4 N- V: U1 O
#define  PTCMD_ADDR   0x01E27120  ! \# f" [3 V+ e0 x5 E
#define  MDCTL15_ADDR 0x01E27A3C
5 u; y' ], Q0 a! A5 ]8 ]8 b0 D#define  PDCTL1_ADDR  0x01E27304$ A* N; v5 K/ S0 Y
//GPIO8 direction
1 o( x5 x" E* L#define GPIO8_DIRECT  0x01E260B0
% E# r5 X3 H! E* e* a/ b3 L/ A#define GPIO8_OUT     0x01E260B4, U: M& v7 {3 F/ e5 Z
#define GPIO8_IN     0x01E260C0: ~) _  ?3 U1 A, Q
4 t0 ?7 Y) M8 |$ i
//#define MCBSP1_RINT    99              
5 Y& _8 M# X) D7 m; c/ B//#define MCBSP1_XINT    100  
4 x5 N2 C% x( i/ F, G6 Tstatic int MCBSP_MAJOR=239;
/ \  Q& b, C* ]. H: P6 B# n7 vstatic int MCBSP_MINOR=0;0 g( i! {  h$ c: F. A8 I* y
static int count =1;
2 d! b* T6 ?9 {3 @- N: r, j5 k+ B9 k2 H/ w' X: D
#define MCBSP_NAME  "MCBSP-device"  v& f9 i% A5 ?4 G# C& C
7 ^3 O$ s# r" N8 {$ S5 z+ f
static struct cdev *mcbsp_cdev;
: y% E  `' T# U3 i5 lstatic struct class *mcbsp_class;& W& j6 h7 R9 j) A: M
static dev_t mcbsp_dev;
$ P0 P) }; H  f/ b$ a! h) h2 punsigned int DRR_data;) q$ O& v' g3 n4 q% _
unsigned int DXR_data;
( W1 J& a. [; x. ^% Sstatic int mcbsp_open(struct inode *inode,struct file *file)
: G. t, W+ a, o& s: x5 K0 ^+ W{) S* Q$ v, P1 q
   
- e& Z6 Q8 f% u9 Z( C/ y   //interrupt enable,initialized8 T5 A& \% t- v' h5 R. {
   unsigned int temp;
* |3 y7 P6 Y0 w7 I; e   //SLEEP_EN(GPIO8[10])---0
5 ^: T6 X2 b$ E5 T+ C1 G; p: M* K   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; [  Y1 t+ T) g/ g8 q1 L
   temp=temp&(~0x00000400);" ^: k# W5 f* _9 U1 L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 P5 l1 u5 D4 ^3 B& U  Z
  //RESETn(GPIO8[8])----0----1
4 c! @( @" D; i2 @   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; u5 m+ x7 }3 c6 w* i7 C3 Q0 f9 [3 q8 V   temp=temp&(~0x00000100);
. X$ Z& W) v1 q: L; Q6 C& j   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
9 E$ `/ j6 X5 G! B& x   udelay(100);# i/ p/ }6 F' G
   temp=temp| 0x00000100;9 ~" w' f% V% D/ ]; }: M+ C8 ~& q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 Z6 h  T# H& a+ h  v   udelay(100);0 C, x) a2 x3 c4 @# d4 o- j! @& a
   printk("open success!\n");" p, z2 J; s3 Q1 {% g2 x
   return 0;' _. H3 @+ v+ a3 M2 J  _9 }
}+ I/ g, {# m/ z. ?

' g- _1 [2 Z( @0 gstatic int mcbsp_release(struct inode *inode,struct file *file)
  W7 C# ^( ~- `; _+ a{* O* K2 }7 A: ]. \/ [
   printk("release success!\n");
; L1 ]) \; x" s" j* u+ e3 ^2 @+ D; a   return 0;
# C1 z( `. |; r  a/ @6 m: l}
# j* D" k! v' t7 }6 I2 X, \( n# F- e, u. A  E8 Z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 f2 E0 i0 P2 A3 @' Z
{5 K7 p% M7 N5 m0 D9 i
    copy_from_user(&DXR_data,buf,len);
  ]4 K3 C9 S8 f+ D( j4 `. n8 v/ \7 V    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));         K" T5 K3 L6 O! p; s' X( X
    return 0;! w, B4 }) m  D

! Q, k, r/ w0 T5 W* r}
, ^) A. X5 h. X0 ~9 l
. K% e% q6 f6 R: m! y& K: V, u) Zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 g, ^, o$ @, G! D
{ 0 g' Z- s% P0 f6 J, J
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 h1 e9 l! q: R) I0 q
   copy_to_user(buf,&DRR_data,len); 2 o- w' p% a! Z; }1 k
   return 0;
5 s$ J+ Q& `2 n) N7 o  w/ @}
% a/ O! Q% Q+ O- j) {. d9 ]% V# ^! [7 o, L6 C& K# i4 {4 R/ t4 w

% ^) R& g, X: l6 G$ c2 z6 Z; Wstatic struct  file_operations mcbsp_fops=
4 m- F! l+ V( T{8 ^6 [! \+ S% B
   .owner=THIS_MODULE,- T% _) {% Z+ }! B+ r
   .open=mcbsp_open,1 d" e0 G5 i, C3 \8 f( ~  i
   .release=mcbsp_release,# w7 y3 u5 T: V, ~* B
   .write=mcbsp_write,
/ p- r2 P. r$ [1 r: k   .read=mcbsp_read,$ r9 F2 b% R( S4 C! J4 ^0 L; v
};4 T% w% t% u7 B7 S
static int __init MCBSP_init(void), V) f. b- b* c7 a, V- g3 ?3 Z
{2 i% n( A& C1 u, }: [! T
   int ret;- n/ \' |4 X5 y+ x
   unsigned  int   PINMUX1_REG_old;
4 ~( a; ]" F' V( e  ^   unsigned  int   PINMUX18_REG_old;  K$ l- r4 ^# J: b1 D: T( c3 J
   unsigned  int   PINMUX19_REG_old;
( \4 q! |) Y$ a6 x; T+ o   unsigned  int   temp;  * \3 N5 a! B# S
   if(MCBSP_MAJOR)
" C7 Y" V; S& d  I9 B) [   {7 ?' N7 a$ A8 V' x* W
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
  p: i& X$ ^. j' t/ W      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& L1 X  p9 b- ~   }
! D' V" l1 _( O! I   else* _. x3 A9 S, J% E9 M$ ~, O
   {  r$ t* A3 I" H/ @. D, }
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 u/ Z: M1 a( B7 v& v- L
      MCBSP_MAJOR=MAJOR(mcbsp_dev);2 X) t, f; i0 _4 P8 n' t0 `/ {
   }
- w7 k& a2 A; I, L0 _) r2 w   
9 e, ?- Q9 B1 |& v- \   if(ret<0)
) C' f$ B  A' d) ]- f+ {: A+ e   {
( H( |/ r- W7 M' a% h      printk(KERN_ERR "register chrdev fail!");
% [4 j" q5 s  B1 W8 D0 }% q, D& p9 d      return -1;+ Z% \& L( g3 Z5 s
   }" p8 t. @+ D2 `& k% t6 S+ C* H
   
) Z1 r. [9 i0 G# u3 r   mcbsp_cdev=cdev_alloc();
8 j8 K8 Q: F5 J4 Y6 p! s   7 ~0 H* @: ?4 N% m; ~! b
   if(mcbsp_cdev!=NULL)5 [6 V5 B* X( K
   {
" |3 A  ]+ _! q9 C$ \: z      cdev_init(mcbsp_cdev,&mcbsp_fops);: G0 L; _& ^, G+ o' W
      mcbsp_cdev->ops=&mcbsp_fops;* ]# v/ K' X* A8 l1 _) `  l3 B' o
      mcbsp_cdev->owner=THIS_MODULE;2 i  P  O/ V6 Z# K7 y  G4 B6 s
      
. |8 a  r. z+ @. w# d% q      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! U9 M- x+ S0 d7 M: L- ]
          printk(KERN_ERR "register cdev fail!");
2 J* X# O2 Q3 s' B+ z      else& Q$ K8 c+ f9 ^; K" H
          printk(KERN_ERR "register success!\n");8 M) H: |& ]' o1 V/ I
   }
$ v! d# D* K( W: f! U. h   else
- {4 Q% L# H, ^9 m- V   {
* @" o, i4 H1 Q& Q3 M) b      printk(KERN_ERR "register cdev err!");7 |2 D; i" z& {" y
      return -1;9 P: c2 J; i+ X6 _! ?9 Q; p
   }- ]2 S9 N# j2 f+ |1 m9 f: e
   * _- R# c# O. p4 e5 n0 n2 I* k" n
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: x6 G: w) M$ A0 Y# v
   if(IS_ERR(mcbsp_class))
1 Q( l4 g7 g; S/ Y- C( i" x1 f   {0 h9 a7 V) R' P$ `2 Z, ]- H1 D
      printk(KERN_ERR "register class err!");# h. q6 m: i- e) k" b
   return -1;" R1 o7 ?5 F) q. ^7 S% M
   }
: l; |& e0 \) |8 @9 q) \# y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
8 {5 t+ a" o9 k
4 N0 V% ^  ^' d( V; |   //PSC
& X' L' J, q3 S0 U' T( ?   //add Enable MCBSP
) S, ?& A& n: W2 |% K6 w" m, o   //test9 d5 l8 W9 U3 G8 |
   temp = 0x80000003;
, X; H+ S; @( k* G2 a   writel(temp, IO_ADDRESS(MDCTL15_ADDR));  I% L$ J9 \  r$ k
   temp = 0x00000003;! E6 ?6 k' o$ L
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 I, J' \8 }( P6 A( e' g2 h
" o; [) j7 V- t9 O% g% o   temp = 0x001FF201;
; @% l+ V# |. V2 q2 D   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# z- W4 U' @3 J6 ~) W4 K   . C1 [6 d9 _; w! h8 Q) v  I
   //PINMUX  
/ K  M) e" U0 h; K* S! G   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; p" r. G( G; z; [0 k( k; Z   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 Y, ]6 C, b2 n. p( |  o
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: k# |* u  _3 F- b7 d9 a8 u0 C2 [+ W   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( K0 h2 N' [2 s8 O7 l. ]7 {
   - v& n6 g' g7 w( Y# i: R$ Q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
: W9 H- j& B, K4 ?& X5 M   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  6 Y- }, ]  R: w
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
8 e# J" n0 g- S8 J8 G9 Q& K" |   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) L7 k4 Y. D! K4 m7 n! I $ q( P$ P9 C! T4 N- M* e) Y$ y* W
   //RESETn,L138_SHK2
3 z  W! O. b. i0 D8 }- c   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . g# m6 ]8 y# b- e, r6 {9 A: v
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
% d* p+ `- {4 ?; B( r   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- o% P% Y: Y9 J# w! T3 ^* P! h2 V# X
6 D; s& m3 p* _8 L9 s5 q1 [

8 L5 y) ?2 ~. C4 W1 W  //SPCR Register
6 {' t; ?8 {$ m) I* x- ~  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
8 P0 @& B7 m, ]  L( Y4 X! y1 ]! L  temp = 0x03000000;//(DLB=0)
; R; O, l: l7 L) g% n4 l/ G+ @ // temp = 0x03008000;//(DLB=1)- y4 N/ Z/ I$ d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
8 y4 E3 a+ c- p* P  temp = readl(IO_ADDRESS(SPCR_ADDR));" Y7 L- r. b! Q: P
  printk("temp=%x\n",temp);  Z7 ?# {3 M  ~* f; Y' B8 H

1 i" ~+ B5 p; Q1 w% O   //PCR Register5 l8 `" ~/ p! T  i3 K$ i9 y; A
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% _# Y2 T; G' t, ]( T" C
  // temp = 0x00000F0F;
& f( Z, X: o# }% ^4 Z1 `" S  temp = 0x00000B0F;
3 N( Q5 D* u- j+ J1 ~# o  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
, u; V! H1 O2 l  temp = readl(IO_ADDRESS(PCR_ADDR));9 O$ C- t* T! i& k* w& Z1 r
  printk("temp=%x\n",temp);  
% t. G0 K# e  c4 u. z9 x' {! J   //SRGR Register
8 ?* r, [" Z3 e+ w( i   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; e* r4 ^9 j# Y: k) U+ A3 `
//temp = 0x301F000B;! O2 Y1 s) X/ U+ z+ d; t
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized & `# r. R# g" n- j* R& t- r; h
  temp = readl(IO_ADDRESS(SRGR_ADDR));: c6 _9 ]  Q. U6 B* m% V% h& U
  printk("temp=%x\n",temp);  N- w7 l" O0 c2 V+ Q5 Y
   //RCR/ I3 @8 y6 W6 [6 M& q+ C: h
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* _; t( v9 V4 ]2 F2 K2 s" s
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0: ]% y* j( C' ^; Y2 B* [3 t- ?
   temp = 0x00440040;. S, B1 }' U* M( E3 e+ m3 m+ Q, f
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - I2 Q# S- s# t' o( {6 D
   temp = readl(IO_ADDRESS(RCR_ADDR));+ F! H* g0 a& k) B4 _1 l
   printk("temp=%x\n",temp);
0 T) A+ y! J: K( a' E   //XCR
/ r+ l/ C$ }' g7 l   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ L3 R7 c/ Z) A- k" T* H
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ B: ~  g- A; l& b4 D0 [
   temp = 0x00440040;
& ~3 f) v3 b( L& x5 ^; X9 q   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
  y) g; p0 [5 B1 H$ F" H' y   temp = readl(IO_ADDRESS(XCR_ADDR));
3 ^- P$ T3 S' [9 y9 U0 y7 S& C6 X1 M   printk("temp=%x\n",temp);  I/ _# u, M) B2 W1 f
  udelay(100);
; c7 ]! c+ @9 N% w' j) g  //SPCR Register
; @5 n( k# `6 b- k. E  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 X/ m" r: z. y- Z6 _4 `  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( q+ l2 a6 |  b, k+ I- J& ~. N0 U  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled' Q" [  U  Q5 p  m' R5 J( a; c
  temp = readl(IO_ADDRESS(SPCR_ADDR));
! M7 y* e: i7 K' }1 x  printk("temp=%x\n",temp);
7 V& a' Y3 m0 \% a$ ?5 L  udelay(100);3 n8 |( S# ]& A

4 [/ u; K. p% X+ q/ }. g  //set GPIO direction
. O4 W2 G" ~2 i3 T+ _2 H# s& Q% n   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 t& Y+ l0 p; U' i; `8 P0 ^5 t
   temp = temp | 0x00000100;//EPR----input
. d* x" C4 S( Y- U, d   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
  m0 U3 E2 I7 L0 N9 M   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
  T) k( w* m" x : K; u3 J& r( d" y% M
   return 0;2 y- p1 N+ e1 N6 {1 N; I
}, o8 g: u1 O  _, H% H" o1 E
static void __exit MCBSP_exit(void)1 j" |! d; U  ?% q6 m
{
4 \/ ~: r9 o: H5 |1 N   printk("mcbsp chrdev exit!\n");! _/ P' n4 R5 ]5 Q$ y8 L
   cdev_del(mcbsp_cdev);$ h  w7 b+ w! l1 ]
   unregister_chrdev_region(mcbsp_dev,count);% n  ]( D0 a& E- M
   device_destroy(mcbsp_class,mcbsp_dev);
& R9 z. Z* R) r3 [1 h   class_destroy(mcbsp_class);% A$ w  Z# o/ J$ X
}
! y/ J2 V" R8 }' S8 Y1 F; S1 Cmodule_init(MCBSP_init);  ?+ W8 _: a" z+ ~
module_exit(MCBSP_exit);4 B: L/ G! _* r
5 K( J3 b1 S9 ^9 E5 D# }7 {
MODULE_LICENSE("GPL");
3 j* g# {# O; q
3 ?$ c# P, S  z9 m. C/ J我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- Z! ~1 E+ i; d我的应用层的测试程序如下/ U7 b7 D' E  g+ }7 M, L
#include <stdio.h>
; C/ b5 `; ~" k1 Y" O#include <string.h>8 N+ G, h% D7 Q9 y* ^
#include <fcntl.h>1 x! B  ~0 \" y! [
#include <unistd.h>6 i0 F: \5 x0 U0 b8 F. k0 v' F
#include <signal.h>- j. d& S+ X" D9 H% l
#include <pthread.h>       //线程3 X. ], M; M3 _/ k7 K% Z
#include <stdlib.h>+ L4 I0 V5 _1 o0 a$ r
#include <pcap.h>          //捕获网口数据* @$ P! N7 E0 n' h
#include <semaphore.h>     //信号: K2 H! O" C' e+ B5 u" m6 l
#include <sys/types.h>     //消息对列
$ B: F8 O' B* V# [3 Z#include <sys/ipc.h>       //消息队列% a5 o) k  P$ F4 e; A
#include <sys/msg.h>       //消息队列  {) b" h; @: y1 w% p4 c
#include <sys/select.h>4 u' p! S! m- x' C
#include <sys/syscall.h>
+ D; }$ X0 [  V, ~& r. f) h" A#include <sys/stat.h>' l9 n6 a8 f. _
#include <sys/mman.h>
% I: M6 A$ K3 j6 {8 n+ v) e#define msleep(x) usleep(1000*x)
* z. m4 Q8 A' G# l& e
. z6 S% ^" w3 M2 F. q* vint main()' B; x- l# l/ L9 ~6 }
{ $ b- X& u1 j( W  \
    //MCBSP,ARM与AMBE2000交互设备+ M; `; J2 p, p
int fd;% h! |. J$ C8 P, h8 y% P
unsigned short data_write = 0x5555;
" ]5 N/ l2 a# f1 j unsigned short data_read = 0x00;
1 ?0 \7 l( ]! S+ e1 ?( Y- Z2 y% ]! a  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ z0 [: y9 v5 {- v
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) j2 B  X; `2 b  H* u6 I   
! y* U8 g! s  b- d+ L/ A  if(fd < 0)5 F4 S- A& X0 y
  {
# Z! Y/ U, i$ E6 L2 g+ L     perror("open failed\n");2 R, q9 l3 t1 T" D5 \
     return -1;
" f) c2 ?! R9 u0 p- T  }* G  o: l2 M# b  Q# A
  * Y  _& [* [! A- T* [
  while(1)
, [2 e! b" o2 f4 o/ R' M7 Q1 j: ]  {
# w% x5 d6 U) p% o   
, H# a: o% t5 ]! s   //AMBE2000每次读写是24个字为一帧
" {* t. ?- F/ ~) m+ \   //写数据时将数据在底层存储起来,等到中断的时候再发送* T3 k, j, g* A1 }$ o
   //AMBE2000输入数据是以0x13EC开头的$ ]/ _& b0 \! x; S3 K6 t6 z
   write(fd,&data_write,sizeof(unsigned short));
1 c( l: S1 b% ]& h' G   % O0 d0 R. z/ j! H6 s
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* `3 l3 Y+ X/ `) @$ q$ X   read(fd,&data_read,sizeof(unsigned short));
' p5 E; g  t4 v% `' [) e+ z   ; E1 h# E  V( ~8 W( M" w$ H
   if(data_read == 0x13Ec)7 L9 V: ?: k% i5 {+ K; v
   {
/ @0 C2 J0 {) u5 B0 |   0 U2 i9 l" s9 \, Y9 J
    printf("data_read = %x\n",data_read);
0 {, \/ _3 E4 p; m# d( e   }* ?) h! T% f4 b8 S- d
   
4 K. E, u! ~# [! k7 r( Y   msleep(10);
! l0 `' {+ G' l! C  s  1 l6 T$ g# V4 d) E+ Z& u9 d7 R- p0 K
  /** X( l2 z" P0 q( o5 G
   ioctl(fd,1);   
; Z! w  I9 _6 ?) f9 s2 h sleep(1);
4 F; u! T3 E" c# e5 R- i ioctl(fd,0);
$ w& ]) f* T1 H& }% h sleep(1);! m7 K$ H' |$ j" S+ [" [0 D
*/ $ E2 a, h+ w( ?) ^$ e8 I7 `/ M3 [, M
  }   
) t2 d* J1 e! T" u/ ^2 F1 { return 0;
, v8 N% Z! V. `) I
" L; W7 R$ \" }2 V' D# z}
% l5 K# Q1 d0 g2 t. R, J3 q
9 ^% j" |! a7 i- E/ {. [多谢各位指教,谢谢! 急
: k  H: X. Z4 b6 o& z4 C) d) s3 _6 `# k# ]1 N6 N- T9 i! [
8 ]# g3 s$ K& ]( O2 i
/ O6 m- I8 q1 P: o3 a$ g
8 P2 D3 a0 K" ^# h3 a$ D$ Q" x" c
. G, Z: k# T: _' j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 01:24 , Processed in 0.049432 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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