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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * p/ }. m/ P/ w! }4 i
/*
2 {) b- x; m% l+ O% m6 I * Copyright (C) 2009 Texas Instruments Inc# ]* k; ?; t8 ?# j: h! x. C
*
% W. ]. L; u4 N$ E# b# R* G * This program is free software; you can redistribute it and/or modify
( n2 T" g+ G! p * it under the terms of the GNU General Public License as published by% ]: \6 q  Q  N  n3 |) k
* the Free Software Foundation; either version 2 of the License, or  Q7 K8 O6 U, g& R
* (at your option)any later version.
5 ?; S# K/ P! \& i" b" N3 J *
0 _" g& Q' u$ B8 F3 y, E# @ * This program is distributed in the hope that it will be useful,
5 d" I* W  ]4 Z- I5 C * but WITHOUT ANY WARRANTY; without even the implied warranty of
1 ^: T/ ]5 T: B4 N  B- U * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 u) Q( w  N  }! N6 h/ _ * GNU General Public License for more details.
5 K8 }* x+ z+ k% W *% S# x7 q5 J/ _, @4 B
* You should have received a copy of the GNU General Public License
* y- k- ~* n6 } * along with this program; if not, write to the Free Software
7 K  o$ P/ d: ^+ F0 h7 a * Foundati3 u& H6 U' ~0 I( ]' g
*/8 s- z3 i: b' N$ P9 K
#include <linux/module.h>$ n+ ]6 M, A2 W3 b$ A
#include <linux/init.h>4 n! z" m( X% ^/ ^
#include <linux/errno.h>6 R! h( f. W' @9 z7 ]) ~
#include <linux/types.h>% n6 {4 \( \, g6 O, j) `
#include <linux/interrupt.h>9 ]! x: }  e7 ]% i$ \7 ~* h
#include <linux/io.h>/ ]* t9 N7 E! ^" j3 R
#include <linux/sysctl.h>: I' `' F9 s+ T) U
#include <linux/mm.h>/ {& ]7 g! D0 p9 U. I; I: a
#include <linux/delay.h>
2 K$ [7 C& N$ A8 ]8 x, B! [4 M8 B#include<linux/kernel.h>
/ L7 v. {% ]5 f' B#include<linux/fs.h>( i% p( C4 y" ^5 o& ]# _* R
#include<linux/ioctl.h>
0 u( V3 I, J0 l+ j# `6 }#include<linux/cdev.h>
  ]# ?/ t9 N* ?4 v+ {  n' R- c! }#include<linux/kdev_t.h>
9 t' B+ ?3 ^! d( \+ [. S: [, [#include<linux/gpio.h>
, f) p& y5 h" N2 _#include <mach/hardware.h>
- O& R% t$ h$ T7 c#include <mach/irqs.h>
/ w: c+ Y- k5 I0 c# c, X6 X5 F+ V4 ?" h+ v
#include <asm/mach-types.h>
2 X. [. z0 I) {0 ?#include <asm/mach/arch.h>
/ |) u; b! E3 z' a3 P' o) b6 o#include <mach/da8xx.h>
* V7 B1 w9 @- w" U, Y3 K) r#define  SYSCFG_BASE   0x01c14000
  o; T! d6 \9 M) b#define  PINMUX1_OFFSET   0x124
