McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& v- j- R# G2 {+ ?! h/*# [; |! [/ A+ K
* Copyright (C) 2009 Texas Instruments Inc# q' R5 l, y7 p% w9 J. P( P( O+ C
*
; O; o8 }  w( p% z; D9 ~ * This program is free software; you can redistribute it and/or modify8 S6 K6 s+ W  z$ F7 s
* it under the terms of the GNU General Public License as published by3 x" T5 y) ?3 q# `7 C5 Q
* the Free Software Foundation; either version 2 of the License, or* E- Y6 Z9 l4 ~* p& n* \1 @! g0 i
* (at your option)any later version.
2 h" ?1 k5 ~6 `/ g: a: f *( i1 e1 h' h1 ?8 d3 `& g+ l  a
* This program is distributed in the hope that it will be useful,+ ]2 r/ `; D' n9 P, `
* but WITHOUT ANY WARRANTY; without even the implied warranty of
! p9 E0 G; x2 M7 e5 c2 H& h * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 ~1 A5 g, @# b# J8 X$ _
* GNU General Public License for more details.
; W) N+ |5 N7 L, I) t% ` *8 j& V- @; o$ k  _/ r- b# I6 S
* You should have received a copy of the GNU General Public License" l% f7 U+ A4 c0 w
* along with this program; if not, write to the Free Software3 g* p6 H. e5 T6 G! u3 Q' a
* Foundati6 ^( [8 a* t' v0 `+ G
*/. \) Z# L3 R" h3 R6 f
#include <linux/module.h>
6 \0 {; \* g( e/ ^, h) L#include <linux/init.h>
: \' ^) J) ]' k) N) q4 P7 V#include <linux/errno.h>
8 W* g' I; l$ `0 t; |( ^#include <linux/types.h>' @* n: r0 B4 c' A
#include <linux/interrupt.h>1 {, ^+ E# _6 x! C& Y/ {; d
#include <linux/io.h>3 k2 q: P+ a7 T. K2 ?! U# r, `' i
#include <linux/sysctl.h>
! @* c8 U4 w2 Q% c#include <linux/mm.h>
" c0 H5 E3 G( o7 _2 v+ x#include <linux/delay.h>
5 J9 C9 l' u* V. D/ E5 L7 u#include<linux/kernel.h>
8 C$ M& t; {' J* ~; a) ]#include<linux/fs.h>
) J8 H* O: s: h9 ~  l7 o' W#include<linux/ioctl.h>
/ f- q: B; W/ k& O- D) o#include<linux/cdev.h>: P! W( [, [0 S, I1 Q
#include<linux/kdev_t.h>1 L- a+ g  y+ Q$ k  i
#include<linux/gpio.h>( X+ m6 }. J5 L& a4 D
#include <mach/hardware.h>2 @6 }6 {2 s/ M1 T; i5 u+ H( p$ m
#include <mach/irqs.h>1 U# z( {2 `2 ]4 q

5 _- O0 C9 y6 v" L: s#include <asm/mach-types.h>
. f0 S: W* m+ c, O( ?5 m5 B" j#include <asm/mach/arch.h>
% Q* a7 a: z1 s" @" W  V6 P#include <mach/da8xx.h>0 Z$ _$ g& y) Y$ |9 N! z
#define  SYSCFG_BASE   0x01c14000
9 l' m. F$ z8 e; z) r#define  PINMUX1_OFFSET   0x124 # T' }  r0 X) S/ x& m; e2 b
#define  PINMUX18_OFFSET  0x168 + m$ Z+ D& H. c4 i
#define  PINMUX19_OFFSET  0x16c- N# p" q' n0 F  N. o
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
. v/ Q/ @+ C! u! U; F! J3 N. l#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
1 j& D" v. `9 c. h3 Z7 R. t#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: N  C2 W9 {; E  w1 m
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
5 c0 n9 ^: a6 `8 s#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
& |, n5 L" u. B$ E% P- H" l. V                            1 ]( Z! B6 B. t; Q4 A: g
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR! Q- |0 |3 z  C3 Z, C7 Z8 u
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
* Y: \3 C+ J! r6 y8 U: j& P- O& Y- H//PSC
6 T: B5 Z9 @6 n- _! M9 l+ b0 K#define  PTCMD_ADDR   0x01E27120  ! `/ W  f& z6 k( F$ d" U0 Y
#define  MDCTL15_ADDR 0x01E27A3C
7 J8 p7 ]. o  }' ^  f+ f8 M#define  PDCTL1_ADDR  0x01E273045 M$ q9 b: O) L# T/ y" W; V- h
//GPIO8 direction
: ^. \5 n2 ~, K5 ^8 B#define GPIO8_DIRECT  0x01E260B0
5 t  u7 Y! M& _#define GPIO8_OUT     0x01E260B4$ q/ v# |# Z" w! q' I) r5 L
#define GPIO8_IN     0x01E260C09 k- E7 u9 G3 ?# g2 G1 R
1 m; G+ W/ q5 O  N
//#define MCBSP1_RINT    99              ' E9 Q# H; n, x% S, v0 B  Y7 _
//#define MCBSP1_XINT    100  
: u: C9 I% u2 m1 c8 ostatic int MCBSP_MAJOR=239;
- |: z  T+ Z& R" ?  D8 x# Gstatic int MCBSP_MINOR=0;% m# a/ t) l2 v7 F1 t, {. C
static int count =1;! \" v1 l) b# ~

