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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 U4 ]; P4 @8 Y: m
/*  K' Y! \; |; J$ N" f! e
* Copyright (C) 2009 Texas Instruments Inc
3 H, B" A" T' N *
9 D2 l9 S( [6 C# u8 [8 n6 a * This program is free software; you can redistribute it and/or modify
8 [% y9 ~0 T& l  f+ b0 N * it under the terms of the GNU General Public License as published by8 i7 T4 l4 n9 U8 @1 Z/ T! y7 i( X
* the Free Software Foundation; either version 2 of the License, or$ w  ^( k! s8 m9 i! v8 z
* (at your option)any later version.
+ r1 r+ ]0 Q2 p3 R# Z' a% P7 V *
" _7 E8 N9 a! t# e1 H3 I: T * This program is distributed in the hope that it will be useful,, a& R+ \% P# R
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* S' g- j0 C& ~% t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ P0 m! d  q0 `6 P9 v
* GNU General Public License for more details.( {6 W# `* h7 {# Q2 H* h
*
3 ]4 P( |! Y* k8 d4 d* t * You should have received a copy of the GNU General Public License
$ K+ e7 e# {4 q2 \  N2 j; k * along with this program; if not, write to the Free Software
: Y5 M( A$ D) H( I * Foundati  L4 b, j' a, z) t
*/
( V6 ~1 ]2 ^4 p' ^- n0 a+ T#include <linux/module.h>
9 C9 a) B) e# W. [  k* U2 L' V#include <linux/init.h>
: j0 I: S" h, }1 B8 ~0 e$ f#include <linux/errno.h>2 o9 T' L2 U3 K8 ]5 |
#include <linux/types.h>; y/ z' Z/ T$ K! X- `
#include <linux/interrupt.h>9 y) H( Z7 ~# c4 x
#include <linux/io.h>
5 z& v# ^* |) p5 G$ z! _9 q#include <linux/sysctl.h>
! N# H. D. E, k* T4 Y#include <linux/mm.h>
# y; |$ G% \2 p( `. q1 D) ~+ @$ L#include <linux/delay.h>
: `$ [# Y- C$ N9 i  }. q6 A#include<linux/kernel.h># f0 @$ x) I# P8 l, `2 ~
#include<linux/fs.h>
  F$ R6 V7 B. h#include<linux/ioctl.h>' V- q2 g: n, N0 g2 q
