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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - [5 D, C9 N+ `9 w
/*
+ M: Q- F3 {$ N+ k* Y+ {$ V. a * Copyright (C) 2009 Texas Instruments Inc3 F) X: R  G3 Y9 Q/ r5 g
*% V0 j6 b/ d/ Z3 E/ ^  C- O4 U
* This program is free software; you can redistribute it and/or modify& \6 D; h% a9 F, j" y& P. |
* it under the terms of the GNU General Public License as published by6 O, T4 l. a+ J0 n6 ?; v8 N+ N
* the Free Software Foundation; either version 2 of the License, or
0 T- c. o: X. E" U- q- ?) N/ I * (at your option)any later version.
; _4 H+ c) X" g: _7 ` *
8 }) M; P+ o  E; W * This program is distributed in the hope that it will be useful,- }; K$ s8 D% ?) X4 ~+ \$ {( M
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 K5 {2 {* j0 K4 J
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" J6 N3 m; Z' a/ |- b9 ? * GNU General Public License for more details.* _0 |: i& y! l5 I
*
. `. y, d% X# t4 n& V * You should have received a copy of the GNU General Public License0 v/ q4 a) N/ v7 e
* along with this program; if not, write to the Free Software8 x, A) }/ a0 ?1 @& o2 L
* Foundati
8 \7 ]* m# Z3 O& H' o" @*/
1 {# P+ h+ `1 n! p#include <linux/module.h>
9 D5 ]; Y; N5 U0 A4 b7 v' F#include <linux/init.h>3 ^# w  A) m- E" d6 M$ x7 f2 U: u
#include <linux/errno.h>6 A: z1 y8 L" ^/ }& v  n& v8 b
#include <linux/types.h>, C0 R1 I( x* I4 x# K0 H$ }
#include <linux/interrupt.h>! H" U; J2 ^1 q4 d  ~1 ?
#include <linux/io.h>4 A8 @* H6 A7 c9 p0 V
#include <linux/sysctl.h>
, J# v. C1 p2 _  ^0 H#include <linux/mm.h>
8 Q. Y: U, t: Z% d#include <linux/delay.h>6 ], ]8 k9 g; J
#include<linux/kernel.h>
- i: ~- Z  b# W' Q  |#include<linux/fs.h>/ @: b8 P  C8 J& h1 T- v9 a: K; c
#include<linux/ioctl.h>
/ J: m/ i% j- }#include<linux/cdev.h>
( ?6 v6 g7 ]) s* j# s9 a#include<linux/kdev_t.h>
* _5 |* ]' M% T5 ~1 {#include<linux/gpio.h>/ I6 R0 Z1 c( `
#include <mach/hardware.h>
/ k" `; r+ i+ y# T4 ?8 ^: d#include <mach/irqs.h>
/ }0 \! B  b0 g* a( C
! h$ g% f  d5 C$ R- K3 l# L#include <asm/mach-types.h>
; A7 W9 @" U7 {# H( q' k3 P0 {#include <asm/mach/arch.h>
  @' I; [7 `" l#include <mach/da8xx.h>( m& c0 T& P( S1 T0 l
#define  SYSCFG_BASE   0x01c140005 ?: m* C( z6 i' I- m
#define  PINMUX1_OFFSET   0x124 & @! I9 U2 J- U1 g) O7 [+ {
#define  PINMUX18_OFFSET  0x168 + ^( [0 A- f; J. t- F& K) {
#define  PINMUX19_OFFSET  0x16c2 C- Q  V+ p! C2 Y' l
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) V7 D4 X2 |. u8 Q: a4 A#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ l: A! x- z  S, j, q2 N7 Y6 Y#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& Q2 \# Z! L* L6 Q, U#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR4 L2 i+ J- F( F: n
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
+ A1 h. W6 ~: l3 m+ G                            , [3 p: d+ A! w
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 U# |" e% n* N) `  `; H# S#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- f: L! @+ s8 q* [: f4 a//PSC4 E4 `. {" Z5 D/ @
#define  PTCMD_ADDR   0x01E27120  
; X; y. i, U4 g" R7 u! v& Q+ ]#define  MDCTL15_ADDR 0x01E27A3C% R+ k6 s- d4 O5 F# k+ Q# J
#define  PDCTL1_ADDR  0x01E27304
) @" C7 |2 S& r) _( p0 `//GPIO8 direction( t* O4 J  y4 f- @
#define GPIO8_DIRECT  0x01E260B0+ D4 l; c5 j$ p+ ?* {! \0 A$ m
#define GPIO8_OUT     0x01E260B48 n9 j9 ~& U, l/ Y" a3 q. A
#define GPIO8_IN     0x01E260C0
. l5 f! }6 L5 ]. c9 u' n( I3 L
7 ?; W+ Y$ w. I, W9 M//#define MCBSP1_RINT    99              
7 V5 d: ~0 r( v* B5 C" U* {//#define MCBSP1_XINT    100  
3 Z) C+ W' m6 O# H7 {2 E! mstatic int MCBSP_MAJOR=239;$ o( r- `. o! B# _% Y
static int MCBSP_MINOR=0;
" Z) B7 |! W/ Z5 Estatic int count =1;
; M. l" i6 A/ v3 D0 o+ L( b8 a( _3 Y1 N% M
#define MCBSP_NAME  "MCBSP-device"/ f3 |" d  M: L- A1 n
6 t1 ~3 ^: N! R* ^, r5 f, L; y
static struct cdev *mcbsp_cdev;
  N( \. }5 q% m7 Q1 fstatic struct class *mcbsp_class;
