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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# _  B3 ?9 n5 q4 v% D7 j- E: Q/*5 B& y% M+ g* h4 {6 O5 m  e6 E
* Copyright (C) 2009 Texas Instruments Inc6 z8 p, Q8 a6 r  h5 S9 K+ c1 R( w& {/ K
*
4 J% I9 Z$ r: }% P& @6 { * This program is free software; you can redistribute it and/or modify
, d2 H' e. U1 k  P, K& u * it under the terms of the GNU General Public License as published by
" G$ w- ^  M) J' e * the Free Software Foundation; either version 2 of the License, or
4 `8 M/ D# A6 T8 r3 \& T% z) o * (at your option)any later version.
  h4 j% Z. r% j/ D+ n8 W *
& _# a6 c3 w& s7 j. v# B/ j; f * This program is distributed in the hope that it will be useful,
9 J& s9 H2 ]" @1 t( } * but WITHOUT ANY WARRANTY; without even the implied warranty of2 i1 q4 ?* Y  v
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 J$ v4 d5 F7 _" h- l
* GNU General Public License for more details.
- {/ j% ^7 k2 a  {- L: d *
5 E& }, i( u5 H- T6 D7 A& A * You should have received a copy of the GNU General Public License4 J, f' w: Y- g3 n$ w: m) S0 h
* along with this program; if not, write to the Free Software8 M. i$ l2 D6 l0 f- {. P, p9 F
* Foundati
  S1 a  R* w, a. D8 k" w*/
, @+ F  N+ `* M5 S#include <linux/module.h>
3 |' b4 U$ ~, r4 {#include <linux/init.h>
& }5 d! Y* N$ \! O, B& Q' Q#include <linux/errno.h>& T( Z$ J3 \! X6 C* M' A
#include <linux/types.h>! d0 y+ N4 j. q3 D
#include <linux/interrupt.h>8 t4 j% B. ^# ?9 B
#include <linux/io.h>, }' |4 V* `) o# u8 T
#include <linux/sysctl.h>3 g$ ^! _3 Z0 x6 M' d( a
#include <linux/mm.h>
/ @) k) B/ G0 w& ]1 X$ r0 L  [: c9 _" L1 U#include <linux/delay.h>
5 k8 Y$ Q) f- k# }+ B) Z. m  ~- p% ?#include<linux/kernel.h>
+ p  }1 F  u- V6 F, [. X#include<linux/fs.h>
  z7 d6 i$ i9 W2 T- L! B; J. Y#include<linux/ioctl.h>3 R$ z! _. [" n; U: t
#include<linux/cdev.h>
+ v1 y; n6 a! b, e0 C9 G#include<linux/kdev_t.h>, H2 d4 E, i7 D' _3 d$ O9 {0 G, h' x# l
#include<linux/gpio.h>
  L% i# D) v' ~#include <mach/hardware.h>
3 j8 d8 J; V: ?% A6 \/ o7 c8 Z#include <mach/irqs.h>  {/ J0 E8 ]4 ]+ }) n: _

! O* |2 S( ]0 Q#include <asm/mach-types.h>' d& X. J$ D3 Z  {* I4 R. U
#include <asm/mach/arch.h>
$ C# _+ d% S; s" i1 l- K+ Q#include <mach/da8xx.h>
! s$ f3 ^! X# E( J0 u! o#define  SYSCFG_BASE   0x01c14000- O; c0 h# x+ u/ `- K, R  t
#define  PINMUX1_OFFSET   0x124 ! U( p8 Y$ w0 @- M( H0 G" }; ]
#define  PINMUX18_OFFSET  0x168 / q/ v3 e3 |1 I* J5 `0 @* L/ s
#define  PINMUX19_OFFSET  0x16c3 B- A3 W) m7 T" K5 f
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR) p$ `  ~) g. z0 u! n
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR8 d. I! a. ^% |7 @% i
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
# X) U6 e* @- q3 B#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) z8 Q2 K5 ~( ^, Z8 u" a#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! ^! b' x" W! ~: j! z5 D                           
, z2 r& E4 o( k2 l4 h: h#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
) C; c, ^$ ^; O2 ?& b4 Y#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" B+ r3 l0 V3 Q# p% z8 R
//PSC
" F' t) ~$ M5 O# J#define  PTCMD_ADDR   0x01E27120  
4 \6 m; b6 j' [9 r#define  MDCTL15_ADDR 0x01E27A3C* {3 J% ?8 C0 X/ w
#define  PDCTL1_ADDR  0x01E27304/ @; w+ E0 \( d, \
//GPIO8 direction
! _* n/ B) X. M5 d/ u#define GPIO8_DIRECT  0x01E260B0( r4 z# A5 Y1 A
#define GPIO8_OUT     0x01E260B46 N; b- B5 N5 t/ L( b! d7 o$ D
#define GPIO8_IN     0x01E260C07 ?  j' w! C+ y3 m- o' A

% ^+ W7 F0 l% d5 ?//#define MCBSP1_RINT    99              4 D. r/ D$ Q- [# r0 Y3 m5 H
//#define MCBSP1_XINT    100  
4 F& X4 c) d, e! ]static int MCBSP_MAJOR=239;+ P% S7 Q  Q# g5 z
static int MCBSP_MINOR=0;5 S* L1 A" E, i* {; P
static int count =1;5 v  x' R, l$ C% j6 H! e& z
1 E" j0 P4 J* ?0 k7 C( Q( d  q
#define MCBSP_NAME  "MCBSP-device"
$ z! h, x4 b" M4 z1 v
1 f- y1 ~9 h5 G1 I& L$ _static struct cdev *mcbsp_cdev;
; h% \  j# x9 z/ hstatic struct class *mcbsp_class;
' ?, Z' o: e# d$ G+ {0 wstatic dev_t mcbsp_dev;" J$ L- j% R0 ~# a: s" e
unsigned int DRR_data;3 c9 P) {- J5 Y# |
unsigned int DXR_data;. ~7 h' p: Q5 @: \  |+ Q0 R' [
static int mcbsp_open(struct inode *inode,struct file *file)- Q# T7 ^0 [7 j) @+ Y- V6 d/ |( {
{
4 z7 m3 l$ |3 `" \, o5 j/ i5 V8 v# K  a   - f; z2 E# O9 p1 @+ O! R
   //interrupt enable,initialized
