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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 c5 V- h- R: U' z% N* N* v0 k1 Q
/*$ b8 X7 O& [. o
* Copyright (C) 2009 Texas Instruments Inc
; J  p0 C( f0 j& L# S* [/ W: @9 a *% Q1 ?9 _$ V- N
* This program is free software; you can redistribute it and/or modify3 u) C0 V+ U" b& t, {
* it under the terms of the GNU General Public License as published by
& ?0 J- o9 \, } * the Free Software Foundation; either version 2 of the License, or
, C. ?  \7 j2 H" E8 f. \% \$ k * (at your option)any later version.
1 p& Z7 f$ Z* f* ]. ? *! ]3 r* _+ D# V  i
* This program is distributed in the hope that it will be useful,
+ ?, f7 {3 z( _ * but WITHOUT ANY WARRANTY; without even the implied warranty of  h$ k( g. ^$ y8 ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! }/ X1 `" j* B
* GNU General Public License for more details.
" m( }! b$ x! d  F- Y- p4 ^ *# R! z. Y  f' u9 ]
* You should have received a copy of the GNU General Public License
) H; c9 E; ?8 A* U: [& K/ N * along with this program; if not, write to the Free Software  E; R1 _) a1 H$ i* q8 a
* Foundati
5 T# D/ e9 @9 @! s* F7 a9 X* x*/
" l5 g8 V& ?: h6 m+ P" Q#include <linux/module.h>$ ~9 v. C: j8 s* \  T' ?# h, M! ]
#include <linux/init.h>/ T( u$ e# l' u, C
#include <linux/errno.h>
! M2 Y* E0 W# g, h  K1 Z#include <linux/types.h>
0 i- g% f- Y. A) C/ N& `, W#include <linux/interrupt.h>
* V4 `* M* U3 t8 w/ a" D# R3 S#include <linux/io.h>
9 }5 r9 `# Z8 j& P#include <linux/sysctl.h>% _+ d; M) N' w" E( K* Y( _3 s% P' a
#include <linux/mm.h>3 _, P8 ]( N& J9 [3 o7 r
#include <linux/delay.h>
9 `, \# Q) ~) ]/ Y7 n#include<linux/kernel.h>
2 i$ }$ W6 j9 i, ~& L; _1 _#include<linux/fs.h>
+ x+ D  z  r. ^+ d/ W( `5 k2 K#include<linux/ioctl.h>% R4 X  J7 x* p# D. G
#include<linux/cdev.h>" N: D7 i% i/ ]- m' u# y
#include<linux/kdev_t.h>
6 g/ v& E! U  g7 D( n& u: K+ y0 c#include<linux/gpio.h>) M/ h/ \2 }8 {: L1 I
#include <mach/hardware.h>! ?' u1 a/ B. ]6 e& z6 n( l  @0 F
#include <mach/irqs.h>
" t7 s2 ~+ p2 N( d$ `2 _# v
" B& r( U- q, N$ O( k# E#include <asm/mach-types.h>
2 }4 j. F* I% Y$ E3 e/ z! u/ y#include <asm/mach/arch.h>) G1 U7 @/ `/ S' B' @$ I4 W
#include <mach/da8xx.h>/ t* J2 ^$ W  Y; [4 K
#define  SYSCFG_BASE   0x01c14000% E6 V$ ~6 y4 C* N- W" O
#define  PINMUX1_OFFSET   0x124
& @# ], l& u7 ?+ g#define  PINMUX18_OFFSET  0x168 : m. o+ G' Q7 q3 F- v* K8 |% |% _
#define  PINMUX19_OFFSET  0x16c
8 i8 h+ x, R( s, v- r  _#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR  O; Z2 _2 Q8 N6 A0 J6 \. j
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR$ O( c7 j# V7 i4 X
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR) m8 y# l+ t& x4 a) Y
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
2 ~& q* A# [" K( f1 B  I#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
% y) A' f) [% M                            . ?: u9 l3 A4 J! c+ N4 t3 B! p
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR. _1 {0 |/ Q! D4 D
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
" x; l3 D: q$ F//PSC
( e+ ]+ p. m2 u) c+ @#define  PTCMD_ADDR   0x01E27120  2 x! w* G3 o+ R( M+ `* e9 y
#define  MDCTL15_ADDR 0x01E27A3C  O' o0 p! O4 |+ Q! w9 b: u
#define  PDCTL1_ADDR  0x01E273045 R3 w0 N6 D8 w+ ~1 q5 P
//GPIO8 direction- [" @. m2 v! s
#define GPIO8_DIRECT  0x01E260B0
! p, h0 p. b6 z3 f) [! Z  M#define GPIO8_OUT     0x01E260B4* k) B, i7 G9 x" D
#define GPIO8_IN     0x01E260C0+ C1 d. v$ r5 L3 c5 s) Q9 b

9 H  O" E+ A: f# Y; M//#define MCBSP1_RINT    99              
3 b/ G! }& F2 A. n/ ]3 c8 }6 P//#define MCBSP1_XINT    100  # d8 I/ C' B2 I) S
static int MCBSP_MAJOR=239;
9 U" E+ W% `7 ]9 S% Xstatic int MCBSP_MINOR=0;' G3 t5 V% H8 x# M5 q
static int count =1;
/ k4 w4 v' J+ e9 N5 ?7 ?" r- k4 @8 M0 k/ Q/ D# E
#define MCBSP_NAME  "MCBSP-device"
, I3 |) C/ o. x' I- E
, X) \* r0 L1 }! s; W5 ^static struct cdev *mcbsp_cdev;# Q& }1 T, _% p& M9 x; c
static struct class *mcbsp_class;
) \0 }6 c0 [$ h6 `1 Mstatic dev_t mcbsp_dev;
# r. H6 e% F2 G! Munsigned int DRR_data;. S: J2 a1 C" @1 o3 {& |* J
unsigned int DXR_data;0 b/ F0 t9 `& i; i
static int mcbsp_open(struct inode *inode,struct file *file)
# u. C' B& q$ T( l* L( O8 A3 F: \{- p. ?  B0 o# K# [5 @# w% Z/ W! S* g! B
   * C5 R: P* |. D- Q( b2 t1 C0 ^8 C
   //interrupt enable,initialized
$ x1 b; ~% b8 n7 m8 H4 G- P   unsigned int temp;
  U9 Y/ G- q# v7 S   //SLEEP_EN(GPIO8[10])---0
& N/ P; c/ q: n1 b  g% z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, M6 d1 L: u2 R6 z& B0 y3 N4 l% i& N   temp=temp&(~0x00000400);) S4 E& v* }6 R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  u& w1 s; f  I- S: |" d  //RESETn(GPIO8[8])----0----12 B% Y) E6 o) u# D1 _1 q- R
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 d* I2 H2 d: F" B+ T" m   temp=temp&(~0x00000100);
  e3 U3 `2 J% C% h0 i   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 h- a0 |$ j0 }+ \- S
   udelay(100);
! X! S! G. J; a3 P   temp=temp| 0x00000100;# v; [& u; }, ^
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! u: u  A; m- {9 V
   udelay(100);4 {. B  E# h& n8 t
   printk("open success!\n");
2 h4 j3 K% z  _( Z0 E! Q   return 0;7 J9 X' T+ h0 ]; i( C
}
6 F/ B4 e) K5 \8 J4 k3 g4 J4 o! @1 H( q% p
static int mcbsp_release(struct inode *inode,struct file *file)
: q  h& N# c7 M* b" N: x$ B{7 Y! P2 ?. V) X9 M
   printk("release success!\n");
, K* z; p& r: h( T# @$ E: O% g   return 0;
3 T) @$ g& k3 \* E0 ?6 i3 q  V: o}
4 v3 X  Y+ c- D
, }, Y2 D; V) C# sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( M+ d4 n: F; p5 n+ s# y{( \2 l8 T' w9 c; E
    copy_from_user(&DXR_data,buf,len);1 s4 J: ]' Y' B0 E% L. B) S' ~9 }
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' W5 u( k/ S% D
    return 0;2 O  q# c; q5 x4 }9 d! }# Q
* ~9 s- F3 Q. o( y5 h: v& j1 L
}  N$ k( U5 q/ N* N9 T

6 I0 x1 {4 H8 F2 h5 ?% ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& L' D; p" U- s1 C' ~8 ~+ |0 I
{
; e4 [$ k; \  Q   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" f2 q+ i; H6 B
   copy_to_user(buf,&DRR_data,len);
! m9 g7 D3 n+ s# r: l   return 0;
: T, [1 P5 y* n7 N7 [8 E6 {" v}. ^# r: @( U1 u, ?6 Z2 O3 {7 @! Q3 H

# H- T$ y' u, E  Q$ d$ X8 J, `3 a8 T0 |0 d, x
static struct  file_operations mcbsp_fops=
+ g- C' X; e5 W$ W1 A{
) j4 V' M/ c% ]: P  X/ f4 y   .owner=THIS_MODULE,3 Z5 c) Y1 ]7 v' j* ^6 U
   .open=mcbsp_open,
