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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! W4 n2 Z# K/ f2 [/*
6 @: o7 }; g( E! v; Y9 _- i$ N' o * Copyright (C) 2009 Texas Instruments Inc
) k1 t, }3 X: J6 o* ^ *
& U( y4 X6 R9 w * This program is free software; you can redistribute it and/or modify
% o. X6 g- M) \! n' {7 U * it under the terms of the GNU General Public License as published by
+ W3 A7 W8 q$ ` * the Free Software Foundation; either version 2 of the License, or
+ @. l0 K8 A3 D( b$ N1 B * (at your option)any later version.
& z+ N8 y2 @3 s *
: `5 m) P+ y. e2 S9 q8 C * This program is distributed in the hope that it will be useful,
5 h8 |  q$ _4 r  b5 w4 t* F * but WITHOUT ANY WARRANTY; without even the implied warranty of
. N1 d# T  e" M% P* G6 _8 T * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* [: k/ G* B6 p- q9 @& b  S2 T
* GNU General Public License for more details.: P' Q3 b! @" i, u! s5 e% [# }$ n
*
+ G( _/ T% W7 f * You should have received a copy of the GNU General Public License$ u6 Z2 @8 X8 ~$ o( h0 @1 K8 Q
* along with this program; if not, write to the Free Software$ w* Z. Z1 Y$ l
* Foundati2 ?7 T6 v# j2 C- B6 J+ v+ _
*/
+ _* J+ u. _2 f#include <linux/module.h>" w& P; Z8 T* X: R' a4 f
#include <linux/init.h>
1 h* b& t* X! q: D- n7 h#include <linux/errno.h>( ?. V. D  c: W; y7 K" F* Y
#include <linux/types.h>
4 p5 y  x4 e% O9 n& I#include <linux/interrupt.h>
% ^; [5 w  ^4 I6 f4 ]0 i0 C. u$ e#include <linux/io.h>
6 c3 b6 x3 v* @#include <linux/sysctl.h>9 T6 `1 F* }2 g+ n
#include <linux/mm.h>+ `( _2 v1 B5 J- x; |
#include <linux/delay.h>" L1 _* e4 s* W, G2 e
#include<linux/kernel.h>2 ^4 Y  |0 r8 @* {  P, u
#include<linux/fs.h>
7 |2 O4 V; J: l#include<linux/ioctl.h>
; t! N' w% m& @  a6 t#include<linux/cdev.h>0 J) F2 n7 z$ \8 s4 J
#include<linux/kdev_t.h>: O4 w% l" I! n5 c4 D% g& w3 |
#include<linux/gpio.h>
* T; P" y0 Y. S* [$ y$ o#include <mach/hardware.h>
, W3 T& x5 y, l/ Y1 O: Q#include <mach/irqs.h>2 x# T% P1 z. G) l$ `
: h  Q' g# G  v
#include <asm/mach-types.h>- j$ C6 V2 v9 r" x0 n/ x
#include <asm/mach/arch.h>- s) b$ r2 J3 \5 P& _
#include <mach/da8xx.h>( U6 `) t1 ?  L$ n4 ~
#define  SYSCFG_BASE   0x01c14000; G9 ]; R( Z& f. U" {0 l
#define  PINMUX1_OFFSET   0x124 , C* g! G% ~# v$ B
#define  PINMUX18_OFFSET  0x168 8 Y6 u! H2 v7 J+ S% X- Q
#define  PINMUX19_OFFSET  0x16c% I8 L, ]5 n" N! c
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR$ e. C. p, U6 P% v8 H
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR, A7 A- ], U; d, U# s. A
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
; r4 w9 x; q5 `# m. O8 d+ T#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
  z# e4 H2 V. }#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 L2 X$ X: _3 k8 I! s                            ' B7 ~: m  ]/ k$ M4 N
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  U6 ^$ F/ ?$ p* _3 p) C$ S#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# I- R0 H7 S# z- I3 B4 V
//PSC
" l1 c8 k. ~) W. A* a#define  PTCMD_ADDR   0x01E27120  
% o% S0 x8 r! ?/ P) {5 E3 V#define  MDCTL15_ADDR 0x01E27A3C) o, ~9 E' q0 a3 [
#define  PDCTL1_ADDR  0x01E27304
- k3 w$ n* J; C) n& L/ x( B, a//GPIO8 direction; j% A! v, y- C" F! S: f
#define GPIO8_DIRECT  0x01E260B0
7 X3 a5 N: {# g: S! M1 H; T- }% y#define GPIO8_OUT     0x01E260B44 Y3 s1 k) R  [3 k$ W. o0 O
#define GPIO8_IN     0x01E260C0
/ V- h1 ^' i- m, K1 z* b- N# I& T/ T$ g% d( K: {( t, a/ T
//#define MCBSP1_RINT    99              
. F; v% L2 h3 ^' _//#define MCBSP1_XINT    100  
2 ?& X* C2 }- _4 X4 ?5 r. zstatic int MCBSP_MAJOR=239;* N3 ?. x1 w, |  z9 V6 m; p
static int MCBSP_MINOR=0;
0 t- X& B) T2 c! [, l/ w& |0 Mstatic int count =1;2 v8 K5 K+ ?( _- y' \

3 H6 G8 r; R' e2 a+ N+ V$ d: k#define MCBSP_NAME  "MCBSP-device"( l" \9 L' e; F) r' A/ L0 ^: J

6 m# ~5 q. D$ ^# ^% q3 O  P# ^static struct cdev *mcbsp_cdev;8 c( ]2 R' E. r9 u8 j% s& R
static struct class *mcbsp_class;
6 q% {1 y, n( ^2 w, a! g3 Istatic dev_t mcbsp_dev;$ T2 @% ~. M& F- Q% Z5 Y
unsigned int DRR_data;; m8 N3 ]3 Y! I' @; V  D* b
unsigned int DXR_data;
. _6 e' v9 G7 k, {/ q9 Qstatic int mcbsp_open(struct inode *inode,struct file *file)* w/ A# M$ a7 h* x
{
* T: q- g( x$ v) N( @   2 j6 ~; C: n; Z8 S; j8 v
   //interrupt enable,initialized
" G& \, J& U2 ~+ O: ~( H- X! l   unsigned int temp;
' x. I. i$ T! P# V' r! s2 i   //SLEEP_EN(GPIO8[10])---0
' M- i- _% G3 R4 E/ \& }   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* ~" \" w; _% [% B/ ]& P! `
   temp=temp&(~0x00000400);
" `; t: E1 I( m; w6 V5 B9 t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 N, F( T0 F  v" `* T  //RESETn(GPIO8[8])----0----1& ]! ^& k6 N( @# G0 G" R
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. j. e7 [- B) r0 S& `
   temp=temp&(~0x00000100);
8 F0 \7 m8 `$ C7 M- @" F2 u   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. c9 U$ G. D& b! e2 ^& F
   udelay(100);
1 L. [$ ~& A) U: F9 y. O   temp=temp| 0x00000100;
0 A' ?: E1 G* Y5 _   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
: |! E9 Q& s! Z   udelay(100);
, k& G% A* q! D6 }! l+ D& f$ E   printk("open success!\n");8 F0 i& X5 w& q. A! p& Y
   return 0;
. t; Q* C% j8 O- b}# p: ^! C( Q) _/ ?
5 B1 k; A4 H( V
static int mcbsp_release(struct inode *inode,struct file *file)* d, u6 l- W$ u: y2 {/ b8 ~
{
9 k$ R5 u! g- A, A; l   printk("release success!\n");* ^& k% b+ g& j6 c: y" @2 g
   return 0;
( R3 ]) D- ]& D8 c: n}
# I. v/ \0 Z1 T: ]! f! s: s; o5 V, M% Y! T
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ j, U# p) Z( W7 d6 d6 T
{& y( R  A6 ]7 X. ?  x( T$ \
    copy_from_user(&DXR_data,buf,len);6 I0 d2 `. U) h9 y' X7 V# S/ @! H
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ) _9 L9 r; k: F2 }
    return 0;5 C0 ?1 c3 C6 b+ a2 [/ P; j
$ z2 K4 l$ y+ a6 S3 u! b3 R
}% u2 K) D! h$ d  w1 |! O

