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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . D5 \  i# Q+ j% D: u' z& K
/*- T4 U8 ]% ?  Q$ v
* Copyright (C) 2009 Texas Instruments Inc
. i6 S) h# x! Z: C- Z( Y *+ k4 O+ V$ A2 |0 o! G; u" c
* This program is free software; you can redistribute it and/or modify
2 ^; i5 L: {: _: w4 N * it under the terms of the GNU General Public License as published by3 \8 O+ X2 G: K5 Y
* the Free Software Foundation; either version 2 of the License, or/ V) b8 h8 ?$ f- E# w
* (at your option)any later version.
: y% j) L. C6 b: u9 H* {% R' w: a+ C *
# D% t* g5 T; Z' w) t6 n * This program is distributed in the hope that it will be useful,: R+ H( i6 S; c
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 g$ H6 C3 B! {0 N+ w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- e- q( c1 X0 m0 G! T * GNU General Public License for more details." M, D3 ~9 K/ Y* y* n' ]
*- I) o8 A1 C$ d# O; y
* You should have received a copy of the GNU General Public License
6 I5 Y8 l' H: y' m8 H * along with this program; if not, write to the Free Software) _* a" v8 F; Y- i# F6 S: P! A
* Foundati
2 ^6 R* s9 C/ Z* e; \*/; s5 B) m7 V3 j+ _) v5 m/ F; X8 z
#include <linux/module.h>  c) T) h* e* q
#include <linux/init.h>! V6 l- e+ ~9 g( P# w$ l
#include <linux/errno.h>2 d; J) {: Z8 [1 P& K% ]. l
#include <linux/types.h>5 [+ H) e) [3 b- F. B( A' K: ^
#include <linux/interrupt.h>/ U. X' V8 U) J/ y
#include <linux/io.h>
/ o$ }- A6 e3 q  ~5 G#include <linux/sysctl.h>
  `5 O9 h0 Z, h" X; e8 V& {#include <linux/mm.h>. `. }8 C- w3 D9 o- H$ p
