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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, h) V8 E0 r4 U! W' Z. |/*
9 |3 _% E6 s! V. |2 A8 y8 I * Copyright (C) 2009 Texas Instruments Inc
, ^! l6 n$ H3 R4 ~) S# H* w+ R; N1 F3 s1 n *
& }/ G  H9 B9 ?7 m$ K8 @# z# r * This program is free software; you can redistribute it and/or modify
. T; W- U" _# K" E- }& w) q/ G * it under the terms of the GNU General Public License as published by
$ l+ ^9 }" n9 l' Z. a4 A * the Free Software Foundation; either version 2 of the License, or% g" p  ~+ I7 n8 M5 F: s
* (at your option)any later version.( W" ]3 a! g  |, a
*9 o4 C3 F5 U& C+ j& A: P- A
* This program is distributed in the hope that it will be useful,
; i$ P7 l! ?" \. n * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 T) l$ l2 P; X5 u * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 A" H. a* w$ `  F' L * GNU General Public License for more details.
1 x) q4 U6 c3 `) D" X- P *; D- u  R5 n1 ^7 Y8 V3 x
* You should have received a copy of the GNU General Public License
4 d5 J, t$ k5 Y: M * along with this program; if not, write to the Free Software
  b9 T& g" B- I$ M" X * Foundati
7 l( {: q. H/ Z*/, v5 e# d2 e, _" n1 b  f
#include <linux/module.h>. k- f! O1 t7 [) e4 a
#include <linux/init.h>
* t: m% p5 j, M- n  a2 K0 Z% c#include <linux/errno.h>! ?7 k; K6 L/ U3 w" S
#include <linux/types.h>4 w/ `$ }, T8 J  I7 i) Z
#include <linux/interrupt.h>
8 {, @- |6 ^9 S# ?  p' l" @#include <linux/io.h>
- p) }4 ?% N+ W2 W7 _( z#include <linux/sysctl.h>. {" B4 w  w9 J2 n6 p
#include <linux/mm.h>. i* z" x3 \' d% a0 F0 h
#include <linux/delay.h>
2 \* c1 g) |# `3 b  k#include<linux/kernel.h>
4 Q1 c% `" t8 r; d#include<linux/fs.h>3 h- V4 q2 v( I4 I0 t
#include<linux/ioctl.h>
; j' W. i! F4 G$ p$ f' S+ }#include<linux/cdev.h>
  c8 @. M8 m1 i#include<linux/kdev_t.h>0 a! x7 t( s9 g( f. x
#include<linux/gpio.h>
/ v* [) \& O! v) a. U1 ?2 z; c#include <mach/hardware.h>
# I( |+ e4 V7 c# ~+ Q8 T#include <mach/irqs.h>
5 z; f! [; h6 m0 o8 N2 I0 v( i" h  s( J$ g# N+ `# M' H8 N
#include <asm/mach-types.h>; L0 ~: v9 Y. }% v0 A# [2 H
#include <asm/mach/arch.h>
9 F6 P; I! Y9 u# B1 w( {) s' [) ?0 K4 @#include <mach/da8xx.h>) d- ]/ B* {, T+ q/ `
#define  SYSCFG_BASE   0x01c140006 x  W; q9 M4 P! U2 o
#define  PINMUX1_OFFSET   0x124 & t4 f) a5 |" v% J
#define  PINMUX18_OFFSET  0x168
$ n+ ?4 Z/ k8 {  L/ ]& x1 J#define  PINMUX19_OFFSET  0x16c: S7 I3 E( `: S) C
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ x8 A+ T7 I2 s4 S; k% a#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% l$ P7 x- m2 `1 o2 K! W#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' v7 z* W. W- e, V+ I4 f: q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR: T% r0 T% d' X& b1 q1 L1 o
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR# L' b  \1 T/ P9 j% K
                            & v; Y2 p1 `# C$ N! M; v2 w, G
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
2 X  @5 {9 |! J6 t# b  a) N6 u& j8 v#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) V# }$ s$ ]0 }//PSC5 d6 c) n; l  x2 B/ z
#define  PTCMD_ADDR   0x01E27120  ! J- o5 \( x8 \) W- f: M- m
#define  MDCTL15_ADDR 0x01E27A3C
  a" [9 G. l* ^2 e#define  PDCTL1_ADDR  0x01E27304: V. C5 }5 P% e$ ?' d) p3 H
//GPIO8 direction
' i: Y) d+ J7 b  V" I, o* r: ~$ k#define GPIO8_DIRECT  0x01E260B0
7 u' \& o) B! a$ w#define GPIO8_OUT     0x01E260B4
  y/ F4 c" ^; c. U#define GPIO8_IN     0x01E260C0
4 E  x) \: F% Z/ w, B; C# M3 C- U0 V1 Y4 u. k5 b! P6 {5 O7 E/ I
//#define MCBSP1_RINT    99              
3 _& ~' _, A5 }, V1 X( I//#define MCBSP1_XINT    100  2 N6 T6 I. l" p) K4 V- n/ Y5 f! a
static int MCBSP_MAJOR=239;
! O5 `9 R/ A. |6 E1 R* [static int MCBSP_MINOR=0;
2 K' s- K5 @; f$ T# }; Kstatic int count =1;; O: w- S6 W1 m5 K( D6 M& n4 A
6 `7 `) H% A5 a/ K5 T
#define MCBSP_NAME  "MCBSP-device"3 q- m; I0 m% A$ s

1 Y, A  R' z1 S8 Nstatic struct cdev *mcbsp_cdev;
6 V" l+ ]" C0 t, ?# fstatic struct class *mcbsp_class;
5 O0 g" D( L, a$ P1 l* Dstatic dev_t mcbsp_dev;
% q+ E7 h/ a' R* ]8 b" [+ sunsigned int DRR_data;
. i) r: f9 v/ ]% Q, x  ounsigned int DXR_data;( r& w* u& k6 U; y
static int mcbsp_open(struct inode *inode,struct file *file)% y2 J6 n/ O7 o) Z/ j
{- w- e/ \4 k/ w/ s: Z
   ) M1 a6 |; l" N# s1 ^! o! l+ w
   //interrupt enable,initialized
