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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ h6 Y5 J" p8 d# V4 D/*
' t3 U( q2 v3 Q) z * Copyright (C) 2009 Texas Instruments Inc
8 v% a2 a) Y& d7 }+ ]# t  d *
/ v  e# |2 p* w( w( Y * This program is free software; you can redistribute it and/or modify- B2 ^9 @: M7 ?3 ?* y4 C
* it under the terms of the GNU General Public License as published by: L6 B$ c1 x" k9 s: @
* the Free Software Foundation; either version 2 of the License, or
; [+ j; @& O# m  g6 I * (at your option)any later version., L' F' D$ ]7 k# U! F" s- m
*. U8 s9 _/ g; j& R* G0 Q
* This program is distributed in the hope that it will be useful,
) B* n! t$ w3 Q: y. t5 p * but WITHOUT ANY WARRANTY; without even the implied warranty of% _7 C6 m( h; i; O4 S2 \
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 `" N! k' Q/ f# u& W * GNU General Public License for more details.
* Q- z7 [  c( I# [ *" Q7 n3 b- w3 W
* You should have received a copy of the GNU General Public License
( M+ E4 K, i/ Y  i" O * along with this program; if not, write to the Free Software' w! J4 F0 _9 q! T" \9 X. P$ i
* Foundati3 n9 z5 `1 \7 O* V
*/, S$ R/ f- p, ^# u: M; ^  T
#include <linux/module.h>& K) j/ M7 G; s% I+ y0 h# ^
#include <linux/init.h>  \% n1 K( q9 Y- @
#include <linux/errno.h>
+ g# U. |% C* Q) e% A$ Z#include <linux/types.h>
. j1 V& d- \0 t: _; ^#include <linux/interrupt.h>
! I9 B- P8 O; \  T#include <linux/io.h>
3 z; d+ |( I4 b, b9 P2 k' |( Y#include <linux/sysctl.h>
0 R" D' m( R/ k8 W0 A5 K/ W& I#include <linux/mm.h>1 n, t5 p4 E1 F4 D
#include <linux/delay.h>
/ [1 y5 `% L1 p" I9 \#include<linux/kernel.h>. G3 @& z) [, y9 u+ x. G( [# m
#include<linux/fs.h>3 C( p4 H' i4 X
#include<linux/ioctl.h>
: D/ |, A; |, t* d1 O+ ?, w5 p. b#include<linux/cdev.h># I2 f" m- U6 B
#include<linux/kdev_t.h>+ F6 \8 y9 j% H$ j2 S& [
#include<linux/gpio.h>& Z" f) o/ S1 E3 c6 _. ^. b
#include <mach/hardware.h>$ T, R5 W/ N4 F2 D6 z( ^
#include <mach/irqs.h>
# f& @8 {/ C4 |9 ~% {
% W( K0 ?& ]* K. M#include <asm/mach-types.h>
& \6 E  O' t/ A; J$ _, s#include <asm/mach/arch.h>
% F$ [* r9 _# p9 @#include <mach/da8xx.h>9 }0 S* L4 `' Y& `( ]- J# E
#define  SYSCFG_BASE   0x01c14000
" \' U$ @% h+ R& |#define  PINMUX1_OFFSET   0x124
. i( X8 C  X. a& D* ?" c, \9 [#define  PINMUX18_OFFSET  0x168
& B% r8 E* x1 i* r$ h3 {#define  PINMUX19_OFFSET  0x16c7 b, `# p4 \8 \: z
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
( V! o0 P  [: U1 y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR5 E; u& X( b8 _6 `# S7 N
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR/ ?& A/ B4 H1 s
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR& W# D! @- \$ u5 q2 q5 y# l' ^/ I
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR6 h: ~: U3 k6 o9 ?7 C* U3 N2 ~
                           
# _* T; k7 l. b2 R/ U: H#define DXR_ADDR      0x01D11004  //MCBSP1_DXR9 [( x5 e, C% B7 t
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# I6 U! c5 ]/ V8 s4 I; v//PSC4 w5 |4 |9 V  I1 q
#define  PTCMD_ADDR   0x01E27120  $ g. F: ?' n- z7 z
#define  MDCTL15_ADDR 0x01E27A3C
  Z, |, v/ d9 p0 i#define  PDCTL1_ADDR  0x01E27304
8 r; _) u% w: R1 v6 W//GPIO8 direction
: M+ w" f" m- q5 z4 h#define GPIO8_DIRECT  0x01E260B0
6 A' i0 u' v4 @/ U#define GPIO8_OUT     0x01E260B4" _# `% @+ W3 E! Y& s5 D5 w: \
#define GPIO8_IN     0x01E260C09 K5 }- n8 ^+ i" N

& [5 ]' @) H0 ~  J//#define MCBSP1_RINT    99              9 x1 F/ J" z; O; t
//#define MCBSP1_XINT    100  
- Z" m' t1 Q( C  m: J& W$ v, lstatic int MCBSP_MAJOR=239;
6 F/ }: [2 }" J) I, ^9 Zstatic int MCBSP_MINOR=0;
# I% m0 p. p5 v  L: @7 \' Nstatic int count =1;
, Z9 H; v5 @7 k4 A/ S! g' P3 c: s) K& u6 |
#define MCBSP_NAME  "MCBSP-device"" p' `: ?2 E( G
  q6 t  ]! s/ i& S
static struct cdev *mcbsp_cdev;2 x" B$ e( U) c2 P3 i: N
static struct class *mcbsp_class;$ J. Y( _; t! h+ `
static dev_t mcbsp_dev;. U2 h" W) M+ @% B! [
unsigned int DRR_data;7 b" y- ?7 I* S, W. Q3 O2 J- T* q
unsigned int DXR_data;, F- g8 v( ?: _4 P0 V
static int mcbsp_open(struct inode *inode,struct file *file)6 `$ Y, @' D4 e8 I
{
' I6 K" |( r( E  `5 X- s- ?   : e) w6 N7 ?0 ]' ^4 \$ D
   //interrupt enable,initialized$ Z( A& q/ w' H' i# W; B) t
   unsigned int temp;
" I- w) |4 \; B" C   //SLEEP_EN(GPIO8[10])---0
, t" G0 D8 x3 t0 Q3 ], m; c   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# b5 m+ N& D& C2 V( n   temp=temp&(~0x00000400);
1 i5 U2 l& E. Q  ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]+ C+ R/ C3 Y% A. G# Z- h. }( U; j5 {1 @
  //RESETn(GPIO8[8])----0----1. k) c5 O3 n$ Z$ S. I" J& |" h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. c6 Y8 F6 r) T2 t" |1 g. X- ]
   temp=temp&(~0x00000100);% m! J5 T: L, P& K
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, l1 `) X% t" i: T# F   udelay(100);/ H' T3 B, ~7 S: t$ O* P7 K
   temp=temp| 0x00000100;4 Z: r+ {' s7 g6 j! A+ ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% q" H* A7 G) {
   udelay(100);
7 A* g: |/ C1 O& i& Z, l& f  N) `   printk("open success!\n");4 A( S% u  i) t0 Y  A
   return 0;
( _4 G" }0 k- T$ x" p; O  f3 m3 ]1 D}7 O4 {6 d8 x, z1 b3 I
$ R/ w% b9 U$ @' J9 d
static int mcbsp_release(struct inode *inode,struct file *file)
2 p" q2 {0 e  h+ J{( t$ ?0 k( A/ W' i& l; u
   printk("release success!\n");
* q/ Y) P; @! s% q/ f   return 0;/ b! z* K2 V. v
}
  h3 s. q' ], Q7 k
% F9 a" r1 M0 ]! N2 F) J4 pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  O( ~) V/ r/ l* k2 L
{
8 Y) @  p0 w, ]  S    copy_from_user(&DXR_data,buf,len);
1 w* t; e5 ~% J% `    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       / i8 K0 @, `8 h6 v: @4 w+ t
    return 0;
; _- m) P# C- Q: a3 Z5 z- F 9 L  H  L1 I) @6 t  f7 P
}% w2 q' N) h* A9 q+ a- C5 @
* X0 L$ s" [3 W, a
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 b6 g$ {  A4 z. a1 \4 h0 O9 k{   \' q, A- B6 V# |4 U4 k( p
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
6 ?8 e: X% o' X3 p! `  ^   copy_to_user(buf,&DRR_data,len); 3 ^' r, M' }) J8 G, h
   return 0;
: [% b; X* M% Y- i: Q}
9 M# c3 ~! `9 Y2 s- T/ e& m# `* D: ?
: E4 k& g2 ^4 Q
static struct  file_operations mcbsp_fops=
" i( g7 d$ u6 f$ J0 {% w6 M2 I{
: H! T" {2 t+ ], q8 P' k   .owner=THIS_MODULE,7 P0 V2 e8 J% o8 s
   .open=mcbsp_open,7 S- h3 G) [4 f# m* G- n
   .release=mcbsp_release," J" i  E& c! A  k- q
   .write=mcbsp_write,
' F. x" N5 h, n- p' j4 i   .read=mcbsp_read,
: M* L3 [$ w- O3 k1 r/ K};
9 Z5 Y; b6 ^; m0 `- r1 M/ _4 g( ?5 l4 qstatic int __init MCBSP_init(void)5 l& R: c3 a; [7 ~, R
{
$ `) ^& k* M. O$ L+ t6 i1 x   int ret;
6 a1 W6 ~- x0 z# y/ z) u" e   unsigned  int   PINMUX1_REG_old;
2 `6 `. e7 T9 j1 O. i- m- P   unsigned  int   PINMUX18_REG_old;
+ n' w  F% k  [: [9 O% l   unsigned  int   PINMUX19_REG_old;
& ?9 ^& v9 S- w) ?& p. K+ E. n   unsigned  int   temp;  
( r/ U, P0 w2 {# ^$ p# Z2 J   if(MCBSP_MAJOR)+ l$ N/ {7 p+ J- p6 D8 p; N
   {
" y. m7 Z) G  b' f& U      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- u2 B0 b2 ~% ~/ ?5 r
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' [* @! S/ P4 W/ a! b7 H   }6 B6 c$ H9 O1 ], c
   else
7 u* e6 r" s2 m2 C4 E) c7 v: x5 ^# b2 L   {( Y  C7 H) g0 L* L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' a6 A, F3 @. [$ s' _+ \
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
3 B. o7 q1 ]1 E   }) h( w$ ?2 N4 ^/ ~
   
* l9 a* W) e, v0 w2 r   if(ret<0)/ S* e. U* ?. }$ N' o% i0 `2 b6 C! S8 S
   {5 F; {1 w+ ^- l5 E
      printk(KERN_ERR "register chrdev fail!");
, b3 d9 v& @0 F# |4 E      return -1;: Y& i7 }, [1 A. t
   }
) e+ `2 C% D& {/ C# l. S; {   
4 k' [: ~- Z2 C- t6 D! E" c   mcbsp_cdev=cdev_alloc();% w" z! a9 B9 r& O) q" A7 b, F
   
$ P+ w4 ?# e. C0 ~! w$ ?' ~, t   if(mcbsp_cdev!=NULL)- X# A) c  U$ F3 n, j' O2 m6 \8 v
   {
, t( q1 m, Q$ H( T8 Y      cdev_init(mcbsp_cdev,&mcbsp_fops);5 _! S- y4 Q- H9 z3 I
      mcbsp_cdev->ops=&mcbsp_fops;
* H. Z* |# K7 F8 m      mcbsp_cdev->owner=THIS_MODULE;
! |( w0 @0 E! j( F1 o9 z3 l      
! o( ~2 _# }5 T2 U) C* K0 S) c      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& M% g8 h6 d0 _, d  a6 P$ L9 _
          printk(KERN_ERR "register cdev fail!");
3 v+ G1 [/ X6 {" J1 p, `      else* S# H1 m% a, \/ c
          printk(KERN_ERR "register success!\n");
. ]3 V1 g$ Z) v% I0 j   }
& \* ^" r' G5 D' m$ ^/ v   else1 j5 H9 P) \2 T
   {: R+ f* Q4 }1 ^) u* A
      printk(KERN_ERR "register cdev err!");
