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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
1 X% F/ b* F# R+ I$ k4 j/*3 F  s9 m8 J/ c9 n
* Copyright (C) 2009 Texas Instruments Inc
" Q% i; d' c3 a5 z+ C" g+ `- h0 ] *
4 W% X2 n8 Z: } * This program is free software; you can redistribute it and/or modify
$ }3 g+ C! O& o# I. W; l& Y$ b * it under the terms of the GNU General Public License as published by; A: Y% L8 E6 ?$ A7 i" G
* the Free Software Foundation; either version 2 of the License, or
" a9 ~% q9 e% y0 t8 Q * (at your option)any later version.+ V/ I% Q  ^  r9 [! ?
*0 ?8 i$ ^* x8 s
* This program is distributed in the hope that it will be useful,+ n# D/ C: I. H# K1 D3 ~: t
* but WITHOUT ANY WARRANTY; without even the implied warranty of
4 w" J0 ~3 I3 I, ?+ d) a * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 J4 R% Z; ^# Q9 y* R' m
* GNU General Public License for more details.
6 R- m2 Z& R8 i" k2 B5 K *9 K4 o3 k) E0 U, _0 O( J2 d
* You should have received a copy of the GNU General Public License
- S+ B/ d: Y8 g+ r * along with this program; if not, write to the Free Software
# p4 E, ]  t. f- U$ C * Foundati
5 g4 ?! k# B  B6 k3 N*/9 b6 \( A& L, q- p) w. d" ?% T' @, j
#include <linux/module.h>% v* v  ?+ f1 ~- c( M, W6 H' A
#include <linux/init.h>
. J, p  O! ~$ Q) p: {' X#include <linux/errno.h>
; X5 B6 ~& l3 E& }#include <linux/types.h>
$ E2 V! i+ Z8 n8 ?9 K" `% I#include <linux/interrupt.h>( e4 Q0 \$ o  @0 T! m1 {0 E
#include <linux/io.h>5 V  V" ]) S& H5 p! R3 m; v
#include <linux/sysctl.h>. M/ W5 V, {; a
#include <linux/mm.h>: t2 i* A  P; d& f
#include <linux/delay.h>
6 G# A% ?0 q: q! U' A#include<linux/kernel.h>
) B, g2 ?: v4 u+ Y' Y" F9 W- N0 J/ `#include<linux/fs.h>
! O- G- \* _1 U+ p6 k' |- P& I#include<linux/ioctl.h>4 q) H# `+ T7 u$ w6 g( x, \% ?
#include<linux/cdev.h>- X$ O/ ~) ?1 Z# ], e, X
#include<linux/kdev_t.h>0 \, X, @, u* U
#include<linux/gpio.h>& M1 ]' i' q3 u! d& o! ]5 V! W
#include <mach/hardware.h>
; c9 u3 x7 Z/ u#include <mach/irqs.h>
# j5 j" F0 f" `, `" w7 [3 z3 ]' @* v  _* h, b) p/ X4 l. |4 k# [/ E5 L1 O
#include <asm/mach-types.h>
; h% F6 x- k. [" Z5 @$ h3 M#include <asm/mach/arch.h>
' {1 {! c' G& i3 N! u- K#include <mach/da8xx.h>6 K4 Z: X; _  S; e, S9 B3 C% q1 z
#define  SYSCFG_BASE   0x01c14000
1 q$ t% F9 _. D* l#define  PINMUX1_OFFSET   0x124 9 p" k8 Z# w  Z& k' k5 b
#define  PINMUX18_OFFSET  0x168 - Z; M7 T+ \8 ^% d: B, P. _( j
#define  PINMUX19_OFFSET  0x16c3 s' c" Y- P' n/ u! j( d& ~- ^  |, q
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; Q% I# ^3 u; o  \8 [
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
7 I2 p# V- T/ N3 [6 [  w0 E0 G1 U#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' \( B9 ]+ |( l3 q: k1 b3 |+ b) L#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" W( r: |. f" Q' _5 h& M4 T
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
5 }0 F! q/ [& `& A2 o5 B                           
, k0 [2 f9 N" I% g2 J#define DXR_ADDR      0x01D11004  //MCBSP1_DXR- V1 m5 u- i3 K$ i
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# Y. D& [! u, t7 R: d& l) k//PSC
! \7 \3 y, _' P' D3 t#define  PTCMD_ADDR   0x01E27120  
; m; A& @& D# N1 u$ G6 _#define  MDCTL15_ADDR 0x01E27A3C7 u6 }: v0 f4 v5 [
#define  PDCTL1_ADDR  0x01E27304
! y, N6 V- D9 C1 E9 [//GPIO8 direction3 D! r0 p/ r. y7 q1 ]; w
#define GPIO8_DIRECT  0x01E260B0
; E/ W0 R! q9 e' t9 ^3 l$ f#define GPIO8_OUT     0x01E260B4  ]4 _/ m7 g2 i* i
#define GPIO8_IN     0x01E260C0
5 W# X) q& M' h2 G0 [: j8 i: x2 C2 A7 o7 \: o$ Z
//#define MCBSP1_RINT    99              : J7 o6 q  W5 S$ i
//#define MCBSP1_XINT    100  
1 L  q8 {# b+ O% G# N0 }) b1 j2 O  sstatic int MCBSP_MAJOR=239;  a2 a% V' y( A! ^
static int MCBSP_MINOR=0;: f. _+ T, f" }7 U# G' g, C9 A: @
static int count =1;  L- e' E1 x% m6 q( H3 B. L
' @2 `' L/ f* A9 D' W  x
#define MCBSP_NAME  "MCBSP-device"
( q& h5 c/ t5 A5 S9 ~7 G* e# W! k9 n) I1 e& V* m& Y
static struct cdev *mcbsp_cdev;
4 m* F7 h5 g' W# S9 Wstatic struct class *mcbsp_class;) g$ K. P/ e9 ~
static dev_t mcbsp_dev;' M$ O0 T. r* N, i" M, _6 Q
unsigned int DRR_data;
* M3 [! d+ t+ Q- B$ Wunsigned int DXR_data;+ \3 d7 f7 _! \* q+ L
static int mcbsp_open(struct inode *inode,struct file *file)0 ]# ]7 [- p1 a1 `0 w" p4 C/ Q; p
{
) k" ?8 l/ y- O4 o, c' n4 I   
/ n- ?6 q+ S& W4 ]   //interrupt enable,initialized
8 R4 w7 f2 b; q   unsigned int temp;
* s, g6 z7 ?: m% G5 n% m& _* o" l$ @   //SLEEP_EN(GPIO8[10])---0) L% [+ g' _8 @- m1 L8 Q# o, f5 r
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& B$ }% J8 G& C$ T8 m* ~8 j
   temp=temp&(~0x00000400);! s: b( y6 ]! U% e" g, }
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ {# V1 ?+ y3 Z% f
  //RESETn(GPIO8[8])----0----1
, C) a4 y6 D. t8 i0 w3 U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 u, M9 U) d; R; y+ A/ R   temp=temp&(~0x00000100);
+ V6 J% u4 {% V4 l. W- g   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 Y' G# i3 F3 Q- E! {
   udelay(100);
6 Z  F& G  i3 K: B! c   temp=temp| 0x00000100;
0 j8 H6 }, F/ o2 @, V) t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
7 I1 A9 }; P* s' C) ?8 E   udelay(100);
: }6 _+ y4 N# u   printk("open success!\n");
& _1 D+ f% u4 k, [2 f$ C/ }   return 0;' Z8 y- Y' f$ c' G
}
& u% i* m6 a/ u
0 P9 J  L9 J: G2 y% Z- Gstatic int mcbsp_release(struct inode *inode,struct file *file)
" n6 I2 ^( x5 L/ A( N{
( a. F$ k2 j( h( U" l   printk("release success!\n");% w6 o7 W' D% F/ E* a0 e
   return 0;+ R0 e8 n6 ^$ T6 l, }% R6 Q  Y9 k
}' D: S, E4 h6 Y/ ~2 V& b# Q
5 [) {# ~; b4 A: N. q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" J" H4 L6 U* U' L' D& Y' W
{
; `0 h6 I2 ~' w) O1 m    copy_from_user(&DXR_data,buf,len);
- {! k, l# W  @3 q+ C7 R3 h' r; ~/ R    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 z7 ^8 E5 d7 D4 q4 ^: D9 B    return 0;7 w4 x2 V4 }/ y1 u7 U; }- U
. e8 H# _' b- y- N3 J' S3 _
}
0 G& B  ?7 u8 Y6 I
# Z) V) H; Y" n3 i! o+ P2 D/ Z4 \, Rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
+ i/ U1 x7 R% g{
4 }6 ]% f  n6 }# n/ g   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* C5 l) v/ k  r8 M* d9 {! j: K   copy_to_user(buf,&DRR_data,len); ) t6 S& \8 i5 w- \2 b5 G3 w
   return 0;
6 H8 U# g/ R% |( n) f5 K}
7 x' p2 o! D, X" I" S0 l9 h) m4 h7 g4 x
0 z- v8 ^$ {3 z5 u; J9 D% s
static struct  file_operations mcbsp_fops=' i/ o8 e+ c6 [* C  Q2 t( ?" _# H
{( I7 G$ M( Q4 Y  ^4 u5 j2 x
   .owner=THIS_MODULE,
+ f# n0 I) w" q1 d9 r   .open=mcbsp_open,
" [! m$ m( h9 D   .release=mcbsp_release,  y5 B6 c+ p- T2 o8 Q4 d
   .write=mcbsp_write,. C& B5 _: X, k
   .read=mcbsp_read,
" Z+ `' u- v0 N% N4 D};$ m; t+ r/ z* e. Y1 A4 p
static int __init MCBSP_init(void)
; Z0 F- o0 |+ p  t{) x; {2 r9 G5 K8 R$ a" w: q- e) r
   int ret;
5 Q8 L! _: A) [) c   unsigned  int   PINMUX1_REG_old;2 R8 _$ T' ~5 B: J: Z. E
   unsigned  int   PINMUX18_REG_old;
% R' Z9 S% T2 M) R   unsigned  int   PINMUX19_REG_old;8 ?- X; H; W- @1 t- g+ G' Y
   unsigned  int   temp;  
2 |; r( D+ O" W7 U   if(MCBSP_MAJOR)4 G9 a) U& s4 k: J' w7 g
   {
8 F. O5 |+ E5 Q0 A      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. b# @9 X' Q: S6 M+ o
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);9 S9 O8 R7 e, s2 L0 K( U6 @
   }
6 N9 Q- p+ h4 z   else7 \) Q7 Q" g1 g  |5 ^+ n* Y+ N( Q
   {3 A$ c% T+ n+ M
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ L! k& ^( N( R; ~2 H
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# w, H0 o) n& w, A5 N
   }
/ k; z) V- i  ~$ X2 J/ U5 m6 J8 V   ; s9 H. ?: e7 X8 Q
   if(ret<0)
4 I4 x; z0 t& C9 d9 V  }   {
# D0 x$ \: q# y7 W" b6 @$ W0 K      printk(KERN_ERR "register chrdev fail!");
# l5 E1 \3 {6 l$ E; Y: C2 m2 Y1 T, b4 H      return -1;
2 c! A# o" M5 @4 h   }
7 v1 r, C1 j/ c4 s7 ~/ V   ! d* }6 u2 i1 g# g( P
   mcbsp_cdev=cdev_alloc();
  j0 d; |% C+ L3 D% `   " n& u0 C+ {9 B1 ]- ~" s0 t
   if(mcbsp_cdev!=NULL)- ]* R/ d7 c* m$ A+ |  H% O
   {& s; D1 D1 i, F4 a/ i9 @: n
      cdev_init(mcbsp_cdev,&mcbsp_fops);
% l' B1 d" m' S. b) g      mcbsp_cdev->ops=&mcbsp_fops;* J) F, G4 m8 R( p1 K  {$ H4 B
      mcbsp_cdev->owner=THIS_MODULE;% A  J" N1 I- e( I, `, u/ i
      / p9 v6 l3 F5 S* x
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" ?6 D. g" j9 i( X          printk(KERN_ERR "register cdev fail!");0 ~  A' j! X3 d: h( K
      else
: ]7 T# {, d9 z% P6 b; A9 k$ T          printk(KERN_ERR "register success!\n");
: p8 y& s; t7 L/ [   }
/ }9 `+ o# ^* d5 e   else
, w: ?0 |. y: H/ q! S6 h) Q0 f   {
$ |3 J2 r' L2 i4 R6 Q7 |      printk(KERN_ERR "register cdev err!");  k+ T* D# U) f  m2 t
      return -1;1 B4 r7 J/ E8 @& O" g& R& t
   }
9 K; ~& l  D% y8 @. W   
& P" h% c9 I6 W* W4 s  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ L. _4 a+ w4 {9 I* q* q! ?
   if(IS_ERR(mcbsp_class))
1 P! L! X: C* t4 O: ~3 P   {3 P" P+ ]$ ]! ?9 B! A
      printk(KERN_ERR "register class err!");
+ R4 Y0 D% P7 f: O! b3 P   return -1;. ?) ~3 Y, T$ [8 Z8 b5 e' ^* `
   }/ J' A; c6 w. d3 v! w# G3 N, ^4 v
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 C1 O: L- z2 a3 s
! j2 y' X" ^( u, o5 X& B   //PSC
6 C1 n/ |0 c# N' s* K+ j  g: q- G5 R   //add Enable MCBSP; H' M# a) `$ Y
   //test/ A1 W$ o) N. x6 z0 T% U) O) M
   temp = 0x80000003;; w, `! \$ t! u7 D$ S4 }8 ~
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* s- n) S7 Z! Q7 Y  u   temp = 0x00000003;
# X+ C$ `* l( c$ j% o   writel(temp, IO_ADDRESS(PTCMD_ADDR));
' w$ d0 R5 Y7 |" }. w' v
6 w6 ^; W8 b7 I9 F   temp = 0x001FF201;
. W" q$ `( y. |0 W' Y   writel(temp, IO_ADDRESS(PDCTL1_ADDR));' \0 ?" M! E2 P8 ]
   
5 b3 W' M8 c1 t7 ^( D1 u   //PINMUX  
2 A/ a7 C" K7 d7 W   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 [/ W5 R3 [& P9 c$ a4 ?   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
5 \+ l0 k! @* C' S: j8 Y( ]' c" s   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   7 e; z2 u# P% |, p
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) b: G- G- H7 V- x7 Z$ v2 b   3 b  j9 N7 r& d! t! k& u7 v9 j
   //SLEEP_EN,EPR,L138_SHK1,L138_RC; G' L1 j5 B: E# S7 A8 v& h
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
% o* K. h. Q; ]+ e   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
  c, m9 B1 I4 i) F; g   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" g) _3 s+ K6 S' l