/ s) Q+ f% `& C7 Y2 t* |#define MCBSP_NAME  "MCBSP-device"
) |: K3 q8 E, d, U
1 V6 [0 q: O8 V3 v* Z5 {0 zstatic struct cdev *mcbsp_cdev;
9 Q& M; Y6 c, \+ Lstatic struct class *mcbsp_class;
7 T$ l$ n) s3 F/ Ystatic dev_t mcbsp_dev;" f! X5 {& i. d) d# j
unsigned int DRR_data;
% o! ^% e+ `( C& e( [- sunsigned int DXR_data;; k" g, s2 t! a' P! P( @
static int mcbsp_open(struct inode *inode,struct file *file)
  s( y5 A3 m2 A# ^1 q{  L: Z" e) e% g, L# O8 k
   
% _6 o& F3 i4 A6 {& Z   //interrupt enable,initialized& ?' a1 x8 [) p
   unsigned int temp;
% M6 M4 p& x  W, E" B   //SLEEP_EN(GPIO8[10])---08 A0 t- V& O7 ]+ }/ O
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 \& d" @' p4 w+ a9 d& f* K   temp=temp&(~0x00000400);9 u* W- k9 Q5 N) C5 a; i3 N  @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ V! i) o/ J! K) O( j6 [; X. A- M. m& u) k
  //RESETn(GPIO8[8])----0----1
% T8 i6 y: o3 W/ ^- E' }( v) l5 S; O   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 U7 u! ]# k4 m) j8 c  K1 O6 W
   temp=temp&(~0x00000100);
$ ^6 @( F) j+ n! x. F9 @1 B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0$ P1 F) e7 w5 w
   udelay(100);
; u) ?7 K" \2 A4 \5 F3 w   temp=temp| 0x00000100;1 k7 T; j9 Y) |( Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ {) i9 c% j9 b" K; [   udelay(100);
1 R( d* F' V5 z, r7 r4 g% |  U3 k   printk("open success!\n");8 }# y2 G$ E( q# Y" h! s; F- T
   return 0;
2 }! q6 M1 ~* d/ i  e1 d5 \}
: e( O: Q: s' C; \$ @: v* r- X( p9 U' Z. h
static int mcbsp_release(struct inode *inode,struct file *file)
) S/ W% \9 m' N6 z/ x. W3 e6 `{
  X; ^0 M4 H/ T, D+ j* a- R   printk("release success!\n");
0 j2 m/ y( ?; s6 {8 k% L& y   return 0;
; X$ }- N  l, @* X4 [6 l/ R}
. @6 ^1 B/ a4 R! p6 q- G% `$ L" }  G, e) w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)5 E# C# y1 N% m! f
{
0 W/ l: s: T* G- I5 _    copy_from_user(&DXR_data,buf,len);
) N7 ?$ s, [; J! {! d+ c/ K. P    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
1 D) [" V/ `2 x% M" j    return 0;/ o% N2 T, q, {. {  G) c

& v: d. O' w. G0 Q3 \/ m. W" R2 }}; ]0 C* T/ {& Z% h$ x0 U* h
; f, i8 q- M7 f6 i
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 l2 L) T/ g; a9 Y/ z* X, U5 f: ]{ ' L: C+ `3 B- b' Q  v6 V, @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) i4 X  p5 w& a. [' e' F# k   copy_to_user(buf,&DRR_data,len);
) K. l8 y  Y$ D   return 0;
$ N3 n" i( x- n. Z" ?}
6 W2 l- J$ B$ J% ^# h# ?9 w1 ?, g5 ~6 `, ~; }
. l: v0 Z0 c0 C1 L+ l
static struct  file_operations mcbsp_fops=
% h; x$ x* E; M1 w2 z{
/ R* [7 M1 z2 b6 K, ^# h, X8 s' ?3 t   .owner=THIS_MODULE,
0 J' [0 g% p- Y" b   .open=mcbsp_open,1 N, G7 x% r/ z6 B* [* h
   .release=mcbsp_release,/ p4 M0 L/ P) L$ U( j: W& q! @
   .write=mcbsp_write,
: E0 ^0 g1 A3 ~$ X3 h7 {/ b   .read=mcbsp_read,2 k4 X* `. r$ R) s/ ?
};
  E# y' n' W$ X; c; bstatic int __init MCBSP_init(void)1 Y; Y2 T7 b) K$ r8 K  X6 }
{
# K5 u( j& G$ d6 @; |" h   int ret;3 z6 O- P) ~9 B, v2 I- i9 T, y: y
   unsigned  int   PINMUX1_REG_old;
- n+ J$ B5 o3 s   unsigned  int   PINMUX18_REG_old;( Z; ?( A- B0 V2 W& w, C" j
   unsigned  int   PINMUX19_REG_old;1 ~9 Z  `. L0 g
   unsigned  int   temp;  - u0 }3 G3 e% V& G9 ?
   if(MCBSP_MAJOR)0 w8 Y9 q1 I. X
   {
- @& y8 r: Y$ P7 k) n0 I* o      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 y$ X0 g; e6 p! L( O
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! J- M% x% Y& N4 f# x3 c8 C' A
   }) [7 I7 K. ?+ n: N
   else) f  J# [" ~, P7 X% C9 `
   {
" M) y9 Z' G, I! z* Y      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 }0 F7 _0 q  l4 w
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
  p' Q9 }3 x2 Y! F9 T   }
+ M6 f' C& J8 x9 V   
5 o: F8 n2 ]* ^; ]2 i$ X3 [4 c7 q   if(ret<0)) J: e, u) n3 e8 R# B% e, S
   {
5 K6 y. y1 v- W7 f( D      printk(KERN_ERR "register chrdev fail!");) o9 m( ]6 \9 A" e6 \
      return -1;: q8 k3 Z& J( C- x% [
   }