0 L' p- b  s0 L3 ]: t, m      return -1;
5 r% Q, b- Y/ ^; h4 y   }
+ u+ [+ t- h3 f$ H5 ?   
. ]1 J& K, G+ d8 ^& U; j+ Q5 y' ~9 y' D9 G  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% O% T. w; G& Z6 {
   if(IS_ERR(mcbsp_class))9 `3 j5 l- k: H' t
   {
5 I* P! ]& U! x" }% n      printk(KERN_ERR "register class err!");
% E- K) @6 M$ A. Z9 n3 }* {   return -1;
  a/ i! n4 D% G  @; w$ w  g   }" u! G1 [# s* m. u2 G# F
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 n2 f+ V; m6 h8 Z( h# s$ D2 w
! _3 W2 v7 r+ V2 u2 `6 k6 i
   //PSC+ B7 m/ m9 L5 Y7 A
   //add Enable MCBSP8 a* {8 X8 V: Z
   //test3 L: f+ _4 K( m$ B) R/ z" B
   temp = 0x80000003;  l8 L* w5 S9 }7 H
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));7 m3 Y7 j) W( s) q( f# T8 u% k
   temp = 0x00000003;! `. o5 g8 [: @3 h/ E
   writel(temp, IO_ADDRESS(PTCMD_ADDR));" |2 E- ^2 c# w8 [4 U

' R6 m8 `6 u0 L) ]8 f1 z( M. m   temp = 0x001FF201;6 {5 d# G' v% A9 Q5 Y  p
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; p6 I! w5 d" K/ l5 r  x) H   
5 `* c7 K1 L! y1 B9 W   //PINMUX  
0 N# Z% m9 u* G- ?5 ?0 E/ Z% T   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 z) h5 L4 [. W
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    m3 s, e0 S8 k5 P
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
/ b9 W" {( d" `0 V: y   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 ~' }9 h) Z0 S6 q+ E$ _   
' b, i0 [' l' S2 Y   //SLEEP_EN,EPR,L138_SHK1,L138_RC
8 W# R: F6 ?; T" I1 Z5 f   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  3 `9 s$ x( g5 ~
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
  X, s8 a! c  Q2 y4 ^   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) t: A) k+ m$ R/ s0 X) X
  C* J) }- s* O" p
   //RESETn,L138_SHK2
