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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 J: U$ Q" O1 h4 x. ?
/*
0 ~( p1 h# K& C, W6 l+ [ * Copyright (C) 2009 Texas Instruments Inc: S% r7 e- M1 I; V. J
*0 v5 i+ j7 c& x& P1 i% Y
* This program is free software; you can redistribute it and/or modify
5 k2 I, y% o5 Q* \5 S+ R * it under the terms of the GNU General Public License as published by
4 i7 u7 G% I1 w& j- V * the Free Software Foundation; either version 2 of the License, or8 j# F* e* D) k; ?) u9 d' v3 }
* (at your option)any later version.8 ]3 T. @- x* }* g
*, Q2 {3 Z# G5 n" f. u7 A
* This program is distributed in the hope that it will be useful,# X  O$ s# _: z( |: R. `8 Q) O! L
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 t6 t' t( d! d* ?9 K2 P) K6 V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 D% O3 x( `& M$ R
* GNU General Public License for more details.
: k8 k8 m7 D6 S/ j) ] *
; S1 _+ Y- ^) k; A* w, x * You should have received a copy of the GNU General Public License
0 W, U# x, M1 K! d! p * along with this program; if not, write to the Free Software) d! r& x) q7 @* j0 r  i
* Foundati0 R% y: g% T, Y% j' R  i
*/9 P: L" U/ W# a( ^' I" R" o
#include <linux/module.h>
3 v8 m8 ]: M0 L#include <linux/init.h>
* k6 S) U  ?" c+ D( _4 K#include <linux/errno.h>
& \2 ?! e( X; C) J% I# H' N#include <linux/types.h># J0 V/ `2 z: R' {  r. h. j3 Y# j
#include <linux/interrupt.h>; q4 R0 r* Y+ m2 g9 S( C' u
#include <linux/io.h>* `4 P& |0 \2 B: ?; a( m8 c+ D
#include <linux/sysctl.h>
5 h4 U& I# j; @8 G$ E6 f8 S- J#include <linux/mm.h>
' j$ h0 A! ]. ^7 E* c" w+ C$ {#include <linux/delay.h>) r$ w) X: g) w3 K& S4 C* b
#include<linux/kernel.h>
+ G; N) D: X1 `" U4 Q#include<linux/fs.h>/ d' ?: j* c  L3 t& B
#include<linux/ioctl.h>8 r9 S  R/ d0 g& x2 _
#include<linux/cdev.h>6 ^8 j) C+ B8 k* J) g
#include<linux/kdev_t.h>
0 x  r, \' I9 V) ~  t7 [% z#include<linux/gpio.h>
0 L: y9 ?; I* N% l#include <mach/hardware.h>4 R  L: ~/ I8 y$ X
#include <mach/irqs.h>
4 s/ a( H, c: \) l# n' n7 I. }* }! t+ K, O, @
#include <asm/mach-types.h>6 F. Z3 o. G, k  J% c
#include <asm/mach/arch.h>
/ q, ~9 E- A, S0 p" S#include <mach/da8xx.h>5 E9 Q8 j7 W9 o; h  E5 c+ u
#define  SYSCFG_BASE   0x01c14000
7 X& w" o' m$ v8 |$ C5 l#define  PINMUX1_OFFSET   0x124
% d. s& z- |7 Q2 k# r* Q#define  PINMUX18_OFFSET  0x168
% s% ~: [" K& p( i, A0 t2 ]#define  PINMUX19_OFFSET  0x16c
0 i; i# o- U2 o( i3 ?* ~1 j2 h/ i) |#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
- R4 C" X, `" d7 D#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR1 {4 N% T1 P- e  W
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% G" o# v* b! R# b2 e#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
5 k9 Y" V- o3 g" d3 B9 j#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR4 ~' T  k- ^7 f$ F! J/ I
                            3 \9 Y* x5 h5 q8 y/ a5 x, `9 h& X
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR1 j7 T" e2 V  h/ ]! D/ P3 E# h* ^
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR' \* U2 c# _- k5 l- [) Z: N2 D& l% \! r
//PSC* ?8 L4 w- \* d. q5 d
#define  PTCMD_ADDR   0x01E27120  
* z3 N7 O* I6 |; G1 x2 M#define  MDCTL15_ADDR 0x01E27A3C$ D0 {2 [+ ?) f9 v  C1 m% U2 u
#define  PDCTL1_ADDR  0x01E27304: r3 ^3 n  }1 A9 }% f- i% e
//GPIO8 direction
7 Z. R1 d" r4 y+ g+ c4 ?#define GPIO8_DIRECT  0x01E260B0
, Q* N3 z. C7 ]/ ^+ r#define GPIO8_OUT     0x01E260B4
4 J% `9 Q3 T/ w1 s#define GPIO8_IN     0x01E260C0  C3 h! D3 E" e9 F) c3 E4 B

