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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 E) K0 {1 w# c! ]) A( W. U/*
& k6 {) S8 N  g% u; d * Copyright (C) 2009 Texas Instruments Inc4 p  V, U3 U0 y; a
*# k4 I$ C) `* Z1 i1 ~6 r* B
* This program is free software; you can redistribute it and/or modify
  o2 }$ q" t8 C% ^* G. ? * it under the terms of the GNU General Public License as published by
& t3 c! ?! N# h * the Free Software Foundation; either version 2 of the License, or
3 Z" E- H% x2 F& A* A * (at your option)any later version.
" Y) g. H$ N: g5 H* ? *
, I. V- N% s, t" N% K- x * This program is distributed in the hope that it will be useful,
. E9 F0 R. `, O' y * but WITHOUT ANY WARRANTY; without even the implied warranty of1 K% k: V* J2 Q5 `4 _% j9 e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
. v% V' P% ^& I3 }5 G% u. v$ x * GNU General Public License for more details., s4 p; {' E/ @) Z. z# W
*2 J# `: z! u2 h& V' X8 f% U
* You should have received a copy of the GNU General Public License3 M3 M2 b" x- l5 ]
* along with this program; if not, write to the Free Software" W8 q. |! `3 |9 z- c  j4 u
* Foundati+ N3 q9 t7 D0 V( l
*/( d8 b, V. \# B4 r
#include <linux/module.h>
9 n* i( E3 G' K8 S- m#include <linux/init.h>
2 l8 ^* r/ H. G3 Y: h" V% T#include <linux/errno.h>
* C/ v/ c3 v- k. Q: u* ^#include <linux/types.h>/ U2 L5 Y9 q+ ?6 d$ E+ P/ y
#include <linux/interrupt.h>4 w9 a1 M( X. T. T6 a" L# w
#include <linux/io.h>
" W* H% a/ i' w3 ]  E" J% E- k#include <linux/sysctl.h>
9 a4 B0 A$ F4 \#include <linux/mm.h>, D3 _( I7 t. E" w& y$ Z0 a3 }8 W
#include <linux/delay.h>
& I/ J" K8 a6 L3 ]- t# [#include<linux/kernel.h>
7 y1 f1 z0 I; W6 L#include<linux/fs.h>
! W" f; \" J, @: O5 h" l#include<linux/ioctl.h>) G( U  O6 w& O& b
#include<linux/cdev.h>7 x; |8 r! ^3 b( w' n- h8 N
#include<linux/kdev_t.h>
  L6 _4 M* V5 d4 A% c+ j#include<linux/gpio.h>
; x  X4 D) o. U. I: f( ^#include <mach/hardware.h>" ^7 q1 T0 v! E1 e
#include <mach/irqs.h>! ]# y+ |& z5 I0 p0 e

8 ?1 j" L+ Z& x#include <asm/mach-types.h>+ _% k1 d; j4 X9 u5 a) ~
#include <asm/mach/arch.h>% V! H" z4 }6 P
#include <mach/da8xx.h>2 T, Y/ C$ b0 O. A; L6 g
#define  SYSCFG_BASE   0x01c14000, h. C% \0 G3 K( H
#define  PINMUX1_OFFSET   0x124
' C/ m# W/ m, k1 C2 v" B#define  PINMUX18_OFFSET  0x168
9 q% ?) ]6 m# I: ]#define  PINMUX19_OFFSET  0x16c
( E9 a$ D' G; L  @#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR) _* I  g% r) S5 p
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
) m2 o1 u; g9 ~( o- g$ |2 n#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ X3 `$ m5 Y5 c: K: ~3 l#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ I/ T; B9 P6 g, L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR: I3 s& i! Z) p4 b, [
                            ! \  ~4 j; n0 d+ ]. E
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* d3 r% h8 d; w* a#define DRR_ADDR      0x01D11000  //MCBSP1_DRR8 f$ {! G7 {4 z
//PSC5 s6 z+ A& O" V( `- e0 R( r5 N
#define  PTCMD_ADDR   0x01E27120  
; o" R+ S/ u+ P6 q/ n6 ]. K) A. {#define  MDCTL15_ADDR 0x01E27A3C
" }7 n" ]) }+ |" }7 l3 i- J#define  PDCTL1_ADDR  0x01E273042 H& _) m/ C) f- \7 U
//GPIO8 direction
: a- }# C. z3 ^' b2 _#define GPIO8_DIRECT  0x01E260B0
1 k: c4 b3 u2 v. K- l6 K4 p1 N! {#define GPIO8_OUT     0x01E260B4+ o7 j0 X4 z5 q( Y6 Z
#define GPIO8_IN     0x01E260C0- E  `4 b; e6 t# ~5 X, N
/ x  h) x0 Y1 J" @; ~( O. z! @) U+ {/ M* N
//#define MCBSP1_RINT    99              
- K0 A6 z5 |9 p8 _//#define MCBSP1_XINT    100  
( J2 A, M4 x+ h) ystatic int MCBSP_MAJOR=239;9 B, }) m& I) N6 K+ G
static int MCBSP_MINOR=0;" v% `- o7 h% N. E' X4 W1 a& X0 O
static int count =1;7 D" S; }! S4 Q+ L6 Y* ]$ y; d

