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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & _4 g, A. f2 j2 I: e1 D9 k
/*7 R- B( s2 ~5 p% v; E& S) o. {, u& n1 O
* Copyright (C) 2009 Texas Instruments Inc- T6 m3 Y6 `: ]3 J0 K. d
*
/ v4 I9 p1 E8 r0 t * This program is free software; you can redistribute it and/or modify8 W' y. d/ s9 Y5 B' n  E
* it under the terms of the GNU General Public License as published by& Y0 X' @: I( d, u0 k
* the Free Software Foundation; either version 2 of the License, or) _% j/ C5 p- l" V# |/ g4 F& t
* (at your option)any later version.
& S- }: l, R# v  T4 r9 U; a/ B *
. y& o5 O$ b! s* C * This program is distributed in the hope that it will be useful,! z( r1 Y! |, L& S* X
* but WITHOUT ANY WARRANTY; without even the implied warranty of. X; D- B4 o  a( y& d: z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 k( {# D! p' {' k * GNU General Public License for more details.
- t" |/ F; J6 Q$ \6 ? *
) x$ l& z: C6 r7 @5 G * You should have received a copy of the GNU General Public License& H/ Y* S* T6 d, \0 @# B% I
* along with this program; if not, write to the Free Software
8 T- _* c* L- s) v4 a * Foundati
# W2 o- p# |# I+ [( c/ f*/
1 p% x* D5 r' s+ C#include <linux/module.h>6 F9 s9 z+ n3 c; v/ }% j
#include <linux/init.h>
6 d$ A% @4 U) U0 ?#include <linux/errno.h>) d/ w8 u8 e% R. r" P6 F
#include <linux/types.h>0 f% d: R8 s. K1 Y8 x  S3 |
#include <linux/interrupt.h>
$ I% }7 y( a4 v0 @#include <linux/io.h>
: y" a) O( S( p+ i, ]#include <linux/sysctl.h>1 q* `& S6 F: x# `* R
#include <linux/mm.h>
' m: X1 w  T+ @, ?* h. J" ^#include <linux/delay.h>
; }4 X) ?' I1 B#include<linux/kernel.h>. \( r& K7 I/ S/ D; q8 N. |
#include<linux/fs.h>
; A: p! H( U& z+ j5 L#include<linux/ioctl.h>
6 O* e5 F( ^" ^5 @  P#include<linux/cdev.h>
2 u8 V) j; P$ h- v( n#include<linux/kdev_t.h>1 a8 L- |  X% G1 h- S; G
#include<linux/gpio.h>
: h9 B; a6 W4 F# y#include <mach/hardware.h>
( R1 x- |3 I9 i2 T2 k- F#include <mach/irqs.h>& p! y8 I+ H1 E8 R; ~; h- G

3 r# t# R; K7 K9 \#include <asm/mach-types.h>, B7 R) a* X* N. e! {  G: U
#include <asm/mach/arch.h>4 f$ W/ p& n3 W1 }% A6 W/ E  m9 @
#include <mach/da8xx.h>
# b6 j+ P: J( Y' g#define  SYSCFG_BASE   0x01c14000& O- _/ p# f8 `2 L
#define  PINMUX1_OFFSET   0x124
1 t+ z4 F) v8 C#define  PINMUX18_OFFSET  0x168 % h/ [4 X/ M) V9 T$ b2 O
#define  PINMUX19_OFFSET  0x16c
8 V( V" ]7 e& U3 L#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: f( @/ Z& A* q$ I" f#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR7 l- ~4 I9 J  k: F/ o- D
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
) L6 z5 I/ G5 \. |#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR3 ?4 E/ X: P3 ]  ?- U- x) X
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
9 Y1 C2 G% W7 s" u" {7 q, U$ U                           
+ [2 Q! J0 A5 f#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
6 x" V9 a$ r, [#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
( {$ O2 V$ o9 M. J/ F/ O- D//PSC
: G6 \( l# v; H. R& q% l#define  PTCMD_ADDR   0x01E27120  
! G# l4 o# j) u& |+ O#define  MDCTL15_ADDR 0x01E27A3C
0 }2 a8 g# I5 ?* \4 Y#define  PDCTL1_ADDR  0x01E273045 Q# I3 r- S/ p+ G. G
//GPIO8 direction
: Q* r: Z" v. E; X$ V2 A$ t#define GPIO8_DIRECT  0x01E260B0; W0 m" I2 r, H& Q: m" q' Y$ }
#define GPIO8_OUT     0x01E260B4
5 V& y) N* C9 t) ]9 ]1 B) Y#define GPIO8_IN     0x01E260C0& s* W: t% Z' e
- l; j. h; g+ R' i9 L/ G& e
//#define MCBSP1_RINT    99              
5 v8 v& z/ C  u1 a//#define MCBSP1_XINT    100  
7 X: C- i0 ~% [* bstatic int MCBSP_MAJOR=239;$ j( K: {' N6 w0 z0 |" e+ [) q
static int MCBSP_MINOR=0;
* f0 G2 V8 ]- i$ ?' ^static int count =1;6 x: {! R! c1 U

$ F; x. B$ J+ t) y( |" ~#define MCBSP_NAME  "MCBSP-device". F4 C3 Q4 g* M" V* O; f
/ q# f$ e9 S6 s/ `- u$ Z. C4 X* b9 w
static struct cdev *mcbsp_cdev;
9 M! k/ ?. K* {/ jstatic struct class *mcbsp_class;
+ }8 g6 R# m; r4 k. I. e6 V4 kstatic dev_t mcbsp_dev;: ^( i, |2 J4 M2 \% Q
unsigned int DRR_data;
- s4 M4 p' a3 ~* b" j/ Hunsigned int DXR_data;
" G  S0 w; G& x6 z$ gstatic int mcbsp_open(struct inode *inode,struct file *file); @- X& V8 @& M6 Z" @
{  B; N$ J5 Q5 G+ Q1 I$ ^5 f5 P7 A7 L
   
/ R3 ^0 U7 W5 n  `3 L9 ~& A   //interrupt enable,initialized
8 L( A  Z! B' ^& d2 o) ]( ^: N   unsigned int temp;  E( }# y* K! v/ E* L# g1 x
   //SLEEP_EN(GPIO8[10])---0/ p8 q; F) z6 [& L
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 T" ^& `* G8 _1 E( z# ?% p
   temp=temp&(~0x00000400);! I: F% z8 ^, J! p6 b
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 o# c$ }) }5 @& ~( ?& ~/ J% S  //RESETn(GPIO8[8])----0----1
7 x6 [8 X! C" l$ p# W- Y: w5 U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- S3 p  B7 ~  _* t/ `1 W% a   temp=temp&(~0x00000100);
' V# O' N% `; u& g1 ]   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ w. w  x! f, w& T   udelay(100);
! T8 ]/ K& D: ]/ ?5 M$ o   temp=temp| 0x00000100;% z2 j  J" p6 H) ?1 @5 N* }5 Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 J( x- N  [/ Q4 Y+ ]3 P2 J   udelay(100);
) ~+ [- q1 V" z% l1 y   printk("open success!\n");
! t8 b. Z( j; v/ b   return 0;
  f, k  J  N! K- c% V}: g3 D1 ~" q7 f0 r1 V( j

+ o2 y8 h. _7 A. |. {& M, f6 Estatic int mcbsp_release(struct inode *inode,struct file *file)
% B3 l& y: A* B, c{7 B: e  ?7 G/ f  ~1 ^
   printk("release success!\n");3 V0 G) A/ a0 e
   return 0;
8 O2 v* ~, z9 r8 G& P7 i) Q4 ]}
* J. m8 k. C2 Z
4 H) u1 e; V) @# A2 M# |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
  ~: q% Q: V6 W" s; s4 z/ k{+ f0 \: B% u& b7 C& t9 G0 _1 V
    copy_from_user(&DXR_data,buf,len);+ Y4 j( m% W& z0 F" z1 \* C
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       * o) J  \8 F( A1 O+ ~* a+ C
    return 0;
3 M  r- L+ _7 D1 j 8 J, p$ F) U! s! ^  e5 _; V
}
  r/ G2 x. w. u( f  z- A* O+ U* ^. g+ |" D
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& ^& `! g/ i( w, u+ ^) n) {
{ 2 U. x/ S. @: i) B
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ r8 E7 o. d9 Z  k/ i
   copy_to_user(buf,&DRR_data,len); % q1 w+ ^; \3 V& `3 ]
   return 0;1 ~: k- [3 Z" G$ j' E- S% H, a5 D
}6 e( f' W$ q6 W( G4 L
: b, _7 h7 e6 {9 ~

, o8 F( ?. Y" C, Tstatic struct  file_operations mcbsp_fops=
; i! u" ]3 f/ n) h4 M. ?{
0 Y/ Q7 I) q8 K: i: A% c/ U   .owner=THIS_MODULE,/ o% |: C; {% V: N. _2 ]2 ~1 N2 \( }6 \
   .open=mcbsp_open,
6 [- _% m0 W2 q   .release=mcbsp_release,
9 A& b+ }% G# w6 [' h2 J   .write=mcbsp_write,8 _7 x/ X% D6 f" Q
   .read=mcbsp_read,
" `8 W( k5 E. A1 o+ m};) A' y; b$ u$ P/ f! ]! |
static int __init MCBSP_init(void)6 R  ~1 G* c. n8 @7 o% `9 P" u9 |
{" |8 [3 U; R% |& v3 k
   int ret;; C- C1 h6 K. s8 T
   unsigned  int   PINMUX1_REG_old;" M# U( x/ U- {# z) L2 Q
   unsigned  int   PINMUX18_REG_old;
, r+ {- a0 _% O+ U- I& a   unsigned  int   PINMUX19_REG_old;
" b6 ~$ W7 [  \6 n* t   unsigned  int   temp;  6 g4 C( w. N0 O: W0 }" F/ W
   if(MCBSP_MAJOR)& Y+ q& l2 k# l: A2 X
   {1 g: u5 }4 a% P% D( o; _
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- ~0 O2 J1 G5 |9 @# p* Q5 l
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);# l9 c- \& a2 {) w- M% o. y) W) ]
   }" q  _' c6 @8 a/ t% c/ b
   else$ s) \6 V/ z6 [, S' K$ ?3 j: r2 P
   {9 M7 i* p: w% Y
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 p+ c+ z& X1 x3 [/ i      MCBSP_MAJOR=MAJOR(mcbsp_dev);, r9 Z/ k; e7 ^+ f) d7 v2 p
   }
1 l3 k2 q! x3 h7 R5 `: |   3 t' {$ t& Y3 _: r8 Y; Y' b  M  y
   if(ret<0)
0 ^4 e, `9 a4 r. H  |5 m  i4 \   {2 u* D/ X( x% |/ `% Q$ Y* n
      printk(KERN_ERR "register chrdev fail!");
- Y3 x( ^( y# i6 |      return -1;* [! e/ f+ [, I1 K- P/ v& x
   }
1 _4 J6 t) k0 K   
$ F9 q( n% @9 p# L% x- [# d   mcbsp_cdev=cdev_alloc();, x) M8 w* I& ?0 p# j
   
6 ]1 F, o/ _2 q   if(mcbsp_cdev!=NULL)3 E, C) k  l: C1 T: a/ F3 H
   {% b: X. u3 b& S2 p% w
      cdev_init(mcbsp_cdev,&mcbsp_fops);6 w. i* N2 e7 f9 G9 h
      mcbsp_cdev->ops=&mcbsp_fops;
& y" O* k5 `( a! B) L      mcbsp_cdev->owner=THIS_MODULE;' A, T( e! `1 W5 s2 D: E
      ) v/ X5 Z; U3 o+ O. Y3 N  [
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): t' l9 a& e9 m4 a* Z# ^6 @
          printk(KERN_ERR "register cdev fail!");( I3 U& k8 u' d' p8 ~0 X
      else% {' G$ A+ d8 ]2 T
          printk(KERN_ERR "register success!\n");
" w& n0 N' A9 b$ Y* z   }' [" J: {1 Q* y8 c5 a
   else7 r3 F6 _8 r0 ~2 y! a  ~8 T
   {
" h8 U+ A/ S# p0 g& h  R1 l7 Y      printk(KERN_ERR "register cdev err!");
) W- X$ f9 d# n$ h& q      return -1;6 R. Z6 ~& g4 T) O% q
   }' ?$ n& F/ V0 Q2 V- U" q
   
7 d5 k# W$ i/ V) r" D7 j/ F, Q1 y  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 q" n2 x* y& R; \% m   if(IS_ERR(mcbsp_class))
( o+ |: J+ z$ c, S   {, E8 t, G- s! B% _. O7 U( x7 I
      printk(KERN_ERR "register class err!");
* [& W+ _  U* D. ~   return -1;
  U( L0 i$ q- B2 a& _& f1 h$ o   }+ U" |& P# e2 _
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
  i7 G( M8 Y$ C% P- G
5 c) e) e4 @" @4 _4 s7 G7 m3 }9 |  e   //PSC" P- p( h" |" L/ O" J0 f
   //add Enable MCBSP
2 J" V9 L* l, Q* [* L% c   //test" S. O# L* M0 l( s1 E, [/ P2 e
   temp = 0x80000003;, D- b; j7 x2 w% w$ G/ |; v; Z+ g
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
3 Y! L1 U- R& ]( D4 a   temp = 0x00000003;$ }) f5 U+ d& z$ H) `5 v" g
   writel(temp, IO_ADDRESS(PTCMD_ADDR));' x( g. v' w% i4 X1 x0 P% }$ V2 [

2 o  w9 E4 G) ~3 Y* H   temp = 0x001FF201;
, F2 W+ a: X6 q; i) G( y2 n& e   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
5 J; H5 ?5 U. G) b& ?& @% }   " e" \! y; n0 I$ o( c
   //PINMUX  
6 b7 z3 }. G% ~, p   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ t( h5 Z3 s4 \' x$ g; k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 i* L( C7 m2 X+ V4 z( N
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
6 {7 I' J4 j2 o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" E" ], b! G6 c: |# g0 O, E   
3 g! R; w+ i4 J8 l! L2 i   //SLEEP_EN,EPR,L138_SHK1,L138_RC
7 _6 L% Q; e9 }3 b$ x2 C9 `   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 k  c' ^' r; ~: R6 S- S" n   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
; J6 s* k; T; S' [8 q   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: {) j& I1 `) Z& r6 C! ^) _

+ ^* [# W+ b3 ]  ^1 V   //RESETn,L138_SHK2
9 e8 w; }$ h) [+ |7 Q% d   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ) D! y( o. ], F9 k
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;     M8 V& q1 r4 y8 x
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) E$ l6 M7 \/ f! [' |+ @, m

- u  Q) L% s- [% `. Q5 k4 c) j5 p) p * L& k3 o, ^, `3 D
  //SPCR Register9 [% ]) k) r' J* @7 p: V/ J8 S
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 F5 R2 U0 K5 K8 q# ^# K( a1 ^& e
  temp = 0x03000000;//(DLB=0)( i% l' _* B9 W$ ]% p8 p
// temp = 0x03008000;//(DLB=1)9 C1 Z+ f5 [2 n1 ]) {& Z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset8 A( I8 }  Q& H4 f: e" V5 Z
  temp = readl(IO_ADDRESS(SPCR_ADDR));& p8 z7 |! ~5 }& G/ B, Y! }
  printk("temp=%x\n",temp);7 |) S" j1 T5 B# x- m

+ L3 ^' I2 H6 b" ?5 t* n6 N   //PCR Register
, U3 r) W; O. h% B( O8 _   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) g# |3 l& R1 H1 ^/ a
  // temp = 0x00000F0F;2 C( l. M) e" z8 q$ t
  temp = 0x00000B0F;
2 u- t8 f& ]! N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 0 a+ X( y9 E7 m/ b
  temp = readl(IO_ADDRESS(PCR_ADDR));! B% b% |) B# \7 M5 A
  printk("temp=%x\n",temp);  1 l! \5 T) j1 ?
   //SRGR Register0 _- ?3 Q1 B  L. r" P9 X5 b5 K. t
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; [; `3 v8 q* K4 [ //temp = 0x301F000B;
( m# a5 [& l4 c8 j9 g/ K$ L   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
& |/ b! U7 H/ f0 a' V* ^* ^  temp = readl(IO_ADDRESS(SRGR_ADDR));% j1 n. b3 D# k" ]# m% j3 t, p
  printk("temp=%x\n",temp);# N0 k* C4 G) V; Y2 `$ g
   //RCR7 y# }0 Z2 q0 P+ D! ]: x: i
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* J) @- m0 Y' \7 v3 ^  S   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" i3 q8 |4 h! ~1 C; ]/ J   temp = 0x00440040;. J9 r0 H, L- P) ~
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
1 G% \; b: a% D2 g$ @   temp = readl(IO_ADDRESS(RCR_ADDR));" G1 B, G( `- u  i' B2 T/ A% d
   printk("temp=%x\n",temp);