8 x3 W3 q# k0 i9 t' I- P   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
) u+ g  `# b. j9 B; b   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
# Z1 S4 h# n5 L8 U, U7 O& t   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% y6 Z7 N2 n# R' J

3 p0 d+ K4 a" d7 h" ~   n' X1 \7 u: N6 u- J! P: M
  //SPCR Register& G& C  s+ _, S( h/ ]1 r
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 g7 C: z$ b# t; e4 m6 X  temp = 0x03000000;//(DLB=0)
1 ~* W4 T& x0 _" D // temp = 0x03008000;//(DLB=1)
8 X5 i/ ~! X6 A' D  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
2 U) ?7 C' b/ i6 i3 I  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ m8 Q5 r( l- B8 g# C7 b  printk("temp=%x\n",temp);
# f4 M* d* H/ P& {5 A% E) a8 U# y! e + Y: G6 f- P$ O9 h. w" T. g0 v/ }9 M
   //PCR Register1 V1 ^' Q$ C- E" B
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
" y4 I0 W( N: Z+ ?7 r8 I  // temp = 0x00000F0F;8 e1 ?1 v' R$ E& k0 s! T4 I
  temp = 0x00000B0F;
7 \+ J4 M, [. M$ E( Y" x" w  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized / A% o0 n' l: K- m6 v7 |
  temp = readl(IO_ADDRESS(PCR_ADDR));' ~# ~3 V; t* s' \( A, D9 h
  printk("temp=%x\n",temp);  3 v0 d2 |6 u" \) h, e) ]
   //SRGR Register$ z# Q; [* C1 _3 B/ S; G/ b0 E) F# D
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; [; K- p+ w# W+ g/ p
//temp = 0x301F000B;
  a4 I, P* b# H; `0 J4 H0 ]* W   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ Q* p5 s) Q8 n) J+ p5 Z0 X6 z  temp = readl(IO_ADDRESS(SRGR_ADDR));% w5 B6 R! l' U6 Y2 J% t/ ]8 k% A. N
  printk("temp=%x\n",temp);+ A% y2 }2 u+ m$ v$ s, V, V$ i
   //RCR& Y5 v5 q" h8 x) L; t8 x* d
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 M4 G9 c' f9 O/ L4 e   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 W6 F! O* R/ g4 b# h; }   temp = 0x00440040;6 \0 `( G6 w1 M2 {  O; e
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   5 E5 \$ M% C2 D6 h
   temp = readl(IO_ADDRESS(RCR_ADDR));
