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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! R. t8 G  g4 s
/*
; _% H- S. k& |% c* K8 J * Copyright (C) 2009 Texas Instruments Inc- Q( k6 a1 Z9 a) [2 i  Y3 E+ z" a9 T
*7 j" r+ K# ~7 E6 f7 V) r; _
* This program is free software; you can redistribute it and/or modify
  [  E* A' X; Y" M * it under the terms of the GNU General Public License as published by
1 I$ z, p- I" d3 Y& J, f6 V* Q9 t- m * the Free Software Foundation; either version 2 of the License, or
* i: @7 e$ C7 ^, U * (at your option)any later version., O: X: c1 ?9 Q# N" n3 Q
*4 I; ]# K, |" u2 w
* This program is distributed in the hope that it will be useful,
+ x' p) j6 F! g7 T' Q! d$ b% o * but WITHOUT ANY WARRANTY; without even the implied warranty of, P" i2 g: `% D5 g; o
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ X. @; ^% V( t) K/ T
* GNU General Public License for more details.
4 d$ t- Y: S/ G- t2 T/ \7 p0 x *# h2 F6 C2 O' ~0 ^8 ^3 L" ^
* You should have received a copy of the GNU General Public License
  n2 d0 p/ H* o# m6 r% O * along with this program; if not, write to the Free Software
. l1 a& V+ D1 q/ |! p7 C5 A * Foundati
* \$ F, t+ V- r& o& \& B- x- Q*/
0 L( w/ V- ]9 p  M4 L#include <linux/module.h>1 N- R) g3 g" E* G. p
#include <linux/init.h>7 u8 u* E+ p( c, R* f' r) @5 a* d3 |% Z
#include <linux/errno.h>! e& ]( B+ [( F% q/ A( g
#include <linux/types.h>0 m5 M* O" z7 l1 o
#include <linux/interrupt.h>( [; i/ i- F) ^3 x' B
#include <linux/io.h>
4 f% \3 F0 q  m+ j( i#include <linux/sysctl.h>3 f- T) B: S3 o: o' L1 D
#include <linux/mm.h>: {+ i# l3 T# v- Z- o- J& K! |
#include <linux/delay.h>
8 z8 f& ]" ]3 [$ D& y" b: [& L#include<linux/kernel.h>
( w4 w# c; W) E5 b9 Y#include<linux/fs.h>2 l4 S9 @" L; J0 K9 [" |& {
#include<linux/ioctl.h>
3 Q! [6 ~# h) a( c#include<linux/cdev.h>. I- k' z2 r* g5 v; B& d, }
#include<linux/kdev_t.h>$ D/ m1 P/ M7 |+ x3 U! _
#include<linux/gpio.h>& S+ s1 h1 B" a, S1 z2 w
#include <mach/hardware.h>0 M& R" b( x0 M  B9 e
#include <mach/irqs.h>9 Q; Z) t# E, J) z: a! [1 V

0 z1 S8 }% j/ p) W$ c1 S#include <asm/mach-types.h>
, J. {% h- @/ b2 \#include <asm/mach/arch.h>( q, \4 g. W; `4 P4 D
#include <mach/da8xx.h>
' j1 m3 A+ T7 p0 I& M#define  SYSCFG_BASE   0x01c14000  v) b7 g/ M/ z: m5 S% z! K, @# T
#define  PINMUX1_OFFSET   0x124
3 t( Y! B$ R' b; ~2 E#define  PINMUX18_OFFSET  0x168 , S6 P, a8 J9 S( a) U3 K9 W4 ^% a
#define  PINMUX19_OFFSET  0x16c. M+ n5 m3 N" V9 H+ |7 [
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
" }. s1 [2 B1 k8 Z  ~' F#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
! R6 z) m) \, S$ p& [, H: E#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
! U$ W! M3 [3 g. E, d6 K. q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% a; D* ~3 D$ I2 ~#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR# D9 O- E$ b; ?5 k# ]& K4 W
                            ; P; K7 j. |, q8 J# S9 m: M
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 o5 d; C2 }- s. x$ x2 [* S. \  F#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 ~+ v$ p2 R' Z9 k) n; Q% Z6 v
//PSC! X$ P: I# ]" R5 t$ Q
#define  PTCMD_ADDR   0x01E27120  . t8 q5 T6 a) c, J6 {  ^1 t
#define  MDCTL15_ADDR 0x01E27A3C
% A" @% r# [* e. q; c9 ~4 ^0 T#define  PDCTL1_ADDR  0x01E27304
  P; |+ F' w% S3 p% G# M//GPIO8 direction
1 F4 l2 J9 X' f1 x+ D#define GPIO8_DIRECT  0x01E260B0
' q0 s+ v+ z5 {5 t: n' Z7 l3 Z#define GPIO8_OUT     0x01E260B4; y6 `8 p8 P8 D9 v' {/ T# j
#define GPIO8_IN     0x01E260C0
5 V7 S/ }" `/ B% I2 r! H* p+ U5 W: V# \2 N
//#define MCBSP1_RINT    99              
# y" D6 f9 l/ G& c//#define MCBSP1_XINT    100  
3 \, y2 N4 J7 }static int MCBSP_MAJOR=239;8 O1 U6 z( B& z2 d$ f) f3 r
static int MCBSP_MINOR=0;
2 n. H/ S2 S- p) Ystatic int count =1;  J$ i- h9 n5 k% b6 M

