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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ b; e$ Q* }  l/ }; {6 b
/*
  e7 k- \2 w& f* o * Copyright (C) 2009 Texas Instruments Inc+ D3 f; u  C* Y  s5 O5 `
*9 \5 P8 T& E: U; U; V4 |( r
* This program is free software; you can redistribute it and/or modify
" q( }! \8 p9 b, \* R * it under the terms of the GNU General Public License as published by
' N. c) ]* v# O( {+ ?8 T * the Free Software Foundation; either version 2 of the License, or
' `7 ?. R$ h1 O; y8 u, K/ { * (at your option)any later version.
8 L3 |0 O; P( H/ Z *
! {4 N0 j- w; X * This program is distributed in the hope that it will be useful,. P' ?2 J' p# o0 g9 n3 j5 T% R6 B
* but WITHOUT ANY WARRANTY; without even the implied warranty of0 O  I4 I" E5 q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# I  l& ]( X* v, h; _; M
* GNU General Public License for more details.! Y# P  C0 b( H0 M2 P( }
*5 B8 Y7 H  T+ x# M& `% p6 j
* You should have received a copy of the GNU General Public License$ `( O2 V1 D, G' I2 r1 W: k% t
* along with this program; if not, write to the Free Software) Q" D, J) j$ j# l% @& }
* Foundati- }5 S% e7 f" o) }
*/3 ?! ?4 ?& S7 o. W; Y4 h, f
#include <linux/module.h>
# Q! I8 [8 A2 o; _#include <linux/init.h>
3 n0 T% f, Y& l6 v+ t' Z: L#include <linux/errno.h>
% A: [' H; ?% k0 B/ p#include <linux/types.h>
2 g& r  ^5 x5 c3 L' U- P#include <linux/interrupt.h>2 e" W( Z) _% G. z
#include <linux/io.h>
- f9 K5 M8 P5 E: C  t6 |#include <linux/sysctl.h>
3 `6 `, W7 Q/ r$ e4 O- e0 q#include <linux/mm.h>
4 e5 y6 Y1 d7 q3 i6 r* x#include <linux/delay.h>% ^% k5 f0 j( _% x
#include<linux/kernel.h>5 w+ C( M! h1 b. w/ c" c
#include<linux/fs.h>
, U! G6 d& ?, P; X9 X  K#include<linux/ioctl.h>
4 e/ ~+ M3 u5 g6 d  W2 i#include<linux/cdev.h>
; W. I2 t( O' p, j1 R5 U4 a#include<linux/kdev_t.h>! K* _5 R/ e+ V9 m, C
#include<linux/gpio.h>- P: n& o' g8 P! Y
#include <mach/hardware.h>
8 U6 m! s' Z! M3 e#include <mach/irqs.h>
. z* `8 j; A9 N) m3 B' O3 ?$ L% ^# _( K! q
#include <asm/mach-types.h>* P$ D, ^% n# M. D. z2 s
#include <asm/mach/arch.h>
& f* h5 e" B+ c#include <mach/da8xx.h>
$ a2 N7 r3 y7 R9 h+ y8 `5 F% ^#define  SYSCFG_BASE   0x01c14000
$ N' j; l: U1 n& m# M1 J& p#define  PINMUX1_OFFSET   0x124 2 `  y$ x3 K! h  ^
#define  PINMUX18_OFFSET  0x168
; f* _1 s  f) x0 }#define  PINMUX19_OFFSET  0x16c
! k* n" G. d2 C& t#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR, E3 r; g7 w% P. g9 E) b
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 w! X: X+ |) g
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR( {+ R8 G. a( F
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR, E$ N, R0 h5 a$ P0 r& S
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ `/ {) z' D/ x4 L. x4 B                           
& f7 e. q: |! }  |# w" ]# e#define DXR_ADDR      0x01D11004  //MCBSP1_DXR3 L5 Q6 A2 Y: P4 S
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" U0 Z4 g3 j8 P- x- i8 x# O, T
//PSC- Z9 S3 ^5 e5 A) F* n
#define  PTCMD_ADDR   0x01E27120  
. m3 M  w4 ^+ U8 F#define  MDCTL15_ADDR 0x01E27A3C
) d6 \- k8 g! {# N#define  PDCTL1_ADDR  0x01E27304
% ?5 }( {+ ^$ }! |  G//GPIO8 direction) @) s1 p6 e1 y1 z; S4 T
#define GPIO8_DIRECT  0x01E260B0! g; R0 I3 f9 [" g  A: E! U5 Q: l4 R
#define GPIO8_OUT     0x01E260B4
  |8 W+ u0 L( W' \) _#define GPIO8_IN     0x01E260C0
+ h3 j! a4 g: S4 M5 e, ?# A, J3 b# a4 m
  `9 A. }$ P3 ~//#define MCBSP1_RINT    99              5 m; Q% M( n7 `6 N
//#define MCBSP1_XINT    100  5 O- u) Y1 ]4 O0 x! H, ]- K
static int MCBSP_MAJOR=239;" s; r6 Y0 |' U! v' y" D' n
static int MCBSP_MINOR=0;
+ b: f1 |& w5 h( I0 ~static int count =1;
" c, @) q! |/ k! U+ y* i2 Q# g/ Y( D
#define MCBSP_NAME  "MCBSP-device"( P5 w% W; i  H, ?$ i
6 _* J: ~2 l+ _( U
static struct cdev *mcbsp_cdev;
( b! z7 g3 B8 W& |! S% mstatic struct class *mcbsp_class;0 w+ Q; Y- S3 K+ {7 F. C
static dev_t mcbsp_dev;( z% w2 E' Y3 x' R! @% q" g
unsigned int DRR_data;
! [0 p/ x: [# `) E( Q9 ~unsigned int DXR_data;
* i# i' C/ H) g% ]2 |% ^9 e7 rstatic int mcbsp_open(struct inode *inode,struct file *file)2 |  \  V. }# g
{1 N( d( y5 s: r; x/ W2 A1 E
   ( u6 c$ o! M' H6 ~. L7 M6 S
   //interrupt enable,initialized
- Z: `  c, r2 W1 A; l' E! }   unsigned int temp;5 B3 m, Y1 w5 H7 V# o5 H
   //SLEEP_EN(GPIO8[10])---0  {5 k. s& _8 t7 V- L9 ^* r
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" }& q  ^+ q5 N5 a% b, F   temp=temp&(~0x00000400);
2 I5 }: H) a: u2 i% d   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% q9 h* Q1 J6 P" B' ]3 }8 A# ~  //RESETn(GPIO8[8])----0----12 |/ y7 z* Z/ x7 v5 v9 `
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 Q9 M& G. R  D4 d3 Y   temp=temp&(~0x00000100);0 o! {* J- l" H" @" V8 S: F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 F* O2 B2 `0 |" t: q/ S( h
   udelay(100);# q- ~% M* u2 t: b% }/ F1 I" M
   temp=temp| 0x00000100;+ |0 C* R1 C4 J3 k- A5 }
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" N$ P$ ]3 E+ ^9 u/ e! S$ y
   udelay(100);
% l5 Y0 z, a! ~* `" ^1 O/ _" T   printk("open success!\n");
  f" f' p0 y) }3 ?6 q   return 0;
+ m1 r* {  c; Z. O$ t}
* J6 _, e- K: i/ f  D( }; R8 o1 b4 ~2 i% a) B/ w
static int mcbsp_release(struct inode *inode,struct file *file)
0 }" B9 `/ O5 P+ k{
' I, n4 j4 ]9 D9 l" S8 S9 }) y   printk("release success!\n");
' @- l, y% t  [. z5 \4 d   return 0;+ D% b8 f9 X, d. C  |( t6 Q$ b' F
}: ]# Y  y# e/ @5 h/ L, K1 t
0 j& R/ d; e, U( ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. P/ F+ Z3 Q$ ?: Q1 Q{  E% v+ d. [' K' N4 x
    copy_from_user(&DXR_data,buf,len);4 i* i' \- e9 N$ M* s
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
+ ^. y: H  j. N: s6 r6 G9 i    return 0;/ W  |; s2 s: b) ]/ `. U6 N

& U. e. L% W7 i. e5 d/ F* V+ j2 A* W}) D0 y- E. O0 P8 M) D- a
: J& I- u! Y" U  O! u8 |
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ _& [4 D  x- a: H; h! ^{ 3 j% f9 r2 w4 q( {4 _
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));7 Z/ {7 f! r+ \3 u8 I, c
   copy_to_user(buf,&DRR_data,len); * M# U8 N6 |5 [; _0 [
   return 0;% Y1 j. q6 y8 D$ b
}2 x9 u- N& q) Q3 S2 ~3 K

$ }, t0 f3 `1 w1 ?# N
( H* q1 p6 u" v7 a6 z- L" J3 lstatic struct  file_operations mcbsp_fops=" Z7 u8 v1 x9 |2 v1 `" _+ Q( B$ Q
{+ W6 O1 s0 G- H& T
   .owner=THIS_MODULE,6 N! A8 G8 t* K$ j4 V
   .open=mcbsp_open,& Z7 f* g7 m: I- z+ O, D
   .release=mcbsp_release,% v5 Y, d5 w1 w$ Y9 i2 d% |
   .write=mcbsp_write,
! c; d4 S2 q* o4 x; e# B" h   .read=mcbsp_read,
0 w& {$ a# F( n& S7 O$ k};& W; b1 O# R4 p/ Y
static int __init MCBSP_init(void)# y0 b- f5 w  j2 M
{6 s2 y6 O: d1 I: \5 i# v
   int ret;
8 H2 q8 q& D! s( v( \2 q3 m   unsigned  int   PINMUX1_REG_old;% u' Y. O7 ?$ o& H' t0 j. a+ A$ {
   unsigned  int   PINMUX18_REG_old;
: [0 \( p- u4 d0 x. a+ h   unsigned  int   PINMUX19_REG_old;
6 Q: o" z$ W& @   unsigned  int   temp;  6 a0 d: s0 N% P* F4 m
   if(MCBSP_MAJOR)
4 ~& R  Y; N5 w0 a% D- c   {
! W% P9 n7 K) R! O4 p      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& p! \: ^! y# B4 z/ R* J
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& n5 I8 c, W8 F$ c6 y1 E  r   }
' w4 q5 F% ~, s$ i   else! C) u0 j' ]7 A2 z
   {( {( f/ j3 \+ O0 N) J8 n
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 c  {9 V! M, z# u$ i
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# b6 V& {/ U. U# _# N; }
   }" K! U1 _1 n. g. |& x7 O
   
& L9 G2 k( i  m- C* S5 E9 K1 d( s   if(ret<0)& b& s9 i2 \3 k7 \- d
   {
$ G( x$ t2 [4 Q0 `. m1 \9 x      printk(KERN_ERR "register chrdev fail!");
' H( S1 c; U5 P; D      return -1;1 _, [9 B" Y: E# D% m
   }; Y5 o. D, t  j' T6 ~* Z- @$ X
   9 {# U% c- r  X& z
   mcbsp_cdev=cdev_alloc();' T4 C( Y8 j( M2 }' Q7 b: h6 R
   ( u8 w, u# n) [; E8 |
   if(mcbsp_cdev!=NULL)8 [: e, Q/ R, B, m1 q
   {
* z: ]6 x  V4 I# Q8 q: P      cdev_init(mcbsp_cdev,&mcbsp_fops);9 U7 z( @; O4 C+ X
      mcbsp_cdev->ops=&mcbsp_fops;; s8 {. k' f% D
      mcbsp_cdev->owner=THIS_MODULE;2 D( B/ @2 M  w, ?% A+ @
      
3 u5 k# e' N* S      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
6 h, G, Q+ Y# J6 ]" ]# a          printk(KERN_ERR "register cdev fail!");- J1 {. i; O) `9 B# f
      else( r. M" t' d& y9 b5 M" \4 i
          printk(KERN_ERR "register success!\n");
- e1 X6 D: y# s, ~" s* }' ^   }! O8 Q; }5 E/ n! p6 e; U) z
   else
( e$ d" _! B+ R6 n3 M6 o: E   {, ~5 q1 k6 q: u. U1 m
      printk(KERN_ERR "register cdev err!");) t9 u% h8 `, M( C/ @% U1 n
      return -1;8 K. {/ ~* j! F  O  h9 ]" q  }
   }4 D7 S9 `5 P  I9 t; |
   
  S/ A& t% x  ~- K% b% z2 q  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& J, `  U+ Q& Z6 u/ J% _7 m3 D3 n, F
   if(IS_ERR(mcbsp_class))( P+ H5 `7 J1 w. h8 m
   {
; x2 S; B) M( ~. L& |- N! d      printk(KERN_ERR "register class err!");
, V; S& T- G. k5 _6 G1 Z2 L   return -1;
% ]: R: J* H) B( w   }$ t  K) }" Q4 ~" X
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);% C- }; |, y( c

* `- o4 w2 |( L# P* I   //PSC
& p  O" o. v0 O: B   //add Enable MCBSP
" s! x8 J' N% @! w, r& y) G0 N0 A5 F   //test* l# D+ _9 ^7 n1 S- _- a  ?
   temp = 0x80000003;
! ~5 s  E7 |% ^7 x' x   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ Y* q2 S+ F& D1 a0 h   temp = 0x00000003;9 J# P. C" @8 N. W. g
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 d1 w" L/ n5 ], ~3 j3 j
$ X% L% z$ |& H2 Q% k( @# W  J$ z4 p   temp = 0x001FF201;0 A$ i$ c, s# X) E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 o( z$ g; z8 X: Y+ Z& B   
/ S' h; D7 b6 K! J+ L$ ^% S% h/ x   //PINMUX  
+ u- F3 S& G8 w6 @! Z   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- J! Z4 z3 r8 Y* ~. I. @, `   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ! y, _0 O  T3 C! U, I. L. y! e
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   3 v' p2 G! \6 K$ {1 d: I( X  @7 I$ C
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 T6 E' m/ i' b! A4 T   8 k" u9 T3 i1 M& u/ a1 H2 y) l
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 l* B! j! r0 H9 n$ e4 v- c8 D. \
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  * F- B. R3 w+ |2 [
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   + k& X' k1 N8 ~2 g, i9 @& ]
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ @' F. s( K: C, m% ^

6 f5 @3 A; j; @. \; ]5 n1 V9 d   //RESETn,L138_SHK2
/ e# {8 @% r+ M   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
" U( k% Z& b- @8 B* F   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 a9 O5 m. ~. M% M   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);* K- b3 V% n7 x
, n3 P8 E" D6 q& Y# j
" Q5 P9 |& J5 Z
  //SPCR Register0 ]' s2 B$ ~3 c4 A; B
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset7 S/ i% q+ o- u+ o
  temp = 0x03000000;//(DLB=0), L& s+ x( W" w' m  J: i+ n- x+ d
// temp = 0x03008000;//(DLB=1)
6 ~5 ^/ ]* h: f! ?5 X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
9 O# i1 e) `. q0 Q) ~# p# ?  temp = readl(IO_ADDRESS(SPCR_ADDR));0 V8 w3 r6 x, m6 L2 r# G
  printk("temp=%x\n",temp);
2 r5 V$ p  \7 {& k
+ C5 D4 B  B5 m1 x% }   //PCR Register8 P) g6 g1 G; a
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ E5 I9 y1 _! V2 y8 X: f5 s& W
  // temp = 0x00000F0F;
2 R3 S" M$ ^3 \5 c, Z  temp = 0x00000B0F;' r7 M) ?. v" {+ \
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
  h: I" P7 b- S- t6 s+ s  i9 G  temp = readl(IO_ADDRESS(PCR_ADDR));% _& p5 L7 `, l+ N# g
  printk("temp=%x\n",temp);  
! x5 L0 ^) X3 m+ e8 Q  b   //SRGR Register3 C) f  K+ m4 z1 n% I, h  }
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 E. d$ A4 Z6 U( h
//temp = 0x301F000B;! X( O( B+ ~7 G  d, T: q
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
' H4 m, w$ o1 _/ L5 S: A& H  temp = readl(IO_ADDRESS(SRGR_ADDR));
" `% {6 Y  o6 r( P: l  printk("temp=%x\n",temp);
# n! ?  I( Q9 z2 i6 T4 s: w3 N   //RCR3 `' h( K8 \# @+ J  |( x
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 K8 L) c0 j1 p1 a. i
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 Z: e& b3 ~# r7 ?' b7 ~   temp = 0x00440040;
. V+ A& Z, D9 U$ l" K5 j( Z; N   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) K5 L8 m( }7 n5 Y. Z# P   temp = readl(IO_ADDRESS(RCR_ADDR));
9 t& i! l4 h$ b- j4 V/ \4 p   printk("temp=%x\n",temp);' J, G! F) i4 s. w9 R) r; w+ I
   //XCR
0 u3 B+ l) p0 c! u- l. b+ p   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 J9 K* c. A2 C9 N: S; `  {/ i   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& ?+ Z: Y" d8 E; ]1 h( d' E   temp = 0x00440040;
6 }& g, m$ a: c! t8 ~) S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# r6 W. N; p* u/ U   temp = readl(IO_ADDRESS(XCR_ADDR));
* J! W- Q) {* K/ R- n1 ^   printk("temp=%x\n",temp);& M0 Y& ?: }. u7 w& l( [5 g9 g/ X' O
  udelay(100);
3 _8 \* C5 H% R* v0 j9 L$ G/ D  //SPCR Register" @+ g0 I- w- M. g# s
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ [  }- p: |/ {  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, V  z" Q8 F) l  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
$ n. q: f$ j. ~, T7 T6 O9 S  temp = readl(IO_ADDRESS(SPCR_ADDR));& \" m1 U* i1 y, h: M, x7 ^
  printk("temp=%x\n",temp);! V! j3 P8 C' n) v
  udelay(100);
+ f" P6 L5 Z1 r! W( A$ @( u
7 @8 H7 x! [5 n5 {  //set GPIO direction
2 Z% a8 Q& Y1 B3 e$ {4 [# y* J- a   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& S+ y- V  A! I) K# X   temp = temp | 0x00000100;//EPR----input9 x) G% f  Y1 G8 F5 s1 L/ d& u
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; F" u% i" a! @* S- ?( @5 _   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) o2 F3 C1 `* |
6 M$ d2 i6 f! J' h% x- d
   return 0;
0 A: O0 k' N! o2 L" v1 t}" z! A' {: g: n
static void __exit MCBSP_exit(void)% u4 P* @) v# b, T" _
{
$ i3 O; _; P1 e4 o; s; k5 h" T1 Q9 y   printk("mcbsp chrdev exit!\n");* w$ l! ]5 G# K: a$ M- V$ ?  i
   cdev_del(mcbsp_cdev);2 E$ T- x8 w1 t( w# I
   unregister_chrdev_region(mcbsp_dev,count);
# U+ K" Y) ]+ \- {9 b$ G, A2 M   device_destroy(mcbsp_class,mcbsp_dev);) X( l: p8 F% H7 g! x( J7 |" {
   class_destroy(mcbsp_class);
  d, S% W8 u8 ]2 X: y9 ?' T* _8 w9 Q}+ T3 ~. [  a3 q
module_init(MCBSP_init);1 d* {5 J+ \9 `, g7 S9 l9 }
module_exit(MCBSP_exit);
% r: v$ F4 A* t7 S5 ?3 w; g  z6 L2 M
MODULE_LICENSE("GPL");
+ d1 [+ q  n& v+ E; B1 _0 T
5 a5 ^& @) q% m' k+ c我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 @0 X! J0 h" I9 J+ _2 N
我的应用层的测试程序如下: U; O0 C  ~) B- i' K" l( V
#include <stdio.h>
! q% u. \( A$ H( A6 r( Z! T#include <string.h>
1 L: ], T3 n  \; y6 }/ i' i#include <fcntl.h>
5 z9 _" C& M  t+ H3 K: T#include <unistd.h>
4 e/ P/ C. |/ D, C' ^9 u2 I7 b#include <signal.h>
: X+ g+ Q1 h# L# y0 z#include <pthread.h>       //线程
3 \# s9 |- R; P6 m) r: e1 j8 G#include <stdlib.h>: K/ _& ^4 }; A1 g
#include <pcap.h>          //捕获网口数据0 j$ {  f5 L  g; |- I
#include <semaphore.h>     //信号
- }* G# F0 g* P9 @4 F6 J#include <sys/types.h>     //消息对列, u% L9 w) p6 k5 J8 k: {
#include <sys/ipc.h>       //消息队列3 `& d4 N7 y( y9 D# V4 r2 ^
#include <sys/msg.h>       //消息队列# [& n0 F* E9 D- p7 {2 U6 x9 H
#include <sys/select.h>
& p) g3 H4 w: A2 z; k#include <sys/syscall.h>
8 ]' n: ]6 ]* x5 b. S' J#include <sys/stat.h>
: W6 n3 N+ }- b: y/ @' I#include <sys/mman.h>
& V+ y' ]7 {* q" w) k#define msleep(x) usleep(1000*x)/ M) M2 F; d& b) m  f
( M9 a5 H1 a% D$ h& a+ T+ e: E
int main(). k" R' G! j+ Y5 d- G
{ ( S" E- x, I' h; o8 v
    //MCBSP,ARM与AMBE2000交互设备2 x9 g4 Z3 m5 x& R
int fd;" ?" \$ b) g+ d" C# g% o5 N
unsigned short data_write = 0x5555;
( J9 z$ j3 k8 g8 J+ [* r unsigned short data_read = 0x00;
% M6 t, _- ^! q# J1 x! k& v  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, w2 {) _7 M$ t0 n- |+ Y8 t' { //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- Z) Y7 V) i" g; `1 F, c    9 ~5 @5 K# D( O! _& c
  if(fd < 0)
$ @% G7 g+ v2 M  {
1 k5 k0 w4 ]7 V. o7 x3 C     perror("open failed\n");
1 u( K. F" @3 s# W6 w6 i  m0 m     return -1;4 a6 c1 k* l  f/ l
  }
; C  @, S3 ~, F- R* \  + t5 y4 b, D/ s7 M3 w- x+ W
  while(1)
1 L# i8 h, M4 W6 E, |  {. G' m% t2 \- h. b* j& J
   
: n2 H/ W  o! p7 u   //AMBE2000每次读写是24个字为一帧
. v. I1 i- u- W7 A4 r4 H" g3 H   //写数据时将数据在底层存储起来,等到中断的时候再发送( p3 H! Q% R. s9 u
   //AMBE2000输入数据是以0x13EC开头的
+ ^) l) i) M* g5 L3 U& S   write(fd,&data_write,sizeof(unsigned short));/ W3 H( M8 _% ]$ ]! I
   * X5 G4 L5 N; b. Z
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
, ^( R7 i0 \8 H2 H3 `% W   read(fd,&data_read,sizeof(unsigned short));
2 }7 X2 {5 \9 N, [+ N   
9 J, Z* e! T3 |; ~) z* N' ?$ p   if(data_read == 0x13Ec)
7 a. Z7 T+ H( ~% [& e: P   {8 y3 k6 a/ g4 ~0 E
   
9 y3 V/ t$ w7 X; _. }5 y% n- E3 R    printf("data_read = %x\n",data_read);) Z+ l# S; Z) I" a( A& P. e8 N
   }
, z& q: Y/ s# c7 d$ k7 m# d   
. I+ x6 I* a2 A$ E% ~$ j   msleep(10);. G4 D) w) b' i( G5 _; }
  # {; i5 Z6 v8 [% H' H
  /*0 n: L) u- G/ i4 s! S9 h" ?
   ioctl(fd,1);   
8 I% B" u9 f. _+ S' m) } sleep(1);
  `$ s+ f+ [8 N! Q4 K  e ioctl(fd,0);
% M5 ?2 t7 y8 @2 w sleep(1);; V' |4 E' V1 j
*/ , H6 j) B# J) O. b  }: t
  }   - ~4 N0 d" r. m
return 0;
- ^3 C& ~, y6 {5 u( n3 B+ d4 N5 K
% W( P+ ?& q. @3 ?/ r2 ]}
$ F/ d5 g5 N3 e5 r
- _8 d& [: T7 I: x" H! X6 _! ]0 `- Y多谢各位指教,谢谢! 急
: M1 E  ]; K  T: u. E) x0 z5 Q2 \
# J8 u5 F$ K- a$ M

& X' e9 n  a- a# M
/ G! k9 N' g2 g# s; o/ d" D# L
6 }# K  X# R& y- \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 10:00 , Processed in 0.046371 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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