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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' s6 d8 d  O# X/ R
/*
2 u; G7 ]! h; W. {! z& r% f( M9 @ * Copyright (C) 2009 Texas Instruments Inc6 l" P; O1 M1 o7 K2 U4 O
*
: k& E8 _% s1 ?( @6 f" a1 f2 A  _ * This program is free software; you can redistribute it and/or modify
) W5 n# l5 g. s+ B5 M9 ~3 C0 g * it under the terms of the GNU General Public License as published by! B( H7 ]# c. C& U3 x' U- Q
* the Free Software Foundation; either version 2 of the License, or
4 X+ H7 g0 K1 Z3 f' `5 ]9 y * (at your option)any later version.
% y+ |1 z# H" |9 k! I+ e) a *4 C9 F- {! p8 I" d/ f2 n
* This program is distributed in the hope that it will be useful,( n$ f- p6 A* u7 w* b
* but WITHOUT ANY WARRANTY; without even the implied warranty of+ _0 F* y$ X$ P
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- {. l4 `* `9 z8 i
* GNU General Public License for more details.
! i$ b- G  Q; f5 r1 l. t) V0 n *' N# M) i. F: M/ b+ B
* You should have received a copy of the GNU General Public License; I7 x: |  r9 K" d
* along with this program; if not, write to the Free Software
) t: a' Q7 a& A8 Z8 ^( _2 @0 [; ^ * Foundati# @7 q$ }9 k2 H9 r  `( A5 ]  u) s  q
*/
" g! J  l- F9 k  ~7 y4 k* H1 R#include <linux/module.h>$ m% X5 l" S+ w* @
#include <linux/init.h>0 J) P! U, C+ C7 D, S( O  }0 ~
#include <linux/errno.h>
6 H* X4 I* p: J2 T9 v#include <linux/types.h>
3 M# y; _1 p  @# X4 y#include <linux/interrupt.h>
: O/ L- k2 w/ [' Y/ ]4 j# R#include <linux/io.h>: n$ Z. L2 C. U
#include <linux/sysctl.h>
* G. s" O. R7 `6 m  N3 A#include <linux/mm.h>
+ }9 E2 J) L! }* q2 G#include <linux/delay.h>/ |' }, _6 V& k% a0 P' }
#include<linux/kernel.h>* T: b6 X. `$ P8 B7 o
#include<linux/fs.h>2 V) P( ~# A4 @, Z
#include<linux/ioctl.h>$ x1 B4 x! t# Q5 S& M- e0 h/ ]
#include<linux/cdev.h>: ]( k0 d3 B& N. ], D
#include<linux/kdev_t.h>
. `0 O; [* y  P4 f, E3 P, Z' d#include<linux/gpio.h>
1 y' h" h" |. D" g#include <mach/hardware.h>
( e, G  t4 J- E% b% H6 ~* K( Y#include <mach/irqs.h>
  N3 o/ N, o" E! Z' Z; r7 ^0 V+ T% E- b& W& j/ h9 J6 P
#include <asm/mach-types.h>
" H' V& W0 {- X5 }0 p" I; c# [/ f! v#include <asm/mach/arch.h>0 I, r. K( x) c& j+ y) ~
#include <mach/da8xx.h>
% W+ b: O* U0 a- S+ _! I#define  SYSCFG_BASE   0x01c14000
9 z, P* Z& @; E5 Y3 [( n. ~( I) `: @#define  PINMUX1_OFFSET   0x124   _0 _4 b# ~, y$ x
#define  PINMUX18_OFFSET  0x168
( [. g, g9 t2 i- |  D" S#define  PINMUX19_OFFSET  0x16c: P4 k2 C; T- w- z9 G2 M1 L
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
( O7 z* I, s" O. b#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 v% F# {& @: q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( F; Q9 A0 f! P9 N: B& Q2 j#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
( v! z* g9 ~  y+ {9 j9 i  o7 y#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR5 n7 E$ R3 k7 u4 c8 C+ A/ L1 p. t
                            ' N* O: z9 p6 A+ V) x5 M
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR; @' N2 B5 D4 a# @+ I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 o$ P0 r" q  p2 r4 m. s5 H//PSC$ E+ z- l9 H$ `( d
#define  PTCMD_ADDR   0x01E27120  % |6 s) @& L" M  u& {' C/ m
#define  MDCTL15_ADDR 0x01E27A3C
2 O, p* Y$ b" O9 R#define  PDCTL1_ADDR  0x01E27304
! q: I2 N+ u2 R6 }2 {% T//GPIO8 direction
- {: y1 b. k) ]' a2 ~4 S# Y#define GPIO8_DIRECT  0x01E260B0  n% r; `; M# x# a# l" G# W
#define GPIO8_OUT     0x01E260B4
# x; v9 J1 M" o3 O" W9 e#define GPIO8_IN     0x01E260C0
* Q3 Z: |# M' K& A. M
) x+ ]' u4 f) J1 x& Z6 A//#define MCBSP1_RINT    99              
# x- ~0 P' A2 h4 d+ r//#define MCBSP1_XINT    100  % T4 ?9 i' c. m
static int MCBSP_MAJOR=239;: ^- ~5 J! \6 Q: T0 {
static int MCBSP_MINOR=0;, o  a  N; G! p2 T0 E( G$ P8 p
static int count =1;* h4 F* o$ z5 X6 e& S& p# X) O
$ v1 B2 Q" N( e+ K
#define MCBSP_NAME  "MCBSP-device"% u/ z+ c  b8 r( ]( F+ l

9 E/ }2 l6 B- N, ]- Estatic struct cdev *mcbsp_cdev;1 W  l. T% h1 ]$ N# L
static struct class *mcbsp_class;) |2 ~% T* L7 C: A
static dev_t mcbsp_dev;5 k- Z5 n3 m- @
unsigned int DRR_data;
- K% S: K% j9 aunsigned int DXR_data;3 I: M/ r4 O. E
static int mcbsp_open(struct inode *inode,struct file *file)
" U2 X0 {. ]1 I' l0 @  h3 K2 `{
" h1 x4 [! D+ C5 L   
1 e  V8 p# i! F) B7 m" D: k   //interrupt enable,initialized
0 R( _, A% s# P! c/ y   unsigned int temp;
/ Z9 T. T2 }$ |) r% E$ x" @   //SLEEP_EN(GPIO8[10])---0
! j- u- u7 |6 {; _$ V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 E5 \! m" Q0 v  x$ l* A  z- W
   temp=temp&(~0x00000400);4 N1 h  |( T$ u* p; M
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 R) w% w- `. v7 b0 a; z
  //RESETn(GPIO8[8])----0----1
  m: R8 v4 D' j# B+ Z. f! O* c" Y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# H+ P5 \  _" }$ P
   temp=temp&(~0x00000100);
7 {  G% g" w4 w5 M2 k1 P/ g0 q8 v( ]   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. b( E+ _" D& \* O9 d; _1 B   udelay(100);! p, _0 u. G) O+ C' I( A
   temp=temp| 0x00000100;: X0 t9 H' ~- Q, S  _  y' ^1 h
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' R0 X0 z2 k5 x   udelay(100);
% A& O5 V- ]0 p' a9 d   printk("open success!\n");
* Q1 b+ {" b* O) c   return 0;' D/ r% @7 @) K- C- {3 L
}
  h5 n; M+ A7 D/ v$ q5 g
: ?& n7 i8 W: d+ K* O' F5 q8 jstatic int mcbsp_release(struct inode *inode,struct file *file)% @6 {4 Y% S/ O$ x/ q
{
7 |5 O& O2 l& J8 J3 ^; T   printk("release success!\n");
& V5 Z7 P. z2 O1 y   return 0;5 H3 J9 C( Z0 b& ~7 R. {
}% N5 c  I: q3 W7 I

; g3 H# N5 s+ y) E3 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 f/ Z: d7 y% {; c; N! x' R# w
{
  j- o, j# h% ~/ ]    copy_from_user(&DXR_data,buf,len);
! e7 o! m7 m* f4 D2 [    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       & A% S$ c2 p( X
    return 0;
7 m3 ~( i9 ~4 X; O6 O1 L ' h8 m2 Q" v6 g( c
}
0 u. f- Z4 o5 {) Z" y9 J# R- |1 E
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 A: K7 p1 v# J; v{
  n" @2 s* u4 ^   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# ?7 ~7 H" D. }8 r* n   copy_to_user(buf,&DRR_data,len);
( v8 p: ~! A8 ^2 k- d9 b. Q   return 0;
, @5 Y: ^! A& o' r7 U. \}! U; k( ]. h5 `

+ x3 h& q9 Y& G" C( I" L% R1 c
9 k5 r! \* [3 qstatic struct  file_operations mcbsp_fops=
5 v7 m, a3 Y- Y! s& _, W% I9 \8 l{* V# v* j8 s  q; s
   .owner=THIS_MODULE,2 b+ P2 [% R5 l5 O) g
   .open=mcbsp_open,; `) s# B: z  J
   .release=mcbsp_release,% t0 U/ B1 V  j7 h* V
   .write=mcbsp_write,9 n1 R( u) u0 G" m
   .read=mcbsp_read,5 s3 h) c6 H1 r1 u' l& \) i9 `# s
};0 _4 N* j% \5 n* b3 r  V+ k
static int __init MCBSP_init(void)- s" x6 i/ x' [: `! w: Y
{
% Q/ U- P7 X* I   int ret;/ `5 U% l$ n7 D  T( W% k
   unsigned  int   PINMUX1_REG_old;
4 {; a. T+ o; j! S& t; i( x4 A4 {! b   unsigned  int   PINMUX18_REG_old;. ]9 x$ k7 l6 b& U
   unsigned  int   PINMUX19_REG_old;! X$ A) G! m" T) u/ r6 R
   unsigned  int   temp;  
- _1 R# _& U1 [: @+ y   if(MCBSP_MAJOR)5 C% T3 P# S% a* @& W
   {
* h/ O& I8 K: }& }4 c/ J      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& }2 M1 W$ c% a) S3 u0 p
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 g& e- R7 {1 u2 @
   }
; K8 y" i# w+ q$ ^3 F0 I6 X+ Z   else
$ Q& K" n8 V  H& D! K6 v+ M6 E   {) S  N, ~3 l* \. B7 \
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 N' N9 E# ^* \
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, u5 b7 C2 e% n& B+ a" w& i   }/ v4 O: T! |* q7 d( b# q
   
# T0 {: @" D1 `+ G/ Z   if(ret<0)
% K- m6 X" Q6 j- K   {
8 O7 G2 G: Y; K1 ]/ B- t% S: H' [      printk(KERN_ERR "register chrdev fail!");
! Q" e" G* ^- }6 Z. B& B      return -1;, N1 O! a5 V$ C: U; C' K
   }: i$ N4 D, S2 E) G% I* U: e. g
   3 n$ F" }1 t- @3 S( [1 j, |
   mcbsp_cdev=cdev_alloc();# ~: p, _, w% e  D% t
   
