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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 t# Q1 ~, o, b, [! ]
/*
: q! F& p- Z5 J+ {' w7 w * Copyright (C) 2009 Texas Instruments Inc' ^) U) N5 }' a$ k
*$ d' f: c, O- U  z. \1 V
* This program is free software; you can redistribute it and/or modify  m$ n# h- M  P/ G& H
* it under the terms of the GNU General Public License as published by
+ l" l$ v8 V2 M, a% j" o3 @ * the Free Software Foundation; either version 2 of the License, or! F2 D: E2 z' J: V2 i3 |# G
* (at your option)any later version.
3 c6 u. V$ d' s. }7 A. c *
2 M% }6 U+ j$ u0 G4 P; a8 o * This program is distributed in the hope that it will be useful,' O' k% f. \4 n
* but WITHOUT ANY WARRANTY; without even the implied warranty of
+ H+ X: j6 @: Z9 Y * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) b  [! d6 W3 ]# P* x2 Q+ l * GNU General Public License for more details.. y- r1 J, _: ~
*& Y( I, z/ s$ N' E
* You should have received a copy of the GNU General Public License. @1 z' E5 X  B$ y7 X
* along with this program; if not, write to the Free Software
: l3 N0 c& ?3 b) F * Foundati2 l1 y( Y2 D! \0 w* A# P
*/2 m, M1 z6 ?) S
#include <linux/module.h>
" p. S% _$ F8 e% c0 ~% c6 z9 E3 \#include <linux/init.h>
+ m5 S: ?4 X! s4 s+ _9 w#include <linux/errno.h>  D8 X+ x  c) I# v! j+ Y
#include <linux/types.h>
( \$ L- u0 s3 d- x, A( g: j/ `#include <linux/interrupt.h>1 b% m: X/ }# E4 }: |
#include <linux/io.h>
9 w2 A+ I% |% C: I$ M/ l#include <linux/sysctl.h>
/ E' q. l( t1 V4 R: |" l  |#include <linux/mm.h>1 e$ F) y, ~$ {& ]. T8 Z. y
#include <linux/delay.h>
5 O8 G  y7 D5 D' ~. |#include<linux/kernel.h>
- ]- p  }; Y" a0 U( ?0 J#include<linux/fs.h>
* J; b- E0 ^& ]# @4 {( q' |#include<linux/ioctl.h>
+ T# I6 ?: ]9 w3 a8 ~& x#include<linux/cdev.h>
( D7 x6 {) I) y#include<linux/kdev_t.h>
8 L1 B: o3 O) }" h4 {" A7 C#include<linux/gpio.h>2 O0 o8 H: T! |1 F
#include <mach/hardware.h>, J; ~! S9 s+ [5 |1 a, e
#include <mach/irqs.h>
; E9 P7 F* H2 h3 K
7 }( d4 k% w9 G3 @  @% ]6 r#include <asm/mach-types.h>$ I1 @4 n1 o/ F* j  _" q5 T
#include <asm/mach/arch.h>$ m) R# P" x4 p: v: \5 t
#include <mach/da8xx.h>
  m  _" w8 ^; x8 h#define  SYSCFG_BASE   0x01c140009 V* }6 B) j" X* d
#define  PINMUX1_OFFSET   0x124 9 q* `: b" t) o7 C: p, G* j
#define  PINMUX18_OFFSET  0x168   W. ?* }7 m. [2 ]3 [
#define  PINMUX19_OFFSET  0x16c2 M0 F& s; p* L# @9 X
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR8 K- J; i6 N3 L1 E0 i) u6 h
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
  T4 ?& s& a5 y& P#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR% |7 H4 y  {% o  K
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR/ O7 n  D0 j0 U% n
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
' T, z5 a2 p/ C% e9 X                            " v) y0 ^) ?+ n, G# b+ P- |
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  V; u8 Y% ^& I9 i1 P# g0 i5 v/ ?#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
" U1 A7 `' q" G//PSC6 w1 H0 \, e- Z9 R* O
#define  PTCMD_ADDR   0x01E27120  
4 F7 ^; [$ }/ `" ~8 Z( F! C. E#define  MDCTL15_ADDR 0x01E27A3C
) r; P! L3 {. G9 j6 `* ~#define  PDCTL1_ADDR  0x01E27304: E3 r- c% t8 U4 i4 ?
//GPIO8 direction9 h% A8 u9 [: y' Z  g1 N% [! Q
#define GPIO8_DIRECT  0x01E260B0
3 w1 Q& p0 b; |0 @#define GPIO8_OUT     0x01E260B4
, }" v# Y4 q' Q8 d: c, G) M#define GPIO8_IN     0x01E260C0
2 |. O: T: U' q* t# \+ X
% s# n7 d7 ~4 t8 W* O8 w" G; d1 x//#define MCBSP1_RINT    99              + M1 a! V, D8 V' B  S* n
//#define MCBSP1_XINT    100  , _7 H; y2 F  _' i- f% }8 e, O
static int MCBSP_MAJOR=239;2 \' v) t9 o4 c: F4 V3 d
static int MCBSP_MINOR=0;% Q( P; u1 O4 t0 P
static int count =1;
2 C6 L" |- T- P+ Q4 F0 l8 z, j) h  H- X  \# @! T
#define MCBSP_NAME  "MCBSP-device"$ I# Y! q6 F/ Z+ S

8 O. N6 m. y, V/ q# @1 Ustatic struct cdev *mcbsp_cdev;
7 f, w+ z( I6 jstatic struct class *mcbsp_class;
( P7 a3 Q8 {) ^7 G% D! dstatic dev_t mcbsp_dev;
& f7 U$ q' Z1 lunsigned int DRR_data;( B7 e& |/ u$ ?. I8 i
unsigned int DXR_data;3 h: v& i8 F/ v$ {
static int mcbsp_open(struct inode *inode,struct file *file)
3 _* ?. D6 |$ M. n' n8 ^0 A9 C{
. F7 I! `& g; n6 F5 p  R) A   
, N& S: V3 f  K  ^   //interrupt enable,initialized
8 k1 C/ d' ]) z; Q   unsigned int temp;0 s" e( f% {( W% u
   //SLEEP_EN(GPIO8[10])---0+ c. S# I8 X) a5 b  o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 _5 I9 a: H, f5 s& z2 `6 w' O5 D- P7 _" ^
   temp=temp&(~0x00000400);3 ^/ j  F& j4 j8 v' ?' {
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 {( a) r& w: i0 w/ q& H" ]( ?  //RESETn(GPIO8[8])----0----1$ B' ?. t" F! L8 D+ R4 q$ [
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( R/ C) |0 z! a* T2 W
   temp=temp&(~0x00000100);+ M* ?/ ~. X' X1 [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 ]) v( I* N& s1 w- G
   udelay(100);
4 \4 E$ o2 k5 ~6 K. b   temp=temp| 0x00000100;
) |) |* L9 Q* H$ h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 e! o% y6 x' G! i0 b: [5 i   udelay(100);
6 n" ]* m- B: X. C   printk("open success!\n");
1 y3 C6 l* |- X# |6 I. Q! H* j: w   return 0;
4 d8 Z' g5 ]& I% L}
$ m+ ~5 D+ [, q: ]" N: p# E4 p: {7 K
' p6 o1 A% N  _# ustatic int mcbsp_release(struct inode *inode,struct file *file)
5 N# a9 ~. h. x# U7 K2 Y0 C{" O: o% o# m8 k2 U
   printk("release success!\n");
9 x1 O4 b0 a* J. ^( P+ a" J   return 0;
  h" ~# g5 u1 {) h' S9 l5 q}/ m: W/ v( b2 Y1 M2 f( i5 j
3 S2 N) o- `1 ^' F5 ^
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
2 a: v+ I: v# s+ V" h- L  S{
. x4 z) T7 B+ \/ f# {    copy_from_user(&DXR_data,buf,len);4 g$ F- Y! `- w# b2 L
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 e* F# A7 ~8 [- `$ ~    return 0;5 N1 q1 k& B8 i! \
; z: D5 g( x8 O1 C8 g1 o
}0 c; K. o: P$ F2 ]% `

: k5 m0 Q, L2 G' C( B$ J' W+ @static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ z2 b* F$ f, O6 o{ 3 J0 B% e% Q. D2 @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
6 s7 a" z8 f: M8 m. I" K& v   copy_to_user(buf,&DRR_data,len); " r+ b9 Z/ x; y* o7 ~6 q' b- S5 L  ~
   return 0;
* v: f, h1 |. x1 m) H1 s+ R}& }7 a0 i9 R. S9 K
- Y& F7 E  {7 k8 `) S/ y& v% O7 H
6 U7 M. w8 B) b6 `1 l& I  K0 k% ^% B
static struct  file_operations mcbsp_fops=
! ~& [  C/ k3 a4 h0 a/ s/ Q{
) h1 R$ A8 l' z- {$ g/ R+ z7 X   .owner=THIS_MODULE,6 E+ |9 G, {3 `% g9 n' K" ]/ t
   .open=mcbsp_open,
6 ?/ ^( K1 y+ P3 |. N4 G1 O   .release=mcbsp_release,+ C5 H) }$ P. X9 i
   .write=mcbsp_write,
7 @; w: N: A4 @1 c. `) q   .read=mcbsp_read,
. i) p1 e3 f5 l8 }: X' y! M, Y/ F};
9 Z4 E) ~# e) C, p3 X7 bstatic int __init MCBSP_init(void), n; i$ Q8 Y. o& B7 Y
{% T! ^% ?& F9 j. x1 B
   int ret;
2 m! ]5 K+ D! H, T4 M6 Z' i   unsigned  int   PINMUX1_REG_old;
) Z' ^7 H6 {( t2 Y4 S, x& ^5 P   unsigned  int   PINMUX18_REG_old;
% W8 x4 s3 D$ z2 T  y   unsigned  int   PINMUX19_REG_old;
, o' w  n+ d& N" p   unsigned  int   temp;  5 R) ~8 q/ L0 D2 p3 O7 P
   if(MCBSP_MAJOR)
5 h8 T1 X) m: X$ N   {! Q8 |$ K# M& Q7 n  }
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, L+ [6 L' Z  E0 l! s" A$ g$ E" v      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
/ @( p1 Q9 x6 |/ T; z; G   }' [) |* S) D1 r
   else# K( T+ W# x1 }- q: ^
   {1 U. Z/ K. ]; I4 S9 P3 L8 ~$ M
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( ]) y/ h: x  w      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) E" |  x" i7 L   }0 T  d" P% n- `/ [( I. S( V  {* f
   * u2 Z3 |* O& R$ f/ c
   if(ret<0)
  f5 O5 c. c& ?. p( X/ q; s   {; {6 E) I; ?. K4 l( r, b  B% s
      printk(KERN_ERR "register chrdev fail!");
! w4 E- L# L5 J      return -1;5 A- A# ]9 M3 n, N2 y
   }
# P, @- ^- _2 R  a   
: [, C" a$ A- M   mcbsp_cdev=cdev_alloc();0 U. D( n! ^$ @- |9 Z# R
   
, {& \- N7 @8 _! O& R4 P   if(mcbsp_cdev!=NULL)
, Z. G6 B8 [/ Z6 ?% x1 [   {7 K4 [  [3 g' m8 ^- w9 S: k
      cdev_init(mcbsp_cdev,&mcbsp_fops);
4 x+ ]$ g' L5 i      mcbsp_cdev->ops=&mcbsp_fops;
5 S% }) L/ ~, z' }      mcbsp_cdev->owner=THIS_MODULE;4 {: v" s8 k& U& x, B4 K
      ) Y9 h5 U$ _: t4 y0 d3 i( N) T
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ b0 t3 k) H3 x& l' Y2 U$ }! S
          printk(KERN_ERR "register cdev fail!");
% w- E9 f0 g0 i* L+ q      else
4 Z2 z# W# p' U" \0 _) K0 {          printk(KERN_ERR "register success!\n");
/ e; H1 e' {" q" y  }   }3 g0 }, C" Z' v) a" d, F  P- c! b! W
   else
& L) ~' S) V) \% O- C0 }   {+ ?" n' u9 h! F. U
      printk(KERN_ERR "register cdev err!");
+ M$ I8 P! @  Q6 E- J0 ^. L      return -1;
  Y* f5 d2 x. ~4 U2 O0 v   }! M* I' D4 R) u. n, S
   
! }- A' c2 G. S# O$ ]' W  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 ?$ e8 {- J' D: j" r2 ]
   if(IS_ERR(mcbsp_class))# k6 M9 j5 S! x- B. F
   {( W+ r' m  E1 z/ X1 ~+ b
      printk(KERN_ERR "register class err!");/ ?/ E: k" C* D8 U' ^/ s
   return -1;; [' u/ K* A1 d. x0 c, X) D1 |1 r7 }
   }: @! Y# Z# J3 J) m# t( p  y5 P8 x
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
" Q% U- P) ^$ u# Y! e
" R7 ~) W/ H7 q3 g   //PSC; x' F  a& U$ p" L8 e) g
   //add Enable MCBSP
5 c4 Y$ _" u* }1 a: O, p8 M   //test. N  \# V: G+ ~6 ?2 a2 H: |$ \4 ~) R
   temp = 0x80000003;
8 U! e: `5 f( M0 Z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% i% \+ ?- \* @" e' R3 X2 }   temp = 0x00000003;* s; Y# D/ B' b* F8 E: k4 F
   writel(temp, IO_ADDRESS(PTCMD_ADDR));4 s; @& b6 Z& Y
  J$ ]& j7 e/ y/ b" S" [
   temp = 0x001FF201;
/ q% ]4 ~/ x. l1 M9 B9 R: O   writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 Q9 t, O6 O" S4 p) c- w3 K" |6 R
   
3 Q' k, x& e7 w$ u  L. L  z1 F" A   //PINMUX  
* a, t$ ~8 d8 c! q8 e   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* M! V9 ~  ?$ ?, Q) V  R  W2 b   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  8 c7 [+ @) n. e' m9 [
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
( z+ O7 i( u# ?) {   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);0 E& ~3 _5 T/ z" l6 P
   
' }# {0 E/ U0 ?" m: A$ n   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; t; i' Q/ g2 C# v4 g) g5 q   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ W. |. h4 f, h  N0 p* X   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
! S& H- y9 @3 @  m* u   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  s& Z9 K( z# A, w4 Z3 I

  _6 U0 S3 e1 z* s3 F   //RESETn,L138_SHK2
( J% g$ [( m* b$ o& X6 w9 P   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  - H5 e: \/ g3 ^+ g8 e* D+ m
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   * e/ Q2 K1 z% `$ Q
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);. T  T0 y' F! [- s

# [" I) i  i8 T1 e; y / v+ ]3 y8 j8 O; m
  //SPCR Register
9 o7 M4 ], U' a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% x! A7 l- q; k" |  temp = 0x03000000;//(DLB=0)' z) T) a9 z  P+ g/ r9 \
// temp = 0x03008000;//(DLB=1)* U0 w1 n9 e. B  R) @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; z( K8 ]6 }3 a; }- r5 q  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 p* \* o. k% B2 d9 w8 {, V8 s  printk("temp=%x\n",temp);
2 d! L: x6 l) |% v; r  n4 i 5 V5 u  e0 c8 U; k4 ]
   //PCR Register
0 {. |' ?( U/ C+ F  t6 w* ^$ e   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* h( b, W- i  v9 Z$ ^  // temp = 0x00000F0F;
  }' L1 z) n1 U& t* \. {  temp = 0x00000B0F;* z  |( S9 l2 b
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 E3 M8 J# ~; m; p% p; F4 Y# g
  temp = readl(IO_ADDRESS(PCR_ADDR));
" J$ d' O* x1 j! v6 g+ q  printk("temp=%x\n",temp);  
+ [4 z( s" V4 h: u8 _7 O% \   //SRGR Register- Q7 v+ l) d( j# e1 c! B  U9 c
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* b& r: g" l3 w" }) }4 @  J0 n //temp = 0x301F000B;5 W' U0 l4 S0 r# x6 @. V' F
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * Y$ h) @& F, o
  temp = readl(IO_ADDRESS(SRGR_ADDR));. l2 r+ D8 E# O+ Y& n7 P
  printk("temp=%x\n",temp);
