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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 i/ x! s% @# [  p1 R3 T3 f3 y
/*+ f' }& L4 Q0 t8 d: T
* Copyright (C) 2009 Texas Instruments Inc
8 q5 w+ X  W6 ]% a- \ *' |3 X6 B: |! p
* This program is free software; you can redistribute it and/or modify6 M8 U7 k1 n6 [. n" Q+ Q* g8 z4 [
* it under the terms of the GNU General Public License as published by
2 g( h+ D9 Y1 P0 a * the Free Software Foundation; either version 2 of the License, or; O" _, N" Z. ~2 K3 ?7 Q- X
* (at your option)any later version.
" I: }0 l2 U2 C *5 e; d0 m' ?  P3 F9 W' ]/ i: r* I
* This program is distributed in the hope that it will be useful,
% Z6 H  ~: m- J * but WITHOUT ANY WARRANTY; without even the implied warranty of
& b8 X! v3 i7 e0 N6 A) p' I9 q) z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 w$ B' p" K- O( S
* GNU General Public License for more details.
* O% W1 i+ e; Z( w( G *6 n6 x7 C1 M- h, v' p
* You should have received a copy of the GNU General Public License! r: U; }2 |, d, G3 e
* along with this program; if not, write to the Free Software
, c% `5 V# ?# t4 S+ _( L4 i * Foundati
8 q$ a' i' L3 Y4 S1 F) ~# [*/+ _* E: Y6 ^# {
#include <linux/module.h>  t) F0 B6 B& X" p0 I; o
#include <linux/init.h>; i3 j( A" i, u2 o" W' O, Z8 J5 s
#include <linux/errno.h>
6 y' @" I* `. o9 q#include <linux/types.h>9 E$ p) f0 b+ \! W: E6 N
#include <linux/interrupt.h>5 z0 W( D( a; N. J8 E& Y5 x3 W
#include <linux/io.h>
- u. ?# I, c$ Q' q) u% k#include <linux/sysctl.h>
% z) B/ h  ?- ~# u6 p#include <linux/mm.h>
! K, F& A% @+ Z* O" O#include <linux/delay.h>8 u" A  S7 S7 N+ b: z$ v9 i
#include<linux/kernel.h>" A5 `/ S; ~% T# ?' r  w6 p0 s. b
#include<linux/fs.h>
% l% T5 p& n+ e& [& y- C#include<linux/ioctl.h>
3 M3 \9 W5 T3 i3 B#include<linux/cdev.h>% y- w* g: T0 H: {  ~
#include<linux/kdev_t.h>- o5 ~  H8 a9 i* v
#include<linux/gpio.h>
9 h9 ^& K7 x+ R6 ^#include <mach/hardware.h>+ P. C7 i; U, A' n# E, T: ?
#include <mach/irqs.h>: c; T: X* _  D9 E
: r# h8 W7 N, p* ?' _# Y3 [
#include <asm/mach-types.h>
' x: G4 C( M% y2 n$ b#include <asm/mach/arch.h>2 |1 [  Z% T1 p
#include <mach/da8xx.h>9 I) a1 C2 A* R- S* h1 W
#define  SYSCFG_BASE   0x01c140007 z3 U$ A( a4 f! r, @! j& Q9 C
#define  PINMUX1_OFFSET   0x124 . u, @9 n; Z+ ?9 [) r& }
#define  PINMUX18_OFFSET  0x168 + `. U6 X/ g+ W' t+ |# G( Y2 ^
#define  PINMUX19_OFFSET  0x16c
  V6 I, A) h! }#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
2 ]  z! j1 A5 c7 u2 K#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR% w3 t# y6 [/ O
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 ?! U. L- v% T- r4 h" W1 w8 g
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" Z- z: w, S8 y1 f  c. V
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! O6 h$ r+ N( D8 i! O                           
* c( C% z6 t! y4 g9 V#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 X, _- ?& P4 k- A2 y( o- Q
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR+ }! @) z' f4 i; R, \
//PSC9 p% I8 E. C5 q$ D
#define  PTCMD_ADDR   0x01E27120  * D  b! F/ z2 G; {  p
#define  MDCTL15_ADDR 0x01E27A3C
8 u# l; U) X. j/ g% K. [( i2 C#define  PDCTL1_ADDR  0x01E27304
4 i% B7 p3 x3 H+ W//GPIO8 direction5 D# F" Z: g7 w: V) V  k
#define GPIO8_DIRECT  0x01E260B0, A) w" [4 {" l& Z4 \+ W5 a
#define GPIO8_OUT     0x01E260B4
7 h- Y. g: m) |. ]#define GPIO8_IN     0x01E260C0$ J# F1 d8 f8 F4 h5 W2 k" V! M0 W

