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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ V: D4 Y: g* A: i, v- u/*
/ l: p3 I4 j. f5 Y0 Z8 e% W; i: q4 x0 B * Copyright (C) 2009 Texas Instruments Inc9 S5 e9 ?; s& ~, A) M4 K( V7 }
*2 R7 K4 O% X( Y7 E7 R$ G" c
* This program is free software; you can redistribute it and/or modify
9 Y; H; w' S7 A. X  K5 I# k; l * it under the terms of the GNU General Public License as published by
' A3 b! v1 X% @" g+ _: Z' |$ G* B * the Free Software Foundation; either version 2 of the License, or  n2 ~# M5 r( Q# z- `2 r
* (at your option)any later version.1 S3 G1 c0 \. R6 w
*3 G, j. k; d) R1 p$ A
* This program is distributed in the hope that it will be useful,) |0 a* J5 W" b' h3 r
* but WITHOUT ANY WARRANTY; without even the implied warranty of
; t( e& \# `; h* K5 D  G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" k0 H9 w' Z" `  V$ x6 ^ * GNU General Public License for more details.
3 e$ i: `1 \8 c9 n& d  n7 _ *
$ e2 y; k8 K  Y5 ^; R * You should have received a copy of the GNU General Public License5 o) ]# p* ^  f" D
* along with this program; if not, write to the Free Software
9 a. H1 q2 B3 g# ~4 F5 k% W( m * Foundati
# v  \4 Y1 U& C9 l  ?; v+ {& ~*/$ L; r& p" O; T4 \
#include <linux/module.h>* B2 K3 H- Z, ^
#include <linux/init.h>
% {6 @: b0 t: y5 c* d#include <linux/errno.h>
; D2 A5 r/ |! U( S) ]0 T#include <linux/types.h>" V+ q: q: w! W  B* b( y7 f+ ?' u
#include <linux/interrupt.h>
' A& A# w2 b4 b3 G. v1 [/ |#include <linux/io.h>
" h  E! g2 N3 s( z6 Z#include <linux/sysctl.h>
9 ]7 T2 ?5 ]  [#include <linux/mm.h>
* @* W, j4 u6 S( Q#include <linux/delay.h>
  }, g; J% m/ c. ~0 `0 }#include<linux/kernel.h># q3 G8 m3 L% }+ L# o9 y, F  `) O
#include<linux/fs.h>
8 j  m3 c6 L3 }5 t/ `#include<linux/ioctl.h>
# d4 m* L5 S7 [% Y#include<linux/cdev.h>) A0 ?5 v4 H# X4 C. }/ z" k* t7 p
#include<linux/kdev_t.h>
  r6 g& T9 F/ ?/ y/ T5 Q#include<linux/gpio.h>* d+ i- v8 |7 ^9 J
#include <mach/hardware.h>' Q/ l6 D) N. M* F1 m6 n3 x8 y
#include <mach/irqs.h>6 U5 o! }: Q: J0 H. u
) P3 `0 i' Y# v9 x$ r! V
#include <asm/mach-types.h>
7 r# g0 H6 l' a! g) v  U3 X9 ~#include <asm/mach/arch.h>/ l7 g2 X% n0 v2 n0 d+ V
#include <mach/da8xx.h>$ P# l8 A9 o/ w: W
#define  SYSCFG_BASE   0x01c14000
, V$ s7 H/ G& |0 E3 K: w7 P" }#define  PINMUX1_OFFSET   0x124 ) G; [4 {8 e3 g! `
#define  PINMUX18_OFFSET  0x168
  c/ K. P+ D% L  h2 i#define  PINMUX19_OFFSET  0x16c
