McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: # U( C: y1 ?" c6 d
/*8 s) }( A; j; R1 E8 j/ e. C( U, e8 l
* Copyright (C) 2009 Texas Instruments Inc
" G/ s/ U; Z4 P8 a *
8 T/ |  e7 o: j( u. N* ~ * This program is free software; you can redistribute it and/or modify+ p6 d1 Z9 o$ E* a
* it under the terms of the GNU General Public License as published by3 e+ S" e# P6 Z- ~* @* f
* the Free Software Foundation; either version 2 of the License, or4 t6 o' m; L7 Y1 G! U5 C( i
* (at your option)any later version.
+ O1 m1 ^8 L3 m2 c4 O6 y: V3 M, g *9 Z: X: m" x3 I! v6 I+ C9 C
* This program is distributed in the hope that it will be useful,
7 a$ H8 H7 l5 z/ E * but WITHOUT ANY WARRANTY; without even the implied warranty of0 P. N' q+ m1 E) a  ^/ J
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 Y$ ~! }) Q$ r/ i6 J; O+ R: W" U * GNU General Public License for more details.
# i4 z" n9 y) ?. ]7 @. b *
8 o% J* Q) ~+ j+ V- } * You should have received a copy of the GNU General Public License
# o7 i8 h+ E0 n+ q4 J5 Q * along with this program; if not, write to the Free Software
4 z2 j6 {3 l8 T  j: i1 E' M/ j * Foundati2 R8 j5 X+ D1 u: ?8 o7 i, t0 y$ f
*/
& F" u) F9 ^. C( z) w, W#include <linux/module.h>
) Z; w1 e; t* R  L1 s8 Y#include <linux/init.h>1 u% W/ y. g7 U4 o0 C8 ~4 U8 G, H
#include <linux/errno.h>
1 B1 B$ e3 T" K3 p#include <linux/types.h>
" C* |6 h* j8 }. }, c, Z#include <linux/interrupt.h>
  ]4 n) a- `/ U2 e2 y#include <linux/io.h>" `! S6 s0 N* Y# ?/ h* M2 H$ j
#include <linux/sysctl.h>/ Q$ }% U4 p( f9 M
#include <linux/mm.h>' j7 C" P7 s$ @8 r
#include <linux/delay.h>
  s3 a0 j5 _" k  s% F#include<linux/kernel.h>! v8 H: S3 Q  `5 V9 t' T1 @
