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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
/ B; ?* j3 ]" U& c  m# u, K( P. G/** [3 I( g/ [6 w; S5 k8 p
* Copyright (C) 2009 Texas Instruments Inc
0 l: s* u; x3 l) }& Q* @4 S# n *
- Y# t% W* c0 l& x8 r * This program is free software; you can redistribute it and/or modify
, y5 P3 N3 Z- @2 A: D1 z3 i% m * it under the terms of the GNU General Public License as published by
4 h2 ^) q1 ]+ q0 o * the Free Software Foundation; either version 2 of the License, or
5 X3 f/ i8 e& x- r7 m0 Y: @ * (at your option)any later version.- Q5 E6 }6 e) m# r0 w8 x* ]  y
*" q8 k  I( t7 U: q6 z6 b
* This program is distributed in the hope that it will be useful,4 {8 R1 @! ~% u# d6 U; O
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- o( Y3 ^/ \- X7 O1 B$ \; C * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; {- k- I, t$ h* t% o3 e
* GNU General Public License for more details.
  _/ l3 D$ n6 z' p! G! ~ *
6 `( k& F4 C, V. k: D. u- {3 v * You should have received a copy of the GNU General Public License) ?+ `: f3 f- R; a( ?* z  V9 Z. W
* along with this program; if not, write to the Free Software
/ \" f, V2 O4 [  k * Foundati& }, Q1 d4 a% B8 k$ B1 n
*/
  k6 _0 A; r5 v#include <linux/module.h>
3 T( u% [# @" s4 O#include <linux/init.h>
6 A" F. S. f( l) d  p9 [5 L+ B#include <linux/errno.h>+ E$ L! ~6 N+ H* q; s. s( d& e' w$ x
#include <linux/types.h>
5 j/ s& o- I4 H#include <linux/interrupt.h>5 G1 M8 @; _9 D. \% l' y
#include <linux/io.h>
) G- _3 }0 m. Y+ P#include <linux/sysctl.h>
( }! m* `6 A/ x  h! r, [. x  b#include <linux/mm.h>
: {$ R; q; [0 X. E#include <linux/delay.h>: M) B7 O7 D" o4 [9 H: A* S, P
#include<linux/kernel.h>
8 f7 T0 g9 e; B  s#include<linux/fs.h>
6 t- T: A$ ]' M0 y#include<linux/ioctl.h>* [7 e/ I% B  d& M7 z9 _) g. v0 o
#include<linux/cdev.h>
/ y; H6 R- Y* L+ q/ j#include<linux/kdev_t.h>
( H( F  P( `( ~' `+ F- e5 b#include<linux/gpio.h>( Y9 o+ Z" g  a( i) x1 [! P
#include <mach/hardware.h>
! G& s+ P& m0 {#include <mach/irqs.h>  g8 s, Q5 K+ h& j! L5 F
3 g# `; Y2 {/ D; L( M
#include <asm/mach-types.h>3 W; q, V7 y* O0 J0 o/ U
#include <asm/mach/arch.h>
0 _. J) M$ `( O#include <mach/da8xx.h>
5 g" _1 v  D5 T; M, {7 R; T#define  SYSCFG_BASE   0x01c14000
5 _% u( \7 ]3 h" [% b8 q7 u#define  PINMUX1_OFFSET   0x124 ' o% @0 d& l' u1 X
#define  PINMUX18_OFFSET  0x168
; k5 }, k" P: R, s9 V+ O#define  PINMUX19_OFFSET  0x16c
: ^0 L: b+ M! u& f9 f* a#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) U; l+ k8 q9 r- d# G+ {5 c; b9 r& D# |#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
/ N5 I! Z& _/ ]& X9 G1 X9 Z#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR; U! ]/ Q' c* U) N! x
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
$ K& {: m3 v% Z. D) v. H$ ]. S#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR+ f0 _" H9 _3 R( y0 B
                            5 N8 u5 [) }% I
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 P1 J; X2 K- h% D#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
. I# o+ P+ V( D6 W- i9 A$ Q//PSC
, }9 o) [% \& t0 f#define  PTCMD_ADDR   0x01E27120  
  A- _' h) v) j% I/ w! M#define  MDCTL15_ADDR 0x01E27A3C
  e( v5 T& l7 u( O! Z& p#define  PDCTL1_ADDR  0x01E27304
( B2 Q: y( r7 M6 R8 P//GPIO8 direction  ?$ h( [& F8 P" D7 }
#define GPIO8_DIRECT  0x01E260B0
( G8 d6 r0 U0 q#define GPIO8_OUT     0x01E260B4$ u& V& M- i# D. {
#define GPIO8_IN     0x01E260C04 l. {4 M5 h- j7 ~

& r4 w: y) [3 y! t; o- d* O2 ?//#define MCBSP1_RINT    99              
" W$ O; W+ V  n5 h0 M" V! k//#define MCBSP1_XINT    100  
5 T  z5 v& C1 U! Mstatic int MCBSP_MAJOR=239;# G2 B0 c; Y5 b2 o( b( z, q. x
static int MCBSP_MINOR=0;0 c2 }' [/ ?' F! ?9 k5 B4 T+ |9 a
static int count =1;
3 w/ r: `8 o* [" a3 o$ R& t, J+ Y; y8 l
#define MCBSP_NAME  "MCBSP-device"
, r( u& n) _, M) W2 R: p" a( u/ C2 _
- m# W/ R1 q, `- a- rstatic struct cdev *mcbsp_cdev;
! |( ?9 G/ |6 w' Fstatic struct class *mcbsp_class;; \& X, N; v6 w1 r# Z6 |6 l$ j& C
static dev_t mcbsp_dev;. ~$ q' B( {5 F
unsigned int DRR_data;2 Q$ O5 S" D3 U1 Y; F: f" Y% a
unsigned int DXR_data;
* k( i: M2 h9 o- x% D, Tstatic int mcbsp_open(struct inode *inode,struct file *file)
0 N# Q  m" s9 l( f{
3 L" y1 ~- T9 r* S0 U2 e6 I   
# @" U$ ?6 W, ]0 w  s/ E0 J0 M   //interrupt enable,initialized
, S) s+ p6 [( ?9 U   unsigned int temp;1 X- P& P/ x1 I1 H
   //SLEEP_EN(GPIO8[10])---0, ]2 I- z! m4 m7 h3 F
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 a, R3 L1 Y) ^/ p+ g' R& ^7 ?8 y   temp=temp&(~0x00000400);
6 @' C9 C1 }  V5 w; N+ x/ k+ q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- |7 y. y7 B& a" v5 [
  //RESETn(GPIO8[8])----0----1' W' D: y8 M' }5 H! h# ]: I
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 Y) }9 T1 }2 d1 c; U7 q- h   temp=temp&(~0x00000100);) X, [9 ^6 X7 p, t" k
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 E( T0 H. C' f. x4 A   udelay(100);% X4 `% l- U) u
   temp=temp| 0x00000100;
' N: i# D3 V6 A- C. k, [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% N, F7 i2 L# J$ E6 U& V
   udelay(100);% }4 y4 y/ d5 S6 n. m
   printk("open success!\n");5 d; O" N9 H7 G$ m: [  s- C
   return 0;
+ P; O8 L  z# [' K2 V  A2 u8 e}  h) q! }7 K- r( v
9 M0 f; K! i6 l/ z- L+ i
static int mcbsp_release(struct inode *inode,struct file *file)
3 M) ~, ^7 y! K+ k2 c2 }{
* e6 A0 x. T" y4 N$ r0 C   printk("release success!\n");* g7 d8 v) C6 P% K+ I  C; R6 e
   return 0;
3 g& V1 J1 k; s  G" Q" h3 a: R}* R! J. V) L* A4 Z8 c9 Z

, Y- e3 c7 p6 U: N* |" J7 wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! p9 t3 K* H$ E& a- I{
1 M* d7 [" w; S! P' p" Y8 H    copy_from_user(&DXR_data,buf,len);
1 p$ {3 M  @( C# i" l- i    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ g! h& }$ A; Z9 P- {. V    return 0;
% Q: \7 |* M% v' t/ f $ s5 x8 F( a+ V* ?: ~( \4 c
}
) D" E8 h. `. m) C4 Q8 u3 K) x# \1 ?# |8 @. L; K9 O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), X& E( a1 `8 @; V
{ + _, x! F3 j6 _) f& u- h- y
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; {: [  Z# @8 f$ c   copy_to_user(buf,&DRR_data,len);
, \# o& F( K6 {0 L   return 0;% @3 K, T; ~3 j# c  o
}9 O# f+ a0 n) s" ^
% g* S* U, x9 M7 H( Q8 a- h

5 Y  H1 K; r  Qstatic struct  file_operations mcbsp_fops=+ a) M2 s4 f2 O! B% K/ |
{
/ ~# n+ b( f7 V2 J4 H9 z   .owner=THIS_MODULE,
( ?3 T# D; I- L% u/ A   .open=mcbsp_open,
" I" R8 x: t) e5 E3 N  v" V   .release=mcbsp_release,
# e+ H5 }& O  |- k: n2 i   .write=mcbsp_write,
( `1 U* y$ i) C' l4 R- V0 b- i. I   .read=mcbsp_read,, Z+ ^  o1 {& z% D4 z2 p; N! V  d
};
* [* K$ a( C. T1 d+ w2 @3 cstatic int __init MCBSP_init(void)' e( p: R5 f4 z% J/ m- X! B1 \
{
$ \/ `, d$ S9 ~9 e1 F  V- V6 o/ h   int ret;
2 k7 _3 K! J0 H) O$ i6 M5 M   unsigned  int   PINMUX1_REG_old;. v2 w! R. M6 ?3 ^! r
   unsigned  int   PINMUX18_REG_old;
9 w) S/ o6 s; \6 k   unsigned  int   PINMUX19_REG_old;; d4 T$ y3 P- c, r
   unsigned  int   temp;  ! \' ]( Z5 l; B
   if(MCBSP_MAJOR)4 [) K. u  t8 l
   {
7 z8 F0 O+ }' _! z# b7 s/ G      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 |5 T& Z: l3 Z      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 T. v' I" x" s! N4 E: ~$ [   }9 s3 A6 ]5 \% a2 G# {1 ^+ ^
   else3 q4 l1 ?, V; w& r
   {/ A6 O* h4 @! D
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' t0 x: ~  x; h% M: C  N- J/ q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);4 ?) \7 g) n. [4 [
   }
, ~! @6 q4 O3 z- T4 x0 y. L9 |   
% p7 `" L6 V' L" O, d   if(ret<0)
% G3 k: i4 K0 U% X, w   {& t0 c! S5 w$ c; C+ x
      printk(KERN_ERR "register chrdev fail!");* X8 n) M3 d9 Z5 J( S8 b4 W! S
      return -1;
/ z4 H0 `4 W% f3 F   }
' \; W, j; e- v9 R! P   % T$ A4 s4 i+ c/ J
   mcbsp_cdev=cdev_alloc();% x, q! v, k* \7 c( d5 B
   
/ s$ {7 E9 F; N6 Z+ C   if(mcbsp_cdev!=NULL)# P: b- C$ i: \  e4 L
   {
4 l% {! x; o1 _& V      cdev_init(mcbsp_cdev,&mcbsp_fops);
, ^3 R. e& q7 k) Z  c7 d% I      mcbsp_cdev->ops=&mcbsp_fops;
4 ^' y0 }, V6 b- y) p, d  \      mcbsp_cdev->owner=THIS_MODULE;
$ z8 {; h& O. X8 u" m" K      ; x2 I9 Q& J$ y1 c& i
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
: j3 t9 d! g8 _3 a4 `- }7 b8 R          printk(KERN_ERR "register cdev fail!");# A) K: J5 J! m: |( v
      else* r( j3 }; K+ Y1 @& F
          printk(KERN_ERR "register success!\n");2 d8 @9 Y; k8 L- Z% o7 L
   }* B; a! ]4 ~' _! P% u% \
   else' ~0 g8 q$ x& M' ]! K
   {
& G5 z" U: z. u! F7 ]      printk(KERN_ERR "register cdev err!");2 Z7 V4 R2 W" @. z  u1 ]4 n8 g
      return -1;
9 {9 \% x/ T1 S% `1 j+ A   }
% `" D( m6 `+ ?- z6 Y' ]) X   
" k+ ^/ d# u0 }  f, P  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* r( |. O* ^$ C2 ]' R
   if(IS_ERR(mcbsp_class))7 q/ E( k& p( J& ~5 P3 @( t! R
   {( O+ u3 N, Y' q' J9 n
      printk(KERN_ERR "register class err!");% f3 a9 ~! {* D
   return -1;
) P+ `; ^, N! m' C: w* ]2 m# T   }% j& ^+ E0 k" r# U( [' K
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 O" p! {4 W7 C7 |& R
6 x: V; i1 U. u% `' J1 L2 y' v   //PSC
9 ~4 T; N# {# V0 Z   //add Enable MCBSP/ \+ ?6 O# Y% Z5 G$ [8 w. i: v
   //test
! e9 N& n0 ]* |* y   temp = 0x80000003;9 i9 t# |2 j0 H8 @1 U
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ |7 n  a! s+ }3 |9 r
   temp = 0x00000003;6 U3 N0 m5 V/ e9 J5 w
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 q- ]" w1 _% R7 L0 w* p/ ^ : h. B* y# J+ H) W8 Q5 A/ u
   temp = 0x001FF201;3 M( f- R* R3 A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; g0 w6 V" R9 E; p; X   & Y/ O: x7 @) u, L$ n) X* J) x  A
   //PINMUX  
4 \2 S4 N/ E0 Z9 _   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 y8 r9 ?% O/ Z8 a, j   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  , q! I. m; v" f4 u4 k
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : ^7 ^, H( G$ X  H! X% J
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ t7 o6 ^. S& R& J$ N1 e" b   
& V+ j8 |$ H4 M. K+ c% C   //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 d6 q( O( ~, U9 C+ t( M! d; e   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  : |3 I# L3 V; V; m' g" D
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   5 C9 u3 P- ?: h" j3 T  {
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 i, n4 e0 a) S8 g- O2 I) Y7 h
/ ~3 m2 Y1 K( Y) m) }" _1 u
   //RESETn,L138_SHK2
, x% O2 p1 Z6 ]& h" L1 Z) P) B   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  + `) J7 `6 s6 s6 g+ W
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
/ P5 J9 l4 i9 \7 z   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ k7 j, d$ s" N3 f, r/ v$ J& p
6 ^7 K! k3 P( m  i2 O, i9 s. c! a0 w

# U. h) Y2 k: j& [! U9 D  //SPCR Register' j8 {/ z; d5 S; j4 y& S
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. H! @$ H2 U$ r1 Z0 Z+ j' ]! }
  temp = 0x03000000;//(DLB=0)
; j$ w2 Z( e0 w // temp = 0x03008000;//(DLB=1)
) P9 b, g1 o: j+ J2 T  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
9 b9 W# {6 q' y0 B1 N8 e  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 J( h. R* \' k% y3 ^: s8 f: X  printk("temp=%x\n",temp);" F8 e, L: U+ c' F+ i; R  X$ @

8 O' L8 u+ D/ ]% h6 b  |   //PCR Register* [- U% C& Y8 X
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ {* m* c! b( z+ r
  // temp = 0x00000F0F;
3 v0 g; m* w/ Y+ ^  temp = 0x00000B0F;# T. o+ M" `8 C* o+ l% \$ v/ ?
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ z% n! _+ v; i; k
  temp = readl(IO_ADDRESS(PCR_ADDR));, [" x5 C9 r; o1 i- I* Q
  printk("temp=%x\n",temp);  
( r4 s- G. \7 {4 V% R   //SRGR Register
' D# w+ `7 ?5 k; Q1 N* v   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 k$ c, i& V2 o) J9 W, Y //temp = 0x301F000B;
- `! Y; `) y, ^% b# K   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized - \9 v* ~& F. l, q& X8 A6 u7 |
  temp = readl(IO_ADDRESS(SRGR_ADDR));; R* V, _- h% [6 ]+ q
  printk("temp=%x\n",temp);
6 z5 e& i' q; I* Y% x, ?8 x   //RCR
0 r3 R! Q: A& i- p( d5 ]" d& L   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 A- P. X  n$ F0 f. m
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 a$ P" f* ?  B. a! d/ ~5 \) ^   temp = 0x00440040;( w# F9 R9 t. Q. g5 `& ^8 w7 b
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 P/ I9 t3 b3 ^6 B* |   temp = readl(IO_ADDRESS(RCR_ADDR));& d4 V( |, e. D4 @9 U0 |7 r, }
   printk("temp=%x\n",temp);6 O- n8 ^( D7 `
   //XCR* g6 d- R  p5 r4 E/ k# v1 d1 f# e
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* V3 _( l; V5 V   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! h( q( ]6 i5 J1 c2 B  {
   temp = 0x00440040;
& v7 Y0 |) U$ V4 [* H3 `   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ' z1 \6 v# _  V; d5 r  \* v
   temp = readl(IO_ADDRESS(XCR_ADDR));# d- r' \% \+ W! |$ p
   printk("temp=%x\n",temp);
; Y: K# r( D+ B% W2 s5 M  udelay(100);% p# [0 ?* W" O. R7 i2 @  `
  //SPCR Register6 q  P2 ]9 Z5 s5 T
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1; Z' l; E5 ?1 ~
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1& f; l# @' ~0 E( U' u  E
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 \$ \/ H, E# R9 ^1 e5 O( C4 y  temp = readl(IO_ADDRESS(SPCR_ADDR));$ e5 o6 T# c7 |& Y$ d2 V( ^
  printk("temp=%x\n",temp);1 l- H$ k: k- d/ U1 g+ P8 G+ e
  udelay(100);' P6 M% `5 L8 e7 J. ]& l9 L* |* g
  R; ^) J3 V6 U- k" ?
  //set GPIO direction
- Q1 d7 i% {: ]3 W( d9 {! k   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" f* y$ X9 a5 T0 }   temp = temp | 0x00000100;//EPR----input
2 X' R# A4 d' B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 x7 B0 Q8 |9 w5 g. _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + l+ ]; Q( B0 A0 O& G
( I  R; S' n0 a# W
   return 0;
% c% _  A% `6 X$ D: J1 e}9 N. g2 }, \( F
static void __exit MCBSP_exit(void)
1 M" V+ S7 y+ t  [9 P, Z{
8 w. Z# n. n* }; x4 G% s   printk("mcbsp chrdev exit!\n");0 T$ p7 P; i' o' M
   cdev_del(mcbsp_cdev);
, @' b  M- U6 ^   unregister_chrdev_region(mcbsp_dev,count);
4 [1 C# l4 |, p( i' R6 Y/ ^8 o   device_destroy(mcbsp_class,mcbsp_dev);
1 L" j- e; I( S( u, d   class_destroy(mcbsp_class);% @5 O: W2 P6 L% _* J
}
7 b) Q2 n* b8 Rmodule_init(MCBSP_init);6 z5 g" k6 `: a( K% u7 A
module_exit(MCBSP_exit);
1 G- |7 d( ^9 ~  T2 j# m* r. E0 Y% Z. T. B" y  a
MODULE_LICENSE("GPL");
5 x: @; n. _- f' N+ p" F0 r. N) t; A. I& x1 |9 ?
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- B( T& F% }4 }! u$ s; R
我的应用层的测试程序如下, V% R# j+ y& [5 N. @
#include <stdio.h>' ?9 r9 r  a* }$ ?" A  u' Z! D
#include <string.h>
- P7 N; |/ R0 j, @/ B3 i/ m#include <fcntl.h>
( `5 t: |! u# q3 C& y#include <unistd.h>- @9 f- M3 W1 J3 }! u4 J
#include <signal.h>
6 R; l* P% U! c- r#include <pthread.h>       //线程
5 H" w$ l3 C" C0 ?#include <stdlib.h>  K6 x. y7 r2 j7 L' L( d" a
#include <pcap.h>          //捕获网口数据
5 T9 J  u1 ^, P/ q& R( W#include <semaphore.h>     //信号
; H, E0 g3 z& @9 O* B. N#include <sys/types.h>     //消息对列: n3 B& h4 ?' ~" q
#include <sys/ipc.h>       //消息队列) L# g$ h/ x/ b
#include <sys/msg.h>       //消息队列
. i- f0 q. U% m' B1 P#include <sys/select.h>
; X1 B& }0 _5 a7 q#include <sys/syscall.h>3 B4 v/ l5 y3 }' t- M( f
#include <sys/stat.h>
. M- z9 p$ \1 ]- I: r$ W6 D#include <sys/mman.h>
9 D2 _; c: G5 ]7 X3 C7 a/ L#define msleep(x) usleep(1000*x)+ T$ S. u1 i# \* {- x& u

! A' G5 v; b1 J! cint main()6 w/ L  t6 M2 x0 s4 T8 j3 V5 g) w/ s
{
- a/ |- L8 i7 ]5 P6 S/ K" P2 x" b    //MCBSP,ARM与AMBE2000交互设备
2 N* ~: P% I: q$ } int fd;. b9 P' R2 y3 L% D; G, q5 b
unsigned short data_write = 0x5555;( [( x! d- a% ^6 A. M8 U) ]( N
unsigned short data_read = 0x00;3 k. \9 m4 h. ^2 h6 s! \+ O
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: U# J/ n( w, b& y4 R7 z5 F; r9 P  G
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, k; z- F: T" u
   
% }9 C# y# l: Y7 X# ]  if(fd < 0)
- V: R# E: u' n5 }  {3 g& D2 }) E3 C7 m, L+ y# `
     perror("open failed\n");
$ t% N" D; v, I. h. H" G0 B     return -1;& s4 B& X! u0 f% H, n4 ^
  }
. m" _) o3 p2 b3 O/ O  C9 x  $ c/ ?6 P. a) b
  while(1)
7 w6 |4 v. T# A! `( k# P. q- L+ H  {
% a* f" r* x& C! O* e9 G: p   
3 k" Z" v; _  e- N6 o   //AMBE2000每次读写是24个字为一帧
7 A$ [; F1 |7 l/ \   //写数据时将数据在底层存储起来,等到中断的时候再发送
* [% k) t# S. n6 V6 {6 b4 e% [   //AMBE2000输入数据是以0x13EC开头的
' M3 E/ C$ H: o3 Y9 J- I   write(fd,&data_write,sizeof(unsigned short));
0 v+ E9 R; ]2 Z& c% `   
; y9 H8 [4 b' N+ ?% S7 L* N% ?9 a   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
) P$ I7 O* ~: ~  m, y  X1 D   read(fd,&data_read,sizeof(unsigned short));- ^7 |# a8 K: l8 r! T
   " w! g3 |$ c. `# |* l; @, ]
   if(data_read == 0x13Ec)3 h4 E: Q1 [: w+ ~
   {4 M! g! H9 u: p; ]
   
9 o$ P9 ^: X, A$ {* f' C. n. T    printf("data_read = %x\n",data_read);
' l% o2 I/ a( w   }
' i' }( a7 ?# M4 c   
, h( g  m- U1 [/ o- E   msleep(10);- `9 c0 K( ~$ n0 O
  
- O* m. P4 I5 S: r. l2 i  /*
7 x( S/ q3 n/ J4 P  S   ioctl(fd,1);   
2 c1 \$ M6 ~/ |, t: o  G sleep(1);
' k) f$ B/ x0 a/ b ioctl(fd,0);# s7 b3 z2 \/ @7 Q, B$ \: C
sleep(1);
8 D1 F, f. e1 r8 J- U, O* D */
1 e4 }( O! ^% m; G$ K  }   3 L% ?4 }! y3 _' n' P
return 0;
6 H* {! C! T' b$ Q8 n) @ & J7 D( K1 l! ~
}
; P( d+ D( t+ M% \- X
4 g4 T0 _# p$ A+ Y! S$ R& _多谢各位指教,谢谢! 急+ P8 \$ k6 [) c! a4 ]

$ M7 b- p$ @/ P
8 ]) m( b8 o! q5 A4 B, R6 Y( V( Y4 K' k8 ^
: n9 [, J2 S+ H/ W

+ C) L5 r. r% j! ~% D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 14:04 , Processed in 0.047721 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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