#include <linux/delay.h>
0 m6 F9 M0 i0 c5 o#include<linux/kernel.h>
- }7 U+ [7 V/ b5 F0 c( H7 i#include<linux/fs.h>
7 {$ W3 @. Q; l2 X7 K#include<linux/ioctl.h>
* A* N% M, _( V4 E3 p6 m, B3 l#include<linux/cdev.h>: u; c$ E/ k) T- T; C3 D
#include<linux/kdev_t.h>- k4 u- H: r+ I+ M' p
#include<linux/gpio.h>, Y: c$ O! W7 B! V) S6 _
#include <mach/hardware.h>  c8 z) d6 V$ j
#include <mach/irqs.h># a* a3 E" W6 g$ g3 K( M3 r5 ~3 g  l# r
, e% Z: @2 P) t9 b
#include <asm/mach-types.h>
; Y2 _6 T8 M0 B' l+ U#include <asm/mach/arch.h>
& T4 h$ t! R3 o6 Q/ b! K2 q#include <mach/da8xx.h>! a/ r% ~' T* ~
#define  SYSCFG_BASE   0x01c140004 j" ]  v/ e" m+ N
#define  PINMUX1_OFFSET   0x124 / w4 g$ [0 L% V: w8 E& s" k' f# K9 b# X# K
#define  PINMUX18_OFFSET  0x168
- Y: L! O0 G! Q8 ]#define  PINMUX19_OFFSET  0x16c
' {' j8 u( x: R0 l; o#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: t2 v$ o) T) I! V
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
2 x7 o0 U4 w. r1 B: _' A#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR4 n+ N' @0 g4 G( T
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
  m" Q2 C$ M; \% G  e# |+ |( B1 ?#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
9 f6 L' |/ N! {: y- J. N                            4 R( R  Q: g6 f  b; i* I: R+ R" [
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
) [& }2 B0 T' l# a( z. }+ P: r+ S# a3 q#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  U0 ^6 J& [* m
//PSC( l# G3 z% b: B3 u# [$ C; Q9 F! z( l
#define  PTCMD_ADDR   0x01E27120  5 P& N1 u% ?) N
#define  MDCTL15_ADDR 0x01E27A3C
# v. h4 W4 _( \  [; n; U#define  PDCTL1_ADDR  0x01E27304" @5 q# I! |3 o& z6 l
//GPIO8 direction+ O+ B4 C% @' \! n
#define GPIO8_DIRECT  0x01E260B0
8 U+ ~/ R; d+ k1 r#define GPIO8_OUT     0x01E260B4; l: w: m, B; G
#define GPIO8_IN     0x01E260C0
$ ~: f- d+ m: \1 Z+ Z% p( ~2 F1 \- {+ c. y6 H. `" I# m3 g
//#define MCBSP1_RINT    99              
4 W+ C, Z# I: ]7 M//#define MCBSP1_XINT    100  : ]7 E$ S, D/ a, w6 B
static int MCBSP_MAJOR=239;2 E% x; f8 c, J
static int MCBSP_MINOR=0;7 [( {( j! \0 B2 L( k
static int count =1;
' N8 E. [  s- m* I- r( X9 {2 ]2 E4 J2 g$ O! J, v
#define MCBSP_NAME  "MCBSP-device"
- p: Z  c# P5 [% V* `8 C1 ~
, x  F7 E) ~/ e& l  x$ Cstatic struct cdev *mcbsp_cdev;
" Q7 [0 `- g1 d3 f4 t9 r, m/ M& sstatic struct class *mcbsp_class;
% U, o) }- L! x0 b/ V1 R. I6 M3 T8 astatic dev_t mcbsp_dev;
, D" @  ?& Q, O0 M1 punsigned int DRR_data;5 C8 D, w; S2 ~. k; ]2 [
unsigned int DXR_data;
. ]& Z) |! i( }% lstatic int mcbsp_open(struct inode *inode,struct file *file)2 s; E8 T1 t7 `/ h' s( R
{
* s) _; f; s: f. c   
. h4 r8 V. f' w/ _' P4 D   //interrupt enable,initialized7 `; y) c. a4 [' p9 O; l5 R3 H4 X
   unsigned int temp;
' G+ F' y) Y5 {  u   //SLEEP_EN(GPIO8[10])---0
5 ^8 S& Y! x" N6 K' T   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 a2 r4 g% ?/ h0 @) O+ M* R; B
   temp=temp&(~0x00000400);
1 K; C6 n2 [0 |- C1 I( l) v* L   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( J# }9 S( t9 o' E9 L
  //RESETn(GPIO8[8])----0----1
0 v  ~- M2 V$ L: `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));  v0 R) i; p6 P0 C$ v$ y+ }1 F
   temp=temp&(~0x00000100);; L" J% v6 y, ?  A4 ?, ^- Z7 ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 s1 D3 Y5 l0 Z# N0 g   udelay(100);
0 b  N  f1 L5 m   temp=temp| 0x00000100;. ~+ Y1 u' T! m2 W2 C; i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
- O9 x8 [4 k; s- e6 Y* V   udelay(100);4 ?+ f! Q+ @" {
   printk("open success!\n");
( A! Y9 y7 }, ~: P" Y   return 0;4 v" t) r1 A/ o, P8 F
}$ F! T- V' x5 t" u' H7 K
& X3 L  \: g4 e
static int mcbsp_release(struct inode *inode,struct file *file)! r/ `. K+ p5 N. q. n* ]8 x
{
# X. H. I! }' P8 p! \1 k9 l1 T& U   printk("release success!\n");( `+ ?$ \% ]4 ?
   return 0;
5 Q" n/ |  j+ f. z6 p3 I}8 L; H) |: o$ d, A5 F

  g8 W2 k5 s  W0 r# wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; ?! q: U* X: U" [{. M- k$ ]- l8 u: `
    copy_from_user(&DXR_data,buf,len);
& X2 Q  v- K1 g& M    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       : K# l) B# x) D( `& g: |& k( `, ~, A
    return 0;
0 d0 t( G# h& W
" d: Y0 R$ o! g+ l5 S}
1 F5 ]8 n7 [/ u& ^2 y
/ U) @. e1 t7 y, V7 L2 ]static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- M  J, \8 g" L. K. q) m9 X' l{
+ L; J" O# W- o1 }6 C% [, j   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ?1 {0 F# E! w+ D& X   copy_to_user(buf,&DRR_data,len); 1 |: F- u3 f1 z
   return 0;- f" {7 i# m; ?9 i4 _
}
$ Z) s( T! a3 k+ O0 S, A; v% j9 o- K, b$ u, p6 |1 Y; B
2 I, t1 x2 ^- h1 V& X
static struct  file_operations mcbsp_fops=9 e1 s' ?% c0 q& T9 g* g9 Y6 h
{
8 C; _2 P! T2 k" @   .owner=THIS_MODULE,7 C  }/ ]% j, W" I7 g/ n
   .open=mcbsp_open,
9 ~" Q, _( o" |9 F   .release=mcbsp_release,
6 d6 s4 V6 a' i& `2 ]: t   .write=mcbsp_write," @7 S7 m+ k$ F
   .read=mcbsp_read,
+ ^) Y$ c5 O; X7 E. @};
4 Z# S9 I/ G) D& l! `: t" estatic int __init MCBSP_init(void)
( \" f& l( G5 s/ L( }" q{
7 Z9 [& B3 t# o+ F8 n# b   int ret;% O( r1 g- ~( k  N. B
   unsigned  int   PINMUX1_REG_old;
5 ]9 {1 b7 H/ X) M# I" G" z   unsigned  int   PINMUX18_REG_old;7 G; ]4 u) q: `( U- j( i
   unsigned  int   PINMUX19_REG_old;
2 P4 ?. M- @( \; q$ ]6 c! F   unsigned  int   temp;  7 j/ A" V/ }# P' B
   if(MCBSP_MAJOR)0 k7 q. R! C5 d  k
   {
6 \# z6 j" z( o) C1 J, ]# U4 }) S      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 M/ O  M3 q2 `9 R7 x" Q/ A      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 z% s. ?5 |, u( W# V, `* W   }
2 }! }) u. d+ X! i$ ~; G5 }   else
+ N5 X. G+ `; x. k% D# m   {
1 f5 X6 V! n; @* ?' g' @      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! F8 u% I5 O* x+ [3 g3 m% l      MCBSP_MAJOR=MAJOR(mcbsp_dev);( @. _0 i+ i* L" p7 |& c- E
   }; I6 `0 f8 W* P- v: m
   