0 ]3 I9 _: i! \) G: o% r$ n
   //RESETn,L138_SHK21 d( ~- U" A- K7 \% x7 A, z
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
0 c* x! h& {  C. L, e2 n  e# _+ t   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   / B. `# b' J' Y# v% b+ j% E8 y
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 H8 d3 g2 H$ Z" j- T9 a7 O

. ^4 h4 T  w& d' m9 X% P 4 q) v( Y& k4 g$ K
  //SPCR Register- r2 |" C/ T: T& w5 }
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- F& `9 F9 S) ^3 k6 C  N, N  temp = 0x03000000;//(DLB=0)
# S" Q7 g2 h# I3 F% m% M% ` // temp = 0x03008000;//(DLB=1)- F4 U  f5 i$ |% p2 |* a. n
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset% W" ?, ?: Z1 N5 ^8 G
  temp = readl(IO_ADDRESS(SPCR_ADDR));( Q, m  G: B8 t+ q; W$ T+ z! T, D' W1 E
  printk("temp=%x\n",temp);
& P7 T5 W/ a- ?  |5 S
9 t7 p" a" j7 G# A1 m* I! p) S   //PCR Register4 P% E# K$ N2 a/ {
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-02 ~% v. H1 x9 \  Y( U
  // temp = 0x00000F0F;
. \5 }; H7 Q9 r% D+ S  temp = 0x00000B0F;6 a1 J- R: M5 w3 g# |4 V" N. x% Q" ^
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized : n. a( X# @/ `$ Q! b
  temp = readl(IO_ADDRESS(PCR_ADDR));0 Y; k% k8 Y" X  q
  printk("temp=%x\n",temp);  
$ {+ X, o1 g8 _! R. u   //SRGR Register5 z/ S. O+ y: |) h- _- j$ S
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 X0 P. \8 C4 [
//temp = 0x301F000B;
1 c+ n% M  S9 ?  ?   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 0 R' B/ F) p8 ^7 f
  temp = readl(IO_ADDRESS(SRGR_ADDR));$ o9 X6 P+ x1 o; ]4 E6 b
  printk("temp=%x\n",temp);
/ |: r0 l- c7 p" _   //RCR
7 P+ ?$ Y2 S! L+ A9 T   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 r/ Y; x0 [- L7 v. u2 z# J- J9 F
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; Y% G3 k9 }) E  D   temp = 0x00440040;5 V4 q% K* p6 @/ y3 b
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   , v  M  Q5 I, X
   temp = readl(IO_ADDRESS(RCR_ADDR));
- L% G& L- X' Z& W% l   printk("temp=%x\n",temp);% g0 i' v* q/ k1 C$ I& x
   //XCR
! S' v/ E7 i% @   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 r7 P$ @) Y0 V* g/ Z& @5 Z$ {   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) b; E- b) f0 d5 _, k4 O# `1 ^
   temp = 0x00440040;
: V9 o  h9 O" `6 O7 w   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   3 i! z7 K1 B+ v
   temp = readl(IO_ADDRESS(XCR_ADDR));+ `& v5 v* |$ M+ K. v5 c: G
   printk("temp=%x\n",temp);
" r" i# h# ]( {) x9 d. ]  udelay(100);: L  w$ D2 b: ~9 J% Z
  //SPCR Register3 \; T. d- N6 P5 |# \6 d8 d1 ~+ @
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 D4 F. Z% x; S4 h* o9 A* A  temp = 0x03C10001;   //DLB = 0 VS DLB = 1- B1 ~" Q# a2 s7 L9 \' d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled* b. G. }1 k) _9 g, d. s; ~6 z# Y6 r
  temp = readl(IO_ADDRESS(SPCR_ADDR));& a- F" j. ]* C( l. J6 |
  printk("temp=%x\n",temp);3 R. ^3 x- n% `; h% X9 V
  udelay(100);# j  v6 a, g- R. d2 r( W
6 b: D0 B& m" q' u- H8 a+ w) ~
  //set GPIO direction
  N+ S# B  M: A$ U! w4 E2 m: v   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 ?# I. j  V+ [6 T5 B   temp = temp | 0x00000100;//EPR----input
! @4 I% n5 r& `; L5 P& C+ x   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, ?- z1 D4 D( i9 Z& {9 P4 x) [1 i  ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 \4 L0 g0 B% d4 p
$ V' q) N4 `/ g3 \/ ?& `' Y0 l9 |   return 0;
: _% ?* |/ a! m$ @1 |}5 ]" m0 e  I- h$ @
static void __exit MCBSP_exit(void)5 t4 U* o+ m5 e# v1 r% @5 N
{8 B' ]1 h% U2 Y: m& i. s9 Y. z5 D
   printk("mcbsp chrdev exit!\n");/ o7 g$ q- E6 E) [
   cdev_del(mcbsp_cdev);
/ C/ y' x4 u+ ^4 o   unregister_chrdev_region(mcbsp_dev,count);" A* O/ B6 o' y: f
   device_destroy(mcbsp_class,mcbsp_dev);
- ]; i1 _' F4 w/ ?6 N( Z   class_destroy(mcbsp_class);
4 N2 t# E9 X3 e3 E, [" r' D  d}
4 u" o( N6 I8 H! V# Z# pmodule_init(MCBSP_init);
2 J; A/ {& `, V/ v1 U4 [) q3 h7 rmodule_exit(MCBSP_exit);
$ d- K5 z. f! H# m! \4 Q6 T. h0 L9 Z( @- {# c/ Y! ^8 `9 [# e
MODULE_LICENSE("GPL");
9 o7 [+ ^4 o1 w" n1 l& t! g7 i4 x3 x8 W) L- P2 N* w) O
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 N4 ]1 A3 V1 o2 z2 D我的应用层的测试程序如下
: A0 y/ L2 W& T' U, w/ z, T8 F#include <stdio.h>1 p1 Q  T4 m4 U4 R# X" f
#include <string.h>
3 k- M- D+ J4 S1 |#include <fcntl.h>" U4 k' `: Y+ c- e6 C8 q
#include <unistd.h>
$ |/ K4 I5 z. G0 r# d. E#include <signal.h># a0 U0 T- `4 S
#include <pthread.h>       //线程  J4 w+ w2 }9 K& v( h* s# O9 L
#include <stdlib.h>
3 `+ j( q' ^! k" j0 i#include <pcap.h>          //捕获网口数据
( p% X+ t8 w2 c+ L" F#include <semaphore.h>     //信号1 `# \/ O# k  d# s  m* d
#include <sys/types.h>     //消息对列
' d7 }/ z8 v8 F6 N#include <sys/ipc.h>       //消息队列
3 z, ^( s- ^' x- Y1 q' u#include <sys/msg.h>       //消息队列
$ E  O' e+ }" B5 c7 x/ I#include <sys/select.h>
/ h0 s1 f1 g" O3 B  _#include <sys/syscall.h>3 g* V: ]$ T+ j$ l3 e
#include <sys/stat.h>
' Z$ l$ b- Q, ~. c. k4 H#include <sys/mman.h>
& }% T! M4 {3 F#define msleep(x) usleep(1000*x)
: E; g& f! k& m# `$ Y) p
! m' p5 C$ u! |; t  pint main()& R- n% J2 b; v% a) g* E& h
{ 5 z% a, w2 ~% r5 r' l+ g
    //MCBSP,ARM与AMBE2000交互设备
9 d5 ]  v( G0 ^$ E, v* ] int fd;
9 o. N2 b  R( {5 A unsigned short data_write = 0x5555;8 v! X2 {: ~0 C& F$ T
unsigned short data_read = 0x00;
  G; j2 L1 Q0 N  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ v; |4 d* c- w! J; h
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% }; ~" ^5 p" p* q% a  {   
6 j8 R4 p' \0 W6 H1 Q& J$ d% j9 N7 u  if(fd < 0)
1 g* l7 l+ M0 u0 ?  {
1 G% J/ t% ]" l9 B: q     perror("open failed\n");
# Z' `$ j, k% h8 s1 o     return -1;: K) u% z/ z3 F1 W
  }; \; \+ y/ T8 j* `
  $ L% I+ o% P7 R3 A+ G" Y! J
  while(1)
% M0 {) Y! p1 L  {
& `" p% C( \! Q- i* _  ~7 P7 ?4 E   0 S! J3 _8 ?( X
   //AMBE2000每次读写是24个字为一帧
% u9 E1 }% \1 U  X9 o( d/ a) D( Z   //写数据时将数据在底层存储起来,等到中断的时候再发送
! `* N9 x  F- u- Y/ \; E" Y   //AMBE2000输入数据是以0x13EC开头的$ I2 F! _0 X' O% t: _7 \" _. j
   write(fd,&data_write,sizeof(unsigned short));
0 ]# c  ]' A! l   
. W9 B) M2 J! @: D% x# g   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
% {2 T  v* I6 x) m   read(fd,&data_read,sizeof(unsigned short));3 {  C7 \5 l2 J$ I3 f/ V# Z/ K
   6 T# R8 e4 c$ \( M' V8 d
   if(data_read == 0x13Ec)
& h. e. V2 B: X% j   {' @* B' o& x1 T9 h- H( c5 n) d
   & p. |8 O: f$ Z4 c# ]# y/ ~
    printf("data_read = %x\n",data_read);
  n9 b6 P7 R5 V# W& t   }
, w' q& M2 }3 d: Q; G5 H  W   
& y1 w, j2 B- q   msleep(10);
% o& @* a# b- A6 }6 d  # F' f0 J5 G( {3 a1 h% }1 {
  /*1 b2 E. t7 p8 ?
   ioctl(fd,1);   
& U: J5 E% h8 G- p% i9 { sleep(1);+ L2 R  }8 b1 A' r  {
ioctl(fd,0);
* x- r5 q9 N/ R3 G/ F) N" M; Q sleep(1);  t0 F' y6 `% \
*/
# Y% P# q' e$ |" x$ w  }   0 ~, ?2 V8 F4 h5 l9 ~3 w+ H
return 0;4 J4 s5 K/ B; F6 e0 T. N
- \+ M; I% \( H. i
}
9 k% m; G- C0 Y* H- [4 E' C# h
! ~  B& ~1 Y) H! D* k6 ~+ `多谢各位指教,谢谢! 急  x+ \3 p  J' g7 @/ a

$ z+ Y0 V. Z! Y9 S, O7 k, p" c; X! J- Q( o0 r/ k

" u( j  G2 t% A; e9 u9 H
: `- d; p5 T* N' ?2 C# ?' Y) Q& e; T- {9 i6 |& \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-28 01:50 , Processed in 0.047794 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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