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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& n5 m5 D' V" W8 C1 l/*
" N" T& A' r, V9 e+ o * Copyright (C) 2009 Texas Instruments Inc
: o0 b  ]& H" v! Y- J" W *
0 a( o# s" L/ C# n * This program is free software; you can redistribute it and/or modify& N8 C( K) e6 }1 J' E2 h4 R
* it under the terms of the GNU General Public License as published by
! T2 v) L4 F, ~& u * the Free Software Foundation; either version 2 of the License, or
0 H& j  \: K5 V- _; `: L& z& s * (at your option)any later version.2 F; ]( c1 l. F  x6 t- a( `
*
# w& t+ _, H4 m5 U * This program is distributed in the hope that it will be useful,
6 k  |8 ?% h" Y: G8 V * but WITHOUT ANY WARRANTY; without even the implied warranty of
1 h% @7 [: i" @) Q! ^' o! i7 U; q" @ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" k" C4 z/ @9 ?$ N) \" D8 o* A * GNU General Public License for more details.
# L5 @9 a/ ?  ]- Z *
" ]1 D/ _5 `+ Q * You should have received a copy of the GNU General Public License
$ i$ d5 n% ^* G/ Z9 Q1 K7 U' a * along with this program; if not, write to the Free Software' t- i( g# H( j. f3 x& d
* Foundati
3 i! ^. {0 g9 j) J3 e( ^. }" S*/' f% n4 k4 z  s3 w1 u, C" F
#include <linux/module.h>4 ?6 ^2 _. B7 z
#include <linux/init.h>
, X. t0 t* W* ]/ x7 I7 H+ D* f, B9 u#include <linux/errno.h>1 R1 V( o! ~' G  n: H% j
#include <linux/types.h>2 _- B( |. J; W8 B, ?/ ?
#include <linux/interrupt.h>
  E5 T6 e8 m7 I: I+ B: m#include <linux/io.h>/ g: ]3 E/ s( T! a: K
#include <linux/sysctl.h>
1 U' k( P% u4 h1 O# p#include <linux/mm.h>1 A9 J: w' n( A8 E$ M8 C7 R. v4 s
#include <linux/delay.h>. q/ G( w) Q* @4 m
#include<linux/kernel.h># e8 }# G0 }  n3 J
#include<linux/fs.h>$ O+ ?- [* b; n! A/ D% o3 w% M5 \4 h
#include<linux/ioctl.h>
, G& U5 H3 W1 z8 r0 x' ~( |( q#include<linux/cdev.h>. h; z- |& M; @+ K) B, n5 V# A
#include<linux/kdev_t.h>
& p# m1 F3 Z$ c8 Q; f#include<linux/gpio.h>
) @" ^( k/ i* C#include <mach/hardware.h>1 j2 w! m* a9 U0 s! ~% y. k
#include <mach/irqs.h>
# \& O( j' |3 `1 Z2 n# G3 O- C' k2 z! B
#include <asm/mach-types.h>: R0 l# _7 c0 o4 ]4 X
#include <asm/mach/arch.h>- c% n* Q: q! p4 H- O
#include <mach/da8xx.h>$ |6 |  ~6 e/ m0 b9 e1 @
#define  SYSCFG_BASE   0x01c14000# |" M3 N9 ~; c2 v9 _( f
#define  PINMUX1_OFFSET   0x124 ; ]1 h' _& a  X6 b
#define  PINMUX18_OFFSET  0x168 4 s0 T1 J, u5 w' i7 Y. C" w
#define  PINMUX19_OFFSET  0x16c( @3 ]5 r) x) C0 h: ^+ V; B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: T  c, t" Z  u) I
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 E1 D0 i  E1 u. S4 B, X4 f
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 q6 O: ?8 Y' _- o4 w! U' l
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
5 _8 m* f; m8 \5 H5 p#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR+ k$ K# t& X" d8 |4 d. N
                            & g  \* o; m0 W( Z  |: q4 b$ w
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR2 Q& s  b0 X' F1 x! i! _
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 \* y5 m" h5 g$ p
//PSC
! |1 `# h. E# |( l0 N7 Y! K9 P#define  PTCMD_ADDR   0x01E27120  
+ f& o! b( ^8 a- }3 Q+ y#define  MDCTL15_ADDR 0x01E27A3C
0 Y- L! T6 j: P#define  PDCTL1_ADDR  0x01E27304: k( a$ e0 C8 F1 ]* U& Q0 I
//GPIO8 direction: X9 N$ W# x( d& o% ^7 N
#define GPIO8_DIRECT  0x01E260B0. e' [! r& C5 t' T# g/ A. O/ ?
#define GPIO8_OUT     0x01E260B4& r* b: Z3 U# `8 S) d5 a  j
#define GPIO8_IN     0x01E260C0
; {8 T0 ]& O# H( ?+ N$ l; @' i
% s) M1 m: L& }1 F1 _7 s//#define MCBSP1_RINT    99              / w2 |6 ?* U+ l. f. [
//#define MCBSP1_XINT    100  
) X+ Z  a7 j  t0 Y4 Ystatic int MCBSP_MAJOR=239;
" C! w" W. n% v# Kstatic int MCBSP_MINOR=0;
' N' k' ]0 \0 p) [, dstatic int count =1;
1 G6 ^9 I: k9 s5 E4 P1 |
  u  ]7 j. Q) V* L#define MCBSP_NAME  "MCBSP-device"8 R4 p5 ?: S# F1 i4 d% I  I3 u5 I
