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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:   `5 m$ u0 f' T9 Z) K
/*
( x, j( C: g( O3 x  v2 Z( ^ * Copyright (C) 2009 Texas Instruments Inc
" @0 }2 I) D9 h9 M$ ?8 P *
3 U" Q; ~7 \' c* P  j! e6 J9 h * This program is free software; you can redistribute it and/or modify) B. }9 }0 \$ {* T  E) W
* it under the terms of the GNU General Public License as published by
1 P  x5 l7 [& T * the Free Software Foundation; either version 2 of the License, or
  H% |# X' i! c( n6 ~ * (at your option)any later version.4 Z- z% F1 Z  C/ |
*
2 W7 U* U3 `( k( P2 c2 m$ Y * This program is distributed in the hope that it will be useful,
# j* ]. O) f6 J! c * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ T3 J- a3 s, [$ A& E0 O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5 X7 r3 G/ O% Z$ H' w0 d7 V& g
* GNU General Public License for more details.! e. P$ J- Q" I% d
*8 U$ E' Q" o, Z1 Q' G
* You should have received a copy of the GNU General Public License+ C; ~" D7 P/ w( ^. i* `
* along with this program; if not, write to the Free Software
: q) g# w1 g" U, y. C4 Q * Foundati! j$ w$ O6 c$ X  a: L. P0 v
*/4 p2 }7 I" M8 w4 H7 g. B; `$ a! S
#include <linux/module.h>5 |' {. Y4 Z2 Y* F
#include <linux/init.h>6 S1 C& g2 ?+ \; A* V- r) n; @9 [
#include <linux/errno.h>' n! s8 u8 h5 S& m& _. l
#include <linux/types.h># p* j# L. [3 S7 ], E
#include <linux/interrupt.h>
. W4 s- C$ R% B, I#include <linux/io.h>7 E% w4 M6 w# a, o0 `* w
#include <linux/sysctl.h>
4 p3 q! [% j/ w5 q# T% _#include <linux/mm.h>
8 v9 G( U6 C3 d' W: j) `#include <linux/delay.h>% M( K; s' R$ o: {' W( m' S
#include<linux/kernel.h>
9 K) Z' I" b6 l- Y& v" K2 f#include<linux/fs.h>
7 @. i+ I+ ^+ k+ C0 h* D#include<linux/ioctl.h>
( H# \2 O! A5 ]#include<linux/cdev.h>/ ?! \! A2 }$ M# o9 W& B& T9 B
#include<linux/kdev_t.h>
7 Z, N3 D  z. Z0 f7 n% y; L( j" h$ J#include<linux/gpio.h>
+ h& e; u: {. L$ ~# N+ {* V#include <mach/hardware.h>
* E7 A7 Q' I5 l' }* E" ~- C#include <mach/irqs.h>( a$ V/ E. W) p/ x/ N4 W* P
  f9 W' b' s3 p  {" Q
#include <asm/mach-types.h>
. g" g1 Y. w+ S. L8 p  }, @#include <asm/mach/arch.h>
( T. T$ o1 A/ J. Z9 n6 ^#include <mach/da8xx.h>
  H) L7 u0 P" \" e8 J  }; I#define  SYSCFG_BASE   0x01c14000/ f6 h' O3 J) G$ {( z& ~
#define  PINMUX1_OFFSET   0x124
  r# h0 ?6 m; ]' f8 ?) v4 r#define  PINMUX18_OFFSET  0x168
6 |, d& i  q9 ^0 b#define  PINMUX19_OFFSET  0x16c: |) e7 w& |. X' r8 M
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR. d6 q! t8 {5 i0 l
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 G# o' `, z! w' b- |+ c* Y$ N#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
6 _% c- d1 s( Y6 x! N" w#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR: [+ H5 _3 ^0 _7 H9 X& R' b
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' ?% m# \$ k1 n% z& b
                           
8 ]/ l  M7 n3 x% }. i( N#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
/ @/ e, K& N3 N& c#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" G2 u" }0 h+ d/ F$ P# k8 z6 l
//PSC
0 z( M7 x$ t( l* R+ y" C& \8 X#define  PTCMD_ADDR   0x01E27120  / v% g' ?" f0 L! u; O/ H
#define  MDCTL15_ADDR 0x01E27A3C9 j. o  Y1 J0 j4 A6 N% h, x+ y# D
#define  PDCTL1_ADDR  0x01E27304% U' I, k; O' ]4 _) d
//GPIO8 direction6 q2 \& {: V. g/ Y$ v
#define GPIO8_DIRECT  0x01E260B0
: _" o2 t' I/ R#define GPIO8_OUT     0x01E260B4; r* d" U/ {* j5 b3 Q% x, N
#define GPIO8_IN     0x01E260C0/ c3 C5 x* d( A, c4 r* G5 O3 g# `( s
+ l5 }% g# e6 ]. m* H7 {& X
//#define MCBSP1_RINT    99              * A. c4 V. B9 |( T
//#define MCBSP1_XINT    100  
4 q1 W, c7 [% Lstatic int MCBSP_MAJOR=239;
4 a5 C; u# y2 Y0 t& \( O5 O% x( cstatic int MCBSP_MINOR=0;
2 ?( j4 G5 F5 O; N1 u/ ]static int count =1;
4 z2 m& t5 \; G' L4 N
) q0 D: k* a0 Q3 ^+ F+ z#define MCBSP_NAME  "MCBSP-device"
, y5 Z- s8 v0 }. A
1 o6 i! R" L4 h, Zstatic struct cdev *mcbsp_cdev;' z! w9 g2 t7 y+ |0 N& s+ k; N( T- o
static struct class *mcbsp_class;$ k+ x% U- l. m9 l. D6 C1 E0 J
static dev_t mcbsp_dev;, o9 l. l$ i0 P9 V( @7 \% h5 J
unsigned int DRR_data;
& ]' i. D: L0 _* j! C! J2 o; G/ a2 Junsigned int DXR_data;
( N* [/ O1 d0 A+ x! b3 Vstatic int mcbsp_open(struct inode *inode,struct file *file)
6 @0 W9 Y; ]8 |  \" j5 y( t* p{
) Y  W& ^' l% J! A+ N8 L   
; i, ^+ A- I( N  c8 ?   //interrupt enable,initialized- p) W& r5 N/ b5 d# q  e
   unsigned int temp;9 p+ M6 ^$ w% n  D
   //SLEEP_EN(GPIO8[10])---0
9 T  E" M7 @8 y0 P; h" _2 w, z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 Y% ~; b# L" `5 n7 k  S% |+ v. p4 c# W. ^   temp=temp&(~0x00000400);* o8 D, F6 V" P0 o  [& |# u9 q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& _- L8 @9 W. k6 {
  //RESETn(GPIO8[8])----0----16 U& M" v5 X1 ?' k% z
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 E7 L2 ~3 C5 o" N
   temp=temp&(~0x00000100);
, y# j$ c* U, v6 L1 b   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% K  v/ f5 P5 }, Q! P" T& O# b   udelay(100);
, ]: Q# G/ R0 `3 D' c   temp=temp| 0x00000100;
) a% y+ l7 Y) f6 ~! j: Y; G   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
9 I' [' W+ ~4 V, `( Q3 a+ T/ n* C   udelay(100);- ?/ }, L3 `8 V0 z1 K" S1 i
   printk("open success!\n");  j6 z: f4 N6 K8 {: B. _
   return 0;) Y& y/ I. W* O: O/ T2 {$ G
}
! d0 U6 [$ I% O$ t/ M% C# P  O8 M9 D' n! i8 @" [5 Z
static int mcbsp_release(struct inode *inode,struct file *file)
% b  e: f/ N3 P6 n{
: J+ w/ c7 E( i: c3 b   printk("release success!\n");6 U- E$ \( h0 D( R( h
   return 0;
' }& R; t: a: [5 c$ L+ W}
9 S- I" F) F2 F2 g* C3 k; R9 f5 G
( G/ k1 u0 Z% b6 u: p+ ^, K) `% K, Estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 L! H' z5 n, ?$ d" Z" E
{2 m) O- b9 i% M4 R7 J
    copy_from_user(&DXR_data,buf,len);, a3 p6 ~% f2 Z2 c
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ! q' \! R' a' B( B. {, y( I- c
    return 0;
& M* ^7 ^1 [! s1 R  j( h
* y' ~" h& Q7 k}  W9 Q8 p- m9 J+ ?
5 ]: J$ I) x+ e. q* S3 @0 J
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ ?; @2 O4 w4 a7 \/ a; B
{
. B* O# u( |5 `$ _   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 r) d/ N( t( h   copy_to_user(buf,&DRR_data,len);
: m, x6 O1 T4 V/ _- V! v* O( C: G6 ~   return 0;+ I/ e( d9 [$ G
}' Z+ v4 ^/ M4 s% B8 N  m$ Y! A, {

- `! R( o* o3 ^8 E& v
2 M, x. C1 c- ~, Z6 B$ Hstatic struct  file_operations mcbsp_fops=
1 A; D, Y' A' s% b9 ~{( K- l8 o) r! w( @  W( L6 t/ L# p
   .owner=THIS_MODULE,& M- }9 K0 t6 n2 b7 B$ F% C
   .open=mcbsp_open,
% p( ?4 D6 v$ p3 Q. V   .release=mcbsp_release,
" K* g- h) J( [# |   .write=mcbsp_write,1 w: C' r& ~- ?. b8 ?7 J: e2 F
   .read=mcbsp_read,
- _7 ^( q' R7 A};
8 \% k) z3 _) z# K" Kstatic int __init MCBSP_init(void)2 t. [2 d% u, b3 L1 B: l6 `7 ^% e
{
& d" T  ~3 ?& y4 D8 b   int ret;5 k+ Y- F% @$ [9 S
   unsigned  int   PINMUX1_REG_old;
/ O% B" }. @7 V! ~& z  E! j   unsigned  int   PINMUX18_REG_old;/ v+ a& q, h) f8 x
   unsigned  int   PINMUX19_REG_old;- w+ K  c- m$ t& L" Q# j: I
   unsigned  int   temp;  " n& X# T+ z3 j  P2 M
   if(MCBSP_MAJOR)6 i8 r3 \; i6 C) T8 q
   {
( y$ I0 u& q4 S# ]6 {( V1 T! t      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* t" a- q4 n1 `& x3 v; _* L      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 r, j  l: Q9 l! f   }
, Q9 \) S6 ?9 k8 @8 h+ @   else
! v7 x$ z( |; a; p# y; {5 U1 [8 Q5 D4 i. b   {$ f  H' u! O  F
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);* t- |9 ~. }# f# s- C  A( Q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
4 t% V( j: h6 V; l   }
- `8 _: W" ]: B   
: w! W: S+ w" r   if(ret<0)# d9 d! Y9 d, {" v8 g+ E1 V* ?
   {" Q) h. I* k. ]8 K& |& \- c) a0 r
      printk(KERN_ERR "register chrdev fail!");
. o% z0 s2 g6 z7 t, l. R9 o      return -1;
5 k3 F& E. L! {  q3 r- L. Z( q   }1 u# K) G3 B$ g5 q" ?' x* ?
   * N0 z: ]0 ]' ?' W3 D6 {
   mcbsp_cdev=cdev_alloc();7 P- h5 S( ^' k) H( N
   
6 ~% }- K$ i3 M* {$ h   if(mcbsp_cdev!=NULL)
: J. n' K& A8 o1 M; `/ a0 `   {! I) H3 o* m, P7 f! y
      cdev_init(mcbsp_cdev,&mcbsp_fops);
+ W$ g" n9 c  h/ F' }: j      mcbsp_cdev->ops=&mcbsp_fops;
- @, r2 G/ L6 ~1 ^* y5 A5 ?      mcbsp_cdev->owner=THIS_MODULE;6 l2 x" k5 @* |/ z; {( S% M
      
; r! I9 B2 O. t( X      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 t, P' f: B' h" |# Y% C) x$ Y& M
          printk(KERN_ERR "register cdev fail!");+ b* @/ R8 i( A! s8 O
      else* U. Q2 j( U, k0 h
          printk(KERN_ERR "register success!\n");
6 u& ~$ _9 K6 [( b   }8 ?+ R( F. Y3 `3 L
   else
, B4 h( u: [  I+ e2 l7 c9 |1 j   {& i3 p9 O/ g2 ]# S
      printk(KERN_ERR "register cdev err!");# y5 p* P  c$ X
      return -1;
$ F: S4 N  P8 V9 M; C! h   }+ E8 D2 h7 m( {
   1 X: p5 Y$ A; c0 C
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 V' D2 v- W( n! ?8 M: i' f2 `   if(IS_ERR(mcbsp_class))+ l# G# F& n  E" W4 f8 x" v
   {- U/ D5 N$ x0 A% W, h# F4 h
      printk(KERN_ERR "register class err!");9 q" o* i8 `( J% \
   return -1;
9 ?* ?, R5 @+ q- f% }2 c   }
5 s% h3 @$ z0 p2 t: |8 u" R+ r" q: o/ D) ~   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);& l& i& i& ]1 r. [4 K* \) h6 y

4 r2 ~5 s% u" l( y& d* m   //PSC
% Q, O+ j  N- Z8 L. t   //add Enable MCBSP" {1 s3 o) ], K1 V4 v
   //test5 {: q, j9 w( e5 P/ l* Z; W# ^- @
   temp = 0x80000003;
5 ]8 V7 N, x# U- o   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ _' p4 s/ x3 \  v' B
   temp = 0x00000003;6 p5 Y" w( z/ {" s! i+ D. L' w
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
) a2 ~# r1 A; s" A; |6 E ( ?. l$ T( x* i2 w6 N' f
   temp = 0x001FF201;0 v! y" _0 L9 f2 T
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# U' r5 V" l2 d% M, T9 d' _
     |9 l( g/ ~- m/ z) t
   //PINMUX  1 f: Q* [! d" [# Y
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 d$ p1 u; X) K' S9 f+ C" k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
" W/ y+ F, d! D3 ^' g  E( G6 @   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 n: s2 o6 a; o0 l, _) S  v   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% F  L& S  w* L& `7 L! b     r: S5 t7 D1 e/ q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
! Y- T7 p, f- g1 \6 V   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  6 g. W6 `: D; m+ _8 t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
2 b+ O8 k9 ~9 Y% a   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( d6 I$ ?% ?9 l: y$ `( T2 G6 G * a' ]3 P* o! Y7 z# }
   //RESETn,L138_SHK2
* j3 S" M; p( a; v( q" Z, w   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- z2 E5 l0 d. \9 f) X$ n$ g" ]   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
, d$ J3 m0 m% A) U9 H   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 }" P4 h6 k0 \# F

. G8 b* l* K1 M. B* e* ]! s
! ^+ K# r5 X7 ]; n3 [! T  //SPCR Register
7 X% N3 V6 u) Q  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset* ]) V- ~7 W9 F3 t& _- j  N  J  d6 l
  temp = 0x03000000;//(DLB=0)6 ?9 n4 c' P  P9 L+ K$ |
// temp = 0x03008000;//(DLB=1)
4 G! u- K8 ~4 t$ a  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset7 l5 G# G* \* \, K
  temp = readl(IO_ADDRESS(SPCR_ADDR));
- `; F% t9 e. O9 c6 _7 S( R+ ]; }  printk("temp=%x\n",temp);
  m1 \1 G$ V3 c3 ]6 N* _" a3 h 0 ^7 T" n* {* l
   //PCR Register
. L8 f0 @( L6 T( }; S! \6 n* a; L3 `   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  x7 h. L/ @0 _2 n, Q7 B6 k  // temp = 0x00000F0F;0 A$ H9 G0 G, _2 o- i
  temp = 0x00000B0F;
9 w( w2 ?& S: N3 a: {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ! v# M1 M# ~/ |" s9 t1 Y0 Z
  temp = readl(IO_ADDRESS(PCR_ADDR));
  m% A- {. E& e+ C  printk("temp=%x\n",temp);  
" F2 k. g) i# Y5 d2 J   //SRGR Register
' d* O4 O- }& r   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
3 z- c4 f8 K$ U8 I //temp = 0x301F000B;
$ g7 E2 S6 i, z   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 {  N! {. x7 Q) ~4 j7 m1 J  temp = readl(IO_ADDRESS(SRGR_ADDR));
; a8 p5 K0 p$ |, s0 L  printk("temp=%x\n",temp);
/ b' h5 a( ~! R; l* k7 Z6 {9 [   //RCR- r% _1 k. C3 f" X( W; ?6 F+ D
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! z0 m5 k% c  g7 ^; z8 Q+ j& Z
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0+ ?  F4 a5 u. T' L+ C
   temp = 0x00440040;  w/ n# |+ j! ^" ^9 q; I: A
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   2 e0 `8 {3 M5 v: y! R( J0 }
   temp = readl(IO_ADDRESS(RCR_ADDR));# R) b. h- m! f, C* s$ G8 W
   printk("temp=%x\n",temp);3 N# h4 i. I4 q8 B; ~4 W. L
   //XCR
2 y2 B+ g9 O$ r   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  l1 t1 J# c$ u. `2 `  i8 ^   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ I9 ^' L( ^4 g& P0 }" L+ P   temp = 0x00440040;0 D+ B( I/ z" m
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   8 \$ V- @' v% l+ {6 o; @4 R
   temp = readl(IO_ADDRESS(XCR_ADDR));
# Z- v+ O( a. @' s+ O- t! Z, J9 e+ `4 C   printk("temp=%x\n",temp);
# b5 r, ?. _- A* O( Q8 U; f/ T: N  udelay(100);
9 M! K" g5 j) f9 o! ^7 L  //SPCR Register
/ @, c  o# M4 Z3 r  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 S9 z; r9 w/ w) O+ g  temp = 0x03C10001;   //DLB = 0 VS DLB = 1, ^  `9 G9 ?7 G1 h
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled7 z' S( _& w& |
  temp = readl(IO_ADDRESS(SPCR_ADDR));- P0 n# j' N1 f4 R
  printk("temp=%x\n",temp);0 A% n3 M4 `  i5 O& e! k6 D2 Z
  udelay(100);
4 |- w+ E9 V" c! L/ G1 Z9 \$ t
: i1 U7 ?- M1 ]! d+ I/ R2 D) |  //set GPIO direction
  ]3 M* @' d8 r0 Y' `4 O/ _   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 [* r- j- f, ^- a# Z. V   temp = temp | 0x00000100;//EPR----input
" F! }! K% e0 ]   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- f( M# r7 a2 n+ r* |   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 R) e5 \1 f$ P4 g) J' o7 j# z
, ]( `& x# X# ?6 O: F  f* j% s6 `
   return 0;
9 a; _% S3 a  F* w  a}5 z0 ~! W" n/ n( m; s
static void __exit MCBSP_exit(void)
3 G% \: q( C& k9 w1 A{) E! [+ O5 q5 I. d& G2 g! |/ i0 j! u
   printk("mcbsp chrdev exit!\n");+ K) I/ @/ a* z( D+ [; A: v
   cdev_del(mcbsp_cdev);" D* }2 V2 i8 X$ o  J. \
   unregister_chrdev_region(mcbsp_dev,count);9 v+ y: n6 }( q/ Q( U. c$ t
   device_destroy(mcbsp_class,mcbsp_dev);3 {% a6 w7 L4 h
   class_destroy(mcbsp_class);
. e# x+ H2 u' {/ b8 _, S}& L" k( C/ [& A0 V$ P+ T" D
module_init(MCBSP_init);
8 I+ ?  D/ A6 M+ U. F3 f3 Bmodule_exit(MCBSP_exit);
6 C: |8 L; L( i: {8 V0 r, Q* W7 T1 ]  `* H  r$ q- d; a! e/ I% G
MODULE_LICENSE("GPL");
* ?% F7 ~8 k6 S
  f; v9 b5 z0 b$ n) C8 L9 L我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
6 A$ l; V5 @& U* z+ g* ^我的应用层的测试程序如下4 v, Y2 {( z5 e
#include <stdio.h>
) D" c; F, o( ?4 `; k#include <string.h>( a0 Q7 q2 ~2 w1 H8 U' ?
#include <fcntl.h>5 l2 ^. J9 b: ?- L* L
#include <unistd.h>" K( g& R/ v' x' i8 J
#include <signal.h>
2 k/ `- R% j# \& G3 w3 Z#include <pthread.h>       //线程
( u- [0 B: N7 i+ N#include <stdlib.h>
: j8 m  m. }2 l3 ?$ c#include <pcap.h>          //捕获网口数据
( }, B* h, V8 @9 }$ k7 e& c#include <semaphore.h>     //信号
# U, R  v0 k! x#include <sys/types.h>     //消息对列
1 |+ Y! [, j1 U# b' k8 e& u8 u; T$ j' W; O#include <sys/ipc.h>       //消息队列
6 }$ F, n8 y4 c2 d+ C4 k+ f#include <sys/msg.h>       //消息队列. t1 B. }+ G4 {% w6 m0 u( C
#include <sys/select.h>5 f! E1 s# F/ z8 G- b& n
#include <sys/syscall.h>( K* m$ Y0 S. i
#include <sys/stat.h>
  x5 ]$ R* r' G' S- `#include <sys/mman.h>! P0 i9 K) V4 X4 s- m$ w
#define msleep(x) usleep(1000*x)# l+ c7 E/ Y7 g% P

& ?4 ]+ s; [% d( Wint main()
# w& [- S; ?3 U" n{ $ S2 Y7 A& ^5 }! \$ C! c
    //MCBSP,ARM与AMBE2000交互设备
) Y: Z. T4 l. } int fd;# `/ B6 W/ R  s9 R, W4 T
unsigned short data_write = 0x5555;
6 t2 R& _& W0 m( p, ^, g9 O unsigned short data_read = 0x00;! K) t' w: f- T" D& f
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* S$ B) d0 Y! ~8 c
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' v/ v. ^1 V' z& x6 s! u/ c    " k. r) h- l7 ?' x, f
  if(fd < 0)
  p5 ]* U2 T. I& [9 @, I. T- p. t  {- ~! m8 ?. s3 g
     perror("open failed\n");+ @% z0 f7 Z" U$ L5 [
     return -1;
& \/ v- E: h* ~  }
/ ~" B6 p* K  U( m8 y  * S; g5 s+ W/ J1 o. y7 c4 U, q
  while(1)
& s2 N% H6 d7 X! y0 O  {
) ~3 P" t$ H- {8 E, O! x   3 N! L$ `/ I; o: {; b
   //AMBE2000每次读写是24个字为一帧
+ e3 v$ m8 ]+ o  z0 J; ^$ `   //写数据时将数据在底层存储起来,等到中断的时候再发送/ W, L$ G' j1 t$ K
   //AMBE2000输入数据是以0x13EC开头的
4 }0 \2 I3 N1 f& ?( C   write(fd,&data_write,sizeof(unsigned short));
4 Z1 O; ~5 Y& q/ e( K   5 j* T6 G( D% D3 _4 f/ }
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  # e8 x5 J" _5 m" d. m/ J+ @
   read(fd,&data_read,sizeof(unsigned short));% P# h' M9 Z, k) d! Q+ j  B( q
   
' u( O/ j, g6 O6 k: D& F; t7 B   if(data_read == 0x13Ec)
) [6 }! B6 p3 F8 ?# F7 `& _   {+ r& c$ X9 a/ _; s# I
   
0 H5 J* I6 u  C2 n    printf("data_read = %x\n",data_read);! l) d- x* h& u7 C' e
   }
& `7 t  `- g7 }3 d   
) F  h3 a: a* }/ s" p$ @* P   msleep(10);
5 [' r0 n, V+ w7 F) C  
! ]& Z2 U+ Q+ r5 h' c$ [; a  /*
5 N8 j. l  @7 A6 F   ioctl(fd,1);   
' D" L3 l: m4 t6 s( q5 B- v sleep(1);
* X& F% C$ p* J/ ^* s ioctl(fd,0);
7 ~! C$ r# M4 p sleep(1);
+ ~8 j4 N- f7 t, {% m* K. D0 Z */ 8 l2 `5 e# Q1 X* C- W2 y+ p- e8 G
  }   
" R/ q1 K2 b& D" R& o4 g) T! f return 0;  \; a- Q6 y  Z9 Q; ?
6 w3 Q! d4 g$ x) s
}+ j5 I# t1 B& X/ q+ e/ G1 l

+ R7 ?6 e% A* a) T5 a4 t6 g多谢各位指教,谢谢! 急
( @6 @* I& X7 j2 j, ?
# o' G7 T5 Z1 j. a; X
7 Q+ G" Z9 ^6 O, y" E
. i; N( ]6 P5 E, z
7 r: T# Y4 T8 V4 }' N' n7 ^
) d) G; g5 e$ |  y1 I' o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 22:38 , Processed in 0.053944 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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