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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! ^; f/ `* h+ i7 \' O5 k
/*
7 M/ F- w; r. s * Copyright (C) 2009 Texas Instruments Inc
" O+ C0 _9 E/ l% A( P6 s, F *
6 Z# F  G1 ^: f+ v  l * This program is free software; you can redistribute it and/or modify8 }2 ^  b+ t, n$ q8 F: I2 }
* it under the terms of the GNU General Public License as published by3 W, }) i' x) L: m
* the Free Software Foundation; either version 2 of the License, or
8 f; p. Z( f, T( A; n * (at your option)any later version.
) E; v4 o3 X3 Q) S* P *- j+ g; n( W" [' \: }
* This program is distributed in the hope that it will be useful,
) u6 S6 ^/ w9 a' |% A$ k4 g * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 ^/ K- x  v4 C/ ]4 g5 o * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& P  E  g+ k  n) `/ O) C5 a
* GNU General Public License for more details.
7 a# S$ c2 @% U7 z! I. Y *
) S* G3 E* k& F+ i' B7 \7 b * You should have received a copy of the GNU General Public License
3 T' l& p- @# z1 U4 I2 n* ] * along with this program; if not, write to the Free Software
2 e- F  _+ S% N3 G7 `. _$ H * Foundati7 O! ]7 r5 w* F
*/
( ~+ n0 K1 ]9 c1 ?#include <linux/module.h>* {1 f1 \) f( ~; L$ _' H( Q6 a1 o+ A
#include <linux/init.h># k2 B. @' p4 y
#include <linux/errno.h>
3 n! R5 [3 _) a, q$ T, w# R. N# |#include <linux/types.h>% f# }; ]3 ~# }2 T- R
#include <linux/interrupt.h>* a& o& V) R0 ?% Y  N
#include <linux/io.h>/ V  y& u1 H$ }5 d- }; M
#include <linux/sysctl.h>1 d+ t$ o) j# e/ \' w0 f/ f
#include <linux/mm.h>
2 s# k% ^: L" ^$ A& W) {3 Q#include <linux/delay.h>
0 W1 \# U' l! j9 l! S7 w  \6 D#include<linux/kernel.h>
" d! s: Y" J. F/ ~8 x; b#include<linux/fs.h>
5 `, `/ x+ s2 \% V#include<linux/ioctl.h>& s4 s2 E0 E* i; \
#include<linux/cdev.h>
0 X7 t* d4 z% h9 C#include<linux/kdev_t.h>* T+ r+ B6 z$ D1 U
#include<linux/gpio.h>
1 {) z" `" @. e, [3 h0 ^  g#include <mach/hardware.h>$ I$ u5 }5 e$ y/ ~
#include <mach/irqs.h>
5 o$ D4 Y) a2 \  Y  V, _. B& y
- z) n- j, E" h0 x#include <asm/mach-types.h>, R; c( k) E: z* [1 A$ x
#include <asm/mach/arch.h>- [8 a  ?0 W, j3 o# Q
#include <mach/da8xx.h>
! M( S3 \4 D- \2 E- t, F( p#define  SYSCFG_BASE   0x01c14000
  T* O8 v( `6 [9 l' u  `#define  PINMUX1_OFFSET   0x124 # N$ J  m; O; E3 A$ ^( Z- C- R
#define  PINMUX18_OFFSET  0x168
0 [- J) C# H5 Y; U3 e#define  PINMUX19_OFFSET  0x16c
6 Y: P, O5 _5 j4 F' M+ M#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) u, R- ~/ w9 e#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 u/ a7 {7 Y5 ?# G& ~
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR/ K% f8 Q* M& F5 l5 G
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
. ]# V6 ?. I  ?#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR( }+ d/ \( m9 i: K1 z3 }
                            4 i% n+ E9 A2 g+ @2 v# a
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 g$ p! P, [) l* u& E* B2 N# B#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% b+ K: m- X4 k* Z) {
//PSC
& T0 b& H# g5 U6 Y#define  PTCMD_ADDR   0x01E27120  1 d7 d4 Y& x3 E, A
#define  MDCTL15_ADDR 0x01E27A3C1 s% {. L7 T' A, G" s
#define  PDCTL1_ADDR  0x01E27304
- R% w" ]5 ~- U+ e' i" t//GPIO8 direction( C6 z2 ^- \7 l% p* \: B5 s2 B
#define GPIO8_DIRECT  0x01E260B0
+ n7 s5 n+ O+ O( u* R#define GPIO8_OUT     0x01E260B4
+ O) l' o# h4 o8 r# x7 a! c#define GPIO8_IN     0x01E260C0+ {. _: _2 q6 U

7 X: t% t0 I6 n3 q! Z/ c//#define MCBSP1_RINT    99              
' n  m3 }7 |" ?5 I# g5 s8 Y//#define MCBSP1_XINT    100  ) A5 m6 u! h9 I% t! x9 r% G# |
static int MCBSP_MAJOR=239;
$ }6 R! B( m! Z4 g8 Q. wstatic int MCBSP_MINOR=0;
/ j& ?1 s2 X7 e$ R# D1 H) H$ Estatic int count =1;
5 ]% ?7 A2 [/ s8 K' D; q) p- N7 i% ~7 {4 q
#define MCBSP_NAME  "MCBSP-device") d- r7 ~, Z  K9 ~

# j+ G# w0 C. [1 \static struct cdev *mcbsp_cdev;; C3 q4 @* ?# g: b
static struct class *mcbsp_class;
; h; F. R& [/ W9 rstatic dev_t mcbsp_dev;
0 R% b  V# `! O9 u8 h/ Gunsigned int DRR_data;% g* x3 [( Z4 ?
unsigned int DXR_data;
* ^) g& U' K3 ^2 f+ _& [static int mcbsp_open(struct inode *inode,struct file *file)* w# v1 m+ l% ~& O4 q6 H
{3 V: v+ a5 U4 i7 V
   
+ V& Z9 s: K" `& F. `8 y7 n   //interrupt enable,initialized
, e. x& l2 F, `! V+ G* E   unsigned int temp;6 Q2 y" g5 z- f- y
   //SLEEP_EN(GPIO8[10])---08 m- F- ?$ {& \$ M+ v. f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: H! p2 \' y; M   temp=temp&(~0x00000400);2 p' a3 q, s. q  \& m  e2 J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- A% s8 U2 {! w0 c0 x
  //RESETn(GPIO8[8])----0----1) Z- V3 M( w; L  ^) h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. z6 L# |6 H7 p; y& l' t  x   temp=temp&(~0x00000100);
7 z3 @4 Q- ?+ Y! ^   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 Z( S/ g: {0 e- u% |4 i+ G0 J! A
   udelay(100);
6 _9 n7 D  d$ t/ l* v6 y8 }   temp=temp| 0x00000100;4 y! D$ ?# s) t' t* S/ p/ b
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; s8 y! A0 ^5 m  O" i
   udelay(100);- a# Q" H/ P* ^, m* t% N8 b5 O
   printk("open success!\n");
5 D* x0 d6 M, u6 S3 T8 `5 u2 v1 z   return 0;
8 p9 w- a$ K8 P; `- U* R}
, r  A" Z3 X# G; N! S
: f) i" ~( p- g. N! nstatic int mcbsp_release(struct inode *inode,struct file *file)
+ m: \2 W1 C+ t{
3 k" g7 @# g/ C2 s" j% I   printk("release success!\n");
8 f  E0 O2 q  ~$ e- J6 t- i2 ?& E   return 0;
; R( P3 ]4 _3 h  ~9 l! I- ^}+ B, f9 i/ |  G2 q9 d* N

. O( S# l5 [5 C0 n  {static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) G( }* Q; A% A' H0 b. d4 u
{- O$ x" K; N  o' m& ]2 t/ Y/ F
    copy_from_user(&DXR_data,buf,len);8 P' D% @* |( o4 K9 T1 e. q8 E' D
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" A, g' D1 v; A$ F& y* @! v/ f    return 0;4 o  V- C' c8 y, Q

- k4 g, I! h) `0 ]7 Y}
# K! ?; |6 M$ T/ B' v9 {* E, K7 \: k' @# t' D/ e" C7 I7 z0 g& @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% U' \" c0 R. K; _0 G# D{
. E1 X+ V3 J4 V  T$ y  h, {   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 f1 H; c1 I: y8 Q
   copy_to_user(buf,&DRR_data,len); 9 N- w# p% C. O0 A' ]2 p; j! f
   return 0;
, k2 v1 t5 U& z4 D}# p  b2 ?1 n4 v2 D

, V2 P5 G. Y+ c  b0 d  B
: L0 P. ]/ ~1 b7 Tstatic struct  file_operations mcbsp_fops=$ y2 W% a8 k! @. Y, E
{' G) |. i. {( f7 R8 _$ Z5 \
   .owner=THIS_MODULE,
; a6 n3 I6 p3 W   .open=mcbsp_open,4 V* l4 _. x2 h7 ^8 K
   .release=mcbsp_release,: r# a  J4 ^+ L8 `3 l. l( U
   .write=mcbsp_write,
# i8 L8 L9 G# Q9 V2 @, o, \! |   .read=mcbsp_read,9 O2 X# d- H( I' z. b8 h# F
};! z5 P2 S& z0 N
static int __init MCBSP_init(void)
% [  L/ ?# a: m: j{$ u7 o5 C) a( k7 }2 P$ @% K. u
   int ret;  b* M9 e/ D1 R6 @9 k" D
   unsigned  int   PINMUX1_REG_old;
' X! p. i# {- w' c' ?2 o- B   unsigned  int   PINMUX18_REG_old;! @9 \7 P5 G" M6 Y6 E
   unsigned  int   PINMUX19_REG_old;
$ Z# E8 T! }$ d  v+ M- L7 Z( a   unsigned  int   temp;  1 J" ^( n" }0 V4 _$ Y* K. w
   if(MCBSP_MAJOR). k* g, `- J: J
   {
6 I6 R' A9 q; r& d$ w; `0 J5 @+ f      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 H* u' m) H4 _* _! X      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 u7 U! k4 n% T# G* i   }0 |. G4 E% M& g0 U: Z
   else& |* {7 o; K4 t0 _
   {
& I6 h7 ^/ a0 M      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ w- X8 K, z5 x/ }% Y$ m      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, Q4 {& H7 [6 d6 l   }
. i% K+ ^$ s" v, q* j   
. f7 W5 I3 m4 w- {   if(ret<0)
6 [, V- K0 z' Z1 c  `   {
6 I9 X2 d' F1 S/ {  D. t7 b      printk(KERN_ERR "register chrdev fail!");
% ?5 L- z. i1 k1 p9 K2 Z- _2 |  F      return -1;8 t4 g: T7 @# F5 S2 j7 L
   }
8 g& j1 ?0 Y! w# a8 [   
" \5 V' z$ C* F" j7 @   mcbsp_cdev=cdev_alloc();
* y. o1 \3 }0 B# `   / o0 T& j6 P2 D1 _% N
   if(mcbsp_cdev!=NULL)% y$ P8 Y" E1 E+ u7 q
   {% W1 l2 I! `$ k1 q& P# S  i& H
      cdev_init(mcbsp_cdev,&mcbsp_fops);
# [! n5 }5 x5 G" g( k      mcbsp_cdev->ops=&mcbsp_fops;9 D9 {( T6 J' y: Z- B
      mcbsp_cdev->owner=THIS_MODULE;0 X1 o, l/ e7 q. `1 h1 K$ n
      
  c$ L. n: Z( ^      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 L1 V: U% \+ {# d' w2 v" P
          printk(KERN_ERR "register cdev fail!");
" _9 Z( W" E* \3 Z4 ?/ o. I      else
0 n8 `  q& {1 Q9 G: r          printk(KERN_ERR "register success!\n");# Y; k2 V1 z/ ?
   }
' D- l3 c0 g9 A/ u" B: D   else
5 x7 {* X! k9 b# l3 N" N   {
- i1 L' k  E" k0 d% [3 k      printk(KERN_ERR "register cdev err!");' f$ M. x  u5 s7 n4 g
      return -1;
4 c3 q+ H) `: f2 `" }# D2 N   }. f- L) i: _- U. n0 p) m
   
. h+ K8 U' W0 p7 J0 k5 ~  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ }) ?$ y; Z; g. q6 c$ p4 G
   if(IS_ERR(mcbsp_class))+ P- B! T) `6 S( f5 x
   {
- c5 I$ M+ Q' f1 e  T: X, _      printk(KERN_ERR "register class err!");
% ~' Z5 [# a; S9 m9 p& l+ Y   return -1;9 C& k- [. O, N$ O& y4 Z7 t' \0 O# p
   }9 ^# [& ]/ P* e1 V5 r- |# q! p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ E6 n0 ]1 g, q: ]/ U+ ~) \( v
/ K3 I$ z( P5 u4 q5 B3 {! P
   //PSC
9 `0 ?3 v% ^& a7 Q% F- o$ p- D, k   //add Enable MCBSP) B4 ~) D; f. M
   //test
4 c$ T$ {7 a& ^( `  l   temp = 0x80000003;
* h4 T1 d' F6 y8 I) S   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 b0 L# X5 E2 X0 S   temp = 0x00000003;* |/ w7 g, n$ d0 i( `  ~" F
   writel(temp, IO_ADDRESS(PTCMD_ADDR));( b1 M- `, v$ s

9 G( E1 B$ F( S+ o0 {9 Y   temp = 0x001FF201;
/ I1 ]6 q# c5 |' b9 _' E7 Z0 b1 W   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 h5 q- u7 E% T- E/ S
   
! S" V( S; N: s   //PINMUX  4 X' D* n, p- P8 `" s8 J, g1 j8 H* l
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. Q  Y1 k, C' a9 L) F
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) S5 T6 z! d6 X" Y( X# z$ E
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 a4 g. k/ x6 L6 ^8 ~   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 _  ], n: r! `! g8 F7 C   
, p5 s  v- ?% _7 v) o5 D- h   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 s/ J! O. e& D# ]   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % v8 A) {. T1 p
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   : o, x" _7 {% Y
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 I' j0 q. {3 \8 z8 X& ]& ]0 p! N

2 Y3 K9 v& u& M; h   //RESETn,L138_SHK20 z1 Y' w* H  m2 A* w+ |
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  0 o; R# _4 L+ i9 w
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
* A  @8 |0 f) ~. k  F8 Q  W" S: l. O   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: B# X8 ?. T( G# [# |+ h1 X% H

% ~! ]2 @9 }% W# _& c- r $ g% I. q9 f3 {' C; K5 ?# N; N
  //SPCR Register+ e+ U6 J6 @- }, t4 f/ ?$ A3 d9 L+ s1 }
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) ^# {" G' ]% ~$ d9 m  temp = 0x03000000;//(DLB=0)
+ p' g) R* h! w1 t2 L // temp = 0x03008000;//(DLB=1)8 [7 ~* v9 X# |0 b, S5 V! @# u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
6 s+ S' G# J4 d0 Y4 \/ \! Y  temp = readl(IO_ADDRESS(SPCR_ADDR));  Y4 L: ~* |2 y) l
  printk("temp=%x\n",temp);
' b2 o  W" [# }0 d1 `
( B# J' ]. G# X: {   //PCR Register1 r( {# K# b: |: C( X+ ]8 A1 S
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, Z- N& n/ v  f+ x9 I7 U
  // temp = 0x00000F0F;
; F- s+ _% P' P4 m9 J  temp = 0x00000B0F;
' a0 X  m0 _* K  M- z  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 4 Q: w. n( {7 T3 Z
  temp = readl(IO_ADDRESS(PCR_ADDR));1 f: }& @! V- n
  printk("temp=%x\n",temp);  ( U; G0 W  a9 V4 A, ?
   //SRGR Register. t- K- f4 u4 P! }% e  k4 X+ T$ ]
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ j. F! k  B( Z2 Q
//temp = 0x301F000B;" o* J& O% g+ M. |& Z# ?
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
0 c: y7 i9 K% f1 g  temp = readl(IO_ADDRESS(SRGR_ADDR));
- m: X. y1 V9 }& A# v% |  printk("temp=%x\n",temp);
3 W  Z0 @8 i; O' P   //RCR
4 @- U" N; }: v# X& L2 z. U6 M   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ A* P- t( P3 x
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 D, }( `1 Y! p1 s9 Y2 g  {   temp = 0x00440040;# [3 w' X1 Z; \
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
+ y1 ?8 d$ ]0 G! W7 ~$ [7 K   temp = readl(IO_ADDRESS(RCR_ADDR));+ B3 \. U" O9 y. r# S
   printk("temp=%x\n",temp);4 P8 d4 n3 D% W2 }
   //XCR
" B0 s1 \: s4 V' i- `   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 V/ V4 W8 O# B4 P# r& ^2 M
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 g+ J$ S' t- G9 Z- J9 H
   temp = 0x00440040;
. j! _$ h3 Q4 K' I   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 o. @5 _: ^6 A  P: O   temp = readl(IO_ADDRESS(XCR_ADDR));- s! \5 X: v/ e
   printk("temp=%x\n",temp);
2 y" ?. Y9 k9 Q( [/ y4 o' K6 {  Z  udelay(100);4 B1 @- {( n/ d2 c3 k# I" N! Z
  //SPCR Register! ~; q8 B/ l1 J4 c# `
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 T1 Q# [0 ]& @, v! `  temp = 0x03C10001;   //DLB = 0 VS DLB = 10 X) H* }1 H2 }% _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. ^2 y: q3 D6 j4 _9 v% H8 p
  temp = readl(IO_ADDRESS(SPCR_ADDR));& y, X5 O1 X6 ]$ |
  printk("temp=%x\n",temp);/ {# h2 y8 r& F, s& ]) f
  udelay(100);9 _5 O2 I0 C( y1 A* q5 r
9 a% n! p5 s  J5 ?
  //set GPIO direction
% [3 _& M: ?4 T) E2 N! |   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" B8 G# o5 ?. c/ R+ X* K8 Z   temp = temp | 0x00000100;//EPR----input# |3 n$ `5 |' a9 o) k
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) P- H  y/ L6 K( O0 h2 I9 B   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) n$ t" w+ p* _ 4 B$ B0 P* N& P, W
   return 0;+ [: V, w) f4 n2 n3 S+ y
}% m4 |% P5 g  K9 K- Y
static void __exit MCBSP_exit(void)
! h: R7 s4 Y7 X: i: R{  ]' x' Q9 `; L5 z- O
   printk("mcbsp chrdev exit!\n");% ]) L& |9 L7 @( Y. e& u+ ^
   cdev_del(mcbsp_cdev);
- r& u( ^2 n( T9 l' i1 i" M   unregister_chrdev_region(mcbsp_dev,count);
9 ~5 e. A) j$ M' _+ r$ Y   device_destroy(mcbsp_class,mcbsp_dev);- O/ e: A6 S! c3 O
   class_destroy(mcbsp_class);
* C( V2 _6 r$ g* R/ G' `( w}
/ ~& P* {+ G* _5 Imodule_init(MCBSP_init);
; m  n# O; v+ xmodule_exit(MCBSP_exit);
  f) |( O( Q& U7 S6 i8 k# B' }' U- t5 L2 Q
MODULE_LICENSE("GPL");0 s% @1 m  [* H% \

' U! w+ ]8 U' \* E, K我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  U5 x/ u  j1 x/ H
我的应用层的测试程序如下4 B" |+ P! N3 R5 ]! ^  u1 i
#include <stdio.h>! l" j6 s& B+ N& z; x; \6 n" j
#include <string.h>2 X7 \# S  Q* M0 E
#include <fcntl.h>: z. x) m: u9 y& [- ]4 N: s. w
#include <unistd.h>
  N- K5 `0 P4 x7 k#include <signal.h>3 D" A, A0 x% S; j
#include <pthread.h>       //线程
1 a9 i: }4 T2 G5 C3 e7 [3 n#include <stdlib.h>- n8 q4 ~6 ~+ u7 Q) x. I$ g
#include <pcap.h>          //捕获网口数据' {% \1 ?2 \5 `7 a% n9 J
#include <semaphore.h>     //信号( q% ~  y! ^8 d
#include <sys/types.h>     //消息对列
6 c/ ?& e. g3 t- H& _4 n- B#include <sys/ipc.h>       //消息队列
' O) v3 ]0 V* J# d" b6 i#include <sys/msg.h>       //消息队列7 l! P% ^* ^* ~' x  i
#include <sys/select.h>
% D' D  \2 k+ `' W, o. b  y#include <sys/syscall.h>
2 T/ v/ S" T- b" K' x#include <sys/stat.h>3 Z6 t- f2 P0 I& Q( r
#include <sys/mman.h>
$ K1 T* e9 \& b! ?6 `: [8 s6 T#define msleep(x) usleep(1000*x)
8 H- l9 Y3 x9 v) [8 f! y7 {0 ]( Q( ]
8 y( }4 |  Y* N/ ~+ [# eint main()% }% q/ O( n& n$ \
{ . Y; p* z, X5 O: o: G, O" i
    //MCBSP,ARM与AMBE2000交互设备
6 w5 o! Y* o$ C* \ int fd;
0 Z" w6 G8 D& i" G" _' u- z unsigned short data_write = 0x5555;% H: u1 D  Q4 Y5 K: p6 Y
unsigned short data_read = 0x00;" y# J- A$ K& W7 i- x/ x
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( f6 o& k8 r$ x6 P/ K //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 Z/ p/ c0 o# n/ n3 q
   
3 d# D0 d' a7 I7 U  if(fd < 0)
; P3 O8 V/ m  U* ~$ Q) G  {
0 d# l0 H8 T+ T& [     perror("open failed\n");! G. J' d3 h/ N3 A  {# ~
     return -1;+ C: ^( `. q( z) S5 @) Q' r. |
  }
: j2 P" g& F9 w- B2 k$ I  
7 m' Y1 d, @& H3 {! w$ B; @6 Y  while(1)
9 h0 @& w0 T$ I, X. C! q4 q  {# n) o' M0 D! o! X+ x
   
8 O9 i/ t$ i1 z. \( s& m8 p; E   //AMBE2000每次读写是24个字为一帧% Y. M1 v/ F$ w1 }
   //写数据时将数据在底层存储起来,等到中断的时候再发送2 o5 n5 i7 b* ^$ O5 B9 R5 k4 U$ G% K* s
   //AMBE2000输入数据是以0x13EC开头的
9 P; A! _+ h6 o, X" G( l7 X   write(fd,&data_write,sizeof(unsigned short));
/ z* a' E3 H& `0 v. X, w9 d   
+ d6 T: m9 ?2 r/ e9 z$ w   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- c$ b8 J9 N8 b( M   read(fd,&data_read,sizeof(unsigned short));
; |% \3 n8 T4 f5 c1 }) J" q   7 `4 p7 x: j. I8 H& p
   if(data_read == 0x13Ec): N7 H8 I) p( w
   {
( y( i3 G- m6 Y: e! o   
  s* ~4 |9 ^1 c3 a' s. W    printf("data_read = %x\n",data_read);& |% E, F! P0 y  p( m4 T& n  c  D: x
   }. {* I7 H5 |/ T. ]5 Q* ]3 t; d8 L
   , s. w3 _6 R# C
   msleep(10);
% F7 w1 i) B8 Y2 E' l. K+ _: C  + H3 j0 n% f8 h; x$ \' z5 N
  /*
5 }+ J0 t. x$ U0 O- N$ K& B7 z% a   ioctl(fd,1);   & Z9 j4 ?" X& M3 G/ ~
sleep(1);6 v7 |- V7 \0 C9 R3 t- I
ioctl(fd,0);
1 J: u" A8 F8 H sleep(1);
  s3 _2 Z8 D- B! G */
3 H; |2 ^+ x4 t* F2 ~1 e1 A  }   8 J* p5 J! T. \. j2 `  M
return 0;
7 g- G0 z# w  h! g & N; c- T5 L9 `% Q( _
}
* [' M2 p; K7 U0 P; ?7 b% d3 [3 p% d, }# F- c
多谢各位指教,谢谢! 急8 ~. _7 j" [& R* Z; Z+ X, g
6 N7 Z4 v/ P9 W3 O3 M, V

; i: |" o9 ?) K6 ]1 {8 l7 \, A7 I
! Z; _3 i3 [) f& M) n0 J8 q# S8 X/ Z0 K

: c% e' T6 C% K5 u( g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 02:14 , Processed in 0.048427 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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