; F2 w: Q5 @  V6 |. l4 ~/ W8 b
static struct cdev *mcbsp_cdev;" Y' g' T' o* \' z
static struct class *mcbsp_class;
/ C. J# n, p- N' r8 hstatic dev_t mcbsp_dev;& V1 `" D( B5 x  G: c# `
unsigned int DRR_data;
4 m' B6 Q& q  Z- l  W3 Munsigned int DXR_data;1 b/ z7 h9 ]/ k; h
static int mcbsp_open(struct inode *inode,struct file *file)
3 v$ ]% ~1 N: t2 i{
4 h' i( E" L5 E& g   
% |8 k. _3 w) @2 z. B( ~   //interrupt enable,initialized# e: B8 j! t  s2 P0 Q* ]
   unsigned int temp;) `, b7 v  t+ Q% }* b1 D3 J( e
   //SLEEP_EN(GPIO8[10])---0
3 |. y; Z$ @2 G- ~/ j) Q6 K; O   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; P7 W- l! ]1 Y& g7 l* t+ Y   temp=temp&(~0x00000400);5 o0 J, A" {. `3 h0 Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! n6 ?  ?' k4 a
  //RESETn(GPIO8[8])----0----1' A2 M& |- a+ `# O. }
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ j' O  K1 e; D+ p9 p   temp=temp&(~0x00000100);- h- W# Y0 k) j3 M6 L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. ]; {7 s2 I9 W" }
   udelay(100);
# V+ ~5 F. F9 w" @* y   temp=temp| 0x00000100;
9 ^) x6 p. H4 C+ `/ m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1: O" X& S8 _, |3 ^- K4 T0 W
   udelay(100);
1 @& A. F0 {" z2 j/ b   printk("open success!\n");
! B2 N. ^8 {0 s2 S$ g   return 0;
: W* f3 ]2 t4 \}# S4 F6 M. n. l& Q, c3 b. ^
7 S% c$ m9 B7 _) a
static int mcbsp_release(struct inode *inode,struct file *file)
7 @$ h; j+ U: u! G# o; A+ f{
0 \# d3 f. h4 k  I" {8 g   printk("release success!\n");
  @4 U# A9 a# m8 m9 x0 _6 e4 s/ L   return 0;
; p1 {8 C8 H) A: b}' @# k6 g. Q6 \+ A3 U5 w
2 s5 m7 |2 t  j, [5 B3 Y
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
7 I2 A8 C+ D7 F" L{
( U8 C: e: r+ V    copy_from_user(&DXR_data,buf,len);
3 u9 o7 N$ s; E    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       5 |1 F1 \7 k# R! @
    return 0;8 K, j. ?2 ^: T3 I- ~) D9 F& F2 P7 @

2 H; z+ x9 e9 K5 \/ m}
1 ~# {$ m2 |% A" n3 h
; q3 j% ~4 k& j; x2 s* i, K! Bstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 B9 h: z0 G" J2 p8 H6 D
{
4 o8 Q0 ]6 t1 M8 P. a   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- `5 F, A. k, l& ~' C% s1 C   copy_to_user(buf,&DRR_data,len);
) d) b4 B, e7 @   return 0;
+ e: Z7 |, h+ \7 y' {8 f}
) `* Z2 P+ |! H2 Q/ M: H
" K" e) G% X  n& j- c: w' u: ?7 p: m' S, r' {5 Q2 n# Q3 Q
static struct  file_operations mcbsp_fops=
8 K* O- b' c$ x{, l; ^* U9 }# Z3 X1 |  M
   .owner=THIS_MODULE,' z4 P( g4 j6 N, C6 c. K
   .open=mcbsp_open,) g) Q8 v5 F: q  y6 v5 D
   .release=mcbsp_release,
$ H; B2 L0 `" Z' Q   .write=mcbsp_write," e) v' ?8 W$ [; F$ @' t0 i
   .read=mcbsp_read,
