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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  _7 X* N) ^9 S* E+ u. Y8 ^, q1 F% {/*
- h/ H7 x5 C! d% \: i( t * Copyright (C) 2009 Texas Instruments Inc  I$ z: v" ~. `
*, O; G0 X( c9 @: M# J
* This program is free software; you can redistribute it and/or modify
( l4 |' l2 }4 } * it under the terms of the GNU General Public License as published by
8 ], [* F7 J! a7 E+ U4 y * the Free Software Foundation; either version 2 of the License, or' B/ U* P% ~0 b9 Z1 M
* (at your option)any later version.+ p# \0 y- }3 k: v$ P
*6 F4 ^' ~) j$ r0 z+ o+ ~
* This program is distributed in the hope that it will be useful," r9 E2 ]# a4 s# W# x
* but WITHOUT ANY WARRANTY; without even the implied warranty of
+ b3 m& x/ J; b" R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& E, [) l: U; i& z1 a
* GNU General Public License for more details.
) P  Z! i9 V6 E4 N1 x+ u *
/ z6 o) e2 G  J) Q * You should have received a copy of the GNU General Public License
1 r7 {$ T2 i2 u) w( Y' y' D4 E# I$ U * along with this program; if not, write to the Free Software
! r% X% a4 q; }" }# w9 s* ?$ j * Foundati
9 y9 Z2 b6 s' d% R/ i- i! r*/6 m$ s# W) f) |% K& X
#include <linux/module.h>$ g$ l# N0 V9 J& g4 b
#include <linux/init.h>2 B9 X! K3 t2 N. O+ u4 L% T+ H
#include <linux/errno.h>
2 a" D( y3 ?3 J4 A4 V# B+ M#include <linux/types.h>
, C& G( [' H  s* b* P# O- K0 u#include <linux/interrupt.h>
" k) e( H$ a- w, @#include <linux/io.h>
# y+ i1 F  b/ z& i# Y1 K#include <linux/sysctl.h>  ]5 J6 x3 r0 F9 R% I) T6 {
#include <linux/mm.h>8 Q+ b7 U: U. m# t# r% C, x1 m8 X/ J
#include <linux/delay.h>. N5 I2 L: l' l+ Q8 q* s
#include<linux/kernel.h>
9 o4 m5 v+ e" h# }3 N- I#include<linux/fs.h>
5 |, Z, w' P% I9 S# [3 g#include<linux/ioctl.h>3 [/ e# S) I0 D9 `
#include<linux/cdev.h>
: c0 O- `: }; x6 `3 ?#include<linux/kdev_t.h>, D7 j! _/ Z6 G" k  `
#include<linux/gpio.h>( t' Q* ^7 p- K6 X+ L
#include <mach/hardware.h>
* q, ^. Y% R2 x3 F9 c9 I3 u#include <mach/irqs.h>
2 d0 Z( _1 x/ S8 m6 y2 Y- Y! N: Z  \, [
#include <asm/mach-types.h>
; n8 ^: r! f2 N7 _" |  ?' \#include <asm/mach/arch.h># v2 _+ {2 J. o" Y
#include <mach/da8xx.h>
6 }: m* o. B& N2 Z: Z#define  SYSCFG_BASE   0x01c14000: h6 @! w- _# g5 {8 X" m' z
#define  PINMUX1_OFFSET   0x124 / b3 w/ M9 g6 [( j! |) t
#define  PINMUX18_OFFSET  0x168 0 u! m- n* }, k' Q
#define  PINMUX19_OFFSET  0x16c0 C5 ?! j) P' x
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR7 Z6 i( u6 J; E
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 v9 T' X4 Z" t4 [: ]; {9 N
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR& E7 k% S" M% M0 s$ I- N9 ]) j
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 H. L9 o9 N3 ?: b" X3 E#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR. z* p8 s3 T! z5 h, m
                           
8 ~! f$ V: t2 }; v: B( s1 m4 s) D#define DXR_ADDR      0x01D11004  //MCBSP1_DXR9 _8 o4 I6 R7 q. E( t
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR1 z0 X6 Y2 ~& v3 w# l$ d
//PSC, g' _# b  N- V) l, K8 E+ A1 X6 P8 `
#define  PTCMD_ADDR   0x01E27120  ' r5 T$ c) K' J
#define  MDCTL15_ADDR 0x01E27A3C
9 ?5 T* b& p  M8 _1 B, X8 i9 c#define  PDCTL1_ADDR  0x01E27304
4 w1 B5 U6 B: }6 W//GPIO8 direction
$ v/ o: r1 R# d) m' r& p#define GPIO8_DIRECT  0x01E260B03 ^$ j  L2 O4 T- Z- U6 \3 y
#define GPIO8_OUT     0x01E260B4
1 R- L4 ]% ^, V/ Y! x#define GPIO8_IN     0x01E260C0$ b3 d  S4 [% z% z1 S, r$ L
# e8 w  v0 U8 x
//#define MCBSP1_RINT    99              + }* t% F9 M- D+ Q7 j& ?
//#define MCBSP1_XINT    100  
4 E; m1 x2 P5 w- a& ~' ?. }, l2 k, dstatic int MCBSP_MAJOR=239;
* ]3 o9 v. H' p$ e) Gstatic int MCBSP_MINOR=0;
$ t! Q3 @0 }% R/ r* R9 p3 h: @static int count =1;: X, P  S7 {0 ]. o

) p; H) U, l* j1 _; o8 Z8 a( L! G#define MCBSP_NAME  "MCBSP-device"9 S4 S% r' z& {. D$ c" T
- T0 x$ u+ `, r
static struct cdev *mcbsp_cdev;
, V& r$ }0 M: Gstatic struct class *mcbsp_class;
) y& I6 Q% S- x% B$ {static dev_t mcbsp_dev;) `' X- l3 n7 z6 c! m  j( z
unsigned int DRR_data;* [- r/ D8 i* O2 j& ~6 F* h
unsigned int DXR_data;2 t. K1 ?' p0 U& ]0 |) K
static int mcbsp_open(struct inode *inode,struct file *file)9 y6 o- y8 W3 I. s. N
{
0 I, Z* C- @1 D& P5 l' j' h0 |& x   9 \4 n2 {3 U$ H/ C. y
   //interrupt enable,initialized
. C* i0 z& w: ^# _   unsigned int temp;! g8 H/ c% R8 u4 V% K* B5 I1 q0 s# R
   //SLEEP_EN(GPIO8[10])---0
4 E' i% U: H( ]& B9 Z: I$ Q; U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ `$ ^6 ^# A5 u% V* S0 ~1 p1 O" X6 N/ y   temp=temp&(~0x00000400);
% I9 \! b/ f3 q1 G   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]0 Q  h& b# _( V* I1 P  G5 W* e# p7 v
  //RESETn(GPIO8[8])----0----16 |: U+ R- I. |; l- n' G
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* X. V  r% ~( M
   temp=temp&(~0x00000100);
- v& f1 Y0 ]; g   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; o1 D9 h' g8 f: i' H2 N9 h
   udelay(100);
) q* v5 k( {, G+ y  C   temp=temp| 0x00000100;3 F, r7 }' o4 X$ }4 T
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; k# p! E7 y% ^$ ~  I" [# S& d   udelay(100);
) ^. ?6 r6 F3 |0 W* n) ~& E   printk("open success!\n");  d- c4 e. Q+ P" F
   return 0;
" x  X$ U) l+ x  l4 _: J. }}
* p( u4 g' _0 y- P7 a3 g! K& z5 T6 `4 U; j
static int mcbsp_release(struct inode *inode,struct file *file)
* N  R' P" ]# h/ n{9 u# Y) g: x4 p
   printk("release success!\n");  M0 h& V+ ]4 P% R. h
   return 0;
6 ]) E- D. H) O9 o}
/ L: C1 @' ?( u6 t
$ U6 D9 b7 p) \3 Bstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 ~4 y3 {+ f1 \4 \% w- i5 N{
3 p) O4 ^. t  ?- f    copy_from_user(&DXR_data,buf,len);! N& p/ i/ L, B. }
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 a* I  u& q, Q; V
    return 0;% R; L5 D% f( S. f) }5 O