% n1 U  |0 A- V, @. B. L   3 X) H0 B7 y; p; z
   mcbsp_cdev=cdev_alloc();9 O4 P- A) P  Q. ~( h0 a
   : W$ Z! v  c9 D& P+ ~
   if(mcbsp_cdev!=NULL)1 a7 ~6 X9 U1 H9 C
   {+ W; F" R4 z% }# r5 E
      cdev_init(mcbsp_cdev,&mcbsp_fops);0 T: b: X) f3 h4 d
      mcbsp_cdev->ops=&mcbsp_fops;
$ N" p, I# C  x% y. f1 x6 c      mcbsp_cdev->owner=THIS_MODULE;0 }: R3 D0 x8 A& c3 J1 z0 `+ J
      
$ d  M" z5 g1 V; J2 t( @$ E6 Z      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, [: {8 N/ ?2 b; i' G& b          printk(KERN_ERR "register cdev fail!");- s7 P2 s! y7 w0 f
      else
( }9 A( w5 D( a1 c& I+ M. |) @& f          printk(KERN_ERR "register success!\n");5 X4 Z0 u0 t& d" x7 o5 D
   }1 I& ]5 W7 x' W, m: b, i1 }
   else
; y+ G' O- R% B- P: z   {, p3 S# L/ v0 u0 b
      printk(KERN_ERR "register cdev err!");
5 v, s! R% [" Q      return -1;) |% m# {: B  N7 m+ I; [
   }