$ {2 z" h( C' L" m};
8 E! G  e, v% M) w; Y) pstatic int __init MCBSP_init(void)1 _# n+ d- N" @# F0 }! L! S. D
{
; N; r% B$ U8 t2 n/ M0 U7 ]8 |   int ret;4 y  _3 D* \/ I% B+ H- A3 x
   unsigned  int   PINMUX1_REG_old;
/ j+ E* j/ W3 n5 ]' z/ L! l5 U  P6 T   unsigned  int   PINMUX18_REG_old;
% E3 Z7 D, b% q, |* W- n   unsigned  int   PINMUX19_REG_old;
5 g! `* C# f# a. g( M. B   unsigned  int   temp;  ) s' C9 T9 a9 A  B$ ?, l( G
   if(MCBSP_MAJOR)) E5 K) O8 y6 f! O7 y  {) W
   {  Q* r' \! ]5 P) h; G/ O
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 ~9 h' _* t$ T. c- \      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 K& }* ?8 m6 Q# j/ z3 U$ R
   }
" ]1 g5 A! q, B& ~  T8 A6 J   else
4 O$ z% r7 `, A% w6 ]) Y   {
7 J6 ?; N; ^1 s, P8 k% `0 C      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- [" a4 w4 Z6 u+ N3 I6 f: j) _# W      MCBSP_MAJOR=MAJOR(mcbsp_dev);- }1 H' |5 K: n5 }" u* F' B# s
   }/ J. Q/ a$ s/ u& L" ~4 N
   
2 S. b  i( l+ Z5 ^   if(ret<0)
: d& G) K) E! ~! Q* Q   {
3 }  g! h8 f8 O      printk(KERN_ERR "register chrdev fail!");, s8 @! W9 U5 C! Z
      return -1;
; |( C! i) ^5 g6 B8 r   }
) s1 R( f# R  z" Q9 f   ! ~3 R% a) O8 \
   mcbsp_cdev=cdev_alloc();
4 \3 e8 G; |  }6 P9 r+ z7 h   
) E/ |9 F* Y# A+ T' K   if(mcbsp_cdev!=NULL)
- ~( y( l; r. S; G9 c   {7 |7 H+ }. Y+ M( X$ t% E7 Y
      cdev_init(mcbsp_cdev,&mcbsp_fops);
2 k3 q3 }- C1 X6 Z: [% O      mcbsp_cdev->ops=&mcbsp_fops;
8 A% ^1 _3 F/ S6 N1 e      mcbsp_cdev->owner=THIS_MODULE;
' Z! Q& k# x2 U      5 L& E3 s1 S  c1 {) D( j
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ v( R! T$ E& B
          printk(KERN_ERR "register cdev fail!");- ^3 |6 u0 Y9 b, o
      else2 }; G8 t9 ]' D( F) s' c
          printk(KERN_ERR "register success!\n");4 i( a& C) @( M4 V3 F& I3 K
   }
' j$ W7 `. ^' |4 H   else$ K8 l( |: u7 P* t
   {
* L" H) _/ Z2 O" v( `3 R' }      printk(KERN_ERR "register cdev err!");, H( j" E% k# H6 ?3 E: X  j' @, s9 {
      return -1;3 [& S& i6 _2 y9 w0 H- H; U6 `
   }
' g- \% z9 B6 z# C   
' t' K$ L& r$ }/ K5 B8 k# ^  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 n) q" k$ M6 r/ w6 y' P   if(IS_ERR(mcbsp_class))
, n# `5 p2 [1 b' ^" l! b   {/ q5 F7 n) |6 Z( a; G$ W( D& f
      printk(KERN_ERR "register class err!");. b, H' h' n; @
   return -1;. t! O# K+ \( f7 m4 @3 o! V) p
   }
