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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( ?4 _% x: D, I6 q! k/*: x3 c7 W% g5 k
* Copyright (C) 2009 Texas Instruments Inc3 d2 u3 r: S/ B& g# T( b
*
3 }& e+ Z: A" o * This program is free software; you can redistribute it and/or modify
4 I( T) S6 B2 Q) X, {; p * it under the terms of the GNU General Public License as published by# D/ b; m' `5 V5 l1 F# ?' F" s
* the Free Software Foundation; either version 2 of the License, or
+ S" Q9 ?4 }  d * (at your option)any later version.
. G; p* n. j1 ^1 j *
$ _0 ?6 Q4 B" r * This program is distributed in the hope that it will be useful,- J+ ]+ G" `, y" v$ y* D
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 ~, _' j6 B# R6 d# Q+ Y3 I' k) U
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 V3 `8 R, s6 u/ k/ C' Y/ _; z * GNU General Public License for more details.' ]$ w. f- k5 Y$ O+ m2 e9 L: Y
*
$ i2 |7 _. O5 p9 I$ E6 d$ o * You should have received a copy of the GNU General Public License
+ P; ?- g2 B0 X% F, E4 z, q# k * along with this program; if not, write to the Free Software
5 k8 V& g3 A0 {% j1 T) Y& |# v$ ] * Foundati! ~1 x7 l. k( P6 J8 e# G
*/8 b1 w* F/ z0 X- O
#include <linux/module.h>
, s8 t4 v  E; o2 _2 m#include <linux/init.h>
$ D) v! L1 o$ `$ }6 u4 t#include <linux/errno.h>
. B; t2 i) \8 K7 ]) z#include <linux/types.h>/ w7 l, a. f' y# Q1 ]4 a8 y! h
#include <linux/interrupt.h>% t1 E) ]3 |, ?) Q+ x7 ^
#include <linux/io.h>' {* h' F* V2 s4 x
#include <linux/sysctl.h>8 W9 q" _8 a+ `
#include <linux/mm.h>
9 z# @  q1 E, n: a' N; d/ J#include <linux/delay.h>
+ y0 M4 z7 N2 p# T, D) h' G#include<linux/kernel.h>, d/ Z! w2 u& O! Y+ j& Q& d
#include<linux/fs.h>
+ {3 V" `; r2 ~  C#include<linux/ioctl.h>
2 m0 r7 F9 i2 w4 I8 F* U3 H% R+ D#include<linux/cdev.h>
( P, d& \) Z$ @: ?. T5 p8 \#include<linux/kdev_t.h>- T# i9 W; h; z5 L& |+ j) f0 {
#include<linux/gpio.h>
: ]1 f' G( ]) X% v4 s#include <mach/hardware.h>& o1 [7 b3 u* ~7 A" T0 O3 F( J8 I& S
#include <mach/irqs.h>% k9 v/ X  z9 S- O+ f5 p

