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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : I" S+ v/ J! V" o% u1 H
/*
- ]  _( O; H' v" f  N, J * Copyright (C) 2009 Texas Instruments Inc3 r) ]+ ?! u: u- }  }
*' H  c0 M# F/ B8 ~8 \
* This program is free software; you can redistribute it and/or modify0 A0 d0 @. @6 H
* it under the terms of the GNU General Public License as published by
7 B* Y. E9 O) u/ F4 g4 B * the Free Software Foundation; either version 2 of the License, or3 ^. {$ H: U5 d: R( j3 X# |
* (at your option)any later version.
7 m( M4 h8 N; h: T  p; T& f) E" [ *
) T7 _6 S7 v+ h * This program is distributed in the hope that it will be useful,
4 h" T6 T. H+ M1 W; _8 ?) I0 p9 s * but WITHOUT ANY WARRANTY; without even the implied warranty of) d4 j1 r, C; n$ T" e0 P- D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ k6 M) Y" l2 E" ~: M
* GNU General Public License for more details.
$ D( F% G1 A' w( G- r *2 @2 ^3 R+ \7 e6 f; ]& N6 ~7 n
* You should have received a copy of the GNU General Public License
7 u9 t' O0 h! p * along with this program; if not, write to the Free Software: I, X5 H7 h( ?8 c
* Foundati
4 X) m& i$ ^% P4 D( A*/
- Z; w3 @# @$ ~. Q#include <linux/module.h>
9 F* p1 r; ?# d; H#include <linux/init.h>
: |( u; [, l: n5 r3 J% w& y2 k#include <linux/errno.h>+ Y! ?6 ?4 {% O7 x7 x8 q6 o
#include <linux/types.h>* ]# \; |- ?1 X; {3 {" B- D
#include <linux/interrupt.h>
9 e* y6 y0 W. U# ?#include <linux/io.h>  x3 y- ]8 v$ }9 s! D* E
#include <linux/sysctl.h>/ \. T8 `0 \9 z# A6 E: M
#include <linux/mm.h>1 j9 j+ C. T$ \: U
#include <linux/delay.h>. K; }- q) o7 f( K$ o+ H
#include<linux/kernel.h>) M/ d. O  {% T) U# q
#include<linux/fs.h>
- \3 ~# I/ n4 a#include<linux/ioctl.h>
6 d9 p! H1 Y0 Z" }7 ^#include<linux/cdev.h>
( |' D! o( q) P#include<linux/kdev_t.h>
/ Q- z# q( ^* `: p. P#include<linux/gpio.h>
' G$ H- N" t$ K( _9 _#include <mach/hardware.h>/ h: W5 x: M0 R1 q9 Z& I" X
#include <mach/irqs.h># f+ n( h3 C8 y3 N5 N3 x8 E
0 g$ m' `- B* ]( ~7 n
#include <asm/mach-types.h>
, ~  V  Y" V$ u# Y- U8 g5 y5 m7 q#include <asm/mach/arch.h>
% A. ?: r) o1 X. [& c#include <mach/da8xx.h>1 v7 Z% `# w, u0 ?& S4 R. z: R
#define  SYSCFG_BASE   0x01c14000& A& \. w7 S# W9 R6 M
#define  PINMUX1_OFFSET   0x124
) O/ L6 d- W' d; x1 r  }$ {3 q9 U$ C#define  PINMUX18_OFFSET  0x168 2 n0 Q% A0 F0 r9 S1 }' D
#define  PINMUX19_OFFSET  0x16c
, p( b$ F6 h9 I- R) d" A: B3 o# T3 b$ n#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR/ _! N" V1 R  `5 d) P* _
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, T: Q5 P8 K. Y" \#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR- `) U  o; O! j* k
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR+ d5 s: k6 o( y  q7 n6 L( Q
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
: \" n2 Z/ q) g9 x- _" b                            . u3 O/ \7 Y0 z% f2 y: T
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ J, E! s, h- V% `& l6 H; [
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# q7 q, H% y7 v7 B//PSC
1 t- d7 Z$ T8 B; Q# [$ d7 v& v3 {#define  PTCMD_ADDR   0x01E27120  7 f" R1 z$ ^2 s1 W. l4 B& X7 A  T( i
#define  MDCTL15_ADDR 0x01E27A3C( l; D3 S2 `/ U- k
#define  PDCTL1_ADDR  0x01E27304# n4 m! i2 P; ?" n) T1 d
//GPIO8 direction' J! j5 _) r" \6 h1 R$ D
#define GPIO8_DIRECT  0x01E260B0
! X1 i" G, ~1 L' `! X. f#define GPIO8_OUT     0x01E260B46 f% H* I4 w- T, n: A
#define GPIO8_IN     0x01E260C0
4 o$ n1 ?9 O0 ]) v2 B* Q: k$ U" V7 ~" J
//#define MCBSP1_RINT    99              
1 _2 O# N- l, v$ q6 e, ?$ k7 a& E" X//#define MCBSP1_XINT    100  
) F/ E* B7 ]# R- G. ]static int MCBSP_MAJOR=239;
3 t; _; F% l% I1 m1 p' z/ \static int MCBSP_MINOR=0;
9 t) D; h3 K5 W2 h& i# F3 j( T$ L, Qstatic int count =1;' t% f* I9 j1 `8 W
5 k1 C& S% Z! f6 ^/ ^
#define MCBSP_NAME  "MCBSP-device"
( H1 N( n1 m4 U% U1 v  D# {  t3 n, Z" e9 R! j9 c( b" [1 O9 K' Y
static struct cdev *mcbsp_cdev;9 }; y, P6 H6 {
static struct class *mcbsp_class;
! c" U! H! H" V; z4 K9 H1 }static dev_t mcbsp_dev;& }, d( h, \$ n1 b
unsigned int DRR_data;
2 T" R( _+ c' |  e! G# ounsigned int DXR_data;- k( o+ K& z7 `3 |1 a
static int mcbsp_open(struct inode *inode,struct file *file)) ^# o7 i$ }: [; S3 i) j7 m
{
( X1 i) z% z# X0 ]   8 @0 P' {, d3 Z: ^4 l8 v
   //interrupt enable,initialized5 z, P) ^9 d& w" T% Y! u
   unsigned int temp;+ j* }6 \8 m/ q4 q
   //SLEEP_EN(GPIO8[10])---0
