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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& w! S  o9 J  c/*
3 e7 \; G# Q! t * Copyright (C) 2009 Texas Instruments Inc
" j+ N( [# w) [7 j1 N *
# Q' ]0 r! b! Q% m# h7 w8 @* D * This program is free software; you can redistribute it and/or modify; K% z1 y8 R2 e$ m! b. ?7 S* I. g: ]- F' [
* it under the terms of the GNU General Public License as published by
, D, J, c5 p* e, ` * the Free Software Foundation; either version 2 of the License, or# E; I% R( O' Q
* (at your option)any later version.+ ~; d# [% d: q. u; W) Y" W% k* C! a
*
& h7 t4 e$ E, D$ { * This program is distributed in the hope that it will be useful,
$ c! P' F# ?4 ~$ l * but WITHOUT ANY WARRANTY; without even the implied warranty of: V& ?$ H4 c- T7 Y# l& s3 _# M1 ^4 J
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( @+ P+ \( C& W6 \ * GNU General Public License for more details.' B% @+ F6 b3 {
*+ d! y+ p: v1 S5 d# m
* You should have received a copy of the GNU General Public License
  c& ?0 K; T: `) r& u0 I * along with this program; if not, write to the Free Software1 \+ k6 K/ i! x9 [$ V- r" }9 E. ~3 O
* Foundati
" u: r" I3 w) e- |  w% e*/: h+ Y# s( G, F- R- [' H. |2 C
#include <linux/module.h>
% @. @4 I+ \) I; J& T3 C5 p#include <linux/init.h>
! a0 }5 r  r# f9 x& |5 q3 c#include <linux/errno.h>
0 i  }7 x9 X3 s6 g- C3 Z+ L6 `% U#include <linux/types.h>
4 L7 I$ ^6 ^) L# h#include <linux/interrupt.h>
/ q1 O6 f1 O0 P- J3 {8 E/ D#include <linux/io.h>
: k- @, f& j/ C#include <linux/sysctl.h>
- Q/ L6 N" `  \7 r- q( k, z/ ?#include <linux/mm.h>
2 I. R$ @9 K% D% O/ a3 s#include <linux/delay.h>; f1 c6 v" p6 N) p: j9 ?" \
#include<linux/kernel.h>6 G/ d3 }4 p) z# a4 t6 i( @
#include<linux/fs.h>
: i4 s+ t5 q/ y  U- e/ t#include<linux/ioctl.h>* P7 N3 ^# h# A; N6 ]1 {1 M5 E
#include<linux/cdev.h>9 c& J! _7 R. b! f# Z- ]- v
#include<linux/kdev_t.h>/ i* Q& C$ p, N7 O6 }+ D
#include<linux/gpio.h>
! w4 T* g$ _: w) e5 a+ l; O3 V/ w#include <mach/hardware.h>
$ O- j$ H& A& R( h#include <mach/irqs.h>
, Z# x, l2 A) o$ }: s
8 f8 w/ i% I+ g. c2 I#include <asm/mach-types.h>2 L" s9 [1 s- h$ i! A1 c5 ~; W
#include <asm/mach/arch.h>6 a" h) t+ k5 b. I0 n9 u0 r
#include <mach/da8xx.h>
( V5 g; _) ^' F4 |#define  SYSCFG_BASE   0x01c14000
8 R6 F3 G- E& l" q" S) ?1 z2 W#define  PINMUX1_OFFSET   0x124
" }( P* k. X0 S. u4 \#define  PINMUX18_OFFSET  0x168
. T+ o& k3 E0 E5 P( z: c#define  PINMUX19_OFFSET  0x16c  ^$ I% P5 X2 W( D6 q2 V3 \' q
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
3 `9 ^& G3 X$ C1 @9 M& S#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
6 |4 v+ `- K" X/ c) {#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
* w" M  j& q2 a: v) O#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR1 }& Y/ l2 X% K9 J2 y! G" a
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 B/ p6 k  j7 C                           
9 H# J. C% B$ X! C8 W#define DXR_ADDR      0x01D11004  //MCBSP1_DXR3 A7 \7 G6 ~8 X+ o$ |: z8 |
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 @( b9 `4 `1 D/ t$ Q$ h/ U5 [* v//PSC% j3 {. B0 b7 o& n: F
#define  PTCMD_ADDR   0x01E27120  
& R# e2 `2 }7 H2 m9 g6 j  t#define  MDCTL15_ADDR 0x01E27A3C, b4 o$ P( J2 X/ n3 f( ?6 ?
#define  PDCTL1_ADDR  0x01E27304* P. d4 ^1 Y  i, {# L, `4 G/ a
//GPIO8 direction9 |- n" R( z8 y0 Q
#define GPIO8_DIRECT  0x01E260B0- ]8 q' P; H7 s( `& z% w% L
#define GPIO8_OUT     0x01E260B4, B6 H* {4 m; J& P' n$ D, Z
#define GPIO8_IN     0x01E260C01 X0 U: a7 p- i8 ^/ J4 R

; F5 ]5 E. G6 b//#define MCBSP1_RINT    99              2 ^' h9 i3 V0 w1 D( a
//#define MCBSP1_XINT    100  
2 }4 G( L; P7 S  A5 Kstatic int MCBSP_MAJOR=239;4 L1 ^  e: _7 T2 o& O* ^) A5 B5 ?# e
static int MCBSP_MINOR=0;6 ~4 G8 v/ x0 h( j! b8 f
static int count =1;
, M1 c3 g) V, K; B! I
6 y2 p' U0 ^8 K( F& c, l( s& h/ H$ I4 Q( z#define MCBSP_NAME  "MCBSP-device"' I7 i  L$ A! B7 j6 |& v: I
9 J& W* @" A" Q9 u. N% [2 ]; I/ g$ K- R
static struct cdev *mcbsp_cdev;
' f+ n8 c" {1 }% D; f6 b4 u0 Mstatic struct class *mcbsp_class;& {* E$ b- i$ S
static dev_t mcbsp_dev;
& b: G5 y! a8 S7 B( L4 v- Dunsigned int DRR_data;/ Y. z& b3 W) s
unsigned int DXR_data;
$ ^% i: _! G( I: e2 T% E, N  Cstatic int mcbsp_open(struct inode *inode,struct file *file)
6 I. W) Z; ^3 [& o8 O{
- |( J; k3 h3 {3 X) \   
+ ~0 D9 i- F" R& o7 p7 G   //interrupt enable,initialized+ D$ \( c( p) |8 Z3 ~( ~# {
   unsigned int temp;
, h7 t1 R6 l" R6 V: O0 ]   //SLEEP_EN(GPIO8[10])---0
  p; j9 @' [" ^1 h   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' m8 _1 F  ?9 C   temp=temp&(~0x00000400);
1 [! l: f1 d4 j% w! w( G   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- \6 u/ j" e# y7 F. H; w# ^% A
  //RESETn(GPIO8[8])----0----1* [$ s6 n+ F" `6 S6 Z; [; ~. l3 v
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 Z* o! H6 H+ v4 X   temp=temp&(~0x00000100);" M  u4 q7 g6 B) o  {
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 q  [' z4 m0 w! ?' P2 N* W1 |
   udelay(100);
- ~) o  C: m/ \- ], q2 s" ^   temp=temp| 0x00000100;
: X2 e" ]' g& @0 {* }) Q% f) w   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 q; l6 V7 a0 J4 K
   udelay(100);* S0 i- z# s) R4 x* D
   printk("open success!\n");
% V( X0 b* P( X$ }  D' v  M   return 0;
( X* q0 B1 s1 j9 r$ j}, G8 K9 h6 z) o, E
# n) A  v9 X* ]- g0 P+ ~
static int mcbsp_release(struct inode *inode,struct file *file)
$ J5 z7 ?; g1 R5 a9 m{
; G- ^- ]$ s" T   printk("release success!\n");
  {5 w: C4 |. m, o, a, m9 m1 Y   return 0;9 W7 ~9 x+ {' @
}% C4 t& d6 I# _1 [: q" X

' ]. m$ k& l& `static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). H+ ~2 a) F4 t3 h
{) U2 X- r' O3 @6 R# H7 d) n
    copy_from_user(&DXR_data,buf,len);0 i+ N4 K3 ^* W& K0 P2 J( M' c" |$ T
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) h! J7 G  N3 u    return 0;$ m! m: J7 G2 `0 T) `

/ }! S6 [4 c( o0 G2 e}+ J. P8 P4 L4 b8 x# `# E0 L' |- t: i+ v
& ?9 q7 k* o) S% ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)3 U+ l: e3 z4 p) ]+ s2 n- g% K* ]
{ " N* o( c( Z2 M, @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- v/ B7 x9 ]1 u- I
   copy_to_user(buf,&DRR_data,len);
+ y" b1 @3 u7 Z0 S7 H# W; x% a   return 0;
  L7 t3 A8 @. I, e2 E9 w4 g  C}
) c' V; }8 p% f" u% B0 U) k5 w0 V
/ ^" L. p7 U" v2 l3 x9 y! r1 b& h; `% T3 V: r& l. h
static struct  file_operations mcbsp_fops=$ I* A* }* V( c
{
* u3 l1 k) o& M   .owner=THIS_MODULE,
9 @/ z8 w' \+ ]: o   .open=mcbsp_open,
% f6 E" Q' [) D4 {8 _- H1 v   .release=mcbsp_release,. n8 t2 t4 h/ Q0 u9 d6 ^& E
   .write=mcbsp_write,6 A& M- m" j4 y7 l2 w9 K
   .read=mcbsp_read,
' l3 @; ~$ u% R1 I4 [' ~};6 l3 m- d% F$ [9 x* ^& F
static int __init MCBSP_init(void)
8 i8 J6 ^8 ~- x1 H# _0 Y{
' M! H8 ]; r2 x! `& A   int ret;$ Y  R) U* f. m9 J, k! [( y3 _, I
   unsigned  int   PINMUX1_REG_old;  R- [. V  m8 E
   unsigned  int   PINMUX18_REG_old;
: c# S* Y5 B$ F& {0 Y   unsigned  int   PINMUX19_REG_old;$ W* @# ^6 U9 D: d1 u
   unsigned  int   temp;  
7 b' x5 |$ e7 i; C   if(MCBSP_MAJOR)' r- A  e. B5 j8 q2 k% Y7 G
   {
! J# k2 |2 \+ a: @) w      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 W4 y3 X0 ?" U8 `
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! m- g: ~6 v( h& u2 n
   }
2 i+ I( {5 j- ]- [  i% c  z   else
/ y" t6 F, ]7 h$ Q) K* `   {# D6 C) Y- o3 W8 l* L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' D1 T0 W* F, z2 g; _
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ m, \. h  ?. W, i
   }% _. Z7 v9 ~- r# g) i
   
6 Z+ m4 z" j. T3 G   if(ret<0)
8 N/ Q# V& [' s0 C. c   {
2 p) B" {2 {( }- m      printk(KERN_ERR "register chrdev fail!");
6 o; |& L/ K' L% ~! j      return -1;
# Q" M4 G5 f" M5 _3 _4 g& x( q   }
9 a; U, f5 e: p   + b5 C0 k( x/ v1 U. Y0 `
   mcbsp_cdev=cdev_alloc();+ \. D4 I9 x7 P5 C$ t& A8 h
   
+ S! u3 R/ r2 |   if(mcbsp_cdev!=NULL)
  S& x( N, R) `   {9 t7 @6 k, w& E: y+ E3 M
      cdev_init(mcbsp_cdev,&mcbsp_fops);
. A  ~  j0 k' @! F2 ?9 v      mcbsp_cdev->ops=&mcbsp_fops;
4 c( F  [  ?- I' i$ c; v# e1 |      mcbsp_cdev->owner=THIS_MODULE;
, g" p, p, m7 z( M# G      
$ k. V( q8 e3 @& [, S+ S      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))7 y2 Y  ?% J8 L; D% {
          printk(KERN_ERR "register cdev fail!");1 }* \# \7 W$ N. ~
      else
- x# V0 o9 V* U          printk(KERN_ERR "register success!\n");3 f9 M( C. Q3 }" D' W
   }
; d& b' Q: `9 K   else7 A9 j6 R9 p- d) @3 c7 ^1 F
   {
4 K! [& c0 X( X0 [3 C% B% {      printk(KERN_ERR "register cdev err!");
1 q# G* ~1 T, z- k" h9 S9 z      return -1;
) U* ]% v7 D# M# d+ z! {8 F   }: H) ], H9 ^9 {! \+ {
   " A5 j9 z) p, P4 G
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
3 I% I) H+ J0 ?- m   if(IS_ERR(mcbsp_class))$ y. P0 x) V) a4 m7 X
   {
6 `  y- d5 u1 h      printk(KERN_ERR "register class err!");
2 u4 A/ |+ S$ ]   return -1;" g6 L% q; h' V. l* E, H6 R  R
   }- z9 g  D; F4 k( y/ g
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);  h; J1 E2 D- X/ W0 i
1 U2 E) V7 p5 z) C! m, u
   //PSC! x3 t& V1 Y' q* E# G8 b
   //add Enable MCBSP- Z; E9 M5 Y  z  s2 f9 ^! |' q( r
   //test$ z6 u$ H" |$ A( f2 h* {* I
   temp = 0x80000003;% m: @3 X  o& D0 C+ G) u# F3 h
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 X+ k9 \# \( F4 Q0 }4 b* e( }
   temp = 0x00000003;2 U/ V0 v( V) h) d9 I
   writel(temp, IO_ADDRESS(PTCMD_ADDR));$ _: I5 z* K6 b7 F

) z7 }) ?- w% Z% ]! a5 X# G; ]   temp = 0x001FF201;
* b. L9 W# H2 f* Z) g! w8 }   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. S7 r4 k4 U, I" u6 |# L# U   
( g3 J. V9 a3 K9 {9 j   //PINMUX  
2 ]. d; u: j9 d. Y% j6 \. ]+ K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ `! p+ w' t2 h- @7 h* M, ?
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
- x7 N8 C8 [- x5 F- f   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! A) K; _+ R  |/ J   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 ^* e5 U8 b) v' K: k- y   3 h# B" o" Q7 R& g* Q5 Y
   //SLEEP_EN,EPR,L138_SHK1,L138_RC; r0 [- l9 a( ]) G2 Z& g' L, _: `; m
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
0 s# U5 s& K+ A# L5 ?% c- m   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
$ t$ q& d3 a+ ]: n5 k3 Y   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, r' X4 L' ~" ^: V - b$ ~8 x8 |, q% Q, h. c# @% ?
   //RESETn,L138_SHK2) w7 K+ e8 v. u, w% w7 s
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( Z, N( V. C/ ~2 W
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   8 r1 K' P7 m. R9 J$ ?" D
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 k8 n/ s' T" h1 K$ V6 b
0 }% J& N. t0 f( ] * S1 T4 s  l6 y" O; \( m
  //SPCR Register
- m, d7 j: G- Y1 y  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' s, n' S# m1 m0 t+ l- C/ K  temp = 0x03000000;//(DLB=0)
4 A( R5 ~6 R! W% B4 ~( M3 e // temp = 0x03008000;//(DLB=1)/ r% w/ O$ M3 f
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
: Y% _% Q4 h: |' |! c  temp = readl(IO_ADDRESS(SPCR_ADDR));- o. D) C9 v( N" i% q
  printk("temp=%x\n",temp);
1 e. [5 S6 w5 S$ | $ ?8 L5 G+ |  Y/ ^3 h/ r
   //PCR Register
" A; z7 S# b- h% E0 p   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  U9 x% K. q" a- N  // temp = 0x00000F0F;2 M7 I$ A! b7 c" `
  temp = 0x00000B0F;
0 O6 h3 {7 K+ M$ `( Z  P  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized - E5 g5 |" i4 D  H- f$ \) F8 K
  temp = readl(IO_ADDRESS(PCR_ADDR));
" `- z4 j* ]5 |, i" g  printk("temp=%x\n",temp);  
6 R4 r5 E) s/ |8 q# j   //SRGR Register; `4 H' h" z  S- W3 C. v3 g( v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 i3 {* \, R& Q) h //temp = 0x301F000B;( `% E) K9 [' }& M4 U
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ! C" w+ n4 E$ Q$ Q) l5 J
  temp = readl(IO_ADDRESS(SRGR_ADDR));! R! H+ K2 W8 R5 k% V0 r; l; _
  printk("temp=%x\n",temp);
, t* Y# d% M  ?3 C0 f+ k   //RCR
! @8 f6 V  P, ]; H. J) |   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 g7 `$ R$ b2 \   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! g; W9 G; x; y: b( H  P
   temp = 0x00440040;
7 Q0 u. s; ~) y5 W' B! \   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
. W( G# Y5 m9 H& X4 N) g5 x   temp = readl(IO_ADDRESS(RCR_ADDR));8 P* E! u8 A* n2 d2 C. \( h5 C4 M
   printk("temp=%x\n",temp);
* T5 K! b8 z6 {( r  f   //XCR
& p- m  h  r/ {$ n" M& T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 t  S0 ?) f4 L* S
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 k0 e7 G" Q9 W4 R, n, H
   temp = 0x00440040;
) q! m4 h$ v' p5 B   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
$ D) _8 n& W2 h) q+ z0 e4 Y   temp = readl(IO_ADDRESS(XCR_ADDR));
* ?6 I1 W2 Z+ R( _/ A   printk("temp=%x\n",temp);) g5 L$ w; a8 l
  udelay(100);
3 [' T- M6 R* t. Z6 P" T% \  //SPCR Register
# m, Q2 ^5 c3 ^6 s1 y6 t  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1; M1 f1 f, J) L1 a! Q
  temp = 0x03C10001;   //DLB = 0 VS DLB = 15 `. N+ t  e; C& U( `5 K
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" B' G6 a8 o) w4 I* _  X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) |5 |8 h9 k# f; g8 D* f6 S/ e  printk("temp=%x\n",temp);* d% i( \1 D) V% k! A' Y
  udelay(100);2 f# S% W  k6 |! J6 C) O

# t, I2 X& h5 }9 U( `  //set GPIO direction0 S( _3 c$ X" ]% b  \
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 V- S; W/ L" P7 N0 [! W   temp = temp | 0x00000100;//EPR----input
- G; k: Y  d0 r+ }( k5 {   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ d7 `6 U. t( d8 [) u8 }/ |+ w7 g
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 n$ k5 U, C8 m9 `# \+ d

# f, q' G4 J. t2 v; u   return 0;
# i6 E8 U' _( o/ n" `$ i}! |3 H  h, H, _0 V) n
static void __exit MCBSP_exit(void)
1 u% O, C; S1 M3 n0 @, ]2 W{
7 Y8 G" }3 m$ `; @6 Y) O   printk("mcbsp chrdev exit!\n");
' C' O5 z5 m6 T) m+ P, U; a$ H   cdev_del(mcbsp_cdev);1 Q. d7 M# l7 W5 D: V/ I5 [+ N
   unregister_chrdev_region(mcbsp_dev,count);0 @2 G' z  e2 t+ b# [
   device_destroy(mcbsp_class,mcbsp_dev);" l2 p' `* a- e% ]$ Z" E3 t, U1 b3 Y
   class_destroy(mcbsp_class);2 q% ^- K' L- E4 d* Y* n
}
# Q0 J: A! `6 u% L5 ymodule_init(MCBSP_init);0 \, g( Z3 ~* [, f  ^: Q+ Z
module_exit(MCBSP_exit);
+ N# l: C+ O% I1 Y. U& X! }; B& d7 B8 Z3 W+ b; ~8 C! `% @
MODULE_LICENSE("GPL");
& y2 x- D; S; [9 p% H
( j4 n! S5 W" Q  m/ ?我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  |, r1 r$ r. }/ O. j
我的应用层的测试程序如下
3 j- K* y: @6 _#include <stdio.h>5 g/ o1 @  Q8 w" C  J
#include <string.h>
1 I+ Y* Z  @  e9 v0 _6 ]#include <fcntl.h>- H+ m3 v+ a0 d; N
#include <unistd.h>1 ~. I5 Z, Z4 _" R. r
#include <signal.h>  Y' t% M% l# @( t
#include <pthread.h>       //线程
3 V) D( g! f* A$ G( |+ ^#include <stdlib.h>
; r4 U" D) Q0 {6 r; z. T#include <pcap.h>          //捕获网口数据! p) z) I0 A' ]4 s+ i6 f) m
#include <semaphore.h>     //信号
4 n+ ]6 S* l9 |* S0 M#include <sys/types.h>     //消息对列
! Y/ m; k; m, i" {#include <sys/ipc.h>       //消息队列
8 p6 L3 x) L: d4 P5 `7 Q  M8 [#include <sys/msg.h>       //消息队列
. z6 J8 G  z6 l9 L6 F( N#include <sys/select.h>
/ `/ [3 j: K7 L2 f#include <sys/syscall.h>
( A7 C& h7 \: m; \#include <sys/stat.h>
% h2 h+ z( J  h& |#include <sys/mman.h>, u" b) i! X* b) R% Y
#define msleep(x) usleep(1000*x)4 w1 u8 G1 }: `+ t( [" K; z: v
" L7 D! b% N# @
int main()
! W! H) ]: C- E4 J{
" l& [) j( B7 A. l/ ~: ?/ D    //MCBSP,ARM与AMBE2000交互设备
0 T. ^- p; G! t$ h# C int fd;: G" \9 X, W3 m% t* p
unsigned short data_write = 0x5555;
+ _4 j0 `; u4 P* g: [ unsigned short data_read = 0x00;& Q* w/ T& J0 ~: ?# I& I( c+ x3 ?$ l
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% A  a+ {2 h( |& }; s  Q
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ V- d% Z! Z6 M( p' Z5 p/ ]+ U9 V( {2 R8 h
    & D& M+ }( t5 n0 u
  if(fd < 0)9 P; W7 C$ d$ \" {1 o0 ]
  {
8 O& ]% }2 B! c7 r$ x& H$ d     perror("open failed\n");
9 G3 A" R2 ]: N1 H     return -1;
& W; A+ u, A2 d- S8 S! _! C" C% q  }; G. {6 u2 ?3 I2 G7 i
  
6 g% r2 _- X$ b' a+ n) C  while(1), c4 U5 e6 V. _; d0 |, R5 i" N, Z
  {
* E; l" l. T# b9 q$ W( n   
* t9 s: z5 C+ @1 }. n7 G   //AMBE2000每次读写是24个字为一帧1 `& m: y* ]0 F. k9 C5 [1 T
   //写数据时将数据在底层存储起来,等到中断的时候再发送( a( p2 v( y7 C2 Y+ S8 W
   //AMBE2000输入数据是以0x13EC开头的6 ^" y5 L' ~/ R- j; c$ Q! R' S5 j
   write(fd,&data_write,sizeof(unsigned short));
6 `1 p# V  n- J. S* N. I1 Z   4 O5 T" d0 l' J  Y0 s" S
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 U9 u% B6 B( a8 s8 N, L
   read(fd,&data_read,sizeof(unsigned short));7 q* c1 X; \4 C. h) s0 }6 t
   
7 I1 Q) M( e0 u% Y& T3 F- S, }   if(data_read == 0x13Ec)0 a; @* i0 n9 r* D. D8 @& c& ?' X
   {
5 B  ^# E" n  T4 h   , n9 r  I/ x( a7 h/ z
    printf("data_read = %x\n",data_read);+ R6 W/ W# _- ~9 c  n; k! K
   }1 ]# q1 j1 P- Q( U& a- B! A
   ! A2 I4 R3 R9 c/ u6 ~+ a3 |
   msleep(10);4 `' ]% }) V5 ^5 ]
  3 n% J7 P' }6 E2 m' L
  /*
6 i# N2 S4 w  n6 w. }5 Z" P' R   ioctl(fd,1);   
6 n: x  |+ \+ }; a0 L( s sleep(1);
$ g3 [5 }' z2 O; {% l ioctl(fd,0);
, U# f7 ~( D- t6 W3 f sleep(1);
3 j5 R2 N+ E' ]$ P5 V */
: n; c, j/ E8 R* L* V* ~  h  }   5 H: o6 W/ T# N8 k* x* e* S/ ]8 O
return 0;7 b3 H, M% \2 e# G9 e- a
$ ~: [& O6 q# K/ V; Y" U& F% q/ a6 h# ^8 s
}/ G% f5 R1 M3 `% Q* V

% G& k' ?- J3 d% P# K+ p$ V多谢各位指教,谢谢! 急+ m7 u# K- W% G$ }! _( t  Q

! i' f- `3 K) y( }! ^0 ^
0 \8 q* i! }5 N- S4 a
0 y7 U# G5 G8 f5 V
5 X! U4 }- j6 w: @8 {  i6 B! r6 y$ Y3 E8 Z/ y% Y* I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 17:05 , Processed in 0.050696 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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