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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
* \: \- d0 h+ t# Z; U" o! I/*) _( C, }# e; t+ S2 y
* Copyright (C) 2009 Texas Instruments Inc% J; \& _! ]! G1 Q& U" H
*
; R- c# J) }5 A% v* v: N * This program is free software; you can redistribute it and/or modify/ N* V/ ]7 e* v6 H* O* s6 W3 ~: F* @
* it under the terms of the GNU General Public License as published by& d3 a( y+ x7 ]0 o' w; x# H5 C
* the Free Software Foundation; either version 2 of the License, or
2 I8 v6 D6 O* o/ h * (at your option)any later version.
! a, m# `$ \, w; j5 ? *
7 D, ^: U/ }: }# S2 k0 x * This program is distributed in the hope that it will be useful,
- a1 W. Y5 K% H  K6 s  N * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 Y. c8 _7 k  Q; d+ O3 _6 S * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the. V6 g  i' I& s- A$ C
* GNU General Public License for more details.
+ d* E6 \. A/ T1 O' u# S) x6 N *
6 ~- J, m- ]( a8 N: I6 o; E * You should have received a copy of the GNU General Public License: m  B5 G& O( P. C. C  \" ]& r
* along with this program; if not, write to the Free Software3 r  X& ?! b/ N- \9 T
* Foundati
) ^( V* B* _3 U  J+ [# w. j# i1 ]*/
& A& V+ g' i) B" D8 O( x9 `3 g( V#include <linux/module.h>
" F8 d: U" k8 x9 u% e, J1 L#include <linux/init.h>3 |: M+ O+ u" H3 H
#include <linux/errno.h>  y; E9 K6 I( @" I& M; t
#include <linux/types.h>9 U! G9 B. I) @  {
#include <linux/interrupt.h>
- A. F1 b) ?1 l% t% @#include <linux/io.h>
. e9 |# ]. Z0 x+ p( P+ W#include <linux/sysctl.h>
; n: k+ M. }/ C2 T' P#include <linux/mm.h>
' |0 u+ Z+ s( O#include <linux/delay.h>
# {3 R; y4 G( p9 ~% W* J#include<linux/kernel.h>* g5 S! h& ^* ?9 A& b
#include<linux/fs.h>
" z" m3 Q! r! i/ I: B#include<linux/ioctl.h>
3 _, f0 V! Z8 x* r- g5 p- s#include<linux/cdev.h>- u1 L: k) _7 h1 s0 Y
#include<linux/kdev_t.h>: ^9 t3 Q- p* x0 p, c/ e8 S
#include<linux/gpio.h>; I* `% y' o, e1 T) p1 i
#include <mach/hardware.h>6 E+ A3 }/ `/ A
#include <mach/irqs.h>5 e0 o9 o: p/ d' M

+ C- E( ?  s$ U2 U& e#include <asm/mach-types.h>7 e5 y7 j4 @) W& O2 S/ w0 _1 g
#include <asm/mach/arch.h>
. n7 I3 P7 K9 _. ?#include <mach/da8xx.h>
( Y( Z3 ?0 [; g" q$ ]#define  SYSCFG_BASE   0x01c140008 {7 ]2 i& p8 X* e, ~4 K1 G3 l
#define  PINMUX1_OFFSET   0x124 ! g' Q! x0 k2 j" `$ O+ \5 L. ~4 N7 a
#define  PINMUX18_OFFSET  0x168 7 @* }( q* h, D
#define  PINMUX19_OFFSET  0x16c
  }% G4 N' C8 a4 y* G#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR8 A6 c# N( g8 p1 g4 q, F( l
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR/ R6 M2 j# w. l
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
7 }$ x0 Z$ T* P3 z+ R3 G& p) p#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 C6 G2 l7 \: @( \3 [7 F
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
# F. H' i; u! f8 ^9 B5 F                           
; }! D6 O- x8 `. Y" g2 f#define DXR_ADDR      0x01D11004  //MCBSP1_DXR6 u2 F- ?/ o+ S9 s; j
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
' j% z: @  z$ U- J//PSC
0 V& r' w5 A: C1 X5 n; [#define  PTCMD_ADDR   0x01E27120  
2 k  C. h- Z- E4 g& _8 j  y#define  MDCTL15_ADDR 0x01E27A3C6 \' `3 J3 F; n3 W2 n) f. I
#define  PDCTL1_ADDR  0x01E273042 T" @: T9 g. y. T
//GPIO8 direction
, Y- }5 C/ _' z- {9 c9 k#define GPIO8_DIRECT  0x01E260B01 P3 @4 v# C1 |! e1 [* U6 f9 L
#define GPIO8_OUT     0x01E260B4
' i+ n" j" u/ c7 C9 a' ^! v/ u#define GPIO8_IN     0x01E260C0
1 y3 R. l4 O1 c, i5 Q  x' e7 Q' z4 b, b0 v3 s1 E1 G
//#define MCBSP1_RINT    99                F% ^8 S% G* T
//#define MCBSP1_XINT    100  
! }" \4 d! t  lstatic int MCBSP_MAJOR=239;& o! v9 a7 C4 s7 W# t3 s% Z
static int MCBSP_MINOR=0;( W% n/ [& W( L' l, [3 v/ {* S* l
static int count =1;
: M4 p3 Y0 J9 L2 q5 E  M0 r1 I7 m4 L; S( c; J3 [
#define MCBSP_NAME  "MCBSP-device"
" Q& r+ e6 D  `$ c2 ^5 }9 M& Z, m
5 ?. D2 G- @7 [; s- Fstatic struct cdev *mcbsp_cdev;0 U5 }: n& i5 e7 B1 R" V  `
static struct class *mcbsp_class;( M0 g( q9 l: U( M# R& x
static dev_t mcbsp_dev;4 t9 j! T/ m0 |# ]* ?  _
unsigned int DRR_data;8 V( A' u0 l- V+ r8 N( }4 o
unsigned int DXR_data;& ^3 h: Q- B8 t
static int mcbsp_open(struct inode *inode,struct file *file)$ [: a9 X+ c1 O
{+ y" p2 f/ |# K- W
   , q; o8 o& x4 V7 \9 O' h
   //interrupt enable,initialized
* ]3 t3 U2 l. P! r) ]. J. X   unsigned int temp;
7 ]" v9 f. U. M+ Q( b. c1 X   //SLEEP_EN(GPIO8[10])---0% n+ ]6 G& Q! a# r* g: {
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 y2 r+ i$ G% _6 d8 `7 t. W2 O
   temp=temp&(~0x00000400);: o8 Q3 o0 V7 a5 q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* P. i8 P( t5 T& t. B3 r" B" T  //RESETn(GPIO8[8])----0----1
# I. I, Y4 _( b0 {( m# O2 Q# e   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) C, f5 J0 r- P
   temp=temp&(~0x00000100);8 A# j/ F- A7 m) L/ j) X: A
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! W* U, S6 \( `' M  J) X. e   udelay(100);0 r4 H) R2 v$ S) ^) v- B
   temp=temp| 0x00000100;
3 W9 l- h+ f# D$ y6 `3 e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---14 G4 L3 f1 Z% J; ^$ o) f
   udelay(100);
- Z$ P: s1 T2 ]/ H+ Q$ r* O0 |   printk("open success!\n");: e9 _* l' ]! \% x& V
   return 0;! w* U. M( r! _, b: t0 ]( G/ _
}
1 v* Q! H4 \, m/ Y
: o' k7 C$ X) d+ _0 Y& H: V" xstatic int mcbsp_release(struct inode *inode,struct file *file)
  b: Y# L$ J: H( G! t9 Z8 \' Z{
+ J/ x4 i! `& W; v) z   printk("release success!\n");0 O6 D& X0 s$ q5 v
   return 0;. m& \" J  B) S) ~2 Q. E3 M5 A
}0 G& x  L! {/ x! w+ t. F% A

( c# j# o/ v- H% H# R9 ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ M4 H. g2 T! x
{1 w& H+ s7 N# C+ N9 P3 }3 U
    copy_from_user(&DXR_data,buf,len);' i6 N- I5 k2 p
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' k  L3 L5 `* Z! @8 O
    return 0;
. i* P' y* O3 x9 j5 L% Q% l8 z
( n! m! H$ I2 L, C- h8 Y}8 b2 E- r3 f7 ]! r, }; ~% \

! A- a  x& P: k/ B8 [$ w+ ~  H' lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% l, o  e$ K$ i1 H# ^( N' f' ~{
5 P+ @3 r! [7 @* l' _% S0 m$ n* D   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 g" p. f2 u2 c' W% p
   copy_to_user(buf,&DRR_data,len); ; f0 u- t# m6 A8 A) J! J
   return 0;& p3 y1 h, g2 Q0 f
}
3 `: Q' x+ f( \' _: m. p& x9 }3 o. j( t& O& L' q, I- P* f6 M- b& J
$ F! L- f2 R! ~1 i; J
static struct  file_operations mcbsp_fops=( l* C3 l- z6 h- q
{. Z- W  z5 w0 a4 S5 m
   .owner=THIS_MODULE,0 [8 f3 @5 F4 a9 a
   .open=mcbsp_open,
: U" Q3 F( S. e* O" A   .release=mcbsp_release,) I; G( V- {+ g  H& T
   .write=mcbsp_write,
; x' U6 {' N+ w6 [   .read=mcbsp_read,+ T/ ~/ E  H. Y; P. b0 E9 M
};( W, v- o, g. G; B
static int __init MCBSP_init(void)8 P- [/ q4 A8 {2 }0 i+ {
{- w+ |" x! Z, k4 x
   int ret;* R4 X, t8 D: l
   unsigned  int   PINMUX1_REG_old;
- i/ G1 u1 w) \  J% @0 }: W   unsigned  int   PINMUX18_REG_old;
. m1 b! m) h9 E, z   unsigned  int   PINMUX19_REG_old;
! X$ Y* @/ N; T$ p* e, }% E) g   unsigned  int   temp;  
8 ]# W; u1 Z' U* j1 l   if(MCBSP_MAJOR)
( t2 _% I% B! A; {   {
6 K/ a1 q" W6 q9 Q3 P9 f1 s      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 C& e+ n. P3 ]: C+ |
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);1 o6 |* l, u4 Y1 Z+ Y
   }& v* N& s! s0 Z/ g0 y
   else
* }1 D+ H# w* z+ ^- x' }   {, [7 o+ n7 H( V6 O
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" x$ N) G7 @) n
      MCBSP_MAJOR=MAJOR(mcbsp_dev);( c: A# c" {4 e+ S1 o* V- r
   }/ m5 f" X! b) w+ s
   $ k9 n* x- S* ^# J
   if(ret<0)
1 Z+ a/ W; ]: D5 O   {
3 z# B' U0 e/ |/ |% R! i) }5 |  u      printk(KERN_ERR "register chrdev fail!");% W# z8 J, `+ `: n+ f
      return -1;
/ o0 L3 l! u! z* t   }
4 c; d  Z, r1 I! ^   
; Z, D! f" f! O. W1 c: n   mcbsp_cdev=cdev_alloc();( i, t+ j& Q8 ^( f" E" r$ j
   
; J1 N- w) r5 I/ a7 |   if(mcbsp_cdev!=NULL)( o6 ?, o. l; p+ x4 t
   {
+ k" ]0 R- m3 K* Y$ `2 t2 I( o      cdev_init(mcbsp_cdev,&mcbsp_fops);
) l' h8 ^: k% J8 e2 ^      mcbsp_cdev->ops=&mcbsp_fops;
) Q3 B. U+ _$ j& W      mcbsp_cdev->owner=THIS_MODULE;
3 i- n6 J, `9 O1 X! {+ o' P* R      & H6 f- I4 q$ D" |* B5 Z4 v' i
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ f4 T9 f* y8 h4 S+ h) I1 g5 e( a          printk(KERN_ERR "register cdev fail!");
  {- V2 q" J, z, K3 Y  ?+ r      else
! y8 p  a, l. J2 c          printk(KERN_ERR "register success!\n");
+ Y4 R$ m6 M$ z' z  G   }
  f, ~" m% ?/ {5 B' W% N1 }4 W+ W1 c   else
* I& R& F/ {$ a   {, Z3 x8 K7 N2 O! f: L8 q6 C
      printk(KERN_ERR "register cdev err!");3 g: [: q+ g. r: i2 J, ]
      return -1;
5 B  Y6 w# H, c$ G/ m. I   }/ I- X, ?% p# q+ y0 h
   
- y/ g, o& _, P% c, H" n% h% x' d  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);1 A4 O9 F4 y6 T! M- h% S8 e+ a
   if(IS_ERR(mcbsp_class))# q5 s, s5 ]1 I
   {
' I- o7 ~* {. e& d6 M      printk(KERN_ERR "register class err!");
5 x% H8 s" a, t# s6 e0 T! c   return -1;: R- u$ P7 p+ v" d
   }2 V' ^, t1 ~8 ]0 ?: b. J
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ o. E# s' l3 S1 A- M; q
& P. k* {4 e# c% S7 J. d9 z0 M   //PSC7 R+ G% p4 Z! q# g9 `: S& P2 C, Z
   //add Enable MCBSP
& i# W$ {2 Y$ v$ B% V4 a   //test
; @- [5 A' f) C1 ~  K% S   temp = 0x80000003;
) o+ g. c  v8 L! g   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ g4 v5 i9 S) v: R# p8 Q' ], T; v
   temp = 0x00000003;
2 w% k' P( E9 v; O' ^8 I   writel(temp, IO_ADDRESS(PTCMD_ADDR));* M5 ]. {' i# ]7 U2 I
! z% W. x: S3 z0 F0 I
   temp = 0x001FF201;/ @$ }  c) O  H- B
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& W4 a* u4 X% N/ M# c( G   
- r3 e/ g  V9 b/ Z$ a8 Y   //PINMUX  0 q& k  m7 w5 y+ ], H/ r) Z
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,4 Q! ?9 m* q, M) ^) i' ?
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 ~9 Z" N( S& ^4 p) C! {9 e" K
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
9 j  ]* j3 L: g9 I) _1 Q% [$ O   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ U3 ]' K2 U1 _8 e1 h   * Q  m0 ]% c  D( E) E
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, P% q1 ~- o) a* T' [   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . b- ^, }+ Z0 {! T2 u( ]+ ]8 Q
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
- s# S9 G3 d3 @* d- [   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 m: t; z( K1 k9 L) N$ X: w
8 M5 R8 H1 Y) Y1 x2 `5 _   //RESETn,L138_SHK2
& z' f- H9 C) C, J0 b6 ]   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
% L, @, x. c) r* W% F: o   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   5 R) R. W: N# U" l
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' I4 Q5 M( C- o% u+ K" }

  _  L$ D5 J2 f4 Y1 C2 y
% f5 g* ]3 M6 ?2 l; w8 d  //SPCR Register2 ~' D) \) }6 z7 D; k8 H7 E
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 x% d$ W8 D' o$ ~( _  temp = 0x03000000;//(DLB=0)1 r- g5 m0 l: }2 x3 s4 k
// temp = 0x03008000;//(DLB=1)
- X) {7 z, ]- N2 e  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
2 I/ F; V4 W, h, m( B# O0 U. q  D2 D  temp = readl(IO_ADDRESS(SPCR_ADDR));# v! b- ]0 v+ Z9 N5 Q( s$ X  k: I
  printk("temp=%x\n",temp);
* i5 H( G3 Q% Z. t5 E
" L2 P2 S* E! k$ N   //PCR Register
6 O7 Y2 h6 o- ~/ v4 _! u   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; f6 W6 R& ~. ]
  // temp = 0x00000F0F;
% L6 S' t( r. l+ w+ K$ x  temp = 0x00000B0F;- A- L( n% w0 W7 W3 ?# |
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
9 E$ {. y. f, s; {8 M- F( f& \  temp = readl(IO_ADDRESS(PCR_ADDR));
/ L, k; h) B1 h; z) J( @4 |. u+ K+ ?  printk("temp=%x\n",temp);  
+ `* K/ ~" J" Y   //SRGR Register: x0 _1 B7 e/ v) r: U- M3 b
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ G6 Q7 Z' D" y9 x- j
//temp = 0x301F000B;
, P+ ~- R# x" L   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
( Z( J8 W/ A3 w8 Z; ?5 `  temp = readl(IO_ADDRESS(SRGR_ADDR));) n: `8 B% X0 U/ J3 Q: }: Y7 ~
  printk("temp=%x\n",temp);' a, n/ b* D0 o% ^& B
   //RCR; l* z/ H# g% U. p& P$ D5 T' K# o
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) g( ^4 B% t2 g, U& m% b   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) z# q# C% j  ?9 ?. a" a" v   temp = 0x00440040;# |) }8 C  h1 l. D
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
8 y$ ^! u# U' D! ^/ k, q   temp = readl(IO_ADDRESS(RCR_ADDR));
, v1 X* k0 l- D# J7 U( O/ _7 g   printk("temp=%x\n",temp);0 \' d* P! t$ a1 x" N1 ?
   //XCR: v% i4 w6 J5 D' m( _9 y+ G' X3 Y
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 h& B+ |& ~2 _4 `( J
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-02 q  n* ?/ C2 |/ Z3 n
   temp = 0x00440040;
( b3 {; P% A+ {. `8 k0 u0 j9 H   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   4 B* a4 f- f  h3 ?, r( J6 z
   temp = readl(IO_ADDRESS(XCR_ADDR));+ a) S7 e0 C5 y0 {7 M
   printk("temp=%x\n",temp);  A- \' Y: `- M# P- P# X$ N
  udelay(100);6 X+ p; C/ X$ v. P8 i. E0 @0 Z  Z, L$ l
  //SPCR Register* {  Q8 X; M, `: s
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 p0 O6 r( P7 Z) {/ z9 ~% b
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
: }7 j. s; X+ ~" M+ J- O: O  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled0 C7 }& G$ C$ a" E
  temp = readl(IO_ADDRESS(SPCR_ADDR));" i2 o- }* y. Z5 ~0 U
  printk("temp=%x\n",temp);' J% ]) |3 _) w
  udelay(100);
' q! M7 X: H) w" R2 s
6 d' y9 t0 Z' U0 b! {* m/ L  //set GPIO direction
; M/ ?. J, l2 K7 d. C   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ _$ R* n) L* _; z: q) {9 h  `   temp = temp | 0x00000100;//EPR----input
9 r: d/ J% k5 M# ]( v   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( d0 S1 Z9 T8 K  [) Y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 h. J% g  X9 c  v4 n* T0 F: C

. {9 A2 P/ e4 ~4 {+ D; j   return 0;
5 n+ M: h- c% x* a1 l& C! u}) _8 H, M2 C% Y5 C3 u/ u) x/ T
static void __exit MCBSP_exit(void)3 D' d  i- f! T1 m7 r
{
1 `% n5 `- H" M8 F0 p# s' e2 c   printk("mcbsp chrdev exit!\n");1 E) H" ?  H8 c, }9 X
   cdev_del(mcbsp_cdev);; y& p9 P0 W- c7 _7 A& T% j) D
   unregister_chrdev_region(mcbsp_dev,count);, n2 \+ ~8 _- z' c; m
   device_destroy(mcbsp_class,mcbsp_dev);% d8 y  N5 Q# B4 W, k* r. p' w
   class_destroy(mcbsp_class);
: h1 E4 h5 u( n' q( N; k# A3 ]}  w/ y$ e; \1 y# v
module_init(MCBSP_init);! G; u7 y6 s( P- U! j0 k3 B
module_exit(MCBSP_exit);  ?! `1 j/ h$ z) l1 g. ^

