McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / w/ l$ f, W' [3 w
/*
7 n3 w0 j- h" E, w2 y' v * Copyright (C) 2009 Texas Instruments Inc
6 W8 L' i9 C* R1 ~: w' P( }7 N! O) K *, p5 \! p  I8 _5 q1 c- p
* This program is free software; you can redistribute it and/or modify
! `0 H( u) B2 y2 Q, K0 h' v" i * it under the terms of the GNU General Public License as published by
1 V& ]9 x+ H7 q: Z7 S2 g * the Free Software Foundation; either version 2 of the License, or2 F/ U* Y+ J2 S
* (at your option)any later version.. L. D7 _$ O+ h) h* V
*7 Z( ?- S% Z% `
* This program is distributed in the hope that it will be useful,6 d" ?* S9 c' @  Z: |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
, p% W# d# _5 l" M5 w9 ?% A) o/ \ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 R. y& ^: m8 h- R0 S) {4 G * GNU General Public License for more details.% a$ u" Y$ n6 s( P  ]  z* x
*0 `' b: U% T9 V% I2 p, g
* You should have received a copy of the GNU General Public License
/ g+ S  p" N4 @$ {* S * along with this program; if not, write to the Free Software) d4 X6 r. t2 Q3 B: i1 N
* Foundati' B9 z# J. _) `. k  |
*/# a* d" D8 Q& d7 L$ Z- ?
#include <linux/module.h># }5 o; d6 V$ M0 I3 w
#include <linux/init.h>
) P7 q8 J. J/ Z1 Q7 ^# o* K#include <linux/errno.h>
; `- W/ ~. k4 b2 d( M8 T#include <linux/types.h>) I2 o' J5 n" w5 \' ^
#include <linux/interrupt.h>  V: \& K7 H" M. |( H6 V5 q* X
#include <linux/io.h>5 d  _- g  [* r2 N
#include <linux/sysctl.h>0 \' j, [- a  ?( t0 T+ c
#include <linux/mm.h>4 G, x; ?. b" W3 W4 ]; @
#include <linux/delay.h>$ r# d. E6 s$ |3 \3 j# r
#include<linux/kernel.h>
- i7 Z! W+ Q9 i; [#include<linux/fs.h>. T' H* |5 e8 P9 D1 g9 c
#include<linux/ioctl.h>4 V5 @- z6 H8 J8 G7 P: n
#include<linux/cdev.h>
* }6 @8 j/ O6 @/ F2 ]#include<linux/kdev_t.h>  h4 o6 t9 O# V, Q
#include<linux/gpio.h>* x0 W0 f1 T; r" Z+ @5 b
#include <mach/hardware.h>5 Z$ \  |# v( ~0 x  J! a
#include <mach/irqs.h># X; D1 |1 B! U7 _% D

7 j3 Q$ {/ C" x/ O/ Y/ `2 r#include <asm/mach-types.h>5 L  a) ]) |1 P+ _( S7 ^; x
#include <asm/mach/arch.h>2 f8 m: A: s* u5 o: M
#include <mach/da8xx.h>
# y+ f' p. T  y% D, E0 H; a& R% j#define  SYSCFG_BASE   0x01c14000
- l8 }" k! {" n/ K) z#define  PINMUX1_OFFSET   0x124
! J' C+ B/ G6 @  i! K: B" H9 W9 E" w#define  PINMUX18_OFFSET  0x168
1 }2 U/ @' r3 ?( k# ]) `/ A. \/ s! s0 u#define  PINMUX19_OFFSET  0x16c7 J3 M1 j( g+ u: r% g7 y* Z& z
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
0 ^7 l! Z% X* @0 ]9 \#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% J$ M/ l* j! I5 c& R  O& u#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR) I' f# Z3 E8 y0 p+ L4 {
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR( }& W% {* f% h3 Y* e; c
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
& @5 D& ]( V+ s. B+ r% k( H3 _8 @                           
2 s" X! g9 {# d) d# c3 p#define DXR_ADDR      0x01D11004  //MCBSP1_DXR2 L$ k. H; S$ m2 f# k
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
5 `: \' T% P, [2 O/ ?; c- f//PSC: m3 B% u# c- e% _: a; s$ p  S6 K# ]
#define  PTCMD_ADDR   0x01E27120  & f& Q  p# w! G& Z" f. Z
#define  MDCTL15_ADDR 0x01E27A3C6 P- c$ ^; s( S8 J2 Y
#define  PDCTL1_ADDR  0x01E27304+ k5 {* `$ x0 A& `+ [. W" }
//GPIO8 direction
! M* g- i. S5 p8 [3 u7 Y#define GPIO8_DIRECT  0x01E260B0
. B' ?" ~) z; E0 r' \#define GPIO8_OUT     0x01E260B4; d$ ~. I  u7 T: H- J
#define GPIO8_IN     0x01E260C0
- w5 a) l* k- g2 L5 @2 w2 t1 h# f' i& T7 p9 U& x: U. V- d/ O: g% a
//#define MCBSP1_RINT    99              " `4 ]- V4 W* _
//#define MCBSP1_XINT    100  ; x; U! b3 X( R1 f
static int MCBSP_MAJOR=239;
* V/ Z" |  Q' w- {4 ~6 Ystatic int MCBSP_MINOR=0;8 r4 L/ I( t' s% e
static int count =1;
" O# w/ Z8 Y8 S" M1 J  e. z- ]) P8 n0 v( L3 J
#define MCBSP_NAME  "MCBSP-device"
+ @  y* _8 d) d4 j1 h' i/ q; {8 J" F9 _. K! p: r4 |% F0 K/ l
static struct cdev *mcbsp_cdev;. X7 s( s1 F3 }' ]9 E8 m
static struct class *mcbsp_class;
( g- _5 t1 t" ?4 Astatic dev_t mcbsp_dev;! `2 X/ b6 m6 u4 ^/ p; ^
unsigned int DRR_data;, `, L  E4 j# G0 M2 w6 l% U
unsigned int DXR_data;
& _* `" k6 D; o4 T4 ^! S$ Z, `+ ], z- Fstatic int mcbsp_open(struct inode *inode,struct file *file)
; `" g' I) ?! @2 k{
* V* w0 a0 n0 f5 G+ d4 E   
2 \; |+ e& ^# w* x   //interrupt enable,initialized
2 g2 B8 S- Z: h: h4 W   unsigned int temp;8 a0 [6 x; e0 x1 d- U5 P5 }0 R+ e& ^
   //SLEEP_EN(GPIO8[10])---02 o, I! u+ r6 Q) [
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: o3 N3 V& |, I' s. C* T   temp=temp&(~0x00000400);: Y3 ~  B: k$ l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 j2 J5 s. T( C$ N* ~2 U" a
  //RESETn(GPIO8[8])----0----1
0 R8 d* a, E) M% w   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- r0 W& K# o0 n7 }  B+ {7 J   temp=temp&(~0x00000100);
6 k8 H6 ?- g& S2 W5 ?; z8 m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 c; a+ }: u+ z+ g# D   udelay(100);  {. V) D" _* T5 I+ X2 Z2 e
   temp=temp| 0x00000100;+ n, |* ?4 h7 T4 u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
4 M7 @% W. T, i- ^0 w" P/ h( q   udelay(100);/ u6 {- d% W, ?/ I
   printk("open success!\n");
9 [# a1 p6 Q  |5 q4 f, F% [& A   return 0;
/ U/ P# b7 e" e; m$ t# U0 Q1 `}
. j+ L6 T# l& |  z" {2 {
! f+ ]  L% y. o9 estatic int mcbsp_release(struct inode *inode,struct file *file)
6 c) K2 E: B2 v6 V{: {$ s5 p0 k5 V" l" v
   printk("release success!\n");4 q0 c, P( _1 ~0 R
   return 0;
8 |5 T2 L& @: p6 r/ ]; q2 ?3 A' {% |& a+ ~}
2 Z2 e9 B- ~4 x+ W3 w* g4 B6 _& C, R$ o# L5 H7 M+ [1 C6 e
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 Y2 _, W5 L8 w) A! L
{
3 \3 q' X0 r9 \    copy_from_user(&DXR_data,buf,len);" s8 w7 |( y; N* E1 a
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ {8 ~+ E& ^+ N4 G) ~+ ?    return 0;
" |2 a# J1 m  r; ~* l- b ! r" e) c( W1 u! E5 e/ P" l3 Z
}+ G, C* r% Q8 D1 A

0 n0 U; F, V6 lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 f4 C' y7 S6 g; @8 w{
0 A1 E6 h) r$ G( ~: {. ^+ ?   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# N7 \5 }  _2 ^) f   copy_to_user(buf,&DRR_data,len);
) O" ]5 k5 R0 J: G% d; r   return 0;2 ?; _# z1 m# x
}6 \; {' [  r+ }( c7 v
5 B0 n8 Z& `/ M* H& s  S

6 e* d, q( L5 u# f4 T" n) j- \static struct  file_operations mcbsp_fops=
' N1 p  X( D1 z" H4 c! i4 i{1 T4 c' D2 ?; V- f, v  e4 V- D
   .owner=THIS_MODULE,
) S( A: }! d& G   .open=mcbsp_open,
- \! b* B2 T( d   .release=mcbsp_release,: ~: }, c7 L" I' J
   .write=mcbsp_write,
' r8 K- r( a6 N   .read=mcbsp_read,
: U" i: R2 V; I};2 r% z  r. E) n# Y  c9 @; Q6 n
static int __init MCBSP_init(void)
3 K; `& {$ X' m- w0 P{
& U. s% t- \+ }& n   int ret;: R, N0 `, T" a$ ^( Q
   unsigned  int   PINMUX1_REG_old;
" g- g  w+ G/ D$ _# `   unsigned  int   PINMUX18_REG_old;( }! e' d$ s& p' n( `0 A5 B9 y2 P
   unsigned  int   PINMUX19_REG_old;# t1 W+ a5 i$ I3 r$ f( {. q5 w. @
   unsigned  int   temp;  
) U4 L4 J* W  n" z; V0 E7 g1 ?   if(MCBSP_MAJOR)
' f5 f. G* F- X* {) v) j   {
3 ^3 @& n3 \& o4 c& A/ W      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 }" z1 Y. P2 y. v      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);9 {4 r" l$ e6 b; y" M; B0 R* |: L
   }8 A, b! [* I  K- c9 N0 j
   else
, T9 ^: X. p+ K+ K  l8 p. ^$ @   {
, O, E$ V  t- n/ p1 n/ h7 k      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 S0 z3 w( J( J% R
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
* p$ U0 q  v0 t   }
5 D/ t8 l3 o. D* N" ?% m   
' g' V9 I6 K0 J! b. @6 V0 [' v   if(ret<0)' W3 R! F$ r& y6 a. w9 d6 W
   {
. o" C! g4 \8 I# p8 _      printk(KERN_ERR "register chrdev fail!");
: o& w) c- X4 r      return -1;+ T5 X% U0 j, A( o
   }
, E1 M. m3 h. n! [3 d1 U$ S   ) i( `. `/ e. V) I
   mcbsp_cdev=cdev_alloc();
4 V' e: Z' C* j+ B   5 P- Y; U+ M2 e0 \* t
   if(mcbsp_cdev!=NULL). C' D: ~  g% o) M& A' Q  p; J
   {  J# k# n' s" `! j& W
      cdev_init(mcbsp_cdev,&mcbsp_fops);
0 \) |' V0 B' {: p- i' ]      mcbsp_cdev->ops=&mcbsp_fops;
3 A9 W: Y0 q3 ^' _" a      mcbsp_cdev->owner=THIS_MODULE;0 H- i7 c6 |! D  Q, X, A1 i: i
      
& i# R6 |5 r0 h% ^- @" N      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& ]' }3 I& C  r0 t; x' X
          printk(KERN_ERR "register cdev fail!");
( a, y. u" Z! e* w1 ~; ?. A2 V% f      else% \. _  `  |1 a0 i" B* t
          printk(KERN_ERR "register success!\n");" P* |) n. r3 Y
   }
- c* U# _. p0 U" |   else
2 Q$ A2 E8 m! q4 r% X   {
: w0 X: f" {, T8 `, r3 H. {: s. x      printk(KERN_ERR "register cdev err!");
8 z- c2 B1 a8 ]# a8 r  P: W7 g% Q6 R      return -1;9 p2 p4 |  g. F/ g9 G+ |
   }
% k: w6 q, y- A" ~+ B   1 K0 v) w/ M, T- l
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);6 t8 j& `+ n1 i* m5 Q, i
   if(IS_ERR(mcbsp_class))
7 J. Y* S4 _! ?+ Y: P7 s   {; e4 w% q( F! w
      printk(KERN_ERR "register class err!");
" O: m, R0 K8 U   return -1;. Y8 D6 d* s! f+ ~
   }
* E+ i4 s4 b1 P* G5 H( _6 N/ ^. ~; M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, z6 r- w7 p% P# G. X8 w# m; ^
, C6 G! \3 B# ]8 g   //PSC
: C" T1 m. m. b& G) n  u* F   //add Enable MCBSP
) ^% c# V3 J3 }/ `   //test* f& Z; H/ ~" Q2 z/ t3 F) _
   temp = 0x80000003;
