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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 0 {7 w' W& ?; Z! l7 ?- w
/*
+ B# I! M" [: X7 l1 M6 o * Copyright (C) 2009 Texas Instruments Inc
# q- ]/ ]& Y& n# d, o8 S! G; f5 G *
2 Q' t  L8 _$ m1 a* a" c- k * This program is free software; you can redistribute it and/or modify% r7 o4 |$ h; E8 b
* it under the terms of the GNU General Public License as published by6 ]3 R- z% y, I( S% I1 ~$ X
* the Free Software Foundation; either version 2 of the License, or
& d* k% [; `5 G# q * (at your option)any later version.+ k( ?" \) ^% S& y# b6 i
*
/ W$ U* D" z- q * This program is distributed in the hope that it will be useful,
" u8 j8 [8 B4 d% @+ F' o# j( T# W * but WITHOUT ANY WARRANTY; without even the implied warranty of! I0 _( k. e+ M8 ]* s% m) T9 c
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, w  v3 w/ ]! ]& Y/ \" t
* GNU General Public License for more details.
# b; X$ e, a# E' }- X  H; S" W *
% T4 F  O% n6 h/ E' ?+ m9 B6 s  U * You should have received a copy of the GNU General Public License; s! _* h( K% X- v9 A5 h7 O
* along with this program; if not, write to the Free Software) p* Q% x% z' T
* Foundati( D3 i2 `" S9 M* D( I0 a- v2 _2 b
*/5 J; ?" |8 g0 J2 ?; e3 S8 K) F. U
#include <linux/module.h>/ g( }3 a. E" U, x  Q
#include <linux/init.h>
# u# N2 i2 M" s#include <linux/errno.h>& k3 F2 X8 y( Q. T( V. u; D; o
#include <linux/types.h>
3 s" G% ~9 M, B) k% D/ K0 l; }+ ~#include <linux/interrupt.h>+ `, ]. e3 h6 x
#include <linux/io.h>
! K2 n! w4 a% W6 F5 G#include <linux/sysctl.h>% y  B: q; n. f) _# u4 p
#include <linux/mm.h>
2 @7 s. ]0 R9 C# S6 g2 z1 X#include <linux/delay.h>
; ~) ?, Q8 k+ h* p0 k+ E' B4 e3 E#include<linux/kernel.h>
" j3 d! g- i( d: V- t9 |" A! {#include<linux/fs.h>1 ~8 q9 q( ]9 S; C/ ~
#include<linux/ioctl.h>' w) w5 |% r$ x4 s! h% ~+ B1 m
#include<linux/cdev.h>
+ l$ l" x) c$ G" L4 r#include<linux/kdev_t.h>
7 J" P9 [; X! B#include<linux/gpio.h>/ ~: f; @/ i/ g1 q
#include <mach/hardware.h>" j! _9 n! b* A3 [1 S: i! |& ^
#include <mach/irqs.h>2 ^- h% B9 o. K2 \* r
% K6 o$ s" d8 [1 `  G4 Y1 z+ p6 M" \
#include <asm/mach-types.h>5 _2 X7 p0 O6 i% Z
#include <asm/mach/arch.h>8 e. i' [' Y! r0 d" Q
#include <mach/da8xx.h>
  c1 \9 \# \: K1 e7 r4 V6 p9 g' F#define  SYSCFG_BASE   0x01c14000
/ I9 n6 w$ t; h- q4 }#define  PINMUX1_OFFSET   0x124 - D! q; S7 m6 v' q* N7 G
#define  PINMUX18_OFFSET  0x168
( I- w! }" [3 h+ @0 S; [0 K#define  PINMUX19_OFFSET  0x16c% c. l( @7 y+ j2 x% p$ T: i
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
+ A) j; [5 A. e6 P: L. H#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
2 l( x2 t) q  P6 n+ I#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& t; G# e2 [5 t$ s0 g" m2 I#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% B. W# Y! N6 G+ A
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ M1 k5 M: ?, F+ v9 w0 Q, @% X                           
+ S8 x! F8 x& D+ }3 d' z9 O#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! h, n9 y* Z+ d#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
9 i8 `/ g# ]: ~& D; _" M//PSC
$ p6 {! n6 {( C5 @. |2 N#define  PTCMD_ADDR   0x01E27120  
8 A6 O6 `6 M6 a+ y1 H- n#define  MDCTL15_ADDR 0x01E27A3C
$ D6 o. u9 Y" A" d' |6 W#define  PDCTL1_ADDR  0x01E27304$ H6 h0 G) ?* V9 `  N: L
//GPIO8 direction
4 w) U$ `2 \, e6 `$ G% j4 k#define GPIO8_DIRECT  0x01E260B0
0 q' a; x  C& `7 {" F#define GPIO8_OUT     0x01E260B43 `( N$ _  z4 ]7 p; m+ B% V
#define GPIO8_IN     0x01E260C0
) L( n3 N: h" E+ u5 X) [, X! P3 @( Z3 b1 T" A' q( L8 I/ Y
//#define MCBSP1_RINT    99              & _$ H! _6 f8 }1 k% {
//#define MCBSP1_XINT    100  
6 E4 [( [. K  N. {/ ]static int MCBSP_MAJOR=239;
% ^9 N# y' P6 gstatic int MCBSP_MINOR=0;
7 ]' w: w) N8 B+ J4 nstatic int count =1;4 X' K/ V7 }6 N, a

% p' i1 z' {6 r6 J9 ~#define MCBSP_NAME  "MCBSP-device"$ ]/ F( f/ @+ V) e" N1 A

/ ~) i, F6 F% E# B! {static struct cdev *mcbsp_cdev;
( u! j3 L5 m/ j: c) `2 F! Zstatic struct class *mcbsp_class;
& |0 ^& ]/ n0 K9 c9 {& Kstatic dev_t mcbsp_dev;
. [3 d. S5 e& C, vunsigned int DRR_data;
7 K6 x# c0 G' Hunsigned int DXR_data;
% e! i5 H/ e6 g! C6 U1 l* Tstatic int mcbsp_open(struct inode *inode,struct file *file)
; ^* B5 \% b0 w( B" j{6 y, w( V% g% Q5 q- a
   
- A: w- E& [/ a0 u" {   //interrupt enable,initialized5 |% ^8 c2 G8 A, g! B2 g( F" t
   unsigned int temp;6 V- M4 w3 b0 \% c
   //SLEEP_EN(GPIO8[10])---0
7 z. l# |3 [7 ?' t5 e   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 ?5 T3 W) \1 Q1 r9 h3 k   temp=temp&(~0x00000400);
/ V6 E) Z# P1 L/ `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ P9 L2 i5 I* k) S  //RESETn(GPIO8[8])----0----11 p; ^$ B7 K2 }
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 c( E! E' T1 s$ J/ M5 x   temp=temp&(~0x00000100);
3 ~7 C9 c6 y( g1 n- y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& b$ `6 ~2 h& \+ M   udelay(100);
' Z9 I7 f- e6 |- D3 F   temp=temp| 0x00000100;* E" w5 T2 y1 L; X5 c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) q5 t) m9 o( ~* t: j
   udelay(100);
# N# S- F6 g% v. d   printk("open success!\n");
$ B) U0 N" H1 u   return 0;
: b, ]* M) u3 X- H, c}
4 A: m' _! r+ s) e% }- k9 f9 E# ~5 J( ?6 A1 U: g+ ^7 X
static int mcbsp_release(struct inode *inode,struct file *file)
) |& }) t7 q! ~5 I  Y5 t& e- C{) j! m, F' h5 ~9 z& M
   printk("release success!\n");/ _5 ]) }" x8 x+ G7 U
   return 0;9 |7 b* Q6 k8 z
}) }- W9 Y( d, A, x) k
+ E& U; m% U/ B) ?! |6 o! T# B, C- z2 E$ ]
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 G& Y1 U& W3 H0 [9 k/ }
{
1 _, D( M! X4 [9 _' c    copy_from_user(&DXR_data,buf,len);
, }* z; z5 Y  D% o% Y6 b+ g    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       . k4 {7 J/ [$ ^, G
    return 0;
3 N. a/ {6 w; R; D( x
5 u/ T' H$ ?; [( _" G, R1 o}6 R$ S; u) _9 A; ~/ W( Q
; _3 z: ?2 t/ C6 p" R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
. R- N" e* X& d6 I4 ]+ N) |* f! G{ . O# ]& u- p& j6 `
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 o  Z" d% l1 _; i! z
   copy_to_user(buf,&DRR_data,len); ' T6 ~4 \- S: c3 w! A) q! M
   return 0;) ?0 x! y6 d( V: u. z
}- t9 j6 P* t+ ]0 n( g
! Y0 l% n2 A( Q3 G; |

0 E5 Y& [" c* L& hstatic struct  file_operations mcbsp_fops=
' c, i% T9 w$ {2 F4 b{
8 m( S3 L3 _% ?  {& o   .owner=THIS_MODULE," V4 i1 Y% a+ \5 c( C
   .open=mcbsp_open," s  i$ e6 |# c
   .release=mcbsp_release,% m! f2 |6 d/ l# _5 X# S/ R7 U
   .write=mcbsp_write,
( x3 l) c9 n- e" ^8 B   .read=mcbsp_read,
3 \5 [; l# ?: T& b' L};
& i' t8 k3 B5 D7 S4 Estatic int __init MCBSP_init(void)4 J) H7 v9 p/ a' K$ v  e
{- n2 o' u  |( N( b
   int ret;2 ]7 l- o# u( e) k/ C0 E( _
   unsigned  int   PINMUX1_REG_old;# c8 i1 h! F2 i, O) O
   unsigned  int   PINMUX18_REG_old;
# j: p& B  p8 O   unsigned  int   PINMUX19_REG_old;
) Y5 X+ x  a4 h% v4 ~+ L   unsigned  int   temp;  
3 D, t* c6 c5 q2 O4 Z- o" U   if(MCBSP_MAJOR)$ @0 V0 y8 A1 O
   {
1 d& U# p4 \- p) @" r! y3 h      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" R9 y/ i3 ?2 G: [# D      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 l0 }0 x( s# Y, M4 s9 W   }
0 E2 e+ H5 c" {( ~6 E   else1 H) S. B( ^3 k
   {8 F8 B0 K; h( d! S/ L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( O  t/ }# g. C: ]7 `' {  |      MCBSP_MAJOR=MAJOR(mcbsp_dev);
' p- g0 A; k& s# h+ h# x   }
" {( [& Z. f4 B* m" j+ d   % Y/ n. n; t" Y( N
   if(ret<0)
/ i' ~* r# h) U( j2 w4 p   {
0 u: G; R3 t) K% Q6 |7 M" {) }      printk(KERN_ERR "register chrdev fail!");/ A3 k- i! q) h6 R- U8 t
      return -1;
8 {8 N, {* V( p# t6 ~  n   }
+ d$ {8 u0 P6 `/ s   ; K5 d, |* G% T1 ^0 \, @
   mcbsp_cdev=cdev_alloc();
, K) V+ i, f8 b4 e- w8 c   
7 G% k, y. g& l4 ?4 ]- x( R8 j: r6 s   if(mcbsp_cdev!=NULL)+ u. |$ M8 ]2 u/ ?# d, m$ c
   {4 Y9 n' A- w( d: y
      cdev_init(mcbsp_cdev,&mcbsp_fops);
) W) y: s( ^( h' B& r# y      mcbsp_cdev->ops=&mcbsp_fops;
) U2 Y$ p* \, G. l. P. x      mcbsp_cdev->owner=THIS_MODULE;
; t1 \( C+ T+ \! Y- q, O      
% J( p2 v6 ^5 P  r, y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))* [! V. N/ M  U- Q5 ?7 A. [
          printk(KERN_ERR "register cdev fail!");) W4 W, ?4 N' p' a' U7 b# f
      else
' p/ ]' l& b8 e6 [: e; o) h( G          printk(KERN_ERR "register success!\n");) [( ?7 b/ ]& N  p
   }
9 a9 ]* |2 _9 i4 e   else
/ f/ Q8 U; r  M. N: d7 ?   {: R2 u0 r$ \3 O8 q$ R+ A6 }
      printk(KERN_ERR "register cdev err!");
( ]) Z9 t9 o9 P+ |- Y; G9 `; k      return -1;* q, @! g7 c6 J, j: b* z" X+ Z: m
   }% S7 d  b0 f# i
   % E. e$ a% C( e& w/ R+ s! v
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
* X; x7 p, n' n2 }0 A* {3 K) x6 _   if(IS_ERR(mcbsp_class))
5 L3 B# Z& ~& d8 O2 E. h, V   {# t% C1 q1 C2 B; j( j/ R5 v
      printk(KERN_ERR "register class err!");, ?0 k+ A3 N  V+ \) V+ d/ \
   return -1;
1 y  `4 R  |5 E9 ~   }
3 M, \4 t# G6 H( o2 v   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 g$ a2 M9 \  j4 m4 |- a2 ^- R" {" ]4 [: y
   //PSC7 q! R) t3 n' X( G8 r
   //add Enable MCBSP
5 F) N  O8 H; E9 u2 n& m, v   //test3 x+ a4 G; t# Y; M( Z- h
   temp = 0x80000003;
9 ?# F0 A) i' [) C   writel(temp, IO_ADDRESS(MDCTL15_ADDR));" |  j$ i( K$ p9 N% w5 k$ z/ D
   temp = 0x00000003;
: `- k- v4 V# f4 U7 B/ `2 ?5 P( ]   writel(temp, IO_ADDRESS(PTCMD_ADDR));' d0 i0 W3 F; O2 z2 \- [7 _
+ `1 `  j+ b# g' d, f/ D; v, M7 {# l# K
   temp = 0x001FF201;
, E1 H1 i4 N, x5 I1 F* ]0 o9 M0 f. O   writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 r5 @8 A. J; y: s7 @
   : v9 K7 Q0 e* C' L( e( b+ r
   //PINMUX  3 x  @+ P! v' S% W
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- j" M" j& {3 |! H# v3 H
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 K5 m1 ]. ~4 C0 D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
2 G, Z( h4 n0 i8 h4 u$ ?   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* G* j+ q# H; T3 s, Q4 p
   
7 z2 w8 I, ^1 X8 H/ A3 c   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ E+ V3 ~3 V8 v+ Q4 q( B   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);    n, p3 b6 |& f- m& [& g7 f4 G4 X& d
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   1 [( u' C7 ~/ v0 R
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& \; b# y3 z3 d9 h+ A' Z
% u8 C/ C+ }( Q7 E( G  q   //RESETn,L138_SHK2$ u9 E* v3 K2 ?3 [' }' o
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
6 K4 T0 X$ N3 J9 y; |. [8 B   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
; U9 F" l0 ?2 o' \1 d   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 `0 D+ {: W$ @3 l) W 7 ]2 W# w8 U2 a) x3 A3 P

, f2 y9 l( h- j, Z! P/ q" g  //SPCR Register3 k$ B+ w2 s" [5 x
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ o4 J/ E1 J# ?% v
  temp = 0x03000000;//(DLB=0)& q' a7 b% c  X$ V$ f
// temp = 0x03008000;//(DLB=1)
; L' I7 `% ^! n: U4 d8 Z, g  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset% F  o8 O7 W8 f9 m, x+ `
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 ~  J' `/ w% }5 I# o: N  printk("temp=%x\n",temp);
/ |* b. c/ K$ i- S
( F) p# z5 l2 P& u$ a   //PCR Register
5 e4 g( V' X0 c0 R8 r. g  y3 T   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ H: V! s/ p+ }) M5 R9 B, G  // temp = 0x00000F0F;+ E! N$ J- I4 j( p0 I' _
  temp = 0x00000B0F;
& ]# d6 I% V9 R; ~( Y. g( L! f, Q  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 t" G2 ~# p& h1 p$ p  temp = readl(IO_ADDRESS(PCR_ADDR));
6 r2 _- M6 u0 z1 e5 n; n  printk("temp=%x\n",temp);  
. I" f, v' b$ a' d$ N' v   //SRGR Register! {- F! n4 A7 Q( T1 W5 ^
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11) k8 [8 R% C6 V- ~
//temp = 0x301F000B;
# ^. g1 m7 J& |; u- i   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 c  K+ q& q1 d0 t9 L  temp = readl(IO_ADDRESS(SRGR_ADDR));0 z0 @0 ~* D9 A7 ^0 y
  printk("temp=%x\n",temp);
( l( G: W5 r3 l& i0 i: y4 U   //RCR$ ]6 K3 W' J8 ^/ W. w6 i  i8 k
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 \( u! Y4 U( b   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; p- \. L4 H4 P; m% c' e* J7 A
   temp = 0x00440040;
# ]% V4 c8 x5 t. H1 K   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   % T$ |, j8 n; e: x! a" f
   temp = readl(IO_ADDRESS(RCR_ADDR));& P4 y* R! Q0 X. b  L& b
   printk("temp=%x\n",temp);
; G" ~& n+ B5 |, O1 h+ a   //XCR& O+ R5 }5 ?0 h4 c# u4 r
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ K8 G3 n3 T7 |0 z( n3 A& o. t   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* _( n/ ]) H6 r; ?* }$ g   temp = 0x00440040;  y( p" A! ^' O
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   . U* O# q% S/ Z6 o- @
   temp = readl(IO_ADDRESS(XCR_ADDR));
2 y1 n( z/ h+ S; u' b   printk("temp=%x\n",temp);- L$ m1 F: _+ {# G" u& s. K: H9 }
  udelay(100);
4 T+ E0 V4 O  y" T  //SPCR Register0 Z$ i6 C  d; P& d& e* p; j# t
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! @( i6 S) m- s! D" L) U
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: z/ y$ b+ G% f: l. n
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled7 |( @! M( o6 ~% s8 I' ?+ A
  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 Q* B% x; _8 \' [( T( }$ s  printk("temp=%x\n",temp);
  x2 X. C( l# ~/ _( S- x; Z  udelay(100);" X/ i$ ^" n9 Z3 O
" s: R# @9 r2 H9 q3 Y
  //set GPIO direction: }3 O# M  d5 w7 i5 m- o
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 U% R* P" ^. C# Q1 K   temp = temp | 0x00000100;//EPR----input* W* N6 {  [- d1 Z: c
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 o' x" e2 j: [/ \9 V
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # m6 p! |! D" M  f2 ^4 i
' I' Z- i6 S  [  P5 ^  y/ d
   return 0;
9 v9 w2 s& B& j}
% a2 M4 J9 X* o. H7 ~9 Estatic void __exit MCBSP_exit(void)
+ z: |" H: B. m9 p{( W& Q% n& D( |
   printk("mcbsp chrdev exit!\n");
, G; S" C+ ^) v. H2 n   cdev_del(mcbsp_cdev);
! s& L2 k, G8 O$ O$ h8 Z/ b) [   unregister_chrdev_region(mcbsp_dev,count);
: p. w7 O2 X) @8 j; p" B, u   device_destroy(mcbsp_class,mcbsp_dev);
- Y- d$ X) R9 G/ r* L   class_destroy(mcbsp_class);" j+ D: E. H, |4 I) t3 p
}
1 O3 ~. ^5 ?& J1 `: r+ vmodule_init(MCBSP_init);% {1 E  f0 n4 ]0 M, D" {; H
module_exit(MCBSP_exit);
" r4 ], K+ Q2 S
+ H: w! [$ l& f$ UMODULE_LICENSE("GPL");4 y: ~, a; w  C
! E" m. m' q) ^( L
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 z6 @3 p; O* N
我的应用层的测试程序如下* t% |( H& G$ R3 I2 m
#include <stdio.h>, y, b( [; l7 E! ^" k' t& O8 g  T
#include <string.h>/ _8 [+ ^! i: @9 m, Z
#include <fcntl.h>
# E4 a! f( v4 k7 h$ ]- X  k#include <unistd.h>
" U+ I. _/ x# B0 x9 `2 h7 r; B#include <signal.h>
/ A& b( `8 ]8 `3 y6 }, K* Z#include <pthread.h>       //线程
& `% k  X4 T6 T1 r# _! y* M#include <stdlib.h>4 G5 n6 V. }0 ~
#include <pcap.h>          //捕获网口数据1 v; t, j! S1 w& D
#include <semaphore.h>     //信号
: b( ?6 @4 X( }# c# s$ Q+ n#include <sys/types.h>     //消息对列
" o( w+ y9 l' B' B- b: p#include <sys/ipc.h>       //消息队列' ^& Q; }' h7 C9 |. ?: m( t
#include <sys/msg.h>       //消息队列
4 m% Q8 P* W* Q" T4 y+ r3 k1 h#include <sys/select.h>
% o1 x/ \: p- F#include <sys/syscall.h>
% T% c; b8 }, w- z( ~5 Z& D6 m1 N#include <sys/stat.h>% w6 q  F! q6 q% i* C; M
#include <sys/mman.h>
, m1 S' L# c7 G0 v/ E( U#define msleep(x) usleep(1000*x)
8 i; e3 T, g  M8 p0 e4 Q  {7 B' ]% ?( T- Z9 B9 A, \& j8 m
int main()
( W; Y. ~  P; G, Q* H4 V/ G{ - X; b0 ~8 ?+ I9 H$ n. G8 q$ w% l
    //MCBSP,ARM与AMBE2000交互设备# M0 K9 s% ~6 A9 ^) U
int fd;
( K( w4 v! e! l8 l; n6 D' S9 x unsigned short data_write = 0x5555;! Q- o- {9 V* u/ L# d
unsigned short data_read = 0x00;
! N8 K/ N. O5 o- H6 ?  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, c" G9 ]4 U' `' X% T# ^ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 X! ]% ^1 Q, |6 E   
. r+ M" F) q! p- K- ~3 b  if(fd < 0)+ P" O. j0 a! F/ ~0 ^
  {+ i' Q! F) Q; J9 k4 b) I, m
     perror("open failed\n");
- q. i1 A4 @3 u- M  Q0 d     return -1;
7 ~  w. x1 s1 {% K) `  }
: [( I% L" f/ Y6 ^" }! C  % n7 @4 \5 q# M1 u+ c! |' l6 i
  while(1)" D& ~; `+ z! f4 _
  {0 F$ g5 }$ p& u/ \+ F  T6 j
   
; X$ \2 a% [" K0 I7 w   //AMBE2000每次读写是24个字为一帧
3 |7 a( _. T" X" g2 O" y   //写数据时将数据在底层存储起来,等到中断的时候再发送- u( w7 J) i3 q( W; c; M
   //AMBE2000输入数据是以0x13EC开头的2 E4 E& h9 b2 J$ C- }
   write(fd,&data_write,sizeof(unsigned short));
3 I3 Q7 r$ o: `& R. {1 z' k   
, b8 L4 N7 [3 l3 j9 t8 R! Q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( l, r" K$ c0 V& T
   read(fd,&data_read,sizeof(unsigned short));& i  [7 d$ \6 g3 t
   ' |3 P( @3 H: T0 A6 b
   if(data_read == 0x13Ec)( i( J9 R+ t9 Z+ g- C
   {
' d* \" C' f2 h/ m# h& P  Y   ) P5 |3 G- D! o+ d) t% l1 x' R
    printf("data_read = %x\n",data_read);. |0 }5 q" f5 @  j
   }
7 C9 ?, m% S% f$ F   # s7 }6 ]6 Q1 B3 [
   msleep(10);9 ?' b  L" x3 `3 v. {0 V9 a1 g2 i
  
8 ]. U% n4 `4 n& C) Q+ J# |4 E1 G  /*
: r" ^# W1 a3 [- K! p   ioctl(fd,1);   ; t; p$ O7 N5 W: N' d' `
sleep(1);3 C/ M: g: B& e, r9 |- ~- u5 ]
ioctl(fd,0);0 `! K7 S& B/ Q/ r4 i* D) s6 `6 r
sleep(1);8 |: X3 x& A$ Q5 \0 A6 ~
*/
/ ?8 m1 `/ }3 c$ ~  }   
) ^! r6 G8 M/ `7 l- _  F return 0;
. b  |# o6 V4 }$ C4 n/ {0 \
& y% i3 G& l5 j0 `8 F$ T' Y}/ x) _, D  g2 a

  r7 A5 n( n2 Q& m4 T% o多谢各位指教,谢谢! 急! A- x/ D% t1 ]1 W; b

' u7 r3 ^& n1 @+ K0 {# @
# t$ e+ ^$ z- {+ [# i- B% s# g+ r0 c( y' `

# ^. d+ f! e* Z4 f" l  `# f6 _$ f; p- x* }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 01:00 , Processed in 0.049992 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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