. M  E3 _0 ^  n# E2 R) M; }& S/ B* a#define MCBSP_NAME  "MCBSP-device"( x: W+ ~; n0 V0 l
' S4 w% A% G7 M9 y* x$ E
static struct cdev *mcbsp_cdev;
8 v' n, ]- u5 d' Ystatic struct class *mcbsp_class;
+ y3 H) s. k: Wstatic dev_t mcbsp_dev;
' c3 c/ K1 E: L. P9 vunsigned int DRR_data;
* L9 ]+ P+ d# p. R. D' {unsigned int DXR_data;# h- _" Y% }4 K/ S+ k8 [( S
static int mcbsp_open(struct inode *inode,struct file *file)
1 T$ N7 L( W5 t: w. ~. L( H8 o' g{8 t$ _" v2 g7 g
   4 L+ Q5 ]& E$ {
   //interrupt enable,initialized1 Z, H4 ^* D+ T- ^3 E
   unsigned int temp;
3 J* w8 d' `+ z4 ]. J# }% F* H   //SLEEP_EN(GPIO8[10])---0
4 `4 n) O3 @- V8 R2 _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 f- V/ P' h8 q9 Y& K& y. `
   temp=temp&(~0x00000400);
' K  ?/ o" e0 x  W   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' J$ I/ s0 _* t6 H' j  Z( \# j( G# c
  //RESETn(GPIO8[8])----0----1' J# c- [, O& q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 N  g% V/ T5 k) D
   temp=temp&(~0x00000100);; E2 a5 A/ D# y$ A
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) G  \" J7 x4 z- i3 C
   udelay(100);. y0 q) ^, J, H: d  {
   temp=temp| 0x00000100;( L. J: m& f! |" U: Q  t6 a( v3 I6 T$ R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& A$ O+ W' |6 e7 S! E) p% U) r
   udelay(100);
: T+ l$ Y. x# I$ j   printk("open success!\n");
5 v' B8 ?8 _6 i' Z' S   return 0;
1 Y6 [; A2 k7 ~2 l7 S8 Z! u}' @! r9 u- c. y. `. z. k. n4 i% q4 b

9 J8 v% W/ E( Z% H+ x& ^' u0 hstatic int mcbsp_release(struct inode *inode,struct file *file)* `5 ], T0 W* y0 M* C! j
{8 i- V' W: n9 j9 e0 u# N
   printk("release success!\n");
$ w: f* F- E/ A( r+ G  P( M0 ?. D3 j   return 0;2 P: c+ K: X; W) z0 m) v- Z* f2 ]
}) ]/ a, x; F! L2 v# R
' O1 H9 G/ c% U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 ~, v2 U& V( ^1 [{  o2 s& q# ^+ g% q# \2 z0 w
    copy_from_user(&DXR_data,buf,len);
% }' g) y( `) E9 ~1 H5 W    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));         `) O  J( l0 |; O5 o6 D" ~
    return 0;  v! W: H8 u8 B9 P" ^- c* R0 Y
