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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. s' p8 c: O. B( n9 l$ }/*2 x4 F0 h+ J7 ?! C. n# \
* Copyright (C) 2009 Texas Instruments Inc
/ x4 L& f) N  N1 C ** w* o( Q, T+ j, l+ o6 i+ u
* This program is free software; you can redistribute it and/or modify
1 I3 n" A% O0 J% Z2 X3 a9 X' W1 f * it under the terms of the GNU General Public License as published by: c: K* {- U2 i  y/ _% G% J
* the Free Software Foundation; either version 2 of the License, or
$ A! E8 {* q! Y. L2 @ * (at your option)any later version.& A4 _- B/ `4 y1 s: p! o
*  P+ O8 k. j0 e8 W. ?4 L3 O
* This program is distributed in the hope that it will be useful,4 h- l& }# R' Q* ]3 f# K2 u, n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ I$ Q  m7 F! E0 p" w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 V8 z, f/ R2 [ * GNU General Public License for more details.7 U' \% I0 ~" @. H- y5 J$ J% z
*+ j8 K3 t9 [# s& S# K. I$ m
* You should have received a copy of the GNU General Public License$ |& P; P. W+ h
* along with this program; if not, write to the Free Software
% L# b& l, x, V# f8 w * Foundati1 T" ~8 i1 e3 _0 h( Y2 `
*/
  {* m9 |; U6 H. w% O+ }#include <linux/module.h>( L+ |) U- ]1 T( E+ z, w
#include <linux/init.h>! P6 R( v. Y7 a8 B0 ?/ D
#include <linux/errno.h>% B( _. O5 D' g( n) e! d
#include <linux/types.h>
8 o$ a* n1 e- n#include <linux/interrupt.h>6 D" g6 j2 F0 p4 ^: L
#include <linux/io.h>
, W" v2 D# k: Z( b#include <linux/sysctl.h>
$ r* X% g5 i* Y* I#include <linux/mm.h>
3 l3 I: q1 r0 h  k- C! C$ V#include <linux/delay.h>
  K: v  I# I: r& @#include<linux/kernel.h>( q# e' R2 g$ U) m  |8 H" T9 J
#include<linux/fs.h>
/ h8 |5 {- X' {! w4 t5 M#include<linux/ioctl.h>
1 A( V" s1 D; Z" \; ]6 X#include<linux/cdev.h>- Q, x$ |" X) Q/ o7 g+ f# L0 S
#include<linux/kdev_t.h>
+ U- s5 M3 @7 y0 y5 X8 z) X#include<linux/gpio.h>
% Z% |  k4 M9 {; Q4 X#include <mach/hardware.h>
# n$ v( D2 @. M3 f8 a- k5 \! _#include <mach/irqs.h>
9 p- P) F0 \3 @4 b+ i7 C# _/ w8 [+ A# v) p: V7 K1 g
#include <asm/mach-types.h>% g- B( R) ~& a% Q' k, L
#include <asm/mach/arch.h>
$ V6 h3 ^- Z' ?# y3 t#include <mach/da8xx.h>
0 f+ n: T# h, J4 M1 l6 O  c! s#define  SYSCFG_BASE   0x01c14000
: |0 m, S- r8 h/ @# B. i( n2 D#define  PINMUX1_OFFSET   0x124
* ?/ \0 ^3 |6 {/ F# ]#define  PINMUX18_OFFSET  0x168 # q, k  h0 a) L3 j# u
#define  PINMUX19_OFFSET  0x16c
8 ]2 Z0 n9 \8 W. a& V# j7 r' q' M3 d#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR  u, s5 W/ u! s. }! E  j. Q
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. E0 K+ C2 P4 t2 n, |
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% O5 R! e5 c1 d" P% X#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 x) j/ A- ^* d
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR/ j( J$ V3 Q' A# T& L
                           
) t( G2 t: K3 C2 v* m! N* C) @#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 q0 c4 ^0 D& }" U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
* `; Z* x6 ]- t# L+ K9 X//PSC
% a% Q6 w; K+ u#define  PTCMD_ADDR   0x01E27120  
/ b( t& `; V# P9 }+ F: p#define  MDCTL15_ADDR 0x01E27A3C
3 C1 \" s6 c9 S2 L, O* Z' m#define  PDCTL1_ADDR  0x01E27304
; s- D4 j! e6 m! M8 n: w& _//GPIO8 direction; G: G  b4 M- [+ \5 a* A
#define GPIO8_DIRECT  0x01E260B0
% s$ Q, j+ a5 R# q, L1 m#define GPIO8_OUT     0x01E260B41 A) i) V5 i9 M
#define GPIO8_IN     0x01E260C0
8 I4 w: ~! I" H4 I. ~3 ]. R2 ^- a
/ T! Z9 M) A8 y//#define MCBSP1_RINT    99              9 I5 I+ H* J2 R8 n; H9 P6 }& T2 P
//#define MCBSP1_XINT    100  ! t, d9 ~* Y1 ^
static int MCBSP_MAJOR=239;* ]7 E4 n' f3 n0 X) y
static int MCBSP_MINOR=0;
% X/ S& T2 u! p0 d  l' C+ x5 pstatic int count =1;& {; q2 O1 f2 o* `+ ]
& h& N4 M4 @  A3 ]6 a! h- M/ V
#define MCBSP_NAME  "MCBSP-device"' ?' n9 m) k9 @. s# P; q
( B/ v2 k/ q8 v" u
static struct cdev *mcbsp_cdev;1 k' N+ O5 w, U/ t
static struct class *mcbsp_class;
$ Y: X8 Q# T7 _static dev_t mcbsp_dev;
3 b' z; f; o( l; F1 M8 T. _' K# ~unsigned int DRR_data;( I; c/ ~; \. J4 R  v( s
unsigned int DXR_data;
. z% Z0 v* I8 S+ O; qstatic int mcbsp_open(struct inode *inode,struct file *file)) U( p( W: C  F8 Q
{
) N* e5 e  s* e   3 |+ f( u% A: J  P) m
   //interrupt enable,initialized1 B7 \: }5 A/ S# P$ N
   unsigned int temp;, `4 Z7 A  D  a
   //SLEEP_EN(GPIO8[10])---0
* a+ o( }6 i8 Y# n6 K/ P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) E- ~$ g. [* t
   temp=temp&(~0x00000400);
: H' o; k7 ^9 A6 [& C8 E9 Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 r( l! x0 q4 \: A/ D* B  //RESETn(GPIO8[8])----0----1
9 c3 a+ I1 m) N" t5 d+ |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ C: g2 F+ A/ b5 h$ P* s9 `- Q* C   temp=temp&(~0x00000100);( r2 O, Q  l$ g+ e! i5 o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 D1 g6 ?( |/ Y" X" w( s; }4 i
   udelay(100);
9 W; b/ z. m6 H3 O   temp=temp| 0x00000100;
5 P) y& q5 N0 r) a6 X7 t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1. g; c7 U* R. y) I9 l
   udelay(100);$ h& l0 g$ ~3 C4 R. C
   printk("open success!\n");
. x8 D0 G' r3 K   return 0;
+ `; x! }9 d  e5 q' v2 S) Y}
) G0 t3 X& y$ U5 V) E7 K6 \
" g' D* |2 ?3 I6 {7 jstatic int mcbsp_release(struct inode *inode,struct file *file)  a+ s5 N0 i8 N# b2 P+ h( ~+ }# h$ _
{5 c* u6 T. u; }) [! \6 Z* H
   printk("release success!\n");# ~0 ]) {+ |( |% S
   return 0;6 V/ e8 C% I4 `0 O% C# v" D8 V
}
" j" N3 B: T; L. I* P% h: @  x7 R7 [- P; N+ E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# b7 M* o# w; ^) y/ z( I{0 c- ]. j) P3 n4 W' J8 b( E+ \+ `
    copy_from_user(&DXR_data,buf,len);
% G% c$ j7 z/ K0 R/ e9 F  E    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       4 Q* m+ p. p* F3 @. S" M9 L
    return 0;# a: j2 f" w! g: A# h* ]# ]' f

! z+ T  W& e( }# g7 ~7 o: A}1 M; H9 x) c" v3 J2 _
* H- V" Q5 j% W! d' X1 O8 W7 h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( ]# |* H4 q0 k+ y! V" ]4 h/ j
{
& X4 k: Z9 ]3 `! n5 q7 G   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" f' k& ~, q$ W9 v4 d
   copy_to_user(buf,&DRR_data,len);
: G/ g0 C# e6 r' ~; x; v0 Q   return 0;3 q8 C3 p) y" c- b% t
}. k% L2 W& x5 b4 D

- l7 U+ S4 [! g4 `/ Z6 [+ }
; @: l+ M( O& @0 R8 [static struct  file_operations mcbsp_fops=
8 G! O7 n! U: x. v4 G" b5 \! o{5 \# Y. O: d) P
   .owner=THIS_MODULE,6 X8 s- F6 j9 H. ~
   .open=mcbsp_open,8 N1 N: Q4 o; ~; \
   .release=mcbsp_release,/ B! ?8 K1 W7 Z! `1 L
   .write=mcbsp_write,
% O0 `6 r) Z5 H* |* `   .read=mcbsp_read,1 Q; a7 F: t# e4 v5 G6 R& Z* ~# `! c  R
};; h& ?0 A( M' R$ S% L$ ~( r8 {
static int __init MCBSP_init(void)
6 [# d; T  Y( x( w( x{4 W3 u% n& ]0 t6 u$ F
   int ret;" D# l7 Y1 b9 j. x0 E: W; Y
   unsigned  int   PINMUX1_REG_old;& T7 R( b5 l  [/ U1 h
   unsigned  int   PINMUX18_REG_old;
1 L: V7 P8 B' M- T   unsigned  int   PINMUX19_REG_old;' p, Q' O3 f* [6 n
   unsigned  int   temp;  
" @1 N9 j) l2 u   if(MCBSP_MAJOR)
0 A, G1 ^2 c3 a' T! r/ `   {) |* B( d  G; w) {4 [! v5 @
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 h2 h1 \9 A# r
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  Q5 K7 n  R9 b/ g* Y
   }
0 L2 j1 [" e0 W9 x% l. u   else! ~2 t" s2 R) U; Q: U% @% h) ~
   {' O5 l7 P6 d9 c" U, {+ I
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" ?& p) U5 L9 n/ M      MCBSP_MAJOR=MAJOR(mcbsp_dev);( }" x( S- S) `) Z5 }
   }
" V3 S, g) |8 ~8 t7 @0 T1 T   $ l5 z* e6 ~- H. E, i% |
   if(ret<0)
! B( c2 i: Y9 ^" T   {: E: a+ a7 _8 M/ e; ]
      printk(KERN_ERR "register chrdev fail!");4 M2 ]# h  j* {/ |4 C. n. B! Y
      return -1;
+ v+ \: s# u% L( A! R   }
5 D1 m, X. ?+ x# R4 e1 }* `   
6 c; y: Y3 C  v1 \8 F5 A2 B   mcbsp_cdev=cdev_alloc();
: X: q' G( i2 W/ ]1 z4 X   / K- o6 y5 _1 D" Q! ^& ^
   if(mcbsp_cdev!=NULL)
( @1 k' p6 p# D   {% H0 g5 L4 @4 Y9 y' f- Y# Q0 L
      cdev_init(mcbsp_cdev,&mcbsp_fops);
% A0 u$ H  E* N/ C" w      mcbsp_cdev->ops=&mcbsp_fops;( Z: q1 m( p5 p
      mcbsp_cdev->owner=THIS_MODULE;
" ]) V+ S2 I+ E7 d: X4 o+ i* W+ H      
& Y4 L8 x/ `8 w* @      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 Y# v3 G( S6 z) o( k  q; r
          printk(KERN_ERR "register cdev fail!");
4 G2 w# p4 ]: D, o% O      else! g5 U. l1 C! P3 s# ?
          printk(KERN_ERR "register success!\n");0 V! ~' ?& H3 _2 u
   }/ u) R! X- K0 h9 @1 a1 o
   else
+ m% a& L5 |8 |- F5 ]   {% h" I/ Z" ^1 m( X% k* I. a' o
      printk(KERN_ERR "register cdev err!");6 {  a* p5 ]( b$ f& Y9 M8 U
      return -1;# U: h" S2 T* l2 K- J1 h/ x- l
   }
0 k2 f1 s* f- ?8 h7 r   ( y' P2 G* l; ]
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 [& _  I8 l& G/ i5 o$ h' |& ]
   if(IS_ERR(mcbsp_class))
$ \% S3 K0 o2 e1 n8 {$ V3 g* P+ D   {% j8 U) B( P. f: A6 e
      printk(KERN_ERR "register class err!");
) y- T) J* h7 B9 J5 C: b   return -1;; b7 s- J- [* l" ^0 }* e9 o) C
   }
3 X( M+ S. {5 Q! f   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 K5 L1 s% R* U) q1 j. _% i

" Q( F4 j4 [5 s9 d! X$ c6 F   //PSC2 P( q8 u2 s8 K; {! H  l5 U* W
   //add Enable MCBSP+ w& T& h4 g1 J, Y+ O) G( F9 j
   //test$ t, \3 D) z8 Q6 @9 P' f
   temp = 0x80000003;
" z6 y6 ^: Y! q8 k- K& w* n   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. `, b1 q& n( R& E% H   temp = 0x00000003;3 s, z( N- R3 A& G% V
   writel(temp, IO_ADDRESS(PTCMD_ADDR));8 m$ G/ _% S5 n  f
, u$ n/ l; m1 d3 k* K& ~6 _% \
   temp = 0x001FF201;3 _8 ~" W/ C9 x6 x
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 S( |; ^( t' n$ R2 r   
  J4 d" i5 {9 b" `$ _, }   //PINMUX  0 B* }2 e4 s" Y2 t+ I
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 A6 N) z1 B+ A- k   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    z7 K, h# {1 d& `* F
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
) X( |. W3 r+ I% }   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- p) Y4 \! K% x5 ^( d: k; k
   . c: b/ q; `) d# N" `
   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 u! `5 o2 Y! M9 }
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % ]. p/ r5 [+ u7 R+ {
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
* R5 P7 i$ i9 t# `   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# F2 M8 I) F( o7 M7 v" N# k
* j6 l# p# x1 D4 K   //RESETn,L138_SHK26 Q7 t  i% U8 r/ `
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
0 H+ ?2 s% `" O& [1 Y3 k# v   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 ~  P, {. j8 f/ L5 F3 S2 T& G3 y% a   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ N2 t8 q9 t6 E  j3 j6 M, |& a% {- W1 i

$ k; J) P: A) P( M & y. D4 f: ^' r3 q3 \! I/ i+ g
  //SPCR Register! t" C3 ]  R: d1 ?. ~
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- B0 u' M" I& k  temp = 0x03000000;//(DLB=0)
/ |0 T+ t* @$ I // temp = 0x03008000;//(DLB=1)3 D. J7 q& Z* r9 T9 n6 T
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset& ]8 w! H6 I# _  V$ m
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( t" x6 o) N$ f  printk("temp=%x\n",temp);; ~2 O  Q; J$ H3 {. ^7 a  S

! d# A- Z1 s- ~' f0 ~& e$ ~; K   //PCR Register# w* k3 g2 E8 U
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! J& [! X2 H% h: O% \
  // temp = 0x00000F0F;* f7 ^/ `4 y( f" d. \' s- d# y; j
  temp = 0x00000B0F;
! D+ R7 q- |( ], w  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   m$ ?2 n6 a0 {" }3 I2 D
  temp = readl(IO_ADDRESS(PCR_ADDR));
9 c* F, ^4 _8 q% I  printk("temp=%x\n",temp);  
3 ]2 n9 e8 ^, z- v7 y- R( s   //SRGR Register
3 R+ s+ Y2 i  p) e8 s2 x   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) _! X' s5 w9 w //temp = 0x301F000B;7 U  \  ?  q+ j2 h$ w
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized & S6 \' R7 g" [( _; P! a& g
  temp = readl(IO_ADDRESS(SRGR_ADDR));
/ T9 p! h, `% ^6 [7 f: S/ Y& a  printk("temp=%x\n",temp);' c: r  r8 d% C) ?- {
   //RCR
' O; ]$ u; W3 \! J( O7 Q9 z' W   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 {& |9 I& x# \& D+ Z! e   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" V* J: n3 D( s0 v6 w2 ?
   temp = 0x00440040;" m( J% U  ?2 p& M) S' H
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
: B. N7 R0 Z- b+ }; H6 U2 k. K& X0 |   temp = readl(IO_ADDRESS(RCR_ADDR));
9 S& j! V( R$ R5 f% N2 P3 m   printk("temp=%x\n",temp);. y. c3 p* A. _, c$ F7 f* V& n  g
   //XCR
( Q. d% h) j2 _$ i# R3 F   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& c8 W' x* n* f# q$ [! U0 ?   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  L4 B2 n& q- C- q5 Y   temp = 0x00440040;
1 G' H& P9 C7 j' Z+ ~   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
/ S: F6 [. z- [# Y+ h# L# n1 _   temp = readl(IO_ADDRESS(XCR_ADDR));
$ t' J2 q$ u6 U9 Z. a# c; R   printk("temp=%x\n",temp);
- j4 z: C' S3 ]  udelay(100);6 ?+ `3 v0 |* b7 l1 U
  //SPCR Register. v1 _- F1 B! n  t, N
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ a. M# A" A; ~6 |8 v
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; s7 N2 r  o8 g+ p- J  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled% ^$ H: ?( [1 r+ y2 G
  temp = readl(IO_ADDRESS(SPCR_ADDR));/ d. k* Z( u0 _- m0 v' d2 v
  printk("temp=%x\n",temp);4 j7 ]2 o/ w, L9 Y. ]( ?
  udelay(100);
5 F0 A/ c6 G4 `- _; M! z4 U, A% m, A8 E7 I0 I& j" l. q9 |* s& e  W# {: |
  //set GPIO direction) a1 A$ P4 |/ @! G, T$ U  A6 u
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! B3 i- R6 l6 N# R. l   temp = temp | 0x00000100;//EPR----input8 j; F, {& ~6 n, a$ h2 b
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
# k. x% l* K# @3 e( _1 j, |0 w* H   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 K( I" @2 ?& f
! T5 C" l# k- b& A! _# j, ]
   return 0;
# `$ Z+ |! y( v& Q" ]}
- [* [1 S! G# Y, jstatic void __exit MCBSP_exit(void)
% T/ W( \0 N, }) |{8 C. x7 \$ s4 f( U8 l
   printk("mcbsp chrdev exit!\n");" v- U. Q. W9 S# M7 c+ m
   cdev_del(mcbsp_cdev);
1 D1 @( T5 }( _" ?' w2 u! j   unregister_chrdev_region(mcbsp_dev,count);+ r2 |4 w$ U+ p, t. h' U) P/ Y
   device_destroy(mcbsp_class,mcbsp_dev);* K  O7 p9 i1 {+ p
   class_destroy(mcbsp_class);2 ^) h# o, A% G# ?
}
2 e- S' C8 F& y$ |8 Umodule_init(MCBSP_init);
8 J  M6 u2 d! W' e2 Dmodule_exit(MCBSP_exit);
  k& J& |9 [8 ~6 T! x, k8 H* s) ^7 J1 t, x' o! H+ Z: l5 [
MODULE_LICENSE("GPL");" K% V. k" y( K9 `7 \* C$ b) c

, u' t2 W4 x& y% v# S2 E我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 i, @8 a0 |/ L1 _" u" d
我的应用层的测试程序如下
6 g/ }5 B* _! M( F#include <stdio.h>
# B7 n2 U: B8 @6 ]" s#include <string.h>7 ~# K+ r& u2 j! B9 R
#include <fcntl.h>$ H4 S. d" e$ J! H$ ~9 j: G
#include <unistd.h>& z1 A+ A" g  Q( n  h; P
#include <signal.h>
  Z( y; F$ M( H4 n4 C6 p0 }" c+ @#include <pthread.h>       //线程& Q% M4 j! N+ e0 l3 @* F* _
#include <stdlib.h>7 P, s; }- k  p' D8 E: ~; ?5 v
#include <pcap.h>          //捕获网口数据/ i* F# l3 D* z! p$ Y# `
#include <semaphore.h>     //信号
/ s/ x3 a7 \2 d& m8 V; ~  ?#include <sys/types.h>     //消息对列# m# E, S. [1 o3 p% X
#include <sys/ipc.h>       //消息队列
# r8 y) a0 ~+ Z% W, K7 k: W+ Y' o#include <sys/msg.h>       //消息队列- U) Y! `9 G# {" n# E
#include <sys/select.h>
, @7 h2 m9 F1 I4 |/ y2 R#include <sys/syscall.h>
7 f: U4 r& P' W#include <sys/stat.h>; U/ z& n6 n6 o* U" s
#include <sys/mman.h>
) f. c2 U$ W: _$ s( V5 o3 H5 j#define msleep(x) usleep(1000*x)
4 ?& S! \. @# a. s: Y( c  d6 K! y$ L9 j2 y7 e
int main(), y& f1 T) O- ~- T  J- C: G3 u% |
{ - h" {/ h6 T; R1 ?3 n7 \$ K& t
    //MCBSP,ARM与AMBE2000交互设备( [/ j5 Z6 k3 n
int fd;, {7 ^  _3 x) o
unsigned short data_write = 0x5555;2 Z0 i; i" M* _/ v1 s& h4 d
unsigned short data_read = 0x00;
9 ]5 W$ o% T2 \0 B  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 p  I) K" U; q# i% f/ C; W //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 @0 c9 ^1 H2 n! U6 ^. E
    $ Q3 c8 s* E+ [) s; e. V" |5 S$ K
  if(fd < 0)1 W( y& `: y2 S( q6 S
  {' ~: W8 H8 |  K: q6 z5 \
     perror("open failed\n");6 U/ r8 }: k$ |3 p" ~
     return -1;
# v8 K, e# A! i* Z9 n  w1 n7 D7 T  }( }1 X8 N0 t% L$ d5 P. Q+ m6 |
  ; {( I# w- y4 K5 E7 G
  while(1)# |: w2 C7 [' b
  {
3 f2 R& ~7 Z& n   8 v# V% L+ A, n1 M. M, \. a" F
   //AMBE2000每次读写是24个字为一帧
/ L1 f7 ?6 K: L- H# ?, Q   //写数据时将数据在底层存储起来,等到中断的时候再发送
3 W. h7 P3 ~7 Y  n' j  y) Q   //AMBE2000输入数据是以0x13EC开头的' @  C4 z6 ?% q- \
   write(fd,&data_write,sizeof(unsigned short));7 i; s) X3 `3 ?2 X, V
   
8 o4 H9 X0 U) V" @! o   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
! ?& F- O; Q6 h: |8 s8 m   read(fd,&data_read,sizeof(unsigned short));
& I8 w6 _" h$ R) r7 V$ S   
9 L, u' j% F3 c4 b5 Q; r/ \   if(data_read == 0x13Ec)* J$ o* T. [# j& ?% K* L
   {
7 H& o* Q( i" g. W3 g, |, Z; u& X" I   
  j1 I9 j2 c; L% L    printf("data_read = %x\n",data_read);
6 m  _1 K8 s+ C* W+ b   }" i% Z7 J; h; U7 v" o9 M' a. Y
   * U) A; ^1 q$ ?' f4 W8 c
   msleep(10);  W' g! r/ s! P7 p! j
  
2 V% H$ q6 ~) ?. q9 J8 R& W  /*: p8 d7 l2 ^  [+ U
   ioctl(fd,1);   
% X/ z; o& z& x# L, n" v, P4 M sleep(1);/ r7 }  t( `2 E" j9 k3 e3 s+ O1 \
ioctl(fd,0);
4 N! i9 r& R  a, @: k sleep(1);
4 [) ^+ _+ V& p' m! ~8 t$ e */
1 Z2 Q# T" {3 L/ A  r) V. i/ R+ C  }   4 X3 v/ `' h% w# ~1 ]: t
return 0;
0 x! S- [' @! b
" }4 L& @& f  p! J9 R}
/ Z" H7 T5 H6 M
+ X, `, p/ Z# f多谢各位指教,谢谢! 急
3 }0 E! G6 j' G4 f9 ^9 ?
% j; {) K7 x, H( d4 @+ h" G# C
6 i: u' ^0 G4 Q' ^% y* a" }
. s3 S1 _$ G* k. m, `' ?  p4 A, A# b. X. M, C) B& J
; l2 G5 C/ H  p0 D1 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 04:01 , Processed in 0.044356 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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