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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 7 i& `/ v' Q1 Y# @( G9 j
/*
1 n8 E9 B( L8 h  L  i * Copyright (C) 2009 Texas Instruments Inc( m; a0 d# B0 c8 j/ `( N! p, Q6 v
*
8 l3 G9 T' n3 x4 w * This program is free software; you can redistribute it and/or modify1 `8 e+ T$ }# I& G- J4 q
* it under the terms of the GNU General Public License as published by
" {% B+ v8 n7 g * the Free Software Foundation; either version 2 of the License, or  a( x5 ?; u4 q6 g+ {
* (at your option)any later version.
5 e' |" }2 `1 L5 n, Z *9 p7 k0 n0 S0 W0 `. O- f
* This program is distributed in the hope that it will be useful,
, Y' w. z5 {* E4 P * but WITHOUT ANY WARRANTY; without even the implied warranty of1 }1 X; @& K- q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 s; ]. B" Z& S* t * GNU General Public License for more details.7 w2 s! B: Y2 ]( ]! {( T
*
1 e( g( }8 v- t3 t6 g$ E3 | * You should have received a copy of the GNU General Public License  ^$ k3 K. E% Y1 T3 g
* along with this program; if not, write to the Free Software
5 H# S3 h+ n8 x: k3 _ * Foundati
5 R& J# D4 C  b*/
) }* W  E% ]# C6 g& [#include <linux/module.h>
: q5 l0 D( `. i3 ^#include <linux/init.h># A1 [2 x8 z5 n: V6 ]
#include <linux/errno.h>
9 e) X/ ^) T1 D$ h#include <linux/types.h>3 Z0 ~7 Y! `6 M) z( l
#include <linux/interrupt.h>
3 u& r, @7 N; b* [& t6 z, n' O#include <linux/io.h>
  q% D0 ^) d; G3 M: c9 P4 `8 k/ ^  j6 N#include <linux/sysctl.h>
/ @. ]2 U$ S" e8 t/ _8 {2 p#include <linux/mm.h>" R3 ~% P- w9 }
#include <linux/delay.h>
. s: b' ^/ a9 l#include<linux/kernel.h>
5 h8 M8 {+ t& j! a* B8 k#include<linux/fs.h>
4 r+ H4 s; o8 T  ^' c#include<linux/ioctl.h>
5 g+ D" W( v# u# M+ S#include<linux/cdev.h>
- h4 e( ]- D/ [& f* [#include<linux/kdev_t.h>
6 z5 [; i  d& Q/ `#include<linux/gpio.h>) L* k( F7 p" m
#include <mach/hardware.h>
9 ]7 ?% U9 z4 Q#include <mach/irqs.h>3 \7 t& j/ \; V- w$ ?

) j4 Z6 U, P" y  {$ w5 \#include <asm/mach-types.h>
: K2 j+ J1 Z1 T$ f$ g/ K#include <asm/mach/arch.h>+ _- V$ G- H0 P% C8 m  F
#include <mach/da8xx.h>0 t0 S8 f, e  h
#define  SYSCFG_BASE   0x01c14000
5 a! w  g) B# j  J7 G$ r#define  PINMUX1_OFFSET   0x124 , J. M9 O6 c5 K( o7 ^
#define  PINMUX18_OFFSET  0x168 : I5 S/ E( k: k0 U
#define  PINMUX19_OFFSET  0x16c9 D( b  p7 Z) f( a% @/ Y6 h2 R
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
- E! j' |6 n5 m8 n) f7 {#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- _& ]1 j6 s7 ?
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR- H, z* T" J2 @2 A7 i
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR2 G5 C: [: s4 J" j2 h# y
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR8 D3 R0 p& B! g. ?1 d' t
                            9 t7 N' i0 {" Q+ P! r
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
" |, q5 ~0 ?1 H9 t$ i7 R/ l# H0 p- _#define DRR_ADDR      0x01D11000  //MCBSP1_DRR1 c4 C$ O; q" p+ R, v4 g2 b2 }' V, o
//PSC( i7 K& D$ r" e# ?) C& a
#define  PTCMD_ADDR   0x01E27120  ( \. D$ s  Z- J
#define  MDCTL15_ADDR 0x01E27A3C' ]) x' P# D7 Y: x/ u  B1 ]
#define  PDCTL1_ADDR  0x01E27304* c: X) g: u: k0 l. q& Q
//GPIO8 direction& J  l9 [- P+ [2 u, z, v# _
#define GPIO8_DIRECT  0x01E260B04 I: U& r9 W' H
#define GPIO8_OUT     0x01E260B4! I+ t* p) L6 a' b; d9 t
#define GPIO8_IN     0x01E260C05 g6 f3 y& l6 g  q