1 H3 y! y# {! e/ _2 |( I( v& p   
2 S& {2 T+ D, T6 R! l: `" M, K  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
  X) i' o# Q  D( V   if(IS_ERR(mcbsp_class))0 T, u2 z% F6 B. `
   {
! r7 C# F% Z1 i% R, l      printk(KERN_ERR "register class err!");
/ p# W4 d3 ]0 ?" X; r+ i2 z   return -1;8 w) y& u% u) [
   }* c5 y; {# ^/ t% y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' w8 D5 A8 x2 O' \
% v/ X7 D, {, w* d% K
   //PSC/ v! D* k9 k# b! X' O; `* y1 j) F
   //add Enable MCBSP
$ G% H: q( D/ p" w3 x* v   //test
' G6 ?0 m1 ]# D# _* B" s) d" H   temp = 0x80000003;& F. q& f3 N1 U
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 E* J% j! h3 y   temp = 0x00000003;% f) T! Y" \8 K, v+ T+ `' j, Z
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
: j! w- I! _0 R. Z$ _! h
7 i9 z: Z( x8 L+ b* p   temp = 0x001FF201;
  F1 c3 l% b) f* C   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
" ^; x" K/ I9 _9 H+ U  ]* E   
; Y( U( |2 V% F1 Y   //PINMUX  , }: o; b: E4 c* n; s* s( ]) B
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! U9 n2 i8 M: X, C5 n4 i+ f
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  + u5 o  Q7 s' M" v) ^# y
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
6 p6 @6 T! @$ h$ g( m. G2 Z; G) }   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! v0 N0 V" Z9 b5 C/ f  W1 }3 E1 J& M
   - z: S9 S( Y& R  R
   //SLEEP_EN,EPR,L138_SHK1,L138_RC9 h4 Y+ u& |0 j- T6 l
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  # ~5 V5 Z  c8 E' M/ F
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   8 K1 n$ O5 V. w. v7 U, \# E
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& g: X- e) x7 _8 f
/ p9 |  }) T2 A  m   //RESETn,L138_SHK2# {- R8 E7 h1 o8 G
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
7 I$ b4 @( g& o) }+ Y$ O   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
. y" h- S8 y  v$ c, U% _   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ B7 D1 V* x* [  i1 e0 F ( E& b0 q. K5 \: ]0 }( y7 K2 ^
4 ~1 P. d; g- j: L" S  }. R
  //SPCR Register
! _" w& Y* b0 q' g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- Q6 o' P7 i* f+ Z; l/ r  temp = 0x03000000;//(DLB=0)
$ q( z# c, _2 N8 i/ q* w6 v // temp = 0x03008000;//(DLB=1)) I  u% W8 ~# |5 U+ \; D
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% n' F" T  @5 E0 L" G7 w' u  temp = readl(IO_ADDRESS(SPCR_ADDR));$ ^9 a' i  S# j
  printk("temp=%x\n",temp);5 g3 E+ N! i0 O* D3 a2 X" U7 t/ u8 f2 A( \

8 g& f4 L% q3 B  P+ X, E3 @  O   //PCR Register
% x, P2 \0 `; T6 G   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 v$ E6 E9 o! S( ?- H; T" E$ \  // temp = 0x00000F0F;6 u# P0 W9 Y  s/ i& `; G
  temp = 0x00000B0F;
& [0 f+ |# c4 O- w. t$ b' t/ M  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
/ R9 l( e. b6 i4 }6 v) P6 P  temp = readl(IO_ADDRESS(PCR_ADDR));) h$ r# i7 p# V
  printk("temp=%x\n",temp);  # o& v! `: z5 N( k
   //SRGR Register7 z' X2 L7 x1 p  g! {& L" }
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 ^* G' V$ G- b
//temp = 0x301F000B;0 ~# v. d6 Y5 O# l3 s) S. Q
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
- S5 K1 ~/ I. r) t  ]2 M7 W, j  temp = readl(IO_ADDRESS(SRGR_ADDR));. ^* u5 H$ m" P8 ]. F. r% O* K9 r3 x
  printk("temp=%x\n",temp);) l% p% n; N" j" l0 Z
   //RCR5 j' X( p. u6 ~, c. b+ r" T
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% C- Z3 l8 q, u
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 |0 j& j& c. ^5 I$ ^* y" I* B- F* _   temp = 0x00440040;
$ d2 V4 E' }6 u& c8 G/ l/ Z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 z+ p" e  r' C' N; n/ h# ?1 D   temp = readl(IO_ADDRESS(RCR_ADDR));  N9 _) ?- e0 w
   printk("temp=%x\n",temp);
