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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : T; E1 n0 r: {$ W% G& t
/*
1 ?9 ~9 b1 Y0 u2 D * Copyright (C) 2009 Texas Instruments Inc, h6 G4 d2 {* y; y- }5 E
*
- P0 Y6 c/ [8 J7 m2 r; Q/ P  q * This program is free software; you can redistribute it and/or modify+ i6 \) z' j! {/ f1 Y, ?. ~) S
* it under the terms of the GNU General Public License as published by; i" J4 @$ c# V& ?" [5 s9 l! B
* the Free Software Foundation; either version 2 of the License, or
0 `2 `; l( l. e" P * (at your option)any later version.2 m, Y* _# f% p. f
*& L7 N. C, Q5 x$ q
* This program is distributed in the hope that it will be useful,8 y  S3 y& }+ q1 e# Y4 I  ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of6 e' Y* G4 Z! @. ?2 O$ V- z4 x) d' ~
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# @; M$ o; I) Q4 u& q( l# m
* GNU General Public License for more details.; O+ W, H# a% }0 Z5 m8 ~
*+ F% |' E+ s: e# ^
* You should have received a copy of the GNU General Public License
, }9 r6 E3 b- E: I/ L7 E0 D5 d * along with this program; if not, write to the Free Software
  r2 Z' r6 M, M) D0 B# a& F* I * Foundati
+ P- y9 ]: c; T- x6 W4 f5 W1 f*/! N, S; F3 z  V: Z
#include <linux/module.h>
' A" ]& h. j$ g#include <linux/init.h>
; P5 \0 U# y7 ~# z3 E#include <linux/errno.h>
2 Z5 I$ w$ s+ h! H1 s3 ?$ Q3 j#include <linux/types.h>" E2 R8 M# O2 x. X" a3 R
#include <linux/interrupt.h>
( G, ^( _. s3 m#include <linux/io.h>
$ f) g% V7 T9 t7 ^#include <linux/sysctl.h>+ Q6 X2 {% s- R
#include <linux/mm.h># H  M4 a  t9 F; d: c
#include <linux/delay.h>, R0 E$ w/ F2 e0 T
#include<linux/kernel.h>, I" P" I) ^3 X9 o8 {
#include<linux/fs.h>, E6 j# c# P' R5 s- ~+ c, o
#include<linux/ioctl.h>* Z7 n5 T+ s& @& N: n! |8 p
#include<linux/cdev.h>7 c9 J/ \8 V6 B6 c; W, Q' C
#include<linux/kdev_t.h>
( Q. _( e! J" t( n#include<linux/gpio.h>0 D2 p+ ^% I5 G
#include <mach/hardware.h>& q/ O+ J# Z1 V$ u
#include <mach/irqs.h>  R1 b7 Z! [1 k

# O- i3 q" t+ y& z( D! U( J0 n- B#include <asm/mach-types.h>& g4 N! p) J& K: t9 Y  g
#include <asm/mach/arch.h>
# D$ m. X; K- S  ~% F#include <mach/da8xx.h>) f4 I) V; K- U, A3 g% h
#define  SYSCFG_BASE   0x01c14000
& @6 c( c* F, s! F. q- P  @#define  PINMUX1_OFFSET   0x124 $ n6 o1 h1 R& g* |
#define  PINMUX18_OFFSET  0x168 ! G0 X" J! e4 s) o. ?+ Q
#define  PINMUX19_OFFSET  0x16c
7 I* U* L2 B1 O#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
  m6 `) U; o6 q1 D#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
$ |7 i, l& v8 l#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: _( o4 t' a8 y) y) A  f
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
- e& v' P5 ^9 |& j3 N( V* K#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR) y' s1 n' j, m' d3 b
                           
' `: |' R0 \8 H0 P#define DXR_ADDR      0x01D11004  //MCBSP1_DXR# T2 v7 t  z( C1 \+ ?- |
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# N2 U) b4 q3 T7 @4 b
//PSC
9 ?/ c2 o4 ]  Q; t5 s#define  PTCMD_ADDR   0x01E27120  . [! E1 y6 p+ c
#define  MDCTL15_ADDR 0x01E27A3C( W6 H; P$ h; y+ L; a
#define  PDCTL1_ADDR  0x01E27304! Z6 @' O, J8 k, r2 z
//GPIO8 direction
( S1 T5 o$ P4 |#define GPIO8_DIRECT  0x01E260B0
: Z! J2 q$ Q1 ^, ~7 W+ u#define GPIO8_OUT     0x01E260B4
& J% R/ `3 ?) X) y* {' w  x#define GPIO8_IN     0x01E260C0: ^5 x# _( n( h- |, A

( m4 {8 S# h3 c, C6 ~% B//#define MCBSP1_RINT    99              # [) V/ E( k# }) Q. C
//#define MCBSP1_XINT    100  7 B2 w8 C, P+ D! O3 O, G7 n
static int MCBSP_MAJOR=239;
" N# r0 S$ L+ h+ ]! [* f, m- q; J) xstatic int MCBSP_MINOR=0;8 j! T* A4 w1 D1 k. g) B
static int count =1;$ y; M' A5 T$ _% x% x2 j

1 {! c: h+ c2 i* s7 I5 ^1 W* l#define MCBSP_NAME  "MCBSP-device"0 O, |1 e) x' s5 a
+ v3 g7 T; `' x  h/ i6 b
static struct cdev *mcbsp_cdev;- e6 K# e3 k; i1 k1 S5 A! `
static struct class *mcbsp_class;
9 r( J! z+ U& Z5 w( w3 e4 L3 ^: ^static dev_t mcbsp_dev;
1 `* Y. H2 b5 e# Uunsigned int DRR_data;
7 }1 e  K6 P& ~unsigned int DXR_data;
/ Q& n! ?2 h; ~+ ]. X* h/ A3 \( i8 \static int mcbsp_open(struct inode *inode,struct file *file)+ w) T" k+ z5 \$ Q' o
{( s  w( e$ w6 F7 h. q
   0 X/ k9 v2 }! K) t
   //interrupt enable,initialized4 Y' q! G+ H; O; I9 L; ?
   unsigned int temp;/ l: \: k8 k; }. F; Y, `0 Q2 O
   //SLEEP_EN(GPIO8[10])---0& S9 f& V0 d3 s" i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 i+ W  m0 K1 s! \4 y
   temp=temp&(~0x00000400);7 w( P7 h) }8 Q' U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 e0 l% m, [5 \$ L* j" Z0 i
  //RESETn(GPIO8[8])----0----1
: X# _1 n' ?+ x7 \1 L$ |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 a3 _6 g7 T& a% g
   temp=temp&(~0x00000100);: ~7 y( l( B0 v; z  W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 _5 D- [$ H# R   udelay(100);% c, q: w" D- u/ L0 ?; `
   temp=temp| 0x00000100;
& U' m+ B! z3 P9 P4 s+ q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 z  Y4 u7 @9 [& h. E   udelay(100);
) f8 ^) i" t1 b5 P9 y4 p7 f' V; J. M  u   printk("open success!\n");* z% a/ |! L1 \+ `0 \% m# p4 L
   return 0;3 d+ u/ L; s0 v4 O1 X# n
}
( P* `% U  u& N' v( W+ k. }% O
3 ]3 `6 |4 \& Q  c. Istatic int mcbsp_release(struct inode *inode,struct file *file)( V2 e' n2 f0 g
{
. A! C# `1 x; l$ N   printk("release success!\n");! g9 T+ c. d; G
   return 0;; n  K! }' m; R
}* F, ?6 z, J6 q; ?' D/ |# b) X
( \3 N4 h& ~# H. S
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); w* f7 Z( g5 C: ~% p' K+ S$ E5 M6 T% `
{
4 `0 W3 c1 }3 ]1 |5 y  |! e3 v    copy_from_user(&DXR_data,buf,len);
! T5 A8 P, B/ M# [# o    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       : R# f, w, J' X3 c! _# Q
    return 0;
3 v, N! u2 x9 z& B - j' Q: N8 ?) x, j- `1 T
}4 u6 b  s8 l/ M) ]" U& {* C. O

* j3 R) _. F- m/ n- ^; f- Fstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ B  s5 x9 I/ f0 P, ]! S4 m* m7 U, ^: a{ % [' A4 x( J& K) U' }( ?: o
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; v3 c; q" K+ F, z& Z
   copy_to_user(buf,&DRR_data,len);
# D8 ?7 D3 d' _9 ^   return 0;: M9 f3 S$ T2 {
}
" }# C2 |9 R' w6 @1 f3 s  o2 n- i. {" k) F  Y3 L/ N! D; x
0 v2 ~3 T: V5 E5 x+ g" ]. ]
static struct  file_operations mcbsp_fops=
* v: _" E  }( H2 q" r{
0 ]3 v5 |$ L! h2 J$ Q   .owner=THIS_MODULE,
- z1 o2 g8 D! O. ^   .open=mcbsp_open,, l, A2 ?/ b! p% `( f
   .release=mcbsp_release,
2 P1 }* e/ V# y( O# o5 n   .write=mcbsp_write,
0 d. L& A7 S/ K4 M6 V   .read=mcbsp_read,
. |5 d& m  G3 h+ p3 |4 M};7 a; }( y. Z1 Q$ `' k) ]4 c3 {
static int __init MCBSP_init(void)
. t4 U8 D( w" [9 z! n$ C, w/ }{
3 A5 P, [. o; _+ f   int ret;
$ V+ {/ d$ G1 x" \6 y! v% \1 N   unsigned  int   PINMUX1_REG_old;
- v& q1 ^. B0 ], f/ p, K: U   unsigned  int   PINMUX18_REG_old;2 I' z. E  J7 @' x8 {
   unsigned  int   PINMUX19_REG_old;+ r8 n0 R0 c& O- O
   unsigned  int   temp;  ; F5 R6 L- {: w
   if(MCBSP_MAJOR)
3 `6 X) G( m$ V, o% y/ l   {
( Q/ ], @7 {$ a& }. W( }      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* N  E( M  p& z! X      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 [0 @: J7 Y  {) e; g; L! \+ Z   }$ _9 G# @8 C7 f5 _6 J5 O
   else+ d( @+ Z& h; C
   {' n( t% u7 K3 k* a% c
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! ~6 F; G' V0 X* t+ J, [      MCBSP_MAJOR=MAJOR(mcbsp_dev);2 i' @3 s+ m6 a+ w: q
   }
( s3 R% a8 b0 l% ]" |2 P2 b   - P, I" {5 t8 Q1 h/ u
   if(ret<0)
+ Y/ z: t+ E5 p7 ~& Z8 z# _1 _   {6 P# v) a- R, N) _& N* Z  Y% o
      printk(KERN_ERR "register chrdev fail!");
. L# G" w3 T8 F0 W      return -1;* b% b1 `/ [. y& `6 a4 O
   }& G* [; }7 h9 v# W, L4 h
   ! C8 Y& b- h& Y9 a: I/ I
   mcbsp_cdev=cdev_alloc();1 K6 h0 v; N* N6 i  f$ V
   
! t' A/ F9 a8 v& v9 g   if(mcbsp_cdev!=NULL)
: [8 ~7 X& B. p   {% |" D+ @& r/ l, P* a& Z
      cdev_init(mcbsp_cdev,&mcbsp_fops);6 a/ F7 A8 O# h- _  H; Q
      mcbsp_cdev->ops=&mcbsp_fops;
8 s: x& ~" M) f& N# d5 L: x      mcbsp_cdev->owner=THIS_MODULE;2 v; U8 f# h, Z
      3 q1 {$ i( x6 j1 g7 b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 G. y1 z: s; E% ?* J
          printk(KERN_ERR "register cdev fail!");
* k. G/ X+ P# T/ B& I      else
9 @9 o. ^- m7 u' Z" v+ g' J          printk(KERN_ERR "register success!\n");
" {4 u  |; L4 U4 P   }/ B7 B4 }2 V; A* z& n- e
   else4 s2 p$ T4 `" i) U4 u! U2 z
   {
" g  s! G# S% \- F8 Y      printk(KERN_ERR "register cdev err!");
/ n% c1 J. t/ ~, M6 y7 L9 i; D% r3 N  o      return -1;+ G, x) W* i0 j* \* o6 `
   }6 r$ v4 F+ H6 j& k! C  H
   
( t% U; P6 h4 F' k% N) w  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! X& |4 P0 P  F8 |8 A0 o
   if(IS_ERR(mcbsp_class))
, \1 t* s$ B9 V* U8 @5 S: y   {- x, @1 p- l+ C. l5 u
      printk(KERN_ERR "register class err!");
% X0 W( P" }# [6 Z   return -1;
& u( h& o/ S# e; ~   }( P/ @/ V) ]4 m; C
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 g7 A1 `- M9 L0 x* z
1 N4 {! n  {, ]/ F( W% F   //PSC
- q- x" @/ F8 i) M/ o   //add Enable MCBSP+ }5 w! N* T( g  [7 N5 O
   //test' r4 D  k5 g' N9 c
   temp = 0x80000003;6 o8 q) K, N( Z2 |4 l! N
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; V  I- R1 u& c) F: X   temp = 0x00000003;* D& \9 i& u" K) `7 J* {8 \7 U( c- {
   writel(temp, IO_ADDRESS(PTCMD_ADDR));& M# _' G: D' C& x- f  Y, w

2 K" k1 k0 P" E5 x0 H6 S, o   temp = 0x001FF201;# ~" a) `0 T0 @& `/ w: @
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  B3 _4 F" Y. b( ?3 O" W; o7 @! K7 u: T5 A   
  V5 x" n; D$ ?3 i1 O   //PINMUX  
3 P+ E% `$ N1 b# K4 s7 |# P   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' F. @3 \6 R2 T( a   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  # e( O+ b, M" N/ `4 k4 ?5 a: u4 u* h
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
+ |( c6 M' W; f! N" j1 x9 G8 n3 C$ I   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* a% W' O$ U; F" w/ t   9 S- N, A# U4 k: j! Y' X! I
   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 W! b5 I0 r) p( A$ U
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ( y$ _, i6 `. _% G1 ^6 h4 G; T* U
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / i0 k: W# |) E( c( O
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 w- X4 c' j$ w  j
" O1 c. Q. z$ U. ^3 {   //RESETn,L138_SHK2
+ S/ L* B- p/ D, h- u: l! P& E   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  / F# F0 w% ~) J5 E
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
9 ]  Y" b# s. N0 ^+ @0 I' I' k+ I' x$ z   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 h. t- O+ e7 j+ Y/ J! Q
9 ]* D/ ]% W3 m. J( ] . e  M! Y4 X+ M! ]# `
  //SPCR Register
) k  f6 I7 V8 I4 H  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 |, J2 G# m7 }  [. n; [4 q* k' W  temp = 0x03000000;//(DLB=0); W, c- W0 x* {2 e. I
// temp = 0x03008000;//(DLB=1)) q; G9 ~. r9 h! d% ~1 N
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset2 g' _7 g3 I. Q/ J$ B4 J
  temp = readl(IO_ADDRESS(SPCR_ADDR));
* n: r- k1 W, e& U; ]2 n  D  printk("temp=%x\n",temp);4 `4 b3 N. v+ E

& D- I0 p; I9 u: S' O# X   //PCR Register
3 R. \* E4 S8 W; s. m   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 [1 G% h3 {4 i+ u7 @. c, e
  // temp = 0x00000F0F;
4 D1 x0 x9 a6 k5 X& W  temp = 0x00000B0F;
2 Z/ x3 D4 t  L7 ^* q( _4 ]  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
4 t8 e! x4 T- b' a) r& ]/ Q  temp = readl(IO_ADDRESS(PCR_ADDR));( B& F3 w7 _, X- c2 i0 r% c! F/ F
  printk("temp=%x\n",temp);  
9 V) \9 V# M( F3 z   //SRGR Register
" D4 A6 c0 A' c: Q2 |0 |   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 v: ^5 @7 d  |; W
//temp = 0x301F000B;* ]3 _2 f, x; k& g3 J& c5 J) T2 a
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 G. Z5 T( v3 w% q1 Y3 q! X+ x  temp = readl(IO_ADDRESS(SRGR_ADDR));$ r$ O& r* U0 ~7 C* Z! c
  printk("temp=%x\n",temp);" ^( Y, G3 P& y7 [) x# F% M( Z6 B
   //RCR
# u" }0 o# L* ?8 [   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: y# c$ m) ~- L# m4 [# _
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 H, x1 b9 m; J9 C# X6 e1 v0 g
   temp = 0x00440040;
6 S+ G, ]) d1 Q, x, z" o3 [   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
' N7 a1 g! P5 x! T+ E# v' v8 S! m   temp = readl(IO_ADDRESS(RCR_ADDR));
, J+ w& q! Y  t; i   printk("temp=%x\n",temp);
, ~+ R0 G0 b9 T   //XCR
$ V" u' W  x- X' g   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 {/ d" Y+ o/ d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 ?8 q# F- k$ L& r* [   temp = 0x00440040;8 g0 l% E: [/ m# o- {7 s
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " L; ?* Z3 s1 ~, n1 V
   temp = readl(IO_ADDRESS(XCR_ADDR));  h1 d4 d4 j. p
   printk("temp=%x\n",temp);
) ]" l- r2 @/ d/ R* [+ h  udelay(100);$ F) B  ?) I1 M( X2 k+ Z6 j
  //SPCR Register
) s( {$ ]: r+ N3 e  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% x- ^% q( {& i7 V5 Z0 o  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
# A/ S: m' w+ l$ g+ o" k' Z* ?% j/ M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 |  R$ |, b( d* G9 @" F5 X  temp = readl(IO_ADDRESS(SPCR_ADDR));
2 F4 F% \; a. E; q  printk("temp=%x\n",temp);: b7 w& N4 t. n. A0 o
  udelay(100);! l, u; U1 _% z+ g  W( G# G

- p" s5 o0 W$ ]2 a! Z  //set GPIO direction
" c+ r8 O$ s' Y0 B   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. t% z& C$ k* f3 k. ^- z) G
   temp = temp | 0x00000100;//EPR----input+ u& ^/ \3 B' l# V  z
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- W8 g4 Q0 d1 k% F. t$ M' \7 P, W   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 Y; Y( W" k9 W

' z& f$ W, E$ c0 \   return 0;
& @4 |- Z; r8 |0 l; I' z}
* `; j: y( H0 D6 sstatic void __exit MCBSP_exit(void)) ^3 v( ~" U2 e9 C+ E) u
{
2 Q* ]0 O9 H/ _  ]9 Y   printk("mcbsp chrdev exit!\n");
& Y) M2 z' [: _2 M4 u   cdev_del(mcbsp_cdev);
. ~# [5 g& \: N2 s9 z7 o: j9 C   unregister_chrdev_region(mcbsp_dev,count);
. E! C& v& B; p% ?0 O% d$ b   device_destroy(mcbsp_class,mcbsp_dev);
5 B9 e4 C3 I" N. x$ d/ [. |   class_destroy(mcbsp_class);
; p7 r8 f3 ?3 v: r* p}
. C3 k* z- y' U) W3 O% v- z6 c* H3 qmodule_init(MCBSP_init);
  m9 z9 V' A, R8 q- Umodule_exit(MCBSP_exit);
: y. h# ^6 `; G5 j
3 n# v' |9 ]2 N' ]4 b- c1 {0 KMODULE_LICENSE("GPL");
1 U4 ?. F. E: U& p6 i1 v8 m1 u
, U: c# ]8 a+ ^( w0 L! {我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 ^4 w5 k0 U; X. I+ V" E9 v0 g
我的应用层的测试程序如下
4 i$ b! J8 D5 p6 r, e1 k#include <stdio.h>
' f+ m! ]- y8 A/ `5 i4 t( w#include <string.h>
5 t& o) y& N) W2 c3 J5 A#include <fcntl.h>
) O6 W; G0 J" _  q' z#include <unistd.h>$ I' ?- ~$ i% p- J- C
#include <signal.h>5 Y7 }, g. X1 Q4 i) I5 \
#include <pthread.h>       //线程
6 i2 q+ |  w, m  m) L6 O) x#include <stdlib.h>
; m4 @% n1 N8 i0 B# H#include <pcap.h>          //捕获网口数据
8 y; j$ w( Q4 i/ m( q#include <semaphore.h>     //信号
* O, b8 ]; M, f7 P% B; e2 g#include <sys/types.h>     //消息对列
/ Q( m, T/ ~8 b, C#include <sys/ipc.h>       //消息队列
( Z1 ]3 k6 G6 h9 G- i! L. U& y# p#include <sys/msg.h>       //消息队列
. N, w5 a# ]$ [* a#include <sys/select.h>3 J  O6 b' E: U9 l- r
#include <sys/syscall.h>
& e1 J1 e* S: Y# z. \# }  D4 V" W6 p#include <sys/stat.h>2 H9 U! ?& j" f% `; A+ c- [- k
#include <sys/mman.h>
! R& |: f# `7 n! J- M( l#define msleep(x) usleep(1000*x)- M2 g& }8 Q1 v; O% V7 R
! W# H% I7 ]- Q% @
int main()
0 Y' j8 A4 ~# C' J# K# g0 ?8 A- m{
% w$ f. H; V4 e; k+ Z3 i0 N& K/ y+ F    //MCBSP,ARM与AMBE2000交互设备
! _+ w9 E2 c( b% G; C1 C7 w9 G int fd;
; d6 L" `4 X6 ~; i8 h$ S7 V unsigned short data_write = 0x5555;
. [0 x2 E/ a9 j1 p9 p unsigned short data_read = 0x00;$ a0 o6 J, Y: j" u
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 n" `. O+ _2 T$ g- K5 f: S6 [
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( E) b0 l; `; p% v& z( q7 C6 t! R    ; F6 d# [: d* M8 ~* w9 r0 C1 h8 W
  if(fd < 0)" _+ E& d) h( k* w) U9 J
  {
( V5 R! C+ U3 k6 w     perror("open failed\n");* q( E" J$ Y& @: c5 {
     return -1;
* p' g/ n( x9 C% X7 N& A& O  }( F6 w3 Q$ g$ ?( P( y
  
* |. L3 [- R6 x! b3 r: q; t' `' g2 ]  while(1)
  c! I- ]2 o9 `9 [' s  {
" ~% {" e/ [, I% r. I$ n   
, [# `5 ^+ ?2 ]- L/ v   //AMBE2000每次读写是24个字为一帧
9 V: ?7 |$ C0 B) @) L   //写数据时将数据在底层存储起来,等到中断的时候再发送
8 r9 h# q1 n1 Y4 P- i4 p) K8 C% n   //AMBE2000输入数据是以0x13EC开头的
) _1 G# l8 k9 ]0 d1 p   write(fd,&data_write,sizeof(unsigned short));
+ W2 w- U8 W% c1 i8 k( _0 u+ |8 s   ! p0 E: ?9 i8 u5 ?5 j; b
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  + p' E8 L( H7 |) _1 z" D+ J
   read(fd,&data_read,sizeof(unsigned short));
" }, S) G3 G. b; V$ d' r   " q+ f1 k0 e* {
   if(data_read == 0x13Ec)+ x2 `9 S0 Y  B; g& M# ^
   {
( r6 e; B9 }* }" i7 P   
1 K. g  L$ b0 d6 U# x# T. r  l    printf("data_read = %x\n",data_read);2 o2 j1 ]: u& M3 G4 w1 M
   }
1 `& V; C+ }% Q) @5 H' h* ^   $ U) I7 Q) f9 K, w& X/ L0 z2 i" s  g
   msleep(10);
: t$ X& \  W# @% _. `, f1 t- y  
6 i* ~7 l; W3 b" B  k  /*
% ?6 J; w6 E0 G' {* o   ioctl(fd,1);   ) x6 {  h9 o: A2 F7 S
sleep(1);
: W$ l" p& ~7 y* ]' _. j ioctl(fd,0);$ F% P8 M- J" w- A9 k% N0 D
sleep(1);
0 @( [" F; b- w7 S" G1 c: @ */ " ]" M. @0 ~# d$ Z1 F
  }   
' k( i8 S/ V4 T) i5 q3 l/ j return 0;  {9 k- ]$ r9 l) N5 O0 S% N
$ M) q/ ?5 W' S0 |0 N$ X
}) z6 z( m7 ^* n- ~- |
* r8 s3 U: ^: `3 v% \
多谢各位指教,谢谢! 急6 e0 M3 k6 s' S" x
# A; C3 B4 S: @& ~* K' L2 U

$ t% }( c) D; g1 T2 G) N# u. N; t) K5 p7 i* w
0 p/ P' r# C9 F! R. E2 C( b

/ \/ c( N( t4 G. i5 P5 C4 Z  n* V5 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 05:17 , Processed in 0.040988 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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