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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- y  }+ F5 b5 v3 L$ w7 r- s/*- H( k) f0 z/ @
* Copyright (C) 2009 Texas Instruments Inc
4 ]% H4 g* H  ^ *
1 |% O; V$ m% `! j2 O2 [* v/ v * This program is free software; you can redistribute it and/or modify6 g0 d: {# Z: j" n1 i- K- a% s! x9 F
* it under the terms of the GNU General Public License as published by: j6 U  W: Z. f+ Y" z2 a1 L4 Y
* the Free Software Foundation; either version 2 of the License, or
% o* c- c8 \# m% ^ * (at your option)any later version.$ ~/ N% E/ ]8 e) i
*
/ m/ f& h( F# V6 {; l5 Z * This program is distributed in the hope that it will be useful,
9 S% N2 B# o& ^- A * but WITHOUT ANY WARRANTY; without even the implied warranty of5 R. `7 A; @/ E+ k1 ~6 T2 g
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' D" a# O7 r6 \. D) O9 [ * GNU General Public License for more details.9 A7 ^/ h1 `7 \' S9 f8 x% g
*
/ @3 D7 E0 T. q! ^9 O+ O * You should have received a copy of the GNU General Public License8 X3 `( Q; r& s- _& J
* along with this program; if not, write to the Free Software
) c" L2 K# i8 y2 f * Foundati  u: `0 Y9 o; e) F
*/
& s4 }" g% A' h- T3 Y! B; X: Y3 K#include <linux/module.h>7 y( N* z8 {; C6 N; l" e& r7 f
#include <linux/init.h>
5 X' ?4 w( U# o. L& R#include <linux/errno.h># M( z0 i* w% X, w" j. V
#include <linux/types.h># T& V: ]$ _% V- e
#include <linux/interrupt.h>
  i4 X9 Z: D7 C7 M#include <linux/io.h>
* K- ^% X3 r. e5 l! V9 s#include <linux/sysctl.h>
+ N/ H$ h- `6 r8 {+ a- D9 G" Z#include <linux/mm.h>
+ Q# I% X$ f" G- z7 X#include <linux/delay.h>
, e- B! D& C4 A3 |  s4 [#include<linux/kernel.h>
, z  x  w  P' j#include<linux/fs.h>
' p+ e" Y) f; l; q6 }/ U#include<linux/ioctl.h>
  B, f4 J( U: v9 j6 f6 N5 K9 [/ a#include<linux/cdev.h>! _6 y0 E. [4 D* }3 t8 C2 r8 j
#include<linux/kdev_t.h>5 H6 o. W0 Y: Q& ^& |
#include<linux/gpio.h>" p" J* z4 j( o: I3 i
#include <mach/hardware.h>* Y- g0 r' q. |4 o1 h8 i, I
#include <mach/irqs.h>+ ?* y8 m" V+ I2 R9 F0 S- ^% a: i6 F
( a' z  S0 ]* ^8 }7 K
#include <asm/mach-types.h>) J/ E! q. M4 C" p  ^* [3 A
#include <asm/mach/arch.h>
8 z, l# [8 d2 v#include <mach/da8xx.h>
8 e/ ~6 F- C3 Z- X3 J#define  SYSCFG_BASE   0x01c14000
  ]* R6 D2 l& }& F#define  PINMUX1_OFFSET   0x124 0 a7 C0 l+ {) g9 I
#define  PINMUX18_OFFSET  0x168
" p3 q4 y- |3 {8 ?' L#define  PINMUX19_OFFSET  0x16c
; F. W- w$ i! ?9 i. S#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR2 L; x& q" v. t) n  [7 s- Z
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
2 L7 L$ G) F9 ~2 S#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR2 X2 y' P! G" i4 A7 {: @
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR7 ]& Z' S" J! ?2 j' R( w" [8 h
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ s& C( [1 d3 D) e5 u2 G                           
, d' n6 ?" H! c' ?7 A7 Q* i! ?- u#define DXR_ADDR      0x01D11004  //MCBSP1_DXR& j% ?0 i: Y" [1 Q& e
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
7 R4 h0 o9 [9 t4 J# M+ o//PSC9 A; Q# a( q* Z( u! o
#define  PTCMD_ADDR   0x01E27120  
" D( v; n" U! V1 Z1 l#define  MDCTL15_ADDR 0x01E27A3C, O9 f7 G2 _, o6 w. P
#define  PDCTL1_ADDR  0x01E27304
+ M! k, [, C( F+ i2 s8 P& x//GPIO8 direction4 E$ x* L) v* P$ x
#define GPIO8_DIRECT  0x01E260B0
+ q# x7 ?: g) j) T0 U#define GPIO8_OUT     0x01E260B4
. C7 M4 ~6 u+ J, S#define GPIO8_IN     0x01E260C0
5 L; a, e/ |; l6 @
- f/ D" A, O4 u+ V5 J' {& J; l//#define MCBSP1_RINT    99              & b8 k/ O  t6 P6 ]8 Q9 q: V: {0 B
//#define MCBSP1_XINT    100  
  r& Z( _( h+ `+ P4 e$ hstatic int MCBSP_MAJOR=239;