% H( @% v; w  ]5 H# B2 W, |//#define MCBSP1_RINT    99              9 ?& l/ I# N0 D0 Y
//#define MCBSP1_XINT    100  % d. u- y& [* u. R6 M
static int MCBSP_MAJOR=239;' J' y( m3 p& M9 C9 F) l2 D% L
static int MCBSP_MINOR=0;9 Y8 s* k8 L) @5 B: L2 \5 `( y! g, D& K
static int count =1;
2 X: z1 s& d+ M/ Y4 S4 E! b6 E
% u) g4 `; _1 w" L2 g* H#define MCBSP_NAME  "MCBSP-device"5 x" h% X2 X) [9 [: \) w

# i9 Q! ?% R- Zstatic struct cdev *mcbsp_cdev;
9 y0 a0 ?- o. k/ Estatic struct class *mcbsp_class;0 g+ \* S& e% q2 _' A( p$ {
static dev_t mcbsp_dev;/ O0 C: l' {; p
unsigned int DRR_data;7 ~6 @% y6 Q  J, Y( H. n* D
unsigned int DXR_data;
4 v: o8 i. @! M9 ystatic int mcbsp_open(struct inode *inode,struct file *file)+ N) o% u$ K: I1 b# B9 t- M" O' D( s7 M
{
& x8 F% `  k+ Z5 i& g   + Q8 l. I3 s# J% {' ?/ f
   //interrupt enable,initialized* p0 Q% ^4 T  ]0 H; }, @2 n
   unsigned int temp;% t; k. G$ [9 A" o" r
   //SLEEP_EN(GPIO8[10])---0; }( m0 p3 _( [1 U, f' V
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 ^/ d5 J) A0 R2 ^; k8 f
   temp=temp&(~0x00000400);
5 X) y% K# R3 b1 ~- b0 @  e, }* v   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 H; l$ l% B" v+ X- \
  //RESETn(GPIO8[8])----0----19 b0 Z% W- u8 P4 N- @
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! t5 U) l# v% n; N
   temp=temp&(~0x00000100);
. `) b# X3 Y; ?" u   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, O$ u  Q( t7 J% T1 X1 Y
   udelay(100);
  O; ?; H1 H9 J' ?& t. @   temp=temp| 0x00000100;/ V: |( d/ R. `1 X9 |$ |# n
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  Y. y- V- D0 m$ c" G
   udelay(100);2 l, v# L. Z/ b( V
   printk("open success!\n");$ c( }/ h  C# K- B) H- y2 ^* D
   return 0;
1 O1 t, X/ @: S}
' E: E/ Q. `. Z( r
/ S# X1 B5 u, g& pstatic int mcbsp_release(struct inode *inode,struct file *file)! S2 b% j+ m# ^' ^
{
* {9 V' W) d( h# b* O$ j) `; h  g   printk("release success!\n");+ U& ~. O. s9 Q3 q, [% ?9 U# ^% g
   return 0;
# _; o+ q$ C  L4 s}( C% n6 j- ?" g! K& R
- o4 C; K+ w/ T
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off). R2 H; M5 F" X$ f/ r+ ?: z: j' O$ e
{
5 J9 d9 K5 B7 ]. L3 U    copy_from_user(&DXR_data,buf,len);
1 A2 L* s9 [7 I' _    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       . F% o) _' w  `3 G
    return 0;
) i3 e# e$ o' A" m% Y2 c, E2 @
/ B, S* d+ J$ L( m' U}" E/ C# ?( S" z6 {- M
! Z4 J. g' d" D. Y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 T. q1 j+ f  ~5 u# H
{
+ i; \9 I/ w# R5 C% n. j* c   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
+ Z8 q$ i, E+ e% e' U& C   copy_to_user(buf,&DRR_data,len); 5 [7 P8 e( Y& {0 `  G( v
   return 0;; y* P6 K& L, ?* f# a) G
}
7 S' ^0 K" I& i- F6 j/ d$ e5 V; b0 x, ]+ z+ s- X3 v( m+ Q9 v
" C2 G# p. E4 k, a* @
static struct  file_operations mcbsp_fops=% o1 _# i/ k9 L; @' O
{) a" J% }7 |! [9 O
   .owner=THIS_MODULE,  Z9 ^& H* v8 h
   .open=mcbsp_open,
+ k4 k) R, [& d   .release=mcbsp_release,- [" l, u# ]* k
   .write=mcbsp_write,( u! P( P; W) l
   .read=mcbsp_read,
+ y3 [2 O/ t- x0 T};
0 d$ @" o% g. q) W0 D& Sstatic int __init MCBSP_init(void)
+ K0 W/ ~: M2 ]0 J1 K9 S/ Z' T{) Z# Z2 A& d; O$ W
   int ret;
" n( f" e. C4 r/ N; ^  r+ H. z/ O' l0 B   unsigned  int   PINMUX1_REG_old;
- @* m/ E2 E( \" l& S3 N$ ~   unsigned  int   PINMUX18_REG_old;7 A' a, A  L9 K$ Q! D" `  x
   unsigned  int   PINMUX19_REG_old;
$ ^) }$ S- o( ^1 q   unsigned  int   temp;  " _( J5 @/ b7 ^' B3 O
   if(MCBSP_MAJOR)* i2 W* n, J$ A
   {$ J1 [5 U$ r# I& x
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( M' k3 L2 h1 L) H      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  ?" G7 V2 S0 @: R, F+ W. ~# q1 ~
   }
* q* r! T( ]) P  C( }   else
3 E3 V. w* Q  ^. M5 v   {9 C- |  V! s! b$ p6 H
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 f4 L' ~5 @/ L0 g6 ?      MCBSP_MAJOR=MAJOR(mcbsp_dev);5 G- _2 x! L5 o, C
   }
' u) s2 M% X: _8 |   0 w8 z) c2 M" H1 w
   if(ret<0)
, w7 |7 `9 W4 d9 L5 _/ r- N5 q   {
; s. l% o: ?5 u  x4 S      printk(KERN_ERR "register chrdev fail!");  Y! u3 r. o  f" Y7 g% Z
      return -1;
4 n* s5 |# L6 O! m   }9 p* M9 t& ~  F7 t
   
! i; k. D; _9 T: I   mcbsp_cdev=cdev_alloc();* e6 B0 _/ k0 ^& F7 y% H, D' n" U
   
9 s' E: K9 X6 i) I1 z% x   if(mcbsp_cdev!=NULL)
7 F$ s4 ?4 S. |/ ~# ~' x9 b8 @   {
& H! v8 e8 g2 d) L) S. i      cdev_init(mcbsp_cdev,&mcbsp_fops);
, k$ C. v' H9 i' I; B      mcbsp_cdev->ops=&mcbsp_fops;1 o% T- L4 t+ r6 m# ^
      mcbsp_cdev->owner=THIS_MODULE;; N3 ?3 Y8 i4 [( v& ?) r
      ' z: s9 W$ W) `$ C* M& v0 Y
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 `3 [1 v4 m: ]
          printk(KERN_ERR "register cdev fail!");/ x4 @, S3 ~* q+ s' C/ V. A, Q# h
      else8 o3 Q  n1 J/ S- z  m6 _/ {; `5 z! N
          printk(KERN_ERR "register success!\n");
) m( |5 m( G1 z1 D   }' y! A. \/ f% O+ D; f! K" X
   else1 d  M+ s' ]7 a: }: P' v
   {, ?' R% k# b1 ?: \
      printk(KERN_ERR "register cdev err!");/ j9 ~( r9 n0 d4 P4 T' d) J/ @
      return -1;
! ~/ E- _" b/ i3 _1 z, \   }
$ [5 ?9 g- n  c% k1 s   
, B  D$ v$ v' x3 B7 ?0 F7 u  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
  Z; f6 S+ ]5 Q9 e  B6 j" v   if(IS_ERR(mcbsp_class))
1 J% P6 ^+ D3 R3 N# i1 v/ B) p   {
9 @: y2 A  A) U& m) \- K' V9 E      printk(KERN_ERR "register class err!");" n, D$ L3 k9 O" L  {% u" v
   return -1;" c4 A) i. R6 ]( q& j
   }
$ `; }& Z: j, j3 ~5 S' _( K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 H4 R$ A2 [3 P9 h1 N; M; U- |
& S- P& Y, G: [6 G  D8 ~
   //PSC6 ]8 e/ i/ c+ C1 w" }, n3 j6 [3 S! x
   //add Enable MCBSP
5 l, _- m7 L; ]* W) K9 f   //test
( e' D, M" j' \   temp = 0x80000003;
, T' ~! }4 Y/ i0 M! E; {2 \   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 F& S) l/ o6 A4 c) x
   temp = 0x00000003;
. C- w8 ~" P! J# j5 L6 w" L   writel(temp, IO_ADDRESS(PTCMD_ADDR));- G& v+ @3 B* v; E$ w

9 s1 c/ ^/ ^' n6 h   temp = 0x001FF201;
/ O2 w& R9 V9 O7 l: U   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  f6 L& `- |2 F' p" e/ b. ^5 V2 I+ r1 y   
; H) Y1 v$ K2 Z" e& T0 h   //PINMUX  4 `  F; }8 L+ _. N, l6 q
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& }, O# f% X9 _
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * w5 X, U4 k6 r# r7 ^1 B4 A
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 V" J) \  b4 B3 a; r   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 H" ^' ~) _7 R
   
