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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 b3 Z! p* b; S1 y9 @/*  y+ H8 U1 {5 X0 U
* Copyright (C) 2009 Texas Instruments Inc
8 h& d& v' k  D9 ] *3 x9 y. h0 ^( Y1 \  e. F
* This program is free software; you can redistribute it and/or modify0 N; S: g9 a9 f6 e$ P
* it under the terms of the GNU General Public License as published by) u1 ^5 I- U8 P& v9 s
* the Free Software Foundation; either version 2 of the License, or' H0 W, C0 l. l6 M0 w
* (at your option)any later version., Z. s9 \4 X) h; {, L* a- C& @/ ]
*. k7 m# p! A; w, w- B& V) G6 x
* This program is distributed in the hope that it will be useful,- M! G9 Z* @: {. j% {% X+ V
* but WITHOUT ANY WARRANTY; without even the implied warranty of0 Z$ f9 r! e9 G0 _: y) p, b* O3 D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 q- g9 D6 Y9 b7 Z9 z/ R/ b
* GNU General Public License for more details.
  `/ X7 I+ `! B' m# L *
, O2 n* l$ t- ^; M6 q3 D9 ~+ ~ * You should have received a copy of the GNU General Public License
/ a2 M& _. t$ ?! t- p7 p9 D * along with this program; if not, write to the Free Software5 r: F$ @$ w" F
* Foundati: T" F' e7 t1 F5 Y4 v8 L" a
*/7 l4 U9 ~# f' r2 I: M- Z
#include <linux/module.h>* }2 J+ O* ]6 k' |
#include <linux/init.h>
) {( @2 O- P% d5 Q#include <linux/errno.h>" M  k5 M) P# J7 H; h
#include <linux/types.h>
! z7 h0 b3 K! v. B#include <linux/interrupt.h>
9 J" E0 k4 O+ M8 X- X# F#include <linux/io.h>
9 Q3 J1 Y$ o: C; [! B#include <linux/sysctl.h># H- G% j* s* o4 _  j
#include <linux/mm.h>
" c! V2 V! l. f2 a#include <linux/delay.h>! n$ w9 f: V9 u6 d4 d2 S" D; _
#include<linux/kernel.h>
& l5 ?! b" R- [7 J& y4 ~( o#include<linux/fs.h>
2 [, y; k3 ]4 Z. A. {8 X2 o& `% t#include<linux/ioctl.h>
6 f( G% {; k* H#include<linux/cdev.h>+ \( X7 p: F9 s
#include<linux/kdev_t.h>, j: D2 n4 C( K) l
#include<linux/gpio.h>
) M, u) S! F) d0 c#include <mach/hardware.h>
9 A1 P6 A; f7 r/ U% {. }#include <mach/irqs.h>
$ e) G) @2 U* E" v* o+ Q9 R+ K  B3 j6 a9 D1 y$ L
#include <asm/mach-types.h>
9 j+ J; b, J7 D& h" o& w#include <asm/mach/arch.h>
6 d1 p. u6 K& }5 A/ G: D#include <mach/da8xx.h>- I. v' T: R5 X' S
#define  SYSCFG_BASE   0x01c14000
) X: C2 j7 X: _! h#define  PINMUX1_OFFSET   0x124 7 M: N1 }$ `" h4 Y: w
#define  PINMUX18_OFFSET  0x168 - a) d7 h! j- X1 U$ ~- T7 o
#define  PINMUX19_OFFSET  0x16c7 L7 C! ?" R% O2 E/ s+ @# I4 U
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
7 z  ?) t" e; A  S' O#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 v+ K' e  d6 h+ a# P( X5 K#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( J; @$ ^6 T2 x4 x; Z; N#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' }8 l0 ^6 l. N3 k8 ~; V* {#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR- B- C; V  ~" Z% }# S, L
                            % J3 F- i  e: @+ @1 z" L
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
5 j' e( e9 U9 Z. N; l#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) M- z" C  f1 R) f/ i* f- ?% B//PSC( |( x- g0 Z6 W& N
#define  PTCMD_ADDR   0x01E27120  
) t4 X5 N3 h/ d( h) H, c#define  MDCTL15_ADDR 0x01E27A3C+ q" |9 L& T1 h
#define  PDCTL1_ADDR  0x01E27304/ |9 E! z+ p$ T9 |* N
//GPIO8 direction
0 D$ o$ g# |" E. l* U  m8 h+ ]#define GPIO8_DIRECT  0x01E260B0
/ s7 b! U0 f7 ~$ e" O#define GPIO8_OUT     0x01E260B4. P0 Y/ s6 M  Z. @
#define GPIO8_IN     0x01E260C0
- N2 g7 D. b6 p0 D0 S2 t1 F! T
  D, \; z& x  }" B//#define MCBSP1_RINT    99              . v' _2 `; T- k1 r7 V0 ~) A2 [2 M/ x