" Y, K" U$ V1 l+ D& d+ {; Gstatic int MCBSP_MINOR=0;
; A; I: t. u6 j3 |) Mstatic int count =1;
# x8 z9 |( v' p! A" [7 N' o  F$ m* B  V
#define MCBSP_NAME  "MCBSP-device"6 M! a) S' c- N8 K7 C% }
4 M( ~8 c! i4 y  X
static struct cdev *mcbsp_cdev;
; V) I3 L* x- lstatic struct class *mcbsp_class;
5 }$ N. K9 f5 K9 Qstatic dev_t mcbsp_dev;5 P* Z" Z. q( H9 J; S+ V
unsigned int DRR_data;
9 P% Z* G. o7 N! H+ Q2 U# U* vunsigned int DXR_data;
  T( r* W2 ^( P; lstatic int mcbsp_open(struct inode *inode,struct file *file)3 ]3 c4 t8 |  n# o
{$ ~- w. g  j: A9 ~
   8 y4 Z  e% ^5 Y9 _
   //interrupt enable,initialized3 w6 S! N) z) f5 W
   unsigned int temp;
: [4 \- y) I/ H% X+ H   //SLEEP_EN(GPIO8[10])---0
: p. z& K* X& u" d; G" H   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 ?( m+ q. L' {1 }
   temp=temp&(~0x00000400);
3 u, i- J# `: e0 b2 q3 ~- \$ v8 ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 K; i" @. F" M  //RESETn(GPIO8[8])----0----1" t7 q$ x# ~2 H5 F
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; Q: r' ]7 i! T1 v3 x   temp=temp&(~0x00000100);' k& p6 G+ ~& _
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
' T  e  V1 \  l3 C, o" n   udelay(100);  Z2 z! @& T$ P- Z( o4 h
   temp=temp| 0x00000100;7 F$ S4 P3 k/ p$ d4 X
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1# K$ w) |% P/ Q$ L8 ]7 L7 z
   udelay(100);) b$ W& L) h' T: P
   printk("open success!\n");
) v7 D; }% z/ _" q( L$ J! `, w   return 0;- |; O( w" t  G
}, i% A. p. G, a0 e2 [; m8 G. ~9 w" u
3 s7 ?7 P. e, J% D) u/ A
static int mcbsp_release(struct inode *inode,struct file *file)+ ?" c% P  ^) c4 h
{: @/ [. S( E9 ~4 t. S  t- e; ^5 N
   printk("release success!\n");% ]  n" O& U5 U' {
   return 0;3 ^  Y5 _5 I. _- H. O3 a# z% v3 o
}
) ~& ~+ \: X' f0 M; x/ W% v' ~* \8 E2 k/ O6 y
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& h# Z! e1 M- }- ^4 S% u2 Z: \
{
1 ~5 j/ K4 ^4 n% ]' |    copy_from_user(&DXR_data,buf,len);# Z7 _' S0 I; F  B9 c( I+ s! p
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # K/ L7 F9 ~1 z" [) F* u' c
    return 0;4 v# Q2 _* X5 c: q
$ P2 y" A4 [6 N! Q4 A! D/ O
}
1 F2 ?! J9 s) y4 [) z9 w0 ~
8 @4 g) c5 ~! K- a! k2 K# h  j7 d' ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" a" p, h. ^1 i/ E. ?' \3 D
{
; _) g$ t7 v# z; S7 }   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, S+ {9 H; g" q* l4 w3 j   copy_to_user(buf,&DRR_data,len); 2 t4 q( O1 _% `: a0 B  L
   return 0;
) b  V$ J+ b1 l}
: X3 I* Q: V+ V, y# f: f; @- k3 n: d( y

) ]. u8 Y# N/ Z; W" {* mstatic struct  file_operations mcbsp_fops=
/ Z# {* W$ W4 v( P{
) m6 E- K; C$ a1 c! F% E0 ?   .owner=THIS_MODULE,
: Y/ K  S  J& M   .open=mcbsp_open,7 O2 K6 W- N; b2 s$ @' x- n
   .release=mcbsp_release,