/ ^( i; y& r4 Y, ]- K+ P   //XCR
; {1 \( E$ Z1 `* v% |$ q: H. f" W   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-19 [' {  P' a8 ?$ d+ ~4 T
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. y7 p2 G: ?' c$ O
   temp = 0x00440040;0 z6 W" z2 W$ X0 o) m" P: g7 G( }
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized     Y! w! z: ?; W1 x, y. L
   temp = readl(IO_ADDRESS(XCR_ADDR));
: _- a" r1 v% s) I   printk("temp=%x\n",temp);
& z9 t: E$ U: i5 V. j9 f  udelay(100);" M$ h# C" h. s1 Z: ]& D! `5 g
  //SPCR Register
- k4 F  }4 q  Q& g% K3 e  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; S6 ^* k4 E- j7 z  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  \1 Z! x8 h1 o* k+ f8 I) q  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
* O4 m* ?7 D1 d" F& L  temp = readl(IO_ADDRESS(SPCR_ADDR));
) ?/ U# u0 O# [( r4 ~' C+ E0 k( \- k8 w  printk("temp=%x\n",temp);
  s, i9 ^  ?# y9 ?  udelay(100);/ k3 @  l3 n; c% r0 m6 z9 N

( R! e+ g4 u* q; x/ ?9 s  //set GPIO direction" e5 b7 m3 U% W' j0 ~. @
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" Q; R8 a7 S$ E( i1 F
   temp = temp | 0x00000100;//EPR----input
" i& Z# |! {  v; x0 `1 d8 y5 _   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ n' d: ?$ P( _( Q& p7 d   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 3 s+ _/ o" }6 |2 u4 o" ^
8 [8 o/ t5 }+ _
   return 0;
