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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# S/ M9 S. p2 }) L( ^6 T; V/*
4 _( z. v4 I2 q( D * Copyright (C) 2009 Texas Instruments Inc
. _- H: P3 f5 S* e5 N *2 U" m5 r0 t% R5 _
* This program is free software; you can redistribute it and/or modify
1 T$ c  U* o& p. R * it under the terms of the GNU General Public License as published by
! v: I. h* R( B5 f8 x% H * the Free Software Foundation; either version 2 of the License, or
$ P$ s4 ]) W6 V# O$ S4 |* K5 {* o/ m * (at your option)any later version.
' k( D4 R4 t. i *; r+ q1 \1 v8 |. M- N
* This program is distributed in the hope that it will be useful,2 U/ i5 `5 k9 d- Z( K1 t
* but WITHOUT ANY WARRANTY; without even the implied warranty of
' X0 ?2 Z+ z' j/ V; |! X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the4 ^# \# ~; Q1 m8 e
* GNU General Public License for more details.
9 S7 C/ J  O( h; Z, Q *  D! d  M& Q: I: n% P
* You should have received a copy of the GNU General Public License
, Q* S: [' n. r$ q$ p) I' D: z * along with this program; if not, write to the Free Software1 C- b3 ^' O9 d& `1 v4 ?
* Foundati
& D5 X# r; H# ~2 A9 T/ H8 Z*/
+ v* P$ x# Z9 p, z2 w& S#include <linux/module.h>& y1 L- O# q: ^# k4 D/ o- n' v
#include <linux/init.h>
3 T8 X$ h) Y4 V* w% h9 R' o: V1 F#include <linux/errno.h>0 M$ H3 `, l1 C2 O) @3 A
#include <linux/types.h>9 X% K& x9 `+ \2 U) Z5 ^
#include <linux/interrupt.h>4 u) X" A4 \* \7 P, l5 w. ~4 L
#include <linux/io.h>
& g5 S) Q3 W3 l% e5 W, }5 V7 N#include <linux/sysctl.h>
" ^+ p" L- I; g6 O/ z5 S3 T! M#include <linux/mm.h>
: R9 t' \5 Q" i#include <linux/delay.h>% S) l- Z' a6 K9 O! l: o
#include<linux/kernel.h>+ A6 f. v: D% h7 L$ D6 u
#include<linux/fs.h>5 h# H6 G* u. e
#include<linux/ioctl.h>, |' \* S9 R1 J6 {! A7 k: S; U
#include<linux/cdev.h>4 c% d/ F; j; E! y5 A  I: g
#include<linux/kdev_t.h>
" C$ t; n! A& _, A1 M! ]! a* J& }' h#include<linux/gpio.h>
3 o: ^+ w0 O) I#include <mach/hardware.h>. }7 a- A! V% N" k! F! C
#include <mach/irqs.h># r( s3 \) Y- `! P

+ ^+ X, s9 h& C#include <asm/mach-types.h>
  D& P4 G( o3 s! X2 w# J$ {' I#include <asm/mach/arch.h>
0 H5 N) b* @$ G  c#include <mach/da8xx.h>6 t9 @. r0 G! V& \
#define  SYSCFG_BASE   0x01c14000. M: w% k9 ^2 `0 b) n
#define  PINMUX1_OFFSET   0x124 2 J& F# H; `" ]$ b0 i
#define  PINMUX18_OFFSET  0x168
( n  ]9 ?7 O- C# @  O7 r) Y#define  PINMUX19_OFFSET  0x16c/ p. T# Y$ |" _+ j' H9 Z9 c
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
5 w! N' n2 Y- g9 y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR  L1 g6 S) c6 r8 K+ v. b3 ]
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 O  U" N2 x  S' Z, G& O#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
* h! w3 q) b* \6 q" A" Z' g#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR- O& G- y/ u. ^8 v
                           
  R* {- ]% M/ t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
