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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" `) e0 p+ {9 t" L/*
4 E; q4 y2 Q% T * Copyright (C) 2009 Texas Instruments Inc& M& K1 }' L8 t. [# F
*
1 |7 ]- @! e; i * This program is free software; you can redistribute it and/or modify
, ~( \2 u1 g6 j7 F * it under the terms of the GNU General Public License as published by
9 y1 _% j. @! {  c' F5 D * the Free Software Foundation; either version 2 of the License, or2 K" @1 J, d1 U4 |* Z' |
* (at your option)any later version.9 u" {) Z- U# H
*  v6 B9 _" I; k! [( d- m6 b
* This program is distributed in the hope that it will be useful,
% Q' y" [! {7 S# r; i4 H8 O * but WITHOUT ANY WARRANTY; without even the implied warranty of8 X- c" ~7 s, g, x; b
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  M7 |. U/ p6 `& s8 _$ z" K
* GNU General Public License for more details.
4 ?& c0 {: \) S  m9 b: X7 f *
9 S9 Y% C1 j: Q; E9 \" w * You should have received a copy of the GNU General Public License; J4 n1 [  }. |0 G. {. R% c/ `% z
* along with this program; if not, write to the Free Software% m4 P* y& e' T# D' b
* Foundati& v4 D9 S9 s7 H
*/
0 M# `& r* ^6 E. `" o' q#include <linux/module.h>5 X3 Q# @7 Z$ C+ ]8 Q5 X
#include <linux/init.h>5 H' f( l0 h6 e  k% N# [0 q
#include <linux/errno.h>
9 u% _. H, E4 D8 d0 n; J# R7 p#include <linux/types.h>8 @- y- B/ U+ ?* h( J
#include <linux/interrupt.h>( u$ R6 _" a+ v6 R+ L1 O
#include <linux/io.h>
( E5 F* L9 d0 i#include <linux/sysctl.h>
. j$ P7 B7 H! y# ~#include <linux/mm.h>4 F* E; Z7 K% l5 x: ^. q. p2 ]
#include <linux/delay.h>
0 ^, z$ l& y. M- R9 [4 W#include<linux/kernel.h>/ X" s# C* _  x2 D  F
#include<linux/fs.h>
$ X* G1 ]& j" a# k#include<linux/ioctl.h>
) F; C% z. l7 N4 `) e) p#include<linux/cdev.h># ]; m5 Z9 ?* Q% ]( U
#include<linux/kdev_t.h># [7 f7 S+ J$ K( c
#include<linux/gpio.h>" H+ a' Z6 E9 _  B* ]
#include <mach/hardware.h>
/ N# j' r0 Q+ J3 [8 `#include <mach/irqs.h>5 R# i8 T- O' l; ]$ \

