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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 A6 i% e) X+ a# i( c
/*
! q3 D! I% [! p/ m2 l% N; C * Copyright (C) 2009 Texas Instruments Inc8 V( b( y6 o  G0 N2 K
*
& q1 K' V/ H4 m7 O, ? * This program is free software; you can redistribute it and/or modify- Q, P9 @: P2 {8 t
* it under the terms of the GNU General Public License as published by( R. f$ N& D7 a4 J
* the Free Software Foundation; either version 2 of the License, or2 Z$ @7 G5 q/ M9 ?# \2 ?
* (at your option)any later version.
8 X+ l+ J1 E. [# U1 t *
8 f8 ^( q4 P. t: s+ C- J1 f/ Y; g6 B5 x5 U9 r * This program is distributed in the hope that it will be useful,
1 Z$ g/ W) y( z" ~7 _, q1 ?5 b * but WITHOUT ANY WARRANTY; without even the implied warranty of- y. ]8 I% F3 J3 K. Q7 T. ]& e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! ^6 }  d0 Z) v, F. _ * GNU General Public License for more details.
$ ?/ G- r/ H& X4 `9 y. f$ z *# Z5 Z3 [; U& N, \( ~9 |; h* ~
* You should have received a copy of the GNU General Public License" R: U% @! x2 d3 a
* along with this program; if not, write to the Free Software
0 v+ g/ Q! V$ j: r7 X1 @# ]3 f * Foundati5 E: c- G6 P* w% Q! g" ?
*/7 I7 h+ R& Q; a/ D, f+ J
#include <linux/module.h>
+ g. n" a. f: a4 W; S; S) D" S$ |#include <linux/init.h>
; K8 w1 D% f- b7 X, c  c3 M#include <linux/errno.h>; m/ |' D' _5 J' d3 [1 d  n! w; T) T( M
#include <linux/types.h>8 L6 `6 z2 d+ t  K6 w
#include <linux/interrupt.h>" Q+ u: m7 n, C8 v
#include <linux/io.h>' m5 u' s) @9 a' Q. I! Q
#include <linux/sysctl.h>
5 Q% w# {5 s9 J- ?* z( X( E#include <linux/mm.h>* H9 J: Y8 O% G, M' r
#include <linux/delay.h>% l, W# D; d+ z$ j* v  X! F
#include<linux/kernel.h>6 m, J  A" Z" G% T, o3 E! P
#include<linux/fs.h>
( q& q6 O( u( q#include<linux/ioctl.h>* B4 F1 ?5 _0 U7 c
#include<linux/cdev.h>6 t2 t1 ^; g! |6 w
#include<linux/kdev_t.h>
; \* i6 w0 b0 ]& `. W: A! O#include<linux/gpio.h>. D/ r% i8 O5 r* A* l9 v7 [' m# |
#include <mach/hardware.h>1 Z, \7 S5 L: L9 z: ]
#include <mach/irqs.h>
& I4 Q& K3 t' W& X5 {1 r# ]0 K9 Z" ]# @# u
#include <asm/mach-types.h>$ N: h5 H  Q, X" W2 B; o2 ]
#include <asm/mach/arch.h>( g& X6 g  s# k8 k
#include <mach/da8xx.h>
, _# {# |" V: u: _( D#define  SYSCFG_BASE   0x01c14000- O5 s/ p! S2 {! K
#define  PINMUX1_OFFSET   0x124
3 p& T( Z5 `8 ^9 w* w/ o#define  PINMUX18_OFFSET  0x168 # S8 p* J4 U$ x
#define  PINMUX19_OFFSET  0x16c) Z: D8 \, {0 Q. s( K
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
3 O8 Q& e6 U& ~, e' i1 E5 \#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 x. X! a1 E$ w: S2 ~
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 W1 I2 ]; }4 Z( q  r+ M#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
1 z  B/ [+ ^. k. P& F$ v0 I#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
7 R% T6 m: ]. S                           
" G2 M1 Y, `! i+ C- V/ K( Q: G, p, Q6 y#define DXR_ADDR      0x01D11004  //MCBSP1_DXR: O1 ]. ?& u( y3 g
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR. _5 P" {0 d; y* V+ `( w
//PSC  b+ U) }; d0 {0 U
#define  PTCMD_ADDR   0x01E27120  
0 O. x" ^1 k$ C" \4 F/ Z#define  MDCTL15_ADDR 0x01E27A3C
4 U* C" n: x" L#define  PDCTL1_ADDR  0x01E27304
6 C, J& V  l0 `5 o% G. Y. f6 C: V//GPIO8 direction- a  f; J" j4 V1 g& O0 u- v- j
#define GPIO8_DIRECT  0x01E260B05 U/ Q& w- y4 }& `6 n/ c1 C
#define GPIO8_OUT     0x01E260B43 S8 f$ z0 v$ D) A1 N
#define GPIO8_IN     0x01E260C02 c3 j0 s4 k" Q, Y

8 T; w9 a6 n5 @/ Z% W//#define MCBSP1_RINT    99              
8 X7 ?7 M# G' P# O# {//#define MCBSP1_XINT    100  
4 C# Q9 t8 E/ C3 Lstatic int MCBSP_MAJOR=239;
6 n) ?: t1 \9 W: q1 q8 M; f' c5 Estatic int MCBSP_MINOR=0;
% \4 c8 p6 B$ {' }static int count =1;
& i* P; C  K# \8 h* e' T. q
* B  u2 K8 |1 C( y" t#define MCBSP_NAME  "MCBSP-device"8 a7 ?- I( ?: M
6 B( a0 R! C8 W. T: i3 S( c8 `
static struct cdev *mcbsp_cdev;& D6 F3 I" q' o9 T- }5 w- g3 |+ r6 O
static struct class *mcbsp_class;* n4 s7 {  t! _5 u, Y% J+ T
static dev_t mcbsp_dev;
# u$ X0 g8 C6 E* Hunsigned int DRR_data;
5 m# V$ W' Z+ |, F. c7 v, {. C% }unsigned int DXR_data;
* w' G0 l, P4 e% ~; Q* X8 Cstatic int mcbsp_open(struct inode *inode,struct file *file). A. R1 d9 Z9 z' F$ @
{% n6 y9 p- D! D8 \( a5 U
   
3 w. Z7 h  A$ O* k; e8 y   //interrupt enable,initialized1 s0 i5 ~+ P" @1 F8 `* |7 V
   unsigned int temp;" Q2 V2 t+ ?0 L& C- M1 T* e" _" E0 O4 S
   //SLEEP_EN(GPIO8[10])---0  Q' V: k* p+ f6 d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));  T# N( ~) w7 O2 |% T; r
   temp=temp&(~0x00000400);6 ~, V; d5 C2 Y+ L. C3 D. `9 x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, U1 R$ g7 r7 c5 y- F6 y4 z, w  //RESETn(GPIO8[8])----0----1
; H- @+ T$ A0 l+ ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; Y! C+ ?- e% d8 q   temp=temp&(~0x00000100);; w0 P' B* ^: N! z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
8 f! `1 L# R# E# G   udelay(100);
" G( W( e: m* I) X! }, E   temp=temp| 0x00000100;
1 C  n" M1 T8 x, `: V   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 {; L( Y, `- \' Y6 I0 F
   udelay(100);5 d5 V' M  Y7 J1 q
   printk("open success!\n");
& W4 x. x$ u8 y  [' n' I) `) D   return 0;- b5 c! [# L) F8 M& k( u
}
7 p: B: X: |4 \1 D, V' d# k9 ]) k! s  J; j- U8 m( l. b
static int mcbsp_release(struct inode *inode,struct file *file)
7 p- u% k0 @4 Q  M# d/ J$ c) R{3 ]* B8 U4 G4 F0 W, x2 ~  ^
   printk("release success!\n");+ Q4 w1 |1 x7 L+ n0 E8 J& C, D8 V9 z
   return 0;( E, i; V* i% }& j$ r( v
}
/ s! Y# _# h8 e
( J2 l8 P7 v' q! S5 lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 `. a$ W3 \& d
{
+ W" a; T) }4 b    copy_from_user(&DXR_data,buf,len);
- X' g( I) p, _$ `# Y    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
% n8 x" t% N+ \- ]. k1 O- Z, V    return 0;- \; l( f8 y2 `3 W+ r2 |
  |3 L6 f9 [3 i* `5 L* F
}; ]4 V; i- v, h" u. e3 b

$ o" w' Y: s3 m) Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! D* n2 P0 J+ F5 v9 v3 W{
! i: [( m. H. j& F" E2 Y- S% n   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 w! c) u2 M/ r3 z) W* ]9 f   copy_to_user(buf,&DRR_data,len); ) l( b9 a- O6 \* \" j
   return 0;
6 q7 H' T* h$ S}
1 X+ ^4 I6 |2 q1 [) l2 Q+ s" e
* c1 h9 ?8 y6 b7 Y9 B
, u9 N; k8 K6 j( estatic struct  file_operations mcbsp_fops=
+ W3 s; k  T5 a8 F# L{8 d. E" ^  d+ a$ g* Q# X, D
   .owner=THIS_MODULE,
2 C# q% j" [7 L3 y9 C+ J0 W   .open=mcbsp_open,
. r/ M3 j4 t" X   .release=mcbsp_release,
8 r' M& Y! e+ E' g3 d   .write=mcbsp_write,
( }3 F( ~) d9 l   .read=mcbsp_read,
9 d3 Y- `2 G  W$ r6 ]7 u; K% \$ ~};
) M. n$ J& O4 xstatic int __init MCBSP_init(void)4 b- l5 ~+ b4 t) |
{5 v8 I+ K) I7 d9 O9 V
   int ret;7 L9 I) B0 \; m' [# S. C' Y
   unsigned  int   PINMUX1_REG_old;3 l* t2 v5 ?0 j- x/ E! w! \0 C
   unsigned  int   PINMUX18_REG_old;# T: F2 X# b: m5 i
   unsigned  int   PINMUX19_REG_old;
" r4 j% Y# t3 f- A: _   unsigned  int   temp;  9 H4 |' D! d1 ?  U2 `: a: N' V
   if(MCBSP_MAJOR)
/ q& A; F2 ]& P+ a. Z, Y   {
3 D4 E4 `& l( ~# e0 N      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% H' i" G! F9 ]1 Y      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ W% `+ P% p% u! ^   }0 ^5 p; c' ~; Y1 h6 [7 T
   else3 J8 }5 `; Y! z+ a* h& h
   {
" C# ]6 X) ?! ]3 y; V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ T8 N+ a; ~6 S/ ?8 X6 M      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; x1 f  d; i' F: V. [   }/ l% @: [5 z3 r6 n0 H6 L. b! C
   
3 z, r7 F8 `  \" ?   if(ret<0)
" V; \, ]1 J" I& L. W% U" f   {
! K2 y( W3 H2 ~1 a  n# Y      printk(KERN_ERR "register chrdev fail!");! a& s( b4 R$ c  B( u0 e; b4 t9 [
      return -1;
+ R; p# P$ z8 E' |' @$ ]. J   }% p; \/ D0 q0 t+ s
   
4 r, [; }; |4 O0 ]: x   mcbsp_cdev=cdev_alloc();( y/ q5 I' X* u  Q4 c( H# V/ \5 \! J
   ( x4 t9 z% \  _2 h$ B/ g
   if(mcbsp_cdev!=NULL)' q& O& X) n* s" A9 S
   {, x0 x/ k& h9 M: o
      cdev_init(mcbsp_cdev,&mcbsp_fops);
& w0 z9 f8 d+ j  o( H      mcbsp_cdev->ops=&mcbsp_fops;* f+ W" W3 s( [3 V- p! M* a
      mcbsp_cdev->owner=THIS_MODULE;
" `9 v6 S5 I/ Q( S! J      3 w' w5 l. d% l3 N# J
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), r/ q/ X; `* f; J+ q! Q* K
          printk(KERN_ERR "register cdev fail!");
2 B' s- v/ h6 D2 D      else
9 j  D9 P) q3 A/ N3 }          printk(KERN_ERR "register success!\n");
: F5 ^2 j4 X4 q3 u   }* @3 S& b( d8 O" A; q/ I
   else
& s4 T1 v5 w6 w. J9 V  z! {7 Z   {
5 m9 g8 I/ H8 w# K4 R; C1 R      printk(KERN_ERR "register cdev err!");, {) C3 F; g0 I! t2 {& U4 y0 F3 W- r
      return -1;
2 K. T7 o* A4 n% v) Q   }
+ J, j. ~% O% k' M2 m$ G   
% v& O( x" _; o2 i  B1 h  v  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' P2 s7 d# q/ d: \' y2 ?# _+ I) g$ |
   if(IS_ERR(mcbsp_class))
- F6 i* R5 B& P   {
8 y6 S8 V* |* S5 X8 o  p      printk(KERN_ERR "register class err!");1 O! I" S& E+ m7 c- l
   return -1;3 d; O3 A( e+ q+ _6 q* c; Y1 o
   }+ F& ?. M7 w/ r  r
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( g0 C; M# Z! M" y: j

( C3 T, P4 ~% X& Y, V   //PSC6 C0 i. Y  ~- G/ N0 X9 e
   //add Enable MCBSP7 r* G0 j# g+ P  F7 p
   //test5 d/ v' t' G# |5 k4 i$ H6 S. \# y6 d
   temp = 0x80000003;
, i+ u4 y6 \$ Y* ^3 r   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ ^3 |3 J/ O2 g7 Q7 |; s1 e
   temp = 0x00000003;: W; n# k$ G3 g  }: S8 s
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
; G  D3 E6 s4 @! [! v2 U  o8 f
2 b0 n6 A5 Q" _9 k) ?   temp = 0x001FF201;. C# [' d! z% ?3 k4 Z0 T. B+ {' N
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 P% s8 Z% L+ s0 p
     b/ O7 f3 Z. x0 g" K5 F
   //PINMUX  
5 N- P: v: y7 z1 l   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! E- J5 ^( h! D% h
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
% h/ b( ?2 K5 z) E0 H) q   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
' `; {% {! T0 j7 u# C0 Q. |; ~   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 A  \$ ]+ I- _   
( |3 `$ t; {6 H) M   //SLEEP_EN,EPR,L138_SHK1,L138_RC3 }: z& }( z. v# s1 _8 {' X
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
$ X) u  \6 v6 \. z$ w   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ) k: Q; V1 ]. I6 \) }' x
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ @  L& U% ~& l& ~8 j' o
7 a0 N9 B. L' q, t# L: j6 _. b1 ]   //RESETn,L138_SHK2
$ F! i3 m: K/ B- M   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  9 H! ^/ k3 |7 w$ P3 L- l
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
/ @# v& I3 \% [% Q4 Y   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 v2 y- F5 x: J 6 _$ f, w" b+ a$ g

  ^5 p) r# `0 m( W3 R  //SPCR Register
' ^6 R, C# w4 d6 s+ U) ?0 b  W  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset  W( N1 ]4 i9 a3 N: [
  temp = 0x03000000;//(DLB=0)0 K+ X9 k+ X6 O, C, Z0 e9 p- N
// temp = 0x03008000;//(DLB=1)
7 w+ {$ n- k8 [7 E$ B  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, }9 |  D% U/ t% Q7 C0 z  temp = readl(IO_ADDRESS(SPCR_ADDR));2 B& n  Q0 d$ g, `8 B  |  o
  printk("temp=%x\n",temp);
5 b% s8 G# m  V2 {% F) i8 F! R) I- j
6 G: N: b9 ~5 O: T1 s   //PCR Register/ x& ^2 R7 ^) `- e0 N( x1 L/ m3 X
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 |/ f* O( {4 T* {4 l6 ]; f
  // temp = 0x00000F0F;
& O4 q# I0 n  Z5 A2 X2 M7 q( M  temp = 0x00000B0F;% E' F& T. |5 Z% ~
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 P1 O" z4 m3 G5 [( B7 x  temp = readl(IO_ADDRESS(PCR_ADDR));
) d" Q3 D9 v, l- t3 V; o, U  X" S( M( C  printk("temp=%x\n",temp);  ) f) [4 ~  r; `- S/ c
   //SRGR Register! y9 a' S3 n. C5 d' _
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! I3 ]- w; z3 J2 K. l2 d6 x //temp = 0x301F000B;) d" E- v) g7 W/ n5 \& d- ?
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 3 u: m% k( t7 \1 g) o& m9 s1 ^
  temp = readl(IO_ADDRESS(SRGR_ADDR));
. q7 I' _8 p% X2 g  printk("temp=%x\n",temp);% o# `! R$ I' U0 f) v  H
   //RCR
( i* j  T0 b# m) M9 p8 c; y) z- h! [   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& |9 ~! s* l) x( y' u
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, Y; P; V* |5 q( X' q6 e
   temp = 0x00440040;
% _) M; A1 V+ v! d  P' U1 q   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  u6 o- a! T, Y  |/ _   temp = readl(IO_ADDRESS(RCR_ADDR));. V8 n4 ~/ |$ K, H9 u
   printk("temp=%x\n",temp);& {: a8 B% h/ ^2 k& `& f, ^
   //XCR! \8 Y' u& G+ H& R2 s8 L6 Y; T
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# M7 X- N$ l) g/ l# t
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" x+ z0 ]7 t* f   temp = 0x00440040;
; n! M' k1 `; P. ~. B   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   3 o9 Z1 Z4 {/ x7 w- ]/ t) l
   temp = readl(IO_ADDRESS(XCR_ADDR));$ `- ~, y/ p( x( p( F
   printk("temp=%x\n",temp);
; T; D3 C) ?1 J1 W5 d9 [* J  udelay(100);
& S0 E9 B$ K! T6 l- J1 ^  //SPCR Register& m9 T' K$ X8 A/ j. Q4 R" |! W
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 T' i4 {( O* b: W  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
8 x: ^& V3 R. P1 _  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 o, F/ x* q& C/ H  temp = readl(IO_ADDRESS(SPCR_ADDR));
# t! W# ^& Q0 E' b  printk("temp=%x\n",temp);" E$ o1 _) z! q2 v1 Q* H/ [" B% r
  udelay(100);
, x2 O- Q. V3 M8 g3 c1 t* h7 w1 Y6 y
  //set GPIO direction# E. L$ ]* {0 x: G2 E
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 Y' ^0 @* h3 [- }5 Z9 s   temp = temp | 0x00000100;//EPR----input' |  d( y' N; [7 M* o. \- \- w
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ K2 Z+ ~& W) e+ Y) l
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- L) w5 w1 s4 G/ K
4 O& ^7 X+ g8 @+ c) J   return 0;
+ ]2 o$ N1 s0 c" v}
0 L8 M+ t: s" }0 w, ystatic void __exit MCBSP_exit(void)7 z% h: \$ _4 Y9 S' h
{
  O% d# Z- H! h3 M9 Z1 w; W& C5 I   printk("mcbsp chrdev exit!\n");/ j2 L1 x9 u* k% k
   cdev_del(mcbsp_cdev);
+ t* U$ e: u( p$ e   unregister_chrdev_region(mcbsp_dev,count);3 t. M/ M3 w) f  n0 _4 z% o, B2 @4 }
   device_destroy(mcbsp_class,mcbsp_dev);, j/ {# G9 ]8 Z2 a) q0 L
   class_destroy(mcbsp_class);' j, K" k; ]8 @# [' {
}
  G3 w, c! s4 X! }! Y7 lmodule_init(MCBSP_init);: l# `& y' K8 X0 z3 T* n, s
module_exit(MCBSP_exit);
/ L0 ~* h$ e7 }3 T
5 d; e( a( e; l4 M: f) eMODULE_LICENSE("GPL");
  b# j$ b$ i$ x6 a7 y0 T" O& m8 U# v8 w, k. Z8 D: {% T0 D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' G8 r% f0 v# E- _: C5 s我的应用层的测试程序如下! f# ~4 [: O: x, u5 I/ ?
#include <stdio.h>
: e. V3 ]) N3 w& ]0 B1 d1 z$ X$ s#include <string.h>. a! ^. R9 x( |) _/ f
#include <fcntl.h>
$ i7 g( [: |  H+ G/ m1 F4 {#include <unistd.h>
1 A2 B9 M% N! Y4 A2 r! a#include <signal.h>
7 N( P5 R% F" Z$ R% q! F1 A6 q" a3 G#include <pthread.h>       //线程! h+ `$ C* [9 {
#include <stdlib.h>
8 d3 Z/ M, _# x% d1 N2 i#include <pcap.h>          //捕获网口数据
6 I7 e- ^% S5 K- @) p#include <semaphore.h>     //信号0 v" z( U5 q7 X
#include <sys/types.h>     //消息对列
/ X, b: z" D/ f+ B6 i9 s#include <sys/ipc.h>       //消息队列6 L; X1 B  D! T5 S
#include <sys/msg.h>       //消息队列5 c: e0 p/ g2 t: Z
#include <sys/select.h>  g4 [  N5 p0 L
#include <sys/syscall.h>) A6 L. X2 L/ J) V7 `* g4 t/ L+ c* n
#include <sys/stat.h>
7 [* \6 s" |; H- J: k) p#include <sys/mman.h>
. x; Y9 o7 j7 s#define msleep(x) usleep(1000*x)
) c6 o- {( _, q: V# _% I$ n3 ?. X3 W$ b% T/ `. F
int main()
8 X8 S3 N7 k! y) j2 W  C8 }# u{ 9 ~) }/ C/ A9 }; m
    //MCBSP,ARM与AMBE2000交互设备1 \& ?3 V5 Q# i" B
int fd;; C1 [3 }2 g# z3 c# q# J0 t+ k) U
unsigned short data_write = 0x5555;
! N1 B6 J7 j; J! G6 [( U+ i& s unsigned short data_read = 0x00;
; I3 X6 A3 ~, m% a  L3 \4 M  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 X: N5 S3 p1 D; g; B, v //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
! Y2 L( [. M/ t( Q5 T" m   
9 g6 W0 @* E9 Y( o  if(fd < 0)5 Q  V( ~# d2 j& e+ w
  {
% i; K( ?7 `  l1 \) Q     perror("open failed\n");
9 S9 R% l; K" ?/ o4 k6 Q( {0 V     return -1;
' ^, A7 M! ~3 b; X% e0 ~. K  }1 {; v! m$ \( L6 ]& i9 X
  ' A1 {( k) K( T6 t4 B
  while(1)
# M+ F$ S. f0 X( ]" a/ C8 m  ^$ S  {
$ R! M( e4 u% r' M+ l# P1 x* ^   2 F0 L( C' p# ]( j2 Y& Y% o! I* C
   //AMBE2000每次读写是24个字为一帧; r! y3 @0 H: y! Z  B3 {
   //写数据时将数据在底层存储起来,等到中断的时候再发送
* h8 O$ f( [; r* e+ j7 I+ e   //AMBE2000输入数据是以0x13EC开头的
5 I* P+ ~6 m3 `9 p, r   write(fd,&data_write,sizeof(unsigned short));
2 @% L# X$ i  N: V' r; w   
' J1 I& ^2 E0 E( N: v  T8 ]; L   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ) A6 R* O) h; ]8 A5 Y
   read(fd,&data_read,sizeof(unsigned short));
. |0 K; w# t0 M   
) v+ r8 k) J$ p) W4 \   if(data_read == 0x13Ec)  Y# d) N" o! r, c
   {
+ ]* b6 }& O2 f7 f   1 e9 }5 s, `- {& {
    printf("data_read = %x\n",data_read);+ r0 f4 w$ a# r9 P- c
   }: X  W/ P- N' o( C/ `2 h
   $ i. \/ {7 N! Y8 K8 P
   msleep(10);
+ r9 f& ?6 |/ ~  % X: l8 ]0 N3 c
  /*9 }9 d4 k, ?  @" J& J
   ioctl(fd,1);   # U7 J1 i  m7 `
sleep(1);
6 Z: J7 s9 t! k! {) I  y  u ioctl(fd,0);7 J% N* J+ Z* K1 X/ h! U
sleep(1);
  \7 K9 r) I7 x4 u */
* _7 |7 n7 L8 x  N( B  }   
5 U$ b" D) P: t1 ]* `# f return 0;) Y& x- T5 i. s- Z

+ k+ k$ Z* G& E0 \4 N9 ~. ~) ~}# M: p+ h" W4 u% i5 q: ?

5 q* C- M, V2 ~$ N2 V多谢各位指教,谢谢! 急- u; H& X. q+ W' y4 V& K' w
7 _& P0 Z9 {/ X5 W: `
; }, B1 e" h) N) Z5 d! U  j
9 m( e: _! [# A" X6 l# [

% \) t- I/ z  @  V7 j" b: K& `" t4 ^3 y4 C7 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 16:07 , Processed in 0.041087 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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