; p, H- d0 A% B( j* y0 KMODULE_LICENSE("GPL");
9 i/ v) m: ?2 I0 C* u( e* n4 C5 y9 g) O$ N) S5 ?0 n6 [
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 D: o8 |0 f( _1 E
我的应用层的测试程序如下
1 d) q3 |" u5 ~' w2 R#include <stdio.h>
9 n5 L0 T5 B9 V9 e#include <string.h>' ~8 L$ ~, @3 i( A  F5 b9 ~
#include <fcntl.h>
/ c+ A. i1 Q! `#include <unistd.h>
% g  x' E. S; Y; p- V) d#include <signal.h>
+ `# y, H/ g1 f8 v9 {* r8 g7 F#include <pthread.h>       //线程
& B& T) \) }% c) j9 M$ t4 i1 Z#include <stdlib.h>
$ C1 |, G# X% I0 E; P: s) M3 K#include <pcap.h>          //捕获网口数据3 X; k' L* \% N; A. I
#include <semaphore.h>     //信号
2 v/ P' }, k( X  N#include <sys/types.h>     //消息对列& D# V# Z; v) t! @% r3 Z9 t9 U
#include <sys/ipc.h>       //消息队列* P7 b" p0 j7 ~! |( Z. ?
#include <sys/msg.h>       //消息队列) U8 P2 S% `6 _& U
#include <sys/select.h>. l6 }/ Z% ^; Y0 o% z& ]" v1 ~
#include <sys/syscall.h>
6 q- a: U, ^: u% W7 }; E4 y5 x#include <sys/stat.h>
4 c7 V8 O* o. H. ^( Y) K8 H7 z#include <sys/mman.h>
" M+ _4 d8 U/ Z- i; u#define msleep(x) usleep(1000*x)& I. H- f  ?" f+ o$ ]' }. D