+ t7 p- _9 e! _& @, o2 B+ M   unsigned int temp;( o  Z/ ]& C, `: X4 e; X" r
   //SLEEP_EN(GPIO8[10])---0* n! B  }; x, J- F& ?
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 Z( Q, [( }. Q+ g
   temp=temp&(~0x00000400);
" Y- V' {* B- P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ _7 }% e* ?$ g+ c( |) V  //RESETn(GPIO8[8])----0----1
- T0 e: I! `; E" I   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 N, v$ V  D! o1 [& @/ n
   temp=temp&(~0x00000100);1 P- \2 _$ F9 A8 W* y; Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% ?; ^- P! Q& U/ K0 P2 L# O- s$ A+ ~   udelay(100);2 B0 r( e  S, q0 L7 F( a
   temp=temp| 0x00000100;
/ x) q4 e1 S7 [9 F  U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  w; t5 k+ c3 H! C) Y' l
   udelay(100);
  I: B1 ?: W1 N' s5 M) s2 B3 s4 J   printk("open success!\n");6 F. d; j+ r1 r+ @9 {# d
   return 0;
: P. t% R1 p; ?8 l: m7 X1 R}
7 {0 ?; D% F! Q$ ~) I( @3 h# y. E  j) ~% p
static int mcbsp_release(struct inode *inode,struct file *file)* V+ C8 H3 \* `  X( {
{
. }' D) v: U$ v7 [9 ^! k" U   printk("release success!\n");% s5 y' E, a3 \3 D; l* `' I
   return 0;) J4 ]/ S, ?7 v/ M
}2 z9 G$ x8 y6 C5 e! P/ x+ |# `