/ ^# Z7 C5 P( I  Y# i+ L}+ H8 v/ m! ^3 i, D
static void __exit MCBSP_exit(void)
/ z& O/ J% m/ M- x{
$ }$ d0 k6 Q  e. r! L: o* }+ _   printk("mcbsp chrdev exit!\n");
$ O3 _, Z9 u1 A# i5 J6 Z9 w8 T# `/ M( o   cdev_del(mcbsp_cdev);
& q. c, O7 q1 T+ w, k7 B% w- U3 [) @   unregister_chrdev_region(mcbsp_dev,count);
9 {* S9 j  o2 q( S   device_destroy(mcbsp_class,mcbsp_dev);# E8 M7 X; i) a9 |& H5 J2 ]+ f
   class_destroy(mcbsp_class);
  ^, h$ n  R7 o) I$ N}% k' E+ x6 \; R! ?- g4 O9 E/ g8 D
module_init(MCBSP_init);* X6 R( k2 A* V0 O$ e- @
module_exit(MCBSP_exit);
9 p4 a* b8 R" O6 u! i/ y1 F; U5 \; h; E$ s/ V2 s
MODULE_LICENSE("GPL");
" M6 A$ J3 {0 l# ?9 w. [! ^% m7 @1 s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 z( Q: C( q# U+ ]8 G
我的应用层的测试程序如下
; y$ |# }" N4 O2 M1 \, b0 ]- U#include <stdio.h># [8 f/ z/ ^) F' M. h' r4 `
#include <string.h>
/ Y8 p6 L. y- ^; U& z#include <fcntl.h>1 b( {5 I& E( f' ]% z
#include <unistd.h>
. H: J+ F& V. I, Z5 Z3 [' D/ F9 a#include <signal.h>
  c* D0 I. G% {1 a; f' w#include <pthread.h>       //线程
) n$ u9 K& S3 Q# g#include <stdlib.h>
) }& W! O( e" z; R5 \#include <pcap.h>          //捕获网口数据2 c: C6 F+ R+ ]
#include <semaphore.h>     //信号4 a( @* }, m3 g% [& [# M4 e( P
#include <sys/types.h>     //消息对列1 Q& u  E: \; i, e! g% g
#include <sys/ipc.h>       //消息队列
$ f' _8 ?3 L, I# ?9 [$ }7 o#include <sys/msg.h>       //消息队列- Y' w7 k' H( ~% e: y" W
#include <sys/select.h>5 V+ l( O4 z) k  h
#include <sys/syscall.h>
' y1 _% _3 |# `0 ]. @#include <sys/stat.h>5 \! u: I2 N! x: P; l' R
#include <sys/mman.h>
; _, G+ \. X' `1 z; B, z7 w/ Y# D#define msleep(x) usleep(1000*x)& Z. p6 }( b4 k+ J+ v
: J) g% T! S- R
int main()2 m7 u" `/ {) q% \
{ * J7 Y3 n# s/ v/ J3 L
    //MCBSP,ARM与AMBE2000交互设备! N: l$ r' y/ @+ J2 @; b
