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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % e6 B+ k7 c3 u
/*
% l# k, D) j' S& F9 `( Q+ _/ v * Copyright (C) 2009 Texas Instruments Inc) ^* A  r" c5 [
*& T4 [9 ~) b5 n. w9 A
* This program is free software; you can redistribute it and/or modify% O1 `/ c- X& d/ \% o0 m* W
* it under the terms of the GNU General Public License as published by
! q# U. }/ g6 M. L. K- a * the Free Software Foundation; either version 2 of the License, or
! U5 O* c! D! S: ] * (at your option)any later version.( V1 p3 D9 l' H. ]* u$ I
*- t8 i: e, O& l- j8 q
* This program is distributed in the hope that it will be useful,
! [+ p! t% _! X7 r0 U$ Y: f * but WITHOUT ANY WARRANTY; without even the implied warranty of7 q2 a' \/ G- G' ?5 o! d' E% t3 P' F3 D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 v4 x2 \  d! e: E! H6 b, H * GNU General Public License for more details.
% q7 v& _7 V# i2 }) V1 L! L *
7 v% x9 Y# W* H' \$ y * You should have received a copy of the GNU General Public License
7 V, m& `. p; L) p6 n * along with this program; if not, write to the Free Software
; J& e( ~3 f3 I% o5 d+ |. M$ i * Foundati/ M- W' G7 S5 v# @1 ^. ^
*/! n' [8 o. b& G6 }3 t
#include <linux/module.h>
8 d' N" r) M+ w) _9 z#include <linux/init.h>9 ~0 O. v* Y/ Q& d  g9 p# F
#include <linux/errno.h>
' {* l  {1 V4 |0 C4 a1 I#include <linux/types.h>
8 `! h) B3 i2 _0 K1 k$ G/ N#include <linux/interrupt.h>
' K6 `& ^9 r# i#include <linux/io.h>0 O5 F# Q4 J) d8 V
#include <linux/sysctl.h>
/ I+ A/ x* z+ ^  I#include <linux/mm.h>
, t& x: U1 w+ G" d8 c% V#include <linux/delay.h>, E" o0 E. \6 s- B* r
#include<linux/kernel.h>5 R2 n' Y3 x5 s3 i1 C& l5 J9 Q* L
#include<linux/fs.h>
3 H: c* E+ m$ \( V. R) B#include<linux/ioctl.h>
' n' l" G; W3 C6 k, ]$ k, X#include<linux/cdev.h>
- v" E7 k: S8 G: Y#include<linux/kdev_t.h>2 y! {) g+ e* }# i* h7 A; w+ I
#include<linux/gpio.h>
8 e) b# A3 w  i1 I/ }9 O; }( R#include <mach/hardware.h>
- o% J& W5 u! `! c#include <mach/irqs.h>
, q7 [; y7 h* e2 T% I$ V! D* ^8 E
! A1 t% }1 J- l#include <asm/mach-types.h>
- I, C% c2 x# U3 `#include <asm/mach/arch.h>3 q; W5 o/ q5 w: d) f
#include <mach/da8xx.h>
; g5 S8 q4 c0 e$ \' U8 d* t4 @" o" N1 Y#define  SYSCFG_BASE   0x01c14000
" v; K) Y9 n# H* N* _#define  PINMUX1_OFFSET   0x124
8 F& A/ |2 H9 U+ N#define  PINMUX18_OFFSET  0x168
( J! F% y7 i4 d* A( W" A/ y#define  PINMUX19_OFFSET  0x16c( m* k. W7 C# ^
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR4 r2 }6 B: L! ~2 ~+ ]
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
* W- ~2 L& u7 Z3 g0 L9 Q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR0 `* T" t+ Z0 ^$ i' X8 s* f
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR8 Y' z! ?* f' t' a& z: P' F% ^" t
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR8 f' \. K- O- {& y! s6 f
                           
' |! ?+ f! _  D; }#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! l* X4 s6 m: m+ {) v#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
2 Y6 u7 c4 K$ k' J3 {//PSC
# {# f, m( X+ P#define  PTCMD_ADDR   0x01E27120  
) J1 s4 V+ M+ P5 }4 J4 U#define  MDCTL15_ADDR 0x01E27A3C
5 i* a+ p, q. E#define  PDCTL1_ADDR  0x01E27304
$ U2 B: c) L) a  ^; p# {( c' k; l//GPIO8 direction
. e, o; A( p# s; k/ O0 x* s5 x2 f#define GPIO8_DIRECT  0x01E260B05 p' h- T2 \& u: q# T
#define GPIO8_OUT     0x01E260B4) G6 Q0 J+ s( u0 i
#define GPIO8_IN     0x01E260C0
. K0 b7 B* d3 p/ G! R# S0 s, i1 ]$ X- U/ h, A2 Y" r
//#define MCBSP1_RINT    99              
* |$ J6 v# K3 W, M! H//#define MCBSP1_XINT    100  
' J: K  W/ }# y' M: tstatic int MCBSP_MAJOR=239;
7 s9 ?. r' o+ d0 D1 R4 U" kstatic int MCBSP_MINOR=0;
4 ^+ _5 P9 Q0 T/ z; k+ mstatic int count =1;8 U" ?2 y. q" [4 K4 \; Y  u% {
( }5 e2 H, d7 v5 Y# d. a0 D2 F
#define MCBSP_NAME  "MCBSP-device"/ O- {: ]4 y5 Q, F; ^0 R7 V& @; {
7 b/ f% m, \. K+ V. @& b0 v0 ^
static struct cdev *mcbsp_cdev;
: C: ^( W2 \) f1 \static struct class *mcbsp_class;
. x* V1 r& S! @  S1 ystatic dev_t mcbsp_dev;  m+ s- y. s  x1 R* b0 Y1 X! `
unsigned int DRR_data;! }% E5 V$ o: j8 T: |! [! K% M
unsigned int DXR_data;
  d1 n% l2 r$ {% |6 z3 s7 p3 o" Xstatic int mcbsp_open(struct inode *inode,struct file *file)- f# K; {- ^, ~. G+ D, [
{$ I8 y- ]; p7 I- Q, o  l7 w
   
4 h6 q! c6 F5 u- o! f   //interrupt enable,initialized3 K( y- }% j- I! b) ^) W+ Q( Z
   unsigned int temp;
. J* S& |! X, |0 ?   //SLEEP_EN(GPIO8[10])---0
& |$ E+ i" n0 H; B; A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ H" s* h. L8 ]' {   temp=temp&(~0x00000400);
, a0 u- F+ E. q0 F7 s, a   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( Q2 ]( c5 R3 ~1 L4 Q* ]  //RESETn(GPIO8[8])----0----1
+ l% b' a' d* a7 }1 d% J, b0 S   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. |: _1 d" w9 |. v/ P   temp=temp&(~0x00000100);
# b6 D1 S) l! Y: p% _8 k9 c   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, E# D% m9 g% N2 _3 {
   udelay(100);9 n. P/ Q3 T( W
   temp=temp| 0x00000100;
: x3 b4 A7 J' Z, Y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 u& ~) w$ b4 W2 o  E. E
   udelay(100);
, m( p/ L* q: J6 Q6 T1 O+ i   printk("open success!\n");
' v8 z. j6 n* P   return 0;
4 H7 K9 o$ [: f+ R1 h1 \}* u8 L, W) F) v  f  I3 X% ^