( u6 y+ {5 W4 Z) _0 Q#include <asm/mach-types.h>
0 e0 x8 q# d- [' `5 U9 \: M#include <asm/mach/arch.h>
1 z; H9 \  ]! }' o0 d- @9 I#include <mach/da8xx.h>
- v0 n  z- g2 L! J4 x  ]6 w#define  SYSCFG_BASE   0x01c14000& }' ~" M9 B5 U$ i! b) W# g
#define  PINMUX1_OFFSET   0x124
: k# F4 p4 L7 N, f" q/ K#define  PINMUX18_OFFSET  0x168 3 u3 w9 s* h; t0 v3 y
#define  PINMUX19_OFFSET  0x16c+ A- F" s3 @6 h) j6 m4 z& r+ K
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
! a: j( D# @/ d3 Y5 c; m2 H# }#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR& n2 i3 S% U7 X% j
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% d& E1 u5 _6 R3 [  Y% f( j( k* `#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; |1 G9 x/ v! D' U( R, |
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
" g8 u/ `+ H+ ]0 p& @                           
& A9 c; r% c# v5 R2 R#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
$ p$ a7 I3 T: X/ z5 f7 _- U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" a, `  D& K$ O& r2 Q
//PSC
& Q3 P; O8 v. |#define  PTCMD_ADDR   0x01E27120  
5 y  r6 t8 R+ N9 v. V( ]#define  MDCTL15_ADDR 0x01E27A3C* j6 O. n& v" Y1 [
#define  PDCTL1_ADDR  0x01E27304$ g& X0 Y. ~0 {
//GPIO8 direction- S' D6 c7 |; m  J) E
#define GPIO8_DIRECT  0x01E260B0
7 G& q0 q8 c) |1 F#define GPIO8_OUT     0x01E260B4
  Y2 M( H! G( O1 e4 O  ]5 M# L#define GPIO8_IN     0x01E260C09 i4 M- |5 g: d6 t3 c6 R

2 M! Q' k6 a7 @, c" O' T//#define MCBSP1_RINT    99              
3 Z; f/ i8 `" ?" z" @//#define MCBSP1_XINT    100  
: X, W/ C: Q" e) x6 Lstatic int MCBSP_MAJOR=239;: k0 k- i1 |% m5 R) i3 O
static int MCBSP_MINOR=0;
3 p" n* X# S3 [+ o  P7 nstatic int count =1;
4 A, y3 X/ T- J  }$ N
: k+ B7 c$ Z+ A4 ?#define MCBSP_NAME  "MCBSP-device"
5 m$ e2 b) p  E3 j( }/ a/ J8 S- ]# R) m& s
static struct cdev *mcbsp_cdev;2 @4 i5 p- w& ~- I
static struct class *mcbsp_class;
' g. |$ l0 O5 L! X( ]static dev_t mcbsp_dev;. q7 s* b, O  u
unsigned int DRR_data;! G3 m6 F6 h# r' z& E9 g6 E% s
unsigned int DXR_data;
+ S$ P; O& J( j# f( G3 Ystatic int mcbsp_open(struct inode *inode,struct file *file)
1 |. a" Z- A. A* Q4 w{
3 D5 M9 p  O  p, r  Y+ o) O   7 I' q  y; o2 U5 t% e
   //interrupt enable,initialized
) Q) W' `& t  x& D1 o" @' {   unsigned int temp;
  ?: l7 [5 D, t/ j2 Z; S   //SLEEP_EN(GPIO8[10])---0  ~' i0 Q8 S- o* N1 a! H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 Y9 V9 T( \" K   temp=temp&(~0x00000400);
: C% }& D" L1 M  {0 b$ E! v: y$ |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 X+ ~- z8 C2 n& h: Z& J" k& i' a" P  //RESETn(GPIO8[8])----0----16 E$ D6 I; Q+ K) A6 I8 e
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# W4 x+ a& y- v3 Z+ L+ G   temp=temp&(~0x00000100);, X# i+ E: b/ `1 @6 l+ ?$ [; S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, S9 E6 f; d9 X1 j% ~4 r" ^( t0 A
   udelay(100);
% R9 v4 X* c4 ~; ~. @* }0 [. i   temp=temp| 0x00000100;
$ R7 X3 I: e  w   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' z2 `4 h0 ~, m" x2 I   udelay(100);
; N+ `7 t1 |# s   printk("open success!\n");
2 v6 G4 A4 W" I( t. `$ ?   return 0;- @) `; `# _" K5 h0 [$ }
}
. z  D" V$ S3 f# `! l: R/ ^, x+ C3 U8 y8 I# i0 @/ e
static int mcbsp_release(struct inode *inode,struct file *file)
* l" `+ i: r4 w2 I( L# r+ J6 ]+ {{
) O) Y+ {! m# \: y, R! o, F0 M% ?1 S) O   printk("release success!\n");5 @4 T6 \: l1 g/ Y, F: G
   return 0;. ^+ o5 m6 A2 C6 ~' J! V1 l- }
}
+ _4 C0 b( G$ q* B& I* C& C
* _# f% d9 s+ Y8 J) Hstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 }1 j/ D; g+ A* y$ W
{1 D% t  p. Q& L
    copy_from_user(&DXR_data,buf,len);; e6 y" i5 w1 ^
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
& _8 K( G, h. X1 Z, s) l$ O    return 0;
2 }" w8 s* ]1 f0 o9 H1 E 2 U$ c- u) N; T* F, h  m+ x) L! j3 z" q
}6 E7 @" X  _' {( ~' h1 M

