McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : y& E/ Q# F3 ^1 j
/*& R' C" U5 B- V. u# d" u
* Copyright (C) 2009 Texas Instruments Inc
  e2 R) P5 B5 I *7 a: Z% F4 w% }; u' [6 `
* This program is free software; you can redistribute it and/or modify, b" t( v% C" m
* it under the terms of the GNU General Public License as published by& ?0 [5 u$ f4 a
* the Free Software Foundation; either version 2 of the License, or
- A2 `+ m1 s/ u- Y1 W, _ * (at your option)any later version.! U* o( a! G: w9 \+ s* \+ T4 j6 I
*! r; L9 F  i  ~  U% w
* This program is distributed in the hope that it will be useful,3 O2 x6 G7 e$ F! F9 z
* but WITHOUT ANY WARRANTY; without even the implied warranty of! l8 ~) O. n* J5 f
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 F: \& V0 I9 u* g) Q/ B1 N
* GNU General Public License for more details./ N6 f0 N$ \3 o7 k4 O) u6 z* j2 X
*1 v8 y! c3 V' {
* You should have received a copy of the GNU General Public License: r" [3 N9 G% h6 e
* along with this program; if not, write to the Free Software6 T0 T9 U+ O9 q; s4 t# M1 ^7 X3 x: K( ]
* Foundati
& Q' Y) W0 ]- f6 w/ {1 j*/% A+ y1 R2 S- }$ R3 b1 [
#include <linux/module.h>5 @) R% z) @- F. |7 Q2 d
#include <linux/init.h>) D- b9 S3 r* i$ x: F+ E0 w7 E2 t% y
#include <linux/errno.h>5 ?6 m2 A1 k% ]5 W( j& M
#include <linux/types.h>
  S8 v4 Y8 F( s0 F# q& x* T& d/ ]#include <linux/interrupt.h>! A& A, i. U9 D1 g- A2 S
#include <linux/io.h>
6 |. D2 e6 B% ^) O, T" P#include <linux/sysctl.h>" v. F4 k+ b- }( D. g* \+ F* p
#include <linux/mm.h>
% u% H; c5 O& |/ e#include <linux/delay.h>! M+ e+ u) p. n; V2 b* M
#include<linux/kernel.h>
. ~$ Z# M3 O7 ?$ Z5 h/ J% ]4 i#include<linux/fs.h>
: a( p/ b* j$ A+ C#include<linux/ioctl.h>/ X2 u5 Z9 g; c$ c) z7 R, M
#include<linux/cdev.h>
4 {6 a5 {& \; `3 T1 j+ U#include<linux/kdev_t.h>) O5 F. z0 ?* g) X- D
#include<linux/gpio.h>* s, D& y; g  d: }" `! x, Z/ L
#include <mach/hardware.h>4 |$ u' C# W/ s1 l/ D) C6 D( k6 I  U
#include <mach/irqs.h>
" x/ z" d9 `: u7 d4 ]$ l
* @& Z7 |/ j3 s9 D# a#include <asm/mach-types.h>
* R  r# S. |% D# t+ F#include <asm/mach/arch.h>
9 M: @: B- Q( F' K#include <mach/da8xx.h>3 S9 Q% n6 B. T; W2 b
#define  SYSCFG_BASE   0x01c14000
1 R" q7 `; k) O" O. e# @' z#define  PINMUX1_OFFSET   0x124 3 @* |  @/ T$ f; x8 V+ H
#define  PINMUX18_OFFSET  0x168
* B: I3 b. Q9 [2 X9 h, y#define  PINMUX19_OFFSET  0x16c
+ M, b7 c5 m- f0 X2 a7 C7 P  v" k#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
( w6 T1 i+ V% s+ w: X#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 X$ S3 E1 t, [  v# R3 X
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* L& }: O- I- F
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR- Q7 w: T% X, S  k+ i0 F
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' E; ]; ?  y' t0 }/ N5 f
                            , a' T6 |% J/ A+ O  `, m
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
& h- Y: s, [/ s#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
4 a+ y. s5 j* T' s/ L( y. H5 p//PSC8 S1 H2 [/ }5 K' j6 w" D3 P
#define  PTCMD_ADDR   0x01E27120  
9 O1 n6 H- }" ?4 ~; A2 |3 s% H#define  MDCTL15_ADDR 0x01E27A3C
. _0 [4 C( u1 s. K8 |; Z. w( @#define  PDCTL1_ADDR  0x01E27304
& o2 e/ B! D. o  ^$ R//GPIO8 direction
4 P" F1 ]$ Q" J0 O#define GPIO8_DIRECT  0x01E260B0
: N& F, ~( y/ U. F' d% X2 V#define GPIO8_OUT     0x01E260B4. J( N. \9 \  P
#define GPIO8_IN     0x01E260C02 j0 H) i3 x, [( p# R

- v4 ^9 K: g+ u; l. Y% e//#define MCBSP1_RINT    99              2 y! W. _1 h, ^4 y/ f2 q
//#define MCBSP1_XINT    100  
  _  y* S' @* O6 b) p! Rstatic int MCBSP_MAJOR=239;. P% m7 |9 H2 J
static int MCBSP_MINOR=0;
; V/ T* h, N  R. n& w" g( pstatic int count =1;5 S6 _" h1 k2 o
0 H3 x. _6 K! ?$ H5 O# s" G* J6 @! P
#define MCBSP_NAME  "MCBSP-device"
& ?. `  x- L5 A: s5 {/ M* @! ~: Z% R0 o% V' o
static struct cdev *mcbsp_cdev;5 L9 F8 z- }9 j8 c) @( C
static struct class *mcbsp_class;: r- w7 m0 F- X  Z* g  R) [- _
static dev_t mcbsp_dev;
4 \6 ^  M. j+ v, B/ \( x% \0 L5 Tunsigned int DRR_data;
. z" i* W3 E; T6 Kunsigned int DXR_data;) ?2 ~' w5 M" ?, Y& y: d* {
static int mcbsp_open(struct inode *inode,struct file *file)
/ y5 g  `" U3 }6 m: {{
, }3 l; n) t1 c6 X$ l   9 y/ H+ I% g* A
   //interrupt enable,initialized
4 }# f) L# [! r   unsigned int temp;! [% r: R$ J, s
   //SLEEP_EN(GPIO8[10])---05 y* P2 g4 E6 n7 t
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. S; M  [! N: h0 D
   temp=temp&(~0x00000400);
9 O( v6 ]6 L2 \4 u, R# ]1 p* C   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" s9 |: m* c# N. q) u- W% }  //RESETn(GPIO8[8])----0----1
* h6 z; a6 H6 y3 g2 f% X  `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 q4 E2 {- H5 J
   temp=temp&(~0x00000100);' [0 T+ j! a) B- D
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ @5 X' {" |  V* S6 h
   udelay(100);
: c2 }1 ~; i6 r0 {4 L) M0 `   temp=temp| 0x00000100;* l) r3 m- I( `% `" y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 u& [5 O! e0 \2 `* F) C" v
   udelay(100);4 Y% Y, l' C' q2 }0 K
   printk("open success!\n");
: s* f8 W) u# s  v5 \8 e   return 0;
7 m5 c7 w" {* m8 P}
& F+ R* E# K5 o; L3 g" }# P; I, F0 Z# Z; l- F5 E
static int mcbsp_release(struct inode *inode,struct file *file)
9 h7 |8 Q: D) O  \{; M4 i$ S# R# ?! q; l) t" u* ?! z
   printk("release success!\n");
" {8 ?% N7 m3 n* u% X: F   return 0;
2 o1 u4 y/ v* x1 h5 r& v}" P  u4 K# p  W- j+ N; f$ ~
; f6 |+ x, k$ f% t' B  i5 i( Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; r* X, M/ l4 T$ r{
+ Z$ ~6 I- o4 |5 Y4 ?# k. b    copy_from_user(&DXR_data,buf,len);# U+ P) R/ S8 {1 A$ A
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       0 c9 l8 _. G4 ~6 s* A0 y5 s
    return 0;
& o/ t5 k$ C7 H! J3 z : e( R  O; Q- [, w3 b( k
}
/ t; N, O. T$ `  c3 W  j2 [# V9 _% V
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ ^, \3 p+ w$ J% ^; r
{
1 P8 Z; ^- {; L  ?' ~   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
8 c9 c* H! Q+ t; B8 e) o$ t   copy_to_user(buf,&DRR_data,len); . [  B  l2 |1 X- c
   return 0;, F+ Q! w/ P4 e0 Z2 \4 n3 W
}
, o' _. ~$ I2 s% z5 K( c" l0 w; F* b$ w) R  a  Q

* z: w( l1 s% T# R; rstatic struct  file_operations mcbsp_fops=
+ b. R1 |# k8 d3 S0 ?{
7 Z% v( c) T, T3 n   .owner=THIS_MODULE,
* x0 p. ~7 r& m, t2 C  p9 P   .open=mcbsp_open,
' Y% @) T) X% ~. q   .release=mcbsp_release,$ F  Z# C8 J; H8 M0 `6 |* V  t
   .write=mcbsp_write,+ k5 K2 |7 Y+ D4 g! U) }+ ]
   .read=mcbsp_read,
: ~3 O# ^. d7 J! M( Z};1 y: O4 y1 o" g2 B( {& w5 I* u
static int __init MCBSP_init(void)' c& K& C6 z8 M! E9 w6 ~8 m
{
9 z' C+ R. \% x+ Y9 O   int ret;8 q' M) A0 U5 k4 r& @, _7 E
   unsigned  int   PINMUX1_REG_old;7 J; O, y2 i5 E; ]7 @: M
   unsigned  int   PINMUX18_REG_old;