+ v# [& H  G, ~2 V" ^   //SLEEP_EN,EPR,L138_SHK1,L138_RC7 ~4 q2 M: T* k  W
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
6 P8 K( O. N. e' {+ A7 R) t# f, z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   + \" v$ X2 w+ D0 x. \9 m# M- i
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ B, S& n& ?" N! K3 c! G" J" y 0 f4 i* x7 d' j8 Q/ Y
   //RESETn,L138_SHK2
  r1 W3 X2 w2 [% k* S( n   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  , O6 K7 I; L% W+ j$ H3 l; R- y
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
- N8 W. B2 S! r6 s   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);* _4 V7 w; W2 _3 i5 I( B. N
0 m. c9 \; d2 h5 J) T! l" E

. U& ~& P0 z; R2 _3 A$ K  //SPCR Register8 K9 ?$ z* I3 l4 [$ T2 B; ]
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- H0 C3 m/ C3 t6 W, S8 U5 P! u/ P  temp = 0x03000000;//(DLB=0)
* z8 K% a- q  U1 P8 n6 E8 ] // temp = 0x03008000;//(DLB=1), ]5 D$ @; m8 z) k' g3 V1 t
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
. J, e/ [% X% {- v$ v! Z, V4 E* P  temp = readl(IO_ADDRESS(SPCR_ADDR));9 C9 V$ G5 T# |; w1 R: n8 d5 c
  printk("temp=%x\n",temp);
: L+ a. d( n6 r+ J6 n' K! ?9 I * \, W( \# ]% C* q* T" t
   //PCR Register" p/ v2 p* S/ w1 J6 p  ^6 `& C! Q
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ F1 u5 O- s* d) [. X
  // temp = 0x00000F0F;
5 X6 e9 L! i, ]3 s* P/ p  temp = 0x00000B0F;
" \  H7 I4 d! B% [- J4 B: w3 ~. e  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
( Q' V4 T3 \( N  temp = readl(IO_ADDRESS(PCR_ADDR));1 Z6 @7 R6 X% H- G/ ]2 O5 e* J
  printk("temp=%x\n",temp);  % m) \( g4 Z7 l2 @9 C1 {
   //SRGR Register& F% r# ~& j* m  M0 n; |1 S* X- p
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 c) J- u! I9 a! D8 f* R0 X //temp = 0x301F000B;
7 S0 D' w. `- \* D   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
  N0 S% a6 A3 O3 e  temp = readl(IO_ADDRESS(SRGR_ADDR));
- V4 h' |$ A& v* V  printk("temp=%x\n",temp);- i5 K1 X# w8 w7 p, ~
   //RCR
0 N+ ~! Z: I$ a8 y: H/ ~   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 K* ^: J9 g1 `5 G8 c9 ~
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0- E. |) G( C8 u. L  j7 q. B: P" G
   temp = 0x00440040;; p6 a9 J9 w& |1 ]
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 q% x: H! P; L+ ^: d8 h   temp = readl(IO_ADDRESS(RCR_ADDR));
+ g2 Q4 X3 d; Y+ _5 L   printk("temp=%x\n",temp);
* V* ]/ A8 o% p0 B2 F   //XCR
: [! ^6 E3 y4 \( x   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! I6 V, Y; Q3 [# m9 q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. \% N. O* j, D# o* t. e
   temp = 0x00440040;
. E2 T  z) a6 I+ R+ @3 ?8 _* L   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
7 P9 Q- z# _- Q1 ~   temp = readl(IO_ADDRESS(XCR_ADDR));& G, ^" {3 L1 W' t9 T! W/ ~
   printk("temp=%x\n",temp);+ q' j( S5 q8 v1 r# r! U% i2 c
  udelay(100);9 y2 f, n6 J0 q# z$ _% n
  //SPCR Register( e1 p3 S& D4 f: s& S- G! g$ s
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. r% d1 i# ]6 Z1 ~3 k$ W4 I) d5 e( _  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
8 N6 v5 S* `/ J) d  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 U' |/ n9 t5 e! m! k5 N  temp = readl(IO_ADDRESS(SPCR_ADDR));
* S% l* t7 Y: L8 y' k9 u  printk("temp=%x\n",temp);
0 q( U1 l/ l3 W" h: u# X: B  udelay(100);
$ q  m% {" {' L% V6 x% T3 `2 }- m  i0 `/ x% S
  //set GPIO direction
+ b' P$ K( e3 P3 l   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- ~6 v  y  i# k! p" p# v+ W- ^  h
   temp = temp | 0x00000100;//EPR----input/ P: T/ m, H3 S# O& V
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; B5 N7 w8 h. ~: H1 c   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) ^& E* H! D; H; ]  x: \ 5 j, B$ D3 x' |  Q' {, E
   return 0;* \8 D& t; [+ S" e
}. E; _' L9 A6 Y! e9 N
static void __exit MCBSP_exit(void)
1 {' q6 a0 @6 ]- \* q{% c4 e2 N" K3 z0 d& D4 @7 ~" \
   printk("mcbsp chrdev exit!\n");
  k! ~7 [$ G- z  T0 A* o, m$ j   cdev_del(mcbsp_cdev);. D% B8 G8 q6 K2 s9 W7 x
   unregister_chrdev_region(mcbsp_dev,count);
6 a7 R) d& x% M; P   device_destroy(mcbsp_class,mcbsp_dev);+ ~  _4 n& i% _8 k8 Q
   class_destroy(mcbsp_class);' Z" n( n5 f/ r- V  j, G0 y) B
}
2 F) r0 U; L& hmodule_init(MCBSP_init);" b3 @# s( F$ g3 [4 O- n) v7 {* R
module_exit(MCBSP_exit);( d1 U4 _9 `4 `9 e

) j& G! x8 g, Z9 D  J. RMODULE_LICENSE("GPL");
) Q2 D+ [" K  l1 P5 J3 _( b
4 \& N0 I5 B' G" c, L9 g6 J我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* a% d9 [4 H% `2 W1 ~. i
我的应用层的测试程序如下
5 x- D7 n' e0 A4 y#include <stdio.h>( R' N9 m1 V3 t1 d9 U
#include <string.h>
( a- R: E2 l( C8 M/ u8 X#include <fcntl.h>
0 V7 D- a& ?7 |2 r#include <unistd.h>8 U5 N( n/ a$ x
#include <signal.h>
! E& J6 E' m3 d#include <pthread.h>       //线程. r$ ?* X' X4 ~% V' A* h
#include <stdlib.h>- {4 S4 d# J: ~+ Q2 J
#include <pcap.h>          //捕获网口数据
' t4 S5 Y" F0 [! d( @' K* q: a; t" U/ V#include <semaphore.h>     //信号
( h8 l9 P+ g7 N: A3 M#include <sys/types.h>     //消息对列
5 i5 N( l$ _  |4 b* G9 p  I% d: U#include <sys/ipc.h>       //消息队列
/ \! I6 z1 y. z6 c' N+ h# r* A#include <sys/msg.h>       //消息队列- O) O, [6 e% y
#include <sys/select.h>, X2 q) ]  c$ e$ e
#include <sys/syscall.h>8 }! R2 R: U; ]
#include <sys/stat.h>; p/ Q/ o; r" G& N% c3 t: D
#include <sys/mman.h>+ k  C  G, Y& Q1 G
#define msleep(x) usleep(1000*x)
; i! {5 `% J, [9 K+ g. C0 F& ~- U  }% m- f7 X' R( b) p
int main()
7 Y* E% ?) a# t0 H2 A) g{ " e1 ?1 C) v  Z, r3 M
    //MCBSP,ARM与AMBE2000交互设备9 T! v+ i6 f* G! `3 A
int fd;
' _# H) c1 W' o: L! l" D* n unsigned short data_write = 0x5555;
! A8 g9 V5 s- E7 Z! V unsigned short data_read = 0x00;
, p; J/ G0 G- i1 V  k+ H$ _  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ H( a& V) }1 F, O4 Y: D
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 |3 p' W$ }) \( e+ C8 R
   
0 ?# n( N' u6 o* E& [  T# X, V  if(fd < 0)
6 d7 S$ b& \/ p6 L) }* {( d) p  {% I% P4 z, Z# ]+ y
     perror("open failed\n");" m2 ^% I; h6 q3 r  t% [
     return -1;; N, B( ?7 g3 _& e
  }9 O# L) o1 F' E+ @  h4 G
  8 T& l& R2 M4 x. _9 A; s3 u* d* s
  while(1)
) G0 x$ S) ?( F, t  {9 Q! ~" T% b  y5 _+ m
   
$ ~7 _0 R8 d& v4 _   //AMBE2000每次读写是24个字为一帧" ^5 f8 Y- e$ C* |- l  h' x7 \
   //写数据时将数据在底层存储起来,等到中断的时候再发送
' Y; G5 M( K% d/ u6 f   //AMBE2000输入数据是以0x13EC开头的
9 A  T: E. m, Z7 {# p( q   write(fd,&data_write,sizeof(unsigned short));, x, ~4 C4 o& k' t- D/ y+ K, Y
   : i+ y0 u$ x6 M1 C3 @3 o5 P7 q/ V
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; \; s+ ?* p$ F; [( k9 @
   read(fd,&data_read,sizeof(unsigned short));- I+ X$ p+ `$ [+ F  _
   9 V+ Y4 S) x2 A! a( \9 I6 s
   if(data_read == 0x13Ec)( [: b% o4 C% d% X# U# d5 W
   {* Q( H+ g3 H: v* f
   
0 I! N5 Y4 X7 N6 B4 o/ x/ s    printf("data_read = %x\n",data_read);! s* `2 v2 H# v$ j4 s
   }
& L, ^7 |+ k/ k- K# A   0 S/ I* M) R& U/ @
   msleep(10);
1 j! ^0 h9 X! r( b( E  
6 f9 K1 Q* e& ?' N- F9 w6 c  /*
' z; d; J; M& c' i; u1 u( A+ l4 e   ioctl(fd,1);   % }) A* l: i7 @8 M& @' v
sleep(1);+ I1 @4 L8 ~1 a7 O
ioctl(fd,0);+ s6 U; `" E: S* |' ]2 S, M
sleep(1);/ D; z, u" V3 ^7 P( A# p
*/ - m# X# M0 h. ]/ U' G
  }   
8 M2 o4 |. G9 D2 }/ m/ T. _ return 0;5 O* z  A  s7 Q/ T

! S# b- ?+ j8 [/ {' ?8 H}
+ b/ W2 X& Q  f7 z( h4 E; C$ b( e3 f2 `2 a, C
多谢各位指教,谢谢! 急1 ^% ?, F% S6 W2 N

4 h; k, l7 t5 S: |& W! i3 O9 [0 e/ B) M4 {6 G- c
+ ]* |  Z0 o+ t& ?0 Q8 n, B' |
. n" U* V! e. Y  R) B7 s4 p* y
: }1 O/ H# i# o& y- _+ K! R- s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 00:00 , Processed in 0.050743 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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