4 J* p3 k1 M+ t) z* N0 w7 g5 a   .write=mcbsp_write,
- J8 i& V( l- M   .read=mcbsp_read,/ w. l  `5 T+ q
};
$ `# h1 n4 }4 ]static int __init MCBSP_init(void)
7 a6 I1 q7 F8 Z; g$ M% z! g8 p{# Q9 |3 W$ Z4 ]7 y! a
   int ret;; z: ?1 G; O& n. V7 Z+ `5 ?$ y" j! N
   unsigned  int   PINMUX1_REG_old;) S' M5 ?' k3 H2 C5 Z
   unsigned  int   PINMUX18_REG_old;
) \" S- b# }  e, t9 Z   unsigned  int   PINMUX19_REG_old;2 k& [- d7 O* W" N5 B
   unsigned  int   temp;  3 S* z/ T+ f2 U% D, f
   if(MCBSP_MAJOR). D) \& v8 F  y
   {
/ u. \* A7 N1 v! h6 G3 F      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" o, w/ s, J  N6 E: p
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);9 x+ R6 @4 _" c. e& @+ `: ^! G
   }
$ q4 a; ]: N9 j4 D# L. s   else
% C" U1 N1 F8 g   {5 o3 q) j# m( ^2 j, }, ^# ?, m
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
' f9 E- Z; k- g4 O, `& i$ F      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; ?0 A. v* y# X) X3 h& |& c   }
/ D) r; z5 K& g- b' ^. @   ' S5 m2 B- n$ |& r( ^7 M; A, ~' p: M
   if(ret<0)
6 b1 h$ s' [& B9 K" k7 w   {* j+ j2 y0 w: `7 D* t0 j
      printk(KERN_ERR "register chrdev fail!");1 g$ o8 t$ g5 z, f1 b
      return -1;6 ~" }# ?* Q3 o# w! c! R
   }