#include<linux/cdev.h>
9 k" x$ n+ Q7 |) a7 O#include<linux/kdev_t.h>
" |9 z+ H) t; N7 f: I- l6 @. n#include<linux/gpio.h>
* L5 Z; b* v. C6 U, G8 V  `#include <mach/hardware.h>& c$ F: M: }: x+ M: n
#include <mach/irqs.h>8 u2 ^+ x# V% B. I+ d
! A9 H8 z# v/ w& }
#include <asm/mach-types.h>- G# F& S5 K; f7 `, t- Q/ e- I
#include <asm/mach/arch.h>
6 A, v0 k7 }, c+ h; M#include <mach/da8xx.h>
% [) ~1 S  ?5 m" }#define  SYSCFG_BASE   0x01c14000
; S$ J, ~+ ^7 M! s* J0 ~- x4 H#define  PINMUX1_OFFSET   0x124 7 T7 z2 U  r- ?7 Z
#define  PINMUX18_OFFSET  0x168 % N# O% S! F, F, u
#define  PINMUX19_OFFSET  0x16c. {! S  s' k2 c! ]. n+ F- M& }
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
0 S& V6 A/ O7 g# S/ s, ^7 Z#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
9 n" |% w3 {6 r( h2 X1 y#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 ?0 n& L0 q3 `9 s
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
  [4 S& _# {" E#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; z9 }/ C! W* m9 O1 k0 x1 [; w! @                            # R3 o9 U7 Y$ k
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 a) v: Q( e# O& h3 J' P#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
" W, r% h5 F% v3 i+ a- U& D: M$ T2 g//PSC/ Z2 |  r; Q+ ^' ?6 k
#define  PTCMD_ADDR   0x01E27120  9 ~$ v2 r$ r, i  t
#define  MDCTL15_ADDR 0x01E27A3C" d6 V  b$ J1 w
#define  PDCTL1_ADDR  0x01E27304- F4 u" G+ q4 H% h- S( a0 h2 x
//GPIO8 direction# }: Y2 e% @! m( r# ]" p! E
#define GPIO8_DIRECT  0x01E260B0
0 j9 I+ h  @+ D, c: l! [  r4 V& c7 g#define GPIO8_OUT     0x01E260B4
$ n) }6 b1 l8 o8 [: b/ f1 `6 |#define GPIO8_IN     0x01E260C0: F6 ?' m; P: p2 J4 w

" @. o- u9 A1 r# K//#define MCBSP1_RINT    99              
$ }# I3 @4 r: ~, U7 ?//#define MCBSP1_XINT    100  
% e, a5 r2 h8 B2 lstatic int MCBSP_MAJOR=239;: s2 U$ M6 b) _9 D5 Y) p
static int MCBSP_MINOR=0;
' v+ q- u% z5 l# @% jstatic int count =1;# d0 M; F7 U$ o) T6 C4 r# M: N) ^: J
% Y' n* a. A9 h5 ^6 r8 V
#define MCBSP_NAME  "MCBSP-device"
, e( k9 O3 F- s8 ^: F
) F; \, r3 x$ A4 t; d7 ~$ M: Q# Mstatic struct cdev *mcbsp_cdev;& ?- ~4 D& O& P/ T
static struct class *mcbsp_class;- s% V  V+ g: i' ?0 }! M; r
static dev_t mcbsp_dev;
; ], P; `6 E/ {8 c; w/ @# G" W" k$ Qunsigned int DRR_data;; m8 R1 K" m2 F" @
unsigned int DXR_data;0 r% e: }3 Z, `7 Z1 d& x$ m
static int mcbsp_open(struct inode *inode,struct file *file)
) S' x+ h# ?% F9 G  ^{
* o0 p9 Y* _: A/ e' j6 X& s, [   , Y( N6 y8 h( g( d* A
   //interrupt enable,initialized/ V) N% u1 l7 S( w" `/ F; ]
   unsigned int temp;  X/ c- F. @% y3 P# i0 ]8 n* `( D
   //SLEEP_EN(GPIO8[10])---0
( k) M$ N: Q+ B) c+ z* ?   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ U9 {  }* j) n2 ^3 u8 Q
   temp=temp&(~0x00000400);
' K1 g7 S1 n; F$ ~0 B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]. }. O8 n: D- [
  //RESETn(GPIO8[8])----0----1$ ]% j9 E" S% {, q' H( {) W; C
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% O  x' Q( J, @" m# y   temp=temp&(~0x00000100);3 I/ o4 o4 Y; `4 i# F) B
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; C+ o; r2 A4 Z, w! d   udelay(100);
/ t" \( U9 I' m* B( n, |   temp=temp| 0x00000100;; I2 {. _& n/ p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% q) N7 N7 Q! C/ a
   udelay(100);
5 C: d! R8 M* E5 u9 q8 _   printk("open success!\n");- ]5 N8 t' `6 }3 Z2 q$ s
   return 0;
( x+ Y7 f5 d! o% ?9 |. W0 |}
3 A* `  |3 o6 ]- n7 s* e) _- n) S# W) y2 ~# R
static int mcbsp_release(struct inode *inode,struct file *file)
% \3 m; x+ g* F0 B! e$ C  l{
+ o+ B/ {* N& s7 O1 f/ |   printk("release success!\n");
' G6 _( W, l: p7 Z   return 0;/ N6 ?" T2 K; j: L
}- {- B1 z; m  s4 _. |' c
/ f2 }1 h  B: P5 w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! D/ S2 p  y- K7 e1 |  r{
( o$ Z9 S( r$ j6 h: U8 x8 v    copy_from_user(&DXR_data,buf,len);
; e8 T& n8 R" x$ a2 V6 z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       . W. s0 L- p! D# ~* u7 B8 K
    return 0;
) W6 \' K- W' Y8 ?* l" j( ?
8 O( W0 A* L' C) f2 M3 U}4 M2 _* z: y8 F9 g3 B# d$ B, M

  P( z7 d2 c! [' t2 I' m2 Mstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- i2 ]) ^4 A# Z3 D/ }$ _/ ]3 x9 r2 n{ - D9 x- F+ u6 |( N  d$ ~
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' v- H1 n7 r) d3 O. I8 N5 A
   copy_to_user(buf,&DRR_data,len); / ^6 J3 N2 u+ E' j! |
   return 0;
( ?+ f( }& {. ^8 B; T1 p* Y2 j}
0 \, Z1 W1 m6 b$ q: R& @. a, ^3 Y  @6 \8 S6 y& `3 J5 C
9 J9 u8 L3 a+ k
static struct  file_operations mcbsp_fops=
$ \' K! S4 u* M) m{
- O& n, ^/ }  Q) S& K, @, c& M   .owner=THIS_MODULE,  _. Y; [0 w5 v5 d/ i. Z
   .open=mcbsp_open,+ p& a/ e0 j) Z
   .release=mcbsp_release,* ~5 O: q) f9 T/ p3 L
   .write=mcbsp_write,/ D5 i, s, P9 Z2 l7 ~
   .read=mcbsp_read,
