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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 p! ~% j$ [- j* p
/*
! v+ L$ v; q9 ^6 ^ * Copyright (C) 2009 Texas Instruments Inc
- t  Y6 o% Q/ `' t- A; [/ C, R) I% c  k *
- ^/ f% H1 c* a3 L3 h" W * This program is free software; you can redistribute it and/or modify' Z! H/ R  c, X1 Q4 D6 j: F
* it under the terms of the GNU General Public License as published by
  o! v2 c, N! n  D * the Free Software Foundation; either version 2 of the License, or, Y+ E& @0 i- @: J' \1 `
* (at your option)any later version.
" J  D2 C. a+ t5 y9 C% s *! `4 {! c' g  a% F/ g7 D; H
* This program is distributed in the hope that it will be useful,
$ P, k1 v* j7 `3 o6 T# V, {" @ * but WITHOUT ANY WARRANTY; without even the implied warranty of
) b: Q" {6 b' u' H# M# j8 i * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- E9 b: c9 D  x5 D' u * GNU General Public License for more details.% o4 U! k' V0 N
*
! P: S+ m! A+ ?/ T * You should have received a copy of the GNU General Public License3 ?3 a7 @8 C% E$ k  N8 W
* along with this program; if not, write to the Free Software
$ [7 s4 @) h/ ~ * Foundati) r0 [, h' u( N( ]; q7 c. R
*/
8 h; g$ Q% L9 h* S9 d& ^#include <linux/module.h>
. g0 R! K& ]' V& n#include <linux/init.h>% q6 y: Y" t. m5 V) ?! y! y
#include <linux/errno.h>
5 D1 A) m$ o8 n% s: r6 F" {7 `7 {#include <linux/types.h>/ @6 G4 P3 p1 m# a
#include <linux/interrupt.h>9 l. i9 W1 F$ _( o2 K' }
#include <linux/io.h>
7 W, f0 l5 k% D9 J2 d#include <linux/sysctl.h>
6 z9 n4 R$ e' w! l! g#include <linux/mm.h>
& [* Z! a$ N2 B+ A#include <linux/delay.h>, ^3 E' C- y/ W( \0 L
#include<linux/kernel.h>0 [$ X% f2 `, [' Y0 }
#include<linux/fs.h>1 R2 X" s: j- i9 o- ~% ]  S! T
#include<linux/ioctl.h>7 N$ u  K. ]$ c
#include<linux/cdev.h>' ]% l9 u& d, g6 T( v
#include<linux/kdev_t.h>
( [% ?/ i: W- m#include<linux/gpio.h>
$ \7 ]5 M: F3 w1 H#include <mach/hardware.h>, W. ?1 P& |! Q5 c- r, _! e
#include <mach/irqs.h>* `: r9 k) Q% _! e8 y
% C( E8 V/ m$ W7 p
#include <asm/mach-types.h>: O$ p9 D$ f/ {0 U3 q9 h# Q
#include <asm/mach/arch.h>2 u% N  @* ?5 _2 j% x) ~+ h% n
#include <mach/da8xx.h>7 h: j; o/ L. w: d4 v) h3 ^
#define  SYSCFG_BASE   0x01c14000
: E' {$ C, w$ E' H& B% _#define  PINMUX1_OFFSET   0x124
; i6 R( Z' y9 v6 Q* F6 ^; M& y6 t+ K#define  PINMUX18_OFFSET  0x168 ( @0 V3 v7 [+ g( k; h
#define  PINMUX19_OFFSET  0x16c  J, F+ \2 R3 x. {* ?
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR! J. b6 Y- }$ o  @+ w5 Q+ F
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
& v. }( @: b) l) R' i, {, I#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& E+ M* _, A% Y! O! J6 Z0 R#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 U% P# n1 s/ ?* L8 E/ \
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR) p* }6 M' A' i4 R+ J# t: u
                            3 \; o/ v2 V# \3 G8 y9 T
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
2 [, t  p. ?# N6 D9 G. `. f#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 [1 n1 Y% P4 k1 E* v! Z, H
//PSC- `. v1 V# ^6 t% [/ q
#define  PTCMD_ADDR   0x01E27120  5 j, }4 j+ D7 T3 m  T6 C
#define  MDCTL15_ADDR 0x01E27A3C
1 v, K# H2 @. |# U$ R5 P! b& ~#define  PDCTL1_ADDR  0x01E27304! p9 U7 ]+ q* X; r9 C; I9 Y7 Y
//GPIO8 direction( t! }" S- D. d0 K: v
#define GPIO8_DIRECT  0x01E260B0
9 }7 J6 e, O( s#define GPIO8_OUT     0x01E260B4; h$ C4 U) \- q! X+ g
#define GPIO8_IN     0x01E260C0. R8 T" P" O: [2 w

- z0 \/ S4 @3 y* Z9 M1 o& c//#define MCBSP1_RINT    99              
1 q+ D, Q# I2 N: X! G5 m/ o* N//#define MCBSP1_XINT    100  6 m$ W2 I2 D7 |8 j6 ]* b
static int MCBSP_MAJOR=239;
* S0 |+ z8 n8 f! Dstatic int MCBSP_MINOR=0;
- x5 r% r2 s2 y- L& b7 u5 Jstatic int count =1;
5 }: w  `0 f: G4 ]
6 U4 X' X  y; B9 v# @#define MCBSP_NAME  "MCBSP-device"
' A  q. _5 L3 b: \& K, ?
/ T& T7 n1 B! X" G$ ?. q/ [9 Jstatic struct cdev *mcbsp_cdev;
3 p; A$ v5 W4 O7 h4 ^static struct class *mcbsp_class;0 r: |, ^7 P) y: j; U
static dev_t mcbsp_dev;0 W, X. B% P8 n# c/ Q: m4 R
unsigned int DRR_data;0 M2 u+ o" K. z/ R
unsigned int DXR_data;7 S' ^! E6 D# O4 A, h
static int mcbsp_open(struct inode *inode,struct file *file)( D' c3 @! s3 z  M) v8 D
{4 @9 @6 a$ O7 Q8 ?0 p6 y1 w4 F( m
   
* x0 a5 G% v3 s; q" U/ U5 Z# S   //interrupt enable,initialized3 n; I0 w* t& i! m+ c# L6 [1 ~
   unsigned int temp;  X( z/ a3 O9 d0 U- E
   //SLEEP_EN(GPIO8[10])---0
) f% _6 U: a5 B1 y* a! d! U/ C6 ?4 k* H   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 C3 m, X9 Q+ b   temp=temp&(~0x00000400);" e; A* C; n$ E. Z2 Y, c) N) a! Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 v9 j4 T( S7 f2 H  f& ~1 g7 u  //RESETn(GPIO8[8])----0----1
" K. }8 E, Q4 `5 {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) d% A% A+ E# H2 A7 i- ]- l   temp=temp&(~0x00000100);
9 G- ?% L9 G7 x. Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ r0 a/ F% i5 I$ k   udelay(100);2 Y) q, g) A% E1 }& p9 ?( T; [
   temp=temp| 0x00000100;0 M7 y) V9 ?. i5 `9 p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" ?+ F, {/ L& h# ]3 _4 ~9 S   udelay(100);
4 ]  G* E* L0 O8 t# G; J   printk("open success!\n");
: M8 A5 `- h% c9 t6 i: Q3 P2 w   return 0;+ x7 T* [+ V: I* C$ s  c  K2 o
}
/ j) k! [# e7 B, g. }2 j5 _/ \; E# {( j0 Y2 A3 W  X3 v% |
static int mcbsp_release(struct inode *inode,struct file *file)) t8 ]" h" C* j4 f5 O: O: O/ n& a
{# H7 R1 I' [  G! p
   printk("release success!\n");
3 Y  e, t7 ]8 u$ i   return 0;. w% c8 I  R$ C! }  `1 r7 n
}6 n% C; Z: k7 w7 Z/ B. }7 D# o

* W* S* _* d; x5 B3 |/ ^7 y/ Rstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off), _# h6 h4 @! J% @$ B0 N: l
{
, X9 w0 `0 U/ _3 _    copy_from_user(&DXR_data,buf,len);
* C7 W) K2 F2 }8 c7 h4 d    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. x/ {2 t% j* W1 Y6 {    return 0;
  ], s! Y* G8 a& \4 Q 6 F/ T: r) r) A  J9 d! Z. |: K
}/ z! J$ h/ H% y0 ]! o  F! g
- f$ ?/ X9 @: A2 e6 J8 h5 H' l
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 z  f$ |$ _4 Y
{ 9 O& U, N. K0 E+ z
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; L) Y0 x4 T/ E   copy_to_user(buf,&DRR_data,len);
4 R2 n8 Z0 D* {# W$ m   return 0;2 O/ V8 y2 u& g3 U
}5 X9 [! |& P# \

; Z* \0 h2 A3 v' \8 z7 Y) S) i7 V5 |; c$ T* L% t' Z4 E; a% k
static struct  file_operations mcbsp_fops=
3 @2 y2 ~6 p$ g4 _{
1 s! k6 c& x% r! r! C0 \, A3 N   .owner=THIS_MODULE,# \+ F' n# A" j5 K7 G1 Z# o& I
   .open=mcbsp_open,' L# ~2 E) p6 R. b* y9 R  _- T1 ^
   .release=mcbsp_release,
# ]& u6 w( @7 _+ {" h, Z4 O5 e; l   .write=mcbsp_write,
8 `  L6 ]# L9 B1 U8 ^   .read=mcbsp_read,2 @7 m2 t# `& m! f* p6 y
};( u2 ]0 ]: I! b  W( P/ N+ A2 {0 ]4 z
static int __init MCBSP_init(void)
7 N9 n: v# M5 k  u: a! {# h- ?3 U{4 [6 H, u0 [; Z9 V$ T
   int ret;1 {, l: B) e9 Z5 `9 p' T* a
   unsigned  int   PINMUX1_REG_old;
2 R$ N1 r7 V4 t; B: W! u* A   unsigned  int   PINMUX18_REG_old;
( q+ O# X& @5 B" X- a   unsigned  int   PINMUX19_REG_old;% O- V  \, N! J8 l
   unsigned  int   temp;  4 G* c: @# Z9 p5 h. P' i3 [
   if(MCBSP_MAJOR)
1 O3 d$ F- H2 O! g. ~: `2 u   {
7 z, e* i5 O3 A# E9 |& G& R5 j- m      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 S4 [; [+ `' H4 z2 }
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ X6 w. T; l2 @; u! X( S   }
% P/ K0 R- d3 O1 E   else( B! q& @8 V9 o" u
   {: E# u8 ]: A) c
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# N: K' u% f( _! E. u" V$ ]      MCBSP_MAJOR=MAJOR(mcbsp_dev);$ f8 E/ i, p. K! T  l- y
   }
3 {8 F4 c$ Z7 C( M; `# _   
3 F# X4 C$ |2 l! n" ~9 G   if(ret<0)
; b( z9 Z+ F) f  l: L; x$ c   {0 M% y$ z+ k& O' C# Z. u
      printk(KERN_ERR "register chrdev fail!");2 {9 s8 h6 N/ ~% j# u  o
      return -1;: B9 F+ S7 r$ }. @  R0 v  J, x
   }
# J9 ?5 t5 n: w, [+ w$ `4 l: b   
$ D( Y" V6 |& x9 Y0 T' _   mcbsp_cdev=cdev_alloc();! v, F) v) a; R' J6 V9 a
   
2 j  s' W$ Q: d2 n# I   if(mcbsp_cdev!=NULL)
# w4 g7 y7 k  `: k5 S   {
4 T1 C2 ?3 Y# @& ^& e+ T5 Z      cdev_init(mcbsp_cdev,&mcbsp_fops);
) R4 w0 ]+ e% Q: u$ e8 S' r      mcbsp_cdev->ops=&mcbsp_fops;* w* `1 D" H4 x, s
      mcbsp_cdev->owner=THIS_MODULE;
' W6 \+ e& d: _5 C      ( C2 h. f( H1 q1 \
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))1 w) C+ H6 h/ q$ c
          printk(KERN_ERR "register cdev fail!");
( i9 I' J, F2 \+ `* {      else/ h# h% L$ D$ `1 {' L
          printk(KERN_ERR "register success!\n");
1 V. m; z2 r3 f) n  d' d   }, z1 c- Y" a4 S" E& o7 T3 b
   else! [7 D5 k7 v; H! {8 @
   {3 Q5 E. C, k' O
      printk(KERN_ERR "register cdev err!");
; H$ p. ~" t; I; L) H' I+ s      return -1;
; \. O( y+ v: [( U3 L, a   }- @6 z/ \. N/ J
   
" c- J1 u; B0 {  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 x1 S5 t. R3 ]% e! X! G3 V   if(IS_ERR(mcbsp_class))
( j3 J& c6 C" ?   {
; O4 _1 |. S) ^- e' l6 |      printk(KERN_ERR "register class err!");1 ]0 w1 M0 Y7 t) M
   return -1;' d+ T0 @0 b6 f3 h, u
   }2 P$ l5 j, o7 o3 w1 d
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 j, H( b3 T& s' T
7 _, b9 b) z5 y; z* @# ^# j! a
   //PSC
, Q: X3 J* t' Q3 d- Z1 y% U+ z   //add Enable MCBSP" C, z$ [$ ]+ Y4 _& V  {8 ~- G
   //test: }0 {) Y7 ?' ?( V. |9 o
   temp = 0x80000003;
' ]" a8 j% X5 w" t0 e; p   writel(temp, IO_ADDRESS(MDCTL15_ADDR));! ~# j. l$ k( S7 g* u3 z
   temp = 0x00000003;# d) w) A. d& `
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
; N8 b. f0 n' |) A+ w, M" v 3 E) m0 V$ _  N$ M" o* O7 m
   temp = 0x001FF201;% q7 h- e$ b/ h' K! |, i5 j! P' ~
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));  S6 p- t" |6 I0 u' f
   ; n9 k4 p$ }1 O' O
   //PINMUX  
  \; B$ _9 b7 D  |6 B  O   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
& X5 Z1 `: Q) c) c! g8 M$ f1 ^   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
0 p- T; H2 |: K1 w3 O  r0 j   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
" z( j. z- w1 N  f   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# l9 l1 E0 y7 o" J: Z   & R- l, m0 l( F! E3 i
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
: M: v3 `" j$ s% j( D9 S   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
) K1 a& Z8 K0 z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 w* A% P( S9 ~% E1 A
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);; L8 X0 a. o! {+ ?1 c- Z! Z: W7 ^

* m5 U+ }6 B, j2 H2 W4 c, {( y   //RESETn,L138_SHK2
# A3 e9 k+ `+ q' t4 x   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
3 _8 |; I" O, Q" t   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 A; Q& X; u0 B/ f8 o$ K6 c   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 x1 G0 r+ R4 ]9 e) B, c" C 2 p+ Y. Y9 Y. u3 d9 m
$ @9 g* Z/ N1 f& z) G6 b
  //SPCR Register$ e: K( z5 u& q" I2 I
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset8 H1 t6 e$ i2 ^5 F6 ?4 P, E
  temp = 0x03000000;//(DLB=0)
& a+ Z8 {0 q* f" m( B* K" M! j( ] // temp = 0x03008000;//(DLB=1)
& _, e( H& \1 d8 Y% s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ v& U5 r+ ~7 m: n% N6 F/ Y2 S  temp = readl(IO_ADDRESS(SPCR_ADDR));6 o5 Z5 k5 s5 Z; O! Q
  printk("temp=%x\n",temp);" f( x! S) A7 E& g# H  D5 b
0 T) F3 n3 h, L9 |8 `, }% {- x
   //PCR Register
3 k0 J4 B2 j! ?: _; a5 g   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
1 _/ t8 f2 I6 _$ y7 W  // temp = 0x00000F0F;0 J, Q" S- W1 d4 u' c
  temp = 0x00000B0F;' f4 @- \7 b  N. ^" K% p
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized & D( E: l& t  u6 |
  temp = readl(IO_ADDRESS(PCR_ADDR));
3 }- u  p' b) r" o0 L  printk("temp=%x\n",temp);  + n4 M! @2 l7 ^" j7 X
   //SRGR Register2 b% M/ y. Z2 j* R* d
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% `1 R8 I9 P/ `' ]. j5 v //temp = 0x301F000B;
7 }) L* F0 P( L! R/ K( g   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
) b4 `+ X* J: W6 x3 H; L# u  b  temp = readl(IO_ADDRESS(SRGR_ADDR));& h  p+ o) [6 P
  printk("temp=%x\n",temp);3 D' u+ f# G% G$ E, S1 C
   //RCR- {" _. M0 ^. R9 ]! K. X/ U
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) m$ F, c6 B5 k' S! T/ a1 ~
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 |( }+ ]  @, A) [; Q3 b* A
   temp = 0x00440040;! z3 _7 h% f! V! c+ G/ b
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  n0 B; j% j# P$ M8 M/ i" e$ v   temp = readl(IO_ADDRESS(RCR_ADDR));5 ]# S5 o; q7 f& C) R
   printk("temp=%x\n",temp);
8 {, |7 v/ v" N: v% S   //XCR) i/ W; C5 y, J: X) \1 q
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- T6 `/ p+ }+ E5 o( s; H- |
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( \" |. g, {- V; A1 N
   temp = 0x00440040;
  o3 K8 U8 j, }* p   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
: q1 P2 K0 i  q& r# `- a( l2 E   temp = readl(IO_ADDRESS(XCR_ADDR));
2 C* Y$ D9 `5 q   printk("temp=%x\n",temp);
0 J4 ^+ L) g( j  udelay(100);
3 S8 C3 S! V0 z) U  //SPCR Register
  G# Y  S' |1 D4 J6 d# ^  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 `, a: j  v, q4 z+ Y  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  e4 R! L" p( n2 O  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 @# T- g8 {( k  temp = readl(IO_ADDRESS(SPCR_ADDR));0 D" {& D4 _* ?
  printk("temp=%x\n",temp);
6 }. D: {; r$ n* \* h2 {  T  udelay(100);
5 ?& |$ R8 u: H- _- F2 W
& p1 A7 Z! v2 h- ]5 u  //set GPIO direction- z" X$ W7 H8 T
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# I9 g' b- m  v  J- f. o5 ~   temp = temp | 0x00000100;//EPR----input
! B: r% k( a! E9 s- ~- A   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 _) T$ ]- c9 J0 ]( t
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; o: M7 S* f4 N3 m. S
7 C/ i5 n' b# z& |   return 0;/ i9 Y( o( u( x" P. A: H2 x# p7 m
}
3 ]: a( g" C% j7 O2 E) {) |  pstatic void __exit MCBSP_exit(void)/ ?2 ~2 X- b$ [+ `% ?
{
8 c( C  {$ o% E" `# p' c+ W+ w   printk("mcbsp chrdev exit!\n");
' |6 |- d% r  U7 Q3 w: G1 v   cdev_del(mcbsp_cdev);$ d" w1 t( B- `7 z, Y+ r+ Y5 F$ s
   unregister_chrdev_region(mcbsp_dev,count);4 X2 }0 V" U) Q1 }* W; k
   device_destroy(mcbsp_class,mcbsp_dev);, p8 m9 t  _; P6 \& b- Y  M. l
   class_destroy(mcbsp_class);" @0 m6 V# ~- O  z5 h* t
}
+ A! G6 M: o% ?" B. |module_init(MCBSP_init);. ^0 |% R' L/ ^" V; p1 H" b
module_exit(MCBSP_exit);
0 [, f) @9 x+ U( r& Y( g2 E5 O: V8 q9 o$ o
MODULE_LICENSE("GPL");
2 ~. r3 ^( k4 O# l- a9 y- i0 D' r
) p  k1 ~. y( ~) ^) c+ e. i+ p( D. q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. Z* e% z8 ?- Z2 p- S+ s. g
我的应用层的测试程序如下
/ k2 \: a1 i/ `2 E+ ?#include <stdio.h>0 H# J; k+ M7 S) L1 F- h$ t
#include <string.h>6 h6 U; \& A( I) J- R; h
#include <fcntl.h>0 P2 A2 J) C, J7 e3 b
#include <unistd.h>* x# e( K0 N& ]) D; e
#include <signal.h>
/ E) [0 c  u. \# G' n- P#include <pthread.h>       //线程! o2 X* s% n) e: D4 |# k
#include <stdlib.h>
- g; Q$ u( B9 U' T2 [#include <pcap.h>          //捕获网口数据# h5 ^+ J0 Z$ H: S7 F
#include <semaphore.h>     //信号( c5 _1 H( c+ V* Z
#include <sys/types.h>     //消息对列4 Z. C, }# s8 m; W" z' x
#include <sys/ipc.h>       //消息队列
/ z. L4 Q* u' W' F% n#include <sys/msg.h>       //消息队列
5 [/ K' u/ n9 k" u  y" p#include <sys/select.h>
7 P3 `  @1 _: ~& d9 f4 U1 _+ n#include <sys/syscall.h># h- b3 B8 k+ D5 I! h" l1 K
#include <sys/stat.h>
+ A+ l1 z) x4 o; d% S3 H#include <sys/mman.h>
1 r$ M& G) |: j8 n& G  i#define msleep(x) usleep(1000*x)
" z' Y9 t. f* |  R6 I+ I( B5 D% b& M) a( k7 ^
int main()5 e+ X& V" q' D1 R0 K% I+ e( U
{ & d  L' o6 ^. q( d' Y
    //MCBSP,ARM与AMBE2000交互设备" a, Q' }* J6 {: R1 u8 h
int fd;
" G) U1 Q* f* H* n unsigned short data_write = 0x5555;( i; ]. _; L1 t8 E. J: f
unsigned short data_read = 0x00;1 u2 _% j. h) ~* j0 m. ~
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, A6 J# J  W8 k! \: I, N( V/ A
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% `9 P' y8 ]( O2 N- e    / ~/ ^$ o7 P. N8 B/ L
  if(fd < 0)
+ I! m' S1 B2 X  {7 W6 `! |" i# {1 V
     perror("open failed\n");
$ z9 y1 Z- r; S4 g     return -1;
+ {  W' U/ u* @: J* @9 Q( r  }
5 Y9 j, ~& b9 s1 ?( s  
( x) `; y$ p& t6 Q9 N3 @; c" }  while(1)
, F% C: H$ Z( Z  c- w, ^  {
% U0 W+ o2 O. O. U% N& p  K+ L   1 O1 F! q& _7 |/ I
   //AMBE2000每次读写是24个字为一帧4 O* r; m6 z, D2 @8 Y: q1 H! ?6 |& \
   //写数据时将数据在底层存储起来,等到中断的时候再发送2 k$ f; E: P' T3 M4 ]# s3 Q; V7 z, R/ S
   //AMBE2000输入数据是以0x13EC开头的
2 `( c( |+ W3 Y( D9 x% Y; @' W  v" r   write(fd,&data_write,sizeof(unsigned short));
: J: @" ^2 q( ^  P0 o   
. F7 m: D$ Z) e1 q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  2 B2 J% }- Y5 r( \7 Z3 R$ C
   read(fd,&data_read,sizeof(unsigned short));" ~- H9 e* T) r/ n0 ^
   
) Q8 r/ a+ Q0 y) b8 i   if(data_read == 0x13Ec)
) i9 [$ s; a  f) r' ?; k   {
% I, C5 R0 A: C! y   
* V& q9 ~( T! X# a- J    printf("data_read = %x\n",data_read);  C! g$ u; x$ e6 p6 M% a
   }
0 {) W  o/ \; i3 ?9 d   
2 ^0 J2 Q1 y, V; ^  y   msleep(10);- L$ J, {5 k# [+ ~
  
) Y6 r* \3 x- M2 G  /*& ]9 f6 ~% k; T, o
   ioctl(fd,1);   * F3 s) M+ o$ @) L
sleep(1);* u. p( @0 I  @, |1 q: a
ioctl(fd,0);" R2 \! _( I: c& T  t" j1 B  o
sleep(1);. M! a) k- }! ~9 K
*/ 6 D1 ?8 O" z0 b3 t$ K# N
  }   8 k7 o( Y; H" Q6 |
return 0;
. [1 U" G- y% I( X( Q* U" J # y% `5 `& D6 E  ^* m+ m
}
% ~2 }1 F* t! P. T. h, F, u$ R
2 x( e0 D' ^( E1 D- |9 ~7 ^( F多谢各位指教,谢谢! 急$ ~5 N+ M0 ]& U' `: T: S
9 @. q8 v2 R* m& s2 A# v  U2 u

2 O7 C4 u  q1 D3 |1 S6 ~  [% n' K9 a6 X: N  E/ B& K- Q

* @2 H4 u+ J8 L0 t! s1 T, o' ~& @6 k* n1 U' ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 10:26 , Processed in 0.048281 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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