McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! d' L& a2 c' t" i% S
/*
4 Z8 i$ r" b5 P0 Z% a8 C2 e * Copyright (C) 2009 Texas Instruments Inc5 b7 x, v4 e/ X# W" v; E0 o
*; e7 q9 H8 i! z: X) \. o
* This program is free software; you can redistribute it and/or modify1 p; I, y3 v- B* Q7 e; b, h
* it under the terms of the GNU General Public License as published by
7 V( i; q6 t7 W" p * the Free Software Foundation; either version 2 of the License, or
/ o: m, o/ b  O" \4 H& H% z3 ` * (at your option)any later version.) s- s/ f! Q; Z6 k
*
0 r4 K! j8 A. u5 \ * This program is distributed in the hope that it will be useful,& J) D8 U! ?) ]$ s. G" g0 t8 F
* but WITHOUT ANY WARRANTY; without even the implied warranty of1 n. Q2 V; j+ ?- D& n% m' C
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
: z. W& x- S  l5 T' p1 B * GNU General Public License for more details.( Q+ {  f8 `3 m2 z6 g
*
2 [# b$ Z+ R: S7 a( _ * You should have received a copy of the GNU General Public License4 l) N' n8 q% q, r5 H) l! }# |0 c
* along with this program; if not, write to the Free Software: T, H. \5 z8 @# E4 Y! s, q7 `; U3 A
* Foundati  ^9 J3 U  d4 n5 {. L" t( d& p
*/: u6 k* a* e" E, _! h( b( _2 _+ a
#include <linux/module.h>, ]0 V9 M4 q+ Z7 v& `4 G9 Z# Q
#include <linux/init.h>' h) O8 r5 ?6 |) L
#include <linux/errno.h>) n7 Q9 G* K1 }2 r  d/ x
#include <linux/types.h>$ U2 F0 Q  h4 @. O
#include <linux/interrupt.h>
$ P- |  ?* b* L$ D" f7 p#include <linux/io.h>
6 U* w% h5 A+ w2 H$ ]#include <linux/sysctl.h>0 z' \# Q9 I9 P4 t# `
#include <linux/mm.h>" g( z) K2 Y7 L7 \/ v
#include <linux/delay.h>
) A4 S" p. t; P6 T# b7 p7 L# @2 X6 b#include<linux/kernel.h>
' I& w" h$ A( [: }! F* U#include<linux/fs.h>
) T  V* F2 C7 t  s1 F#include<linux/ioctl.h>
* {2 o) |9 c5 H. B5 y#include<linux/cdev.h>" Y/ D% U& @8 e- W
#include<linux/kdev_t.h>
3 `! s0 t- U& x; m. E6 L) s; A#include<linux/gpio.h>7 [3 }# D. `. T8 U
#include <mach/hardware.h>
& P! A$ F, R9 J$ A  j% L#include <mach/irqs.h>' ?# ^. q! \3 f$ K
% N0 x4 `' ^+ x5 M' g1 R' k0 i# ^+ |
#include <asm/mach-types.h>
, f4 w9 V& i. {9 V/ n#include <asm/mach/arch.h>
' l: b) T2 _, Q1 U' T) B* K$ D#include <mach/da8xx.h>* d2 D- I+ H$ Y
#define  SYSCFG_BASE   0x01c14000
, z& w; E- h" X( N! ^#define  PINMUX1_OFFSET   0x124 5 u$ g7 C1 I! {* M* `. X# q( w
#define  PINMUX18_OFFSET  0x168   T. Z/ W$ O; k9 O3 k0 Q, l
#define  PINMUX19_OFFSET  0x16c
- p8 Q6 @$ \/ D' c& H#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
# @* ?- R/ R! S( ?: C# c! D4 W#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR% {4 e4 ^% h8 @" @: k0 S! M
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& p: V1 u& ?4 Q) l, z" D#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR5 s( g/ V4 J5 w3 L
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
5 v, _: W8 ?. S) @                           
0 {' ^. R0 W: B! w) ~1 [+ B7 S# H$ X#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
+ r, U, [0 L5 X& C) `$ |& Z) c#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 X' L1 U8 S. ^- [5 s0 Q//PSC
7 Q9 f! [6 `# h# d. A) {  ]#define  PTCMD_ADDR   0x01E27120  , E; F0 H' A( [4 E% T3 c( I! @: d7 y0 L
#define  MDCTL15_ADDR 0x01E27A3C
4 d; h' x! M7 ]5 z: W- n#define  PDCTL1_ADDR  0x01E27304' Y" y6 ^1 |" x* K+ n
//GPIO8 direction* i& b8 x0 X) `
#define GPIO8_DIRECT  0x01E260B0
1 e  G+ U# S$ K) q! |( z% v#define GPIO8_OUT     0x01E260B44 _( P) g9 \& S4 A+ ^) e
#define GPIO8_IN     0x01E260C0( I7 j/ X) q% B4 N4 D+ L  _( G/ ~
: Z. V3 L/ M# M
//#define MCBSP1_RINT    99              ; a' C% m' e# e( }' u
//#define MCBSP1_XINT    100  6 j; }$ f0 ]. s$ x* }# w
static int MCBSP_MAJOR=239;. x- _/ _6 G  A
static int MCBSP_MINOR=0;' z& X. Y! G& W* ]& g
static int count =1;4 x; A* X" Z2 m, B% t6 D4 V( O: h# n
; _5 l, Y  J5 S: O( a
#define MCBSP_NAME  "MCBSP-device"  K8 j& S, r$ X4 ~# ~* v- j2 \5 v" j
  w' S; E4 |, ^0 H3 |7 z+ z( k
static struct cdev *mcbsp_cdev;2 T, l) ~, Z/ S* |) J8 b- H
static struct class *mcbsp_class;
4 ~, h) W# O. Estatic dev_t mcbsp_dev;
' y% f3 W2 A9 V4 f0 cunsigned int DRR_data;
5 o% ?9 o  h9 w  e" H# c; L" x  q6 b- munsigned int DXR_data;9 w( ?: r8 `  V2 f! _
static int mcbsp_open(struct inode *inode,struct file *file)) {/ o& l* a" s# g
{
7 n( q$ g  u7 e$ Q6 I" z   
* M' {) ]* @" ~' P   //interrupt enable,initialized
! ^* {/ s' D( m) ~6 Y   unsigned int temp;
1 L0 k+ \- v8 ?) C; K   //SLEEP_EN(GPIO8[10])---0  K' ~+ o2 A8 R" K$ [1 S5 f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 B! B5 U: v3 m* U3 `; o1 g   temp=temp&(~0x00000400);
# w4 u! C4 W* f7 W0 G8 R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! i$ R( f9 _' l  //RESETn(GPIO8[8])----0----1: o( D) n/ q  U- ]2 [2 n, }% s8 q, C+ W7 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 G3 }/ l5 N" o) \   temp=temp&(~0x00000100);9 f  z5 h3 h6 F3 s, ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0# @0 n1 s0 K( z
   udelay(100);
- B6 _- r: t  s6 C7 o, S/ Y, R0 c   temp=temp| 0x00000100;
  m6 I0 j, G% l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1: B5 Q9 v/ |8 B* p: s) \8 _
   udelay(100);8 ]! k. Q2 o6 i" d) B* m/ L
   printk("open success!\n");2 x9 z* `: ~# C; n2 b3 j
   return 0;
# P, e" f$ t# B  E: E}+ ]  w- l, S" f. J, r% R/ k

. m: X, t6 w6 V: Nstatic int mcbsp_release(struct inode *inode,struct file *file)
# F2 C$ j* k! l! X7 a/ u  p+ C{/ |" W7 u; Z* r& Y' z& N# n. h2 J. e
   printk("release success!\n");
* ?9 m( Q; m* T4 `4 ?   return 0;
1 t) S8 X6 z3 e5 Z. {5 s}! _) m$ Y' g7 z) V5 C6 K- `