# c3 Z1 D! s- \! {! e* ]: f( W   //XCR& L* a! E9 u/ ]: t# U
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" r7 x0 I+ f$ W; W& Z0 s. v   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 Z) z  ^% |: W6 e" K! p( T; L
   temp = 0x00440040;& F2 B7 h% N0 Z/ s: d+ i
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   7 A3 I+ s0 ^8 T1 S: k
   temp = readl(IO_ADDRESS(XCR_ADDR));
9 T" i1 P; v: j4 _/ `. C& `3 E9 [   printk("temp=%x\n",temp);8 X/ ?/ o; l- @- n. K- R$ B
  udelay(100);3 q# E/ k$ p0 Q3 f5 a
  //SPCR Register
& w/ l# n- f8 m" Q0 ?* o( e  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' Z2 c- l; O7 K3 \* W% r) ], @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
! M. _. Y3 c0 x2 k, u  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled8 s. J3 `4 x; E$ E8 Z! i1 i2 S( ]
  temp = readl(IO_ADDRESS(SPCR_ADDR));
" k) n' z5 ]9 M4 q) x2 [  printk("temp=%x\n",temp);* T% N& P" Z" P5 P9 z$ b4 ~
  udelay(100);7 g3 |6 _5 A7 ?

& }+ j0 U9 _; a$ u  //set GPIO direction
1 Y* C5 B  U' O, U/ a9 G   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ @* L' K% u2 Q' Y1 \/ \0 a0 B+ E   temp = temp | 0x00000100;//EPR----input
3 ~' v% l6 y4 B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" r# N. E2 S$ k0 w8 m
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# X) ?( |5 Y7 \0 o& Z7 }
1 O! q. `5 ^6 {3 f7 e+ P6 `) h   return 0;3 T7 N3 Y: O3 Y, W5 |* R
}
8 `, ^/ A+ z& n* M! jstatic void __exit MCBSP_exit(void)
7 M% ]6 i( D2 i{, X% ?4 }6 A$ L2 N" T
   printk("mcbsp chrdev exit!\n");, o) F5 U$ O& P, ?. Y* x: D
   cdev_del(mcbsp_cdev);, S2 q; B( w! b0 T$ A1 V
   unregister_chrdev_region(mcbsp_dev,count);
/ P2 |4 E: W" z! P$ D9 ~- B! H   device_destroy(mcbsp_class,mcbsp_dev);
# J8 z* ~! p* i0 a- a, T2 F  F+ }   class_destroy(mcbsp_class);
6 B9 S4 |6 G2 P" F}, P" G9 j, \+ ~) a, B6 r. S& O3 i& h  `
module_init(MCBSP_init);
* I0 |4 ]& R; L( H9 ^8 o7 Smodule_exit(MCBSP_exit);
/ s! H+ k7 W- [0 V3 [; R" [: H: w8 c' c# Q/ i- N" ]
MODULE_LICENSE("GPL");
4 B$ E# E* a  B+ U! Z  B0 V7 l
) R# Z6 R6 O* |我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! C; u8 k2 i3 h我的应用层的测试程序如下# l5 h, t! Z3 Y& p$ l8 }+ t
#include <stdio.h>
1 A* u0 i! ?" v5 F( U#include <string.h>( D  K: p, P& K7 T( \# Y( a
#include <fcntl.h>/ V8 ]7 N' V/ Z, d
#include <unistd.h>9 \% m( E$ F9 Y; a7 ]" Q7 P6 _
#include <signal.h>
' B" }( S4 G' O) V+ y#include <pthread.h>       //线程
6 g" k% V- s0 W/ |2 H#include <stdlib.h>
5 [6 C4 k: m3 i3 Y, z) V) S: {#include <pcap.h>          //捕获网口数据
; _, j# U9 y; y3 O! A  f& {, O#include <semaphore.h>     //信号
* X6 B& O% b# ?9 Z#include <sys/types.h>     //消息对列$ ^' I" O8 u" _( o( j2 Q; C. z7 n% ?5 O
#include <sys/ipc.h>       //消息队列+ `/ ?% V0 K% W2 l8 R
#include <sys/msg.h>       //消息队列9 q& p& a+ h9 ^+ \+ c- u4 q
#include <sys/select.h>' j9 l- c# ?  m
#include <sys/syscall.h>
  [+ e9 W: Z% U) i! y3 t( @#include <sys/stat.h>
; k( u1 x) ^2 `/ Q( O( t! o#include <sys/mman.h>1 g" P4 w/ i8 {+ c( {  T
#define msleep(x) usleep(1000*x)) O# I) o0 [, N2 i0 T  \) d5 g/ I3 Y

4 t* E8 L& Y- c  e+ `, G) i5 B- sint main()/ X3 g6 q4 n9 ?& Y
{
$ D/ U- x! E; b1 o& l0 Z5 z    //MCBSP,ARM与AMBE2000交互设备4 d: o% ]' E* G5 }* o8 |+ f/ N% M
int fd;
' W0 E9 n& `, v( V% w, _9 n unsigned short data_write = 0x5555;
: ]% W# @& Q9 M; j2 z- V; | unsigned short data_read = 0x00;5 q3 `+ J6 M" o" |
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ j6 r* V- d/ b: D& {. B+ N" }' u //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 q! L0 G2 m; |3 }  S" I   
7 t9 `( |( Z: {7 G4 H6 E( \" q" ?  if(fd < 0)2 X+ J$ M9 u0 c; L* _( ]
  {: U9 z" q4 ~" w8 }" i( f6 {! `& E
     perror("open failed\n");' U5 r1 l, @3 a& R
     return -1;
' g/ T0 W- Y+ F* U  }" `9 M. ^+ k: P5 i8 n
  
) F% ~1 n2 ]' i+ k  while(1)
; T3 U. C1 X! g. o/ M% _) U  {5 M* g3 o( p$ q+ \$ t$ `0 w) R' R- N
   % ?' Z- a. j/ L. _/ J5 E, U' ^  f" {
   //AMBE2000每次读写是24个字为一帧
6 `  _# ~, m4 r9 l- a- g8 b$ d   //写数据时将数据在底层存储起来,等到中断的时候再发送
; e2 a0 i4 B9 D' P3 v8 o  O   //AMBE2000输入数据是以0x13EC开头的0 \9 u5 h4 A8 M  |1 B" c
   write(fd,&data_write,sizeof(unsigned short));4 s2 o; k1 ~9 V
   5 A% [* ~! v& ]  w7 g/ ^- c
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
/ Q$ D  ?- t3 s" l/ q   read(fd,&data_read,sizeof(unsigned short));
& J$ C5 P) v/ H9 l9 `   
$ h) E! Z! X% u2 v! T0 j   if(data_read == 0x13Ec)7 D+ L# t! [$ O; T- H& i
   {; I, f% v  m( V0 t% j
   : z3 b6 w$ L' U  k
    printf("data_read = %x\n",data_read);3 Y0 p) F& k% W6 M3 [
   }
5 O" J4 B7 J4 v( p1 I   & q5 ^5 M; P3 I5 Q% l0 U' f
   msleep(10);; d2 V  H1 w, H& m$ h
  2 e% `- X/ s- x% q0 D
  /*" [* `0 I# `; l% y  ]; _) g
   ioctl(fd,1);   $ j, P1 ]. u1 a4 {6 U
sleep(1);
' Q& g# D# p  G+ W, N% K& n ioctl(fd,0);
9 R6 }/ o" p( t sleep(1);2 m4 r+ E. [: K/ R$ l9 N: P
*/ 5 R! W9 o8 U! f) N2 Q
  }     H2 ^4 T2 \5 x9 U& m1 P' J3 a
return 0;
5 E8 X, M) H; ?$ m4 v
  p' t0 \9 n; o1 E2 G}3 n+ p% h9 Q8 ^/ f/ B) S! r3 @) ^
4 w: o: r3 t! g
多谢各位指教,谢谢! 急0 \% V6 k' |# r+ v5 r
: \! W& w! E7 A0 ]% V* p4 ]9 v
2 ~, w7 O; }! G' s6 d0 C
& F$ N. X! A8 ]/ L: X- e8 r& W
# \% J! J5 k1 Q# n

4 v5 y& q2 L* F7 I3 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 07:48 , Processed in 0.043998 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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