2 C& C  l/ o2 L: I% V6 K   if(mcbsp_cdev!=NULL)
! R4 x" \" ]% L, k   {
9 B( O4 w2 {9 U0 T- ^) X      cdev_init(mcbsp_cdev,&mcbsp_fops);$ |4 Z* C# m# P, G  W
      mcbsp_cdev->ops=&mcbsp_fops;2 X- K) J" U/ m2 t
      mcbsp_cdev->owner=THIS_MODULE;
9 e) I6 W9 y& V& m; d$ Y% X0 E8 n      
7 l4 o4 `9 |. r' s: i1 G      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% K$ c) n& @  G7 z' |
          printk(KERN_ERR "register cdev fail!");
  J' C" p7 }3 W- i( K6 g; W& r- E1 a      else
8 ]- G4 R2 ?: x9 w  }( \          printk(KERN_ERR "register success!\n");
" f+ Z& B; Z+ ^5 |. o" I   }
1 n6 Y' w* y+ G/ N9 l   else# h2 D8 w: K1 \, h+ G. Q
   {) B$ {/ \% D; y1 u
      printk(KERN_ERR "register cdev err!");( r( R, D; Y/ e8 |
      return -1;/ M$ o) O3 r% g6 T- S4 L( t
   }. k7 D, o) M: ^' v+ }' j& c; R! ~. R/ A
   ( S: Q$ w8 w6 m# k4 k
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; G) \8 p1 }, v
   if(IS_ERR(mcbsp_class))
5 \; u! q0 u9 \) W. Q4 q3 G5 P  a   {
( v( e* j- k( k  |" w6 M; g; H      printk(KERN_ERR "register class err!");
6 s1 ~% b4 x  v+ C5 g/ [   return -1;
. `/ N1 t4 ?: H; @% h  V   }2 p1 n: l5 g+ B; \1 G/ z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 E% p$ x+ A' P9 L0 M4 y
6 E3 \9 F6 d0 |! {8 a/ O/ f' X: k2 M
   //PSC6 f# J; `9 B5 |. e) X6 P
   //add Enable MCBSP4 `' H+ s. z4 v* H* `- s
   //test
9 ~& F) ?+ q$ I6 Z   temp = 0x80000003;
) K. w, Y9 v; C1 c   writel(temp, IO_ADDRESS(MDCTL15_ADDR));2 u" x% k- Q+ W* I. P4 S# r# H
   temp = 0x00000003;
