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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  u: @3 y+ S% h4 Q/*9 L1 ~8 Y$ P: d. q/ j+ _  F9 D
* Copyright (C) 2009 Texas Instruments Inc
- h: s$ t8 y  O0 ~( K+ f+ h8 A *
& T6 k9 d8 H; \% l/ W' ^( x * This program is free software; you can redistribute it and/or modify! ]2 E! m* f3 l7 z- P* t* z
* it under the terms of the GNU General Public License as published by
2 k8 X- N9 o& f0 ?. E * the Free Software Foundation; either version 2 of the License, or9 q: d* ?4 c8 @. q; h
* (at your option)any later version.+ e, K/ I( D0 S, N. `. m! q8 I
*
% |8 I. X2 ?5 q0 {9 W# e" u; w  x4 h * This program is distributed in the hope that it will be useful,
0 Y6 A$ }4 `* S1 U4 ~+ o * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 N: y( m& F' F( ?7 K7 M* S, l * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- m( G' Q& D1 y: m
* GNU General Public License for more details.2 A. Z3 l; p8 e# K4 c9 l3 i
*
1 d! |5 Z! `, g3 J% |  X7 e2 [7 r. G * You should have received a copy of the GNU General Public License" s* I6 x. @, g: L! e5 N# q4 P
* along with this program; if not, write to the Free Software7 |, F1 S; h' p4 I( S
* Foundati
- B& M1 ?( l5 d. W4 R$ I, E' c*/7 J% S) m$ Y1 F+ t+ x9 T" w
#include <linux/module.h>9 ~1 ~  q+ _6 {/ g* F7 f" P4 W$ Y
#include <linux/init.h>2 e' _$ D( b2 m. z
#include <linux/errno.h>' Q5 Y% l  i0 }  r2 D' W! E
#include <linux/types.h>; [. j  i0 L6 ]
#include <linux/interrupt.h>5 g; q: Y/ w! @% E7 u
#include <linux/io.h>6 t2 c( U5 F- B8 A" y& b: p# b
#include <linux/sysctl.h>5 e" I, u7 W- k! [+ E7 P9 y& X
#include <linux/mm.h>
; m- c& F8 j* Q7 y$ j" y/ C. }#include <linux/delay.h>" u- H1 ], L! b" x! ^- i% y
#include<linux/kernel.h>
) Q% @! S' L- y; N$ Y#include<linux/fs.h>
- [3 C+ I( {6 d) P#include<linux/ioctl.h>
- g. [) `" o- _" U#include<linux/cdev.h>/ G9 W( f* L9 b- s. q
#include<linux/kdev_t.h>
9 b1 e1 Y2 d6 h' G5 e3 N#include<linux/gpio.h>
$ |3 Z4 K# R' D3 T6 f#include <mach/hardware.h>0 c8 T3 ^3 I+ J4 h6 k
#include <mach/irqs.h>
( g6 d& E! z" @  e, H* N
* y! ?0 R5 W5 M5 C+ R7 V% R#include <asm/mach-types.h>
) C2 h7 J( C# y$ C/ ^#include <asm/mach/arch.h># B$ i& |+ m; G% ^
#include <mach/da8xx.h>% H1 |( m3 m1 f$ Z1 F1 r
#define  SYSCFG_BASE   0x01c14000
5 A* L- E9 R. \+ I/ a  s#define  PINMUX1_OFFSET   0x124
7 L8 l8 u5 c9 ~4 `" ^, a0 x#define  PINMUX18_OFFSET  0x168
, @: F8 f2 ?1 r& [6 Z#define  PINMUX19_OFFSET  0x16c
, D4 n/ p  U' |/ |5 R( r& x9 u#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' f& Y' |( q  t) o' m#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
* D, S) Z$ k) n( q5 [4 U#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR" I' g. D/ P% m3 z2 v
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR' K/ \* D- c" Z  c) `2 s
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; q" I0 Q% @4 N, s3 L' [                              \7 x: z, W' s5 ~1 h* V
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 ~/ F, D. @  |  h# @; ~9 i9 G4 S#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
5 \9 D3 [" Q3 R- J& k//PSC
* R/ v' E  \& C5 Z#define  PTCMD_ADDR   0x01E27120  9 V8 Z- N" h$ W# ^! V- D. A4 r
#define  MDCTL15_ADDR 0x01E27A3C1 c$ }7 m, Y& B  G* l( B
#define  PDCTL1_ADDR  0x01E27304
. s. [+ p$ A8 J2 H) g//GPIO8 direction
# M' V1 K) w" |( d: i3 K5 @8 s. z$ M#define GPIO8_DIRECT  0x01E260B08 F1 }  Z2 }: e, I
#define GPIO8_OUT     0x01E260B4
3 y" C3 q3 F) e: X! D- y( i6 Q#define GPIO8_IN     0x01E260C05 r# R1 I5 Z5 h- w8 P/ G
$ P! q2 }& Q- Z; A0 |
//#define MCBSP1_RINT    99              8 i- E9 A2 B# h, A" h
//#define MCBSP1_XINT    100  
5 f9 X, T0 G2 \3 p6 `* astatic int MCBSP_MAJOR=239;
/ R; K; w% T$ Z% f6 \( Sstatic int MCBSP_MINOR=0;
+ A: z. @( P. n9 Y/ ]static int count =1;
9 J/ O! P  z  @8 C. r: y% q- H
) _7 c7 y$ R0 w5 L#define MCBSP_NAME  "MCBSP-device"2 g0 Q2 \* f0 A+ U& f3 R

9 n6 k9 \% f- v4 C* \4 I' H5 ystatic struct cdev *mcbsp_cdev;  K) X) W& s) x- o4 I
static struct class *mcbsp_class;. q1 u* K% n) s+ q) }  A
static dev_t mcbsp_dev;1 F0 g. r8 O- X. c+ R
unsigned int DRR_data;
' E4 L6 [8 W& J7 I) n6 a+ r$ Yunsigned int DXR_data;& i, V6 G! Q6 G) |; Y
static int mcbsp_open(struct inode *inode,struct file *file)
' v2 Q; h/ _/ s1 e5 W1 w6 a{* U8 ?3 ]* s% C
   , g- U- @: m$ p$ |: V6 ~2 J
   //interrupt enable,initialized5 R$ s! H; t8 k7 E% J" G9 K
   unsigned int temp;
1 s6 [( N) P& I" y2 e3 C   //SLEEP_EN(GPIO8[10])---06 Q( v" L/ z7 v& ^/ O2 B
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 y, S! |9 x! K+ `   temp=temp&(~0x00000400);
9 P# A; Z$ b! S6 q$ Y! t1 Z3 q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]# h5 B2 ^3 L  H) [/ z1 Q3 Z
  //RESETn(GPIO8[8])----0----12 @4 ~9 d- Z/ i' M$ v8 j! h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ p' @6 p; h3 ^
   temp=temp&(~0x00000100);
5 F4 t, K5 A9 W   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; H$ n8 `5 u7 g% u1 u
   udelay(100);
, c$ w4 ?9 n4 i+ z   temp=temp| 0x00000100;
) H+ v% A% k& r   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; ~  [- \* ]0 d% Y& n
   udelay(100);1 r* C0 f/ p- l- d, X
   printk("open success!\n");
6 w0 @; i- m% i3 o# p- E# T   return 0;
- }* R) m+ K: ], Y}& I# {6 E4 T5 b" a/ V: w- s- F( Z' ~

2 ^' U$ Y9 C5 \4 c/ l3 g3 G- t2 Jstatic int mcbsp_release(struct inode *inode,struct file *file)& g- T3 ~7 _, F1 f
{8 O6 h- P5 ^9 |" U! Z" `
   printk("release success!\n");0 o/ g  Y( j" }7 J1 c/ ]
   return 0;
4 ]. ?9 t, y: L( u! B}. S' K0 X$ @( o0 _% H

, w/ F" Z. i+ K% istatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% L: C) y$ v8 S8 ^{
0 [% M' A. u3 v+ B( Q  @) b    copy_from_user(&DXR_data,buf,len);
$ r4 Y( ~! Y0 Z" q    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 K2 |) n6 j0 a  M9 \    return 0;# v/ P) {3 H9 E0 X* o3 f; k) x9 O# r

( l* n$ N$ _, S7 q9 m, _}) `( Q+ K9 w2 R: W$ t# P

/ x: f$ ]7 _# r/ U* l! hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)+ G6 |% y: C, r) p5 v; O6 R
{ * r4 d( H1 X- j
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
  N4 L) Y1 y1 `- \8 J, C   copy_to_user(buf,&DRR_data,len);
5 |# [9 F  S4 B6 y   return 0;4 i: r' \8 [! j/ A9 g4 ?$ B
}
9 W! G4 u# R  ^5 G) V4 t4 Y) B$ k+ T4 D, v/ p* k; ?
! G1 {6 }; `8 z
static struct  file_operations mcbsp_fops=5 A" F% C+ n) \8 k) m
{
2 |. r0 @! i4 ]9 `   .owner=THIS_MODULE,! A+ ?4 p7 O3 _, ~% w
   .open=mcbsp_open,
4 r% c# ~4 r$ z9 O8 c   .release=mcbsp_release,
. t0 {4 m1 \" R3 V7 I7 M   .write=mcbsp_write,0 ~' V6 Z( @' s
   .read=mcbsp_read,
( L' J0 i' l% b  S! R: \, G};8 `/ F# p9 h+ u% Y/ C3 I. w
static int __init MCBSP_init(void)0 |& D& @+ F/ z9 p* f& H* S* w
{- E# {3 _# |* N
   int ret;! }3 @" j: Y8 P& p6 F
   unsigned  int   PINMUX1_REG_old;( U; o4 m/ B) b9 O) @+ G: |) T
   unsigned  int   PINMUX18_REG_old;7 O8 n! a- o* P. l
   unsigned  int   PINMUX19_REG_old;
5 @) w1 f, q& I2 J) d+ O   unsigned  int   temp;  
' z3 m! f) A( Q# @5 A' G   if(MCBSP_MAJOR)
- C7 a  z- [; W; H2 e. j. T' s% X   {" e) n2 W; N8 S: x
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
  j* o. _6 a% J0 F9 c8 m$ Y% `      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 B1 ?% i6 [, l5 [   }
, r. x& i1 r8 Q* V- }4 T   else
4 A; F6 x" S% C- o   {' z& f& ^" _: n! s* q% M0 }' E
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. l. X/ i# o* s6 m      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 L4 c2 o5 C* ?& O
   }5 g6 X5 C* c! f3 p& C$ |
   
4 ~5 X0 T- C* L, [6 m, k   if(ret<0), y8 ]( I, Y6 F  v7 t; I, d: ~
   {
4 A7 b# o/ b  }: }+ Z2 ?2 k      printk(KERN_ERR "register chrdev fail!");$ J1 l1 I. c; K( ?) R0 T
      return -1;
6 q- I& \% u$ R% E" P' y' s   }8 _7 ^) T; I; O7 k1 |' G# a5 c
   
* P! A9 o: A/ ~6 h1 I+ ^   mcbsp_cdev=cdev_alloc();
/ B% _7 X% ]1 l% Q; i   
6 N4 D3 f; i& K9 d+ o& ]   if(mcbsp_cdev!=NULL)
. D  _/ b( `5 l, y7 x   {
  x, N& Z/ R2 p! Y1 W* m1 L      cdev_init(mcbsp_cdev,&mcbsp_fops);$ h* X- o' P( s+ ^2 ]8 x. [  E7 p
      mcbsp_cdev->ops=&mcbsp_fops;
6 O" T0 P9 P. o+ r  ^4 m      mcbsp_cdev->owner=THIS_MODULE;( ?! E: d' R/ M! n
      ; a7 i; B- a- |8 I& U
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
1 ~+ t( C9 J' D% R          printk(KERN_ERR "register cdev fail!");
: d% n6 N, E# Y8 A3 X# ~: W( _8 _6 Y      else
2 O- b( c# T3 S6 g- O          printk(KERN_ERR "register success!\n");1 H, B9 E2 |4 V
   }/ v# g8 ^5 I8 A  T$ x+ D  s
   else
9 [5 N( Y5 O  C, h* L0 Q, P   {3 |6 V8 i# y5 k
      printk(KERN_ERR "register cdev err!");
' ^" `" B* ~0 _/ D      return -1;; P! h- Y! ^2 O, X. \6 ^$ a1 [1 z8 l" a
   }
5 ]( ?4 @) P& N1 Z' W$ v8 B4 Q   ) S2 J8 B7 T/ d" _- p) C
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 N7 Z! Y7 s( u8 O5 I# k   if(IS_ERR(mcbsp_class))
6 y% V3 a) s2 l' L   {2 q  d& s, |1 @! I
      printk(KERN_ERR "register class err!");* x7 j- D) H6 }+ k7 m# u6 c9 ^& y6 m
   return -1;
