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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 C1 f! @0 ^/ V& G0 ^/*: F6 b; C; d9 ^5 z2 v, c% w% X- b
* Copyright (C) 2009 Texas Instruments Inc8 ?, Q+ d) t# E$ S7 K9 N7 {
*
- V" m/ ?% V# Q/ q8 y * This program is free software; you can redistribute it and/or modify
% [$ c- c; L3 V+ }/ S4 W * it under the terms of the GNU General Public License as published by
; v2 ?3 |5 S0 f# N * the Free Software Foundation; either version 2 of the License, or" x; f5 D+ Q% s5 X% N
* (at your option)any later version., q& u9 E0 p/ `
*
# E/ [2 `7 m5 g * This program is distributed in the hope that it will be useful,
4 a5 i' B- j; ]  D * but WITHOUT ANY WARRANTY; without even the implied warranty of6 D" |, a& O5 w" B2 ^, A( ]! @
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 n8 T3 B1 L( B" P6 n: K2 |
* GNU General Public License for more details.
+ B- ]5 a) ~3 t, [7 s5 G  i# u, R *0 k4 o1 ^0 C9 n2 M4 R, E- Y
* You should have received a copy of the GNU General Public License" s) @6 r2 f1 I1 o8 j( G
* along with this program; if not, write to the Free Software! n/ o( S; A# T+ K2 E6 r
* Foundati
3 G4 a9 K2 Q$ x4 k) ]2 G*/' I" H3 }0 r  A. O
#include <linux/module.h>
5 b. U- r4 q1 ?/ N. L# s. m#include <linux/init.h># [5 u6 E8 A. A, W: K1 u
#include <linux/errno.h>6 H: i1 u1 ]- n1 I- T* _! P4 |/ H
#include <linux/types.h>& A2 _% V: r; A+ r
#include <linux/interrupt.h>
& b1 M. ^' C: h$ G#include <linux/io.h>6 e! e- m+ @/ P: _
#include <linux/sysctl.h># p" t2 Q5 M- J" l
#include <linux/mm.h>6 h! S; h6 v! k# Y+ E4 V, i
#include <linux/delay.h>/ @* K9 ?9 W4 J( v" G& Q' p% L
#include<linux/kernel.h>
8 v9 f1 a* u" J#include<linux/fs.h>
9 D1 k7 O1 m6 F9 J6 |' n  C#include<linux/ioctl.h>
$ @2 a- x* s; N! K4 H#include<linux/cdev.h>
7 u( [/ o3 t7 \#include<linux/kdev_t.h>
1 {* S# ^$ N2 ~3 L#include<linux/gpio.h>
& L5 b) X5 p) z, p#include <mach/hardware.h>
  @, r' f) f% v7 c#include <mach/irqs.h># Z) o8 b$ A0 X  ~- a" m! P
4 E7 }: x: G0 z2 ?. P0 E$ j
#include <asm/mach-types.h>
% I/ p) u! s3 ], l$ \+ i#include <asm/mach/arch.h>
8 c: f5 i* e- e, V#include <mach/da8xx.h>
7 Z0 H6 [4 k  v- B* m4 |#define  SYSCFG_BASE   0x01c140000 l" f: k  D! @! d" {. E( i
#define  PINMUX1_OFFSET   0x124
& p# a8 ]% a7 A; ]* Z4 t9 k# g#define  PINMUX18_OFFSET  0x168
6 a  D- E2 {  }# p# v; x: {4 x#define  PINMUX19_OFFSET  0x16c
+ x7 S4 R1 K. t1 a0 B#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
  `% z7 N3 J( R#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
' p' l* p8 L) ~  g, n( I6 z#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 j! s. R4 ]. i# @. o#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 ~9 q1 e/ e% J: Q#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR6 w, z( N, z: ^' g& }, i/ c# A
                           
+ s0 c9 p' m6 j" `2 U#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
9 d& S) r3 w( y$ i. D) ^4 s4 K#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
; H$ z% h1 j3 l//PSC* Q+ a. w+ P" c9 k0 F* f" w
#define  PTCMD_ADDR   0x01E27120  7 A- p4 r$ e" W4 ]) w
#define  MDCTL15_ADDR 0x01E27A3C
! @7 G5 J5 ?& G1 G4 u#define  PDCTL1_ADDR  0x01E27304
# Z. k. ^3 k- h3 C6 [( ?//GPIO8 direction! O* [, O0 B! J! w
#define GPIO8_DIRECT  0x01E260B0
( k/ w  [/ l: ]# `' q# H#define GPIO8_OUT     0x01E260B4
7 m, M& N  ^( t#define GPIO8_IN     0x01E260C0' s* G0 y0 M& x, ]4 X; w  x( k/ C
" a- h3 o% w1 i8 r: |! l7 s' n
//#define MCBSP1_RINT    99              
& m  X% v: |- c0 Q( l5 t//#define MCBSP1_XINT    100  
' @+ Y& e- {5 pstatic int MCBSP_MAJOR=239;
" C3 ~$ V8 ~- B1 T0 R  E+ |3 Y( vstatic int MCBSP_MINOR=0;
: M* ?6 `& z1 ~! Hstatic int count =1;3 p* y. \! u+ C+ T' `5 A( q. u- x

: D6 y- f3 ^9 t$ [. V# I# Y! f/ I! a#define MCBSP_NAME  "MCBSP-device"1 E, c& E$ K9 G7 R$ o  o& p7 Y& p
0 y7 X9 Y3 q, q- d2 n5 y) k
static struct cdev *mcbsp_cdev;! ^( B! a1 X4 M) ^( l8 j
static struct class *mcbsp_class;) {  Z) d' E' b$ \
static dev_t mcbsp_dev;- Q) y+ {& X0 c9 f3 f- U
unsigned int DRR_data;
; k; f5 Z8 r  _4 Lunsigned int DXR_data;+ }) C1 f6 ~. f- M+ I& K
static int mcbsp_open(struct inode *inode,struct file *file)) |& U* B* D. P9 g, w8 {$ F- T
{: [& Y% O: ^( Q
   ) I) U( g% s7 x* _
   //interrupt enable,initialized  {& @0 b  J) Q* l4 o/ k
   unsigned int temp;
/ [' c& K+ _& Z4 i- j' i4 W   //SLEEP_EN(GPIO8[10])---0; j6 d0 |7 m* Q2 |1 _
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 E  q5 s: Y) i  M. H   temp=temp&(~0x00000400);
% ^# L3 _# b  I) v) T   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]  w$ `2 `+ C/ ]5 V0 S% M# O0 x- T" T+ _
  //RESETn(GPIO8[8])----0----18 q$ O5 Q1 P  g5 Z, _, M/ V; J
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. B5 P6 z; m! M: X
   temp=temp&(~0x00000100);6 c) `  d# `, w$ ~5 Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. x4 z5 R8 t9 R% \   udelay(100);- z5 {$ \3 t  _: w# G9 [
   temp=temp| 0x00000100;8 d* b0 D0 ~7 @0 U  k, F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ P2 H/ x" M. L. y) Q% H. [
   udelay(100);
6 p! s$ ]! X* B1 G' W. H" }- p   printk("open success!\n");
; {$ ~' Q. x3 `  S   return 0;% U4 _3 i( b1 ]( @) {; _9 q
}
; q" I$ s# U: K& Z6 w% j
# x# x0 v: c: Qstatic int mcbsp_release(struct inode *inode,struct file *file)" j  O5 P( P, d7 F5 i& k
{
6 R" ]. c2 o, x$ J+ y4 _   printk("release success!\n");
" _7 K3 E3 Y$ x! r7 `# X  _   return 0;
' f0 G; v. b9 q$ R6 q}' p7 ~! L7 S# O1 _4 ?! g8 v  j

$ P! k1 ?. q) v$ @$ astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
" [% ]5 t! A/ m# N. f$ ~+ Q2 p{
1 V$ H4 L' Y& O    copy_from_user(&DXR_data,buf,len);, p, Q( W+ Q' x6 I7 X0 E+ D
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       8 p+ K) N* {2 I6 L) G* Q, @
    return 0;
) G* Y5 f/ V# d$ @* ]
/ }1 f4 q  F1 ?9 v# P% z( E! N/ A}
. G  {0 m7 K) l% E
' Q% n/ M9 M5 \7 y+ B6 J  V/ T6 Vstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 S* Y2 r7 v# O1 e8 e, H{
  \0 k3 i2 r5 C; |; m   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));% c! m/ b) p, T1 i9 a' a
   copy_to_user(buf,&DRR_data,len);