5 U4 y: e: I7 b* [0 f% Z//#define MCBSP1_RINT    99              % _" G( d# R* A) _6 a, c
//#define MCBSP1_XINT    100  8 V2 Z1 G# ~/ G6 I
static int MCBSP_MAJOR=239;
- A  N- {. V4 b: y) xstatic int MCBSP_MINOR=0;) @" d0 L: \1 z2 C0 h
static int count =1;4 o0 E: @% ~! i' _( B9 @# e0 Q. U
: y! ~. N' h! f* |% j! c1 d7 f+ \
#define MCBSP_NAME  "MCBSP-device"! w/ ?# ^# J6 S  S. G5 F/ n# S" @
4 a$ X- Y5 e; p! |5 U7 p
static struct cdev *mcbsp_cdev;
, K7 z2 u5 p0 n& c. dstatic struct class *mcbsp_class;/ ^. M2 ]# g# X! U( Q4 S
static dev_t mcbsp_dev;
( e5 i4 n1 C9 X9 bunsigned int DRR_data;3 W+ ~# c; m$ }/ l& }: T
unsigned int DXR_data;) f" I( `  m$ u
static int mcbsp_open(struct inode *inode,struct file *file)
5 s8 }4 e1 l) L# b% J% u+ T6 N{
" d! H+ V" n1 C   
( z  @6 f  a7 }: f   //interrupt enable,initialized
4 y2 q$ N  `7 C5 T6 i# d- f' e6 O5 m   unsigned int temp;/ m" |' `2 b- L# D
   //SLEEP_EN(GPIO8[10])---0+ i- ], D( @9 k9 f: _4 |5 _
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 G! |' q; Z1 O6 p+ o5 A/ f
   temp=temp&(~0x00000400);