5 }. |4 V8 U3 a, R3 Cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)( k4 H/ c4 b; U. s1 }5 F$ d
{
" T7 K8 Q4 V* l7 L2 U' K2 q    copy_from_user(&DXR_data,buf,len);
. {; g5 V7 N- X( \3 Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       2 n/ G/ B' k& s  ]
    return 0;% j, H! a1 u/ j7 |+ K

9 j" f6 H) |7 N2 b- ^8 b1 V& Q}7 j6 |# p7 `: r, H8 M  {

3 Q5 ~' V  a' G' ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- S) Y/ z- w$ l7 ?8 ^{
+ ]9 W- ~9 a. }  N! c   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ e# F2 |- ]- O, l
   copy_to_user(buf,&DRR_data,len); ( U* S1 ]' `6 J0 P7 @3 l+ V
   return 0;
" |/ Y% u# C" A, I7 W) M. \}
6 |' L* U& i1 @1 A2 o% a* \
/ _* F% z3 a5 l3 t0 ?  z) c! K# J# i" R5 v' m# w" p) i
static struct  file_operations mcbsp_fops=( P: w9 D, K- ?9 S& f: E
{" i% N1 y$ n# E- B1 I) `0 u9 H
   .owner=THIS_MODULE,) x) p1 t( F7 h% n1 r
   .open=mcbsp_open,0 v) M# j1 J7 A! ~
   .release=mcbsp_release,
