McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: , H& U7 |7 n0 f1 e- L) T, x) d% ?
/*
6 G3 k$ l& M& V * Copyright (C) 2009 Texas Instruments Inc! d6 h  w! g% W$ b) i7 V( ^
*
1 O- g! A* I! ]9 k: Z" @ * This program is free software; you can redistribute it and/or modify
4 W8 t; ]" C; V7 m+ ] * it under the terms of the GNU General Public License as published by0 ]% \1 a# W7 {. ^
* the Free Software Foundation; either version 2 of the License, or
! q6 U% q+ K2 [  U- \ * (at your option)any later version.  w: K; M( d2 h
*7 R& s) [* J& Y/ B  a9 j! N9 C
* This program is distributed in the hope that it will be useful,9 s' I" l. H4 ~6 `
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 j6 }- Z  Y# V6 Y * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 k* k- D8 u! ^2 C! s9 v * GNU General Public License for more details.
! y6 P' c1 H/ Y1 [4 F& f *- J  h3 n! ^; I% G% B# P2 N
* You should have received a copy of the GNU General Public License
/ [  k: c* D. [/ E+ } * along with this program; if not, write to the Free Software2 @% A; _/ b' q
* Foundati
: ?+ T0 X4 z5 H) v8 J+ o; g*/
6 z7 z) l' D: T. N, }# z5 A#include <linux/module.h>' u+ e/ A. G  T  G. A+ ~
#include <linux/init.h>8 F2 M4 l3 G7 I' ^8 A: b( {4 A! L
#include <linux/errno.h>
* b: s  F! K% q( T. b. q! {1 q) V) E#include <linux/types.h>+ k) C3 m: ?2 ^1 h3 f
#include <linux/interrupt.h>
9 B" H0 h  I5 K- Y- ]1 b8 w#include <linux/io.h>4 n1 p" j5 G8 `2 G; K2 [6 f" ^
#include <linux/sysctl.h>
8 G2 J& _8 l* e' E0 D0 ?#include <linux/mm.h>2 M6 a3 ]) j; c0 J- B: A) a# [8 g
#include <linux/delay.h>
  f# j( w" {: i0 e#include<linux/kernel.h>& n0 g7 D) ?9 g! H& \) F& w
#include<linux/fs.h>
; H# o8 m: B$ q- a#include<linux/ioctl.h>9 T" j9 z) V/ E
#include<linux/cdev.h>+ k9 p+ @* _) y( y, Y( u
#include<linux/kdev_t.h>
3 M9 h3 g! }0 w$ \  h  f/ N. \9 D#include<linux/gpio.h>" D( H/ ~  `% f
#include <mach/hardware.h>) B# ~, c$ w. `! w( C) w# w4 _
#include <mach/irqs.h>
6 J) {* x  n- F
" W+ Y! h) |, X9 R% d#include <asm/mach-types.h>
: U$ R; t( V: |! z9 _! G* G#include <asm/mach/arch.h>
- y: Z' e$ ~& f) R4 }1 m/ r#include <mach/da8xx.h>
4 V/ Y. X- x/ T5 i: L, F#define  SYSCFG_BASE   0x01c14000
" H* p  ~2 g: l#define  PINMUX1_OFFSET   0x124 ) K# [- B* Q" l; i
#define  PINMUX18_OFFSET  0x168
. @+ t9 n) A) g8 @#define  PINMUX19_OFFSET  0x16c
* r. L7 E6 L: ^+ n5 u#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 ?: F9 o1 `% |, l; O- |
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
  u  E# Y! c9 u/ D" [: E4 v#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR; W2 c# Q. O+ [8 d' z
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
1 ]) q7 s7 Z+ R6 W4 q8 `5 h#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR5 F3 ^$ _! `# y9 _  z
                            9 z0 ?2 s" q; p1 {! h' S
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
" U% ~/ Y) a" V" f. S, g6 n#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% Z' D7 E* Z9 F  Y! k1 Y' R
//PSC- ]2 v2 Y# v) w% H
#define  PTCMD_ADDR   0x01E27120  - }0 B; N" F2 o2 ^
#define  MDCTL15_ADDR 0x01E27A3C) Z0 o( B$ r5 h
#define  PDCTL1_ADDR  0x01E273045 p/ i! u3 u- p
//GPIO8 direction8 y' F8 J" U$ A2 c9 q& P* W& S6 i
#define GPIO8_DIRECT  0x01E260B0
6 }) P2 P. a  I' ?#define GPIO8_OUT     0x01E260B44 I* z' m; b8 f/ H/ B
#define GPIO8_IN     0x01E260C0
. m0 S  i9 X( d  Y. b. T2 V" t
0 \  l7 S9 M# w# i8 Q0 [1 R//#define MCBSP1_RINT    99              
3 L' A' R( b% A8 J5 b- z5 Y//#define MCBSP1_XINT    100  
* g4 k4 }, X) a5 q* k6 nstatic int MCBSP_MAJOR=239;
0 ?# M, S# U7 A+ a# i& H: jstatic int MCBSP_MINOR=0;1 |' I: }  q3 L0 W: E
static int count =1;
2 l- f) w) Y! L# }* |6 D( g# a- P% L! t  ^3 m! R4 V
#define MCBSP_NAME  "MCBSP-device"
* Q" }1 \: i3 f8 b0 k) u  E
" d; p: i( n$ f. D5 r+ Q# S2 C( Lstatic struct cdev *mcbsp_cdev;
3 Y0 j4 R( X4 G7 K" k+ G! qstatic struct class *mcbsp_class;" x/ [  Q& ]  W4 E( p  R
static dev_t mcbsp_dev;
5 s6 a( _8 e. r. K" t0 X% Kunsigned int DRR_data;: C( Y& h7 q0 [" h
unsigned int DXR_data;
: ^$ }" X: q5 R& v+ \static int mcbsp_open(struct inode *inode,struct file *file)
) `+ ^) D' F# u* A; q{6 D$ N4 z3 m2 V1 @
   
+ B0 `) c- \. {2 J. z6 ]4 S& X   //interrupt enable,initialized
- c( G+ C" V/ F: p) _" o( s   unsigned int temp;
" [7 j! O' W+ o) ]* K, S, S   //SLEEP_EN(GPIO8[10])---0" ^) z& ~+ z9 g/ h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 P% o( r* N* c+ X4 R" R! m4 O
   temp=temp&(~0x00000400);
! h" J, ?/ u6 l0 e  q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& W4 K! J! [$ ]) b; i  //RESETn(GPIO8[8])----0----16 R) Q, @7 @9 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 g* [9 H0 F, `2 f) e6 h5 I2 a- t2 b
   temp=temp&(~0x00000100);
6 O: ^3 q) Q  N8 i4 X+ j9 s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( Z. S" {7 v0 j6 t2 s2 {' l   udelay(100);/ F6 s+ s. R3 Z
   temp=temp| 0x00000100;
6 A- e7 b9 ]( J( m  C   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! V/ M, I# z2 l9 y
   udelay(100);
; }0 ?! a6 y2 N) h% H   printk("open success!\n");5 ?) d# K3 O* _9 E$ s
   return 0;