9 t* y6 p# \' G  {static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)  w" ~" T3 F' d7 ^6 Z! T; z
{
/ k) k; ?# E, F+ Z   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! k8 \  a0 A& G! b2 B$ e$ E# k1 T   copy_to_user(buf,&DRR_data,len);
* p% |" t" D; J: r( i   return 0;, a8 ~5 K4 ^/ M# w& d! J
}
( r9 z" g& R( U+ Y: v, @/ V4 ?3 Q$ s* ^' `; `# _- [
8 e2 B6 X5 S  k& `! x/ Z
static struct  file_operations mcbsp_fops=
, A% N8 p% a6 a) T4 c8 w{
/ x( {9 L) T/ s( R& j" o% s   .owner=THIS_MODULE,* m& g7 ?4 w+ `8 Y( j. k
   .open=mcbsp_open,, q; b- K, I, ?7 F, q0 d
   .release=mcbsp_release,( C  d; l" ~5 j  ?! X! J+ a
   .write=mcbsp_write,9 u$ u# {8 V( l) v' W% J
   .read=mcbsp_read,0 I- P/ q4 p4 u+ e6 M' Q
};  e; F7 c: a( Y" I+ E3 |
static int __init MCBSP_init(void)
- T4 @5 }' t8 {2 s, t% `+ ^$ ~{! r) z5 V8 ~, [) l7 I. a
   int ret;, x. z6 U2 i7 q
   unsigned  int   PINMUX1_REG_old;
0 d' N8 E+ R4 {9 D! c8 x   unsigned  int   PINMUX18_REG_old;
. i8 E* W8 @5 i5 K' @7 F   unsigned  int   PINMUX19_REG_old;
; x: V- N' p& b$ j- W0 K   unsigned  int   temp;  1 n0 R' u& l+ `8 `8 f8 e+ x
   if(MCBSP_MAJOR)
/ L4 F7 I( I4 W, P% `/ m   {# ^3 O( g  ~) d9 d" h& g6 f
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 y' O8 d. X1 f% ]" d2 L2 W: T  D
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  D# g- Z( ^! U0 S# ~1 [
   }
% n) |* F0 }  i# u' `  Z7 ]   else4 q2 i: K) A6 W1 F% M
   {5 ~* [! T$ x& v) ^; S) G9 I: X
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% C9 x' G- s: _+ U3 U6 }      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) f  x5 K9 G! z6 }   }& ~6 N# x8 z3 ?
   & T7 i1 T/ o. q! Y
   if(ret<0)! l. H5 g" f  M) E
   {% m* a5 T+ J7 w/ @; V! S
      printk(KERN_ERR "register chrdev fail!");
" {% H% @. P& i, X      return -1;3 Y* H5 U- R7 d
   }
5 a* l) e4 x4 e   3 P" _5 r9 f: t. z% t1 m
   mcbsp_cdev=cdev_alloc();
