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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; x8 o6 ?4 z3 \8 ?5 ^
/*
$ |$ S+ C  s5 d0 L% }  Y- ` * Copyright (C) 2009 Texas Instruments Inc
- s  d1 p5 F9 s) f6 W; G: ^4 c *
2 {7 w$ e# B9 u! \1 ?$ j) r1 {' y: V * This program is free software; you can redistribute it and/or modify
" x. u' D+ w/ M6 j3 ^: y# F8 q * it under the terms of the GNU General Public License as published by
$ ~4 `, B' J$ n * the Free Software Foundation; either version 2 of the License, or
$ o# N6 C: x' ?: |, ` * (at your option)any later version.
3 q  L0 E3 c# T# m( S; Q8 @4 S *
/ R! m- s& Y4 l/ V; p0 x * This program is distributed in the hope that it will be useful,
9 n/ |) \# E) \+ |# ^ * but WITHOUT ANY WARRANTY; without even the implied warranty of, U1 }( k" z* _- K' i
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 d% H( _- P1 a: }6 n+ o( ] * GNU General Public License for more details.! x: B8 i( e! Z" C
*4 f& M8 F$ M. }% U3 s% m
* You should have received a copy of the GNU General Public License, }& P. R0 @) _  s. Y  W# L( X) @; \
* along with this program; if not, write to the Free Software. B% W8 k' s( ?" m  q( u
* Foundati
, _3 c' `5 i2 V' e*/" C) ?6 t1 `0 E, x3 M8 J
#include <linux/module.h>4 y/ p9 _4 J& [' h! a' i* f
#include <linux/init.h>7 [/ r  ^& ^  u9 T* b
#include <linux/errno.h>
2 ?$ v2 j3 A) r# l' B$ V  o1 ?#include <linux/types.h>3 F/ \9 o4 Y0 Q( y: U
#include <linux/interrupt.h>
1 r+ G9 V' A4 a: i: k#include <linux/io.h>
' {9 o# m$ O" V* S, y#include <linux/sysctl.h>
, Y, |2 T1 l' A#include <linux/mm.h>
! b2 k( y* O' I: d#include <linux/delay.h>
7 I+ W: r% x$ W% b) R. p#include<linux/kernel.h>. a8 q  {! [1 B0 u$ t, K# g
#include<linux/fs.h>( w0 i# [) E7 W; s; q; ]; o
#include<linux/ioctl.h>' @0 o' L! d. t: K, F
#include<linux/cdev.h>$ d. e0 z3 n# w! p4 K. U. d3 ?
#include<linux/kdev_t.h>% r1 g, e" ]0 W: z5 h
#include<linux/gpio.h>% e. ]% X+ C/ _( S2 t3 q
#include <mach/hardware.h>
2 B" b  x& A* [8 C9 I3 a. a#include <mach/irqs.h>
! F- `6 e, }9 G( H- M! M9 k. v- g+ Y2 W! N, u" o7 `+ p
#include <asm/mach-types.h>: P; E. ?1 Q9 o1 g3 `: ?
#include <asm/mach/arch.h>* ^* ~( I3 \1 Y$ c: w
#include <mach/da8xx.h>
% X9 A- T- M, m  s+ [2 f#define  SYSCFG_BASE   0x01c14000
+ _! b: `2 A8 H$ N#define  PINMUX1_OFFSET   0x124 % N1 u4 x) g) [! ^9 U! R, b6 V' S
#define  PINMUX18_OFFSET  0x168
0 k( K/ y; O- k; l# Y# E5 E; `#define  PINMUX19_OFFSET  0x16c
5 P! x2 ~& W: N7 O- G% @" q#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR( p1 x$ X2 p' j" J" k
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR' X3 e- T/ R3 A% ?
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR% X* r4 e$ T% R. k
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR) \, D3 f, J6 c7 g
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR7 B( k0 d6 k/ E4 N; X6 B5 _3 o
                            $ E4 Q2 A7 Y& R! |+ R8 b/ H2 e' f6 s
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
: J9 W! W7 [8 U* \1 u/ @- v#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
8 M" J1 m4 H4 ?( a//PSC
' N% }7 E3 C. A/ I. @. c#define  PTCMD_ADDR   0x01E27120  ( m& b# w7 c! e# H3 |
#define  MDCTL15_ADDR 0x01E27A3C
  X; f5 Y8 `$ v6 i5 v5 i, O  e3 z#define  PDCTL1_ADDR  0x01E27304
5 T  i6 c# C; q  X# I//GPIO8 direction. X; p! [% D: I( E0 v
#define GPIO8_DIRECT  0x01E260B0
2 V7 R% y4 V9 p$ W#define GPIO8_OUT     0x01E260B4
2 K% d- Z7 B& m0 D9 V#define GPIO8_IN     0x01E260C0
: E& D1 Q8 b! T( X" H5 D4 x0 r. ]3 W
//#define MCBSP1_RINT    99              : v4 G5 a& l4 M; W9 }
//#define MCBSP1_XINT    100  
; T( c6 ?' q7 h+ bstatic int MCBSP_MAJOR=239;
1 ?3 g- d' U; q7 x) }4 B+ Wstatic int MCBSP_MINOR=0;8 L$ T( x& p* t$ W( I. I. j8 q
static int count =1;
) V8 x8 G+ E+ N1 V
1 S0 ?3 S5 ~0 j/ y, ]" I. p#define MCBSP_NAME  "MCBSP-device"
' X, ^7 N* P+ q, q2 u" H, ?* s! Y5 @: }
static struct cdev *mcbsp_cdev;& p* ^6 g! `; v& O7 e1 D) G! I+ C
static struct class *mcbsp_class;4 @# Z% ^% P& |! D6 b. F
static dev_t mcbsp_dev;' V, _. K+ G, X( [2 u
unsigned int DRR_data;
; m+ x4 S/ j- h1 n, J$ J* punsigned int DXR_data;3 M+ y1 c. {0 {9 n0 ~- Y
static int mcbsp_open(struct inode *inode,struct file *file)6 g, J, L2 ^, x. `" ^
{+ ^; B3 V2 m% @# ]* ^
   ! E# o9 Q- Q2 ?: K1 R  U: X
   //interrupt enable,initialized, ?0 K: f9 \/ s6 l/ K# Q
   unsigned int temp;# R0 F9 s; Z+ O9 j2 U
   //SLEEP_EN(GPIO8[10])---05 z0 \; j( o, ]/ U2 ^2 P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" n6 U, p" K# e0 k
   temp=temp&(~0x00000400);) {: t% X1 ], o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, t+ Q  Z  [$ {+ @& M  //RESETn(GPIO8[8])----0----1
3 z# e, U. {! C; m   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. o0 d' k& m7 K$ k5 D. d+ z+ ~) K   temp=temp&(~0x00000100);$ N; i, w  P  }  T+ l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 o0 ]0 R/ r6 f2 m
   udelay(100);
4 A+ C& f. Y8 P) C0 m7 w! `   temp=temp| 0x00000100;0 c4 [( X9 P( K5 e/ A9 ^" K( y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( c$ X, W2 O. D6 p# M   udelay(100);1 T6 b: c4 g( Q4 i( s- J. _
   printk("open success!\n");+ G, j8 \( U: k8 {! Y5 m
   return 0;
# G; }  u8 Y. o- i4 M}1 J$ ^( J% [$ T: H$ r
$ s6 R: J# X1 |" s& u
static int mcbsp_release(struct inode *inode,struct file *file)% A, W3 C+ ]3 d
{5 A. h. Q2 A) V& o
   printk("release success!\n");
1 Q' B4 p" W0 o; S5 K. r   return 0;3 T* g1 @# ?$ y$ U' o$ T
}4 y3 e. v+ v) h
: w" G7 S2 D4 F# V! F% d
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* S1 o; I, ~. S' y4 [9 N& L
{
8 L; u0 T4 u/ w- W$ \3 H    copy_from_user(&DXR_data,buf,len);$ ]" v3 s4 d4 C0 ], n( G: x  M
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) O: L, m3 t0 [' I/ ~+ d    return 0;* [5 k$ }1 ]0 u; M9 y; B% ?

+ J& O/ X8 v. e1 R1 j}( l1 M  ^) P. H9 b' a9 _

8 F5 K2 ]6 W# v5 t7 Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 R! j( S$ G  M- v) t
{
" d& p4 J6 t/ ?/ i9 a   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( s$ F& o& Q9 X9 w& }
   copy_to_user(buf,&DRR_data,len); - N5 x+ q1 D9 R- V" U1 j$ \5 ?
   return 0;
+ E5 A9 H3 {" l9 P: V( i}
# {! y" a' j2 w3 H
% S/ a" n. I+ I# y5 l+ _
; x  ^# h8 {$ f0 i  s) z0 kstatic struct  file_operations mcbsp_fops=
, N  R) z: a" B4 P$ s{$ ~* o+ g/ v4 S: [! I: `& N
   .owner=THIS_MODULE,$ q- ]' P! X% p% t9 R
   .open=mcbsp_open,
$ P7 ~4 v# F& r# ]   .release=mcbsp_release,
6 {0 U7 Q1 S& s9 m) D9 g; m! L- i   .write=mcbsp_write,
; d& ^8 U4 L; |3 f/ C. t. n; M   .read=mcbsp_read,7 x& p& k/ [& i% |/ X, T* c
};' W- y- G$ n' r8 d1 u
static int __init MCBSP_init(void)
. F4 W4 S, |) j1 M$ M; w{
( t; E2 w* R5 l( @$ t6 `   int ret;
) Z. q- p! F' t" }4 s9 R( ?7 v. q   unsigned  int   PINMUX1_REG_old;
3 p7 _3 R( ]" J" {% O; I   unsigned  int   PINMUX18_REG_old;
, o7 x- j6 G7 y$ q; F$ h   unsigned  int   PINMUX19_REG_old;0 Y4 g% I' g9 A
   unsigned  int   temp;  
( v) [4 U5 n: T. Y% k$ F   if(MCBSP_MAJOR)+ W6 A) J& i; F0 q1 W( }$ L  L
   {/ |9 K* Y( @% k: _5 v
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' i* {# l- U! ]  M) p3 J
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- \- E+ }+ G8 b6 G
   }
; y& K) g5 ~+ i8 s$ p  y0 T   else9 ]3 \; B+ v& F) Z* }. ~
   {9 D& Q' ]. f" H3 H0 a
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% X6 _3 l: B& o      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ M( r6 n. G% F& P' E6 ]: l1 f
   }% u5 O. b1 z. V- ^+ m! [
   
, h# _; M1 T& r' B0 |   if(ret<0)
. R2 m$ g# a7 l8 o8 }/ E7 T/ a   {
0 u/ C( B: F% x4 E      printk(KERN_ERR "register chrdev fail!");5 m+ ?9 ]# M! i& C* T
      return -1;
' ^' V# H4 z. O& b: f" C& Y$ m4 I   }5 v* v3 M8 e* c8 [1 X- W
   
3 }; W' N6 s9 u$ H   mcbsp_cdev=cdev_alloc();
5 k, ~6 [; g+ @; j# }5 X   % X  G- K! \' c/ F: G, c4 Y% G
   if(mcbsp_cdev!=NULL)- \# D- X8 y0 A8 [9 G5 n; ]- E
   {4 O2 S6 Z1 m, T8 F9 G4 m3 T- ^' q
      cdev_init(mcbsp_cdev,&mcbsp_fops);
. e( [! y+ o' l! H0 j. v      mcbsp_cdev->ops=&mcbsp_fops;
# y- M' a! O6 s& Z8 Z6 e      mcbsp_cdev->owner=THIS_MODULE;- u2 N$ f! L: O' h! P
      
$ C. B# j( O6 [: r      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! L5 @$ _% L! }" g7 i4 q* W8 E& Z          printk(KERN_ERR "register cdev fail!");
0 X; }4 X5 c/ o! {2 T8 ]1 a* y      else
% r% ^5 S/ q- k/ z/ V          printk(KERN_ERR "register success!\n");
6 C# O! V  c, ~3 Y6 f   }
2 i( `4 D6 m; T. C" @   else, \% \9 ?+ K0 M; z
   {
% K# |1 i5 L4 L# v) \      printk(KERN_ERR "register cdev err!");) Y5 Y( p1 l: a; x
      return -1;
. ]+ \1 [+ ^7 }# w1 @   }
# o) N1 {' R" x! f) o% ]4 Z' ^   / t& ^% N+ N$ j+ j1 b8 A5 I
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 b# A6 y3 A: e
   if(IS_ERR(mcbsp_class))! T* g1 c0 L2 v. ^
   {0 t( Z* W3 [/ `; N  n* o
      printk(KERN_ERR "register class err!");2 {) C+ A3 R* Z
   return -1;
) W, E3 v$ v0 P6 U5 f7 U   }
0 F: c4 K6 V, ]4 Y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( H9 {8 U8 N% G0 Z- U  p
* g, U( U+ E6 ^; m5 E3 I   //PSC
  l# C& W3 u" [5 Q7 ?   //add Enable MCBSP: o' a" H  G* c
   //test! G+ _- H' l+ e
   temp = 0x80000003;
7 A: R) n: k7 i   writel(temp, IO_ADDRESS(MDCTL15_ADDR));) s" |0 T, E4 r) r5 U; s. n: e
   temp = 0x00000003;
. |- b) c* V& W+ t/ }   writel(temp, IO_ADDRESS(PTCMD_ADDR));5 V  l! b: V. v+ m- z

- y- \1 \! V& Q# |, y4 D   temp = 0x001FF201;* E; X4 V$ B. R" u6 z. T
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 g& X6 v4 h; w, l   
# U2 _# F% K0 Y# O( f   //PINMUX  . W9 U$ w3 m# `% I, z) L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 r3 g% Q0 A9 L9 {6 X) u8 d
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
' X0 _4 Z6 X$ @! C/ x" L  I; Z   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 _- s) d- U6 w5 d5 p: j   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! m+ ?) C* O" [& ?3 ~   
  }4 P2 B* Q& C+ a   //SLEEP_EN,EPR,L138_SHK1,L138_RC
% [" }: r' e3 h  A   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  0 K6 M% u& i3 u4 X% _4 m8 I( A5 [
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
9 Q8 J) ^" ]8 O   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% w& d% o3 K6 A2 a% P( A9 n* c
0 ~  r. ~; z9 @1 T' H% w7 n1 d   //RESETn,L138_SHK21 J' e4 H7 O' T2 S
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 A4 [, k" Z! _
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
+ Q/ o" |4 r0 |, Q% }   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& L# K; Z" {* T% @' C, D, e9 q; V9 H
0 f' E; E, M4 i- w& d! V6 u- l* i
- A* @) r, D2 k# v8 a6 H8 Z9 r1 d
  //SPCR Register
+ q% x' I+ a' j  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ t4 b- E8 y1 A8 ]  temp = 0x03000000;//(DLB=0)
6 H9 w* b4 v& J2 k8 t6 q/ G // temp = 0x03008000;//(DLB=1)) N2 N5 C! `  \+ J5 H( v- d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 M1 H+ Y' b( M6 J0 h
  temp = readl(IO_ADDRESS(SPCR_ADDR));) C' e: ~$ e6 w) S
  printk("temp=%x\n",temp);/ x8 |/ {: V( s3 H) y$ ?( A
) _2 N0 c2 A3 D, l" q
   //PCR Register
  `# R, T9 Z" d  \* n- U  W   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 _5 @: p( \, `* a  // temp = 0x00000F0F;
! g; Y5 r# b- H" x  temp = 0x00000B0F;1 Z( ~* ]& L' @- n% O8 R, @
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 6 i; R& O7 R, `- J" G& q# I7 ^
  temp = readl(IO_ADDRESS(PCR_ADDR));' y* l. f- F$ m6 V
  printk("temp=%x\n",temp);  
, D5 \( T' D) C6 `  ~1 U+ x( M   //SRGR Register
% M/ L  w% V5 x! U   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- G4 `5 b$ q% B; Z
//temp = 0x301F000B;
* Y3 \: H; G( [  [# K: [" s   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
% x* r9 o2 P9 t3 b( Z; Y# f  temp = readl(IO_ADDRESS(SRGR_ADDR));8 j0 E$ u% F) k; o0 C
  printk("temp=%x\n",temp);" O. ~* w: y6 Y+ W) x/ x) U
   //RCR: n4 }- g3 m  j  U/ ~4 V
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' I" F& T; a& I# ?4 w( j# \( Z6 P. h
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& N" `3 B) L& E/ r5 P
   temp = 0x00440040;
* H0 V$ |7 O6 G7 Z; _3 `2 _. ^   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) I' r$ L# R. z1 h- p: n
   temp = readl(IO_ADDRESS(RCR_ADDR));
$ f* K; N1 b1 t: s) Q   printk("temp=%x\n",temp);
, I0 m" G9 n% x& |  }% z   //XCR9 t% v4 A" s5 t" h3 r- X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) K# A* e* w, E" t: C! v# ^, R" ^
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) M& W* f" T& K+ X$ t8 `% j, G4 P
   temp = 0x00440040;
. p1 c6 a4 W/ z" K* e' |   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
& n& w% j( t0 J) Y   temp = readl(IO_ADDRESS(XCR_ADDR));
5 W) ^' L9 I7 L7 p' X* k   printk("temp=%x\n",temp);, `  _- [/ u, ?( g
  udelay(100);" f$ S1 K3 V" e; s. X0 I4 f. [
  //SPCR Register9 b3 u2 D; V' D" E
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 r7 m+ g7 D' u& @# D  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( {! @# w" B7 p. }- v9 W3 R  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled4 E1 L5 f9 A$ n1 F
  temp = readl(IO_ADDRESS(SPCR_ADDR));* e) Z- g( R& c/ P6 Q3 F9 t* }
  printk("temp=%x\n",temp);
0 s; F$ _3 ]5 @4 V( _  A, O7 q  udelay(100);. ^! a! H% X8 o* d+ `
4 [& t) Z$ W" l6 X. I
  //set GPIO direction
1 v9 w7 o' B8 u6 @   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
1 K( Q& r2 ?0 O/ E" ~! T( R/ \   temp = temp | 0x00000100;//EPR----input
3 w' D1 w+ {2 O1 g* W% q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& e3 `" P5 \. J$ ]   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. w: {( g. K% n 3 _* Z7 f8 h2 @  v
   return 0;
9 Z3 t7 D5 K5 G, t; ^0 n8 e" L}
& x! Z0 ]9 n( c+ Dstatic void __exit MCBSP_exit(void)3 u" o- ?6 w# ]( N2 ^+ u1 R8 d
{
5 U, `! R/ y6 ]0 ?   printk("mcbsp chrdev exit!\n");# w* o4 x; G8 H3 d# y  w5 c2 q
   cdev_del(mcbsp_cdev);5 A# @4 z2 s5 k
   unregister_chrdev_region(mcbsp_dev,count);7 U& d5 [" O1 e5 \$ p" e% D
   device_destroy(mcbsp_class,mcbsp_dev);/ j& l- `' P% J8 z/ ~* O& i; a
   class_destroy(mcbsp_class);
6 M% _7 {# |" P# q0 d: o! Y7 g% e}+ f& E  R/ N- v& _* ?& Y' M6 G( y/ `% ]/ D
module_init(MCBSP_init);
# \4 P0 j% B# W6 K5 U) G/ z6 b% gmodule_exit(MCBSP_exit);
) n* e2 y4 `. m8 j* O/ w" x# t; C- P
8 V4 _8 G# N2 s* ^* hMODULE_LICENSE("GPL");' s& `+ L6 i& b8 {$ @  f- o
, C" y+ i+ C* ^: p+ {
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) M$ @( p( f* v9 {% D$ ^1 g
我的应用层的测试程序如下
/ o7 W3 g3 o3 [#include <stdio.h>5 e$ b' A) o9 N5 g
#include <string.h>
6 b/ R5 T6 |- w' ]#include <fcntl.h>+ t  ]; U, Q2 y, Q& x' P
#include <unistd.h>
& `2 O& w* S* k$ F1 S0 Q2 Z. K#include <signal.h>+ W# L3 E( x, S( i" j# V6 M" w
#include <pthread.h>       //线程' t4 r$ V6 w+ {' S$ F! R
#include <stdlib.h>4 U, Z4 O2 ?4 h3 U4 |
#include <pcap.h>          //捕获网口数据
" {% w+ e( L. X1 @#include <semaphore.h>     //信号
" z4 S' `6 M* W9 _3 K#include <sys/types.h>     //消息对列' q4 W4 q( d  S1 h( ?
#include <sys/ipc.h>       //消息队列( r1 r+ ]* H2 \9 X5 w
#include <sys/msg.h>       //消息队列/ t& n9 L' W, ?" ^- J
#include <sys/select.h>
' k  m: r* L! u#include <sys/syscall.h>6 A& i9 {+ f; ^7 ?+ K5 x: \
#include <sys/stat.h>
# N- u8 b7 ?7 f( X! [& ~, a#include <sys/mman.h>
- T9 ^, I9 M) @( V; k$ E( x: U* y1 U#define msleep(x) usleep(1000*x)7 B2 o' N9 V  D2 b
) I7 a- }% ^5 S9 H
int main()' s7 R2 ?4 b$ A0 b
{ 6 i3 [4 o. P, o, y" O1 M, m
    //MCBSP,ARM与AMBE2000交互设备/ |1 o0 v5 P, g+ A
int fd;" \7 ~8 _! ?$ I$ R; k! G
unsigned short data_write = 0x5555;3 p' K8 g8 l; o5 H! M3 Z
unsigned short data_read = 0x00;
/ B' A3 g' a3 \1 M  s; t% v  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" ~! K( R, |5 p& r! g
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ q8 n7 K1 [0 r, u, Q5 m   
+ ?& M: ?* r; ^! i6 w2 R( N7 N. n" F% C) w  if(fd < 0)
$ G1 ~9 j1 M0 g4 O  {! z, M9 Q; O" S  A& |
     perror("open failed\n");! i, d5 \: j, s# c
     return -1;2 N1 C% O% U  K9 V/ Q2 s: U
  }
9 f4 f6 X: V! u8 v/ O  % I5 E2 k2 K* K- o6 V
  while(1)* ^& \% f8 o# W0 i' m% G3 p4 X
  {' K  U' T/ e$ |9 ^$ q
   
* |8 J  a. s  A) o. b( @   //AMBE2000每次读写是24个字为一帧) e/ _  y0 `( F- Q+ `9 w
   //写数据时将数据在底层存储起来,等到中断的时候再发送
. W/ V% ?& M! Z7 a; ?9 J7 d   //AMBE2000输入数据是以0x13EC开头的* e4 a, p2 K0 V# w  P" U
   write(fd,&data_write,sizeof(unsigned short));6 ?9 L( t" V* n1 B1 d  O  L9 B. \
   
% G% s  h/ B) M7 M' X8 w   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  . g* h3 W& T2 C6 \2 F1 p+ b* w0 T
   read(fd,&data_read,sizeof(unsigned short));8 {$ }3 P' F$ V) e
   $ s8 G, O5 n. P9 w5 L
   if(data_read == 0x13Ec)
5 [8 p) W6 n6 a* s/ f   {
2 \# v$ @3 E; Z- W) r+ g* r1 w4 e   
6 w3 t. E& B. [    printf("data_read = %x\n",data_read);% E: H3 q: @$ K1 D  o
   }
7 U; e/ T% \, o% Z5 w9 L   . R3 c% J' G2 S7 |: x3 ~
   msleep(10);
8 V0 t5 E! t8 m; k& A- Z( Q  
: J3 n  M, S0 ~. a7 P( q6 i0 H  /*# A7 m! f- w' ?
   ioctl(fd,1);   
  j5 M0 @( E1 V1 X4 D7 a sleep(1);8 F, l8 n; E! T" e% B- s
ioctl(fd,0);
. Q& d$ Q- \; x% F/ ^ sleep(1);1 C! X$ ?/ t% f1 z/ s
*/
0 q7 Y4 X/ w  S% \+ z$ ?! d* l  }   7 O/ J* r8 ^+ @$ _+ R( \7 E1 h8 v
return 0;# e: ~+ ^* ~: j! L! v0 W5 i0 Z, C, h

0 N' d6 G2 A6 H+ p  R; W. L}
# i' M8 g5 l/ t7 v! b
8 G4 m9 O- r# S8 ^. T4 i多谢各位指教,谢谢! 急
# z9 f1 A. w$ {! p+ R: T9 q5 x; A

0 H! f* }4 ?* @9 N6 c/ Q" j6 H- ]; N' Q; y; I5 ?3 c5 G$ e

% C  G  g) x' z& ]$ J
3 t; M# N1 a3 b" C8 D5 z- y2 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-7 21:09 , Processed in 0.041267 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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