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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * p' `7 e* p% ]1 h
/*( E/ S$ F$ f# d, ~. n& y& J, k, u/ t
* Copyright (C) 2009 Texas Instruments Inc4 b0 n! S# E. v# c# @. Q% }0 J6 j
*
3 i7 n6 q! T5 b) ~9 w * This program is free software; you can redistribute it and/or modify' T8 Z- X2 i2 L/ {% s% ^# e
* it under the terms of the GNU General Public License as published by
3 w' J9 v4 S$ a6 `* k2 K7 `+ j * the Free Software Foundation; either version 2 of the License, or4 C8 ~5 m3 b2 B2 d& @& M
* (at your option)any later version.
" ~) d9 W: l/ i1 b2 S! z3 J *
# Z" o- ?, P5 ^ * This program is distributed in the hope that it will be useful,6 }) K# m( G$ g5 {+ E+ E  R
* but WITHOUT ANY WARRANTY; without even the implied warranty of; N3 V% V5 o% l0 y6 K
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# E. X6 y+ _1 F5 c5 D8 ~" t * GNU General Public License for more details.8 }( T: T* x6 ^# a
*
) g" x/ e$ y4 _8 u; c0 P/ x+ ?! S * You should have received a copy of the GNU General Public License
$ _% g0 z! ~5 }% C * along with this program; if not, write to the Free Software
7 v9 Z; m( ^' Q, w8 p * Foundati0 d! R: c/ g+ w, }
*/
" X7 m( y: Z! j& A( k3 k#include <linux/module.h>+ \2 E3 ~4 N- v
#include <linux/init.h>
1 n/ F8 N& h( K& S#include <linux/errno.h>
6 P2 _1 w$ {- K" s+ C9 j  k#include <linux/types.h>
6 W6 n" i* j  m% `( g3 v#include <linux/interrupt.h>3 [6 P" Y: _5 p% Z
#include <linux/io.h>
1 U5 i  ?; Z/ S" z) y+ A5 T6 z#include <linux/sysctl.h>( j- R+ \  _) l3 n( Q  f+ O
#include <linux/mm.h>  t# P+ F6 J$ `: F9 D0 I
#include <linux/delay.h>
& H5 d1 h* B0 j4 \% Z#include<linux/kernel.h>! b( C& Q/ |, ?% M
#include<linux/fs.h>
' x% ^& s9 k/ l8 T#include<linux/ioctl.h>: ~3 J! |9 L4 f) x* k
#include<linux/cdev.h>" F& Z9 _6 ]& U" j! \  w) ^2 j2 q
#include<linux/kdev_t.h>4 o3 |4 p- q  b7 \% a% T
#include<linux/gpio.h>( n5 P' s! Q3 ?
#include <mach/hardware.h>) Q& g. U0 B1 z/ W3 |% e
#include <mach/irqs.h>
  e% L! P3 `( Y, @
7 b3 ]# m8 S/ P9 i#include <asm/mach-types.h>4 B/ Y  }  U5 c5 N( ^( J: m6 W
#include <asm/mach/arch.h>8 f2 p- I2 Z8 V4 P
#include <mach/da8xx.h>* D: v5 Z. V" Z# x
#define  SYSCFG_BASE   0x01c140008 e. ^' ]1 r0 U9 N
#define  PINMUX1_OFFSET   0x124
& _9 F$ h  F) W9 K; B#define  PINMUX18_OFFSET  0x168 ; q# d! O" ~3 w, G; y3 b7 \' G
#define  PINMUX19_OFFSET  0x16c! G$ S' X* c+ l7 U
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* z/ h2 j4 ^" v* r) S  I
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
8 q1 C7 G4 s, H( `8 ~, t#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
2 q/ b! F2 t+ s6 l6 p' D#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR/ U6 F# C7 n5 F$ m# s( S; y2 C
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 y5 z6 @8 F! j# N, e  l                           
+ W# _' Q4 V4 H; g#define DXR_ADDR      0x01D11004  //MCBSP1_DXR" N* g) G2 f* K) G0 Y
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR) r+ V+ [8 t, \) i  X* A& ^
//PSC- i, ~' X- w) |2 ?( P) X
#define  PTCMD_ADDR   0x01E27120  % M+ a; T2 M9 @: U' ?  K
#define  MDCTL15_ADDR 0x01E27A3C6 P2 S0 @# I' q
#define  PDCTL1_ADDR  0x01E27304
8 A7 {$ c' R, f+ A" f3 d. \//GPIO8 direction
: B% H9 {  \- e, f, e. b#define GPIO8_DIRECT  0x01E260B0
( A8 g* T6 j8 w& A; g8 K* i#define GPIO8_OUT     0x01E260B4
) @; D2 S7 w# f$ u! H3 `! b, b#define GPIO8_IN     0x01E260C0. l2 b# R; q' C) g: P
. e  c7 q  J. h  E. G8 W  L0 _
//#define MCBSP1_RINT    99              
$ A' J8 P4 Z9 D+ A) |, W. q2 r9 Y//#define MCBSP1_XINT    100  : m; e+ _% ?3 A! V8 F
static int MCBSP_MAJOR=239;
' W1 s  I& P! N. Cstatic int MCBSP_MINOR=0;
# J! O2 K. W  F- l  V, Pstatic int count =1;
* y. f/ _* V# i4 y1 q
7 Q$ u" |+ `; Z#define MCBSP_NAME  "MCBSP-device"7 U8 m; ^* L) b6 O2 f) p
( P3 v" }2 V+ U7 e5 k6 B% \
static struct cdev *mcbsp_cdev;
/ A; C' I% |9 |+ G" ]& e9 dstatic struct class *mcbsp_class;
; E& D! p  h* z+ y* ?0 Estatic dev_t mcbsp_dev;7 V+ }. Q: S( M. B5 v! ]
unsigned int DRR_data;. U* d) N  o* f6 ~% K6 F
unsigned int DXR_data;/ Y/ d; {, y; [  l" n1 b6 M
static int mcbsp_open(struct inode *inode,struct file *file)
1 L  b- P* S! G* V2 e4 l{
/ a/ D1 H4 b8 v# z2 _/ Q4 ]/ ]   
4 ^0 p7 E$ L& V- ~+ W   //interrupt enable,initialized- j1 V0 L( |0 `. h9 Q. |; X
   unsigned int temp;
& B$ t, k$ f, _' l8 R   //SLEEP_EN(GPIO8[10])---0& ]" O1 S- D4 `* u8 a2 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- m- @* U/ h3 o6 ]" u5 K   temp=temp&(~0x00000400);7 e8 F4 w# E. E* R, i# `7 [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& `+ v! S% F1 c4 y. x- @7 v  //RESETn(GPIO8[8])----0----1
/ }- K! u. @: r& M2 Y1 |( p5 W   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 ?& A9 D$ R7 e4 L
   temp=temp&(~0x00000100);
5 r- U5 o9 J3 B1 y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
3 @6 P( I+ H8 z9 g   udelay(100);
0 P$ ^1 A' P, @2 d   temp=temp| 0x00000100;
( ^/ Y! H2 z$ i. m& h$ K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1# W5 P. N/ b! `* R
   udelay(100);! G3 R7 {! k6 H/ z
   printk("open success!\n");
5 A. ~- F: ~- _6 n/ `6 j- H   return 0;
% R& C  ^- }7 j}
: _% U5 o- f2 C# j3 v# \0 X- ~0 U7 i0 Z0 R% e2 ~9 l6 [
static int mcbsp_release(struct inode *inode,struct file *file)) p( |4 z% S. ^& Q4 `$ c8 {
{6 U0 v" ^+ m) x5 w' p1 ^  r
   printk("release success!\n");+ n, e1 c( r0 w6 A
   return 0;
8 l$ i! N  J, |' E- q1 a}& g  J! G3 c6 @# C3 ^. K0 U) }
; n, ^) M; _& I
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ ^# X/ a% ]8 K
{2 ~. J' q0 D  I( `3 ]# ~
    copy_from_user(&DXR_data,buf,len);2 e7 k1 Y4 ^1 c3 K( h5 v
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 M( W4 g$ E9 d0 Q; |    return 0;
! ~/ B( Z2 a- N& y1 @
1 j( D1 h+ k/ s" A6 y}
* I9 Y' S, c5 G( K$ Q; n% n# b' H! M$ n: l& n. l0 _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), n& v% Z6 r. R3 X. z
{
" F7 ?- q+ S, c' x, P   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" w- N9 |2 t: q. O   copy_to_user(buf,&DRR_data,len); 7 I6 H' _  u" K' Q
   return 0;
4 d9 @7 X3 m6 _; E3 z( O}: j: N4 I# k, E, T3 K

8 v2 P* G2 v* Y
8 m" j  K; T+ R& v6 \7 ystatic struct  file_operations mcbsp_fops=
9 q4 e9 u) [, U& U) d6 J2 C8 x- T{& @% X7 O: m6 \9 a+ j/ M
   .owner=THIS_MODULE,  s& w" Z5 Y; J* K+ J. ~# p
   .open=mcbsp_open,
8 M& V7 l8 o+ l; ^+ p   .release=mcbsp_release,3 y& r! K0 \, u
   .write=mcbsp_write,
! Y) W: Y* t- p! V: L! ]5 F$ d   .read=mcbsp_read,
$ i$ ]7 m( t: F3 R3 w};
" `7 d+ X( J" \1 d8 L6 d3 ^static int __init MCBSP_init(void)
+ o1 O+ M: J8 a' X{
" j" F. U8 D* X! X( z5 U" A) R   int ret;) y3 E1 G' D9 C
   unsigned  int   PINMUX1_REG_old;' s- `' u% K" S6 P2 W' q6 U
   unsigned  int   PINMUX18_REG_old;" e8 K5 b$ B- |' |3 @/ g5 C3 a
   unsigned  int   PINMUX19_REG_old;% W& z+ F3 M- d6 C6 I9 {. b
   unsigned  int   temp;  
( N# |( j- U- `1 |6 z2 Q   if(MCBSP_MAJOR)
0 C: b9 O* Z; Z" g: p" _   {5 r( C# \$ e2 y& u
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
; z9 d; H( _+ ^0 `: C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ l* }. |+ M7 G. J' O   }; z* r4 ]: J5 d! B7 d, T6 V
   else0 q! x5 s+ G+ e! @; h$ P4 S3 [
   {
& z/ l% z9 A7 f/ |! W( b      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 t8 m7 k( {+ u) F; r8 B; b* ~
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 O5 c6 \! J# j; S0 m4 Q   }# F* P1 V5 W% U% D" d
   
) u8 i. M# J/ G- T   if(ret<0)) |( C- Z; s# s- V1 w# b. @
   {
9 ]" x/ L. K; z3 q      printk(KERN_ERR "register chrdev fail!");2 g1 q- v+ \. `+ Z
      return -1;
" \6 C! ?. v( ~3 o   }; t7 e, Z( H. U, C% ?3 Q" E! b
   , X  A, f+ i1 G0 C7 e) R+ j) D- @
   mcbsp_cdev=cdev_alloc();
, E' O4 u1 _! w$ R% K2 P   ! |  h- d! |8 X7 R4 E2 U, M
   if(mcbsp_cdev!=NULL)
' }/ p! \$ O" Z5 ?0 Y7 _; }  \   {
& Q& V2 `  Q0 Z1 `      cdev_init(mcbsp_cdev,&mcbsp_fops);# B& w& E( M' Z' H
      mcbsp_cdev->ops=&mcbsp_fops;: A; V% O1 i, H
      mcbsp_cdev->owner=THIS_MODULE;
8 G% x7 J0 ~# x% Z      
. N/ {# s& {; d      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- }2 W& Y8 |( q- P- s          printk(KERN_ERR "register cdev fail!");0 c# r' e- P* ~. a0 d% d- i# o+ \
      else
, P4 k8 h7 j- F- m6 U9 a& G! D          printk(KERN_ERR "register success!\n");
/ w! }% }: b8 [! ^   }0 F* n4 U  h$ I
   else
7 X. _: m' o$ D$ M   {
/ i" Y: S' H* q: u2 @; Q4 r! V      printk(KERN_ERR "register cdev err!");
; I$ X& g# f& [/ l; X9 y  `) e: T      return -1;) {( t& W1 u9 w8 S! n
   }
5 E0 v0 v) `) N1 J; i1 s5 r! J   2 Y) y9 g% h! |6 }2 K' U6 n
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ x5 j0 q# N* q$ Y- ~
   if(IS_ERR(mcbsp_class))' Y. ?5 o- u$ I$ v
   {! n' J2 ]2 w  c3 L- e
      printk(KERN_ERR "register class err!");
8 ?5 {* ?/ Q$ y& c! X( Y   return -1;
- i9 l7 E1 g' ?, O! G   }
" _2 U0 y8 h+ E! V, C( z   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; `( I& Q- m2 s1 n  s

4 g# Q& X3 Z6 i   //PSC3 ^. ~. J( ^. s
   //add Enable MCBSP# o/ e7 L" t8 [+ F7 a  _/ Q! \2 U
   //test# ~: g. q. ^7 B' R
   temp = 0x80000003;
* H# }" W0 @4 a9 q, I; e   writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 x2 z$ Q3 o! j- A, A' K3 L
   temp = 0x00000003;
6 Q1 @6 T# n4 X2 ~0 A; P   writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 a7 W4 _' Q( K
) M" C1 Q( x; M0 T6 W% \1 K! F   temp = 0x001FF201;1 L3 U1 j, R: g" T7 \( t
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" R  D1 C) M$ ~- u8 t  U8 L
   - L. K+ I! o! M. _% w7 u4 X' r
   //PINMUX  0 ~* t& O" S% m1 w* T( S
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 V5 U0 I- p$ s
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
, ~. P& [% S! s2 P   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   9 \$ ^) J, y& ~( F
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 B# O2 r4 k8 B" N   $ o. e/ I  E  |% e
   //SLEEP_EN,EPR,L138_SHK1,L138_RC% Z; N1 H, {! c7 `
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
6 z/ t7 q7 O" H  [   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & T1 D( c; m* L8 i# p
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: x& E" S% e5 U" I" ?' U) x, @0 O2 e7 Z
/ k5 y' h) ]5 s: H5 _# g2 v   //RESETn,L138_SHK2  f) e% H4 Q' [, b
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 O5 k0 U2 v$ W- @   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   2 R2 B( l" I8 ~6 _1 \7 _8 B
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. G* v- y% U' m3 T5 v
. k% ]$ X. L& t: r6 a2 }
" ?) k$ C$ U0 n7 R3 F& c- L0 n" Z  //SPCR Register- a& y+ R7 ^2 C& {8 p* U) }
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- A( y! z4 _) b- z
  temp = 0x03000000;//(DLB=0)
- a  l' q. `/ b( |  L // temp = 0x03008000;//(DLB=1)
/ R. }( C) ^9 n) q' L  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
* u2 K" X% m) ]' d& }' w  r  temp = readl(IO_ADDRESS(SPCR_ADDR));) |6 L7 j. M% z" Z
  printk("temp=%x\n",temp);
" g& \6 }( C, P7 i 8 A' c' K0 O1 ?" r
   //PCR Register
4 u0 {& {, P: y* N. [   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  ]  ~* [2 d8 C) d- k
  // temp = 0x00000F0F;' z! E0 j( t: F; j) Q( A
  temp = 0x00000B0F;# _2 K8 S7 c  u6 _) x) L# o
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 O6 w5 }, H) F. [  temp = readl(IO_ADDRESS(PCR_ADDR));1 x* I# X. w4 U+ Y4 K
  printk("temp=%x\n",temp);  
- m$ f  G2 m: d! k2 T) W% F   //SRGR Register) [' X+ f2 D1 {" }4 I4 F; B, y
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: ?. \8 [( D' I7 W0 m5 w# _ //temp = 0x301F000B;
7 \% m) x2 A% y% _, i   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * v' U8 `1 Y1 ?5 n
  temp = readl(IO_ADDRESS(SRGR_ADDR));
& O" N8 w3 \& m" R! W% o  printk("temp=%x\n",temp);
! p  A# |3 W1 m' a/ T/ l7 ]   //RCR$ w7 T2 A0 o4 j" M, L
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 l4 e2 {6 }, E! d9 U+ F; S  t, t   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" a% f( g* n6 R3 {0 X' R$ Z   temp = 0x00440040;
- ^. k. g* B% d* V8 |( w9 ]( x* ?   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
: g# {/ M; s+ u4 K+ t# b   temp = readl(IO_ADDRESS(RCR_ADDR));, p) v& R; e8 Q0 f8 s/ ~; h9 }) [
   printk("temp=%x\n",temp);
0 W# y+ W; {: y+ _" r6 U   //XCR
" p# `- r: t! z9 r   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 X1 {# y' z$ j0 G# d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
( s9 V/ ?3 I  i4 w( T   temp = 0x00440040;3 }* ?5 ^  e% j
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : Y  {" |, i, E) |
   temp = readl(IO_ADDRESS(XCR_ADDR));4 J$ F0 N6 P  q0 H
   printk("temp=%x\n",temp);: O! x5 Q) |5 N7 y- C8 X% \5 F
  udelay(100);
$ J2 Z$ d! g( A; S  //SPCR Register
+ J0 Z  B4 F) Q/ y  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 U7 d, V! y% `9 ~0 |2 t  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ t) k: ]+ u+ G. {- j. v) ]6 c( x. b
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ _; D6 Z8 c; s# N8 K
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, U+ n$ L( \  k# B2 W8 ^+ t  printk("temp=%x\n",temp);
& @; H) m* H  m/ \  udelay(100);2 I. U/ V6 Y! t6 ?
- e7 B0 F  Y/ f. K" i
  //set GPIO direction
& M- e" Z" {# P% [3 K$ [3 w   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 y+ i3 E* W) i   temp = temp | 0x00000100;//EPR----input6 X4 Y, l& J( N( r* ?. i
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 J% ~: E( A: g9 [7 m$ }
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 M( V' I* ?( \1 H3 E3 p( \- r

1 M- f7 t3 k$ M; ~. @1 @! j   return 0;
- ?$ C3 @" O( |, P$ T}
" {6 b) X  X" N1 i, {- lstatic void __exit MCBSP_exit(void)1 ^0 U% R9 k7 i
{5 B  D9 i0 Y  L, V# T% n4 x  b
   printk("mcbsp chrdev exit!\n");
6 c# c- O' v; e& `" S* g3 [: S   cdev_del(mcbsp_cdev);
9 O$ O2 q+ s  i1 q% c   unregister_chrdev_region(mcbsp_dev,count);
. O" K# r% k. G( k# f! h  n  u   device_destroy(mcbsp_class,mcbsp_dev);
' b  X2 O0 j8 ^# B7 z0 \( A   class_destroy(mcbsp_class);
: Y3 N3 b7 }2 V6 k: d; x! R}, t$ k; M' J3 Q+ i9 Y3 F- m
module_init(MCBSP_init);
) A7 J3 y  ^# b. F1 ]5 L6 Dmodule_exit(MCBSP_exit);
. ~8 n8 R# ~, `/ _% w
+ Q$ Q" V7 \4 _: L% D; K3 t% }MODULE_LICENSE("GPL");8 ^7 E6 P, @- N2 C. Z$ {. s
9 d3 u/ A' i) B/ }
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& t3 h6 h/ e: x7 o+ _
我的应用层的测试程序如下
, i# `0 x- W6 Y# t& h% W9 Q$ _#include <stdio.h>
" W3 C1 X: E7 t#include <string.h>& w2 `: o0 R6 m2 ~8 I
#include <fcntl.h>( }; \$ r2 l+ C8 n! |
#include <unistd.h>1 y: a" S! m- c) L! H6 r& e
#include <signal.h>" _6 X/ C# I: K3 w
#include <pthread.h>       //线程( B) m; i# e" h3 `! \
#include <stdlib.h>- b& U" L7 Z, b( J/ C4 _/ j
#include <pcap.h>          //捕获网口数据
/ V. Q# A) }  Y5 x3 V) M' j$ H/ A#include <semaphore.h>     //信号8 r8 k: {6 A# p3 {* C$ l
#include <sys/types.h>     //消息对列
* c) l$ X" j* y1 W#include <sys/ipc.h>       //消息队列# v. j8 n% l4 c1 N' X" ^# ]" R
#include <sys/msg.h>       //消息队列
& ?( X1 _5 |' R; ~+ @% F$ F#include <sys/select.h>
7 X/ B7 @$ m3 C3 E# t4 ^/ ~  a#include <sys/syscall.h>1 ^, T) P, R- g6 M/ _2 b
#include <sys/stat.h>  H# t  }/ b4 B/ N6 Y: L( [. H
#include <sys/mman.h>: @) ]) ~- X: }) M
#define msleep(x) usleep(1000*x)9 a, U% W+ `$ V

8 j7 J& [; h1 f! _: U2 C$ [int main()
" V, W- d' G1 a( i, t, Y) Z: C{
) P+ n. t% c( e" `- q) k$ ~  A    //MCBSP,ARM与AMBE2000交互设备
, h& C/ I$ C# F! Z int fd;
# Y5 m" I, h' q+ @/ k unsigned short data_write = 0x5555;. n- V5 r$ `& N% E; m. o7 Q. n* `
unsigned short data_read = 0x00;
" b* P) v* j& e' \! ]  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);5 F) s' r' T" W6 ~2 R
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 I# j# |" X2 r+ ]) K( a' i    ' K2 X+ ?/ o2 D" c& ?
  if(fd < 0)! L4 r7 ?6 I( g1 i) t& e' w5 U
  {
  L% W! [4 R( F. }, |3 O     perror("open failed\n");
1 S1 s9 Y  g: s# b$ \9 \: Z     return -1;
, M! ]: D9 l# W+ h' B; z  }
: s* z0 \  M3 Q! g  7 q3 C7 O. x) ]' g% {
  while(1), u/ B8 v0 Y: u1 r5 u
  {
8 w* ~9 h8 h: @. f% v   
" A  J" I& J: M: U. R   //AMBE2000每次读写是24个字为一帧0 ~4 K7 F8 R' u
   //写数据时将数据在底层存储起来,等到中断的时候再发送
9 b% Y" }: Y% n* E' B6 X   //AMBE2000输入数据是以0x13EC开头的
- D, c# M) y& j/ e4 l   write(fd,&data_write,sizeof(unsigned short));8 w& {6 k7 U: i% C
   
! S! J) z% x- n1 Y  F. H7 E1 I   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
. H8 z; H# ?3 z' H   read(fd,&data_read,sizeof(unsigned short));( A2 o; w  M5 y1 B6 h- g
   + W1 @& Q9 k. Q- j
   if(data_read == 0x13Ec)) E$ T6 f& J; i1 w+ R0 c  q$ l" Q* d
   {. I2 K. J% e: W8 A6 F
   + o, y4 ]- V3 J  Z
    printf("data_read = %x\n",data_read);
$ Z3 V  u( ]9 R; A   }/ c1 z. d8 r+ [& ]6 T' \/ Q" X
   
8 e& G) V& v' ?3 \+ A   msleep(10);7 O  @: j, G" |8 |$ [: |; r
  : C4 O0 @4 L+ A  i: T8 Y) k9 d' U5 a
  /*
1 u; Q4 r. r; D/ B# I   ioctl(fd,1);   
( K4 h4 z5 `9 M4 c- D sleep(1);
2 f* }! ?, }: S2 J7 x  q ioctl(fd,0);# ]  Z2 W' z% `3 L5 C
sleep(1);
+ U3 M, ^7 g* \7 e2 s7 T */
# \+ D9 w' T& N" b! U; m: N) Y* r  }   
0 m8 }- f& J' x% c* ? return 0;
4 S! s# U1 P* n0 l7 |4 ^+ N! ~& f
" ~' o% V1 K" X8 k& X: `}# O* m* p+ ?* N& h

3 S% k& O3 O4 s/ G3 V. {4 ^多谢各位指教,谢谢! 急+ N, b+ f5 @( G
( S7 ~1 b$ j; @' D2 o  W/ |+ t
: q6 t$ C1 r  f3 H

' p0 i" k# m1 R# P3 h6 O
# |$ X% }# M2 d6 x' \3 l. H( G) Y; z/ p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 00:14 , Processed in 0.045915 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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