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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) }2 G! H' C5 Q+ b/*% a0 g# v3 K+ h
* Copyright (C) 2009 Texas Instruments Inc
3 G" g  N9 H5 T! y* G4 \ *
2 A1 R/ s6 Q1 K * This program is free software; you can redistribute it and/or modify1 A& s) a- H0 ~* ]2 R2 y' c
* it under the terms of the GNU General Public License as published by
" l8 R% x9 c3 A9 j9 A2 {. m * the Free Software Foundation; either version 2 of the License, or8 w( }  r+ d6 n; q6 j
* (at your option)any later version.$ V% h; M) V/ C/ c" O
*
6 W4 H5 X+ h& Y; E* |+ y * This program is distributed in the hope that it will be useful,
& v1 ^/ H2 A9 }, b$ }/ {0 W * but WITHOUT ANY WARRANTY; without even the implied warranty of8 r, v. d7 s. c0 g0 z- X
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& K/ c% p. b! K. B4 ?
* GNU General Public License for more details.5 [- R( g( i# `, i, n
*- W" b7 B! ^7 @& K6 y; P" S& V
* You should have received a copy of the GNU General Public License1 {: q$ n" o- c, h* E+ Q
* along with this program; if not, write to the Free Software
, X% h# M% w: q * Foundati
, J! S8 v/ }4 ?7 d" j9 l*/- K- W" Z" A4 y+ n2 x# E1 R
#include <linux/module.h>
. i) ~8 a" v8 e9 d  s7 k#include <linux/init.h>1 _3 d+ k- A0 I1 z
#include <linux/errno.h>
& X8 l1 h0 b0 s6 S#include <linux/types.h>: L' M  u& B" X
#include <linux/interrupt.h>
; k4 u/ ~, {+ a$ p- a& a6 }#include <linux/io.h>% `8 ^! @& P9 l& M. L' W6 @
#include <linux/sysctl.h>
/ }$ q4 _$ W$ T! W+ y+ `* c#include <linux/mm.h>
) i" j2 }. }# ^#include <linux/delay.h>
* l9 Q( l; _- }0 ?#include<linux/kernel.h>: q0 X9 G2 q+ [* t+ v( i. A; ^
#include<linux/fs.h>2 H+ a/ ~# j5 t
#include<linux/ioctl.h>+ Q' l% z- s! p8 b* e
#include<linux/cdev.h>: _) J8 ~8 {1 i
#include<linux/kdev_t.h>2 e, B% Y: q4 l4 Q) M$ ~; \" V
#include<linux/gpio.h>
) X1 z/ j, N( L8 A9 Y6 G( K! Y#include <mach/hardware.h>
7 W. z% [: V- S* H0 q/ _#include <mach/irqs.h>: k( Q# g5 c+ c, k# ^; K2 w

; `3 |, S! p1 Y% ~#include <asm/mach-types.h>
: c, m8 }1 [- [; H6 ]# D! w! n#include <asm/mach/arch.h>  k! g. t; G$ I( x
#include <mach/da8xx.h>( _; h$ B1 ]- g1 ~/ o5 B! W
#define  SYSCFG_BASE   0x01c14000! o' n2 \' B! v6 W& c( K% q" d
#define  PINMUX1_OFFSET   0x124   |8 Z* `4 p4 c' h; ]& _* J2 ]& w
#define  PINMUX18_OFFSET  0x168 $ p3 \+ \; U' Z8 b% q0 o
#define  PINMUX19_OFFSET  0x16c8 j' K, _3 [. c9 K) ~
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 g: |" D/ {$ \' s0 K  K
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
7 x, [. S  J! _: O2 D#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' h' H" ]  Q% S3 h/ i" g. V2 c6 N* P#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" h. m5 e  y0 m' `% f" y
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR; z9 J. S/ z4 I% f! b. S) E
                           
0 s& r  ~" I$ H5 \; m6 V#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
% q% X$ c9 C3 @* N#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 J4 b; R9 M2 u- W
//PSC% {2 g& U- Y, s& u2 D5 F
#define  PTCMD_ADDR   0x01E27120  / Y2 O* K1 t+ o* z7 V; A
#define  MDCTL15_ADDR 0x01E27A3C" W+ s8 b3 M# z1 c" p9 N, Q7 f
#define  PDCTL1_ADDR  0x01E27304
0 e/ _7 r4 b' T2 F( m//GPIO8 direction
1 p2 q: K% X, P#define GPIO8_DIRECT  0x01E260B0
+ B2 y" }' |% s# n/ O3 l#define GPIO8_OUT     0x01E260B4. X, a1 B: i+ J% n0 _
#define GPIO8_IN     0x01E260C00 O) g# R  C4 h" ?! y4 E$ h+ L
( L+ U1 p% W: b
//#define MCBSP1_RINT    99              5 [& V, N6 ?. q3 j5 q! y, m
//#define MCBSP1_XINT    100  4 a* [4 _( j$ l( @0 ^- ?& a
static int MCBSP_MAJOR=239;9 U2 g% X6 l* g* P
static int MCBSP_MINOR=0;
/ T; f) J  p) f( z: Tstatic int count =1;
6 J1 y& _. n$ ]$ _  l7 |$ Y: _3 x  O  E- Q% s
#define MCBSP_NAME  "MCBSP-device"
/ a5 @+ j) M% k/ v& k
4 e4 K" [/ ]6 |  l. u) ostatic struct cdev *mcbsp_cdev;
8 W' z: V" S# f$ f( y/ |- Nstatic struct class *mcbsp_class;
7 s& ~9 J$ ^* Mstatic dev_t mcbsp_dev;
4 H( M% f1 E; d8 [* U$ Munsigned int DRR_data;
* i* C4 X# B# u( munsigned int DXR_data;
0 j" V/ a) n& @& s2 q: T& Hstatic int mcbsp_open(struct inode *inode,struct file *file)
1 ]' R! ^$ C, P& E0 Y4 j( A! L# L{/ ~1 {- v$ q* U  a, n
   ( D  N7 v0 a; C' F) C/ B' s
   //interrupt enable,initialized
# V% l* V# E. ]9 l3 ^1 q   unsigned int temp;9 K6 T  b0 q) V! X; [
   //SLEEP_EN(GPIO8[10])---0
4 @. a( ]# ^  j   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 U. N$ `" H* u( E$ g
   temp=temp&(~0x00000400);
$ l3 M4 w6 E- u" C) r# R5 f; I   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 P+ P6 w- [& q6 k( a  //RESETn(GPIO8[8])----0----1
1 l3 ]6 S! B' U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! v. T. ~$ {, {5 l# l$ S   temp=temp&(~0x00000100);) R' q" n% j+ o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# E9 Y3 o, m, H- \3 ~   udelay(100);
* Z$ e8 Y& ]+ E* I   temp=temp| 0x00000100;
( s' T$ |; C& O- A1 ?' g: n( k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; y5 A. K2 h! g# f" N: n2 |   udelay(100);
9 V+ g9 n: X' ?7 m' w   printk("open success!\n");
. {& a: v: ], v4 c  b: G$ b7 _   return 0;$ o7 Y" p7 H  ]5 O1 F6 T8 a. ]0 I8 a
}) \5 q' m/ \1 B  p- T% m