: \/ Y$ ^- ~7 F: _   .write=mcbsp_write,8 s) W" B1 G+ R
   .read=mcbsp_read,
# I# b+ S4 }* p1 d3 U};
3 |7 M' W+ M3 k- M8 F2 {* `* \static int __init MCBSP_init(void)4 ]3 c. Y6 W) U/ c4 e
{- a; U( F- Z; p5 q
   int ret;
% b& v5 t" ?& L+ e   unsigned  int   PINMUX1_REG_old;
) Z6 r% `3 l$ n, ~4 w; M   unsigned  int   PINMUX18_REG_old;3 W7 C) J" a1 Y* o, @. l
   unsigned  int   PINMUX19_REG_old;
+ Z( h( M, C" G  J   unsigned  int   temp;  
: P# P: K9 T. p" U. b   if(MCBSP_MAJOR)
4 N! V' s, v% s/ ]1 ]; n   {
$ {0 Z/ d) Z2 U5 ]' C! e) p" P' @      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 G" \, d7 r* `" E      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);1 H5 d1 [* k: t; {- F
   }+ ^1 L4 J# F; m4 V( S
   else
# V! K. `9 K8 m( v. r1 l   {2 h0 n" J0 `+ ]$ C: ~7 _" L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);% p$ d* `& e8 {4 W; @5 m, k
      MCBSP_MAJOR=MAJOR(mcbsp_dev);, ?# |) R1 F, S5 h( b, Q8 g% E
   }
