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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( s% _# F3 m; @& f! q/ R2 ^# ]
/*
8 [+ g+ e. [1 r$ ?  g * Copyright (C) 2009 Texas Instruments Inc
3 H- m! d! L! n& C7 w5 Q *
7 P0 q; N1 o% M; Z+ O" b, x5 ` * This program is free software; you can redistribute it and/or modify& g: O- F" W! A. e* o) Z( x
* it under the terms of the GNU General Public License as published by
! p% _/ i4 c/ k0 v * the Free Software Foundation; either version 2 of the License, or  x3 H  z4 h4 {
* (at your option)any later version.) @& v/ f( E4 B3 l( n3 |
*
/ m3 o4 O9 f, x$ N2 [$ R  A/ k * This program is distributed in the hope that it will be useful,% `; K" \# E5 n- j1 d
* but WITHOUT ANY WARRANTY; without even the implied warranty of6 n" Y& S2 @# ^% d- @$ b6 Z6 R
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ a1 f, f2 }' q! V6 P( F6 u0 R * GNU General Public License for more details.2 z& a4 B  k+ ~" q1 @
*
0 K3 H; U4 j* M  h * You should have received a copy of the GNU General Public License+ t$ B5 b# Z7 Y9 h0 h
* along with this program; if not, write to the Free Software- u& O# }" M7 m! D' _1 u" o
* Foundati
% @6 Z3 A+ }2 Z: \. K& M*/1 H5 B, X; N( u4 j
#include <linux/module.h>. m" {1 i% o8 T0 B8 y! r+ |
#include <linux/init.h>; D4 }9 ]$ Z  |! p" X9 J# M& C
#include <linux/errno.h>* E* k+ _; }# n; o# X
#include <linux/types.h>
! O; N8 T/ {% W- L% S' |; V  R#include <linux/interrupt.h>6 e4 B# [: [7 b+ y. x
#include <linux/io.h>/ T* i3 V5 O, U0 u
#include <linux/sysctl.h>$ R7 G* B0 b! E) p& V
#include <linux/mm.h>
6 i; }* r5 O/ f2 n5 [1 t#include <linux/delay.h>$ n$ X* Y9 i' u5 A* ?
#include<linux/kernel.h>
' V9 A/ i& Y0 F#include<linux/fs.h>. P3 U  h( i* N- |9 g- k) \
#include<linux/ioctl.h>, s* J8 l) Z$ K1 q: y
#include<linux/cdev.h>
5 ~  O* _8 p0 r#include<linux/kdev_t.h>. B" q. B* v3 l- b) Z2 a
#include<linux/gpio.h>8 c) N1 p5 y; h
#include <mach/hardware.h>
) Y& a, z' n/ w( I#include <mach/irqs.h>' u' a9 k% O. y0 w) q
) F: Y/ p; F/ g/ ^/ \2 m+ l
#include <asm/mach-types.h>( L& O1 D7 j) y* T- b/ I
#include <asm/mach/arch.h>, I2 |' q  Z/ G6 Z! {4 C
#include <mach/da8xx.h>" ?( U6 |$ c) R' \# o  m6 D; M! `' J
#define  SYSCFG_BASE   0x01c14000
; r  q% X2 J7 ^+ Z/ d8 k9 O#define  PINMUX1_OFFSET   0x124 / u) d! j4 O' f
#define  PINMUX18_OFFSET  0x168
7 E( c6 l7 q* ^* U# J#define  PINMUX19_OFFSET  0x16c8 Y1 ^7 c1 Y5 c) G$ m# A; n6 s6 J
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* o7 D$ `$ Y  }& f5 P
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR# l: B5 H' _2 B
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR% S* S3 w% I6 k. h+ m) M3 \
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
1 k5 b6 R1 f0 W$ \& z- x' X#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR; A6 d/ x5 j8 d- t
                           
) e8 X: y' I  I6 ^9 J! K2 i#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  {1 K$ @. U9 ]. E#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
% U8 @# z' ^" q& W! r4 P//PSC
  t0 a  b' a( F, i# s8 W9 b; R#define  PTCMD_ADDR   0x01E27120  1 a: b6 R- S9 z
#define  MDCTL15_ADDR 0x01E27A3C
$ j$ w3 U! B$ [& W2 W7 \% i#define  PDCTL1_ADDR  0x01E27304
) A& u% E# K1 E4 t4 u4 S* J//GPIO8 direction% G$ J5 w% p$ O& t% m7 o4 n
#define GPIO8_DIRECT  0x01E260B0& i9 }7 [7 Y( \; R+ I! H! S$ n
#define GPIO8_OUT     0x01E260B4
1 N$ X* W. e, @9 C% z/ o#define GPIO8_IN     0x01E260C0! V8 d4 O# f0 \# ~; k
- c' l# Z- h9 Y
//#define MCBSP1_RINT    99              
8 p4 s3 G' H6 X: d! Q( X//#define MCBSP1_XINT    100  
" h( o+ s2 _: n5 r, Q5 o" Cstatic int MCBSP_MAJOR=239;0 v' c5 e; b4 t! G
static int MCBSP_MINOR=0;
# W7 Y4 T& e8 c) f% e5 a! Qstatic int count =1;4 Q* ]( g9 i  m
# A* {2 \/ Q; T! a2 h
#define MCBSP_NAME  "MCBSP-device": ]3 E( |& H6 x6 Z1 x9 b6 H

( |7 y) ^$ M6 Z& Ystatic struct cdev *mcbsp_cdev;9 V& D2 T. K  I8 b& r4 s
static struct class *mcbsp_class;0 g, J+ y" z! N- R& r5 i
static dev_t mcbsp_dev;3 x8 L2 ?8 Y& S
unsigned int DRR_data;
6 m/ c* J! `) t' L+ cunsigned int DXR_data;; y1 r- ^2 k1 K1 R$ j1 D- P
static int mcbsp_open(struct inode *inode,struct file *file)
  ^+ s4 M- D$ h1 Z4 {  o{
1 T$ y, B6 n6 Y4 V   + {& v; \2 L  l2 y
   //interrupt enable,initialized
3 ?% a+ e# b' j2 i/ |/ f   unsigned int temp;
+ q2 `. ?+ I  M# @) G' r3 l( N: _: s   //SLEEP_EN(GPIO8[10])---0: @, d" w  Q1 N7 k1 r2 B" V
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; K7 F" y, Z% ]% y# z9 c4 N   temp=temp&(~0x00000400);2 S% j4 E( \: ], Q. B$ Z8 M5 A
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]  x2 u2 t# U7 B
  //RESETn(GPIO8[8])----0----18 h  s' z2 ^& j' D/ M8 w% c* y, `
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 u  J: f; U' O7 |: F
   temp=temp&(~0x00000100);8 u/ ?; ^$ j* m5 H
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 z* y& M9 V# @3 \4 c
   udelay(100);
+ O2 A2 Z8 q( [   temp=temp| 0x00000100;6 Y5 }4 x! B1 B2 L2 Q# k
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1( ~, m8 @: b% J1 d9 G- B- m
   udelay(100);
1 t4 s% H$ U' \4 o3 I. G   printk("open success!\n");
+ d) m! u$ e2 n1 ^# d- A   return 0;3 N8 y! _! G% ?6 s
}' a6 H- S  }: n+ |

$ q! P6 M: j. L) z/ ystatic int mcbsp_release(struct inode *inode,struct file *file)
# K8 y7 E8 }5 f, D5 U% ?, O" R{; f  Z- z# R  B5 S
   printk("release success!\n");
5 m5 \) Z5 n8 h9 V8 l( f. h   return 0;* E- l; G6 }; Y0 ?" D+ ^1 F6 r  O  V
}
; z7 V: D# b$ [" [
+ T$ j5 \* A4 W0 h% Wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)$ z8 x7 L2 M3 ]4 Y. r3 _" D8 _4 X% D
{) e- h1 g; p8 a3 E
    copy_from_user(&DXR_data,buf,len);