% c$ `* Q7 f& \! A5 G' y4 ]static int mcbsp_release(struct inode *inode,struct file *file)' a; ^) ^" x8 j( ^/ ]
{+ G, T7 j" l. [8 u
   printk("release success!\n");
+ ^( s2 Y6 q: g% M- p+ z   return 0;
9 M; W4 J- e- r5 J8 n}/ R1 J! {/ C; v  }" a

. Y4 _8 s& i2 f) v4 `static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% \! `3 o1 m# B7 J% i9 F* [1 B{' ?9 x7 C# O: y# L$ g9 t
    copy_from_user(&DXR_data,buf,len);
) i( h. _: f( P, ^2 T9 e    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       , g7 [: B! f  Q, S7 e
    return 0;
" L; T- b5 C4 W# Y* @. b1 \. e1 ~ - s( O; Q( L, x: n4 U
}
: X  w; V0 N# J* k6 c" u1 g1 I- i4 T, z0 r
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)3 k9 |; O! J2 ^) j9 {, M3 }% n+ F
{
( C+ X$ y( h( z* ]$ l, Q" M% T( G& D   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));7 o( V9 G( Z# p6 _6 N; a" |% `1 H# }+ v
   copy_to_user(buf,&DRR_data,len);
% U* f; k4 q6 g+ E( ?   return 0;0 e. W" C2 W+ a, B& \2 Z- u( |
}( M4 X3 E8 g" p* H4 e  l3 r1 w$ @

& @4 h9 h; O9 \  Y3 J4 Z' E( u; z( `& b5 I' R
static struct  file_operations mcbsp_fops=) e- ^0 _/ u- A/ C7 H4 ^( e
{( R( o) V$ e- L: n& `$ c6 A
   .owner=THIS_MODULE,1 D( F& [6 t: Z
   .open=mcbsp_open,
& K3 N! b# d5 I8 ?& m   .release=mcbsp_release,
/ r- H7 _7 d7 [5 ~7 u' A! x# P   .write=mcbsp_write,
$ o& Z; m2 C% ~" E. h& B' A   .read=mcbsp_read,
0 \" l3 G2 @, V* `$ _};! k- P9 F- s3 r
static int __init MCBSP_init(void)
* B2 y4 W% f6 M; t9 a{
9 [3 ~, _6 s) ^5 x" J' Z+ t   int ret;7 ]8 M9 C* m0 y" v3 e2 f2 I. s
   unsigned  int   PINMUX1_REG_old;& Q6 G) [; X7 O" ]1 O; D$ L
   unsigned  int   PINMUX18_REG_old;
6 \- O6 M, h/ c3 l% K   unsigned  int   PINMUX19_REG_old;0 y' I* t4 o6 a' O$ P1 |6 ^
   unsigned  int   temp;  ( V) y3 M7 J- F* p+ i: N/ x% ^& S
   if(MCBSP_MAJOR)
& o6 Z4 G+ q0 v3 o1 _) v8 H5 t   {- Q' y2 X* X9 N  d9 H( _
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% e3 P% d# T7 B& ?4 I1 s# E
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' C0 }( M! }7 @1 o
   }
* o3 `* S! b% I7 j1 ?) M# @2 y) y   else
" R8 d+ ]& N, J' r5 W   {; h1 g2 Q! M* y
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);0 b  ]3 m- U* ]7 r4 I
      MCBSP_MAJOR=MAJOR(mcbsp_dev);% R9 K3 n" `7 w
   }; Y' ?6 l0 E- j
   6 P6 ?4 ]% \& s' ~
   if(ret<0)