0 a& y  V5 _6 O0 F) C   writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 [: G1 R0 z. H$ X3 G0 }
   temp = 0x00000003;
( I" R* y% H; ?& r   writel(temp, IO_ADDRESS(PTCMD_ADDR));
) u! }3 l/ S3 Y3 ?  p
5 ], l* L. ^6 r/ ^   temp = 0x001FF201;
/ K) S7 U' ^4 a- K5 p   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# o; ^, q) h0 S; d* b2 X# R   
$ I; }# h9 \- ?4 j0 o+ ?   //PINMUX  
. v1 c" i% p7 _4 a9 m: W7 B$ j/ g0 g   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- J; [( x) y: z8 e: U   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; `  h5 Q2 P, M
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
+ N5 M" Y6 e2 P) v& m/ v   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& n/ A2 ~0 S6 r8 M% @" o$ F: i7 S   ) N* o: l* {" c$ @  g/ T
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( |% M1 q3 {8 X" U   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  * e5 J0 C4 J) ]. g% P
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   : T5 S6 [8 T7 F" O5 i+ i% r" W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% o, x5 }( v$ I1 R
, Z9 }) E7 [% w6 C; F6 F   //RESETn,L138_SHK29 R5 r- s) M" V: c; m/ y* W
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  / n( v# s" a) N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   8 @3 R- R' }* C) ?
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 ?# C6 m1 D% I; f; z! G( Q
% T8 L0 R' L) b  j! B/ `
" |9 Z, G% n& O+ V0 ^  //SPCR Register! h' K* h2 o$ @$ y; n- {
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ M8 Y0 t0 [# P5 D9 a- e  temp = 0x03000000;//(DLB=0)
- {; x' O7 Z$ O // temp = 0x03008000;//(DLB=1)
2 d* h' O/ E2 \" ]& C! N  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset) j( B8 t* `, M. K
  temp = readl(IO_ADDRESS(SPCR_ADDR));. f8 ]9 J+ D9 i( e9 p
  printk("temp=%x\n",temp);- Z& y2 f+ p0 R6 h5 E

1 ~! ]5 y; `# t1 B( |+ I7 {% Z   //PCR Register* A8 v4 B; k/ N  y% K
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 F6 \" ^! v- `6 y5 l5 N. ?; v
  // temp = 0x00000F0F;
! o' J9 Z$ F6 h  M! j+ }  temp = 0x00000B0F;
: x3 [' e) e% \: w0 i8 {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 |& b2 g) D7 K! y' B
  temp = readl(IO_ADDRESS(PCR_ADDR));/ N/ g9 {& e1 s: S
  printk("temp=%x\n",temp);  & d0 B5 V" y* w8 N0 k& t/ H
   //SRGR Register4 n. S* Z- g' I: Q- ~9 z0 `
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. K# Q: a1 ?+ p3 V3 u //temp = 0x301F000B;+ p" }) @+ o) Y0 a' M: b
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized # ^* i3 f% Q6 u, K( a
  temp = readl(IO_ADDRESS(SRGR_ADDR));
, I* M! u/ k3 W8 \8 K% I  printk("temp=%x\n",temp);* H2 w) {6 l! l; s7 X. A1 A
   //RCR( s3 \2 z$ U+ K' `* Q2 j
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 n) K$ y0 \1 U" y' Q   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ ^( k7 l  t4 c9 i5 R5 ^   temp = 0x00440040;
5 V: Y' r% i- ?+ [0 u7 T( A( w/ }  ~   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
0 ?1 ~& N$ w! P. q5 T7 }   temp = readl(IO_ADDRESS(RCR_ADDR));
  v- D, S; J! I8 h: ?   printk("temp=%x\n",temp);
' ~/ {3 v* `: o* G3 \+ ^3 X7 R   //XCR3 K; K. l; U& g! X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
% C# ^& ^! K0 |* H( ]# K6 h   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 d9 [' f" A( m. o7 n2 v) ^2 R   temp = 0x00440040;
( C$ w- P2 Z5 |   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# b6 X) t% _3 o; b1 I   temp = readl(IO_ADDRESS(XCR_ADDR));& n0 k- M) M' u. A3 s8 K. J: Z
   printk("temp=%x\n",temp);4 [" r2 @% s7 b. @  m) N
  udelay(100);. H6 c( u- I8 v- j. s
  //SPCR Register& j5 o5 B: ?3 H6 x) o, `6 ?
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 {$ v+ O; @7 g2 T+ O% h
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- ~5 R; j  N6 P" s+ j, }7 t; f  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 M! ^; l$ T2 l, {, N0 |4 @  temp = readl(IO_ADDRESS(SPCR_ADDR));
% X% D$ }5 J% F& I2 ]5 m/ f9 |  printk("temp=%x\n",temp);! D( U; v7 a# m/ I
  udelay(100);) U+ l) |2 M0 A' x

& R* |- U5 E# @2 m( E) J% R. B  //set GPIO direction
8 t9 k8 G8 ?3 ~   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 K# z4 j. [( _( @" h
   temp = temp | 0x00000100;//EPR----input
1 v9 O' N& I9 x: @* f8 s" X, w( v/ a   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ I1 ~& t7 Q& s7 u
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ L( o3 B6 E& s: h. A

, S2 `( G; d8 \   return 0;# G' H8 j2 W' @
}2 B  K9 ]- i  w& r9 z
static void __exit MCBSP_exit(void)
. l' p& P3 `) @: [/ A{. Y* s9 i9 Q7 W2 \/ D- O
   printk("mcbsp chrdev exit!\n");
  x" F7 e1 j  ]+ L0 W   cdev_del(mcbsp_cdev);, Y: Q; b) }' e- h4 ^
   unregister_chrdev_region(mcbsp_dev,count);
  Y" R  b2 Q$ b7 P' L! b/ _& o+ |   device_destroy(mcbsp_class,mcbsp_dev);
. @9 S5 _5 z* U' T5 v   class_destroy(mcbsp_class);
$ m2 I# ]1 m( g7 X* j}# z0 |* Q, {0 o2 e, f, m) k
module_init(MCBSP_init);/ [3 b4 z$ z/ {' A' s! y% e5 p
module_exit(MCBSP_exit);/ d& N4 j* S) K3 d9 ^  j* k
4 r, V9 ]0 m" l5 m* @% L) U
MODULE_LICENSE("GPL");
! u0 P5 ?" G4 F1 ?% B; z" I
& W/ ^0 c; c0 j8 q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& n. {, e- c# F* B
我的应用层的测试程序如下3 `; J9 g( k! l6 B, q5 w; Y+ |
#include <stdio.h>
- P0 j' l4 b# P! W" q( k$ l1 G#include <string.h>
% f; O/ }) s$ E#include <fcntl.h>% ^; F; }- b5 p* ?, w0 l
#include <unistd.h>% }, |: t5 A- {' ~/ O5 r0 T' G
#include <signal.h>
* L, n2 y% f, g#include <pthread.h>       //线程+ u( L9 W% X1 Y* ^
#include <stdlib.h>9 {4 h+ R7 D: P9 U
#include <pcap.h>          //捕获网口数据
$ Y( d, G# [% k/ h; y#include <semaphore.h>     //信号: s1 c; V* X* L# `$ R) S
#include <sys/types.h>     //消息对列3 A1 |) \8 m: ~) W- _' M
#include <sys/ipc.h>       //消息队列. }. D" H/ @! V/ D# n+ H- n7 U( }
#include <sys/msg.h>       //消息队列! G' v8 r& j( G& K* Y# s+ V+ l
#include <sys/select.h>
0 T) o/ S6 q- X/ Q* c+ Y8 \$ Y#include <sys/syscall.h>
) K( d% }! }8 q% N4 x% W#include <sys/stat.h>5 n! z. U3 k. ]$ l3 \' ?/ p
#include <sys/mman.h>; b! B- _3 Y# N: z" B7 {* U
#define msleep(x) usleep(1000*x)2 }+ ^7 d2 B  O
1 @, T, I, x; }1 }  `7 l- E
int main()
6 ?' g* N2 n' I# c9 ?$ ?7 b. D{ " L& h: X$ K+ l/ k
    //MCBSP,ARM与AMBE2000交互设备+ l& F( {9 i- k) q( W
int fd;
* t! u+ d7 a+ Z- a unsigned short data_write = 0x5555;
! T$ ~# n5 C  n unsigned short data_read = 0x00;1 q1 f, P$ F5 t  ?( G" u' J5 _: T
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% A( Q0 R. P5 K" K7 b# o& V
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 Y  c5 M4 T7 v. C: h  J$ P
    , B5 H  K6 w& C! @
  if(fd < 0)4 ^: B9 X8 ~7 I; R8 ^
  {8 m& N% o: |0 V% R& r9 |
     perror("open failed\n");* a. R) b' J5 Z" p* E+ Q5 V7 L
     return -1;
& g/ V, S8 t, \5 j7 y' o  }; o/ p$ D& T; u* m; U5 A( C4 d
  
0 m9 Z1 Z$ D$ J+ }. K6 `  while(1)
( L/ r& X7 I6 y* n3 v  {
8 ?6 S3 p2 N$ f, T3 d! }   $ x% ^" \3 p: J" N/ c0 P# k& |  L. i$ U
   //AMBE2000每次读写是24个字为一帧/ @% q* ~! Z- L" ?. U
   //写数据时将数据在底层存储起来,等到中断的时候再发送4 \4 ]% a% D% n
   //AMBE2000输入数据是以0x13EC开头的
2 D$ s# {1 Y6 B   write(fd,&data_write,sizeof(unsigned short));4 [/ @7 M* S6 z* g. F! r
   
  U- i) ]: g3 e   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  , T. u$ s* }4 k6 x
   read(fd,&data_read,sizeof(unsigned short));8 z2 `7 q" {. E4 }* ?/ y- [
   2 V% J2 Q# C! L" J: @/ n
   if(data_read == 0x13Ec)
) l( Y( A: [2 z. F* P( Z   {2 m4 r9 _& J' Q1 a8 g, z
   2 j& W8 l, Q& o
    printf("data_read = %x\n",data_read);
. Q# E3 I3 s- |  |- |( u  R2 D  O0 o   }1 ?, V# s' ?1 d' I' G% q& c$ ~
   $ P$ x' Y  L$ M9 H
   msleep(10);
8 o/ r- y6 [# t  ) h5 W. W: D7 @/ }7 c* D5 R. q
  /*7 I; m( v! @7 o
   ioctl(fd,1);   ( s. _% A* V. t) b, r
sleep(1);3 d( e2 c' O. _' Z, _
ioctl(fd,0);
6 i: E& S, R  A4 Z3 Q sleep(1);$ {$ ]  _1 }5 k& m
*/
1 _$ j% F1 `# c/ I+ s; s6 ^  }   - W3 c9 H9 `" @
return 0;
2 p7 T& W2 _- W) z: n: R   M  j6 e" N; B
}
6 {: Y( O2 N/ D+ I
* G4 u# ]" x# ]3 R4 U多谢各位指教,谢谢! 急
$ n) z' i' O1 J! T/ \; _
/ L8 l  w* D% K' |% G! y" P5 a2 {& R+ [" X7 d
6 B7 S6 I. w$ Y; b

% H. h" A7 g& g" T
& j  q; Z9 V9 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 06:06 , Processed in 0.053688 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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