- y% m# G+ v( t# B7 Y6 T$ j#define MCBSP_NAME  "MCBSP-device": }$ r- C% x% V' R1 x% o2 S/ w  E

( f! `) M. B/ Rstatic struct cdev *mcbsp_cdev;
5 E" x1 J' B9 J2 g! M  Q2 Istatic struct class *mcbsp_class;
- [2 D* m3 l9 y  ?static dev_t mcbsp_dev;3 C/ T/ \9 {$ m& S
unsigned int DRR_data;- _2 Q$ A! S2 J. v- Z, W; R8 m/ ^" k
unsigned int DXR_data;" x) c' C( ~) q3 C9 V' _# B
static int mcbsp_open(struct inode *inode,struct file *file)1 @9 q% S$ u( t: b
{+ i; v. s  w( n  o; S: Y
   ; t1 d. h1 G$ h8 S  j: l4 B
   //interrupt enable,initialized' k% a; V, T8 i! s
   unsigned int temp;
  {( i  i9 }$ @; R   //SLEEP_EN(GPIO8[10])---0
" }0 S9 {, q* B; e) C/ d6 m   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 a5 l, }- y6 [7 Q" ]' Q
   temp=temp&(~0x00000400);& H  g% B1 ]9 |
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 R. D2 k5 J* J( m# F+ \& h
  //RESETn(GPIO8[8])----0----1: Y8 [# D- e, X: G
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 O( ?+ D: s; U& U" S# b2 l   temp=temp&(~0x00000100);
& a/ n' A$ w# `" I2 q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ C7 ]9 g1 W3 k- G& h   udelay(100);
/ k, {* Z, U- H; @/ X. s   temp=temp| 0x00000100;. w- V. F4 z# s1 \
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! T0 {# P+ A/ z, ^, ?# k5 a   udelay(100);
# N/ T* f+ ]( {8 n+ T  d   printk("open success!\n");
  T6 a7 a4 w/ D* D, h   return 0;
5 n% Q1 ]# g7 W/ p9 T! B}
- z% @1 R' Z6 T, s5 i( R/ \  b$ P; ]- _
static int mcbsp_release(struct inode *inode,struct file *file)
0 F7 A% h$ y9 p# O$ K{
$ W+ Y8 f. O1 P5 X% `, Y& i$ Q   printk("release success!\n");
9 p+ q0 `- `% c# h   return 0;
5 P# E( r) V* Z}% S0 R3 [/ S' _3 U

: i' z8 ]5 G3 \, p0 ~static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 e% l' i: a) Y* g6 U, p: D% y2 W
{
8 r- f5 }, ?! L) M( ]    copy_from_user(&DXR_data,buf,len);
" s3 [5 e7 C* q. r/ w* p    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
  }7 N  \9 X2 L    return 0;
/ c; g& y( [" m7 U% O4 N9 X( W
# f4 l5 G) r$ q' k* G0 [% D}
4 W" o- i" G* j! O" u
8 O$ y- l: J3 L' D. ]* J# d" Z; d" Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 n; l' y$ y5 H+ {% K4 f& O* G; G6 @{   f8 ?4 w! _, B1 X
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));+ w* a& P' R/ ?0 p3 y" t2 E
   copy_to_user(buf,&DRR_data,len); ; b( F" ]  k4 |" o$ u
   return 0;
* g7 G: ]+ k; Y& t& Q# E}
9 o3 [  H8 E( X. M. W$ O$ j4 t
$ @9 z6 Z, D- Q1 q, y0 j5 j% ^+ X4 o7 S" [
static struct  file_operations mcbsp_fops=. O3 @  ]8 o+ \# A0 `
{5 q. k/ V7 F5 ^* n; C9 A
   .owner=THIS_MODULE,
% _5 r( i+ r7 E   .open=mcbsp_open,
2 e' I; n9 c7 v   .release=mcbsp_release,9 c2 n  s: l& S/ N4 b3 d4 D7 L
   .write=mcbsp_write,) X: c( V& Y. Y4 M: R
   .read=mcbsp_read,
- B3 X* \* b  u) @, }3 \};
/ V% i$ t0 P4 M+ [) r5 u  p( `% `static int __init MCBSP_init(void)
6 D( P$ g. {8 b# t" U  S  I! f2 r{7 O3 P+ o$ S7 F7 ?. a9 ^5 O
   int ret;8 O$ P: S: g7 z1 A
   unsigned  int   PINMUX1_REG_old;, a: ^' ?6 V7 e0 i
   unsigned  int   PINMUX18_REG_old;# @+ u, x( |, t% ?* p6 g8 d9 C
   unsigned  int   PINMUX19_REG_old;0 ~6 `( m; _! t, N
   unsigned  int   temp;  : Q! C8 v7 B0 n6 c3 N" P6 O! G7 r# \3 F
   if(MCBSP_MAJOR)5 i' k! u* r) X
   {
6 r& M) H0 V* c0 z# b8 N$ t      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ W5 A1 F" ]4 l+ R( U0 J+ e  q& ~
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, A( d( d; ~( e1 m
   }3 U9 E* s1 N. O/ Y/ E& n
   else
, R" ^5 Q" ?" T9 P: W   {: `7 E. a  r6 m$ _
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) [& f0 w) t4 r8 O2 B$ G4 f      MCBSP_MAJOR=MAJOR(mcbsp_dev);+ w* ^  X1 Q% [# d( u3 I( P
   }
) |0 v; O3 C$ s1 O* j( y9 l   
4 M- z6 J3 g( }   if(ret<0)  p- Q; [. G  ~, I+ D- @2 _/ p
   {8 R" x4 s. |2 b! U6 t
      printk(KERN_ERR "register chrdev fail!");
" K& H: A- U- f& U9 p( y) ?      return -1;/ a& ^; y  ~# H) D
   }
$ R1 w2 @5 E+ g# \9 J( @+ V   - z6 U/ x1 r+ ]2 F2 _. E3 j
   mcbsp_cdev=cdev_alloc();
8 O; D* H. o  l+ q3 S, k$ @   3 S/ C) \" n: I: M/ e% g
   if(mcbsp_cdev!=NULL)
6 M4 g3 O3 ]% V% g0 I0 P   {
! L1 G6 t" F- E/ a: N8 b3 L      cdev_init(mcbsp_cdev,&mcbsp_fops);7 l! A# @9 N1 z
      mcbsp_cdev->ops=&mcbsp_fops;- a1 S% g# D7 ?* d/ Y
      mcbsp_cdev->owner=THIS_MODULE;
! [! F. T* \8 a% r, h" u) d6 H      & k2 z9 ]4 b6 y
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% @$ X: f2 A8 d0 g4 d6 |' J$ o
          printk(KERN_ERR "register cdev fail!");
/ N4 p! }# {4 [; v9 ?      else
% A$ N; X8 R8 F$ G4 M) w          printk(KERN_ERR "register success!\n");
: g* H) |  |: N  N, N   }
8 [% u# [" k5 e: v& {9 k. I   else: N- C. T. @+ k8 `! i9 M
   {6 i" E$ {% q% H/ N
      printk(KERN_ERR "register cdev err!");
' W$ A/ @4 r0 u3 t% E+ Q: q      return -1;! N* t7 B7 C( `6 L& m
   }
% c4 i5 I: ~! t9 M6 X( v( \   2 G' M$ c6 p6 z* i2 f
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
* M% j2 ]. {) M   if(IS_ERR(mcbsp_class))
) u8 G9 c6 Y# o% V9 u4 V   {
3 [- e3 ?4 P9 C5 i, M      printk(KERN_ERR "register class err!");
; T% r1 j* g2 M/ o3 H+ f& b   return -1;! v: w( D1 ]" x3 z( T
   }' m+ {9 @0 s( C( n
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 k6 _% T$ H$ j) R+ c
7 t6 u) h# _/ F* j* r1 W   //PSC0 w) M6 ^, Q* V7 _4 f+ v
   //add Enable MCBSP4 M* a3 G& U4 a8 D$ x: B) f
   //test, V0 p! ~5 _# \: k
   temp = 0x80000003;2 Q- v2 q# P/ z* }0 A+ J* F1 T
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));2 g' ^0 k6 O0 ]2 M! g. m9 N2 e! y
   temp = 0x00000003;% t! _' N. X6 X- u
   writel(temp, IO_ADDRESS(PTCMD_ADDR));( z. P% u0 @# N
2 e4 q& O# F' V; V, `( s# H
   temp = 0x001FF201;
& g2 F9 L0 Z$ J   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  ~& _* ^/ y. a9 }   
- r/ M& ~6 F/ f; k. m- Z) L1 m   //PINMUX  
& F7 `/ z- z( T/ C/ k   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* N  M, d4 ?! Y4 }: `. O- z$ f   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  . E$ E+ v' `* f9 K  x8 s" a6 m
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   + r8 ?( }0 c! F5 ?3 k
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" g( v, R" a8 l" k/ T+ E; y& B
   