2 o+ v3 b/ `4 k& J) f0 }' l
}4 X2 b0 z6 s, e5 A7 G; T% R
- W4 P1 M0 v; u3 s( ^' w6 z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)  B) {# x0 I' v7 b' D
{
2 Q. n; E$ N4 d9 G; s6 w  n1 W6 Q0 W   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ |* b3 C7 V2 l& ?- o1 C
   copy_to_user(buf,&DRR_data,len); # E( o  o6 ]" h& K4 p
   return 0;
# f% G4 b* n) H. U4 P6 L% N( i}- _; X" n# c4 O7 u: u" D

+ m" o$ D! t' R0 m/ D4 H$ n* q
0 d6 ], ]. t$ I' Y9 fstatic struct  file_operations mcbsp_fops=
7 \9 M2 `4 N5 @, N. H{
  e0 y8 p$ R7 C* ?9 a6 v1 T3 @' j! }   .owner=THIS_MODULE,& i5 C# b. w0 q1 K8 Z: u5 S& b
   .open=mcbsp_open,
. b- C* |6 x: t, c2 y; F   .release=mcbsp_release,3 N7 u2 B5 @+ C0 w' U
   .write=mcbsp_write,
6 z/ j& T/ M* J. x  m. H; l$ L8 e   .read=mcbsp_read,
2 Q' o+ n8 n% G) @6 v) f};
- g$ e$ c- X6 u# T5 Dstatic int __init MCBSP_init(void)
. J; G) e  c, t1 |{
" M$ f( r8 j' C   int ret;' F2 ~! D5 \1 r  F) K  X
   unsigned  int   PINMUX1_REG_old;3 U3 Z3 U5 f9 ^  N; W$ r9 `% B; k
   unsigned  int   PINMUX18_REG_old;0 {- a1 B: S( Z! \
   unsigned  int   PINMUX19_REG_old;% d- L& `5 X  s" U! A
   unsigned  int   temp;  " z6 d# U5 i. }
   if(MCBSP_MAJOR)
; n: M) o# i* {   {  K6 \2 b# C' c5 k) ]
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' q/ e& w; Q! ^# o5 _
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& n) _' F3 N9 @8 d1 x3 o3 K
   }$ t; _+ z* K! @
   else
5 Y6 k: u5 M% U8 n+ ?) K   {
  P0 A7 x. c5 d1 X/ a3 Q' Q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 J/ J$ n0 k- T: ~5 U& i, j# Q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
3 z( w& a" Y1 M( f7 ~( o   }
) a2 Z5 _5 f" A     |. X0 s6 f" J- Q4 D  b7 Z2 z
   if(ret<0)8 ]6 o$ H4 w; i8 {
   {/ ^7 `. H& I7 X  J, @& o8 ^) y
      printk(KERN_ERR "register chrdev fail!");
9 ^# ^9 ^  a% r      return -1;  @' R  k! G" b, g
   }' O' ]9 B% `% l4 ~( k  l- i
   . Q% i' P( s) L" R1 K4 h! n/ f$ J2 C/ W
   mcbsp_cdev=cdev_alloc();: {: C, R4 C1 T5 h
     K; K7 K- m9 m- z3 k' S$ u
   if(mcbsp_cdev!=NULL)
1 U2 c* _# Z8 k  \$ y   {! w/ F8 t# Z0 u/ }: ^3 C
      cdev_init(mcbsp_cdev,&mcbsp_fops);$ n4 h8 v" E' J+ A
      mcbsp_cdev->ops=&mcbsp_fops;
. U  L9 F; I7 ]: b. b- u2 A" L      mcbsp_cdev->owner=THIS_MODULE;
% p: M; F7 h: C, x6 U5 \7 G      ' H) f6 r, j9 X* g$ S
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
$ h5 x1 c: u1 _* w: p3 j2 u          printk(KERN_ERR "register cdev fail!");( c" W# R4 O- ?& {8 y6 x) d: l9 w
      else
9 W" F* _5 Y# s9 b( r# z          printk(KERN_ERR "register success!\n");( D: w/ b6 i- l. v: e  L  O6 D
   }6 P; }. K; e) X2 |, v
   else5 q( W* }4 t) ]
   {9 H! E3 e8 k9 V% E& u
      printk(KERN_ERR "register cdev err!");
  z$ C5 t' i+ E) |$ T0 k/ I5 i      return -1;
5 G- y- T0 k: ^/ i0 v) r' v   }
( H: s% s! N! D: o! M2 l6 c   
, k# X- U1 E5 w3 d' b+ p9 u  D  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# l2 B: I, }6 M   if(IS_ERR(mcbsp_class))
/ f/ ^$ f9 l1 d: Z: \   {
. Y% e& T; d% Z9 R      printk(KERN_ERR "register class err!");
3 E0 s1 ^1 _+ d3 L7 K( r: P) _   return -1;: `2 f$ P8 C, V) m; X, v' G9 \
   }
8 G9 r. ?/ u: U9 C8 t. N+ V6 A   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
" y. k+ O  t3 w! A/ x( h( ^. `5 k7 `
   //PSC$ A/ v7 O" q( M
   //add Enable MCBSP
/ ^' l' Y/ E7 ^# Z   //test
  [; R! v$ e% i( k! n/ S+ Q   temp = 0x80000003;
. W# p7 W$ ~4 b6 F+ a   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! B% P  c3 n3 g! Q   temp = 0x00000003;+ C" A8 B3 _8 p, v% s/ t( P) Z1 a# X: {
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 {* s0 o3 E! o; b5 H# t
. U. N8 N5 L) w" V* Y& d   temp = 0x001FF201;
) k- h8 Q; J8 y   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 N- {+ G! o4 Q. B, Q   
# s2 c5 p6 N  `2 b7 f4 @7 t/ d. h8 y   //PINMUX  ' J) q1 n9 l3 a' Z" K
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 }: p2 h5 G6 L$ ]& Q   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  : F1 a9 d4 F# \
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
9 A, `9 K7 c9 @1 e& H   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 I% k+ q0 K. m+ E8 |
   ( A( y, i! E  I4 n9 `& k& q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
