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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
9 q8 m9 x2 V1 L+ @" l7 ^9 d$ r; F  k7 e( I/*
( S$ D5 h4 a/ G- | * Copyright (C) 2009 Texas Instruments Inc1 P' _' a3 y3 {/ u
*8 ~! ~0 I' h( b% k- d3 z: E
* This program is free software; you can redistribute it and/or modify) x: d$ Z/ q/ n; p# M4 N- F/ m6 f" M
* it under the terms of the GNU General Public License as published by
7 F7 b& u0 E9 \. W * the Free Software Foundation; either version 2 of the License, or5 ~; ?, Z4 z2 L! b2 E/ E) M
* (at your option)any later version.5 J$ {% e% W0 B" r3 R7 ~
*
9 T5 G+ x' {( x- _ * This program is distributed in the hope that it will be useful,
/ ^& ^& _0 ^: a& B3 e# o: c * but WITHOUT ANY WARRANTY; without even the implied warranty of
( f( w, @3 n4 V& @( o/ r% ?; ` * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: P% ~; _2 F! R5 u1 T
* GNU General Public License for more details.2 K( R- B; J" O- S# W
*0 ]. Q  P' q4 z2 f' H
* You should have received a copy of the GNU General Public License
5 p2 i  u. _( X * along with this program; if not, write to the Free Software- j: U8 ^4 |$ [7 Y
* Foundati8 c2 f  d; k3 K0 N
*/
, N3 R8 z( @6 J8 I#include <linux/module.h>% ~0 S# r: c; ^( T4 L& g; ]; w
#include <linux/init.h>$ l2 e0 ^- z6 D
#include <linux/errno.h>
' H9 F& k- g& i& h#include <linux/types.h>
- g- z  [& o( O% q, ]3 Y. h#include <linux/interrupt.h>/ y( L3 s: {) m
#include <linux/io.h>2 R" `8 H1 n7 P' z
#include <linux/sysctl.h>
- x9 [. o- O3 ]9 t7 F& {. W#include <linux/mm.h>" @" @, W9 E5 P2 v; P9 t7 N* \+ R
#include <linux/delay.h>4 l# ?9 [  j5 q' k8 U" C
#include<linux/kernel.h>  P( p' E  _6 ?: {
#include<linux/fs.h>
8 d; j1 x) `$ }2 u* M#include<linux/ioctl.h>
/ q+ O2 b% m& p9 ^# t( k#include<linux/cdev.h>- |; |. V# p0 B
#include<linux/kdev_t.h>
( d  R5 x9 l. z4 t% o  S#include<linux/gpio.h>7 M: f5 `" t' w! U$ ~
#include <mach/hardware.h>
  |4 |0 r) J1 b2 G) `#include <mach/irqs.h>
: N! N' D1 l' ^# a# N4 Q% T+ m  ]) f& u" ]4 l; Z
#include <asm/mach-types.h>+ Q* V; ?0 s9 B
#include <asm/mach/arch.h>: D  K" Z* t: ^
#include <mach/da8xx.h>" G" V5 g/ V) M: P
#define  SYSCFG_BASE   0x01c140006 C8 F! `+ X( v. R; e4 ^, }
#define  PINMUX1_OFFSET   0x124
8 n- l: |! G+ f7 J; o- k#define  PINMUX18_OFFSET  0x168 ) l: D. n, z/ T# \. Y0 Q8 b& c: e
#define  PINMUX19_OFFSET  0x16c
9 F* C' p. @7 Y8 s3 D) r5 |1 R#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" C: |  e' _0 P+ @8 l- R0 F! L% U& i
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 A* k, s) P( b9 g# D  S) U#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& z9 `) v1 i6 `( A#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR* T9 |$ b, k# S0 J5 H
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' G: F% g' Z! d+ Y5 t. \+ J0 Z. v
                           
3 g& o6 V" q$ x. C#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
: |& I3 E- ~' i6 e- [) J#define DRR_ADDR      0x01D11000  //MCBSP1_DRR! \( q* A' g& N2 O
//PSC
5 I1 i4 ]& F5 Y/ g7 b7 z2 u5 i#define  PTCMD_ADDR   0x01E27120  
6 ?  s/ ~# A8 Z) D- i! l) d! ?#define  MDCTL15_ADDR 0x01E27A3C/ @' f  H4 _/ J/ ]: c
#define  PDCTL1_ADDR  0x01E27304
% o7 N5 r# s8 [( U+ k# K, @0 }//GPIO8 direction: l$ b  B1 s0 |
#define GPIO8_DIRECT  0x01E260B0
( G! a$ i8 l9 Z2 B#define GPIO8_OUT     0x01E260B4  v$ ^7 }) Z8 l5 [/ q
#define GPIO8_IN     0x01E260C0
% F6 N9 @. M; ]! u" g1 W
# p  R1 ~3 f2 `2 P# o//#define MCBSP1_RINT    99              
7 h/ ~. f& e( `) |0 g* {//#define MCBSP1_XINT    100  
. [+ Q' D% o7 H0 Hstatic int MCBSP_MAJOR=239;* S* w! ~2 X2 a& A# I
static int MCBSP_MINOR=0;! z3 K$ ~  A9 I6 y) [. H
static int count =1;* Q  j2 k& r& s' h. g, |% x& B

% h9 A) ^7 A. Z4 S& m3 N#define MCBSP_NAME  "MCBSP-device"
. ], R) B1 b) z2 T  o7 |0 p5 j8 x7 o  {( r- L0 |
static struct cdev *mcbsp_cdev;
" s0 n; K( N% }& jstatic struct class *mcbsp_class;
# f; h4 u4 I. m) bstatic dev_t mcbsp_dev;0 b5 z. C0 d5 f2 F4 M' B9 B
unsigned int DRR_data;7 E# W% Q% R! L
unsigned int DXR_data;& u) [6 m7 A1 t
static int mcbsp_open(struct inode *inode,struct file *file)7 N. l) q" y5 o1 {/ K/ l
{
8 D/ A, O! n; N7 V* f* m, o$ B   
9 }* T3 {! C3 W+ T/ g   //interrupt enable,initialized0 I8 F- T, ~4 I5 z# X2 Q" W
   unsigned int temp;7 l* i6 ^0 E% g3 N8 g' q) W+ J
   //SLEEP_EN(GPIO8[10])---0
1 x8 ~4 V6 ]$ [% g   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# ?, F! O7 M! f* D& ~
   temp=temp&(~0x00000400);
  J6 d5 a9 ^& F2 P% N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 \! V" i/ V# S4 q2 x# H  //RESETn(GPIO8[8])----0----1
, f2 c2 D6 f5 T. f" [6 F9 |! G+ _3 j   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' ]+ n# O4 v' f, ]5 h   temp=temp&(~0x00000100);5 Y8 \1 `' e, h) |
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* l/ y: b! f3 Q+ c: c   udelay(100);" w! V7 n5 d- N5 Q
   temp=temp| 0x00000100;
' T( ~3 f' {9 r# r( n  h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; k+ E7 q  |1 a" ], I2 w, _; ^, W! S   udelay(100);( ^, Z! B0 n1 }5 @9 Y8 E' g9 l" c
   printk("open success!\n");% L! ^- @# I* n  y+ S1 ~# ?
   return 0;
% I1 V- N8 K$ p2 ^* O* T}
4 u2 H3 L- Q$ t( f2 H4 y3 F2 E  P( }* u
static int mcbsp_release(struct inode *inode,struct file *file)! F" b/ p3 }: o
{& ~" O) S$ [& |2 ]7 }5 l' O) w
   printk("release success!\n");
# W% s" S+ h% A; Q' A# Q   return 0;
+ Q' F& }) V/ x}
' {+ Y, Z' F+ a6 a0 l' v) m/ Y+ N1 \
% H" Q  `- K- w; i- u% h$ t% }static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# m. I$ ~6 l" V6 l! k+ J{, f0 P) k6 e8 S( S; o4 l6 @7 h
    copy_from_user(&DXR_data,buf,len);1 U" D5 ]2 O* {  W5 x
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
5 t1 M* \* C4 g0 j; M4 \) c    return 0;
2 B: ^6 j: A5 \6 y" G  Q4 Z4 z ( O/ n* c& k7 m; e9 B9 S4 ?. E
}
. ]$ y. G% N  O8 y& H& k9 A: M% u- _1 h: `
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ D9 C: A3 E9 D) X& l2 y  `
{
1 l; m3 Q' Q9 U, }: u   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 [- Y2 o5 l. y$ f# Y: e3 K" O   copy_to_user(buf,&DRR_data,len);   n3 M' [1 Z5 P3 @4 n. [6 }3 `
   return 0;
: M( F. k' s  k; z+ k7 {! n' R}+ B# W/ ?+ [9 a( b! G) d" }
- A+ n9 J/ e0 n8 ~% z3 ?

' N0 Q6 W# L6 o/ kstatic struct  file_operations mcbsp_fops=
/ }) c% C4 W& W( G9 o{
' ~- }, ^. z9 {  F7 M; F2 r   .owner=THIS_MODULE," u8 ?! e9 V% s; \4 T/ N% E# G# @7 j
   .open=mcbsp_open,
1 P  j& T7 @' V+ M) h/ }6 c   .release=mcbsp_release,
2 I$ ?+ n4 t) O4 V7 O% c   .write=mcbsp_write,7 h8 s* Z1 k; y' ?
   .read=mcbsp_read,
) X' Z2 {' a9 b+ {3 W' ]( B};) `* d" x0 L! P
static int __init MCBSP_init(void)
8 r3 j9 p! N; e+ U# E) H{( i( G0 j( b1 U$ I0 e
   int ret;
: {6 X  S! H( W& Y8 x   unsigned  int   PINMUX1_REG_old;
% g  A' V' E1 M  c. b9 T   unsigned  int   PINMUX18_REG_old;
' c, B$ C8 @/ C6 s% [# d   unsigned  int   PINMUX19_REG_old;
$ y" t  Z; F' {7 X5 ?   unsigned  int   temp;  - e9 @" b- }9 c2 E& Q0 x; R7 H
   if(MCBSP_MAJOR)
. j" ?; |& ~; _2 M- y+ ~# @   {
. o, I9 B* U: Y0 M4 e3 `+ V      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 y9 A8 @& G  S5 i: u; g      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ B+ l8 }, C" ^# S, G9 v   }; N# B$ q7 X* p, w& s( ?! m" m7 w# O
   else
" R5 k% g) i+ S. a/ O5 s$ M   {' A# M) a* T! S. j! |/ w
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& u: G  A( u* I1 l. P$ w
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
" C9 U4 O& y( t$ N# r" M   }- g9 v- v7 {* ]. A% y; C
   6 |9 ~! i7 [, G2 O7 l. w
   if(ret<0)
' h7 p1 h4 L5 t   {
" x5 m/ F* H$ H$ P* W; M7 ], x  w      printk(KERN_ERR "register chrdev fail!");
- u  p( w3 r: _: S9 r$ R% D      return -1;
3 z+ g. y" _7 n   }9 m+ J  S# q; q6 f$ a$ H' A
   6 Y) C2 \1 A3 o! M  [' J5 q
   mcbsp_cdev=cdev_alloc();
# E+ o* l+ ^/ A1 v$ _- Y! t8 R   & {. O! H: R: p6 [
   if(mcbsp_cdev!=NULL)& s* Z. R! Y7 `9 e2 _9 {
   {* C7 e8 u& |: y0 i% t) K
      cdev_init(mcbsp_cdev,&mcbsp_fops);/ \* i/ K# F4 d9 E! s; \& @
      mcbsp_cdev->ops=&mcbsp_fops;% H0 D, w- c: v! u' [6 i3 B( W
      mcbsp_cdev->owner=THIS_MODULE;
5 e: b  Y' ^2 n% }( l6 y" S3 \8 P" t      
# y; p; m1 ~6 Y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- o1 P* K$ S6 v$ O& c3 p( Y          printk(KERN_ERR "register cdev fail!");9 k4 K$ c( D: s/ I2 T9 x% S3 q9 Z
      else. e" k! Z# F7 u# M& r
          printk(KERN_ERR "register success!\n");4 b- L5 q0 c5 B3 H/ Z! z1 S3 o
   }1 i0 Q* B: ~5 e- k, Z
   else
. o8 v$ w4 b0 s" `5 A2 R$ S: |   {
' H$ K% c4 ]6 S% Y% _' Q* T      printk(KERN_ERR "register cdev err!");
( |: h( _+ K) i% m7 @$ }2 y      return -1;4 _8 g- a1 r1 n& N+ x" M2 ?
   }& Q- H" n% a! S; V
   
! v/ P( W1 @) N' I# s  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);5 {  z$ D( Z0 u$ _7 ^
   if(IS_ERR(mcbsp_class))
7 ?6 H$ w! n, j5 Y* J   {) X; d( y  V7 V# e
      printk(KERN_ERR "register class err!");0 S5 a( D8 G- ]3 A# }
   return -1;
" F! V+ q% f( r   }
3 ~0 A: p- l2 `8 _/ M4 ^& Q   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# O/ w* M0 h5 h5 N  T2 w
& ^1 v) `5 |7 G. F7 p& E/ f
   //PSC
7 q4 \9 z7 o- O' l   //add Enable MCBSP
5 |& @8 D; M" Y8 y6 I3 i2 k; s( r   //test% q% K/ t# v) d& v% w5 `- j9 V: a
   temp = 0x80000003;
% u& p8 [; I% Z- n3 @  i, r   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- K7 x5 R( G/ t4 G0 u
   temp = 0x00000003;1 E: z& y& H/ y; Z2 N
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- l& R$ a2 I1 y: a : o& U" n6 r# p, G7 W4 W3 r
   temp = 0x001FF201;' T" T' x% Z/ q* O- A# Z" v
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ P( V. X6 l" G2 Q) t' q   
" m: y( p: G1 e( |   //PINMUX  - O: z! R8 |; {" C6 p
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ M# D6 n2 T0 o; ^: O) p* J* {9 L, I
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  1 W: }1 i% i8 v( F  v9 M
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
# Q) _1 M0 ^  ~5 M   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 s2 j; ~  d: h8 _- G7 |% O   + V9 m) O, u: w6 r
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
3 O% A+ O/ \; d5 U9 X   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ R7 m# T7 W7 g8 G' i8 i
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
3 C- f0 M6 s1 {: s3 e. G& J' d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 x, Y/ U' m/ J

; e# E) S1 F+ n; U. p   //RESETn,L138_SHK2' h5 F0 r; T% u# n6 J* e) E
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : `" Q6 g2 r, ]  e3 G( ^
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ( J8 a' M5 O7 G+ M
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 L4 F" {6 \( F- w  H

+ N! @  e0 K5 h* \7 K! ` ; z, y) @7 B: V
  //SPCR Register0 B3 `7 ]6 _6 ^, [1 r' {$ b6 |
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& `5 D9 w% O5 n" W$ `8 z5 I  temp = 0x03000000;//(DLB=0)
1 I, N1 B8 D& o // temp = 0x03008000;//(DLB=1)1 R! c  W, Z5 d8 Y6 t( ?+ b1 A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset, w! j8 p! Z: k! B+ I  [3 u
  temp = readl(IO_ADDRESS(SPCR_ADDR));# z  P% T) m5 }5 z% h; f9 @1 F
  printk("temp=%x\n",temp);
+ _4 H. W# R* A
* [' y0 \. i# z" Z' j7 J   //PCR Register
) t% c! r& B) d. ~  ~  }   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 S- S9 X' q. u' B/ Z
  // temp = 0x00000F0F;
3 b% J# a5 g! c( e4 h& v$ }% D  temp = 0x00000B0F;, p( b% v+ G( l/ P2 U" r1 n1 n
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 6 l. c: X0 N$ J0 i1 x
  temp = readl(IO_ADDRESS(PCR_ADDR));
) j3 n! i1 f+ O5 w; F& f" j- F  printk("temp=%x\n",temp);  + U  v# H$ Y' w% W7 ^
   //SRGR Register
  U& P- [# v3 q   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 E; p4 ~* [( p- k2 k6 h. U //temp = 0x301F000B;1 h$ }3 a1 C. k0 @% Q& B  K
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ; W4 s- K) H' x! r, X* M
  temp = readl(IO_ADDRESS(SRGR_ADDR));0 v; a6 f% J$ j8 g% p
  printk("temp=%x\n",temp);
9 ^- R) v7 I% a& d   //RCR
% @1 y1 ^) g# n* S+ O   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
- |7 @5 w0 d. r, A   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 G- [! S% ^) i- O
   temp = 0x00440040;# `  D$ i# Q6 M+ P$ N
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   + Q  a5 b0 U9 k3 u( K  N' ~- r
   temp = readl(IO_ADDRESS(RCR_ADDR));
# [/ o7 n+ Z" [9 a   printk("temp=%x\n",temp);2 }, N; h2 `6 E
   //XCR
4 u* c* I! Q* n, E  T8 k8 v5 s' o   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; F. I& I, e# D
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
, ?6 ~( |9 h! J$ M; p  ?4 P! Q   temp = 0x00440040;9 r; I- D% N$ N' Q. k
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
* O/ y- u, a/ j5 I; I4 f" F   temp = readl(IO_ADDRESS(XCR_ADDR));
4 q( U9 P. B) o( j, L' g% @  K) t   printk("temp=%x\n",temp);2 g* r0 J8 Y2 T9 `* S+ k; T  w
  udelay(100);& W2 P' S; \: l* N7 ^
  //SPCR Register) T1 G" b+ U) U; v
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 W: e; o# c" Q6 B! I
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1" p; r8 D9 m# z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
8 r9 v2 B3 s9 J2 n: S: s) ?  temp = readl(IO_ADDRESS(SPCR_ADDR));0 [( g1 ?+ j# ]6 U/ s! w& ?% P
  printk("temp=%x\n",temp);
5 Y5 Q& g9 y- s+ Z- \6 t  udelay(100);8 v& h( M) D, m, R5 ~+ i' o
0 X! d- J8 o% C3 m2 N
  //set GPIO direction
0 _! U0 }+ n/ z$ f( D   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# `4 D4 d1 H, k8 l+ g* X/ p; A
   temp = temp | 0x00000100;//EPR----input: R! E7 z; J2 H9 |  y5 `# t
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% y: ^! \' l% E, R! ?( }   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 `2 T4 V5 l; M' @: q& L# V4 h0 u$ @ 7 m- ?8 i0 g5 W9 ~7 l+ ]; T
   return 0;7 @& ?5 D: u+ `" {
}
0 x, q  S" O1 Tstatic void __exit MCBSP_exit(void): I* f- ~" G: I- \  w. i- a
{
; ^- n! {+ O* T! a   printk("mcbsp chrdev exit!\n");  g# k+ c( D/ B1 @6 g
   cdev_del(mcbsp_cdev);; ]; W. u) ^  U1 _, b
   unregister_chrdev_region(mcbsp_dev,count);
4 ]3 ?" ?9 ]4 J   device_destroy(mcbsp_class,mcbsp_dev);
: ~( X: ~2 ]7 F" F; k: y/ k% Q) O   class_destroy(mcbsp_class);
9 w/ b  F1 z+ D+ i}7 W$ F' V9 k+ A# A& ^
module_init(MCBSP_init);
7 ~5 C1 F7 c9 umodule_exit(MCBSP_exit);
& F# J: D/ o: J/ t, `* F( s! h" u( B$ O) b/ i4 F- P/ j" Y
MODULE_LICENSE("GPL");1 S; z( W2 Y7 o/ R

; V0 B' \! F' w7 O我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* v( r7 M8 Y8 V$ |6 Z* C我的应用层的测试程序如下) C4 g4 G  ]3 ~
#include <stdio.h>
0 S& t1 a  m7 {#include <string.h>& B$ i6 ^4 j5 L; z. l+ m* X' i
#include <fcntl.h>
- W+ D8 V& T, ^6 z3 M7 V9 o+ ]#include <unistd.h>
- q( }& {7 D* i3 h- g#include <signal.h>& g! W0 A: N7 {* C( m% s
#include <pthread.h>       //线程9 ]& o6 p/ [& e
#include <stdlib.h>+ W! H/ D  M0 C- k/ ^2 K2 Q/ n/ k
#include <pcap.h>          //捕获网口数据
& k, m* C, x# Y7 d  b#include <semaphore.h>     //信号
3 P: _$ y/ ?9 e9 J$ m#include <sys/types.h>     //消息对列
" f7 i' \( t0 d4 i  o- Y" z) y#include <sys/ipc.h>       //消息队列
" Q7 h4 \" \3 w( E#include <sys/msg.h>       //消息队列
2 L$ M2 g: J+ w- r% j#include <sys/select.h>
  V! v( D6 e" r' a' S* a#include <sys/syscall.h>
4 R4 d" x, r0 ?8 ^$ z" p#include <sys/stat.h>
4 P6 o4 `3 k6 ~  i5 D#include <sys/mman.h>6 U; Z8 c* @. K: e: q/ c9 N/ Q, R
#define msleep(x) usleep(1000*x)
) |" P: g7 G; W8 u  P' n/ p2 A# a  ?. ?$ h, L& X
int main()
- J# D& ^1 W9 p( j0 T{ - v  F4 i$ K$ i
    //MCBSP,ARM与AMBE2000交互设备- f( H) y1 O9 ]% T0 N( O2 ~% ^
int fd;
4 A1 J. q) z# R1 j$ e9 I$ y3 m unsigned short data_write = 0x5555;8 F1 A, b7 p6 z( e' H3 N: {
unsigned short data_read = 0x00;& W* g4 H5 S5 H6 n+ k
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 P& I% M, o. O4 p //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) l" O& h1 q, }1 t. Z    ; r6 I" ]. V* R8 Q- j
  if(fd < 0)
, f" w& ^5 B6 L/ w  F  {& K% s& v! i% ]% E- @6 {
     perror("open failed\n");
' ~5 I  b6 U1 l     return -1;
# S( X  p2 A6 c* i, S  f$ l9 H4 d) J  }
% h. d: _6 ?6 S0 S( b1 T3 X  6 K* Z1 J9 p, L" _- A. A. V9 s
  while(1)/ I; t9 k& p# {) \0 C
  {
8 G  d6 C$ y5 a% B6 N8 n   5 ~9 I( W" s0 A; A
   //AMBE2000每次读写是24个字为一帧, Q* H# H) o% [, f/ ^$ o
   //写数据时将数据在底层存储起来,等到中断的时候再发送. [8 o( h5 a8 ^: L
   //AMBE2000输入数据是以0x13EC开头的
3 N* H6 K0 F1 @- \$ M" T# l. _* @" S   write(fd,&data_write,sizeof(unsigned short));6 E2 m: O( u) v( L
   , [8 k! C* R3 r; x  C7 E! L8 O
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  x* k  b/ |1 ]3 G5 T   read(fd,&data_read,sizeof(unsigned short));) O9 g" ?8 b  f. a9 ~- b
   6 h6 c$ R% r& M+ R
   if(data_read == 0x13Ec)
2 a0 K: L" l, M  w: }: o   {1 F$ _% k7 W9 s* s5 m6 y1 D
   ; |- S+ l" M: |7 X$ [7 u$ y: t* U
    printf("data_read = %x\n",data_read);
/ l  D6 e: W( ~6 R; c   }
# Z) Q0 a. P2 W   
! l6 s5 a. U; A+ I0 G. Z1 k  g   msleep(10);/ z: V0 [* j! i
  * b! h/ u6 f# Z. g6 K8 T+ s( g
  /*
, p: e  z( Y% L7 S% Q9 y0 ~   ioctl(fd,1);   
5 O) q. T" e) A$ ]5 d0 F sleep(1);
, Y9 |0 D( x' E/ w( [4 J! O ioctl(fd,0);6 n, V3 D+ {$ k# X- X
sleep(1);4 I1 {9 Y/ M7 Q, F/ \
*/
8 l/ J# v0 D1 k  }   
3 t  i" w- C  { return 0;
! y$ a! L6 u$ F  K( l # T, T% D& g" m8 Q9 M8 s
}
/ \7 d! X! A( [
: `5 L- R7 U/ x5 B6 U多谢各位指教,谢谢! 急
9 ?/ l7 d* u2 k' k+ Z  E" ]% s% ?1 Y( g7 n, m" A% P2 V
+ a6 ~4 J0 g# x( i8 G% c8 z! S
1 k4 n% w7 Q3 W( F6 I

8 X1 V  \& D" K9 F1 w4 f9 h0 d* |8 j8 @7 B8 T8 g5 \- _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 02:33 , Processed in 0.048100 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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