, W" h2 `; C- b0 J1 ~% M3 S# ustatic dev_t mcbsp_dev;! Y/ `" ]1 o9 o7 y
unsigned int DRR_data;+ Y' p# f: ~6 f
unsigned int DXR_data;
0 @  b5 n5 b5 ]; F( U4 z" nstatic int mcbsp_open(struct inode *inode,struct file *file)( Z" B7 V+ ?8 w) y
{
. l) \1 j# M! d- t0 i8 V% S: W) d   # R0 B" Y2 {* ^% H) P
   //interrupt enable,initialized
1 f1 K9 x0 A7 ~- d3 o1 W( N   unsigned int temp;  ^1 S. @; A+ `9 Z! U
   //SLEEP_EN(GPIO8[10])---0
6 `. M8 j  G5 }; k9 n   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 G* }. F8 E1 r7 h5 A& v9 t   temp=temp&(~0x00000400);
# `5 H+ y3 J9 H1 T8 @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: W1 F7 d" `$ K/ C  //RESETn(GPIO8[8])----0----1
: Q6 w6 |& U8 C, V: P/ y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! ]; I* F: Q* V4 W8 y   temp=temp&(~0x00000100);
' \* r5 }4 t/ u- {2 M3 a+ H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# K5 q8 N" j  D   udelay(100);
, _- h6 [+ ^: w0 Z0 F5 y) r2 m   temp=temp| 0x00000100;6 P9 S# B! \+ l# ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  R' |: M( s! X( s; Q: {
   udelay(100);% I. l+ z- Y) w. O* K' R6 V% Q
   printk("open success!\n");+ d+ r: |4 T  j( S, K9 M( t- L; m
   return 0;8 V. R0 Q3 U, i( n+ }$ l
}8 W& M6 n2 O& E( I4 Q% Q+ Z

. Q8 Z! Y( I  r; i5 M$ Z$ ], @0 cstatic int mcbsp_release(struct inode *inode,struct file *file); B, h( L$ J$ J, q  q, K- a
{
. E( @+ M, e2 e% s1 _9 E   printk("release success!\n");  ^9 k& v& D2 a+ ^$ p7 U& Y
   return 0;
4 Q# {5 Q# t: g, e2 d}
5 G3 K7 Q9 t: S4 j- _$ F# K) v
- G2 U! R* f1 u4 p7 J) G' [: Q7 Jstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); X& r) f$ G" T+ `
{2 h) Y6 c7 \) L8 f% g
    copy_from_user(&DXR_data,buf,len);
$ d# J% F. q5 a9 G4 Q, Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
, B4 @- Q* i2 Y    return 0;
6 M( S; {5 T# E+ y) z' \
. c5 M5 l. y# X}
5 o: B- r- R# x4 F
9 @  d9 @2 q! v  vstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 X  x" u1 l8 u+ c- Y7 s4 B% ~6 S{
: i0 U' h$ |* N   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* W) F+ C- w7 R( a6 G$ X   copy_to_user(buf,&DRR_data,len);
3 A+ N* C" d% v5 Z! w! z   return 0;
2 {( p& D. f" t. B3 u  k* z# X}
# b+ F3 ]( w1 u- A# E5 J- d5 v5 V: o- P+ r+ P$ X2 x
; O4 K1 ?0 n5 [- O
static struct  file_operations mcbsp_fops=
& P6 N  i* ?2 E( A{6 _& A$ s& E3 K
   .owner=THIS_MODULE,2 M4 G7 R( w$ `+ ~! c
   .open=mcbsp_open,# T) d! b3 `1 ]: p8 W
   .release=mcbsp_release,0 K; O, F! Q  _# d: k3 y9 q& r
   .write=mcbsp_write,. q! i4 `" v$ c; v! s
   .read=mcbsp_read,  P+ [* {) P5 s! O# \' U' o+ P
};" T, X: G6 ?/ r. b: }! x
static int __init MCBSP_init(void)3 [" Q$ _" M- P# \5 g) E0 j: L
{
. f8 E. j9 J4 I& M1 J& M" O   int ret;
1 I" I( `0 A* v2 ~$ w7 y1 v5 V5 t5 t$ w) ]   unsigned  int   PINMUX1_REG_old;
/ J& O* F$ ], h$ _) S0 g   unsigned  int   PINMUX18_REG_old;
4 N5 H# X" W% _0 P& s   unsigned  int   PINMUX19_REG_old;
' o5 ]. ?" k( m$ |( W; P, \9 V! T   unsigned  int   temp;  
+ G! c- Q3 \& g   if(MCBSP_MAJOR)8 ~. `/ }9 F! G  ^1 P
   {1 }* ^: k( ^/ W/ }5 T$ n
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ ~& ]7 Z) z2 K+ u
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# i$ z. J5 s. Y( v% u   }
+ t3 x4 j8 t; y/ Q   else$ U5 I/ v/ n4 v; s
   {
3 e% _( K. g. ]1 X5 @) a; c      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 Q; g/ t4 x3 J: z6 x. u
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
9 Y3 U1 `: Q, i; M+ _+ J% l/ m* {   }
( o+ n5 u6 ^) }) w. [5 s% N& V   
: b. |5 y  L3 _. Z4 d" Q   if(ret<0)/ F/ d0 e  u5 r( G( s& _5 g
   {  ^9 c# u6 }7 J
      printk(KERN_ERR "register chrdev fail!");
- g$ F. E" H. w: Q7 a( w      return -1;
* R. y0 \8 P) d, G- ~9 D1 M   }$ w, U9 Z2 o: \7 R; p- |
   ! s# n/ [: Y. s  n
   mcbsp_cdev=cdev_alloc();
: B# J  D0 Q3 |% b   6 @2 L* k: x' B+ V
   if(mcbsp_cdev!=NULL)( }' f2 Y) P% w/ Z
   {
2 C3 e% I( [7 l- @! C      cdev_init(mcbsp_cdev,&mcbsp_fops);, `( G) y) ?" B6 S" M5 P0 o+ g
      mcbsp_cdev->ops=&mcbsp_fops;0 `0 R( x' |* O. |
      mcbsp_cdev->owner=THIS_MODULE;7 L; B; z' `: ]
      
2 l3 l. j  ^; F  M2 G4 i4 Z2 g      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
1 S9 X: F5 g2 L0 `          printk(KERN_ERR "register cdev fail!");& T7 e2 ~3 N" Y8 R. R2 R3 U
      else
. U7 N3 v6 [. r- [8 N! a          printk(KERN_ERR "register success!\n");0 ?3 I1 P9 {8 p4 `1 F% B. R
   }: {4 A7 ?3 k, Q3 q
   else6 [) A% Y0 l% o7 A
   {' y+ j' o$ x7 @8 d
      printk(KERN_ERR "register cdev err!");
  ?% L4 Z7 v' [. E1 E      return -1;
' F7 w& q; W: V' W+ G   }+ [1 O5 T! `# S/ j( t
   9 Q7 n  [5 M: Y, ]
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 s/ A- I3 q2 ]$ }$ K' _   if(IS_ERR(mcbsp_class))$ W. H  i6 H9 {
   {$ p  O/ ?( L5 c( C$ X; `
      printk(KERN_ERR "register class err!");9 ?8 j2 h/ x4 l& I4 a9 n4 U1 L
   return -1;( }5 U. j' D7 a6 E1 K
   }
$ V' p3 y: n' K7 C. A5 v( T& t   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, L. U' E7 d$ ]* A6 S
3 O! s( f# S7 C2 O   //PSC) ?" H+ b% c7 I7 Y1 h; e+ F
   //add Enable MCBSP) d( N1 g. |  I. l: {
   //test
  _# Q6 l0 D# l6 G& b8 f$ B7 p   temp = 0x80000003;
. H3 g  f' ^; ~, [   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; c, O; H4 t% z* R6 x
   temp = 0x00000003;
+ Y+ c. O/ |2 ]0 `   writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 a7 j- h7 l$ t7 |0 V' i
2 J. N  L' k: w& K   temp = 0x001FF201;, [& D" m+ ~+ u# ?7 \4 c$ Z- [8 D
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# b# }: ~/ \/ y! n4 K" x   0 X5 U/ B7 ~8 _8 T% t8 q5 f) \
   //PINMUX  8 F7 f% i* I9 O) Z4 u5 A. d
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! `5 j* _: d) i) m% a
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ i) n3 Y& q8 j5 A  |
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
% Y1 N0 `9 H8 b$ N+ p* w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* b6 P5 W/ s* O   # b, A! m; b8 [* I$ g  v
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
3 E- |; S( Q, J$ ~   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ H$ V$ B3 j# ]4 e2 }0 [. I   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
$ C7 w& ^  B0 M9 |  R( q& j; @   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: f" Z9 `3 t3 c8 Q: P* |! |1 _
  [! O  N+ U  P' N+ o   //RESETn,L138_SHK2
5 V2 o2 \# I: @6 a   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 F$ @0 b2 c8 M& h  W4 m% D   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 I  S8 w0 a* v( _% v   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ @0 b0 e& l2 d2 }& F : N7 z! P3 R1 q& }) r3 v; m

8 k- a! J( t6 ^7 D: C0 d  //SPCR Register
+ k* f3 O; o1 e* l, S  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# [  Y+ h, P1 x6 e+ E  temp = 0x03000000;//(DLB=0)
" Y- ]1 U: X7 j // temp = 0x03008000;//(DLB=1)
$ x: D( _9 L+ L! O  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, E& w) T. e( O( k  temp = readl(IO_ADDRESS(SPCR_ADDR));5 }4 }1 q1 H7 B) z- v
  printk("temp=%x\n",temp);
$ [. \+ A  X( N2 ?( F$ I% Y
. r+ k$ T+ v1 U% c- T* E4 D8 K7 x$ W   //PCR Register
' O0 V* M3 H- E, B3 z   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( p* \: U6 Y3 Q  // temp = 0x00000F0F;
" q8 _: j; Y1 G  temp = 0x00000B0F;; K& {$ p% |$ y; i- u0 H6 H2 i
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ( }" s7 B& y* z2 M3 \
  temp = readl(IO_ADDRESS(PCR_ADDR));
; P4 d, F' F$ J% f  Y. B- e: `* L  printk("temp=%x\n",temp);  
) ]+ {+ ~2 ?$ O   //SRGR Register
7 V$ b) h5 }2 T9 W0 F- g   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 p2 `  p% y! V  w2 P
//temp = 0x301F000B;
7 x0 n, W4 |  I9 O% f. X   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized : K4 X& {( ]& w# {* G
  temp = readl(IO_ADDRESS(SRGR_ADDR));
1 T6 \6 k  x& z: G4 P$ p. |& ^  printk("temp=%x\n",temp);7 X# F% ]  R1 h. X# `2 A( I. K
   //RCR
4 k/ P$ V" g# ~+ [' j/ c   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 f  X4 z$ Z' t# |  |3 I! X+ \: i
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ F5 [% @1 e/ H- l   temp = 0x00440040;
: E2 V+ h8 y( j. L7 e+ w   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   . \' a3 c6 F9 h' B  O; p
   temp = readl(IO_ADDRESS(RCR_ADDR));
: ^$ R* ~  f0 v   printk("temp=%x\n",temp);
' q- N) P, u* Q7 G- k/ O   //XCR5 \5 C' I9 L1 Q) R! T
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 l; o5 C$ I/ G   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 X2 r7 h( n; o2 r: {& e   temp = 0x00440040;+ z0 \' z9 U0 i1 g' B- _
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
3 ^! }9 ]4 A3 G) V* K1 n- r% ]   temp = readl(IO_ADDRESS(XCR_ADDR));) c. m. X% R) [# T' ]
   printk("temp=%x\n",temp);
8 W  P1 h. \# t  udelay(100);+ @' ~# e( P- Q+ e
  //SPCR Register7 p( T# {) t$ L# k; f5 e
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 U+ u' P: }- T; y6 |, d  W  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
8 r  J4 g+ t4 @$ V! g: ]  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled: L6 ^- \# x; y, F- o, m! I5 @
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% {* m* L* A  r* h. I  printk("temp=%x\n",temp);5 @9 E. @: {7 C2 q3 x8 l; {
  udelay(100);
4 v& y) u9 z4 v' M3 }3 i/ p' X9 f+ w0 Y' F" r9 v) |, @
  //set GPIO direction
0 S6 @: [3 ]* m   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" B, f8 L2 l( M, G6 [
   temp = temp | 0x00000100;//EPR----input
- A, M% Q& E9 K% o   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) }- }* V: T" d% W$ Y% x
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( Q% e5 h& O6 x, O8 j! J
; r. K2 ?$ C" H- D   return 0;
5 ^; c( p: L0 m( j2 y7 \  E}
6 R2 p9 x+ \5 g" P. ]* q1 Wstatic void __exit MCBSP_exit(void)
, s' F3 c$ |$ v( y2 G! `7 }{
3 |) B# y2 ?: Q) c) d! c   printk("mcbsp chrdev exit!\n");6 A3 Y7 |; L! d8 `$ j
   cdev_del(mcbsp_cdev);
. n6 A5 I0 t$ {6 v$ e6 r1 ~" Y   unregister_chrdev_region(mcbsp_dev,count);
, [% Z) s7 v% [5 j" e   device_destroy(mcbsp_class,mcbsp_dev);
. c* C$ A  w3 D% }, \   class_destroy(mcbsp_class);
. B2 h5 x2 y: m2 t6 ^/ p) Y}
% B5 T- v! u) S. `module_init(MCBSP_init);
( w1 }7 H$ r$ w; t! A. [( L0 }module_exit(MCBSP_exit);+ W- x' K2 A" x# U. X7 J6 q  x
8 {7 ]- t: T% S: A1 t, R4 @
MODULE_LICENSE("GPL");$ j: b- Z2 `& C) y& X/ J
6 c: V( A% r! a5 @$ A
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- y6 H0 v4 T* s. p: `* N我的应用层的测试程序如下7 W2 j0 [, `, \4 X9 ?
#include <stdio.h>7 y8 C. b7 R! P, Y
#include <string.h>
. G; p: k5 V. F' J' x5 p#include <fcntl.h>
/ K3 e. p0 x, j; \2 {#include <unistd.h>
% U2 z: E# U4 o1 ^1 I# C/ N#include <signal.h>9 B$ R( r& b8 v0 S! l
#include <pthread.h>       //线程
4 ^$ ]3 U2 T2 }3 O, F#include <stdlib.h>& L( h1 {' j- D. z
#include <pcap.h>          //捕获网口数据
  a( t1 s: X3 W/ Q+ U4 f$ B( S( s#include <semaphore.h>     //信号! `5 H1 d% U( R  E$ V2 w* z0 Y
#include <sys/types.h>     //消息对列
# I$ \6 o9 V; K* l, g+ I. K" Y9 [' N#include <sys/ipc.h>       //消息队列1 y& O0 z" c* {( D" }( w
#include <sys/msg.h>       //消息队列
# |7 ]6 I& o6 J- c8 n2 S" C#include <sys/select.h>2 c! k5 P# E' C! S
#include <sys/syscall.h>
/ n  ~! Q# m' T#include <sys/stat.h>
) o  P* Y# J, T) E8 n#include <sys/mman.h>( F5 Z% o; C0 \; l2 p
#define msleep(x) usleep(1000*x)1 |8 \' k2 A- \1 D* w; ]5 r- t
4 ?5 t& Q0 L+ N7 Z9 T9 G0 W1 \
int main()0 U, i- S9 Q  D+ U6 S
{ " Q& c: F5 i/ h+ Z/ y
    //MCBSP,ARM与AMBE2000交互设备
: a# n  H& g2 ~# a& i/ p9 Q int fd;1 ^5 A, Q" `' ?) x) \
unsigned short data_write = 0x5555;
6 f8 W/ q/ `; p4 Q* x unsigned short data_read = 0x00;
, @( d3 v: v! q0 S* P" d  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 C2 I! a4 R6 _! y: N' P" U6 ]8 ~
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 X6 W5 l% ~* s$ n3 z9 M: b3 z" ]   
$ J; R/ V& C! Q' H  if(fd < 0)
) C/ I1 _3 _& M6 o  {
+ T9 K9 D, f. ~( {7 I- \     perror("open failed\n");5 s( _+ q$ r5 I9 s1 H5 E7 L
     return -1;" H1 }( w7 m% p
  }
6 Z, n# Q4 l0 X+ Y  
, w, d& l# v9 T/ i  d, M  while(1)
+ o: Q; W( S( s' D5 N& y$ e  {
8 @" ~! l3 ~6 c   , s6 Y' E5 G$ I  t7 G
   //AMBE2000每次读写是24个字为一帧
0 U( K+ `, r2 P% `  }   //写数据时将数据在底层存储起来,等到中断的时候再发送/ W3 B2 m5 `, F# ^0 t* s8 h
   //AMBE2000输入数据是以0x13EC开头的
" Y; p3 y% t7 C+ _8 m1 l- |; a" U   write(fd,&data_write,sizeof(unsigned short));) K: p4 K% A: E/ ~5 x
   
. L$ h: Q9 t: g, ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  % s8 R% P6 |! g: l0 }& R
   read(fd,&data_read,sizeof(unsigned short));0 L4 D0 V! O; A( d2 {
   / I5 @0 N, Q  ^+ B
   if(data_read == 0x13Ec)
" R3 ^3 n' C( o& ?   {  U3 u) l, z9 d8 S
   
2 [- M& u1 `% _( i4 N    printf("data_read = %x\n",data_read);1 V# i* t! ~" _7 J
   }( x/ z1 a) Z- C% C- U. k
   
) b% V0 S/ d3 B6 M, A$ T   msleep(10);# i* q5 r4 D; `6 n
  ; z- W7 O) G  h2 n  \
  /*1 t% A1 N! G: }4 C& P
   ioctl(fd,1);   1 c0 j) t& g( r& k
sleep(1);( i) W; R- p- u* z3 \2 K" i" C9 o! e
ioctl(fd,0);
- P# n& D2 A' z. F, B4 `8 P sleep(1);" \, A) O3 ~" Q7 s/ Q7 Y# ]
*/
" `" O& w) K+ {% _! v. S, d! F3 k  }   4 l; ~% C5 l' e% ~0 _/ y
return 0;+ m+ j& E+ V% ?' s2 K+ i5 e
- ~5 K! Y0 a( H' A1 Q+ e2 X
}6 i2 Z2 C% B- o; Q1 o

7 s: ~$ {# X& m% r; [0 a多谢各位指教,谢谢! 急4 T7 I: E' o8 \/ H3 z
2 V& c  Y2 W! K3 Z7 _
) M5 s4 d  m: @5 }# c# v

" J. V0 f+ e. T' n5 n0 ?" t* L$ m
0 s6 ~$ B) x. ^5 c, E- q2 ]" H0 b+ N- h8 g3 d% I* U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 09:51 , Processed in 0.048481 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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