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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' u  S9 i1 P6 K" p/ G- W# J
/*& e2 ~3 A& y! ?4 |
* Copyright (C) 2009 Texas Instruments Inc6 U9 m8 ~0 y& @% C
*
, k* m$ j- b, |8 b5 r6 Z% M * This program is free software; you can redistribute it and/or modify7 Z! o5 ?+ [8 Y# a, i! F
* it under the terms of the GNU General Public License as published by
+ Q0 A9 [5 |" i' \: S9 U( L * the Free Software Foundation; either version 2 of the License, or
- Y/ l7 t% }1 ^& C% J$ w$ ^' _ * (at your option)any later version.  l9 i% K* _# E/ n7 Y; X) }; v
*
; F1 i/ @6 P9 \8 f * This program is distributed in the hope that it will be useful,
) J4 D5 A' U& d: Y/ ~" T0 t4 X. C% J * but WITHOUT ANY WARRANTY; without even the implied warranty of3 v1 M2 E6 J% U/ ]
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 V5 A6 ^) s+ E- S1 K
* GNU General Public License for more details.
0 f6 V# j0 L& g  H0 }- s) Z *3 }, D8 j- t1 l; X
* You should have received a copy of the GNU General Public License
+ T# p$ h" @- f * along with this program; if not, write to the Free Software# S' J. Q% B  q4 A! E" H
* Foundati
/ w( _6 k7 G  N0 U' l7 S*// \; d$ D+ G2 [7 i
#include <linux/module.h>
2 u& u3 O) j* L#include <linux/init.h>
1 r7 }/ |" @5 \/ x#include <linux/errno.h>, ^- ?  P  w  G) m/ ]% y, O1 u/ x
#include <linux/types.h>5 k: e: c) f/ S9 B- m
#include <linux/interrupt.h>
) M& U* v  R% p: E" Y#include <linux/io.h>; x7 S7 R, B! _3 X4 ]  M0 K
#include <linux/sysctl.h>
- i8 W6 @6 G" B- @5 g; |3 E( f#include <linux/mm.h>
) i. l- {6 h( [' {8 ~#include <linux/delay.h>
4 ?& I- }# k/ m0 M0 B& z#include<linux/kernel.h>
  w) }# A+ j% B2 o9 U; ?#include<linux/fs.h>