2 r& h  v0 K/ V& I; s#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
! K. t1 q0 k. K% H6 ^#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR; ~' h( s" D! E3 p
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR1 z# M& k" G  w1 w, S" x- n& }
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% @% I& t% C4 x0 ]#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; O! Q4 O9 S& q; v                           
- S; J9 [3 c2 K#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% N7 a1 A6 N# m6 S+ ^' u2 t) Z
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR; k  [8 t9 ^; H. f) e% U
//PSC
; O# l+ d/ N4 D+ ^  J#define  PTCMD_ADDR   0x01E27120  
% t- ]/ l  M2 Q! P4 N  H! Q7 l4 x#define  MDCTL15_ADDR 0x01E27A3C
! k& X8 ^7 j$ B#define  PDCTL1_ADDR  0x01E27304
# L  }2 ?/ |% E# B//GPIO8 direction
! ?) y. t' }7 A#define GPIO8_DIRECT  0x01E260B0
$ g& v/ W- c; ^' ]2 y#define GPIO8_OUT     0x01E260B4
6 M% j& u$ i5 {5 h! B1 x#define GPIO8_IN     0x01E260C0
) ^) l7 f& {% s+ }& J4 N
. h/ |% |9 F2 f! U//#define MCBSP1_RINT    99              & J+ L3 b  ^; z2 o+ f* G! r2 j
//#define MCBSP1_XINT    100  
# ?3 T$ |+ o4 P3 w' cstatic int MCBSP_MAJOR=239;
; A" g3 u2 N5 ]( L: p' L+ kstatic int MCBSP_MINOR=0;5 g* `% B; W2 l' U! C) W$ x+ {
static int count =1;
: |# @# T. h4 }( \: @
1 R* O" f0 h) B3 U) s& k4 d#define MCBSP_NAME  "MCBSP-device"
3 t, A' C0 e' A" ~, K6 E
" T+ v7 y& Q+ Vstatic struct cdev *mcbsp_cdev;
) V4 x& V9 y3 l& z% s* g. a. U4 Gstatic struct class *mcbsp_class;5 U. d7 H. a& g
static dev_t mcbsp_dev;
3 w) |/ m( u/ d: d1 g% L( ounsigned int DRR_data;
! s# W- b# n" Ounsigned int DXR_data;
% g3 D. w0 Q; @; M  G. Dstatic int mcbsp_open(struct inode *inode,struct file *file): I0 p9 r" o) w0 P: t
{
& D2 L; t- \0 \* Y, _0 t   
. w$ M4 D/ h/ s1 a1 o   //interrupt enable,initialized3 c: @, P) Z5 \3 Q( Y# C- G( H3 o, |
   unsigned int temp;, O1 i. M7 X" D. o; a
   //SLEEP_EN(GPIO8[10])---0* E- v) _: [! e% x4 f% v/ e
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 u! h* Z# W" ?/ y   temp=temp&(~0x00000400);2 D! ^0 ~: I' E, \7 c4 e
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' R% p3 T) Z- K& u
  //RESETn(GPIO8[8])----0----1. t0 k3 z$ m5 F" M' t! }- m2 O$ ]  [( U
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- V# t4 l# z% H4 b: ~   temp=temp&(~0x00000100);  i9 a% l' }: ?: R6 u" j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- D9 [9 Z8 k" A  g2 X* u
   udelay(100);
" V7 f. @1 Z" d  c- Z   temp=temp| 0x00000100;
- A2 F& _! Q) _$ h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1- v1 {# T0 v" D6 j3 a% a& C: W* }7 R
   udelay(100);
/ Z- e* P# ?- I8 s% r% e6 u3 W   printk("open success!\n");
; u* p& ^) a1 L) G' Z   return 0;7 ~* J- H' x! O
}
1 @+ u3 v" d5 P, ^, q3 ]3 c7 J- Z9 h/ A
static int mcbsp_release(struct inode *inode,struct file *file)
0 E6 o7 P7 m" J# h" S3 N& ?{  ^( Q9 B: \: h3 s3 i. N
   printk("release success!\n");- m4 b4 O  t: q/ \* \' I
   return 0;
4 ^5 C8 s. @4 R8 G5 U  W/ ]}7 u$ ^2 B* m; Z, ~7 @8 f
6 h+ G5 t) n7 U  _. Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 w# k! e: K& g, p7 p9 @( M{+ t0 g3 K. n2 i7 m& _# x" ?
    copy_from_user(&DXR_data,buf,len);