. J9 [) L8 W0 _# w/ j7 wstatic int mcbsp_release(struct inode *inode,struct file *file)
- q$ h: }; u% ]+ g  s{. |. g. a3 `+ |9 w7 Q
   printk("release success!\n");
, n8 E2 {; L7 x9 z' @   return 0;
8 Z: ^4 D( ]' e% e. N; c4 T2 r}
( S% B, |! g; T* ^+ N5 H! g0 |
& l, |1 ?- x3 V& c0 ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! q& X" t% i5 h, ~) s# x+ j{8 o% i9 I3 p( c- o* i, C. Q
    copy_from_user(&DXR_data,buf,len);
' u+ J' s/ i0 I" T/ h' ^% W    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* ]/ k6 ^. a. R: J1 e, H    return 0;9 ~% f, ?1 h& z
+ A+ v5 e8 A" W: W8 ]
}# @$ p' h* H) c# L
! }3 j( a1 \4 B1 Z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
6 l6 v" O% [# O{
% W4 q/ Z: s# S# F7 k0 {$ n* T( \   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- y5 Q% C/ o9 h  q$ j' d( c! K5 {
   copy_to_user(buf,&DRR_data,len); ( s% X) F/ }3 c. V, b
   return 0;& n  n# c8 w. _$ @
}0 Q* y' ]* }* E9 b% a
( O+ N0 {% Y8 {8 j/ v" l! y
! C, L% p/ B7 u; t# i
static struct  file_operations mcbsp_fops=
1 a1 [# S6 o' `1 |( P4 s: @/ [{
  n% `5 n4 k- G1 v   .owner=THIS_MODULE,: m% `) ~4 u3 t  L& Q5 X
   .open=mcbsp_open,
$ G' C) }1 f0 N" J, }   .release=mcbsp_release,
! p7 N0 h9 a) f( S2 i0 q* d) t& b   .write=mcbsp_write,
" ?" R8 B$ e5 ^1 X: o   .read=mcbsp_read,$ L# F. ~5 O4 c, R- n. j
};% ?0 c5 I& Y9 I& b% d$ N
static int __init MCBSP_init(void)3 A* g* e3 O- K+ y6 M
{* p( R% J- }; L' y8 J
   int ret;
: b* c  J  W7 ~) Z, k* `   unsigned  int   PINMUX1_REG_old;5 m- O' j. ]- Q/ g! s7 _3 S
   unsigned  int   PINMUX18_REG_old;1 ?( C- j3 y! q; B, `( u
   unsigned  int   PINMUX19_REG_old;
  b6 U( t! I  D  [   unsigned  int   temp;  
, a) c' y/ O3 Z% Y  O" U8 ^   if(MCBSP_MAJOR)
$ A$ }" p- J) K5 `+ i   {
# L+ Y" i0 o' ~$ `5 z4 q$ w5 C. r      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" L% ]8 x- t2 ?* N
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# R" D- O% j$ ]! E   }
# s7 k3 w! @9 P% G6 L. L" S   else
/ H8 @& p7 G; f# d0 O) w% Z   {+ A6 e5 q5 |; [, O/ ?' U
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 W- L. F) b) U2 c7 o# ~
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
  K2 l, M! O% {& X  B   }) y6 `& X! ^: g" w/ J) u
   $ |9 \# H- K; Y% D+ |7 n
   if(ret<0); p5 C1 }# R  r6 m2 ?4 H% g
   {- t$ D4 u  A* Q( w( h
      printk(KERN_ERR "register chrdev fail!");8 W+ {1 j  `) j4 w0 F% a7 I' S" n
      return -1;