8 w4 O1 [2 {) ~0 j   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
) Q2 A- l* w7 C% I% I# P7 K! Z: z: G2 S
   //PSC& {, B8 y$ |0 S$ ?, a
   //add Enable MCBSP
$ K; G& q: i3 v$ i0 @6 A   //test8 e, C7 K3 C8 [5 I; ]2 o
   temp = 0x80000003;
1 X! `8 _! _$ V   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ U$ y1 F( M( M) K2 E
   temp = 0x00000003;
3 Q+ z9 B- p0 H" t   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# B2 t4 ^' C6 F2 v  d
6 D- z; Z' v+ U   temp = 0x001FF201;* u# n- k, G& A3 l; j. @9 A* m. N
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));6 i/ ?: P' l5 Z5 h: f
   
. E- r( ^. W. F   //PINMUX  
6 R9 F' B/ b6 a8 s" `   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( C# E9 ?1 M# y2 B6 t& ]   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
8 e' ]. P& t% u+ q0 n9 U" P   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: f. o' D  A& J" y   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: d5 ^" ], z  Q! P
   . D/ s# P0 d/ F& G; t  Z
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
2 v0 e9 s3 |7 }. |; T$ q   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  # i& \& k  n) M2 e7 t( T
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" Z7 e* c4 ?$ v+ w. j1 t   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 t2 v4 g: Z) n/ w) }, |

+ y2 K0 n! M9 B+ i, {3 V   //RESETn,L138_SHK2# Z$ H; V  D% L) ^* w! V: _
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & K# T& T9 c7 }
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
. v4 f& z+ _2 L7 S( H   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ b' R$ O! \' z. D4 C7 l: } 2 j$ i9 k0 C4 w: U
5 Z) [! |2 }5 b& `4 s7 C8 ^
  //SPCR Register$ {1 m( [% l2 ^: }! b, Z) F! O
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 @4 @# d/ B( p! l+ p/ W6 \/ Y  temp = 0x03000000;//(DLB=0)0 H4 E$ z* p6 W  Y
// temp = 0x03008000;//(DLB=1)# d- ~; T$ Z+ z1 T- b3 B
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% ]8 @3 F" k# i5 Y7 `, Z  temp = readl(IO_ADDRESS(SPCR_ADDR));, l1 r# N- E, ?: L' T' W
  printk("temp=%x\n",temp);" ~" z% ^- ]& h6 t% S* I0 K2 E* I; ]
0 M1 d+ p8 u* k7 W$ M$ }
   //PCR Register
" O) ^& J4 T5 H, B0 O* u   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% t, x" ~* f' y( ^% L. }3 s9 T  // temp = 0x00000F0F;$ m' P# v. W) ~* T$ S) A* e  V
  temp = 0x00000B0F;
! w6 o8 h  a/ X5 z& |  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
7 Y) W; l! ^9 E! a  temp = readl(IO_ADDRESS(PCR_ADDR));! n- k" U7 Y2 s4 N
  printk("temp=%x\n",temp);  