/ F- k8 y. u7 q5 x: {0 |   //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ f; n9 z9 n1 V, d   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
, z% `5 m5 S( s8 t( ^, K   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   7 r/ b- w! V* }  Q* o; y
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);- M4 J3 b; @1 H
! v3 w1 p  K9 `% V0 v
   //RESETn,L138_SHK2
3 {7 }+ @3 i8 \2 {& `/ L3 _   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  / P6 n4 R8 U; p8 ?$ b$ M4 R
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: T0 ~. R( o" I0 V   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);8 F( j9 v) g$ |+ S- f
" e6 ?: U; G9 m' f  _: G$ e

8 s5 r7 P+ j3 R4 Q5 H3 t5 p  //SPCR Register) L8 d2 t3 K% Q9 j" y
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset7 i& V' @4 b% m1 Y
  temp = 0x03000000;//(DLB=0)0 c) a; c) Q- r5 C( @( w
// temp = 0x03008000;//(DLB=1)+ \& e& E0 N& I# `6 _% e% U4 F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 j4 t1 [5 x: _4 h: E  }+ H
  temp = readl(IO_ADDRESS(SPCR_ADDR));
2 O# z9 P* y( h# F: m0 p& R: Z  printk("temp=%x\n",temp);
0 m# B- W/ Z: o: `* ]9 [$ l3 n
# K: u% X; l$ Z! }( `   //PCR Register. Q' @. B5 E' s7 S% \( f( q6 c/ K
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! P5 `" j* L9 L7 R4 J
  // temp = 0x00000F0F;( b  M. G( v5 b8 {
  temp = 0x00000B0F;% T( t% I* j2 r5 J' i% {
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 j: U5 Z0 g  U4 R1 l, H
  temp = readl(IO_ADDRESS(PCR_ADDR));
" q+ R, V# T4 }* A( u7 L+ ^) D  printk("temp=%x\n",temp);  % Z- F, Y' x: N
   //SRGR Register- x: ?7 c2 {6 z: V: v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11. v* S) i0 e8 l; p
//temp = 0x301F000B;
. d2 p7 g! l, ^   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
/ p  t& L3 Z/ R3 Q: B) ]  temp = readl(IO_ADDRESS(SRGR_ADDR));
7 g0 l8 H) v' U2 J' z  L  printk("temp=%x\n",temp);6 N* K& d. Y* D8 i
   //RCR4 s% z" q/ U/ D$ B% L: m1 y& t
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
  H9 U( k: n# I2 N; ?- v( [   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. o  \. O* E( ~7 f   temp = 0x00440040;% Y, {0 L4 a3 `8 m* l/ a
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   . c3 w5 Q6 K( l0 M5 p# W. T1 i6 i; w1 J
   temp = readl(IO_ADDRESS(RCR_ADDR));! d" V3 c8 E$ Z* F# K8 t
   printk("temp=%x\n",temp);
6 d) |8 W. }( k5 `" ^   //XCR
* r  k! w  E9 K3 A( A   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" Y8 W2 ]  Y: F
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" H7 `# r. g; Z& u   temp = 0x00440040;
. A2 J* L5 y  D; B& ?   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ' `" d8 c: q, h
   temp = readl(IO_ADDRESS(XCR_ADDR));
+ ^: G) P# g  Z8 {. K& u" s   printk("temp=%x\n",temp);
7 _* e3 W5 B, r5 Z' q  udelay(100);4 ?" s3 u, I7 A0 ~
  //SPCR Register
3 o) y7 X5 |7 L* I* t; H  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-18 \* d- S" }$ d1 I, t. n) n
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1/ m; F3 B" X9 }9 m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
- F# b! b( C& L( K$ ]% f% u  temp = readl(IO_ADDRESS(SPCR_ADDR));7 P2 H- @5 H9 R, K; m4 m
  printk("temp=%x\n",temp);4 \) f) t5 w  b4 Q
  udelay(100);