6 M9 s& b. x) R  j9 K  p6 z#include <asm/mach-types.h>" X2 \3 i2 r6 }( L3 w! J0 |
#include <asm/mach/arch.h>
! M9 ], N% [/ V! W#include <mach/da8xx.h># F& A, g) V" D
#define  SYSCFG_BASE   0x01c14000. |* w3 Q- v& a4 h
#define  PINMUX1_OFFSET   0x124
# W2 }6 z! {) V  W#define  PINMUX18_OFFSET  0x168
9 W5 f( F& V' [* E6 ^. d#define  PINMUX19_OFFSET  0x16c
) h  k9 V* h8 {/ y4 n8 @0 |#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
1 |7 I' K5 L' `. f#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 J% Q. O! f3 i5 A# K$ U/ @#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& ]2 R9 `: w3 a3 C6 }0 ?0 J  E8 E#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
/ u8 h. E% a. ?7 Z2 L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR  I# r1 y/ f3 |& U5 ?
                            - M+ U/ h% u0 @" R
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR; l' ?# }5 V) A6 u1 P& ~" X. U
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
$ ^% [1 F9 Q' M//PSC0 L, d& A. A" f: A, v6 U
#define  PTCMD_ADDR   0x01E27120  
$ e% n3 P7 M7 i) L3 T' ]* P#define  MDCTL15_ADDR 0x01E27A3C0 |0 R9 L; E- ~' A2 L3 l. ?8 O
#define  PDCTL1_ADDR  0x01E27304
+ ?8 ~6 b1 {5 {//GPIO8 direction
4 P! z! N: \% T& H1 j#define GPIO8_DIRECT  0x01E260B0
  k7 \" i8 f( l: P  \#define GPIO8_OUT     0x01E260B4
% B* v8 C! u- L( n#define GPIO8_IN     0x01E260C0
% c; m' E, ]- d; T; r# d% g. c% t/ B1 C9 J4 W
//#define MCBSP1_RINT    99              
- T$ E+ B) `0 S7 y0 _//#define MCBSP1_XINT    100  
$ i) U# W8 c) |: ]static int MCBSP_MAJOR=239;. o6 q. l/ H& _+ i, Y& U
static int MCBSP_MINOR=0;% t6 F( r* G8 ~+ H
static int count =1;6 \9 R6 `& U2 D+ N9 b0 ^

$ `8 d/ I" p$ o5 t. P: A" u#define MCBSP_NAME  "MCBSP-device"  q# I( {- M+ F. a) F& k
( {. B; g; A: s% J6 x6 z  I
static struct cdev *mcbsp_cdev;6 C% I/ p7 {! m2 t; g
static struct class *mcbsp_class;
) {- z+ Q0 y( D# s+ P6 d0 y; sstatic dev_t mcbsp_dev;
3 I0 `* u% |2 a- Sunsigned int DRR_data;; e5 C# N; @$ y! O2 Q
unsigned int DXR_data;0 J/ K+ O% ^' H; ]; ~
static int mcbsp_open(struct inode *inode,struct file *file), X5 J7 U" j8 f6 T0 y# y( C
{
% q7 U! J8 b0 J# {- Z   
# Y0 U& R/ o" }: F. J   //interrupt enable,initialized
3 p( U4 `6 _: ?   unsigned int temp;, \' u% @2 n* ^7 X% [6 a1 _- O/ V
   //SLEEP_EN(GPIO8[10])---0( c) P( C- R3 W1 D# C: T. ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 c5 b" \9 |* }& s0 W1 U" c   temp=temp&(~0x00000400);
6 D3 h( W7 J. n. [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ x, Z+ _" u! V2 {, B% k, F' r% J" m  //RESETn(GPIO8[8])----0----1
  F5 w' W- Z3 r- Z: M1 a- u2 c   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 M6 c" I1 Q1 x9 s
   temp=temp&(~0x00000100);
2 i. T+ g* u3 s8 C% e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0" R- Y) W6 b9 u& c* R; }% ]
   udelay(100);- M5 y( c* e8 a( k$ Y' j
   temp=temp| 0x00000100;/ f  V, K# Z) E2 N8 @
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1- Z; m8 \/ |; i* q. S* A4 R' _
   udelay(100);& l$ L- N+ R; Q# a! `
   printk("open success!\n");
4 G2 I* R7 l- [+ C5 p% r   return 0;* u, u, ]/ `2 e
}
, _* ~& a" c# f5 l
2 t; B0 |$ O* bstatic int mcbsp_release(struct inode *inode,struct file *file)! E) a/ V0 y* N$ `5 P) Y9 d
{
% ^# V! i: O  K   printk("release success!\n");
4 O% X% X' q9 l& y; |& E7 T   return 0;9 N' n8 e$ a# F# E0 L  r: S
}1 N  C; |0 w, G  K1 ^1 p  J5 }0 @. H

7 O: D* ?- A, V( ^+ N# B6 T4 nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- _% J0 D/ e5 [; R. G
{
: v& L& ?  u0 g4 @# ~; s    copy_from_user(&DXR_data,buf,len);# n1 u3 Y$ i% M7 y0 S
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. |8 f  U) H) z2 O& X3 a    return 0;, [9 B# X  c2 F, i8 u+ p+ _
8 w! H, C; O3 O; L# O
}
% b- }8 b+ }  n3 H9 `
% X& a0 U% z! @4 @' u! @static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)# |! ?' P- k' c7 A
{
  I- n; @, P2 g4 F& f% Y   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- J/ t  w9 m& y: p6 G4 ]' [6 J
   copy_to_user(buf,&DRR_data,len); 6 J% H1 M+ ~( \) R: |  b
   return 0;
5 ^6 M& I) \5 ]  e8 G% `2 _6 Z}
  ^8 }4 I4 [2 u) q- A
