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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - ?7 g: s; _$ T% c' h1 t
/*6 \9 F3 `( g- |. W: l
* Copyright (C) 2009 Texas Instruments Inc
9 s6 {% O1 n! I/ B' i *
! L) x4 \; i1 F0 D * This program is free software; you can redistribute it and/or modify- a3 [  s* W# D5 |2 N# d9 g2 K8 x0 B4 @
* it under the terms of the GNU General Public License as published by, x) F9 \; u8 L' o2 K
* the Free Software Foundation; either version 2 of the License, or
7 Y. P' O" I2 o: E  p$ V * (at your option)any later version., {- T; Y" p- X! T9 r
*
- H" Y7 ~4 I: v$ V/ m2 C * This program is distributed in the hope that it will be useful,
: X0 X- o- I  W1 W( l * but WITHOUT ANY WARRANTY; without even the implied warranty of) m0 V1 s% o# G0 [$ _" D' X5 }* p0 e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ z! s9 n& T/ W
* GNU General Public License for more details.: D+ J" ~: j0 r' T
*
$ n7 y3 N9 L" R7 C% O0 W * You should have received a copy of the GNU General Public License
. ~- z; K8 a0 P* r * along with this program; if not, write to the Free Software
4 j6 t# U1 {8 r) P( J! ], {) n0 I; o * Foundati
3 t! e* E; U3 s+ C# E* k2 }1 L' ]*/2 M( m5 [$ v' Y2 C
#include <linux/module.h>
; d6 B. C1 O/ }2 u, J* `9 o#include <linux/init.h>- K+ S* `  U7 Q# v! t4 a' N
#include <linux/errno.h>4 ^4 z2 p+ R5 ~- O
#include <linux/types.h>
8 i* Y, y6 X1 n9 X#include <linux/interrupt.h># _3 z+ ?$ Y- P% ]% x
#include <linux/io.h>
/ {( o* W  j* m2 }#include <linux/sysctl.h>
- Y. I, J6 V/ c#include <linux/mm.h>9 W  n) }: c" l2 B9 d
#include <linux/delay.h>, D; s/ w1 \( x
#include<linux/kernel.h>" W. f4 s  R0 P# P& s+ p/ a2 ^8 _
#include<linux/fs.h>
4 X" I4 U. B' P: V5 ^/ E#include<linux/ioctl.h>
3 |7 O) g! p0 H7 x6 o#include<linux/cdev.h>
7 z$ y9 R, k# q: Z7 _#include<linux/kdev_t.h>
" f; J6 @9 R- i' h- t- ]#include<linux/gpio.h>2 }3 n( \; W6 q( L9 Q
#include <mach/hardware.h>  z# x- @: `/ B+ ^$ a# e) i
#include <mach/irqs.h>
& C5 r4 }; G9 R8 Y! O
. h% C1 W% a, g; e# T#include <asm/mach-types.h>
- \1 K/ G3 e% F; G8 m4 I3 Q#include <asm/mach/arch.h>  |# W4 h, u6 Z: N7 T" x
#include <mach/da8xx.h>7 P/ x( f; G5 K, f( f9 Q. ~/ V* H
#define  SYSCFG_BASE   0x01c14000* g' H1 J/ ?+ O7 a
#define  PINMUX1_OFFSET   0x124
, v- ~. l: _! c: {* C3 ~#define  PINMUX18_OFFSET  0x168
  \* d% W. s: @& t8 x, {#define  PINMUX19_OFFSET  0x16c
! u. g$ ]6 }) q" |5 `#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
. ~7 c, j% l/ V6 l9 q! ?9 S, L#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- X. s% |7 R+ X0 x5 G# h
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 Q( d: V4 g1 V3 L7 _3 v#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
9 R! A/ j  ^# K" R$ r3 Z#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR/ n" Z5 A1 Y7 S; R' z: x* K
                           
0 m7 {1 T! p/ s: M#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 U( L6 B. e# p7 W% H$ `, @3 u1 h#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
* V, i9 G# u  R" }//PSC7 i; q$ }  c' ~, }+ {
#define  PTCMD_ADDR   0x01E27120  
# t2 z9 e0 G/ \- x. o2 b- `; u/ U% I#define  MDCTL15_ADDR 0x01E27A3C0 I: @! ~9 Q" B) F
#define  PDCTL1_ADDR  0x01E27304& @4 \7 ~7 [" _. c" s5 o4 c
//GPIO8 direction" G. ^. y1 K7 ]$ x- H
#define GPIO8_DIRECT  0x01E260B0
: g  s7 [* Z; e  b- P0 K#define GPIO8_OUT     0x01E260B4
9 j7 P8 z# ]" u#define GPIO8_IN     0x01E260C0
. V* K2 @1 D+ n+ d: v4 L' F2 j7 O% t. {2 c+ N
//#define MCBSP1_RINT    99              3 L# {4 {! M" h* A8 N/ L6 L
//#define MCBSP1_XINT    100  ! I$ X. ~. L/ B' X: s; D
static int MCBSP_MAJOR=239;5 J: ]5 c; z  S0 U3 C" S
static int MCBSP_MINOR=0;! V9 Z, s. I. ]1 ?1 i3 Y9 p: B
static int count =1;* N1 L8 B# K. ]

  R" u. Q$ i! k; Y, s' M; R3 e! T#define MCBSP_NAME  "MCBSP-device"
0 N! r! m# q+ @  S' _3 n1 c7 X& C4 F& U9 G$ @+ r" y
static struct cdev *mcbsp_cdev;
6 U1 \; n, P( Estatic struct class *mcbsp_class;
$ r# D* n  L+ A3 |1 L' Kstatic dev_t mcbsp_dev;8 I# s7 Z+ b& _4 l% ]3 t7 v
unsigned int DRR_data;
( A) R8 Z8 r0 z2 K5 ?' c4 Iunsigned int DXR_data;
, ~' r; b1 y, R9 M9 E3 ~* B1 p0 ]static int mcbsp_open(struct inode *inode,struct file *file)
" z) ^9 G5 H5 T  U0 p5 ?: l9 x{
2 F4 u: k% ?: c% d, l3 O9 O   
- u; s( Q9 g- L. Y6 c; c   //interrupt enable,initialized% |5 ^% ^5 t" v$ B* N/ e  }
   unsigned int temp;$ W. I  k, B( E% _! z2 R  {
   //SLEEP_EN(GPIO8[10])---0- A/ e4 m7 J( o7 j  L/ i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  X6 d/ K! l! q   temp=temp&(~0x00000400);
7 Q/ h6 t' i$ m9 |5 H1 h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! T; j5 Q4 x9 u8 e5 Q* L, ]  t. o
  //RESETn(GPIO8[8])----0----1
: t4 K: L( t! y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 O* l$ Y7 ]' ~  D0 Z, M   temp=temp&(~0x00000100);  d0 y0 J: Z3 H, t, A+ ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 v  v; b3 G. F  A2 x   udelay(100);/ |- J% S- v4 n! i3 |. f' L% j  ?3 B
   temp=temp| 0x00000100;/ X' y- p1 _8 p+ B4 N& P
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* R+ K# E9 |& O" l
   udelay(100);
' B3 j; j0 Y+ y! u8 l* `; P   printk("open success!\n");
" }. x+ F8 p$ ^+ l  [: C, [1 D   return 0;
8 U% {; U/ U7 X2 c7 H& y}
2 Q* Z; R, \6 B7 I" ~, S; b8 O& R! t: m  }
static int mcbsp_release(struct inode *inode,struct file *file)- J* y+ t: R: B1 M
{
0 g( T4 e, v1 |   printk("release success!\n");
3 J. U% ~: ?9 ?# N5 s+ M   return 0;- R8 F8 `* `; }
}- u% U6 F4 C) \2 K- w
7 E9 r& P  @2 o/ @
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 P  m2 f( k# t; J4 T{1 x$ j9 k5 [4 s( G/ T' {" A! y  q
    copy_from_user(&DXR_data,buf,len);' u4 J7 z4 u8 F# D4 u8 o
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
, Z! Q( V8 s3 W    return 0;
+ V1 D3 b6 ]+ }1 U% Y" c* m# p! t/ w
* L) C! v1 l( `7 r  g+ Z}2 f& S  s$ j& z# m6 a2 m
/ a7 f8 N- {+ g! R. s
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
. t  s5 L/ ]9 y) g{ 6 M9 w9 L, Y. u& B
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));. o' N; y# ^4 Y: \
   copy_to_user(buf,&DRR_data,len);
# q% o0 d6 h+ c% k; N- T! q   return 0;0 H0 ~- |( N3 a; y
}
; k' ~/ ]/ U- ~5 J8 \5 _2 Z! _$ q( U9 e- N% j2 P
) ~' r, h0 F4 `  Q( K! g. ]9 t
static struct  file_operations mcbsp_fops=+ \3 w/ P, ^+ g, p0 F9 v9 r- e7 F
{5 M5 K+ x2 X" F9 k& y  P
   .owner=THIS_MODULE,
( I0 b; C" V, S+ f& Q1 Y   .open=mcbsp_open,
$ P7 e/ f& q+ Y5 I5 w   .release=mcbsp_release,5 p# i- s7 R; ?- H8 l6 R6 r% C+ [
   .write=mcbsp_write,
, Z- n; U' g: k3 i2 ~   .read=mcbsp_read,
7 x) F5 |3 u; @7 D* h};3 ?2 d! c) ]; i1 @6 [; K  l
static int __init MCBSP_init(void)
* n2 a7 o- j+ V1 d{
) G' _$ s- T, i   int ret;* x0 t  q: q+ W
   unsigned  int   PINMUX1_REG_old;
- q: `- [. A, Z( ]& p   unsigned  int   PINMUX18_REG_old;
* s6 J( b1 ~2 @% E# b   unsigned  int   PINMUX19_REG_old;
7 U) F4 N$ E, v( F   unsigned  int   temp;  9 j) `* X* N: G, i7 E" a/ W# t) m
   if(MCBSP_MAJOR); t. _2 o1 ?- V& `9 V$ D$ R+ k" ?
   {
& {2 ^  d  W5 Q. h& p, e$ l+ Y$ y      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 a0 ?: |- L, z* z" @- j
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: p  f. g& z1 i8 M. |4 c
   }7 A  M# v: \* a% o# E* R& k- c
   else1 i3 e) c8 w6 _  T: M/ L
   {
( K- X! }! m6 C      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% n& i; [4 {# y. |7 [- M: N      MCBSP_MAJOR=MAJOR(mcbsp_dev);- q0 Z" s  O  M  e( Q
   }
0 C  ~" b; r1 P$ y: W# f   % g4 s7 I( B4 x; G
   if(ret<0)  _# T! F7 K  I6 K2 [: T
   {) Q9 w8 d6 }# Y! C  A+ [* i  o: T
      printk(KERN_ERR "register chrdev fail!");
" o% r1 }6 a8 ?# u& ~& ^      return -1;
: S' k/ ^" ?* I+ b) e) ?$ i   }
$ ~; U4 V6 E  \   ; G5 b/ ^$ s. ^
   mcbsp_cdev=cdev_alloc();
$ N1 }8 u" K3 r. ~& M6 {   
1 d# b% E0 N) k2 d  D6 e   if(mcbsp_cdev!=NULL)
5 ]5 G3 ?9 V# {6 w   {
+ B' {5 F1 u0 n% `4 j; K' K      cdev_init(mcbsp_cdev,&mcbsp_fops);+ ]* z/ |) W1 A5 o
      mcbsp_cdev->ops=&mcbsp_fops;3 T& R& W; A2 n. i& N% Y# e% D
      mcbsp_cdev->owner=THIS_MODULE;8 P/ c: Z5 y5 l) v! S" O. i
      
; C6 W6 C1 J# _5 E      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 h" y! N3 D/ B6 f) g, \' ]9 _          printk(KERN_ERR "register cdev fail!");
6 B$ ]1 W/ i* i      else- ?/ K: h' y( J7 P6 F
          printk(KERN_ERR "register success!\n");) m# ~$ G6 Q3 q' h
   }
