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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! V8 \1 x2 R( U2 q/*
2 V! X7 u7 v, {) n * Copyright (C) 2009 Texas Instruments Inc
7 A% O% i# ?0 p! [/ N, e) k. Z+ M *" _3 B$ Q3 [; {' ]) b) c
* This program is free software; you can redistribute it and/or modify
0 n3 [2 p) P. N) R" x# o5 a$ e/ o * it under the terms of the GNU General Public License as published by
  ^7 \* B; S+ O1 }. U0 I * the Free Software Foundation; either version 2 of the License, or
5 v; E( J$ R  p  v  W: q/ k* P& n * (at your option)any later version.% ~2 Q  X" b' ?7 |
*
4 P( Q2 l% v5 n" i. g0 w * This program is distributed in the hope that it will be useful,
6 k  T8 B+ z) ]5 z6 f6 N * but WITHOUT ANY WARRANTY; without even the implied warranty of
: w% G. S: T# d7 H; d  ?5 G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 J8 y3 `+ t, E * GNU General Public License for more details.
; g6 W: i2 {  _4 n2 p *
& A% h% W# Q: H# S9 g* \8 B" T * You should have received a copy of the GNU General Public License
/ Y: M4 i6 _3 `9 `4 \, z * along with this program; if not, write to the Free Software! g/ Z% L3 F" v  u
* Foundati, }/ A! C; Y' h6 ^* T& r: u
*/
2 c0 t# v- ?. k#include <linux/module.h>. \- d, w  P9 S, C
#include <linux/init.h># {2 a3 v, }4 c& m
#include <linux/errno.h>; T3 C# j2 F* ^7 d+ M5 T
#include <linux/types.h>
' s5 L& I  y# G* d3 T* T#include <linux/interrupt.h>
4 z) |. O: B& q! L1 W/ q#include <linux/io.h>6 k4 W; u2 B4 P3 m) _$ T
#include <linux/sysctl.h>8 i% G0 t4 F. x8 x  m/ @
#include <linux/mm.h>
. L8 H  _: a' k' Y! P0 B3 f#include <linux/delay.h>
  J1 r4 J7 G. A* d5 q#include<linux/kernel.h>