. x4 @, M; H/ @8 N   return 0;
7 `: x; I( O& l9 y' ^9 Z+ G}8 n$ r& Z# Q* ?0 Q1 M* E; E

8 {/ r9 t7 x, x) E- \- T1 q* `+ D9 G7 ?& q
static struct  file_operations mcbsp_fops=
8 D) b- y; V& x$ \" E% t; b3 R" a{. }! U3 K8 |, ^* z# g4 J0 m
   .owner=THIS_MODULE,
! k) J  Y7 B8 T6 Z   .open=mcbsp_open,) t9 O+ y( e! V* t/ s+ n" J
   .release=mcbsp_release,7 p7 `& i+ k4 S( o8 _6 W3 _; t* |
   .write=mcbsp_write,
0 l3 I! T" ]0 I+ d5 C3 h, w   .read=mcbsp_read,! l8 t, [; p; `
};
% L7 B& [3 ~' {8 d/ D; kstatic int __init MCBSP_init(void)
/ ]% L5 D  t9 U- O{
+ m3 v! X+ v' F- q9 X! h   int ret;1 X* M* M' G, ?' _4 R
   unsigned  int   PINMUX1_REG_old;0 `. A$ |: _- Y0 C$ z3 E$ G
   unsigned  int   PINMUX18_REG_old;
4 H, Q, i' j# \+ S; O; q, y% c   unsigned  int   PINMUX19_REG_old;& f+ l5 {8 N' b; M7 H# L( k! X/ u( }
   unsigned  int   temp;  7 P+ k/ n8 f6 z- B/ n2 o9 r" e! O
   if(MCBSP_MAJOR)
( f# f- p, |* T% d: V' k8 R7 `% i   {
' v- E! w: G. K& T0 m4 d3 X      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);! Z4 F2 e& E8 g! d( t, x; [
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 a" `) K0 Y/ r; P. ~   }( d" V, Z' p  b+ d2 F8 T
   else0 f+ o. d6 p8 o# F
   {! o0 X( H! l5 M! _. r
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 }# J1 {. o1 L! j* d% V
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ c0 A, i8 [' X& n   }
2 k0 Z7 i% A& ~" D* i   
: e3 c. o; [% r   if(ret<0)
$ ^# L- d. y* d7 z! p8 W9 E   {
8 X& s0 ~+ Z1 A      printk(KERN_ERR "register chrdev fail!");2 I5 \7 Y4 c$ \  [3 t
      return -1;
7 \7 b. g7 [$ d% Q. R& V% \   }
* s$ A8 S3 }' n( |3 N   
' p3 z* S1 W2 o7 \, [' l/ @   mcbsp_cdev=cdev_alloc();
" I$ P2 B4 }" `2 q7 X6 G7 t   
# z# }9 h' J+ `1 M& h& G& s8 G   if(mcbsp_cdev!=NULL)
( D( K7 v. `/ O' F# O   {$ R' v7 s% e& `( r% P; r+ G
      cdev_init(mcbsp_cdev,&mcbsp_fops);
8 o) S3 w, T+ C! K; u      mcbsp_cdev->ops=&mcbsp_fops;$ d" B# w( r, x: T
      mcbsp_cdev->owner=THIS_MODULE;
! ?3 S6 A1 z& Y  W6 n; i( ^  T      ; A/ M( j$ J: @. K9 t! ^. R/ b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( D: c) _, W, N, _% ~/ x2 J
          printk(KERN_ERR "register cdev fail!");
& G5 f7 U1 m, p& k6 H7 P( e/ a      else
) s" I4 Q) E2 f3 l' ^" t, y          printk(KERN_ERR "register success!\n");" j: o, V; m- f# f0 ?2 i
   }$ i# p6 \4 H' A& d/ k, Y8 q# _5 R
   else
, }" r) O& ]1 T+ V/ [   {- O8 t; R- C/ c1 R
      printk(KERN_ERR "register cdev err!");" _' B: X& t* w! C; N
      return -1;: P. H/ J* Z. a
   }8 v; e+ E) P3 m% C0 Q/ F
   ( ~7 |. d. i  J) K
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) W! K' C/ Q0 ^0 ^3 q9 Z3 _
   if(IS_ERR(mcbsp_class))
" Z$ w! K  M+ d7 U5 }: D   {
3 j0 M6 K# w7 a/ j2 C2 E      printk(KERN_ERR "register class err!");$ B' M$ e& j' W& ^/ }, b2 z
   return -1;
3 t; t2 i' h1 P8 C5 x4 p   }6 g% [  h- s7 i, C  I  M# }
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 O8 v; m& w' b) }# a

" Q, R- D6 R5 C# t2 y2 a# c- h   //PSC3 I  }! t1 U' `* @
   //add Enable MCBSP6 S- H4 n1 x8 S5 j$ q
   //test8 F( p  Q* Y4 p* E0 ?# P* {6 m
   temp = 0x80000003;
+ d, w) M: s1 m; o   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ M. _- u4 Q+ y0 A
   temp = 0x00000003;/ J! Z* b$ c3 D9 n& V
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 u3 n$ d5 ]3 F 0 [6 Z. ~* `$ M$ l7 Y
   temp = 0x001FF201;: \* ?: u& b2 r7 C6 o
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));. y; u% Q; U- q6 T
   ! [7 C0 o! y2 g4 m" H3 ~
   //PINMUX  / B6 h" \. Y7 t5 g$ W
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
5 _% }  D) [$ X+ L5 i* g* O   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  : T, ]& J  k& ]$ c$ F
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
( }# m( }6 X# G9 H) p6 X   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- ?. b$ M) _8 Q
   
/ ]1 @" z* ]; x$ ]1 V) C   //SLEEP_EN,EPR,L138_SHK1,L138_RC& K4 D& B/ ?& ~1 v
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ) O9 }3 ]2 i% ?0 `4 |
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
1 ~5 G- G7 m/ X7 n6 [3 E- d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' ^+ E. f, L3 j5 r! }
& D! F/ m" T( V# Q; [
   //RESETn,L138_SHK2" n+ X& m; C5 z6 d. n  R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; Y3 g, {. _% }  A
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' G. k7 g( Y% S# \* M2 _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: D$ O$ k9 F8 b) J

8 X- _3 T( o+ p1 M1 u; \' g& o0 g 5 ]$ e9 `/ |2 p& V& y/ u
  //SPCR Register: {: w6 e7 L8 u& w) q# n4 t4 W' K
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) w, Y4 R; K7 p
  temp = 0x03000000;//(DLB=0)5 _( Z! H* }& k6 t# s* _0 t5 L  V: `
// temp = 0x03008000;//(DLB=1); Z* J# g. ?2 C& x0 L! n, U, Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset8 m4 ^3 o" k: H. c3 b! P  m
  temp = readl(IO_ADDRESS(SPCR_ADDR));; @6 T. Z; T0 J; e. W* L6 Y# ?
  printk("temp=%x\n",temp);
5 l# Q5 q$ a9 C! \8 _. H6 i; Y
* a: G$ w6 J2 t8 a8 K0 X* C9 {, J   //PCR Register
7 d# c  V: k* z) S3 B; N   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0( [2 ]2 Q  M# E) y% Y: ?. l
  // temp = 0x00000F0F;
2 t) ]/ `& A' a# w; X3 Y  temp = 0x00000B0F;
7 r& {- A$ y4 j/ O0 Q  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 6 p; U2 s& w# h; d; ]4 d& R
  temp = readl(IO_ADDRESS(PCR_ADDR));
  N, n- O3 y7 U- F8 o: |& k  printk("temp=%x\n",temp);  9 X) {. F+ |: T. W
   //SRGR Register
0 p  t( t" i7 ^. G5 Q   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 `8 Z! V8 W9 _! l5 M/ W
//temp = 0x301F000B;1 X6 M2 ?$ h& C* |, r
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ _! W. C7 Y$ \% D- W  temp = readl(IO_ADDRESS(SRGR_ADDR));% b' ^: y$ E# D% }, G/ n
  printk("temp=%x\n",temp);
6 i$ I4 j: O) |3 `  e+ \! }   //RCR! [$ L* C% R: A) Y6 G$ [3 f; d3 s7 ^
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,5 g9 H* g0 Y- c8 f# @( |
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0- X# U' B8 o) h3 B0 W5 T/ M% j
   temp = 0x00440040;
( c! g! e) Z+ p9 h   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 j, C5 U' \+ t   temp = readl(IO_ADDRESS(RCR_ADDR));
4 |+ a, A$ o2 J   printk("temp=%x\n",temp);
; m, T& g( v0 U* E   //XCR, t5 b% P3 s& q+ `5 ?7 _$ T
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: W: k3 X" I2 r; B5 J9 [2 ~   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
# O' j# u2 Z$ i0 f4 A8 V! u+ u' i: n   temp = 0x00440040;
. U  O7 e3 U* T. _. b: y! T5 m) P   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   7 ]! K$ c! I1 r# ?$ A$ g
   temp = readl(IO_ADDRESS(XCR_ADDR));