2 F, s5 L- A1 d#include<linux/ioctl.h>9 C/ _0 ~' d+ S
#include<linux/cdev.h>, ?& H& }, b* `" ^$ O1 N* r7 x' U' |6 j
#include<linux/kdev_t.h>) F* y! i, h" W) H+ y
#include<linux/gpio.h>
$ S, m2 k  H4 E% S0 D8 k  x- o4 _#include <mach/hardware.h>. i6 U  l' ?6 F- `2 T8 m3 }! ?* L
#include <mach/irqs.h>6 W) \2 _  U4 }* h/ g2 M
; s  I3 F5 u7 Q& G% A# k
#include <asm/mach-types.h>/ U& V4 ~6 c- i! C2 t( c
#include <asm/mach/arch.h>3 r, P* @/ n$ Z) a/ x) `! ^) }$ k
#include <mach/da8xx.h>  x' |# _9 p0 ^
#define  SYSCFG_BASE   0x01c14000
+ @$ x1 B- A# u#define  PINMUX1_OFFSET   0x124 1 G+ y& g2 O# W/ [; a$ w
#define  PINMUX18_OFFSET  0x168 2 U& s, ^+ c( S9 _
#define  PINMUX19_OFFSET  0x16c
+ R8 J* I" C  R! ]#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR9 v3 S8 y9 ?! {: w  E% H; ]% F
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR9 J* u2 T, L; s4 R
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR- `7 ], n! Q& V; n- G7 D1 C
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 Z/ B3 C2 i4 f: P; r#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR( |) m. S3 @) ]' O  Q
                           
. P6 N+ H: M  n1 Z( ~#define DXR_ADDR      0x01D11004  //MCBSP1_DXR" P0 V+ |! i: v) c& z& G6 g0 Z
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  N$ m2 C) {9 w/ N1 C+ n
//PSC: r& ?- r/ H, P  Q+ @2 ~" |% U& {
#define  PTCMD_ADDR   0x01E27120  ' _* K7 I* y; i3 p
#define  MDCTL15_ADDR 0x01E27A3C
  z+ S& P4 ?0 y* b#define  PDCTL1_ADDR  0x01E273045 j6 T6 I/ l) u; M- }; [7 n
//GPIO8 direction
1 S) Z/ {6 P$ B, j5 s3 e  L1 ~& }#define GPIO8_DIRECT  0x01E260B0" l- j3 Y( n: t0 T
#define GPIO8_OUT     0x01E260B4+ f7 B3 r4 g) _
#define GPIO8_IN     0x01E260C0
0 x0 M# k2 l% |" x0 B
% ~$ O# k: P1 h$ ^2 H5 K//#define MCBSP1_RINT    99              ( B& E( k- Y9 {* v! g  V
//#define MCBSP1_XINT    100  8 B. d+ w' w; V5 @) ?" ?
static int MCBSP_MAJOR=239;4 G9 o2 L. N" _- \
static int MCBSP_MINOR=0;; I* Q! _4 o0 [+ {6 V' i
static int count =1;1 ?/ u3 f! _" P$ v1 C/ i& h; b

) ]7 M# d% z/ D' v( H#define MCBSP_NAME  "MCBSP-device"
8 Z4 l8 ~9 x# I4 a( d4 K- [1 V
# U' ?% T6 c2 e" ?static struct cdev *mcbsp_cdev;( e0 v. ]6 T+ v& R$ {' B  @
static struct class *mcbsp_class;: l: `: `' u7 N9 g& ?
static dev_t mcbsp_dev;9 J2 y; d7 W! q3 q
unsigned int DRR_data;4 v# |  b4 w8 x# l+ S2 a1 R% K
unsigned int DXR_data;+ E2 P! r! ]3 u3 E; [* {" ^
static int mcbsp_open(struct inode *inode,struct file *file)4 c& ~: C% n$ }5 A: a
{- Y4 r" F: M, y% E& S
   
$ X+ V) Z+ E* j1 H' p   //interrupt enable,initialized
" F3 I9 l" G, t   unsigned int temp;6 w% _# d4 g$ Q: x# A" B
   //SLEEP_EN(GPIO8[10])---05 @5 s$ j- D' l4 q9 t
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ d% t5 t. Z5 T+ {3 q
   temp=temp&(~0x00000400);* ?% f1 P" p' h5 t$ q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ y1 U; H3 c4 J  P& ]# L
  //RESETn(GPIO8[8])----0----1
( ^  t0 o/ Q7 Q, D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; D2 j5 k2 F$ p3 o0 K" H# c   temp=temp&(~0x00000100);
) ]4 s( W' w; c* l$ G4 N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( l( M5 }' Q" V& z& j* Z  w; I
   udelay(100);5 d3 M4 e( M) Z. M
   temp=temp| 0x00000100;, G9 x. K2 A0 x0 Z; N. m5 D
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 r+ c/ J& L9 G6 N. k* {   udelay(100);
5 v, n3 h! d+ ?2 M& m. ^; H6 S   printk("open success!\n");
2 n& b/ ]: Z, s   return 0;9 `* F" [& g5 F7 j  F, B: ^- D
}$ D5 G; B. R1 j1 r
2 @) p7 z: s, ?* ?/ I( O1 S
static int mcbsp_release(struct inode *inode,struct file *file)& w5 t; @4 p3 k0 s1 v$ p8 _
{8 w) W- l4 m4 `4 i
   printk("release success!\n");; C$ D. |1 u& h
   return 0;! w+ {+ K" ^/ B
}9 ]! S  z1 f) w% G% |  Q, X) |

$ l; v( G4 Q+ `: mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)1 e5 f3 o4 }; o
{
/ u+ j8 z" A  G9 d9 n6 W    copy_from_user(&DXR_data,buf,len);
( z+ A2 R5 D2 S) {( [4 T# `" Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ! l' i1 Y! w1 |9 E; ?
    return 0;$ S; z7 I7 e' V7 n! R
* p5 r' w9 f" @6 p+ a" T
}
0 y9 Z0 N' \- M% J, i! z- v& j6 j* \& i' q. d, {
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% F0 d, s. }2 i{ & h) }$ t% W. k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ w# Y: S/ {' \7 k9 T# O
   copy_to_user(buf,&DRR_data,len);
' \5 Y# N% S* K( t! s' j   return 0;+ x/ x  j$ a  A7 d8 K% ~
}
1 A1 M+ k' Z; T7 k# J- @% S+ K& W
0 S1 @, \+ {8 G% c) o( |2 a+ n* X4 Y2 e. ^9 [8 }
static struct  file_operations mcbsp_fops=% K2 @$ e5 E" b9 o* X+ D! f0 k
{
9 m, ~. R1 x* L$ P" y5 H   .owner=THIS_MODULE,
0 \1 {& ]! S/ ^) A; l  \# _   .open=mcbsp_open,
" C! B, T8 D; n3 H8 g0 `& ]' n  {   .release=mcbsp_release,
6 D1 C6 \9 T6 k7 u6 t   .write=mcbsp_write,( a6 C+ N! e0 Z! k6 d
   .read=mcbsp_read,! }6 u  v9 o- n) ^( C* n
};8 }8 ^% p% z5 [  o
static int __init MCBSP_init(void)
0 i+ m3 H. k$ V: N/ z{
- F5 T/ D' a. I   int ret;
" }- ?8 e: D: r, s! V- }  ?( v5 A5 f, A; h   unsigned  int   PINMUX1_REG_old;7 M8 E8 N. {* l8 B/ T9 k. c" h  f, s
   unsigned  int   PINMUX18_REG_old;! |! I; U6 c+ e. [
   unsigned  int   PINMUX19_REG_old;3 O  _' f) w" E5 g( m
   unsigned  int   temp;  % I9 R& V: V' Y: E( p+ j7 I
   if(MCBSP_MAJOR)8 n, g1 n/ C8 u2 ^3 O
   {
# V  D, M" h* K+ i# }: o( |+ U/ \      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ O0 A/ t) \' z) ~5 j. |( b      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);2 t* P1 d( F$ r' U4 k& s
   }3 t+ S5 ]9 v# o- J4 s- ?0 U
   else1 h$ r% m: e( F4 G
   {& Y, K8 f% h7 d" Y0 ^; R
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);/ w$ G3 F: ?9 M) K
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ a# Z9 [; s, h7 H' F3 s- b- f
   }( Y6 r+ s9 A6 a3 p. p1 Y: r
   4 R2 E$ ]  s/ _! C# M, \& |
   if(ret<0)
8 H9 ?9 K4 \/ o5 _8 T6 {   {+ H' R4 E! ?  q
      printk(KERN_ERR "register chrdev fail!");
8 w; [* n8 T$ P- V! h      return -1;
5 N" k; o# L( ]4 w& Z   }
) a# ^* {8 G& g9 k2 b2 Q   9 n" J  H% n/ X5 I" G& W! D& |
   mcbsp_cdev=cdev_alloc();. |3 e2 S' y/ K: l
   
- R6 Y! }$ g/ ]' d" |+ O   if(mcbsp_cdev!=NULL)
' Z) K5 W1 g9 F: U0 B) u4 A2 G& u   {" e7 y' B/ Z# j; j7 \
      cdev_init(mcbsp_cdev,&mcbsp_fops);) H! |" H+ U3 z" H6 U
      mcbsp_cdev->ops=&mcbsp_fops;" D1 k- L% z. o4 }
      mcbsp_cdev->owner=THIS_MODULE;