4 ~' u- w; }; v. i$ G   .release=mcbsp_release,
( B; s& Q; z1 ^) t   .write=mcbsp_write,. I# B' i# Q) E- M0 Z# W7 I
   .read=mcbsp_read,
2 s6 S2 A* \5 @1 ]+ x  s' q" h2 N};
2 n! Q/ p- e: ?( V/ ?$ cstatic int __init MCBSP_init(void)( P  A5 t8 Z. G
{5 p/ ?9 P# v9 c  _5 T+ [* b$ U  E
   int ret;
9 C1 s5 ], ~* |" a8 Z   unsigned  int   PINMUX1_REG_old;/ A' v7 z( e% v: a! G& ^
   unsigned  int   PINMUX18_REG_old;
1 ]* i$ S3 I6 R   unsigned  int   PINMUX19_REG_old;: Y; n) }! z( v+ U! b/ t2 h2 [) ?
   unsigned  int   temp;  ' c6 w8 I: |* w, h0 F
   if(MCBSP_MAJOR)* H6 v. U; D& o0 m2 y6 j- g. D
   {/ O) Q$ N9 P. i
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. o1 p% I# |& ^3 a9 f6 I2 k      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- g3 b7 V6 P) ^3 D. w  r! n% M8 L( z. N
   }- P5 d  _1 I# k5 f4 z8 R' S2 s0 p
   else, G% ], y! ?8 w5 \3 p! |, V7 v
   {9 G2 z; n. D( H' {
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 ]+ M& e* X! C3 f' V1 `      MCBSP_MAJOR=MAJOR(mcbsp_dev);. l$ K  f9 d5 A8 S: {
   }