/ S. _% ^1 _$ K5 z5 G0 h   printk("temp=%x\n",temp);5 ?# h1 b- k  X" \  U# O
   //XCR- ?3 U, j4 l% S6 ~* T. D& I
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ P& P* y: y* o7 Q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& ^& m* }0 B! A3 T   temp = 0x00440040;
3 |7 x  f& N9 o+ S- S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
7 [" t" a- I3 \4 ^8 J( Y- a. W9 l; |   temp = readl(IO_ADDRESS(XCR_ADDR));* i& _. U, k  d8 W6 y
   printk("temp=%x\n",temp);8 y3 q" Y5 Z! Y5 F
  udelay(100);
1 _$ F. K! @3 {1 |) a  //SPCR Register
6 ~; f! T& \- _  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1/ H+ `" H+ c" A: m  v% C5 W; t
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' v4 S4 ^0 {3 c, t$ M/ v, q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
$ o" A4 N/ m! [& _/ i  temp = readl(IO_ADDRESS(SPCR_ADDR));! P7 t' ]) i, L8 h7 |1 _
  printk("temp=%x\n",temp);7 J3 B( k3 W6 [
  udelay(100);
% I" _% _1 l7 S2 r3 H
  C! x: d; y; u  //set GPIO direction
" S+ _3 j+ E$ ^% E: K1 ^   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));7 |; p) I' |' Y/ ^
   temp = temp | 0x00000100;//EPR----input1 N3 j  j* \0 [4 v& h; ?; ~
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: S2 b9 J" J- l$ `9 H% B' C3 [0 m   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 F( n* _* s& a& c
$ I( x  I; W4 k* t, ]0 ?1 ^
   return 0;3 }! b- }% ^4 X2 Q& G* R* H0 z5 F
}
) n6 J! N; N2 Y; bstatic void __exit MCBSP_exit(void)" Z1 m# A8 M, P% Q: H- }0 \
{
6 W3 z- y; \3 b9 ]- s2 l   printk("mcbsp chrdev exit!\n");8 k+ N. @' _  N' @+ S" b
   cdev_del(mcbsp_cdev);