/ i+ i  ~3 F: V, f& m% @}
# C1 O; h! b9 k8 {; J0 N0 f9 U% U
. g3 V: ]2 p% }1 w4 d; N7 O* t4 astatic int mcbsp_release(struct inode *inode,struct file *file)
0 B2 E# n5 Z4 a; [, j8 Q{- q! g4 L/ w$ W5 Z2 G) W8 L
   printk("release success!\n");
5 h4 g* V  u! g   return 0;$ ~7 I& r. k8 o4 O
}
; I) k" d1 F. i: Y
$ [) b5 f5 L7 m: Wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% W2 G% N" k7 p4 O, L- G+ @0 U{; V# x: C6 |$ E9 u( u6 z7 Y
    copy_from_user(&DXR_data,buf,len);
- q2 b7 D* j% z0 l6 X6 ~4 {" r3 |    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       / }0 ?! L: e& g* \' Y& \
    return 0;% R1 y; q' i1 g0 d( a4 H  A
3 e4 k2 h: s, G' _
}, L8 N" F7 t6 v, l- s9 p) ]$ V

% }6 w9 O; N5 z  w. V& f: \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! @( r' E: @" s: L% n% U{ 0 o# d6 O' F; H! p( `( q# ?
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 C. d# ~# C: H
   copy_to_user(buf,&DRR_data,len); 7 h6 X2 i0 B* `9 L+ s; B9 k8 ?1 S
   return 0;
. d3 M. N' }' ?" e$ }- v1 |) H}
; _# ?, `3 L$ T3 {# W# C
6 G& d! R. j' \% f% s+ ~9 L
" m3 ]0 V, H, A% K0 M  jstatic struct  file_operations mcbsp_fops=7 }& J4 v2 s% R' ?5 N
{9 C& h% Z7 E. \% t: H6 W- _
   .owner=THIS_MODULE,) ]9 c) ~; b7 H. N
   .open=mcbsp_open,