1 M, G) Q$ t2 R  a# W; c   {
0 O9 m& @2 n/ C$ q      printk(KERN_ERR "register chrdev fail!");
( t+ \2 X+ a4 D1 w- c      return -1;
) a" k( K% h& u; F   }' G: X  {- J0 C6 q6 z0 N8 y
   
$ [1 d6 y7 N/ A5 d  o2 t   mcbsp_cdev=cdev_alloc();
+ J* `9 Z3 x# I$ l6 L   
1 w) ]1 j) ^" D1 l   if(mcbsp_cdev!=NULL)
% H* N0 [+ f0 N; M   {8 C* ^0 g6 T0 U) n; s
      cdev_init(mcbsp_cdev,&mcbsp_fops);9 m( v4 U3 J4 _$ {9 P: z1 s* `
      mcbsp_cdev->ops=&mcbsp_fops;
5 m9 C3 o: M1 N8 N! _      mcbsp_cdev->owner=THIS_MODULE;5 u7 s5 U7 j* _, L( y
      
$ b9 C4 r& Q* A# H      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# Q4 g7 _; o/ a8 i5 U0 |
          printk(KERN_ERR "register cdev fail!");, q: X9 E- ]. P' b
      else
: D$ ]. {, a% o2 k5 g; d2 y          printk(KERN_ERR "register success!\n");) I  t4 m9 Z% E7 U5 X
   }/ O& X. v6 p) k, I$ V
   else5 ?. u# W3 m  Y! z
   {. \  I& W+ d4 k
      printk(KERN_ERR "register cdev err!");7 c. t* @, y2 l, z, m
      return -1;0 _6 h$ t3 h1 i3 G
   }: L5 T$ ]; \: M: \+ u* N8 a, w( \
   * c! }2 v" ?( \6 i* e6 y/ E
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( A8 l0 c3 T$ z& M5 ?   if(IS_ERR(mcbsp_class))+ E% Y/ k' N2 t) J* q
   {5 y* W: D/ ]$ d9 L- {5 X* v
      printk(KERN_ERR "register class err!");
# G; Y& F$ i* o7 |( W( |   return -1;! ]6 S8 P7 G) [0 l, e, H
   }7 F7 W/ J5 J" z; U- |
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
8 l+ N& S" l$ A
: D; V8 e7 s, b  K" P   //PSC
+ y! b) ^2 N. v, ^' h   //add Enable MCBSP+ ~% {! j0 N" ]7 _: |
   //test