& w3 V' n5 e# G0 l. ~) \, u   unregister_chrdev_region(mcbsp_dev,count);& L( B3 Z. y2 [5 r) ?7 e2 W' ?! q# i
   device_destroy(mcbsp_class,mcbsp_dev);
6 h5 }8 z& W; w, m4 f* S   class_destroy(mcbsp_class);
9 O4 q: b( G; p}
. J! c1 X* K1 w2 m, Jmodule_init(MCBSP_init);
% f2 B) ]0 [* j: p3 n  V* hmodule_exit(MCBSP_exit);% Y3 {9 i+ l/ n9 Z, K
* ~) o2 K" a7 U* \* ?/ W/ }0 \
MODULE_LICENSE("GPL");8 Q* P- o* U% ?

+ F# W& x% U3 Q6 Z( c我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 A% T- w! y0 d# ?我的应用层的测试程序如下
+ C( X& p2 Z. ^#include <stdio.h>
6 S6 x, U0 s( g8 ~/ U#include <string.h>
$ e! J7 U3 z, w8 U1 `6 g+ }, [" b#include <fcntl.h>
& [! _( y; y2 T) }, |#include <unistd.h>- l2 S2 C2 }) M# ?4 ~1 x) z& {& S
#include <signal.h>
, b  {3 _* }, X" Q# [7 ?7 p#include <pthread.h>       //线程0 u+ p5 U& P0 g, t; R% F* G
#include <stdlib.h>
% t. I3 }8 x5 t5 N+ C% \* y( [#include <pcap.h>          //捕获网口数据
3 l% ~, M  C% u$ P. q0 |+ o#include <semaphore.h>     //信号
+ ~* I3 I9 l" Z# Q) u; I( @#include <sys/types.h>     //消息对列, I$ m0 _3 T& Y9 A$ r* n% B) k
#include <sys/ipc.h>       //消息队列
( B6 P0 T! L2 ?+ a, I0 p#include <sys/msg.h>       //消息队列
( @& D# T0 M; S( w8 o" G#include <sys/select.h>' ]' g3 X/ t4 U, ^
#include <sys/syscall.h>
. H: I# f( h* S2 F, d) e  t0 E#include <sys/stat.h>* U# j5 L* x7 @0 v
#include <sys/mman.h>
( ]5 ~" w8 O3 G$ E: n#define msleep(x) usleep(1000*x)
: ]: I# Y6 c0 B$ o
8 {, v0 `) S& T7 U$ S& L. \  [8 hint main()
$ l" s0 ~) z& ?{ : Q6 Y4 c- b5 N8 _2 V7 o
    //MCBSP,ARM与AMBE2000交互设备
+ v1 E$ P  J8 k: [' A6 T( @ int fd;2 y% W6 ?7 J* G) E
unsigned short data_write = 0x5555;5 s: k* s7 P3 [) K, I8 }# J; Q1 Q
unsigned short data_read = 0x00;5 k5 h  a+ R2 u& X1 r- p0 {
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 p; Y' H9 {- k" ]* ^; O# |7 Q5 V //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 T' \1 F/ C4 g1 L2 _6 j   
  m/ V8 ]( d& q8 Q" F7 u  if(fd < 0)
3 A. @; h% R3 @+ r" k" o& F9 _8 s$ n# ]  {$ A9 g( F; J- w- B
     perror("open failed\n");
2 _& z; w" t; y! h# t. H: Y- n     return -1;2 g* ?) g  c( V6 e9 i
  }
, [/ E: b/ j# P# u& `# k+ v  7 B4 x/ d6 F* t9 F6 `
  while(1)
& q" t* e9 U( f+ W5 i  {
. Z% g  V- j' _, n7 {1 l! V8 S   / |7 X. q( F( W8 a
   //AMBE2000每次读写是24个字为一帧
) }$ N& r4 }% [0 ?8 b5 Z   //写数据时将数据在底层存储起来,等到中断的时候再发送: E) Q" Q8 J3 M1 Y
   //AMBE2000输入数据是以0x13EC开头的* t6 i- x2 Q3 s6 w9 ]' a6 s* E) T# @+ ^3 [
   write(fd,&data_write,sizeof(unsigned short));
) z) Y( T2 X, m6 i& `+ H+ W   
( f0 A" M; V9 \8 O3 J   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
: q7 m- S( g  X2 r! \: K   read(fd,&data_read,sizeof(unsigned short));
5 E% c, H; _! B   
% s/ Q4 ]0 A- e   if(data_read == 0x13Ec)' x* L1 D1 j! V8 Z4 d: e4 T
   {* V* `  c8 ^( @) E% S: Q. o6 E
   
0 `& Z& z% k0 T- y0 e7 x+ Y    printf("data_read = %x\n",data_read);& A5 E, `1 N! w! t2 {
   }
# Y8 f" O$ Q8 o   
5 j6 D3 r: j/ ?: Y& s   msleep(10);' {3 F# D* o4 G1 _+ [  e
  
+ _. L) P' L( F  /*& j% {4 ]: f9 j* e" y1 j" ^' P
   ioctl(fd,1);   
: F2 I) L: V+ `+ X, l% {+ g sleep(1);
" O# d6 w8 t' V ioctl(fd,0);9 ]! ^. \- j$ {
sleep(1);& k# K, a: e$ m8 T. _: H( m' C
*/
& L/ J; S  T7 a* E6 [  }   4 Q! F1 C0 h+ ~4 n; R+ {7 x) a
return 0;
0 I* l6 ~; k/ j6 Z 5 a" U/ o$ P" o/ c8 X( H
}
: Z. v1 V* d2 p/ ?) k. J& V# ]: D
多谢各位指教,谢谢! 急
6 A4 g% D4 E, i) Y
4 h- r2 S; t5 G8 {) [4 Y! [+ u; L7 z$ ?- Y" f, L4 ~  W1 y
: L4 w0 m0 t6 x3 \" F" G

- r4 d! }8 q, K: y8 B) V- X3 r1 `3 ~: o9 M- v) V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 02:28 , Processed in 0.041417 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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