% y* ?+ [, p5 o7 m! E% @   else3 D0 H7 {! L0 {
   {3 S! M- H. S# _6 U. G
      printk(KERN_ERR "register cdev err!");2 }: W( P8 T% u
      return -1;
: l( U! m1 y( _; E+ k* S" l   }
5 A# ~. N0 z8 H1 W8 U* n   2 D5 c) i' e3 l3 y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" Y, P# [% a, P: C, b
   if(IS_ERR(mcbsp_class))
& t( O& W. n9 t/ X5 e   {
% |7 ^* `! \% @, N3 I# s      printk(KERN_ERR "register class err!");
) n2 s  k7 R7 w, Y% W1 Q   return -1;3 A# v# E" P5 q% q$ \! g2 ?* i, o2 k
   }
1 X8 M& @* |" ]: c7 f7 c' S   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ v, Y  I- q, g8 K. I/ ~' w& {2 x2 t
   //PSC
, U4 S! w; p/ |$ z   //add Enable MCBSP# [* l' A% K! d/ B0 p: H5 q
   //test4 _) B1 c1 Q) o( w7 h  C
   temp = 0x80000003;; [: x2 h: V- j7 I' H5 a
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ {- v7 q1 c0 P0 n   temp = 0x00000003;
4 b2 b/ j. N9 i, T6 _: S   writel(temp, IO_ADDRESS(PTCMD_ADDR));8 l! s. M' ]( Q
6 O3 f- w1 p% m% @& W$ T" r4 k# c; d
   temp = 0x001FF201;* J  N, \  G4 x- V
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
2 C. }6 Q1 ~+ {$ E2 D0 j) i) P   8 U% H( V5 m; X& F, y1 m" d
   //PINMUX  ; ]5 f) H7 t% `/ C$ i+ V
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 M' T5 j" M; z- x$ p0 X$ t   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
9 y- }5 N, W8 b6 D( o* `" ^9 @   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   6 s+ ~3 n5 K& {. j
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 V' ?: V3 R3 ^  r3 k   
  ^+ m# F0 O) d* J& d8 g8 ?   //SLEEP_EN,EPR,L138_SHK1,L138_RC$ D5 _( J8 ^7 q1 k# D" b
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  " E2 B6 x3 \+ j/ D" I
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   1 ]% t; w2 K; Z. z
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! D; i4 c5 z  C4 R5 H, F # _  f7 z( Y& @
   //RESETn,L138_SHK2  Z1 Z- E6 H6 m& S4 |2 o, M
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
' i8 B. E% i( Q$ s* U' D% u( B   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ! ?2 p3 {' M1 q# y) p& h
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' d: e. i9 }4 j
4 u! G3 q7 s$ P% S) F- s9 n% ^

: A- o  d$ M: \; s) a2 @$ P  V  //SPCR Register
" i2 D3 i: b8 T0 a8 k1 y& n  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 i0 V6 t) C$ Y8 j  temp = 0x03000000;//(DLB=0)
) Y( z& M. f  A1 _6 l; V- ]4 H // temp = 0x03008000;//(DLB=1)3 M" A/ [' L- n2 Z6 I4 a+ s
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 q5 T& F/ X7 @9 R$ u; E& i
  temp = readl(IO_ADDRESS(SPCR_ADDR));
' s1 x! P4 z) X3 I; T  printk("temp=%x\n",temp);
2 v1 v! W3 ~/ A 7 |( b/ I/ i- _# \: n
   //PCR Register; K+ \; x% u: n1 ~- S1 r' M) [4 u2 y
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ v$ V: Y& y# j( _  // temp = 0x00000F0F;
: A9 D' z- w& u# r  temp = 0x00000B0F;
6 g2 O/ {/ Z$ `/ [' y1 c  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
! w3 ^1 ]' M5 q/ \  temp = readl(IO_ADDRESS(PCR_ADDR));
1 u1 Y! x+ ~0 x% t  printk("temp=%x\n",temp);  
$ \* E; k1 K' u: B* N" i' _& S   //SRGR Register
* R& ^) z# I& i% N/ f. y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 m9 ]' ~; u5 b( G- V: d
//temp = 0x301F000B;4 d, W+ m( S& k3 c
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized . T# x. y, e) b8 f+ H6 k
  temp = readl(IO_ADDRESS(SRGR_ADDR));# F, _0 Q$ s3 |8 D% P0 Z
  printk("temp=%x\n",temp);, J* v+ j  z5 e' W' W" W7 ?
   //RCR- O% m) x& ^; ^5 V4 x
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
! G: U& @+ h0 a# v1 O6 p   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- K: L2 D. E* ?2 s' N   temp = 0x00440040;; G( X& S* Y" @; t
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* n9 M6 N+ c+ O- T3 x# l. i   temp = readl(IO_ADDRESS(RCR_ADDR));
; o+ e5 j0 b- A. e& [! N0 E   printk("temp=%x\n",temp);
, z, z- e% K# v& C+ ]  [& A   //XCR/ z+ m5 a& N* p# u6 O" A9 Q
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% `8 n5 S/ b# ~) {5 _/ E
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) v3 F6 s6 q3 y$ Z( H. @  Y% Q   temp = 0x00440040;' U6 f$ V( w% C' X
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
+ y- V; h$ f: W% K   temp = readl(IO_ADDRESS(XCR_ADDR));
& L' c2 v' D% v9 L   printk("temp=%x\n",temp);
) J& v2 h6 p8 l* K5 p  udelay(100);
4 C1 F6 ?1 Y4 ^- Z3 W  //SPCR Register' B& W9 n; p/ _; [6 j! H( r
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1& F0 W: |6 E$ ?& t' }
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1# B: Y' @2 K& m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled% ~* j$ k9 p, k4 g! n4 _
  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 U) R) _" x' U5 E  printk("temp=%x\n",temp);
1 _$ e+ K6 v$ U: u' R% X, {  udelay(100);
* C$ x0 F) _( e% H6 y8 x* W+ c
+ G" \) z$ X) a8 z5 G; i7 _* Q: F  //set GPIO direction/ x; @7 f) p3 N' T
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 i3 G  ^' @! S) |/ ^! ^! o3 E+ H   temp = temp | 0x00000100;//EPR----input/ C4 t5 y5 D: c' ?( U
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
0 I9 z; v, U" G   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) X( I8 m8 `! @4 S; y 2 s: o8 |. W% J4 Q# T
   return 0;" c" K# b% U! E3 G: J7 F. E
}
7 f# l& U4 t, J+ z$ t2 _: A2 Ystatic void __exit MCBSP_exit(void)+ ^$ y& K* a$ m& Z
{
( s3 W* I; [/ s! s# j8 {  a& V4 N   printk("mcbsp chrdev exit!\n");
: F' s* N% {3 h) [6 x3 _, k8 o   cdev_del(mcbsp_cdev);
; m% `$ ]& Y1 u4 A3 f2 G   unregister_chrdev_region(mcbsp_dev,count);
. ~! w% H) t# I5 u   device_destroy(mcbsp_class,mcbsp_dev);# j' \- Y6 h$ }6 }& K' c
   class_destroy(mcbsp_class);4 [$ b) w$ O, h% n  f8 [5 V
}( T7 L3 t2 u' k2 y
module_init(MCBSP_init);2 w; c$ h2 h$ q& _. _+ p0 A' c2 a* |
module_exit(MCBSP_exit);& h; `( s2 s4 A/ G

  \1 V% l6 c/ {MODULE_LICENSE("GPL");5 u$ t" y4 Z  ~3 M% y

8 M7 C2 W: M  H我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' Q( ^' Q3 d1 N3 x' m1 L' _我的应用层的测试程序如下( g4 Y2 C  ?. E; M7 S; f6 N) f6 a
#include <stdio.h>
8 l5 M5 U: ]. ^: Y, M0 v3 O#include <string.h>
  j2 w6 v1 Y/ Z4 N#include <fcntl.h>
! E- R: F" _6 `2 m+ L#include <unistd.h>
2 O+ M, A, ~9 h; P5 @#include <signal.h>3 K+ \+ Z' D2 \: I0 N
#include <pthread.h>       //线程
3 ^4 N4 [* s3 `: n0 Z#include <stdlib.h>/ D- ]- t7 ]7 H$ H# t/ q* {) y: ?
#include <pcap.h>          //捕获网口数据/ q1 e: p* j* G# o  o* ]. k
#include <semaphore.h>     //信号3 B4 t) `9 c9 I$ E
#include <sys/types.h>     //消息对列
6 T4 {4 k2 v' E#include <sys/ipc.h>       //消息队列& Q* W9 n  f2 G
#include <sys/msg.h>       //消息队列0 m8 i" H' a! e3 e/ V# z
#include <sys/select.h>( f$ t+ h) j7 x, f
#include <sys/syscall.h>& s$ w. \+ k7 M+ A3 a+ b9 q
#include <sys/stat.h>$ s- {' `3 Q0 t$ P" z$ g
#include <sys/mman.h>! P9 ^! @- W1 c
#define msleep(x) usleep(1000*x)- w) }% p' @+ R2 A. k- ~$ m& n
6 i8 b+ u6 i% @: F
int main()
4 ]  {3 Q, e$ R, s+ ]2 x% G{ - X& o+ v( Y7 p& p
    //MCBSP,ARM与AMBE2000交互设备: W& [& C2 }% S( Q( E. y. N# Q
int fd;
+ }9 r# ]& i  ^+ P! b unsigned short data_write = 0x5555;7 J, Y, ^' P6 }" M7 `4 X
unsigned short data_read = 0x00;
& _# F, i2 m' }7 K; M5 }  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
; m  O# I6 F! Y2 y7 O) z //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
. E8 B; [* R, a) _5 Z! i# N   
# r7 k; M6 O$ t  if(fd < 0)
: ]) N$ ]" L8 s# ~  {" S' ~7 {+ R& L3 Y* |, k; R
     perror("open failed\n");
8 l9 ]: [3 p" `: t" e$ O     return -1;+ }$ {( J* f& I' R8 [
  }
) Z( E& m+ T9 |. X  Z6 \; u& P  
3 d+ n) ?9 q- V! I  while(1)
1 |& N# w, j7 W; N  O9 ^) s6 ?  {
( P) g, S' s2 c6 P! c! p3 I   " d- C9 F4 k$ W/ I0 p
   //AMBE2000每次读写是24个字为一帧
# N: p# j! A& b" Z1 d8 h5 Q   //写数据时将数据在底层存储起来,等到中断的时候再发送
: o" Z8 p0 Z3 o   //AMBE2000输入数据是以0x13EC开头的
0 I" |* t" X4 L- y5 |( q; y/ Q  I   write(fd,&data_write,sizeof(unsigned short));9 v2 f! b7 t1 s" r# L" ]& M) u: ]" L
   
4 Q: |% K/ _: N& M   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
+ ]! G7 _% ~9 U+ r; H   read(fd,&data_read,sizeof(unsigned short));5 S1 G9 i$ t# f: H" H' N" o" I' l
   + @$ p) m: e/ w6 x8 ^5 c2 R
   if(data_read == 0x13Ec)# Y' a9 v- T- Y0 D# b" }* q
   {7 l$ W4 K0 f7 o) |8 S0 R$ X
   
/ m% l% Q! ?8 r* r( N. h7 q    printf("data_read = %x\n",data_read);
/ v% ~' z9 ^  q+ ?* x3 ^   }
1 V2 c) S, _. x" ^6 v$ ]   ( n/ U4 x, C% [, g% n* N" K
   msleep(10);" S6 q( \- ~. F1 ?, {- |2 M( L
  
/ e0 s: K3 q9 _5 y+ ^% d# k7 _  /*0 d. ~2 j  i4 y7 y* b0 \  F
   ioctl(fd,1);   
( r. K- W; U, h) w# W: _ sleep(1);# \) f; q6 m) n7 l$ `, k( k2 n
ioctl(fd,0);' w1 j9 F+ M' y/ z6 P, m& \
sleep(1);8 a5 v3 N5 S5 r1 ~, R' q1 ]* K
*/ 0 g% V/ ^( Y( |4 ~6 I, {+ {
  }   6 H1 b$ k' N) B0 `& G0 r
return 0;' w: t5 u0 u; V/ q$ T
/ l" e3 D9 p/ W/ \& `- ]( s2 x3 T
}  A* c  _8 K6 Y; D9 \
( K9 M2 |6 j) U5 w$ D9 i8 a9 z
多谢各位指教,谢谢! 急8 P1 f& ^- Y3 ?

+ E4 i6 {, t8 t, W$ Q' S1 ?+ u' ?1 G
' {% E: x$ _- U8 y: L$ q& L0 M
8 U* C- G2 h3 }$ O
, B6 i! v! w) v  b- J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 06:38 , Processed in 0.043842 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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