#include<linux/fs.h>
9 c9 Y+ l+ p0 I8 e: v% g: q#include<linux/ioctl.h>
! d0 t- G! x2 z% k! a7 f8 c6 `#include<linux/cdev.h>: X* j" @/ F" f9 |$ @
#include<linux/kdev_t.h>8 f6 K( y( R* h% F+ w9 a% n; \9 T6 f
#include<linux/gpio.h>4 Y# ~; C4 x3 C
#include <mach/hardware.h>
& M* H) L/ l8 ^' M& f/ k#include <mach/irqs.h>
( `7 R8 [% D  v/ d5 T( x6 J' X- c& ?+ H6 {( L& X& F$ }
#include <asm/mach-types.h>
$ h" E) N0 c) g$ u; k* R  E#include <asm/mach/arch.h>9 s8 W: O: Y) J( q. K
#include <mach/da8xx.h>( O; ^  q% Y" n5 g. \. r- v! e
#define  SYSCFG_BASE   0x01c14000
8 |8 D$ y6 Z; _3 G  `#define  PINMUX1_OFFSET   0x124   [+ |: e) n8 R& V9 H
#define  PINMUX18_OFFSET  0x168 ( V& @5 n* o% W2 V  i) g+ k
#define  PINMUX19_OFFSET  0x16c0 I# @1 N1 I, @1 s; l
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR& F: M  I7 k: B) a3 I$ ^4 x( g
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
0 R6 t4 H4 P4 u- `8 |  e+ {8 f#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
, m7 ~- G5 g  e) I: e) ~#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; V) K6 C' U: D
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR" c; v2 p  Q/ t- T" `9 I: U' S
                           
9 Z# j3 S: m4 ~) y#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, y2 N% A/ m. J' J5 ?* k- p9 Q' a* D
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# Z  c& ?$ z4 s6 j$ U//PSC  e, X; n! I/ n' A; O) i
#define  PTCMD_ADDR   0x01E27120  ) \% @1 C7 J' U$ M7 {, ~' d
#define  MDCTL15_ADDR 0x01E27A3C5 b. T2 w6 Z) a! K* g, P
#define  PDCTL1_ADDR  0x01E27304
5 t8 A  J  S8 ^4 P4 c+ \$ z0 Q( u//GPIO8 direction
5 F1 e6 U! `1 ]  o#define GPIO8_DIRECT  0x01E260B04 t' ~7 `$ f; C, U7 m
#define GPIO8_OUT     0x01E260B4
7 f- v; N: Q7 ~  R( ^/ X; ?$ U#define GPIO8_IN     0x01E260C0' z) d" ?% l  d8 ~5 E8 B/ z

) Q1 b- Y0 ]; Q9 X6 _//#define MCBSP1_RINT    99              
( l+ P; K1 g5 a- t9 p//#define MCBSP1_XINT    100  
" A; |" c: |: y2 \* zstatic int MCBSP_MAJOR=239;  m8 S9 P- w5 T9 A; ]
static int MCBSP_MINOR=0;
" g1 ~1 o' n' l9 ^static int count =1;( H; J  |* Z" j7 ?
% u, j9 ^7 j) Z* O  h! h7 b2 J
#define MCBSP_NAME  "MCBSP-device"
" M) g" }+ K& X5 ~& V# _- s6 c
' U# P- p+ t4 r3 Q9 M% u7 ostatic struct cdev *mcbsp_cdev;
% [7 }7 q+ K" j; N$ g" o' Ystatic struct class *mcbsp_class;2 J  G5 }: Y. g( M  s( q- D4 B8 {
static dev_t mcbsp_dev;
% ?7 A/ ^& m) C9 Z: c& Q/ @unsigned int DRR_data;
( g$ X; j7 o6 ?4 Z9 Z2 j! Q2 junsigned int DXR_data;
$ p, J5 N  y" J; R: N- d2 fstatic int mcbsp_open(struct inode *inode,struct file *file)
5 g9 Z! d& n5 k- m( T& m{! t" }) n) l: O4 b
   4 q' x4 ]) }; f) z$ S+ I. ?! ]1 ]
   //interrupt enable,initialized
6 B2 D; F- g( @   unsigned int temp;
" P7 ~, O& G, [$ k' M   //SLEEP_EN(GPIO8[10])---0+ ?. X6 s& V( |. i6 e, G
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) s' t1 S$ T* Y! M" b, ?( O0 {   temp=temp&(~0x00000400);" P1 r' F/ b- w$ N' o7 n9 N! W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ N1 }/ g+ a4 }! f  //RESETn(GPIO8[8])----0----1- A2 e; W1 G" t+ k% F* h( s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. J. R6 ?$ j0 U
   temp=temp&(~0x00000100);! d5 d& K8 h" I: p2 L( S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
: A" b7 U$ O. ^6 K- @   udelay(100);
+ R+ q5 ]2 f( ?4 f/ L# m3 y6 `   temp=temp| 0x00000100;1 S; O. z' c- N/ W1 ^- d( z% Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
7 ]5 [0 K& l2 \) T   udelay(100);4 @; t' s% b" L% y% ~2 O
   printk("open success!\n");
2 l7 q1 E$ Z3 ~2 w+ D* @- T. o3 \9 J7 G# u   return 0;+ m! T  w( u0 v2 V. K5 Q) K
}
# i6 K1 i" b( g  i6 l1 f
4 }& \7 t6 p1 w; f% V2 \static int mcbsp_release(struct inode *inode,struct file *file)6 \6 Z" p3 i3 C; o4 E4 k: k1 `" J# _
{/ G  f- h, d: I# M
   printk("release success!\n");
+ s! w" B4 u/ ?1 n& T8 }   return 0;
/ S/ K' k2 l0 X2 K5 a}
" ]4 C/ h& K' q% i8 j" U' `0 Z" d$ q& \: A) Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 p( h6 e- j7 f! g& J{( K& U  w: A  ]' z
    copy_from_user(&DXR_data,buf,len);0 L+ K6 E* n1 A, Z: H' U) `( b
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       6 l- R# q3 E. ~+ ?! P
    return 0;. \8 ^. w3 `; s+ x  {: h
- C4 u$ ~/ [3 j
}
5 H# f$ @# Q) t# C) O2 o  l# ?" O* a
  a9 ]) h. S/ R* v6 ~" z5 v: xstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
# {7 @. J- c% D4 o{ % \* w6 \6 I: ?+ n4 I
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! T9 F; f3 ~5 `
   copy_to_user(buf,&DRR_data,len);
5 F6 A5 Y. d- _   return 0;
4 t2 Z2 G; i5 x5 Q}
: o/ Z8 `% d- _) i8 ^* \
, I4 Z) a8 ?' T. ?! Z6 F
1 M) G* @9 U/ y% y( [/ i6 z9 J/ Sstatic struct  file_operations mcbsp_fops=, q- l! D0 c; w- y9 K* C" L
{
- s$ I2 T( F2 ?   .owner=THIS_MODULE,4 k8 h- U( |! g, p$ H# a4 u; ?
   .open=mcbsp_open,9 E* C1 B6 U( E# H! Y: H
   .release=mcbsp_release,0 S# c) C  a& K5 e
   .write=mcbsp_write,% L, ]( j% y$ x3 a# r# B
   .read=mcbsp_read,$ d" e5 O2 v+ g3 \
};5 U+ |* H8 g* m& y6 j6 ?
static int __init MCBSP_init(void)
4 j# p0 C& B5 k7 I% w, ^{: k1 I3 l8 e& ]9 ^7 M
   int ret;
, h% q5 M& K  z  ~, Z2 H3 j   unsigned  int   PINMUX1_REG_old;/ ?+ \2 y$ J7 }* i  _! U1 B, Z3 e
   unsigned  int   PINMUX18_REG_old;3 }2 ^* \6 f9 ~  y6 n6 u' W8 \
   unsigned  int   PINMUX19_REG_old;0 u  X! C. L+ K3 h
   unsigned  int   temp;  - h4 y3 E( b/ W- Y" o$ d0 l
   if(MCBSP_MAJOR)
$ @% G: N, i! D2 `& m% G" @   {
! i4 U  o& S8 r' K2 ~      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" f( m7 V& \  c. y% `) \      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 ]) ~6 h8 T( v, R4 O   }
# Z$ z7 A0 I! G' P. `3 ?   else: l5 z% e! X( ^' q' N) n% Y
   {
: ]  t% y# A- g" x      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# R+ l) [* @5 p9 c1 R      MCBSP_MAJOR=MAJOR(mcbsp_dev);
* Q% Z/ W8 w& t) G5 Y& z* [. \, I   }
5 U3 J- {. [( ~( K$ H9 W   % n* W; E- U6 H
   if(ret<0)
9 \, ]/ Q, B* Z   {
/ w8 t( H% r( F2 _) X4 r* f      printk(KERN_ERR "register chrdev fail!");
4 Q+ J1 t" l; I      return -1;
, ?& C# ^: @. ~2 e   }
, y  f% C/ t4 e+ P   1 R$ a9 ~  j9 V; F- x3 y4 A
   mcbsp_cdev=cdev_alloc();- d+ g4 K8 Q% |. y/ d6 U
   
$ J3 ~4 w9 O1 x" I1 j+ h# ]- s   if(mcbsp_cdev!=NULL)) e: I# W3 q, g' t4 ^% w
   {
' \2 n# e: \6 T5 V4 V* r+ X      cdev_init(mcbsp_cdev,&mcbsp_fops);9 k2 ^; H1 N8 |# M! h
      mcbsp_cdev->ops=&mcbsp_fops;
  V' B9 C" V, Y2 y& E      mcbsp_cdev->owner=THIS_MODULE;3 B! D, G% r5 G! a4 ^: n
      5 U0 v; H: G2 K+ \& ]; N
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))4 S/ V3 [0 R, d% D2 j) ~) d+ m
          printk(KERN_ERR "register cdev fail!");
; {4 o% E5 V# r, ^  Q      else
+ T) _6 t) Y) q7 v+ V7 b( Y          printk(KERN_ERR "register success!\n");
# Z: S- i% r- U6 J   }# o0 y( W0 v" a: T- q
   else
6 ?8 K) `5 F4 H; c: M   {7 n. m. K! k7 Y% F  I1 Y# `
      printk(KERN_ERR "register cdev err!");- w0 y1 i. X; r9 H7 {" u6 m: ^3 Q
      return -1;* [. h6 p, o  n1 g9 ~2 |& Z& Y
   }5 Z* s9 c: {( B. U0 s' w4 D
   
& @' X$ _; E8 x  ~" C  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
% `* G. m* H+ U0 E5 R7 o$ A; T( K: C' e  ~   if(IS_ERR(mcbsp_class))# |8 y( U7 j9 m) \4 S5 g2 ]
   {% V3 B0 C0 [& L( L
      printk(KERN_ERR "register class err!");/ Z/ H" F& T9 y8 E- o7 |; d1 U2 P
   return -1;2 S+ u- G9 x2 c. y
   }
! W  A% L( }' N( U5 i' m   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);: F/ C0 F4 |2 u+ n: e; c# V: S

. e4 m1 s' R1 x: g; E  i7 z* ~3 F   //PSC
8 r0 X* K, B' \6 V' s   //add Enable MCBSP5 W' K( `" G% B& M) Q$ a
   //test" s; h; A3 X" P& I
   temp = 0x80000003;
& y9 g  G0 P6 n   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 m+ s* _& ~: H0 G8 R+ a$ `9 D   temp = 0x00000003;
& q6 B# I. j9 |6 L3 m   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, c) A& w# a; C, W2 L
1 ^6 W7 k, ]# L' d. J   temp = 0x001FF201;
+ ?6 c1 L) Z; T, }1 h( P   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 y1 S/ f; b6 e) V6 i7 O5 S0 N
   9 O5 v3 Z2 I' s9 v% O% m* k
   //PINMUX  
# c' ]& R0 [/ M+ O2 `2 `1 l7 H' q   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ s' {: m7 D+ o5 P7 X7 q& m) m
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 |  q( M1 h/ p) U
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
$ _- r  @( n8 r2 ]& `& f' H   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( w/ ^8 T4 a, F   
5 N& f! T" m3 U$ M. Z# a   //SLEEP_EN,EPR,L138_SHK1,L138_RC
' e7 o- g9 R: f9 ?; i& |6 a; B   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ; H9 i- v; u7 ~
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   " E2 @3 R; M3 T9 Q
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# O  f+ f4 f& x0 P$ m2 f2 Z/ N% J
; P  X( n0 a$ L' h# ^( z   //RESETn,L138_SHK21 r: e$ |7 }+ l6 i& {+ _
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  1 @$ l/ N5 y, l; A0 }/ _) N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
# S. `+ T# K4 B; x% O4 A   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 W( B7 S& U1 e; u3 [
( L8 Q3 n( `4 b4 u, {8 @. ~0 o
# O: e! J: P  H; J5 A* o7 y  //SPCR Register
! q( l) |6 t/ r# t  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) w( l0 L: c, E6 ?  temp = 0x03000000;//(DLB=0)
+ k" u0 Z/ Z! Y& q; K9 S% Z // temp = 0x03008000;//(DLB=1)' c( l- C* o3 W& @2 C! o
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& Q& P4 w! H& N8 o3 P6 D% B  temp = readl(IO_ADDRESS(SPCR_ADDR));
. l1 f* ^+ b, K+ i  printk("temp=%x\n",temp);; O! l- a: H4 y
( s! t' q- V; k
   //PCR Register" d: W; }' Z' S2 e
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0& B" F6 }" x/ A8 M4 Y
  // temp = 0x00000F0F;! X' |1 L( `, e+ b, [# [
  temp = 0x00000B0F;
- d. w2 e0 I3 S  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' n1 S3 x) ~( B  temp = readl(IO_ADDRESS(PCR_ADDR));7 n& @! y+ ]( S+ H- u7 y" f6 I
  printk("temp=%x\n",temp);  ) ?0 Z" x. {& G0 l" l
   //SRGR Register
4 U8 g( Q' Q* _" v% O9 t9 n# M) g   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 Q# K$ [' z( ^! ]6 i; D* q
//temp = 0x301F000B;8 L2 p! a; V3 {$ I2 E, t$ a
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 W6 C% t! e5 U& b+ u  temp = readl(IO_ADDRESS(SRGR_ADDR));8 a4 @6 o8 g0 \6 K6 S# A* m: A0 J
  printk("temp=%x\n",temp);% c0 D7 H! G) s( \0 I
   //RCR4 n6 K7 a+ p6 @
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: K* H/ V- U$ h% ]& [2 S. y
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 a) C1 _% T$ l
   temp = 0x00440040;7 R3 `" f/ _' s4 `  {
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   9 J# ?. h$ {/ \2 j& b! I
   temp = readl(IO_ADDRESS(RCR_ADDR));
) M: h4 {. Y1 l. v* G5 S   printk("temp=%x\n",temp);
4 S7 G% |% U7 Y# a* N! p) v( N$ a9 T   //XCR
$ P! X  r3 q. a" _8 |! g0 {, r   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 X; V% H' F# ~+ y6 f
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ Q7 p, e- ^0 T0 ]) e) {   temp = 0x00440040;
9 i5 I! B7 N1 @- Y/ ^8 S2 G) O   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
, k4 F, k4 X! _4 Y4 ^   temp = readl(IO_ADDRESS(XCR_ADDR));. _( s. E' W6 G5 U% X: S
   printk("temp=%x\n",temp);
7 M* J9 {+ F) n3 u  udelay(100);
& Q! f: m) G/ S- y. x5 G3 {  //SPCR Register
! \8 P) h3 H" q+ ~+ a' U  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
+ V# n6 p7 B+ B  ?2 @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
7 H- ]9 e0 i& C6 Y. v/ i  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled& I; `& _$ a/ _* a. d6 K# F
  temp = readl(IO_ADDRESS(SPCR_ADDR));. S& |$ c# Y0 I. ~; ~9 d
  printk("temp=%x\n",temp);
( b) ~8 u2 w* d  udelay(100);
- j+ z, F4 @/ k( Y) r
" e9 H- h- E! B; s  //set GPIO direction
& U. m' r& b; k9 q. b   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' s7 h3 \1 c9 ~   temp = temp | 0x00000100;//EPR----input
# Y2 x/ \4 Q6 [   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 ^8 t/ T+ S% O2 L* `   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + r9 K( ]- \; d; c7 P5 }4 r) N