& M$ V7 Q0 ?. ^$ }   & N) i( t3 s* z9 e
   if(mcbsp_cdev!=NULL); S2 `) T0 O3 m  f# L  n  v
   {# U$ v8 ?. n9 M% ^8 f& k% E7 H
      cdev_init(mcbsp_cdev,&mcbsp_fops);
8 K8 X/ ^5 T" O, f! {' X      mcbsp_cdev->ops=&mcbsp_fops;
) y8 P' s! ^5 m( Q+ ~' G      mcbsp_cdev->owner=THIS_MODULE;( c; k. \. V7 j6 ]. D: z0 h- n9 @$ b
      
; H: h+ o7 u3 _% e( h4 P, s: B$ Q      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), J/ |; ]" d  Z) Y/ I! g" g
          printk(KERN_ERR "register cdev fail!");0 S- G, d) \  ^; {
      else
, z) x1 C' v$ V0 {          printk(KERN_ERR "register success!\n");7 w% c: j/ y" E/ _; M, r' b% C
   }- F  B+ m& y/ Y5 A3 ~2 N
   else
# q( ~% v' w. f& R3 ?8 Q0 K5 X7 H   {
0 E6 P0 M' |0 s5 j) Y% t      printk(KERN_ERR "register cdev err!");6 Z) k( W; D7 ^' v4 D3 t
      return -1;
/ d! E3 U( W% m5 y( `2 w   }2 k0 x; N- n3 B! t
   ( \1 a" a: n0 T4 _8 n" L$ q# Q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; Z& I2 X7 P3 Q+ j* d   if(IS_ERR(mcbsp_class))
$ H' K  k* i3 `: K6 ?) Y   {* N3 E1 t! N5 P" o
      printk(KERN_ERR "register class err!");
7 b# @# W! L7 D. ?   return -1;# u5 i% p/ U+ i( Y7 H' d
   }
