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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 p1 g) o$ R! @2 d2 F/*
' Y6 G) j7 j! [+ d. Q * Copyright (C) 2009 Texas Instruments Inc
  n: C, n) f0 c" F1 k *6 H  t: i; Z' y0 [
* This program is free software; you can redistribute it and/or modify
2 \" O8 ~8 X, q7 Z! ~; Q: q0 U3 X * it under the terms of the GNU General Public License as published by
: B+ Q8 v5 Z# D8 Y* Y- h+ s! E6 M, G * the Free Software Foundation; either version 2 of the License, or9 T* T- R- T+ p' @
* (at your option)any later version.* a  C$ d' r! u  X& g
*$ H' Q; c1 j1 w7 U% z
* This program is distributed in the hope that it will be useful,: q, n0 L/ g( L6 q5 n7 z
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ z5 d. m% B5 d, ?* }" ]
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 z2 ^9 S! C( o# i/ R9 ? * GNU General Public License for more details.
, e  ?8 P8 d* c1 f! c0 z) V *3 T. v  p0 K! ?2 b+ z' ^
* You should have received a copy of the GNU General Public License7 ?5 v3 }! p& k2 Z0 e/ j, J" O/ a( C
* along with this program; if not, write to the Free Software
8 t1 W$ ]4 x- l0 ~7 w * Foundati# A6 |6 n& E! m* c  m1 j+ G! j
*/
- S9 ]7 C" D" V2 G: ^: g#include <linux/module.h>
) `! m. G8 L* W# J8 D3 t* P) f% H#include <linux/init.h>
) R" d$ e' W9 L$ D) w#include <linux/errno.h>  Y+ M2 b: [" b2 [% e
#include <linux/types.h>
, C# l+ E1 n6 Y& O#include <linux/interrupt.h>5 `/ k- s4 g. u
#include <linux/io.h>5 w6 C$ T  Y# X4 h" Q8 {6 y2 Z5 \; u$ b
#include <linux/sysctl.h>8 Z; B  ]- [& A0 ]6 N0 c- m
#include <linux/mm.h>$ I" X/ H) ]. e
#include <linux/delay.h>3 f3 }: _8 I5 j, Q1 i& ?
#include<linux/kernel.h>
5 |; _: J$ _' O- v#include<linux/fs.h>
& s9 H! J3 b% {+ L/ U#include<linux/ioctl.h>
8 |0 i0 `5 L2 j, N( O. d#include<linux/cdev.h>
  f$ j( [8 ?9 S% u' P" i" W% ?% F#include<linux/kdev_t.h>/ `& z* q$ u% W' \# c: j
#include<linux/gpio.h>* P5 V9 l5 A0 h8 A8 ~7 o) w2 T
#include <mach/hardware.h>
$ T, |& L4 l5 j; s# y#include <mach/irqs.h>1 ]  R1 I' z+ C- v0 A( v
0 J1 c6 ~2 q6 t6 Z8 {- t% l! l
#include <asm/mach-types.h>) v! t1 F, S  P
#include <asm/mach/arch.h>+ V- g) k  r2 ?
#include <mach/da8xx.h>
! ^* g) W( h" G) o#define  SYSCFG_BASE   0x01c14000
2 n# y$ I- F6 K#define  PINMUX1_OFFSET   0x124
) x) v! L: ?4 Q: |1 P& t9 l5 Q" p! o#define  PINMUX18_OFFSET  0x168
1 Y9 P! J' c: q" v#define  PINMUX19_OFFSET  0x16c
* e. f' R$ C* T# l/ V#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: K+ @9 [, Y! C# o#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. E/ H# m; _- M: P) E2 |/ R% t
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ H3 ^' ^; e6 h#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
0 I9 i9 k8 H% T: F" \4 I! H' C#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR1 t# e7 p  f- l, w% {
                            ) f8 a. i( f* r5 ~( e! H
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR! p  E& g6 v. Y: E
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR, F% x2 _* s/ l6 ^7 d0 n
//PSC7 [' P3 f% ]/ n% j+ X" h
#define  PTCMD_ADDR   0x01E27120  
3 E* z0 F1 }* V# p9 K: ?( a, s% i#define  MDCTL15_ADDR 0x01E27A3C
/ I) K# N" u$ L5 X#define  PDCTL1_ADDR  0x01E27304
3 k$ G6 O* v: q1 m# I//GPIO8 direction
# I! X5 _. Y2 I$ x; w0 R5 b% a. N( ^/ b#define GPIO8_DIRECT  0x01E260B0. `8 ]0 v" p* _- n4 W
#define GPIO8_OUT     0x01E260B4
! ?0 K8 A5 L! Z  o/ e#define GPIO8_IN     0x01E260C0* R5 I! @( W% x" F7 Q$ Z# z