2 n0 B) g7 o% p! v3 z, @2 G+ l   
6 |* l! [; ^0 I9 ]( E/ U9 T   if(ret<0), `+ W+ }0 W0 m% D. {8 ?
   {
. ~2 M: y( G, }2 x4 l      printk(KERN_ERR "register chrdev fail!");$ {$ U" z! {4 w' c% z  _" G
      return -1;
3 d$ y( o7 _* E9 e4 R0 [6 R; A6 f   }
, s, ^/ M3 x8 }. `- i% M   
' u5 s9 G4 a7 f* Z   mcbsp_cdev=cdev_alloc();% D# {4 T8 W8 G  _% b6 l, ]
   # B, B0 C5 i7 j$ g, O! Q
   if(mcbsp_cdev!=NULL): l# M9 r: G/ K' R( Q
   {
# i2 i; u. J1 x  _. y      cdev_init(mcbsp_cdev,&mcbsp_fops);4 N% d  P5 V. m& h
      mcbsp_cdev->ops=&mcbsp_fops;
+ f, @. O$ `+ J/ s5 h8 ?      mcbsp_cdev->owner=THIS_MODULE;% V1 f# P2 n1 S, z8 s& ~% l
      
5 w9 @) x$ z' W1 X  [0 N      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
3 Y8 Z2 R7 ^7 c. n( N$ i          printk(KERN_ERR "register cdev fail!");8 `* U( z, g" p# f! L) l
      else
7 ?! ~( Z& E5 j3 U          printk(KERN_ERR "register success!\n");' U. T5 r1 L# s) s2 t' t- ^
   }+ q' E0 _/ @. o, ~* m
   else
: [1 N2 ]  |& x/ Y% ^   {
1 }: V+ T# p+ f0 l: \$ N      printk(KERN_ERR "register cdev err!");( a, _% `6 d9 e3 z, R4 D! S% B
      return -1;) r2 L+ ]/ c/ b; s
   }# X2 l! c! P: k
   4 o4 N/ N3 D4 l" j: a
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);7 U. s+ S9 H% o2 e$ D, `
   if(IS_ERR(mcbsp_class))
( J# m& y, ?; v% `   {. C2 L7 S3 b& P7 `5 {5 Y
      printk(KERN_ERR "register class err!");  p* S8 u7 p, ?/ c+ F7 {) V8 g
   return -1;
/ Y( Q( m* y8 B# e% i4 d   }0 K) Q- ?! k. I0 N3 [$ P
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# \0 K; h5 E) K2 @3 f0 f5 _* Z& N& b6 i
   //PSC9 b+ T: H* N" d6 J# w2 _
   //add Enable MCBSP8 B* d, m+ o/ _5 t8 P; O0 ^  m
   //test$ N  N6 v; e- @# i9 y
   temp = 0x80000003;
9 W/ B# m1 Q- b; I  A' U   writel(temp, IO_ADDRESS(MDCTL15_ADDR));# F% W- [# \# Y5 G
   temp = 0x00000003;, N; c. o! \# [
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
6 H) D/ D. x, z! g" J, m
* X# x2 N! s9 g) U  k, O) j   temp = 0x001FF201;9 b" T% ^) ^: J# `" N# _* I: ^7 d
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# U( }# _) q2 p* |& O4 c; ?   
7 I' F7 i. s% D: j  U. C$ S   //PINMUX  5 p1 L' j% y  q  X' l
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. G9 p3 v/ P7 u0 J5 i& b2 G1 F8 p( c
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
% G+ o' v3 s5 S! r; \9 }   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   " I7 Y# t7 H4 f! N& K5 H
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! A. p7 J0 |- y: `3 D9 |   
7 `& q( c' p2 F5 D   //SLEEP_EN,EPR,L138_SHK1,L138_RC9 m' \5 W  ^! _& Q  X# o+ ~) _
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  / I3 a$ }' t7 t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ) o3 N2 T3 v3 D1 b2 G" q/ D$ H
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 T+ V  x% q. ]6 I& O
9 ~2 s2 f/ ?  k; |! a/ I   //RESETn,L138_SHK2
% `. h$ L4 `+ _# [6 Q   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( @: G& G- V: e  b' a# O7 e- A
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   2 n" J1 i, F! a& n
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 y! G/ z% {1 J' N4 h $ O, @# [0 b' Q! w. p9 H

: q  c% z1 t, r  //SPCR Register! c* w2 j# d0 R3 W2 q
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# h% L2 R  K: [4 C0 G: D3 [  temp = 0x03000000;//(DLB=0); }3 [* Y- g) U$ B1 x
// temp = 0x03008000;//(DLB=1)
; {5 j# f1 G# P% E  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
( m2 ^. @0 Y  r  temp = readl(IO_ADDRESS(SPCR_ADDR));1 X6 {( |7 S( Q7 w: {8 f, r- c
  printk("temp=%x\n",temp);
3 J4 B+ d; v+ n0 b+ m
! [$ }% q- [* {* I" l: W   //PCR Register
% n1 P# l: `9 S4 @9 J9 L   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 _) Y/ m* U9 t* ^. L6 i, }: z
  // temp = 0x00000F0F;  t! [' m% g1 F9 p. H1 ]$ M
  temp = 0x00000B0F;2 ?) ?# O0 [, \$ d4 p, C8 u( y
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 _' c! i: e+ f9 I# ^  temp = readl(IO_ADDRESS(PCR_ADDR));# S  D' E, r0 c+ h
  printk("temp=%x\n",temp);  & L6 j4 t$ f' n: T1 z% {! ~: Y
   //SRGR Register9 I$ `( l! G# I& |; t+ U( [. p) _
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ W, N6 `$ {8 W3 Y. `! |7 N //temp = 0x301F000B;
, q. F+ A  }( R* O. K7 f+ f   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 c: T  N. ~/ n. D( u; H0 S  temp = readl(IO_ADDRESS(SRGR_ADDR));
. u9 S! C7 B4 X% b2 P! ^4 g, a  printk("temp=%x\n",temp);0 c  r4 g2 l/ u4 N" ~4 l* B
   //RCR
; K1 _: M8 K( |  u   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) p0 r. U/ y! x0 `5 C9 M
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. w0 Y5 G. o" y5 d) ]6 z
   temp = 0x00440040;
! [4 e$ V; `; h3 Y, D/ D- ^% T   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   9 V  a1 ~: X8 [* t2 s" }, j( w
   temp = readl(IO_ADDRESS(RCR_ADDR));
: o$ X, b" w* `2 B( W5 N/ \   printk("temp=%x\n",temp);
, d9 R/ c- M' T   //XCR5 D2 p) U6 v* \. y# r8 S( Z
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  w& q$ N- w4 F0 @   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 T$ _* b1 X* N0 H; \) v
   temp = 0x00440040;0 c; @7 v; {7 a- y
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & I0 d# p4 D) a; b- n
   temp = readl(IO_ADDRESS(XCR_ADDR));3 h* d( ~  g$ ^; T5 a; s" T3 g9 f9 ?1 B
   printk("temp=%x\n",temp);
+ G" ~: p5 ]; ~" C) ]8 V. G' k( y; i  udelay(100);
# C  o) H, s8 L3 i: o6 j5 n) S' F# f  //SPCR Register2 ~* B$ m- H; h- F, D
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" o$ C3 H4 `% e% l+ Z7 v, v  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. c! f7 p: _! p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
8 A- Q! e: ^2 P5 ]  temp = readl(IO_ADDRESS(SPCR_ADDR));
# ^$ n# I! t0 m  printk("temp=%x\n",temp);
7 j4 c, C* ~' j% G  udelay(100);
! y$ I% n. H5 V) z
! T/ }1 x" R  e' L  b  //set GPIO direction
8 ^4 E2 o& L9 e! `' P7 }   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( b- v; G% V% Z8 i, E
   temp = temp | 0x00000100;//EPR----input
3 O! [: W  P4 V8 K   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: H7 a7 c' B+ P; \9 h# O
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; B% i! z8 T8 t2 x5 B * D) m1 K3 \( W4 m/ j& k
   return 0;
% z! X: P2 e* |  f/ x}/ h; ^5 @3 C' H! v6 Y% J- r% ~
static void __exit MCBSP_exit(void). [8 c+ P! U+ i
{
1 ~$ L/ a$ p- l3 N   printk("mcbsp chrdev exit!\n");
' p4 C/ C5 ~1 k; ^$ W/ }6 R   cdev_del(mcbsp_cdev);
  B+ f% s' ?& n( B   unregister_chrdev_region(mcbsp_dev,count);
2 l7 b9 T) K+ ^   device_destroy(mcbsp_class,mcbsp_dev);
; f. B  B" Z& ]& [# X/ W: p6 x  @4 e   class_destroy(mcbsp_class);1 Z- z) C: z: P$ t9 }6 J
}
8 B/ |" E( g6 U' Cmodule_init(MCBSP_init);
- r: O1 ^* K) N, qmodule_exit(MCBSP_exit);; E) _; T7 f- s/ [4 M0 u5 O

" W4 s* j, Q  g) ?' ?: \MODULE_LICENSE("GPL");+ p" P8 }0 d0 J# d/ e3 b

* {9 N; o/ [" ^$ q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, o# }8 }( G( V3 {! S6 z# A
我的应用层的测试程序如下' x# s0 t/ T* c) C8 J7 a, G8 P
#include <stdio.h>
9 \# T9 B; ~4 Q#include <string.h>$ q/ i3 H1 o# X" q4 F- i6 m- F
#include <fcntl.h>
! C2 I; p5 t! D9 J; [#include <unistd.h>+ ~$ p- y/ {( d+ o5 [6 b
#include <signal.h>
* [5 V5 _- q0 g3 G7 p0 u#include <pthread.h>       //线程! S# [& V* L: o8 K: o6 @
#include <stdlib.h>7 c% P) z; |2 _' _) _
#include <pcap.h>          //捕获网口数据
# x; h, ~2 ?0 `9 O#include <semaphore.h>     //信号+ _0 |! o- k/ Y0 p1 P8 M2 u. t
#include <sys/types.h>     //消息对列
! p4 _1 @" M2 l#include <sys/ipc.h>       //消息队列( I2 z# t0 e- P; A$ ]! x
#include <sys/msg.h>       //消息队列* y4 Q+ T8 m9 ^% W' D
#include <sys/select.h>& F) G2 A6 k) m1 N2 \! [. s* ]  [
#include <sys/syscall.h>3 Q; {0 M* Q& H, I( k
#include <sys/stat.h>* `9 x( F3 b1 a/ a5 W: m8 N
#include <sys/mman.h>
: R. X/ k/ w$ b' x; u6 Z+ ?* q6 o#define msleep(x) usleep(1000*x)3 n: p9 Y+ k; q- o8 l4 `1 W/ p

/ D* W7 a4 \2 O  k) u2 H: h& Yint main()
0 y+ n8 P  }' _5 Q* F% ?{ ' s* E+ k  a, L6 H
    //MCBSP,ARM与AMBE2000交互设备) e  G# S$ p- w
int fd;% C% ]+ c3 }* [& }2 e; u# B! i7 R
unsigned short data_write = 0x5555;
- g- }9 u+ I5 \. g" c" f. V unsigned short data_read = 0x00;5 o7 z: @. f4 }4 n" C0 V
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 b4 \! O9 k8 G$ G. q  H) X //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 `1 t! U0 r) Y! J: e
   
  O. B& a) E1 P, {  if(fd < 0); L3 i& a& l( `
  {6 \# R; a' k, T0 p0 `1 c
     perror("open failed\n");: @2 p7 n" |; @$ q9 p
     return -1;
5 ^1 X# v7 Y8 D2 {  }
- z' g8 q+ ~7 j& h6 h  9 `; t- p6 ^5 L
  while(1)
9 W) p9 o3 f- h5 B  P  {
4 ~4 a1 ?* j9 d* R& m   
3 i8 w! e: J+ i, G: w   //AMBE2000每次读写是24个字为一帧* u' t1 z  u6 F: x* z- t0 `
   //写数据时将数据在底层存储起来,等到中断的时候再发送9 P3 x0 o  F0 G% W8 ]% m
   //AMBE2000输入数据是以0x13EC开头的& O3 e# [$ c" ?( i2 B; a, [5 T, J. ]: q
   write(fd,&data_write,sizeof(unsigned short));* U; D) t: `* y  r
   
& r  v; L7 u' {% w1 b% z; ]" h   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* q0 b: @0 i+ \) a! W: n/ [   read(fd,&data_read,sizeof(unsigned short));
% s. U3 S3 |4 t. b   4 d2 G& d! \8 [% v! _4 v. {  t
   if(data_read == 0x13Ec)) x) E4 K  Q7 P* ~; Q
   {8 p' A, {6 Y  i  u, d  ]9 g1 b9 ]  G6 q
   
: n% x4 C8 Y0 V6 [    printf("data_read = %x\n",data_read);
$ k) u: ~7 M0 Q( v6 _6 R9 ]   }: V2 k6 ~4 }" W: }/ l( G2 B
   
6 R5 o% h4 h! W5 A3 `, \5 I   msleep(10);
# B) v: r5 C: e+ j1 y  
2 M* g& Q0 l$ E1 Z8 w5 O  /*
4 _( n" F. F* P! p, [$ s   ioctl(fd,1);   - X3 \; e1 V" X2 k. O3 D  T
sleep(1);
! S2 Z8 B+ M3 u0 p/ Q1 k" f4 @ ioctl(fd,0);& X+ x( g, S  d. V0 A' `4 L8 c
sleep(1);
/ x& L: O$ C# }% u' V6 T4 }8 F */
6 y+ e" Z! W' R+ t' S) G# \# @  }   5 G- J, h: f! K  f$ v7 l
return 0;7 L* a& x# @; m" e

9 L1 T* K: _- |- Q8 r}
! [1 W' C, }2 [: L8 X. v
8 D! ]9 q0 G( Q多谢各位指教,谢谢! 急+ K( `7 i5 g% G. p$ F& N, A7 j

# B1 f- h" l3 g  L1 ^- [  c9 Q# K  g. Q0 B( r4 L
7 s- l4 y% O, B- F8 G4 F
6 Z2 E. z$ J+ y9 e
; S% k4 T4 b5 t" O9 J, p9 u0 q& C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 09:07 , Processed in 0.042458 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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