- t, [1 c, A2 F, \: \" S8 h* m1 Y$ ^
static struct  file_operations mcbsp_fops=/ T, F- u* `# m$ D: c( |
{
& B' ]$ F. {6 D9 ~8 H& q3 j) h& S   .owner=THIS_MODULE,
. A+ J' r) d% u/ a/ K5 v5 p" C   .open=mcbsp_open,5 {# Q, L6 g1 P9 q  @7 u
   .release=mcbsp_release,  k8 ], U" \& h. ]- H+ X* Q0 K
   .write=mcbsp_write,% B9 X) q0 j" E2 i8 n% L0 R* `
   .read=mcbsp_read,
& U) v* I, u+ f( L& K0 ^' `};
1 C2 `; _$ y1 A6 D5 A6 Mstatic int __init MCBSP_init(void)
0 e6 W  ]6 n$ R/ V{( D7 P7 c# a! h& ~' z9 x( U
   int ret;5 V9 k% T0 S, v% W- z; J
   unsigned  int   PINMUX1_REG_old;2 P5 m  ]/ B+ j% a9 o6 ~/ R8 g+ W5 n2 D
   unsigned  int   PINMUX18_REG_old;
& P& n. G1 n5 C   unsigned  int   PINMUX19_REG_old;# k' y+ x+ v: A' v: n: X) d% |8 W
   unsigned  int   temp;  5 ^; v$ J" e. g
   if(MCBSP_MAJOR)
/ ~: X0 a5 g" F6 {) t1 {. f   {
1 n' P# @- }# s$ h      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ {4 G4 Y" t3 w+ W
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" B8 u9 i5 I& [, H) G   }4 `# p' ~$ n6 s6 l
   else7 P% H/ d& P: j
   {$ y9 C) V4 ]: Q* G
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. X& \$ e3 c$ O7 [% S, X. X
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 P; R; A/ J5 |   }
4 z' p* z* s1 ^( ]$ e6 @   3 G( Q0 S& S- l& X5 D' C+ Q
   if(ret<0)6 O- v4 }6 U/ a! O' Y! j4 ?
   {9 l9 Q/ v: n( H% G: B* |' u
      printk(KERN_ERR "register chrdev fail!");1 b- O, |# h, b
      return -1;# v3 i& N, O7 Y/ U5 ]
   }
" D9 I3 @' q. Y1 Q$ ?1 F' ~   ; s- x5 t# ~1 T9 h- t* _* Z% I  i
   mcbsp_cdev=cdev_alloc();4 j( z4 K# z( Z9 G) S
   
$ D2 @$ I5 H8 ^- b   if(mcbsp_cdev!=NULL)' p! T9 D- P8 u, `6 c, L9 U
   {* |( p! }- n/ a0 q
      cdev_init(mcbsp_cdev,&mcbsp_fops);
) t; ~4 i) H) ^# I) a: s8 P4 o% c      mcbsp_cdev->ops=&mcbsp_fops;; `- U  u7 ^8 o$ y  H* {7 z
      mcbsp_cdev->owner=THIS_MODULE;
0 G0 W  Y# E1 _% ]6 j1 Z7 R+ B      
1 C, V' {* Z3 M! x, f      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))- e& P$ V5 T2 A* q1 G6 l6 U0 p
          printk(KERN_ERR "register cdev fail!");  j' J* K6 `% r! ]
      else
; d3 z- B; |3 g6 o          printk(KERN_ERR "register success!\n");$ A% c$ _3 s( N1 }
   }7 C& {8 e) j( r
   else/ I) k( b- d  W7 J
   {
8 J8 `- d3 d0 A: ~2 z" v      printk(KERN_ERR "register cdev err!");8 g/ r* M6 `* t- z" ^- |6 s
      return -1;
3 f9 ?+ D( q9 y: U$ P2 y2 m7 ]   }, z: X% j: A0 n$ a: v% q3 J# ~
   " M! }; @" F+ b
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. ^2 ~  Z- \2 }1 x$ F, z5 x
   if(IS_ERR(mcbsp_class))