& V% @3 H( |( p" I: c9 e9 B. ]) n   //SRGR Register
  a' V# [( y' d  V6 K9 M   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
  R4 J; L. A( ^9 D1 J# A //temp = 0x301F000B;
- r. L, G- J# x/ E; i0 a% B   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized % T. M+ m2 C5 K& P
  temp = readl(IO_ADDRESS(SRGR_ADDR));  ?1 ^1 A7 B! d5 |2 j5 ~
  printk("temp=%x\n",temp);
6 L+ N* ]+ F. S1 L0 g! @' F% x# Z   //RCR, ^; d" n1 {- o/ c2 K/ g
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& c8 o$ M' k3 V" k3 C* j   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; a! ]% B5 [) h* `+ N$ N   temp = 0x00440040;
8 l/ k8 j- H# q* u2 y3 ~   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & v( n; a" i3 k
   temp = readl(IO_ADDRESS(RCR_ADDR));7 a  `& S3 t) ~# A- w% |
   printk("temp=%x\n",temp);
0 ?# H4 H% E  C& v8 r  d- O/ k   //XCR
. [; P& D$ o: s& J$ w: I4 d   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ R' R8 H* c* L( Q( m+ ^# g& M1 C
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ k/ j) J2 B  p% \/ G2 B- w   temp = 0x00440040;. E6 t* T5 U/ U
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
- i4 g' I8 f9 T* Y8 R* w" o   temp = readl(IO_ADDRESS(XCR_ADDR));
# ?8 h4 M! w+ o: V+ }8 j   printk("temp=%x\n",temp);0 g6 S) n! M: g: v  O
  udelay(100);3 ]  R7 U2 `6 d& F* Q. H) m
  //SPCR Register
4 H- e* u" m) P0 l8 z  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 Q" z. H, E' V5 ?8 t- v  temp = 0x03C10001;   //DLB = 0 VS DLB = 15 C8 l% H6 Z! }  O/ q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled# W6 V+ s+ _$ L& {, t/ r1 i
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ _5 Z) }! e: U. B. ]0 Q  printk("temp=%x\n",temp);
0 N5 ]; r8 Z; S7 P: i, X9 `0 g5 U9 ]  udelay(100);6 i% F) v+ T9 L
9 P# w7 {  ~8 K4 K- o+ i
  //set GPIO direction
) j, A9 k% Y; v* ?+ U# ^% |   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* |2 T+ X4 E' I! n
   temp = temp | 0x00000100;//EPR----input7 u( ^3 u( I$ n7 D
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% V/ H" }/ d" J/ N: a8 B1 m$ l   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ h9 A- {9 R" }" b: |9 a8 W

# t) d1 r' i3 R+ g$ B   return 0;# y" F# {& A1 B9 e- _
}' c7 ~7 Q; J$ r+ P6 |  c3 T
static void __exit MCBSP_exit(void)
1 E2 f2 t. U7 D" Q{
4 x* [. \/ a; e1 N2 s& p; N7 U   printk("mcbsp chrdev exit!\n");/ Q  X% U% \3 V' k% Z
   cdev_del(mcbsp_cdev);
& Q, z9 e: ~+ o/ O% p0 s. G# t5 O9 n   unregister_chrdev_region(mcbsp_dev,count);# i9 ^+ Y1 l% ]/ T
   device_destroy(mcbsp_class,mcbsp_dev);/ ^1 w; U% \4 f; Z( {& V9 s' C
   class_destroy(mcbsp_class);" X# ?$ M$ }. k  G+ L/ u- c3 w
}$ i5 V1 N8 z# C) h
module_init(MCBSP_init);7 w) b2 J, a# c8 _/ J3 C9 h
module_exit(MCBSP_exit);
+ _; X/ T' o) {. I+ e* e; @, P/ J$ K: K) Q( V( k# q5 O, m
MODULE_LICENSE("GPL");, p/ i' P% `. G5 v0 f1 u5 g9 h" F( A" ?

