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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) b' V( `7 H, p/ a6 K2 n( |; P! u! ~/*
! G+ l$ a% o+ k$ \) H3 o4 Q * Copyright (C) 2009 Texas Instruments Inc
8 ]6 b: h- R' x/ d8 C *1 Z: P; d, @' `! n
* This program is free software; you can redistribute it and/or modify
4 t4 w+ F, q; f. r. C, k8 d* w * it under the terms of the GNU General Public License as published by; n# N3 \. M5 @/ X  l
* the Free Software Foundation; either version 2 of the License, or9 C1 o& f& y0 e
* (at your option)any later version./ J" P: o3 X  \1 z! f$ u
*
9 P  M% K* F6 k' f  N' a/ E  \ * This program is distributed in the hope that it will be useful,+ Y5 ~  }' ], H# r( b# p% }
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ }- w5 B5 O4 ^6 r) h: D7 ^+ r * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% v4 t7 `9 a' O$ x+ e& i% d * GNU General Public License for more details.; e$ E5 v) q' X6 ]3 C& @+ T% p
*; k5 y( m" A0 B% T8 n
* You should have received a copy of the GNU General Public License* {' m! C$ T5 r4 C9 a2 B. c) y; T. s
* along with this program; if not, write to the Free Software
$ y; B+ _0 t1 r* s+ r6 Y! ~ * Foundati
/ p9 F, Z+ v+ I- c2 I*/+ h% _$ g$ Y, p) t
#include <linux/module.h>( {3 c, E3 E3 N5 P) V+ ?
#include <linux/init.h>6 D8 _7 W/ x5 k
#include <linux/errno.h>" r& X; G4 Y* F% }& x
#include <linux/types.h>9 v% `' l0 U$ \1 }$ e
#include <linux/interrupt.h>8 a  h  Q9 ]; Y0 f
#include <linux/io.h>" D; I/ J0 Y5 T4 C
#include <linux/sysctl.h>$ ?; j$ b+ I9 z
#include <linux/mm.h>
4 ^5 h' h- s$ e% a#include <linux/delay.h>: h, |% N/ A5 s& k2 `. N  m
#include<linux/kernel.h>! ]! C3 l8 x& L& ^/ o: E) L1 K) W
#include<linux/fs.h>; E8 O! n+ y. U/ ~- @5 S
#include<linux/ioctl.h>! S, q5 C0 g# C, N; E& N4 g
#include<linux/cdev.h>( \, v, O6 G, I
#include<linux/kdev_t.h>
  _5 a$ v2 N6 f1 }4 q( _! p#include<linux/gpio.h>
& E: }, ?( ~7 C6 ~; q5 K#include <mach/hardware.h>! i% r' X" ?6 Z0 \8 p' `
#include <mach/irqs.h>
4 D8 |  \( s! T9 d: Q% S
: d, X) k% |  W( c; x4 u3 E% I#include <asm/mach-types.h>
& {8 i! w; v1 |5 H& q) R2 ^! j5 R/ v#include <asm/mach/arch.h>
; S8 O; W. u3 _9 s- X#include <mach/da8xx.h>; o: w1 g) _9 W* j( O# x
#define  SYSCFG_BASE   0x01c14000$ D9 W! s& n- q0 T; x  D
#define  PINMUX1_OFFSET   0x124
1 _% t( J% Z/ [$ |! N& C#define  PINMUX18_OFFSET  0x168
0 U* \. L0 R' P# k8 v#define  PINMUX19_OFFSET  0x16c9 Z2 F' Y0 {8 F! }* b  w4 g
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 y( w. J9 K! v" x9 ]/ }6 ]3 q( D#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: N/ A0 l5 y, {# \1 `! _5 q1 q6 x2 h# a#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
+ }, X0 Y# D+ U% W#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  o* R2 K8 h! A1 `4 f
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR3 ?9 K7 T* d/ w7 k8 C7 @1 |8 Y# W
                           
3 e. U: L: }- Z9 d1 s8 _#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! w( I" t' R9 T, z; E( [+ j#define DRR_ADDR      0x01D11000  //MCBSP1_DRR+ U; K, b7 C. y  k0 E* q$ i' o; `
//PSC
* H  y3 l3 m# q" `#define  PTCMD_ADDR   0x01E27120  - W% Z! V6 q  s& i) T
#define  MDCTL15_ADDR 0x01E27A3C5 C* s+ f: C3 ^/ {
#define  PDCTL1_ADDR  0x01E27304: }3 c) R/ J; o2 L+ L
//GPIO8 direction
& {5 O2 H4 B& v: t. V! U$ t; t7 X4 Z& ^) \#define GPIO8_DIRECT  0x01E260B0
2 g1 H7 c& x: ]% u3 g- G7 O! j#define GPIO8_OUT     0x01E260B4( b, V. h) @( P) o1 O2 J- v5 H
#define GPIO8_IN     0x01E260C04 E! B9 N3 g+ [" G  u! Q$ M

* ?9 D5 S! p7 r  W//#define MCBSP1_RINT    99              : \) @( a# o! s0 Y3 h8 t. J
//#define MCBSP1_XINT    100  1 q+ S6 O# n) \( }+ Z7 ~( F
static int MCBSP_MAJOR=239;
$ C) o* t4 m$ F. _static int MCBSP_MINOR=0;# D/ K/ a! G! G) a  i9 v" c
static int count =1;) t- W% e& C% }( _/ y! t2 V3 c
5 ?0 B7 [" U, o
#define MCBSP_NAME  "MCBSP-device"
+ ^! U% D' o$ Z* {
$ f3 R; k* d: |; w9 G5 |& X+ wstatic struct cdev *mcbsp_cdev;
2 }4 H% H+ x+ `( Z7 Bstatic struct class *mcbsp_class;
( c- }& F: Z. u8 Y3 M2 T! wstatic dev_t mcbsp_dev;1 c0 P  d8 Q6 X4 D7 _
unsigned int DRR_data;
, M( ], p4 u$ X; P6 z: G& ]unsigned int DXR_data;  Z9 M) A' L' I. r' Y
static int mcbsp_open(struct inode *inode,struct file *file)2 ]1 q1 p: a0 l) w; X- [7 a; s
{
; H$ l8 N8 K- H1 u& s! z) H   
% r4 |0 v% n& }   //interrupt enable,initialized0 j3 }$ E0 Q, k/ {8 v4 N5 j
   unsigned int temp;
  \9 ]3 g+ y. z   //SLEEP_EN(GPIO8[10])---0
: N6 V3 _% L& ~2 C$ m; ?   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( r( d- n& K$ h" _/ u
   temp=temp&(~0x00000400);
7 }. I+ Y3 _  u' F/ f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ w2 k- I+ S0 j% b4 C
  //RESETn(GPIO8[8])----0----1- w( m, X) [9 f+ E: h+ \1 R
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 C4 l1 a2 ]* A4 {   temp=temp&(~0x00000100);
+ s" A* A* u9 e4 g, T1 d- \& [4 K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. A6 v3 v' R8 `. |: g+ ~1 L! d
   udelay(100);
; M* |- h6 R) g3 V  \$ s   temp=temp| 0x00000100;& W1 |8 R4 g" E* f4 A. s  e
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) n2 T9 [- J. k   udelay(100);4 L7 e1 {) r6 x3 ~! {- U( c8 _
   printk("open success!\n");0 J& R; o- z+ s9 l2 u
   return 0;) N7 E- u# o8 z
}2 p& K- G$ e( x, W8 L( @
4 U- D& s4 w, {4 m& T2 x
static int mcbsp_release(struct inode *inode,struct file *file)
- \/ x$ X1 s% o/ ?: z# R{: a( {) ?2 H+ D6 P; G2 P( V
   printk("release success!\n");$ {& Z4 {! u0 y+ R& H
   return 0;
$ y/ S4 D  `- P) K8 Q}
- h8 I% [* X: Q$ p" O6 [! u4 h+ R6 y3 ~4 s% h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 D5 ?; T# c9 Y2 ^' q* z{  a$ _+ @3 b, [* g5 V; ?8 ]
    copy_from_user(&DXR_data,buf,len);
) B: Q" f" b" F. ]9 C    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       * c9 ]! m- T% @3 S8 f) T
    return 0;! f9 A& W" r. C7 c
+ j0 G* F$ r( ]7 A
}4 A7 V. V. @' M
+ O' N1 X$ M2 i4 g5 M4 j. {9 e% k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ [  T8 ^" T7 d$ W6 p7 S' ^{
9 X2 ?: n) J6 ^3 a9 j4 k   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
  U/ I! B: W0 k2 g0 x6 g   copy_to_user(buf,&DRR_data,len);
) G9 Y, R/ N2 d4 s  |- `   return 0;
6 V( E1 z& m( `1 j5 J}
8 `& J* I$ t  ~8 o2 m1 B6 S
6 i9 @# S* j- ?7 [3 D. e' [/ w' H1 Q6 x2 q# o5 Q) f$ s
static struct  file_operations mcbsp_fops=
4 @# A6 v0 f8 k+ z/ C{
  L! t% g8 B' q) M   .owner=THIS_MODULE,5 M) H; l3 _# ~* Z( u
   .open=mcbsp_open,
' u/ _- J6 L, i4 \   .release=mcbsp_release,
' E& A2 }* a; I" ^- ?  n9 S   .write=mcbsp_write,$ ?% j$ [2 H, l% d! \! M  w
   .read=mcbsp_read,
! d; N/ E& w' m1 ?+ y: b! g};  G% p7 v/ d& N8 b; h7 Z
static int __init MCBSP_init(void)
  n8 i$ e/ ?+ Q$ t9 S, [{
6 ^# J4 m; ~# b4 i+ p8 e   int ret;
3 e% f. c) g5 ^3 ^   unsigned  int   PINMUX1_REG_old;
& X8 P# K+ ~# V) d& v   unsigned  int   PINMUX18_REG_old;
8 s2 I8 k( R4 a# X% x. |1 W* w   unsigned  int   PINMUX19_REG_old;
! H9 @( X7 r) }6 V6 P' G   unsigned  int   temp;  
, _( P4 G% }. i* T1 u$ v   if(MCBSP_MAJOR)
2 J9 H  [' u, b1 L) L   {
- N; S+ F8 F& D      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 L7 [+ W! L# J7 w$ O$ E      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
, V4 s4 y/ z* T# c/ T/ p   }4 @1 K1 A& V! C" u. B
   else
' }* S: k8 [! g% W8 R: N   {6 d6 ~1 N" U5 n  k4 R
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" T. T, j4 H9 M# {2 V+ {9 {1 {
      MCBSP_MAJOR=MAJOR(mcbsp_dev);* |% s5 h+ [3 s
   }) n1 S% _7 E3 D/ x$ M
   ( B+ O4 y8 i6 k" c
   if(ret<0)- w( _5 Q, {: Y2 I7 T5 T
   {* a; Q% a' \% c
      printk(KERN_ERR "register chrdev fail!");
1 P' K, x9 C8 J      return -1;4 Z- m4 C  m( g: E/ @
   }6 V  O/ X, {* s2 j. E
   " @2 `1 I' A0 L+ G; k
   mcbsp_cdev=cdev_alloc();
$ e# l) D1 @# q( T8 w3 G& d8 C5 t   * s0 F5 Q# Z+ U9 v# U
   if(mcbsp_cdev!=NULL)0 e# x$ V8 A, O; l
   {
9 ~1 {7 k% x9 e      cdev_init(mcbsp_cdev,&mcbsp_fops);
5 t; `5 W' e' \$ Z      mcbsp_cdev->ops=&mcbsp_fops;% G# z; I6 R% M! }0 T- w- w$ C
      mcbsp_cdev->owner=THIS_MODULE;
3 m. n# e+ S5 A& P8 H      2 G5 d9 p; E* e7 E5 f+ P! y
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 B4 O+ i! k5 K# a* P          printk(KERN_ERR "register cdev fail!");* _9 y; Q$ @  O
      else
5 \; `0 B9 s7 y# m5 `          printk(KERN_ERR "register success!\n");4 b: X8 D- E# }) a
   }% |+ G# j4 g% [0 d& B
   else
  L7 b& ?- r$ @' x   {
, {- [$ Y! U4 A1 N8 \8 \  K: J% O      printk(KERN_ERR "register cdev err!");
- ?+ ^; e$ j! ~7 ~& C3 y" E/ R. z      return -1;
. O; _1 H& ~' o4 q" _" h   }
! R! r9 j# t' V7 {$ Y5 w* c( Y% p   
1 ^! K/ S6 k% r4 d  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) s& U+ F1 \0 @
   if(IS_ERR(mcbsp_class))
9 c/ D6 I; `) \$ w+ q/ {2 p- p   {
- ^; ~: p& [6 d7 r      printk(KERN_ERR "register class err!");' [# ^' D! d0 y* `6 ?1 J! N; J& X
   return -1;
% E2 l% R0 Y+ E& ^, ?2 i   }
* F4 j* T; j' y+ y7 C   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ \4 T/ D' w' ~; c3 o6 a/ W" m6 z" F5 b5 L
   //PSC$ o) u9 L1 @6 l9 I6 r5 h
   //add Enable MCBSP0 `, o& i. H5 H9 P4 h6 j+ g' P
   //test! A5 i8 a% u; W& @, a& G
   temp = 0x80000003;
/ W; z/ S2 w  g) a' @   writel(temp, IO_ADDRESS(MDCTL15_ADDR));" r; m8 o/ P7 A2 y: q+ J
   temp = 0x00000003;
7 {1 o4 f, N, B7 T" x$ b. s   writel(temp, IO_ADDRESS(PTCMD_ADDR));. \5 z8 g( C' B. N# Z/ H0 j% Z
2 ^$ p2 C0 J" H2 w5 x8 X+ |
   temp = 0x001FF201;
7 m: [. p, H. M$ C' |! E   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
) W4 S2 o; T0 d6 N- J6 R   0 U8 O( q0 F- f( ^. D/ o
   //PINMUX  " b, l3 X& F) `% {
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 k- W' }+ u. B: i% [   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  % @: T' W+ Q6 t% o
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
6 G. ^7 D0 g7 T: N5 _' d) j   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. ?- j3 {+ w  y; ]* B- h   
9 y) w: [" }; X8 }) y, f3 |   //SLEEP_EN,EPR,L138_SHK1,L138_RC! h7 W! `* F6 I
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  2 ~2 O( H8 W) _$ k. P
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
$ d. G9 n) L# g4 a   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: Y/ H; _& q$ U8 n; {9 X

( r* T2 i- _5 U  m   //RESETn,L138_SHK2
1 _4 S" W, ~. u4 s( {# v   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  6 k4 I# T& Q0 [9 `
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   # H6 M  |5 l" t- ]+ J# z0 |; k* j
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- F7 ^# I9 o: X

6 H$ t) |" c  v6 M/ l% S   N4 M% f" [: ~, F+ W/ a4 d' J
  //SPCR Register
  J& R# A5 M, f% u& E  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& F; Y, b1 V$ O- e* V  \  temp = 0x03000000;//(DLB=0)
% e7 Q, ^, f: x$ x- H // temp = 0x03008000;//(DLB=1)" a9 C! o# B% y6 m+ r8 q0 v) z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ Y, x/ E2 n  m5 }; y' ?4 L) I  temp = readl(IO_ADDRESS(SPCR_ADDR));! w. H! {4 _0 _) j
  printk("temp=%x\n",temp);
' M, N: K5 X' Q3 f. p
$ G: k1 w. _2 ?8 t5 \% V   //PCR Register& r) f& r2 `* {: m
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
! b! r9 e) i( g. l  // temp = 0x00000F0F;4 a7 l3 Q3 j/ e/ E$ g1 q/ u6 }  J
  temp = 0x00000B0F;. @9 n9 r6 V, D& Y& ~! a* s
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 [' V" X) _8 t! h# y" y
  temp = readl(IO_ADDRESS(PCR_ADDR));
" f; W+ f# }( d% z/ g  printk("temp=%x\n",temp);  " y0 m4 ]( w$ w& g0 p
   //SRGR Register
0 t! Q9 d) i" R* s& p( N   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11& p: u7 \, j$ b0 @8 ]
//temp = 0x301F000B;6 @" ~8 Y& k, D' i3 w
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
1 J, W- C$ H6 r1 V" F2 W! M  temp = readl(IO_ADDRESS(SRGR_ADDR));
- S; M7 ^3 ?) t3 k  printk("temp=%x\n",temp);+ ?9 m) m' Y  f$ f( y% U
   //RCR& @, c% F! x  Y. D' |
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ y" a/ X, [/ S) j3 _  z4 ]# \9 C
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ `! [& f$ J6 C
   temp = 0x00440040;
3 p9 ~, |- _7 J: s; P0 w  F3 |* x" ]/ {   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & R/ h( a& r# G5 F( R( ^
   temp = readl(IO_ADDRESS(RCR_ADDR));
+ V0 m$ j1 ?) R7 m2 {/ c   printk("temp=%x\n",temp);
, K7 ?5 E8 U+ r   //XCR" j+ N; ^; a$ U& o5 \
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
$ z" T3 f2 {  k/ |% E# Y# {   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 B8 C! A# v. Y
   temp = 0x00440040;/ H) I# Q4 W  I  y/ \
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; w$ q! ~0 D3 P; [
   temp = readl(IO_ADDRESS(XCR_ADDR));
% p; D" c% V7 U% O   printk("temp=%x\n",temp);3 V, W  `' i: a; }
  udelay(100);
) F" O7 _( f+ N1 T  //SPCR Register* }# _: d0 W) c' K9 T
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, U! J# U" F( b' C  Z, p# R
  temp = 0x03C10001;   //DLB = 0 VS DLB = 17 V# @7 s$ Y' |; w5 T0 `+ X$ Y. Y
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
3 \. F9 ~; C% L) T6 p  temp = readl(IO_ADDRESS(SPCR_ADDR));
' E; |  g) g9 ~: i+ [  printk("temp=%x\n",temp);
! D0 G- N4 X( G. ?' q2 \* c8 C: w  udelay(100);
" d; E: O4 U" n* `% b
* O! i( D+ w- i& e: b5 ^. G+ [9 F  //set GPIO direction
0 b- _2 k/ Z) K5 |! u; |  o4 Z& e. h& u   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 y6 p: i( l" r6 I1 M4 I9 |
   temp = temp | 0x00000100;//EPR----input) }; `! D" a6 y( A1 u  t4 C: L" ]. X
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 x6 e# C8 F% e) V/ Q   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % J) x! T' t, ?' t! L; x
& r  B6 M/ U; W6 H* O7 K) _
   return 0;
0 v& h/ M1 V/ |( k$ d0 S. U4 Z; x}4 u% w& z) j3 r  q# ?  f
static void __exit MCBSP_exit(void)7 ~9 I' U* I7 M4 z; I4 {: o5 q
{
/ u& q3 V/ R! u" m/ ]0 x' a. c0 t   printk("mcbsp chrdev exit!\n");
+ T7 `' c0 m% K$ k  G   cdev_del(mcbsp_cdev);
6 o% V/ h% H, j$ i7 v- }4 C   unregister_chrdev_region(mcbsp_dev,count);
" v* v' y. y7 @# y   device_destroy(mcbsp_class,mcbsp_dev);' g" L5 J, Z2 S& s% J* i; K$ q0 p
   class_destroy(mcbsp_class);
& m* o, D. k/ y$ e9 X3 b}
4 }! J1 r* x4 @6 M- V: zmodule_init(MCBSP_init);
9 P5 U, `- r7 X$ ?7 J3 S+ Xmodule_exit(MCBSP_exit);' \; n5 F1 F# W6 @

2 O2 Q6 u  |2 d% c% H( e; wMODULE_LICENSE("GPL");& w. }' h) I. H4 |0 u; y
1 c; t9 E: {: ~5 B5 Z% C
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" o% O/ R% e* ?/ T$ _! W' ?我的应用层的测试程序如下
% {) E8 \7 K* y8 S+ u$ j% u, z5 `8 A( ]#include <stdio.h>
) Y6 o8 `% p. l9 N. g4 _#include <string.h>
, K+ t+ y% r* T: ]#include <fcntl.h>9 }# X8 h- t! N& a1 f+ e9 y- i
#include <unistd.h>) J7 e2 ?4 H) n
#include <signal.h>
. d% F! a2 o0 C8 q0 C#include <pthread.h>       //线程& _; l9 f7 J/ [# j2 M2 K
#include <stdlib.h>: V# o5 q5 i0 A* C( Z* J) S
#include <pcap.h>          //捕获网口数据
) O! M7 l; [' x  ~* G& j#include <semaphore.h>     //信号
7 K+ F6 i9 q5 R" D#include <sys/types.h>     //消息对列( ^4 \' Z6 ^# r
#include <sys/ipc.h>       //消息队列; P; F! a' m6 F: a
#include <sys/msg.h>       //消息队列9 E; i4 l- `- |0 h' Y
#include <sys/select.h>. j% q! q& Y# Z# u
#include <sys/syscall.h>
* {3 u/ g2 w, n) t( i& @#include <sys/stat.h>4 m( ~* x# m4 [' g- u
#include <sys/mman.h>$ L1 V3 s! }, Z6 @, }7 y* Q
#define msleep(x) usleep(1000*x)
% Q9 l) X+ y1 S- c
3 Q! ^# H' Z0 V9 w/ {1 Jint main()' t# a4 O% N; e% y8 `
{ 8 |7 Y& x# |8 y4 u
    //MCBSP,ARM与AMBE2000交互设备
" r; s# ?7 {& u' Z int fd;, Y7 y# ~' }+ t$ o
unsigned short data_write = 0x5555;
- m& g! U" ~5 P+ ]# p" } unsigned short data_read = 0x00;% T3 G/ r" q. Q3 |
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 O% \7 e- X* ]4 f0 o% b( @$ X5 d$ j //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 u. c- _+ i" R4 e3 M    ( b2 `2 x  S: h! d- I. d
  if(fd < 0)
% a# C0 |" B( Z/ h8 f4 D0 @5 t  {
5 B% e4 I7 J6 k! n# C) z     perror("open failed\n");- q1 f- ^5 M2 V2 M7 K4 h  A
     return -1;
+ o: w$ i# s8 Q, l  c  }
8 _2 \0 c7 ~& ?  Y7 K  
- {# k( f; r! W2 g4 B% O3 |  while(1)
7 b% Y4 _# c, q  ?* `. u+ K$ v  {
2 V8 f! J3 V1 H% n7 J* i: n   + `% R2 v8 n/ v
   //AMBE2000每次读写是24个字为一帧8 x$ E$ r) r5 v+ G2 G$ x
   //写数据时将数据在底层存储起来,等到中断的时候再发送
8 P' ]3 d4 b8 B6 {% k3 b1 j- I   //AMBE2000输入数据是以0x13EC开头的6 N7 j. e+ L' F8 a: `$ d1 ~" ]
   write(fd,&data_write,sizeof(unsigned short));
! f4 l+ ^1 W4 U( A. e5 l   
; l3 k0 L% f5 G   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & T# }5 T# d+ F" M9 M1 h* g! `
   read(fd,&data_read,sizeof(unsigned short));
8 y/ Q6 e9 o& r4 T" b- A4 O   ( p) ]5 z% E- M& x
   if(data_read == 0x13Ec)1 M4 U5 C+ {# Y! q  q
   {
* o( I! e7 ~; u+ i   
  [: T" Q: D  F9 [' |8 p7 W    printf("data_read = %x\n",data_read);" U0 w5 B: K; {! S" E* H9 f
   }
3 h* x$ d9 V' q$ Z   2 ]0 x& v0 j$ V3 w) g9 B
   msleep(10);
1 s1 q  A# }& w  ~" r: Q  [) o9 ?  ! x) Q$ r1 n" q' t$ Z2 K% |
  /*- s4 j* g( Z6 ^; o5 Q
   ioctl(fd,1);   9 a; j: I, i; {* l% }+ z: a1 p
sleep(1);
6 g3 U1 B* o! ?- v6 M/ q- `+ h* B ioctl(fd,0);  c" M6 h1 ]- v" j# J& Q
sleep(1);
2 `# I# b5 G* [7 d */ 6 B* x. s' }# w$ [! I/ \
  }   
7 G( Q* {, ~1 h/ Z3 R6 N# D+ Z return 0;
, z6 `+ H( t# U- o) b$ Y4 z# A3 r
- T- e9 d+ w4 n" ^}
% T$ X. Y5 S# @# R! }- O" N. G4 }# H8 B% S8 Y+ N  R2 b
多谢各位指教,谢谢! 急4 _* n: S9 ~6 t" N1 D% I3 [9 A
  [0 ]  s( B' p- G" D% c

$ ?) W. ]. f. z' `, o( a% ^: K$ [/ n2 T0 Q, V

; R1 Z, Z* i+ {( g7 H* {6 K8 j7 |& Y# u! A( x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 14:36 , Processed in 0.052468 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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