1 t; b( e* X% Y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  l5 r2 `% R' U: r, f% ]   temp=temp&(~0x00000400);" y: Z8 }7 g& L, p+ H5 }# x; W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- y9 q2 `( U3 O, ]) x& k% a2 O; J
  //RESETn(GPIO8[8])----0----1$ D- {9 R6 g2 e" T; ~
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ Z& }/ F- W& {+ I6 `
   temp=temp&(~0x00000100);, l) h$ a7 K% u/ D" K) N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0$ W6 g6 T5 S8 {
   udelay(100);
  n  {# R1 a* z: G   temp=temp| 0x00000100;2 C4 [- h( \" N& U* }' H/ @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" @% X/ I: D* ?9 ^6 w: @
   udelay(100);
# ~1 J  j( R- S3 {0 z) b. ^   printk("open success!\n");
' k  V4 _6 S& s' E* u) h   return 0;* T4 w0 y& L2 {5 U, j$ k1 O' p* I
}
0 f4 _5 \6 ?2 C
5 W) E. @0 z2 w3 l6 w& n% e, Vstatic int mcbsp_release(struct inode *inode,struct file *file)6 d% [: ~* g6 }
{& S6 s! K8 ~; {0 ^% n! m: q5 _2 q
   printk("release success!\n");7 B" z& H8 E6 E) d# l0 Y+ W
   return 0;
. [5 d: p* q3 j9 G6 p4 o0 w" L2 F4 F5 s}( t& I, k7 X5 s% [% k+ [3 s9 I4 U
# i( a$ [4 c# x, l& D/ z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
+ [; J8 h: J1 _! f1 N! J9 f: l  Y{
. D( z; h2 C7 I+ p' }3 P$ [    copy_from_user(&DXR_data,buf,len);( ]9 f1 r4 `  d
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ d; @) P1 m9 i5 w( b9 @    return 0;* [% u0 u. d# `6 P" w! g
. a+ u% }0 v4 }- A( J
}* @8 q9 i# g% N; U
9 K# N2 A$ h8 F# v0 v3 m
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)3 W) z3 ^# F1 ~/ {' a) ^
{ 2 W) g' S' g, j
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 i6 S/ X+ P/ R* [
   copy_to_user(buf,&DRR_data,len); * L1 ~+ e. |" l: G1 Y/ @( C
   return 0;
# O+ ?% ]. V- {2 L! Y+ H- I}% K1 e3 @5 J. w: ]  n+ r' v

/ q) W7 L  q7 m8 H' a7 l
5 @; O4 H1 a- I. f( G$ A$ `static struct  file_operations mcbsp_fops=
* [/ Y$ ?4 j- D0 p' p8 k{7 q5 J6 w, @* z; Z4 ]
   .owner=THIS_MODULE,( P6 J( M: C/ {; I
   .open=mcbsp_open,: @* w. C( u" Q
   .release=mcbsp_release,9 `9 B3 J6 Q5 @, M7 _/ M  q
   .write=mcbsp_write,
' X4 u8 Z* z- n. L5 g: \   .read=mcbsp_read,
8 L- \* j) w) K: ^4 R# o3 v};
8 S7 [* a; |: astatic int __init MCBSP_init(void). i$ m( S9 F) q2 l, c+ ?1 C  M4 _/ r' b
{
4 M) G, k! j  E: e% F: h4 N   int ret;8 [" N3 |4 [4 f5 }# u
   unsigned  int   PINMUX1_REG_old;
4 l+ p; O  r. w" l% h" W, D4 x   unsigned  int   PINMUX18_REG_old;/ w, t, g5 _; P# N
   unsigned  int   PINMUX19_REG_old;  h5 J( X0 V! e+ v
   unsigned  int   temp;  
! w3 T9 ^  N$ ~. M- Q   if(MCBSP_MAJOR)4 Y- H, _) Y/ Y8 h0 H8 A
   {
' ]/ m. I2 @! l2 }6 b      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# h& {4 q& g2 S' X2 T7 `
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( G, Z) E8 i* e( p$ d$ h" ^
   }+ K+ Y0 W# F. N" g: C+ q
   else
: S# z; u# e) V, P5 \+ I- Y   {
: C) V* k/ Y( J3 h5 m# z  x" r      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);* y# V1 C4 ~1 N
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ p, h' l6 d1 Z! ], l5 `
   }
& i2 u7 ]1 f- f* f; G   : @. A& D! x) b+ k0 d1 c, q) {
   if(ret<0)
7 ?2 Z% X+ l2 |6 Q' y( l+ @4 o   {
( b0 O' Y9 G9 J8 ]      printk(KERN_ERR "register chrdev fail!");' N( Q" z: V! h5 [1 x0 E0 Y# \
      return -1;
1 T2 m# s6 \$ y/ g2 T" P& c8 X% s   }( T2 Z: i: k/ [! w1 j1 a
   
% k& U( s1 u: |9 c   mcbsp_cdev=cdev_alloc();8 i' q/ h( ?9 ^9 |. b/ p
   7 L) ?  w2 |3 f# j3 k- J
   if(mcbsp_cdev!=NULL)
, s# k$ f) ^, w$ \% I' A7 a' K   {! N: [* p% ~/ A# ~0 _: X% J, r# D
      cdev_init(mcbsp_cdev,&mcbsp_fops);
; E# |9 F; _/ q      mcbsp_cdev->ops=&mcbsp_fops;* ^% w, @1 l+ Y3 x
      mcbsp_cdev->owner=THIS_MODULE;2 Y) u. e0 F; ]* _. e* m) b
      % M/ r- r1 F% \! X0 E: N& a
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) P$ N, V; ?! F7 ]5 D
          printk(KERN_ERR "register cdev fail!");