! n6 I5 T1 ^. m$ ~7 U* q$ U( ~   writel(temp, IO_ADDRESS(PTCMD_ADDR));, E% j! E" W# g/ C) h$ v

& W8 i5 G6 ~6 V# T8 }" U   temp = 0x001FF201;
/ f) P  S4 q. F   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# P$ u, |% p  K+ b) N1 D     b% o, I1 ?3 a! @7 U0 q* i
   //PINMUX  & ^* L3 v" P: E+ i! y/ L8 T. W- s' b
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 M- X; v$ W: g3 j8 p7 E. G
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ z  V5 R$ J* Z) n1 t7 q
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! T  E1 E" X3 u; Y6 b2 R
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ O# @/ B) K/ E% n  x   : N9 T% k+ y# S, a2 G$ f
   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 i7 r4 K7 z. P, K9 z- ~
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ! S6 G' y7 z$ _3 s4 [
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;     l: ~; |: f. S+ G0 M) h5 g
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: e( Y  l) o; w3 a8 S ' A5 B: P8 Y/ M! x; F) l& n% i- e
   //RESETn,L138_SHK2
+ {& J+ e3 |# z4 d; O8 t& v& p/ w   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  1 n$ F; P7 ~. i) ?7 O- m! s
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ! x1 Y1 E, N; x
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& E- B& v* C$ r

% q$ C8 N, U1 E1 W# j3 [! X $ r' r6 X  \7 m  O
  //SPCR Register3 ?! V9 y/ L4 f4 l# F1 |9 W8 U  O
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 F+ g& E% D# @6 x5 c5 @, A
  temp = 0x03000000;//(DLB=0)" n; a+ k1 i8 G& N
// temp = 0x03008000;//(DLB=1)) G2 F8 Q' f" o% F+ K) u* y; t
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset% M6 K+ d( {. |- r! O* W
  temp = readl(IO_ADDRESS(SPCR_ADDR));
; [" h* m& }( ?1 k4 _+ H  printk("temp=%x\n",temp);
; _+ D$ H5 x6 Y : F) |$ x9 V) z& _* F, q
   //PCR Register* r% {. f4 V; L* V
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 p1 G/ `8 l5 ?( [6 \; O1 e* y
  // temp = 0x00000F0F;
3 w5 o1 y( \' K5 k# @  W4 h  temp = 0x00000B0F;
; J9 b. A' P9 q4 C9 T6 b# I2 N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 S4 a' A  R3 [1 J% k" x% U8 ]. \2 t  temp = readl(IO_ADDRESS(PCR_ADDR));2 M* H7 \( M1 A1 ^# H# A! m% S; Z4 x
  printk("temp=%x\n",temp);  ' h0 z9 W5 P1 K# P2 t% D( ~% s3 i& X9 r6 M
   //SRGR Register
& @, L& ^1 _' Y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: m% V3 q9 N7 x, S# r
//temp = 0x301F000B;' W& p) _# m7 l5 ^7 ]6 h
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
# Q$ F! Q% U+ o0 m8 ?/ d/ t  temp = readl(IO_ADDRESS(SRGR_ADDR));
: f- C9 ^. i- t  printk("temp=%x\n",temp);
) C! `7 D: ]+ U2 w   //RCR, R8 K( v* i  Q) a
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 ^$ K$ c' r# S   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0) G7 n2 N3 e1 V: q  Y5 P
   temp = 0x00440040;
% g0 w8 a! E4 t4 H# g9 {* b   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
/ h4 n) c$ Y  o   temp = readl(IO_ADDRESS(RCR_ADDR));
) r1 `6 Q/ L' s   printk("temp=%x\n",temp);
$ d& w) y" W0 l/ C: T5 B  s   //XCR
  s" O9 l" R  y9 t7 N: U   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; }1 `2 ?+ _, T4 Y) ?
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) P1 }" h. U+ h   temp = 0x00440040;
1 p* K$ o6 J5 T* e. P. u' D& P   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : s6 \# i( k# p# f6 p* R, u
   temp = readl(IO_ADDRESS(XCR_ADDR));