# t% N' m3 V( T7 o   unsigned int temp;9 h7 r0 K4 v9 _/ ]
   //SLEEP_EN(GPIO8[10])---0
3 W8 r6 x8 J* Z- H; M   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) e8 w% v* c) n# P9 q+ G
   temp=temp&(~0x00000400);
" ]7 B9 r% o7 C) t+ \   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ A  j( m' \' h1 W/ y+ l& p  //RESETn(GPIO8[8])----0----1
3 @. j% U9 r- [& Q) b: k* Z9 B   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) G8 E1 Q$ j5 Q& v   temp=temp&(~0x00000100);
/ U2 V$ N' p  d) p- Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ P( G/ a4 G4 V- g' c   udelay(100);
" t( |% D8 Q' U" f/ V( [* l   temp=temp| 0x00000100;
6 c# U3 F5 l5 `* |( p   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 v! x/ z1 \/ k4 n# ~; Q   udelay(100);3 s9 O6 {* a) P5 U
   printk("open success!\n");4 V% a' A+ A) ]; M. i5 s
   return 0;8 I/ [9 A( \. W* K* M. l6 ?
}, G& _4 i. G8 R7 s' z1 w1 Z" D- f
) i5 g- k& ~; R
static int mcbsp_release(struct inode *inode,struct file *file)! f# x+ g5 X5 J0 r" I3 M) i# {
{1 W' R6 }. f: P& n. o2 f8 |0 t  P
   printk("release success!\n");. E) I& w0 C6 f* A
   return 0;- Y" Z; t  F5 s6 h9 N# p
}- W4 U0 H: `. s5 ^2 K) T4 y( j0 {

6 Y* d  J" @7 T* A  G  ~static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 D1 A) \# W! m3 R! J{
* k& _3 U+ C( [& o3 F6 j    copy_from_user(&DXR_data,buf,len);
) |9 \! y" u4 o$ `    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       : N( N" w1 W/ m' h! u+ q
    return 0;2 O4 d3 W- U+ O- g
, F$ H3 S% f9 ~) O1 l
}
/ Y" M! j  S; @  H9 ]1 Q3 N/ q2 Q- o) K7 G# a' U$ ^+ M
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 _6 L4 T- K& l) A1 G
{
* R  V' P7 C# j3 V   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 `( V( X) c1 y   copy_to_user(buf,&DRR_data,len); / \9 p  i$ M/ `
   return 0;
/ a0 Q+ t  r' A% p}
" o. D' F# U- Q5 I
7 c/ v5 g4 l3 s2 c" I3 i  O: V% `" s* D, I: f/ n. s
static struct  file_operations mcbsp_fops=
! X' Y8 H) r! ~* Q- D, N0 ~{' p$ u, X& C2 E& S
   .owner=THIS_MODULE,8 n7 e) A$ C. w' E
   .open=mcbsp_open,5 d4 {6 ~8 F$ K' l/ k$ R" _; W, I
   .release=mcbsp_release,
6 y" c* [5 K/ c   .write=mcbsp_write,
# ~# I( |4 d) {   .read=mcbsp_read,# r1 w8 u$ \5 s0 i
};
& Y- F) d3 j1 T* rstatic int __init MCBSP_init(void)
; ]* Y" D% q1 P' F9 B{4 m0 x% e9 N- o# x1 ^' Y8 n7 ^
   int ret;