% {% K. }. e# j' p% ^6 o2 y/ C' e   }
/ _* p) |" P- T3 L( w   
+ w6 B0 _* p) [! _) ~6 Q" G   mcbsp_cdev=cdev_alloc();
6 A3 Q2 P- _" [" d   
' n6 t" o" _3 {2 Q# \8 G( s4 D4 }   if(mcbsp_cdev!=NULL)8 c$ {3 q0 ]' |) \' \
   {
9 g# Y. {1 O- R( E; p& }5 d7 f. L      cdev_init(mcbsp_cdev,&mcbsp_fops);2 f* ~, W1 k& Q) E3 U  m& d, y% r
      mcbsp_cdev->ops=&mcbsp_fops;
$ s3 k5 d; a; M! e3 h4 F7 b) H% K      mcbsp_cdev->owner=THIS_MODULE;' h& k& g4 \' h8 z
      / k2 f' a$ T) C+ W* a
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 b( o+ E& C6 \
          printk(KERN_ERR "register cdev fail!");9 D/ p5 `% w3 H9 I9 J
      else
9 n+ G) ^! z. C9 ?! O& @          printk(KERN_ERR "register success!\n");1 Z0 M9 L) s0 _& b% Z) @# C
   }
/ }+ A8 r8 t' o1 k3 t6 R   else+ m( j) R' A1 J+ }
   {, |5 P' _: `! l
      printk(KERN_ERR "register cdev err!");
0 E$ M$ ]) |. j! C" U$ _      return -1;9 f; n% |# U2 y5 T  A5 s% v: S
   }  I% {+ {  D/ P* T
   
* d1 Z) _8 c/ F, {" h$ u% N  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- L! ?4 Y/ F- {
   if(IS_ERR(mcbsp_class))
" S% U6 S& a, I3 @$ Q3 F   {; Y9 o# ~: D! F* W' T
      printk(KERN_ERR "register class err!");
/ {3 i4 I! c7 K- W   return -1;
5 X' b' a# E( V  j! \* a3 P   }
' p  F; a# b2 M+ n# `0 _/ ~( {   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 k' t* J$ ]  k; W9 _& c" M' U1 w: J6 a
   //PSC  x; W. |7 v  e  |; D- q
   //add Enable MCBSP0 T* o3 F* R* O
   //test
+ W: }8 g. p$ u% ~/ g. ?3 g5 `   temp = 0x80000003;
# b: x  x1 t# v. t$ n   writel(temp, IO_ADDRESS(MDCTL15_ADDR));% V; B5 {, z4 L4 U3 ^- C. Q4 \% y
   temp = 0x00000003;
' T8 s2 F4 x0 m9 ^4 H! S   writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 Z6 n* A$ C7 w8 {& V- t
7 M/ H' i6 y( _   temp = 0x001FF201;  S" v* z7 I, _+ e0 y- c
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  A9 v. w; g% Q2 B  t   
1 f( M8 B  L# `; }, P" A   //PINMUX  
2 h; ]: V+ x1 z; Y0 X2 G' H   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* s5 V/ J/ ~$ _
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; ]5 `3 R  l# m) [
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - i) e1 \8 Q2 h  G8 ^/ F
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% x2 a) Q8 v4 g# p5 w0 [0 N
   
9 U, z$ Y- Y" z$ p8 D   //SLEEP_EN,EPR,L138_SHK1,L138_RC
& ~+ L: q3 `  H! x' T   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % E; l2 n* u7 Q0 M
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   6 D/ p6 J" v8 b1 M# C8 F! G
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);, G# |) Z1 C2 @$ w3 t
( x, a& I2 `9 r  E5 D
   //RESETn,L138_SHK2
, U) M7 h- R) w% s: K   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- f  A& a; c6 f+ P/ Y6 l   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ( D$ M, W: `- Q9 ]1 y3 W8 H
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);! a0 Q. h9 J. Z. P
' [- m& F" c) K( I