2 V6 ~, G" N) P: t' g: t2 R//#define MCBSP1_RINT    99              
; C, X9 ]7 O' V. A# q8 _2 T- o4 a7 r//#define MCBSP1_XINT    100  % [( N. X; _& S1 l0 w9 t4 d* P/ z
static int MCBSP_MAJOR=239;" l* Y- `  @6 t$ w7 E. E5 Q. k, ?
static int MCBSP_MINOR=0;4 n) d& I! g# H. I8 ^# c, ]
static int count =1;) y+ v; L) L- f9 z2 V& }

5 I. T- x: J* N- @" p! v2 |#define MCBSP_NAME  "MCBSP-device"
8 r3 `' \' Q8 ]1 t" }8 j
0 U* C! W: P" Z: U5 [1 O' g  wstatic struct cdev *mcbsp_cdev;
3 ?  V) G! ?: h! f. Y6 kstatic struct class *mcbsp_class;
% h6 y: q! Z: S4 {9 \9 Sstatic dev_t mcbsp_dev;
: ^1 U( B5 T; D- @- L* i/ `unsigned int DRR_data;
( I; z$ W" t: n) o5 q# C/ F6 U' `unsigned int DXR_data;
. T* H  {( x) Kstatic int mcbsp_open(struct inode *inode,struct file *file)
& `; k9 x# K1 s8 h{
6 s9 r; D# G6 \5 L2 [6 U6 ~   
9 B( \! y$ y5 I: G: _5 N   //interrupt enable,initialized' i' H4 w" g- M) F# p, S8 c" `
   unsigned int temp;/ t* `3 H! t+ M. z7 M
   //SLEEP_EN(GPIO8[10])---0
( t9 t6 T% W$ ]- y6 `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 L; Z$ p+ T0 q$ }0 Z# w; u
   temp=temp&(~0x00000400);
  F0 }/ s# u# o$ |9 u( S   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]7 Y5 n- A# O  Q3 D1 s
  //RESETn(GPIO8[8])----0----13 R; u5 H7 Y& [9 c7 _
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% z# U  L5 n4 M/ t; m- ]2 C- P   temp=temp&(~0x00000100);" L1 U4 U/ S( u( u1 m; i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0" l( S: v' U% Y9 L8 b
   udelay(100);, V: \" W7 |! N' R( J6 P$ m' b: j
   temp=temp| 0x00000100;
  ^; `( c8 P9 L" O+ p! R  }& L   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 J  B) J  N8 _! M" {3 g8 x   udelay(100);9 `) `( U+ d" ^% u* u
   printk("open success!\n");
: D5 X+ L' N& {7 E; Y   return 0;
6 y3 o+ L* @& `: M" V}
3 \7 G- Y8 A5 n8 U2 Y+ B7 n6 i; a4 H! M; |
static int mcbsp_release(struct inode *inode,struct file *file)
: j$ f8 `" ^; @9 F7 b0 D{
: b5 I1 V, P7 }6 D8 q   printk("release success!\n");
5 t- V4 |# p" M( M; }6 s   return 0;4 l: Q" ^2 t; C
}
0 s* y: C* A$ C3 [4 D  H+ F6 C
# o, O( b; n- v+ I, }" Y5 s" H, Cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- P& g% @2 j8 A" f1 Y* g
{: j. l" x8 R; `/ H. y
    copy_from_user(&DXR_data,buf,len);