% r( J  G" g# j  k% S   }; S3 q3 A7 K  ~) T! x
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' p6 b# V; w, |  A* ]; E& g5 ~5 `; z) {# N5 |9 m4 s6 D* k
   //PSC+ j* U& Z7 ~! ~; T9 W, i
   //add Enable MCBSP" ]) Y  c; M* q  l% k- |6 F
   //test
/ {# a+ N; E6 ~   temp = 0x80000003;
7 }. W  G. a1 g, T  P   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# P7 t( m- t& d, f: k   temp = 0x00000003;" L' X5 F2 v2 a# O/ M. k1 H
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# ]# t+ s% U2 Y% E9 g
" k" A6 Y/ ]: I) l2 f   temp = 0x001FF201;
  @% z# q) [5 D3 b% f- U   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 t8 [  _' s' l- \- ~5 L
   + e  R) n2 U9 o% g9 j! _! C
   //PINMUX  
5 W+ m2 O% h4 ?$ W   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 T. y" M+ |7 N8 @7 p' q" k# k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ! V' g+ t2 q6 }0 u4 f& ^7 ]/ W) S
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : ^8 [: E  P3 N- s; [/ c
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ |! q4 P) _( I: |) e! b+ \   7 t4 w; L' z$ F. n5 D3 o, J. O4 ]
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ N* ]4 H7 ?. n7 a, z   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  , H5 _4 z+ w" y7 T& w+ f, |' t) @4 l
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" V  I+ \' U! n9 \+ l   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. N% Z! c& q7 q" _3 f  ~  t
4 l9 i% `: `7 r. z4 b8 a. z   //RESETn,L138_SHK2* ?: x2 S1 i1 I9 r
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! E  |% E* g' p' \# ^   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   : n4 x- u. U0 X( E5 }* Y- ?- Q+ _. @; m
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- I: y8 q/ [4 h0 B+ E- [$ `) I
# f4 a' z9 d4 L) `9 |5 s, s9 m
2 W! f+ R1 a7 a+ `' ]5 K6 L5 I9 D  //SPCR Register
' r' }3 ?: c. S) y/ i  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. s  K& {: q3 ^7 Q* d
  temp = 0x03000000;//(DLB=0)8 J9 J) G2 \/ D6 P' _2 F
// temp = 0x03008000;//(DLB=1)( T7 _$ y% T1 W. K9 m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* |7 X9 r$ }5 _$ f- s
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, B+ i. o' r" C( d& V( ~+ G  printk("temp=%x\n",temp);- f+ Z3 v: ?3 L* W( _2 j
3 S3 C/ R4 Y/ j; C" t$ H
   //PCR Register
0 C* g) g+ x+ ]! x* B( |   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 d+ ]- t! W- J& W2 S  // temp = 0x00000F0F;
# W, f5 [4 e' a; v9 v; i  temp = 0x00000B0F;5 {: @& G0 m5 H9 ^6 o& f1 F* r" }0 x; {0 i
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' E8 ]- l9 q# ?' }  temp = readl(IO_ADDRESS(PCR_ADDR));
/ \. _) P0 y( L6 I6 d5 p* x; Y  printk("temp=%x\n",temp);  
% n$ u7 k0 j- M. Q" w2 p9 [+ i   //SRGR Register- i/ d  P, i' ?3 d7 u( [( w
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ x. t) ]5 \: i4 X: h5 t- H
//temp = 0x301F000B;
& j! U; Q" w! J; |0 \& W8 ~. g   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
; P# J- H9 S; \2 F8 ~  temp = readl(IO_ADDRESS(SRGR_ADDR));
# F1 F8 _* g2 _! u9 F* z  printk("temp=%x\n",temp);
4 D/ }1 z: w& v) `   //RCR& l  v" @, d7 n* \; U! `
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
. L0 f2 q8 j# `/ s5 V2 h! M% F+ p   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0( f3 f3 w+ O; l/ s7 \3 y8 v+ @
   temp = 0x00440040;+ k, ]9 T+ {: ^+ f9 w; w5 g* a
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   " e# Y0 m! G% j8 O- t
   temp = readl(IO_ADDRESS(RCR_ADDR));/ D$ F2 O1 A$ ]3 T" i0 w! p
   printk("temp=%x\n",temp);
4 E  @/ O5 {; c/ W' N, x; ?   //XCR
+ w, \: Y, g5 [; F( ]; ?& k' f   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  H( w$ m5 I' s/ F# x+ f8 u   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" X$ Q' B6 X0 U; ^
   temp = 0x00440040;( w9 E% g6 X3 S2 P& t1 T
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
  f" u0 }, b& e9 s   temp = readl(IO_ADDRESS(XCR_ADDR));* n' L; V! E0 d- l
   printk("temp=%x\n",temp);
* ~2 `! I3 L+ S- m% S& p3 s5 }  udelay(100);+ g  ]! }2 S5 ^5 y
  //SPCR Register$ b% Q  @) Y5 |& u- i" d
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1" F& g. {$ J. q3 u
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
3 H" ^7 b# l2 s5 ~" q  ^, l) i  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: u2 z7 V6 c1 |1 I  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ j0 W+ @, `" z& N! G6 W  b$ @  printk("temp=%x\n",temp);
7 n1 ~* r8 O! I6 z9 a% D( y  udelay(100);, H2 v* \8 W8 F/ J& T+ B- L# `  B% r& `

& g; p5 U' ^% W. ~  //set GPIO direction6 n# V( j0 M7 B7 H, g2 B' |
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));  B& s: }: i. \( X" J6 Y1 M2 B& B
   temp = temp | 0x00000100;//EPR----input/ j8 H6 {( O; P6 l8 h
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ U. a, W. L/ [3 p* l" Z; V   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 Q6 @# v" d& I$ j( R2 D ; Q& a( @3 b9 D, N
   return 0;  V5 m9 c  @+ d$ I, U& B
}6 ?3 w% Y; M/ j& l$ G, {3 V
static void __exit MCBSP_exit(void)
2 t  k, J4 @+ O- `  d{) m; ?3 |# _1 ]  J
   printk("mcbsp chrdev exit!\n");
- x, v7 U) D8 g4 w4 A6 |: N# `% q& z0 }   cdev_del(mcbsp_cdev);6 {% J, A* |7 a* \, L* j
   unregister_chrdev_region(mcbsp_dev,count);$ H3 }5 C. E, s6 ~, G
   device_destroy(mcbsp_class,mcbsp_dev);- y$ r1 m' H5 Y9 Z6 K$ f
   class_destroy(mcbsp_class);
( D3 f' k( K0 o: M7 o}
* L( F, t. |# l, smodule_init(MCBSP_init);
/ X, {1 ~  r4 S( ^module_exit(MCBSP_exit);& o0 E* _' W" D9 e
8 {: l* s9 T/ c
MODULE_LICENSE("GPL");
, m: F; J$ I: I7 A7 f7 n  U! V4 B+ G- k. Z6 a7 M
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ ?/ j' u3 O. y9 V2 x) U; ?
我的应用层的测试程序如下
, T, v, N" B! z#include <stdio.h>: U. [  A8 Z3 S: i* G, Q% _  ]
#include <string.h>
3 j9 O+ g  m6 v0 _$ ]9 E#include <fcntl.h>' c& i# a5 ?3 N6 k8 |
#include <unistd.h>
3 m" K( o. R8 M" u+ A9 `( a& b#include <signal.h>
; x2 R7 a8 _( L) x8 N#include <pthread.h>       //线程% P8 W9 E! D" l* p6 L; b
#include <stdlib.h>* `( ?  m  T3 [% ~+ h3 Y: f/ }
#include <pcap.h>          //捕获网口数据
3 j. D0 O) U) h1 o4 P. h#include <semaphore.h>     //信号! K4 m$ z) p' E7 U& a
#include <sys/types.h>     //消息对列
# k8 m# F' ?) n9 r4 a( `& l#include <sys/ipc.h>       //消息队列* N  Y8 b& m( m. z! W" N
#include <sys/msg.h>       //消息队列
& h# ^  @/ x; e% V& h0 q, {#include <sys/select.h>
/ S- Z# N8 g7 M$ l* l: m( U4 f#include <sys/syscall.h>
! |, |" s. K9 l$ h- _#include <sys/stat.h>
, w# Y& ~* l( a3 m' A# i6 v3 N& U' u#include <sys/mman.h>
5 U5 V9 K- T" N6 d1 E4 t#define msleep(x) usleep(1000*x)
6 ]# T9 _- Z: f) w" {3 Z+ q8 B) D; _) r
int main()1 T6 P1 n+ _' u# C5 \) E
{ / g4 O4 _* Q" \2 b$ z
    //MCBSP,ARM与AMBE2000交互设备
3 H8 T0 ?" ?* O, x int fd;
; d" h* k& p5 }) _% Q unsigned short data_write = 0x5555;
8 ~4 M  l5 L5 {% i unsigned short data_read = 0x00;
' b  i) L3 i8 ?% F0 f+ x  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 l, b' N6 P# z) X
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# y* {6 `) ]2 ^( C$ C3 g    # e: Y$ U& V; ]9 l& H+ L
  if(fd < 0)
1 |9 |% ~- `! o  l7 l1 g1 l" I  {9 D6 F7 N0 \& F( X
     perror("open failed\n");# I6 `0 r& C& ~, J9 P
     return -1;
  u2 C* g6 J' M  }. V0 y, X- ]: Q, c
  5 u! g/ w. d8 h* b1 [3 E
  while(1); u" z) }* H4 c1 s# r
  {5 s' u+ c8 r+ b) ?+ o5 ^- Z
   + e( b; r* r" e7 E1 M" \( w
   //AMBE2000每次读写是24个字为一帧; U7 y) k9 n+ h5 G# s1 C& F- d
   //写数据时将数据在底层存储起来,等到中断的时候再发送+ v+ o+ D) U* P- e, a
   //AMBE2000输入数据是以0x13EC开头的
- o  m& |4 T! i; D9 d: B# W   write(fd,&data_write,sizeof(unsigned short));3 u" r1 d: M5 k5 q* B
   
. z% u& _. C. U- _9 [) z5 }   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- p& r8 U- N3 i: _: U   read(fd,&data_read,sizeof(unsigned short));
% f2 ?; `; c" T& D! n- ~   
7 E8 r4 C1 S+ U: R  i! z" K   if(data_read == 0x13Ec)
2 z0 m3 s% X6 T   {& r2 x8 @# {" s) C
   
0 k& N- f  I: x1 ?0 t9 `8 F    printf("data_read = %x\n",data_read);  K) s$ z" q( Z
   }/ x) }3 T' r) f3 Z& R9 E/ U
   1 C9 A; r! P5 h2 m7 L, O" d+ {8 m
   msleep(10);( h3 N( h2 y: v; @0 F6 G2 X
  
% h( r2 E% A8 Z+ }& g+ U; l2 {  /*
! r6 d  x$ B5 Q/ P4 k8 W   ioctl(fd,1);   
0 s# U# ?$ u8 c) R9 J) r2 G; R. @ sleep(1);
9 a/ Q8 L. \. P9 U' _ ioctl(fd,0);9 `. }7 N3 u- v+ y/ [6 I
sleep(1);
; H: x( p( i, P */ 5 o$ j# O5 Y; G9 L7 z
  }   ( v$ u! Z+ Q+ V3 W( t8 f0 I5 u
return 0;
/ L  b0 U5 H1 [/ a8 [6 G 2 k3 A: p! W. C
}) o% I" F# V6 g5 S3 m

; A* u; t, z) Q4 K- @多谢各位指教,谢谢! 急4 M+ c6 n7 D" y
7 n0 g" R, ?) S; q
0 l6 T  d3 {* @$ c( j* |) @9 C  }3 W

6 @5 Y4 k# A1 T1 |/ o; }  x3 O: X
7 M  P( _6 @0 _, s! T4 z8 `
8 ^! ]6 \+ w4 c6 p; U+ [+ w) S) o; T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 09:06 , Processed in 0.048570 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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