( y8 Y4 `6 @. Y9 _; K, I8 i! D: M8 Z   printk("temp=%x\n",temp);
; M2 |, [& |) ]4 H  udelay(100);
! h, b- V- A, L, I  //SPCR Register
2 U3 Y5 Z3 ^8 R6 ^* t+ D) I: q  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-18 q) n6 `5 ~" V% x; h- B4 S, Y1 X3 ~
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1- W5 m$ F5 J; J! w4 u  y* v' v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled9 Y- p1 c" [/ O, C
  temp = readl(IO_ADDRESS(SPCR_ADDR));+ T$ ^2 D* x: Z. _! K$ `/ l- m" j
  printk("temp=%x\n",temp);! H% r- R2 N: M4 _2 m
  udelay(100);
1 y/ J" E& ^" \$ O; X2 @2 R/ u
% R' e+ d2 M; T- }. M) T  //set GPIO direction
4 R$ k. {% P0 t: \; O6 K! w   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( a# f8 `) C8 k+ _' [   temp = temp | 0x00000100;//EPR----input. A5 B( q, @* w! `6 d* H& A
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 c6 I/ q# B# B5 H* i) ~   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : G' P$ W6 R+ F% ^) z( n
! ^: }+ p' y: s/ U! [5 l
   return 0;4 x3 h8 m* x* N" O7 {% u
}
1 K* ]+ F" E. u9 M  L6 Mstatic void __exit MCBSP_exit(void)3 i- v5 ]7 w' E; t, c
{
! q& f. M; ~$ A   printk("mcbsp chrdev exit!\n");! Q8 v9 S2 M4 Q. g5 C6 A
   cdev_del(mcbsp_cdev);
! ]0 f6 K1 x4 N. g$ q( l1 i: F   unregister_chrdev_region(mcbsp_dev,count);, c9 d1 S0 F3 V" P; a0 e& \, t
   device_destroy(mcbsp_class,mcbsp_dev);
9 m9 e  b$ x( @0 g( ?   class_destroy(mcbsp_class);$ S5 n& [( O3 X; }& e/ o( V5 ?
}" u) U: \' i9 a1 ~9 T
module_init(MCBSP_init);
" b1 v) S# e( ]- Vmodule_exit(MCBSP_exit);
3 g" d3 n; w# ?) ~0 e+ b$ w. c
. o" R% }* e0 E- C3 pMODULE_LICENSE("GPL");2 [' F% {' G! V" y7 M' L+ R

. P5 |: M- g9 n- f我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 D3 K! z4 ^, K, J
我的应用层的测试程序如下( b# a1 Y. i8 Y1 {
#include <stdio.h>/ s, K5 e2 g% z% Q% A# a. A
#include <string.h>, K  g! H- s& f9 {5 w1 L6 W& N) n
#include <fcntl.h>+ \0 T( Q& M3 E+ P( u: _
#include <unistd.h>
" W# F& d6 n1 H9 f' E' X; S#include <signal.h>
7 U+ e5 K( h$ ]0 k8 w* D#include <pthread.h>       //线程- p; N% a# J; W5 X/ D) J* L+ q
#include <stdlib.h>
5 m9 ~* }' r( ^) s#include <pcap.h>          //捕获网口数据
9 s+ I& Z& Z1 H" X- G! D2 \! M#include <semaphore.h>     //信号- m# J1 t1 u& M1 N. A
#include <sys/types.h>     //消息对列* a( J9 U3 ~( r3 o1 H: s; B
#include <sys/ipc.h>       //消息队列
' v0 P7 h, A9 P! j" ~#include <sys/msg.h>       //消息队列- H( m8 A6 E. Z3 k9 z/ ?$ l
#include <sys/select.h>( F9 B  w9 s2 x, d) X1 d
#include <sys/syscall.h>
2 W7 P# U3 s  Z5 l, X#include <sys/stat.h>! v8 G. d3 v' m/ m+ K
#include <sys/mman.h>8 T' x+ ~/ F+ v: H6 |% o" v
#define msleep(x) usleep(1000*x)
5 m8 x; ]' J! u! E; B
4 B( u% h) x/ `int main()
  j6 C1 y  E. l{
- O( b9 f( O& A3 \- e( P3 `9 w9 A    //MCBSP,ARM与AMBE2000交互设备
6 J' @" A& ]7 }' Y9 G9 u2 v int fd;- s: {$ z3 ]$ h9 r8 S7 D) ^7 m: w
unsigned short data_write = 0x5555;3 D1 a3 j/ d4 W7 |# ]
unsigned short data_read = 0x00;- @4 w# A" u' ?1 e: I
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# P& ~/ x# [) _ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ F/ O: F% g5 v
    # t! M8 N, }8 i/ e% Q5 V1 o
  if(fd < 0)) l$ J' l% n: g  A4 x. K# l- L
  {; Z' q9 C1 V. i" l, Q8 D+ _
     perror("open failed\n");! A5 w, ~! {' t
     return -1;- e, v  f' t7 w, Z5 X4 Z- Y
  }6 v( `" R9 I6 O$ l9 g
  8 Y9 v# u! x) e, B) t- }4 Q1 J
  while(1), e6 ^' f3 Y8 E, D' H- t6 l5 Q5 C) L
  {
( ^! W) v0 F  O& `% \7 p1 m3 z   ! Y* `( r8 T4 y# L6 s( U9 U
   //AMBE2000每次读写是24个字为一帧
7 {  {$ w* F) o: p7 g: r   //写数据时将数据在底层存储起来,等到中断的时候再发送' K, w! D% o6 @% `3 Q' p9 m( b
   //AMBE2000输入数据是以0x13EC开头的  M% R; s$ r$ W! M9 O7 Y
   write(fd,&data_write,sizeof(unsigned short));
3 n1 q4 ~$ m* q( Z& L4 w; u   
" p' G1 Y" Y" V1 h- V; Q' T   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
& [2 o% E$ A0 C  H8 m& M   read(fd,&data_read,sizeof(unsigned short));
+ U; H( X0 W+ G9 t   1 e( y" j( v% z3 u; F
   if(data_read == 0x13Ec)
# l3 ]0 X, A7 @& ~7 Q% E   {+ Y# O1 b& T* U# M8 Z' i
   2 ~, w$ q1 x$ E3 g5 P
    printf("data_read = %x\n",data_read);  g3 C8 G; B+ u8 p* {5 H
   }1 R3 M# t5 v. x6 a
   
5 N' g  i  v$ q/ ?% n- k0 I   msleep(10);
! G& M1 l( N# t/ q  N: g  
: A  O+ |# p# ~- I. ]. i1 ?  /*
! _  C4 m9 M; V   ioctl(fd,1);   * U: B& ~5 O! V% e. R4 a
sleep(1);
/ U% m- U: g. O% `1 o ioctl(fd,0);; u: A5 x9 h; }% I/ B
sleep(1);
6 b# M( U- W2 g* w, c0 J+ e */ ( b) W0 K6 {4 w" m
  }   ; h4 s! r$ u2 [2 F, }% o
return 0;
. }3 T1 F! g" p3 z
* u. i! p' R" X, X7 L}  r8 L- P) T) @* ^; H; @' W

! ~  M0 V/ e% u* R多谢各位指教,谢谢! 急, B$ C8 O( O+ m8 s( z( Z
+ N* Z3 B" Z. T

0 a( r3 [4 P. s3 Z, u$ Z, m' ?- H* ^; U7 Y2 H2 d

+ _$ ?1 u/ I: ~; e
) i3 k+ _: d+ p: v/ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 08:51 , Processed in 0.050185 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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