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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! H/ W: E1 l; l! P4 H  L
/*- F5 ~& J4 c7 `
* Copyright (C) 2009 Texas Instruments Inc( Q' n" A5 c/ [0 U3 C( w
*
% X, g6 ^! N- i/ N * This program is free software; you can redistribute it and/or modify
* F8 ]8 c0 X4 ] * it under the terms of the GNU General Public License as published by
: b' e9 y' F3 J: f5 g * the Free Software Foundation; either version 2 of the License, or
- L, a' [1 U- I) w1 E8 k * (at your option)any later version., k* c0 W$ E% p9 E0 |
*0 Y$ E7 d; \& [+ ^. x* b3 f7 U
* This program is distributed in the hope that it will be useful,2 u- H- N5 I- a
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 n. v& @2 p  X  G+ D, ?; i: O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! i* G1 J, G9 x* [4 Y1 r; T' ? * GNU General Public License for more details.
; V4 e2 Z9 h, J! b6 f *; L5 H0 L6 o$ _
* You should have received a copy of the GNU General Public License2 X& ?6 D' f0 W2 O" Q
* along with this program; if not, write to the Free Software
% e/ }: U: ]0 h' P6 H * Foundati+ X/ I6 k2 }+ Z
*/, J  r  L9 j8 z9 I2 L1 m; W
#include <linux/module.h>8 J0 |! u  f; K6 I
#include <linux/init.h>
' Q1 P% d2 \; `/ g" l; n#include <linux/errno.h>
. e. J% M+ f& J$ S: `#include <linux/types.h>
3 U7 Y; f/ A: D. ]#include <linux/interrupt.h>- T4 ^* G# U# {8 q% Y9 ]
#include <linux/io.h>. d  ?) \5 ~4 y6 @1 s- `
#include <linux/sysctl.h>
- Q8 w5 c) o  U, \! N" T#include <linux/mm.h>
  Z- ^: g. N0 b' g#include <linux/delay.h>