+ [8 b6 x6 x0 m! P   if(ret<0)# o' ^& K4 Y* r+ w/ t/ l
   {# {' ]* s' |1 \
      printk(KERN_ERR "register chrdev fail!");5 l5 Q' a$ v+ ]8 b4 u
      return -1;8 [4 R8 ]: A: p9 F8 H/ n  s& `
   }( o$ w1 ?: ?% a3 v4 F9 |8 x
   
, F& c, G! V( z: y3 [' c   mcbsp_cdev=cdev_alloc();
1 L: x: Z7 G2 I/ o6 E3 [2 M   
) ]! a6 \; P. z6 i3 ~0 {. i0 A   if(mcbsp_cdev!=NULL)* U1 E/ r  A8 `+ s, {
   {
+ z+ V# H3 m6 f      cdev_init(mcbsp_cdev,&mcbsp_fops);
8 W. b% P* Q! p8 M1 n+ ~9 d      mcbsp_cdev->ops=&mcbsp_fops;- A6 f4 g0 v" }2 p; L
      mcbsp_cdev->owner=THIS_MODULE;" q7 j4 N7 s, I! @$ {# v: f+ V
      
* {" x) S9 P( g7 R7 E      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). W- P/ N# V2 v6 M  O2 E- K
          printk(KERN_ERR "register cdev fail!");
- H( e2 m. K: e0 s      else. D: Q+ h( |3 L2 Q; D- F
          printk(KERN_ERR "register success!\n");
/ g% ^3 S+ w2 r% ]! B6 B   }5 i1 d# v5 _! y1 v8 R
   else
* S: Z2 C0 q6 u! k) g% e) G   {: F) n6 Q3 @9 E, A8 G
      printk(KERN_ERR "register cdev err!");
* E. {2 m! M+ x      return -1;' U0 W1 U. s* g
   }. E3 o0 ^$ v0 Y
   
  _7 _6 m7 a5 B+ {7 a6 G  [  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& I5 [& P5 A: |9 {- |+ b- V  j
   if(IS_ERR(mcbsp_class))
" b8 u4 z9 P- n8 s4 }' L   {
4 G% @6 W7 @0 C& H5 g      printk(KERN_ERR "register class err!");8 t! E' m1 u. O. }2 B2 t& ~
   return -1;% h, ^' o9 J5 C
   }
/ I7 k2 w) O8 s   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' N2 {2 e8 t- K( F+ M+ K9 X( |% y/ Y9 F
   //PSC
6 m# d5 I9 `# K- R! ^; T$ t- B0 R   //add Enable MCBSP
& ?& X, N' }4 W9 n# k; G; S   //test
1 M7 d" J. U' e6 u5 C2 I   temp = 0x80000003;
3 e$ Z$ O/ F  ?: h   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 N) h7 w. T3 X+ j. [- m   temp = 0x00000003;
* |0 S: l2 U0 W0 Y9 G; X  j   writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ {" r0 ~" y" i  @& Q
: s, D" i2 f7 G% i   temp = 0x001FF201;" G# J9 V8 O. w' j; J. i9 ^$ A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# K3 f9 t9 \1 K0 N6 e4 y; V, u
   ! g) Q9 N) y2 L
   //PINMUX  
9 U5 h6 ~# m( `' O9 K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ l9 N: q5 k( C9 ^  M1 Q
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 P$ D$ M; ?" s  s; q4 D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! K3 F/ W$ e2 q& _
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( f3 m$ F7 u- k, \9 s   
, c- m3 E9 z& r2 W+ y: S* z7 t   //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ w& ]/ Z& O8 }6 Y$ Z! ^   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
. A* u! x- k, ~$ G  ^2 I4 o9 q   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# m  v% y+ [+ J( V  v2 N/ D2 W   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 I+ C/ N3 U% D+ t1 F  A) S  \
5 f9 E. `+ |0 f; E   //RESETn,L138_SHK2
4 q2 E0 Z8 W! n# P, a9 Z: m! a( W0 n6 J   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
% h1 O4 y3 M/ e" ?/ j3 k   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 E7 c% F5 R( c) Q8 i. y# H   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 l9 V" L" E! w" l
# k) Z0 E4 Y5 U6 P& t1 O5 M8 d' ~$ y
# P9 I# A* J/ r: Q
  //SPCR Register
  k/ J# Q) }+ U6 c' O  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( T) A, Y& u: l& _
  temp = 0x03000000;//(DLB=0)9 I& s' m/ ^3 @( g2 m
// temp = 0x03008000;//(DLB=1)) f% [- q8 B% H5 U( G# f7 p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
/ X6 N$ Z! l: B, e! T0 C2 n  temp = readl(IO_ADDRESS(SPCR_ADDR));  |9 o; ?0 b. \+ D4 w8 }
  printk("temp=%x\n",temp);5 p0 P! p: o% t' G" h! `& a' L

& n" w+ e' Y3 G' M) ]  P7 i1 j   //PCR Register
+ f* {- K7 C1 V/ t5 j1 w   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) \; |  j+ U; p
  // temp = 0x00000F0F;3 O, b$ i3 R, H9 L9 p! Y. u  ~
  temp = 0x00000B0F;
/ f+ |) G* l3 l( N0 {  W& Y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 b8 K7 z! Y( d  temp = readl(IO_ADDRESS(PCR_ADDR));, _- C2 {1 {# w: E
  printk("temp=%x\n",temp);  
: ?. v9 N/ o! F. ^) x: c! D   //SRGR Register
& l# D; Y0 i; u3 X   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: B( b; f, q) P- |, t$ y% ]7 X/ E$ k //temp = 0x301F000B;
9 l' }$ y4 P8 g4 O; J4 _8 A4 {   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized + N! f' L/ D( |- `# N
  temp = readl(IO_ADDRESS(SRGR_ADDR));" _2 X/ E7 I6 Y; B
  printk("temp=%x\n",temp);* P9 r* I  y4 U) x
   //RCR
' B6 u/ Q7 x' |! s   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 ^& Y9 i5 H* H2 A8 f% @" a: ^0 y   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! _; e* v$ W7 M   temp = 0x00440040;. x/ D& ~- F5 z1 O+ D5 _
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
0 ^1 `1 t/ `- c9 ^" M, p* F   temp = readl(IO_ADDRESS(RCR_ADDR));
, m! B8 `( o; O' X* x   printk("temp=%x\n",temp);( l: \4 F; ~- O6 k8 E' X
   //XCR" A0 S! I/ L' N/ {" _& h
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 Y1 m. `. L! J  u5 z; d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" h- d0 ~. O! B2 `! V
   temp = 0x00440040;, Z4 q- \' |! Y4 J
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
* C% n; N6 D0 m, v* J   temp = readl(IO_ADDRESS(XCR_ADDR));
& K9 E0 Z; ~, p2 ?0 d4 j: X   printk("temp=%x\n",temp);; A/ V& j, Y/ |8 T* X9 H; `
  udelay(100);
+ }/ G: L9 f, N" A1 o  //SPCR Register+ @0 Q- }8 _# \( I, l
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( h* u! y  p& _1 U" c  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  `6 x  b& m  K  S, w8 b" ^
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. Q7 c8 u/ j$ l* i' o
  temp = readl(IO_ADDRESS(SPCR_ADDR));
* F9 T  v& r! ?& B/ \, D  printk("temp=%x\n",temp);/ B4 r+ f8 ~( k+ ]/ o% ~$ S
  udelay(100);* h" y+ z9 t$ q5 x
& i8 m, L% D. h
  //set GPIO direction6 m- R# `% z* O& g4 }7 u" {
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; T0 a# p& Q8 V0 J' o
   temp = temp | 0x00000100;//EPR----input' R, _7 ~( H% ~# Z$ c2 L& _7 h  j
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; B  Z4 h  _& v, i' P0 ]9 j7 g3 {. W- U
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . C9 G; b! u& R. `- P

( m9 z, \+ Q' Z" C   return 0;1 {" b/ U; L* Q+ }. M
}
9 x/ Q8 V/ S( j. l; S# L, Qstatic void __exit MCBSP_exit(void)% k2 C- ~. U  }  W6 D2 Z
{7 G# T, y. b8 Q) U4 S
   printk("mcbsp chrdev exit!\n");
8 \% T; x* `1 g. n6 p% ~   cdev_del(mcbsp_cdev);
5 t- l7 Z" \' w7 X+ E   unregister_chrdev_region(mcbsp_dev,count);1 |) {: C# ~2 E, p
   device_destroy(mcbsp_class,mcbsp_dev);
5 `+ }* L8 J, Q1 l2 v# R1 B6 n   class_destroy(mcbsp_class);
- W$ a0 L) L$ z% `! K) _}
, Y( B% @3 ^. D8 t" l8 E5 vmodule_init(MCBSP_init);: {+ A( g( I  e! g/ ?' p; _
module_exit(MCBSP_exit);& p; i6 t. D8 J5 J
) W& r6 ?1 s+ z9 u- X& l+ l1 N; H
MODULE_LICENSE("GPL");
* C5 S) G8 @* I, R+ u: Y( ?% i
0 [( @' c, D9 G* b8 W8 y4 b& v我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 U2 t+ i: Y, |) `0 r. w
我的应用层的测试程序如下/ d. d& K# F' X& x& `2 O( }
#include <stdio.h>
! ^+ m+ b3 U' A2 q. i, V#include <string.h>- m7 {9 q" O5 Z+ y7 K9 i
#include <fcntl.h>2 Q) t$ V  i1 K) r3 D2 L
#include <unistd.h>
  N, s$ j' ]' e+ \9 F$ [7 p2 j#include <signal.h>3 X6 [) T8 K2 h# N1 |9 _8 Y
#include <pthread.h>       //线程; k& }+ X, \# r+ C
#include <stdlib.h>* Y" R% K3 F. a6 u
#include <pcap.h>          //捕获网口数据
  i! ~5 k1 l* f: h/ D* T#include <semaphore.h>     //信号% L( v3 ^" d& W1 r5 S, j7 M* h! _" `
#include <sys/types.h>     //消息对列
" X: i4 f/ o3 j  z2 s; B#include <sys/ipc.h>       //消息队列+ x1 x- D$ u- r( }, [: v
#include <sys/msg.h>       //消息队列
- M" o; V/ S2 o: Y8 }#include <sys/select.h>
; B* f, \& i+ J8 I% H7 g#include <sys/syscall.h>
: Y' T, x/ a  J& X; l& S#include <sys/stat.h>2 T* L! I; ~% O( ?
#include <sys/mman.h>
) w! o+ Z0 r1 X7 d8 x$ ?0 k#define msleep(x) usleep(1000*x)
5 d2 A! k# V* R" N8 e1 K/ F: }1 E6 C4 z: `+ i; }9 }7 |
int main()
1 H, y* R6 O* a2 }{ & l' K5 N6 |# B  t* [
    //MCBSP,ARM与AMBE2000交互设备% S' z8 l7 m) i' }: O
int fd;+ Q. v& H" ]/ r  [+ n
unsigned short data_write = 0x5555;" @! s% W( \( I* U) `8 ?
unsigned short data_read = 0x00;" |  y4 F5 L- D0 t! s
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( J# r/ j& V! ^3 f" Z7 G$ {
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ h) ]3 b' ?& u9 p  ^   
5 t& p/ ?  k$ ^# f* J% L  if(fd < 0)
$ _0 N0 Z: o- K+ D  {
- x8 @' [2 Y" x7 l8 K7 @     perror("open failed\n");
7 q: A- f3 z* P% Y% q) ^. u* ~; p4 c( B     return -1;
/ g/ F5 x, K% y  }7 d0 i4 j- A6 Y: M
  
9 y, ?* B# \) i  while(1)8 M6 I$ R8 l& u: T/ z
  {' B. k* `1 [! v; _) ?! S1 y
   : T$ J) c0 `3 y7 U
   //AMBE2000每次读写是24个字为一帧
! G9 Y  r9 u: r4 @- _2 H   //写数据时将数据在底层存储起来,等到中断的时候再发送7 I5 r( Q+ F  P5 Y. ?
   //AMBE2000输入数据是以0x13EC开头的
8 O3 w/ v9 _" W; O1 Y7 h- }   write(fd,&data_write,sizeof(unsigned short));$ Y% S, B# ^' Y; {1 z; k4 x- Q& R9 v
   & g7 B. D% j3 s+ C% s5 h9 V+ l4 Y
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 m, Y5 b" R! \. p0 z5 C& q
   read(fd,&data_read,sizeof(unsigned short));
0 E: @* r( p& t/ A     d; F( z3 z5 a5 R, g
   if(data_read == 0x13Ec)/ E$ u% w5 V7 k
   {* @) M5 u3 i7 z/ X4 P8 l7 I
   
% u) F* O* x1 H- u6 _    printf("data_read = %x\n",data_read);0 G" J/ L6 z# w# d1 t  N
   }' y! E5 G  ]' H/ |
   
. u# ^4 l  o" R3 _' z) h9 v   msleep(10);, m$ N* R6 J% D
  " e& Z, C( k3 Y3 N4 j- C" \
  /*
. c9 L0 q3 B- ^. G" _: H   ioctl(fd,1);   & @9 B6 h  v8 d6 F
sleep(1);8 R% _9 |3 X1 ]7 F5 U% B4 m
ioctl(fd,0);
9 @+ L; n7 ~7 k' ]* H4 c8 b$ b/ Z8 } sleep(1);
1 P# B% }' _8 ]! G0 @2 f, ` */
5 p% _7 ]# x" N7 T7 b! h9 R. l  }   
5 L6 `1 ]! p: V$ a" u return 0;; H# ^' Z4 B  ]( F! ~1 P
( }- E# [# s& s) G6 T! }5 H- Q: D
}3 J# Z6 L2 Q& y2 Z9 y: M% y

+ F: x/ m5 A+ {6 A多谢各位指教,谢谢! 急
1 ^" m0 j3 N: i+ X* p" P
$ \% C. j, R% d4 ^9 F3 @$ P( n( o

+ H! v0 H, {5 [
7 m) r" D3 f+ ~2 R! I
' U- u+ S9 `0 Y% w" H# O1 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 13:19 , Processed in 0.052412 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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