8 c% b' c1 M5 w! K: b   {  x! O# W/ R* s5 `) j% v, r
      printk(KERN_ERR "register class err!");# i, A; A5 D9 q
   return -1;
! G) T% j, G. Q" W0 _# q2 Q. ~   }
3 A, Y3 k9 t# D0 `, Y) F" @   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
. c5 w+ \$ Z/ n' g
5 @& L" J8 k. p+ S, U* E   //PSC7 k. I' C4 r( I2 s  P+ U9 q  d
   //add Enable MCBSP
( d$ w. }+ C. N6 n3 V; {6 z: ?+ _, c   //test
; D/ A# _, F* U0 }: p   temp = 0x80000003;
2 i+ v% B7 y, r( P" M   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 Z; S& ^; N- B8 p   temp = 0x00000003;6 [+ {/ N2 h: ^2 T7 ?0 L
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# a- B4 @- R0 @1 R: h. f4 _- l' Z
$ m' F: ~1 r0 t3 b& ]. Z   temp = 0x001FF201;4 m* V( H; C5 N' Q5 P( h4 E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& j3 T  h' ~# Y% E1 g& J# G; E   1 K4 P. F6 j* d3 ]! g
   //PINMUX  # }+ x9 A; y8 v2 ]- Z% p  u
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" e$ w+ z5 F: @7 p3 @6 J   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
+ ^( z" {% E' C3 ^   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   # x) S/ \" L. E0 y, t
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" x% L9 U3 @0 T. ]4 r   
" o5 Z% h; v( m: _   //SLEEP_EN,EPR,L138_SHK1,L138_RC1 T$ A6 e6 Z( X
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" c) H* }& @9 a9 I4 h0 M   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 N+ ~: |) C8 n3 z+ q% @  g3 Q8 }/ F
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# [$ g( b& o- i9 m0 [/ i6 [

+ n* _1 T* s: U   //RESETn,L138_SHK2! y+ u2 p& ^6 w/ S, G
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
' p+ |4 [! B3 c0 a+ o   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   : ~7 w* `4 }5 I5 E8 v9 D
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 K, e1 o# T" q
' O3 ?- O& n% R5 k$ U- E! I: I
- O$ v# R2 t* s" y9 t' \
  //SPCR Register  p; l2 f4 X+ Z% ^
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 ~' P, C  T, P' H% E  w, e( K( F
  temp = 0x03000000;//(DLB=0)
. m2 y7 c. H# }7 d8 |0 y1 F // temp = 0x03008000;//(DLB=1)$ L8 q+ L0 D  d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset- E6 _0 B) c& ~2 w9 _! q
  temp = readl(IO_ADDRESS(SPCR_ADDR));% k% }: I% [5 ~
  printk("temp=%x\n",temp);
+ }, d+ `* d. x" ~+ Z
$ y0 c$ |* x3 f! v  P0 ^; e   //PCR Register
; g- m3 g* B7 k. x- X( V   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' c! j2 \- k' {" D) l  \& [* f* Q
  // temp = 0x00000F0F;
+ f; O* L) r+ C4 a. e  J  temp = 0x00000B0F;
1 `$ R4 j7 T3 ]0 @4 K# q0 ]4 q  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 4 {7 s4 D8 }6 L% M# c- x. ?% G
  temp = readl(IO_ADDRESS(PCR_ADDR));1 |! ^. Y' Z( [; [) F/ Z6 i
  printk("temp=%x\n",temp);  
1 S" t# ]' g4 R' V3 N/ y* j/ q   //SRGR Register
& I5 P7 R. q; f2 g( }5 x   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- m; o; a( b5 S' ? //temp = 0x301F000B;- Z9 X5 L; R( }$ F3 y+ {+ e
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
! Y% U7 q* S- ^/ L( J, D; l0 A  temp = readl(IO_ADDRESS(SRGR_ADDR));" \2 n3 l3 R/ ]  T
  printk("temp=%x\n",temp);; h" T! G5 u# A# Q5 N) X" ~
   //RCR
% {; f0 a& J9 j2 Y  V   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 F% v: s  X- ^' s/ D
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" u! i) |( V1 I1 r$ I   temp = 0x00440040;
% Q9 Y% D6 e9 ^6 l7 f5 F" ~2 L  ~   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   7 \. y" a, c' f0 s; U2 i4 T
   temp = readl(IO_ADDRESS(RCR_ADDR));+ r/ E0 B5 p% Y; _. N
   printk("temp=%x\n",temp);
0 b3 @( b& N; R0 w( Q4 |& u- @& T   //XCR
3 y. E' n) k! o& c" I1 i   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: b8 p. M/ d, h  H   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 T5 V/ t4 T- i* M' `9 g0 o  h  q   temp = 0x00440040;
! q6 M2 `' M7 B9 z/ M1 Z   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   4 n7 Q" k' N2 j  s  _/ m
   temp = readl(IO_ADDRESS(XCR_ADDR));, s* Y/ F0 L, x: Z6 Z1 |6 G
   printk("temp=%x\n",temp);9 X- _  z4 Y/ w7 r1 a; h, I3 j
  udelay(100);  x$ b5 L" S4 f& x9 g
  //SPCR Register% G+ ?2 w" V6 t- D
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 _: \2 ?! F! G0 _  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( ]" w1 D' g4 q1 U  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 E2 B% a% ~  |* T! t0 X  temp = readl(IO_ADDRESS(SPCR_ADDR));
! E2 m! S4 Q  ^  I  printk("temp=%x\n",temp);
0 W/ W( ~% {! ~$ [  udelay(100);
4 @8 _5 B' `9 f
, |; |6 N5 b0 n! l% r% r  //set GPIO direction
: T8 ^, t/ H9 p6 Q   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 G. B9 A, ]7 I. o   temp = temp | 0x00000100;//EPR----input
/ g( @% w, \+ Z/ o) x0 I9 y   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ M% ^! C4 d  @8 l: L6 J
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' k7 B' ?. n9 e5 \- O / H. T: P; ^9 D, U( A0 W% g& W# H
   return 0;! @' I; Q# d' g7 ^. O) e9 G
}
: f: s' e/ T+ t) P! @8 dstatic void __exit MCBSP_exit(void)
6 c1 G0 @/ L& W# U{3 d, H+ @, A3 J6 p" d5 `
   printk("mcbsp chrdev exit!\n");4 ^' H( k5 I  g
   cdev_del(mcbsp_cdev);
1 c& E8 Q& p" o   unregister_chrdev_region(mcbsp_dev,count);; O4 C! M9 x+ }$ {' v- u
   device_destroy(mcbsp_class,mcbsp_dev);0 ?' g' ~1 T7 ]0 D+ h
   class_destroy(mcbsp_class);0 q! [' p* M: t* q- O
}; q8 n0 ~/ X* {2 w
module_init(MCBSP_init);6 H0 F2 ^0 ^4 Y$ g
module_exit(MCBSP_exit);. t5 C4 X" M( j0 A+ A. U2 O9 E- s

. a( p" l5 O( x, z3 }, wMODULE_LICENSE("GPL");
3 b+ L! I: v2 F2 O1 T% R
& R: l3 K( o3 b* O" Z3 t3 i1 C我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! u% v% C- \3 c7 w8 c
我的应用层的测试程序如下% v* U- z: z  P/ i$ A" U
#include <stdio.h>
: j) {/ I) J$ E. n6 c7 k#include <string.h>
0 o4 w" S" U; l$ k0 k#include <fcntl.h>
& {  I5 T- p6 j' ?6 q#include <unistd.h>
8 z$ w. i& B( ^/ ^# [- s#include <signal.h>
% }" @  Z8 D1 u#include <pthread.h>       //线程2 h8 ]0 L8 `( g, [" d% S0 B
#include <stdlib.h>
, K( m' k# u+ R! N2 `6 C, L#include <pcap.h>          //捕获网口数据
" d7 v3 p  t9 ?#include <semaphore.h>     //信号
1 O* {, ~) r- l7 \. ^  d; P#include <sys/types.h>     //消息对列
3 G3 [0 T0 D+ p( y9 A) t#include <sys/ipc.h>       //消息队列
8 C9 c; V2 q' b  p( k#include <sys/msg.h>       //消息队列7 w7 z2 W! [5 l1 ^$ h) ]' U1 q
#include <sys/select.h>
3 r5 G# B; m) n0 @1 L( i#include <sys/syscall.h>' r2 \; k, h2 g  P
#include <sys/stat.h>
. t9 h7 a( _# \% I6 G9 ?) ~6 z, i) E#include <sys/mman.h>6 M7 @0 k. }8 t% G6 m8 X& s3 v
#define msleep(x) usleep(1000*x)
: r$ A5 c; h1 R- b; e. |$ Z. s# F
* M" W' H. p$ dint main()
+ H! |; o6 @* V* E{
6 A3 ]9 k9 `( |1 c    //MCBSP,ARM与AMBE2000交互设备
; _  p" {1 ^% u$ D& H int fd;) s/ o1 g3 L% n6 Y* ]/ Q% I. m
unsigned short data_write = 0x5555;1 ^( g7 h  V* ~
unsigned short data_read = 0x00;1 u2 J2 [+ y" P
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" E4 @; L) {# ]& o2 U8 p2 i
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 v8 a2 N9 D( B2 Y8 |   
! F9 _* X" U2 j$ M; u. m  if(fd < 0)- Q' A: f- h& d9 W
  {( \2 Z: N6 R9 K: d
     perror("open failed\n");7 t) P0 ^6 S( m: `
     return -1;
  a( u+ F; V) Y" \; L) f% N% U, V  }
6 I0 \0 r( N+ h  ; J/ q% f1 v7 x2 ^9 `
  while(1)
& H# k: ?! U  x( x& z* d  {0 W2 ~4 z! J" }& d
   
9 ~; m/ |) k) N   //AMBE2000每次读写是24个字为一帧
  b1 c! K' H! u% {- R; {9 y   //写数据时将数据在底层存储起来,等到中断的时候再发送' T, j0 U' Z( q8 W
   //AMBE2000输入数据是以0x13EC开头的: I  i3 `4 N& F
   write(fd,&data_write,sizeof(unsigned short));  n! _, ]$ {/ O: q
   & A+ Z* w0 ^; m  H
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
! I2 O4 v6 g4 b9 e   read(fd,&data_read,sizeof(unsigned short));
* ]1 b9 V9 p/ q# b& y  {+ ^   
1 p2 b$ `* g( G   if(data_read == 0x13Ec)# G# h8 g" l$ c8 O( z+ x* o6 z5 P
   {
1 e5 Q) P# s! O   5 {# o  X+ H' X" b1 r7 }/ \9 J
    printf("data_read = %x\n",data_read);- d# p8 z' b5 _( K- Q) E
   }- M3 Y% T+ L" K
   
) U+ j! |. C5 E, e1 m( ?2 W& K& E' G   msleep(10);
1 x! r/ y, b- N: A& I  
: p5 P$ p7 Z' }2 y  /*: t- M0 Y- z+ h- }
   ioctl(fd,1);   
" Y, W7 a" \8 [1 c5 c$ D9 u sleep(1);
/ F! S; G0 F1 [3 X ioctl(fd,0);, S3 t# R0 T' A. ?
sleep(1);+ F5 \1 G8 G! h' I3 V
*/ $ F& w0 c9 `4 t: b' p
  }   - h% h( ^0 f( X0 z7 h/ z
return 0;' a2 S; m% ~% h! \) q! \& Z6 D

) ^" E0 _6 G# G}8 H" z% t' g' [5 s8 |1 S
: m* w& y8 W+ [  j: t
多谢各位指教,谢谢! 急
7 O7 R. S3 H/ l" A9 C+ P
& s; c; @8 D. F6 @) l* g
/ @: W0 P  j4 B5 \* J
6 u. z( O4 Q' s' X) S2 x# g/ M" z# t2 I: c
6 l* n9 ?1 k* Q' b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 03:16 , Processed in 0.047500 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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