9 S, |7 ?2 _# o( q8 s   //RCR& t8 ^8 X3 f7 @# B& T1 R$ m
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
% V( I  ?4 x; u5 c+ i0 y( {$ e   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 I5 K2 n3 |1 a% H5 H8 D
   temp = 0x00440040;8 R" ]$ D% O0 t, y0 H& w6 [. s, F
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* i4 c2 j: N) h) i  ]- ^& N   temp = readl(IO_ADDRESS(RCR_ADDR));% s* }0 ?! y) A, k
   printk("temp=%x\n",temp);+ E$ l8 ]! |, y! \$ F( X! h- V
   //XCR
0 n$ t; Q  v! I& k   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: j/ A& E5 v% t$ S0 B, i
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ v. F8 s$ D5 S) v/ ]& |   temp = 0x00440040;/ v0 f, k; F* V, i) x3 w7 G
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 b/ f" Q- i3 m
   temp = readl(IO_ADDRESS(XCR_ADDR));
0 F1 l8 L2 X& ?  K   printk("temp=%x\n",temp);
  d( ?7 S4 u' P! H7 q% b" h  udelay(100);
1 e: _3 U; w6 `6 _* J  //SPCR Register2 t) _7 T  A5 S+ T5 `* \
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 L) Z0 e# G5 L& y8 L, U9 @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  C* Q$ |, N4 i! n  i* C: U% I2 E
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 P4 ?5 F+ R6 P2 ~, d8 z! [  temp = readl(IO_ADDRESS(SPCR_ADDR));; p/ ]) q0 z8 s* K  g, ^
  printk("temp=%x\n",temp);