9 ~' P0 E$ q! j9 C/ @" m( l
}
, ?3 r% y. e1 L+ ?" O4 V# O# h6 I7 x
/ K* k( X4 N$ ~; `5 X! Y3 E# Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 l0 m/ U1 W! t; P0 i& e{ ! |* I; x  T- [; N
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ]- q' r" o, G$ V   copy_to_user(buf,&DRR_data,len); , A9 f/ o% E& v: M3 }5 O9 p
   return 0;
5 D- p( `9 f9 @, u! @+ {4 @}
- c' Y  s/ {9 e  V& z( F  g& J7 R) r! `+ I6 k+ N% \
- A5 j  G7 b2 x6 ]* `  Z2 H* K
static struct  file_operations mcbsp_fops=% y9 \/ [& T- n
{, j' s) B: W( `/ O4 [0 ?. }" Q
   .owner=THIS_MODULE,8 m8 i) g4 Z. U. w
   .open=mcbsp_open,% d' ~6 H" N, U& i; u
   .release=mcbsp_release,
6 O- W5 U, v- B. A4 X$ P   .write=mcbsp_write,$ J) ?: q( V0 g; T- U; Z, L
   .read=mcbsp_read,  P, i( {, X. E8 L# \; y& x
};
. f  y& M* P; Q! z0 ?static int __init MCBSP_init(void)3 ~3 y. Q2 ?1 ~: h  w  ~
{
8 y" F& B$ |9 K2 L8 e. D, f   int ret;& i* s6 D7 k+ S, V
   unsigned  int   PINMUX1_REG_old;
8 P( [/ {+ j3 T& y6 g4 N   unsigned  int   PINMUX18_REG_old;1 x/ E; J- v! I, H; S
   unsigned  int   PINMUX19_REG_old;  I' r9 L( f9 [* c2 S" ^# K
   unsigned  int   temp;  1 \+ Y* q. D( V/ i) l! J
   if(MCBSP_MAJOR)7 P* M4 J8 R% p8 k  i+ q
   {0 g: ?$ v# `2 P
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
6 U6 R6 o2 }4 v* ^; S$ {      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 T* r. z# @# M+ Q3 z   }0 O2 w$ G: ~4 P+ V* {
   else! T+ f$ E" H: m& S* ~6 P
   {) h0 ]/ |/ P$ _5 P1 h0 _- r* Y
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& L4 ^3 q9 N% Z9 i5 d) T      MCBSP_MAJOR=MAJOR(mcbsp_dev);
# l9 b, B! o9 _2 r   }0 P' {. C4 B+ @" H, A" w
   
* }! d9 S$ c9 t; e7 t& D  j* k# _+ o   if(ret<0)7 L1 S* H. v' \
   {+ I. H* [, b) _9 l3 k
      printk(KERN_ERR "register chrdev fail!");
* A6 \/ Q/ b% m1 s      return -1;
% v! q8 M+ s% b9 q- d   }: B2 R; l( m1 p
   5 i1 v( u5 [% d' H% Q9 C
   mcbsp_cdev=cdev_alloc();" m& H1 M9 _! T- Y+ C/ X
   
0 t/ z* c4 C% I   if(mcbsp_cdev!=NULL)# x2 K0 q0 V2 `4 [/ \
   {9 P( {( [" n: \3 a- e4 ^: L; A
      cdev_init(mcbsp_cdev,&mcbsp_fops);
9 p% R8 T$ g; e/ p0 C0 s7 G* P      mcbsp_cdev->ops=&mcbsp_fops;
: n% ^5 r; w7 d# ?9 ^8 ~  t9 R      mcbsp_cdev->owner=THIS_MODULE;
6 W: g2 D5 b& G* u/ G      
7 J3 {% `6 H% S/ J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))" |( f& p" p/ q% P
          printk(KERN_ERR "register cdev fail!");
9 e& V- D) ]) K4 D      else
) C; A3 X, s; l) A$ `$ V          printk(KERN_ERR "register success!\n");
8 l8 Z" E) J; l3 X( ^+ a   }
1 Y8 m& S$ D0 j6 V. I   else
8 a& V  _. P# z   {
! Z) j  m* U, \3 i/ a" F      printk(KERN_ERR "register cdev err!");
) C( E2 u, [; m! _( T6 B9 Y6 [      return -1;; R, L2 h3 d& g* x" Z
   }, r3 f8 v. m* i
   4 Y) {  ]+ B; Z
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- @2 r. k$ U% t& `, W# r3 b7 N. r7 \! p   if(IS_ERR(mcbsp_class)), u( r& d1 M7 [1 e8 ~. s
   {
- Y) D: F& W/ S, I      printk(KERN_ERR "register class err!");' ?2 I1 Q9 X8 W5 I. T* Y
   return -1;
) V+ Y3 [; ?& @6 N  v, y   }
2 C3 t/ a( k* N, F   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 l# G4 p. L* [% f: R. ?
& z! O( E6 }1 X. D# p6 _   //PSC3 q, B0 j& ?4 l3 ]+ R* M/ T2 J
   //add Enable MCBSP
6 e5 K6 D" X. a2 z8 p$ u2 }) Z   //test
1 A/ D% I* p5 }9 l( I; c5 s( ]   temp = 0x80000003;( i6 ^5 B+ x) [' T/ g8 J6 R
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 K* d8 o9 J; \5 O- q! @1 o   temp = 0x00000003;
  x+ T9 b% J0 p# b. f7 h   writel(temp, IO_ADDRESS(PTCMD_ADDR));; l, J( X! E% }0 |

4 V2 G  b" m8 C   temp = 0x001FF201;
, L: P) u: ]& {) L; U+ X. z   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" _6 Q7 S: W) d9 b
   
8 @; v$ Z4 }# S. H2 N* G) @; s   //PINMUX  
' r  Z5 L1 y& p: [   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; x: _/ \6 r0 Y* A7 z+ m
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  & @* F) i0 I4 Z1 F* X  ^
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   2 E. n4 J6 C: M5 c1 o- ]3 N( P
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);2 L- m( o" T5 _% d+ N" l/ s: S
   ) ?0 d# {) O* Q4 X
   //SLEEP_EN,EPR,L138_SHK1,L138_RC' @9 C; |4 A( ?
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
! g1 W3 K( ]2 j; ~   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ( Q/ h3 N& s6 h$ S& @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  a+ F' m% i$ s

: I* R3 D4 H: \2 t" |& E   //RESETn,L138_SHK2
. o1 c0 C7 x1 d2 ^: [5 X- c5 n2 H   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 _4 O. A1 O, M0 n9 Z* M3 x   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 x% H0 D- j7 `2 f) N% _8 Z% L   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) X( `, b+ F, w
" @9 s- A4 a$ Y
( J& ?2 p' }3 f6 A3 C+ |, I, x  //SPCR Register* y: }0 v2 J, r# u" a
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" r+ ^6 G, G* j( Q2 b+ [/ I1 x) @  temp = 0x03000000;//(DLB=0)7 X  j9 d5 O8 \8 k, T/ K
// temp = 0x03008000;//(DLB=1)
: o( {' L3 A3 f# {$ y8 w1 P; X9 Y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset! h2 k+ ^+ s$ s3 h) ^' k
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 w& m* Q- e+ c2 b" A% d) C+ }$ D  printk("temp=%x\n",temp);1 g4 m4 D5 `( I* j
% j( i9 L/ f: N6 N" u8 Z* @2 T
   //PCR Register& w, {' K& t  R4 b* E* v8 l
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 _: b9 V* u6 Q$ u5 @1 K1 n2 Z  // temp = 0x00000F0F;
' R  N! g3 w, f8 M  temp = 0x00000B0F;
+ j! v) A7 y' O. H9 ?% m1 z7 \+ u  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   \0 e/ K+ N, r5 O1 B
  temp = readl(IO_ADDRESS(PCR_ADDR));
# _, E0 L/ s$ F. ?* X3 Z/ z  printk("temp=%x\n",temp);  7 u2 z$ G/ \  V* O9 ?9 e( q
   //SRGR Register
9 F+ c9 n# R( _+ Z6 j1 U" y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 b# W% ~) ]' N* p  {: u4 ~# d' x
//temp = 0x301F000B;4 I8 P% r. O1 R+ [' b( `
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 N, B3 q! N! p' z' }' d( e' ]
  temp = readl(IO_ADDRESS(SRGR_ADDR));3 F; {. k6 S9 ]4 |" o6 _
  printk("temp=%x\n",temp);% |) z; e) m6 ]: y0 f; v
   //RCR
2 w7 M9 d3 v9 x. G2 W   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
/ f/ X. M+ H% s   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# e; c6 [7 Q: m1 X% D4 @7 G& ?   temp = 0x00440040;
) k% A7 w. ^! o$ v   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  R" d- h( g" |. H2 E9 O- a   temp = readl(IO_ADDRESS(RCR_ADDR));5 \5 L" h% \( Q2 ~2 H
   printk("temp=%x\n",temp);) `5 F( w7 d( G( i8 t1 M
   //XCR% L) E6 P5 e% B  Y" }' }
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% b) s$ U$ ^/ n5 `/ O
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 o% b$ L  }+ H. @' Q% y   temp = 0x00440040;, O& J4 S. J! P0 p+ V$ }9 |" P
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 R4 w" `% s3 L% R- ~6 ~   temp = readl(IO_ADDRESS(XCR_ADDR));0 c+ a8 {2 B$ N' T- m, o) r
   printk("temp=%x\n",temp);$ ~: O9 I# G' u6 s8 _
  udelay(100);
. @+ J% i0 K9 O+ g; }$ d5 x  //SPCR Register
! i7 J1 J( E6 ~  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 C: F: a0 A: o! ]+ G! ?% r
  temp = 0x03C10001;   //DLB = 0 VS DLB = 14 i: T4 q4 l0 U
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled% i8 x/ K$ t3 f; \5 T0 p# f
  temp = readl(IO_ADDRESS(SPCR_ADDR));, Y$ u! ~: X7 X, ^" |% C# t. {! S
  printk("temp=%x\n",temp);/ r- \- n% `: U* C
  udelay(100);
2 z' W: K/ m9 v2 R# f# j1 _7 O
2 m" {/ u& M- p  //set GPIO direction
6 y2 w2 I4 V- x' Z2 _9 i   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! y8 q  K0 v, S& ^   temp = temp | 0x00000100;//EPR----input( t$ ^) e$ d. h6 C) M' C
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ O5 q) b* x* _) W( U
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 ?% B4 t! U' V. Q& Z. G7 @) ~
* D' `% R3 s. I4 z" s5 M0 \
   return 0;/ J$ j0 b' ?! y: S
}
2 m. H% o5 ]" p- }9 Xstatic void __exit MCBSP_exit(void)
* p  f6 i; P+ @{* ^1 }1 b  L. s( K$ a
   printk("mcbsp chrdev exit!\n");
( r/ Z$ d' A+ D2 G& }8 {   cdev_del(mcbsp_cdev);
. ]* b" {% b: c9 _3 S6 Q   unregister_chrdev_region(mcbsp_dev,count);
% E' j! }/ M3 h$ M, ]2 G6 u+ h& k) G   device_destroy(mcbsp_class,mcbsp_dev);- j3 i, w. u3 F& @
   class_destroy(mcbsp_class);* |4 b0 N7 l7 D
}3 x6 T0 F/ x/ K. H. b/ p/ l, c
module_init(MCBSP_init);
8 i+ t9 {: P1 L/ _" O! P6 x/ A  R8 E. [module_exit(MCBSP_exit);
7 [  Q% i0 O& D2 _' b6 h6 E+ G9 V/ \( d
MODULE_LICENSE("GPL");% p& W, r8 {/ U# U$ c# G1 }3 w
3 V0 J& F; s) }- E, W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; J! u; z4 \& S0 d3 k% `) [$ f& v3 M我的应用层的测试程序如下
& A6 u/ l1 L7 Q: t4 ?" l( y( `#include <stdio.h>
' P' L2 x% g8 F#include <string.h>& Y# R" ^# [3 b! m
#include <fcntl.h>
& E7 P' _4 r9 E0 i+ e#include <unistd.h>
4 z  f' S* `0 X3 _5 {#include <signal.h>2 E: f# s7 A! T' q4 q
#include <pthread.h>       //线程
$ E- |+ s: w, E  h3 R#include <stdlib.h>
- q) R6 E3 [% y* ^9 @) J6 X, y9 C#include <pcap.h>          //捕获网口数据! u5 w; n$ n  k3 A
#include <semaphore.h>     //信号
4 R, u$ P4 S4 b( A#include <sys/types.h>     //消息对列- A# k3 S( g" I
#include <sys/ipc.h>       //消息队列( P/ E  `1 }: h$ Y) O- ^& @
#include <sys/msg.h>       //消息队列1 W- X6 a1 w' T4 M0 F  N
#include <sys/select.h>
+ M. t% A8 w7 y( W" x1 z+ p+ U#include <sys/syscall.h>- ^0 v) N- C8 R" I8 m2 r+ C2 l
#include <sys/stat.h>  L8 l0 B5 B5 ^+ W+ K3 }! z4 X5 O
#include <sys/mman.h>% C: S/ F  a0 R+ ]! O% C3 U2 S9 K1 ~
#define msleep(x) usleep(1000*x), W% A# d, ]8 j( F/ s
( H/ `1 l) z+ e; f% j
int main()
0 M: @. U" u7 P7 C5 G, \( f, ~{ ) k4 p* m) q# [9 x. h5 U$ h
    //MCBSP,ARM与AMBE2000交互设备
7 w5 X9 R" u# x3 T8 c# L$ {. W int fd;  W. B$ L9 M0 d# D) M
unsigned short data_write = 0x5555;
' q' e) v) `" `  |5 { unsigned short data_read = 0x00;- ^3 C3 T9 x  a. j5 g: f6 \
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) i* C+ d' n, |  k
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- E* r. `' C  k# L: C) b   
$ P& q3 O& B. @# Z( h  if(fd < 0)6 J3 u1 c2 p! J0 b' s8 w
  {- s5 \& @& |0 R  R: \( m' W; {, K
     perror("open failed\n");; F+ C0 M# X1 _- T: P4 k
     return -1;
& c/ X  j. L* X  r  }  j) X; I0 `/ f+ F
  1 z. V1 B# [+ J, P
  while(1); Y) |' E0 [5 R9 v  h
  {' ?( Y( @& Y* D! h; H; v+ \5 ^
   - G5 `5 U1 B! Q; u  m& w. r8 }
   //AMBE2000每次读写是24个字为一帧! ?1 f  B$ n* Y: x9 O! l- k$ X
   //写数据时将数据在底层存储起来,等到中断的时候再发送
  B9 j1 [9 O  D) }   //AMBE2000输入数据是以0x13EC开头的3 l! L- p. ~6 ]7 L: \) U- V: f
   write(fd,&data_write,sizeof(unsigned short));
2 ]7 W! [7 L* J* u5 e0 p   
; y2 P" }8 s1 m- ?# |4 _   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ) A+ V5 Q( `1 y7 |5 B, F, o
   read(fd,&data_read,sizeof(unsigned short));
; r7 w. S- b9 T! Q4 h+ ?   
+ f/ C2 j; ]& g, p! m8 G8 D9 T   if(data_read == 0x13Ec)' W! O3 R6 y1 W5 v& y% [
   {
$ N0 i+ ^! M; A3 K+ D6 p" B   / K! Z! W. S2 T7 V" n
    printf("data_read = %x\n",data_read);
, Y; n- Q/ L( c6 d+ x   }
8 `, v* p2 M. M. W5 |8 M" v; {8 ~9 e/ M   " j) B) o$ X( j$ n! e0 `/ g
   msleep(10);( [6 Z/ x% W7 J* B: f2 M! t; [
  % g1 l+ I: e( O: {# \( `
  /*
+ E7 i9 s- ]9 R3 p& V   ioctl(fd,1);   4 Q1 |5 U4 F, l+ W
sleep(1);
: B2 F' j$ `2 \  a# k+ | ioctl(fd,0);0 M% E1 d* m' x% l8 E( b
sleep(1);+ `5 R& J* K* j
*/ ! _* f4 Q. [, _& F% B! C
  }   
$ Y6 d# \, C) Z# L, ` return 0;; T  z- Z, g2 M8 x
: q) q+ O6 y" |7 a: Z2 Q% {3 v
}
6 a. v$ V5 Y$ D
* R% d+ j( h& w5 x6 {" ^多谢各位指教,谢谢! 急: Y- @# W6 R' ~& Z4 ?) ~& @( ~  t2 [

) Y% h2 t2 \  E9 e4 [& o! \1 a( V7 H( u" `* g: P% d0 D4 g; ]

+ J; E" d' v. l* x7 D) c$ f* U  p- r4 C  f

5 b: ?( N. ?5 Q( {% m. p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 02:37 , Processed in 0.051976 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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