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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- e0 ?% |7 h$ F, a/*; B1 c& o) G* [. Y. b! y
* Copyright (C) 2009 Texas Instruments Inc
7 B, T; p1 N9 U% J0 C *& c( `  \2 W; r8 ~
* This program is free software; you can redistribute it and/or modify
, P" @2 ^. ~" n, y7 } * it under the terms of the GNU General Public License as published by
1 S9 x$ H8 T& l, s) u- ?0 \6 M * the Free Software Foundation; either version 2 of the License, or
1 N3 M5 O1 `$ ]# C- ? * (at your option)any later version.
  }& Q8 v9 d1 ~8 [2 B$ j6 M1 n4 p *
" W& W3 f, I% e& W9 @8 _- E8 r * This program is distributed in the hope that it will be useful,
% M- A* X7 b$ \8 u) _ * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 T6 ^+ v: K2 I6 s * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% S; i6 C! [& D+ G' {
* GNU General Public License for more details.
! V% Q# O- G% X; d4 n- R! t& k+ m *
9 U$ K9 ]2 {9 ~3 Y * You should have received a copy of the GNU General Public License
8 b; Y* w1 K0 b' ], ~, p * along with this program; if not, write to the Free Software
& O( K: Y2 a9 |; b) b# X+ H; F * Foundati7 y& N4 l) P2 C% H
*/
) c9 k6 S) e' e- e#include <linux/module.h>
/ A# ]3 H% Z" C5 H6 A#include <linux/init.h>6 ^. [8 B" I  e/ e! I" s
#include <linux/errno.h>
% g3 W; k) K8 A3 U! f' T#include <linux/types.h>. F8 b7 o$ p! H' ]( o/ m7 L
#include <linux/interrupt.h>% V9 F; n2 C7 C, Q
#include <linux/io.h>
( l. s3 t3 H& u/ [% e1 }' i8 ~  @1 Q#include <linux/sysctl.h>  D+ j4 }: Q, c
#include <linux/mm.h>0 j$ S3 b1 ?+ d0 _5 m
#include <linux/delay.h>
5 ~4 C1 D4 w2 J" q% C- S) L/ ]2 S+ N% K#include<linux/kernel.h>  d" m& v) T& J7 w3 F; F* J& A" n
#include<linux/fs.h>3 N6 G9 F0 j# `. m/ z# i
#include<linux/ioctl.h>/ H8 B: b( V0 r& q3 Q! n+ [
#include<linux/cdev.h>
% M; v# h7 O( C8 y  ~#include<linux/kdev_t.h>1 s. Q7 [& A. D1 A4 u$ {1 L: K( P6 A
#include<linux/gpio.h>+ F& O4 F2 N6 D
#include <mach/hardware.h>
& }' o- @( k& T0 k$ v#include <mach/irqs.h>% g! R1 v4 U* [. a