: z4 v: t0 f# Z9 u. ?#include<linux/kernel.h>. T3 D& A* C& T8 i1 X
#include<linux/fs.h>+ |( n9 P1 w" ?0 h3 U
#include<linux/ioctl.h>
* p. F" G, i  R# f, i  D#include<linux/cdev.h>; E. r' A3 ^5 R6 C  j5 u9 S
#include<linux/kdev_t.h>' \5 Z. }# e5 N/ C
#include<linux/gpio.h>. h8 b2 o  `2 s2 v
#include <mach/hardware.h>
2 N; ^9 B! Y+ \) J#include <mach/irqs.h>3 s; O- q" H- z/ q7 j/ N* G$ n
2 Q. c# N/ o1 t9 g2 F2 K# X+ D: @
#include <asm/mach-types.h>
. p" @4 g4 c' k% B; T9 ]! }#include <asm/mach/arch.h>: E& L$ b; g8 O4 V5 p
#include <mach/da8xx.h>1 _3 I! n7 ?3 ]& O4 s7 `9 s# q
#define  SYSCFG_BASE   0x01c14000, f4 ~- `$ s9 x3 a1 j+ R- n
#define  PINMUX1_OFFSET   0x124
0 J+ S  m$ G* B, {. S# q8 K#define  PINMUX18_OFFSET  0x168 ( ~! p5 r) v/ `- s& C- d8 e4 Y
#define  PINMUX19_OFFSET  0x16c
( O. f4 `* N3 Y* N  n" M#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
& b7 I, R8 ^8 R: N#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 l9 Y6 J: D6 L& q3 M9 s. a( f3 _#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR! H8 K2 m( r4 U) C, C! q
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
; H+ u; b# S9 U. N#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR. h+ v0 E/ ^+ ?) ^; S. s
                           
& [3 P( }* {' Z5 @7 i#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
6 A6 d; |; c: l5 H#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
4 j% |5 Q0 D5 L/ v) U9 \; B//PSC
1 M& g' _& ^8 \$ J0 r+ ~/ a( o#define  PTCMD_ADDR   0x01E27120  
# z0 l- r3 B; t$ M3 v' Q$ h( m#define  MDCTL15_ADDR 0x01E27A3C
' ~/ t0 v' D) R# \- k1 G  e+ c#define  PDCTL1_ADDR  0x01E27304& X: U, a- `0 B3 D
//GPIO8 direction
9 V3 V# M8 ^; g& O. K  D9 u#define GPIO8_DIRECT  0x01E260B0
5 ^: r. d" ^! h#define GPIO8_OUT     0x01E260B4
' y5 J) U$ T/ Z" i/ [#define GPIO8_IN     0x01E260C0& h! |  d) ~6 h3 y5 F

8 q9 r4 k7 g7 ^5 w7 N9 [# y//#define MCBSP1_RINT    99              ; G2 e0 F0 H: v2 G- B  x: p
//#define MCBSP1_XINT    100  9 ~) V% a" E/ n8 f1 }1 l
static int MCBSP_MAJOR=239;: z4 y+ v9 Z* n: |
static int MCBSP_MINOR=0;
7 h) q: o; P. ~6 Istatic int count =1;0 X; |) M: x7 u, e

: |: p( T: p+ T$ z8 q6 T#define MCBSP_NAME  "MCBSP-device"
# _2 ?5 {  N! `4 H
: Z# E. f! Q: S( l. v9 @' [static struct cdev *mcbsp_cdev;
0 F  j; T; _6 ~static struct class *mcbsp_class;4 x; X, N$ Z4 n, I9 {0 k2 D  h
static dev_t mcbsp_dev;
- G% v9 h; v, g$ y$ |unsigned int DRR_data;8 a1 c# w  D3 E; g" G
unsigned int DXR_data;+ p! E: o' Q6 X$ X, y0 e
static int mcbsp_open(struct inode *inode,struct file *file)
% a( e5 v3 i: V/ [  f{
2 ^0 z. @: ]& g+ i- b5 X   
9 i7 a3 a& l6 j6 ]2 p. D2 V   //interrupt enable,initialized& e1 Q7 x/ R$ X5 V  d* l& Z5 U
   unsigned int temp;0 A) m0 U  h$ S9 c8 p& Q, j( F
   //SLEEP_EN(GPIO8[10])---0
- A" }  s3 P% ~  F2 N   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 f( r" N2 C# H6 k5 A  s; {   temp=temp&(~0x00000400);
& |- a0 R: H. I/ N8 L& z# A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 E# g/ B: ~. D& ?+ {  //RESETn(GPIO8[8])----0----1
1 R+ m, h6 B. U1 I% Y0 \   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ o& t+ f- m& h- V6 {2 ?& O
   temp=temp&(~0x00000100);
1 T$ E9 L  a4 B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 u5 w; R1 D2 W+ M/ ?' g3 A   udelay(100);
4 R0 K; `; Q# b8 V' q% I   temp=temp| 0x00000100;
( f( Y) G3 s$ Y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' |2 L# ?" Z; L3 a
   udelay(100);) O6 p5 R* o0 K+ r" _
   printk("open success!\n");* f2 f9 T/ P* o: L' A: R' w
   return 0;/ n( l( G& Q) }- x; v
}5 Y5 B* t4 @4 E% [
- p7 V( z% B/ f4 B+ X
static int mcbsp_release(struct inode *inode,struct file *file)
3 M( P/ @8 S8 P# U* P  v{
6 r" }0 E" v/ V' b) v; A( {" l; ]( d   printk("release success!\n");
& }% a7 |7 b- j+ k+ n   return 0;3 ^) @# x3 e& }' R6 K( Y
}
3 p- Q5 q( l* u% _
5 b& o8 p2 C7 t* d5 U7 R7 lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 `5 {  M6 N- l) v3 W{
2 d) Z( \# A6 h2 F: b9 {3 `    copy_from_user(&DXR_data,buf,len);
3 Y7 L, l" T' `; B  ]! B    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
' L0 W5 k2 `5 X5 Z4 ~    return 0;
3 Y5 I. ~, M+ [" @1 s5 N3 e- p% J ; a$ ]) V/ `8 }# K5 Y
}
. J. R8 W8 Q. L) E, m
# ?2 Y/ M: l7 ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 ^) q5 G: ^7 X. F+ g5 v
{ # i( ?  j. T4 f+ Q; J' {
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 O7 _( r6 n  x, d: o" G   copy_to_user(buf,&DRR_data,len); 2 S/ `3 F1 d! C8 I) j' R5 A- Y
   return 0;
! U7 [( q$ B& W7 m$ d}) i( p  V6 w) d/ H

: X/ m: L  r) u2 S5 E4 o; r* h( ^% r6 `3 Y4 E  |. n  o
static struct  file_operations mcbsp_fops=
9 q, O0 f0 N0 Q5 x8 P0 ^0 j{) A3 T: K; X5 T( D
   .owner=THIS_MODULE,: _. B0 B; L$ h, O# G& F
   .open=mcbsp_open,
1 b1 T: t, O& Z# L4 E6 V   .release=mcbsp_release,& k/ e& ^  W4 N. ]% q
   .write=mcbsp_write,
' [* W4 D+ d8 {" z0 f1 U   .read=mcbsp_read,1 ]1 w- L/ U, |! d; z
};
) R" Z: d7 b  E8 _3 ^5 U- y) {static int __init MCBSP_init(void)+ d8 k( Q. J$ l+ y* C+ l
{% f8 h+ q; @7 {4 v; l) G& a* {
   int ret;3 W2 L$ [4 X# {' e
   unsigned  int   PINMUX1_REG_old;
" k( D% H/ S, y3 _/ ?   unsigned  int   PINMUX18_REG_old;# E3 s3 F3 v( N3 S, n' s
   unsigned  int   PINMUX19_REG_old;
6 Z5 \7 F0 o, l$ A3 ]8 e   unsigned  int   temp;  ' ~) u' A  K# R6 e0 I* ^
   if(MCBSP_MAJOR)
% N5 K6 E: S0 p2 j) w- e* _   {1 R* S0 j. u# a3 u$ U
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* M2 [* ?  v$ b) l$ V! w
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! [  a1 R# O# E( @  k# ]
   }
/ v0 J# D7 G$ ?, E+ W5 o. y0 P: P   else
; a. B" w% x1 o5 O( Q# O   {: E( U9 @% i9 G: y2 c9 v, s+ G
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, l9 d) y* Q7 r% h" J      MCBSP_MAJOR=MAJOR(mcbsp_dev);' |3 c' Q& e# t
   }' E7 b4 K: C9 J# c9 N- y
   
& k( T, c' e+ H# E0 P! }   if(ret<0)
4 N" y6 f6 M# i5 u3 k, F   {( N" A- g0 R) z- x! R
      printk(KERN_ERR "register chrdev fail!");4 X) v! x/ T' g2 ]
      return -1;
, }$ c. S: U' s0 Q, y$ j' N& @   }. R  d1 E: D$ i- R
   
3 I% d$ O5 m) P4 ]1 I   mcbsp_cdev=cdev_alloc();
, Y9 F9 M5 i2 c% i1 }) C7 B1 u+ y   
- K! T6 m  m, o8 s: Z4 H, k   if(mcbsp_cdev!=NULL)# S8 Z: N% n- P2 p' ?! [
   {
+ c+ \2 ~' ^2 N4 w      cdev_init(mcbsp_cdev,&mcbsp_fops);
6 |7 `2 j. w& H" l      mcbsp_cdev->ops=&mcbsp_fops;2 w/ `, `. f/ F4 N0 e
      mcbsp_cdev->owner=THIS_MODULE;
: `& `  ?: i; O& J4 @  B# u  j      
. ]) u" S; a' n' l- I! b8 o" ]& }      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% x5 r+ S6 O# A+ {/ E          printk(KERN_ERR "register cdev fail!");$ U5 P. r  d' N* w+ `
      else; O* z, I+ m& D& w& @4 m
          printk(KERN_ERR "register success!\n");
0 ?' X: {, g4 `+ ^" ]- l! L   }$ N0 c% C* }4 A$ L/ v; d% e, s
   else
8 ]8 I7 j) T9 [2 A/ N  t6 f/ T" S   {7 D( h# {. R' f
      printk(KERN_ERR "register cdev err!");: @) `2 i; W8 ^: N9 {
      return -1;( \  R. n- _' d3 o4 u  d$ F
   }
- }* ]& u" @) t- K- ~1 Y% ~  `4 w   
/ ?) m/ |% g$ g  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 {% |8 S  c) K   if(IS_ERR(mcbsp_class))7 I1 ~3 B) p4 @% i" Y) @* g) V
   {3 b% I. Y9 b8 L+ F" D
      printk(KERN_ERR "register class err!");$ I* H# e; B5 p; L. [' A; j5 [/ h
   return -1;+ t- k% x2 b8 Y2 V
   }" R( S& r2 J& G! @# u
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ i- U$ ^% I2 S$ Z9 ]0 v