8 u5 ]( V' Q# n8 b7 `1 _9 P" X#include<linux/fs.h>2 U) H# q) G% d7 M* {0 @  t
#include<linux/ioctl.h>( ]6 U" [( \9 `( s. S) E# }$ \
#include<linux/cdev.h>
* M  p+ h! _/ Q: n3 T#include<linux/kdev_t.h>
4 t" B0 `5 \5 c+ p* u#include<linux/gpio.h>! g2 X; s6 ?# U6 a0 m* S
#include <mach/hardware.h>
' E6 l( s4 h( X( `  V( W9 x#include <mach/irqs.h>
4 j6 R' W- C3 T7 Q3 {
2 `4 Y( E! \1 b3 \#include <asm/mach-types.h>
' [" _+ E" w; Z' Z! g2 s#include <asm/mach/arch.h>
* s  C3 g7 U# A6 M1 Q- ?' h  }#include <mach/da8xx.h>5 Z" J: w# {8 j7 J
#define  SYSCFG_BASE   0x01c14000: _0 @6 E% }5 q6 {; @2 T6 R$ G
#define  PINMUX1_OFFSET   0x124
& b' r) F$ Z' I#define  PINMUX18_OFFSET  0x168 " C* c# c  o& e
#define  PINMUX19_OFFSET  0x16c9 C& B. T) S% s  z& A, |
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR0 X8 E" e0 H, f$ z$ |
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
4 a1 x& w  F# B3 H2 B0 k4 U# T#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ c8 U! ^" q9 u- H$ W#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% q4 N0 e+ q3 A( Y6 G' O3 @#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
0 z5 W3 _6 U- B# d% q3 k3 m; D                           
. Z& N5 `* U9 |( z4 a+ F#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* O  W" E. L6 q#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) V9 u! Z- g. a7 ^6 Y) ]/ F//PSC' Z* M- i5 V5 @; k
#define  PTCMD_ADDR   0x01E27120  
; z- B3 B# g# t# _9 X#define  MDCTL15_ADDR 0x01E27A3C
- t/ c& Y" M" T3 f" a) d#define  PDCTL1_ADDR  0x01E27304; \) |- I( f- E8 t
//GPIO8 direction
  T' l* y9 U" f4 e* R- n4 }, C#define GPIO8_DIRECT  0x01E260B00 Y; M4 |$ n2 x
#define GPIO8_OUT     0x01E260B4
! T+ r0 Q/ ?) K) A) o$ W2 q2 Y#define GPIO8_IN     0x01E260C0
- k8 y! k( `+ y
3 C8 |4 E) c  Z//#define MCBSP1_RINT    99              
2 K+ P- R% X5 G& ?2 j' {//#define MCBSP1_XINT    100  $ g# R' a# C+ R8 i
static int MCBSP_MAJOR=239;
8 j3 m- T2 Q" i  U2 F, u/ Gstatic int MCBSP_MINOR=0;! w' a2 y0 K# z0 \- i
static int count =1;- `% `# V4 j  {

$ L7 j, C2 m4 w% I7 |6 {% d- w, E#define MCBSP_NAME  "MCBSP-device"* H" b$ [3 ^( a* X7 Z$ u% W5 a

' \7 m7 g* U3 E) Zstatic struct cdev *mcbsp_cdev;
! e  H& `1 I7 u0 r2 D( A  m, vstatic struct class *mcbsp_class;
* \; D% q8 q2 ?7 Tstatic dev_t mcbsp_dev;. z1 w8 J; l% ~5 c4 C; Z) z1 E5 F
unsigned int DRR_data;
. D0 n4 Y' U# \: q  i. ~3 L  Yunsigned int DXR_data;
( x7 }+ P" k# v' I: Z/ A% x/ j% Nstatic int mcbsp_open(struct inode *inode,struct file *file)7 V0 E3 N* v! x* h
{
: \- v( B1 V# j* ]0 S8 W1 ?   " ~/ X; e7 U, q- Q  ]  l' N' l
   //interrupt enable,initialized! |: H/ {* v/ x, s: z' W7 m% }
   unsigned int temp;) @! ?0 P+ X$ `7 S
   //SLEEP_EN(GPIO8[10])---0
5 k7 d: ~; ]2 ]- l   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' x9 h# v4 |6 D
   temp=temp&(~0x00000400);$ B1 ^/ |. q$ ~+ o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]9 q8 Q+ Q8 p1 ~; }" p. p
  //RESETn(GPIO8[8])----0----1  T* o6 W, y# D/ N5 O$ F) r$ g$ E, P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 Q& X: d. ]6 O# Z2 }7 ~   temp=temp&(~0x00000100);
$ }: G+ D! l' R" Z8 X1 g: j) w   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- R: F$ k) J. f( w5 H   udelay(100);8 d, w9 f7 D* r" B7 r
   temp=temp| 0x00000100;9 G7 I0 B1 N  L9 f: F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# Z/ S9 W) f( n6 B# L& `* {   udelay(100);. g8 f  v% p! \! D" d, _
   printk("open success!\n");
' {* d0 x, \  D3 o4 G   return 0;
4 m! W1 g& y8 N# m}
/ l, c. m; h6 I" W6 q& H' A  I- ]# w% T, Y. r
static int mcbsp_release(struct inode *inode,struct file *file)4 Z+ z3 i% Q% V. O
{
! M2 E( s1 ]% O  U1 e( D) t8 g   printk("release success!\n");  M+ ]" q- G3 Z/ X8 V
   return 0;( B4 N0 Z; Y- J2 L4 x' @; Q9 y4 B
}
! T0 L0 d8 F' R! ?( n6 |; G8 j
+ o+ F9 l  X8 d0 s4 D; m4 D* t6 m9 l  astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ K, B) e  }% }! m+ C% n
{: Q: l) v* o) ~  f& c
    copy_from_user(&DXR_data,buf,len);! i  n- `3 s% }/ ^
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 ]6 ~6 ~/ t! F. w7 ]2 t# _
    return 0;
4 B- F3 ~; m7 E) n 3 u: Q5 R/ q# \0 g3 n: {$ @
}' d4 m6 B, K7 P( D) ^( A
7 q; I! K/ F$ N  F3 L7 \
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- b( g6 K9 {1 v3 y: H{ - R+ o/ E+ X7 S0 `3 M
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; r- o  b  w2 l/ Y# f
   copy_to_user(buf,&DRR_data,len); & f% S' D9 W+ o# x3 \4 B6 t4 D
   return 0;+ B7 B/ G" j+ r
}# v$ [4 Z. d9 Y+ ~4 ]& y
+ W+ l+ W8 ~3 F$ w
6 |& u' |: S/ q: V' D( K: y4 @
static struct  file_operations mcbsp_fops=
1 n9 b6 G( z4 c- F% A{
- [5 V& N  x0 Z" o* Z8 N   .owner=THIS_MODULE,
7 d5 r1 j- a6 ]5 F& i   .open=mcbsp_open," m, F) p' L5 B4 w/ u5 k8 H! x: p
   .release=mcbsp_release,- P6 y/ g- S) _9 k3 k5 z' v
   .write=mcbsp_write,# V' F+ ^  S7 @6 `" Y
   .read=mcbsp_read,7 i' s8 X0 C5 l
};
1 N5 t& @5 W" y/ G6 b- bstatic int __init MCBSP_init(void)
2 Z8 h* K4 y8 e* u* f8 z: e: z{
% J1 n2 a( ^8 B: N( e) M   int ret;0 D- _+ m0 A& U6 `& R4 {% g" h2 i/ E' X
   unsigned  int   PINMUX1_REG_old;4 J8 h8 c# Y- k+ K0 n% L% I
   unsigned  int   PINMUX18_REG_old;
" I9 h8 V0 `  r* [' m   unsigned  int   PINMUX19_REG_old;* m5 Q$ n' n1 n+ F: Y
   unsigned  int   temp;  
2 w/ f4 V! W6 R) K1 t# C4 E1 `   if(MCBSP_MAJOR)
0 y3 q2 y$ D; M" P  e+ d2 x   {
. X5 i4 A% r* l0 V+ Q      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" f" |* e8 W) W3 C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* ^; Y$ c* r0 y* s
   }8 z- n( [9 p$ c' _! n/ z
   else/ [3 n2 M7 D+ G8 q: ^- Q0 r
   {# N. N9 Q4 e6 ~5 G
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
* l# y. s! P- J$ @      MCBSP_MAJOR=MAJOR(mcbsp_dev);
& N5 @  b- I' k9 |% z: P- {" Q   }% [! i! x- S( s
   
* B# W! D/ ~' V6 M   if(ret<0)8 I. D6 @' T# A7 G+ `$ B0 I3 t
   {
6 J) v5 g9 H) }' }, S  [' J' c5 p      printk(KERN_ERR "register chrdev fail!");
: F# A5 `/ {0 J5 `" Q* ?7 m5 Z% t! Q- W      return -1;4 g0 ^/ _0 W- x* _; W7 W% ~. z" h
   }& w. X$ R5 {( y$ d0 c' q; N
   
: h3 K9 C* A! e' O! G   mcbsp_cdev=cdev_alloc();9 Y4 [: h  H- Z- O! C
   2 ]9 @# z7 h2 N% i9 @6 V
   if(mcbsp_cdev!=NULL)
* q7 L/ g  [# G9 P$ J   {% a2 Y% b9 |; ?! a! q, L
      cdev_init(mcbsp_cdev,&mcbsp_fops);- g8 P5 Q& |7 h& S4 H; R/ R1 _7 e
      mcbsp_cdev->ops=&mcbsp_fops;
* n" j8 x6 \4 i  o- J7 a3 [" K# a      mcbsp_cdev->owner=THIS_MODULE;
% ~1 G' c8 q4 H2 O2 n        K* {  Y3 c" I7 ^8 H% `. {
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 R" k  ^/ I' C/ p* Y
          printk(KERN_ERR "register cdev fail!");
# p0 ~5 K' [. j7 X# ]      else
' n, ^! {+ P8 E0 B          printk(KERN_ERR "register success!\n");1 }& q! U" |8 {
   }) H/ s0 d. Y( x; X/ W# i" K7 V2 @
   else" d, y* r" L# j0 Q2 e2 @6 A! |
   {) h6 Z6 t2 g7 ?& V& ~
      printk(KERN_ERR "register cdev err!");/ n1 M" b! k( X& H& l0 t( q
      return -1;
  V' l8 ]$ m" f* J. P3 O! |0 n   }8 K! B. Z: y  T( r3 d0 J. l9 x
   2 n9 {# ^, S7 \7 G, x1 c7 }( k! V
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# U, H: H8 X5 v! @8 l. q* b   if(IS_ERR(mcbsp_class))8 T' p( s0 l& m1 T& b% G
   {4 X9 y. R" e0 z" w! ^
      printk(KERN_ERR "register class err!");
& |% X; ~6 k1 \9 M, c   return -1;$ |1 |  L; ?/ e, J- u
   }/ j  ?# {& h9 P4 x( k% P
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. G; F) j+ o$ l/ X# J
( c" O' a$ ]/ E9 |  J, m1 V" d3 t+ L9 y* E
   //PSC$ ^! z! ~5 F: ~5 |# C0 J$ u7 Q  [& [
   //add Enable MCBSP
/ R0 b; ]0 Q! C- R, z   //test
. \& @' }; W/ U! H   temp = 0x80000003;& A+ U# J7 U. k' ]+ g& l3 @6 M3 _
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ |% p5 T4 f0 N/ q( v4 Q# ^
   temp = 0x00000003;. _' Y- M2 t) e( t
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ _8 C( `, W  t8 q% I
8 W: {+ e  W. f0 i$ w. c9 @% q   temp = 0x001FF201;
, h, u* |# W" n) @   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 ?- j$ k: N7 o
   
. D8 m  g' I0 Q   //PINMUX  
5 l5 d$ G! L+ e. d5 |- \) ]9 f   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- }  y$ h3 d; e) J! v   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  & B+ x; b6 B+ E6 s7 [1 r4 ^7 h
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 x+ \( s+ Y6 I6 y# y) X   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 i+ b, |9 m" ]* X! H2 T3 v   ; C* p. H/ j9 ?: o( u
   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 S. a3 V& ^5 X1 B: n: p: V6 ^: v
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
1 }! I3 R9 g3 ^   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   . i0 g7 K8 d) I: m2 E
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 E1 P! G7 N2 n( c
. K( c  u. q, x   //RESETn,L138_SHK22 U5 }' u) n* \+ k% D2 R+ I1 W
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 _5 E+ T! Q* ?  L! k8 v$ q/ ]% Q   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
" R1 J" w9 c9 O5 i: A8 W   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 }4 O1 ~" l2 b: W: I$ }5 I
4 x3 p% n3 h, X# V# s2 J
/ ^& D4 o; s' ]* c
  //SPCR Register
3 V" N% q' c  P5 r3 \; k1 G  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 `$ X- y8 p: d7 H0 _
  temp = 0x03000000;//(DLB=0)9 u' I1 e/ f4 L9 @) w
// temp = 0x03008000;//(DLB=1)
  _& d" K; _* r9 j7 p7 m7 p  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% P: V- g7 ^( p; K: v7 N) j5 o  temp = readl(IO_ADDRESS(SPCR_ADDR));
. a8 _2 z0 Q! ~" F% ?% C. J' s  printk("temp=%x\n",temp);
' `, W+ B8 P! l0 o% l 7 v6 ^* u# H. |% s  n7 T
   //PCR Register
' ]4 L; p4 X- f, M  S4 Y( D" c8 `8 X& x   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  n: O) x5 W2 e. ]+ f1 K; Z
  // temp = 0x00000F0F;/ R4 x  B: }+ r( p! z
  temp = 0x00000B0F;- k3 G+ }0 n3 a. Z9 g
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
/ Z3 X, C# z5 D; R* r" ]  temp = readl(IO_ADDRESS(PCR_ADDR));
, m" L! a* M- ~* J  printk("temp=%x\n",temp);  1 r8 H2 c! c0 u, `, r6 T
   //SRGR Register7 S+ }: c, L( T
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 n6 A, J1 g, q! o //temp = 0x301F000B;
7 W1 W1 n2 B( U7 d5 i. D" m0 _7 ^   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 M  H5 S5 j2 X  q  temp = readl(IO_ADDRESS(SRGR_ADDR));
& v' t9 u$ o2 Z: P+ g  printk("temp=%x\n",temp);
6 b4 \3 U6 Q* g7 }; O   //RCR
1 s7 j. C3 C! k( T6 L# o   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 t" w- F" w) H  H5 f   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 K4 [2 R  l5 v- r7 _  y# Q6 |
   temp = 0x00440040;
! C9 D0 l+ j; R5 a9 w( R   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ! v5 Y5 p; u7 A% C. }) G/ k
   temp = readl(IO_ADDRESS(RCR_ADDR));
6 o* _% Z+ F0 O  h8 f) o9 `* O, ~   printk("temp=%x\n",temp);
6 |6 @3 p1 U# e" j; [   //XCR  _6 ]4 i1 |. x! T! i( S: m
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, @' b8 z3 i" ?9 p, h! z$ s
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 C/ k1 P" b, E7 E4 p& s
   temp = 0x00440040;
! n% v0 Z  l' x- N+ u   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   # z4 i* W" n7 P* l1 \
   temp = readl(IO_ADDRESS(XCR_ADDR));. k) \! ~, }  Q% d# n( ~
   printk("temp=%x\n",temp);% s- H  E1 e$ f% ?
  udelay(100);
. l0 O4 A8 I; D: u6 ~* N  //SPCR Register
0 Y4 R! S" K; m  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1& X3 D, \0 X. k0 T9 z& N
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. x8 S2 d4 z) u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled, K* Z% h+ m; L. W; L/ t# p
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% l+ w0 J0 a# I( h0 H" p# V* ^  printk("temp=%x\n",temp);
8 v8 K$ p% L$ p' C* G  udelay(100);
# F3 g# N+ X8 A, g
- F/ n8 q& q9 O2 {# |5 L) V! l  //set GPIO direction. ]* K: B6 r- M' x6 q
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' \9 I( v: W. j7 @2 B* v, m( m
   temp = temp | 0x00000100;//EPR----input' p6 W% g- u4 I+ D
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 K( Z; g' _7 g9 K2 [   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : D0 B' g$ h2 L+ j; \3 v- p
* r6 P8 m+ Q5 h$ t+ \: ]
   return 0;
0 f% c9 L( k" B2 @1 M6 [}- u9 y) M4 b! v1 Y' U/ I/ _/ n
static void __exit MCBSP_exit(void)
; G6 ^- H3 `! W( t{
+ Z. P; V/ K$ g   printk("mcbsp chrdev exit!\n");: Q, u+ W# ]3 I' t. `& Y' E
   cdev_del(mcbsp_cdev);1 I) X8 k: ?% E8 `8 S( {
   unregister_chrdev_region(mcbsp_dev,count);
8 c2 Z9 J& ?' f8 b) d   device_destroy(mcbsp_class,mcbsp_dev);% x0 {2 R, e$ O5 H1 t
   class_destroy(mcbsp_class);
. _7 S/ b2 J7 I- |4 e; P; k" G9 W}
8 ~. B, b* F0 ?# O! t8 J4 P' ^$ p  Lmodule_init(MCBSP_init);
5 q5 ^! H8 T- s* i) ^: jmodule_exit(MCBSP_exit);! p0 Q, k7 A2 L3 d2 I) g# H3 A; h

# q( D, z4 s+ J1 n5 PMODULE_LICENSE("GPL");
: T! i& L2 y. e/ G! b3 i: ~7 j
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 Q, A6 C" h$ c) ?! ^' j
我的应用层的测试程序如下
5 Q. l0 S$ a; I#include <stdio.h>
. q$ {( f, Y$ ?" D+ z3 |7 I#include <string.h>* Y3 o/ {5 O/ w* h1 n; N
#include <fcntl.h>
. t5 U! Q& V+ G) V' I: f5 _#include <unistd.h>
# o! c( h0 V2 u. ?5 \/ P#include <signal.h>
) D! @, f, z7 r#include <pthread.h>       //线程) y# [. X# F8 m# S* D0 M# x, d
#include <stdlib.h>2 r0 U! d8 G" c8 `/ r
#include <pcap.h>          //捕获网口数据
) P. h: u- ?" Y6 ]8 V6 s! E3 ?# F2 V  L' o#include <semaphore.h>     //信号
' l" S9 T* Y) w% H) N#include <sys/types.h>     //消息对列* O. T5 U7 v3 b$ [) ^- w
#include <sys/ipc.h>       //消息队列, ^  p- G0 f7 o# A5 j/ h) ^( o- j
#include <sys/msg.h>       //消息队列
- a3 Y- m- m, d+ Q% V#include <sys/select.h>8 L3 Y( Y) D1 {2 {
#include <sys/syscall.h>
  d: D1 o* Q+ }) x8 c, C#include <sys/stat.h>0 _" w% ~4 U1 f5 q5 V4 w, ]* t