6 [! ~& Y8 B) `/ c! ~+ H) o   unsigned  int   PINMUX1_REG_old;4 h7 L! E5 w2 t( p
   unsigned  int   PINMUX18_REG_old;3 G2 z; z4 K3 M& p* V
   unsigned  int   PINMUX19_REG_old;
$ b+ v. O/ v7 v8 x6 K/ w9 X9 A& m' b   unsigned  int   temp;    ?1 ?4 j9 T& H) a# H
   if(MCBSP_MAJOR)
* L4 `2 Y) d! y* k   {
6 ]+ m; Q) l% S5 d, Z6 K      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 J6 Y" e7 t  [! `' @      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% X: ]4 U9 \" U0 B3 n" H3 }( h   }
$ p2 K  ~4 l; ~, _8 P& e  _   else
9 I" m8 U8 w: I   {
7 V6 n# P6 Y8 w  Z( e5 i3 V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! X, Y: J6 L  J; V4 P5 C4 \+ ^
      MCBSP_MAJOR=MAJOR(mcbsp_dev);( Z9 X9 O4 Y' g% H1 f. ]2 j8 y
   }
- C) X7 M/ Y: N0 y) p: \: K   % b8 f( O8 H4 c6 }; E) {7 _8 t
   if(ret<0)  C$ F: i& P2 j7 d
   {
# `8 n* e# M- M- U8 P& g3 t- Y      printk(KERN_ERR "register chrdev fail!");
7 w" U2 W4 B, ^# c      return -1;
, _9 m" F* a. P8 O7 a   }
* w( y; s, L3 _   9 Z: M% E9 {$ S1 g4 [* T
   mcbsp_cdev=cdev_alloc();
0 J+ r6 c, u' F8 O6 X   : y5 H, @. C" e0 C3 M5 d
   if(mcbsp_cdev!=NULL)
5 x8 q8 L: D) _1 y   {! n6 i( Y: v: c6 c0 ]1 a5 L
      cdev_init(mcbsp_cdev,&mcbsp_fops);; A& _# B/ R, _: S" a
      mcbsp_cdev->ops=&mcbsp_fops;( ^" P) U: v: j; Y1 a
      mcbsp_cdev->owner=THIS_MODULE;3 X! D/ m: m5 I# R. D2 B
      ) y0 c. o. J6 i4 b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( p7 R2 M5 I8 I
          printk(KERN_ERR "register cdev fail!");- i3 @9 P' a( M) P
      else7 Z* n3 Q7 F' Z
          printk(KERN_ERR "register success!\n");
: Q; a) v8 z4 W" [* {   }
* S+ z$ m, g( Y   else4 e; j) M1 H0 M6 H" i0 ~! `- g
   {5 _$ v! w1 U, @8 y
      printk(KERN_ERR "register cdev err!");3 \5 x# H( d  O  b, {
      return -1;2 R+ _' ~& n1 Z& r0 l! O
   }# \1 a) |: S. {, U
   - s% u, H" u" O
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);8 j4 [* p( j$ W2 W3 a
   if(IS_ERR(mcbsp_class))* z+ H0 m( @! M5 x, u/ n- M# \0 v, _4 s
   {, ~* S) P5 l& i% U
      printk(KERN_ERR "register class err!");
( k0 F8 O3 O% m0 z; ~' r   return -1;
+ M8 A3 i- e, C+ c   }" ]3 j9 l! i: M3 y( K; `: }
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);  o  c, R8 d& Y/ G" S; y% @
+ g' ~0 u2 `; t
   //PSC+ }  ^/ e$ [9 t3 _% K: |" z6 {
   //add Enable MCBSP
, B8 a" x  T# A5 ?. w0 z   //test2 ?) r  u/ P) i+ u; I7 m/ e1 j
   temp = 0x80000003;
: M0 ~  O  ]2 i   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- \( r. A3 i" f; J" [+ j3 g
   temp = 0x00000003;- ?6 R) O/ T0 T9 J5 }1 T
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
" e4 ?8 w3 T! l7 s7 q! Z1 r/ ]
- u' o3 D+ j& a" S   temp = 0x001FF201;
% w! d9 Y( [+ I7 K* s4 \  a5 x   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 K, T4 s8 A3 `' \9 S   
8 g: C* {' Y- a1 G   //PINMUX  1 j* x6 `4 h/ j' G9 c: D
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 F! G( }, E" z( a7 b/ o) O  U
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 z# p" \3 h: ^6 J* L5 d  r2 z) Z
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   9 u) [6 y2 }8 l4 c5 O3 \# T
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ y4 M8 k) c& p* e& `   & M" ]! o5 p8 `9 x# s& C- J
   //SLEEP_EN,EPR,L138_SHK1,L138_RC& l- V0 E8 h* m
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" C6 R+ b- \8 H! @9 H   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
1 L+ \, v; A4 U) m$ y7 ^. G6 |   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 z# X% X; {# g" L5 `- E, Z 1 O  B9 W, ]- O5 j
   //RESETn,L138_SHK2
: Y! `! B3 i# q, [   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  7 f$ e. Q+ R6 m/ D
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
$ t, T1 a# v. u5 e9 \: _7 L3 v0 L7 ]   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 R2 M9 r! A9 |4 W) l: N  @ 0 q( u! h% h5 ?0 A, t& G( o
/ w7 T4 j2 n" p2 ?; W- z4 g7 `) x+ v
  //SPCR Register5 c! w$ T% {8 X
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ G  N0 R! Q# l1 q
  temp = 0x03000000;//(DLB=0)5 g2 t) {% q- X! h( I/ \0 D
// temp = 0x03008000;//(DLB=1)6 R5 Y4 y' U5 j8 ?8 h  B; E+ H
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
9 Y' G6 a) a( m( e  temp = readl(IO_ADDRESS(SPCR_ADDR));
( m% j& d( H& J1 \  printk("temp=%x\n",temp);
7 K1 |- z( U, y/ v4 C
1 I1 x- `3 G4 J; r. V   //PCR Register7 z; ^/ m' M: D1 }4 P
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ C8 f+ t1 i) E/ `# r4 F' A- w5 C! y/ i  // temp = 0x00000F0F;& Z( J  _3 r- q- P, v, n9 Z0 n
  temp = 0x00000B0F;
9 J7 B# n, `+ N) I5 A" ?  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ; Y8 b- |3 k4 ^7 i) L9 b
  temp = readl(IO_ADDRESS(PCR_ADDR));
1 T  W% G! E" G  printk("temp=%x\n",temp);  
5 A9 u2 Z1 D0 I: O! K- w7 t   //SRGR Register3 \; r9 r5 e9 Z" \
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 R7 M7 W+ O& w0 k; g9 o  I //temp = 0x301F000B;
2 o" x# J2 L! _1 y2 G. W2 d" |) Y   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized / k3 i: n4 |# `% f
  temp = readl(IO_ADDRESS(SRGR_ADDR));
% i: n% w+ G$ W9 m  printk("temp=%x\n",temp);" A1 _5 E! {. ^5 x. r: k
   //RCR. _+ u/ D+ S& L( J6 y4 A
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ w0 Y7 g! d1 y# m: e8 P! B
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' f/ i8 t8 L! r3 ?% x   temp = 0x00440040;7 r( f1 E: f, [; k; a" k, B7 |
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized     ?/ h* \- D- s' s# w8 |% f2 j. e1 [
   temp = readl(IO_ADDRESS(RCR_ADDR));' X3 `- Z) p4 g$ Q
   printk("temp=%x\n",temp);" a/ H1 X  l" T6 [! R
   //XCR' ^) ]! I# x% _( s" s
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 j% b: Q2 f7 v3 T; w# h
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' q) `$ E8 F$ i   temp = 0x00440040;
# W+ \: e, F- t9 T   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
3 ~( \: n" }4 z# J7 ?/ ^' y+ U   temp = readl(IO_ADDRESS(XCR_ADDR));
; n$ E% V' @) ?/ p4 v   printk("temp=%x\n",temp);# _# }7 X5 B" _8 B% l  ]2 e
  udelay(100);
, b( S8 D0 s. i# P$ B2 A# E: W  //SPCR Register. k7 O( \3 y, Q* g- D# _1 p
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 C4 p/ @( U1 ?" V) x
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' p; \' V0 [% Q% @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled5 B+ @; C& P# u2 B' P
  temp = readl(IO_ADDRESS(SPCR_ADDR));
! B& T1 H. a3 _- G  printk("temp=%x\n",temp);
8 D; b0 X8 C: X/ Q$ M' i  udelay(100);& }% p6 p( j4 p, o) c

: |1 e& b; _# s7 ^4 a/ T  ^  G  //set GPIO direction# e; c4 d- b/ _
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ j3 T# f" p; b) D$ `+ }- W9 Y
   temp = temp | 0x00000100;//EPR----input
5 U. {$ J) `0 t# j4 ~   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- R! l: |& L- C   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & N5 X4 i, f; ~# T
) d3 c. p" k1 B/ g
   return 0;
( c8 i( _9 }5 o3 `. J}
; a0 l6 l) k/ N/ }1 X5 U% wstatic void __exit MCBSP_exit(void)6 s5 ?. f  ~5 F. l# y
{1 O% Q" B- U. G+ B2 S1 E$ U
   printk("mcbsp chrdev exit!\n");
) p& }/ Q( Y1 W* K* b, m; U   cdev_del(mcbsp_cdev);9 O; i! i0 N; l5 [" X1 ~3 g
   unregister_chrdev_region(mcbsp_dev,count);4 p% h1 r+ v7 F' S; z. D/ ^* Z
   device_destroy(mcbsp_class,mcbsp_dev);! s7 C# _8 f2 P3 r2 @
   class_destroy(mcbsp_class);( k! P, U9 U: v% F8 N6 J, C1 ~6 v
}
) M6 T- D5 w' Zmodule_init(MCBSP_init);  z$ i( `5 p  o- L, G
module_exit(MCBSP_exit);
& c5 u  Y( `0 A; p0 j- s3 L9 C
' Q0 T  B8 T  \MODULE_LICENSE("GPL");
7 {) `" Y6 o! q9 D' G! D1 e* u* Z; v- ~1 b) }
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. I; Q. j: k- r) ?3 f我的应用层的测试程序如下: y7 |1 M0 g8 Y1 ~0 \9 u0 P& G% k
#include <stdio.h>
7 N1 T1 [8 H/ I& d, \7 ?#include <string.h>
' `, V1 u! [7 b+ C#include <fcntl.h>
9 p" [% |. f) y; i#include <unistd.h>
9 W* R1 z% W% i' m2 q% X. e#include <signal.h>& k/ I1 ^6 e' v  D6 S- G
#include <pthread.h>       //线程1 i* X$ g8 ?: F( f' K
#include <stdlib.h>) ~/ G2 s& R7 E8 ]/ q5 f  W
#include <pcap.h>          //捕获网口数据
: X+ a0 O! l" a' q' l. U# t5 ^% U#include <semaphore.h>     //信号1 W1 E) S6 N: I% y/ u) w9 @! f
#include <sys/types.h>     //消息对列9 u' M5 Z, w) ~& n% g  C6 ~
#include <sys/ipc.h>       //消息队列
8 {+ F0 a; G2 `#include <sys/msg.h>       //消息队列
, O- y4 e1 _$ n2 \#include <sys/select.h>
  K9 V4 ^9 _% {% m. n1 m8 y( k#include <sys/syscall.h>4 X) L2 C4 t: n* v6 v+ Z. q) a3 i
#include <sys/stat.h>
% a) g* E$ W5 `  `3 f2 s9 l/ Q1 g#include <sys/mman.h>$ e6 x* m8 e1 {. m% N" y3 i
#define msleep(x) usleep(1000*x)
, P; ]* }. j$ g( ]
7 D' R3 D# B" A) o" `int main(), k7 Q7 @4 N. i
{
2 n( h. K: ?# F    //MCBSP,ARM与AMBE2000交互设备
) c; E  ]- e9 Z int fd;4 P2 ^8 f; E9 H1 G1 t7 C, Y6 u% R
unsigned short data_write = 0x5555;
5 ^( _( G! B5 S# ~" o unsigned short data_read = 0x00;9 K8 N, v& O+ r/ ~5 B
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
  A5 S3 n, h" M7 a# H8 y4 E //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);+ G% z% A# d, M) V5 m- v1 k  C
    ! D# o7 X% k4 k& y0 {; C- o/ c
  if(fd < 0)) @' F! |. x3 T1 C! B0 x% e
  {
9 w0 w* ~1 _$ V' ?1 j1 ^     perror("open failed\n");* V7 F9 }+ `  _' C9 Z* s3 b& f
     return -1;! d1 R& e+ S3 B3 @2 Y+ X7 i1 e
  }
2 A4 H+ n4 J! M- o3 Z6 j  * W8 ]3 v. x6 {( }; P
  while(1)) P3 e8 E! r0 O: ?0 p+ K8 b
  {
6 y9 b# H+ F+ r5 c7 q   - v! y( \! K8 c% D3 `
   //AMBE2000每次读写是24个字为一帧* f- K, z" a% u8 X
   //写数据时将数据在底层存储起来,等到中断的时候再发送
% y& ?. _7 B( }7 }9 j* {6 k   //AMBE2000输入数据是以0x13EC开头的) ~1 V4 L- P' g; s) U6 e  |
   write(fd,&data_write,sizeof(unsigned short));; i1 p' g4 l% R" s% `
   
9 E  @; c3 ?$ {4 K- [! ?' B; T   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 S. \' u9 A6 G* L; L6 T7 n
   read(fd,&data_read,sizeof(unsigned short));
8 P0 B8 y- B, p! P- i5 B   
8 ]$ h' P! c/ [# b: m& k! w0 Y   if(data_read == 0x13Ec)6 b% j2 M1 d6 E9 X% g
   {
* M0 E& `  N5 h3 v- R# A& j% [   . K* Q1 |) a; f  x2 \& O$ O
    printf("data_read = %x\n",data_read);* `8 d( L( m" _' _9 s
   }  p. s; j$ q+ a2 I' `1 s3 p  s
   . z+ C# e7 `" P7 v- ?5 O$ _% K
   msleep(10);$ l, U5 j3 j  c" P0 s+ ?
  ( i! _' x8 i0 G+ \, ?
  /*
) e9 L0 D1 L& w- g3 Y' j   ioctl(fd,1);   
& |- [7 k/ d  _; H9 ?, h sleep(1);- E+ i& s1 l9 ^) W  A
ioctl(fd,0);
0 b+ m8 z( \( p5 `% o4 `, s# K sleep(1);8 o: f4 z9 w, Y# b, z0 X
*/ , q5 k% ]# a  o2 ~% ?) Q8 S
  }   
+ J8 E, \/ H: l; }7 j return 0;- V: ?! Y- t$ i5 t% N2 c
1 b  ?  w! _( M# C, D
}5 n. H; D- m4 W& n- ~! s

6 a/ l) N9 z6 m# r+ M9 |" u多谢各位指教,谢谢! 急' O0 M4 ~* h8 Y
. _* `# X3 o9 y' t' a6 ~
& \) A# U  X7 v: |+ w8 w
' e3 w5 N) \, H& U0 Q" g
5 x: Y# J9 c4 J7 a: ^. Q, I2 [

0 d/ p4 W: ~1 ?5 S6 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 16:36 , Processed in 0.048864 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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