5 s8 v0 w& n& J( ], R# h   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 r& @' \0 i7 D6 q5 _. e2 p+ O" E" X
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   5 ]" f9 N# }& j
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' n2 J1 X  c3 P  e. a
6 Q$ w7 O0 i9 w" s" ?& w   //RESETn,L138_SHK24 Y3 V8 G# F  S3 T7 M* F
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . U! d( r- T- z  z4 S$ B
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 g2 M' X% C1 [; @. [1 Z- I0 v   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" C& @, ]7 z* g1 |3 p
/ w5 T2 K- x  r6 n  }; `( I

# `7 J/ i5 I. x7 H5 Z  //SPCR Register
, U% U  F: h3 O3 K- H% [! X  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset' @: [- \# }8 V. T+ R
  temp = 0x03000000;//(DLB=0)
1 g7 C: n6 `# _, Y // temp = 0x03008000;//(DLB=1)
# R2 m$ R7 h5 R! a! y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
# |- k9 t7 u1 ?. d  temp = readl(IO_ADDRESS(SPCR_ADDR));9 R8 o9 P7 g( H% {" O' N5 B
  printk("temp=%x\n",temp);
3 x0 X4 Q7 q! h) r. d& Q+ b
' {3 T* M  v) q' _3 I3 Q   //PCR Register
0 y7 b$ M( ~/ k: l0 k+ h   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 r4 |- s9 A  M0 {  ]* m
  // temp = 0x00000F0F;! i' V9 b$ c; ]
  temp = 0x00000B0F;; ]! C$ G/ o; j* g! Z+ V9 \
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ H5 B- {6 S8 c0 c) M4 j. g
  temp = readl(IO_ADDRESS(PCR_ADDR));
. l% l3 c3 r0 E* t1 N% `" l  printk("temp=%x\n",temp);  
( ~6 p5 Z$ D: {& P   //SRGR Register. m* E: V( e& |
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 Q$ }# U/ I4 z) w6 y
//temp = 0x301F000B;  W, ~% `1 a- z! k' V* V" L
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized : C; p& x& m/ x# S8 [8 q' i6 Z& P
  temp = readl(IO_ADDRESS(SRGR_ADDR));1 D; t: Q0 k6 D9 K
  printk("temp=%x\n",temp);
; e& z7 N0 ]$ D# Q! F% s   //RCR- Y7 q3 W- c" X' d1 X+ g
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# I( }6 f+ \# y" F2 Z2 c
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 h5 @; I; q5 b: F" ?4 ~
   temp = 0x00440040;
% R/ R. l+ F1 k3 p$ M) V/ ]   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
" H' q' r  k- Y+ N& y   temp = readl(IO_ADDRESS(RCR_ADDR));' R) X4 z0 Z$ o" Q
   printk("temp=%x\n",temp);5 @* M3 c1 F7 o: ~) W4 J! J
   //XCR% A! k* b+ v) F5 F9 H
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
1 a1 \7 B2 _0 V' j* O* j* \   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ T+ T2 {8 Q& I* `5 w  B# f   temp = 0x00440040;$ R1 Z/ C& O5 C
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( W4 R$ f! h# i9 O" J   temp = readl(IO_ADDRESS(XCR_ADDR));1 g1 K, X: Z) s6 V; U% V
   printk("temp=%x\n",temp);# j6 z: ^4 Z, E( y; O  {. j1 Y! h% c
  udelay(100);
8 l  f4 G8 n' L" t! M& @8 w& X  //SPCR Register- l5 j; _- L; V) B" j: \$ ^$ m
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! @5 w7 R' }1 s& Q3 @& S* [
  temp = 0x03C10001;   //DLB = 0 VS DLB = 12 m  r1 e! d+ B* r  Y. q4 P
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled, a, w' v6 w2 t, V6 x
  temp = readl(IO_ADDRESS(SPCR_ADDR));% I% A# }6 Q8 Q* X
  printk("temp=%x\n",temp);( p8 m. K! w! o! F  K& e
  udelay(100);2 f8 t. ?; [  F8 O7 ], t- s

8 c: ^$ m5 c8 z/ O0 E- ]4 U  //set GPIO direction- W' T) Z# x4 |  A' P
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- s/ ?+ H, g/ s6 T6 H7 `
   temp = temp | 0x00000100;//EPR----input
* A: F' [' Z; _/ L+ w6 m- ]   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" L  H$ g# q' m, }0 v4 H   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
  W5 ~# R! E* U( x  W% u* |- R
& d: c1 T. i7 H9 O, z  M   return 0;
! J4 ^. P+ Y/ {$ x+ Y  n}
& [. b7 Z  w$ G8 n8 c4 b8 s% Nstatic void __exit MCBSP_exit(void)2 u0 t, V* d0 C
{$ |8 |6 a; I1 m& C# s( c0 ]
   printk("mcbsp chrdev exit!\n");
3 w) o% W! {9 c' B, q   cdev_del(mcbsp_cdev);
9 r! |+ |# \6 D: t0 m3 R   unregister_chrdev_region(mcbsp_dev,count);6 m9 q9 t$ B4 }# A5 F
   device_destroy(mcbsp_class,mcbsp_dev);: N9 n' ~! p2 W8 w. y$ z
   class_destroy(mcbsp_class);- f) C, O) m- ^8 b
}7 [9 t- [3 l& j/ `7 D
module_init(MCBSP_init);
/ r. O& A0 `$ A. e" Nmodule_exit(MCBSP_exit);
: [+ z  |! X  \- Y/ Z
# D; B: a" O- \, J) m7 fMODULE_LICENSE("GPL");
9 a/ ~3 m) \  {# ~; F4 G& o" d% I9 o3 r2 `
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. X6 U7 T/ P5 y. P
我的应用层的测试程序如下
5 d/ T- l3 o( L+ ~, F+ t#include <stdio.h># y8 ~5 Q$ j; i9 B) Y/ \
#include <string.h>
# ^/ ]) o# b/ O* L, ?( M% x#include <fcntl.h>
, I2 y' P0 a% P, H( k#include <unistd.h>
, C4 z, S7 d5 O: z4 W#include <signal.h>1 ^: }) I$ n; t, K
#include <pthread.h>       //线程
2 ~( c0 e9 N# e* ~. w#include <stdlib.h>
+ H5 V: V. ^9 V& n#include <pcap.h>          //捕获网口数据/ g  L7 f% d, e, j7 G" G+ W4 F/ Y
#include <semaphore.h>     //信号
, d  T7 q! j3 v/ L# F: h#include <sys/types.h>     //消息对列
$ K/ A# d$ S2 V2 m; T$ B) f: ]- \4 b; Z#include <sys/ipc.h>       //消息队列
" N# O4 A0 N) t( y5 X( M#include <sys/msg.h>       //消息队列
5 V$ j" L& {5 K7 C7 w: o- W#include <sys/select.h>
. E% w7 {. x) h7 T6 F#include <sys/syscall.h>7 |1 t- N0 J0 J- H: P
#include <sys/stat.h>
' c/ U/ L7 ]; `; [, F#include <sys/mman.h>
+ W# g3 C% b9 g. f0 G( h#define msleep(x) usleep(1000*x)" o& F  M7 ~; S

3 M: {/ n( h, D- y2 Uint main()' X, @; x2 v/ P3 ~
{ ' o- z( ~# {$ z+ _2 s; V4 X1 R
    //MCBSP,ARM与AMBE2000交互设备- E% d- ~; [% l5 i, Z; G
int fd;
4 v; N+ q4 [, q# c" _ unsigned short data_write = 0x5555;
7 g" m3 D0 n. n unsigned short data_read = 0x00;
, k- O- t' Z, r% y4 G) @  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 r5 E! N. B/ A8 l. ] //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);! s( B% s; o0 p2 F
    $ h  E; R" A0 T
  if(fd < 0)/ D+ C5 [7 J( V3 Y0 t$ v
  {
! m5 o. G; d" W7 Q+ _4 b8 m( z     perror("open failed\n");
# E9 s" c0 V6 E/ @  S+ m5 H     return -1;, t. z, s) y7 M; ~
  }* R6 ~1 m. B2 V' f0 j8 W
  & k  f9 g* D+ d; D: V1 W9 f
  while(1)
* ?& U+ @: A; [8 i" ?4 m, ^  {
9 G! w5 n4 B% t% h; p1 w9 K  u   , |/ `# u: i* s: m6 Y' H
   //AMBE2000每次读写是24个字为一帧/ H0 p4 ~. i- S) f1 ^; `' ^
   //写数据时将数据在底层存储起来,等到中断的时候再发送
, L( O0 I8 b5 h& y" {# E& Z   //AMBE2000输入数据是以0x13EC开头的
" h3 q. ?, h) h0 e: U  m( Q   write(fd,&data_write,sizeof(unsigned short));
, y+ ]" x/ N( M   % I: X& `  G, q$ g/ b1 D% A& v
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
( g/ J+ D' A3 r" s6 i. Z   read(fd,&data_read,sizeof(unsigned short));  k  g0 ^3 b: a
   
; h  \' H1 P( `1 L1 |6 Z/ }# B2 n: Y   if(data_read == 0x13Ec)
1 A7 V! b  w1 \7 |$ c. [   {
' Y  X3 h* c. }* n+ A: j. _: k   & Z+ z" P0 m% F) e
    printf("data_read = %x\n",data_read);, s3 t7 m: f$ K9 ?7 ~' p- i
   }
" @8 C& p) P! }  s  _7 N# w   6 V7 J2 T7 `( x3 r
   msleep(10);9 Q6 S3 J+ a9 e, h
  
7 v  c6 g; C% ]- v4 Q* \" s  /*  Y9 ?% e1 C5 f" H
   ioctl(fd,1);   
' Q+ h. w  ~5 c+ v5 w, f5 Z sleep(1);
1 f' F- Z; N1 ~3 k  o( i ioctl(fd,0);0 D2 }- s8 i6 K/ i7 e7 ?
sleep(1);
3 ?; f6 x( F' q: n */   b! l. w& C7 w. q, n
  }   ) k" o' y! V$ b
return 0;8 H2 l# W% I- U, ]+ K( e

/ F( b; ]/ j2 G) o$ L9 [6 d+ X}
% f0 i: Q1 L( z1 c7 H) I( h7 |+ K% a2 p' U+ Z
多谢各位指教,谢谢! 急
, M+ m7 Q, W8 B. l6 z( r/ O) }2 Y( }4 x% y/ y& g

! c" @( d0 f/ x2 g* n  t: S5 C
2 N7 _5 G+ A4 C. |
4 i% G) N2 j( Q8 \; H& h2 V/ }
: k  l2 e- y4 g& v5 G0 X/ Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 19:50 , Processed in 0.047332 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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