' D3 l3 G' s  H! H: D5 |# \2 }1 c    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       2 R4 j2 l6 |: T# J+ z3 V2 ~
    return 0;
$ o/ w7 i/ k' C+ d: ~
. _7 I2 N3 `& p& c, a0 C) z8 S}
" }9 z: o$ o) f& h) S7 U4 {' H2 W( e  Z( u: k, R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 L: P6 r! l* Q9 J% U
{ % @$ b2 Z; T( Z0 Y  j
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- e" G. v$ |$ k" ^0 v5 m8 r, P   copy_to_user(buf,&DRR_data,len);
" \1 D5 z0 J7 Y! H% H   return 0;$ G. i9 x4 r) K3 N* x: K. j
}/ g1 Y1 p& m3 i( M1 }& w

4 M* ?: s# |5 m1 f/ e7 X- n
7 ]. p) y* B# ~$ ^: ]static struct  file_operations mcbsp_fops=5 F. s0 W6 H& D8 G/ h6 _
{
' F3 f+ i9 b6 @4 U8 G$ S% Z   .owner=THIS_MODULE,
, r' Z! X, I* T$ F( E# m7 n+ T   .open=mcbsp_open,5 C: ]5 Q; z' ^4 i' r8 f- X
   .release=mcbsp_release,* y6 E% i# N- |+ p& K- V
   .write=mcbsp_write,$ ]. J1 i* N  |* Y: d9 z# l% c( }
   .read=mcbsp_read,
2 _6 T9 v. G! c8 C};# W' N( |& n. d7 i$ C) V% _  L
static int __init MCBSP_init(void)
; o. J: d% F8 I3 a{5 f* M* D) z8 `) A! ?
   int ret;9 `: {3 k  c% T1 p' B
   unsigned  int   PINMUX1_REG_old;
/ K2 Y, v+ F* @   unsigned  int   PINMUX18_REG_old;% A. }7 b  R0 ^" r9 i+ w
   unsigned  int   PINMUX19_REG_old;
. G! i- J$ q; [; k: j& }   unsigned  int   temp;  
3 I& r$ h; R5 Q8 k& [   if(MCBSP_MAJOR)
6 E- [$ c, U/ ~   {1 D; J9 D2 J3 g4 P
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* A4 A, o( a6 I9 e$ M: b8 ~  E5 y      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: e' k) J. |& m! i7 C- y3 K" p
   }% D- o" A( {; ^- M( k
   else5 _: \, k4 y) |* {" M
   {- h( m* k8 ]* i3 [: h
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! K, _0 i8 a; V' v* T6 W6 B0 a+ u      MCBSP_MAJOR=MAJOR(mcbsp_dev);
0 i. _" k1 Q& ^( [& k   }5 R5 G- N* U* u! S' `/ \
   7 G* a3 ^/ b, p. W( U
   if(ret<0)
+ o2 R: ?$ }4 F7 M; v# E. d3 ?9 Q   {
% w0 @# d; Q/ t/ w4 \5 {      printk(KERN_ERR "register chrdev fail!");
" P! D% M' G, J& {: b: T      return -1;2 W# r, T( m$ i; ?' x9 _
   }