% m) E! |; r6 g; r- y* p* U    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* b3 b! X( j& _' Q" `/ t0 ]; q" b    return 0;
6 ~6 s" i* u- l: _3 l8 _* E5 ` : I* M/ P3 ^) U, P; G! n  C
}9 z) v3 `* c. g, h
2 H" c5 e8 x0 u# X5 ]  y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) d9 m( L4 E. H: l( g# z( ^{ & V8 {+ c: r7 w% j% y: |) A" ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ g! Q" V. H; e( w' c
   copy_to_user(buf,&DRR_data,len); - L' Z# R( U- Z) S9 V
   return 0;
! u0 Z5 `' N$ l3 M}2 S: D1 h+ E/ d& _8 }# R5 T

5 D1 r. F9 D( M1 f
2 o2 \4 o( g. u! k$ f: Estatic struct  file_operations mcbsp_fops=4 V$ x: n5 z! l) }# S
{# T7 f0 c# n: A
   .owner=THIS_MODULE,1 i* I6 `( Q8 N7 r) |# Y
   .open=mcbsp_open,& r* L+ O2 [' t- m. c2 Y. q
   .release=mcbsp_release,
) _$ Z9 `. E: J3 F5 w* u2 V; s- \( B, K   .write=mcbsp_write,
& o9 |; ~  B: _5 Y! ]; U8 B   .read=mcbsp_read,2 _) D9 P3 V' T+ a* T
};' ~! ?& y! a* [  g9 }3 L! \$ U# f
static int __init MCBSP_init(void). X& A6 N6 g/ x& S7 _
{) E: O$ y4 u! u$ d# M! W" a  o. V
   int ret;
9 i; i- J5 _' W' E/ o   unsigned  int   PINMUX1_REG_old;
3 b& T* r% {: `6 Y6 s% C: ?   unsigned  int   PINMUX18_REG_old;7 S' Z( s; n; B9 B6 I  o/ u, P
   unsigned  int   PINMUX19_REG_old;+ H+ |, |6 X# M0 L$ y8 I) }0 m0 O
   unsigned  int   temp;  
/ g5 }* _1 O8 K: P5 P   if(MCBSP_MAJOR)" L! w# S, P& G) u
   {
2 r4 V& b$ t! `      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
4 ^. u, z' [0 @/ H6 h5 j9 h' S8 X$ Y, ?      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 g5 c, t; l" p" Z  W- W- B& l   }& \2 K! e3 s7 @# c
   else