//#define MCBSP1_XINT    100  
0 [% |6 x" t4 Z/ y7 U# xstatic int MCBSP_MAJOR=239;1 M, d: ^5 e9 s0 X3 b( X" y6 a
static int MCBSP_MINOR=0;/ w' V: k% f0 I
static int count =1;
* y" m7 {' G( G$ N. F" ]4 g6 t; C  H2 }/ R, Z) G( X  m6 X* Y, v
#define MCBSP_NAME  "MCBSP-device"# q( {6 v/ k, J3 ]5 k$ a

; d9 p7 q/ ^; H7 M$ ?1 d' hstatic struct cdev *mcbsp_cdev;
  S3 u3 ]; x7 S$ i5 sstatic struct class *mcbsp_class;
, T+ W3 b0 L' @  rstatic dev_t mcbsp_dev;
' U5 Q  K. h+ Zunsigned int DRR_data;$ j3 @) ?1 f' S0 w8 R  ]
unsigned int DXR_data;* s, o7 Q# P9 d5 t+ S0 ~( M
static int mcbsp_open(struct inode *inode,struct file *file)1 g. a9 _! B0 n. W
{
9 n' a/ m! ?  ^: @* q   : }; y2 L: }- }7 ~/ \6 l* N
   //interrupt enable,initialized# b2 D& @" `; l! m
   unsigned int temp;
$ J4 v5 Y, i5 ], C! H; A   //SLEEP_EN(GPIO8[10])---02 V( Y. r! o/ d+ {# N8 m
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. p$ n2 A' k  S2 C( H
   temp=temp&(~0x00000400);
" u4 K& Q% i0 Z6 s, i: C1 x. h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! r: e  I9 D% ~  u) y$ F  //RESETn(GPIO8[8])----0----1, @2 e& Z% r8 {
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ {* a* T* u, F$ C% W   temp=temp&(~0x00000100);
7 ^6 L$ X- x5 ^: A6 M8 i4 x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( j/ M! A9 V5 r0 W( m1 H( h   udelay(100);' g3 U0 v( |. k' f/ W
   temp=temp| 0x00000100;
7 N: m. _4 ]+ p. G1 c. O  z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 w7 ?5 |0 [7 o4 ]9 R" U
   udelay(100);  ?! r* B: B' H1 C( g. e
   printk("open success!\n");  ]2 V: F/ ]: ]9 @$ Q
   return 0;