+ O" F  ]0 G" D& j' @   .release=mcbsp_release,
/ C( k" }9 _- t9 @& ]   .write=mcbsp_write,
' e" ~2 s3 x2 {   .read=mcbsp_read,1 Z7 q+ E+ O, ?4 B, \6 C7 \
};
9 U# R' e* D1 [  K: nstatic int __init MCBSP_init(void)
0 V: p; v8 Y0 J{
+ k7 h% _% I/ c% k6 ]5 C5 {0 x   int ret;
: j% T6 R4 T# _) G4 f0 r( i6 {1 I3 r7 T   unsigned  int   PINMUX1_REG_old;( @9 N: r/ P3 y3 t* H
   unsigned  int   PINMUX18_REG_old;7 @" n  ~1 u# P9 d( S* d- I
   unsigned  int   PINMUX19_REG_old;1 H4 z3 E( z. J+ \0 C% P* U2 s
   unsigned  int   temp;  * h- A, h0 m8 U. v
   if(MCBSP_MAJOR)
1 S1 Z, W- p$ p, m, k9 A' e   {
) I, N- ^. X$ o) l1 F9 Z" i      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* P1 i9 S+ c& c; K! Q      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 `' H' C8 v* B! c! A
   }
+ n, \* |- H. C6 R   else
5 i) @* D( R/ i! f   {8 a$ \$ c0 x4 K8 G3 k3 E9 h1 G
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ ^' Z. m% ?2 X5 |1 v/ k5 K3 E( b      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 a+ V2 C: U9 [' d" E3 c1 l; a+ A
   }
) F" m3 x  H8 v8 m   
7 L0 {/ @1 m5 s" v2 Q2 O   if(ret<0)
, M7 ?. y: G* Z   {3 D! k8 x1 X7 b0 h: P5 \: A5 C
      printk(KERN_ERR "register chrdev fail!");' C& l" C! X* }2 j: l( b* V* I
      return -1;! R: c' m: c2 q+ U( m8 t% E! C
   }6 ]4 p" q! A5 O' a4 w: p" W
   
& Q/ i, L4 K' t! B   mcbsp_cdev=cdev_alloc();0 q6 T" r% n$ B
   & c8 S$ m8 ~9 F( P( X
   if(mcbsp_cdev!=NULL)7 G! n2 N5 f! y* i* I4 k
   {
3 u0 o6 J9 j' @+ T      cdev_init(mcbsp_cdev,&mcbsp_fops);
4 {4 f$ X; ~8 J1 e- f) |: F      mcbsp_cdev->ops=&mcbsp_fops;: e2 Z9 W! M4 ^0 x
      mcbsp_cdev->owner=THIS_MODULE;
+ I) }! N+ l& D+ D) p' g      
5 Z# U8 X5 e2 t7 s1 ^      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% I6 u  [( N. D2 z  e, I  e4 a- D% K          printk(KERN_ERR "register cdev fail!");. Z6 w1 K! T! F' X
      else
0 j  v6 p- W# s0 J' J+ U2 Y7 h9 n          printk(KERN_ERR "register success!\n");$ _8 n4 Q8 G2 w: o0 r- b
   }
6 b) B' v6 y; q8 O+ ]   else" v# ^7 p) C3 S) D
   {% J8 }- V1 F; B% t3 T
      printk(KERN_ERR "register cdev err!");+ m: C5 P7 M1 E  J* |
      return -1;# b2 ]( ]) r' }! \, H2 B7 B& b/ e
   }. E/ B1 o7 j$ w' P! S% W1 f
   