#include <sys/mman.h>1 ?. G! b9 t, i$ V
#define msleep(x) usleep(1000*x)
- q$ E0 I4 h0 m$ N0 Z; y; n7 U. y2 O
int main(); K5 K# V- f  }( }
{ / Q, D! |7 E- l( s9 L/ w
    //MCBSP,ARM与AMBE2000交互设备
8 x7 V' a) `/ T( W5 x) ]& | int fd;
* [) S/ H/ v% M5 E unsigned short data_write = 0x5555;- w: C/ t7 N4 M- c; o. ?  `
unsigned short data_read = 0x00;4 X( |6 u+ B% ?7 n. O
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ d8 j* y! h+ }$ K //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& _0 `) u3 Z6 X8 ~" V7 k   
; J" Z+ K$ A: D7 _; }  [  if(fd < 0)+ B. ^1 I- i/ d( @* b0 u
  {0 p/ L, h) K- p! P2 K( j
     perror("open failed\n");
, i% v, o% U5 U, l) g2 B3 f     return -1;
  h( d! |7 J( g8 O3 r7 X& g, }  }
& ~# u" I/ t& B5 z5 K, a$ E) n  $ z' }1 K/ {/ g1 E
  while(1)+ E$ K2 d( l% l
  {, X0 Z0 V% s9 |/ c+ m0 ^
   % R0 O6 i# h3 N. Y
   //AMBE2000每次读写是24个字为一帧
- V  |# W( I" E4 m! L. Z$ c   //写数据时将数据在底层存储起来,等到中断的时候再发送" ~3 M/ ~& @  u. P
   //AMBE2000输入数据是以0x13EC开头的
0 j/ ~$ C$ j" \* J' s! {% a# H   write(fd,&data_write,sizeof(unsigned short));# {) {1 `, \" n  O* X$ T2 _
   ' W: u5 T- ?/ \( Q/ d  U
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; P3 l) c9 Q- ?" Z! _
   read(fd,&data_read,sizeof(unsigned short));
& ~, L0 F' ]# B+ x$ ?   
0 B: T6 j- g6 Z8 ?* ]! }! ^   if(data_read == 0x13Ec)& W  L& ^+ F" @5 u* N
   {* K$ L% D/ I: W$ Q
   1 f2 f4 k1 u" F, z3 z7 [. g, D
    printf("data_read = %x\n",data_read);
; f9 b) a1 y  @4 [( h# j   }& R) T6 ~3 M/ _" t+ }' v& |
   
( t3 l6 A. I6 v% J# @   msleep(10);& m0 o( x- V$ Q5 M, v: N5 ]' f6 {2 x, P, Z
  * E' H, K$ p: i4 \+ U( }+ U
  /*; B2 ^4 l2 w" D0 R: a0 @
   ioctl(fd,1);   
3 K$ |0 }2 ]8 V6 X- n# j# e" ] sleep(1);
! b2 H4 T3 |9 U( O1 Y! L2 A8 P4 d ioctl(fd,0);# }4 _- T! ~$ A% G0 Z! Z
sleep(1);
9 y, y6 C- _9 @  `8 Z: l7 \5 z: O */ 3 h9 \4 d: C& f9 [/ \! r4 q" K
  }   . C: N/ R4 O' b& H- s8 h3 Y
return 0;, g3 @& f$ x: O

0 z" _/ d  d! m" ^/ \$ k}! f6 k. y9 |- {: n3 Q4 `2 a
5 K, q( ]0 v5 K5 Z' y1 b
多谢各位指教,谢谢! 急- a6 @0 @; o# e5 F% j
* I7 g, O2 _' u0 [

8 h/ [7 ]; S. E( s3 K  Z3 D; Y5 w! ]* Z& p
4 D; s/ S5 b% n* @, l

# [7 ?6 T) g- [  Z' k* u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 08:59 , Processed in 0.042628 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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