! ]) f3 P  W6 ]2 {& T* L, X: n( X   
/ q* ^% s# `' k. F5 N   mcbsp_cdev=cdev_alloc();
: u2 Q. l- w. }+ z9 _$ L9 Y   : T0 U" Y/ k/ a0 h8 j$ S7 [
   if(mcbsp_cdev!=NULL)
3 [5 l, Q- J  W. j& p) h   {$ _& @/ @- d7 N; v" N
      cdev_init(mcbsp_cdev,&mcbsp_fops);
7 R: \2 T+ V, O$ b0 L( P      mcbsp_cdev->ops=&mcbsp_fops;
* u4 E6 c6 [+ m      mcbsp_cdev->owner=THIS_MODULE;" ~3 C: m& ?* L+ i6 }, f
      ! C7 c; N9 Z3 D
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% g" X6 o/ j  d/ e: d( N
          printk(KERN_ERR "register cdev fail!");% d, I. {0 u9 z) J; z
      else# q2 B4 ]0 o) o4 V3 \( W9 T
          printk(KERN_ERR "register success!\n");
* {8 @1 \' r- l& U5 C8 S( m6 A   }
* p: X9 u3 i8 Q   else
/ S$ q' y( V! s* J  f  X! \   {/ Q2 ^2 t9 u5 ]0 w8 c# G: P6 Y
      printk(KERN_ERR "register cdev err!");
  p/ [+ R# P. o+ W( r  Z0 j; m      return -1;, a" N# S6 R  }2 X* a
   }
# _# T; f: C. k3 c7 ^& b   
( z2 [3 z  T% a! q& R# {+ p5 Y6 I  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);1 O, h; Z8 ~, S
   if(IS_ERR(mcbsp_class))' t8 P" ?6 F, f0 C. C7 W& V
   {2 v- l2 S6 m1 e7 y& w! l
      printk(KERN_ERR "register class err!");
2 B3 t" g& Z6 Z% u) M   return -1;
* J5 y4 V+ S( Q8 ~. p* a& a   }9 }. ]  ]6 c0 G9 @/ B
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
  @6 T' P9 ?2 y4 j
. m  l3 I( {% y' Q/ q   //PSC) `, ?' v& h0 ?  @0 K
   //add Enable MCBSP+ s/ \6 y6 c1 y# U- P
   //test
% Q3 S9 F! h3 x$ a3 q   temp = 0x80000003;8 X- m9 d6 l& e1 s' W
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
) i3 ]$ m9 n' S) `   temp = 0x00000003;6 d- {5 K$ E+ w7 ?
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
. E, D, ]+ T! h7 L2 Z3 |
5 `  q, a+ R7 m6 e: |2 m6 W* ?' {   temp = 0x001FF201;
1 T7 g- k( J" g8 q! p/ b. S' ~7 P   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; l" I. U' p0 P0 V; S
   - l: m& Z, o4 N1 @# {
   //PINMUX  / [! ?, v7 o: t+ \5 J4 p
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 M/ F' n3 ^) f/ h
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 h$ P! y4 r$ U& R1 Y
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   8 p: Z% C! W: C' k
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& N% R% }0 B- k  ]* z: q
   
2 d6 |3 c* z/ y0 z9 H# o' P   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 {+ a2 @1 U% @6 u2 M
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  / P3 V1 q. X+ J! ^+ v- K5 t2 r
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
+ `0 W; o. p* k+ z5 g2 z; x$ u   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) v& q. l. j% ?* ]' U9 A2 H, g
5 X: Z5 E: w1 Q5 e$ A   //RESETn,L138_SHK2
( O* r0 q1 B' i2 f   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  7 l0 l4 H) t3 D/ f" ?
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   $ j, A! V- E* h3 z+ x0 l0 R) @6 R
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 P) T6 [+ v1 _/ ` 8 Q$ }# C$ d( j% Y; Y- _3 ~

/ ~' o. D8 t8 t/ ^  //SPCR Register$ R+ Q5 u+ v  Z/ F) T
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; [& w$ e! c5 n+ g2 V4 w  temp = 0x03000000;//(DLB=0)& c: h( [! T) K& t, A, }# P
// temp = 0x03008000;//(DLB=1)
! g6 \1 i$ l$ q- r( i  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset! R/ K9 S# y+ u( k
  temp = readl(IO_ADDRESS(SPCR_ADDR));
: o* _) A0 i+ D: ?  printk("temp=%x\n",temp);
4 w, k) }- X  K ' J/ @: {8 l/ O; m9 X9 D; O4 r' B; d
   //PCR Register
7 f; O( b8 r/ }. {   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( P1 G$ Y1 D* w- C; _  // temp = 0x00000F0F;
  k- ^1 L: K$ o% X  temp = 0x00000B0F;: K4 {; N  t) O- U
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
& Q: D; _8 p* o, j( R  temp = readl(IO_ADDRESS(PCR_ADDR));
* J( [1 ^  n, y; B3 M2 Q  printk("temp=%x\n",temp);  
0 {, o2 S7 H/ o; \; y   //SRGR Register
: F% c% c9 l2 g- c   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; x) E4 a& A: P3 }
//temp = 0x301F000B;
; I; [$ r& C/ q% N, ?" ~   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized # S/ i3 L; i7 ?0 b( d2 d3 l7 D
  temp = readl(IO_ADDRESS(SRGR_ADDR));) K! `1 H1 U% ~# d4 U/ I( d7 m4 p. h
  printk("temp=%x\n",temp);
6 }( {. k0 o; @0 v* b5 j! y   //RCR3 @$ T8 c/ g1 K4 l# j
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 M1 f6 z% W! e5 F8 n4 g+ F4 J   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! k. o7 ^) ?, j% ]$ f
   temp = 0x00440040;
1 Y" J- ^4 X) N0 ^   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   0 G$ J* t; ?1 R  ~- C" L
   temp = readl(IO_ADDRESS(RCR_ADDR));9 E) E$ t; f1 j6 a
   printk("temp=%x\n",temp);
