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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( w/ W, @, |5 u- x3 I- E/ S
/*
" t9 s" v7 h0 [% N2 v * Copyright (C) 2009 Texas Instruments Inc
+ [3 W* p) W( `0 x, [' w0 C; `  _ *4 t, |: A' P0 k
* This program is free software; you can redistribute it and/or modify
% W( F. {& P6 N * it under the terms of the GNU General Public License as published by
6 k' R9 ^# N% I( _: P$ ]) F * the Free Software Foundation; either version 2 of the License, or: Y0 {# t% M# n5 ]
* (at your option)any later version.* X- F2 d' h* U  F' O' ?3 W
*
+ y- q# F$ T: r * This program is distributed in the hope that it will be useful,0 t4 o# \& v4 N8 @' T
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1 A5 R8 t( ]3 `2 U * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( R! I2 F' s$ ^9 B& i, y- O7 N * GNU General Public License for more details.
: C, d: F. a+ K2 ~ *7 U* P" s$ ]( L. ?5 U" \( H; k2 I
* You should have received a copy of the GNU General Public License/ l  x7 l7 K) J- l, Y! {
* along with this program; if not, write to the Free Software  l' w$ _& L5 p2 x! `: T
* Foundati
: b, ]9 C7 u  d! M*/* o+ ^  T, ?4 {1 z6 P- u, R4 ]
#include <linux/module.h>
& A& k- X' a6 e- O$ q#include <linux/init.h>
% a$ |  F8 S3 h, ]9 P#include <linux/errno.h>4 X- v  ?( P/ ?- z. W
#include <linux/types.h>; \* X' l' J6 }0 E6 ~" c; V
#include <linux/interrupt.h>
) p6 p3 _/ h# z% t7 D1 I#include <linux/io.h>
3 {) a; g. m1 V/ q- H5 F8 s7 K#include <linux/sysctl.h>) r: c) t: O9 l+ h1 K2 k
#include <linux/mm.h>
9 u( _& v* E' _#include <linux/delay.h>7 y$ o1 X. ?$ t! b: T1 n
#include<linux/kernel.h>
7 o- m' r0 U0 x. X1 i6 y; \#include<linux/fs.h>7 W6 [9 i1 G- P& H
#include<linux/ioctl.h>
; F% `, X0 a& \& i: [#include<linux/cdev.h>& M" }  _( \* b# T+ _
#include<linux/kdev_t.h>* L3 f  u4 H) G. o1 b6 `* I1 w
#include<linux/gpio.h>0 d3 v# U& ^! j2 G) X; R$ P1 P/ I
#include <mach/hardware.h>
  I( \6 }2 b' J" L  W2 W) y#include <mach/irqs.h>
+ L; G% ?0 n% F& c6 k8 e  {+ K; B. ]( J* i3 E; g' l7 j" ~. K* p0 b' R& p
#include <asm/mach-types.h>) U" G, l# l4 T3 \7 K) v
#include <asm/mach/arch.h>" `2 ~8 b* V. n) U  E( ~0 Z  N
#include <mach/da8xx.h>
2 K: F/ K8 E( T9 V, b/ Y: b#define  SYSCFG_BASE   0x01c140009 q3 m3 _8 D3 u( C+ X+ C
#define  PINMUX1_OFFSET   0x124 ; E, @5 e8 `. q$ t: p# @5 r
#define  PINMUX18_OFFSET  0x168 ; K, G7 c2 _3 j
#define  PINMUX19_OFFSET  0x16c( a$ |; v! n* a8 R7 B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
* V: _7 \" p+ I) D4 T#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" C- T  m/ u7 l
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: G" {) F- \" c- [
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
: s7 ?. ^( h) J' J; _. k  ?& `5 @#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR! S/ O& z# ]# }) w: u# y! [* w6 j! e
                           
; U1 G, |; L- R2 L% d7 I, M#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
$ R6 W1 m9 r/ c4 b#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
5 C0 C" S4 @8 L$ }% D  E3 n//PSC
4 ~9 c4 B% k* O2 K$ S#define  PTCMD_ADDR   0x01E27120  2 c9 j: J2 {! y2 B
#define  MDCTL15_ADDR 0x01E27A3C* \& ]  p% N& y6 s: M4 P( G
#define  PDCTL1_ADDR  0x01E273047 P3 f5 D5 i' I+ D) h
//GPIO8 direction$ z2 R0 w  o$ x5 d+ I
#define GPIO8_DIRECT  0x01E260B0" W' Z) Q2 l2 W# L: u  C& }
#define GPIO8_OUT     0x01E260B4) t4 Y/ C3 {3 I: S4 B. U* S
#define GPIO8_IN     0x01E260C06 u8 Q, \% ~# X1 m3 x

) g  L2 o# e3 Q8 @$ R" T" g* O//#define MCBSP1_RINT    99              6 y5 w5 w! ~/ p
//#define MCBSP1_XINT    100  8 U! M8 A) s$ S/ ~# Z0 `
static int MCBSP_MAJOR=239;! u/ Z* V1 a$ `$ \4 E* ]
static int MCBSP_MINOR=0;
$ |' _* w- _9 r9 T: ?. zstatic int count =1;
7 P; i; M: T- S0 w2 Z" o, a& V4 ]$ a4 U, G
#define MCBSP_NAME  "MCBSP-device"
% c7 e- H% v! u' E- S+ V4 O( z$ r! `; ?
static struct cdev *mcbsp_cdev;, c* j; J1 D/ o2 C
static struct class *mcbsp_class;
/ ?; z9 M- `7 @; r5 @+ Gstatic dev_t mcbsp_dev;& Z- L: o# a8 L1 K3 l; G
unsigned int DRR_data;
* t4 f( E  d0 G: O4 n6 `unsigned int DXR_data;
# U  F1 i$ h- d5 _, Hstatic int mcbsp_open(struct inode *inode,struct file *file)
- P6 O3 Y& r2 Y- H" c2 F) S" B{1 r( k& G, U! J
   
9 l& u4 F. S3 t* T3 h% ]' X. }. i   //interrupt enable,initialized# r3 H3 U9 S( _. o. C; ^
   unsigned int temp;
6 o, j" s! U6 _   //SLEEP_EN(GPIO8[10])---01 T9 A& C0 `- h" U: [4 n" I: ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" k& H2 n( t6 k. {+ Z
   temp=temp&(~0x00000400);
+ n  j8 z$ h. [* f! @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; l7 D& |1 j7 ?2 ]) ?) i6 D9 J/ u
  //RESETn(GPIO8[8])----0----1. j: G3 w2 W$ A* i  X- d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' i' n) _, Y; [   temp=temp&(~0x00000100);; ]5 u7 a  ?$ l; Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. E3 ]0 c$ l# R0 K! \
   udelay(100);
8 C. I" f0 n- h3 m; S   temp=temp| 0x00000100;* o7 o' |% x( I0 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" k; i1 ?1 E7 J2 B
   udelay(100);8 ~( L$ L# v- ^& G9 r+ T2 d! Q
   printk("open success!\n");
& z: D6 O, \, A) l$ R. n   return 0;5 P6 B- }, w/ A, W0 J
}
$ f+ W& f3 M9 C/ z# B# _" [: L$ `
0 a4 ~1 Z! j8 y- i+ n3 }static int mcbsp_release(struct inode *inode,struct file *file)
: ~. l2 K+ [: t) O% I{  \  r- A; j4 r+ [/ b3 Y  u0 s
   printk("release success!\n");
5 _( X* T$ c8 m/ F% v9 m/ M   return 0;1 g. d7 y- r' B6 s( X2 D
}
7 v8 P' b  i5 s( ?/ o* p
; E6 _) f9 {# p4 P: J2 Z; w3 w) Astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  Q8 E3 U$ @1 Q" x" ^
{1 ^% s. s# b; ]& N1 \! a! ^# @; c
    copy_from_user(&DXR_data,buf,len);" j2 b; _' {  Q! v3 N$ Z4 H) D
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
$ p8 u$ N0 E: h  w0 H' F: e6 a( k    return 0;/ w. x! w! ^) Q# H, n' ]8 V6 I
3 C/ j: x% l# i# O) ~! R
}
6 t2 h) a/ T3 _$ }# P7 m0 c; k6 D* j7 n5 G0 z  {
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off); }' h, k; N5 a; I) p; R7 ?( i
{ 3 Z3 {6 h: [% U+ i
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' H2 O  U0 E* @/ q& e" c' I5 N
   copy_to_user(buf,&DRR_data,len);
# H, D9 t5 o$ ?   return 0;
% j) l, W3 C# S! m7 v}
; W5 e% s# u8 z, K1 a. ^+ f/ ~- t2 e4 s2 I

! Y$ b$ {& M5 w- U* m4 |static struct  file_operations mcbsp_fops=
. a0 |$ @' ~2 l% J) C4 T{' |* f" _; N. L- k# j0 _% ]6 @
   .owner=THIS_MODULE,% i/ U2 @" |( f8 X- ]
   .open=mcbsp_open,
1 f: P* O% m3 w: B% ~* T3 w+ j/ a   .release=mcbsp_release,4 {9 k8 d1 x2 K4 }; _
   .write=mcbsp_write,$ T2 N; k$ v, ?4 _& @' }2 R9 X& M
   .read=mcbsp_read,' i% w* s7 t4 b8 T) K8 e) r' b
};  m2 j+ B. z* O" D3 j  u
static int __init MCBSP_init(void)9 w9 s* \/ N- V3 x4 x$ l
{
7 v* i2 j, r5 P, a   int ret;$ B# `" Z/ |7 q$ A3 l/ c
   unsigned  int   PINMUX1_REG_old;/ Z4 K& E$ I) h* j
   unsigned  int   PINMUX18_REG_old;
. X3 H1 l6 T6 f# L3 n) j6 w4 U4 f' i   unsigned  int   PINMUX19_REG_old;  C! r& a5 N2 D* P& ?
   unsigned  int   temp;  8 m1 l3 z+ C' {4 e
   if(MCBSP_MAJOR). G' _- ?% w, i
   {
, E* S, y4 z& z; H6 }$ s- G+ [      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' Y/ M0 {; ^& U
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! k' Q  g# _9 s, x
   }
, k' U. C+ R% S0 T: Q   else' p3 h. S: o2 O% e
   {
" D/ u' g+ [+ `0 e9 i1 h      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- ^+ O; W9 q7 e! ~6 @: G      MCBSP_MAJOR=MAJOR(mcbsp_dev);8 A5 |  T' O# E& q' f: ^4 ~
   }
6 a9 ]7 V8 g; S5 q1 ~2 L# e: Q   
" D. ?7 S* P! [" U) u# o& o   if(ret<0)
2 P/ V/ w; D; {0 ~  a   {
. ^7 [# f" |  W9 Y, D. t* D      printk(KERN_ERR "register chrdev fail!");
! ?: H* W5 t8 R) m7 x& [) [      return -1;6 ^$ b6 T8 g9 y- A7 j* `) g; ]4 i6 M
   }3 C) n  t# o7 F) ]8 t* ?
   
2 `2 t3 E- Z3 L0 G2 Y) ^: o   mcbsp_cdev=cdev_alloc();
% U+ F$ m# @: @1 `7 M7 Q* @   
) X& f5 y4 o( K, x: H1 ~   if(mcbsp_cdev!=NULL)" s- T- ^5 D9 O0 W. G! v/ q: y
   {
3 M( |3 P+ o1 \4 \* S      cdev_init(mcbsp_cdev,&mcbsp_fops);
: w0 y0 L0 K( b9 z) `( H# N      mcbsp_cdev->ops=&mcbsp_fops;1 C, J$ O( y+ b1 _) @
      mcbsp_cdev->owner=THIS_MODULE;3 @0 a+ X* J8 _
      9 ^7 q4 q6 K7 P. a0 C4 ~
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* c+ P: W9 {3 `- w" _9 I6 R, t/ p          printk(KERN_ERR "register cdev fail!");7 X8 I  u" E7 O' q1 |
      else% b, I# U4 _& O8 _' g- g
          printk(KERN_ERR "register success!\n");
4 H+ q: r. q5 }8 ?! g   }  o) S; I( H0 Z, \* r5 {! X
   else# G% O: U. v2 ^0 y, \& C
   {- M0 |/ ^' }1 M$ u3 E4 G+ I  E
      printk(KERN_ERR "register cdev err!");
1 e+ c4 _1 J/ G! w; E  a& a      return -1;7 i  ?( V, E- r4 M
   }
  f7 @4 e5 r$ A% ?8 d( w3 f( }/ g* E; {   
' M: Q# Y- ^0 ?; F  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. Q: ?; t8 X" n- ~( A   if(IS_ERR(mcbsp_class))
+ p& P3 h. u9 O: @+ n/ S# q) I   {: l) k9 s# h6 G& q9 l# l. f3 y: K
      printk(KERN_ERR "register class err!");
0 U5 G4 a1 y3 L: R! O   return -1;( @0 `; N: W/ a; b
   }# o& f* Z3 B. y8 A9 Z6 f
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* Z( }2 Q% R7 t5 |* J# ~! Y, @$ M/ D
+ W1 \+ r8 M# E1 x   //PSC# M) V6 b! T0 T3 r5 E" \6 @, o) X
   //add Enable MCBSP
! r# r1 G# X! K8 c/ T. h; b   //test7 `* e" T' V6 `+ l# _; a( q& y
   temp = 0x80000003;' a. |+ y  w) }2 ^$ Y
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 ^6 N; R1 M% H$ x1 A$ k" @& a5 ?" @
   temp = 0x00000003;  c& c4 o5 {/ \; P8 q7 y5 M: ?8 M
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 O! u- W2 P) i2 V, m
! G: G" k3 J' i' G5 h' |, q$ n   temp = 0x001FF201;$ t3 F9 h% H  j, g1 F. I$ @2 s
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 I/ j) L8 x% X* V9 z
   
7 N" x, P2 i% x* x   //PINMUX  1 B  ?0 `5 i* o( M; C  s
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) c4 f8 H/ w; l" `
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
4 G& \1 w, t3 \* e& B   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
7 T% O% M' t3 a1 g# j  i; b8 o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- f0 A% V3 K) I/ Z! [: e   , E# m( _  v$ s' t) e5 H  d
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ t( U) ?- A6 g$ c2 w' ?   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ) K' H, v8 u/ z/ |% }, y$ h
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ! i: H7 o3 {" `4 T
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 y) P% v7 L; c! R 4 d( M9 K# ]. _- @: y9 B
   //RESETn,L138_SHK2
/ r& ?) e3 C- u. r& d' |   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
. [  o# z8 }* y% L% p   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& L. R" {( Q' D  ?& q) m. m. w   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- ^$ W$ p& X- G1 B/ s

% Z2 j1 }' V' V6 J8 i6 s( S: C/ Y
* i- x+ w- L( H3 v$ Y  //SPCR Register+ U4 ?6 q6 Y( V  B
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
/ z* N  \- E$ I9 y2 f1 ]- j/ u  temp = 0x03000000;//(DLB=0)
7 V& Y5 S. _' ?; t$ f // temp = 0x03008000;//(DLB=1)5 _1 o* i# _7 _) y3 U4 I* g
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
7 u* Q6 O; E: l9 y  w5 n  temp = readl(IO_ADDRESS(SPCR_ADDR));2 Q# H! U! Q3 S7 m6 G/ W* J
  printk("temp=%x\n",temp);, Q. O$ o" n) v# {- k% H# _
$ [7 A" r0 T3 m# l! o
   //PCR Register
* R9 X6 F5 L3 M4 w! l: b   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 c' m1 a" D, @% n& ?- C2 F
  // temp = 0x00000F0F;
$ \: C5 B2 z& @; l0 r  temp = 0x00000B0F;
# s' K8 e5 m- y1 d  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
) [- J0 @3 @! j- g5 X2 q  temp = readl(IO_ADDRESS(PCR_ADDR));
0 S/ m: |2 N& g# J  printk("temp=%x\n",temp);  # M- O  d. f0 ~& a3 o  u
   //SRGR Register4 c+ g* Y% m' ~3 u) C
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11. y9 {, ^+ E4 ?* h9 A; X9 j
//temp = 0x301F000B;
! T9 Z, [4 e! E+ E0 g- @! K: n   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 G9 x/ g$ D% m  temp = readl(IO_ADDRESS(SRGR_ADDR));8 M- C9 g8 Q5 Q" D/ [8 ^4 I- W: N
  printk("temp=%x\n",temp);
2 p& q" F) n, f7 `& g0 z   //RCR+ g3 Y8 d- L6 c& k6 r7 t
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 [, i% V4 Z5 I) F/ v4 G   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 l0 M1 w  x" l
   temp = 0x00440040;
  O* B& W- N0 u   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - L: `0 U: y3 J% r  F
   temp = readl(IO_ADDRESS(RCR_ADDR));8 Y8 }" `2 ^2 O% y; L% I% f
   printk("temp=%x\n",temp);
% Y" P7 s) r8 y   //XCR! o; c# I) U$ K
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  I$ K: p; a& g- L   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 ^  }3 j& _2 i5 S5 p( t) c2 e& W
   temp = 0x00440040;& {1 T2 n& d& |
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; j: E  f: W" @% [
   temp = readl(IO_ADDRESS(XCR_ADDR));( w( f) ]' X, o/ n9 @4 K
   printk("temp=%x\n",temp);
$ p7 Z' L$ S- \! I  udelay(100);
( ~% Z) p& |) O/ g) F4 ~/ |# ~7 v1 i  //SPCR Register
$ I/ o* y6 i+ \3 P  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; c' J! v! G; ?2 ]( [  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
' s4 Y6 U# k  J  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
1 u3 }3 f' C  N# G  temp = readl(IO_ADDRESS(SPCR_ADDR));# z" m) [* a0 F5 U& a6 e5 T
  printk("temp=%x\n",temp);
+ p* W! Q5 [9 n- C% [2 U+ q  udelay(100);
) N' s! r" |& j/ X  W$ ~* E4 m) d
  //set GPIO direction
: A& }9 V4 O1 V9 ?. Z: Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( r6 u! D: [- x4 `, W6 i; }% N
   temp = temp | 0x00000100;//EPR----input
! C: G1 k; t9 C3 R5 Q) a) ~/ a   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 X& R& D' Z( i   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
: M+ Q# U" a1 `7 q) X 4 Y4 t4 a% H0 `
   return 0;
' l; e9 g+ l5 j1 k3 G}
3 Q& L. v; {3 n6 H( I" {% ystatic void __exit MCBSP_exit(void)
; b9 f9 r1 g+ S0 Y% S6 N- A# o7 F5 \{  t, S% ]% J' ~+ x' H6 \# V$ T4 O
   printk("mcbsp chrdev exit!\n");
  U& }5 x, S. P( v) t   cdev_del(mcbsp_cdev);0 j2 g& Y( v* C$ {2 @* Y+ G
   unregister_chrdev_region(mcbsp_dev,count);4 n  `+ \. F# H7 D1 Z: v5 b4 w- v
   device_destroy(mcbsp_class,mcbsp_dev);
% h( S! A+ f0 m2 \+ u. r: n/ `   class_destroy(mcbsp_class);1 z! E7 Z8 d4 n4 W
}
( r4 ^$ \9 S/ q9 G6 omodule_init(MCBSP_init);
7 \' q4 G/ j& R& k: ?module_exit(MCBSP_exit);  O, C0 Z6 _% n; D7 x  G
) g! f3 v4 I( |9 [
MODULE_LICENSE("GPL");
% l2 j; I9 O( a: ?0 A
" D( n; k$ S2 y. F5 g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. W! y/ u, j4 z3 R
我的应用层的测试程序如下: a1 N$ v+ W2 }2 n3 `9 B$ k, Q
#include <stdio.h>
/ u- o7 ~; p: G$ s" q0 [#include <string.h>
" i* r* h; u1 p  h0 @4 X' ^9 I#include <fcntl.h>
4 E2 j2 Y1 F6 ^2 P  s( @" k* V#include <unistd.h>0 \8 |* C/ q' u) q' m% Y0 B9 G! u3 G
#include <signal.h>
' C& x( ]. j! i' M#include <pthread.h>       //线程
/ k+ M+ U4 I# N#include <stdlib.h>; w" C8 A* a7 r' V  _$ d
#include <pcap.h>          //捕获网口数据2 S0 M' I" E3 c
#include <semaphore.h>     //信号
: d5 X# h& v9 @' O/ g- R#include <sys/types.h>     //消息对列
; P8 U' m3 X( u) N' q, r9 x. x) X#include <sys/ipc.h>       //消息队列
) W- ^9 O; e8 |* n; @#include <sys/msg.h>       //消息队列6 M; ]8 ]' |8 Z) w& K
#include <sys/select.h>) T4 g) {1 T' L! ^5 E3 _' `
#include <sys/syscall.h>0 {' }) J9 n: f5 R) S( Z6 g- m" V/ W
#include <sys/stat.h>
0 t. F; u5 q2 F  q, J9 u: r#include <sys/mman.h>
/ ]: u- u( R' B1 y+ W#define msleep(x) usleep(1000*x)
0 y5 |* v" Z' ^4 S$ R8 f* l% y' K" ^
int main()1 ~/ X  i8 E+ l# \$ p# a* V
{
% P! @+ m$ x$ p0 f5 f+ h+ Y; X    //MCBSP,ARM与AMBE2000交互设备4 j& q$ \% ?) d$ |3 p8 {
int fd;6 I2 M* q' U! @
unsigned short data_write = 0x5555;# L1 G% [) L7 s- `
unsigned short data_read = 0x00;! Q* U1 m1 [* j7 j
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ ]4 G$ Z6 h& r- o5 D% u //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) _; k# C0 }4 h1 t- x" R
    ' b& A( p" U/ u7 }4 e' L# d( |+ M
  if(fd < 0)
& s0 k  b5 i% C# V  {
4 l* M0 f0 m9 q. L1 @% y     perror("open failed\n");
( ~# O# G7 `+ M4 g1 D' p     return -1;$ l" `. n9 S6 h; b* C2 B; t8 S
  }" M4 s1 m, t( j" F; x8 p' Y
  
$ A# q8 r+ u, ~& g  while(1)
. K* t+ i; s2 ?7 j( K! o1 w  {
, q1 i  D% d2 H, L   ) g3 f) E2 ?+ v5 @6 ?' @' _
   //AMBE2000每次读写是24个字为一帧
6 P& {  \. n( n$ F# Q   //写数据时将数据在底层存储起来,等到中断的时候再发送
* L4 j) M; i$ R( z  V, G2 J3 c   //AMBE2000输入数据是以0x13EC开头的& q7 {" N- X+ Y7 }
   write(fd,&data_write,sizeof(unsigned short));8 `3 }, A, g  a' e! W
   
3 |- o0 ~) I" N3 O6 C   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
4 e$ N9 v" H+ F! H. y- z" j   read(fd,&data_read,sizeof(unsigned short));
1 }5 `+ [) U3 Q: n! J) q" {   
# O: ?2 s1 X& x- o   if(data_read == 0x13Ec)( @/ p8 h( H; X8 d& V  w" A
   {
+ e/ P' O' \+ h; g$ d$ {  J   
8 |7 Q' a+ l4 I. H& M    printf("data_read = %x\n",data_read);
9 \" J  \( p2 T1 @3 B$ {( z   }8 z5 n4 [* o/ T( K* O  |
   
0 X5 H' e1 W- ]% J! g) v5 G   msleep(10);
7 u. X) O# w6 i; c; ~  * n6 J0 o4 b, L8 `; g  U7 a
  /*2 u9 C; D) S+ o  a6 z( [" R
   ioctl(fd,1);   + m  Z! |, G) Q) W+ R9 j$ p
sleep(1);* x' K9 z% q1 e' s% j/ G+ ~5 {
ioctl(fd,0);) L. V5 y- Y. v1 n
sleep(1);& ^- w1 x% L& I2 e
*/
% K& D8 ]1 n& `  A0 j' M  }   
# [6 x3 Z4 C- N% A# a! \ return 0;0 \6 R0 T' J5 i" T" D
6 \0 W, j- e1 Z. s) y
}0 K' N) n+ k* ]3 J( o* U5 e
2 q& X$ M! S0 J# m; N9 K$ ~
多谢各位指教,谢谢! 急. H0 H0 w! ?4 ]5 b. g. D4 M0 \
, ?+ V* s3 F, Z1 W( Q% F

5 }' E/ j! D0 ?. ]& W+ a5 I- v2 ]( I% r4 b  B/ E. a9 `+ l
7 h; C1 h, j5 N5 v. n$ e/ X/ N2 R( O& p
6 }/ B1 Z  E) N! [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 03:17 , Processed in 0.051274 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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