5 \4 s) K$ i4 K  h- t* {0 C#include <asm/mach-types.h>; u- e5 v, @% k: J4 d; B9 ]
#include <asm/mach/arch.h>
7 @1 K+ h) N" L2 o3 Z8 Y" f#include <mach/da8xx.h>5 C' a7 ]$ g& V1 [
#define  SYSCFG_BASE   0x01c14000
5 K# ?- Z4 \3 w- W+ s, ]" O#define  PINMUX1_OFFSET   0x124
0 N% W1 |  R; X#define  PINMUX18_OFFSET  0x168 . L  d$ o1 O) T" U6 Z& C' g
#define  PINMUX19_OFFSET  0x16c
% s" O& }+ x' `2 G) a9 `6 [6 X#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
8 M" J1 N: s/ F#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 Y. R: p% e0 l3 F" g. D
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
3 K' r2 L" _0 |6 l#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR6 U! t# K- W/ W
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
& u3 y* U0 L/ l' l1 F                            7 g6 F2 w+ H# E1 {9 F
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR( O0 q$ M4 p1 [3 l3 E8 _
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR/ D1 @; I  z7 Q& |
//PSC% D5 ^# ?# K' D& y! N
#define  PTCMD_ADDR   0x01E27120  
; b$ Q+ ~) c8 P& L& ^, A+ x#define  MDCTL15_ADDR 0x01E27A3C4 }! Y3 Q( R1 b! |$ s' }
#define  PDCTL1_ADDR  0x01E27304
/ x% f  a- M% J) o( P4 B//GPIO8 direction9 }4 \% ~/ |0 Y! c
#define GPIO8_DIRECT  0x01E260B0
: O5 W" R* n4 m: ^, ~+ i: u#define GPIO8_OUT     0x01E260B4
8 a5 B) d5 t) Z. l$ N' K; O: a#define GPIO8_IN     0x01E260C0
7 z* X: H$ x' e9 h/ W# A
0 ]( l, ?* _$ e//#define MCBSP1_RINT    99              
! C+ q8 |; W( u+ F( D//#define MCBSP1_XINT    100  
+ z' ~+ w# B4 j: Ustatic int MCBSP_MAJOR=239;
5 F+ W( O* C, L/ S1 {0 \static int MCBSP_MINOR=0;& G! N+ u2 H' t4 r- N
static int count =1;
) l" e/ S$ b: L0 [+ f0 P8 m) y8 s
0 B3 W: v) `- L" y#define MCBSP_NAME  "MCBSP-device"" h2 a( Y+ L% @# o; h. ]; q" z
- G4 K% h' y3 z$ g; S
static struct cdev *mcbsp_cdev;
+ i6 n. Z" X6 P( ]- a( Z7 }" Mstatic struct class *mcbsp_class;
" }2 T- g* g$ r! o& pstatic dev_t mcbsp_dev;9 L2 f) [* m" I' i# X) F. i
unsigned int DRR_data;
7 y  A" L  j( w8 O( runsigned int DXR_data;7 `" Y2 Y* v" B$ G/ @) z
static int mcbsp_open(struct inode *inode,struct file *file)  ^- \7 ?/ o! _1 Y0 X* r
{7 P! f% C0 I. x6 }4 f' Y& z# b
   
# F) U. P9 X) q+ ^- Y   //interrupt enable,initialized! A+ \0 c, M$ Q3 Y% k
   unsigned int temp;$ c6 ~) r/ n4 b$ _8 E# K. P- ]; ^
   //SLEEP_EN(GPIO8[10])---04 W. Q4 z  a9 F) U* G
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: e0 O7 [! }8 h4 [
   temp=temp&(~0x00000400);
$ ]" l5 G' Q- E   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( `& V7 y2 V: }" S3 [) f3 k  //RESETn(GPIO8[8])----0----1; u  V$ t& e. Q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: c: W. P& n. V$ u
   temp=temp&(~0x00000100);* K  @+ U- L) m$ i) j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 d! R/ r) @5 h  f: ~) L  i
   udelay(100);: d  `* W; ^2 O+ Z3 ^' \! y. p
   temp=temp| 0x00000100;
3 I8 n( Y+ j. O) |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---18 C! t7 @" f4 d: _0 r4 M
   udelay(100);
, P9 T2 A% o7 M5 l; B- p; }   printk("open success!\n");
3 T& k0 S& k* p7 ^1 C5 }- V: r   return 0;
# {: G1 I+ x& w$ J2 T}, p1 l5 s1 R2 g" g! z8 ^5 ^

- ~1 N+ G  L3 Z' q# o# sstatic int mcbsp_release(struct inode *inode,struct file *file)3 n7 f& j" T/ A; L8 V6 _! E: e8 Q( B
{
, J$ |  \- N+ l   printk("release success!\n");
3 e) A( M; ~7 O6 o4 @   return 0;$ ?' p, R2 K9 r* u
}" V- _. h0 B8 u3 l- K& Z. T

+ B* |6 d' U$ e2 }static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% e: v5 v9 ]4 U8 g& G7 p$ j) D# q{+ Z) n7 u$ S' R6 H
    copy_from_user(&DXR_data,buf,len);5 y8 o+ E# {$ K( K+ L; }' {
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 H0 w8 h6 |# M7 I0 }    return 0;
' C& w6 W/ ?5 q. l
  ~# W, t7 w6 f% Z. b}% e  k+ A% e- _' v

# `- g1 t! G3 v1 [  Bstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 O4 c$ _0 A8 ~+ C& q! y: h: W+ f( N0 G
{ 9 J# s" c6 ]! P* p- W# Y2 v8 o
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 W! L' B3 {# A& Z/ y
   copy_to_user(buf,&DRR_data,len); ; [- G! S0 Z/ W& z6 O2 Q; B
   return 0;
5 F' P: }  X9 r5 y0 S* u}
5 Y+ R/ q' l$ I7 g% g# a# H: p' }* r- P3 \* _% c# y( W

4 H! I. w; Y, q  ]8 kstatic struct  file_operations mcbsp_fops=( t  h! r: M8 h( C
{" ]# {: f: T5 B1 H$ F* v
   .owner=THIS_MODULE,
' G, I$ d/ |0 P. F3 ]8 T( b3 X   .open=mcbsp_open,
6 I/ r: O2 M2 C: C9 r4 _8 T& l; n3 k   .release=mcbsp_release,
7 q9 C( _- |" b7 G0 G   .write=mcbsp_write,
' o, U5 _2 L% E- X& q) Z   .read=mcbsp_read,: @% f# O& P' `
};+ w5 X! j1 Q. N
static int __init MCBSP_init(void)$ s3 j' j( k  k6 \
{
! P* \0 b. x: I! [+ a   int ret;
$ L1 F6 r0 r& S+ s3 ?   unsigned  int   PINMUX1_REG_old;7 X! w3 l1 B/ d5 ~$ D. D7 ~6 R
   unsigned  int   PINMUX18_REG_old;! B2 U' j' E( C3 `& b. u. h
   unsigned  int   PINMUX19_REG_old;' F& h( r5 m2 P
   unsigned  int   temp;  
5 f7 x) S+ b/ a6 R8 _3 f9 t   if(MCBSP_MAJOR), }4 d( B8 q# a% s* W1 f0 v9 x4 Q- E
   {5 r  g- M+ F( H
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
4 m% A0 U2 Q/ l% x  @      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
; e' _* K: o" @+ a3 B   }  }0 F+ `7 e: h" a
   else
1 v; U: [1 K. n  n5 p2 [; k6 u   {
7 L" F; M- `% q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( f) H4 O. `2 g$ W) I1 i, q8 U
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) Y* v5 c% C" \) N" o
   }4 E* t' Q! l6 h/ q3 ^- m! L: _
   - V7 i. P7 c2 w- `& p% l
   if(ret<0)
2 n+ m( a* q2 L( Z   {2 o* d; F' n7 D) H( k
      printk(KERN_ERR "register chrdev fail!");2 F2 p; z1 q' R- D9 V% }
      return -1;* V) \. `, n/ w0 F/ W3 U) T
   }
  E5 L3 R" h+ q" N+ g5 Z( f! Q! o   
6 _0 `& R! ^7 k- R! e* ]   mcbsp_cdev=cdev_alloc();; G" S3 x  J: k
   3 k' p+ c2 {9 x- V) \0 b& E3 C
   if(mcbsp_cdev!=NULL)  ]" m" P: T- _' b1 p; O* ^2 S
   {+ K7 M; v+ M& C+ f. v
      cdev_init(mcbsp_cdev,&mcbsp_fops);0 X/ ~& x0 F3 J  B7 N& a! P
      mcbsp_cdev->ops=&mcbsp_fops;
8 v  n; C) j; A+ |/ C, I& Z      mcbsp_cdev->owner=THIS_MODULE;
4 A& |2 C  m7 F3 V' a      $ ?# k0 P- c4 E" j
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))7 O- `2 o! j# I: l3 M
          printk(KERN_ERR "register cdev fail!");
4 e; i9 ~7 n- o      else
( Y" [! C0 _0 D9 n% r          printk(KERN_ERR "register success!\n");: ~. J- N/ B# L, X$ r$ S, r: s
   }
2 P# X) z# K6 x; }+ d   else
! ~& T; E1 X0 ?   {0 S$ A8 r* X3 ^, A3 C  U' x
      printk(KERN_ERR "register cdev err!");  y) q& p3 y$ I4 J) F/ V
      return -1;
0 |% y# z* }4 F( ^% r   }
9 I  P0 U2 |" G: a2 `- g+ R   
# M: `" G" P' b2 C( [  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
8 i. J# G* z) d( `" ~9 `   if(IS_ERR(mcbsp_class))
7 o, `7 E9 ?9 A( p9 }   {
' Y1 l: h" |% X8 q& u      printk(KERN_ERR "register class err!");% Y( @! T' f6 G$ _! R
   return -1;
* g  b( v* g8 d6 K' c  L   }- _+ \3 q3 {: W- Q) z, k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 N2 w; h4 Y  v" Q- x  x+ N- J- v+ @4 e
   //PSC" T8 s5 p0 J$ ?2 i. E, s! |
   //add Enable MCBSP4 c: e4 q: s6 R2 W  X! v' R
   //test
5 W% K$ x8 o6 ]6 j9 i& A$ S" c   temp = 0x80000003;$ }' O5 ?: Y$ U% v$ _- G9 X& j2 e3 J, \
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 |* u( R0 o% V; T5 P1 v8 b8 o* K   temp = 0x00000003;
) {' l" K5 F2 b: ?   writel(temp, IO_ADDRESS(PTCMD_ADDR));! l/ J. |3 R! Y. G' q) C
0 z" e+ U  F2 \% u
   temp = 0x001FF201;6 [2 z/ e# x, t& N  f  w$ b
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% \0 D, z- W' T: G   
, w' _" f* X8 Z9 C- }   //PINMUX  , c5 c0 B' \; \7 C- n  |0 [
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" Z' h! M4 Y7 B+ @8 B- U   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
, I: g4 r( U$ }8 Z! @' O   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   4 i; t! L) Q( W
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  N0 m$ Q3 T5 F# k! _$ \- f; e( L) J   
; Z1 C; _9 g; w* q. Y0 J8 W- w   //SLEEP_EN,EPR,L138_SHK1,L138_RC
& N: p6 ^$ v+ {: o   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
* s$ \2 T5 K. U/ H  D. |   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
6 B5 b" G6 K% p  z" z9 L1 X   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);. F. U& U1 u0 S

: e/ a1 G, u/ S, `- }! z! U   //RESETn,L138_SHK2
9 e5 m( o; N, B, h$ p   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
3 z$ |% N, V$ [. T5 W* `   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
+ g8 V8 g1 G& a! u, u' [0 V8 t" i   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; S8 \8 Z9 W! l6 G) B3 N - R$ F- l* y8 T. Z" T3 M" q
4 _3 {5 a# M& e8 T, P4 D3 n0 ~0 v
  //SPCR Register
& J! `. r( E$ O8 P; A( Q; S7 a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 ~5 k( R1 F: @3 }& \
  temp = 0x03000000;//(DLB=0)
+ a: R/ y# ^5 p. s // temp = 0x03008000;//(DLB=1)
$ c6 l9 v. b" {4 ]7 z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
+ O- ?& S4 x% I4 [' ?  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 p2 @# e2 I& E: e5 q1 ~/ ^- ~  ~' S2 [  printk("temp=%x\n",temp);8 }& O) E( S  i7 `% H5 S

9 D. J; F4 B  v, R7 A# w$ A' l   //PCR Register
5 Y# q, y# C8 i6 e( p. }   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0. b- S5 o# _' g% Y  {. u5 Z
  // temp = 0x00000F0F;
$ ?% e' m; g/ z. h( N  temp = 0x00000B0F;7 v3 g. W- c; v' {" v+ i
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized - P4 E! k3 |' K; S+ R) e
  temp = readl(IO_ADDRESS(PCR_ADDR));. G& e0 R  x& K) `8 Y
  printk("temp=%x\n",temp);  + B) {; W1 r; W; k1 V+ J8 ?1 s
   //SRGR Register
8 r% F# V# d! i- t5 f   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; f0 w1 y0 b# | //temp = 0x301F000B;/ T3 u, n* \  s: `  S! s/ }
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) c! \* a) g/ _+ O. V4 m8 p* i0 y/ K
  temp = readl(IO_ADDRESS(SRGR_ADDR));
' M. d! B/ w& ]1 P; X) Z  printk("temp=%x\n",temp);
: T, x! v/ t, F   //RCR+ F% b: v! Q% {1 s3 E% h7 R
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,  V9 G7 k2 P- a3 ?1 l# n/ H+ X
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 h1 r; h8 z* s; Z7 F, W
   temp = 0x00440040;3 ~/ R( z4 x" q! U
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& h- X2 @" F( ~! Q# y. R   temp = readl(IO_ADDRESS(RCR_ADDR));9 m) ^0 q. |6 F/ ?3 P- |; B! g
   printk("temp=%x\n",temp);
4 ]1 [5 u) n( T$ m; S   //XCR
; L" @" S( j  ~3 C3 L   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* U+ P+ ?6 }; z5 H, t   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. j9 {+ i" Q; }% }
   temp = 0x00440040;
, x; U( s! g! z" p2 X4 F; B# u7 u   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
4 f4 L) {0 K/ E! R! y6 ]: z/ T   temp = readl(IO_ADDRESS(XCR_ADDR));
2 g+ B) H( P; L1 H   printk("temp=%x\n",temp);
5 }, C8 \0 B% g* w4 U; s* J4 v  udelay(100);3 W/ Z4 B, h$ J# i
  //SPCR Register
+ T" e5 O, u9 D, r) R( |  R0 j1 S  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 ~% O+ B  y& y+ M% w  temp = 0x03C10001;   //DLB = 0 VS DLB = 1! W1 `7 X5 z0 l2 b2 n0 K8 U3 x
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
4 b" L2 E" A9 w5 |  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 [0 d8 B4 N. N1 L  printk("temp=%x\n",temp);. `% P( K- C3 K' E, n9 p
  udelay(100);
1 z# X9 q0 h) X, U6 C" T% q1 p& h0 B) u9 D, P* M& Z3 M
  //set GPIO direction
, \! u" ~; h" H6 O   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));1 i  `+ ]7 p# f' t& `5 ]% z
   temp = temp | 0x00000100;//EPR----input
& s# i, q5 [; I, |  I   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ b! h3 H+ P. y9 K- N   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & e6 \0 _% b" K' @1 m: Z1 q

0 y( F. A% B, g- X: E, z   return 0;
7 O" l. b  K7 B/ @% N3 F' J/ L1 ^}
: ], T% V; S7 W" |static void __exit MCBSP_exit(void)6 M+ u$ {% _  P: C
{5 M& o1 f0 U7 l6 \1 g
   printk("mcbsp chrdev exit!\n");( `/ ~0 S; U$ r4 x1 T: V5 D
   cdev_del(mcbsp_cdev);
5 g( B2 q, [4 C) i* Z   unregister_chrdev_region(mcbsp_dev,count);
, }9 Z( H0 O/ L7 R/ G" H   device_destroy(mcbsp_class,mcbsp_dev);& L% Z2 d4 U8 r0 j5 c/ m
   class_destroy(mcbsp_class);% q# |  H( |7 `
}
' j8 s9 x% b, Vmodule_init(MCBSP_init);
  L* ~* c1 ^; i" z! s9 V- _" |" smodule_exit(MCBSP_exit);
) k1 B$ l0 h5 W' x/ N5 t1 G1 r8 p# a1 ]6 `( V
MODULE_LICENSE("GPL");/ z5 e+ V: |5 u9 [
% |* o- m  F0 b- @" J$ i% r1 v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 M4 m/ ]0 A( D  v4 H' E" \/ Q
我的应用层的测试程序如下8 w: y3 H2 S: {: Q. D
#include <stdio.h>
% ?8 F* z5 U8 _' b#include <string.h>% D" |8 t# {/ _  f
#include <fcntl.h>) S+ u; N. A& \4 m' s/ K  I( }) o
#include <unistd.h>
7 {' x8 m* S  O% l2 H! X#include <signal.h>
' X+ \8 ~! }; [9 O. m" [; e#include <pthread.h>       //线程) B9 v3 `/ |1 T6 ]
#include <stdlib.h>
* W; F. M) M) g$ y' V#include <pcap.h>          //捕获网口数据
0 i8 B2 N! M6 F! ~6 V: ^#include <semaphore.h>     //信号
- C& A' B0 v; I0 _9 a#include <sys/types.h>     //消息对列9 N, f) V! E; y$ h+ E
#include <sys/ipc.h>       //消息队列0 K- _5 \( B: j! ]0 ~
#include <sys/msg.h>       //消息队列
8 e/ O9 u. ~# E, W#include <sys/select.h>% `+ C7 `# g6 v9 C, x5 o  \) K
#include <sys/syscall.h>
# j/ S+ H! s+ G#include <sys/stat.h>4 \3 D1 K4 c* M0 w7 v2 z3 x
#include <sys/mman.h>) ^& c& H* r7 @5 M
#define msleep(x) usleep(1000*x)1 P5 E  N: m1 Y1 y( o

/ v/ u! Q  [% ^$ X  g1 ~int main()
1 r) `6 f8 i; Q7 Z. H% e{
/ k9 `8 B. C4 j! q    //MCBSP,ARM与AMBE2000交互设备) L8 ?# c/ h" G# }0 m5 [3 k- D% c: B
int fd;
. a  u% I( \' A3 q& P unsigned short data_write = 0x5555;9 j5 V. g6 ~; r* j7 `+ u" h1 N
unsigned short data_read = 0x00;
; V" V6 S) v: J, ^& [" `4 e$ G0 A" I  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# G  ?- F1 b! s& `& ]1 ~5 A //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- t3 I, @3 ?0 R1 A7 u/ s5 r   
$ f  s7 q' [# I  if(fd < 0)2 V7 o; t! ~7 u4 F
  {
% n+ m: I6 q6 p4 m% S4 S     perror("open failed\n");& Y3 s6 N/ F! ]# r5 `- T
     return -1;
, ~' d9 W4 H+ x7 |; K! `" d  }! S( P. d3 ]) o  ^% z
  / t3 {% x9 }, r7 W
  while(1)9 i# Y8 m* n6 t9 C( X
  {
  B# J' z1 V8 O& m8 U0 J1 g* T   
7 _7 x& H2 e4 a) q   //AMBE2000每次读写是24个字为一帧; x9 S7 }" [- z$ L4 D  ~0 c
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 p1 u9 A9 o8 R4 G5 o
   //AMBE2000输入数据是以0x13EC开头的
# r" ?5 u# R. C   write(fd,&data_write,sizeof(unsigned short));
* S. l2 K' c  q; Q   
* b) ?  C6 N' C0 q1 \   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  a' V! R& W2 B$ ^0 J   read(fd,&data_read,sizeof(unsigned short));! C5 v1 _8 ^* ^% ?3 y7 x6 C
   
4 V4 {# s6 [% h6 a4 m4 L6 Y+ l, R4 }   if(data_read == 0x13Ec)- F- H( m8 N! [3 Q) U3 _
   {5 h9 M$ ]* J) X( L/ R/ t/ M( r9 U6 B
   * J+ x; ]+ D1 |; z
    printf("data_read = %x\n",data_read);- Q7 @4 I( ]: P% ?. \& \
   }/ b" Q3 g& j' r5 V
   
* c. }5 f6 @. _) u   msleep(10);+ m) S. w/ m5 v" W) B9 E( p* G3 u
  , `! S/ |/ i" b2 }! ~/ R$ i
  /*
) ]& d* ]( ?4 ?, [3 X3 v   ioctl(fd,1);   . y# g! A4 @2 y( P
sleep(1);
* e: R& N4 f3 ?. o% H8 e, M5 t; n ioctl(fd,0);  n( q  y# O$ N6 H/ Z. I' |  M
sleep(1);$ i+ c$ K8 D8 b" P3 U* M0 J
*/
9 P8 B1 ^+ U' L0 @  }   8 h; Z3 c# q+ d" L. g0 G0 [
return 0;/ s7 t* ?9 I: r  ^, y/ q2 @9 H2 p# k
8 v: n& K- ?& R" V  ^
}8 S% ^% I; C! }' X/ Z) N+ J

0 t9 f; e1 `" z5 t; b) U. i3 @& a多谢各位指教,谢谢! 急
' y: x! ]4 z  p& |7 }+ C
" c* g6 n  S* \: ?* g# d% @. L' a
4 P! @; ]3 v2 }" \% x' s3 w+ ~& P& ~9 K+ D) G# s# Z

2 l- `% P& O3 _. N2 Q; m' x
# R6 z6 p1 d3 p+ x- M8 F* R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 07:34 , Processed in 0.046671 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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