; {: Q' t7 ?/ T7 x( P; d0 V$ e# _   //XCR& f! l6 G) E. U/ G% r8 ]
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1  j% J3 c9 `) T, B+ N% q' Y% Q
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' {1 N# I: Q* e, Y
   temp = 0x00440040;" G' x8 a6 a9 ?- j
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
' T7 y0 w8 g) M' t6 Q7 I0 `% J   temp = readl(IO_ADDRESS(XCR_ADDR));
/ m! F! B8 J7 Y: ?: z2 ?   printk("temp=%x\n",temp);
) D5 N( }8 L3 ^6 z. Q3 w; t4 S  udelay(100);
% v( X6 k) G9 S# m  //SPCR Register0 r( ?+ m$ {( v* a3 F7 v2 h
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 i. Z+ L- ~1 X+ |! N
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1% I, H1 X7 T! v5 V& U0 K$ @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. z8 ]% i+ f# w' O2 Y, x1 l
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  ^0 e1 u% ]( k# p. d  printk("temp=%x\n",temp);
7 q( @* }# q4 X/ V( S7 Y  udelay(100);
( v6 e2 l: j# R% s8 I6 X: C/ b# l/ X% O8 O' J
  //set GPIO direction
7 X0 W4 R4 Q3 h) Z- L   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 q- ^5 b7 U* a" q* d: [
   temp = temp | 0x00000100;//EPR----input- {% k9 l, t" ?: Y0 s& X0 v$ N
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! j! A% b! d# H# a" |3 T
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
/ m: B, a/ f4 O, G3 }8 ~
7 O0 M+ @* c3 _" O2 o" a   return 0;
5 r! p+ Z) Y$ t* l/ K! D}
6 H2 R3 b5 C9 b2 c0 P) W; jstatic void __exit MCBSP_exit(void)! R# G+ b# b5 H9 E( ?7 T+ F
{, ^6 n3 |' i' S" w$ T/ j
   printk("mcbsp chrdev exit!\n");
) {8 A/ B( F/ f. L5 g   cdev_del(mcbsp_cdev);
0 D8 J+ w4 B/ Z: @% \: x   unregister_chrdev_region(mcbsp_dev,count);
: t0 F: \0 _: G   device_destroy(mcbsp_class,mcbsp_dev);
- A3 d4 }4 W8 J( ~1 Q   class_destroy(mcbsp_class);
! T# x9 q0 V1 o8 a4 W* F2 P6 I  G}' O8 z/ n4 `# `+ G
module_init(MCBSP_init);* q) K! ~/ T/ V' x2 B: M# x
module_exit(MCBSP_exit);
: ?' n! k( x) l
# [' A3 V% ?5 q* `% ~: |MODULE_LICENSE("GPL");
' f5 M+ {# u) x6 A2 U' s3 l* P. X3 }2 o
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 i2 \# \  S# g4 c. _
我的应用层的测试程序如下) n- v8 c# C  C3 X6 x$ R
#include <stdio.h>) i, l& M' C" c, k; A  J3 D% ?
#include <string.h>( X& r( e% f8 J- d, w- o- t- J8 u
#include <fcntl.h>. z) I* l- F& v; A/ i! a/ I
#include <unistd.h>2 m* p) M0 p& K" O
#include <signal.h>
2 t& B2 J+ |3 E& d- P#include <pthread.h>       //线程
. L1 |) ]/ t( i$ Y% q  D9 T#include <stdlib.h>
5 S6 L! @& c9 J1 n7 m#include <pcap.h>          //捕获网口数据0 X3 I9 C* o. E1 p
#include <semaphore.h>     //信号
/ b) k0 _0 |. W# h% |) r#include <sys/types.h>     //消息对列
  l" M3 }3 y2 _! D& ?1 z#include <sys/ipc.h>       //消息队列