; M" D1 B- A- |+ ]int main()
  ]% d7 F, r/ W. M& Q{ 8 ~* z% F, b5 \6 W$ {
    //MCBSP,ARM与AMBE2000交互设备6 O1 d( V" E' q3 ?
int fd;  X+ O0 S! z' t8 g) N  q
unsigned short data_write = 0x5555;9 x) d- G2 s# J8 q# G
unsigned short data_read = 0x00;
/ Z9 q' i& q* ^' m8 L  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ t5 O2 G7 d& w* @ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; q, k- q$ K4 Q   
: j9 p9 ]. o8 P& P- C0 ?+ Y( l3 Q  if(fd < 0)! k9 W3 G* }' p% v/ @. w
  {
4 |0 e2 W9 I! S3 V     perror("open failed\n");4 S6 G' f3 Y  }4 a( ]' ?+ N
     return -1;7 L* d& e4 C' ^  Z& g; i0 w
  }
6 k1 D% h- E% x& Q  
7 [! b+ F2 A6 T" c( P  while(1)
' v+ }3 A$ ^0 h# z' c! V  y& _( e: ?  {1 g. r+ n2 |0 c. S, L3 q. C
   7 o9 r  L; f/ q9 N' {6 o
   //AMBE2000每次读写是24个字为一帧2 g. M% n% a4 c$ M! e
   //写数据时将数据在底层存储起来,等到中断的时候再发送
* y. R8 Q  i$ @3 t+ l& x8 J/ c' c' M   //AMBE2000输入数据是以0x13EC开头的
% `/ x0 B1 B( p  v2 A* `0 n- I- m   write(fd,&data_write,sizeof(unsigned short));2 C* D$ `6 C) {" {2 Z
   0 ~* g* \. W& ]  N9 w3 I; f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ' L' `$ H9 o9 ]$ x) g* N
   read(fd,&data_read,sizeof(unsigned short));5 z) l! v* A9 t& u+ g
   
) \+ S, ]7 _6 J$ D* M   if(data_read == 0x13Ec)! }7 X; l. n- T1 N9 O
   {
# \9 Q' c# H, \% e/ f$ k   ( O0 g  e6 q6 E3 d" L# O7 D
    printf("data_read = %x\n",data_read);
; {2 j/ V/ X- F5 y3 K   }8 |- r& h- K0 c, @# o" q
   1 o! Z/ u1 o0 H' ]0 U, s+ _
   msleep(10);& B+ y; g* a, ?
  - D1 p. k5 p3 b; w
  /*9 Z) ~- g, W$ L( L) c
   ioctl(fd,1);   6 M1 Y# W0 m6 i
sleep(1);
( X0 j9 t  w, l+ {( e ioctl(fd,0);! \  F. x+ Q1 A
sleep(1);
- Y" @" s3 L% P4 U% l */
0 J+ c6 b5 a8 y+ l8 B  }   : m5 J8 D  e, Q7 l' z
return 0;
1 ?% ?* Q% ]' c0 ?2 {: U+ l
1 k/ a; S2 U4 g9 n  L2 o, }* m}
! \( u! ]% V) ^2 t, e9 S* p, C% Y  L! C% Z! Q" r, B
多谢各位指教,谢谢! 急
) c8 F8 B/ W' v- n! f3 Y; Q2 `; u: _4 h
; S  x, X4 N9 N  V

! v3 I+ E& q; \8 {' g
( L/ ]. v! a* R1 c) c: o  A: ~1 {' n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-18 15:24 , Processed in 0.043515 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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