8 N2 f) u7 O' u: K9 l) o$ |: bstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)5 |5 C8 ?5 G" I7 G; D2 @  a
{, V, d5 f( P' ~! N* j$ X9 }9 n
    copy_from_user(&DXR_data,buf,len);3 U7 ~6 C0 p: G. J4 h
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
+ ^3 a0 M1 r# T3 h    return 0;
6 m6 G* V+ Y5 q7 b% U$ Z; S # b; Q% y3 R7 _2 |( E. Z  g
}' y9 H1 g* O1 \4 q& F% O, c

1 L: L7 p+ K- _2 _static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)( q& O. i( f7 d& f( D
{ " o! d, n+ m% z
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 ~2 l* P+ g; a6 R, H) Y8 B' V   copy_to_user(buf,&DRR_data,len);
4 h# l. B" ~9 {& `! z   return 0;
, c$ e; H; ]) ]7 ~! P$ O}
( D6 q- i+ M" v9 h7 Q
6 @; Y9 e1 T! W1 b. S5 r# @
2 W& X: n; r3 U% V: Qstatic struct  file_operations mcbsp_fops=5 n7 E& H0 A: H, A
{7 j& J  c* D- T+ H! c; M
   .owner=THIS_MODULE,
! L/ a8 a0 ^8 I! l7 G   .open=mcbsp_open,
# g# q6 v# c: I) ]5 ^, H   .release=mcbsp_release,
4 B" J6 u: v6 `: p+ u   .write=mcbsp_write,4 I5 b' i; {! |. R% l9 |( T6 s
   .read=mcbsp_read,7 e9 A# u- K* }0 F
};8 C! Y1 t  _" u6 e4 p6 u9 m' A% {
static int __init MCBSP_init(void)# Q: B( T" ^# j, x- i
{
( e, ]' \4 l) A% d) N+ b  U; F   int ret;. \3 L/ H8 M! N4 {% b, l
   unsigned  int   PINMUX1_REG_old;9 r2 f) n, D9 G' y+ C0 L  M
   unsigned  int   PINMUX18_REG_old;
2 `* O! j% ^1 b: b& X5 U   unsigned  int   PINMUX19_REG_old;
* D" s! t2 }% n5 w' V1 Y: ~   unsigned  int   temp;  
6 V* |1 U- v5 z# a   if(MCBSP_MAJOR)
( z; Z1 y: H5 |/ e" q2 v" V   {+ h# O) y; i) q
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);: d& E: d5 }9 C4 u
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! l' m, }" d$ V9 {   }
5 U/ T7 c% ~# N5 S- ~   else
$ {2 F* \9 G! G' D   {
1 H. B3 R" V5 [: q- \      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" J' P: z* s- V, S& [* x
      MCBSP_MAJOR=MAJOR(mcbsp_dev);4 v- e7 f3 d/ m% y0 \
   }
: ~$ ^& `% w1 R4 I" ?3 M6 `. }0 [   
; U3 q6 t6 T& j# I9 x# U   if(ret<0)  f/ I7 i- D- Z  u/ m- L
   {0 ^  J' d  S. {% J6 a
      printk(KERN_ERR "register chrdev fail!");
% q% Z* ~/ R% h1 D+ Y- S2 ]      return -1;
6 k2 i1 u7 b# \& Y   }
9 r; ~' S  P. O. B   
# L% Q2 P% t. D4 M1 b( A1 O! q   mcbsp_cdev=cdev_alloc();
8 Q3 R/ {% g7 L" y6 Z' D2 n   
: ?. N* s6 I  _   if(mcbsp_cdev!=NULL)
, c  @: h) t7 k$ L2 o2 D( r   {1 k1 I) p. P$ n0 x
      cdev_init(mcbsp_cdev,&mcbsp_fops);7 l2 W0 q* k7 N* {3 C8 d# z
      mcbsp_cdev->ops=&mcbsp_fops;) u' _) _; C/ {8 P3 e. v6 @
      mcbsp_cdev->owner=THIS_MODULE;
& I' _/ K# G, T( J5 t      / Y7 O. Y. l' A& @9 U  R: T
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( U) R* P1 }' x+ ]! r$ h) {" o# J
          printk(KERN_ERR "register cdev fail!");! a0 y* Q1 F8 V5 o5 E7 a% N; v, u1 W
      else
$ S( z4 m, V3 R8 c. p5 e2 z          printk(KERN_ERR "register success!\n");* u* g- o1 S% u7 x1 Q, q3 D
   }' W) s1 Q0 H% s7 U% t
   else1 |: p& g6 j& R% F( _5 M7 ^; l8 |
   {  w! `+ ~1 l8 d4 @5 F2 c
      printk(KERN_ERR "register cdev err!");
, O- y2 _, [" [) I      return -1;( I9 f2 Q  h/ w% q
   }
8 u8 c1 X6 N! P" c" H8 o   
9 k! b/ O3 W8 f3 ~' D3 b# ~  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
% [9 l' C% O4 ~) i, b   if(IS_ERR(mcbsp_class))4 |& a& u8 ~: h  B5 p( [
   {$ Q% D/ i& u- w! e. t9 ?
      printk(KERN_ERR "register class err!");
3 \) r1 k8 p, h: h8 c! b5 y   return -1;4 g% f' O, u$ f' U
   }
' l, ?0 d) ^8 f3 H9 N( c   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
4 |2 J% w" I. m( q; V+ r1 H7 l7 ?# N
   //PSC
1 y3 _& k$ a3 f8 [   //add Enable MCBSP
1 ~3 x( H1 L* }   //test3 t5 f# l# ?3 {) e
   temp = 0x80000003;; }! {3 J- Y' }+ _9 w$ s( B5 F6 R
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ b; X$ L  ^4 ?   temp = 0x00000003;
' p! k8 m- G2 t3 G9 \   writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 F/ v* e5 Q4 _- Y: b- T) M
  h' x: E/ E4 @) z   temp = 0x001FF201;
- [, m: j& Q4 z6 G( P: J! V8 X+ C   writel(temp, IO_ADDRESS(PDCTL1_ADDR));* b* `. W( r+ D) P/ @
   
4 I- j, ~7 L4 {   //PINMUX  
1 L3 _- ?" K/ H1 v3 T1 B0 D5 J9 T   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 U& C( g6 J/ f7 [5 q4 d   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
) i. W/ t& i1 ], @1 W5 V   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
% }2 e' q6 S& Q/ J9 X% W   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: p2 {5 F( f6 b$ u, c
   ( K. j1 c7 S' @! s) `7 m" `5 [
   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 H. J& H3 v8 Q! o9 K) m
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 P+ o0 _9 o2 X3 \5 g
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 \: j; K9 m  U  `; {  T) e   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# u( a3 g1 {3 \- z. s. p 6 m$ T- b! o7 U8 ?1 S3 L% [
   //RESETn,L138_SHK2
! g$ A/ v- L5 k! P   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  8 [1 C- }2 Y5 w# j* @) `- V
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   / G0 _; J* R8 [0 U8 _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ d! i# T9 y$ J9 V0 t9 M1 H3 O . l. M3 f( c9 T
6 _: I2 p: d! G. {/ W. D  Q/ Z
  //SPCR Register  @2 o4 ]# N* k/ a9 N: r+ l+ o
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  R/ O  t2 b+ z6 M3 d  temp = 0x03000000;//(DLB=0)1 a5 u( @; ~+ J7 _4 |
// temp = 0x03008000;//(DLB=1)) C2 p! o2 x5 @* R$ n
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset" ]; b  n/ C# X7 S7 M* O7 I) C. }
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 K5 W5 k/ x6 M3 B6 P7 V: X  printk("temp=%x\n",temp);
6 U. o2 Z/ g) h) J$ i0 | ( y! i5 ^8 @2 u# K. ^. Y4 M7 g
   //PCR Register
, {! F7 z# d8 M2 d7 m% m   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ {4 Z; t4 w& C5 ^  // temp = 0x00000F0F;
+ D0 b7 l/ K) ?, v) G/ j7 F" E  temp = 0x00000B0F;
+ M$ `4 `4 h; w  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
, \& X3 i! _8 w4 n  temp = readl(IO_ADDRESS(PCR_ADDR));/ b4 M" r. k/ y6 c6 P
  printk("temp=%x\n",temp);  ' T$ n; Z$ C( G' m- Q* R
   //SRGR Register; M& O/ E& P( m  e
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
# T- |: D4 b. z6 V( h' v //temp = 0x301F000B;
5 b- B+ C: B9 o5 {& {   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
0 }) P8 C! h) u4 Z  temp = readl(IO_ADDRESS(SRGR_ADDR));
( T( g8 u: V  T  printk("temp=%x\n",temp);
9 E4 @. e* d* _* W5 w- X  q4 Z0 r1 \   //RCR
# ]" i- P) b$ P8 U1 m# j   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% {9 ]; q- j% G' [0 P
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; D, `' Q1 r) u, h# v, t1 |   temp = 0x00440040;
7 X: k  i3 b; K+ Q/ e3 v' w   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   / u$ X# N& @  \& S3 o3 A, |
   temp = readl(IO_ADDRESS(RCR_ADDR));
# \$ E: S7 i3 B, K3 k& d   printk("temp=%x\n",temp);
6 ~! Y+ h5 R: b' D   //XCR: c" T3 a% y. O  i
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 B' m8 Z$ t6 ~" q: N6 {, O
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 k* b8 o: m8 m( w  Q4 V9 F   temp = 0x00440040;
+ D: j1 ]" m8 c- V8 }6 r( O$ u" _   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
" c* D) ?: F' f9 d   temp = readl(IO_ADDRESS(XCR_ADDR));4 Y: E& Q6 N) ^$ ?
   printk("temp=%x\n",temp);
+ V4 v. m: D( o. _0 X& }8 U  udelay(100);
. c" r/ Y: H- T3 W4 F" d: \  //SPCR Register/ D9 R% w8 N# d! K' P9 V
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- |, R# z1 @: X+ |4 n
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- ^. v/ w* `  K* U: n- C  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled* |" _, s! i& N9 l' ~5 z
  temp = readl(IO_ADDRESS(SPCR_ADDR));; U& s4 X; r# U" e9 e; U
  printk("temp=%x\n",temp);
) v* b+ q$ n" }: H% M& B2 V3 s  udelay(100);
; x) l* J$ ~) S( c. E$ K* M2 \0 v1 d" f7 w3 @' G, d
  //set GPIO direction
/ V; ^6 u/ c2 \0 \) U' u/ Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 Z& f2 V& `- ], E! X; g6 K
   temp = temp | 0x00000100;//EPR----input. v' q2 S3 M; u7 U* v
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( ^- D  Z, j3 T
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( s4 K0 H. A, F8 d1 P+ j

. I  ]3 f7 H# \+ ?   return 0;
, J& \; w/ o* g3 C7 f( V}
' Z9 a  s& A, M% e. estatic void __exit MCBSP_exit(void)" M8 ^3 y7 k7 T- ^  L
{6 E1 d" A2 v! w5 q
   printk("mcbsp chrdev exit!\n");
# V+ k+ o/ c  o. J/ g9 l, y   cdev_del(mcbsp_cdev);( |0 s9 S& s- t( g
   unregister_chrdev_region(mcbsp_dev,count);
& }: v+ T7 M. |   device_destroy(mcbsp_class,mcbsp_dev);
: u8 u- Z" E* M3 j1 @   class_destroy(mcbsp_class);7 t7 i" f, B3 `1 n* s5 G$ b
}4 w  S, Y& ]- O7 X+ Q- n
module_init(MCBSP_init);
5 B$ H9 y- |5 g+ m* o  Amodule_exit(MCBSP_exit);
: x; U- {% B0 E9 n8 q) M4 o: P1 H& l+ o) u
MODULE_LICENSE("GPL");6 R$ ]0 w; m# S1 O" j. Z+ y( P. d, i

5 ]. U7 Q6 g$ }) w+ N: ]/ h2 P我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 f3 F4 d6 k- q
我的应用层的测试程序如下
* u0 O! M8 ?' N& s+ e& R6 D8 {#include <stdio.h>
' Y7 e2 g1 \# O* }#include <string.h>
4 H0 q9 v, p" X. A8 W; b#include <fcntl.h>6 k6 b* P2 C6 v8 U, [3 E
#include <unistd.h>
+ D6 S+ j! _; O: G  D; C2 u#include <signal.h>
) a5 @+ N9 ^/ B- p8 l& ]#include <pthread.h>       //线程
  K! B; X# w+ E/ s* W7 C4 H1 ~#include <stdlib.h>
/ |0 k, Q+ d$ x/ L#include <pcap.h>          //捕获网口数据! f' _: g" o+ V- v( _
#include <semaphore.h>     //信号# c# o$ q3 @6 C: i: i% k
#include <sys/types.h>     //消息对列
3 \  p7 P  i. A) x4 ^2 h% G. d: \9 H#include <sys/ipc.h>       //消息队列
9 E) j0 t. `2 R( t* a#include <sys/msg.h>       //消息队列
5 X3 }+ @) j. W' @#include <sys/select.h>& z5 h/ Y. ]+ A
#include <sys/syscall.h>4 h, K0 Z+ O  h' ?
#include <sys/stat.h>" `& `  o3 j) @" Z
#include <sys/mman.h>
; g$ A7 W  m/ n( B( w5 S- ?& G#define msleep(x) usleep(1000*x)" ~4 m/ X' {% M6 p& M7 t
! |" c6 v9 Y; i
int main()
% e  l. g; i9 m, P& u. {{ 8 K9 ^( N  S; m; P
    //MCBSP,ARM与AMBE2000交互设备
3 q, `9 B: s; v/ ]+ ~5 w9 s# \ int fd;5 x( C/ [% h% N% {+ [* v, G- j6 _/ j9 T
unsigned short data_write = 0x5555;
- x/ a* W! e( K1 a unsigned short data_read = 0x00;
9 m- a9 B+ {' P/ c/ |* }4 ?  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 H1 o9 `6 |- o: X
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: }9 _: l. [) P# p1 F8 |
   
1 w, ?) b9 l! v, {  if(fd < 0)5 C/ `/ `# r4 N7 |
  {6 \) ~$ x% G' K: i5 a  j' x
     perror("open failed\n");
# [6 O6 ^4 b4 v- l/ Y     return -1;
  G7 d) Q2 r# f  }
) G: a% D; M3 Y4 Z; g( G8 E$ S) `  $ `2 H0 F5 q. w2 t
  while(1)8 g2 C2 s  w/ ~+ Z
  {; n$ [1 V8 c) S: L+ G+ R- S# t
   
' R& u9 @5 t, {3 s1 v# ], i   //AMBE2000每次读写是24个字为一帧7 x$ f5 U' n0 C8 b! p
   //写数据时将数据在底层存储起来,等到中断的时候再发送4 j% f% z9 G5 j7 D' |
   //AMBE2000输入数据是以0x13EC开头的
! D; ~: L  ?* S, W2 q   write(fd,&data_write,sizeof(unsigned short));
" k- a" t! P$ P' p9 Q3 v   
. ~4 R7 L) N& E/ f   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
. s2 f# {; W/ T0 M$ j   read(fd,&data_read,sizeof(unsigned short));
$ G1 O# K- s8 F: p( v* i, H+ |+ U   
  }3 e6 U* b% a! V2 s$ E   if(data_read == 0x13Ec)( D" ~( F: K" W' |* p3 {6 R
   {7 u) L+ X/ G4 T2 \( `/ p
   
! F' h2 r" u% P4 j    printf("data_read = %x\n",data_read);
" Z) z8 F5 B- O# r  t' \5 |4 a   }, s' X, ~  Y' ~& R( d
   
  I7 F* C+ `" r5 ]6 \+ l   msleep(10);# D1 l4 t7 n: N6 q  D6 N
  7 T3 Q8 X& T$ g4 b0 J; l+ {; L/ n
  /*
+ A0 K3 Q- W4 b  a: a   ioctl(fd,1);   
. |7 Z# i' ^6 H sleep(1);
* Y  N  _! J8 i* K% J ioctl(fd,0);; M& S' J' v: r0 w
sleep(1);. U* A' L$ V4 O8 A
*/ 8 s- D7 B4 y3 m3 v6 W( X8 ?
  }   
  K* `6 X: f8 r! @. g$ G+ d( ?; M return 0;
( o: ~3 t4 \& y, _, G2 v9 U" ~ # L  y. d1 F  I, }% N
}1 r4 E; F2 ^6 n$ D" q: h6 b* R

! a+ [2 r: u# J5 T. q. O多谢各位指教,谢谢! 急
$ Z8 }" }& E6 T5 D( t1 ~$ G; ^) Z) e3 _

- F! L" y9 K" H" G  ]
7 W6 r2 |( n3 R3 ?" R8 w: Q. h5 V/ R. a/ F! y* g

& R- h4 V1 Z* w8 [( K/ w5 M3 n8 R4 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 17:04 , Processed in 0.075412 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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