5 _! w7 U0 M# t. t9 I* ]0 E& B8 N! m' S0 [* g' }. ?7 @
  //set GPIO direction
5 G! y8 p9 X) f4 }' Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# s1 m  _  h! n: Y   temp = temp | 0x00000100;//EPR----input
) d% `$ }# M' q. x1 n+ S) T   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ ]( r9 a9 V& ]1 H/ d% \' ?- s3 a   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ }# u' X; h# H% [" G : M( h- ?5 P" r; M, k7 ]: V' @
   return 0;3 K& l5 @1 \* J
}
" o+ Z) X( ]- ?static void __exit MCBSP_exit(void)4 Q4 N( Q, S+ {7 c; z3 D# Z
{
. T% @  b* A( ]9 S/ d6 y. g   printk("mcbsp chrdev exit!\n");$ V4 z7 ^% I; V) d$ e% o6 I
   cdev_del(mcbsp_cdev);0 K7 a; y$ y! r( D# F: I3 G
   unregister_chrdev_region(mcbsp_dev,count);
& g7 d3 v6 N6 N7 T0 m7 R/ h   device_destroy(mcbsp_class,mcbsp_dev);
4 h5 m" f) Y6 b/ N8 u2 X4 L6 r   class_destroy(mcbsp_class);/ h# i; s; K! n1 R9 c/ b# m  A
}
( [  k, V& e8 Q5 U: F( ^$ pmodule_init(MCBSP_init);
1 A- m# G/ Q! R. Vmodule_exit(MCBSP_exit);0 ^0 E8 _$ @: a0 k! y0 l
" S+ x$ B3 ~2 N# a' b* t
MODULE_LICENSE("GPL");
  T: I! W" n5 h. ~4 W
. N; j5 G6 P. c# g; u我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。/ _/ s! P! z' D' Z8 b& k% W
我的应用层的测试程序如下. p7 ~6 Y2 k: [; J8 L& Z
#include <stdio.h>! T" M7 H- F8 Z/ ~! I
#include <string.h>
' J) d0 R: Y6 ?  j#include <fcntl.h>' a8 I) W% @3 \4 |2 G# O
#include <unistd.h>
3 J6 o) v: i6 H/ f* O) v) k#include <signal.h>
2 I4 B' y- e( y/ _' @% y: n#include <pthread.h>       //线程  v; z1 n  P6 b9 i% F( [
#include <stdlib.h>" _) B* q! B/ Z( [3 b4 Y, t6 |) w5 Y
#include <pcap.h>          //捕获网口数据* H  d" ~, X0 ~
#include <semaphore.h>     //信号- S" @" _/ n' e* W- z8 l
#include <sys/types.h>     //消息对列
3 a; P7 _5 b3 q5 d* z8 P: X#include <sys/ipc.h>       //消息队列  X' d# v9 H# r, \7 R! d! X) s2 ]4 u
#include <sys/msg.h>       //消息队列+ r. U; @& V. M* Z3 u8 a
#include <sys/select.h>* g5 S, I5 O  r# t
#include <sys/syscall.h>4 U/ Y9 l+ ^6 l* ?. w1 E, K
#include <sys/stat.h>6 J- Y4 P3 t+ X! [5 d( [% K
#include <sys/mman.h>, x* w' ~' G/ S- y8 \* J
#define msleep(x) usleep(1000*x)
1 u  f0 e5 h6 j0 W4 d5 O/ \
- p( v/ f- q$ s" }7 n6 |int main()) e9 i; T* b. p) B% w
{ ) Z( p1 t3 a$ M6 m
    //MCBSP,ARM与AMBE2000交互设备! g0 O) C/ A1 H$ }! [+ J: `
