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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% p! ?( X  j: L3 W5 g/*
" D9 w" V1 G% E0 E  ^: H * Copyright (C) 2009 Texas Instruments Inc
) e9 f4 t6 ?1 c# K# Q7 N *
& P% r( Z  |  K/ G, _5 U * This program is free software; you can redistribute it and/or modify
6 F7 H" o! b: e' d7 D& i  W * it under the terms of the GNU General Public License as published by0 @' ]: j/ i# |" Z1 h5 U6 X
* the Free Software Foundation; either version 2 of the License, or
, y- K& k# c/ Z* ~- O3 B# } * (at your option)any later version.
( {4 r- I% y3 V& W *
, r6 N7 o% u/ _ * This program is distributed in the hope that it will be useful,
& V4 g) F/ t% W * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 j5 ]$ w* r( r5 L3 B. d* f* ^* [ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 o- r* J( U# V  x( Y5 T * GNU General Public License for more details.4 x. ?5 k# Z: L; O, r
*
( d; ]1 E  v0 ]5 ] * You should have received a copy of the GNU General Public License" O8 H$ H1 v8 x9 n: q$ B/ ^- g6 y
* along with this program; if not, write to the Free Software9 n( Q  f. G7 p& ?) L
* Foundati9 A9 g* |, |! l" F# B3 m
*/+ h. D% R8 l( y2 N8 R5 w9 ?3 h
#include <linux/module.h>( M# f8 d8 X6 @  T1 L( t% E
#include <linux/init.h>
: Z( u$ {8 z. e) ?1 G7 k#include <linux/errno.h>" J8 r9 \6 @, p
#include <linux/types.h>
7 t9 a7 m1 N8 m# R& s/ N#include <linux/interrupt.h>
/ @# j' `# ]4 F. e#include <linux/io.h>
% z- t6 A9 W' B8 N: F( x, e6 L#include <linux/sysctl.h>
- E# x$ @1 }) h# h$ h% C' G: i#include <linux/mm.h>8 I$ L! ?$ d' r$ c: G& \
#include <linux/delay.h>
' Q2 v8 ^3 Q8 w2 W! T& K% X#include<linux/kernel.h>
1 z% b8 M/ h- \; H( P: P#include<linux/fs.h>
; B0 U" W% F0 t#include<linux/ioctl.h>
9 h+ W( `3 ?7 b! p, n7 q9 ]- |! E#include<linux/cdev.h>
' L2 ^* l) ^  v9 j# `& T1 e. S#include<linux/kdev_t.h>
" N1 U% S6 E5 Z3 Z4 T#include<linux/gpio.h>
) o, s2 z- C1 P) B& c4 l3 \$ G1 F" K#include <mach/hardware.h># Q' Y& C2 e: ?7 |7 c' q7 l/ B
#include <mach/irqs.h>* j* n& h. b6 {$ j
, K* |) x; p3 p+ v
#include <asm/mach-types.h>
$ }# {- X& o2 a9 R0 C5 I* P6 Q#include <asm/mach/arch.h>- e" G: Z. }3 q% z" z: e4 C& p
#include <mach/da8xx.h>/ [' b. D0 x, L, F  c
#define  SYSCFG_BASE   0x01c14000
8 c: i" }7 ^% q4 t/ |/ S- w8 ~#define  PINMUX1_OFFSET   0x124 ! {9 ~8 M& I  F9 c0 Y
#define  PINMUX18_OFFSET  0x168
  {1 }  }5 ]+ t4 g1 g  T2 r#define  PINMUX19_OFFSET  0x16c