; Z5 c. I) U# Z; h5 k}
# Q3 O7 ]8 ^4 B& s6 Y
) j; v; x* l/ M; }% T. E0 vstatic int mcbsp_release(struct inode *inode,struct file *file)3 P$ g9 V. b% S8 j4 ?8 g6 h
{
" J9 H1 {! Z* C* ?) f- @   printk("release success!\n");
7 n9 a  R* |- |/ {4 _5 n2 I   return 0;
* v9 f5 O5 x. {% M( y. n3 Y' m6 i}8 q+ c1 J# S2 a; `3 |# \2 x
0 v4 m, K4 K  P6 m9 N
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)7 C  V2 w( B9 c" [" [
{
& }" [5 a) q& J, N: \: V- ?* G    copy_from_user(&DXR_data,buf,len);, u8 m& V9 }+ G$ s8 c
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
9 I2 b( H% [9 S* f% \    return 0;
4 b/ m3 @, c, X7 O9 Y$ q
) M. j  n) b& e4 w}
  ^$ x6 l* a+ L" G
+ S8 B) q( l4 ^static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
+ J6 Z% T! P9 }. v$ o8 P+ T{ - |# G& z# X6 ^& @+ E1 E
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; h2 O0 a6 e. F   copy_to_user(buf,&DRR_data,len); 9 K: b5 V* p# U7 Q$ @9 p
   return 0;8 p4 n0 z0 I% j4 f
}
- O( b- k; [/ u( P# w0 y* j0 U  w1 \2 W

: J/ g# n: m7 G" ^2 ?2 \( \static struct  file_operations mcbsp_fops=, f8 H2 M1 C1 c. ~8 R
{, h. e% O5 L# w' J  w/ t: }
   .owner=THIS_MODULE,
) b% l- }  q' r6 r: g   .open=mcbsp_open,8 U. d) h: q0 q9 ^1 ?4 n9 B
   .release=mcbsp_release,
8 A6 J2 T% T/ D; @  [- ^8 d1 J0 h   .write=mcbsp_write,
3 ^) P7 m( ^" U8 @/ h. C0 E   .read=mcbsp_read,2 l- w4 C3 v* I4 ^
};9 V; l- _& n9 f1 x) Q2 [6 d! I
static int __init MCBSP_init(void)
7 |5 h- N2 `3 _' P5 U{
4 s# N3 d: d- X9 o& Q1 `   int ret;
9 M# y* L+ X% R5 p( g   unsigned  int   PINMUX1_REG_old;
! [/ [  T- i& k% b   unsigned  int   PINMUX18_REG_old;
" ^+ U; v( M" W1 k   unsigned  int   PINMUX19_REG_old;
* m; e9 R& f& ^, U: A; J$ J  Q   unsigned  int   temp;  
$ V7 H9 y3 @! K   if(MCBSP_MAJOR)  T) O# G  C& _6 A; l9 w! l  r6 H
   {
5 g  v- n: M' `. J: W      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 J* o/ l/ F) @
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
. C. R7 @4 q9 R   }
: K. ~3 t* y; H* P/ C   else% r+ y- S+ L) m) R2 k1 H
   {
! M; B9 }0 m7 z/ p" L% x6 f3 L      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);* X0 ]; p0 J' G3 @+ K* N
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
4 N! ]0 R+ n- J6 `   }) |* t6 H" e% X4 w) @
   ) ]8 T& J! X; }2 V' B6 T/ k* Z
   if(ret<0)4 `  r/ [9 j. d
   {* s! X8 p$ o( S- o- A; [
      printk(KERN_ERR "register chrdev fail!");
+ U2 q: l4 u: N- ~      return -1;" z& a0 Q* l8 p: D3 H% G' P
   }9 f" A  v% L% ]. h& \4 S" f5 S
   - L. R  E7 M- K' I
   mcbsp_cdev=cdev_alloc();: `- ~0 [8 T3 l; V
   4 [9 N. e' a1 }" {& c9 |
   if(mcbsp_cdev!=NULL)
8 H6 [2 K. m* l- [   {
) C9 [2 z9 O( F7 [! ]6 S2 `      cdev_init(mcbsp_cdev,&mcbsp_fops);. j9 m4 \0 f- b9 g: n) ?, _# Z
      mcbsp_cdev->ops=&mcbsp_fops;
" ?; G& R1 {. a' [4 d      mcbsp_cdev->owner=THIS_MODULE;
7 |9 M( b) i- C9 l( v5 c      2 Q- f1 Z# W1 V, G9 v+ j2 W( w
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ u7 ^0 w2 \# X" {( I
          printk(KERN_ERR "register cdev fail!");# V3 O4 e  p! x- Z/ z! c" ?
      else) }4 B9 I: Y3 f1 [2 Z; ]
          printk(KERN_ERR "register success!\n");- x- x/ l& ~/ ?2 n
   }
$ ]( A! K5 Z* w- t* h5 Q+ r" t5 z   else
$ p+ {' i1 t% @0 ^2 X   {4 i0 D3 V$ X9 p) U6 g* y( v5 ]
      printk(KERN_ERR "register cdev err!");7 ?* ]# B6 b& a7 X  V
      return -1;: Q( g9 a0 V- }
   }: ^- Q! X5 |* x4 S4 Y( y$ g+ b3 N' R
   
* d6 ]3 n+ ]" |: g: C, i  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 h* w% F+ K9 f7 S
   if(IS_ERR(mcbsp_class))
1 F, f' d1 }6 r: Z& O, J6 R1 `   {) U$ h9 O2 S  R9 j5 {! P, p5 n9 F
      printk(KERN_ERR "register class err!");- O8 Y3 F+ P1 |: r
   return -1;  R+ V; a+ h2 \/ C& h. C3 q7 @5 A
   }) j* Q" S# w! g& U4 }
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);  Z. O" B  y0 B( O7 w
+ r2 A; n7 _6 p( {* A' I
   //PSC9 r" u+ r+ ?  l6 k; A
   //add Enable MCBSP
1 m/ f. {( G' @$ O" x! U   //test. y& u' z! D$ x/ g, Z+ r! m
   temp = 0x80000003;/ H- k5 C- y* k) Z+ G* F
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* ~( G7 p  q6 I% v) ?   temp = 0x00000003;
6 i8 B6 w& {6 |1 `   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, ]# x7 U5 C3 O4 B+ `$ c
" u! P: N5 c: j! O# r4 i   temp = 0x001FF201;6 W' G, {/ P; Y% q+ y
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; T' J' x2 p; L: {  p3 e+ r
   
7 Q9 r% p& `0 s- z1 c   //PINMUX  : A, V: z: H6 G, x# ]* D( y( k
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 O9 |( {2 C  R9 A' ]9 V4 _   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 g+ R* ]# p  ?# U9 W
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
' X( X# a2 K8 q' [9 f( _   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' o5 J3 U6 V+ w0 W( w/ _: ^   
6 Z5 g  _( Y* R   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; Q$ v8 ]( _4 }! |   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % L& ^3 }( Q% w* T- _& w
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
2 @+ p! }: V$ N1 ?+ [   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# s- W. J  A# l% a
! z6 X% K3 K, G& E   //RESETn,L138_SHK2
: w$ E7 Q% o" u   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  5 l) b% c1 o  P1 U4 e! X/ N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ( U# |- S4 y) k# m
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 [3 @  z/ y; Y4 U+ J# [  X5 K, X
1 d* `9 C" b0 X6 d3 L

' M& M$ v5 D. @8 N! s9 C  //SPCR Register8 n" t* Y$ x$ o* F' S
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; {5 ~. g* D# b- z, B  R! l+ I5 N9 Z( T  temp = 0x03000000;//(DLB=0)
6 z; ]- m$ L- [( h  \ // temp = 0x03008000;//(DLB=1)
0 Z4 ^) c& s! V' q' M, ?: e: s. o  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset7 a, L, ]( f7 k( L/ X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 X# ]& @6 x2 g3 I4 }( \# {  printk("temp=%x\n",temp);0 m$ k+ n. v5 D( ~- {5 O- i
+ g3 W3 x# B* X7 J1 l5 r
   //PCR Register1 K( B% N. ^. p4 n
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( l4 O; }, w8 B, C* \1 ~  // temp = 0x00000F0F;0 Z! m2 b! M& H+ ?
  temp = 0x00000B0F;
# k6 z( r. }( n. l2 g$ ]+ @( }/ g  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ! l" @  y1 L3 d9 x& {4 Q; f8 K
  temp = readl(IO_ADDRESS(PCR_ADDR));
- w  F/ P4 g* V& P3 y6 N  printk("temp=%x\n",temp);  - {7 H+ I$ y* c+ P: F
   //SRGR Register- i3 U  i2 X  c3 H6 j
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
3 o% q: Y! I7 W9 A9 K //temp = 0x301F000B;
5 @! j& ^( A0 x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 ~" s1 E0 e. ]7 G/ K" I, v; ?  temp = readl(IO_ADDRESS(SRGR_ADDR));
) ~$ v+ e) v" X+ a  printk("temp=%x\n",temp);- T+ q  g2 a& ?: s6 ~
   //RCR
8 D+ P+ m0 O5 ~$ C% y' H   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' s$ I' w# J& e9 {- R
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0  x8 t! M* l4 q& ?
   temp = 0x00440040;; `2 f, a- _( o6 A+ B
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
; m' s, X" C8 e% B; u% q   temp = readl(IO_ADDRESS(RCR_ADDR));& D  U% D1 K" ]0 \+ `
   printk("temp=%x\n",temp);6 c  P0 k- k1 ]- |3 L& @
   //XCR& D# M8 L4 B8 E9 U: D: [! N/ y4 f
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* {: o: O0 O- ~- D0 k2 y7 k   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' z- {& }+ U0 b' L
   temp = 0x00440040;
* O/ M# L6 M7 a0 n$ R+ j   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   , p2 r/ s1 R0 w7 ?4 _- l6 L
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ S) h- A0 Y% }3 S8 ~' Z   printk("temp=%x\n",temp);
7 J9 V9 h- G2 \6 e, p( q9 O  udelay(100);
: E' q, o6 F7 z6 x3 F5 L6 b  //SPCR Register
* H9 v! M! H1 i6 e8 B: |2 p  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ I( U5 |" \8 a6 ]6 S  temp = 0x03C10001;   //DLB = 0 VS DLB = 12 A9 p4 i$ u, K. l; [4 Q: `, u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
; O+ r' ^" u: y! U% X  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ a3 M% o4 V& M; ^& O+ R) D4 O4 e: X  printk("temp=%x\n",temp);, O! ?& `5 J' ~/ l: A
  udelay(100);
" }; i1 w0 E7 P8 U/ @, A6 q1 T
8 _4 H/ ]' n/ a. \  //set GPIO direction' T2 X" b1 q/ c5 Z5 O* E
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 ?& ]  b$ `( O& p0 r. Z; T   temp = temp | 0x00000100;//EPR----input8 p4 F9 p0 S$ u; w+ \; v
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
+ S1 x. X( N" q9 |/ t   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 k. f4 [) w$ V! ~2 p
, x$ g/ k$ b( R$ r- n8 O
   return 0;
% v# O6 z7 ?' c- O}7 c2 H9 U7 f4 J/ {. t
static void __exit MCBSP_exit(void), B9 K( N+ g  ]" b" y# Z9 [
{) p& r! S# z" U0 V9 L7 L
   printk("mcbsp chrdev exit!\n");2 s1 x- V, J; K5 ~
   cdev_del(mcbsp_cdev);
, }9 |* Q$ u4 i5 u   unregister_chrdev_region(mcbsp_dev,count);
% t2 _6 z- ?8 d1 G   device_destroy(mcbsp_class,mcbsp_dev);
7 ^; ?* e- `. }  E4 L   class_destroy(mcbsp_class);
. A8 D* o; Q/ O( ?}
: E. l7 K- P' @$ k' _module_init(MCBSP_init);
6 L4 j2 E, N6 `1 X* Zmodule_exit(MCBSP_exit);
5 t, W" ~; U2 t  q, n% w- `- G. ]
7 g& X; n3 E  l' g( f, [, g! E  ?MODULE_LICENSE("GPL");
, d( E/ G5 }, D% u) v! b. H" i
4 b" `; Z! ?$ p4 o- `我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 P" [1 P6 q8 K7 {, Z7 a我的应用层的测试程序如下
" x) b- G+ H3 U  Z8 ^0 ^#include <stdio.h>( Y7 V! \& f4 ~" t. v! ]* i6 p. W- H
#include <string.h>
# f3 g( Y' p+ k* C#include <fcntl.h>
) H7 ~  w- Q1 l2 v0 }( z$ \#include <unistd.h>
4 U. y7 v1 F8 ?% S+ S+ w- ^; Y#include <signal.h>" |' I: D3 ^6 M  l: j! K; G
#include <pthread.h>       //线程
) h2 Y9 M. N1 V# t, o2 c- w#include <stdlib.h>
( V0 M6 C) Y* F6 l/ c#include <pcap.h>          //捕获网口数据% H9 u7 v' n' ~! f& X
#include <semaphore.h>     //信号
8 }) e. L# {1 [9 S# [, g#include <sys/types.h>     //消息对列
  M0 }. N9 J! f( b8 ?2 i  Q! i#include <sys/ipc.h>       //消息队列; k, y. t6 D' Z! R1 W
#include <sys/msg.h>       //消息队列. [% B' K" N% d6 _
#include <sys/select.h>
, V/ z, r' K3 ]. _#include <sys/syscall.h>
  a! j; t& Y+ R! }#include <sys/stat.h>
