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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 a9 r# e$ f8 x0 L* n
/*
: S2 C1 J0 D/ g  p1 | * Copyright (C) 2009 Texas Instruments Inc
, V! m6 l! t/ R& Y+ h! z. Z4 d *1 T8 b0 [( {7 l
* This program is free software; you can redistribute it and/or modify' r& Q8 O7 H; e2 `# V  F
* it under the terms of the GNU General Public License as published by, u. `0 e. Y7 O' K8 _( Y
* the Free Software Foundation; either version 2 of the License, or
8 ]8 A$ g- |. y% d# k/ R9 V * (at your option)any later version.# z( O3 F6 I1 Z5 e
*# U4 a. f2 X/ `% Q# G, l
* This program is distributed in the hope that it will be useful,7 T( }: G0 ]4 C' P& d$ g* M
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 p- x6 U$ a" |7 W4 Q  Z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* b8 c; a& o. ]* o$ G * GNU General Public License for more details.1 T1 ^8 V/ M) b, B$ u  Q" o
*; E# r$ J) w4 a4 l/ Z0 o5 C8 ]
* You should have received a copy of the GNU General Public License5 C. _$ p8 y2 {  a6 y
* along with this program; if not, write to the Free Software
6 a$ b: d+ e6 A* V * Foundati
; K, M% m* G* x*/
: c" _# ~. u! u; N4 f#include <linux/module.h>
4 `: e/ D- {2 K4 @: P- T! i% J#include <linux/init.h>  G9 p. B& x; m: H
#include <linux/errno.h>
8 E7 t8 Q7 o3 o, c4 u* W8 v#include <linux/types.h>3 v% W4 C. }# ]4 c0 Z
#include <linux/interrupt.h>
* \+ `9 J! m, P% G#include <linux/io.h>
5 E. p. L. Q: |4 ?6 u' ~#include <linux/sysctl.h>1 u  }0 e  |4 _  R4 O% @( q
#include <linux/mm.h>
: ?" ^- B& c0 ^3 G4 k#include <linux/delay.h>% u3 a, c6 C5 j2 u+ I
#include<linux/kernel.h>! n$ H6 f" I- a1 x
#include<linux/fs.h>
* g2 j) J9 Z  ~#include<linux/ioctl.h>4 @' H. X! F/ C+ S
#include<linux/cdev.h>9 {* z3 }; c7 z: b
#include<linux/kdev_t.h>! }- G6 ~3 e! ]$ z0 i' Z
#include<linux/gpio.h>
5 P; i3 ]$ y$ L1 G/ i#include <mach/hardware.h>
9 T; f) J; z5 u2 _4 Y. l#include <mach/irqs.h>
( ?( n6 m: {3 w1 l+ i+ e& }
9 ?9 P+ M9 E  _" t. n7 q#include <asm/mach-types.h>. K8 @9 S6 z- b& S8 x: N, L" p
#include <asm/mach/arch.h>
% k/ e8 G# v* v6 \8 w% @#include <mach/da8xx.h>7 G7 p0 O3 a7 f4 D. }0 p8 r
#define  SYSCFG_BASE   0x01c14000
& }9 O- [( k: b5 z: G. a#define  PINMUX1_OFFSET   0x124 ) S7 P6 C& H$ n2 p7 y3 j
#define  PINMUX18_OFFSET  0x168 ; k* x$ Y* R+ A9 h0 i/ ]  |3 G
#define  PINMUX19_OFFSET  0x16c2 G5 E7 y8 H  h
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" ^: y6 {  z" b% t' W( i& c
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 O  M. y& T. K& H/ l. [#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR1 j/ j4 G( l9 O0 x5 d% V$ {+ a
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR, ?7 D2 [% z! H1 V; L& }
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, ?" H9 N0 F  y2 Z9 ?9 S: m, W  m                           
" X; q6 p8 Q' c, Z3 p1 \5 z#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
$ v2 e+ A3 r( q+ [; c#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
5 q0 e/ k: T1 v1 N' q- w7 M$ a//PSC* F  ~+ W% {% |3 U9 f5 e. ^3 r
#define  PTCMD_ADDR   0x01E27120  3 R+ `& l: f8 `
#define  MDCTL15_ADDR 0x01E27A3C
9 E7 h9 W$ c9 \5 b, B2 G  b: ]#define  PDCTL1_ADDR  0x01E27304
) {  S3 B6 D" e, w3 _3 {//GPIO8 direction
- @& R% L! z4 x$ E' i. O* J#define GPIO8_DIRECT  0x01E260B0
( _7 ~% H) w' [* n#define GPIO8_OUT     0x01E260B4  b. J# c) C2 e! O
#define GPIO8_IN     0x01E260C0  H4 R, z/ l5 h" N' d

# I- ~. Y0 A0 l$ H- y) C//#define MCBSP1_RINT    99              
, F. O2 h2 s( Q' Y3 X, a7 d: l8 w//#define MCBSP1_XINT    100  " ~9 N$ K2 y5 J$ s* o+ |
static int MCBSP_MAJOR=239;
4 b/ a% ]: e- {  I6 ~static int MCBSP_MINOR=0;
2 V, E" r( l8 G) v$ N) k0 Fstatic int count =1;
9 h* D  v: q5 f0 [2 P; D  t# W" l6 J5 F
#define MCBSP_NAME  "MCBSP-device"! V4 Z  `" d: ?& ^3 ?

) [' b+ E0 ]1 P% rstatic struct cdev *mcbsp_cdev;+ c* R: V  `2 P0 v- h4 N. x& X
static struct class *mcbsp_class;/ b/ z. @8 `2 l8 C0 u
static dev_t mcbsp_dev;
1 v# i! l# Z6 Sunsigned int DRR_data;. N: ?2 n. v# H
unsigned int DXR_data;
3 z& [  H; f- tstatic int mcbsp_open(struct inode *inode,struct file *file): Q$ f  A; q3 O" D. [5 G6 i( i* @
{" B# c; b4 p& T
   * W# I+ M/ S8 e$ S7 h2 r1 S
   //interrupt enable,initialized+ u% X( X. G$ A: K4 H$ n: h
   unsigned int temp;
& {: J4 R# ~* f# u' l, u   //SLEEP_EN(GPIO8[10])---0' W# k5 P! x7 Y# S/ ?
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: I1 v" Z9 b; K( @7 R   temp=temp&(~0x00000400);4 D0 m) P7 x9 g; v* j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  ^! `# X1 m9 A- X/ E8 `( u+ l  //RESETn(GPIO8[8])----0----1/ _8 m6 D: Z) H# s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& _0 w8 o: m( Z$ |! X- h5 y   temp=temp&(~0x00000100);
$ g8 s! l5 z' Q& f( s7 q5 a   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ A& _+ M9 O6 I( k# G   udelay(100);
+ l* n7 X/ I. X$ S   temp=temp| 0x00000100;' r8 u+ }3 ?8 j+ S  U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ Z' `( D% g7 b& P* ]+ n   udelay(100);: [  ?( G7 y2 l3 R" V
   printk("open success!\n");
4 L1 z, E  H% S% a   return 0;8 F: P# i9 A5 u1 `! z! V& e
}
0 z# S( d2 A* L* D! t
$ r' q  s5 M: A2 E; K( n, y/ Wstatic int mcbsp_release(struct inode *inode,struct file *file)
# {4 n& r3 D/ K; O0 @5 O  K{7 i( o, w! B6 M4 m. ~5 y+ g
   printk("release success!\n");  }9 T' d( k/ @: p* n% m/ y
   return 0;- _. z3 C1 W7 G0 T
}( A& F7 l# B6 U; @
! F7 t4 N. {( B# s
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); q; D2 e8 ?# G. X' _9 K
{
8 A- y% z) W* X- |5 F% N$ y6 e- c    copy_from_user(&DXR_data,buf,len);/ O+ ]2 H/ O9 b' e
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
4 ~1 ~# \) N/ K, o2 n1 E0 Z    return 0;4 p/ t. I# ^5 h4 @/ a

# G1 L# I1 ]2 j! X( R3 B1 ]) m}
* j  r1 @2 w1 `& c( X9 d- |
9 ]# ~3 Q/ n4 B/ A9 p' w# rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ ^* X1 T1 V; d2 u' \* E{ 8 a+ S% L" w% Z& F9 y0 Y
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ W) m, y7 J" a! h8 Q   copy_to_user(buf,&DRR_data,len);
9 G$ S6 ]4 a: B% W; s- y% c/ m, u) d   return 0;/ R" V$ r7 f4 y& T1 O2 G4 T6 q$ W# x4 m
}# U+ w5 F- \* l9 z/ L; a  c
! v5 R# c3 ]6 H. a! o

; \3 n1 w/ y" ^static struct  file_operations mcbsp_fops=% z/ D# O& \# N# e
{
2 C5 l# Z% n+ J- _   .owner=THIS_MODULE,4 M3 r$ M6 K8 ?/ D0 r
   .open=mcbsp_open,
: A# z5 E, `; k6 F+ Z   .release=mcbsp_release,
: B: V0 ?- P2 z8 m$ |5 W* l   .write=mcbsp_write,
+ ]6 l/ D: ^: {- h5 f) f6 V/ X* a   .read=mcbsp_read,0 P0 f$ c9 k  a0 W* k
};; ]9 L7 m; i4 @: O* X+ O3 h
static int __init MCBSP_init(void)' }( ]- c# I3 Y# {0 H: o
{
( x( ]2 q4 ^$ O6 e5 r2 s) M3 x   int ret;$ S$ o/ ^( C+ `' i, }* V$ b
   unsigned  int   PINMUX1_REG_old;0 K8 I( x# j6 T+ V6 o
   unsigned  int   PINMUX18_REG_old;
% t# |! S2 a( O' Z   unsigned  int   PINMUX19_REG_old;
3 n- C& H4 z) K   unsigned  int   temp;  
' w+ X9 ~! C+ T% ~   if(MCBSP_MAJOR)
9 d5 L! y1 ]5 d4 l6 v% D   {
5 o2 |/ K( G( Q+ d1 {. f      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ K( g; ^# {+ @( M; ?
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: D+ G7 K" m: D4 X" B
   }
$ d: Y# J3 \% J7 a! K   else
; D5 x# z# v" d( L) h6 m3 f2 b   {4 D! h+ e. Y' l6 l, a$ O5 X0 P, L0 F/ C
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& J2 D+ W- A& V; y7 F
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
% v3 D6 c1 _5 y0 V) v* [# a   }# i( R+ V: m# y
   ' I- @2 R2 g& i+ ~
   if(ret<0)
  b3 t/ v. `9 Y6 K" i% s   {2 _" g9 i4 B, w! R3 F
      printk(KERN_ERR "register chrdev fail!");
8 ^1 p5 f) ~+ s  q# t. G1 e! n, f      return -1;# @1 V$ W6 w& }% t" x- u/ O. a
   }$ z1 m6 y( g1 R' B9 i' P
   
7 o% R) r! h4 z; w# G$ E+ y% S! r8 p   mcbsp_cdev=cdev_alloc();3 k+ s4 h5 S; [& I0 H
   
* Z! ]7 R; n2 W; V   if(mcbsp_cdev!=NULL)4 I: V3 d! Q, [; |( l# r4 z
   {
0 b# _% E$ ~6 J! I' f      cdev_init(mcbsp_cdev,&mcbsp_fops);
6 \: o" K% O: Y8 N      mcbsp_cdev->ops=&mcbsp_fops;) S2 A9 O! F3 W( ~9 h8 d: d8 h: ^5 v
      mcbsp_cdev->owner=THIS_MODULE;3 l" H! {) S. h2 z+ {; \# E' o- ^
      
8 j3 b5 o! E; C1 u) }      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% P$ q3 B# ]  i& S" j2 W  B5 |
          printk(KERN_ERR "register cdev fail!");/ w* {  Y, Q5 e. n
      else7 P/ {$ y- t# d' H9 i+ C; P  K* Z
          printk(KERN_ERR "register success!\n");+ ], S* f; Q- D! D0 N3 _
   }
5 i/ ~% l  d3 [1 _6 n( \- K6 Q" S3 m# x8 b   else0 K5 \  b  A% ]6 O5 f- W( |; X
   {
6 h- @* N' \9 s2 @      printk(KERN_ERR "register cdev err!");" G3 F1 O! U* V( B6 ], I- o
      return -1;
7 t" O9 n" B) {' j7 n+ P  P- H* Y   }
3 `7 b; Z3 H0 Y8 s0 a8 G   $ m4 M3 ^- F! y6 {+ A0 C; m
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 Z6 p' u5 {4 w* u) {' H   if(IS_ERR(mcbsp_class))
6 A& c8 y+ r! W5 S/ i   {
- V% M  t0 [2 \' ]$ _3 H0 X7 U* m5 o      printk(KERN_ERR "register class err!");$ @% ?( R% T1 C( U+ d
   return -1;* _* [9 c. W7 U6 {% C3 M: o
   }. d. x1 B! M, W8 N
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 f. m+ X6 v- C) |

( s2 Y, g4 G  L$ D7 m   //PSC* W8 d" ^/ A* e
   //add Enable MCBSP6 L% a, x# x+ x! j6 j
   //test* Y+ M+ A6 Z9 S- w9 Q. g' {0 [; L
   temp = 0x80000003;  U1 ^8 N2 Z0 S, Z3 H+ m! r8 A
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));. d: g; Z' I* w% [8 o' @
   temp = 0x00000003;. X; t$ d9 p3 c) a
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 [; l9 a& V: b/ U7 a ; C7 y- L6 v  T% z8 t
   temp = 0x001FF201;
, V2 V; p+ c5 G2 W3 c   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 ~6 h( V0 Z1 O- Y' z0 }   1 ~, `4 K* x9 B: N+ c5 G
   //PINMUX  
  f5 z% s, V! ~4 A% J   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,% x0 v7 y! v4 {% ^0 U
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * b/ k4 z2 E6 `. N. x) x6 d
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
5 i" i! Q# [/ E0 P   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 N2 u/ W9 `3 O6 M  {   
1 ?& k) H) t' @   //SLEEP_EN,EPR,L138_SHK1,L138_RC, t" e* G. |! N0 R0 c
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  6 P! D7 U4 H4 }* y$ x7 e, s: u, j" D
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" F, X3 ^2 V6 K- H9 i* F- Z   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);- N6 p( h  |$ }# n) N

) ^$ {4 Q3 l, P3 I. {3 T   //RESETn,L138_SHK2
! T, o+ a, r. A9 ^, \9 k   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
% z; z6 r( N2 M' c; ^+ V   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! C% M4 ]! ~0 u0 ~! q% s   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
  e0 w- T5 ^- C1 {; x" W" T
& }6 ]* P- @% {
$ V$ v& b+ T  k+ j1 B  //SPCR Register- D$ t! C' h1 g1 n' y
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ A5 I2 \7 \& V# z- j4 {  j2 m
  temp = 0x03000000;//(DLB=0)
/ Z# Q# x2 ^" @& @ // temp = 0x03008000;//(DLB=1), |* D0 o. X6 d2 k$ m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; P1 S9 K4 M" Y$ y8 ~6 J! G  temp = readl(IO_ADDRESS(SPCR_ADDR));9 u/ x- I  h- S" U$ \' h- V# ?
  printk("temp=%x\n",temp);
7 x* J+ X' b6 E; w( r; J' v
7 r) {9 A" P* g0 P2 G9 [9 W   //PCR Register; U9 `( v5 J0 l# D3 P6 d
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 T6 A3 d6 P6 {2 G. L
  // temp = 0x00000F0F;
6 p: p& q6 k1 x5 r4 @  temp = 0x00000B0F;
6 R" n& {/ n) ^. }) V  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized , B7 p! [9 O' h7 d
  temp = readl(IO_ADDRESS(PCR_ADDR));0 B# U# s( w/ d9 {# B/ ]
  printk("temp=%x\n",temp);  
0 F6 t7 S8 a' {; w5 X* }' M) Z& Z" r, x   //SRGR Register1 @1 ~# x) n& p# o4 `
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11  {" [% }2 {- g. g4 J$ m) r
//temp = 0x301F000B;
2 g2 H1 e( U( t" Z   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
/ v6 b! H/ V9 f  temp = readl(IO_ADDRESS(SRGR_ADDR));& x( v( k" O9 |0 {9 e- j2 r" r; s
  printk("temp=%x\n",temp);
# D: g2 Y- T8 `5 z   //RCR5 q5 l5 S/ Y* N. K1 D/ k2 }% w' z
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 j9 s2 [8 e: N+ z" L8 I   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 ]$ }+ c) o/ v, `$ F% y/ ]   temp = 0x00440040;( j# h  i# h0 M5 A$ C) _( x5 q+ s; E% P1 R
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
% V! M' b% ~  K: ~1 v- |+ \/ f   temp = readl(IO_ADDRESS(RCR_ADDR));
; X2 ]" A' C0 r& ?, `- w   printk("temp=%x\n",temp);+ s8 X/ ^' @8 V; @$ g; m
   //XCR; q) B6 e# X' E8 V6 B, P3 ]& ^
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) [8 K- G# j8 [" t
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 f+ p  x& R. r# H* o, ~   temp = 0x00440040;
! T$ v4 n1 }' y( A5 {$ J   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# G0 [2 @; \) P+ U6 p# z   temp = readl(IO_ADDRESS(XCR_ADDR));& ?) Y: d% N; X6 {8 _( B
   printk("temp=%x\n",temp);. t& J* c  x6 a5 g1 O: [5 I0 r4 l
  udelay(100);
* N+ k: P; c$ X( \3 z8 f3 |2 F8 u. \  //SPCR Register# H) e4 Y) n) [/ _
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-12 D6 N4 o4 N2 k! E, U& Y
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
) k* c& a3 V* c% ~( `  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ l7 q! _% |* ?
  temp = readl(IO_ADDRESS(SPCR_ADDR));
' c' T- H2 ~2 r9 H" x) M  printk("temp=%x\n",temp);  j& i' J8 C7 }8 w' C3 k
  udelay(100);( K6 C/ Q8 v* |5 N- c9 E2 O! R
1 g$ B+ Z, \2 [
  //set GPIO direction8 G3 H0 i3 t+ V' O4 R9 W9 J, C- |+ {2 ~
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 i: l9 \7 }4 o! p7 C' M
   temp = temp | 0x00000100;//EPR----input# P8 c3 C/ q5 @3 O6 H
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
  t$ u$ F" O5 O, M% A' `8 S- g   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ a& z. K4 ]3 \& t. c" C: k7 w% E
3 \3 Y9 r- ^6 O3 j! i& v4 M
   return 0;
% d& m$ j# n; p8 h- I}
( I2 |  D1 d4 J: S! u( @# Vstatic void __exit MCBSP_exit(void)$ W8 g! m. a- ~  T5 I* v. ?3 m
{1 r3 {4 ]' y: Y4 W/ t
   printk("mcbsp chrdev exit!\n");
& v; _1 @8 B, l. P   cdev_del(mcbsp_cdev);8 a+ T4 t* U) F+ d8 t) |
   unregister_chrdev_region(mcbsp_dev,count);
0 G# Y6 B& ?5 @8 i8 n  y2 e3 u3 ?   device_destroy(mcbsp_class,mcbsp_dev);
$ {( g2 d& r  Y   class_destroy(mcbsp_class);( f* h# p  U2 k0 P7 O
}
! D$ x) g9 C* \- Qmodule_init(MCBSP_init);+ k5 C$ g2 m% E  l# f
module_exit(MCBSP_exit);
9 I* x1 J4 U8 [! l+ ^3 ?0 G8 ^4 A8 ~6 I; N; m& D1 ?) y% E
MODULE_LICENSE("GPL");
) x5 ^3 j3 T* `
# o. s' y* x5 c% K/ F我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ a7 ?% D, l; \1 h我的应用层的测试程序如下
1 ]8 z; c' Q3 p% E5 n, E, @#include <stdio.h>
  U' {9 ^" b& U#include <string.h>
8 I$ f0 ]) K- y$ {5 Y8 c#include <fcntl.h>
. n4 E3 v" |0 U, U3 E! S#include <unistd.h>
/ L# ~" i' }! k5 ^0 _5 f7 w4 c5 W) d0 k#include <signal.h>
2 ^$ p0 Y& G% x$ s! ^* r#include <pthread.h>       //线程, }* ^, M$ o$ x+ c
#include <stdlib.h>
! V( [3 P# l$ b. h! `& q+ B#include <pcap.h>          //捕获网口数据6 T2 g: ~% ~" g6 C, j
#include <semaphore.h>     //信号1 R4 s+ y: r! g9 X; x  n: g" s
#include <sys/types.h>     //消息对列, K4 n; c8 v% ], k. r9 n
#include <sys/ipc.h>       //消息队列
- a9 a* j7 ^1 D0 A8 P9 X) d#include <sys/msg.h>       //消息队列- U; z2 [6 b3 H3 F- {9 c
#include <sys/select.h>
8 y* x8 d. l# f; d#include <sys/syscall.h>
( {* ~( g1 i; n. p#include <sys/stat.h>
1 q9 V. d* ^& s# T9 P+ X3 n#include <sys/mman.h>/ R4 }- z7 g/ W* b( J% [
#define msleep(x) usleep(1000*x), D* Q0 T/ j" P) J) j% j5 q4 r. N/ D
1 k  e) w) L- ^" w' [) h
int main()
9 N4 x" h( s% b: a3 ^6 u# |+ W{
7 H, P! K1 n$ K6 s2 A    //MCBSP,ARM与AMBE2000交互设备
( N- T; j0 U0 }, P% G8 X* n5 Z int fd;
5 S' a! M1 J2 v+ R# x: W unsigned short data_write = 0x5555;6 E. F# T5 W2 A) S  a4 C: D; G+ n7 _
unsigned short data_read = 0x00;
. }: R+ D$ l8 g6 ^4 W" y8 P  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ h$ n% V2 o+ Y/ ]& E3 y) B
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& Y! w, A, G! F/ d    2 A8 M" f! c' l8 M( K% n
  if(fd < 0)
( L) x. e1 V, _6 B* B$ h  {
4 ?2 V3 ~/ D5 {1 H0 O1 E     perror("open failed\n");/ X, s: l* b& d# l3 i
     return -1;
3 y, {1 @3 x: [' l% @4 u  }
: Z* ^$ q# P) _0 l) J  
& _( Y6 |$ J- [) V. R! q0 h  while(1)% S/ l+ X- b: A9 ?7 `) l0 r. s
  {
+ @! q$ d& X( L. V' K# c; P. S   
( j/ l% v, J  P   //AMBE2000每次读写是24个字为一帧
; f+ a1 k- |5 }/ a   //写数据时将数据在底层存储起来,等到中断的时候再发送
5 U& t. G% d& @* i   //AMBE2000输入数据是以0x13EC开头的9 [* J; |& B2 G- S! H
   write(fd,&data_write,sizeof(unsigned short));
8 a5 f" k1 G2 F# Q, N- P3 m   
' w0 C3 G- I3 s. i   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  $ f$ m5 u9 Q* Q' R6 U/ l/ p
   read(fd,&data_read,sizeof(unsigned short));7 m, _) |5 c8 U! Q! Z- ]
   
: v$ i# `  ~6 Z2 F9 _" W   if(data_read == 0x13Ec)" B: H5 H+ |- x  ?
   {
$ z! P9 j! ?# ?2 {% U* N4 a) S   * R# k7 e8 I1 y: j" j" S, n
    printf("data_read = %x\n",data_read);0 X% K: U7 I# E7 H" c( r
   }
7 [: Z. }5 a; X. l3 n' \# [   
7 I7 i# e0 n: ?; l$ W+ L$ _: G: x# k   msleep(10);
# {5 B% J! y" B) F% j7 k. P  
: M6 P; ~4 o* T# p- T( ~  /*2 D) r* g& N$ ]$ u9 E
   ioctl(fd,1);   9 g& K% f8 _! c
sleep(1);: ~3 _( B+ |+ E3 L: N
ioctl(fd,0);
2 z4 B& A& m9 L! a5 o: b sleep(1);, Z1 a) R: ~" s$ G' ^
*/
, e/ h. v& \. C/ V  s  ?0 I/ V  }   7 T# h( U. g% `2 W; R" R
return 0;5 k- d" T0 y& c* N0 E
9 i! C# t2 U/ w! I, A: [
}
# @5 U1 P+ ~8 R% n8 a) o$ y" I" b
/ S7 _" b; T' V- W多谢各位指教,谢谢! 急8 l& p; Z, O5 e" ~! D

8 @& R' g2 k: u; W6 d
3 q$ k/ x3 t3 r9 d5 \. _: z
6 x) }9 t9 c& L8 S: Q, I1 U" U, `3 g* p8 a- C
9 j# ]3 ]9 c: Q; q4 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 01:43 , Processed in 0.048586 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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