- @5 H' e" A& ^, M, |* e  b#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 I+ N* t8 Y4 @& M( {- T1 f#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
8 R$ O' L/ ^: u3 k* e: C0 Q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR2 E% }8 X7 f' y& G
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" |  o6 B6 o3 D  U8 ~2 f# ]$ I
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
9 O) {( c2 P" X9 h5 A- H                            , ~! K& V- F  H" q3 X! s6 b
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
& Z" P' I- R; }* R2 B+ Y. v+ Y#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  L' W/ I& o2 j, }4 u
//PSC$ C  _/ E0 C! h  ]
#define  PTCMD_ADDR   0x01E27120  
6 A; W8 |- ]4 n3 O$ M* @8 H6 i#define  MDCTL15_ADDR 0x01E27A3C
, j4 S/ W! l* e0 E+ L* R4 R; Q4 A6 j#define  PDCTL1_ADDR  0x01E27304  [2 K5 v" g4 _& c4 i9 G
//GPIO8 direction
6 Q' ?! R! h. ?' W+ P  q#define GPIO8_DIRECT  0x01E260B0
% ~# T" _% L1 g3 d#define GPIO8_OUT     0x01E260B4
/ A' f/ c! o' e# s#define GPIO8_IN     0x01E260C0
5 J5 R) j$ v) u+ P" G/ f+ e# D; x+ d3 K7 g. V, S% T0 |$ P: j+ o
//#define MCBSP1_RINT    99                w% K: T  Z* J
//#define MCBSP1_XINT    100  , P7 i& g: n# B% v9 V! f
static int MCBSP_MAJOR=239;
! D' ~' c* |1 @2 o$ p* r3 x6 n0 Rstatic int MCBSP_MINOR=0;( G& e- T" c, C* w* i0 o( ~% @0 B! ?
static int count =1;
4 y# w3 B& s- U+ v) u
' j; h/ ?# k8 z( M0 ?+ z#define MCBSP_NAME  "MCBSP-device"7 z2 q5 q3 Z& k) l- ^/ `. A5 T. A, ]1 t

: q! u+ j* y0 p6 m. }4 H. C5 qstatic struct cdev *mcbsp_cdev;
; b/ D; ]' G- B6 h* k& H- }static struct class *mcbsp_class;. t# e! Y3 w/ r, w4 [& q, G
static dev_t mcbsp_dev;
3 ~/ e! l/ m# m5 u% y  N0 Runsigned int DRR_data;* w! {* [1 @* i- }
unsigned int DXR_data;
1 n! T6 i1 K$ m) I8 ]* Qstatic int mcbsp_open(struct inode *inode,struct file *file)  r9 `, d3 T* F0 V
{; b, \) m2 v8 c: c
   
: g  D. c: M. Y% }' F* L   //interrupt enable,initialized( {5 T$ G+ H: A% X
   unsigned int temp;
: [1 ^0 d8 C8 Q9 H   //SLEEP_EN(GPIO8[10])---0
( o3 A% {: Z- z, ]0 ~+ {+ k   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 y. u* X" N/ s8 Z* a) _   temp=temp&(~0x00000400);
. S' D, X: a7 W3 z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& p: T' V8 B% l  //RESETn(GPIO8[8])----0----1
1 f9 L2 m* i0 f( ^' `. f   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' H# B2 g" D  R# d% Y   temp=temp&(~0x00000100);
( G, l5 E$ h& [$ f5 R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 q& q. D# o$ s1 \2 _   udelay(100);
$ F6 a" z. t1 B6 c) o- n2 K   temp=temp| 0x00000100;
6 v+ u6 R, |' c, f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& Y$ z* I- s, G* k" ^9 X
   udelay(100);+ {9 Q( v  ^) i/ O; u- L* d! W& x* j# M
   printk("open success!\n");/ Z4 s' g( O4 e5 g: f  ~8 h% v
   return 0;
  |( X! O8 m) y5 [. m! X/ P* p}# }3 J! i! C* b# ~1 N1 [

  d/ b' S% j4 fstatic int mcbsp_release(struct inode *inode,struct file *file)
' L) Y. v2 d' u! k# a# P0 S{
! Z0 M' ^( ?# R! I- h  }   printk("release success!\n");7 ^- Q5 }: R0 ^
   return 0;
, h5 j# @9 a4 O$ Y}2 c0 k1 H* \1 w! u) _

$ m% d/ C  @# m" m& G8 U0 Tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% a) Z; M$ o: P+ \4 L; z{3 a- W% t2 A4 s/ W7 K# Q: M
    copy_from_user(&DXR_data,buf,len);
$ \0 c) a/ R4 P0 ~* u. d' x    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) u! @  l( C7 W- s# D    return 0;% ~# U2 o- G4 ]
1 z. e/ g# F/ F3 o( g
}+ s7 v. N$ j9 n/ N! F8 E

9 g6 s5 n8 D6 S# y2 G7 Xstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). ^6 u3 w4 i- ]3 T
{ . U' A3 C3 d$ z# a! \; {
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' B% Y5 d- F: }0 G& E- d: b: ~   copy_to_user(buf,&DRR_data,len);
9 I5 g9 }# A+ \& E   return 0;7 ]" k  L, u5 D" Q
}$ ?* ^. y7 l9 Q8 r