* p& k) L7 r) F! A$ d7 F1 |* Q   unsigned  int   PINMUX19_REG_old;  P7 o6 J" j& i
   unsigned  int   temp;  
* e' x; w' l, ^5 y! M7 x* y  Z   if(MCBSP_MAJOR)
3 K) ~% F  y! f3 r9 M7 e. m% c3 G   {
( J% {$ \! `! b& Y0 \/ z* j      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 {0 x- [" M9 C2 f9 a7 g7 N" @      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
, Z4 ?6 n/ i* K- o9 Y# ]' N   }
* q7 D  b$ ]6 C3 H* v9 S( u   else. m3 K& a$ m! J
   {/ U4 Q% ~' N3 Q, G% D5 r7 H* K
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& e6 v  V0 {, H      MCBSP_MAJOR=MAJOR(mcbsp_dev);
! v, K- x) h9 q# N. I1 ]   }0 Q1 m. x- S4 ^0 g
   * ^9 d+ A4 b2 C# T, w* D" i
   if(ret<0)
6 n6 q# z" a+ k$ o/ D   {' A- y/ `' ]+ q2 w, I
      printk(KERN_ERR "register chrdev fail!");5 k( @' c0 t9 Z: O
      return -1;' c# p; @/ R) H4 D; c% J
   }
; Q' O3 N2 I! q* k2 G   
; |4 _: \# Q% S& x7 J4 C   mcbsp_cdev=cdev_alloc();. l8 _4 w$ a; `* I9 V) m
   
1 {5 H: w& {& c( _* u4 o1 r% W" [   if(mcbsp_cdev!=NULL)" y9 o3 I% ~$ v# t, h
   {
% q! L2 O# E6 H' n      cdev_init(mcbsp_cdev,&mcbsp_fops);
: w$ W3 P( t7 ~7 s- {' ]      mcbsp_cdev->ops=&mcbsp_fops;
# p2 [' G2 @/ \% w/ R' v      mcbsp_cdev->owner=THIS_MODULE;
) Y' s7 r" t( y% ]8 f+ `/ L      ! L% G. ~4 G0 o( K( P, s# M
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ x; m3 P0 ^3 Y- A3 m* R) ^
          printk(KERN_ERR "register cdev fail!");& G( A# Q4 d* \, L! t
      else0 \5 H) }& Z7 ^" ]# e
          printk(KERN_ERR "register success!\n");1 x' ]' g. P* H; ~8 h2 P" s
   }
2 y/ L7 z4 P" u4 O, g- p* q   else  T! |) \( M- U4 r* ]6 y0 n
   {
1 R% B& K+ D0 i) d  r8 T      printk(KERN_ERR "register cdev err!");/ q, x0 s3 A% y2 O
      return -1;
! s$ ^! C& R" g* e& y& V( X   }
+ S- W; r( o# j' w+ l7 ]   
* V6 B) O' o+ O# b' `  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
  j8 R4 H1 u+ ^# f' n' r0 }: P   if(IS_ERR(mcbsp_class))
9 }; c2 t) W$ b7 U; Y  v9 R9 S   {
. M* A" f8 x: q$ M+ l* h4 q9 ]      printk(KERN_ERR "register class err!");
* g2 ^. X+ A8 p/ k1 }% U   return -1;
$ T% M* q& c# t( B# p3 P) }   }: _& o. e+ H! J! p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 Z- A( D' o$ o# K% i+ P
9 b# b( t' a6 ~   //PSC
& W9 d+ i3 l3 [6 }   //add Enable MCBSP
$ Q# h& m2 z3 Q  \8 k9 |" X. D   //test# ]4 I8 C: n' B  G' \
   temp = 0x80000003;
$ s! P! L% ^+ U$ J* g   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 L' o7 A- c0 K8 K   temp = 0x00000003;
( h$ E+ t- F* \/ M   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 [% I  j* ]- o/ p! m, t2 A
; F+ D7 V5 A8 k" Q( _   temp = 0x001FF201;( y$ g! p, Q' M) w9 f
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 f0 L" L) h6 e+ F: P# _   3 c" O* E9 l7 e' E: a& E5 ^" f
   //PINMUX  * |9 i8 o! b! j) r5 ~
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' u( e  h; K( U$ j0 V, S; f   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
( ?6 ^& _6 w. `/ b8 h! L! E8 o3 L0 ~8 Y   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
3 {$ |6 z4 k& L- b   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" I3 N) |' ?: h% C) {   
6 D& r+ X# S+ ~& i" V2 o   //SLEEP_EN,EPR,L138_SHK1,L138_RC& }9 e, J2 A: S2 L$ a) }
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; X* o6 z2 v/ X* l+ l1 ?   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% b7 K6 q/ J! b: M- w' O  V   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" l/ X) X/ O2 e: r
6 k$ ~/ t: o. z, |# \* X& k* Q' E   //RESETn,L138_SHK2
4 \4 Q7 H8 G9 G" F8 S2 G* g   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ x9 G% ~1 h( I8 h; Q- |1 w3 d2 @! D
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 i) s) [# X$ O" S5 @8 l* q2 X% ^   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( }% D; O# l% S
6 H) q' q8 D& l; S 7 I% e" ^" b3 R" ~
  //SPCR Register
9 F) {0 Q- I0 `1 u# s! G8 q* f  {  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 O' e7 D3 T% r1 H* `  temp = 0x03000000;//(DLB=0)
) l: Q* f3 c+ g6 a& [2 b" C // temp = 0x03008000;//(DLB=1)8 }% q; _5 e/ T
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset8 y8 v; p% Q) }. L
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, M: h0 k  N! @( l3 p  printk("temp=%x\n",temp);, j3 w& n9 r- |% ~9 X3 ^$ z

  V5 C5 Y* F: ]  f   //PCR Register
$ n6 N% [, V" a' F   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, I% u! y. L+ `, J. c$ K  o- G5 k
  // temp = 0x00000F0F;
3 J3 e" H2 d% x; I  temp = 0x00000B0F;
4 w2 @& K& t. \  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized , @* X( S. `! x# s( N1 ~% o
  temp = readl(IO_ADDRESS(PCR_ADDR));$ b, i& S3 t9 R: k' I# x" _* y
  printk("temp=%x\n",temp);  / C, T5 Z  K6 h/ V
   //SRGR Register
8 q% D) L, J6 {8 q0 ?; t. ?   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 y  [% V2 r, a( m* K
//temp = 0x301F000B;
- z+ |2 k" `6 A" y, Y4 ?) k9 b   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized : i+ P# k1 }8 e* D) @: d
  temp = readl(IO_ADDRESS(SRGR_ADDR));
- Q- ?, w# \, d  printk("temp=%x\n",temp);
# f# e) @* d+ C& |/ @; O   //RCR
9 ]1 E4 L/ j( M2 d" f   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* `. D- C$ z/ y* m* j4 y* O; J" C   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 C; Q; d! m: i* Z+ w: m" O8 s1 U
   temp = 0x00440040;" c' P) e- S4 C) e* x( [
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   * Q! q' B# U* G
   temp = readl(IO_ADDRESS(RCR_ADDR));
' F" [& S+ @: Q3 q, A   printk("temp=%x\n",temp);
! {( u: Z$ C( A1 O2 v% ^7 ~& p   //XCR
& y7 W8 N6 Z- a6 ]  f0 ]" J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 P7 @" C0 d, }; |3 m- ?) h" i! i
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 Q8 ]/ w" D0 L8 z4 y   temp = 0x00440040;
7 q- v& d* \/ t2 R4 k   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
8 d) S: a/ n1 Y   temp = readl(IO_ADDRESS(XCR_ADDR));. l) \  S6 N8 \& U
   printk("temp=%x\n",temp);7 Z4 H* P* Y5 Q
  udelay(100);