. z) k1 M: l/ e1 `};
' r3 [  i  p- H9 D1 H% O6 f( [2 Ustatic int __init MCBSP_init(void)
7 V1 O$ s! `# }2 K{
3 [% y+ ]" l7 F$ j9 p- B   int ret;
1 v* M% L1 ?) x$ z8 ^5 v" e   unsigned  int   PINMUX1_REG_old;) K; C1 x3 q; o2 M
   unsigned  int   PINMUX18_REG_old;/ p) C8 k/ y9 ?  i
   unsigned  int   PINMUX19_REG_old;: o9 J. c& J2 Z2 B4 L  h, ~
   unsigned  int   temp;  
6 O0 {; @- j, _( p) d4 t   if(MCBSP_MAJOR)
4 n$ ?1 s: O. w& `. j   {
1 l0 M) f! x/ P6 u# Z# L' }) J$ ~      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 k$ x% A" t* K8 [& K3 C& v6 |. y+ ^      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 F1 x: C. \+ S; w8 w
   }* t. M6 T) w0 j2 _6 n+ ^. G
   else
  d" y1 v; A2 I/ |# J1 e   {
8 S" @2 K3 |7 V: f      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ `% y0 h; X* B
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 w  o5 N: o9 C   }
  T( e- v: \% Z. ^   
0 f4 h4 e" [' \' `7 X, ?   if(ret<0)
" h  ~1 x, Z* w: t4 [   {9 B2 o1 D  V. p( Z: J  y' i
      printk(KERN_ERR "register chrdev fail!");; E9 t3 g/ Y& u- c
      return -1;
6 K3 v4 X7 [3 ]0 v6 ]" @8 s$ Y   }0 Q9 _% O* Q/ W3 u9 \5 W5 l
   
0 L2 b+ j2 t$ d# T3 Y+ i# }" [9 N% H   mcbsp_cdev=cdev_alloc();/ F3 f, \' F+ Q+ k" M7 \2 N
   