+ A# }/ Y0 U1 R5 B6 E& b    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 o! @' ]. T) }7 ~- v    return 0;
' _, z4 y  w. f. T# P0 t
  ]/ X. E% [# t/ p! P}2 S( K$ h- l! [, N9 j- Q) q4 @
( l7 l! k- W/ }5 {+ A. _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" T$ a4 E- o( D# n, V{
0 X4 q( E9 z/ S; A( o6 u# I   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: @# S8 D& b' {5 s3 b4 C
   copy_to_user(buf,&DRR_data,len);
; b& `6 p% H2 P) w' K5 o9 _- P   return 0;
9 k5 h7 t# j1 L0 ]% ~5 Z! h}2 u& F" _% @0 a7 d7 E/ x4 A
7 j. Z. {' c% b/ [. Q
  Q! [& w$ v4 Z5 V) w% Q
static struct  file_operations mcbsp_fops=, ^8 N5 _- {( Z) o* b: ]
{
( j0 q7 N& G1 j  x/ s3 p. w   .owner=THIS_MODULE,; f9 X4 C1 c% f$ U
   .open=mcbsp_open,) G3 U, f- Q* B7 S, Q6 W+ M1 D
   .release=mcbsp_release,
  c( k( q# R7 i2 f9 z+ K, I4 r" t- @   .write=mcbsp_write,
; S3 k8 a" r2 i   .read=mcbsp_read,8 |' Z3 |! b' p! M1 B7 j7 N7 }5 U
};* k7 b& v3 P9 w+ g) J
static int __init MCBSP_init(void)- G5 ?8 g1 z5 c+ _
{: {8 {+ n: ]/ w, C: S: x, C
   int ret;+ o" K* E& R: o* |! U
   unsigned  int   PINMUX1_REG_old;
4 `; ?  d9 J7 i4 o2 E& [. M   unsigned  int   PINMUX18_REG_old;
$ `8 g. z# c' q- o   unsigned  int   PINMUX19_REG_old;
+ ]: t& K( T$ M# i   unsigned  int   temp;  
6 Q- w- v( g6 h4 v3 D   if(MCBSP_MAJOR)0 n, R& h) K* m2 Z" I5 D  r1 {
   {: |% j( A& l0 N3 Y% h. I- |
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);! S; b* l. J6 t1 L; a! `& P
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 n' \/ \# {4 p* B% C4 m" C9 d/ ~   }
; z3 _2 ~; Y6 v  Q3 g   else
" O) J) U5 v* e6 I   {
5 n( r8 u: s# W3 U0 c  f1 l      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( r6 w9 H7 ^3 C- O. j) Y7 V      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, x. K9 p) r5 ]8 o5 Q   }
! w5 @7 z5 ~- G1 e+ j& [   
; ^/ C$ D! L. Y1 F; k1 I   if(ret<0)
% |2 h$ L( m$ i   {" M/ g, Y1 v$ a, Z( o$ G
      printk(KERN_ERR "register chrdev fail!");
& q' ^5 ^/ E! ?" J, j3 ?      return -1;/ ]5 O' i$ D" E- j, ?
   }: [0 F/ k# u: g  G# @- W
   . V2 k' I6 i7 ?
   mcbsp_cdev=cdev_alloc();2 D! @2 j( O' L' ~& J4 o
   
/ N' ~2 A8 y( W% ~& U   if(mcbsp_cdev!=NULL)
* o" I' f" C5 e+ f& P# ]   {
- {) Y, {* X2 ?$ D7 T      cdev_init(mcbsp_cdev,&mcbsp_fops);/ R, v: t& W6 ]/ p! [0 k: y4 I2 i
      mcbsp_cdev->ops=&mcbsp_fops;
( t3 Q* |' Q+ [, H, g7 F4 A      mcbsp_cdev->owner=THIS_MODULE;% n" T; y6 d, K% s+ k. d) j0 d
      + y% e& M; q; b. o/ F$ h+ Z
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
4 b0 C1 U6 L  ?2 c  ?( D" ^& o5 `# D          printk(KERN_ERR "register cdev fail!");
) l2 ^' a5 l; `+ B      else8 |8 a9 A' ?; E9 D, [
          printk(KERN_ERR "register success!\n");5 L/ n% Y0 @' S, L" X: }6 t
   }3 N& ~" A# u  j
   else1 _0 {: N$ a) R2 h, D' m* y+ d4 J
   {
6 O- z# U  I0 S: U/ \: u      printk(KERN_ERR "register cdev err!");
, H( R1 l8 `# E# I: e      return -1;8 D1 G+ B) r7 x$ z
   }
3 F5 M1 ~  C4 ?+ g- H   
6 ~1 {. h* H# W& h! p6 i  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) p" _. L5 S! @
   if(IS_ERR(mcbsp_class))
) w5 t' P! B) }$ h& W   {
" U) y& N8 D# s- J1 d& d  E& G      printk(KERN_ERR "register class err!");
; ~6 Q& N+ q/ l9 R$ S$ ^   return -1;0 L1 S% ^' }8 E! N
   }. m. b/ `& a/ |$ k8 H$ u9 E" L+ t
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 v, y3 ~: Y: R, `
* P$ Q5 I+ [3 q+ z5 {, j, W9 O
   //PSC
* h: H1 m& p# O4 m# G, U" l, \9 F   //add Enable MCBSP
+ R  e0 h5 T& ^   //test
2 {% W1 T: O8 \  W: E# T9 f, B   temp = 0x80000003;
* P7 @. C& w# f& k7 ^' b   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* ]+ G3 N- }6 q& ^% A9 B  l   temp = 0x00000003;. T0 t1 c3 e6 G* P7 v+ h% o0 W
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
( L% p! D9 d; _5 S2 H3 b! d 9 z. ~9 g5 K) o$ ^' M% B
   temp = 0x001FF201;
- q6 F+ l9 e, K4 W3 M   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) ]0 t% s( I& T6 K
   
- C; _. n& F% T  }- y   //PINMUX  6 ^1 n0 D9 _$ Y9 W5 v4 _1 h. ?
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* y8 }. U, H" d+ X% D   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
' X  i4 W: F4 y0 V   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) E1 P9 I4 f6 N& M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" k* F9 y$ `4 i. o
   
' y; C4 X9 Z$ ^   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; e2 z8 P9 d5 p% D   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; t1 B- Q8 _. ]0 g   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
! Z5 k: Y2 Z  ^! {' n/ N$ d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' Z  X6 ?7 u; F2 c  s/ {2 s ) v5 Z5 c' y3 |+ @
   //RESETn,L138_SHK2  K, O1 l9 G0 P$ M& g
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
2 F' r( _6 R) T" A( f   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   & L8 L+ C) O. l2 X7 Y$ d
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 R; V5 t$ g1 u
! [& M# x+ z% F& t/ {
3 G! f0 u1 k9 k7 N  //SPCR Register3 s- C/ |) ]: w& z0 c2 |2 h( o
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 o! C9 x0 |$ h, }' M  temp = 0x03000000;//(DLB=0)
- |$ \4 H2 `' Q6 M4 ] // temp = 0x03008000;//(DLB=1)
, k* Y) Z( u1 Y. k  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset. e9 a' o* H$ `5 ^8 t) ?: z, k
  temp = readl(IO_ADDRESS(SPCR_ADDR));
. M2 N# W5 o; E0 n1 Q  printk("temp=%x\n",temp);3 H* O+ [% `# \3 M! x; x! a
# |7 b) z' D7 M, I! e2 i' K; t
   //PCR Register
& {1 @: d$ U/ G0 R- w, r0 E/ ^- ?   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0" [" V. A; r/ g+ x8 W- a
  // temp = 0x00000F0F;
6 s8 w2 k$ }- _! q3 q  temp = 0x00000B0F;, B! {; e6 h9 y% A- X. o. P. |6 g
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 z1 J1 H) a  G( ]0 Z2 ?2 c  temp = readl(IO_ADDRESS(PCR_ADDR));
- y7 a) l+ n! Y) U& x" w  printk("temp=%x\n",temp);  , x+ ~9 ]+ _& F0 _4 R
   //SRGR Register- `) _' a1 P. t
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11! O  \) A. @& w! c
//temp = 0x301F000B;% t. A; a$ @0 v& W$ K5 W8 A
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
/ e' X9 u/ V0 L$ y' a$ J( q& r3 H  temp = readl(IO_ADDRESS(SRGR_ADDR));
: w" X! f. i/ f5 A; F  printk("temp=%x\n",temp);% [( v$ A0 V9 H, O; j4 h# p
   //RCR
6 a; E) o. a; x0 T; c4 x3 c   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 q4 \" ?6 K2 f3 J0 ~  k5 v; \   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 n+ j$ D' q, @- o. A   temp = 0x00440040;
2 g, O+ M: K8 @. g. k   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized     y1 D+ |% N$ I9 q
   temp = readl(IO_ADDRESS(RCR_ADDR));3 m! N/ X5 w/ W6 w) d9 ]
   printk("temp=%x\n",temp);# _1 ?( E" `, b' l
   //XCR
4 i; w. b( y0 h; h) f" P   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-10 n( t  H$ a: P2 R$ V/ q4 C9 Z
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" `% |' d9 B: m! v0 j
   temp = 0x00440040;
2 _; Q2 D7 c9 x* W   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( h  g3 Z& v; `0 V5 A' Q% w   temp = readl(IO_ADDRESS(XCR_ADDR));7 k: N, \( r" A; G2 B+ y
   printk("temp=%x\n",temp);
8 G: l4 |3 m# r# ~3 O  udelay(100);' B3 S8 ?" n( r) K
  //SPCR Register) V2 C9 ~! @2 `0 _) H( m, o
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* D, o$ A, }2 V5 x1 b/ y: e  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- O- W3 i: ~! o& R6 r& b  C  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
  A9 a3 y0 a# [  temp = readl(IO_ADDRESS(SPCR_ADDR));
" [0 g# R6 `& W! K( y  printk("temp=%x\n",temp);
: f) A. s8 y9 D% g4 N- s3 x  udelay(100);
3 X2 e9 k) o" d8 V' S. M5 ]; ]$ D1 p8 @
  //set GPIO direction
% ^5 y7 ]2 @) K# _8 B   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));: S2 V4 o8 m9 v& t$ y
   temp = temp | 0x00000100;//EPR----input7 v7 l8 |; v0 t  J7 o
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output/ ]" _3 @" V# C# A  t: l  t- ~4 k
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 ]; o. z2 k& \

0 F9 s) S; o4 k* ~0 E, b   return 0;  r- Y+ f% n, J/ y. m
}* I, ~' H; E- ^. B$ F4 Z
static void __exit MCBSP_exit(void)7 h7 b9 n4 j3 d% p! c1 F
{
+ X5 ~; i3 s$ c) i   printk("mcbsp chrdev exit!\n");
" `# Z1 D$ k1 U* M, o2 {4 |! W   cdev_del(mcbsp_cdev);! }$ M6 N' d2 E9 \
   unregister_chrdev_region(mcbsp_dev,count);0 v$ Z( W" V) G  M6 K
   device_destroy(mcbsp_class,mcbsp_dev);
  V( c( @3 i( i3 H0 |) c! \   class_destroy(mcbsp_class);
! h4 f  g% x1 @# S}5 b! B3 i' g, N' z8 s% R& d1 @
module_init(MCBSP_init);
' q& U" G8 y3 g; Z1 s) d; R# T! Smodule_exit(MCBSP_exit);: m% [+ z6 w8 f" n, O; W

5 X+ q" C3 S  `* q9 v$ PMODULE_LICENSE("GPL");
+ b/ I2 T6 O* c' u+ C, M8 s
6 p/ ?- w6 F$ R2 G+ P我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  a6 R% j: }/ c$ b6 \, O7 }
我的应用层的测试程序如下
, G7 n3 B! ]( O4 N1 c2 a1 h#include <stdio.h>
. p0 A* L% F- k3 J9 k+ F" W#include <string.h>
% v1 I" @" b3 C+ W) c% q! E: ~* I$ n#include <fcntl.h>/ P4 u0 u7 ]6 [& b% L$ k  o" H: a/ ]
#include <unistd.h>) N0 \. S% K4 M% o7 x( F' N
#include <signal.h>
' v. K$ [' Y1 Y7 q6 @#include <pthread.h>       //线程6 L8 {% \! f  D
#include <stdlib.h>
6 c6 x2 {6 \7 T7 t1 V#include <pcap.h>          //捕获网口数据) s. f6 ^  N, U4 }
#include <semaphore.h>     //信号
8 Q+ Y9 F, ~$ X0 i8 h6 X; h#include <sys/types.h>     //消息对列) M( v$ j# e/ i0 r3 ^# ]+ O
#include <sys/ipc.h>       //消息队列
% @4 q. b, d' o0 U#include <sys/msg.h>       //消息队列% G2 N, `1 C) b! z
#include <sys/select.h>( J% \) r8 j; q8 r0 F7 G
#include <sys/syscall.h>( k/ O6 a1 _* r: |& E: e
#include <sys/stat.h>8 }& L" D; E1 V5 I& D5 a6 {
#include <sys/mman.h>% L. f: {0 j: S( c
#define msleep(x) usleep(1000*x)
" z( A3 M+ _9 v) K8 D1 w
: T5 v* @, L1 U# D- |4 B% Iint main()
) F8 m' {/ `' R/ r: C6 X2 F4 o{ / {% V. Y5 ?& X; G& N
    //MCBSP,ARM与AMBE2000交互设备( \+ M2 S# A# ?  t1 q+ U) i8 u& ^  }+ \
int fd;
$ W* o$ {5 C' V- _ unsigned short data_write = 0x5555;- o/ d' m! z0 ~7 a# X# ?) x
unsigned short data_read = 0x00;
$ Z& U- I0 }3 u" G  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ ~% N: U5 X% \ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" q; C- A  ~0 N- f9 d- _    3 T; x2 c- r& N! E' I
  if(fd < 0)( S  G3 s& T; m
  {
  D$ r0 Q* R# n! X7 y: G- N+ N     perror("open failed\n");
0 L7 g1 U5 k/ w+ T# C     return -1;
3 P; e( X+ u' N; p  }; n* Z# }! u4 K7 b/ O
  ) K4 S" w9 B; M7 x
  while(1)  X" u1 p/ Y, L
  {( e+ w. Q, c% m" d& x( N& I7 m
   : h/ @2 s( b( ^6 z4 D
   //AMBE2000每次读写是24个字为一帧
5 z, X8 O3 }3 c# R   //写数据时将数据在底层存储起来,等到中断的时候再发送4 t3 z  `. o  q, S- K  J/ n
   //AMBE2000输入数据是以0x13EC开头的. P# v# P5 K* n2 l- R
   write(fd,&data_write,sizeof(unsigned short));4 E6 f+ X% b! ]+ l4 O
   
7 `; B4 q; v6 o% L0 o   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
4 A, S9 b$ x& Z( g$ S   read(fd,&data_read,sizeof(unsigned short));
# B9 F$ v4 K& k  T# P4 e- m4 @  _   
2 P' f5 o' ?* J# G: X) ^* S   if(data_read == 0x13Ec)
6 W& O. f; U( x0 y2 p   {
8 Z; {  j, V3 C, ]* L4 Z: P   
# H  A% m0 I+ q    printf("data_read = %x\n",data_read);
0 I8 @; T) w+ z4 s   }" S8 P! a* h/ j6 i" M7 F, i
   & a: a; h" m' J( s' Y4 [2 g
   msleep(10);
$ P  o+ l4 w1 l: N  
' A7 U* }6 q# U" P) ^  /*5 ]9 M2 \3 @) c" U
   ioctl(fd,1);   
1 ]7 |0 G. `  u9 X; m; ^ sleep(1);. U5 H- A* ~5 W* t& }2 [  P
ioctl(fd,0);8 r, y: }) N$ |) h, a$ B; [
sleep(1);
9 Q4 n! \5 |/ Z% p8 Z6 z( w */ % p5 Q7 O8 f' ~, _/ ?& D# }
  }   
& p0 m6 N1 S" U* ], Y+ s. `' c return 0;
" S6 G/ y- H. r0 i, w; @( s
1 T! L! u8 V! @, t; V1 Q; {}
# y' E% M8 r& m" P6 m; {  d; T( B; U+ @" Y
多谢各位指教,谢谢! 急" R) ~% ?0 [# H7 B  I- ?7 Y8 x

8 T2 @) z. H, Y
( v9 X4 m' \1 h: J0 U) _- J. l8 J- q: f4 N- c1 C) P! o/ d
$ {0 f& d( }; \6 ^) w5 m' {4 _+ G/ w
6 i7 u; h$ d; K1 F' P/ r5 S+ R2 N- Q5 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 10:29 , Processed in 0.050757 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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