$ ^  v4 _9 _3 @5 L& t9 h3 \   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 u5 @$ v- X4 l* B+ |

/ ]/ Q# h6 ]/ J: F" e   //PSC2 }7 F& I0 M2 I; i: U* L
   //add Enable MCBSP% Z7 q7 l  J0 J5 T5 ?3 y
   //test+ B% r* @  W( x) ~  o" ~0 P  s
   temp = 0x80000003;
7 B5 i; i- j* V2 r. E   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 m5 |' c% i4 F+ Z! z( f
   temp = 0x00000003;: @0 {+ E. W% J% q
   writel(temp, IO_ADDRESS(PTCMD_ADDR));4 u& R: o+ B4 b$ J, `" A$ `0 g

' a( t& e" V1 T   temp = 0x001FF201;
; l5 t( x# q8 l3 ^! y" m2 \$ C   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 w6 Q, U2 r, b1 w
   $ K' ]2 k& i1 z5 a+ q
   //PINMUX  ( t9 B5 X2 e2 w3 s2 x
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,, D" ~( u/ K+ o( [" g( E5 u  h
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
2 I2 _9 Q3 C. Z7 t0 M5 Q9 @   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   0 K- `6 L3 b, H' Q/ ^- d
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( p: h# B4 \& U) A% \( d! F
   
. F- e% U0 E* _   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 o# s4 a. ^, T2 r+ H
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" w0 X) ^) t+ k2 p" C2 i# l! b+ ~( d   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   : S6 q2 G7 b2 k) [6 g
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' `& @0 ?' Y3 X; l & N' G8 q; H  t* S% h# r
   //RESETn,L138_SHK2. n+ J7 r7 Z5 v0 f
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : @) r7 v9 D6 Q. @" K$ v3 K
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
- [# t. P8 {3 _   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ G# a# O5 r" p
/ O  P( l# p, }& j6 s* r
* Y8 S8 \8 X/ Z7 {- F
  //SPCR Register
6 C( O8 j1 q! d" B% o& a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- t4 K3 z* j/ |! y: |- r9 X  temp = 0x03000000;//(DLB=0)& ^$ h1 G5 M) e# u
// temp = 0x03008000;//(DLB=1)
6 ]4 }2 B0 J4 A. n# G" U6 E  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset, F, ?4 V! s! {# m' M
  temp = readl(IO_ADDRESS(SPCR_ADDR));* N0 F0 L* Q* \+ h; t
  printk("temp=%x\n",temp);3 Z; G2 O( M- Y* \6 ~
" f/ H$ X* e) B, [. N
   //PCR Register& o0 u7 ]1 T1 e/ ?
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0* ?1 |7 N, i1 ~, I5 S
  // temp = 0x00000F0F;
& n: U/ Y7 D1 J! W4 z+ i" }: {  temp = 0x00000B0F;
& t" x9 _( F  U6 c4 c4 j7 H/ ]  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized # [, r) a, c  ^( C. x# Z
  temp = readl(IO_ADDRESS(PCR_ADDR));" G. R9 ?8 }9 p: J/ _* x, x
  printk("temp=%x\n",temp);  ; S1 V, f4 x2 C
   //SRGR Register! @7 `) H) k5 n% ^
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 ]& B/ Z5 ]" V5 z! g8 B) F //temp = 0x301F000B;
% Y7 I, |. H# u9 B8 m4 X- E   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   g3 N5 v% j/ ^
  temp = readl(IO_ADDRESS(SRGR_ADDR));# ?$ b# y( b6 p) q; b) H. I) [
  printk("temp=%x\n",temp);
" W( A! h+ @  w0 h: z' S   //RCR
; j: d1 K9 [8 B+ ?; ?   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 [# M+ S, Y6 y8 A+ G
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 v/ \& w( x4 J1 a4 Y
   temp = 0x00440040;1 T: O" \8 y2 m8 A
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
( w$ E1 Z2 d2 X  Q2 d5 P   temp = readl(IO_ADDRESS(RCR_ADDR));0 [* a8 ]3 H& ?2 s' s
   printk("temp=%x\n",temp);4 {/ s9 l; X- m% P: \2 ^( s8 E5 g0 ]
   //XCR
4 v& B. w% x8 G8 y, m  W3 n   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- t! ?: o  Y1 J, J
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, _; n( o4 D4 x$ ?8 S, J+ ?
   temp = 0x00440040;  Y7 T  y$ N# A' T. C
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 @9 v  I/ y% H" ~8 [1 v   temp = readl(IO_ADDRESS(XCR_ADDR));
8 ]0 K5 p+ l' a4 V+ |7 t! X   printk("temp=%x\n",temp);
" N  t( A/ J" X  udelay(100);- f; n, V/ D! R7 N7 Y* Q9 y
  //SPCR Register7 }$ v0 H, w1 D$ C8 Z. ?$ M7 Q! T  W0 ]
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 X! K( Z7 h! g. ~+ Y  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 q( J; M0 q; a5 m* P5 E; m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled, \% x4 |  a+ E' Y9 y
  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 K3 e  T" K# b+ c3 P$ ^  printk("temp=%x\n",temp);& A. s" S/ E  Q
  udelay(100);
+ r3 T) Q# {7 f; {4 k0 b6 p- n$ P# N/ F
  //set GPIO direction
, w3 u4 m/ E9 y$ o; o   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 T% T3 r0 B; u8 l: M
   temp = temp | 0x00000100;//EPR----input& G; S0 E' v& R3 ~
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! o. h9 N" I% P$ A   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 ?, I* L; G! [% [5 f( A$ H

, Q; O* `4 P" o* ?0 p3 a   return 0;! F/ s' r0 G: d. N& O' u+ d
}
9 q& F& N" G- Ustatic void __exit MCBSP_exit(void)' X( d; m* T( v0 U) U8 n) i' U
{
5 V: u$ o# `+ ?9 m: N   printk("mcbsp chrdev exit!\n");
; T$ {. k% t' Q   cdev_del(mcbsp_cdev);
" I4 n0 K. Y& a8 s) S: M   unregister_chrdev_region(mcbsp_dev,count);
5 H: m9 ~1 n- q6 i" Q   device_destroy(mcbsp_class,mcbsp_dev);
$ f* S' D  a" l- V8 x. G   class_destroy(mcbsp_class);
7 v5 q" G4 q: x1 a}
3 d8 A% ]9 p  ^) `9 pmodule_init(MCBSP_init);. q+ y# I: F5 `# e) Z4 z
module_exit(MCBSP_exit);
8 ^3 R" P, @, K% s1 H1 d1 M- \; }& C6 i2 R6 F1 M
MODULE_LICENSE("GPL");$ C, o( n7 d9 C4 y6 Q) k, C! {
2 X# r- A! b: P: F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 D* D; _- `% V, x
我的应用层的测试程序如下
5 ^1 f9 M) l5 n! Y* b# H& F#include <stdio.h>
& q. P6 d0 e- t" A4 {#include <string.h>
" b: Y2 t) N( ?0 w. A7 X" m" `#include <fcntl.h>
# |  [+ O! ^: g1 B4 k#include <unistd.h>
/ d* q0 F. E% L6 E- H& l#include <signal.h>2 ?% m( p) L( s; M, T! J8 ~3 Z
#include <pthread.h>       //线程
' Q; h% r. e) O- K#include <stdlib.h>3 t: ]. D* ]- a' r, \- L0 q
#include <pcap.h>          //捕获网口数据& E0 }% p  m- B/ M& A7 t2 p9 O
#include <semaphore.h>     //信号
0 _4 L. ?/ s0 A* v4 S#include <sys/types.h>     //消息对列
2 g9 Q3 e- H2 q, c" e+ d- o# _#include <sys/ipc.h>       //消息队列
, _* C7 v6 n: O5 O7 r6 j' s#include <sys/msg.h>       //消息队列
! V3 Q2 j& K5 W7 ^; p#include <sys/select.h>
- @& g: W9 c# }) x% n) V0 p#include <sys/syscall.h>* t' G: b" B4 q! x6 |& t
#include <sys/stat.h>& K7 a% H; F: O. a' ?* r
#include <sys/mman.h>
1 S- C, k8 d4 U  s1 C9 Q: f$ k#define msleep(x) usleep(1000*x)! u5 Y; y: x8 ?  C& D1 v' @4 [
% c! r0 ?: @0 g2 d8 V
int main()! M' |$ m1 W' s9 Q8 v
{
  v7 R' Z$ }0 s7 ^6 ]$ @    //MCBSP,ARM与AMBE2000交互设备
/ e# T* _3 w& i: i int fd;
$ E8 D1 m5 w- J, y9 I+ q* r' @ unsigned short data_write = 0x5555;
4 p1 J# ]" ]# V1 Q unsigned short data_read = 0x00;1 V  c0 g1 u& f6 y( i- i2 V- @
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ j# p2 V" n6 ^% {. j
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 E6 y5 Z/ S* u( X0 t) y   
) m9 v! T- Q# p  v3 m  if(fd < 0)  p* F5 q7 N! D
  {( j$ p2 Y0 C. _8 v  R8 K) w
     perror("open failed\n");
5 A% K; ~% l" K     return -1;' N' [2 s1 \6 P. f; b
  }" v' x" f* T- R  H9 `, t
  
# G2 `  X- H! c9 `; Z# w9 i8 D/ M  while(1)8 w! @/ p& u6 R# ?7 ~! u
  {
9 n" N& u0 O! L- j3 h  x0 S; l   2 _' X9 X( q2 X" ]
   //AMBE2000每次读写是24个字为一帧
- i2 _! _) J" _& T: r+ j; N   //写数据时将数据在底层存储起来,等到中断的时候再发送' n; ?, V( z/ ?3 O
   //AMBE2000输入数据是以0x13EC开头的
0 Y8 U7 ]* E; N  O; u   write(fd,&data_write,sizeof(unsigned short));
& v7 f6 ?( x: J8 h' Z: _   
8 ]) h/ W2 {* L8 h" C   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  , _$ o& W/ O- ]  a# W
   read(fd,&data_read,sizeof(unsigned short));( e+ R* a/ y' z& t% P
   
8 Q( C& N' |; {   if(data_read == 0x13Ec)
2 ?" Q  P  O( [# Y   {, C7 Y. U% K" E7 b6 p* A/ ]$ a" n
   5 H! b! V2 o/ S  I9 j
    printf("data_read = %x\n",data_read);) [! i, v/ f1 j# ^3 Q# x9 F
   }1 A! S7 ?% ]- `; X- Y0 Z! G0 A
   
6 N1 v8 a9 \3 |) [   msleep(10);
1 A! V- i( D+ s. d  1 a: T) p4 r) c
  /*
3 y4 i4 p9 U& G* l& k& L   ioctl(fd,1);   
6 T+ x( a9 S7 p+ S- R8 S sleep(1);( p7 v. x& P8 U- n/ H8 k
ioctl(fd,0);
5 s7 E3 f# q" ~9 c8 t sleep(1);; W, ]& l& g* Q+ p
*/ 9 c4 ^2 \+ g) j5 F8 I" G
  }   5 E& G6 v; X4 s3 C
return 0;% M  J. e0 m9 d' e! U
: i$ U- O9 P! f. S# a8 T; L, R8 n% {
}) R) ]7 B7 S& o0 r+ x

0 S. I  g6 c8 d9 S' G+ t! i多谢各位指教,谢谢! 急+ g) Y- [! ]0 b: z0 Q: L" g
- N- d. I7 g, P! k0 B7 |4 l. ?9 C

1 k4 B: `( L6 ]- ^0 E: @  L4 u1 d  x. j7 q0 {( m

: U  h" V/ c+ u$ L/ L) }" i! o  o3 W6 y5 ~" R5 F, T$ t2 p4 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 02:30 , Processed in 0.158745 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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