+ R6 E. ]* X. C8 N/ u+ W  //SPCR Register
! j  f5 o+ Z6 F4 S" _# T& i: A: k" L# {  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: k: C# R5 W7 ?4 w& p6 {# v  S  temp = 0x03000000;//(DLB=0)2 ?- S( ~& ?/ x( M
// temp = 0x03008000;//(DLB=1)+ x( Q0 ?3 w' o
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- x& S1 q9 j9 P  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 G/ [* d7 B  s$ j. S6 h  printk("temp=%x\n",temp);
: {. X8 N* L  [1 l2 Q( G
# h- G5 a5 A  w5 z0 Q; n   //PCR Register
2 }0 u+ N# ~: ~- @8 O   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# C2 t$ H, q( d
  // temp = 0x00000F0F;# O* M1 w# Z" Y! M0 u
  temp = 0x00000B0F;% w) o4 b- ?6 p1 x6 @: s4 b8 W
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 T' M: c( u0 C+ H0 K! b  temp = readl(IO_ADDRESS(PCR_ADDR));! R% ?$ H8 S8 q3 y& [5 H" P* b
  printk("temp=%x\n",temp);  , e) ^- V8 k* F/ q" ?
   //SRGR Register' U/ W5 v& R0 d2 P: W
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 Y% v5 {9 `# @4 f- O$ e. ~. n, N
//temp = 0x301F000B;
; t. {! r1 j+ c+ N7 g# I   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ! S* d2 [% i# c# Z# z) I
  temp = readl(IO_ADDRESS(SRGR_ADDR));2 j6 b( ~" Y+ Z9 t! w4 v" w
  printk("temp=%x\n",temp);3 `) `9 E. s$ D+ _
   //RCR
& T& j) Z$ R6 r2 x4 h2 p& c   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# z& }. {4 A. t0 w0 M
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# I# B& M# ^, N- t3 s   temp = 0x00440040;
, C' q, {7 H7 n2 A2 N   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ( T2 X) D% M7 y, T4 M
   temp = readl(IO_ADDRESS(RCR_ADDR));
( N1 A% x. ?' K7 L+ o   printk("temp=%x\n",temp);0 e( g: m2 K% a3 E. S9 e& B9 f
   //XCR
  w$ v) o# ?( p. t( G7 `   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( Z' w" h% N4 w" |4 i
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: D. k' ^7 y, u1 x7 T( n
   temp = 0x00440040;
9 P5 Z4 q6 z7 g; j' F   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
* K" j5 ^6 ~9 `9 k! k   temp = readl(IO_ADDRESS(XCR_ADDR));
2 ~$ `4 |, b1 |7 [3 C' e1 I   printk("temp=%x\n",temp);
7 U$ a* b/ T; {  ?2 `$ v  udelay(100);
4 k0 {/ G9 y! c. V7 O' V- i! \  //SPCR Register  j1 M  l8 R; i- j
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-12 J. z$ L5 ?5 g
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
7 e6 ?# Q% t7 j* N5 y7 h  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled4 u- w* [+ v7 ?
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) r3 d# f" s% P) r( F/ c  printk("temp=%x\n",temp);7 k) h" x4 B9 h  b6 J0 I0 k+ ^
  udelay(100);
* V0 `0 R! S9 ?# F, H, k0 P# [, Y3 t! K3 c0 x) u) u
  //set GPIO direction
8 i% ]9 y2 H  g( l: K! V* @9 L   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! y: Y* d6 I" g/ N   temp = temp | 0x00000100;//EPR----input
! B3 U7 m) m5 f) c   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* H" n* [: X# I$ v. T
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& }; g# x3 V0 w- N 3 I# A1 f; I' {9 w0 ^0 H
   return 0;( r" _' w' k2 b: l; @, c
}
5 V- K# d6 y+ X# H/ ?! D8 u# gstatic void __exit MCBSP_exit(void)' c- ]2 V) P  v- ]! K
{/ ~+ m& G' Z; m3 ^/ j  ]7 {  r
   printk("mcbsp chrdev exit!\n");" |+ E$ `# e; p/ e
   cdev_del(mcbsp_cdev);
/ a& Y7 p2 N2 c3 Q5 F4 X: s) E' M   unregister_chrdev_region(mcbsp_dev,count);, J9 |0 y$ X, M0 n$ a/ u
   device_destroy(mcbsp_class,mcbsp_dev);; |) `4 O. F7 ~$ P
   class_destroy(mcbsp_class);. q2 z5 g6 N: y6 G
}. P0 ^1 P; {: @) w$ w
module_init(MCBSP_init);
' T0 `! A5 k6 Ymodule_exit(MCBSP_exit);
2 f7 ~: R/ O; |  Z/ B8 w/ X$ y
- P; _. @: h+ n$ oMODULE_LICENSE("GPL");0 o+ ?5 A+ D  e  j: v2 b
$ d8 M8 G$ I/ ^% G6 I5 _
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
8 e2 P7 }1 b8 }" ~' F7 U1 h8 n我的应用层的测试程序如下( Z  X: h- x' D, l# q! {8 B  x8 ^
#include <stdio.h>) O9 c  `3 ]7 Y" H" k2 E
#include <string.h>9 D) l# d3 p! F+ q7 R
#include <fcntl.h>1 z) y# R7 K! {) T0 L/ F8 ]
#include <unistd.h>. r0 T4 T+ ^) R5 i" t# |) u
#include <signal.h>
# J' p6 f7 `1 [- }  Q* v#include <pthread.h>       //线程1 o, d3 d1 E/ `
#include <stdlib.h>1 _; @( }" K0 _" ^8 V3 ]/ J
#include <pcap.h>          //捕获网口数据& n! \, Q! V' \1 a5 l, S# \+ q
#include <semaphore.h>     //信号
( H, o/ T+ G. O4 W: k! O: X# T#include <sys/types.h>     //消息对列3 n8 t/ {" ?) m( L/ S$ c
#include <sys/ipc.h>       //消息队列! [0 y3 G! d0 M+ z, p) [0 X
#include <sys/msg.h>       //消息队列
$ P6 E0 a* g; b2 W2 T: V( w) b#include <sys/select.h>
. v1 g8 h6 t: E1 `6 V% d#include <sys/syscall.h>
2 N9 V6 o& ~+ b/ p; r, g7 M2 L#include <sys/stat.h>; Y0 e+ C! _0 Z! X8 w
#include <sys/mman.h>- k# \. u: ^. P2 Q% n0 J% Z
#define msleep(x) usleep(1000*x)3 S% q: y* [$ O+ R: w
: l. r( W0 G: b" S, N8 `
int main()4 t' d* |3 m, _7 e/ w
{ - w, y6 {" R$ p
    //MCBSP,ARM与AMBE2000交互设备
) }1 S) e5 ]; i# p int fd;1 |& e, ^$ L: @
unsigned short data_write = 0x5555;5 B4 K4 J& Z8 E4 Q
unsigned short data_read = 0x00;
5 M+ J' b! A# k  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 s& Z. U9 Y0 d# z4 c/ V* q- u" Z //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 h8 Z0 R7 J% t4 d      K5 a0 R2 b) l9 ~& p4 B
  if(fd < 0)
  D# \$ |9 M2 E; Z) ]  {
) H6 c2 }; p+ G2 r  N: J$ p" b     perror("open failed\n");( c+ d: E! L4 h6 Q8 ^, u2 g* `
     return -1;- ]; I7 G# x) ~# x: S+ c0 b$ k
  }
