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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" d: W8 f( \8 B  U: t/*
) R! u" _) x. i; e; G/ f * Copyright (C) 2009 Texas Instruments Inc' H4 B  z  N$ G- r- Z' B$ Y+ y
*/ q8 @4 q7 s1 I
* This program is free software; you can redistribute it and/or modify
. A, c+ Z! m2 P  h& W( a * it under the terms of the GNU General Public License as published by
$ f0 C. M0 q. ~ * the Free Software Foundation; either version 2 of the License, or
. \( S7 G; \% N+ t/ Q * (at your option)any later version.
9 c$ e% ]0 ?$ P *8 L8 S# B$ s/ Y/ p- i7 A# W7 a
* This program is distributed in the hope that it will be useful,
7 N+ G+ }4 j9 Y/ L, C5 R+ Q* ] * but WITHOUT ANY WARRANTY; without even the implied warranty of  D9 A+ z( ?8 E0 {( ]1 r  _
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5 f' `* d/ L' N
* GNU General Public License for more details.% Z6 s1 U, H  l
*4 O: y  |9 }" `  |6 x2 N: Q
* You should have received a copy of the GNU General Public License
! [2 }; U' h! G$ K! k4 E * along with this program; if not, write to the Free Software
) s: J5 ?& W# v+ x# F * Foundati! d- X  y- D2 \6 G, |) A' M% Y
*/) c2 X3 {: L$ ~9 k/ N# X; y" X
#include <linux/module.h>, T8 I8 n; O3 K1 Q7 A  K
#include <linux/init.h>
" c! g. V# o, m; ~' p, a# e  G#include <linux/errno.h>9 y# n" T& E* u$ N7 U. Z# e
#include <linux/types.h>1 N( f; M5 V  P
#include <linux/interrupt.h>
# s$ s! l' F" o# o  v: A( q" F#include <linux/io.h>2 B5 U- |& x: A
#include <linux/sysctl.h>
$ S3 ?( [$ d& Y% i  v9 t: T. a) U+ |#include <linux/mm.h>4 q+ \& j3 [/ p
#include <linux/delay.h>
7 r4 [! }, ]4 _. s#include<linux/kernel.h>8 Q8 D* ^* m. x
#include<linux/fs.h>; K. {- B7 W4 r
#include<linux/ioctl.h>$ u- g6 D; o6 o$ s5 B. G- ?
#include<linux/cdev.h>
7 a4 O4 f! i/ Z$ A1 `& `#include<linux/kdev_t.h>3 c5 i* [# W7 I# @# Y
#include<linux/gpio.h>
9 H+ K2 x* [6 u* [#include <mach/hardware.h>4 p) V6 o) o! G5 F- E
#include <mach/irqs.h>' W: d5 ~: E8 ~7 ^, v8 F4 K
3 H. |" u8 t; y9 A1 i
#include <asm/mach-types.h>' ]' s0 j: Y& L' K  @2 w/ l! s( f
#include <asm/mach/arch.h>4 u; s9 H% G9 p( T1 _& O, q2 m5 @
#include <mach/da8xx.h>
0 |; Z3 H. T& a4 b6 d3 c: d. K, C#define  SYSCFG_BASE   0x01c14000& L* l# S. s# N( w+ z; S) G( E" V8 h# m
#define  PINMUX1_OFFSET   0x124
4 q# B: K8 `2 r; f% ^1 u#define  PINMUX18_OFFSET  0x168 8 R' y: Q/ J; \7 e  `
#define  PINMUX19_OFFSET  0x16c/ x1 F& P$ ]) d% b+ X5 B7 ]
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: ^, U/ j, a- M5 l2 C: L  E#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR( }7 E0 g( q8 t
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR$ E4 y& y: D8 E7 P+ k- \
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
6 Z8 Y) X0 L  u#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! N0 R: ~6 Q* X: n7 B                           
* U* ?' V) T7 C7 ?#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
# @0 u8 E6 r8 j0 s1 C#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
2 s: T3 N5 f) v: u4 X4 s//PSC
- f* M- \7 m, ?) D#define  PTCMD_ADDR   0x01E27120  ) Z5 u  }" ]: h! J5 S
#define  MDCTL15_ADDR 0x01E27A3C: R) L! ]5 F2 z4 v* R
#define  PDCTL1_ADDR  0x01E27304
; p1 M" s  H! U8 ]$ y/ m3 x. @//GPIO8 direction- e$ o  `# I) h& K
#define GPIO8_DIRECT  0x01E260B0
" b$ \& i6 s" K% q  A#define GPIO8_OUT     0x01E260B4
" l; T& r' R! t# u) z#define GPIO8_IN     0x01E260C0
9 |3 _( [  K% v" g6 r8 \" |& a
/ K$ }5 D/ e4 _' ]//#define MCBSP1_RINT    99              
0 t% D; g$ E' V' S//#define MCBSP1_XINT    100  $ W4 P( x* Y* w, \$ R7 l& W
static int MCBSP_MAJOR=239;* X3 S' u+ d/ {( z9 a# u( l* A7 f5 y( v
static int MCBSP_MINOR=0;( N* }3 j7 R) \2 \. a+ R! H' O' O
static int count =1;
2 G* M( M: C" S  N" _+ S+ G  ^7 ]9 ]: t) g
#define MCBSP_NAME  "MCBSP-device"" `" p$ V# V4 [( p

) t$ u$ Y! w2 l; V. cstatic struct cdev *mcbsp_cdev;
9 v4 l" H( z5 ~+ b9 N4 y# B% _; g9 Hstatic struct class *mcbsp_class;; @7 y( S$ R- q9 K- X& H
static dev_t mcbsp_dev;/ x& |: M" p* j- x4 X. }  c$ T
unsigned int DRR_data;
4 W" j5 }/ _3 b6 |+ K# n; A8 g2 Eunsigned int DXR_data;
; c, S- [& f0 D" P: L1 zstatic int mcbsp_open(struct inode *inode,struct file *file)
- x7 |' q, {! l{& ]5 `3 q0 y# f9 S! M
   
6 f% o; V, C; A) f   //interrupt enable,initialized
* y% a# H) N# e% R7 @% T( ]   unsigned int temp;5 f, i; P! S( D# C: N- U
   //SLEEP_EN(GPIO8[10])---0' h* G& u; R$ V3 Q  q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 m* n" K" ?6 ]. {& c/ Y   temp=temp&(~0x00000400);+ V- O; B" }2 l7 ]- B5 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ y4 w! E3 e( ?0 o% w" o
  //RESETn(GPIO8[8])----0----1; b9 P: k# k4 R4 |8 Y7 z
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ u. w; R4 A/ ~, d
   temp=temp&(~0x00000100);4 J8 p5 w& f# j7 U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% ~  p$ }0 D/ b# Q, `! ^% ^; v" j. p   udelay(100);