* K% ?0 h4 m+ h' p4 r3 ^  udelay(100);
3 e$ z6 F1 w6 O8 j% C% G: x0 }! w% |3 u& x
  //set GPIO direction5 g/ A! F5 t  m% w; G
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ @9 {$ [8 ], T/ \   temp = temp | 0x00000100;//EPR----input
+ U+ Z3 H, e; u4 H* B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output# ~7 O6 H" X7 u+ W
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 ~; ~4 g, ~' v  Q! z. \

3 E+ }) D5 _$ p& C' @8 K( H   return 0;
9 D' T" H( y) U' c0 c* e}
6 E# l8 Y8 _7 l" nstatic void __exit MCBSP_exit(void)
, I/ j* g4 B* g) i{
5 I2 x/ o! r+ ^4 p4 O9 L   printk("mcbsp chrdev exit!\n");
: N, _2 \$ W8 |: Q1 r. R& ]& I   cdev_del(mcbsp_cdev);
0 X( o1 C& G% f  R  v   unregister_chrdev_region(mcbsp_dev,count);. d0 m5 r4 [- z7 V3 ]8 T
   device_destroy(mcbsp_class,mcbsp_dev);
" N; h- \( q. w   class_destroy(mcbsp_class);
: z; B" K# i) c7 \}9 B' e5 e7 f  v/ r
module_init(MCBSP_init);( w: c! y4 E: B3 H) R  O
module_exit(MCBSP_exit);
( p7 y* d$ Q) a  _( M- g2 g0 H. Y
MODULE_LICENSE("GPL");. x% D- d3 E$ J& j4 P' Q
! P& S1 i+ m$ G- I  k- |6 {& u$ t
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! X" |$ l& T. |2 L2 U. V2 u
我的应用层的测试程序如下. a# n# A: v3 i4 Y
#include <stdio.h>
# B+ h2 |3 q- X, j- m% [8 }#include <string.h>- e" _3 `, K* F- r9 e
#include <fcntl.h>+ f- o' }! c1 \& N9 m
#include <unistd.h>4 w6 J5 t/ \% T: Y% H) p
#include <signal.h>8 Q+ j1 g, ~3 f4 Y+ T
#include <pthread.h>       //线程
8 X) K" S2 }1 E1 l- q" r, y#include <stdlib.h>
! A# v* M8 c  H; w2 E#include <pcap.h>          //捕获网口数据
/ y! k; C2 ~% Y9 H#include <semaphore.h>     //信号5 O5 f$ H! u9 c7 k0 `
#include <sys/types.h>     //消息对列
% N9 G5 L& J3 `1 d! U' d#include <sys/ipc.h>       //消息队列0 h/ Q/ O5 G% `+ A  e
#include <sys/msg.h>       //消息队列6 J* g2 P; d& j9 r/ F
#include <sys/select.h>* K( q/ I$ s9 D  f  n  z
#include <sys/syscall.h>
3 X4 K' d! ]4 u#include <sys/stat.h>
+ I. K5 e. A& L" C" @  N' w#include <sys/mman.h>% _0 N% D- Z7 {! r# `+ O
#define msleep(x) usleep(1000*x)# p1 U9 w6 ~/ w" t4 y+ O( e
& l$ k, c1 L9 m( U
int main()
" ?; c& D1 H* T; g9 v+ I{
$ l* g' w* l2 y- y  @    //MCBSP,ARM与AMBE2000交互设备
1 C/ W+ G& b- m; [+ X$ _ int fd;! u) j6 Y; c2 m* [- A& [
unsigned short data_write = 0x5555;
+ i8 X- }" u- ]: x# s6 T unsigned short data_read = 0x00;
0 A! U% j* [' a  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
% O3 ~/ J( P' w3 Z$ [( h& C //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) A# z; |. y3 o    . t0 Y. W6 {% c5 h4 t% S
  if(fd < 0)
1 P" b9 [: c6 L# l* h  {' h; t  |1 ^" Q0 r
     perror("open failed\n");
; o4 s& f2 }( i' f7 @, }- R     return -1;. u! w4 [0 g6 G6 A8 _
  }
; J& K% t) c: I: ~9 T  ! |/ l$ u- c( p0 ]+ a" Y
  while(1)
5 R( X, ?) [8 k3 G3 ^4 U7 @8 B4 J  {4 k/ |1 k8 Z. J# T  r2 X& |, `
   
+ b6 ^& @/ k9 B6 o. A$ o& }, v   //AMBE2000每次读写是24个字为一帧
# J0 K) D" \2 V, x. M   //写数据时将数据在底层存储起来,等到中断的时候再发送
) ^. i5 y" ^) X; s   //AMBE2000输入数据是以0x13EC开头的
3 `. m& _' v5 i% p1 X8 E   write(fd,&data_write,sizeof(unsigned short));
. v! M* h; ~7 T   2 d' I. c1 Q- @( o0 b
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
( k9 ]/ B. a% Y% f   read(fd,&data_read,sizeof(unsigned short));  {  w1 x+ ]1 g  m/ \5 c
   1 v% p; T" e/ L! b2 Y
   if(data_read == 0x13Ec)
/ b+ a1 Q- y5 v2 F, s   {4 h6 l0 k' G3 ^* V
   
' m# K7 V, C$ }. J" o& y: w& L7 y$ b    printf("data_read = %x\n",data_read);. }8 d5 t- u/ [" o) }: v
   }
* s  X4 Q8 z0 e& \# R4 x3 X& Y   
" B+ T0 T# \3 L' _3 S8 U9 J  S   msleep(10);
. V- |  P5 B! u0 ^5 k% Y  , t# F9 q5 s; o/ r( M% ~8 ?7 ~; ^) e! m
  /*+ ~* X  \' F. t# O# k; o
   ioctl(fd,1);   7 x/ s3 v& N% }, f) \
sleep(1);% E$ w" E; _9 p& {6 f8 M+ y% ~
ioctl(fd,0);
3 Y: o: \: P) ^% W' C9 X sleep(1);
# S: M7 [: y0 ] */
& j; p7 e4 _; _8 o- h  }   
0 @+ ?$ v) T# f7 D8 o- M, k- g return 0;8 I4 w: n- J/ E! f& r
) `2 n/ Y7 U; f
}
+ a* V! Y" O- U/ B- p! _" ~* z7 q' O5 ?# `. \3 ]
多谢各位指教,谢谢! 急
: d. K% ~' d, h5 `7 Q& l
2 m/ G1 ^! o- @; a4 s
% R, H) h' ]. M5 z) G  _0 U1 c: c
- X$ w! j( H4 \. `7 @' \; l0 I
& Y6 F  `" p( v+ T& }+ z2 l2 _6 z: I7 ~. B, J7 s% S% z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 13:41 , Processed in 0.040338 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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