3 L3 J! I! \. ]4 p//#define MCBSP1_RINT    99              ) e9 N! j# F: g7 F2 T
//#define MCBSP1_XINT    100  ! I% x' W7 o8 B8 j% k
static int MCBSP_MAJOR=239;3 W7 x4 M4 R) e1 h
static int MCBSP_MINOR=0;
7 E1 k: j2 y8 d; m/ x5 K+ X5 tstatic int count =1;5 ^" F0 }( j$ l
3 d. ]1 g1 g. h6 i( W9 U- I
#define MCBSP_NAME  "MCBSP-device"
  w, T- K6 O/ N/ U. {& D3 J! o! f  A2 p
static struct cdev *mcbsp_cdev;
, `- C- E8 P6 _2 f# Q) {. fstatic struct class *mcbsp_class;
) C7 X$ m. ^) u4 O- vstatic dev_t mcbsp_dev;* T! x' A0 J" P, e8 I& X: o
unsigned int DRR_data;
+ k6 C' R' p/ k9 n% b; F  kunsigned int DXR_data;* T6 h9 Q( b, U' b: Y3 f
static int mcbsp_open(struct inode *inode,struct file *file)
9 x' J1 ]' @1 i2 l4 j{) U) `$ |" d9 m/ K) O
   . O5 O/ [  c* U+ }% M0 f) p$ F( W2 d! y, L
   //interrupt enable,initialized
7 M8 N9 R$ S" F2 M: z   unsigned int temp;/ ?5 X+ B/ E* x
   //SLEEP_EN(GPIO8[10])---0% J( ^3 q8 l5 [2 S' |" h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 U8 F* y! E) _. X8 y; h  w
   temp=temp&(~0x00000400);! L# N- T7 j1 u/ V
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' R: Z8 ]! l" B  //RESETn(GPIO8[8])----0----18 t- z' P( |3 h1 [" x
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 V, ~) ?  n  y& {# U4 ~% f2 U
   temp=temp&(~0x00000100);" q' T3 B: l/ w' D% J. s
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
" T1 Q3 J9 h; [6 O, v; I& ^   udelay(100);
$ E% _3 w  I. j, W' X* ~   temp=temp| 0x00000100;# K  o: e. t% H0 f3 \6 o) e( c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 {; z& K( e# e   udelay(100);% g; ^" }, w/ T  F
   printk("open success!\n");
* O" ^+ Y/ H* P$ {   return 0;
' z  b0 C5 z2 i; _- C: P}
* s5 L2 L  z1 m8 m4 d
& p. u1 O* u, q/ sstatic int mcbsp_release(struct inode *inode,struct file *file)
9 F# {# u! V4 ^  a9 r{
4 c4 y0 u$ @6 @   printk("release success!\n");9 Z8 C& i% K1 m+ i* H6 b
   return 0;
1 x/ X8 D/ @7 U% i+ x# f) H8 R}4 U, r) e  j$ U0 Y; D( T
- H6 _8 Q( L. H( A
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 R" n& t2 a. @1 T4 X  N2 V{
( Q7 C9 d% I8 i5 {2 S; }0 ^. {    copy_from_user(&DXR_data,buf,len);
0 s0 _& W7 s. A* F( X7 }7 e6 M6 B7 ?. z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 k0 A. ~) `# `% k4 y( z4 w' n! a2 @    return 0;+ h5 M/ n  |/ U1 _) U

) ^3 H- i  N# w. C}
! n' `( y$ P2 y3 n7 H
/ o' s$ @! s; W& O+ Astatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 F7 e- @0 A6 P6 x{ 8 Y. N; F1 U2 \  l* w$ j$ A$ @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! t' `) c7 M3 d# l1 `
   copy_to_user(buf,&DRR_data,len);
  @9 a+ x' y6 T3 U) J/ U   return 0;
: t  S7 l2 t4 p}; {4 N: b$ J6 b9 U

) Z# @. C1 o) I; I% |' G9 ]; t# W3 M8 ]
static struct  file_operations mcbsp_fops=
  L" O( o9 y# @, m( ]  D6 l8 Z{
* _! c- Y1 z) X6 o) G   .owner=THIS_MODULE,7 j5 C3 I( n9 W- w9 s& }7 o% v
   .open=mcbsp_open,
6 L* [0 n! E) c& u% C3 o  d   .release=mcbsp_release,( ~* A/ G, \- _9 ?9 A5 A
   .write=mcbsp_write,
8 W! n+ v2 h/ y0 a0 F   .read=mcbsp_read,' G" ~, [! Z: V, S
};
7 i: n; |5 U9 o2 N$ L# t* S5 c- }static int __init MCBSP_init(void)
0 p5 }/ Y  R' ]% L% I* \" S1 N{: E' V" a/ A" s- z
   int ret;
4 t# G' r/ s+ ]2 w* g) g$ n/ s   unsigned  int   PINMUX1_REG_old;1 n  u3 }) X, `# l8 ^
   unsigned  int   PINMUX18_REG_old;
5 b, F6 D5 j! k5 v4 M+ X$ Z' G) O   unsigned  int   PINMUX19_REG_old;
- \  M6 K; I/ B. e: b  f  s   unsigned  int   temp;  5 v: d9 y$ V- X* K5 e# e$ }9 w: h
   if(MCBSP_MAJOR)
3 i9 G- D5 d& j7 y/ ?' Q   {5 W! o% P  J+ C+ `" m7 |
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
& d- l- U4 E) W  J      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: ~, F5 F% K/ Y. z2 ?- I
   }
- _" T$ Z, }+ i' ]% ?: r   else
. ~7 M+ j% U8 T- u% \3 U   {- t9 C6 l  y5 U4 c
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ u/ G" C: y6 `/ J+ T      MCBSP_MAJOR=MAJOR(mcbsp_dev);0 s" G$ `0 C- v$ Y' O
   }2 t( T2 T7 \- r" q4 \
   
) c( G- O3 h4 D7 u. l' `! J   if(ret<0)3 q& t8 A  D! _5 b
   {
9 l% L4 k4 x7 `( z7 [      printk(KERN_ERR "register chrdev fail!");& b# K  v7 R8 L- n; \2 r$ o
      return -1;5 V6 N. p+ l$ m, K, k; g
   }
3 ~5 a5 h) A3 o  x1 L  x. Z   : y3 H3 q, }% z0 I5 w# ~& [* ]5 Y, s
   mcbsp_cdev=cdev_alloc();
# X% t; F% F7 \1 w5 W; k   
4 t9 ~" y# X; G( X# J7 L; L7 |   if(mcbsp_cdev!=NULL)
6 b5 _: F- D4 `( M. y' R   {" I- _, H) \& ^6 T. t" s- I
      cdev_init(mcbsp_cdev,&mcbsp_fops);/ G- _" ~! q# f# C3 j
      mcbsp_cdev->ops=&mcbsp_fops;2 F. D* W: c9 n, D
      mcbsp_cdev->owner=THIS_MODULE;
( s8 q% M3 g: [* f# G- y7 U2 D      & a. G3 @" J, R
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" ~) Q4 b& d. [. |& c# B  C  x          printk(KERN_ERR "register cdev fail!");- y) H/ I" s) H( i. A0 w1 z
      else
7 e  H% O3 H8 ^6 ?- ~          printk(KERN_ERR "register success!\n");3 `- r6 U' p7 R3 i/ O
   }
9 W* D7 [# u' X% [3 g   else6 l- B* M# M% B+ f: m
   {
) P5 p! `4 \2 O: e" E      printk(KERN_ERR "register cdev err!");
( t; d7 v8 L& j! k      return -1;
: r$ [/ |: j2 b' D" a8 S! W" Q0 D   }
% \3 C( Y5 b. J2 x+ S, E! Z, v   
9 Z6 n3 l1 C: q" D, c  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 T* Q, }0 P, b1 o" r8 S
   if(IS_ERR(mcbsp_class))5 Z/ G: R4 |* D& W, c% H
   {
% d& W7 r: H/ M/ X5 ?- Q' `      printk(KERN_ERR "register class err!");
; o3 O' ~% m- {! Y9 f8 G4 U   return -1;
( E( r" R2 o& P8 h, A' w; X4 V0 }   }' u; l5 B0 Z7 h9 B  c  I" R" }
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ l. L6 o1 e- B$ ?- L1 @7 T+ W" U* W, {
   //PSC$ C; A( y: N! v, h1 m
   //add Enable MCBSP* i4 \3 I' Y( I' q
   //test9 s- H/ V) p+ w6 }  V/ |, b
   temp = 0x80000003;5 s! Q2 v* m! _" T, [( ^3 M
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ n9 f' q" }5 U4 Z4 D5 A7 I: Z! Y
   temp = 0x00000003;% r. P. v8 I+ ^: B' T( @4 c) ~* c7 S
   writel(temp, IO_ADDRESS(PTCMD_ADDR));, b) x. ?7 q, M- S. f8 |4 W- k" F+ F0 \# N
: _- p' U2 p$ h. y/ b
   temp = 0x001FF201;
( Z9 T, `1 Y7 o, m# x! Y; |   writel(temp, IO_ADDRESS(PDCTL1_ADDR));* z* M% K: M3 Y* |7 P  J& \
   
& k' J1 Q' }+ [- k! ~   //PINMUX  
) R" p) c" Y/ R+ e5 J& [   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) K: a  m* R( I# G5 U
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
4 C# V) V3 n  e" E   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
7 a* n$ n! y8 g8 V' W( |   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 r7 T6 W% p5 I9 m: q7 F' E; C- Q
   ' W, a) s- A6 w( x7 q0 m$ H
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 u4 _4 d2 q. R, {3 C* ]" U0 `   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ a5 J6 l$ J5 ]4 h7 g
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
' T! F" T' Z8 C8 Q   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 p' C: j5 F. h  E4 \3 A3 x6 Q% y5 r* U+ |
5 l+ T1 @+ ?0 J$ [, U8 q; |9 y% B   //RESETn,L138_SHK25 R1 F- U, J0 q5 J# b4 r
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
2 c$ v5 {; a7 M9 d   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
9 n1 E" g- g6 I) o/ `   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ o# y" O$ p  g: v9 P, P
2 _* G: K- [* D- [
$ G6 x: C4 B! ^* c7 V  //SPCR Register' h9 v6 `% w8 y' Y, |9 `0 r
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset* S/ v6 S3 m/ ?! n( `$ P0 y* Z
  temp = 0x03000000;//(DLB=0): b+ B, ?/ v3 M) K) y
// temp = 0x03008000;//(DLB=1)
7 M! f% X6 K4 E$ e9 ?6 A  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; ^& x. E* k  N0 }4 A- c  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 X8 ~8 p: ]; u- ^  printk("temp=%x\n",temp);. v% s- H5 o: u  _9 p

0 C" v0 S, D4 n- o8 e% _4 l* A7 Z   //PCR Register
' C  i5 Q' m5 c   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 e3 x+ b0 |* C6 l7 w  r2 {
  // temp = 0x00000F0F;
+ ~( l) T$ }  c  temp = 0x00000B0F;
6 A* y; A1 e% d- ~  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ F  K- y% M5 O7 D
  temp = readl(IO_ADDRESS(PCR_ADDR));- O6 ~& R& l0 s: w! O$ f' a1 g) c
  printk("temp=%x\n",temp);  % ^/ V: x' Z7 Z
   //SRGR Register
7 e) R+ Z6 x. p" ?, ~4 _- y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 Z3 F8 M) Z! L- F7 a. p. p% r1 X //temp = 0x301F000B;% g) [% Y. l, Q  O" ^
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 6 H/ d! g: S2 e0 W1 p( h
  temp = readl(IO_ADDRESS(SRGR_ADDR));, Y  Q5 W) y* i% g1 `: N4 ^' H6 P5 J
  printk("temp=%x\n",temp);
3 W1 ]9 H2 d9 v8 J   //RCR0 D. Q1 n! e1 [
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ e+ b4 L4 _( w& ]! D3 {   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ R& L( w1 T5 ?6 ^   temp = 0x00440040;
# E# c7 A: N# O9 u6 s9 `' H# p% h   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ! m2 Y9 y8 W- h
   temp = readl(IO_ADDRESS(RCR_ADDR));
4 \9 n5 F# z' W8 p3 p   printk("temp=%x\n",temp);: U# _9 _' \: S
   //XCR6 I, l2 d2 h& U: ~* [# F# E
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ E, ^# \! I3 }4 v4 z! @6 b
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 Y6 c1 G* K- ?2 p1 ~) |  j/ j   temp = 0x00440040;
% F! F) F* }4 ?. B# p: e   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 O. I  b1 W8 w0 `( z   temp = readl(IO_ADDRESS(XCR_ADDR));; A/ G" i, W7 |* s, a+ s3 M
   printk("temp=%x\n",temp);  K6 z% b5 a% m' Y* s
  udelay(100);
* U- k( R5 U6 C# a  //SPCR Register6 d6 x' a9 j2 P; K- L
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ m) G! T, r  x2 x  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
5 e4 J2 F' t$ I& ?5 B7 P; k  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled$ d4 c9 F% y" |* j9 @: M
  temp = readl(IO_ADDRESS(SPCR_ADDR));
' t- O- e9 x% \) J9 h0 ?  printk("temp=%x\n",temp);
6 B  ^# w& a- F. \7 q$ j  udelay(100);: A4 p; L9 O/ [, N  V
0 v  ?3 {& @$ E$ J
  //set GPIO direction; C' y5 u" W5 |2 s
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ ^( l6 Y- N: R* y   temp = temp | 0x00000100;//EPR----input  P# g- P, M1 w3 I% i
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 \4 V/ s* O* a   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
" T/ N4 q: e* b2 |' h8 ` $ G2 z/ J, `4 F1 X
   return 0;
8 ?) p: \5 j6 |9 h% X, b1 v& @/ N& ~}8 O2 H; Q7 b: [# s: u0 s
static void __exit MCBSP_exit(void)7 i* H% U0 Y9 \1 ]; E
{
) @. O2 b; _! j7 s8 o! t+ Y1 m   printk("mcbsp chrdev exit!\n");+ v$ p" L  H" x/ I; D8 n5 }
   cdev_del(mcbsp_cdev);
+ h! S0 Y, q  ~! a# n. n' [   unregister_chrdev_region(mcbsp_dev,count);
3 Z" |7 `9 `1 n/ \   device_destroy(mcbsp_class,mcbsp_dev);7 P$ p  d: N" ~, ]3 {
   class_destroy(mcbsp_class);
5 q1 ^6 y1 q! Q" H; l}
. w8 b3 D1 U6 T5 y! |7 Y- e% nmodule_init(MCBSP_init);3 X% x6 {! h: G$ x7 F
module_exit(MCBSP_exit);8 V* N0 P% `  j' q% }, C
7 O1 n0 \9 G% ?: e, w
MODULE_LICENSE("GPL");
. h4 W- j) d% Y
( R. e* ]# p% }2 A4 p我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" G; A* q5 g; v* o  p9 [3 T% S
我的应用层的测试程序如下  Y% j+ C: m" o" G
#include <stdio.h>
. ^/ [# V% G. i' n5 H% n#include <string.h>
0 O- i% K, _6 D#include <fcntl.h>  ]7 D$ V( w% L- Y. D3 w
#include <unistd.h>
. b0 \3 ~+ P  a! s#include <signal.h>2 g8 {9 s4 J; f& o7 |$ m* U
#include <pthread.h>       //线程
/ H! Q& ]8 S; X#include <stdlib.h>
! T2 A$ B5 O: f#include <pcap.h>          //捕获网口数据
* c* R2 _1 N9 M9 A, E0 U#include <semaphore.h>     //信号/ i6 W# S' m- k; M3 U& K$ G" {3 z
#include <sys/types.h>     //消息对列8 G( H4 s* J8 h) h9 g* G3 Q1 o
#include <sys/ipc.h>       //消息队列8 U" O/ K# l9 t, k
#include <sys/msg.h>       //消息队列3 x9 y: z2 g- v: E  q# |" ^
#include <sys/select.h>
$ p6 q$ V% ]$ r2 C#include <sys/syscall.h>
" X2 f, p- u- ^% Y- T! a8 M#include <sys/stat.h>
! Q' I7 L6 B0 g9 _( ^; Z1 I#include <sys/mman.h>6 A4 g/ ]" I) N: Y. j; G
#define msleep(x) usleep(1000*x)
+ k" b7 ~8 X' `* O0 V$ p5 V# g: M6 r! k
int main()
8 N. D& l( q* g. O{ - P9 |, [0 G) n& A
    //MCBSP,ARM与AMBE2000交互设备
! a) m% [* ^3 b4 ~ int fd;1 K: _, A5 w4 b* u& K& q# [* m2 i
unsigned short data_write = 0x5555;
  g  `" l# e- E unsigned short data_read = 0x00;  J- S" }4 w( Z
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
% i% M3 g; I5 W/ b% M; N //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 |9 d9 m- {: N8 F" _: y& V! [    9 H3 h' s: d% \# D/ [! s
  if(fd < 0)
9 ~9 D5 x" r( I8 o; W! n6 D  {' g0 J# k: e' f$ l6 |6 `- T
     perror("open failed\n");
% J% z1 U5 U1 q* v, s  o& c     return -1;6 l+ @- {% ^) k9 U  J; ^% q
  }
. O( Z: O& }6 a- J% w9 k  : [+ s+ [+ E, w  m) D. b
  while(1)( x1 k5 ?5 n5 j8 j
  {
4 V1 z8 ?. G0 _* `# _: M   ) G) P7 m, d8 G( Y, V9 J1 Q# w
   //AMBE2000每次读写是24个字为一帧
/ w, I- ]9 B: d* g- B9 \" s   //写数据时将数据在底层存储起来,等到中断的时候再发送* n4 o4 @  n8 J" _! P* @; p
   //AMBE2000输入数据是以0x13EC开头的: |7 b# J- F! f/ ~7 J  H
   write(fd,&data_write,sizeof(unsigned short));9 E0 b% M+ {$ ^3 u) c, V
   
; j! T8 j( P1 e7 v# m   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
' M. E( |1 r- l5 |% i  R   read(fd,&data_read,sizeof(unsigned short));
; o# x, L% B( e# P, w2 H+ e   8 ?) U6 ?+ P$ x! v- O4 v9 G  q/ M% H6 I
   if(data_read == 0x13Ec)
6 A. i. R$ c. X- _( B   {
# p  U# v8 c# p( h) i1 @   
" F7 K$ \$ g8 v6 b# }+ N2 m    printf("data_read = %x\n",data_read);
. C# B  H! `* S3 J- l   }
, u7 j5 J; U% ?" R  L6 Z/ r   % m: J. q, r% L8 k  `3 W* l. T
   msleep(10);
' h: L; ^* P% A; i* R    M) I9 s8 k  _/ W3 u( s
  /*4 R4 }' K( f* `2 P/ m0 o  c
   ioctl(fd,1);   6 M- A6 b: [. @
sleep(1);
) U/ N" Y3 R7 z" S) P. k ioctl(fd,0);8 j7 o, H+ n4 z- w1 E4 M$ v3 @
sleep(1);( `$ E1 V& F' S
*/
" q" q' H( K7 g* [! ^- P, c5 U+ ]  }   
) p4 {, i, \% s" }1 X( o( F4 P return 0;# d" g) P8 C. ^
8 h" N" H% r; o: I+ Y6 b
}/ t4 N7 x- H  s' Q. _

& Q1 Z2 s* N1 M9 d6 G: V8 P( q! o多谢各位指教,谢谢! 急- w. _6 L4 p5 M0 X+ u' g' N4 Y5 R
, O+ p; R. ]) `4 e/ p, g" @  c' W. H+ O: ?
4 j  ~! C- k* {8 U) F6 t
. ]# J/ b* r3 Z; g; ~) B
: f! D8 s) A" Q( B& A
3 ]- Y( H3 z/ `0 x, }2 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 11:33 , Processed in 0.048229 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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