; m& K/ ~  G& D# ?8 l#define  PINMUX18_OFFSET  0x168
, d/ C5 {- ?' X' P#define  PINMUX19_OFFSET  0x16c( R6 t' |3 s. d) L* _. M, m6 A
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) r" t$ D% S) y1 I1 b; n1 w#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR8 C, E5 W5 }4 a6 G0 E! F$ L& z2 w
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
3 ?5 c- o) e( _7 ?. B/ D! {#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 j5 ^6 _' U' Q1 l
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR7 E/ [( e# b- u) G+ f: x) ?
                            : F' v5 Q6 z6 {9 g
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 F$ Y3 o2 K4 s. Q2 I8 f#define DRR_ADDR      0x01D11000  //MCBSP1_DRR8 ^3 D( e' `" U
//PSC
# \3 A5 M* U1 q' @. z" o#define  PTCMD_ADDR   0x01E27120  & f7 S1 K! k2 M. p, R& `; e5 U
#define  MDCTL15_ADDR 0x01E27A3C5 }; y( a! b- z6 b6 u
#define  PDCTL1_ADDR  0x01E27304
& o1 E8 g9 z1 [" e3 w2 `6 r//GPIO8 direction( _1 X  ?* r6 t) Q! y% m. P7 }
#define GPIO8_DIRECT  0x01E260B0) ]& V2 h, w3 @  [7 _/ a
#define GPIO8_OUT     0x01E260B4- a) S9 N$ N5 b  [6 }' ]  ]/ X" v
#define GPIO8_IN     0x01E260C0% V0 E  D! ?! u1 B

7 H+ }3 n0 P! p//#define MCBSP1_RINT    99              
* y1 r! k6 @1 d6 T# c9 o" i' Q$ \//#define MCBSP1_XINT    100  ( |" a* F; p2 k7 C- d9 c
static int MCBSP_MAJOR=239;& a8 h$ E6 V6 r5 b
static int MCBSP_MINOR=0;% M, j0 S9 R, p' a5 y
static int count =1;# i, s+ o! f! H' \  }3 a
( [% v% l) _/ j8 h
#define MCBSP_NAME  "MCBSP-device"0 W, W% {( i( s1 c0 G
% y' n- }9 t6 G3 t# g2 Y3 q
static struct cdev *mcbsp_cdev;+ Q: u& }# n6 m, C  J
static struct class *mcbsp_class;# p! h. a* {1 l, M& C  B
static dev_t mcbsp_dev;
( b& [' F. ]9 W+ M: qunsigned int DRR_data;4 w+ n# J, E: q$ S8 u" `+ H, s
unsigned int DXR_data;
1 [# E" q+ ~. m" ~% Fstatic int mcbsp_open(struct inode *inode,struct file *file)* f0 q8 R+ L2 R; f7 P" k2 |
{! D" y) O& k5 l  f# f2 A! V
   " Y3 \) g$ k* r$ U( S0 a* _4 v
   //interrupt enable,initialized# E1 ~: r0 M% v/ |+ x
   unsigned int temp;
5 g) t, O! o  i0 @& Z   //SLEEP_EN(GPIO8[10])---0! Z9 a* D" O0 u/ q7 J) z3 F; H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" a4 B, w2 \( G3 x
   temp=temp&(~0x00000400);) h- \- L5 M  {' d! U5 A5 ^
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& n$ `) l/ |3 S) \. G$ Y2 W
  //RESETn(GPIO8[8])----0----1
( o: n9 E0 o* D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, o$ E4 ?7 ?0 B! S  G
   temp=temp&(~0x00000100);% c( D' ]6 j) b$ v, m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- Q( f) ^4 B% E   udelay(100);
; X1 X' B( ~! Z/ f  i  u7 m& j   temp=temp| 0x00000100;
- i0 c) f' U8 U$ c& z- u; m) V. z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ H! {( K2 |% w' |+ l   udelay(100);
: a: G* b% W. @7 C: W& ]   printk("open success!\n");6 O* l( Q- h" A1 [) ~) g
   return 0;
1 P! g/ \; q# i6 F/ q; E  M" J& y! i}/ r) n2 X9 M% H! A9 P
: j! ?1 H. M( W/ o6 s/ h( K
static int mcbsp_release(struct inode *inode,struct file *file). B7 i" T( x2 A0 t
{
6 w# _  n9 e9 }/ m   printk("release success!\n");
" C" z. n$ o1 p6 H9 u/ w3 `. R4 @7 u; a   return 0;% z1 p/ @5 S/ I2 @4 ]8 E
}
) a! ~9 g% c4 g4 Q$ ?
( r8 m5 G% @; |) C3 u5 t( `8 Zstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
6 B) \! V$ _% B) f8 g4 z& k* \{
/ `6 `3 s- A0 f    copy_from_user(&DXR_data,buf,len);
: d' }) y; U( _3 W- k1 `& `$ s7 I2 ?    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
; [8 l' j/ J% U; r; p. Y( j9 A    return 0;
% B: ?" R$ b3 j& M/ y! L
: x# y) R" z$ w5 i9 a* @0 \, R}% x7 Y/ j: `4 g5 o  W

3 ^& K: Y' R8 ^5 Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 Z9 E: c- A# M{ - D+ g7 H# k7 y4 b: g* C% e, J5 O
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));. @2 c% I9 P/ u! ?
   copy_to_user(buf,&DRR_data,len);
* L( S5 ~' E# {9 q   return 0;3 K$ x; M7 M, D* Q' c6 K
}
8 C1 q. w: T" d, K: ?$ ], E- W4 L# m* |

; M, y! P2 \4 w4 X( Hstatic struct  file_operations mcbsp_fops=  ]- v. f7 G( A. y+ z% |: o
{
3 e' E& B  F2 V5 \1 M7 H) R   .owner=THIS_MODULE," B2 N9 y) b1 ?! [8 Y5 P+ r
   .open=mcbsp_open,  N5 N1 V( k4 i  r, V/ c, _6 J1 V; n
   .release=mcbsp_release,
' q! w, A# a9 a) T" G# \1 Z2 a   .write=mcbsp_write,4 ]2 I9 G! s; b. |5 g
   .read=mcbsp_read,
7 \/ W/ \: ^0 }, f7 R};1 X, R. V0 Z" x: m# ~
static int __init MCBSP_init(void)! Q5 i$ @3 ~1 W0 \
{0 f& w4 t9 E6 A2 |
   int ret;& M6 O) p: s# }' N7 R2 f
   unsigned  int   PINMUX1_REG_old;
4 o9 L/ L1 H( \& R# r   unsigned  int   PINMUX18_REG_old;
$ s; ]6 v7 N3 ]2 b* _   unsigned  int   PINMUX19_REG_old;
, S% {+ }- M3 \1 Z$ t( c" d6 w   unsigned  int   temp;  
0 O  n9 U! ^: J- v   if(MCBSP_MAJOR)
1 G# r! M; m& K7 l  m! k   {
& P- |' w9 h% S! f( o# T7 y      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);  O" ^" b8 G6 f8 V, `
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);0 z3 `" N0 A; p8 l- o6 M
   }2 I3 z$ b3 P. {& P
   else7 K' B1 ~- _0 h5 g
   {
4 e5 g$ d) F, `      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; a& r$ o7 C5 }) o$ r( R
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) `, ]+ \& M: F+ q- |
   }
- G. t9 s+ k5 I4 G3 P  G- W+ L3 p   " l' w. r' Q8 E5 H6 l+ N9 D. A
   if(ret<0)
8 R& f2 q; M! H* v" q+ X. [3 [   {! S# w: p& _$ o7 k7 {. W
      printk(KERN_ERR "register chrdev fail!");
$ d% z, E+ ^+ `( q" I      return -1;* v3 \( x1 w% v1 l  i7 }
   }
( k$ S* `, c% A   
  V$ v. o; ~$ D2 [, s7 F" y7 A+ m   mcbsp_cdev=cdev_alloc();
) {1 {+ h% O7 y$ }   
: q' S& F# r) p! H" v   if(mcbsp_cdev!=NULL)
8 o* X3 D) ^9 d7 k5 m& @! d4 C   {+ ~7 _2 O# \* x9 y$ U3 q1 _
      cdev_init(mcbsp_cdev,&mcbsp_fops);9 x5 w% G+ s, G5 S9 q! [
      mcbsp_cdev->ops=&mcbsp_fops;  D+ p$ A  [& i, a8 ^5 ^3 A) v) R
      mcbsp_cdev->owner=THIS_MODULE;7 ~; Z% ^2 T3 u4 w
      $ J, v  e+ w3 b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): ^3 @) c; @8 L8 B  C
          printk(KERN_ERR "register cdev fail!");+ y7 b# |* X% |4 Y$ b% q( {0 ?3 L
      else
3 r" a$ n# t5 a0 h0 Z          printk(KERN_ERR "register success!\n");% G* g# u8 T( M& F7 S7 j
   }) f& j3 c! Y' e+ K. f
   else; I4 h  I4 e; f. Z# _
   {
6 i1 L3 d2 r# O' b$ r4 `      printk(KERN_ERR "register cdev err!");
, O0 C/ B8 m- A$ C$ X. \      return -1;, Z0 i# _/ o, H+ O
   }4 b7 x/ u3 m( K6 q. k
   
' k+ ^5 J0 b5 n* ^6 U* r9 s# A  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ F. p2 \" @0 k! k
   if(IS_ERR(mcbsp_class))9 E0 R9 K# A; p1 {
   {
+ v8 j# {+ O& B+ n      printk(KERN_ERR "register class err!");
1 |/ j; m- j/ f1 L   return -1;
# t/ R0 E8 r1 T; D) [   }
4 h7 |) O) T0 b' w, ], K+ O   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, G) e+ I# D" _) t
. i2 v7 C3 w9 t& ^& c   //PSC6 E' N$ I2 x0 g3 x: p) F7 D
   //add Enable MCBSP
9 R+ X# a8 v5 v; d* y   //test
/ \5 ^+ m) q; t1 T$ M   temp = 0x80000003;7 X5 M' z4 G1 [$ V# y1 M) u
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& R' H+ e1 q/ r   temp = 0x00000003;
" {( E  `; b  h; u3 \, `9 E   writel(temp, IO_ADDRESS(PTCMD_ADDR));( c; F. [# {: w+ V; g
, {( [- @& m8 Y5 z$ D6 W# a
   temp = 0x001FF201;
2 x. c7 A7 N! ~% j* E1 u$ [3 C' o! V   writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 }- f- f& Y" _6 f. `$ Q
   
' ~# y- }1 o7 b& D; ^7 O7 e2 b   //PINMUX  
) \* o6 C7 ~% A! J$ E5 z   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( p% r8 q3 f# {, G! E
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
9 ]0 h/ w" N' r* S/ ]% x) V9 _. H   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
, M# P& O% o2 u6 f! X( q. k' I   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. W' S- B0 m4 ^: w
   $ J" _5 k& N  j3 \5 H
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
* N$ P7 c3 U6 y! M' M* X   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
( ~0 P( i" D' ^7 ^  n   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" c$ N' `/ o' @0 X& m( r+ y$ X0 b7 R   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; i2 N5 w5 `' c , R; g9 G" t  g0 V
   //RESETn,L138_SHK25 _3 q: |- Z3 A
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  6 b" y( i( p% q& ~9 ]
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
- C( J8 R6 e4 @2 l   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# Q1 R( `6 ]# E6 I" E
( `& K" g, M" X. r' a$ Q2 Z9 s6 }

4 F* c0 j8 Q2 n4 d  U- {6 Q  //SPCR Register
7 Q. f; d) x; X; M1 d7 x9 {$ p  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( S2 }3 x1 N$ y1 q( ]% K9 n  temp = 0x03000000;//(DLB=0)
* x0 d# t2 ?9 G) a // temp = 0x03008000;//(DLB=1)
; [! m0 X) K: V: [2 s. X6 D  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
* {: Z5 Q: ~2 I. y  temp = readl(IO_ADDRESS(SPCR_ADDR));8 K* `3 W/ J3 N% |' J: @
  printk("temp=%x\n",temp);# S) O  B/ _2 e. S) E
+ W1 l- \" r- i7 b. L- u
   //PCR Register5 [7 E/ G0 n! u! W
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 U( ^5 H/ E+ e! G
  // temp = 0x00000F0F;+ D1 }9 L5 T* Y* M& _
  temp = 0x00000B0F;
6 v# C9 w1 b8 o8 Q+ R- {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 0 G7 J8 a2 o& g0 w8 V
  temp = readl(IO_ADDRESS(PCR_ADDR));
$ W# L/ K% c6 v  printk("temp=%x\n",temp);  
) u* G* l# a; N% `; _2 V   //SRGR Register
) Q& `( h- P6 k3 E   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 o/ s. v4 M* g
//temp = 0x301F000B;
; y( P! Q4 p! z# {- T   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. s! a  y6 `- R9 l* \  temp = readl(IO_ADDRESS(SRGR_ADDR));* z3 p! |5 G1 \$ m/ H
  printk("temp=%x\n",temp);
6 L- M" W$ \6 k5 }$ z* |   //RCR
, Y8 l: l+ G3 F; B9 M" s   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, h0 E: M$ G$ y5 p7 O4 N2 y   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, I# ^; Q. x+ D/ O   temp = 0x00440040;
, c* c1 M/ ^$ r1 s8 V* v' k   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
- p& n! u* w9 ]4 ~3 Z9 B   temp = readl(IO_ADDRESS(RCR_ADDR));' S3 Y$ g  g) ]2 M1 H. V
   printk("temp=%x\n",temp);
  J+ b% h# k- [9 ?& ~; k  ?   //XCR
) g3 E% A1 n' N+ z2 s7 B8 w5 {   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% }6 R; W: W$ C1 K* R; Y  P
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" M; b$ \. |8 I: m1 a! u) X, Q( r+ G, w
   temp = 0x00440040;& f4 I* o5 o# x$ O
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 F0 T  g  {1 ~+ z4 y+ m
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ w) m9 y6 n7 m3 d. ?. R$ g   printk("temp=%x\n",temp);2 u# J" D* }7 [1 ~) s/ p
  udelay(100);: q" V% V/ v" @* z
  //SPCR Register0 A+ q' w; Y1 X/ h) \1 K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 i& T7 l0 ]) p( B3 O: @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 C2 m0 {) m! ]8 y# O% C* k0 ~  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 D; d0 G8 Q3 O( C1 z  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 C6 m8 R$ L8 w" H5 k4 z, M6 J  printk("temp=%x\n",temp);; d% {" g3 \  l2 \# J3 F- G
  udelay(100);
* [* U, ?( v" i2 }
, f; K" I) B# @  //set GPIO direction
* d& C8 X' O$ f7 j* |0 h+ {1 S   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% F  @, j( h3 n4 t4 b8 I   temp = temp | 0x00000100;//EPR----input
# e4 ?. k( U& p: X! Z* W( }   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 Y! S1 O& j+ b* g( x7 ]- d, \) N   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # v& @$ ]. {+ R0 ?' z( k' Z3 r
4 Q: Y/ i0 ?+ z" z  u! V* d
   return 0;
. O6 L% O' n# q" A}; M7 S, ~1 \8 b4 G$ l4 L) L5 `
static void __exit MCBSP_exit(void)* N- k: I$ a# ?! Z" U
{; F, `* B% q1 X' b  y- s: _
   printk("mcbsp chrdev exit!\n");/ Z& y$ _2 g# v% [9 R9 n5 X2 ?
   cdev_del(mcbsp_cdev);6 H5 V" r. N6 X: K" N0 y
   unregister_chrdev_region(mcbsp_dev,count);
+ h9 J; A& |, w5 t# G" I$ Q; I   device_destroy(mcbsp_class,mcbsp_dev);
% ^4 \- Y& [: D: y; _4 d8 H+ }& H   class_destroy(mcbsp_class);
& G/ D% S3 z$ a: w/ q}8 q% Y9 i3 D1 u0 r) M
module_init(MCBSP_init);1 h7 a' J. I8 J, o7 I
module_exit(MCBSP_exit);$ `5 l1 c! k- Y9 @3 r

$ w1 o' n8 a+ w& v5 |MODULE_LICENSE("GPL");
' q& d; r  T) J+ x# Z- T" R4 Q9 V6 @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' Z2 g; o+ Y0 ?
我的应用层的测试程序如下
( [1 R. C- M/ N) k& t! p#include <stdio.h>
/ a& [, F/ @' d! ?1 c; K#include <string.h>% ~4 ?$ v  u* A  b* u
#include <fcntl.h>1 n6 q  i! n4 s& k
#include <unistd.h>1 @) z) r, w6 \, r2 }4 w
#include <signal.h>
1 s! `$ k) ]3 i2 F6 I#include <pthread.h>       //线程. ?! L% ^( q, S: Z
#include <stdlib.h>3 n8 u! Y/ u9 ?9 U; X
#include <pcap.h>          //捕获网口数据: z1 b9 L5 I$ M
#include <semaphore.h>     //信号% ?7 M3 {5 ^) t4 {9 T9 m) O, x1 d
#include <sys/types.h>     //消息对列
) e4 d8 F) n  S% [3 n" P- q2 K" \#include <sys/ipc.h>       //消息队列
3 k, f. y# _8 d5 G0 w8 Z0 b: c#include <sys/msg.h>       //消息队列
3 R! e. f- J' u) j5 i#include <sys/select.h>. ~# Y* W0 J) O
#include <sys/syscall.h>  m) ]( N* z6 T- |. D% o- F- b
#include <sys/stat.h>
  x: P/ d' X2 F# }% s4 z#include <sys/mman.h>  {2 V7 G' K" ?
#define msleep(x) usleep(1000*x)" I0 ]9 j2 f% F& C) s3 U

. d# B% z6 _% r+ |8 xint main(); `, Q* z* Y2 e0 I& C' u+ V
{
* y$ m/ R" H6 D* x: H8 }. ]$ A    //MCBSP,ARM与AMBE2000交互设备% J' j$ ~& s: ?2 A+ p! j
int fd;
0 `) h1 R0 d  @. r unsigned short data_write = 0x5555;9 Y4 b0 R( D6 E
unsigned short data_read = 0x00;& z; X: l- C3 {; t: }" x- Z
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. o# ?3 |2 ~# i5 G+ j# B) c
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 W* |$ q& H. z/ l
   
9 v# n8 n0 ~5 x  if(fd < 0)
- F# @  P! M5 P0 \" c! f  {7 n6 u. H" ^7 q/ s# `0 R
     perror("open failed\n");
- [9 i' T8 A7 P8 x8 V: ^7 H     return -1;
$ D( z7 k' k  q7 y) j  }/ F- u) @7 b, B9 G0 Y$ k: k+ k
  
- t) |$ |  V$ I- [  while(1)
, H8 C6 f1 p3 G% @) A, L0 v) a8 V" S  {
* m5 X* v- _& |9 x) F   : Z- }3 P1 V$ ?) }0 V3 R3 O( T
   //AMBE2000每次读写是24个字为一帧
: a/ o4 g( O* B% v   //写数据时将数据在底层存储起来,等到中断的时候再发送
& N1 w, h7 Q$ R6 M( |   //AMBE2000输入数据是以0x13EC开头的) c; P9 V+ h1 B% n! f3 v
   write(fd,&data_write,sizeof(unsigned short));8 X, n" \$ s- |& E+ A- I
   ' I' ]3 {0 v7 ?9 V) P: _  H2 Q$ i
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ) t- }7 q5 f4 u3 z
   read(fd,&data_read,sizeof(unsigned short));
; o2 F& u6 Z  W; l. K! A; T   
# @( Y5 W' T5 g9 W! K; q" r   if(data_read == 0x13Ec)6 G1 G, v$ d$ H% g4 a. U
   {+ s0 ~( i0 Z1 U! Y) P: d
   - Q* j% E, }1 {
    printf("data_read = %x\n",data_read);- K& ?6 G2 b5 j9 Q& p( X( X8 ?  _
   }- P# u4 q& X3 a( _" ^# R8 _
   # _- j( `6 d5 Q5 X
   msleep(10);
1 a, L) C8 v2 N+ ^9 H! {/ c  N! P  
  V' F7 A7 ~( M& B  /*
8 {# w' C0 X& b6 _8 Y   ioctl(fd,1);   1 l5 G) e' b# h! b9 J
sleep(1);
2 m) q5 d" C1 m0 m9 i& u ioctl(fd,0);% y' q# L6 _, |8 \% ^) `
sleep(1);* n# C; S3 L: Q4 d* h
*/
' z) |. M9 I9 W! L$ h& h6 z6 ~+ \  }   
/ d) p2 Q" f, l9 u return 0;% ~( a# F! ~( z3 W8 I/ k- o3 w6 L
* O  [# g2 z3 @  h
}
$ S+ N5 D9 I, j! [1 P- d0 n2 B& j$ N$ E" l
多谢各位指教,谢谢! 急
3 a  e5 [9 r  E, P7 l
' e# d' i! O  ?! h. ^
6 ?) y, H5 |1 f1 d% p0 }1 L0 Q# N9 q, R2 j7 B
8 |; B5 ]- a9 T
* [+ C: S9 t2 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 18:00 , Processed in 0.043917 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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