5 Y' T9 e+ q/ m8 X   
8 G. _" Y# B* S4 T$ i: i' o   if(ret<0)
8 {- x) y6 l0 w3 W# ^- E) u   {5 u0 U( Q% @7 q  f* {1 B4 w/ @
      printk(KERN_ERR "register chrdev fail!");
3 n7 y# ?9 E0 o$ r4 U- [      return -1;
+ u  V' v% b$ C/ p" _% O# L   }
* [& o9 f1 q% u; a% {& j, r. O   . C- T% j7 M; X8 C/ l2 v, r( l. [
   mcbsp_cdev=cdev_alloc();
# R' i2 H+ P, D; `+ D+ J   ( m- F5 s& T4 X" ]4 ]4 s, D
   if(mcbsp_cdev!=NULL)
. y- E! M* w; P. R  {" _   {* b" m4 q8 Y: Q
      cdev_init(mcbsp_cdev,&mcbsp_fops);" z) @( n7 |7 `- D" }) ~  E* W  o. ?
      mcbsp_cdev->ops=&mcbsp_fops;
8 \. H/ x8 R: \8 n* Q$ {- h      mcbsp_cdev->owner=THIS_MODULE;) m) ]; [1 ~( K) w
      + }- x2 k* [8 A1 y& j6 x  c1 d
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), _  c* \' T6 H
          printk(KERN_ERR "register cdev fail!");6 l7 m5 Q3 y6 _* s! k
      else
* r8 I) l8 [7 q0 n          printk(KERN_ERR "register success!\n");7 ?. n3 i+ V! w. \' D/ A0 ~
   }4 x  K1 t/ M! h3 t  S
   else
, O# v/ B. E$ V8 s$ Q1 @& V) r; {   {
1 G7 ]. }; U% I5 a9 o: E$ f9 I      printk(KERN_ERR "register cdev err!");
/ k# G) w& u# Z+ y1 V/ M5 u3 L      return -1;: o+ Q5 p: b4 r
   }/ N9 c# p. ~  G9 L# l0 y' \
   