2 E1 X8 a! |4 P- l/ p& h) l+ t( s   if(mcbsp_cdev!=NULL)
& {0 o8 x+ U7 P% L) e  J   {4 s, i9 X- n; p, ]2 w# z( {
      cdev_init(mcbsp_cdev,&mcbsp_fops);9 g4 w6 X4 @; z- F+ _
      mcbsp_cdev->ops=&mcbsp_fops;
7 |" k1 D5 k3 s7 p% L) O4 T      mcbsp_cdev->owner=THIS_MODULE;
& |% m8 x% D( y8 L! \, c  e      # s( W" t, g+ L
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
1 ]. U* k" D4 d1 T          printk(KERN_ERR "register cdev fail!");
& J+ n1 P2 m; F      else% I( q6 H+ n& T7 I6 }1 L
          printk(KERN_ERR "register success!\n");
  ?' |+ U4 l9 R0 B; \   }! B: A" I9 S/ Z1 _* d
   else" d! q: V- d# \1 u* ?" W9 e
   {
1 c( r8 F; Q8 x4 z# y" j      printk(KERN_ERR "register cdev err!");
% k) T9 C( H) H      return -1;! a* `7 l- m4 r! {' c! B
   }
7 @3 m  o% \8 b; ^! I" C' X   
0 x- u# I; t! f  A( m) m  ]  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
9 @' K- D% P; o2 {; D   if(IS_ERR(mcbsp_class))) z! k, [* R+ z+ k3 W5 \
   {3 G! Z1 r% O$ n) c2 B
      printk(KERN_ERR "register class err!");
* p* v' R; {: y; ]" K& B2 Q   return -1;
9 q+ c9 E6 I. P   }$ w1 G/ D7 ]; H5 c$ P9 J4 Q; x
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ @; v7 u8 T& Y
  i- ?5 K8 J: C+ D( K/ E
   //PSC
! _  Z9 X  e. `3 ?4 |6 D+ C   //add Enable MCBSP+ _* y8 w: ^" U6 k' O
   //test5 i( c- U3 e! r) ^! q
   temp = 0x80000003;
, c# I& c" m  g0 @% d7 ]; {   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
) P5 u" {* G5 N( r   temp = 0x00000003;
( N" s7 @. o/ `* a  A   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# w4 B0 b# A) l# f
* i. t( d4 r4 g5 s( p& r   temp = 0x001FF201;$ k9 N/ `; W/ i
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ k% G" Y. d2 G; ?7 b* w( V  _& Q# E( r4 x   
& X; I9 k- i" n+ l+ {   //PINMUX  3 A8 }* O; J3 U% }% C
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 R( L7 n8 |2 \: w* Z$ W& o   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
/ R; s% A3 A" E" \- R* V% b! h   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
7 }) z- v, z4 p3 E. `   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 M) z  j' g! |6 x/ z6 J2 r/ e9 f   9 U7 Y0 Z% `' F, m4 D
   //SLEEP_EN,EPR,L138_SHK1,L138_RC+ K/ Y% X4 |; G- C% F5 @6 S' j
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
3 {5 c' b% g% J5 l+ j   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
& Q3 l, u5 A! ?" |1 q   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# @1 `3 P  Z/ n7 |+ Y0 o
7 V" [5 N+ R; `( U# {  i+ w; {   //RESETn,L138_SHK2
- ]7 @& T: A8 X% f1 }   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
/ P6 G& p; r; r* ?$ u. C   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 C: h9 e+ K% ^& r7 y  `   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 z) {! q: C. F0 F, W
, d! d$ d7 Z! x( H/ J& a

5 l4 d) r9 r5 O& L  //SPCR Register$ G3 t2 F+ g6 Z: f% T/ Q
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 m5 J- ?; ]7 ?$ e, T1 C  temp = 0x03000000;//(DLB=0)$ _4 R$ |, A" r8 ?9 ^  z2 Y$ g
// temp = 0x03008000;//(DLB=1); v% C, G  Z% p, f+ [/ j
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
0 }: y# ~! `  q( i5 V) x  temp = readl(IO_ADDRESS(SPCR_ADDR));
, L' V% M4 c) E) S; Q: n2 Y  printk("temp=%x\n",temp);: `6 n9 X9 I$ T' v

' `6 a4 c- R  V0 U4 T9 y   //PCR Register
, h+ y0 X4 o. M, f   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  r$ D' y- x4 `4 r0 j2 h
  // temp = 0x00000F0F;) ]3 N9 y9 i0 |& |: }
  temp = 0x00000B0F;1 d9 `! s0 m7 V3 Z2 K/ @$ q
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " w) l/ `; y' s8 ^+ w/ d9 `. t8 b
  temp = readl(IO_ADDRESS(PCR_ADDR));, R) ?+ u; p9 R/ E+ n5 G: f
  printk("temp=%x\n",temp);  2 S; H$ C: O$ H; O* s
   //SRGR Register
: v2 g; s8 i+ Y/ B. \! |   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 ?* y5 |9 `2 n1 @ //temp = 0x301F000B;1 |1 C2 H1 v6 {9 L4 f
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 H  J2 U5 ?5 l
  temp = readl(IO_ADDRESS(SRGR_ADDR));, Y( x0 S8 v9 T% t- K
  printk("temp=%x\n",temp);3 t* u7 J, c, v# ?5 t
   //RCR
# G# I! v4 D3 d, s; O   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) p5 w7 \4 ^: b/ u   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 }$ N( l1 I0 b
   temp = 0x00440040;, {" C5 ~+ [# ?, u/ V9 P
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   $ f9 P$ i# D( B4 g; a0 P
   temp = readl(IO_ADDRESS(RCR_ADDR));/ T! A9 g) _! o. y
   printk("temp=%x\n",temp);5 g+ h" J% a" C
   //XCR. h5 Z, V, G, Z' t
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 g, m# r( D+ w
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" @5 S) n6 a5 A   temp = 0x00440040;
7 j4 B3 _1 a4 @3 z+ b. x   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   , m$ d' Z1 `' ?2 m; o8 H/ @
   temp = readl(IO_ADDRESS(XCR_ADDR));  c9 Y  A# A' ~8 X9 X, w/ Z
   printk("temp=%x\n",temp);
" }2 @( Z) q! B7 d2 y* s: M) F  udelay(100);
- M% P& W' V. [8 q9 j  //SPCR Register! a7 I$ t& ?3 }
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, ~! T; K8 F; l1 o! n8 B2 E  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  k* s9 T5 D  K0 C1 m' t3 S; n0 l
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled3 \3 T# D1 e: ]  g
  temp = readl(IO_ADDRESS(SPCR_ADDR));% p; P6 X( K+ b  b2 Z" p- B8 _% F/ O
  printk("temp=%x\n",temp);
/ J7 |6 G- z* ^) F$ e2 j' r  udelay(100);
( R7 h8 q, a& Q1 S8 b4 J+ R7 c$ y) F- P9 ?  m8 A& G" p
  //set GPIO direction
" x! V+ s, W8 ]& h/ ]; h   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 _+ k, a  W/ B7 c   temp = temp | 0x00000100;//EPR----input
2 h5 t8 J% f! {- L; \: I. }   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& I+ m7 \8 ^. y3 H; X# [
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
7 k( T/ E) s2 g
4 j* C) U* i. l3 C; q& C   return 0;( J9 U3 @- M% `( v8 }
}
5 P8 |  F8 i8 G9 Istatic void __exit MCBSP_exit(void)
6 P% B9 z- M. f- w- `{
& r6 L! B& z, G! I# e- y   printk("mcbsp chrdev exit!\n");2 \$ \5 N9 y) U$ o
   cdev_del(mcbsp_cdev);& q1 c# N& f# |. [  x
   unregister_chrdev_region(mcbsp_dev,count);
3 x/ F0 d2 y5 a$ T3 Z   device_destroy(mcbsp_class,mcbsp_dev);
: C) h) S" Z3 Y0 n8 S( K   class_destroy(mcbsp_class);) C- ^# K1 n2 u$ z+ a. J/ A0 t
}
- @# e3 ~" m( P( i! K* f. _module_init(MCBSP_init);6 ]$ v0 ?2 S5 l- a  ~0 N7 y$ {
module_exit(MCBSP_exit);
+ ^- a" k* F/ N5 W9 p7 F9 D) \
* W. B: J# i$ R- \  e1 v' NMODULE_LICENSE("GPL");: l. @9 ]' G. d( y0 B