; o. t7 \4 A$ x3 p+ y   ( o& Y6 W0 o7 L
   mcbsp_cdev=cdev_alloc();* a; A6 {1 @  e' {+ T4 f0 V3 `
   . Y# m+ o. d1 P1 J- B% U" @: b
   if(mcbsp_cdev!=NULL)# b! q0 Z" k0 ^# s/ |0 ~
   {
3 G7 t9 ^- |; P8 G, B      cdev_init(mcbsp_cdev,&mcbsp_fops);
4 _/ ]. }5 K3 g      mcbsp_cdev->ops=&mcbsp_fops;
- _. D- n. G. b1 m' W& d      mcbsp_cdev->owner=THIS_MODULE;% D" c+ M( ?( y8 H
      6 `( I. B$ W# E! \% v
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! A$ Y/ Q* {5 c/ p2 Y
          printk(KERN_ERR "register cdev fail!");
$ z: T, i: P+ l5 `. k      else
. N; ~( M' S/ d- c: l5 T; ~          printk(KERN_ERR "register success!\n");
' }7 z2 O8 c4 y' X& z   }
( D/ H7 a8 ]' R& u# E$ s   else
& r3 `# U3 r9 q* w) Y   {
! i3 L" w% d5 X" \/ b! d  v5 U      printk(KERN_ERR "register cdev err!");
5 d9 f5 G1 P' h, t      return -1;
2 {, i( o6 T6 t" l# X& g% T   }
% |! Z+ Q% k6 S$ Q5 p0 v* a   
  w" i4 r+ y& g3 \1 R: h  ^% C' [  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) g  V- h. ]: j+ J' n& A1 F, w$ G
   if(IS_ERR(mcbsp_class))
* B( r! e+ O: l# ^   {( @7 B4 Z% z/ B+ S3 e$ a
      printk(KERN_ERR "register class err!");+ |, J# ^# g  Q# l! z& P. ]% Z
   return -1;
8 M& O4 s& Z$ n( E. i& d7 G   }
. w1 |( f' N$ g$ |& g* O9 j   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 P. d$ \# n, \5 E( U5 U; w, \7 _/ Y
" r8 t6 V. I. h   //PSC( v9 F6 `5 T' m* s& t
   //add Enable MCBSP
1 Y! h2 R& G/ ?   //test
' I2 @8 m& n$ t" N   temp = 0x80000003;
% x* Q' B$ Z  d* A: K; w   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ q; a( x8 a  ?# O/ e5 @1 o
   temp = 0x00000003;9 F1 l  d& J8 [! u* [, k
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
! \6 R7 @* D4 j; a; O
3 o0 q+ l5 N6 R0 }. ^+ Q   temp = 0x001FF201;9 T. V. g, @$ b% e- n
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 O; n& P( J1 f& J( a( m5 c
   6 d( g* n1 r, z) q8 o6 ~# h0 `# F
   //PINMUX  
8 s# V/ m1 r( B) P$ R6 S+ {+ e   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 }" @6 l9 K7 J% ]
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ }8 |; d: J* C/ l
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
+ W& Q6 V3 R, p( Q   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 D" O7 o" g+ E4 q2 B   
9 Q  C! G& N$ c9 S  E   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 h8 b. ]5 k- p
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
% F, y! k$ j2 t* x   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
; X$ W# J4 E$ z2 _  @8 a: d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 g  e- p, w6 E' k# F. ~! j
7 P: w* ~3 `* a: m   //RESETn,L138_SHK2
# @8 i' F! `: f; ^# ?3 ?   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  4 o$ m6 p6 n% [0 \: @8 V: e
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   2 n4 u. ^3 l0 A- o" M2 x
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# N% X3 N2 s, x% z+ f- T
$ s9 _) v* B) }7 U+ f0 c+ k

2 i5 a+ W( A+ Q/ q3 S+ j$ F& l  //SPCR Register3 A! Q0 F2 c9 U# b
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 Y. x# e1 c6 m  temp = 0x03000000;//(DLB=0)2 ~# |; z' |8 K; g9 B! U4 c1 e
// temp = 0x03008000;//(DLB=1)
+ ?! v2 T! o* v/ z3 j5 ?  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  s9 W1 ]0 m1 I  temp = readl(IO_ADDRESS(SPCR_ADDR));
) v) \! _  m+ ~/ A8 r  printk("temp=%x\n",temp);
/ g/ |4 d2 l. r! g( p2 V2 o# y3 y5 I 8 V' G& ~5 ?% h% ^
   //PCR Register. _+ c5 p& W) l, ?. `0 o  j
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, M2 q/ r! I& e. F  // temp = 0x00000F0F;
( a% [' ^9 E6 a3 Q% U  D  temp = 0x00000B0F;* Y) v: v& ^7 c3 f* I* X+ v$ D
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
2 z" {* ^0 O' G: g6 ?$ }  temp = readl(IO_ADDRESS(PCR_ADDR));( q( i3 F* M0 w4 w. E; \% e
  printk("temp=%x\n",temp);  
3 M* j: D6 f" o7 x  V2 ]3 K* u   //SRGR Register
. |9 W* r( _+ B; }& I, _  J   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
1 w' v/ C# g9 h7 D  c //temp = 0x301F000B;
& E( S' a6 Z. x! v: y9 ?; b1 U$ x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' l' V& }" V+ g2 c. E
  temp = readl(IO_ADDRESS(SRGR_ADDR));' L% [2 O+ v2 {6 v2 C1 A7 a- s
  printk("temp=%x\n",temp);
2 y1 m, |8 ?8 g! A   //RCR
4 C: s4 W* ^. O1 G   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 i1 Z3 e: f$ ?3 l; s: ]3 k, _
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' X0 s8 v5 L/ x; S$ |   temp = 0x00440040;
6 ^4 R7 I0 P) ]4 w   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& m1 G' z9 n* \# v$ f- `6 V   temp = readl(IO_ADDRESS(RCR_ADDR));1 o. G1 l) h- V6 P$ |; F
   printk("temp=%x\n",temp);
5 _4 Q  z8 w/ k; w. e$ a4 }   //XCR3 I# N! x) g* T! z1 U* {, m
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* A6 J$ `7 A. n, w. c6 P   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 N; T& D# ?# K7 g) |   temp = 0x00440040;
' q" q7 Y' {  ^5 u8 a   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   5 f! L0 f& ?/ Y
   temp = readl(IO_ADDRESS(XCR_ADDR));
% \: o+ k  R6 G0 O" M' B% F   printk("temp=%x\n",temp);# I7 ]( F2 `" e+ v) m( K
  udelay(100);