+ V* S! P' ~8 |3 I; x#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
& Y  [  u/ N5 b- Z//PSC
8 k5 `0 M* I1 ~) Q#define  PTCMD_ADDR   0x01E27120  0 X: _& ]) X- E! S% v* P
#define  MDCTL15_ADDR 0x01E27A3C- M7 o) j3 r& Y/ a4 }
#define  PDCTL1_ADDR  0x01E27304
  Y8 v7 y, b+ `# X* f* v//GPIO8 direction7 Z" |- X. v1 p
#define GPIO8_DIRECT  0x01E260B0
5 w9 j' ?" ?0 Y- C7 i#define GPIO8_OUT     0x01E260B4
4 t. z6 N0 \* k* Z8 V) S#define GPIO8_IN     0x01E260C0
7 C0 ^; ?/ \% s! q" }8 ^
) Q  [3 P# t% n, s8 m# s" k6 L//#define MCBSP1_RINT    99              + d1 F7 g" L& f+ A% n
//#define MCBSP1_XINT    100  1 t  H. W7 R* H3 `  q
static int MCBSP_MAJOR=239;
7 X/ K& W3 I* |" o. F$ r" w. q8 Wstatic int MCBSP_MINOR=0;7 k( E- p% {* H5 h/ b0 h
static int count =1;$ n. v& L/ T( [, d: h- j, m
6 r/ O" w+ y( S7 U* ~& I/ K
#define MCBSP_NAME  "MCBSP-device"
; t( }! @2 G' ~; D5 b, o7 ?9 \) {- M6 [8 d% \: Z/ E
static struct cdev *mcbsp_cdev;
* {  M0 H2 j6 Nstatic struct class *mcbsp_class;* \  x6 i7 B* G6 i- e3 H. ^  @
static dev_t mcbsp_dev;
6 P* ]4 h5 p: ]: Runsigned int DRR_data;
, R7 v* d  [4 V6 ^$ o: funsigned int DXR_data;* c" \7 W" v$ U. V) ?# m8 U: t
static int mcbsp_open(struct inode *inode,struct file *file)
- b6 _2 }% `6 r9 ]  K: {- g* ]6 K{- C: ^0 n, X3 B4 E1 Y/ `
   
* j/ ]" H6 Z  O3 Q6 m  f& T   //interrupt enable,initialized
: {( c2 G' o9 K2 z( B* q& k   unsigned int temp;' [4 r, u3 t. F; @* G$ R
   //SLEEP_EN(GPIO8[10])---02 \. Y6 N' F5 Q# q/ P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 p; Q3 p* w5 z- F! l. K1 @* X
   temp=temp&(~0x00000400);
0 X# N, D! N- n0 _$ d5 X: a- ~  e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 \' G' X- o5 s/ t
  //RESETn(GPIO8[8])----0----1/ n" R+ j8 ~& {$ B6 S
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% Y9 j' a' R' H& a$ N7 O* b2 l' W
   temp=temp&(~0x00000100);1 [& _$ @& u5 z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
/ J& H2 H9 S: M! k   udelay(100);& x/ `! x9 Q2 S5 [$ _0 L) J# E
   temp=temp| 0x00000100;/ P! I6 E7 b' H; j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1, z/ T( R; T' p; d0 U* h* d
   udelay(100);4 N9 H4 z$ C/ _6 M, H
   printk("open success!\n");  p) y6 _4 J" Z0 P
   return 0;; m$ y$ Y; L1 a, H# r
}3 ^8 {3 m% _5 K1 y- M

6 [$ K0 W* J/ Y3 _static int mcbsp_release(struct inode *inode,struct file *file), A+ B$ f' j! C8 J
{
: A- U  q8 l1 K: j' x. t   printk("release success!\n");
6 k7 `$ ^( n& X6 S, G   return 0;
+ [) g: ~( n; V0 l$ }6 \" U$ k}8 j) O, G8 B4 T# j- N+ k

: h3 h; C  R6 nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 |% y  D$ Z' C$ H+ D
{
6 k, Z4 f" U0 V+ g0 j    copy_from_user(&DXR_data,buf,len);
) j' o, y0 D4 j( J" \# [  g    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       6 ^. d; ]9 ^5 S
    return 0;
5 N. K$ w) f: i; y * [, g9 o0 Q3 W5 @
}. M1 N2 I( n  U, k' b6 a. I3 g5 w+ K0 }

5 p4 ?( T$ u; s' V# i- A" nstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 ]4 ]: I: X# D( n. b# e/ O{ 3 s' q, B5 N! J- |2 {) ]4 o0 H
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 Q. o, Z8 I$ s& Z   copy_to_user(buf,&DRR_data,len);
" \6 G6 `, k$ |   return 0;
, P, m. {0 l9 I; G" f( [+ Z}$ C+ R% T3 ~* Q; T% p6 v+ v9 Y( B

' @3 O+ D' Y( r9 ~7 @4 L6 C
/ j5 \( h1 u/ U; p. U7 O. f1 hstatic struct  file_operations mcbsp_fops=
0 h- j+ R7 ]: _# J& T{
  T" @) k4 \) m% l( @& X5 @* `; y   .owner=THIS_MODULE,7 B! q) C( f$ u; s
   .open=mcbsp_open,  t+ e5 v: X. H& o9 l  H
   .release=mcbsp_release,
3 Q" V$ Z  \! a! F( h" _   .write=mcbsp_write,( h: o& v0 X$ t) Z; I, M
   .read=mcbsp_read,
: c1 k8 `9 u* W5 ]% x) q};* h/ g" ?, ]6 I4 x# g; E' \
static int __init MCBSP_init(void)( _0 `8 h' n2 v1 D( l7 p
{  Q$ I0 e) y$ P& U/ |8 x( O
   int ret;/ W( E, A! x; Z2 z, `, d* Q
   unsigned  int   PINMUX1_REG_old;! G- s- b; S! g. n" i# j
   unsigned  int   PINMUX18_REG_old;
5 A4 D$ X" L( Z6 S* Y   unsigned  int   PINMUX19_REG_old;
$ _* e" K. f7 y0 G1 \! w   unsigned  int   temp;  & r( o1 c  U& L1 j/ }
   if(MCBSP_MAJOR)
/ z9 \# U7 Q& b" A  L' R$ j   {
3 I' J. |3 r' W4 u      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" J% d9 H5 Q# K; g( W+ U      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);+ ?+ S" k1 Q: m
   }+ D3 V5 L  @9 X8 d
   else7 i( f5 N' K8 m. X6 [
   {2 b- h- Q( C9 I
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
' g+ M5 Z+ w" d  }      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 Q5 n4 ^  d' E# j8 w   }" p8 ^/ w7 j: \9 J+ _
   & b: r, F. V% u; Y) J; E4 o
   if(ret<0)2 L; X" H5 J% T, s% I
   {  @$ y( a" n/ Y! z4 u) b
      printk(KERN_ERR "register chrdev fail!");* E* W3 `0 M+ G$ T0 V: p+ G: b/ ~7 [
      return -1;: T8 _2 U- @9 i. ?
   }2 l# o' `" k# Q, X' E/ @
   , L1 J2 A: m5 ^2 Y; g9 n
   mcbsp_cdev=cdev_alloc();! Z6 A3 f9 t/ k: B, }
   4 M7 {1 t% o$ `0 b
   if(mcbsp_cdev!=NULL)7 i5 X$ L6 ~; w; t. A; I, a
   {& @' W2 c0 y# ?% X  \
      cdev_init(mcbsp_cdev,&mcbsp_fops);* i) z2 b3 p! J* r; C/ F6 p. J
      mcbsp_cdev->ops=&mcbsp_fops;
" F+ ?0 F& O+ h) c      mcbsp_cdev->owner=THIS_MODULE;+ ~! }3 G2 s" r: H! E
      6 Y( _$ _. s1 `; V3 C- Q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 a9 ?& G6 m# A+ f% k2 Y          printk(KERN_ERR "register cdev fail!");
( _4 P! O* A, k9 Y  b" D      else
% G2 k' C9 P! H" C6 q4 b8 Z. A' x          printk(KERN_ERR "register success!\n");8 ?- l. h) a! b+ x7 W9 N
   }
; o4 P8 a% G( `4 a' j   else% T( Y9 [9 d  G/ ]
   {- L6 x5 O1 {9 k
      printk(KERN_ERR "register cdev err!");3 ~5 _. H+ b: F& S
      return -1;
: ?+ U% V/ G; p5 b9 _% W   }
( U% V2 c6 s! Y: ^) W) }   
& s* l" l6 S( x1 I4 E* A) u5 G  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& g- g- Z" ~( y
   if(IS_ERR(mcbsp_class))% V9 }3 T" W0 |( G
   {
" Y; ?/ k$ i3 Z      printk(KERN_ERR "register class err!");
& X' k1 \3 Q5 N  I   return -1;- h4 f" w5 e3 v! `2 v
   }
" n$ F# z$ M) H( e6 N: b5 d   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
& k3 ?9 V3 U9 E1 {* {2 Y! k- r, Q% \: g4 q
   //PSC& `  C$ i( x/ ~. U7 T% w
   //add Enable MCBSP4 \" ]$ r! o$ {
   //test  A& f; a8 C5 ~/ z6 U8 D5 c. g
   temp = 0x80000003;
# L0 Y: M( D1 i7 H. V6 G! v   writel(temp, IO_ADDRESS(MDCTL15_ADDR));! u2 O; c1 g; U5 k) i5 P
   temp = 0x00000003;
$ Y" s: i; g6 V0 D  A4 I  M. n   writel(temp, IO_ADDRESS(PTCMD_ADDR));$ o# n7 K0 [. V
* y& G/ S0 ?! }* h5 C  O; V
   temp = 0x001FF201;
% ?' ?; I. S8 q  ]- C9 g, s- \! s  ~   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: E8 p# ]6 G3 o, s: l7 B& F! a6 l
   
& F$ s9 O4 y$ {, H( m' s   //PINMUX  
. c6 Y9 a$ Y" c1 |, r, @/ A   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 Y, a$ W; @1 B1 _9 @7 h! O   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 y( e8 k, Q8 D: h- }
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 ^+ Z+ H$ t& x& M) G   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  O, u5 R( e* w8 o5 {& M   
# d0 q# R, F. [+ u/ E8 Z   //SLEEP_EN,EPR,L138_SHK1,L138_RC; w7 _( U6 P$ c. m, i9 @. u" {
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
$ D7 l( n2 I5 C6 R: O: M: I& x, Q   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
  o, g/ e' `9 V. w. T   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 j3 B, P) R; b. {  m
3 x+ }/ s' C0 q3 ?/ c
   //RESETn,L138_SHK2
/ n) t$ ^9 P( `; f6 ^% C. ^   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  3 f/ v# P* |7 i: Q: d
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   9 f2 j" ~$ G# |
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: {- ^5 ]$ }6 ]  z$ |
' k1 t1 _/ M" g& l0 ~* w

7 Q: ?4 X2 Y. U, Q2 l  ^0 y  //SPCR Register
( p; G" b" w9 [3 l  c  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# z% A/ k& R# m# w5 V  temp = 0x03000000;//(DLB=0)0 a" j: B8 m8 @" ^# Y' d. `
// temp = 0x03008000;//(DLB=1); F- i1 Q* C# e
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset5 a& n; O* t6 X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( L; M  q! c( T: y. q) M4 y" k* Y7 n  printk("temp=%x\n",temp);
- t1 ]2 N0 _$ ~- C( Z
# h) j' E( r3 b1 [7 v1 P   //PCR Register
  \, e  U7 L" p9 H$ e1 p   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' |) D6 {2 `  d4 N3 G$ a
  // temp = 0x00000F0F;
$ w8 ?/ _  o  M4 |" w3 G. [  temp = 0x00000B0F;
, B& A8 c7 e" C" N0 f9 s  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
# M6 g4 s# E/ n: F  temp = readl(IO_ADDRESS(PCR_ADDR));
/ q' i7 s3 l" I& I5 @$ V  printk("temp=%x\n",temp);  . v3 M2 N& m5 l9 t/ c( \2 D1 w# C" X
   //SRGR Register( e+ @# _- ^( ], c+ Y
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; r* `& |+ z2 v; ^7 {8 {. k
//temp = 0x301F000B;. j. R+ g$ h5 R! a8 }/ h
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 o: F! T9 M' P: o$ a: O+ \6 J  temp = readl(IO_ADDRESS(SRGR_ADDR));
1 W' V7 T( ]9 Z. k  printk("temp=%x\n",temp);8 O$ X+ B3 U: r1 Q2 j8 u
   //RCR/ m1 r( {' N! ]
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! Z* ?$ A- v$ I& d+ S- m
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0* h6 T1 p+ T+ r" o& w
   temp = 0x00440040;
0 V- J5 w" `$ u, x   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
0 @; U/ E1 S4 G7 p" Y* B( d9 G   temp = readl(IO_ADDRESS(RCR_ADDR));
. a, q7 `. V, t+ j# @+ U/ W% F2 V0 x   printk("temp=%x\n",temp);4 P/ H& n7 z+ ~
   //XCR
; Y) Q1 f, B  ?, R/ m% R5 \, ~4 T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& U6 ]" Z" k7 G  a$ }   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ n5 d, `: v; ~/ M0 V3 e; R   temp = 0x00440040;  \  L+ ^7 H( p; T2 b; Q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + j  Z, ?1 n! y* A: ?. h
   temp = readl(IO_ADDRESS(XCR_ADDR));
( C: p% m4 P9 H+ S7 e   printk("temp=%x\n",temp);) ^! Q! C  }% ?8 `
  udelay(100);
& H( ]8 B& ^) i' A. L* a  //SPCR Register; m+ }# ~5 t# U& C
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1  I4 U0 ^* a: Q4 u0 l' T
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
5 D* |2 U$ [1 Z- Q' ?( v2 d7 L  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
, ?# K$ I5 U3 H# k4 j  temp = readl(IO_ADDRESS(SPCR_ADDR));6 h1 b, Z- G% Z( Y& Y3 |
  printk("temp=%x\n",temp);# v' X' Y6 X8 |7 W
  udelay(100);) m+ \  U: V8 |" G. v
* N8 M- D+ q# I; p" E
  //set GPIO direction
6 m+ ?9 p0 t- f4 C- ]- \7 `: `* A. E   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ [6 P3 p3 p( U3 K) \) l6 y- N
   temp = temp | 0x00000100;//EPR----input0 u% p- Y$ b8 i5 @
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. P& ]' U9 Y0 ~: c
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 l3 J* a% u5 u: f
/ ]0 \! {. y! W( E3 m1 r; r  T/ x& U   return 0;
) U  n1 H! `& X" }' H) L% h}
3 k9 X0 f) x0 P6 m8 H: V0 H* Ostatic void __exit MCBSP_exit(void)
8 G4 w# U# A# \4 {& r( _# e! I{% l, F% {0 b& \1 n9 ?5 w
   printk("mcbsp chrdev exit!\n");& A2 Q! s/ C0 V6 c* `) H7 y& b
   cdev_del(mcbsp_cdev);) H  n* ]! g& x- Y6 n" w
   unregister_chrdev_region(mcbsp_dev,count);- u8 p" A' U8 _; s# O# V# d+ u
   device_destroy(mcbsp_class,mcbsp_dev);( ~: Q7 {8 u6 z2 j8 }
   class_destroy(mcbsp_class);
8 |. n/ {% w  m# W* J}
! V+ C7 G3 f+ @( k5 f3 Pmodule_init(MCBSP_init);% C% c( t1 w9 N6 \1 E
module_exit(MCBSP_exit);) s, l+ \  k+ @$ Y

, @6 L# T  G0 @' ^+ o! n" E; pMODULE_LICENSE("GPL");  X* c4 T0 X8 V8 d3 x4 t6 C

  a2 Q- B8 O5 o2 O* D0 R* C我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* Q  T" r2 C8 _" h4 m& W# I( t& y7 ?5 i
我的应用层的测试程序如下& R3 |! R' M4 [& }# x/ |8 U
#include <stdio.h>! r- V% y0 ?$ W' S# N/ u4 }. O: }1 T
#include <string.h>
' P) \& s4 f. ?- m4 `' m0 P#include <fcntl.h>( H. X4 W$ F1 U# Z6 Q5 Y" J
#include <unistd.h>8 b' d% `. r" n2 l/ `
#include <signal.h>
1 k% ]7 P) }" P#include <pthread.h>       //线程% N: U- B4 \! L
#include <stdlib.h>! L! G4 v0 ^# O: @
#include <pcap.h>          //捕获网口数据! Z1 q, B7 q. T& {5 h8 Q$ V+ `
#include <semaphore.h>     //信号
' T" T) k7 K6 z' a- l- v. Q#include <sys/types.h>     //消息对列
" d, v7 V1 \" X0 d- a#include <sys/ipc.h>       //消息队列2 o1 O& M; l, e& p2 ^
#include <sys/msg.h>       //消息队列
; h: L. `) ?2 g+ C#include <sys/select.h>: o+ C8 Z  L4 [! J2 P" N6 `4 Y
#include <sys/syscall.h>
' f* d6 `; [0 U& p#include <sys/stat.h>1 v5 e# B* r% U
#include <sys/mman.h>
. r* |  B: u! S1 Z. N#define msleep(x) usleep(1000*x)1 |: p8 @4 }' e

8 H. }9 n" e# M" sint main()
/ {- [* [1 D, P3 {{
# X; n- G+ t0 m* ?- P. S6 i0 r    //MCBSP,ARM与AMBE2000交互设备3 C; k% i8 ?4 m* _+ e
int fd;4 y5 [# u+ J. m# V  t* z
unsigned short data_write = 0x5555;/ j8 N9 j8 S, e9 _9 h8 L
unsigned short data_read = 0x00;
) j* d: |& F- Q2 s0 {, A' X  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" S9 t0 k% n- p6 M" J; ]
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# x6 b1 K# r3 c, ]6 R% Y* |+ e+ `   
" S) ?9 W4 N% }1 y  if(fd < 0)
# C# c& u9 I0 s& K6 y9 v% [  {
' H3 o  Z% z; w- j6 v* C+ D2 E1 |8 T+ C     perror("open failed\n");9 K' M; A  U1 R1 A/ `# z
     return -1;8 q9 i% A6 w. e. ]  K* @$ i
  }
7 K! Y0 E8 ]: E5 X  : `' {: n; B" }( G2 F+ \6 S
  while(1)
6 f( ?& x9 }- S3 [* N  {
8 T& M$ g% w. t1 q7 E+ F5 ]: n   2 ?; r" f7 J' G. s) A
   //AMBE2000每次读写是24个字为一帧
: R' W: n9 U2 |" J' o5 Q   //写数据时将数据在底层存储起来,等到中断的时候再发送& ?4 P+ S0 _4 d9 o6 I! f0 @0 E
   //AMBE2000输入数据是以0x13EC开头的! |3 v! a7 U+ F8 v7 Y; J
   write(fd,&data_write,sizeof(unsigned short));
% R8 h5 W& Y1 P: ~: l9 r+ s; v! s   * M' M, Z# W; @9 J% |2 j
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; _% p! \3 G5 F' D' s& G, ^0 k
   read(fd,&data_read,sizeof(unsigned short));0 x2 ]: {4 w! l; l. |! X7 j  B
   
' n4 f2 f: n" a- a   if(data_read == 0x13Ec)
+ y9 ?0 B; Z" j; ~# B3 \6 [   {$ y5 N& ~4 v4 M9 h, y- d* x
   " d0 E* Y' B" W' v, h, e
    printf("data_read = %x\n",data_read);/ {4 b- l# T0 F
   }, T& J; z1 A5 x. n- L8 }
   + Z7 [" q# B5 x/ F$ Y& `; e6 y
   msleep(10);
0 Q- k) l' p0 y. `' g  
7 b( m' I9 H8 o/ {5 t  /*
" j' {8 {* p6 r+ {   ioctl(fd,1);   9 W& n: E& P* d/ r
sleep(1);
) `; E" ]* t1 c ioctl(fd,0);
+ r2 c: [$ U- q+ K# R( p4 i sleep(1);
; }$ N- O4 P% y4 H( ?4 v: f */ + V$ ~" S8 ]* O# Y
  }   
$ n8 c9 s* ]- Z+ r return 0;
5 `6 _& W( ^  K. v
$ E# s/ O3 N9 k}
# j2 {2 r- z: ^! }2 e  E1 j2 Y) j
& t# X5 ]$ U& {8 ]0 i多谢各位指教,谢谢! 急
- o; a. T1 F1 d6 t" D' C9 m4 E; G$ X: e1 ?  M( \  L
' v9 H7 \" R" ?

. P5 S4 `  F& l& p* _
3 p  g! W: W3 A. U, M) o# }& T3 e/ t- S  y6 Z$ N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 15:20 , Processed in 0.042246 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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