7 O& g6 w# l- }. d8 D6 D7 c   return 0;
7 O7 l, v. b8 J}/ F1 ^7 k4 F( q3 ?
static void __exit MCBSP_exit(void)
( {6 m7 e# [/ _9 K% F4 n{
- v% e) e$ D" m+ \0 s0 J, g3 G, E   printk("mcbsp chrdev exit!\n");
& ~5 Z0 c, k4 t2 s   cdev_del(mcbsp_cdev);; C2 H$ j6 N( `  }9 J
   unregister_chrdev_region(mcbsp_dev,count);
5 M8 I5 N8 o& q" ]1 r6 Q4 b3 K   device_destroy(mcbsp_class,mcbsp_dev);
; @% _( @# \, z9 W1 n. k# e   class_destroy(mcbsp_class);1 R% E7 X  n  f; J/ z8 A4 Q5 s
}- e6 [+ L, t6 I4 p1 g
module_init(MCBSP_init);
# D% u8 n, e  ^) O: ?6 G, ?module_exit(MCBSP_exit);
- T* y# g/ b# _+ t' D6 J, m. _% R! L4 p. ]: P- |2 d: I" c
MODULE_LICENSE("GPL");
% k2 X& `# V: v& ~6 \. E. G
/ q& {6 S: t& ?& G% b5 v; t- p3 O我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ u' e6 L& l. Q8 _! v! ?' `/ P
我的应用层的测试程序如下
, e3 l# D  |6 P3 Q0 j7 f9 O2 l+ l2 b#include <stdio.h>
' |4 C+ K; H% h, s#include <string.h>% \* ^* O/ r6 f  |% m. Q( L( ?
#include <fcntl.h>
) \) {% R0 w/ V" x# _/ x+ X, e8 J' Y6 `#include <unistd.h>* E+ N; G& x6 a7 _8 |
#include <signal.h>- }4 Z6 ?( N6 ^+ _
#include <pthread.h>       //线程/ n" Q/ U& k) }& h: o  y
#include <stdlib.h>& t8 H7 y& x% o+ ?* N1 j+ i0 \
#include <pcap.h>          //捕获网口数据
0 J& V, l, x2 S1 K#include <semaphore.h>     //信号0 f/ ^1 n" `: X8 P. N2 Y8 k
#include <sys/types.h>     //消息对列4 A# t( b* I" _: T, m3 H
#include <sys/ipc.h>       //消息队列
0 q' Q  c% I: E1 p4 g% ?#include <sys/msg.h>       //消息队列7 B1 K8 `5 e/ S
#include <sys/select.h>! h% L4 V; n6 }4 v* c
#include <sys/syscall.h>
1 n/ j3 ~$ i. A+ F" S2 P1 P#include <sys/stat.h>1 G8 U/ \( M% m$ H9 f; x% ^
#include <sys/mman.h>
! s8 w5 e; L6 C. x#define msleep(x) usleep(1000*x)4 W4 |/ r% b3 y+ N
/ X( c0 R# W- x! Q' O8 S) j
int main()
8 \! Z/ D: z. V4 v( q: Y{
) H; P4 P* ]$ t* L    //MCBSP,ARM与AMBE2000交互设备+ g  e7 L$ D7 r+ L
int fd;
. [5 D, }2 }; g! l, u4 L0 D& g5 m( X unsigned short data_write = 0x5555;
( `% e, r6 R) M5 Z" p unsigned short data_read = 0x00;' q6 B* a" c( W, s
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, c* m2 Y) {  N1 q7 y$ G  w
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& E5 Q! ^4 g, R% L! J    6 P5 J9 B9 M' O0 N7 d* {
  if(fd < 0)  ?3 f/ C( _/ N6 ?% k
  {6 D8 N8 A3 @/ w3 M5 Z8 G
     perror("open failed\n");6 U, K& r  ~& E7 c) y9 V
     return -1;
' j" l3 v) z% ]0 Q. u- s- p& I4 m7 j  }9 V$ t! F( m( |* y( {  k) L
  
6 G$ I( r+ J/ c8 p3 }# I/ @* _  while(1)  j, Y# F, Q9 v4 Q6 }% k
  {( F. V7 j  L9 P- d* j
   6 V4 p% }- [, c/ o/ b2 X6 [
   //AMBE2000每次读写是24个字为一帧
+ L- N  N1 z  M; x' O6 B2 Y: b. N   //写数据时将数据在底层存储起来,等到中断的时候再发送
. u8 a5 b0 X* p- m+ U+ |, \. J" v   //AMBE2000输入数据是以0x13EC开头的
+ `, G1 M# }, W, E   write(fd,&data_write,sizeof(unsigned short));- q  a6 ?. W$ t. y- d
   
3 [. j# \) C$ j# T4 X7 U' D0 O7 l4 ]   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( s/ z- t& j5 w' Q# K& w9 S
   read(fd,&data_read,sizeof(unsigned short));7 E2 o! ]& H5 P& g1 P1 o( w5 J- J
   
: [/ t% C% @9 L( D; f* }   if(data_read == 0x13Ec)) O9 i( j, T6 X  t: \. G  Z# T5 q% p
   {
. ~, G, l' G1 `. L9 J   
: }, h+ F; v( O0 S    printf("data_read = %x\n",data_read);/ M( U- @& T+ k, ^" g
   }6 B& o9 H$ w) v- T
   
- `' F8 |) _# l% v5 Z   msleep(10);
' T2 {  V2 X  |; H2 M  & {6 D9 S& @0 I# L, Y5 e
  /*5 {  I4 f. d; [3 O
   ioctl(fd,1);   
1 E2 r7 e3 h6 K9 @ sleep(1);6 e% d2 W$ P; g7 `7 P
ioctl(fd,0);
3 I* o( ^2 X  B5 b  o sleep(1);! B' E5 @5 b+ v, _. n- v
*/
: ?9 }/ C% W* i, |( u  }   ( g( R1 r. _$ u& [+ g
return 0;2 S6 @( G+ F- A  }" ~
* v) A8 B6 ]' C8 X1 t3 V, ?
}# n" g# q1 s* \" v

3 a2 n" j  a3 `: X多谢各位指教,谢谢! 急
2 r- d) N8 ~  F/ i! a7 G
* a! \4 O* P) a# _7 R3 Q( [3 z
+ X5 h$ o6 h" L" r
% P+ h) n4 R$ V7 T% z& S6 J  [  I" ]# u/ k# j7 T. q( b" |
+ \, R0 a1 a- h0 o+ s5 u9 U. F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 18:55 , Processed in 0.043055 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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