1 i% N% f7 R- t: x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 y0 d7 b9 }0 a. G  //RESETn(GPIO8[8])----0----12 \0 a2 A2 w  {
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- b' u1 j) I" Z: s# v& d; r   temp=temp&(~0x00000100);
8 K7 R' p) t4 M   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0% X) A0 w# i% e8 E
   udelay(100);7 ~5 c+ t  _: a& }8 j
   temp=temp| 0x00000100;; a3 H$ P2 B! ^% N6 ?7 {; ~; V
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 H+ f2 Z% m' b6 o$ v+ M, R   udelay(100);) P( h8 V3 _5 i, s
   printk("open success!\n");4 r& X4 o8 b3 u7 r8 P
   return 0;5 A- B. E9 \5 V  f$ j
}
8 K1 u# P+ m- m5 a* X, ~  H0 A0 [1 b5 I6 l
static int mcbsp_release(struct inode *inode,struct file *file)
( G0 M0 n* A4 v4 o{6 D' k! n5 c" {) x
   printk("release success!\n");
5 c# z- m! m0 h9 ]: C6 w9 H3 o   return 0;  |' J5 h4 P/ P. F3 t
}- D5 N+ ?3 t- N  R# Y

7 Y/ H6 o  `1 w5 A5 gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' M/ S8 u$ M: G& M/ B6 I: t
{
: @4 j: w$ e; a$ x2 h. A8 i  {    copy_from_user(&DXR_data,buf,len);" Z8 i4 q1 H/ c8 p3 B
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
$ S/ Y( G/ j# [* N# O" q    return 0;! u: Q) `" h% Q
! @' o6 z, d' v0 H
}) O4 ]* i: t, U! {, ~% W

$ G7 j, T6 `, s5 `3 x0 C: K) ~1 istatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)% j+ B$ x1 P5 o  i- j# V  S- Y
{
  ^* p4 w# X/ P9 z. J' ]   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
( V8 Q- n/ o( @& |( M   copy_to_user(buf,&DRR_data,len);
6 ]0 i/ K- X# H$ S9 x5 u# t   return 0;$ ~: @. R! R3 P( W' Z/ {5 J
}" U. T+ b/ x9 [, y: h

3 P1 ~0 Q* }$ B. }" t0 W' m& [3 m$ N: h. b9 c7 \9 g0 {" B
static struct  file_operations mcbsp_fops=, g  l% g3 u0 ^( h* B2 l5 c2 r, X
{
9 n! ~( e+ g* B0 h+ ^   .owner=THIS_MODULE,
+ E. v/ I4 U- I6 w( S8 Y+ J  Y2 x   .open=mcbsp_open,
* W' ~6 @7 \: @8 \, c+ H. E' u! v   .release=mcbsp_release,
' u4 G: t8 V+ V$ q4 A' B   .write=mcbsp_write,
' g, U4 k2 I$ Q   .read=mcbsp_read,1 D) e8 e$ K5 k4 e" Q$ _
};
( ~4 c  {# ^* h  b+ D2 z  M) tstatic int __init MCBSP_init(void)' ?) A; q7 [1 {# z. \  f
{# W% @) z9 v7 }5 Y$ A
   int ret;# c" ?7 m* ]0 l' z' G! g# S
   unsigned  int   PINMUX1_REG_old;, I+ H8 |7 O, V6 A
   unsigned  int   PINMUX18_REG_old;
( s& s, R% @( ]3 _8 E) E' R, Z   unsigned  int   PINMUX19_REG_old;4 Y2 l' U' O$ K; m/ U% K3 A9 j
   unsigned  int   temp;  
; J1 l: Y+ m6 f& c+ i$ N7 a0 f1 L) k   if(MCBSP_MAJOR)# H; ~3 Q0 [7 j/ ]
   {6 c9 [2 H; s% T1 \( G9 _! a& o
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 G" s  p2 ^: z- Z3 ]      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* j- V, F" f9 k7 _) `  r2 C4 V8 s  k   }
: X# k0 X: ]! D   else' A3 r: L) g( n% t+ [
   {
" I! C2 m5 t  b% o2 M      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 B9 b% T. f2 j2 P" v5 T, O      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; Z3 u8 m1 s$ ]- Y2 b3 o$ }   }5 P& V! ]2 z! P
   
- n8 j3 M% e8 \: I( [8 ^/ V   if(ret<0)
$ A8 s  }& K% @, C2 ~. w   {$ s' I3 R2 L/ w5 l
      printk(KERN_ERR "register chrdev fail!");
. D5 g' j% q( F- Z0 v' d1 ^      return -1;9 T3 L; Y4 Y% A; h& ], R) b
   }
( f' j  y$ p! H# S. g/ \3 T5 {   " ^  ~# ]/ q% h6 o$ L  b
   mcbsp_cdev=cdev_alloc();
. {/ z) L) P) i1 k3 G   % Y- [0 s% e* p
   if(mcbsp_cdev!=NULL)3 m7 @. i/ i- n! w/ e. X$ z
   {4 [9 T0 F* C, w# F- C) \/ ^
      cdev_init(mcbsp_cdev,&mcbsp_fops);
" K' K/ K0 W" Y: ]5 G      mcbsp_cdev->ops=&mcbsp_fops;
6 V8 d- ^  M! |6 k1 K" f  K7 M. `- ?      mcbsp_cdev->owner=THIS_MODULE;6 Q4 U9 Z9 `3 d7 R
      1 j% K: L! {: ?' z. |7 L" g
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ M; w. {9 s" |
          printk(KERN_ERR "register cdev fail!");
9 O- M& y# X# L2 T! I) T2 N      else
: K8 U  A9 j/ g0 A          printk(KERN_ERR "register success!\n");6 b& I7 f1 v& p1 P% u
   }
& b1 G( C) r. B9 Y   else$ Z3 N$ l4 U. k( z: f- V
   {
5 ~& \9 ?/ m' C: e3 |: S0 d, U      printk(KERN_ERR "register cdev err!");; B' j2 W2 r* M
      return -1;+ m3 ?9 a0 F  Q% f  j, }' S  ?
   }+ b4 a- R; g' b; ^
   
* R7 I2 S& W$ d8 m. g  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; @' z1 X: q* }; ?
   if(IS_ERR(mcbsp_class))
. V2 q- C& W: x2 F% Y   {3 R+ H# k% X, N) ]8 c3 X
      printk(KERN_ERR "register class err!");
4 l8 \9 H% p" ~1 o   return -1;
3 ~7 H: i: L, |) a% |* G" P8 r/ \& C   }
; b1 B! e3 S) T" E; b' ?   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: _+ a$ {0 `% T6 ^
6 a& X0 f8 g9 g& Z9 `# K2 O   //PSC, J! q3 p9 e  v+ v
   //add Enable MCBSP3 B* e& R, i8 R4 y$ c  X7 M
   //test. h4 R6 m3 u1 E1 Q8 g& j. L4 U
   temp = 0x80000003;( B4 u( d1 j- k% T/ W7 K
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
8 o: T! G) E. F   temp = 0x00000003;
, K# t3 v3 X3 i- d; K   writel(temp, IO_ADDRESS(PTCMD_ADDR));% {# B% b% Y9 z$ u

8 s8 O# K2 o4 i   temp = 0x001FF201;
. d6 e# C" Q9 X2 C   writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 o- p( H/ A9 L* `. ?$ s
   
) }6 X+ M& ?$ l. W% b   //PINMUX  $ B- s: i& v: y6 r
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& B3 H' y2 }; y+ A2 f0 q, [' |
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  - k. s3 H' r: G5 }, a  F2 V, G
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
- w- {2 I' t/ u$ l% @   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: L. L; X* J& \0 ~; H0 x   
3 q4 C7 o7 B( q/ x( u+ y   //SLEEP_EN,EPR,L138_SHK1,L138_RC
8 t7 [# u! n9 S6 s# P3 E" G5 i" h   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
& Z6 h3 ^8 u, V& E2 O/ e   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
+ W% @9 h  O6 I* n   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 q1 q9 r! q. [+ ~
+ a& V. T$ c; K' g' x: b, z6 N- ^( P   //RESETn,L138_SHK25 Z$ F( ^5 b- ^5 U
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
1 V9 E5 m; a. a   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ) \% r  \( C$ c* Q8 m/ m' r
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 ?7 e$ `& O0 Q0 Z+ W5 Z

0 M+ ?( @1 L$ B5 k, R& ?6 |. e
+ B8 M3 H" t# R+ `1 ]0 F7 t5 U8 E  //SPCR Register: x, X7 Z" z- F3 ~- a( J
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: q: C- W, {: i' r, R5 K  a  temp = 0x03000000;//(DLB=0); H. `8 z: U3 q+ y: T& [3 |
// temp = 0x03008000;//(DLB=1)
* o3 d5 _  u  b3 J! ]+ k( D) V  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, f% W9 x4 x6 w) ?; r9 h5 }3 ^  temp = readl(IO_ADDRESS(SPCR_ADDR));5 {4 G3 [8 L. Z# t  Q) r9 V3 g
  printk("temp=%x\n",temp);7 S+ \: L& z0 B+ U4 `- _

1 `: A) d. Y$ L0 W   //PCR Register0 E! I! F6 s! i( |! ?) i
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: W4 w' T+ @* n, i- G* ^" K: M# J
  // temp = 0x00000F0F;- B6 g7 B9 T, `7 f( Q  A+ p
  temp = 0x00000B0F;
+ d1 \9 f. f) f; H7 n  ~  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 B+ k. C: Z6 h) d  temp = readl(IO_ADDRESS(PCR_ADDR));) S; W0 m& L/ ?
  printk("temp=%x\n",temp);  
1 I$ v+ i3 Z7 F2 R% [, Y   //SRGR Register
" {; G4 @! M% V5 x) G/ k   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 k, s9 c0 m4 C- m  {
//temp = 0x301F000B;  Q3 P% T( G5 V6 i5 W9 l; F
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized : `7 ~( @& n+ l7 V. s1 i5 R
  temp = readl(IO_ADDRESS(SRGR_ADDR));
& G% i# z7 g9 D% k% B2 j9 `" a  printk("temp=%x\n",temp);* F3 l* u- [. B) E! L" ]$ V
   //RCR. A! q+ ?; M7 Z  p0 n' f3 g
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ m) \1 h3 D* G( [
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0  u1 N4 Q9 F* a* s
   temp = 0x00440040;# z) s& t+ B. `$ D+ j) s7 s
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   4 H1 m) K8 Z) @( j: |
   temp = readl(IO_ADDRESS(RCR_ADDR));) M1 ]$ B: _' q& [  S# R. {
   printk("temp=%x\n",temp);
+ G  |& H( \9 {  E' |$ T0 g2 x' Z   //XCR& O6 N+ V! r0 J0 J$ f
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# N% `# C% v4 v# R
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
, }* D- s1 z8 O; I; T# L   temp = 0x00440040;
* C$ c) ?5 e) `2 [   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
, ?- J% z  @1 ~1 r4 y( E   temp = readl(IO_ADDRESS(XCR_ADDR));
1 X) d6 q, E9 y4 Y   printk("temp=%x\n",temp);
$ F8 J8 }9 D% X  P) x  udelay(100);5 s) ]/ r& R4 p/ S1 ]& w
  //SPCR Register
" r* K+ l- t5 _* m# B, e% ]  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ R$ Q' Z) m. Z4 s; e) V; f
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. G3 S% {6 b. x' d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled( w* K4 Y& v5 j, ?
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) x8 _$ ~8 v! J/ c, j  printk("temp=%x\n",temp);9 |) G/ i2 B# C& D7 L
  udelay(100);
; t& g* ?" L: S& w" t8 ]  `  h  d4 _+ [: C. j/ p$ g: }
  //set GPIO direction
0 R+ k8 |9 W5 p) r2 S' k) C/ R   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ U& H; \+ {" y* o( c- [   temp = temp | 0x00000100;//EPR----input
3 c. x" R, S+ U7 w6 K4 |   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 r% n) i7 x" R) t, c0 s) N   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# J/ O2 W* V7 o1 G/ E* u
( C) u+ D# `' w! ^' `   return 0;
1 ~" ^0 t- r5 B}
% p) j4 H# I: @6 j; f' q) vstatic void __exit MCBSP_exit(void)
5 S" E! m- Y/ t9 v{
3 A& A3 m2 k. t& P! W6 O   printk("mcbsp chrdev exit!\n");: h  b: ~4 N% m  a+ M
   cdev_del(mcbsp_cdev);+ Y; n2 X2 x  P3 d
   unregister_chrdev_region(mcbsp_dev,count);