" D. s# L1 t2 T0 D9 k#include <sys/msg.h>       //消息队列
. @/ F3 d6 `% `3 |& I8 \0 I#include <sys/select.h>
8 e3 ~/ y( q5 X: ~4 p8 W+ r#include <sys/syscall.h>/ E8 I; N/ _; c8 \
#include <sys/stat.h>  t6 s) s# o  ~. z* s( i% j, w
#include <sys/mman.h>3 E8 g' k1 M- i. o, @. M7 ?
#define msleep(x) usleep(1000*x)# |% Z; r+ S7 ~  T. C2 j$ T) i
1 U3 X) J8 n0 P. S
int main()
0 ~1 J' H/ k3 n4 Y{ " P* f) |/ o" d6 K% Q7 D' m
    //MCBSP,ARM与AMBE2000交互设备
" r) }& I$ E* c1 e2 M int fd;( o( H3 g& `/ D6 k1 K
unsigned short data_write = 0x5555;
* ?! b- n' z- n! }0 K+ x unsigned short data_read = 0x00;9 G1 Y4 l: S) e, C6 \
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);' E! R: M9 J$ c) E& @) C
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 R$ o4 ~1 T- ]0 b+ P1 m: z) E$ H0 q
   
! w- ?$ }1 o% `5 k6 l$ p  if(fd < 0)
, s$ Q5 [% Y/ I6 ?+ H/ f  {
; x9 K  [9 p9 d) U6 o7 Q     perror("open failed\n");9 c& o) U4 \5 k6 y  w
     return -1;; Y/ m" F& {$ _# ^" }& c: j+ q
  }( n/ v9 G8 N7 {, Y1 N; ^% [
  $ r0 G, n- }7 x$ H' s0 W
  while(1)) I, w! ^( Z# N! c; q3 t0 ^+ I3 W
  {
% [, u& x  n3 m   . S3 z4 {, M- O) h
   //AMBE2000每次读写是24个字为一帧
; O" k# O# {4 f1 d& h! D) q   //写数据时将数据在底层存储起来,等到中断的时候再发送) Y/ R' S! L' q; K. Y
   //AMBE2000输入数据是以0x13EC开头的
+ m2 r+ R# _9 P' ?   write(fd,&data_write,sizeof(unsigned short));7 W8 j4 o( t% Q6 ?) L' p
   
+ R$ {) g. c& F7 W   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  # F9 s1 _4 i" N) i4 [) I
   read(fd,&data_read,sizeof(unsigned short));8 ^! {1 Z+ y! }, |9 T
   $ Z/ c8 w3 r" @! |8 u5 n! F. _( |
   if(data_read == 0x13Ec)
: B+ ^, D& y" R7 ^  w   {
9 {( |1 I' g& Y# t. a/ C, n   
. a" M+ b7 H( A2 y6 l5 @- b, [    printf("data_read = %x\n",data_read);
5 {. T9 B2 Z+ U7 _+ w. @& \1 u   }
0 W4 j1 \1 t4 T5 p% E   1 w* K7 Q2 J# ~+ E, V2 f
   msleep(10);- u' T: H. C6 y+ N
  : A2 p  T8 e6 S8 b- D0 h3 y" ]6 ?0 r3 w: T
  /*
0 }& A3 z) Q' F- d  E* S5 s5 Q   ioctl(fd,1);   . Z' o  G; s+ y$ j6 x" K
sleep(1);
$ Z- r* Y4 f2 M3 G ioctl(fd,0);
4 g) c$ A0 q. o# d3 e- d) ^0 X$ w sleep(1);% G; Y; V* h2 [) g
*/ 2 F: U, \/ ^1 l5 J
  }   : e0 p2 f1 G7 s' P6 N
return 0;
8 Q. l7 P9 T+ D! C
% R/ x* Y1 W* b, S( v}
. u: A7 V- W6 m
" f7 ^" D3 ?% j4 R. V多谢各位指教,谢谢! 急$ Z8 u% i/ A; ~0 W/ h
" i$ i. N# z  @: q

) r. H2 [* l3 B* r2 ^% G0 k2 K
9 F, \! k6 G6 k/ a! A
* Z! V. N; a+ q& u. K2 W2 U8 H9 H$ a5 c8 K$ x4 C6 a& H7 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 06:19 , Processed in 0.048509 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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