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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- Y' ^3 {8 k( D" C# C/*
  c  U& ]" B2 f* @ * Copyright (C) 2009 Texas Instruments Inc3 Y* w3 {; w$ Y  W1 q
*
4 ?+ H6 ~2 h- k% X * This program is free software; you can redistribute it and/or modify
2 J' k- `& Y/ B4 a# Y' V * it under the terms of the GNU General Public License as published by1 ~* N# P5 Q; K' @( x% z
* the Free Software Foundation; either version 2 of the License, or6 Q, Y" |7 ?  V  k+ G
* (at your option)any later version.8 ]1 x) l, L: o7 W, w
*
$ G( K% T, K- t3 @ * This program is distributed in the hope that it will be useful,
) i. v0 [& t0 m  x* W3 Y2 L * but WITHOUT ANY WARRANTY; without even the implied warranty of
/ a; ?& Q1 {6 H! _0 o; x0 \/ M * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 A+ x! N2 l# Y * GNU General Public License for more details.+ i1 k1 M9 D4 T9 ~$ K; c) U$ B
*
7 t) D- l. G- B * You should have received a copy of the GNU General Public License
, a7 w  _. d! j# L * along with this program; if not, write to the Free Software
9 q& z' o3 M6 a9 d2 J/ e) c6 ] * Foundati$ u; f4 H$ ]8 |& c6 L. W2 d' \0 H7 k
*/
- c  Z. L& w9 c* ^#include <linux/module.h>' W! Y% i4 [9 {' j" v
#include <linux/init.h>7 s1 N3 \* v/ D8 v4 K& b7 e
#include <linux/errno.h>
) [( w6 x" G! j' |% Y#include <linux/types.h>
/ N5 S) p, K, Y0 W9 e#include <linux/interrupt.h>
5 \1 l, `4 K0 A. |3 }#include <linux/io.h>
2 A9 l" y& [/ f4 L! ^#include <linux/sysctl.h>: \7 v0 h. w3 N+ z8 y
#include <linux/mm.h>4 [" y, T/ @/ J7 u  V/ Z
#include <linux/delay.h>2 O5 V( c9 A3 E
#include<linux/kernel.h>
1 a0 P% ~' M6 z9 H# r#include<linux/fs.h>
. L8 ^4 U/ b+ ^#include<linux/ioctl.h>) v' {+ f- [! l& F( n' g3 q* F
#include<linux/cdev.h>* ]# \! P5 H" [9 C' {
#include<linux/kdev_t.h>
9 r0 T2 x+ T5 P! `/ Y#include<linux/gpio.h>
$ z- V6 F. r0 Y' i: H. F6 k$ s) i#include <mach/hardware.h>
+ z2 X! @0 e0 S/ ~) v2 I#include <mach/irqs.h>( {% \: o" H7 p- _! K! t9 Y
& T) T2 j# h! S4 m
#include <asm/mach-types.h>$ C- r* G  R% j
#include <asm/mach/arch.h>
7 U+ ^$ ^7 \/ z: b' h( j#include <mach/da8xx.h>
, t  ^' s* e* \3 T% f#define  SYSCFG_BASE   0x01c140007 k: I. k( O1 p3 D& s1 ~$ P5 y
#define  PINMUX1_OFFSET   0x124 3 p  W+ e! K1 r! q% {% M
#define  PINMUX18_OFFSET  0x168 9 H- }! ~8 q, R% u  Z
#define  PINMUX19_OFFSET  0x16c* F1 W- l& \2 s% p; ]' Q; g) S
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR5 J# L' f2 n( o3 c
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR; ]5 i0 @* \2 e- z2 u- W' ?7 ]" Q
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
8 H# q/ {8 j5 H# T+ E9 K6 Q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" X& `, n, q! z  s1 l#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' ^6 l. i5 v" Z$ a% P- T6 \7 a
                            0 v& d7 @% Z) X( @9 ?
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
2 K! j' _2 S* a" ]! N' ^8 B: a$ J; E#define DRR_ADDR      0x01D11000  //MCBSP1_DRR- i# i3 t  ~; ~" a* a8 p4 ^
//PSC
' E8 a( b- Y8 P+ ]  J: z#define  PTCMD_ADDR   0x01E27120  
; T# a" e5 C! A* ~9 O" s6 m#define  MDCTL15_ADDR 0x01E27A3C
+ `9 H$ e9 c( D4 Y. i#define  PDCTL1_ADDR  0x01E27304: q. F, r1 _, I+ o  W" L
//GPIO8 direction3 ^5 V+ U1 x. i- \8 Y( _' T
#define GPIO8_DIRECT  0x01E260B0/ o  P* Q3 E  B. b; P9 V( F9 A+ H+ `
#define GPIO8_OUT     0x01E260B4. S$ Q) |7 @) G9 y+ M( N
#define GPIO8_IN     0x01E260C03 d/ T# j. i/ e& V" W

& k- b- c$ ^# {! c//#define MCBSP1_RINT    99              7 M) s6 @6 _/ ^. u0 C& `
//#define MCBSP1_XINT    100  + ^4 s* ~4 N1 [3 e, V" w! u
static int MCBSP_MAJOR=239;/ z6 J$ j% w3 C$ w
static int MCBSP_MINOR=0;
! e0 S6 {% _! {8 ]9 U* cstatic int count =1;* W' C7 E8 u8 s4 [
& Y3 y5 T) L' F
#define MCBSP_NAME  "MCBSP-device"
; d+ z, L* s+ \5 \4 `1 e/ B
/ e) J& N' c0 m+ E0 Lstatic struct cdev *mcbsp_cdev;
( L1 b$ l* S( o: j  L  xstatic struct class *mcbsp_class;6 `, B0 W; m7 I8 _, J! k; w
static dev_t mcbsp_dev;
* w# r9 b+ d. L5 Munsigned int DRR_data;" z4 X% p: Q. W# c- D& @
unsigned int DXR_data;  O( z8 z4 D8 k6 N$ v, M
static int mcbsp_open(struct inode *inode,struct file *file)6 e. O- m& G2 V1 H9 [3 P: k; m+ q/ B
{
# T7 u/ V, Q1 L% {0 A$ B   9 I& \) e6 b- K- z
   //interrupt enable,initialized
5 L# P8 s$ H/ y, e% q/ b/ x   unsigned int temp;
% i- s( n- |4 b7 B- e1 G   //SLEEP_EN(GPIO8[10])---0
) D3 j+ i, p/ \" X3 ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( A: A& j. e6 b7 |3 D1 S) j
   temp=temp&(~0x00000400);( K. t4 S" B4 X: H: N9 v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* C7 Z. f% j9 S: \9 G1 }/ V' S  //RESETn(GPIO8[8])----0----1
- k3 [- ^! a" K# V6 g! i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% ~: l# S. q$ a7 \* L) w8 ?. i   temp=temp&(~0x00000100);
4 E- C5 x6 E6 h2 T' B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
) e* i( W1 u( M8 G. R   udelay(100);" D* j/ _5 a, K* B9 T0 ]" x
   temp=temp| 0x00000100;- P9 K4 k9 X' N! z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  q/ g! e7 I* x1 N& F# o0 Z0 w% X# ~   udelay(100);
1 [- v3 s% t. D   printk("open success!\n");
! o8 j: R9 }6 i   return 0;& S* d5 w* e( n
}
8 w- e$ S4 Z  P3 f) f1 ]$ A! w; q* I
static int mcbsp_release(struct inode *inode,struct file *file)
+ M; W8 V+ @8 [0 q0 l5 [{4 [* Q* w7 I5 q4 _9 [% g
   printk("release success!\n");
  m- I8 H4 K3 W* a9 V6 A1 n: L6 M7 \   return 0;
- Y# g5 K( _. h# ]6 z4 X- `}
* ?+ l/ V: l/ m) s: J4 I" G% M( ]& p0 {5 y. P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off), O: X5 ^: G% ]& w! j# A7 c1 ^& Z
{
0 M9 G0 h3 s% F" m# R    copy_from_user(&DXR_data,buf,len);
1 ^" S: k- j. t; i2 h' s6 P) W/ t    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       9 @7 [) Q4 l: P
    return 0;
. s6 K( X; T. G5 U) [" v 3 a! t3 d: m/ b6 x
}, g6 [" F4 G+ F6 V7 q3 Z2 I1 @

9 k3 n* E+ j4 D! Lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)+ A2 Y- m7 W$ A6 \' u
{ ' u* C$ [* [' a) C$ y: `% p
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: U( F2 W8 u7 ~
   copy_to_user(buf,&DRR_data,len);
( P& j0 C8 k0 f5 N! a- g2 t) w   return 0;
" V3 l% F; }# h$ S( g}
$ R; T8 h' F! y' S
, |4 S8 [# J% |* S' `# G' Y2 A' U
" f! P' i9 W9 n% ]7 W3 T7 T$ ^: E4 u* }static struct  file_operations mcbsp_fops=4 ^7 I/ |8 ~) n$ F: p
{; Y8 J0 K9 ^" C' _8 ?
   .owner=THIS_MODULE,% @6 m9 p) E8 m! I5 Z0 h0 ?
   .open=mcbsp_open,2 {* {$ G" j' M; X' \0 m' q
   .release=mcbsp_release,, C( ~& Y, j  m% M* x
   .write=mcbsp_write,
+ h# l  `, L' u' d: k) E) K7 T7 Z   .read=mcbsp_read,
) ~2 ~( G$ ?& c- J};
! E2 J6 Z, X5 x; R* tstatic int __init MCBSP_init(void)$ }3 Z8 {, f6 f3 b; ^
{' V3 x4 E1 X! e, ]
   int ret;
; s' ]4 Y* j) g. ~$ }7 {   unsigned  int   PINMUX1_REG_old;
7 {0 J! d, ^" r' L0 e! `0 h   unsigned  int   PINMUX18_REG_old;
+ m1 |! G5 B) A) c& O# Q' W   unsigned  int   PINMUX19_REG_old;
. C1 M0 t! o/ A8 E8 {! Q2 @   unsigned  int   temp;  
; h4 S, Z& t+ q3 {, Q+ A  Y0 F! g   if(MCBSP_MAJOR)
4 `# _3 R0 S9 w( h   {$ f, C9 U% H. C9 b2 I
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% {' g- Z9 q- V6 R" T4 Q1 S; D      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! E; H+ y( _& J& `$ Y% F# L   }
+ R1 n) a: f* h! n% x; Q3 U   else
* p  J& G0 Q' ~8 N   {, m8 v" m# K, _' s4 P# S' W
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( a. O$ _1 `, W: {2 K* C$ G      MCBSP_MAJOR=MAJOR(mcbsp_dev);
% K% o' w! O$ z& K" u   }- H6 T2 y! D6 p: |- M) C7 O5 W
   
, @5 ]8 y& }# O# Y: l4 N$ f6 U   if(ret<0)
$ g% t9 s/ `! V; R( ]   {
9 m+ R5 w% S$ I$ Y% S6 B      printk(KERN_ERR "register chrdev fail!");' D* I6 P+ R2 |- s
      return -1;
/ R% H- m, ]; \6 U. a! @: l. |  P   }
4 o1 ^4 S* S- [8 X* ]' C. e   
( j/ j( ?- f+ T' C4 u$ B   mcbsp_cdev=cdev_alloc();2 V6 H1 f4 t, H
   
- T: W. p4 E/ Z3 V7 t- W, a; Z+ u8 W   if(mcbsp_cdev!=NULL)
0 t' v) A2 H9 B6 F   {) M( T5 r+ t2 h: Y  i9 y- M
      cdev_init(mcbsp_cdev,&mcbsp_fops);: n# e/ G- H- b
      mcbsp_cdev->ops=&mcbsp_fops;
" R+ c! @8 C: |* G2 w( j      mcbsp_cdev->owner=THIS_MODULE;- |; s2 ]# I& K
      6 ~3 x3 K/ g; v% l1 W# |% [
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): K: _. j2 O; ?  i
          printk(KERN_ERR "register cdev fail!");3 G8 W; O$ }% N+ C% F
      else
) Y1 K2 K. T$ v* X# K          printk(KERN_ERR "register success!\n");
% C0 X6 s" _* K5 O; {" ?6 e   }0 N2 e8 U( |' i9 _# R& v
   else( ?# Z; f$ p1 o( T
   {( I+ |. B$ S6 D+ u
      printk(KERN_ERR "register cdev err!");- d6 g* i/ L' l
      return -1;
4 e( w5 v( ]: s5 S8 N' z   }- G. p/ S* d! q9 l. \& D& B  f
   6 N* E- L7 x, L9 f. h
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: R6 w" M! @- l; H3 K0 s! t; [
   if(IS_ERR(mcbsp_class))
" _% ^/ x7 V$ G+ w2 M+ Z. u% Z   {8 M6 B6 y: C8 H: H+ g
      printk(KERN_ERR "register class err!");
5 l: P' O, [# V& \   return -1;9 i% m5 m! b1 j# o& T" q& m
   }7 ]. Y' L  D7 r) i+ H" |: R
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 {2 t! l; e/ E% T; ?/ Q8 H# m0 C8 {9 W) j9 @3 g
   //PSC
$ M* ]5 w. i9 _- Q( Q   //add Enable MCBSP
% \: M# x) D8 A5 W# G+ G   //test* N5 f' e6 I6 ?( L. k  C# e
   temp = 0x80000003;: g+ ^/ t: G' d. e: ?: Y; x
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; n3 S) V. g" c1 D- R( k# ?7 I
   temp = 0x00000003;( T7 B5 |8 m  A0 I
   writel(temp, IO_ADDRESS(PTCMD_ADDR));) t' S& b0 x  k5 X) x3 n
1 d8 g4 }1 e9 p# @4 D& E+ A6 C
   temp = 0x001FF201;
+ U! W3 p# P! m. k   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% h1 I7 r; U& Q: h- Z* z5 [   
& t1 U7 {5 j/ M+ `' R   //PINMUX  
3 C4 b9 W1 E* z# K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( H6 z6 k% Q0 _8 _9 L   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
' |4 w4 M  s- r+ N   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
/ C; o% [! P+ `# I8 @" {   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- X  X2 A+ d+ S5 j6 u3 _   
5 y1 @8 w2 K2 Q" W; X, g) K   //SLEEP_EN,EPR,L138_SHK1,L138_RC3 L1 j- M) E, G0 `  E# B
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 [) j2 u1 u/ T' o; F* G3 m8 y' v+ r   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   5 r! W7 K+ x6 ?1 `. o
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ D: D4 D- Y+ s: D4 p
, o3 R% o* L+ V5 \* d% V7 I& g   //RESETn,L138_SHK2
, ]/ _2 \1 d& a  n6 F* d! w   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
$ m0 m, Z7 k  I; O9 J0 R4 e   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   6 Y' X( o5 [3 G9 h! N# L
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 r( M# l$ l! n; E

' C* w0 S" r1 ]6 i0 P0 [
2 a6 U8 n! l0 i% {, x1 f' k  //SPCR Register) M7 X. u8 b. n! C. \; y& w( L
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- d* S/ Z) ^) {2 M4 n& ]3 e2 `! y5 h
  temp = 0x03000000;//(DLB=0)
0 y5 C# e# P; V- Y: ^2 W1 P9 [+ J // temp = 0x03008000;//(DLB=1)( E4 m2 S0 W% t& J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset& B& i: P6 D+ X1 a4 ]; v" K
  temp = readl(IO_ADDRESS(SPCR_ADDR));
# Z% v! t/ d5 z  printk("temp=%x\n",temp);! ?' A3 ^& y( q- D& r, ]; e
9 c- Z/ O3 N% w- A
   //PCR Register" }8 G: ~" G1 F* L
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& b4 h3 i# R" ]4 `  // temp = 0x00000F0F;+ q4 P+ E0 _3 X# N! S. [
  temp = 0x00000B0F;
# }% \. ^& N- c: e2 `- X& [  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
& C7 J0 }- Z- H4 I5 u' K6 H* |  temp = readl(IO_ADDRESS(PCR_ADDR));
3 C( W! p6 x7 t0 R% m: x& E' O: u  printk("temp=%x\n",temp);  
+ r/ f. u  c: p" h& n2 ^" }6 X   //SRGR Register' R- E9 h( a6 h! o
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ d: T5 [- k1 y+ X: U) T
//temp = 0x301F000B;, c  v* `# l9 M5 o- k1 v; R
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ C& y2 k6 f, L# |3 W  temp = readl(IO_ADDRESS(SRGR_ADDR));
) H( r" [9 Y/ D# ]2 I0 ?# d  printk("temp=%x\n",temp);
) D8 o* Q5 c3 D* {1 s* j. N   //RCR1 U4 I; u1 J% `7 M0 X; @
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* S' n8 W. n4 X8 B& l   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ T0 X( n* k/ k2 N( Z( w" m   temp = 0x00440040;6 X" y9 a" B2 ^* a8 ]
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
9 |& J/ ?+ V7 @4 V) I2 ?   temp = readl(IO_ADDRESS(RCR_ADDR));  ?6 i+ m4 z& S
   printk("temp=%x\n",temp);3 l5 L' n$ g1 N$ R$ ^! N
   //XCR" ~4 }. {, o: b- T. _' X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1& p8 L5 p6 T% s% Z: M  J- i! W
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  m2 a* T% p( g( u  K' S   temp = 0x00440040;7 y. {5 K/ n4 q( U4 I
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
' O* A2 o  J. \0 l# y, T& j   temp = readl(IO_ADDRESS(XCR_ADDR));
3 I: K! U( [1 B   printk("temp=%x\n",temp);- u9 z. j/ y. E  o
  udelay(100);
7 ^$ Y2 ^- l# W8 S, x5 g5 h# a( p/ B  //SPCR Register5 K6 L: {# \3 S
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 A: j1 ^" c7 Z( Y  J* u6 s( z6 O
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ Y/ W" e  t, C
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled- F8 r5 R  L( d
  temp = readl(IO_ADDRESS(SPCR_ADDR));0 X2 r4 k) B* t8 s& R4 U
  printk("temp=%x\n",temp);
' k/ x' r7 Q9 q9 Y) W( A  udelay(100);- ?! @  o. t  E% U; E+ K3 r

# e) N+ h7 `0 ~/ Z' C7 H8 d* @  //set GPIO direction* l: i2 `# j: Q8 {3 D/ D
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; z' J" x! F. N5 K+ e3 t6 S
   temp = temp | 0x00000100;//EPR----input  ?* A5 m. S, ^5 v, Y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 W0 j! e! |0 c' f3 i' c8 ]   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . u4 Q- u$ g8 Y4 H# {! g

% N' ]3 v* |& e7 W/ K% w   return 0;
1 V- k) n7 R/ |' n- w}( i. G( |8 D" `# s' s) ~* M
static void __exit MCBSP_exit(void)
7 _$ Z( N3 j+ C9 x: E{
' b6 d6 W; W# ?- ?# |0 I   printk("mcbsp chrdev exit!\n");
& i/ e8 q4 Y8 f4 C+ n   cdev_del(mcbsp_cdev);
( I, B1 A" _& h   unregister_chrdev_region(mcbsp_dev,count);$ ^' q' n. Z5 T9 f) k3 v& {( Q; `
   device_destroy(mcbsp_class,mcbsp_dev);
( }- I( u, k0 k. x5 \! O$ ~   class_destroy(mcbsp_class);% T- r# ], O1 {4 v
}
' Q- c. C; `& W* O. _4 qmodule_init(MCBSP_init);
  m0 c# Z7 F  A0 J8 D* ^( Z$ ^. vmodule_exit(MCBSP_exit);
( }( x8 _+ L' R; e) l* h/ d0 j: a/ l. e/ u
MODULE_LICENSE("GPL");2 [3 q# @  I& G) K( [; q. L
# q  l2 K2 U; m9 f
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! m8 o, u: _8 n! j9 b
我的应用层的测试程序如下
+ ]1 Z; g9 G6 K/ V0 p/ ?#include <stdio.h>/ q1 Y6 H  C, d: i! k+ b
#include <string.h>
2 \; e: z8 B6 a#include <fcntl.h>
5 `  f+ P9 b, h, e6 U5 W#include <unistd.h>
  O5 v/ @/ i/ D9 B! d7 ~+ s& c#include <signal.h>! A6 }* `6 g, B/ d0 J* F0 X7 a
#include <pthread.h>       //线程0 Z' @4 c5 {! W9 k  C
#include <stdlib.h># {. d5 U" Y% T: F4 G3 \: J- O
#include <pcap.h>          //捕获网口数据
7 \& _4 {6 f: v#include <semaphore.h>     //信号
1 L2 w1 a0 v$ K7 r( v3 j#include <sys/types.h>     //消息对列* X$ {8 L/ p% e9 \
#include <sys/ipc.h>       //消息队列. C8 z- U, S9 r) I+ Q* ^+ q0 n0 g! d
#include <sys/msg.h>       //消息队列$ E; x' s* D7 Y
#include <sys/select.h>
7 M7 A7 P' P- ~* R% k3 y#include <sys/syscall.h>2 p7 _6 M) c2 t9 b
#include <sys/stat.h>& q! R( X. o- Y) c% ~" H
#include <sys/mman.h>
4 i1 M& u% ~9 J#define msleep(x) usleep(1000*x)" |* X0 m' _8 \" v7 s9 F
) y1 S, D$ X' k# j+ n
int main()1 z0 V8 Z" n* u4 Z* t$ E
{ 9 f% d# A* {( g8 M) N" S
    //MCBSP,ARM与AMBE2000交互设备
/ B4 H0 j. ~9 A: Z. O, h int fd;
( P- G2 Y5 E& W( ~5 B' | unsigned short data_write = 0x5555;
! V: f$ B* z' z- G' H6 c6 R0 m1 {3 ?- c unsigned short data_read = 0x00;
5 z+ _; T- h+ s6 V% ~! [  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* B1 D. c8 k' p
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);5 |' U( h* q8 g8 j* A9 a+ C
   
2 n7 _/ s0 l3 w) u  if(fd < 0)* X: ?- w+ j& H2 z% _- g& i5 T
  {0 {$ n4 p4 s3 a4 q, Z  O* ^2 [
     perror("open failed\n");, X- I4 Y& z4 g& M+ S1 J  E
     return -1;: a  u: V; s8 y6 a
  }
- ^* A+ F* k1 U: x1 G  
5 A6 S+ W# n9 h' I; q( u  while(1)
$ s4 V$ P4 y( c, W7 Z$ q  {# G9 J2 C. E& n3 w) C! T
   
7 U4 N2 r. b) B2 ^3 r% |8 B9 w   //AMBE2000每次读写是24个字为一帧
; r+ @2 T& k9 g6 j4 J   //写数据时将数据在底层存储起来,等到中断的时候再发送4 v& [/ _7 M( ~5 j! \0 f1 j
   //AMBE2000输入数据是以0x13EC开头的
, \$ c! q- l2 u% m   write(fd,&data_write,sizeof(unsigned short));8 Z& Z9 H+ g' F9 r/ q1 _3 e
   8 U% \/ U# D8 h& k
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  0 V% J; n) y/ O8 T5 _
   read(fd,&data_read,sizeof(unsigned short));  D, ^( L- @" p+ Q# }0 E6 v4 R
   & E3 t6 c( I; U6 A2 p" Q- N
   if(data_read == 0x13Ec)8 Y4 s6 p: [4 N. z* D0 ?
   {* P$ v, o5 x* E8 y; h2 E3 Q
   
+ O+ y' h. h+ J2 c+ \    printf("data_read = %x\n",data_read);
& a: O- e! V2 o" x+ X  L0 h8 }   }3 V7 L+ |( q7 h+ S9 h& s8 l
   4 i- N9 |! [& }$ J2 O
   msleep(10);2 |2 ?0 k* _- U8 J
  
1 b% @! f3 K& n  /*+ D; G) |" K. ]" H8 A# A1 M
   ioctl(fd,1);   
& r  Q, }) H- L+ r' }3 S, j sleep(1);# |* m. F+ ?' W2 X( k: D
ioctl(fd,0);% A" V1 E  @6 Y1 j5 y. M% d0 c
sleep(1);
+ s, f2 c& Y% U8 I */
* s/ l$ z4 u# S) ]5 N0 x' L. Q  }   
( K+ w9 o6 S' I return 0;4 c& Y* S8 ?6 ?0 @

0 K+ x7 j( K! i}
+ Y7 D4 @) t+ ~+ W! n! q
$ d0 B( E$ j9 T* O1 T( y' k多谢各位指教,谢谢! 急
+ J2 P7 q2 M: E" P$ x, G: _7 t8 c* F+ Q& T
9 w5 c! l# c6 j& q! ^/ f+ e0 J
' v# s/ K3 f5 ^1 E9 g$ X( d" J( v

( h# W# T# }* \4 s  `& t. V* c
: C6 f  N' w4 d8 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 03:03 , Processed in 0.048306 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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