- v2 a. |" W( s5 R, \   //PSC
1 l- h9 D6 z- U+ J0 G2 l& S! r   //add Enable MCBSP. b" A6 s3 d: E1 W/ F6 v
   //test6 Y' Y" o" t) b1 z
   temp = 0x80000003;
$ i# @. D8 |# a  D# a   writel(temp, IO_ADDRESS(MDCTL15_ADDR));# `; `8 v8 |/ J9 }# f
   temp = 0x00000003;
4 Y) ^  [' @1 v$ b& x% r   writel(temp, IO_ADDRESS(PTCMD_ADDR));/ a  N! C7 {! Y* P

4 V) l9 F/ j4 J4 ]& o6 T" N   temp = 0x001FF201;8 o2 G9 ?7 I- |
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" S  }7 ^  @* n) J1 w( O
   % L$ \1 r3 \5 J+ E8 ^7 D
   //PINMUX  
5 J" C  E1 S- k$ t: m   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! K0 N+ s; U8 ?6 e
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  5 p. I/ W! t9 {% t) R" [: I: k( S
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) B" n5 k7 a% A8 }4 {/ |
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' D9 `& F6 A; F; \( u8 C   5 x5 w! Q+ D; `4 o( m! G6 i
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
3 s$ g+ ~, v+ m   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  + ]& b/ x# E4 z# u: U, f
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   : E* p" l7 ?! ]- p; d4 m* X3 E& J9 R4 x( W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! k0 G; {& u% L5 y: ~9 s