1 j) p; M( c' j  v9 s; l   temp=temp| 0x00000100;; h: y5 S4 c  q# e& o8 q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% b8 f& B" z3 Y2 W1 Q7 S  l
   udelay(100);9 T% w( g1 u1 B1 V
   printk("open success!\n");0 ^, [" ]; s! c7 O
   return 0;
  i4 u. C; [% F6 k# q. T2 g! L}
+ ]5 K2 ^1 Z7 `) q1 N
, }# l" x/ b. p- T& `- Q$ ostatic int mcbsp_release(struct inode *inode,struct file *file)
# f. ^5 u* R5 ?9 _7 |# G6 `{
; |+ t1 C) ^  }7 S2 x8 ~% E7 y2 u   printk("release success!\n");
8 c( q& q  A" a+ ^( t   return 0;
* F$ e- H$ \/ k+ f' q$ m3 m}4 u$ u$ f; \" Q; V' W: \* f+ W) ~

1 J/ N, s( d, {+ j! v  `  k5 [/ Vstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
$ H; J; W; q7 j: ]4 A{
7 @8 [, i  S# R# f! I    copy_from_user(&DXR_data,buf,len);. m, I1 t# N$ @3 v$ X. n- c
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       2 Z8 K5 {( v7 g$ |
    return 0;9 C( c8 h* C! F! z4 K

7 h" a7 J' e! \# O$ K4 J5 z}  J! k; p: c0 G) r; d: Z/ i
3 T. M4 W+ G4 ?$ j( v( ^/ O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
. H( S4 `6 p7 P& X  z% _& Q{
4 v( E( \$ S1 Y$ d   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) T7 C0 n* P5 H$ ^   copy_to_user(buf,&DRR_data,len); 6 N4 v3 ~0 Q* q6 ?8 _# |: X
   return 0;
' {8 l% s" S' S}4 E6 d5 J+ [& M6 `
0 V9 h4 B- c. Q3 @3 s6 e

5 d$ H1 _0 I1 s0 E: y$ jstatic struct  file_operations mcbsp_fops=9 e" }- e5 _0 L7 _6 ]
{$ S- L- E: y" p+ T3 n, c2 l+ w) s
   .owner=THIS_MODULE,2 ?3 L3 K0 D; t) C# C+ J9 O) e
   .open=mcbsp_open,
- }2 l- F  @+ K* l! d* j, R   .release=mcbsp_release,8 D. I) l1 m; Z0 V
   .write=mcbsp_write,
% ]$ E3 x' N% v3 O" b/ Y   .read=mcbsp_read,
& J' L, i2 \$ w0 y2 _5 @' a};3 g& m" U! K5 |0 ]7 W2 o* M7 _
static int __init MCBSP_init(void)8 b& u1 ?. r$ D7 s. K# k0 D
{/ C+ D! t' W0 g/ n. B3 |; \. g
   int ret;
: j5 g  r( u0 E5 L! p8 T, p1 B& O# U   unsigned  int   PINMUX1_REG_old;
2 A3 v! C0 y6 I" e$ K" }2 w4 }% m# a$ L   unsigned  int   PINMUX18_REG_old;
- T0 Y- v: c* j$ s; B2 r* ~! g   unsigned  int   PINMUX19_REG_old;7 X1 e/ x$ K  N. D8 q: q
   unsigned  int   temp;  ' _) z+ S$ W: Z' J" @$ s, B
   if(MCBSP_MAJOR)
- x8 ]9 d" w; s% P. k   {3 P2 I7 D, K3 L1 f
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% Z# i3 w5 W2 p1 g' w      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) [; l4 y7 X3 |! d  q+ p
   }! Q# j. Q) y& V0 F  G( H
   else" Z3 ]/ y7 ?/ v+ U  e0 q
   {
: o- y1 m, E$ b% y# X2 i      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; B& v) p& x: X
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
0 b, [' W6 r+ w" s) [  ?( r   }
% x* W/ ~5 l+ o$ y   
! @, T, k2 F- ^/ O   if(ret<0); v/ S  |4 t% P: a% U" _
   {* k5 B# m2 C* f8 \$ F5 s) g9 y, H# p
      printk(KERN_ERR "register chrdev fail!");  m: M$ ]% X; }% j/ n
      return -1;
) V3 _) s5 B4 j   }+ i/ [4 Z, z4 V! T2 B
   4 r' Y7 ?- P# o, F$ F* n1 ]9 B( Z4 V
   mcbsp_cdev=cdev_alloc();, s- {+ S4 J! q& g! J( G
   . h! w( Y- i6 B" i! I0 e
   if(mcbsp_cdev!=NULL)
9 V, e  `/ X: [6 @  Y+ e, C   {
' n$ q& d7 W, |0 a$ F      cdev_init(mcbsp_cdev,&mcbsp_fops);' F3 D3 }1 {7 ~7 _% ^0 r  t& C& F2 j' }
      mcbsp_cdev->ops=&mcbsp_fops;$ E: \0 e5 M1 D5 f
      mcbsp_cdev->owner=THIS_MODULE;
, w9 t6 ?% }* F1 B      
; H  ?# e6 c. k' s" x# e      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 ]  Q- C: C# J* n
          printk(KERN_ERR "register cdev fail!");7 O9 f" D2 d8 `' [3 Y
      else
/ I$ @+ ~1 o3 |, Y          printk(KERN_ERR "register success!\n");
8 U* z' o; E  S7 k* |7 z   }4 N  C/ k! a. x" g  J# Y) r% s
   else
: Z. Z: `0 [1 x( T   {
. _9 V* }. e" |5 @8 V! K$ f      printk(KERN_ERR "register cdev err!");: f. L5 L- s$ M( t8 j! ]7 z
      return -1;
) x  p3 v# N$ d1 Y- F. u! E   }
, S2 v+ e: y/ v   
* I! E- o9 g1 u/ C  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: ^4 V: N$ o8 G& b/ j5 M
   if(IS_ERR(mcbsp_class))
% e7 K5 O( ~; ?7 ]. F$ A   {
3 j$ W  a9 B8 {. W" _. I% n0 N0 X      printk(KERN_ERR "register class err!");
; F8 ^0 D4 D5 }   return -1;+ I" N9 y+ Y( o) R  ~* G4 q+ Y
   }+ u* ]' I2 }5 Z% ~
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- w" Y4 W" i7 }. C  D" m8 r

9 M4 F4 F! b# W0 R8 b; J   //PSC
3 }6 m, y+ `2 w9 a   //add Enable MCBSP$ S3 Q  V) S3 _5 z( ^5 x; d1 t" c) h
   //test( ]% X9 C# h8 K
   temp = 0x80000003;' k% g0 k; Q1 c; W6 ^+ w' T
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ n1 S2 V  _, \* l0 k
   temp = 0x00000003;
+ Q$ u( H1 O* c6 ?# G+ c3 V   writel(temp, IO_ADDRESS(PTCMD_ADDR));
) J, W  J+ P+ }8 z3 F ; U# p7 \% |  R, F. }8 d% d% G( i
   temp = 0x001FF201;0 D3 r+ ^7 t$ ~2 X' C
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; \+ X9 x( g( K! @
   + [* X8 a9 c. T2 A) W+ l
   //PINMUX  2 b  \8 S5 m: _. C9 k8 ]% f) j
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,6 M, E1 r7 Z, [, m* I) `( v
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
5 c( C2 n5 W( E0 ^# J   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   " K! K" p7 z& A$ q  F* R
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 H6 m, A6 G1 T   7 `, T' E# O' p
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
* i. j' W/ e) _   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 V! _/ [! n* p2 u2 h/ q+ L5 t   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% x2 m- V5 L! t( n& X2 d9 a" q# k' M# P   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# Z6 D% q# e$ P, D" A
+ V+ ^1 s% D2 G" v/ [3 n# D7 B   //RESETn,L138_SHK2
# ^3 C/ J# G! ^: a# r   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
7 W% S7 Z! l, u" d7 \  @+ B   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 ?* U+ S+ C, e- _2 W' @7 \   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& v8 w, z/ N+ p4 M$ `0 J) T1 h $ o) p+ Z- z4 G* E2 v* Z
8 y% y  F: e# H2 m  v- P0 q
  //SPCR Register
% j7 v  T4 a& R9 G$ U, b  W4 T  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 y: G4 X# a& L3 n1 F  temp = 0x03000000;//(DLB=0)
7 g# x- e  I4 b7 n // temp = 0x03008000;//(DLB=1)+ |- f6 g  g6 K; o5 u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- D5 k# `6 M* j  temp = readl(IO_ADDRESS(SPCR_ADDR));: L) B& k" G0 V- q8 @
  printk("temp=%x\n",temp);
* Q/ n3 F9 `) b1 o3 O8 q& } # _0 e9 ]; O0 m
   //PCR Register& ^( w! f( |5 ?6 |
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-03 D5 i# ^- z3 ^/ K9 [
  // temp = 0x00000F0F;
% r2 M" e8 ?) m! Y& z4 W  temp = 0x00000B0F;
1 E5 @0 q' x7 F  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " Y2 V2 o+ C  p: a: {
  temp = readl(IO_ADDRESS(PCR_ADDR));' I3 Y2 N- ], J. {+ G4 k
  printk("temp=%x\n",temp);    z2 K) F) ?! `
   //SRGR Register3 b& g9 S4 O: m1 @- ~+ Q4 U
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' K8 I. g/ V4 k& @! S" R1 e
//temp = 0x301F000B;
  J& G/ W* }3 ^* m   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 [: u( G- S# c" N$ k
  temp = readl(IO_ADDRESS(SRGR_ADDR));
+ }, ^, ^: v! R9 o1 w4 }8 A0 W  printk("temp=%x\n",temp);
: @  k5 t% _7 v/ Q: m3 b6 A   //RCR
9 W1 E  I4 d) ~   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! s! s  o' p$ p& `* B1 h. ]
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 `# n0 @1 F/ @6 V" }
   temp = 0x00440040;5 q* P* U& x) Z4 g. U2 w
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
2 e7 _+ m" g* b( v. w   temp = readl(IO_ADDRESS(RCR_ADDR));
- v2 P& @* I/ A& u" w( C   printk("temp=%x\n",temp);) {* @  \5 \: G0 W
   //XCR1 U+ b& i) v( s, }2 L
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! v- ^* V( N+ P, S   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: R& h- x' c' O$ ?( ^* A
   temp = 0x00440040;
& A  o, _3 {! X" o" ^4 c   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
4 X7 i6 l9 N+ h% o. O. e6 p   temp = readl(IO_ADDRESS(XCR_ADDR));
2 t& P8 c' \2 ]& f/ D6 {' k; W   printk("temp=%x\n",temp);& q! u  O. `' k
  udelay(100);# @( v+ ~7 f1 U7 ?$ m
  //SPCR Register" _+ u- Z8 b# W3 d
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
0 ?2 k- ^: z8 I6 d+ v  temp = 0x03C10001;   //DLB = 0 VS DLB = 1$ o) k4 ~1 \: W" _8 n
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: K% X6 |. M' z5 `$ i/ M% I  L2 \  temp = readl(IO_ADDRESS(SPCR_ADDR));
* t: G$ Y% G7 j, o8 f1 D  printk("temp=%x\n",temp);0 y0 `3 {% @# U% F9 V" @
  udelay(100);
+ x- l* m/ j1 F7 g, w* n1 P4 l; a, ]' W; p
  //set GPIO direction, ]6 Q# G  e# Y
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" V( W+ m' H6 w   temp = temp | 0x00000100;//EPR----input& x& U7 |  x! n
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; A4 I# [; h& m& ], R0 I
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 {8 Q% N; _, z1 x  p% M
1 n' J$ \, O' R2 o0 L6 n  H/ O! R
   return 0;
0 N: U6 D# w# h4 Y- J6 @) `}
8 O3 h+ M& F9 u2 I# e0 Kstatic void __exit MCBSP_exit(void)
5 }& e6 P* _: ^$ a6 [6 d{
) ^  @0 E/ }# p4 p5 r3 ~   printk("mcbsp chrdev exit!\n");. W0 d+ N) g% P. W1 Q. m
   cdev_del(mcbsp_cdev);
8 O. c* i+ |) @, M. R0 X' D   unregister_chrdev_region(mcbsp_dev,count);
) _, q& D8 p$ `! I   device_destroy(mcbsp_class,mcbsp_dev);
5 R! n  K; r: Q) p0 E   class_destroy(mcbsp_class);* F, u$ \6 O! `& A% A& T
}. W6 y8 U$ c% ?+ O/ _6 V
module_init(MCBSP_init);3 \! A4 S3 q0 X7 X9 |
module_exit(MCBSP_exit);, e: W  A' E; j: E9 k