2 J* i2 |1 l' s/ Z' |      else1 d  Y2 ^' w' i8 W. c" R
          printk(KERN_ERR "register success!\n");' {8 F4 {2 a0 S
   }# Z; W) ?, D- [4 |9 }
   else
/ C* {  W' v. U9 {: s   {
' E: V! m, I6 A1 A, ^( x      printk(KERN_ERR "register cdev err!");8 ]& A6 q7 _' p! |  w
      return -1;
' [1 x$ V. @4 W  W0 d   }
- I( g. `. d( g   1 |# m" n/ D3 h5 M8 a
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 `0 f: ?. Z+ N7 s   if(IS_ERR(mcbsp_class))
6 Q- i" p: F# h! r   {
' Y1 Y6 v4 d; e8 {7 v      printk(KERN_ERR "register class err!");: @0 j$ g! s/ Q3 X6 a' m
   return -1;
6 a+ q! D7 `7 z! K; K- ^: n. l5 k   }
2 T9 U6 {4 {  j) [% \" D  M" B   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
% q5 n+ n! L7 x2 J( F! }- E: d/ d' W
; T6 P1 J; A2 e& t; k6 ?   //PSC
: v! v2 g1 m+ o3 {' l" C- m   //add Enable MCBSP$ z: ?- k' J8 O8 o
   //test/ d9 C1 c# \7 ~9 X4 N& V; I
   temp = 0x80000003;
/ [0 P9 j0 e1 u7 C9 Z# J- }. s( ~5 ?   writel(temp, IO_ADDRESS(MDCTL15_ADDR));& d) k# x, @% x. ^6 S, a. `
   temp = 0x00000003;
5 q# z( H9 V' \, m$ h% ?   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- X' w' E. D! n. T& d
: |! s" u" H2 u% Y) K% ], Y: ?   temp = 0x001FF201;" c9 c$ D! d0 U/ M3 \- Z; E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 a  i) f5 o( E* |5 k
   " H' l& z! q. z
   //PINMUX  + f4 g( x2 Q$ u
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
/ {9 L. J$ D( i# y( w$ Q   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
0 B1 N) K, n- u2 ~7 j7 j   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   " ~& M9 M: s+ B% N0 e5 ]. E
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) ]* ]7 \& U0 }8 H) N   9 u" M- L2 O( V( U1 E
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, `  y, C+ ?0 d" C6 ], u# I, Q   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  6 M& o, l7 N) e( t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
0 i, x- q# z$ w+ T' L* D   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# v1 `6 G5 N  o2 A% F
( N6 x7 Y, V2 B& g2 {   //RESETn,L138_SHK2
, ~3 ^" H- D' `+ m& w   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 O: j9 T  [# w, I3 g& O   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
) {, R& \. @& L( b1 O8 p- _$ T   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: Z0 ]% r' y0 c3 Q6 _7 T* b 6 |& M  Y- i) P. x  O8 M

( }( m, F" c3 a: S$ Y. x& [  //SPCR Register, x" ?7 k6 {. J4 C" z4 C& W, ?  o
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 C  @/ F6 z; v  temp = 0x03000000;//(DLB=0)
: ?# \- f7 b3 Y6 ?; u( `% j' V) J$ {1 n // temp = 0x03008000;//(DLB=1)
1 J7 g  C3 @; q& x; Q/ ~  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset0 \6 |5 i. A1 E2 Q
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 W; D+ i' x9 z, s9 X1 y# A4 t& s  printk("temp=%x\n",temp);" h. [$ V) j# @# Q4 j; j# ~

, k3 J( R5 K: `* ~6 x! x9 O3 U   //PCR Register% r$ Z% e' l  ^
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% N' Y" A: ^/ L  // temp = 0x00000F0F;
6 c, W! X8 ~$ `; s; \  temp = 0x00000B0F;
$ d/ _, l1 ^9 Y* ]/ g; g  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ) R' [/ [) S1 y1 j; {6 i
  temp = readl(IO_ADDRESS(PCR_ADDR));+ H3 _" S' X. T# n: D; W( I
  printk("temp=%x\n",temp);  " ~; r/ i4 z  e, x2 b' K& l
   //SRGR Register, G1 g+ ?3 n) q1 Y5 Y4 X% P: k6 y3 f
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11! v+ t. ^+ q4 }7 M: A$ X
//temp = 0x301F000B;
8 l4 i# N3 t' m) x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 9 E4 `+ P8 p# C0 f/ U: m$ g8 _& G* {! L
  temp = readl(IO_ADDRESS(SRGR_ADDR));
% D0 j5 w* G9 l7 Y. t  printk("temp=%x\n",temp);
' `7 {% }, Q. ], ?& `0 ], K   //RCR- j( b8 P) o: P: u2 ~7 k0 r
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ o9 x' u& I; z  E% \; }, L
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. q$ R3 L& B4 o7 B) Q7 f   temp = 0x00440040;& R# q) ^8 p4 a; x- L
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 N' b" M- H2 L   temp = readl(IO_ADDRESS(RCR_ADDR));" w; j: z0 T% }# q6 [2 k3 l: P* F' `
   printk("temp=%x\n",temp);$ D( n- V5 g/ J4 s, Z& e3 U' J' N
   //XCR
7 A0 W) j1 w5 |4 |  N( ^. D   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 N: l' I5 n  W- k9 B% J   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ e. {$ T" W. z. V+ ]   temp = 0x00440040;
/ @7 u$ O9 s& @2 H$ M! u   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   0 {& j! l! N) u; b0 [9 L, Y" I
   temp = readl(IO_ADDRESS(XCR_ADDR));/ Z6 z0 W! X* \- Q/ Z* _8 `" |
   printk("temp=%x\n",temp);
/ w( @4 q  y- U5 m$ l! Y  udelay(100);
- Q, \. I! X: M1 l- g1 f  //SPCR Register& C+ M" g, e0 W& O4 o
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) E+ I$ _/ v% K
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1" b9 O$ F( @, P; _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ m# e' F/ f# [- k0 q9 U0 W' A
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 v/ [1 \$ G% q; b  printk("temp=%x\n",temp);
8 w! x- n6 ?0 x0 |8 X6 I- `% r  udelay(100);# M# x1 e* m; e4 |8 {' A' i

8 y2 X" V* [7 I  //set GPIO direction! N7 a/ b: a- q. i( h
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- ]& B: Y! G! U# _- k4 r
   temp = temp | 0x00000100;//EPR----input6 A  c3 H9 `$ Q/ T
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ E) q/ I! z5 ?# Z   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 1 G4 N' {8 ~  Y- U0 o, m1 T1 A
% L- S( K. L0 n! B3 c9 g3 k9 G
   return 0;
7 u* ]' `0 a# C}% s/ Z  `0 l# |$ e" b+ R
static void __exit MCBSP_exit(void)
' X. Z9 u) s3 c. Y( B/ M# {{
5 K( I5 K; F$ Z' L   printk("mcbsp chrdev exit!\n");
3 D5 z$ V& P" C5 o   cdev_del(mcbsp_cdev);6 u: v: M, q3 C
   unregister_chrdev_region(mcbsp_dev,count);4 f$ {0 q% v; V/ D' S. j
   device_destroy(mcbsp_class,mcbsp_dev);
- I* T# _$ s8 g# R. r   class_destroy(mcbsp_class);
! T! Q& l7 d! M}
& A1 d, z; P- o' s% [module_init(MCBSP_init);' ]1 B6 B) K' _6 y/ S% t. Z
module_exit(MCBSP_exit);
0 a3 V& }2 S6 \$ T4 o$ x. f. d% J: R
MODULE_LICENSE("GPL");
' q) N' I7 B9 T/ D1 M3 p( b% B
' R) q2 X) j4 ?我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。/ O" s* R$ _5 P  z+ N1 \
我的应用层的测试程序如下/ {) c0 c  @- A$ a! N# ^6 @% v
#include <stdio.h>: I( u( B; K5 y5 _3 w* ]( J
#include <string.h>
4 H7 u( W; k3 n+ |#include <fcntl.h>
( h/ O3 T0 C4 a; R" q#include <unistd.h>5 W- Z9 M0 s3 x6 j2 ~* r5 j
#include <signal.h>
3 O3 x7 _& V0 y6 w$ [9 C' R#include <pthread.h>       //线程# J+ c% _/ L/ g9 p$ I% Q3 n
#include <stdlib.h>
: e  T" n" B0 h4 g, h3 E#include <pcap.h>          //捕获网口数据% S# D9 s' J* ~% {# o
#include <semaphore.h>     //信号
3 G2 ]" W* ?% O& E8 [% m#include <sys/types.h>     //消息对列# p2 G9 Z& R. }! N% }5 R& }. f
#include <sys/ipc.h>       //消息队列
& k0 }( C  Z0 e' C#include <sys/msg.h>       //消息队列
5 D7 r% [4 |! j5 a7 o#include <sys/select.h>, B5 @0 P/ k% H8 r# Q% x! b
#include <sys/syscall.h>
* {/ G; `( N) F  s#include <sys/stat.h># a  Z- U* b7 A* A) q
#include <sys/mman.h>% m7 N# y* }8 x) A; _
#define msleep(x) usleep(1000*x)
0 G9 d5 c" X7 a# B
) {; P4 M  U* X0 W, k8 j* Iint main()4 ?! W" \( F5 h1 d9 Z4 r
{
# a' c4 `! V$ D+ Q    //MCBSP,ARM与AMBE2000交互设备9 U6 {3 c& g5 M$ M
int fd;
# Z9 H  t% |/ f& I* E$ R unsigned short data_write = 0x5555;" r" J6 p' ~* Q( V0 M
unsigned short data_read = 0x00;; U" m, k0 h6 w; Z( h. a
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 w: a( @3 k- m5 Z) X5 Z' ^+ O
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);  R7 ~  V* E1 s/ @
    ( k& Z" f$ }5 ~; r. g) @  o0 d
  if(fd < 0)
6 D8 H% W+ {- ~& _3 [  {
; n% {7 W3 i% y  B0 G     perror("open failed\n");. X) P' H, Z$ b
     return -1;
3 ^7 J  x- X5 k+ M  }( }7 Z# b* q$ c2 B5 P& k5 g2 |
  
, \# {; S8 q7 D  R  while(1)4 C, w- S+ a3 Z  ~  o7 i
  {
1 V4 d/ C7 X/ S   + m* W( f3 m2 N. i2 R, |
   //AMBE2000每次读写是24个字为一帧) ?& [/ s2 q2 @8 V+ R# s/ m8 m
   //写数据时将数据在底层存储起来,等到中断的时候再发送3 X& ~! ]& u& Z
   //AMBE2000输入数据是以0x13EC开头的0 w0 V0 m3 E3 x# c  R8 |8 w
   write(fd,&data_write,sizeof(unsigned short));
9 l- s  @3 Z" Q% @! @   
- Y8 K' U+ C  v6 [5 k2 [4 j2 r   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  . `7 y* a, @! v* l
   read(fd,&data_read,sizeof(unsigned short));* S4 \: c& m7 {- ~
   # o/ r4 p2 T7 \& J6 t) T1 d0 T
   if(data_read == 0x13Ec), R. U! G, j+ t% L  J  U
   {5 Y3 d  l' K* X: H% H
   % i, B( `9 M& Q0 H5 I
    printf("data_read = %x\n",data_read);: R  U) P% ^& e* P+ d* r; ]
   }
7 @" ?# u# u, u" h; U3 r   
  u4 b; C8 @! I, }   msleep(10);
- Q4 F% h. n& x  * Y5 }( ~0 C  q
  /*& E0 ^3 M: e7 F& z$ V4 j. U
   ioctl(fd,1);   . g/ M# ]: v3 w( }7 B  N
sleep(1);/ _1 Z- e6 T6 q9 l1 F: S4 m
ioctl(fd,0);& m1 w9 c: i* X1 A' X3 P
sleep(1);
6 i* f' O% V2 I7 g0 _5 W% c */
1 ]3 }+ t; E* J& Z1 ?7 b( q0 [9 z: g  }   ) Y( }* `% H' v7 K. }. G! x
return 0;
1 Q: f# l- }' u$ H) C# w" v8 g   y3 _! y( Z: v7 t0 H
}; e- |" \. l- \" e* I- A$ f
. p5 Y& T" m* s8 }* A
多谢各位指教,谢谢! 急
. w% w' r$ Q0 g# [6 A; o- j* M6 u5 n- k) I. a

+ d" {( b  Y2 }; q
5 F6 P; ~( ^) g* u* x# Q* `! H5 P4 l* r
% x7 ^$ D7 x: ~1 B1 N) G6 h/ p2 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 09:37 , Processed in 0.048816 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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