% H5 E" H$ w$ C/ ]. |9 ]7 s/ ystatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: Y- d0 Y, L% ]$ ^& O, f% P- U{   C+ o/ P" ?1 K# p$ J# ^$ ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ {' P; c. G8 S3 i/ \' M* V
   copy_to_user(buf,&DRR_data,len); ' `8 h5 m5 r' j1 A3 `( M
   return 0;
* ~# e1 b' n; B6 [}
% b9 U& R* Z- x/ Q( M7 k( ~: K8 `* J1 c# [& a
4 T! K. d' ?9 f6 F! p, V1 T
static struct  file_operations mcbsp_fops=
+ g) Y% ^' B# X! |{% c4 B9 v  ~1 I1 D. j6 s
   .owner=THIS_MODULE,8 a! D$ |6 m0 j! N# x
   .open=mcbsp_open,
7 V# C, {/ P- `' @3 d+ z   .release=mcbsp_release,+ P2 B5 \: c6 C9 U+ p+ |+ w1 B8 R7 D$ s
   .write=mcbsp_write,
8 P7 B6 W) c. M: V; {" @   .read=mcbsp_read,6 q7 h7 w* M/ p, f2 h7 @; F; k* Z' r& l
};8 A: B# G& N& ~5 U  I
static int __init MCBSP_init(void): R: X2 ~3 Y* a7 G4 b5 _' W  x
{0 P4 t! \7 }7 |2 C) U! [/ ~
   int ret;
0 X! m2 C" l9 l   unsigned  int   PINMUX1_REG_old;8 A! @9 X% z' \1 {. o  X1 S
   unsigned  int   PINMUX18_REG_old;
; W; c0 S- c# U   unsigned  int   PINMUX19_REG_old;
% a) Z6 \; @. m   unsigned  int   temp;  
% d) q/ u0 I+ r8 f" \- {   if(MCBSP_MAJOR)
$ r' Z& }; c, q8 M9 j; K# `' @   {) b, J+ [" u0 K, c. ~7 }
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ k+ v, I$ M/ H! P- Z
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
5 m( E6 |$ [5 l: \! r9 z/ E9 R' b   }
8 i% Z8 f5 v6 |- q8 A7 T2 m, w   else( x# V% ]4 y1 }% a
   {8 z$ _$ |# N: m* o$ ^
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. p7 R% g) F& U7 o9 s! a
      MCBSP_MAJOR=MAJOR(mcbsp_dev);" b% {; U, J' `
   }" n7 O8 q6 V# s1 B9 D3 H8 m
   ) ~4 D# f. m2 n: n2 i, c
   if(ret<0)7 q) l3 z$ G, K  Q7 K" ^; P
   {# l, }4 c4 c! H3 q- w
      printk(KERN_ERR "register chrdev fail!");
/ U% j+ m8 k! w' A* t7 z      return -1;
; r0 d$ D, d8 m   }: z& h6 w- C' \
   1 o% l' p4 M* s7 |- ~# v& E# l9 v
   mcbsp_cdev=cdev_alloc();) c* a4 T% Q+ M( k- q4 @
   
: [( P4 k" g* J# m4 g* r9 [' {, v   if(mcbsp_cdev!=NULL)
+ x& m) M0 S1 d8 x; n8 G   {
) \( x2 _" d: ]' w# D) u+ ]7 K+ B' F      cdev_init(mcbsp_cdev,&mcbsp_fops);4 I) J4 q' A  O9 l1 y- J
      mcbsp_cdev->ops=&mcbsp_fops;
7 J8 W1 `9 W1 B5 K      mcbsp_cdev->owner=THIS_MODULE;
" E; l( f# }" {      
8 p6 [  K, [' r9 O; t      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; s7 R& g- v5 T5 V, K          printk(KERN_ERR "register cdev fail!");
; e! v% `" _3 g7 a. E      else
- q- q# D( H0 A% n7 I          printk(KERN_ERR "register success!\n");
  S! F/ ?" N$ F/ V3 S0 W- v4 N   }
& j! X9 |4 y2 y, I) m3 d   else, C2 [0 u1 Q! m3 `3 x" q
   {
4 U, t# k) L. `- l9 y      printk(KERN_ERR "register cdev err!");
0 q) C  \) L: s' k! h6 l2 m+ [0 r      return -1;3 A  i: F; q& {0 @
   }