0 g6 h# m3 B% V   printk("temp=%x\n",temp);
9 G6 e& j2 Q) @" s8 R  udelay(100);2 ^( j/ X2 `0 i& {2 G
  //SPCR Register. a, i6 H6 m2 p8 R/ F
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; x1 U0 f1 D7 Q  R$ g! w) T3 y$ d  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" }. Q4 l8 E+ f8 [5 D. K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled* A/ V0 M- n' L) L, D
  temp = readl(IO_ADDRESS(SPCR_ADDR));$ |8 f7 T& _% X9 x. q7 Q
  printk("temp=%x\n",temp);3 j6 t, c! `5 ~: \/ Y
  udelay(100);
0 L# G2 z" `9 [- n/ z8 U$ q  d0 S/ d  ^: Y7 n8 N) I7 J6 z  w
  //set GPIO direction" W. W+ \/ ]' b! Q" J5 d
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; V$ E% \" \% |/ s% a# K; v4 t. i   temp = temp | 0x00000100;//EPR----input
: y- J8 ?% ]' ]# w- {; p   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output8 y' `. ^7 e* Q: f7 f# \- i9 D
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 W4 o- o  J; o+ Q
6 l, T/ G5 ~, L5 \  a$ U   return 0;
+ F9 ^" x( t' O# K& J! @}) C- N' F" T5 r6 t, K8 D2 O% ]8 Z( u
static void __exit MCBSP_exit(void)- `7 D) B/ O. M
{' M$ O" \! N/ N5 P" r
   printk("mcbsp chrdev exit!\n");5 B: w5 n  L! x0 ?0 O) h% y; X
   cdev_del(mcbsp_cdev);