9 O4 L' U: V  U! f$ o#include <sys/mman.h>
9 {1 v# `  r1 ~#define msleep(x) usleep(1000*x)
/ @0 D6 l. P8 M4 j- @5 l9 _, L' d. ?, p7 Y7 X. N+ L" T
int main()/ @- q5 r# u: N( _0 P$ a8 _
{ 7 {- s- d( H: |! g' A
    //MCBSP,ARM与AMBE2000交互设备+ d3 f; h! ?) m, ?0 q& q& B
int fd;1 T: K/ N! H8 i, \
unsigned short data_write = 0x5555;
' S) f2 o3 {& v9 \8 u& a unsigned short data_read = 0x00;
9 `) O. [0 h+ b  m  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
& U; b" G+ j  O5 {4 q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& m$ F! ]9 L6 M) r$ J: l9 ?
    / {) {+ c) ~4 u1 D
  if(fd < 0)+ j, N+ Y) ^* x- v4 K$ [. K; t7 r
  {
0 l( M/ t4 V% y     perror("open failed\n");
4 I, G" [% ?" |0 E+ {     return -1;; a0 [0 K8 p% g  o8 r3 U
  }3 t: ~& h3 J0 T4 K1 r: C
  ( u$ v, @( H3 j6 ?( ?9 _
  while(1)
% o/ O- ?- Q3 t  {' j6 u$ E7 z6 ~) |) ]' h5 s1 x4 E
   6 ~" h& {3 E( A$ J! q
   //AMBE2000每次读写是24个字为一帧0 ?, b! }* r  V+ g: f* V% |$ B: J
   //写数据时将数据在底层存储起来,等到中断的时候再发送, J  @/ F4 e/ d, R
   //AMBE2000输入数据是以0x13EC开头的
5 Y8 Y. s6 A! K& e9 ?   write(fd,&data_write,sizeof(unsigned short));. N5 V4 I. d+ h4 ~$ F+ m
   ) R" G- t* u# X, i7 w' A$ T4 n
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 B; c* A1 i2 i# c6 m+ @6 O
   read(fd,&data_read,sizeof(unsigned short));; X* z4 z, R# c
   4 g6 b$ \0 z, R4 C1 B1 |
   if(data_read == 0x13Ec)% P6 U! g& Y8 D+ `; }" B4 [
   {
' k" B% c6 k+ ?5 B  ]   ! S! K; c3 q. u0 O7 |. A$ o: v
    printf("data_read = %x\n",data_read);
+ x. g% f0 p% O3 f6 a: e   }
  d7 I" a0 W+ u   
  u2 p  v) Z3 \! n. d1 [& l: |   msleep(10);
" S  D! Y: K6 z2 X8 l8 {: I/ r7 Y  
5 B, p' y5 ?/ t/ V0 L- T  /*1 ]/ F* }$ l# b5 D
   ioctl(fd,1);   
' ^2 L& s2 O! {8 d/ h/ ]- j/ O  t  Y sleep(1);
! G" a" p( I7 v2 f' R4 E ioctl(fd,0);+ t$ D2 M9 v8 h) {: Y4 p
sleep(1);
  o/ I7 j7 h, _& _8 ]7 N' E2 X3 j */ % C( y' ~: m/ y0 k; ]+ [/ T
  }   8 X* x; y0 H2 p  a3 ]1 B
return 0;  z# }0 M- C" O

7 d, }* ?& {* I}
: N9 W7 Z9 V3 ^9 o) `& K6 G# s4 p( f' n( I; t7 q
多谢各位指教,谢谢! 急
( L! R, n- S; Q  F% m% U' E6 Y. r; r* Z5 v% p

/ s2 r* Y5 ]3 `  W/ H1 O5 x& H. x
+ C# M8 ^, K/ V2 [" Z- `# }+ U3 v( T0 D% d% I& C, x8 H

# w6 k$ h8 D6 r$ o; _+ x1 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 02:32 , Processed in 0.054595 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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