0 S/ G5 {' I7 l9 x  b   
4 [. E0 y3 s  _8 v  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ ]8 E+ G9 {. a; H- ]
   if(IS_ERR(mcbsp_class))
* K$ l/ v' Z7 a: u   {4 Q" J: k! s7 i  t
      printk(KERN_ERR "register class err!");
- x6 b2 `# u& F) R! v: r   return -1;
! L- q$ ^! c6 a' V9 S+ p3 @   }
. D& B; ]) Y+ W7 L; L" g  w. n% ~   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);* s# _; [+ a9 O
4 O2 R  {( a7 J5 J" ?) U
   //PSC
; Y" Z5 H* Z) f) L- k2 y* X   //add Enable MCBSP' q# K7 x6 M# K/ b6 q/ V
   //test
) s. S" L1 ]$ F% n9 k# @" z. A   temp = 0x80000003;0 x0 j1 ^' ?7 b# ?4 D$ w. X2 }
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# w' q) z, j! F7 s$ e! k  J   temp = 0x00000003;
  Z  q, O+ k1 Y& b5 ^; ~& t4 d   writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ [- V4 b! p6 H 1 F; [0 v- Z0 x- ]; C
   temp = 0x001FF201;  c+ i: M& _% I8 k
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; V! }' R! G$ |3 _. z
   
  t+ r0 D# g/ T( c# S& |   //PINMUX  , [! A1 e( j4 W- b# O( w
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: D7 a6 K2 o0 C! E; F' i% ^6 j
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  1 c8 W/ }, ^' ~5 {# @# y0 }4 u% ]
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   . ]# P$ V: V) Q/ z  c
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  t/ |5 ]6 {1 u# S+ b8 y8 m# F
   & ?( X( j) `; k2 n
   //SLEEP_EN,EPR,L138_SHK1,L138_RC# Z$ f! [, S' x2 Z
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ; z/ A; Q& N6 u" L+ T/ M
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   + m0 F8 S7 b5 ~. `2 A. g% |
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' g3 a6 o6 Y; |3 `6 r, y6 ]; b1 }
( O9 E+ `# C! n9 w2 f! T1 }( ~
   //RESETn,L138_SHK27 n& S' j  c+ n* o( q
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- A1 i5 x; H6 B! ~* O" u2 Z" r; e   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   6 r% @1 e& [6 K* i! ]4 ?- m
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 n' t6 P% ^) y2 n* P) v0 I 9 [6 B4 h. T6 P& u5 ~1 S2 r
( w( r6 s: F) K+ C2 _
  //SPCR Register
: I' X" N" v$ s  m6 l  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) U" F$ U' n) V0 I$ o
  temp = 0x03000000;//(DLB=0)% }% M% s/ `4 ^& E$ G3 v
// temp = 0x03008000;//(DLB=1)& s# M0 R, P# M; _3 F- A% e2 N& p: Q. E
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
9 q- h4 j) f5 F4 t/ H  temp = readl(IO_ADDRESS(SPCR_ADDR));2 }8 m+ ^4 ~' H/ S
  printk("temp=%x\n",temp);: D* _- A1 M% n+ m

, ]! U( ]0 R, J2 ^/ G3 ?   //PCR Register
" B4 ]0 P) b7 J7 B6 f   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
9 i. Q1 u2 W" y, C! m  // temp = 0x00000F0F;: A  z/ e: X# i
  temp = 0x00000B0F;