% B( ]1 s+ X* A! N9 P5 N1 H! a, ^   device_destroy(mcbsp_class,mcbsp_dev);8 m6 n& ~3 k& j# i1 B' S1 W8 |) Y
   class_destroy(mcbsp_class);
5 O) `& {5 i/ q2 U  v}2 e/ A. e! e7 |7 O0 j, c$ P( s1 `
module_init(MCBSP_init);' \* H. X0 |0 x
module_exit(MCBSP_exit);( [5 {6 Q5 B9 R' b0 a) x

* {$ G3 z" K1 J6 JMODULE_LICENSE("GPL");" c8 L- N& s8 u6 r

7 q' N- c$ U7 S5 a4 `* Y4 i/ O3 ^我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' O' r! x( l' g! z9 q我的应用层的测试程序如下
& P% y3 g' M+ c+ G- j5 d; u#include <stdio.h>* _: Y: n% C( D9 }! B
#include <string.h>8 v' h" a! }5 j! T' y$ o
#include <fcntl.h>- \, G3 _6 {2 Q: V4 I2 V& E
#include <unistd.h>
! S: M7 u* n: |; ~! @% F6 @#include <signal.h>
4 j# y8 s" V9 r7 e: k% J& W#include <pthread.h>       //线程
- y' V% u+ L, {0 h#include <stdlib.h>
1 d/ ]) |" v! `1 v) }#include <pcap.h>          //捕获网口数据
9 P5 t$ u5 g. n% C' K  U0 t#include <semaphore.h>     //信号$ [  e6 Q" ?) ~/ U) c1 P5 F) r
#include <sys/types.h>     //消息对列& h+ A" P+ f" E
#include <sys/ipc.h>       //消息队列
2 ^% b4 o  D2 B& L' E1 m) m#include <sys/msg.h>       //消息队列) l, I) O7 F# l# [1 Y) I+ j7 P0 t7 _
#include <sys/select.h>! d1 @( K" A: Y# P2 {/ p% S2 \
#include <sys/syscall.h>/ t0 X1 F9 [2 P: ?3 c' H! x' d
#include <sys/stat.h>* t& @' n) C1 Z( [# [* B* o
#include <sys/mman.h>
- S$ O. m+ L* @! _" t- q! n9 }#define msleep(x) usleep(1000*x)5 L! i* a5 m  M. h

5 \6 ]4 a& l. `. r/ zint main()0 j' [3 l! ]% M( ^
{
* l6 q" P0 p" _4 y  M+ J9 `' k    //MCBSP,ARM与AMBE2000交互设备
0 Z  u+ A3 ^: l# P2 w, g5 g: s int fd;
* q% j& c# o0 B5 e unsigned short data_write = 0x5555;$ E9 x4 E- e0 @4 ~+ s% v6 s
unsigned short data_read = 0x00;7 r6 }* s' r  Q5 o! F$ A/ P7 g9 t1 N
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
& Z3 k. F  X# h0 R3 ] //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ |- i/ j) |$ [) s4 j7 b( c1 {   
) D! G, R5 E% k3 M8 i! W% r- ?  if(fd < 0)) e0 |( _2 [. ?& W$ c6 R: e/ o5 X) o
  {3 A7 t) h5 P0 P/ q3 k& s# P5 ]
     perror("open failed\n");
2 A- b& X! V" ?- |8 }. C     return -1;
  z- e; I* m) R- f8 [5 j2 i  }