% i1 Q& |! D# x+ C/ T5 U我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 }' G9 W" q* K7 T) w
我的应用层的测试程序如下8 y6 i& z  v9 n) p3 r7 f
#include <stdio.h>
+ \- N/ n* C8 _" V  r#include <string.h>
, [: D! j& X; B- V' H+ t/ @#include <fcntl.h>
3 |3 p" z8 T6 u# `/ o, b#include <unistd.h>4 f, s- H' o* V7 {* D4 }$ K5 W
#include <signal.h>5 o4 X7 Z6 D5 d5 u( x6 J- Q
#include <pthread.h>       //线程  s. k/ I+ G' P
#include <stdlib.h>
5 N6 ?: i7 E. d- Z7 d#include <pcap.h>          //捕获网口数据# x, I1 x6 X$ W6 X; j- q
#include <semaphore.h>     //信号
+ x+ X% [/ A( X& f- p  ~#include <sys/types.h>     //消息对列2 \% u. ~, c1 k
#include <sys/ipc.h>       //消息队列! R/ G' r" }" T$ V8 N
#include <sys/msg.h>       //消息队列, c5 e- l6 {6 j4 m
#include <sys/select.h>
+ A! F6 ^% g/ }# [' W" ], \7 v3 u#include <sys/syscall.h>9 }5 p6 Z6 L8 }! U; b! M; C
#include <sys/stat.h>' ]( D4 Y+ R6 }; d
#include <sys/mman.h>
# r4 X4 L3 v. d#define msleep(x) usleep(1000*x)
6 x8 L: H3 L* O9 Z7 K6 k3 r" q. I+ I4 z8 ]2 t! d0 E. @
int main()- @* W+ {( X5 Y; K3 ?5 c
{
0 G6 ?+ D8 q; G9 Y$ M! _- H    //MCBSP,ARM与AMBE2000交互设备% N. [' y/ d0 _" Z  w
int fd;" P8 b' c- O/ Z9 y3 R5 G/ P
unsigned short data_write = 0x5555;
8 m9 Z# W. u8 U8 S unsigned short data_read = 0x00;0 l* l6 G% I4 m' B
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);' h6 u/ @* ?1 @
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# W. \+ c) ~& _: l) ]+ X   
( K2 A2 L8 N1 y( h0 H  if(fd < 0)
+ @/ S& E/ `; l& Z# v  {
6 q8 e$ v1 \( i2 O     perror("open failed\n");
6 K+ F5 f- V5 d     return -1;$ q0 J7 b3 v; z( g7 _9 s
  }+ b. U: p* s* Z+ `1 m
  
  }9 M$ V6 d0 A1 ]2 U  while(1)6 A" B, x5 @5 P
  {
& X  R6 k7 }5 M2 l( o, N   
, `2 R6 y0 Q0 k' j" Q   //AMBE2000每次读写是24个字为一帧
& E8 X& @0 d: K: @   //写数据时将数据在底层存储起来,等到中断的时候再发送6 K* V5 @* w2 D; r& R6 O0 a
   //AMBE2000输入数据是以0x13EC开头的0 t4 G6 \& W* |% R# H9 I3 M
   write(fd,&data_write,sizeof(unsigned short));
# Y3 i9 L- W4 J4 @1 C   
. V% C+ h! V2 B: X# ]1 y7 q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
" @# `1 r5 s# u- n% C  W* G   read(fd,&data_read,sizeof(unsigned short));! b* b9 r1 z# J" Y8 N; L: F
   
$ `# b7 W1 b* d8 D   if(data_read == 0x13Ec)" C. h; l; q, F" U, E! _4 W4 b
   {" H" g: {$ ~+ q7 X4 y; j0 [) Z
   
8 l8 ]; d8 _  ~. H    printf("data_read = %x\n",data_read);
" N$ G9 z9 u2 O6 W- a1 H+ W3 m4 m   }6 s* n! i3 b2 G6 ^* ^6 t! H
   0 [3 ?6 S6 V: ^% \0 Q' \
   msleep(10);
; Y% l( J8 `1 M  6 F; V4 t9 I% b* ^: U* o  Q  z
  /*( c1 q2 Y$ f7 p5 N. N, G
   ioctl(fd,1);   
0 H9 z9 Z7 q# z5 j sleep(1);
1 F3 b) w( _' E5 [6 E ioctl(fd,0);2 L8 |0 _. z6 F
sleep(1);0 K2 W! z& F2 G" K5 M
*/ : @5 \2 B/ d7 y! I7 q/ M& P* n9 M+ Z
  }   ( s/ E/ W& T) k% q* e5 I
return 0;
( J% q! \4 H+ C% u
% b4 |) M* K. Q( O1 n5 i}
* `0 A# s' R( v: Z1 I" v& e- l" r" Z4 y3 m8 e/ h( X
多谢各位指教,谢谢! 急
. o! l; @# P) K: J; A! u7 h
$ M" S7 [( Y: G( V7 |4 g# l
# M+ y: ]" L6 T. J
5 h( ~- h' o0 q7 J* s
2 k+ S: N/ @; ~' Y' B5 m9 Z5 P9 i
: _9 k: \0 {/ X, M2 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 21:54 , Processed in 0.048337 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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