3 L8 K( U9 P; N2 `9 D, C  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
- b6 H- Y) K9 e2 F1 I% e  temp = readl(IO_ADDRESS(PCR_ADDR));
2 X* A, P  D, X5 q  printk("temp=%x\n",temp);  ( K1 d: P$ r7 |" |& @; M5 ^
   //SRGR Register
" r5 I) `% ]7 f- T$ z1 P   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 L/ v9 D; s& X2 y, i( u
//temp = 0x301F000B;
- {: ^5 O' Q! Y8 X; y% P   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
& U* N: ~# [' @' m! h0 }8 t# Z  temp = readl(IO_ADDRESS(SRGR_ADDR));
0 [& `% R7 R, E- H0 G& Q& |8 |( ?  printk("temp=%x\n",temp);
2 ?* B  ?) g; W* n% f" k/ u   //RCR
9 b+ Y9 d' n3 q3 T4 b1 y3 A, y) G   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,* j5 ^* L: k) W8 I2 g; P9 `; ^
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
  l2 Z, w. a2 A& n, g% d   temp = 0x00440040;
7 z( Q) e9 k' ?1 P   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
! X4 R( C0 [0 U! `% b7 v   temp = readl(IO_ADDRESS(RCR_ADDR));1 ^5 F8 z% `+ G5 }) S5 @  k
   printk("temp=%x\n",temp);+ q& l. i/ n4 q+ c
   //XCR
4 R' z4 Z# P1 e% G   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 k* |1 s4 X% a* H& q) t& o, |. Y
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# e  Y  Z/ {1 [/ z  M/ m
   temp = 0x00440040;
) c4 }% A5 d& K   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + O; t; r& K0 a) T
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ Q  s3 P+ Q3 B  }   printk("temp=%x\n",temp);0 i) @6 e4 d! q4 Q# u
  udelay(100);0 ^- T. g; _; K
  //SPCR Register