( R8 p4 x# G9 e4 N! x. e) g* v  //SPCR Register
5 R& R* {& u$ {: n  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 b, r6 T' N* l- I( R/ h
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1% i; N% n1 U4 T$ G+ B* M: C: V+ D: m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled5 v7 V; _+ W- R+ U) X9 j/ [( |
  temp = readl(IO_ADDRESS(SPCR_ADDR));1 D* c' e6 C; h. y3 f- p* _
  printk("temp=%x\n",temp);
: P4 X1 I2 E) a& t. e. h  udelay(100);' j+ R5 U9 n* z  G' R3 k) [
; Z( p0 w7 r9 e6 ]7 {! f' ~3 d
  //set GPIO direction
2 V0 }: A+ v+ E* Y& m   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. T0 j( ^" J( H" p4 l
   temp = temp | 0x00000100;//EPR----input
6 |8 O) Z. u' J1 O& G, m8 `  ]   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 {$ I. o: J! b
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 {/ S+ U2 n" y2 W * A8 F4 Y" O  i" \6 f8 w
   return 0;+ M; A. G0 w( z. w/ e% `
}/ k! D" C; t/ Q! I% u
static void __exit MCBSP_exit(void)
, @7 [" `1 I: g{
2 b  z6 i8 B) a* F8 P8 D1 N  H   printk("mcbsp chrdev exit!\n");
4 h4 Y. r1 J) q! ~/ o0 @   cdev_del(mcbsp_cdev);
9 I& ?) X, P# U   unregister_chrdev_region(mcbsp_dev,count);
: i' x, H! ?2 U/ i/ r: _0 k  J   device_destroy(mcbsp_class,mcbsp_dev);
' [  O2 g0 t9 z5 X+ |. B) r+ ^   class_destroy(mcbsp_class);
  G% I  }5 g% {( e}
6 [; D7 J+ v: H8 O+ p, \; emodule_init(MCBSP_init);1 O( L! Z" D# P4 w% W& c
module_exit(MCBSP_exit);6 f+ s$ J8 s* e

% R+ c" K& t! m) dMODULE_LICENSE("GPL");* j) ^; S' z3 S. {  n
! E& b% ?- j4 y) l! \# }7 |/ k  c
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 u) L- ~! L) V/ x2 J4 L' o0 a
我的应用层的测试程序如下/ Q' G* u1 A* E  Q6 I7 r9 o9 n3 M
#include <stdio.h>- X% h& \1 l6 y  A" T0 E
#include <string.h>
% N8 S8 e; ]0 i3 {, K8 p#include <fcntl.h>) b) ^- G6 X5 ?0 m
#include <unistd.h>
$ w# Z% k: k9 s9 ]#include <signal.h>
8 [; I4 A# J( n: T8 ?0 Q" ]( z# U#include <pthread.h>       //线程& z7 i+ F  ]) S+ M! C5 ]
#include <stdlib.h>& K" L4 h3 S/ v/ E9 }* t
#include <pcap.h>          //捕获网口数据
( R2 u) n3 ?' P  @#include <semaphore.h>     //信号
+ B1 n$ j; S1 d#include <sys/types.h>     //消息对列
8 A6 t1 F1 \0 X2 Y7 X. _#include <sys/ipc.h>       //消息队列
, s4 r* J& q. k1 X  ^+ s0 Z#include <sys/msg.h>       //消息队列
) _5 b9 p0 B$ p( ^#include <sys/select.h>6 B6 M0 i6 {1 A9 t8 Q
#include <sys/syscall.h>
2 U8 U7 z( a/ k9 C3 E3 d% v#include <sys/stat.h>
6 l9 U8 _6 b  E#include <sys/mman.h>
' f! ^6 l* F( l7 U% \* H#define msleep(x) usleep(1000*x)
% m, b: m2 Y) b1 G0 q5 ]$ T0 T. k9 y8 D
int main()5 ^& I! E* e* _& L
{ . `% v% r5 Y& ~' b  h
    //MCBSP,ARM与AMBE2000交互设备
9 a3 A) P1 i" h( P; V) T' o& j int fd;
% b3 h- @( i6 ~5 f  I unsigned short data_write = 0x5555;
7 \  o+ F/ Y) p! u8 J0 D$ V1 N0 {, a; H unsigned short data_read = 0x00;8 L  V1 E5 N& u# {
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( q7 a& w( z1 u6 D" Y/ r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# J* H+ X# h. ?) m; ~7 V/ T! c   
+ b! H7 \; Z# q# }( K  L( Q. m  if(fd < 0)
" f" m  k0 A7 @0 F  {+ u: D8 }' |4 A* S) V
     perror("open failed\n");2 j" H$ Q; M! M* Z1 L
     return -1;
9 o3 R* g& m+ U$ a  }# z$ A% W4 d* i5 d
  
: d* [" B" Y8 r  while(1)0 ?7 ~5 N& D" l" q% w5 O* d0 K
  {
9 x# u+ x; @, l0 y# m   4 K2 A$ A  |1 Q* ~
   //AMBE2000每次读写是24个字为一帧
( Z! Z" S' G8 \9 s" x   //写数据时将数据在底层存储起来,等到中断的时候再发送6 ?8 G; C" |% a$ K2 H7 H+ \
   //AMBE2000输入数据是以0x13EC开头的# f! A5 G2 v: ~; d
   write(fd,&data_write,sizeof(unsigned short));% K3 u( W7 Q" n( M
   " h, M" L$ h& O! j7 W6 o, K
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( q# ?) g; k& \
   read(fd,&data_read,sizeof(unsigned short));
% l3 n% a6 \/ b! h* w# d   
. L1 \' q5 r1 h: D* w, N   if(data_read == 0x13Ec)* |, Q- r' w; u: I8 E" j
   {4 X2 h# B% @  t8 e" l. i+ \
   
$ b; ]8 k* v! d$ [    printf("data_read = %x\n",data_read);/ [# D, J$ }! H6 \) \3 Q! v. w7 |
   }1 V7 }! F! g' i- _" E4 [( J
   3 g' f5 {9 I) A( o" `
   msleep(10);
: J  U/ F( H9 Q' h7 f. b  + I( W4 R$ D: D1 a
  /*
5 r/ n2 s: {2 u2 _3 ^% r- M# X& k   ioctl(fd,1);   
3 k: y0 _. j* d: p* ^1 {$ ? sleep(1);
8 C- k1 h5 `/ g+ w ioctl(fd,0);
$ ^$ A" {6 O4 i& a sleep(1);: s- E* l% t9 G6 \2 T
*/ 1 K) o" y. s0 g& P/ Z
  }   & C* R0 f0 @! \" a* A1 l# P
return 0;2 U0 Z3 l$ S9 D$ T3 G/ J; Y# m
# }# j& \/ H" R
}
& i: r3 n' z5 {+ f  u, a- j0 @
多谢各位指教,谢谢! 急
  l- S$ `* n- s2 l0 D* r4 W' z6 s; f

8 e3 u, ?" w  e: d. |* E& w! E
  E, M2 M$ L# ]7 ^
8 N$ n& M4 i) W! W1 V4 A/ _! D; v, L- a5 t. D) w* @2 w3 l" B# Q, f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 17:52 , Processed in 0.042100 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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