: N4 ?7 ]5 O) J1 f% f! }   temp = 0x80000003;( L' u4 ~( p( S. b) q/ @  g
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));* ^9 Q* o& s; a, A, K5 K
   temp = 0x00000003;
; v; _* V( ]' M4 n   writel(temp, IO_ADDRESS(PTCMD_ADDR));; x- h2 o: I, ?

9 u  i1 ?8 a) G) ?& v  s# M   temp = 0x001FF201;; x) n7 z) o: k  p/ e, B) \- C$ x
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 M8 Y3 Q% f% V   1 M8 a8 H$ }( T# M7 B# y, x( G1 f
   //PINMUX  
: U$ o! C6 u4 x8 n4 M   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" O" L% u, B; n0 O3 M3 s4 O5 K   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ' f# a4 a& d# n1 c# V0 j) @
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 E, {7 F# Y) {9 c- E   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);, x, ?# M+ Z) a! x: M8 H- v
   0 l9 ?, Q( U; j! X  s( m) F
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, X2 J1 r; D7 j9 q0 {& B   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  0 ]; s% x  S1 k' ]2 @
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & q+ J4 f% W. P9 a5 m
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 {3 V; K4 i( U# m: ]
2 a4 p  _/ P! P( n: v2 [9 P+ s( d9 F+ q   //RESETn,L138_SHK2: f+ w8 R' k, d! B$ @- Z6 |% M
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; `6 G% I8 h: ^+ q+ y  M  s, U3 a
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& ~( U. }" z$ I   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 w" A) K" A- _2 u

1 Y( U' O7 B6 f5 o; N3 }% q 7 `8 n9 ~% [9 Z9 q/ r
  //SPCR Register8 A$ f1 e- ^0 m! _  n8 c6 |
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' S  r) W. e; @2 `+ V+ Y  temp = 0x03000000;//(DLB=0). H" U2 t) ]% [8 j$ I) B
// temp = 0x03008000;//(DLB=1). J. Q. Z# W3 |
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
! e1 \# j3 W+ p  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ }8 A- |$ `2 o. G& c0 T' Q; G1 G  printk("temp=%x\n",temp);! N* m5 q  o" j' v' N* l  e! B4 f

, p& m# f0 e, k- {! ^  Q; `   //PCR Register/ A7 t& l% l# {3 ~" g
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: Y9 M" a5 [2 j+ z" i
  // temp = 0x00000F0F;
. v2 O# k2 E0 e  K% a1 a  temp = 0x00000B0F;
# C7 m0 I3 l3 J9 _% x' [0 I' E2 g  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
( e. R4 g6 i) h% u) r& F  temp = readl(IO_ADDRESS(PCR_ADDR));- \. @9 ]# ]( f! L" Z, K# Q
  printk("temp=%x\n",temp);  
" k) @- k3 }" ~7 |( V$ k   //SRGR Register" _6 }" |$ V5 ~4 d
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 w. N* b8 w6 ?, ]6 J# Y. T
//temp = 0x301F000B;
6 T0 c7 x8 b# j; G   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 b+ b1 _% R. O2 b# @" C; m. r  temp = readl(IO_ADDRESS(SRGR_ADDR));
  M  s9 A/ p5 x' @  printk("temp=%x\n",temp);* \9 Z* U5 K8 ^" J: f
   //RCR
: B# P' S7 N% j. _( s. j2 F* R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% T6 O  G& O! H7 Q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 l/ V( P8 a6 e5 M, Q
   temp = 0x00440040;5 R9 i6 ~1 n/ E1 C
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, m7 Y+ ]2 v2 W# ?1 D   temp = readl(IO_ADDRESS(RCR_ADDR));7 T$ [# h( a3 x! w: ^
   printk("temp=%x\n",temp);* o8 A7 J, R, g& l/ f
   //XCR: a2 y. Q2 v5 e( g# M, J" \
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! S; B, ?7 u$ F* n/ o
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ f5 e7 [7 a- R* ^2 n3 b+ c   temp = 0x00440040;
" {2 Y# e2 G1 V9 c* Y" Z6 Z   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
+ b; k; s# [! p+ N1 n   temp = readl(IO_ADDRESS(XCR_ADDR));
9 C$ p5 j  Q) `; A7 ^) X4 e   printk("temp=%x\n",temp);
- f7 \2 r  U, l6 C+ @2 ?7 ]  udelay(100);9 n* ^# o. u5 _+ m1 j4 P4 W$ g
  //SPCR Register5 ~( L; ?. p7 ?7 F+ H" p# K; R" h
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 ~  [( E% B* \; _$ y
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1! Z( f/ Y# W! X3 _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled9 G! _. ]; c$ y8 p, O' N: F
  temp = readl(IO_ADDRESS(SPCR_ADDR));
. \+ m2 C" c: U) W  printk("temp=%x\n",temp);
+ M, J( R2 M  o! n  udelay(100);4 I0 x' }. _& G* n- \( W

4 I' O! \. p6 C6 ^5 R! ?  //set GPIO direction  r  F) |  t# l1 J
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 v0 }# _1 T" F# N0 U/ O$ O: ], Z
   temp = temp | 0x00000100;//EPR----input# R9 V( a1 Y) m" h, Y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
0 A! k* L! i) g4 W0 g) v* [   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 N- K/ D6 w- w0 J9 j
5 }7 |8 k( H2 x( _  c1 s4 q. ^   return 0;& s2 Y# z+ [( x6 ~0 E. A1 ]
}; p, ?2 w2 H4 w9 K' T4 I
static void __exit MCBSP_exit(void)& e5 M1 s9 ~# x! j: ~. H- Y
{
# B/ C+ B1 ^% P' ~( J   printk("mcbsp chrdev exit!\n");) p+ c2 U( |. x0 W4 B
   cdev_del(mcbsp_cdev);
% h$ x  X: M& ~$ e; k6 y   unregister_chrdev_region(mcbsp_dev,count);
7 ^+ _; H' E5 [   device_destroy(mcbsp_class,mcbsp_dev);
4 g4 y7 N. P& J. c2 p; q3 z   class_destroy(mcbsp_class);
; o5 f! q# C% S% e( {: W; V: U3 z1 z}3 C2 i+ x/ P' _
module_init(MCBSP_init);* T. [" ?* F, x7 |
module_exit(MCBSP_exit);
* Q/ z, A4 w  Z, v& t* v/ C. c# @6 J5 X* w& E1 m
MODULE_LICENSE("GPL");
7 e/ Q% y% y6 L& `. q1 d% i4 n' P* y; H! e
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 I8 w* @; b8 A5 H  i" Q我的应用层的测试程序如下/ f- I! \2 e" y$ l1 M; I/ n5 U* V
#include <stdio.h>/ c1 C) @! l- n7 U
#include <string.h>9 G  u/ {" Q( q. m8 Q
#include <fcntl.h>5 E0 k7 ~. B+ {: Y' g
#include <unistd.h>9 {9 S* n: `% l# x. @7 s) S- O
#include <signal.h>" Z# C' P* m% G* A. n
#include <pthread.h>       //线程
& W) g: q9 C  |; V) e& e#include <stdlib.h>0 D# u% n. |. B8 V; v$ j
#include <pcap.h>          //捕获网口数据
, c1 [( f8 ^6 k3 v$ Y#include <semaphore.h>     //信号
$ R1 c1 F/ B  I5 `& W8 w6 A) @2 ?#include <sys/types.h>     //消息对列
7 U( Z+ e' C& G' B$ L#include <sys/ipc.h>       //消息队列
- y/ W  [% h& e' W#include <sys/msg.h>       //消息队列+ S% O7 @" h+ E0 e5 c- ~$ s5 y! a
#include <sys/select.h>8 S: ~/ Q4 w6 d# C1 Q
#include <sys/syscall.h>0 `- K1 s) `; Z0 T) ^0 u1 `
#include <sys/stat.h>& U7 M# ], F+ r) {3 h
#include <sys/mman.h>
+ a0 W& X9 l) k) ~% P2 X* P) k#define msleep(x) usleep(1000*x)+ R  f* W+ v, z3 X# l: C
: o4 H; y/ ~+ K& d
int main(): v8 i% P# e7 e9 i3 N
{ ) f; g$ f  e* [
    //MCBSP,ARM与AMBE2000交互设备
6 K0 \9 `4 u- @  H& n% R! B0 ~) u int fd;
; D( R, Y& z- h6 o unsigned short data_write = 0x5555;5 m6 h" ^! R8 H8 ]* y. {( q
unsigned short data_read = 0x00;$ ]! ]9 s5 g3 Y+ b! Q
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; r( i! F; A6 q$ r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, v2 b) c& W1 H. T% |6 z5 G3 x   
" ]+ I$ w! L8 q$ K- {! {$ B  if(fd < 0)
8 t9 G( h5 X$ G7 r  {
5 p/ j+ i  ]( E) o     perror("open failed\n");
. o( U, I2 E8 o     return -1;
9 ^) F8 Q3 f! {+ c3 G  }. C: \' Q, y# D7 E" l7 O
  ! K. N( @4 r/ k) p  r
  while(1)8 e/ z) ~4 w) L- n8 L5 W
  {
) f% Z% C' d% k0 @8 {) g5 x5 ?   3 ^$ t. i' \4 G8 }4 M2 b
   //AMBE2000每次读写是24个字为一帧( _3 ~! d7 l( A9 k( `
   //写数据时将数据在底层存储起来,等到中断的时候再发送5 O2 h' F6 _. c4 s
   //AMBE2000输入数据是以0x13EC开头的
8 [! i, J# Q) B3 b   write(fd,&data_write,sizeof(unsigned short));
" d' z/ B( L# C; `1 A   3 o/ S- F. _. W& g4 o4 Z, c. K0 L
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
& V* v* q8 |" d7 e" D   read(fd,&data_read,sizeof(unsigned short));0 {  g# n! E, v4 @; d7 [
   
  E, f% Z% h+ M* Y: Y2 O! W8 }   if(data_read == 0x13Ec)7 c2 T3 m! \$ a
   {
7 H! r3 Y8 x5 W$ @7 H5 B$ ?   
9 L, Q1 H1 O2 {4 P    printf("data_read = %x\n",data_read);7 a; R  S; Q" j3 }: y
   }& w! v0 {" S0 j- q/ t3 u+ J
   9 [( m5 g. b2 m' c: w  B: Z$ e
   msleep(10);0 E3 t5 E  E" b! V. S, |: W
  6 h* ^1 a+ k7 I/ m; g6 k
  /*5 B" M' g" u( A# L5 ]
   ioctl(fd,1);   / c* ^8 q! }# Z4 P6 Y
sleep(1);
$ K9 T/ k( v" o ioctl(fd,0);
4 l1 b- i3 g5 n sleep(1);" V7 F0 R7 E2 T- g+ M" n
*/ ) S4 x4 \  R' u' K
  }   . z# K9 i  q4 ?, L
return 0;3 N: {. X% t) {4 w5 z

8 D8 @  D- K. j9 V2 }* c. F}3 V* i& X/ V: a. I

2 q1 u  H# f+ f7 N多谢各位指教,谢谢! 急
( Z& ?, \" K( r( }8 ~
( V, Y9 \6 @( d. m9 t# Q9 J: H- `2 u7 ^
6 X' K1 F+ `7 d' ^& M6 r0 [
  d2 g9 Q( Q' P: J1 B, F+ _

4 z- G; p; V) \$ @. g  @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 01:09 , Processed in 0.050127 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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