4 C3 Q4 V0 F. n/ i  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( F6 I& Y) G5 G5 v+ a  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
) c% S+ U+ _2 }2 M2 n" B- }+ s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ {$ O1 a8 m. l
  temp = readl(IO_ADDRESS(SPCR_ADDR));& C: v8 ?/ w( \& c# n" o2 g5 J
  printk("temp=%x\n",temp);
+ M  W" h; j/ p+ ]0 d% |& ?% |3 @" m- @  udelay(100);' k9 F9 z/ d$ {, j- p: [+ i6 v5 M
2 y+ |8 i/ [: @
  //set GPIO direction
& n" n& E5 s* f   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- T% T" _/ ^( i   temp = temp | 0x00000100;//EPR----input- r' _- x6 d% h# Y  T( N; C( R
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 t% ~$ o/ {) T' U5 J  A- S& t
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& L  r' S( D, ?+ p5 I. h, I 7 D. k2 `( Q% c. Y
   return 0;
7 i) z  e5 E5 g& |+ {+ e" F6 _}. U" `( g! t' W/ L* U* A
static void __exit MCBSP_exit(void). k8 L$ Q4 a' x) L
{
8 I9 m( L; k( W   printk("mcbsp chrdev exit!\n");8 H% r7 k7 }' C+ E
   cdev_del(mcbsp_cdev);! j, W0 {7 X2 b  S- w
   unregister_chrdev_region(mcbsp_dev,count);
! c* N" d' _  {+ C   device_destroy(mcbsp_class,mcbsp_dev);
" z- ]$ D7 W. S! w; K* i- o3 g$ ~   class_destroy(mcbsp_class);( }, G& z, U( C  c/ f* d
}5 O! J3 K* p, Y" P8 h* x
module_init(MCBSP_init);2 b- `1 ]3 Q: ?5 S( _; Y# h8 Q6 K
module_exit(MCBSP_exit);
" T$ N7 O/ E# H7 z$ a8 o( r! l+ v9 @" Y
MODULE_LICENSE("GPL");
  d* b9 M, g; a5 L: X. b4 @4 f& l' A; ^9 S& h, F$ G, ]
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。/ q) }1 J, z, {$ X1 Y
我的应用层的测试程序如下
  Q7 s  Q  [: f2 M2 Y8 B7 q1 \#include <stdio.h>
4 R1 s1 P$ w% Q" L8 v+ @6 T#include <string.h>  M* @- K' E/ M2 z' H3 Q
#include <fcntl.h>
7 v; _/ _7 @2 z2 h3 o$ i#include <unistd.h>7 S; d: Z2 h( m2 {6 C
#include <signal.h>
$ |# @% e% s! J. Y#include <pthread.h>       //线程1 C$ b  p# {% ~( i- B
#include <stdlib.h># s5 \* u, b5 G. k5 G7 {4 H
#include <pcap.h>          //捕获网口数据2 D( s+ k' H6 |) R
#include <semaphore.h>     //信号; ^3 v9 W' L" M- U) }* V* k
#include <sys/types.h>     //消息对列
3 U( M/ |+ t; V& D#include <sys/ipc.h>       //消息队列+ T: I: F2 X7 x% @; {8 {, G
#include <sys/msg.h>       //消息队列
% m2 F+ }3 u) q% D% `* |5 S#include <sys/select.h>
3 ]8 }+ q# b8 |" L2 Y2 D: G#include <sys/syscall.h>
( {2 b0 A/ D1 m8 r6 f# Z5 Q#include <sys/stat.h>
8 g, r+ [4 {7 e: |. J6 h  @) w#include <sys/mman.h>! O* H: Y! m4 S( g; p
#define msleep(x) usleep(1000*x)
/ f% o# p4 j+ |8 `
, m5 [3 ^. X+ w7 K: T- gint main()0 l* d2 a( B" J
{
- E7 a& c% ^# C( F1 e    //MCBSP,ARM与AMBE2000交互设备
4 d+ r2 y& m- I. h+ W* N. X; V+ L int fd;
( d* q) |/ e  p- i7 v$ g unsigned short data_write = 0x5555;, f9 [) i8 q$ ]+ a
unsigned short data_read = 0x00;
# l! k/ d9 G6 Y+ j  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 ]# z! J# o  [* N3 E5 c //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 D9 i7 r+ o9 b  O* H
    8 h# }! n: p; r- `& b
  if(fd < 0)+ G; i3 E' c- h) B; G, \; a
  {4 S7 E9 w! ~$ @8 p2 I
     perror("open failed\n");5 t/ p4 t3 t" W* D# v
     return -1;
; b. [& z! v; V$ V+ }  }
! p, |% |) G; o/ h# ~  Q  
- }5 k* n: W3 Z  d8 K5 |  while(1)6 _! J2 B& k% J
  {4 [* |; g! Q& p
   ! ?- n3 Q' i9 E0 i: u  e
   //AMBE2000每次读写是24个字为一帧: ~# W- X& ~" \% m
   //写数据时将数据在底层存储起来,等到中断的时候再发送
! G+ O) y6 _2 f/ S" r1 l8 ^   //AMBE2000输入数据是以0x13EC开头的  a' k! R$ d3 u
   write(fd,&data_write,sizeof(unsigned short));  Z/ p# G* y, O4 C
   0 r5 H7 u& h6 f4 M" F) p- A
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
; D5 g$ ]( d. r5 O/ h2 I3 B5 Q   read(fd,&data_read,sizeof(unsigned short));
) t: ^" t1 Y) k3 ^) {   
# q# C! y6 {( U- j1 L   if(data_read == 0x13Ec)
7 k$ @% |) P2 n+ N! A$ R( @1 P   {. F2 `; T: i! ?7 m9 x2 A2 K( @
   ! ~5 V2 w: M/ j! K0 W
    printf("data_read = %x\n",data_read);
7 u. G& ~' ^/ i: C' e8 g; k   }; O% d* G" X  i7 L1 l* m
   
- Z, c4 D$ s, P; R6 L   msleep(10);
& w2 |: [1 ~# V2 ^+ C/ n3 ~  
6 X: C9 {  p8 \3 w& H6 z1 T  /*
  S0 l/ s8 `; j8 Z$ n   ioctl(fd,1);   
- n0 E" e6 F0 R5 \& d sleep(1);
4 Z7 U$ D5 z+ c3 j; G+ S) j ioctl(fd,0);
: M3 d2 A/ a0 X sleep(1);
; Q: z' u1 o# c, G */
! ~# w% t2 Y6 o  E. G  }   
# M9 a2 f5 x1 S return 0;
& h2 u4 V2 Y( q/ g3 y) M3 X# X - v& u" M" E1 B+ {
}
+ Y8 M- z7 j* U+ p3 v0 q
5 d3 c, f& \9 s多谢各位指教,谢谢! 急
3 h) Q& B5 j9 T7 _8 k* w0 Q: B1 d: G
. s/ X: x4 L; ]; r/ N
( e7 t# D# g7 Y7 A5 Q, h
( H# `7 f% }- l. _; J

) I# j: b5 X# ^; F! ]/ ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 09:38 , Processed in 0.058520 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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