1 }8 T/ d. w- H1 S9 P6 M  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* s3 C; w3 `* y  ], V! D6 H, p  ]
   if(IS_ERR(mcbsp_class))
$ P6 q: c/ p4 P; t3 U; Z   {4 n3 D( g2 d( C7 t8 ^
      printk(KERN_ERR "register class err!");' u' j  n% e6 a
   return -1;
2 M) ?1 ?$ n5 ~9 X) j% z/ A   }
( ~" M. F6 i0 K) d  `( r   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ w3 l) w2 K1 L5 z
& l% S" k; `& j
   //PSC( ~$ K" K1 R$ |( i; ]4 N
   //add Enable MCBSP+ y+ x: c. c" [0 c* g, F
   //test
# M: r4 i4 L: X5 y   temp = 0x80000003;( q- i  d4 @2 e, p
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 W3 H; s6 j: \: M
   temp = 0x00000003;% q% h& I+ j7 K  r5 Z/ U
   writel(temp, IO_ADDRESS(PTCMD_ADDR));- _" F7 J/ H+ v/ P
8 [" C4 Q. |  i  v3 b* ~
   temp = 0x001FF201;3 N: C# s0 f: d4 l3 B* I
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));& S/ x4 Q$ @( f% l) Z9 J
   - g0 `) F! G( A  t
   //PINMUX  
6 ?) T8 v! y' k9 ?   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 q& B5 I. Z% `% r9 d7 K0 K5 i
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 R: K- u( U5 X* K2 v
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! G# a* `8 C6 w) r4 R% H, w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
5 a% K; `/ K& d; B. r; h   
( T& [- V" d" z, ~5 D   //SLEEP_EN,EPR,L138_SHK1,L138_RC. B& g' ~2 ^) O) A  C+ N* S
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  + L3 ^* t# [9 ?( r% Q
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   7 w$ V+ P' t2 L: j% f; S6 X
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ r/ p! Q$ a0 d4 T9 C# r, h * y5 W8 T5 \# p$ M; q5 ?5 f
   //RESETn,L138_SHK2* {+ F$ Q6 g7 i+ h. X
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( ^  X( Q  Y: {: v$ Z   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , x9 ^/ b. u1 F- @$ o* k3 N. `
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ S( |1 ~5 Y; p
8 y0 T/ z& C8 ^. L5 N% o0 I2 } $ P+ j: A! Z1 {. N# }% C
  //SPCR Register# B1 W' y2 |# i2 k5 u
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* `$ i  w# O0 f2 q8 |! s+ ]$ ]  temp = 0x03000000;//(DLB=0)
" K$ A" G" T4 K4 A" B4 G // temp = 0x03008000;//(DLB=1)
, V/ J" V0 P- C3 ^: c* [$ i  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset$ Q6 C+ m2 V. F3 D
  temp = readl(IO_ADDRESS(SPCR_ADDR));! i7 y; s8 R' c2 N4 _9 w- `5 b
  printk("temp=%x\n",temp);
  h7 ~/ j0 D% @3 w: z; [ 3 M( n( r( ^) `& E" A
   //PCR Register1 j& ?/ _6 H8 g) m# u. ^+ ?
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 ~+ G" E" D3 R& U" g  // temp = 0x00000F0F;9 Q, i0 S# s8 M" t2 i
  temp = 0x00000B0F;
8 r* N+ z: p! @& m4 T" F1 I6 Y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized / v: y, }, X* V) i
  temp = readl(IO_ADDRESS(PCR_ADDR));
9 |( h0 [, W, d  V  printk("temp=%x\n",temp);  
& d3 O- {$ F* }2 O( B   //SRGR Register
5 ]2 |- o! ^; t. c   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11  j8 E8 m1 L# p7 F7 p
//temp = 0x301F000B;8 ?" P: L; @7 Y" R, @
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 e2 Y9 ^1 r2 z, S' b0 y
  temp = readl(IO_ADDRESS(SRGR_ADDR));
6 ^1 q# Z9 I! S6 h- n  printk("temp=%x\n",temp);' ~# l* c% d( I% q" h
   //RCR
! M$ R" C5 n7 J$ o   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( N+ O/ r# Q; @9 d5 ?$ f7 Q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. E% K; a! A) H0 y5 d% O$ O& c
   temp = 0x00440040;
4 X: S4 O+ k( D1 d9 J   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
. s6 D% j8 I+ g3 \   temp = readl(IO_ADDRESS(RCR_ADDR));) m: L5 [' B% _* X9 O
   printk("temp=%x\n",temp);( o4 T% d, r. G4 S/ v3 P
   //XCR; m+ K% D5 ~6 @( X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! [6 O# i7 }" G4 q* g   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% m; e$ @+ C+ G   temp = 0x00440040;( q1 c/ D7 D7 z4 v$ x
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
: m% F9 W9 a% |; \& i6 {9 P   temp = readl(IO_ADDRESS(XCR_ADDR));
6 V  E0 i2 ^; S+ T$ ^5 a   printk("temp=%x\n",temp);
3 ^# }( y! L; {) ~; b! S0 W/ z  udelay(100);2 C, H, [; \6 w" Q0 u/ t& p
  //SPCR Register3 Q( r, |5 J; m: ~
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 T# i9 E# q" z. k8 ]% X, P  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 p/ r* [* X  C3 c) _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 D6 h  ]0 D8 k$ f, ~1 }  temp = readl(IO_ADDRESS(SPCR_ADDR));
, Q! o# o3 l- L- f2 T8 _  printk("temp=%x\n",temp);
! ]# F4 o  y0 u5 [+ B  udelay(100);7 {' f' L7 E& b& D/ `7 b

' M% t, Y9 W& X* t0 [, X# Q3 d; x& z  //set GPIO direction' F: A( T1 w( M+ ^- k
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 W/ T' M& l8 i0 ^* u3 @
   temp = temp | 0x00000100;//EPR----input
  Y5 y0 ~8 R& j" T6 _4 n8 m   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) ?( T  p# p: T- K3 C  k2 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ O9 l' w2 g) q, ?/ @. q" _   i- r6 a7 ?* t1 }5 ^
   return 0;, J/ m2 z/ R/ ]1 d% ]  g
}
& D# {6 K' C: g. D- Ustatic void __exit MCBSP_exit(void). H6 j8 b' ~: e9 d( C
{7 }7 w' m) O0 n# @* B1 f
   printk("mcbsp chrdev exit!\n");/ e: \. z6 x# n' U% d+ X1 u
   cdev_del(mcbsp_cdev);
/ E: H3 ~$ f$ u; Y/ P; x! Y   unregister_chrdev_region(mcbsp_dev,count);5 H/ c" R) g+ ~9 U
   device_destroy(mcbsp_class,mcbsp_dev);
+ L, \" U7 \3 P3 c. ?6 i% c6 W. h   class_destroy(mcbsp_class);
- T! z8 V$ r' \" z}" O$ J+ M+ m; T* _
module_init(MCBSP_init);* j( W" ^7 k3 X$ N
module_exit(MCBSP_exit);! ?- v7 @1 d6 F% E% D
* c) ?0 H8 P5 x+ X: ^
MODULE_LICENSE("GPL");
. q9 H0 i. V: f: m. {- E: F) S) w- l' H2 Y8 w; \6 e
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
3 L  `3 S4 G0 t0 j7 e我的应用层的测试程序如下
. {" _; \6 L: y, R: @0 E#include <stdio.h>! S( I! i1 c5 {' ]
#include <string.h>
$ K3 a& l, o9 J& u! I; ]) c1 h5 D#include <fcntl.h>
( ]* i6 u8 H# y" S#include <unistd.h>( H: K% l; }2 t5 O
#include <signal.h>% E1 U/ ?7 f1 g; s3 F& z+ B8 D
#include <pthread.h>       //线程- X/ A  T$ z% c3 o; U
#include <stdlib.h>( z* v- g/ b$ f1 ]* `0 a$ i) V9 J
#include <pcap.h>          //捕获网口数据
) H& M0 R1 C4 Q  p* F5 R#include <semaphore.h>     //信号- m! b3 K6 E8 ~
#include <sys/types.h>     //消息对列" [) R1 F; t$ @5 e" N
#include <sys/ipc.h>       //消息队列
% U8 k' h  q1 Z4 C7 B#include <sys/msg.h>       //消息队列5 j7 v# ^/ I5 J5 N2 j* k
#include <sys/select.h>( o: D* Y7 P9 N* ^2 Z2 v
#include <sys/syscall.h>5 }2 S# I( C9 Q
#include <sys/stat.h>
0 C4 v) R4 Z6 m#include <sys/mman.h>
4 P' b6 P+ d. Y" H$ P, h$ x( g#define msleep(x) usleep(1000*x)0 O- b+ _5 i* i/ \2 K6 f% y0 }  d
4 n( c" T3 d" I6 s9 d
int main()6 f  U( X/ a/ C% X+ b& q3 }3 j
{
# o# T# N) X; N. d" `    //MCBSP,ARM与AMBE2000交互设备6 L4 v; y$ c; t3 ~! R% ~
int fd;3 Q; q& z5 L8 |1 F
unsigned short data_write = 0x5555;
; h( B# p# h' o2 e- o unsigned short data_read = 0x00;
6 y+ Q& @# s/ ^$ ?2 P' @% {1 M- B  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. X: U# O$ v5 R* H2 J
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( `/ ]- v: }6 X# I  M
   
2 R/ K  o. R! t1 ?* t  if(fd < 0)
* P, G) W; I, u% v  {, @) f8 \) X/ J7 j+ |( k" t$ k
     perror("open failed\n");
5 X% }, R! p9 N9 D" G: R0 I     return -1;
" M. C' N! I% P" T: @' W0 Y2 V  }9 f5 E5 f+ Y) Q* O
  ! g9 J& B3 ]' v$ K" n2 x
  while(1)
2 M" A$ r" H1 ?7 p  {0 l& w/ B; i9 {# b! E6 t
   
- N: d( @/ X; ]0 ~   //AMBE2000每次读写是24个字为一帧6 C2 c+ G0 a4 Z+ D
   //写数据时将数据在底层存储起来,等到中断的时候再发送
+ d1 r5 t  d& c2 s' d" C& e   //AMBE2000输入数据是以0x13EC开头的* u9 r5 \) G" A  ~4 Z5 m8 a
   write(fd,&data_write,sizeof(unsigned short));
/ }8 V1 H  L" K$ P   9 V3 F5 E# r1 l( E; A% p: h7 O
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ) E9 K7 b& Y2 u, X8 [
   read(fd,&data_read,sizeof(unsigned short));4 n- V, `. R" h( S$ Y6 v+ }
   : U6 s% H6 |% n$ |# h
   if(data_read == 0x13Ec)
0 R/ p4 G2 W- ]. q+ x   {
: @$ Y2 p0 X/ b   % c5 F2 n7 V5 L' D
    printf("data_read = %x\n",data_read);
+ y4 F5 s- T! `) n   }* [' c1 Z2 @% V* s( M% k9 `
   6 l. t/ b6 v$ D6 h& Z
   msleep(10);
; m. @* p1 Z! ?  
: G* v6 D2 ]& M/ G  /*
% g2 s5 T" O, R& R) p$ G: _   ioctl(fd,1);   
1 E8 A; B2 h- Y! B sleep(1);7 g- T2 J4 Y/ n  y7 t/ ?' ]
ioctl(fd,0);" d$ q" x; J. ]* `& m6 P1 T
sleep(1);4 w/ [0 @* o* {3 h: ^: P. w
*/ + ]& S1 ~# v/ H8 ?
  }   
4 B7 g; ]& W. ]  h3 v return 0;. o8 {: {1 t# Z& Y
0 \0 P! l& [- o. B& x) \
}8 k6 B8 z9 m8 v
1 @$ v, S3 c( D2 _) C3 E
多谢各位指教,谢谢! 急
& `) ^2 [7 M7 r0 N* o" Z1 z& }' V4 Y, S( A, N! x7 S
' I# f' R) R6 H1 i! }
, }$ b% y$ O$ M+ d, `

1 R5 ?4 F" y# u* s  a5 @3 J
  f2 ^) H5 B' k8 F, k4 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-28 22:37 , Processed in 0.047502 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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