int fd;
5 z( M* [# ^  i8 m5 m% L* u unsigned short data_write = 0x5555;
% K: G  m& m( t' I6 t, f! j unsigned short data_read = 0x00;7 q" f2 c& D; W! h* J
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, u* y2 l: x- Y/ ]7 v* K  o
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* y4 W/ i% X7 a8 U; G' m    ' ^- W- w( s: s3 {; L4 }. s/ t
  if(fd < 0)/ n8 {7 k5 Q3 ?4 \
  {
! M# G2 x5 |! r8 n4 V     perror("open failed\n");$ d5 b4 c4 t3 t1 j' T( N- V
     return -1;
* ^. D5 e& U% t: w; c  }
; E( H$ k( I% o  e: p  
. K2 S7 L6 b: K/ W; q  D  while(1)$ S7 v2 m1 P0 D0 B. X( n( \1 S
  {
: C: f3 T% K0 I9 {/ j   
0 \7 J3 J1 _  F/ ]8 ?2 T9 G   //AMBE2000每次读写是24个字为一帧
2 T/ V$ i7 {! f" B/ o   //写数据时将数据在底层存储起来,等到中断的时候再发送
! o2 C! G& R, `* |   //AMBE2000输入数据是以0x13EC开头的
: m% K/ ^3 U6 P& \' I   write(fd,&data_write,sizeof(unsigned short));+ U: ]$ N/ q7 Q) F* W9 l# f
   
; o, f  n3 c. R* D   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
  }: d+ K9 q  y5 W   read(fd,&data_read,sizeof(unsigned short));
0 [$ a5 R7 g( N- F: ~8 e# c, N   
: `) b1 y! Z( m5 ~3 U) e   if(data_read == 0x13Ec)5 }2 j$ v: y( G# ~
   {4 _/ r) I8 V- b; [/ y( P. g2 O
   
$ @3 ~) A7 Z5 L' G4 p& o" G2 y- }    printf("data_read = %x\n",data_read);" |* ~, C- |* Y& p
   }
  _1 S/ W% l; _! ^1 ^6 d' w7 E   6 ~& e% U0 C1 }* {: I& U; E
   msleep(10);
/ f2 y2 `% B( f6 d1 K  
$ O& Q! }. ]4 N  /*
0 v0 @% {( z( l   ioctl(fd,1);   7 s/ h, G% o1 |6 M
sleep(1);
9 m4 h, n$ P# U! i0 | ioctl(fd,0);
0 n$ J) B3 U* g0 r sleep(1);. i3 D9 E9 F. {1 ~& `
*/
1 X* P% s! a! L3 |# B6 r; D  }   
# q! c3 F& z# }( p. d: o* [- r, R return 0;
9 k& o; q2 p" L1 L3 ^ ) k% _% k% c# F) n) G1 J
}. S, L% g! h+ D& R+ ]$ i3 O! S7 x

3 Q: A+ q% E# C: c0 x多谢各位指教,谢谢! 急. j# Q/ m% u; T8 {

; S, G& D% ]& z7 w7 ]3 l$ z
, |+ I7 g+ R: S6 T9 ~& W
7 `# _. ~: L7 a, X3 A7 T; p! K
6 u: M7 S, \$ v3 C+ u: A$ ]8 f1 ~; Q/ [$ U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 13:26 , Processed in 0.050731 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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