; p2 L$ n# o6 O$ v" s# \  D      
: |6 M6 u, X# d$ I( q+ S      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! p; a- L' l7 e5 l4 z
          printk(KERN_ERR "register cdev fail!");
6 I: c5 r+ K. W* c6 l6 Y      else; ?& H; z: ]* v! N; C1 F
          printk(KERN_ERR "register success!\n");
/ [( B: i! U) \. P2 i0 ^" X   }
( L: w, Q  s9 L  O& z  D/ L0 w   else
. h3 m/ u* E; T1 b/ e% H$ C1 l   {% V0 D$ A" m; M4 u) m
      printk(KERN_ERR "register cdev err!");
! S* m* g+ ~. W$ ?/ X9 m      return -1;
  `* }' Y( W( G- d   }
: s- S& Y/ Z6 U9 P2 F   0 R1 N' _. k% `  a0 @$ }0 F
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* `9 S* w+ V: t
   if(IS_ERR(mcbsp_class))
1 v3 Q# r+ S! D. _: x& U) o   {
; F! v5 ~1 K. Z4 S4 F" e# H      printk(KERN_ERR "register class err!");
- T1 N  L2 h5 D9 X4 I   return -1;$ ~& F9 M2 n! F8 l6 q. ]" Z
   }
$ S) X1 f! O$ v7 l- R) G: T& `4 @   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
8 z) [/ U9 u& y" d' S7 K
$ U/ h7 L9 w6 e* l, [   //PSC& I* u1 @( n& ^
   //add Enable MCBSP+ T" t* Z; D, G6 R5 I( G
   //test/ ?# y# X1 L3 y* f# s3 D
   temp = 0x80000003;; b. U, R$ J; G
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% Z$ x; U( M' O3 j/ P   temp = 0x00000003;& z) A9 |" N- l# D
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
  Q: G4 L& r% J7 I " b/ H/ x+ q8 Q# C
   temp = 0x001FF201;/ i- w3 m7 b  ~1 t" v- A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 l4 ~( Y6 t: H   1 ^2 H) G7 U( O1 \+ M  f0 E, ~
   //PINMUX  
6 L! A, K4 v7 b9 _7 T: H" U   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 t$ A! T7 E. ~4 w! ]
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
8 p4 v! f" [! V5 n4 @   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
% L) n: X8 k( \$ L4 V$ q   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 Y. ^5 k7 R9 U9 `   % p" a- C" T! S- i4 W- j. n
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
' C+ r+ X4 U. t- O" l8 T   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ; ]8 T2 d, a) @: r+ }" z& G* a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 I9 |6 a8 r8 Y$ H% [
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# N1 W1 K4 W% }
5 j3 _2 s+ E/ x. I4 i% G, A
   //RESETn,L138_SHK2) T" Q0 ?9 x3 p; [8 Q! ?  c
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  , n( {) A# w$ X& L! H, T+ \8 s
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   1 E' U2 b" C/ p; h- O/ Y0 H6 N
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 V' m$ A5 a3 @  U7 q; J9 v
5 @1 C6 `2 ~$ o6 K8 @
% I; \/ U  X. Z9 f5 V# A
  //SPCR Register) n% Z- ~! H2 E& _
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. @. A& \' N* v' @2 k1 F. [  temp = 0x03000000;//(DLB=0)
& t  `8 L3 V$ Q% y8 [& j, [: K // temp = 0x03008000;//(DLB=1)
: A  @) ]- t0 c7 f  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset. j0 i; q4 H* m( A& L/ W  N* A# A
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 P* N+ t  Y6 Y# Z) {( R8 ]! @  printk("temp=%x\n",temp);+ o, l5 [0 g3 X5 e( t
' [5 O6 T$ [  B
   //PCR Register
  p& X' Y; u, a% q- q1 z- @   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% |& {$ F4 S/ g! F" C0 G
  // temp = 0x00000F0F;0 U" M  J/ |1 _1 q
  temp = 0x00000B0F;! D/ J. h5 I; A( Y, J" F
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 S. a3 `7 j4 _5 @% ^. |6 _
  temp = readl(IO_ADDRESS(PCR_ADDR));9 Y+ E8 q' p1 a  J8 b% n' E& e+ J" `
  printk("temp=%x\n",temp);  4 t  I( _( W/ w
   //SRGR Register
/ o/ k# m1 N  ^, @   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 G- x+ d9 l6 s! }
//temp = 0x301F000B;
( y* f8 R9 k1 M8 b% V, x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
5 i$ x: L7 [* x9 g" x  temp = readl(IO_ADDRESS(SRGR_ADDR));) f# S. a8 K  s' Z1 C# O! N) w& r
  printk("temp=%x\n",temp);
- E% {0 ^4 O) W  N+ V4 v) G   //RCR
, s% a3 ]( Q8 f: l* e2 ^   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 f6 W$ B" @, t; {- h
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, S8 s( c9 f. c3 @" }& \; [
   temp = 0x00440040;) v5 C: H& X1 M; b! q0 U
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ' L& u1 ~5 W# E# w
   temp = readl(IO_ADDRESS(RCR_ADDR));
% U# u, Y; A: n2 i2 d* Y   printk("temp=%x\n",temp);0 `8 J3 b4 ?' m2 o% X# r
   //XCR- w# T% l- y, _" Y- `7 V# c
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 V% r4 S0 _% i% W) f
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* i" }( |+ T& X& R" B+ }) s" K   temp = 0x00440040;+ [9 d, v5 |: m% x% [! r( |
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   # N! Q  y% \+ m4 {7 h1 G8 b
   temp = readl(IO_ADDRESS(XCR_ADDR));/ R% M" y1 `" B* ^4 s7 F
   printk("temp=%x\n",temp);
+ N6 e: h% J2 v! I  udelay(100);
0 j+ P6 \" W- O8 t7 F  //SPCR Register
# T# z0 P3 r0 T9 Y% [, _  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; v: z2 e. q2 ]8 q1 x  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
. I# Y5 X4 V1 X, c3 {1 }: v  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled9 h! V1 |9 T+ v6 Q; E
  temp = readl(IO_ADDRESS(SPCR_ADDR));4 b- o4 w  f* X5 g2 d+ ]
  printk("temp=%x\n",temp);* y" l3 _0 s2 a6 j5 u2 t6 D
  udelay(100);+ d0 ^4 F* Y# B
( Y: A7 N8 x1 _0 M
  //set GPIO direction1 b2 M& F7 @$ t( |3 _8 F& u2 {
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));! z' z/ S$ ^+ V7 p/ R7 `/ G" j/ ]4 c
   temp = temp | 0x00000100;//EPR----input* L& l+ L+ S9 @
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
# a; p  V2 \" `3 `$ p   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
, ^# _+ v, M9 a3 ~3 T6 M/ z* {
; B2 L4 f+ c& t( C0 L   return 0;
) y9 |6 l5 ^6 g5 E0 H" k+ y3 z}
  l7 v/ ]' `7 X4 ?. sstatic void __exit MCBSP_exit(void)6 L  [' p& z7 I" @
{2 F, D- a) t- ~: p( r
   printk("mcbsp chrdev exit!\n");8 @) {3 N: f5 T" t
   cdev_del(mcbsp_cdev);
! r8 V+ d9 \2 v# R   unregister_chrdev_region(mcbsp_dev,count);7 Q  U4 Z$ x) f9 {* p
   device_destroy(mcbsp_class,mcbsp_dev);) b9 C' I* ?$ ]1 E5 H( D
   class_destroy(mcbsp_class);
3 E/ }: w8 r8 u$ ^/ r}
3 }) H1 r" [9 s6 F; Kmodule_init(MCBSP_init);
& U( y5 |7 ]. F! `module_exit(MCBSP_exit);
8 G, f7 S0 `. b) \/ {. ?# e$ [- ]0 Y& b* H, I8 a% l, u
MODULE_LICENSE("GPL");
$ R$ H  e( ?7 B1 w+ F( I: R! I# c# ?; i$ c; O
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
8 R- _! k- [* x/ E. s我的应用层的测试程序如下
3 A! T( T! w3 m: D$ @9 \# J& e: b#include <stdio.h>
+ E! o- u  \1 l) y) E#include <string.h>
# S. E/ V! [. |6 _" t#include <fcntl.h>
! \' c2 F$ i, \" u$ d#include <unistd.h>: x  C: {, D: A& q( w
#include <signal.h>6 Y. h$ e5 D* s) z1 G
#include <pthread.h>       //线程+ k2 i: V$ r/ R1 b! k" s& W
#include <stdlib.h>3 P- M5 H+ x% i
#include <pcap.h>          //捕获网口数据
3 @( U$ T9 E& S. l#include <semaphore.h>     //信号
) ?. B/ _8 s+ Y; ?  |#include <sys/types.h>     //消息对列
2 {8 B* x: Y; D  [2 O4 p: u% J#include <sys/ipc.h>       //消息队列
& ]; ^/ u! f" S& g3 n#include <sys/msg.h>       //消息队列
2 H! P# d  g% w1 U+ m#include <sys/select.h>
! @9 h- _; O6 ~0 ?2 t( l#include <sys/syscall.h>
5 x: w2 G9 n% P2 g9 r5 t. V) g#include <sys/stat.h>
! q% o& ^7 S0 q9 y' W/ l/ x#include <sys/mman.h>
6 {$ s$ b8 i6 I3 N0 o& O% }3 A) S#define msleep(x) usleep(1000*x)
0 Y6 U( B7 N2 A" O
- Y& W1 k1 `( O5 Wint main()
! `8 ^. h" v7 j+ d{ ' A! z7 b. D5 _+ R# C. ~! T0 W! Z
    //MCBSP,ARM与AMBE2000交互设备
! `# S% M! @2 } int fd;% r) K7 q$ R0 p4 a7 O
unsigned short data_write = 0x5555;1 P6 d: ?: S9 L9 h  s2 U: v
unsigned short data_read = 0x00;* K) h$ e, i" g* L, ]- N) _0 F
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* H; O" X4 X" Q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# {: c- I' _3 P- R* X# E    , K) b- n( {2 e
  if(fd < 0)0 t" E3 f; x; |+ \, L1 B
  {
+ j: _$ H- I0 C: w5 y* v     perror("open failed\n");, N$ n/ J7 f5 `& d6 f
     return -1;
4 ]( {3 [' {+ T. S2 O  }8 N6 V! z, R8 s& R% J( g, a
  % e# [" _/ [, @
  while(1)
' B7 N+ m/ u: |; E% {  {4 Q! s1 |% Y, c* t
   : |6 j9 e) C8 O/ G
   //AMBE2000每次读写是24个字为一帧& Y, Y! g/ u+ b
   //写数据时将数据在底层存储起来,等到中断的时候再发送+ x7 }9 b: _$ ~# O- C2 V% a
   //AMBE2000输入数据是以0x13EC开头的' O2 \: e3 ?' H, f
   write(fd,&data_write,sizeof(unsigned short));* d) y# J. K/ c8 S8 {# j% E; K3 m
   8 U0 F! D0 E% i6 B3 q
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  H2 X8 ]+ G6 q+ i/ W   read(fd,&data_read,sizeof(unsigned short));
/ L: j5 K/ p$ [% I2 H* w5 T   , Q( G0 P5 f+ g7 C
   if(data_read == 0x13Ec)
* i5 x2 m/ D0 f& _/ k   {, i( G5 Q. L! n( M1 p
   % Z) e% v" p) T3 G+ X# K
    printf("data_read = %x\n",data_read);
* D0 r# t0 R7 }" Q. N: ?8 n   }& H  i  V( B$ ^
   
+ S0 z$ f& f% ?# G# f1 ~; g! ?   msleep(10);
2 |2 C* v& B4 r& C  7 d9 L4 X" m7 C3 b1 j. g4 v
  /*
8 Z( W& m% V/ t* B. j% ]3 R1 B# X   ioctl(fd,1);   
* W$ z4 i5 o2 M7 }5 m sleep(1);  ~# G5 _: D' ^7 N; i
ioctl(fd,0);
& s/ K/ r2 _% _1 [# T sleep(1);
( T: P5 m" [+ v9 b" L' w" H */ & X& g$ Y( X# i  Z
  }   
  R& M* ?8 q; p return 0;& s) p2 L5 D; h. ]" ?) d+ F# E6 B
: `7 N$ L" l' r; J# B; l7 M8 r, j
}
" Q4 d/ y5 X! ~0 a4 A/ X# E  [9 P) z0 ]
多谢各位指教,谢谢! 急
0 \! @8 Q; ?/ X, I
- b4 b7 ?; ?; o4 w' N+ m8 _2 ?* D
$ }3 H' P2 E; x7 s! n0 \; b& O
( _/ h; W: z( T) d! O7 Y$ L$ P

( @* e7 R4 r1 x% ~4 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 08:07 , Processed in 0.041562 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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