, F) g' m! j# j2 v9 b4 A+ f+ H4 ]; N   //RESETn,L138_SHK2& L- \$ ]" ^9 ~. |% ?0 C2 G8 l
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ! z8 J2 h" Q4 a  j  I5 Z1 l% h, x
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   3 R$ s! L1 r0 z( I1 j8 _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);2 w5 l5 C. F; E" M+ g9 m1 |

5 o  B! A" O, W2 Y 7 o! X# }- \) s& n' ~
  //SPCR Register+ M  F- U! |6 G8 ~& i; v
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  {9 F4 [+ M3 I2 v( H5 e  temp = 0x03000000;//(DLB=0)0 q9 K; B  C4 R- H# ]
// temp = 0x03008000;//(DLB=1)# E# S% ]$ i& K
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* [- X+ ~+ X7 K4 _6 t
  temp = readl(IO_ADDRESS(SPCR_ADDR));  w- O( C. p, \; p, X' B7 p7 n# Z4 o
  printk("temp=%x\n",temp);* u1 h# ?7 {6 Z& M, {3 }! _

6 g) @$ `7 L; l: v: m& {   //PCR Register
. P& O7 j" F6 E- V: }* G5 }5 E   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 U+ w- g9 g* ?* E* {) p8 _4 \  // temp = 0x00000F0F;
. m8 H3 F4 e3 z& D. \3 y- _  temp = 0x00000B0F;2 u+ M$ ]5 y6 R4 f2 G( P0 @6 d
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
, [: |" B% [  [: G! o  temp = readl(IO_ADDRESS(PCR_ADDR));1 u& h6 T9 F6 b2 ~5 i1 z
  printk("temp=%x\n",temp);  0 A# Z& s7 \. [5 E- L0 z2 o' W4 A
   //SRGR Register
( s6 v: b9 n5 `9 j   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 Z, _% V: |  ^9 F& _& ] //temp = 0x301F000B;; {- d6 P2 }  L: |- d) [' O
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) T; p4 L9 ?- h  D* d- \3 x
  temp = readl(IO_ADDRESS(SRGR_ADDR));% Q2 d  P; e( ]/ y0 w: X2 b
  printk("temp=%x\n",temp);/ Z6 B! ~  x0 T( v& {- i
   //RCR' b. F2 q' e0 d4 t7 S9 I+ p  x
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! G) \8 b8 x& S$ W$ Q# U% w. X/ M6 `) q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0# J# j+ Q8 I: p% M
   temp = 0x00440040;4 h8 \5 `7 p* b# h! E$ r  Q
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   / R6 G. B2 _2 _6 O# \
   temp = readl(IO_ADDRESS(RCR_ADDR));3 v- f+ W4 w, A. v; i. h! T
   printk("temp=%x\n",temp);
! B; P; E3 x2 Z  Y   //XCR
+ }. R) k1 w4 T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* x! {, w* @; t& K4 b6 h1 h
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
4 k) T' S& k5 v$ d2 {& k' C   temp = 0x00440040;5 t* j) w& d$ W4 X# s# e1 q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   . I3 C; T5 c" N0 f9 D  c5 q
   temp = readl(IO_ADDRESS(XCR_ADDR));. u1 k' e. B- g. Q* P
   printk("temp=%x\n",temp);& d* C* |* w  c' |; U& W/ ]
  udelay(100);
' Z- _& q( g5 _3 r; i8 `  //SPCR Register. R: P$ w7 R5 \9 g* f; A  t
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
+ L' n5 o' v2 U# Y. n  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( X/ Y4 z" \8 r2 ]  m+ X6 a- G
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 Y8 n* j1 M' f2 i2 Y3 ?% s) [0 c  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ ~  N9 a  Y" E) V  printk("temp=%x\n",temp);
6 M6 p* c( F8 S" K6 m( H0 u" a5 Z  udelay(100);
) _5 i! k: v/ Y- E
1 ?3 U$ v& }' [2 q  //set GPIO direction/ i8 ?8 b" e3 r4 l
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 I0 m6 h" J4 \0 N' C5 ~0 Q- C   temp = temp | 0x00000100;//EPR----input9 A8 U6 C( X6 k. X
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output6 t; ?  |* G# I) b/ l' ^
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& J3 q8 _0 A, h7 U4 ?- v
, ]6 ~; q$ X* L' E% I& T, r! ^   return 0;
$ q5 p: d& s( U) u6 o5 V}, N7 {( w$ i1 z- B) Z
static void __exit MCBSP_exit(void)( |& t0 `: L- k9 x6 B
{
( r- L: x+ r* h" A   printk("mcbsp chrdev exit!\n");
6 y3 h6 C! {8 Z- d$ @' W   cdev_del(mcbsp_cdev);
+ }1 B' G4 o+ G: i4 [$ s! m# U   unregister_chrdev_region(mcbsp_dev,count);
6 V1 n; E1 V. }; `( g, R+ `* Z7 H: m$ e   device_destroy(mcbsp_class,mcbsp_dev);
* {0 a  C1 E8 [; O   class_destroy(mcbsp_class);
, `* b( s/ o5 F6 ?}) b) t! p4 v/ B0 {% e6 @
module_init(MCBSP_init);
4 h; p4 x9 e6 _$ s$ Bmodule_exit(MCBSP_exit);- ?( n* g7 R: V4 _( |1 N, f

) w: y  m4 c: U" z$ L" A$ y  |$ RMODULE_LICENSE("GPL");
* t1 r5 y; L  {) V7 |8 G$ j% y* o& f. b
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 u+ O8 Q( a$ }0 P% k
我的应用层的测试程序如下9 h. `# S  h7 y2 J. r, E# v! m
#include <stdio.h>
4 V7 C2 ^5 f3 Z; ^) d#include <string.h>
/ q* H3 Q8 ^( k" o7 f2 j#include <fcntl.h>/ K# C, x/ i) o' u
#include <unistd.h>- X6 x4 K2 k( P9 |6 @, Y
#include <signal.h>
6 C% c4 z! {5 {; P/ R#include <pthread.h>       //线程( f7 ?) R( b, ^5 _2 k1 m
#include <stdlib.h>
* c5 k) S# ^4 `8 {5 }; X. ~#include <pcap.h>          //捕获网口数据5 e$ Z( f0 o( A7 k/ L: ?
#include <semaphore.h>     //信号# J% r  k" A! Q" P& O
#include <sys/types.h>     //消息对列+ `0 k6 L5 E+ t' o- F
#include <sys/ipc.h>       //消息队列
8 _) ]+ n0 Z+ c#include <sys/msg.h>       //消息队列
2 K# ?/ j5 |# G: R4 h' D#include <sys/select.h>
$ Z# n. C8 |6 N/ v4 y8 h% \#include <sys/syscall.h>
6 V0 o1 S7 M9 X  a% o0 r#include <sys/stat.h>
8 w* L! P9 I1 j5 q- Q#include <sys/mman.h>! V7 [7 n/ u2 h3 J
#define msleep(x) usleep(1000*x)2 O* ]( w8 z1 {& p: S, T
. R' W6 g7 `9 O$ ~: d' S( M
int main()$ h# }3 b4 {+ a+ x$ |# {/ x8 O6 h# ~
{
0 w0 \1 L, G/ i0 g! E! \    //MCBSP,ARM与AMBE2000交互设备
- A, V7 ?& x( ~" p  R6 Y2 U int fd;( t: k- u+ Q2 J/ c
unsigned short data_write = 0x5555;/ Z( [' W; R) f, f. z
unsigned short data_read = 0x00;8 M) ]3 h- B5 Q7 Q
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! |# u- C4 F" m/ h& J
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& N  I  b& }0 G9 l) U3 c5 v. Q" t( L   
; c' [- z4 u* X. f: N- d" E1 i  if(fd < 0)
! P% J, O. M% F3 V: _- V* k  {, y- v3 B& y/ }( E
     perror("open failed\n");. e) M  O  D9 t- |. Q. |
     return -1;- F3 {7 a2 n! ^+ U7 B, }# V4 L/ v
  }+ e  I: m9 F$ \
  
3 ]; u, d" D3 y) ?! K; V3 g# t  while(1)3 g: H- [; J3 j. f, p! e
  {; j" r6 _/ P( F9 l- D9 d& _
   
! r7 h# g/ r2 X3 ?   //AMBE2000每次读写是24个字为一帧" _& l9 f8 n( U9 E* ?& }( K6 z( f: w
   //写数据时将数据在底层存储起来,等到中断的时候再发送
  {$ X( E$ q+ @   //AMBE2000输入数据是以0x13EC开头的
8 y- G3 \' q( L0 N) V! M   write(fd,&data_write,sizeof(unsigned short));
' G7 ?* i/ d7 h( j9 b   
! E, q7 S) k; v# q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; S+ i! d5 K  q& x# D% @1 {# ^
   read(fd,&data_read,sizeof(unsigned short));
  g. {$ y& X6 C/ y5 c/ b   
# `& G6 ?' B) B, w+ \' M1 Z   if(data_read == 0x13Ec)+ ?3 ^  u7 R# l5 e; I9 t- ~- r$ e! }
   {
+ _9 O7 e  e% e' B4 c& a# e. [' W4 l. W   : Y# E- U% G5 O8 w
    printf("data_read = %x\n",data_read);' I9 C( v4 }5 `$ W; a
   }# T  X2 ~) a, u! E( t7 [8 A; w! [
   ( w  I1 G& b: b
   msleep(10);
1 X  g+ Q/ H( c' |6 R  
1 D/ A+ R6 l- g$ L' ?' w5 b) b, |% S  /*
  u( G6 Z( B. \( v; s   ioctl(fd,1);   
$ z/ l) V; p% q9 {# h6 T8 v sleep(1);
# [+ ^9 I* @4 v1 b" J% f ioctl(fd,0);
/ r% r  L* k5 ]" Z sleep(1);
: Q6 k! p' i5 U& T; l( D */ 5 M. M9 B& j" k4 ]# m
  }   
& i0 F' d" v: U+ Q/ ]) A- K# U return 0;/ G% k9 ^5 Y2 u1 Z4 e

  @. {" {" ~- e! I}
* i! K. Z0 C. a' G- e, _; _* A; `, k: Y% [2 }6 g
多谢各位指教,谢谢! 急
6 w3 N9 d. G0 y8 y, |( u
* Y4 g/ m" H( h; A, f+ ]- X3 g7 \! H0 K: \" c7 w8 Q
4 S8 H: w3 Y; S  ~# n1 z
( r  J, q- ^0 c4 G6 m. w

5 F& S6 X- l/ t* t  Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 03:44 , Processed in 0.056896 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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