+ D5 {7 p* _7 p# M8 kMODULE_LICENSE("GPL");- h: P* @& [/ ?, |& D* Z

# q- i" P. R- m2 z6 \2 _我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, V6 a  t; v9 h5 e, i( f我的应用层的测试程序如下
+ c4 N- F: Y1 B3 B#include <stdio.h>7 _3 A2 K- V. G7 N( ~
#include <string.h># _# z7 x! ?" ?/ [& y( |0 N+ |
#include <fcntl.h>
( d. l0 u, z; k6 W( p& B4 N#include <unistd.h>
. g" O. [/ @8 G. f, h, [# d- D3 s. s#include <signal.h>
+ O3 \" B8 W% _* w#include <pthread.h>       //线程
0 d4 L6 G0 z# C( w#include <stdlib.h>& H( [# x* M9 j; |' y
#include <pcap.h>          //捕获网口数据* V8 Y) H( c' \6 ?+ O- M) C3 h
#include <semaphore.h>     //信号% ]/ M6 h3 d1 C3 a2 X  s
#include <sys/types.h>     //消息对列) C8 I, h% x' o, b. P, J8 H
#include <sys/ipc.h>       //消息队列
# A. Q5 H7 {2 \" w#include <sys/msg.h>       //消息队列4 n+ A; ~& b0 X+ W" P4 z: Z5 L
#include <sys/select.h>$ w: p9 d1 a2 M( N6 A) Q
#include <sys/syscall.h>
: n9 v2 r3 R/ N1 U* E. Q: {7 K3 r#include <sys/stat.h>
* `2 ^9 x* p; F) d- e#include <sys/mman.h>/ h" O; B* y  W, V4 w
#define msleep(x) usleep(1000*x)
' ~/ X  w/ ?1 l; G
) d: \; Q2 P) Q9 cint main()
; G, j7 h4 R+ i{ & O' _  C  E' U8 E4 v( N) C5 M
    //MCBSP,ARM与AMBE2000交互设备
  x* e: }$ ]" S2 ~  M int fd;
3 }7 C: {, x, a$ d* C+ ?8 [ unsigned short data_write = 0x5555;
9 G$ {& G0 u& v$ {- H) i  h unsigned short data_read = 0x00;/ T' M7 Y! E8 o2 z* d& [2 E0 P
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 g! ^9 r5 H/ ]; c
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. d  e( b2 ~3 y$ [2 B2 R
   
" b( Q0 [9 d: w: W6 o  if(fd < 0)
2 Y9 m6 e/ v% U. q& G' c! o  {
8 a: u& t' [1 E& p- {4 t     perror("open failed\n");$ w4 W: H. s7 r/ r& \- W* x/ X* n! k
     return -1;- P; s2 a" J6 e8 Z' r. T/ Q
  }: D$ k% C2 B$ L* m# ]6 e
  
; m1 o' M" Z+ Y' s  while(1)0 M( s5 U, Y: w( q8 w4 S! B7 S
  {# R4 X6 }" C. V. T
   
, o) L1 o2 B) {+ {# k) q   //AMBE2000每次读写是24个字为一帧
) P4 Q! a# Y/ M; c0 a. ~' W$ a" X   //写数据时将数据在底层存储起来,等到中断的时候再发送7 Z  a- R1 D" ]  Y6 P0 ~. X
   //AMBE2000输入数据是以0x13EC开头的% _# Z0 C# h' l0 f3 ?: V) A
   write(fd,&data_write,sizeof(unsigned short));/ u9 O" C) \  I/ P; w
   8 S: K% `- ], x4 W
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
0 P' f+ H/ V0 n1 C# |/ B# x   read(fd,&data_read,sizeof(unsigned short));+ b* W$ l2 C! i
   
8 H$ d$ ?  e; ~+ ~   if(data_read == 0x13Ec)2 a. J8 R- Z# ^1 v
   {
6 @- T- R$ m1 M% M9 O* L' a   : A$ Y; f% s; p; H; a
    printf("data_read = %x\n",data_read);2 `: ]4 G% R! D; B! j' {
   }( y7 E4 f+ O: y6 r9 Q) n9 P
   ( G" h% j2 }. E% j! s
   msleep(10);
; C4 l0 s+ W: O; q2 L  
" q) G- x& F8 [& k9 G) E; l- y4 f0 g% ?  /*0 U! e- T3 \- Z  O! n; y
   ioctl(fd,1);   ' b' {, p3 I! O9 E
sleep(1);
, A% A9 F( x7 w* w ioctl(fd,0);# p6 h* Z4 ^' p9 }; Z
sleep(1);
3 Y" H8 c# @8 o. j9 G2 o */
! A5 S) }, G, H+ @5 O: J, U/ `  }   
1 J1 m) J0 _7 m) b& y4 I return 0;
0 A8 ?* B( R  m6 w, x0 a
* Q6 z3 ~7 f+ a9 I}, Y. Z  F9 [3 f1 R/ d

: O7 |% k' X( C4 y7 r/ s7 |多谢各位指教,谢谢! 急& Q8 |) r  A# \% C
$ s4 R. p# }, P: z8 N7 ]% D) P7 ^

: N$ P* k- z* k5 v$ X: ]6 \4 C8 ], p2 O5 ]; f! D5 z% ]) \

1 H: P1 z. t1 @, l( f, O9 q, F
4 _! ?* R. N" ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 11:53 , Processed in 0.049955 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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