int fd;
: M. R5 Z' \" p# z: [! }0 P unsigned short data_write = 0x5555;
" k% v6 A' v$ r* Z! n unsigned short data_read = 0x00;
6 K6 O# ^1 \7 \. @) Y$ {# x  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! l, N. `, _: ?; i' x
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' w( b" b3 j7 k/ G0 A, J0 c5 E( s, @    1 i4 Z3 J" P, J1 G( G6 ~# t
  if(fd < 0)
- g) C5 d# F* B- a7 t0 C  {
# `: N% `6 W3 T: o) A  _     perror("open failed\n");
5 ~1 s1 h! _) r$ g     return -1;+ |3 y8 C  c6 W& Z, ?
  }: L2 N  Y0 y6 a. @1 L
  
$ Q: H+ c% k" ^2 k  while(1)1 ]# U" t# x; U5 Q8 j3 y& c
  {1 U. M# K$ l6 k. n5 U
   ( F0 }2 t% U  @* b( a" C+ m
   //AMBE2000每次读写是24个字为一帧. v1 i- a/ K3 A& p; W9 e
   //写数据时将数据在底层存储起来,等到中断的时候再发送
0 B) G. F! h' R! G   //AMBE2000输入数据是以0x13EC开头的# M  f; d6 I3 ?% F
   write(fd,&data_write,sizeof(unsigned short));4 n7 f  o& Z; k2 E
   
6 @, K5 T% h$ g  n   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 N, C" l) L; i$ a/ M
   read(fd,&data_read,sizeof(unsigned short));" s, p+ b' I$ }  O
   5 O4 h- {+ V& ^9 }8 d4 g
   if(data_read == 0x13Ec)1 U2 x' g/ m) z
   {9 V  _/ j4 g* B/ I" t
   
6 s1 G1 O& a! k3 d0 d) j' Z    printf("data_read = %x\n",data_read);
  A7 i( D( h4 G2 k  L7 ~/ v/ k   }" X6 F0 Y- o) x6 u* w
   * h9 x, c5 \  x/ }% x$ p
   msleep(10);
7 q6 \8 U8 Y+ p2 ]$ @; i  : v. m6 ]4 a. }% H
  /*
8 H; h( J2 s% i! m7 S. R   ioctl(fd,1);   0 C: B8 Z, ]5 [0 [: e* D
sleep(1);
/ X  M! d' R1 `7 W4 R3 h) N ioctl(fd,0);
3 m) d. M) a4 I3 H4 [' g. S* G sleep(1);
5 f3 y! y' Z& n */ 8 k& L3 V+ _: j2 O4 {6 ^& C
  }   ) S( Y  e5 S7 E* ^) l
return 0;
4 D0 k6 ~( X# x8 J9 k+ f 1 p$ u, g0 l. p; D. G- `' p
}/ u1 _7 U- U* p/ O$ g! X$ _. `

7 Q0 F" a, B) D: r; p) _. o多谢各位指教,谢谢! 急
  k  H2 |7 s$ j" o- }* Q0 J7 z! s/ z* G' z; M

' E& G; E. ^: i9 T; h$ q& B! g, R" A4 ~2 W5 U9 G+ ?7 G* {
( f! x* c2 p8 ~& l9 R( _

  w8 v8 g+ u7 w- |! u' {9 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 02:55 , Processed in 0.047415 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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