. K; l! z+ K; g2 k1 r  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, p; S+ a; q  F1 b7 H
   if(IS_ERR(mcbsp_class))
/ z  G9 \$ q2 B, W& j3 n, j   {/ S2 J- Q2 O# o! J
      printk(KERN_ERR "register class err!");! f( `# i' Y0 `5 _
   return -1;
6 ]1 S8 z& C$ ~7 f- K   }
0 C1 W6 }% D: v0 d* n+ i3 }- b# E   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ y0 M$ @0 O! w% C9 X7 r3 ^! v  c  G6 ]& C- b3 ?; d: `
   //PSC
- i6 A+ H, u/ [& B   //add Enable MCBSP: ]4 g/ h2 w8 l8 m3 x  y
   //test
. {. v7 a! Y) x   temp = 0x80000003;
1 g$ O% v0 p, |/ D   writel(temp, IO_ADDRESS(MDCTL15_ADDR));( Y# l* D5 ~. x$ K0 C# a
   temp = 0x00000003;8 J- ?; @5 h0 |
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
! ^/ h( Y. R) q1 Y " r* x  \  l2 v8 }- i
   temp = 0x001FF201;8 h2 {) E1 N' ~. B2 l
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; u# C: O9 X1 G, k1 U: V
   % [& `. ^# }& h2 E* Q6 [; g
   //PINMUX  ; ~& g0 l) ^+ j3 E! w5 b
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ V* Y4 @& v' _2 v8 E8 q   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
6 e5 R% T5 e$ D1 S, O# a( V- N   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   . ^! W) O2 E# s% L/ j, Q  x7 s
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 T! I, Y* O: |- O
   , F; \" ?* X- S
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( Q1 ~( C% y! C& \0 j3 J4 g   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  9 }7 m1 L8 ~  J1 Q* z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   6 @7 p, u( k. {9 l3 P
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; R# B3 i* A! u! l
& I( r3 S6 E% n$ s7 }3 Z   //RESETn,L138_SHK2
  o- M$ x: w" K: |   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  9 b) ?' s' X/ F* n) P% ~2 g
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   3 ~5 v$ n4 g, N# {9 y6 H: I
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 p1 }& k% V: L1 N. |% U- r
4 }% j1 w2 J, Q2 w4 S5 C: G
, U4 ?! m+ a$ ^6 [! r- y4 D
  //SPCR Register, f" E' a* a' K/ r
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 s) w/ g% c- k- F' a0 b& M
  temp = 0x03000000;//(DLB=0)
( C2 E  c0 F/ I // temp = 0x03008000;//(DLB=1)( I/ w; w; ^8 x; G: R0 d; i
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* n5 O% l/ O. Z, w+ R
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 G; I; n! v7 e0 I2 ^5 F  printk("temp=%x\n",temp);- S- E! ^  _8 }9 Z/ ~

( |  a( }1 ]* ]# m3 n" E! r   //PCR Register: R) s. W# J0 f! F, L
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- q" R* }0 q. y  // temp = 0x00000F0F;
* X3 f: e+ T) \. B  temp = 0x00000B0F;1 ]' K" i$ \( o2 V: d( R
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ! |+ k7 v& k; ?! |( m
  temp = readl(IO_ADDRESS(PCR_ADDR));
8 h! S7 S2 Q  x2 B1 {; a& A6 ~  printk("temp=%x\n",temp);  
5 [- x/ ~1 k3 W7 v0 u. |7 I   //SRGR Register9 f4 b6 H! J+ X8 ^2 _4 ]
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 u" M0 C6 Q, O2 [, a //temp = 0x301F000B;! E. m* z( \! O  \! E7 Z) S
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ! k8 j1 J5 y3 m9 }/ n7 R2 q. ^/ \
  temp = readl(IO_ADDRESS(SRGR_ADDR));: A: G1 B) X2 p+ {( V% A
  printk("temp=%x\n",temp);7 ^" B- n1 C/ v% ^) w3 |
   //RCR+ C3 h9 y- U, o$ R1 I6 ~
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- F) ~" [! f/ w- L  y& k( q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
  K) N6 Z: l5 U6 j+ {) I- l1 p   temp = 0x00440040;( L: L% A" O! V. g# `/ b" K
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
: w' @* s6 y. L6 g   temp = readl(IO_ADDRESS(RCR_ADDR));$ S0 @. _8 w4 A9 G7 v
   printk("temp=%x\n",temp);4 D- b2 f' \9 U, Q( Q
   //XCR4 p: U( X' F9 U9 G2 T$ j# L7 Q
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  O6 {# f- P8 D5 Q, S   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-05 e( A# s2 y1 i! R; I5 m+ J3 z
   temp = 0x00440040;
& W) n+ m7 `0 s: M   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
7 f- l' m$ T: h3 Y% E8 K# G) f   temp = readl(IO_ADDRESS(XCR_ADDR));% S8 [5 `) v" _% i2 E5 e, U( Z. k
   printk("temp=%x\n",temp);' Q) `  m$ r; k# ]6 Z$ m# E9 g4 B
  udelay(100);
/ Q0 |0 A* q! V6 o  K2 p) K  //SPCR Register! h$ m9 m- j5 `: r- z4 S; N7 X+ K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 @, b, i) `. G* D) Z3 X  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
% P7 R! A4 b9 j; ?$ ^' H7 E* O  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled; @! r2 B* ?. ?4 s
  temp = readl(IO_ADDRESS(SPCR_ADDR));, @$ G/ Z9 [4 K7 V  R! I
  printk("temp=%x\n",temp);; N  Q5 Q- [3 z9 j! P4 V
  udelay(100);  m2 c% I+ h& Q2 e5 z
8 ~& J# x& p6 U% m) i
  //set GPIO direction
( p" C# p1 Y1 v' E8 ^, U) g0 v& }6 W   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 g  h. ^" v, B7 @   temp = temp | 0x00000100;//EPR----input
5 F( V- n- M/ f& Y( ]4 T& L   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output6 N; |6 I3 Y. ^, f0 o1 C' ^% v3 u5 ^$ k$ C
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 3 Z5 K8 Q. v$ n1 X. U
$ c, C3 b4 Z/ K4 }1 ?
   return 0;0 G; w) K+ _$ t1 f4 Z+ p2 x
}
% D! i6 X5 o8 v4 z" }; G) F9 |static void __exit MCBSP_exit(void)$ d8 V* d& q, b$ q) s& ?1 x
{8 ?/ h$ U& P; J2 I
   printk("mcbsp chrdev exit!\n");: C/ `! P7 z  Q" \
   cdev_del(mcbsp_cdev);
- ~" K' n! Y3 i   unregister_chrdev_region(mcbsp_dev,count);
3 t8 b+ R' ]8 |$ r) X   device_destroy(mcbsp_class,mcbsp_dev);
# F" U4 ?! n. X  e- O$ ?/ k, a6 D   class_destroy(mcbsp_class);
% ^& M2 F, D7 r8 E. {# O}
4 A7 |+ e8 H- v( ]' Vmodule_init(MCBSP_init);) L& g; j& ~9 J/ f
module_exit(MCBSP_exit);/ `2 z4 Q0 t% }8 u1 ~, _& S3 q
# [, n$ g4 b7 r" P# P  F3 m
MODULE_LICENSE("GPL");
3 _* m! y$ s0 X. S
% S$ W! n9 H7 s- r5 V我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! w4 W. Y1 f5 Y! Z( S; M我的应用层的测试程序如下
$ Z, \; v% e! X" _- Z#include <stdio.h>
+ T1 U$ f4 H) `% j1 q5 b- }#include <string.h>% }  ?& q# f  |, |
#include <fcntl.h>2 l  I9 a5 E' z9 [/ G7 _0 f
#include <unistd.h>
- [7 @; G+ M' b9 \9 S#include <signal.h>
3 t/ w* c  }! g( z. P! I. f0 E3 n9 ~#include <pthread.h>       //线程* s: V9 ]3 P% T* Q6 o9 Y& v& k
#include <stdlib.h>( k! b% @4 L' h' a" D' p8 p
#include <pcap.h>          //捕获网口数据
, y5 ^% z+ y+ |6 \7 Z! F$ ?* k#include <semaphore.h>     //信号: f7 H& D- f) J/ E
#include <sys/types.h>     //消息对列
+ K: v0 H! Z  e- M! Z#include <sys/ipc.h>       //消息队列0 {3 h9 U2 H: k( ^( z
#include <sys/msg.h>       //消息队列# |+ k" v2 ~" a: ~
#include <sys/select.h>3 [5 s: e' s6 g2 `
#include <sys/syscall.h>
8 C+ b2 q. o3 Q: w* c6 s#include <sys/stat.h>
3 @- `) f) {% G/ h( F#include <sys/mman.h>+ j! _" e  j" m- n
#define msleep(x) usleep(1000*x)
) F5 N4 R) ?( K1 n3 U# c2 ~  P6 l
int main()
. e% p+ Y! g0 {/ e7 W5 j: ^/ u7 [, K{
# K: ^8 e$ H+ {' c( k6 ]    //MCBSP,ARM与AMBE2000交互设备0 b1 w  ?  W6 B. s
int fd;
9 I8 r( ^4 m$ X0 R: v4 v unsigned short data_write = 0x5555;% w: _; z. s: \2 f  }
unsigned short data_read = 0x00;
* I* x3 n( ]- C8 s2 S) z& Q  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
  Y4 h0 D0 Z/ Y& t6 s. b //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( ~  B% ^5 w' S$ q
   
3 w; z6 Y& y$ T, J1 P1 U2 b  if(fd < 0)
% \  C0 R% L& O( C$ Q+ r! ^  {
* S4 h/ a; G6 @( N' e     perror("open failed\n");
2 C0 x$ O; U- s8 b; f* w; k; Y     return -1;
* G7 _) L) {7 V) o2 R) ]# @2 Z% C  }+ r; k. |0 W; l* ?
  
' @: I. R4 }* S7 L( J$ F  while(1)
' i$ _3 p2 g9 t7 s- L$ L" s  {
' _; T- |! J+ L2 ~0 `: N   0 i5 a* X6 d. J. m
   //AMBE2000每次读写是24个字为一帧6 V" _1 ]4 N' R7 x" {
   //写数据时将数据在底层存储起来,等到中断的时候再发送# w" j! b- A) L9 z. }& L
   //AMBE2000输入数据是以0x13EC开头的! l* v: i  Q" Z# ]* `  ^; l# X
   write(fd,&data_write,sizeof(unsigned short));
7 f- ?- B& l. E   8 S8 s( y) ]: p7 h
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层    k4 s. K" u/ ~( F3 V" D
   read(fd,&data_read,sizeof(unsigned short));: @  @/ J# a, A
   
" l0 L5 w9 v  ]0 z! p  @" P7 I   if(data_read == 0x13Ec)$ U6 ~: d, y6 T1 B& y1 h
   {6 A5 A7 o: g$ i" D1 ]0 \( ^5 L
   - D! R$ z! }7 q% ]5 u
    printf("data_read = %x\n",data_read);