# N- c4 ?: D$ ~* ]) f6 Q7 u- Y  //SPCR Register0 o4 M& b5 t4 s
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-12 }% K6 A  Q" [( d
  temp = 0x03C10001;   //DLB = 0 VS DLB = 13 m+ A: u2 W: Y! i# Z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled4 E2 h- Q" {. v* q& V9 w6 _# f' M
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 I5 G2 y2 r9 f! \5 g7 N* G1 ?5 z/ q  printk("temp=%x\n",temp);+ @5 [4 g, a9 |1 q
  udelay(100);! g% X  K2 u5 l2 x( f6 ^) V

$ A1 P- B8 u) H  //set GPIO direction! y/ i( _- _5 q( z4 H
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 ~9 ^0 ]2 g& {3 m  l   temp = temp | 0x00000100;//EPR----input8 v- d% O3 v/ l) c. B1 Z( r8 U
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output8 I2 g) X- n. Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ ]  t3 h  Y% [5 ^: m
& V( w1 w: R4 ]; ~   return 0;
8 H& {/ C2 t' ~8 L}5 L3 F; {6 V: Z% E7 }- ^2 Y4 ^- ^
static void __exit MCBSP_exit(void)$ r4 \& j' P* J
{
+ _1 _! A. W  p. F   printk("mcbsp chrdev exit!\n");. _: u& _4 \7 n+ P" {
   cdev_del(mcbsp_cdev);- i8 u. b4 C# X1 c
   unregister_chrdev_region(mcbsp_dev,count);8 L9 O" M% Q- A) o, p
   device_destroy(mcbsp_class,mcbsp_dev);
5 z, ^# F6 Y# Y   class_destroy(mcbsp_class);8 e+ W, t2 E4 \# h: f9 _; i- g
}
2 |# I, ~* u! j8 @6 ]  g. Gmodule_init(MCBSP_init);! v% F& w* T2 X' f* W7 \3 N% Z
module_exit(MCBSP_exit);8 I- g! |1 d# }- z
  k3 q) H7 Z3 R3 P. v- s
MODULE_LICENSE("GPL");2 }3 }3 y/ O. ^/ _& l0 a- h: p
3 a  v5 k& S8 h; Y4 G: e( Z: U) d
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' p0 T% i+ k  A我的应用层的测试程序如下+ Y) F: n& N0 A2 c; [4 z; z( r8 V- o
#include <stdio.h>
. m& |' C* l) m# q/ m' a1 m5 M#include <string.h>! N" z: X6 u" L8 v
#include <fcntl.h>
, k3 @, R4 ]7 I! g; J' ^% }/ G#include <unistd.h>% I* i8 z, \3 _( D* n
#include <signal.h>- A2 r( K( Q9 g0 J9 d' }$ G; c' y
#include <pthread.h>       //线程) A) I. B" x9 q6 m
#include <stdlib.h>
+ C8 B* O1 @) V7 w# I% u#include <pcap.h>          //捕获网口数据2 Z2 ~8 T7 v- N! n  |
#include <semaphore.h>     //信号
3 [+ T. `" h4 n  y#include <sys/types.h>     //消息对列
  b- R1 |5 L9 B8 o# A" b#include <sys/ipc.h>       //消息队列, e! t. J+ n+ S; l/ C* B0 I. y2 `
#include <sys/msg.h>       //消息队列
, c8 v2 g( C' C, F. M8 s7 i& c' Z#include <sys/select.h>0 s4 b8 c! _3 ]6 _5 j9 h1 j
#include <sys/syscall.h>+ \) U* U2 O) }' j* W9 k7 U
#include <sys/stat.h>
* T+ r3 z  ^. z, ~) Q#include <sys/mman.h>
# H3 X0 y8 b3 z# Q9 `#define msleep(x) usleep(1000*x)4 }  b) O4 C4 \  m  Q$ e! o6 _
6 H. L9 d+ r: N! A' \, p  N
int main()
" W+ F6 r2 X# B2 I! u# P; h{ % D$ Z7 j' _# \- U& _- }
    //MCBSP,ARM与AMBE2000交互设备( b2 b) X* L* k3 T* m: Y
int fd;
! X2 S2 r, i) }* W0 N2 V+ ]6 C1 z unsigned short data_write = 0x5555;% y+ O# D6 t. T8 A- {
unsigned short data_read = 0x00;" M2 M* {" e  }7 w
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 v3 ^! @- l' h) d- m7 i8 B- Z //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 z; N% I8 U. {3 e# k    3 Z3 U. y7 \8 K5 `$ M4 T" f8 e
  if(fd < 0)" G5 L3 l% N/ s5 b  z
  {
+ T- D5 R' I' y5 p3 t2 I+ x     perror("open failed\n");
5 u. U3 Z( T6 X4 v* l" N; y     return -1;
( S  [6 Z$ V  h3 D  }
; O3 j* m4 ?/ S- z' h; Q  
1 W' X. f! Q8 O: _5 k* M  while(1), h- ~; i$ f/ N
  {
+ o! F% w  Q2 f  ~. Y   # Z$ [0 Z8 W  H: h1 m# Q+ K! m9 R3 g
   //AMBE2000每次读写是24个字为一帧/ W) V4 B0 q# d5 a" a3 T" s
   //写数据时将数据在底层存储起来,等到中断的时候再发送  W: \, V, C9 L
   //AMBE2000输入数据是以0x13EC开头的
! k& o; z0 \5 D0 y6 N   write(fd,&data_write,sizeof(unsigned short));
9 Q: t) N, `% o' R5 f$ [9 d   
3 w! s: M. r% Y  D   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  0 G: W( D1 o3 F6 f# W/ a- b& g+ [
   read(fd,&data_read,sizeof(unsigned short));9 Z* C  j8 \- M# d" a
   
( n9 x# N2 D$ f0 ?' L   if(data_read == 0x13Ec)0 y: a  \8 X; G" {3 D. I
   {
  p2 b- g" A' N: }, e9 R   8 O" g8 x3 x0 c) Q
    printf("data_read = %x\n",data_read);; r: n; z' m( ^) j+ y8 z
   }# M) p* J- U( C: ]1 n2 T' ~8 r
   
' U" m" [+ M2 k7 P$ q* u   msleep(10);
; o- Z8 Y7 N4 L  
/ K$ M1 d+ ?7 S# k! O4 c  /*  k7 _! d7 m, l' A. `; ]( m
   ioctl(fd,1);   7 C- ~9 \: Y, h( {( N1 h7 s
sleep(1);
8 ?5 n+ ~, O3 X( N/ S4 q# y ioctl(fd,0);0 B: V* {; f& O" j
sleep(1);+ C  E/ g0 a& e6 e& D4 c  X
*/ % R8 j) @5 Y6 z2 h
  }   1 U. K" l2 @, T( K+ x
return 0;
7 B+ L+ v3 W! D/ k8 U, v1 |
& s# U+ P( F! s  J}
: {& }3 h3 b3 Q+ {
+ f) b' M% S: I多谢各位指教,谢谢! 急
$ x5 i7 F4 Y5 {# |3 K* }9 o
- S8 w" A2 s6 K9 ]( m; r! L2 Y
- ~+ _4 k5 t- r% R% }
$ D/ `+ U. S4 r: \$ C- B' [
4 v; \- }# [- I* Q. T# N9 L6 v1 C+ f- f) g4 K) B/ g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 08:43 , Processed in 0.050093 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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