+ k6 K8 J+ J, V; G; o# O  
0 F  T  X, y3 h8 u( a7 Y  while(1)7 F4 _3 z( s0 J% S- s. `; L5 N/ ]
  {
: M7 {2 Q3 t4 o8 o   7 S- ~! |5 M8 i0 w1 s; N, m
   //AMBE2000每次读写是24个字为一帧
5 N2 e3 G" I4 K$ v) X) |6 |% g% t' i   //写数据时将数据在底层存储起来,等到中断的时候再发送5 B* [; F' k/ S9 ~
   //AMBE2000输入数据是以0x13EC开头的1 Y. T9 S* J+ z* _
   write(fd,&data_write,sizeof(unsigned short));
7 N6 x+ F) b1 F   + O% B' Z& o' [1 J- w4 f6 N+ ?
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
3 k2 B/ q# \; R- X) Q7 }2 i. g   read(fd,&data_read,sizeof(unsigned short));; G, Y5 ~+ |% j& Z( b: ]& ?
   
# P0 e2 w/ K+ S, k   if(data_read == 0x13Ec). N. |- m, M  x0 X
   {
/ |+ M; i$ y# }% |4 Y( G   
( z  |2 n: l0 S' C3 @    printf("data_read = %x\n",data_read);+ O% Z" M+ }! ]0 N9 V# w7 Y6 {3 r
   }
' f% K7 S' q) X  D; E   
5 U( R$ E& X$ {; H0 c   msleep(10);, `: k% C8 `' }# @3 L1 Z
  
; \: t6 K* [& F, x; H  /*
6 f' U* M; K( I* P8 T   ioctl(fd,1);   
6 _: H0 y! n1 J) F sleep(1);
6 V9 t$ c+ e. W' N3 D" U" o6 T ioctl(fd,0);$ n+ ^) t/ \8 ^* l: R
sleep(1);
. d9 B  Z# {9 ^ */
! H5 U2 L2 E5 W6 e$ t  }   : G* {6 g1 t- J6 \9 Y
return 0;* k. F! K* I$ S5 P' F/ _" j) j. @

! Y) |/ t% s2 X# J1 n# M1 v- ]" [}8 A4 c/ g+ o1 ?# I! U
! Y1 A" j9 |( r1 [2 ?
多谢各位指教,谢谢! 急) E, \! E( L. u9 a* y$ P. ~
0 N. s9 N  i8 R- b; o$ s# d
$ i, G$ C8 g5 C: V- N
/ M# f' O; T) h9 Y" Z

, d1 C% W, \7 Y: d2 m: O! O' C- [# h- k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 08:38 , Processed in 0.053967 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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