, {3 a- t5 J# N+ ?# w( p* t3 h   }
- w/ e; b$ c& k  E: l   
, v# d1 T/ n6 |   msleep(10);7 T7 J7 ~2 M4 C/ c4 r, c" C
  9 O+ |0 T/ J9 P- U
  /*
) g$ K* v; W9 l/ m7 O   ioctl(fd,1);   % }: i6 y+ Q1 M  l
sleep(1);
; Z7 g- P8 v2 e6 n8 s ioctl(fd,0);
  p1 [( i/ L; o" K9 k9 @ sleep(1);# n2 p) e4 I; {& C9 m
*/
4 ~) \3 ?9 v7 t+ H5 Z2 G  Q  }   
7 [7 S! v4 @4 i" u) N% ^  D return 0;7 o, P2 g9 V- u5 A( p+ i3 H, S

, b+ N; P% D! A2 N0 E1 Y+ k5 W}! I6 }0 v/ r4 I" I( `( Y1 ^
1 w, V2 e) F4 F! W
多谢各位指教,谢谢! 急8 e( i, a3 V6 `/ M8 M' h
+ s; E& f9 Q. v* G! t/ x; P
! ?+ H; P: p4 A8 ?1 ~

& D+ h% w. w: Y: ~: ^' {
# F/ @3 t5 V) [) n5 i  l" v: d3 D5 z' o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 00:23 , Processed in 0.047388 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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