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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * I/ X; I+ F2 J6 B7 ]
/*1 ~9 }; }( k# r  Q% i
* Copyright (C) 2009 Texas Instruments Inc
- s) W) H! N3 e1 @# O7 E  B *
$ Y4 n2 |6 p0 X0 L) Y- `8 p * This program is free software; you can redistribute it and/or modify7 u, Y0 W# }/ @! @! s' F
* it under the terms of the GNU General Public License as published by
1 }( e: R+ W+ M0 w  y * the Free Software Foundation; either version 2 of the License, or
0 N, x/ k, [" {5 z * (at your option)any later version.% G. h9 h: U% N3 r6 @
*9 d" i5 Q7 n% u* L
* This program is distributed in the hope that it will be useful,6 i7 c+ e4 A  ]0 r
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 A  B" [  q, n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 R' ]* n' o- t0 {8 \$ { * GNU General Public License for more details.& c) e1 F+ u+ B: `0 ]' \1 n4 P) N
*
: ?  }1 X6 \: \+ X" ]7 F# ~ * You should have received a copy of the GNU General Public License
# c+ D# c5 z+ E# O * along with this program; if not, write to the Free Software  M% N% c# E# J
* Foundati2 U1 w8 b' s9 {! M
*/
: F8 N: B- v5 n: z; z#include <linux/module.h>
3 x8 M  i2 \9 Q& ?5 M5 P6 @#include <linux/init.h>
8 Z( V& g6 `- h9 P#include <linux/errno.h>
9 A5 [8 I* |/ H) P4 N#include <linux/types.h>
' t/ q9 s7 P/ V2 q( c2 N#include <linux/interrupt.h>) J  {2 g7 T  g
#include <linux/io.h>1 y$ x( Z/ K( E. m, I' X+ j' d; {
#include <linux/sysctl.h>
5 E/ `: i. l  i9 l$ @% M1 h& g9 `3 B* d#include <linux/mm.h>
1 E$ }  U( z, E; Z7 Z#include <linux/delay.h>4 `( [# z5 f# j0 r0 _5 O/ d
#include<linux/kernel.h>" s9 k9 d8 d2 C4 ]1 t1 ~1 [
#include<linux/fs.h>( I0 @7 Y1 y6 R2 V6 j
#include<linux/ioctl.h>
- ]& e: [4 K" g3 L+ r#include<linux/cdev.h>0 u  y8 p8 Z: e
#include<linux/kdev_t.h>
. @& g% R; v1 y3 K# d3 O#include<linux/gpio.h>
. ^, l" u  j+ J3 V& D#include <mach/hardware.h>
' F0 y3 g& n4 ?/ N$ K/ d: K' {#include <mach/irqs.h>2 }* I2 s4 H9 N7 D( k; c- V/ L

0 Y3 {0 P! b3 A" ^#include <asm/mach-types.h>
# l! c. G6 N' q8 |( p6 N4 Q#include <asm/mach/arch.h>
0 q8 R! O5 T/ U  E( f" j#include <mach/da8xx.h>
5 ]* w+ j4 C0 @# Z0 R2 o#define  SYSCFG_BASE   0x01c14000" f4 d$ U  i  B. b
#define  PINMUX1_OFFSET   0x124 ) n/ j! H, R$ @6 e6 q2 l
#define  PINMUX18_OFFSET  0x168 ) y) b& Z7 Q0 d6 F
#define  PINMUX19_OFFSET  0x16c% ~0 n* R: f. y8 I- X) m
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
0 G7 w. V1 k) g# J. {$ d# x+ ?#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: ?  p0 {, c# |' u$ x#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR" D1 b6 H( b1 M$ b6 |  S' [  G
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  d2 C7 `5 G& F/ T* `- r3 I* O  j
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR) _1 [+ R3 y& G( I3 ]  K
                           
: ~  @# {9 ^& o3 H: \#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 a/ t& }& Y( X% ]' w5 Q$ ?7 y, Z' p. H#define DRR_ADDR      0x01D11000  //MCBSP1_DRR) a' n# `9 W6 n" W
//PSC
5 v' ^# o3 E8 p0 p9 j#define  PTCMD_ADDR   0x01E27120  " M5 B% w  Y2 m& n3 R
#define  MDCTL15_ADDR 0x01E27A3C
" B/ ?2 y. u1 D& K#define  PDCTL1_ADDR  0x01E27304
# Q0 P( }3 S; J3 H% L//GPIO8 direction
# u/ ]: B5 x2 |$ T# V#define GPIO8_DIRECT  0x01E260B0
# p* S1 v* [* r6 I/ Y- N#define GPIO8_OUT     0x01E260B43 t3 I+ O! I( f: A6 R
#define GPIO8_IN     0x01E260C0
/ V9 ^6 A- F+ ~2 A& Y# j3 A/ h# e5 M! F& v" ]  q% ^
//#define MCBSP1_RINT    99              & t2 a1 b* Y) L; z6 C( j) y( p
//#define MCBSP1_XINT    100  
- i. ~. O( X0 q2 W8 `static int MCBSP_MAJOR=239;+ C4 k1 s, N# I' H% W& Q
static int MCBSP_MINOR=0;
* ]1 V( M, x( B3 |2 E6 _) lstatic int count =1;
) N( g2 h$ N: d; g! _
- ?, E% f" u# }' w* k( P#define MCBSP_NAME  "MCBSP-device"
+ Y4 O3 e9 o9 o2 t( {; g3 U- P# z6 R
static struct cdev *mcbsp_cdev;
3 O  e# R% Q( o7 _static struct class *mcbsp_class;
2 Z# \0 N; `. cstatic dev_t mcbsp_dev;
* s+ Q8 m; g5 B7 }9 Junsigned int DRR_data;
3 p2 q  z: k6 q& d! A& Eunsigned int DXR_data;
2 p) p) H- \9 O$ A: wstatic int mcbsp_open(struct inode *inode,struct file *file)5 {. K& i$ E! w; N8 t  e6 N+ g
{( v% k2 S  U$ b/ {* ~
   1 p3 b& p# X' f6 e; E: W
   //interrupt enable,initialized
. I  Z- A% E9 R( V" A/ P8 @   unsigned int temp;4 d! y5 x4 O3 L( Q: ]
   //SLEEP_EN(GPIO8[10])---0
, o5 l6 \" }5 i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ U& A3 m# i4 H5 L% b3 r8 s   temp=temp&(~0x00000400);
# Z  H3 I, Y5 v2 B3 z/ S2 E4 R. x9 t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], G* u0 Y# F# K+ v. x
  //RESETn(GPIO8[8])----0----1# }. k( ~' o' m5 d/ s/ ?. L
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  D( Y8 T, l9 p2 a: Z/ X   temp=temp&(~0x00000100);
4 O8 I: c2 s* k5 ~0 ^) i   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 Y- d) ~% V! P3 \8 D   udelay(100);
) l, w, W2 T9 e% D' R; X   temp=temp| 0x00000100;' c7 v' |. x# m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ }4 D; Z3 [, |8 w* S   udelay(100);, K" b! k& U" u
   printk("open success!\n");" u8 B' I9 s9 G8 G+ ?% D. f
   return 0;5 j) n& @# r- `2 c$ x7 e' b
}
  {) S$ |7 H0 r: k* }* ~0 _' ]9 V( I( n# k" M9 B
static int mcbsp_release(struct inode *inode,struct file *file)
( |0 L1 P. ~: U1 q- f{
; [4 B/ l5 ?. ^/ {4 U8 Y   printk("release success!\n");
8 h" D6 l# k( F: }   return 0;
( [8 q4 c' k! q/ f0 S}* T6 h! J1 }5 _! W5 ]& ~0 W" D/ Z3 O

: e- C* K  E9 R  b3 X1 [4 R0 Kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 T' r* c) e. N% Q  g4 _& x& K, @{3 L8 {4 V1 w3 f& n9 G
    copy_from_user(&DXR_data,buf,len);) _; m: F4 p. k
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       3 Q3 ^  P6 [" K' m
    return 0;1 G/ v; Q* h; F- s& i( r* J

9 r5 h; H0 D4 Y( d% Z& }! A) \, D}2 w; I0 Y, s3 H+ W$ j4 i9 f+ m* J

/ e) }7 R" |0 C% o- B! P/ ~) Vstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 O5 ~% b+ ~  |6 W) m* ^" Q{
. Z! {6 B' B* U% _1 E6 E   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; V& K( }1 L+ k$ r/ {/ t% Z# V
   copy_to_user(buf,&DRR_data,len); % D- T) A/ B4 _- @+ @7 @. t& Y
   return 0;" X+ B2 `3 Z4 _9 {1 R* Y+ Z0 T
}
5 J, n) b) M5 n* P
2 p- m* Q' {2 d! k+ r4 j: M2 ]
' z: G3 G7 b1 @static struct  file_operations mcbsp_fops=
4 B5 \6 Y7 I/ S{5 j' l& `; {' S2 ^- k1 m: ]9 J
   .owner=THIS_MODULE,) I# K$ [! z1 L% {) A3 Q) b& u3 m* u
   .open=mcbsp_open,
  G2 }8 T7 U: k1 ?. `   .release=mcbsp_release,
( L, b3 G+ B% Q  [   .write=mcbsp_write,
$ J/ _: b, o4 u, G4 o2 k/ ^, Q   .read=mcbsp_read,
1 M1 T8 h$ g7 R0 Y};' O% j, K7 B9 L! S8 E
static int __init MCBSP_init(void); r- R' `% y; P% p7 B; ^
{
7 o. h7 C+ S- c5 O  |% L   int ret;
. Q8 R* e8 y7 p( y& {   unsigned  int   PINMUX1_REG_old;7 \$ f+ g: T. `! s; w4 \$ _8 D
   unsigned  int   PINMUX18_REG_old;
: f0 [( c+ H4 X) E" W   unsigned  int   PINMUX19_REG_old;8 ]% Q2 ]9 y' u% P6 Q
   unsigned  int   temp;  0 ]( O( M" h, h1 l5 j
   if(MCBSP_MAJOR)- P9 a, S0 @* d  v2 b
   {
: Q, R: T. y  U' j0 @+ T7 V) ^) [      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 y7 k" Z4 Z* p9 h! Q! v$ g      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, O: ?) m7 U; a6 V  c) Q: ?8 Y+ T1 E
   }
' ]! f5 h/ H' o8 J' X' A* \6 a   else" Q- r' t/ g- P. \! i: H
   {8 B9 d, a" `4 U$ y# t4 b$ S6 y
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  h2 J2 v1 ~" Y9 Y
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 e" T. j/ v1 I( E: `   }6 }' |4 R8 ]" S7 Z! s: n
   
2 A) |" t; f% c: c! X1 O" {   if(ret<0)# ]; w8 i$ p, d# X$ G
   {5 O3 J, j; k+ |0 k: [) V1 C$ P  Y8 V
      printk(KERN_ERR "register chrdev fail!");
5 O' v) j# |' s: q( c/ Z  Y9 \      return -1;
/ n, _. a+ I9 G8 [   }/ c$ b- S; C! t
   3 O6 d3 |& ~% x, T- K4 F
   mcbsp_cdev=cdev_alloc();9 s3 ]+ W- h# h4 Y. h# S
   . ~4 }" b2 ?/ C% `# G, ?+ ^: |
   if(mcbsp_cdev!=NULL)! H9 y: z! e  C
   {
6 V7 g, v- e0 V8 T9 _* k      cdev_init(mcbsp_cdev,&mcbsp_fops);* g* J: |8 S& y$ {6 c: ~% B/ ?+ O
      mcbsp_cdev->ops=&mcbsp_fops;4 L8 }* S% p  ^2 w# [7 c
      mcbsp_cdev->owner=THIS_MODULE;
& S: |( L# r" `. H' z      
6 [  k0 D$ Z& r  L- `) R1 b) O      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% v; c/ a' J' b( m! u  k
          printk(KERN_ERR "register cdev fail!");
# B2 e5 B% L! @- M      else+ N' ]. ~( _. k/ X" x
          printk(KERN_ERR "register success!\n");
( w6 G( _4 O8 b3 E0 `5 y' ]; @' g" I   }1 G5 W& h; ^% g7 B0 }9 S' g
   else0 t. G7 k" e# @4 v
   {
! V8 J  m4 Z; m      printk(KERN_ERR "register cdev err!");4 j( k. z2 U' \$ s: @$ w
      return -1;# I: D1 f# U; ^6 p- A' X
   }4 a: J$ [* x! B" i- D: n
   
+ U) g5 R# e+ R0 [' Y) v7 j  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- S9 m8 A/ M  X) l5 V" ~4 g7 W! Y8 A
   if(IS_ERR(mcbsp_class))
0 M/ Q0 h6 b( a/ X/ ^7 R   {0 n. ^2 d  d6 f* ]4 b) U
      printk(KERN_ERR "register class err!");
& O  K# s$ o: n6 L8 \/ P   return -1;
% b" O0 Q8 R, u9 M2 s8 t3 w( g* Z5 H" K. G   }) e% b2 L2 Q9 L+ `( x  k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 j2 ]* l3 {; i0 w. C

6 j( w- b! H7 t3 `( I- }% m- k   //PSC8 G2 [: P1 y' d
   //add Enable MCBSP
! A' T  }* o2 L2 S$ u7 t  `   //test0 W' G3 F5 I) x' g, X! ?1 c
   temp = 0x80000003;$ O+ j. E+ V! W8 R+ r! S
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& {/ {+ N2 ^9 S. k- F! X8 e6 y% \   temp = 0x00000003;2 E! A& c  f% Y# u
   writel(temp, IO_ADDRESS(PTCMD_ADDR));! Q8 {( W8 i2 E, k8 [

/ c5 K: u" q3 y) x# N   temp = 0x001FF201;
7 q) }0 |2 c9 p- ^" d7 x5 x   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: m: q6 \) \4 A   , q& q0 U( @# ]3 Q8 l+ e
   //PINMUX  * `  p0 c+ y, i& b; U/ p2 |
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 f  Y' e. }2 [: F- c) s2 {  o# ~, K2 B   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 u- Y% ]+ O, [2 i6 n
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
3 P6 O9 n* }3 ]  n: l   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* l0 A5 b) J; G( C$ R# K- o$ E   
5 j+ }& v7 l( ^  E! j4 {- H   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 j  f+ k; W4 v0 y% b2 k; m/ i
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  7 M7 A# N$ d1 ~! k
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% c6 p" A$ U7 y2 t9 r* w; m   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 I& ?3 z7 V+ h9 }# t- U
) b! B/ d; X5 t; }; V4 S' T   //RESETn,L138_SHK2# T3 T9 D) N0 u9 s# e# x! u! {
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  5 ?) @6 X/ b4 W( W3 c7 `/ o$ j
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   - |9 ]1 t9 C5 r+ i
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; ]! h& @; ~) ?1 ]
6 u, D' J8 c: X9 t5 j
5 _! h, }( Y. M0 }2 Z1 O  ?0 ?# g$ U% t  //SPCR Register
, |( p/ k0 i# X; X) ]) V  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 s" S" V3 R; e/ Y* E  temp = 0x03000000;//(DLB=0)
' [" u0 `' T- w% ` // temp = 0x03008000;//(DLB=1)& e4 z5 h- i# Z* y# n& O
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; }, W1 _7 a  J; y: b9 H3 |* F, h  temp = readl(IO_ADDRESS(SPCR_ADDR));6 w6 \1 X4 b& v+ a; ]
  printk("temp=%x\n",temp);
- p6 M. e$ n) ]2 d+ V 2 t6 C/ b( X" v) N2 J, I
   //PCR Register
- @& h8 D# O: ~8 v9 y$ v   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ a" `3 ^5 y' I) g% f
  // temp = 0x00000F0F;( ?% m/ g0 q& F- L6 C
  temp = 0x00000B0F;0 y& L9 m/ \- \" B' K
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized % w8 g2 P! I( T  s1 ^# t
  temp = readl(IO_ADDRESS(PCR_ADDR));6 s! r9 L# U% w$ c  I
  printk("temp=%x\n",temp);  
) Z, F) [) ]. V! w$ r: \" W8 u   //SRGR Register
3 o& t0 U, K' v4 ]: E   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. k" }9 o% X/ `7 e* }) Z' P& q- { //temp = 0x301F000B;
8 [9 A1 U5 Z; j: S- x8 ^7 e! T, A; h5 m   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 k$ h: b: p; u1 i7 p" w! L$ F
  temp = readl(IO_ADDRESS(SRGR_ADDR));
- i, F/ l1 s0 U, D% m" y  printk("temp=%x\n",temp);
" Y  R* S5 ]% K+ v/ }   //RCR
2 d2 C4 `* {: A/ R( E, q  M   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 D' p% }& ^1 Y7 W" x0 C
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" J: {% }" s' b& E! R" I9 I  g
   temp = 0x00440040;
# `0 \3 X( Z# J+ u% k% O2 m   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
2 E# `- a# H  _4 @; W, j. a* U   temp = readl(IO_ADDRESS(RCR_ADDR));1 b) Y# c/ C* C3 x0 B
   printk("temp=%x\n",temp);8 n- w; _$ q2 f" O( f
   //XCR1 {: T0 F/ r6 r
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. D6 |, J6 y( H1 e   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 t. H/ ~0 D- z/ X0 {5 b* k2 Y8 J# }
   temp = 0x00440040;, W6 b  Y  O6 y. B2 E% C
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   $ q9 H; i, P: k+ G& d. x
   temp = readl(IO_ADDRESS(XCR_ADDR));$ ^' f5 @. \6 c
   printk("temp=%x\n",temp);
& V6 x$ `, K9 H+ W6 j2 z6 O  udelay(100);
1 W" J* g' \/ n; W: ]  //SPCR Register+ ?( z) c) J# W& |$ \
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 K* [, v. d. C2 m) B4 z( Z6 u  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
2 m9 }  k. n) r, }. s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ B0 H6 a1 c7 m" X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
2 K0 ]4 \3 d2 p/ @, r  printk("temp=%x\n",temp);6 R- W! L6 B% E" g* J, z9 |8 j* A
  udelay(100);
7 u, ^: L2 r% H6 [) Q
6 G1 p1 f# v6 C% R/ e8 R8 _3 u  //set GPIO direction% ]' I. e8 P" D$ @1 n
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 M( n) w5 Z4 a% v
   temp = temp | 0x00000100;//EPR----input
( K5 N- ?$ k0 _! k$ z- r& K9 A   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 k# |. s% R, N$ O' \
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. _- u" g7 c; d& a, N+ y4 E
; m- M( }: u- a) p   return 0;
  L1 q! a" _* V0 y  Y$ b# A+ u}% v3 w8 b% J: D: v6 e! F0 d
static void __exit MCBSP_exit(void)/ N' U" ~" h; n) _& Q9 g
{2 C. j8 Q0 Y4 a" ?/ h, p
   printk("mcbsp chrdev exit!\n");: E1 F9 l4 N. h) V6 X6 W0 m
   cdev_del(mcbsp_cdev);+ w; z7 X- z. b- z4 c
   unregister_chrdev_region(mcbsp_dev,count);
* D9 p4 h1 L5 k   device_destroy(mcbsp_class,mcbsp_dev);
6 m  B! R% b- L9 P( E. J7 X) h   class_destroy(mcbsp_class);
2 N" z; Y! G* G' }}
9 m5 l" c' t% T/ o3 _7 {; Gmodule_init(MCBSP_init);
) W- P4 @; X: C% [' V2 e0 A5 s. w2 Imodule_exit(MCBSP_exit);1 i5 _+ }/ v# Z5 Y+ d% f
! U) e  N- `: ^: R: C& v/ L; ]( \& u
MODULE_LICENSE("GPL");+ y% D, M$ W" F  M4 K
6 d* Z" E' ^, U5 W" p" b# v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, r3 s) Z9 n9 X1 ^' Y# p, d
我的应用层的测试程序如下, t: H" N  J3 Q7 |- w" b+ `& y
#include <stdio.h>
: J; g9 j3 P: k) r) @' N9 Y#include <string.h>/ Q5 f3 ~7 _7 s0 t5 v! ]9 U, ~% c# v
#include <fcntl.h>
1 y# _! f( b9 L: L: w& @2 Y5 [#include <unistd.h>
. d9 ^9 C1 f& Y#include <signal.h>$ ^7 w. V" X  L5 P
#include <pthread.h>       //线程
- A0 b/ l! g; Q1 [#include <stdlib.h>
% U) l* t4 I" |/ L# Q# S! ]  W' V#include <pcap.h>          //捕获网口数据
8 m) ~/ |4 U5 y. O  k. w#include <semaphore.h>     //信号  R# P" W/ l- n3 t
#include <sys/types.h>     //消息对列
& B7 r, M6 X2 J, E- O- i#include <sys/ipc.h>       //消息队列
' m6 m2 F: N6 p9 ]7 ?#include <sys/msg.h>       //消息队列
- A1 L% @; p# r#include <sys/select.h>
* B' G& _1 c' a# U#include <sys/syscall.h>
* W* k, b& ^- r3 S. k#include <sys/stat.h>
6 ^+ ^! Y9 U  {3 E; p* Q2 R#include <sys/mman.h>
9 c1 d5 M" Z% L#define msleep(x) usleep(1000*x)6 U: P5 @0 j0 G4 f

2 }$ v+ u. e( Q) V2 O* `! Uint main()+ N) v2 A1 @1 Z6 t5 I  j# X, c/ z
{ 1 C' A5 j3 _' r  B9 g
    //MCBSP,ARM与AMBE2000交互设备
- X6 I3 g2 Q0 `  E8 s7 W- f int fd;" _* r. {# ~4 C/ w! i% n
unsigned short data_write = 0x5555;7 T; T1 T1 {4 {! Z% q. R
unsigned short data_read = 0x00;
% Z( u2 Q0 D/ B. D8 b  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ T7 V' R- W) d
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 M$ p1 h( p8 Y2 a0 s& x8 n$ b. s
   
. W) r9 w1 L- [; V0 O  if(fd < 0)8 X/ a9 {( ]3 @3 c/ C
  {5 Q+ t% l2 g: p- L! r$ s: ?9 A0 ~
     perror("open failed\n");
0 T' j: o' Q# X     return -1;
# k* x+ X, G+ Z  }7 ?2 c2 c& h( T
  3 k* C0 D+ Y6 t' y8 D' J0 x
  while(1)
. e9 H/ f* J9 i! U3 u1 P* |' B  {/ M1 X0 {8 Y1 x! y2 G+ A
   
7 F7 X5 O" _9 A& I7 ?' f   //AMBE2000每次读写是24个字为一帧
! _3 l1 U! ~. Y# r. y% D   //写数据时将数据在底层存储起来,等到中断的时候再发送
% \9 l4 Q1 o$ s% S" X* h   //AMBE2000输入数据是以0x13EC开头的
; G* ]9 Z( Y/ q# r   write(fd,&data_write,sizeof(unsigned short));' D, I# w% M. m  {9 [5 ~
   
$ d* k1 |4 t" O! y( M" }) R   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  1 m' \9 w- l- k, z8 H5 b& O
   read(fd,&data_read,sizeof(unsigned short));
% ?' G8 r. k  X8 j9 ]0 M" x   
* W% j2 E( v. B; {   if(data_read == 0x13Ec)0 _9 L5 f# C1 n2 ?2 a: B
   {
+ m: Z0 ]) Q( w+ m   
' \) w/ h3 E3 |* I2 j2 v4 c    printf("data_read = %x\n",data_read);
; E5 v1 t' _4 X% y- x4 Y4 I   }
3 h' f7 M  z. A! i   7 \7 h8 N4 M& Y1 U0 W2 ?1 l
   msleep(10);
, j8 L' I& q8 |) u$ i  
$ H+ n! U& S5 m1 d% |9 T1 D  /*
* r3 U4 r/ b4 l* T$ R   ioctl(fd,1);   3 G0 z$ a1 |  M. q
sleep(1);: p6 e! Q) T* p
ioctl(fd,0);
' d7 ?8 {. \6 r- b6 X' m sleep(1);
+ v6 y7 Z' @% U" \ */
. |2 p% h7 `+ G- V1 \; [! O  }   2 \) o: }. D& t8 l8 B$ T
return 0;$ z$ G3 K% l5 \3 {$ k
' L4 e' \3 P, N# o  G6 C
}
0 V/ L3 D3 l2 s3 {$ }4 H& S  I( ^' R6 m  E, I2 ?3 Y8 X5 H
多谢各位指教,谢谢! 急
# S- r3 D2 @' {
  }1 ?& u3 ^1 s& s7 X2 |7 {, E0 c0 J  I7 `: U' N$ W& q1 N9 N+ L
' u" b2 i9 Z4 `: M; E$ E
" w2 X; J3 _# v5 ~
" f2 \: {+ Z8 ]5 u, @+ W# a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 21:22 , Processed in 0.049194 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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