/ F% c1 ?. Y& {4 j   unregister_chrdev_region(mcbsp_dev,count);
8 ~: a& r' [" L# I8 J1 x- s- V8 v   device_destroy(mcbsp_class,mcbsp_dev);
, M+ S, G- Q6 ]/ `( P   class_destroy(mcbsp_class);
2 {' [" R& k2 s3 U}
" c& ?% f7 u( ]& smodule_init(MCBSP_init);2 `6 X; k( @$ V# @
module_exit(MCBSP_exit);
+ B, G! o# f; s, q1 B" M  j3 ]9 L
MODULE_LICENSE("GPL");0 d* C7 m. s' H6 v) C# J6 D

5 y! }3 W; @/ A0 A3 w我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# Q$ D1 P/ d* o( z8 t
我的应用层的测试程序如下! E5 B9 T  q6 A) a% d
#include <stdio.h>
" v2 T+ G8 p9 Z' j! H% W+ H6 O#include <string.h>
/ s+ n% P, f4 c: ?#include <fcntl.h>: M4 a: O: Y) t3 _; p* p# A0 f" ^
#include <unistd.h>1 T- v! ^# n' x9 V; h( X$ d
#include <signal.h>
* u' h0 G$ o; e/ T#include <pthread.h>       //线程
) Q+ T1 q6 R3 @, F. i4 k3 f# x#include <stdlib.h>
) q3 a9 p( U& E0 F#include <pcap.h>          //捕获网口数据
* e2 |, p/ P0 q6 t9 G: S#include <semaphore.h>     //信号
9 |: Z# V. b, x5 r#include <sys/types.h>     //消息对列
' `2 _/ P; P8 t- g- h* X2 `#include <sys/ipc.h>       //消息队列
7 H7 C+ t& J2 b  H7 Y' e: X& E#include <sys/msg.h>       //消息队列* x: t( {- ]! o2 Z' K
#include <sys/select.h>
, W& D6 z. ~& E9 F8 J#include <sys/syscall.h>
0 S; t( t  o7 f6 E9 U7 s+ w8 u8 G#include <sys/stat.h>. j0 w4 ]$ v+ V( _
#include <sys/mman.h>( X$ ]. K2 h8 C1 L, d
#define msleep(x) usleep(1000*x)
- L  B' B: D, D" f7 g
! S  j9 k3 Y. B2 L3 [) O& \( Yint main()! D% h& o' X7 _- i1 s
{ ! N  L: J% s4 B; X; }
    //MCBSP,ARM与AMBE2000交互设备+ `4 ~: ]( B" ?% C. |' y! }7 L
int fd;
7 P* w0 y# Z$ o7 z% B unsigned short data_write = 0x5555;
3 `# w1 K7 g3 F3 X7 {( r# z unsigned short data_read = 0x00;. J: q) w9 P) j
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 X8 g( c$ D7 X% }; s
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);! B3 A9 Z0 `+ O4 v
   
, U1 N. L- a$ |, a. q; v  if(fd < 0)
% Q$ P! ^! z+ L/ i" ^5 m4 W" B6 E  {
0 ]/ `$ E3 O* h9 k     perror("open failed\n");, z' X8 s# ~5 b1 r: |
     return -1;
* i" Y2 L% _. V# j1 r  }+ A1 _/ a: e; w! p# f
  8 X" z0 l, ?! E
  while(1)7 P- v1 N# m( G" w7 c; A. d
  {, D6 e$ |: [% m- v' u) V
   
' R" A+ a  Y% f   //AMBE2000每次读写是24个字为一帧
$ m* h" x- |8 |5 G6 N* |' O% t9 S   //写数据时将数据在底层存储起来,等到中断的时候再发送. K0 h  J8 {$ h, C2 c2 O
   //AMBE2000输入数据是以0x13EC开头的
, Z( F1 W4 z; z2 F   write(fd,&data_write,sizeof(unsigned short));$ N$ N! W, c+ b) I; X
   
- h! T. F8 w4 s! l% h! ]   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  5 T2 ^4 k5 m) T* P
   read(fd,&data_read,sizeof(unsigned short));
! P  c& e; p8 ^( `: L: @! U   
" d; d4 R4 C% O# y7 a   if(data_read == 0x13Ec)
: s5 q+ h; P: F3 r5 J% y   {
! A# a5 u3 c; H: d& n) c   ! E& u8 T6 A/ ]# d- S& v
    printf("data_read = %x\n",data_read);
- S# o& }) ^0 N* ~- u  c   }: l( k& a4 X9 z8 M9 t2 e0 D
   4 z- ^( i/ z# `% S: |* m; V- v
   msleep(10);, y7 K! e: x9 b* C8 v( V! j
  & N6 d' W/ A# F6 v/ {
  /*& `/ V2 y: i4 K" a5 C: L1 {
   ioctl(fd,1);   
0 U$ U; x2 L/ r. N4 T sleep(1);, k$ f) |/ W4 d5 i3 l, e
ioctl(fd,0);
. J& M/ O( t) L! `$ x3 `3 G sleep(1);4 Z: D+ K9 _8 Q7 C; C$ |
*/ 0 G2 q, c, f1 F2 F9 N2 L' X; C
  }   
4 f8 }5 [& n# s; Q% { return 0;
& M  }3 f( {) v
) l( h! i" y4 x* u2 H- b/ a1 i}
0 b' f! J6 d4 h7 H9 I, v) F+ q1 h$ Q3 y
多谢各位指教,谢谢! 急
* [! Y7 M7 F; U. q$ t
& k9 `) Z7 {3 Q9 j$ q
. k. v* x& F# ?3 `! }& b
0 e# ~2 y5 l% U
/ W7 d& W2 l. k% ?$ ^
! w& Y, H. S% ~0 V/ |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 08:45 , Processed in 0.047485 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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