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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. |5 q" u9 d1 {' S/ R% O/*
$ z% h4 V4 v3 c3 n% Y * Copyright (C) 2009 Texas Instruments Inc! C: Y$ U, D# S6 t6 |' p6 W. @. i  {) }
*1 U& G# W- a# U
* This program is free software; you can redistribute it and/or modify2 \$ [7 b2 J8 _/ ^( c  u" L
* it under the terms of the GNU General Public License as published by- d4 Y" B" F+ _! y2 H) Z; x* ~6 k
* the Free Software Foundation; either version 2 of the License, or0 |. q& M, w1 x  b$ h( [
* (at your option)any later version.
- r. Q; ~% j1 W6 E *: V; W8 S6 V5 ?, w
* This program is distributed in the hope that it will be useful,
! C# M( C# }1 G+ H  N * but WITHOUT ANY WARRANTY; without even the implied warranty of/ ~3 P+ v$ k' g) I
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- f- B" t; x/ r9 b$ J * GNU General Public License for more details.9 e2 d. h; v0 g& A
*
7 [$ V8 C% ^9 f3 _: G6 g * You should have received a copy of the GNU General Public License- q9 ~6 {* L& d
* along with this program; if not, write to the Free Software
8 v5 l6 O. U3 Y4 I * Foundati
; g+ x$ Y: P, J; E. i) o5 r*/
3 E1 n2 K! I6 W, L#include <linux/module.h>" F) D" C  n  `0 u) y8 F+ c  O
#include <linux/init.h>: h+ p) Y9 Y( z6 O
#include <linux/errno.h>' i! S, ?2 b- y
#include <linux/types.h>
+ R" y9 q4 N; K+ q" ?) a8 R#include <linux/interrupt.h>0 L9 ]  P' t. b# O2 k4 r6 \
#include <linux/io.h>9 f6 q+ I3 t- `, w" u0 u; m
#include <linux/sysctl.h>5 a% V3 F" k6 c( X" o/ d
#include <linux/mm.h>1 t9 X6 v. g9 s/ j9 e( k
#include <linux/delay.h>8 ]* B) z! x) [* C" L4 ~1 `
#include<linux/kernel.h>
: K+ A# \( B% D+ n#include<linux/fs.h>
3 }5 b( W/ D! T% ^7 j#include<linux/ioctl.h>
6 w( ]; }6 Q2 [#include<linux/cdev.h>% l, }, I3 V1 O
#include<linux/kdev_t.h># q( a5 O0 A6 G+ [+ M! h* l
#include<linux/gpio.h>* q8 m6 q9 I- P" |' I
#include <mach/hardware.h>
4 X8 d- ^; p. p. G7 {2 v0 J4 E#include <mach/irqs.h>
+ ^3 i6 Y' D! K, d& a$ y2 D
4 J( z) {7 r8 O! ^#include <asm/mach-types.h>
8 e$ h0 D- f1 c2 B- M/ o7 r#include <asm/mach/arch.h>
' O8 s8 M- v5 J#include <mach/da8xx.h>6 z8 k7 c; y3 L9 \
#define  SYSCFG_BASE   0x01c14000
; i% O) p* F  p+ X4 W" B% _# F#define  PINMUX1_OFFSET   0x124
1 P* r" b0 h2 N2 |! T+ b& p+ N#define  PINMUX18_OFFSET  0x168
0 m' W5 r0 P* i4 }9 N8 K( I4 Y#define  PINMUX19_OFFSET  0x16c1 O& T2 n0 }1 f% U/ \# `4 I
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR8 F9 c0 v7 i1 j' I% m
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR  c. s" @, _! g2 {, t! D
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR' K7 z  A4 y& s" d  L$ b' P
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ O, {  R" G* z) ?1 X
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR/ ^5 E% y8 l, d  V
                              {7 z, g! g  Z( ~$ x5 K
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
+ s: t2 Y3 f2 _9 X) _. v#define DRR_ADDR      0x01D11000  //MCBSP1_DRR/ B6 ]5 k7 j% a
//PSC6 q; L( f2 p3 A, N' o& p$ i/ Q
#define  PTCMD_ADDR   0x01E27120  
8 H5 a% Q# U! r#define  MDCTL15_ADDR 0x01E27A3C7 A1 X1 k, K0 E$ Q! S* F1 }
#define  PDCTL1_ADDR  0x01E27304
6 h. \! Y* k  y//GPIO8 direction9 O4 T, {1 t6 E7 `
#define GPIO8_DIRECT  0x01E260B0% K6 U/ u8 y: m+ A) k5 f/ P
#define GPIO8_OUT     0x01E260B47 U) h& {9 ?: f0 v' C
#define GPIO8_IN     0x01E260C0) u7 |0 f. v: D+ u

& {1 A, L& X. a& U# F( v+ l//#define MCBSP1_RINT    99              9 X; z7 d; t4 U6 g7 L
//#define MCBSP1_XINT    100  8 G& i  f8 N- Q1 _1 K, H
static int MCBSP_MAJOR=239;
6 j+ J' M7 r# s5 Wstatic int MCBSP_MINOR=0;
2 [+ J( r- t- m# ]4 Bstatic int count =1;, d# e2 R+ K" n4 M9 H

" T( _) g2 M* o#define MCBSP_NAME  "MCBSP-device"
; X& K: I. q. A1 S& C  p1 I6 s* y% y+ c1 T
static struct cdev *mcbsp_cdev;% M) n$ Z+ f$ \; F/ d2 z
static struct class *mcbsp_class;
* T# j$ H1 }# K1 [+ b3 k7 Qstatic dev_t mcbsp_dev;
. {8 X# F* |8 R# [5 t* aunsigned int DRR_data;/ }& v- J% p8 R9 `, w1 G9 @+ a* v+ {
unsigned int DXR_data;
7 u0 S0 e% Q# _7 g4 Astatic int mcbsp_open(struct inode *inode,struct file *file)
8 A0 X4 I, ?5 W& R* A" y# R{3 l6 y9 ?  V: U
     g8 t' I8 G# h5 \  l' A3 d) t
   //interrupt enable,initialized
1 B# X- x. n6 H. z   unsigned int temp;
  S. I. u  K9 \/ l   //SLEEP_EN(GPIO8[10])---0
& Q$ Z2 G* w" H2 H0 p) G# @7 j   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% {0 r4 V3 y  v0 [3 M   temp=temp&(~0x00000400);7 u3 i( Z4 O& p  F0 f# U2 T5 I
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 p6 _1 s9 b' G' A( W( n  //RESETn(GPIO8[8])----0----1+ G6 T. k8 m2 x$ G4 ^0 B. A
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ T6 l) @4 V, C1 e  S0 n# j7 X5 [/ v   temp=temp&(~0x00000100);
+ V8 M) k" [4 X* O0 R# s- I7 p   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- Q5 V/ t: j# L
   udelay(100);
5 f( |: B1 N, F3 r' n% r   temp=temp| 0x00000100;
7 e4 t/ x& K$ l# p+ J; N6 H) }   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% P3 S. \" U, G, z   udelay(100);; Z8 Y4 p/ F3 o2 g% r% l" V0 l
   printk("open success!\n");  D. g' A, M- c6 _' P
   return 0;
) q6 V9 O, H7 L( ~7 s}
+ k5 Z& O- ]5 @- F# }0 u  d6 t: ^; Z8 p% E7 z9 p, L# n" c
static int mcbsp_release(struct inode *inode,struct file *file)
9 {, N& w, P" f$ `% F{3 n9 y, k5 }6 V9 M
   printk("release success!\n");
  ~& G" e! P4 N   return 0;
" Y8 v) }. @; m$ i}/ ^. \( @* Q: p) R( `+ p, @4 K. p- H

4 E+ ^6 l# w7 f- V! _9 @3 Y' Xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. `  |: F2 G; S1 k+ m( y# w8 O/ E{
7 d( d7 B! o. i9 l. o) w    copy_from_user(&DXR_data,buf,len);6 R9 c/ g$ A, N, [% J/ B/ M: Q
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       + k3 T& Y. T; e2 c% b  L9 X
    return 0;
! C7 q) n' H' g/ q3 I6 C0 j 8 _1 z+ P7 m& D" V7 O$ G
}$ c/ u6 A' g# p, m  }

. f2 f1 E. `0 _4 t, Jstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 O, t2 v; }0 k% X9 R
{ , i  ~* J/ N5 r0 Q/ m; @
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 T! {# S  i& J; `& p3 C   copy_to_user(buf,&DRR_data,len);
- O5 c- Y% f- R/ U- d8 K  t   return 0;
* x* \- y+ [$ G- G, N}
8 d' F+ T# J( h4 L2 g: Y8 M" i* {
3 k9 \0 ~  {1 T/ V; a  V1 Y& ^6 }$ \& V
static struct  file_operations mcbsp_fops=
7 E, O6 C4 C% \; }. M{8 a: B, F) u+ w9 i0 V% ?
   .owner=THIS_MODULE,
/ c) o' H  c, u( F% n0 P9 h, f, \   .open=mcbsp_open,% k/ }5 d/ e1 w9 f, F, `; F1 q: B: x
   .release=mcbsp_release,
* A& T3 F* Z2 W& S4 J0 Q   .write=mcbsp_write,) ?: G( r' c' J7 v+ M8 t% b$ L, X
   .read=mcbsp_read,! o: ~) g/ [8 Y6 [
};8 i! k# t! r) I- L" |) X
static int __init MCBSP_init(void)2 N! g% Y7 x. A$ F6 I4 V! K
{
8 g/ R8 M) O5 x   int ret;
+ i9 P7 V* h: z7 e4 N3 c   unsigned  int   PINMUX1_REG_old;! l4 T( K( D5 y
   unsigned  int   PINMUX18_REG_old;
% q1 y$ t9 q. E   unsigned  int   PINMUX19_REG_old;
% F6 B1 [& o* |1 j: }  C% v* F* @   unsigned  int   temp;  
3 b. t2 f# M0 A" ]2 u+ X' M5 o   if(MCBSP_MAJOR)
' L  S4 p5 F& c0 L3 _0 C- R- c   {( U* k4 J5 A& L+ `! f  ]
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* N8 F2 M# X, Z3 S" T7 p0 ~      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 k4 F. z* J+ y, K- d  ]+ R  _) _   }( b8 W1 R! U+ y
   else
; ]# h* c& J, A' _3 d7 }* ^0 ^% |   {* |6 H4 T9 `$ D) k8 r4 F
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 d, Y& w' \2 h5 m" ^      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 V6 {) a' W: K9 w/ Z
   }6 l# l3 [" c& u% ~! g, n
   3 F9 B9 u* L' Q8 A& d5 _
   if(ret<0)5 \9 O0 D2 h  X& _( s, `( P' h
   {/ N. @9 U/ `8 a3 C1 Q- m$ l
      printk(KERN_ERR "register chrdev fail!");
* W/ d! A2 }+ l& z% C- `      return -1;# L, C. C2 z$ f0 h, F
   }
* B4 a- T$ f6 k; S$ h   
% |" Y) k4 L8 z4 x; z6 g   mcbsp_cdev=cdev_alloc();" G6 _& ?8 t3 G' {4 C& Y0 x0 [
   ( F8 N  s7 j) i1 A( a9 }  c' F
   if(mcbsp_cdev!=NULL)
% }. V. q" O9 r" U8 X# c! M   {1 l% b: Y- I* F5 a3 i2 d
      cdev_init(mcbsp_cdev,&mcbsp_fops);# d( k% K# B7 i! m; ^
      mcbsp_cdev->ops=&mcbsp_fops;: i5 O: C6 W% m( t
      mcbsp_cdev->owner=THIS_MODULE;
4 t  E  H& B8 B6 n      
) g% X/ V+ |& l  H      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))- J# @1 l/ [: A% W+ q, ^1 A/ R3 x
          printk(KERN_ERR "register cdev fail!");
) N9 R+ N' C' O1 h; F9 a- E/ Q      else8 \' O6 h/ M# i, e# o/ I
          printk(KERN_ERR "register success!\n");
- o/ T/ C' @& v" T   }
% C& C1 m0 z) c0 g" p   else( V- C+ D$ b9 m' r2 ]
   {
" n' U6 T# r: K      printk(KERN_ERR "register cdev err!");, \7 O0 B* r! s9 \) L* u( n
      return -1;
4 O: Z! l) u$ a' y  y1 o. X/ r' i4 p   }) a1 B4 O+ H' J3 x& X
   
5 c  Q9 e" ~7 z- r: \4 L) j  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
8 d* g5 d2 _& C7 h( B8 d   if(IS_ERR(mcbsp_class))
9 |/ N' t! B" c; O, f! Z, I% Q   {* v% L+ s1 B7 Y, |  n8 V1 ?
      printk(KERN_ERR "register class err!");! B& K* L2 }; U
   return -1;
# a6 K' T/ I$ x4 _   }
# R3 _, \: `2 V. @' z$ m" E3 x   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 c8 L4 ~4 M" G' V. q6 K! ?# Y
6 x2 A! f) x, y% q8 s9 p5 h   //PSC
1 V; O; W% |# r1 P   //add Enable MCBSP0 [% T0 R  |3 o5 K0 \1 P
   //test
0 S1 u! M/ g, P% g   temp = 0x80000003;( B  y6 p) u7 b; q# z( I7 p  d
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( t2 t' I+ H; F% x* D. c   temp = 0x00000003;
- g  p- K% t- h* n. ]- X: b( t   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 W# b% U# @9 K% M/ ^. \  a
7 J0 N5 B" x% A, Y6 J# y   temp = 0x001FF201;. j) j7 h: P2 k! w+ J
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 R3 a, H" }4 l" R# Y* O   2 P3 x  T4 u+ w$ u, A& V- W
   //PINMUX  
! j2 P$ C7 w8 \0 G: Y6 R   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- [4 Z, {  N( `8 B) E( [+ ^  @   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) j- `& G) y, V
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   , G$ ?; h( L8 U7 N# o
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- s& k6 b- w: C8 U& `" T
   5 |4 \$ l8 S/ z6 a+ D
   //SLEEP_EN,EPR,L138_SHK1,L138_RC( o& O. B7 O1 G6 g
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  7 j# K' @, @+ V  r9 S
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
( G& m) j# J& h( ?9 e9 ~   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 U/ Q5 k0 O% i4 Q! Z

2 ]9 M" b5 T2 E4 {8 c, T. |   //RESETn,L138_SHK2
) {& d! J4 X' P) ]; g   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  9 \2 F* T/ `7 d. i4 x0 ?, m- l
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
3 P3 E5 i. V" x4 y: G   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);, Y4 p9 Q/ ]3 J7 L( Q* a+ V  {2 A
( r, w; g) z/ U, }* O" T2 u

" v2 o( M! ]  a0 X0 G  //SPCR Register
! V6 C( b# e7 V; F! i! {1 M- r  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset8 R& y, G( i+ J, `6 h$ L5 B$ W
  temp = 0x03000000;//(DLB=0)2 }1 [( x; r2 Z% S! {9 m
// temp = 0x03008000;//(DLB=1)8 I. B% E/ |: ^  H
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
( w# q' t, h5 a# g  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 Y8 t0 K2 F  }  printk("temp=%x\n",temp);
4 N" l: m/ |% d/ F* ?
, n- h9 V# f1 z$ y   //PCR Register3 K8 G* I' y* o- H$ ]( I
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
8 m+ _. a) [" a7 {+ z/ A; ~6 Z) \  // temp = 0x00000F0F;4 I( n& L* @1 @) x1 W! p
  temp = 0x00000B0F;" R0 R9 V9 M0 U, c% c; \. t. x
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 C6 U( [" o  C& w$ @+ N, e4 T
  temp = readl(IO_ADDRESS(PCR_ADDR));
: ]( p5 d$ c  t  a) s( w& x) A, E  printk("temp=%x\n",temp);  & |' _- S0 N- H. ]3 A; j$ q+ ?: |; G
   //SRGR Register2 A  i+ X* v" q* Z( N) S" e
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==119 w8 H( Q% B+ O# t' W' S
//temp = 0x301F000B;6 P' S% L* Q8 p5 G+ n; k( D% `
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' V- f  v* |- e7 j
  temp = readl(IO_ADDRESS(SRGR_ADDR));! W+ L9 y8 x1 H& x* x
  printk("temp=%x\n",temp);# m5 k; Q- J$ C# m' V) n+ L5 ~
   //RCR% x  G2 \! Z8 _
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 Q, r! g" C: f: v2 D: Z   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, D* b1 h% Y: ^" T/ t
   temp = 0x00440040;
* \. D, k8 k; P& d% N( H" o0 s   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   # {- g  R) t( \: P0 j
   temp = readl(IO_ADDRESS(RCR_ADDR));9 }5 U) |/ p) J. e
   printk("temp=%x\n",temp);% S2 l6 r8 G/ a6 n
   //XCR$ I6 [: p  |0 W7 I8 L$ l: |  n
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* P0 x( F6 f3 y
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; m; h, E; J+ L/ B1 H
   temp = 0x00440040;) U1 p$ S: a# X1 Z, V; p6 h
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
* ^2 a2 n: \/ U, W   temp = readl(IO_ADDRESS(XCR_ADDR));& o- d2 ?% h4 y3 f4 G7 x! M
   printk("temp=%x\n",temp);
9 W* K1 f9 d6 h: y' S- u- e  udelay(100);3 ?6 O  G- I8 h" W
  //SPCR Register1 I) U# V+ m- F: e; z  k
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, n: b/ ]' R6 `7 b; A# `+ j
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" W0 E& C; K3 s! b2 R. h  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ W6 g) ?" y9 c
  temp = readl(IO_ADDRESS(SPCR_ADDR));- t# ?7 u, E' e# r
  printk("temp=%x\n",temp);1 P  x/ e1 p5 @. I0 {  Q( H
  udelay(100);
; _: p* {. I" i( J! A" k% ^# w: i. E5 V
  //set GPIO direction
! v) M  e8 a1 `# m: F# G- J   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 Y+ w3 h# `5 [. P   temp = temp | 0x00000100;//EPR----input9 `2 f8 [6 ?7 n7 A( g7 J7 U3 q
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 K/ K1 u8 E2 P; @$ U   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 p1 J- [+ J7 v" s+ l  A

" K$ p. G1 B5 P" `9 H7 M1 e1 g5 @   return 0;; N$ ~5 {/ n9 }7 ~5 ]$ z
}3 W! V* d; Y7 }, b
static void __exit MCBSP_exit(void)6 R1 Y* H) E8 _
{
1 g9 N4 b8 {' j/ J9 T   printk("mcbsp chrdev exit!\n");6 R0 s+ Z  K2 Y+ N
   cdev_del(mcbsp_cdev);
; d) P& D8 }9 x) a& h2 k- H   unregister_chrdev_region(mcbsp_dev,count);
9 D+ q7 ~6 b' B+ c0 L  U0 Z   device_destroy(mcbsp_class,mcbsp_dev);. u2 ^1 d# n2 K% V* v  h/ a
   class_destroy(mcbsp_class);
& r9 B4 d0 s, V& d$ [0 ]$ D}2 u& N, j5 J5 r+ p; e& k- J/ [: S
module_init(MCBSP_init);
6 E  P. D. |) v- f$ ymodule_exit(MCBSP_exit);- v; D7 x3 v, q, @
$ x3 [% R: i1 @+ L* t
MODULE_LICENSE("GPL");! q5 L. ~) ?: q* Q5 N
& U* M+ C+ w% k+ R1 V+ T' T
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" k* A* I8 B1 Q* _1 t+ p我的应用层的测试程序如下! t+ J3 O' X/ {  @# P# w
#include <stdio.h>' `9 Q( h( q1 @. V/ j& f
#include <string.h>
- N. k7 D3 u' \6 `6 ~! ^#include <fcntl.h>2 f+ @/ d, A: ?0 \; U
#include <unistd.h>
3 `$ Z  ?. u$ s' [2 ^' j& G#include <signal.h>
; s# \, k1 _9 i+ E& ?#include <pthread.h>       //线程0 c" I) O/ ~4 p6 T
#include <stdlib.h>, x$ V" I$ |, n  i0 J4 W+ Q
#include <pcap.h>          //捕获网口数据
( u7 `7 T/ Q/ u0 t% ?#include <semaphore.h>     //信号
8 Y! n, t- E# {# A* ?1 ?#include <sys/types.h>     //消息对列
& x3 x0 z0 v; E7 y#include <sys/ipc.h>       //消息队列
/ k' z. t+ \) \% d8 A#include <sys/msg.h>       //消息队列5 {+ d, d& @# I4 ?
#include <sys/select.h>4 p; _/ ?# i  y0 j
#include <sys/syscall.h>
* v  H) ?) L5 F. g: B3 W( U3 P#include <sys/stat.h>
9 e. B; C  w3 ~2 v- F) e! B#include <sys/mman.h>
% ?& R/ P# H' ?; S) a#define msleep(x) usleep(1000*x)
! `9 y1 V, p  P$ o* }# g' j# m; l
  e/ H' K% }; }0 v0 N3 n+ Qint main()3 f7 X  u5 Z  F
{ 8 E$ d& u3 p2 p4 u  }. s$ M8 l
    //MCBSP,ARM与AMBE2000交互设备
) u6 I* H' a5 S& ` int fd;0 D, V- n  u# R) o' b' d% V8 {; G% @
unsigned short data_write = 0x5555;$ W3 _! W. s; `
unsigned short data_read = 0x00;1 |7 Y$ R5 V9 r$ o( O  D- k# D
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% T( m' T5 e% p* L3 B- S. b
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; c+ h$ g5 G! X" s3 s3 k. f   
6 T& s' E2 X0 D: I6 b; u) p& }2 ]: g  if(fd < 0)$ t; h% C4 o2 c) e
  {; v$ V- s% F5 W8 T; u6 T
     perror("open failed\n");- P- o; }  S7 @1 W
     return -1;
% L& C( ]: J9 r) f, ]* j( A4 p  }
- C; U6 |0 H# N& W6 X  
: _3 h( `, V8 q' E7 ^( s) L8 B4 C  while(1)
& g" n$ F7 v, \( F* ~) n# a  {0 M' c8 v7 t6 Z% U' y, {
   
1 K+ G$ Q' X& x+ G1 z   //AMBE2000每次读写是24个字为一帧( }  |- e  }: `) V7 {$ f
   //写数据时将数据在底层存储起来,等到中断的时候再发送
7 u1 l( }* k2 m2 Q' Z8 r4 C   //AMBE2000输入数据是以0x13EC开头的' i% I2 x# X) o  v2 ?$ y" _* S, S! p+ `) k
   write(fd,&data_write,sizeof(unsigned short));4 v. f: f' u% u, ^. i+ G/ _+ k
   
/ j/ V& B1 ~5 {   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
% w: |& W9 I! f' \3 i. B6 D   read(fd,&data_read,sizeof(unsigned short));
7 {% H) T5 Q4 @9 E6 K- |   7 p3 L2 X% w; |- z: h5 {
   if(data_read == 0x13Ec)7 ~0 [( S. w' s. W& P$ Z2 ]
   {
7 S/ l4 h4 f9 J, H   
* M8 |# s4 K# i. S! i    printf("data_read = %x\n",data_read);; u' L' Z$ c, K$ e
   }7 n7 k: _% I, f2 j% b
     g$ K5 B* C+ d' K9 r5 ?* `
   msleep(10);' [. {. D% o* O; h5 d1 C
  3 D* ~) m2 p' T4 |1 y4 h* c
  /*9 M' b6 I1 c3 M5 s' e
   ioctl(fd,1);   
% ~+ Y5 h1 a6 j8 {0 d9 @& |" { sleep(1);$ S: L8 d/ D# v, L7 }; h' Q9 G% O
ioctl(fd,0);2 s* k3 V( s6 O% n' V
sleep(1);
, C& I% |& a% D */ ! \+ @  f  R% N! k! _1 U! \
  }   " p- o5 e& P, C4 R) K) r1 ]5 J
return 0;' s/ P" E6 r0 o' B: n# j" H# ?
# J; O0 r3 U# V' V" d
}( A6 V9 i. S- {. Y* h8 G
, c% o$ c! k" ~$ M
多谢各位指教,谢谢! 急
; W, u- M6 n' r) W2 F1 M: \
7 G; Z4 h# v( l* H/ o* U1 o4 L& U2 [% I3 y3 h8 H) m

' G& C0 n8 `, L" ^- V
( G7 Q$ O- z- F# f7 H" i/ g: q* B3 Z0 U- h& F1 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 05:06 , Processed in 0.048596 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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