4 O; c  e6 y3 a; P( B  q2 f
6 j; f$ n4 S# qstatic struct  file_operations mcbsp_fops=4 U# A2 i; K6 `. }8 ?1 p! x
{
" a6 W3 E- ?$ s. e: a   .owner=THIS_MODULE,0 A8 j6 X/ U9 L5 N( Y
   .open=mcbsp_open,
3 b8 L( J' ^! L5 \- P, d   .release=mcbsp_release,; j$ t! p- @  n4 U' \5 I* Q
   .write=mcbsp_write,5 ~" l1 s  E- A! {( x
   .read=mcbsp_read,- ^$ t7 L! W- U. I6 h: W" g
};
! u+ T2 |6 A+ D. O4 c8 x9 Y: gstatic int __init MCBSP_init(void): p1 P* R/ h  Z5 e. Y# j' D4 ?; t0 {
{
, B! P" D+ \! c, j0 _: ~3 G  y, U   int ret;& k# c: R* d3 [) X# t; U8 G- Z
   unsigned  int   PINMUX1_REG_old;. B& }5 E1 J- x% {( C
   unsigned  int   PINMUX18_REG_old;
9 t& p5 m* n: E   unsigned  int   PINMUX19_REG_old;
. R6 J- V2 c9 r3 c' f' `* d5 o   unsigned  int   temp;  
$ ]# {- R7 h$ Y7 q   if(MCBSP_MAJOR)
4 g9 J$ Z5 g" R( A$ d2 ?: W   {. V0 c: M1 }; v2 \" ~
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* a& B$ @8 K$ l+ o( t( u
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  ~$ Y  ^$ G) c* A' O3 j
   }
7 L7 f2 t3 X5 T   else/ R& e' c* v) Z/ X+ h3 ^* l) }" y
   {
; o) X4 p( s# \      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 R& z! W! t( I$ i- D4 N# d" H+ m
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
4 n" M, p, \/ H( S& s0 z$ N5 i   }# Q$ h  C( ]) C) G* C
   
# i/ ~, G) z, a+ O! t   if(ret<0)4 S! A" q/ I6 P% `# O2 R7 f
   {
8 @8 j6 G7 p* B! v! c5 \      printk(KERN_ERR "register chrdev fail!");
2 Y, s' S/ \  K5 O      return -1;
4 H' a% M  U1 U   }
$ R9 N5 J( V/ ~7 _   ' L8 [8 v$ x/ K
   mcbsp_cdev=cdev_alloc();
6 l  P( a7 V' W- h   
! t9 I4 j  [' [! u   if(mcbsp_cdev!=NULL)
8 \, m2 P5 V. u# C# z+ N   {
- B7 u4 a3 h( C      cdev_init(mcbsp_cdev,&mcbsp_fops);
/ n7 w, }  z% b7 [) d      mcbsp_cdev->ops=&mcbsp_fops;- o7 M" e1 e0 a; Y
      mcbsp_cdev->owner=THIS_MODULE;
( ?) r$ `! I7 u* O7 e( Z      
$ `7 W: b; Y6 p8 |+ I  ?      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), O! q+ B1 o1 w) E8 e- p. s" S
          printk(KERN_ERR "register cdev fail!");2 A5 z  h* R- H1 N/ d7 J5 q
      else
3 }* ~: v8 k$ ]8 D3 `          printk(KERN_ERR "register success!\n");" }7 M4 c5 x4 E2 C7 X( N
   }
  F( a% ^* [; y! h; T   else9 j3 P+ T% O6 d' \' Z$ p. }
   {2 h3 d$ y" i$ Y$ [+ h3 e: l* \
      printk(KERN_ERR "register cdev err!");
, n2 Q, m! Z+ ]& U      return -1;& Y+ R9 P; F7 v# V$ d
   }
& S! Y- n4 Z* @4 V4 l( {/ X0 e   4 Y: R6 K' s( R! @7 V
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( M' d# K8 x- R
   if(IS_ERR(mcbsp_class))9 r3 K3 {2 c" K8 F: T  l" @) @
   {5 V7 E' V: s# D# [1 X
      printk(KERN_ERR "register class err!");
2 E- U5 S2 S! I( b   return -1;
0 ]* g4 j' G2 B- |   }
5 |+ t# C, E& R+ D, d   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* a) G+ f! E! y+ R
& R) K/ m' Q% G9 c1 f) }   //PSC
  b8 S# v9 x6 H   //add Enable MCBSP
  c7 \" Q  t1 b) P: s5 w   //test
! X; q  m8 s2 K' I   temp = 0x80000003;* W' w' y5 h2 \2 s; J! `* f
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 w( U# D* J4 S; \; d5 a0 d" N   temp = 0x00000003;
+ B, K: k. d  o7 L. {" `# e  {   writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 [9 V' X, x8 @. }
, k2 P3 z0 m  m& x1 ^   temp = 0x001FF201;
7 V+ J6 q4 e: M   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; _7 u, V9 a6 j+ X
   
& f6 y, C( s! k, h" |- l  y   //PINMUX  
8 f! ~7 k9 E1 v   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: _1 N1 ~' u: S- y3 ~( L5 ?
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
- }/ @; o8 p. ^5 ]   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   / R2 ^( K9 ^7 i
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# h8 D4 L) v% d- u
   6 ^# F. o2 Q6 b$ R* V0 O
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; q3 _# w. Z2 Y" G3 y# Z+ \   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
' p; n% }! i& f   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   $ Q% ?- }+ W# p
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* X! A/ B5 J& r6 c
- N6 v( o/ R# K3 w. U   //RESETn,L138_SHK2
5 s' W% A: J2 G2 I7 |) |! [8 R  s: ~1 H   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ! \% R' X' p& S
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 {6 z  t) t! y6 W  U* E   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ {# p7 i. r7 i) z
/ J( Q4 d0 G  t9 w

6 L% I4 J2 B  ~9 M/ }! Q  //SPCR Register; G& [! L; p  d* l
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 u7 p9 t" y8 V( a0 t' r; z  temp = 0x03000000;//(DLB=0)
3 F0 N: }  d, Y; a4 [ // temp = 0x03008000;//(DLB=1)
6 @/ b7 M6 {% @4 }& K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset7 F' V2 x" k% e" H( l+ v& v
  temp = readl(IO_ADDRESS(SPCR_ADDR));: L& a2 j0 w) q* w) }
  printk("temp=%x\n",temp);9 c+ }/ _: u& g' ?9 x
! ^, g" z$ T; x5 c6 N3 G- J' i
   //PCR Register; @! h5 x/ X. y$ K0 M
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
$ P/ g$ m& u" v* N$ J  // temp = 0x00000F0F;
/ N6 B5 t: x0 a9 @2 _" F& J- ]/ b+ i  temp = 0x00000B0F;
# W9 g5 T# `' b1 {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 t* m: \4 ]9 x1 ?9 g- ^% S- E1 j  temp = readl(IO_ADDRESS(PCR_ADDR));: n5 `$ ]+ G" r5 Z) B/ T
  printk("temp=%x\n",temp);  
9 f* B# p! t1 _' m; s- R/ Q   //SRGR Register
3 s/ g9 }9 k8 W; T5 K   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
  g( A  W3 c- p% ^( F) ^ //temp = 0x301F000B;
$ P0 l( C* M  [0 b   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * I8 D! X% q- Y# r) p
  temp = readl(IO_ADDRESS(SRGR_ADDR));
- O- Q- k# m) `  printk("temp=%x\n",temp);
) h, O$ h% ]( P! [, R& Q$ J+ S   //RCR
% Q& r! q. @( Z$ O   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 G6 p+ |8 K  M9 o
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 ^( Y/ d4 q$ t3 L+ u2 u
   temp = 0x00440040;; \" d1 `2 ~9 F7 I& a! ^6 G
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ( e9 `4 N4 o0 P, t& [
   temp = readl(IO_ADDRESS(RCR_ADDR));1 ~$ v' V- d! N& a4 g! D
   printk("temp=%x\n",temp);
, M& x5 d7 h9 Z' |9 H   //XCR
& f% C0 J6 `& o' x# S   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
2 e- ~5 b/ G: a, t. J   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 _4 T2 t7 u5 H& W3 n" s   temp = 0x00440040;- g' F5 V8 ~. j5 B" o
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   5 ?1 Z1 \- s) G. ~- Z' w) w# ?
   temp = readl(IO_ADDRESS(XCR_ADDR));
% c/ k  c$ z* ]( Y' P. q8 s   printk("temp=%x\n",temp);4 b0 w$ Y; C7 ^
  udelay(100);. h1 V/ q. L  {7 I) c- n: T
  //SPCR Register' U3 W5 K& m/ p' [
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 A( [/ u9 E7 n; p% @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
2 x) X: s# h' F6 `  J) D  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 U: J$ m+ S0 C% C  temp = readl(IO_ADDRESS(SPCR_ADDR));
4 Y8 f! O# `- X6 o! U  printk("temp=%x\n",temp);
# I" m$ k2 h$ s7 k9 m0 X( v  udelay(100);; C- y6 m/ q8 d/ k
6 [* D' }# |7 Z5 S3 n  A+ r
  //set GPIO direction3 S- R0 R7 x- w9 h. }; \
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- V) m2 k: l2 D; \& x3 g7 T
   temp = temp | 0x00000100;//EPR----input' {0 F9 |9 t5 V
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" k6 D' ?- X& {- J1 U2 l. B
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 K2 d7 ^: m! n, ?
, r2 Z" y# z2 P7 p3 l& g
   return 0;
5 L/ h4 u) Z& S3 V0 m% t1 V+ I}
0 o' z8 X- Q) l& T  h+ g. Hstatic void __exit MCBSP_exit(void)
* w2 p" d  z, u& ~2 L5 f{
( `; N/ O$ k8 o2 f+ J3 Z! a   printk("mcbsp chrdev exit!\n");9 H' X4 F- y  {! n) n
   cdev_del(mcbsp_cdev);5 z5 l5 t  G) N5 k; H1 \# p! E
   unregister_chrdev_region(mcbsp_dev,count);
1 }% s3 r9 Y: I# l3 x& x   device_destroy(mcbsp_class,mcbsp_dev);
$ ]: P& Z- _! |; O- t; N   class_destroy(mcbsp_class);
- B7 ~: p, l7 d' L! R* W}
- v( U; V; b0 t' H  i5 J( @* umodule_init(MCBSP_init);
' o5 O+ R, S: Qmodule_exit(MCBSP_exit);
4 O' d& w8 X2 d1 x7 N% ]! t$ T$ f; k- q5 v# V
MODULE_LICENSE("GPL");
% o1 R8 ^  r* c
# H' t. T* [5 o9 K2 U: g7 a我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。( ~( t& @0 @3 t5 ?) S
我的应用层的测试程序如下
7 y3 k$ ?- ]/ z# Q% v# q- V+ m% R#include <stdio.h>% ~- m3 E, l9 O3 f
#include <string.h>6 v1 Z* @( I' z. e9 w) S- ?
#include <fcntl.h>
! o9 U( B3 m9 Y9 F! K$ e! v- o' @0 q#include <unistd.h>
4 U. V7 |: p) T6 N7 O8 K#include <signal.h>
: }0 ]- ?  X: b; ]# ^- I#include <pthread.h>       //线程
0 _* [$ F# \) ]( [: f1 N. H5 V#include <stdlib.h>
& E/ m/ S, f% @+ ~' y#include <pcap.h>          //捕获网口数据
0 \0 V" [' [+ k9 w2 v: l#include <semaphore.h>     //信号
* D5 a) T& D1 Z# z6 A2 [, I! f#include <sys/types.h>     //消息对列
. N  y! v7 L' R6 k#include <sys/ipc.h>       //消息队列
% s' w" o9 a' [$ O* s#include <sys/msg.h>       //消息队列
! U7 ]6 Y0 R, M. q2 I2 v. c#include <sys/select.h>. x9 u5 @+ t7 u7 w0 R/ }
#include <sys/syscall.h>
0 ?! h! F! w5 z8 ?1 p. @- y2 z% `#include <sys/stat.h>9 o+ b8 o4 z6 o6 _6 Y4 o
#include <sys/mman.h>
8 J( O3 J# O; F/ d# t9 J#define msleep(x) usleep(1000*x)+ L6 I' _# |2 t& Q8 b* q5 K

: {( q& y' S1 c1 T! kint main(): _( s) m2 Q( z" c
{ , `* E. ?, j* @
    //MCBSP,ARM与AMBE2000交互设备+ e$ n9 {6 S* G% B) V
int fd;
4 p/ y6 i! T) r unsigned short data_write = 0x5555;5 F6 Q# O; v8 h1 Y. e
unsigned short data_read = 0x00;
9 D, S" r/ W1 ^6 l/ {# d  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ g" E% P& @6 C  @6 ?
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 d6 {# b3 @" |! N' ~
    1 I& K6 d' P5 S) d; X% m& }
  if(fd < 0)
( J7 n& |. @/ H: ]; ~  {
6 {  m( p+ c$ q; A6 z  w     perror("open failed\n");
/ Q; E' b# i3 M/ c     return -1;
' h, f. M$ s: B  }
8 K6 j0 E/ `. k$ }1 a# s# M8 m  5 L# P) O' g' \7 |3 i. L* U6 a
  while(1)/ v8 u* J5 c' n# I4 v
  {& m; o/ S4 q3 ^0 {! d) J" a
   , p' k& k* P# B0 w
   //AMBE2000每次读写是24个字为一帧! M4 u, i) D) v- K2 Z: t& A8 e9 j
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 r! e; ~# M+ w
   //AMBE2000输入数据是以0x13EC开头的" F! c5 {" _/ Q- D
   write(fd,&data_write,sizeof(unsigned short));! H$ O/ N' Y3 W2 A6 v
   ) U- j7 [4 K) p3 p- N
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  / n0 N& j# e; M. i# ?! q: U" n
   read(fd,&data_read,sizeof(unsigned short));8 P1 e4 [& G0 [8 S6 c% v7 W- m& `
   6 D6 F1 y) r3 V& l! S
   if(data_read == 0x13Ec)
/ z, O( {5 X( G   {  B$ A$ T. F# Y8 N$ E) ?
   ! T( F$ ]& j9 l+ F: y( g- n$ y. k
    printf("data_read = %x\n",data_read);- S. U* J  e9 G+ B6 N- X
   }
, }0 ?9 J; \5 _5 M9 i5 L/ T2 z4 j   - O/ {/ Y' V+ x4 x$ D
   msleep(10);% q- ?) n& L& e! z+ Y/ M: q
  # }5 T8 ^2 \, X: X$ Q
  /*
8 e8 p, t. x, \6 f$ F6 J   ioctl(fd,1);   
* G, m1 m/ v" l. n7 c9 N; T sleep(1);
+ {% b# X$ b- k; G6 m ioctl(fd,0);
; N. ]5 J/ W# O4 }. ^$ @. Z( L# k sleep(1);/ D$ a' P; t5 h% B4 Y  c9 Q+ H0 i
*/ $ U* A6 e3 j( i) n3 i
  }   # Q3 B, K* t$ c
return 0;6 m$ M/ O2 f5 ^" N! F

1 f; j9 j, B) Q) m) D$ s}
  q- [. I3 [& V0 c& F2 I, j) ?# L
- ]5 f+ a' T$ I8 f! U多谢各位指教,谢谢! 急
% G% o7 V) p4 `5 _& N& L( B7 x9 H9 [2 \1 k/ B# I

; O+ P1 L- }; ?7 ^. m( D. v+ v* g% N* s' p: h& K% o

3 s/ A6 c' q+ _) p5 K
* C& J) @" R" y, B7 H7 ~. i2 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 20:34 , Processed in 0.048847 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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