& ?6 Y; s: W9 C: h1 Q* U3 z  g  
* Y3 f  M% {' h6 P' P  while(1)
# l7 Q/ O7 h0 F) N  L  {
! v! t4 }4 j2 z7 w# ~4 i- i: p( t   . t, ^: T+ {4 s5 K! k) G
   //AMBE2000每次读写是24个字为一帧
- n' y/ r! K6 B( I+ S, B/ P6 l   //写数据时将数据在底层存储起来,等到中断的时候再发送
: n8 `: @0 k0 g0 y  s2 ]$ p: g   //AMBE2000输入数据是以0x13EC开头的# W. M- l! {+ Q% O8 j* v
   write(fd,&data_write,sizeof(unsigned short));  Q2 Y. ?2 ]- e$ m9 \
   . _7 r$ r" Q' H5 \! s8 U' M' {  N& c
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
" A) g' H" d) V5 o   read(fd,&data_read,sizeof(unsigned short));. f/ Q6 l5 }$ V# g! E" A
   9 v& K( g; B0 j4 X$ J
   if(data_read == 0x13Ec)
/ k& @( ^8 Y0 P& W) [+ s   {* ]1 r4 f  _  c8 V3 o
   / o. H% J' a/ T
    printf("data_read = %x\n",data_read);
1 P$ c6 J4 p) A7 p8 ]/ R2 B   }
$ y6 g  ]) O- q6 w6 T! h   
& J- F4 X9 a0 K# P4 {; V) P( A3 A   msleep(10);
4 o4 W3 V& F; b2 q  b6 q  0 O; h; ~( [3 ~# E
  /*- |# }) c" W' O# z4 u$ ^
   ioctl(fd,1);   
& L. {1 h2 O! p" ]$ j; I- A sleep(1);, m: x; `" z. }; I. w) Z; D
ioctl(fd,0);9 d6 C: R7 i, y, e
sleep(1);; a/ t% y  _! s, ]
*/
; N3 h* h6 [. Q2 w8 X0 Y  }   , q" o" r! l5 I% |5 a
return 0;
2 T0 N7 m6 {. Q1 {0 J, d
+ [# Z! f/ D/ O0 c# t}
; G! O7 @, w" J: z+ [  W, K. J, U9 M8 r& ?2 h/ H. |5 x1 c
多谢各位指教,谢谢! 急
# |# K4 Y4 ?; e- f) I+ k, `, M- f4 {% N8 J% E2 J

7 z6 l5 |+ N/ y% _
$ F1 ?) G* H$ E: _1 ?
# A5 S1 D8 D; i4 W# P' x, Y- q: u/ U3 w* \9 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 10:30 , Processed in 0.043212 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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