$ O) i  f) u6 ~+ H   {" j4 Q% O( V: Q9 ^
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 H/ {# f, U* a( T# d
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
: i4 N1 O6 i5 Z. V& L- p   }8 D# g/ I) \8 [6 H$ C9 l4 K
   
/ U# P! W  X" S5 Q" k   if(ret<0)
+ k* d7 i% B' l$ I% [+ [   {: \3 i! L7 Q6 C
      printk(KERN_ERR "register chrdev fail!");
1 U5 @; O& Z# r+ m  b# \* {! T6 F      return -1;4 L6 d) D# `. d* `. Q
   }
) e. @7 q6 K5 K; v4 R3 h! B5 p9 l4 |   
: x5 Z2 z6 p+ ~' B   mcbsp_cdev=cdev_alloc();
1 z$ M5 R4 X; l   
; W, B  |8 I( h0 A, j   if(mcbsp_cdev!=NULL)& Q. |- f" z# N5 {) L5 |' W
   {
- l4 f( X+ _+ G, v      cdev_init(mcbsp_cdev,&mcbsp_fops);* B8 d* W1 ^$ W
      mcbsp_cdev->ops=&mcbsp_fops;% i3 t2 _* [2 a' [8 L4 A3 R+ C! Y
      mcbsp_cdev->owner=THIS_MODULE;
; N, L5 i3 c# W        x- T7 c2 K0 Q) f0 j6 E
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# W$ B  e1 f3 |$ n$ }
          printk(KERN_ERR "register cdev fail!");
. v# u. B7 o: _1 k      else
  E+ O3 x1 t+ U/ n* [  X          printk(KERN_ERR "register success!\n");
7 Z) B9 [. o! c; L8 M0 o5 m   }
; L! A, V. ]* D, A5 A( d( N& M   else
/ D# W; J! C3 x- d6 a! D" K& g   {2 X9 H, G5 g: Z9 y+ F3 N- t
      printk(KERN_ERR "register cdev err!");
; j: Y7 y' d/ C      return -1;
7 d2 E$ l  ?) c1 i# z& B$ _1 `   }: ~- T! ]) ~) D7 Q6 P! _* X
   
/ c9 d4 q" R. _3 H  s" b  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ p$ {& F' m0 r2 f0 N8 d6 m" X% N! S% N  B
   if(IS_ERR(mcbsp_class)); u0 e6 P1 [5 U' c. Z1 N! w- |
   {. M9 v" n0 n) z- N( Y- i# ^
      printk(KERN_ERR "register class err!");  |. d0 N5 O. Q/ E7 p! c) h
   return -1;/ ^, q( f0 J$ c- ~1 M1 j
   }% l2 r& L' m& Z# z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 T5 }; n1 o+ y4 T

" G; d  g6 d/ p7 U   //PSC
2 G& }' \4 T, w2 O6 S   //add Enable MCBSP
8 Z8 O5 j5 J, A, P/ J   //test1 Y0 s! n9 U" S8 d- o& t+ P+ y
   temp = 0x80000003;
- J( Z$ I) Q- B9 _, F+ ~. C5 r   writel(temp, IO_ADDRESS(MDCTL15_ADDR));( D# I" a* Z4 r( |) b+ [
   temp = 0x00000003;/ u  P: F8 D8 W! m1 v& o# u
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ h' U) T. P# T. C8 q " j* H( B% P# N  ?/ ?& t
   temp = 0x001FF201;5 n& \; n& ?: `9 n* ]4 T
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 D& ?8 l  {6 C. v# k4 Q
   ( z) i' b' h& J- O. m' n
   //PINMUX  
! e6 J, o2 ^" u- \7 Q, f   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ W- }, Z: O! b' i# x- {. f" s   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 [; n% b( x. p0 R) D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   . ]: L- s  K$ P! q
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ S* D( |- h. P0 ?+ I
   ) S  J( b3 Y( g6 E
   //SLEEP_EN,EPR,L138_SHK1,L138_RC9 {4 }" N. q, R
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  # y" [' U( @2 Z  O" @6 W( s) j
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
, S/ r* e2 b4 D; s5 T7 n8 b   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( z' l- F' q6 }; E6 H8 R$ [' M: ~

8 x7 f: S) |8 g+ a   //RESETn,L138_SHK2) C6 E0 a  D( x! b9 p
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & q8 `9 Z3 c2 p7 w' ~
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   " f4 c5 o1 Y* m5 `' Z
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) ^$ r' Y% Y# M/ _0 c& U  Q- h' r
/ r: e% a8 W7 M% k# Z 1 x4 w3 Z, N- m
  //SPCR Register6 i( j1 A6 @2 D
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 A" k1 f+ F! s$ ~/ O( a/ D
  temp = 0x03000000;//(DLB=0)) |7 b: v9 J. o
// temp = 0x03008000;//(DLB=1). F& G& ~$ V) V/ i$ |) v4 v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
# d  I3 x$ L6 f- O  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 k8 H$ y2 b- @  printk("temp=%x\n",temp);
' I6 A8 f# L5 ]) d+ t/ ^
0 p5 G" [/ ~: o' J' K+ E   //PCR Register
( `$ v! a/ y) h0 w  j; P6 t- L   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, H! r* U% }! z0 L0 s  // temp = 0x00000F0F;+ [7 ^& I9 V* L# x4 H
  temp = 0x00000B0F;
5 m% {- F) B2 n0 N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 4 ^7 q9 v/ G6 M" E( m
  temp = readl(IO_ADDRESS(PCR_ADDR));
6 B. j9 p# }: m1 A+ u+ o) C  printk("temp=%x\n",temp);  
6 L6 O% t4 W( m* ~   //SRGR Register
% R; N6 [8 d# @% \2 h6 _3 M+ p   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; M, o! v, e/ q3 ^9 A$ i2 U
//temp = 0x301F000B;
! _1 ?! U3 t( l2 {$ U   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
/ s" w! X$ `9 e4 P# b5 ?' h, l  temp = readl(IO_ADDRESS(SRGR_ADDR));
* P+ S6 z7 _7 G0 ?  printk("temp=%x\n",temp);
5 X) m& e# x8 `# |  x   //RCR
" J3 K- T. l# l4 X   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( v/ t7 c! L9 d
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 r- e7 K1 Q6 J$ h8 s   temp = 0x00440040;7 L/ O( u# k, S- o- v* L7 A0 N
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   $ O( c' w) z# f9 o! K
   temp = readl(IO_ADDRESS(RCR_ADDR));
' y# N# z/ C3 R   printk("temp=%x\n",temp);
5 X9 j9 w& p2 ]" x2 ^' I5 P   //XCR
5 b1 z7 Z  S/ ?, l- k: Z( `   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* U0 ~7 w4 \# v/ u& N" i, S$ n
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-02 g( ~2 |9 l4 x4 G7 d7 t
   temp = 0x00440040;( N. P2 o- r1 F2 z  q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   2 Z  x5 x1 ~& ?& o  H
   temp = readl(IO_ADDRESS(XCR_ADDR));
7 i- U0 D: ]7 w! l   printk("temp=%x\n",temp);
; R  F1 r! w* D9 f  udelay(100);
( m9 ?( I8 u. C  //SPCR Register, S  C* G8 i% F* Y  n# q& }
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& m3 B' P4 h) R0 R( b  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  \9 v/ f. ~+ A5 b8 l. A" S7 w  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
* Z6 x% V9 B- g* s: u7 O  temp = readl(IO_ADDRESS(SPCR_ADDR));' X. P  h2 C: a( C- c
  printk("temp=%x\n",temp);% \/ ^" q4 I0 F" ?' A! h# L# R
  udelay(100);
: A) ?' z: `2 L6 w7 }) m1 z" F! E
$ v. N6 ]9 k6 q: P4 z0 x, f& w  //set GPIO direction  c' B* ?4 ^, `9 i$ T; e
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( L2 R% d! t! {, Q4 K+ Z6 J2 ]
   temp = temp | 0x00000100;//EPR----input
1 s+ B* w( T9 S3 q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% \9 E3 u6 c& j7 L   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 y: r, c6 |; `' m
2 A6 x8 T$ M, g) m0 A) b! p   return 0;& `. |! G% w/ E, x: B+ {9 g9 I( Z
}
/ ]0 t( L) e4 y0 C# `static void __exit MCBSP_exit(void)
$ W6 T/ |3 ~' ]# D# V! u{, H. y* j+ B2 C; m) T
   printk("mcbsp chrdev exit!\n");
/ B3 M& F: R+ y: x7 S: T   cdev_del(mcbsp_cdev);
6 |+ ?( }, p8 ^, p6 O) w' y* R   unregister_chrdev_region(mcbsp_dev,count);
  }& q& ^' l; ]9 B* w   device_destroy(mcbsp_class,mcbsp_dev);" n' i* K7 w7 u4 O1 r
   class_destroy(mcbsp_class);9 i( ^3 ]' |% N7 H5 e$ G! [# H1 O
}4 u9 d6 \% a9 {  u( {0 U. I
module_init(MCBSP_init);  P' Z$ H9 I6 H, G
module_exit(MCBSP_exit);
" v1 M* d# P6 X7 l0 T8 B+ |% _8 `) n
MODULE_LICENSE("GPL");
' f' G0 @8 m) R2 ~; \8 [0 ^, B7 o# ^* E
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" D' A7 w& x. }/ j8 u我的应用层的测试程序如下
6 {* o( \+ u2 s5 Z#include <stdio.h>
. P: R% I& C& T6 L5 o#include <string.h>; {+ h  X6 Z) C6 {8 I
#include <fcntl.h>* {+ g" W/ L7 W5 Q  K6 Z
#include <unistd.h>* f+ E3 y- W% n$ x
#include <signal.h>) e* Z+ ]( ~( N. t3 N; v1 L
#include <pthread.h>       //线程
0 g- M* L. U3 ]% |& n+ e0 B#include <stdlib.h>
' B5 c+ Y, k/ a#include <pcap.h>          //捕获网口数据1 }. |% j# P; ^( W
#include <semaphore.h>     //信号
, E; f1 o) K* D. W: V7 w5 P#include <sys/types.h>     //消息对列
: t" a7 L! A- V8 a3 O: I+ T#include <sys/ipc.h>       //消息队列% l9 N' ~" v5 V3 w+ m+ ~
#include <sys/msg.h>       //消息队列
7 D" f% I1 N; I# B3 p$ l#include <sys/select.h>- I$ l/ U6 H3 R2 G- G
#include <sys/syscall.h>! x& `% ~( v! h3 s0 V
#include <sys/stat.h>( h0 @- x' y+ B* {0 v- ?/ {% j
#include <sys/mman.h>
, f) Q! ^& [$ k#define msleep(x) usleep(1000*x)( ^+ F' {# _$ y8 P- q. @
% `4 i/ y  i& v9 G* s
int main()
' e2 N5 y0 _% d+ B" }! ^3 Q4 m! @0 z6 e4 ^( p{
( h0 O2 m# O6 b    //MCBSP,ARM与AMBE2000交互设备
5 f9 ~9 U' t0 G7 R! ` int fd;
0 C1 Z4 k& O" q) q. L unsigned short data_write = 0x5555;
; ?% P, V& s* h7 _2 B* v6 o1 ~ unsigned short data_read = 0x00;% i0 T9 L; B1 f" y( l9 s" C6 ~1 E
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 \& @- N/ V2 }. b2 S8 p% y
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 B" j( Q0 w" C* \
    1 ?% l; [: Y7 |% z  P4 {  i
  if(fd < 0)  Q9 J( k' u! h
  {
4 _; ^% n* G2 `, G8 g     perror("open failed\n");6 s6 o& p% a' O
     return -1;
! I: O; A# f8 }) R2 a4 I1 I% I# p$ s8 n  }
% M3 |6 n6 e' _/ [  - ^' B: b. u. V/ H2 r7 Q
  while(1)
, `4 @# \7 G& E9 h* |  {9 Z9 N: I  |8 F5 J0 `0 i
   
- z3 p6 d  A3 _0 }) m   //AMBE2000每次读写是24个字为一帧
% w/ C/ l- \7 b8 ^( U; S0 T* X   //写数据时将数据在底层存储起来,等到中断的时候再发送
% ?2 Q/ K% p7 K& `$ n8 Z   //AMBE2000输入数据是以0x13EC开头的1 H9 V. A( B3 y  i; Q) u
   write(fd,&data_write,sizeof(unsigned short));' \- u" F3 h" Y& ]; ]- `
   ) [8 f0 E5 c! f5 l, G: e
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  1 E  F- }; F$ |8 d' q
   read(fd,&data_read,sizeof(unsigned short));
# C0 p- J+ \9 g$ E' I   
7 K' F' u3 k( G8 C+ _   if(data_read == 0x13Ec)/ W# v5 ^3 c% U
   {
- K) p  Y/ T. M3 d   0 J& O0 i# l. s( k# |8 ?
    printf("data_read = %x\n",data_read);
! g4 A, J/ b, v7 _9 v; L2 w   }# U( E5 z% d" M9 J: z: E
   
, Q: J' E- d6 n4 S5 t4 s   msleep(10);* D$ r0 |' h$ h6 h
  2 {7 b1 S/ D* X/ i8 ]; H4 o
  /*
! |/ g( C9 u  F# h   ioctl(fd,1);   1 P2 v' s2 B: J  k9 `4 V1 O
sleep(1);
- e  i4 s$ E7 M2 J# ? ioctl(fd,0);
5 J! o7 {% V# K+ ^/ j sleep(1);6 J9 s7 b9 K5 n& l% x( C4 K; |
*/
1 u4 W9 K$ y% |6 p( ]1 d6 f& y  }   ' G: f4 Y& b! V  ]% U
return 0;' P0 h" l. F7 L/ V2 I
: }+ B6 `! N, g$ D( L
}4 Q' J+ a* A, @/ k8 ]% s9 d

4 _& Z+ z- v$ W5 \! h多谢各位指教,谢谢! 急2 K5 g" N- c4 r% t

5 b4 y$ B8 C# d7 [1 f% ^4 R3 |' f3 t6 L

- T+ N+ V& Q& w( n( {  U: Z& D3 Q. ]. r1 r4 W2 d1 i; R/ [

5 ]+ J) t' E: p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-22 01:26 , Processed in 0.047575 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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