( s9 d: Z2 o+ I& x/ ^* w我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  C2 O  v! g! \2 Z3 |
我的应用层的测试程序如下
& ~' b$ _/ z; h/ P0 I' \7 ~#include <stdio.h>  e' h) U& x; B0 S3 k6 d) g% f
#include <string.h>$ x$ C% T. \. b' `
#include <fcntl.h>7 s- f( @5 `* e) {& h3 Z
#include <unistd.h>6 b5 E/ k9 B, t$ \: o% \
#include <signal.h>
+ e/ h; Y  \+ _5 n' B9 o#include <pthread.h>       //线程
+ _! @, h7 n& ^0 \( |6 O0 D* [#include <stdlib.h>) e) O5 A& _" R6 d
#include <pcap.h>          //捕获网口数据  ]' \6 H7 t( K  @: J$ X8 z5 M) E( b
#include <semaphore.h>     //信号
2 e+ C, J& l, G3 \0 ?' {+ Y#include <sys/types.h>     //消息对列: J9 G5 `% A" b# D, C. ^
#include <sys/ipc.h>       //消息队列- [' i9 Z- j% K/ e) e* q2 r; e, v
#include <sys/msg.h>       //消息队列8 o7 B) E8 x6 l+ e
#include <sys/select.h>
& X% L3 q/ m  z3 Y#include <sys/syscall.h>
+ g4 b* _) h. b  T  n. h#include <sys/stat.h>
9 d  W+ h6 `: i9 d#include <sys/mman.h>& v# f/ J0 ~9 W" ~$ e" c; e5 T
#define msleep(x) usleep(1000*x)
; F: y$ D1 ^! Y! L' u7 s4 z
& z2 Q$ F* {8 `7 N" A6 Y" u. p7 oint main()
  J( d9 d- v1 X3 X2 Z{
7 p% N" u% @& S3 l2 H7 E" v    //MCBSP,ARM与AMBE2000交互设备
' A) i* |- I. r int fd;- M! _. B) t0 E4 F: I+ U  o
unsigned short data_write = 0x5555;
; \; U$ }6 A, |( {- N( c unsigned short data_read = 0x00;. B5 I. I4 T& ?' W! L) m6 P5 K" q& G
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 i) A# q! {7 Z& C, L //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( Y$ G6 M+ c) z    + h, z3 B. l$ P+ L9 q% W
  if(fd < 0)
! p5 ^( B7 F. i: S  {
0 }4 f! K% I7 u' Y- \/ J8 b     perror("open failed\n");* `: J! R+ u: ^& e; O" ~( |
     return -1;0 g# u& N* a2 M- b) X! n
  }1 N+ l4 N. D) _: g% h7 D& R4 b
  " y6 z! u& P% p$ P5 z  o
  while(1); c6 _1 v$ w1 r. _+ M- B0 H, T) L
  {
7 t0 X* z, k! F2 z& K+ o* I   
% I: u( T( D8 }! Z   //AMBE2000每次读写是24个字为一帧: }- \$ U+ }1 m# y: y  F
   //写数据时将数据在底层存储起来,等到中断的时候再发送
; {) }: d( d- Y0 e   //AMBE2000输入数据是以0x13EC开头的
3 G( L6 b% e) ^5 J8 o2 q4 l   write(fd,&data_write,sizeof(unsigned short));
. {/ W/ f, U2 I# ~  ?2 J! Q* b   
: N7 u' B2 x. U   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
8 w2 ]& O. K! Y6 J( j   read(fd,&data_read,sizeof(unsigned short));
  @4 p" g% W: H/ ]   
- c6 U. Y# R3 x* J4 P   if(data_read == 0x13Ec)1 j; m( i; O$ {6 k  Z1 C& k, f
   {: }1 U& o6 Q% u2 p6 f) b
     q" D1 k5 J% v7 Q6 h8 u/ g
    printf("data_read = %x\n",data_read);
3 F3 l6 J6 J; q) M" U, a4 g& V) M   }6 c' M5 _7 ]: R' m. v5 A9 a' b
   
3 `1 ]" k7 x/ q3 U   msleep(10);3 `' ~& [$ z7 m! ~- U
  * c5 Y: K: _7 y
  /*
: ^9 g8 ^& E% e/ D( I   ioctl(fd,1);   
6 q" h5 Z! i9 d: d  q sleep(1);
$ N3 l3 U6 E) L3 f4 V/ w ioctl(fd,0);
4 q* X9 a# N3 Q: S2 G9 f5 F sleep(1);9 ]6 V7 M4 l: i; G% y' v% I- C
*/ 8 N3 |( s, d2 s; m1 Z/ j9 m2 h9 s
  }   3 y: D6 `- N! ~% x6 B
return 0;1 _/ T) W8 a! J0 m% e2 V* E+ P
! D% M) @7 r; U* q$ P
}
2 ~4 c0 n3 n9 @2 c0 r( E& F/ J  c" j0 A8 O$ X5 T( G4 R/ R  s% W
多谢各位指教,谢谢! 急0 ?6 n' u9 K/ E1 X/ X3 M

/ O8 \: z! N* j  S1 L* T" O9 Z5 {% J0 |: f' W  J* M0 m
- E9 M9 ]6 ~2 F( W
6 A4 j$ x% `2 r& p5 X7 j

2 D+ X( E; w5 T; r$ {; }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 11:34 , Processed in 0.048310 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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