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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ k% F6 U+ s* x. z/*' r2 l  p& n3 Q8 L; A  o9 G9 v: W
* Copyright (C) 2009 Texas Instruments Inc, n; i, T1 u7 k( w2 c" c' V# m
*
+ l" S& Y2 ?% K( `* i* h * This program is free software; you can redistribute it and/or modify# a7 [, V/ F5 t; N% F7 c* a
* it under the terms of the GNU General Public License as published by
2 h- m) ^7 W3 S/ ^7 ]7 ~ * the Free Software Foundation; either version 2 of the License, or
4 H& f8 R& ?5 P+ F! D" k * (at your option)any later version.
/ R, |: N& g/ p5 M *2 C9 M* A1 c9 h
* This program is distributed in the hope that it will be useful,; }; f7 z6 }0 L" w# x
* but WITHOUT ANY WARRANTY; without even the implied warranty of  l- c/ S5 S. x
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 @  ~5 B# O" p
* GNU General Public License for more details.* i' V9 \8 m6 H1 M) D( f0 j. X
*
6 a' v1 r" r, j, C * You should have received a copy of the GNU General Public License
+ P: V3 Z& H2 ]7 R; C) W, ^4 Y: I * along with this program; if not, write to the Free Software- Y4 O; X$ _0 c$ A
* Foundati
% G9 Z3 C( @4 ~3 c* A*/
' p  F8 {/ Q  ?* R+ y, [9 K! T#include <linux/module.h>5 V. j& W3 t6 b1 }! Q; b; ^8 W
#include <linux/init.h>
' Q3 e% n+ j! e4 g) ?#include <linux/errno.h>) R  X! T% e$ H, W$ k& x
#include <linux/types.h>
- n& ]( |( g2 I& a( N#include <linux/interrupt.h>
8 }$ C9 }. k# c8 l, p) X#include <linux/io.h>3 Y- w$ W/ b9 Y- \* t1 @( t
#include <linux/sysctl.h>
! H! q# x7 Q! P! O& L# T; |( f#include <linux/mm.h>
$ T7 C4 L0 G0 g4 k, }% Y% D#include <linux/delay.h>
* v' b' u6 K( r. z5 @) s' e/ h#include<linux/kernel.h>- O+ j9 R% ]. r! P' n1 A5 {
#include<linux/fs.h>
! S: \6 e! V/ [$ w8 K#include<linux/ioctl.h>
9 O+ b5 W5 ^6 N0 a#include<linux/cdev.h>, a" k# Q1 Z9 X# J
#include<linux/kdev_t.h>
( N: D0 {% D4 o' J#include<linux/gpio.h>6 c2 V7 I/ Y( a! n, S0 y: s9 f* ^
#include <mach/hardware.h>3 I7 h2 K: p2 t5 Y4 M6 W
#include <mach/irqs.h>
# n- _8 g$ `6 X+ @$ K. N
5 j1 E, H% G2 t& f* v) P8 G+ V9 g#include <asm/mach-types.h>
, }8 }5 A9 ~8 ?( B3 t#include <asm/mach/arch.h>6 }1 R) M% i  }4 S+ ~, v
#include <mach/da8xx.h>
1 M! \, U7 ?7 l/ \+ o#define  SYSCFG_BASE   0x01c14000* u2 @+ o; K" o9 U! e" i
#define  PINMUX1_OFFSET   0x124
' ^9 W' g7 g# y2 w#define  PINMUX18_OFFSET  0x168
  n. h6 v0 {0 O2 Y- ~! {#define  PINMUX19_OFFSET  0x16c+ r! w6 P- |# \: R* m
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR/ _0 e- E, J4 k1 k# t! Z8 N
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR' J# U* e% m5 f% i/ i5 o
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* U5 Y% B, s9 B6 E; M& ]: U6 R
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR& K1 r. y* a* @
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR/ l6 d' A* _/ b( w( F
                           
1 _; E$ b& B$ |4 G# G* H; \9 M2 ^3 F( [#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
( T$ _5 \* q/ Z4 E: Z#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
9 S& |, I5 g3 @0 j9 H//PSC, X6 I0 y: p4 j
#define  PTCMD_ADDR   0x01E27120  
3 C* m2 l) M! R! P8 ^#define  MDCTL15_ADDR 0x01E27A3C" K! h6 [% A! P- X, L0 }
#define  PDCTL1_ADDR  0x01E27304- y# d; O& v' S! F* i8 V
//GPIO8 direction
  {. e3 x9 ^& c! V4 a#define GPIO8_DIRECT  0x01E260B0
; e+ d; B8 \4 k3 n" m1 M#define GPIO8_OUT     0x01E260B4
2 R+ R  o, y3 i1 [; K#define GPIO8_IN     0x01E260C0
4 I' U& S& r1 w1 I1 l
, E4 }( B" D( ~' u  J, p  {//#define MCBSP1_RINT    99              
" e2 T! j- Q) i6 r//#define MCBSP1_XINT    100  
' j1 N+ I0 K, l- W+ Hstatic int MCBSP_MAJOR=239;7 H) s9 A8 Z+ G5 Z4 N! @+ s7 n# Z; D
static int MCBSP_MINOR=0;
4 |/ A. g9 N( T2 @0 K9 B7 {% Z) A6 m) @static int count =1;
' X5 s0 S0 A7 R' t, h/ H, T# d8 D" K3 W9 H6 v
#define MCBSP_NAME  "MCBSP-device"% s& f7 o. H' e9 M
' ?# h* K8 \( e6 g$ A: |. }
static struct cdev *mcbsp_cdev;
4 N4 N) S+ _& A  q. Estatic struct class *mcbsp_class;
9 h7 |7 N1 Y, @" r* ~+ b# estatic dev_t mcbsp_dev;, g7 @( y( @( m6 ]! u& s4 v
unsigned int DRR_data;& ?) k" T( }- x! m4 F! B5 J
unsigned int DXR_data;0 q+ H: u! |2 F% v% I' e( n- O
static int mcbsp_open(struct inode *inode,struct file *file)# S0 h. |4 m4 M& |' I+ c
{
' ]/ v- f/ `; @. E   
0 P- C) Q! R/ r* u# D- F   //interrupt enable,initialized
2 m4 O+ R8 ?7 A- F- C; ~# c   unsigned int temp;" I2 P) L( ?& }) l3 T
   //SLEEP_EN(GPIO8[10])---0
& K; e" N+ m% @   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 U6 B; H! F5 d
   temp=temp&(~0x00000400);( y# E4 i* a' I( y- y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& J8 ~) ?: H. ?$ U) \
  //RESETn(GPIO8[8])----0----1
7 t, p% [! @2 U9 A) V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ X1 _8 L+ h$ q  T( e% b   temp=temp&(~0x00000100);6 W3 m; ?* _" u7 J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
0 H' W/ y& p8 A- s1 s1 Z   udelay(100);
2 ]/ J+ I7 p# X5 Q   temp=temp| 0x00000100;  ?4 R  ]& @2 m6 w& }; Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! Z8 N& R; X- U8 Z1 \  d   udelay(100);
" r" {- K! _' |. B% V   printk("open success!\n");8 ~4 O4 k. {" `8 t2 a! ~5 Z
   return 0;
- A) b2 r2 H# L}  |8 a( L3 N: |/ Y

" g  T' H5 M& Sstatic int mcbsp_release(struct inode *inode,struct file *file)
1 A9 \0 o% a) T* F! z{
8 Y4 q! `8 V8 O   printk("release success!\n");( J0 C4 M+ K7 Y/ c5 \0 C
   return 0;
$ z: R. _; E% B% Y+ v. x8 u- T}- _8 t0 t/ m+ e! B* n: g7 k6 ^' P

  B$ i3 \% }1 A0 n& {9 @7 Dstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 `* N& n* c; i9 p! k( X7 L- g$ l* E0 W{
0 C/ u8 d/ N, o$ |( `    copy_from_user(&DXR_data,buf,len);
0 x: d7 {: W! f4 \2 C    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       / _8 u' g+ \0 |& V# o& ~
    return 0;1 A5 @. J. A! C2 t1 t# L

% Y6 F7 [9 o/ i3 T  b! x}& t/ U8 l. F$ z

; o( x/ N/ c& t2 b" ]! W% tstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: y' J2 C  @3 ~  D; Q7 ~{
3 S! \! [2 Z3 b* a- x8 \% K   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! ?) _6 \* n; @. N- l   copy_to_user(buf,&DRR_data,len);
& @! \3 h3 l- f- O   return 0;
* E. E: }, ~( v8 t}, u% L2 w. c7 G6 j! k; B) k; ]

& l0 I/ ~( w/ t" V: b
' @8 s/ M7 e. X4 |- V( Tstatic struct  file_operations mcbsp_fops=
+ D8 \4 P* S3 u. U6 {{  n$ u: v( e) Z2 ^# @. S2 P
   .owner=THIS_MODULE,( `2 r; Q) i/ f3 @! p! `2 `' y
   .open=mcbsp_open,3 ]& v( x* B  A  i2 I+ x& f$ s( Y
   .release=mcbsp_release,
5 O6 o/ I- n. @  b! {9 a   .write=mcbsp_write,; U- u: D) j4 t* F
   .read=mcbsp_read,
# T# }  V- Z4 i# `+ {' R  H};! B( C# t6 \% j& L' n/ L, r
static int __init MCBSP_init(void)6 o" V* g; H; n* B/ J1 k
{1 u. `9 M. U. ^! h$ P4 L2 v  m+ y
   int ret;
& T9 g2 E. A9 w: }- {7 \9 ~) o   unsigned  int   PINMUX1_REG_old;, P& ?; D- d) ^
   unsigned  int   PINMUX18_REG_old;# K0 D% q+ w* {# x/ R" [, a
   unsigned  int   PINMUX19_REG_old;7 a+ E6 L6 D+ g6 ]. t2 T& }% I
   unsigned  int   temp;  
: U* |% s4 X5 a7 e% _9 Y) ~   if(MCBSP_MAJOR)4 a- [+ ?+ x& J0 H# m  J3 c
   {% b4 R, b  M" R6 p$ l
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( ?( S3 V$ P$ i1 H  i  [  a' a1 |* y      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 L( A2 C- p) i% y' K( X$ r   }; g" u  r7 ~7 x( z6 x* w
   else  j% r+ A) V( J$ E( U0 f- P* z
   {
; M) }) I4 j" ^9 U( ?( ]      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ Q3 d- E9 n& D# ?      MCBSP_MAJOR=MAJOR(mcbsp_dev);! _0 w% V& Y: c0 Z& \$ h
   }1 o& e; s9 j7 l; t3 k/ R
   " M4 I% J5 F# D* Y5 A3 s! e+ q3 y
   if(ret<0)9 A" i2 U7 D$ M0 Q5 c, s
   {  n1 R3 U- X  u+ W
      printk(KERN_ERR "register chrdev fail!");7 a4 e- o+ R; ^' d1 s; F1 h/ N
      return -1;
+ d2 ^: }2 D' F   }
- j0 ]1 O0 P7 F) I   8 ^) e, i, r' u" ~+ H1 v- m
   mcbsp_cdev=cdev_alloc();
- R0 g0 }$ r" Z# k! I, n$ T   
6 B8 a4 F1 j, m- U   if(mcbsp_cdev!=NULL)
- E2 Y! B' u, {+ U. e: u( B   {2 h+ `5 G9 I' S0 o& {6 x0 A' t
      cdev_init(mcbsp_cdev,&mcbsp_fops);
3 P; x. B; H0 T+ r% l7 K, v! Q7 r% |( \      mcbsp_cdev->ops=&mcbsp_fops;/ H" E/ k% w0 f1 \3 ~" h, R' m4 r: F
      mcbsp_cdev->owner=THIS_MODULE;
( u, Q  F" F; x( y6 T      1 K6 P1 K, w  M: g# m
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( e0 s4 D6 ~  r: n          printk(KERN_ERR "register cdev fail!");
# B8 l8 g7 E  b& G4 B" h9 x      else
0 N# b" b0 R0 V! T8 H          printk(KERN_ERR "register success!\n");
' a; H/ P" z) p- j9 i/ L   }- P* t3 _1 L* c* e$ @
   else) @+ f% e( P& o5 `
   {
* t. P( e0 j5 O& y/ c: t& X      printk(KERN_ERR "register cdev err!");  {5 \' k5 M# M0 ~" P
      return -1;# i  c% r9 p$ s  n
   }/ k; a. M: u1 f" Z- R1 t1 Q
   1 l; j( B' d4 K! l& c1 O0 h1 y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: ]4 a3 e# r3 a6 F* ^/ v2 U; z   if(IS_ERR(mcbsp_class))
( e" z! q7 ]$ B0 u$ l# `4 O   {
. @* Z7 u% a" ^% Z" h: j+ l4 U; q      printk(KERN_ERR "register class err!");+ L8 D+ m! e: Z" l) z; u- ]
   return -1;
6 x/ g+ K/ ]7 P, ?; K( I   }- p5 H; x: x; |# m4 i" T/ o1 H
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 O) V; a* K! j- F0 L$ @. G% u( f

) B3 F6 B8 q3 L2 V4 \   //PSC: L3 L  _+ A3 n2 b+ I" z: x5 Q
   //add Enable MCBSP0 Z) F- b* I: P
   //test
4 O9 |5 F' \  i* V   temp = 0x80000003;
6 d$ y! x( x3 Y7 L3 o   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* T9 I! A) c; D6 }) A   temp = 0x00000003;
: P" `# r, r1 {' _   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, S$ ?$ c' ~+ [  U' O6 J: O0 [
5 @/ B& q; b2 G* V  e# F+ X   temp = 0x001FF201;5 a7 [* E8 W! b' H" |# V
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));. s. h; x: n% D5 U: y6 s0 S- i+ v
   $ r9 t/ I4 l; z3 ?
   //PINMUX  
& [% U5 h5 j5 f7 Q   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 i4 e4 B4 k+ _: J' H4 j: ?% B
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
* ?/ O& z7 R, h( ?8 c   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: J9 y& w0 z. G& t   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" I  _8 f+ w& v0 y+ x
   $ t( R& c) W6 V3 i9 R% g" ?# U
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
" S, g! ^! ?/ m* L1 e  R8 `   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  7 f) T& F% N% q" c1 L% D9 g" L0 y, ^
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
$ s/ M8 o( Y( o) a/ \9 G7 x   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 V+ O% \2 d" ~5 |# A1 m/ n% w

9 O" J2 ?  ?$ e. U   //RESETn,L138_SHK2& b% d4 }, @* ]
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! W0 |4 A. x9 p. o7 ?% Y2 e   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
/ c. E, h+ `' r7 A6 u1 n7 r6 d8 x   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 b) B4 Q0 K* e' u6 J/ D
9 r* {) U* C  ?1 L- r# o$ B3 F1 L

% I7 C; L+ V: |( M9 V+ @  //SPCR Register
- Z& i9 B# ?  t! p; r5 x, M  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 x. t4 w" p$ V0 S& z- S5 W5 |3 r3 `  temp = 0x03000000;//(DLB=0)
# C: R9 B9 l! y9 z: W // temp = 0x03008000;//(DLB=1)
9 W1 ~/ ^. ^0 `" r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ i! i! ?+ g' n% [
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 L: t" y- B( m: T$ p% U3 ^  printk("temp=%x\n",temp);+ r0 D/ H# [8 s  \3 Z

' Y9 o; s& E+ g$ R6 G9 r) X: l" k- Q: D! ?   //PCR Register
  S) h2 g8 q+ ^! J9 Q   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% q+ s! }% N5 J  // temp = 0x00000F0F;
( x3 F$ g/ A7 I: C  temp = 0x00000B0F;
" X, F8 l7 G  Q' Q  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized * v/ G( h! E' _6 A9 d. `
  temp = readl(IO_ADDRESS(PCR_ADDR));
+ L& z( a2 c* y  B7 n; u  printk("temp=%x\n",temp);  8 x) m9 K2 T- g% }! J' U8 V
   //SRGR Register
5 w6 s- r4 k& Z* A) p7 `4 z; m/ p   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ `- B. Z2 n: z- N, x0 L  [
//temp = 0x301F000B;0 J1 R9 J" G  G  F! N2 @
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* g0 |1 h  n, A9 }8 C. D6 _" j  temp = readl(IO_ADDRESS(SRGR_ADDR));# [5 T  A9 X5 A& k' i) }7 K8 n
  printk("temp=%x\n",temp);
  a( y/ |- \( L- S3 w# C/ S! _   //RCR, w# P$ N( ~6 C) {6 r9 N1 T1 ?
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
  J! O% c! ~+ i' ]2 W   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, C; V' f9 U, N4 n$ i' ^   temp = 0x00440040;+ L- j2 O) a5 a  R& Q) e1 g  Q
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
0 v4 _6 q6 z) \  }( o8 I   temp = readl(IO_ADDRESS(RCR_ADDR));: @7 O! t3 x. m
   printk("temp=%x\n",temp);
. |' v6 _0 C; l   //XCR' |2 g/ w3 V; J# q% k. M
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, ^' i2 Z% v$ u" i6 \4 h* z
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-04 Z7 `; n4 G2 ?, M' D
   temp = 0x00440040;$ a; E9 K1 h6 b2 L2 e+ l& N  P
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   / m, G% u% h2 o" H1 Y5 F3 Q
   temp = readl(IO_ADDRESS(XCR_ADDR));
2 F8 Q% ^. R& o/ y( Z" m1 I. Y   printk("temp=%x\n",temp);
' O. o/ c0 p7 R4 J5 R  udelay(100);
1 _; D# C- z) ~+ y  //SPCR Register
, u/ j& u5 w* w  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ U& _* c7 L; i( @  temp = 0x03C10001;   //DLB = 0 VS DLB = 15 U1 j# w7 h' R+ k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. r5 I# D/ y+ u* e7 d! E' S
  temp = readl(IO_ADDRESS(SPCR_ADDR));4 O7 U6 S4 T9 M/ z7 g! c
  printk("temp=%x\n",temp);; I) T5 O8 _4 W$ f7 Y4 L
  udelay(100);
. g; z1 d5 W, E+ a7 e# w
) Z# R8 _2 ^; L% }/ f  //set GPIO direction- J3 Y( S4 E! z. x7 U8 e+ z0 B
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; |: {# D& N! ]4 p7 d0 j' N8 W7 o9 v   temp = temp | 0x00000100;//EPR----input) m7 Z1 e# V! N$ Z5 q8 e2 A3 n
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: y3 }0 z1 N) Q2 ^) v- W( A
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
, x! P  l& J+ S0 i. h) u9 R 1 U* m! L4 O! q3 L8 b" ?
   return 0;. d  E& w& o1 `2 q
}
9 A$ @! O6 T/ ~; A1 y* ystatic void __exit MCBSP_exit(void)
) C* o  s% K5 ~2 ?2 l{# y  ^" C7 ?( c! e
   printk("mcbsp chrdev exit!\n");2 P4 |) @1 D9 `8 L# W8 f
   cdev_del(mcbsp_cdev);6 W% d7 J( y+ t5 h# _; D
   unregister_chrdev_region(mcbsp_dev,count);2 ]0 y# v2 [7 @8 e, O! q2 P
   device_destroy(mcbsp_class,mcbsp_dev);% r; s' j; P5 d1 I
   class_destroy(mcbsp_class);6 \! V# L+ R0 O
}' }8 }' U1 k# w4 r7 O+ c
module_init(MCBSP_init);6 [! }; N  K" q7 m- a$ U* I
module_exit(MCBSP_exit);+ s' C1 h* Q' m! I/ \9 p
1 N5 k1 E* u8 ?+ m) R* \/ L
MODULE_LICENSE("GPL");$ E, h% c) v3 {3 @" ]; U
1 k4 X% c% b6 i, n2 W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* y( b7 q( k, {, u; N* k5 I我的应用层的测试程序如下! D8 L. y; h9 q4 w
#include <stdio.h>
9 T( |0 o1 A2 ]. P* _#include <string.h>+ b# F1 |/ D9 c+ ~. f/ y3 v
#include <fcntl.h>! a) V  z! ~5 \- f1 P+ X+ X6 m
#include <unistd.h>
$ _" Q& C0 p& e6 Z3 S5 B- {) r. h#include <signal.h>, `' o% u3 `0 B4 M! c
#include <pthread.h>       //线程& E. @9 L! H4 @# M
#include <stdlib.h>7 W5 d! s9 D# l( n1 j6 W0 B
#include <pcap.h>          //捕获网口数据+ ^: z- ^' L3 Q* r6 C
#include <semaphore.h>     //信号2 V' @! j& c, Z3 c4 O" X
#include <sys/types.h>     //消息对列
. }' A0 X6 _4 A#include <sys/ipc.h>       //消息队列5 Z% u8 K0 ^- P: Z4 ], o: T( U" l" f
#include <sys/msg.h>       //消息队列
$ I' a' o. l, A- N! F: e5 {#include <sys/select.h>
9 U, k7 t- @/ w) q# q#include <sys/syscall.h>$ X4 b* U- i7 f) P  K  e
#include <sys/stat.h>
! m+ D2 k( P2 V! E% A3 T' Z#include <sys/mman.h>
4 w9 m- k9 Z& g! A6 d; `4 I6 I#define msleep(x) usleep(1000*x)
) X% c9 I) z8 j2 W1 A' y
( I: m5 M% \# J( I+ \int main()
7 f0 L0 Y& M0 s% f; R$ l{ + _0 i+ m$ c! {% z3 t! J
    //MCBSP,ARM与AMBE2000交互设备
$ i7 v0 [; z5 @) D! I1 Y9 a7 F int fd;
4 {% x' j% u+ c2 {6 B0 ?# C  y  Y unsigned short data_write = 0x5555;
  ]8 w8 P  M' [. p* Q; N0 u unsigned short data_read = 0x00;
: ^" G$ Z9 R4 q+ t4 K' L2 [) q  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 H5 y% v$ @1 } //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* U1 A0 F+ w" m% `! q( b  d+ {
    6 u8 F( q. _9 _1 k. o, ]
  if(fd < 0)
: r# t$ Z  u+ m% y% W" L  W  Y  {
* z" }& Y1 x0 B& k( J     perror("open failed\n");  E; Q% Z) z# V, y1 d' e
     return -1;
( I  {6 e4 ~0 Y2 |* O$ H  }
4 X& |6 e, j  F" A  
/ Y; K* h; r, a1 U  while(1)  e7 H. i3 {5 z! Y' l
  {4 G3 w2 i2 I  ~
   
3 R( O/ B1 B' H( c  g   //AMBE2000每次读写是24个字为一帧
& w+ a9 j8 {  K) f: J% Y   //写数据时将数据在底层存储起来,等到中断的时候再发送
3 ^& v% }' [- u: E% s. k$ _  }   //AMBE2000输入数据是以0x13EC开头的
7 _% V4 ?: p) y# u, v! U   write(fd,&data_write,sizeof(unsigned short));. q9 \5 L( t. R; C% x: V6 g5 B
   9 O# b9 E8 V# A% X( N5 e( E& x
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
7 L+ S4 F5 s- A6 p  M2 i+ P9 h   read(fd,&data_read,sizeof(unsigned short));$ U+ L5 m5 z5 f" I+ j
   - M" O" Q8 v+ b
   if(data_read == 0x13Ec)
4 d' A' g: V' k1 s& j   {1 E6 H; A6 M4 m5 _/ ~- j
   / F  x- k' E' J+ W4 x, }
    printf("data_read = %x\n",data_read);( U' h0 s) h. _* f7 ]
   }) _! k# ~: f  L
   
' h/ W" z9 V$ Y# r1 {  c  F   msleep(10);" V9 M9 S: J  d" g, J0 P, I
  
- N8 F( g8 ]/ G1 N3 h" _( M0 f2 t  /*
* j" K# X0 O' G4 Z! ?4 ^   ioctl(fd,1);   
& ?6 U4 g# ~  |- i. p sleep(1);
0 Z' j3 o. K0 j' z% z* v ioctl(fd,0);5 k+ `7 W' `, `8 X3 q# R
sleep(1);
9 V1 Q+ x2 o. g0 i$ N7 ^ */
& s6 _2 y' u' C$ R1 F/ n  }   
8 b+ n: ^4 I; q1 f return 0;& n% t% s$ T6 _+ d1 o2 v/ }, e

8 U0 L4 @/ F. h* H0 p( w! a}
2 w# P7 j! T# p& ?7 o  s8 O; f$ \) f" ?1 x/ M: r* e* k( m% i
多谢各位指教,谢谢! 急
6 ~& ^4 O# I2 A8 o1 L, ?7 p: ?# p

" d% V! b6 f( ?4 z# u1 Y1 }4 ~1 A! ]& H& Y
6 N2 I9 ~" H4 J
) r' R% }$ E% a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 19:07 , Processed in 0.043113 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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