McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 b( B4 A+ ^) B/*
5 B# @9 m+ x0 j( \4 x+ v6 K * Copyright (C) 2009 Texas Instruments Inc
' A( C" ^) M/ o. K *2 N% c# m$ l, t+ Y
* This program is free software; you can redistribute it and/or modify
' A" y6 G. e* p5 b# o * it under the terms of the GNU General Public License as published by
! E! `4 N" a) ?$ W* j8 Q * the Free Software Foundation; either version 2 of the License, or
& e$ \# D* u9 ~5 } * (at your option)any later version., A# R7 ?# \' j) J0 r
*( B/ n% V& j) {/ ]. N3 Q* {% ^; n% W
* This program is distributed in the hope that it will be useful,3 W8 [# K& \& x8 z+ I2 E( g
* but WITHOUT ANY WARRANTY; without even the implied warranty of4 D! i! K5 y2 H1 y1 A/ E
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( t  q/ Y7 @1 J9 K. ] * GNU General Public License for more details.* C/ H0 f- N' z
*5 [( x$ j& O( V4 N1 Z  l
* You should have received a copy of the GNU General Public License
+ F) Z2 P! t( e; J * along with this program; if not, write to the Free Software  `6 u% s7 Z7 H% M) C
* Foundati
2 ~( A$ o, n2 p3 P*/( N! H) P; V+ k0 a) q! L+ T6 M' I8 y
#include <linux/module.h>
3 l( {( k$ h; `( l5 P# F+ m3 s8 A#include <linux/init.h>
- I) c% ?' ?% \1 ^; z% P) L  B#include <linux/errno.h>
, G& j7 \- R) }7 B" j) r6 K* z2 n#include <linux/types.h>
( r2 R# W1 s4 w. E  F#include <linux/interrupt.h>% P# N1 s4 |, D/ y3 B3 F
#include <linux/io.h>$ g, N' Q/ E7 N% ?
#include <linux/sysctl.h>" r7 b# c6 X# i! L( ]/ E
#include <linux/mm.h>0 J7 k9 W9 Z8 J0 r3 J) f9 q
#include <linux/delay.h>+ A( Y5 ?; P8 p. J4 P, Q0 t; ]6 i
#include<linux/kernel.h>' y7 k2 s0 C6 }/ N& a% J# [
#include<linux/fs.h>& |  G) ~# Q- ]9 n8 y
#include<linux/ioctl.h>
, e2 C$ s7 q) e0 D% M#include<linux/cdev.h>
0 s9 H  Q; O) O3 p#include<linux/kdev_t.h>1 G% e4 ?# }# D: y" r
#include<linux/gpio.h>
* J: V  q; T+ C4 n  r4 f' p- _#include <mach/hardware.h>5 r+ Y8 Y% S: R! w0 j
#include <mach/irqs.h>
" E( E( \. {. Z$ q7 k  _0 S: J1 S  X% c3 ]: s' D5 T
#include <asm/mach-types.h>0 N2 H5 Y' |) a" Q9 w" b! q! p
#include <asm/mach/arch.h>, n( g0 V& r6 Y) O
#include <mach/da8xx.h>
1 }8 @! Q# y4 q0 O#define  SYSCFG_BASE   0x01c14000: s, V% p/ k& R# l+ o
#define  PINMUX1_OFFSET   0x124
5 @, {, [9 I- B$ l#define  PINMUX18_OFFSET  0x168
! ]/ ]1 w' t4 f3 @3 p+ O#define  PINMUX19_OFFSET  0x16c% n4 V' ~1 O5 l3 F! M( e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR% @4 G. L+ s3 E0 }: X
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. ^/ F7 U5 ]: B* ^7 p7 H4 J% M
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 B. f8 n$ e  G% c+ n#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
, z# ~- e# d# y, O: q#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR% O, D! a9 v. E# D% [7 W
                            ! h0 u7 u& t/ U# t
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR7 ]- n6 r' w. X* ^; |
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 D- C1 n4 R7 v1 |//PSC+ _* P* s7 u7 e6 U" X6 d2 q2 p0 f
#define  PTCMD_ADDR   0x01E27120  
  F# c2 l: t, S$ M#define  MDCTL15_ADDR 0x01E27A3C
$ Y2 f" U0 H1 m# t' T/ O$ D#define  PDCTL1_ADDR  0x01E273049 Z6 F9 H, U: Q% d3 j9 V" {0 d+ ?
//GPIO8 direction% d: }  T! m4 C% P
#define GPIO8_DIRECT  0x01E260B0
# a3 X: U5 i( ]6 F#define GPIO8_OUT     0x01E260B40 h6 Y& ]* Q+ H" a$ {. N
#define GPIO8_IN     0x01E260C00 U! u4 k3 S# O- O

. o5 }0 F5 E7 _* s; F//#define MCBSP1_RINT    99              4 X9 P8 Q3 y( x& A" p
//#define MCBSP1_XINT    100  ) L( Y$ N) l% Q! T! B7 o. V
static int MCBSP_MAJOR=239;
4 A2 ?8 q* Q/ a7 kstatic int MCBSP_MINOR=0;
6 Q5 N1 W' W& S- r( fstatic int count =1;* P+ [1 V) x+ ]
3 c) w7 X6 |/ J/ G) ^( l% x
#define MCBSP_NAME  "MCBSP-device"
; X9 h- i& s- c0 O% K5 _( i8 J. y, g0 z# X; z4 X- r6 K
static struct cdev *mcbsp_cdev;
! M# j. ?! S+ q7 b' z8 z# I3 Jstatic struct class *mcbsp_class;; e& I- L( k1 ^: k# P
static dev_t mcbsp_dev;/ z( N) v6 |: O" V# i
unsigned int DRR_data;- h! `7 _" g  _
unsigned int DXR_data;
  q- u7 S3 T# L7 H0 Xstatic int mcbsp_open(struct inode *inode,struct file *file)
2 O! g" i# b' r+ [4 r  q{( r! b( ]2 W( |' g: H0 f
   ! ~/ C9 b& h8 M$ N% [
   //interrupt enable,initialized) P( e0 b# ~9 Z6 v3 e& ?, I6 f- _
   unsigned int temp;
1 D: S6 `3 y/ s' L8 F& n   //SLEEP_EN(GPIO8[10])---0
; N# Y5 ?: Q8 v$ q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  c/ ^) Z" _3 x8 v+ [/ M5 b   temp=temp&(~0x00000400);
" W6 o6 K' k- Z$ p3 I3 t* e/ k$ d  y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: Y8 a5 ^$ Q7 I& h  //RESETn(GPIO8[8])----0----1% D/ o' n- n6 F: l( E) t5 Z8 k
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 }2 t9 ^5 g' i) }2 z5 ~   temp=temp&(~0x00000100);
$ L- E' J  z, d" c7 o   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 T/ Z2 w% t* d5 ]1 L! m+ ^
   udelay(100);. [$ ]7 l! I  y. c
   temp=temp| 0x00000100;
! q8 s3 Q7 D2 {7 @: [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ ]/ P1 a. {4 |# m4 W3 v   udelay(100);
  Q' g$ L& r3 I6 }3 O   printk("open success!\n");) k2 i+ d4 @- r0 _- @( l
   return 0;
* m+ Y; f+ E2 ?) J}
9 F6 A" z7 X1 l9 D6 u' Z9 g. H" v# z$ L( I
static int mcbsp_release(struct inode *inode,struct file *file)
) d! P9 f( G+ u8 {{
  [9 |! q$ t% g5 f   printk("release success!\n");+ {9 Z: c; W1 V  N1 a- i) Q0 k: _5 m8 n
   return 0;0 h  ~- v$ @: o0 w$ `
}. w) A- [$ u' F0 K! J1 E- ^
( |. _+ L4 X+ [4 ?( j8 r, p
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ P& B7 f8 ]( L9 i8 c{. ^4 B  q' q, w3 Z8 L- ~
    copy_from_user(&DXR_data,buf,len);
3 K0 Z; _' m- T8 W    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ; A  p, L( {$ H' K5 U
    return 0;
5 [3 |/ Z3 a4 v$ ~: e* | ' X" U8 |" f/ |/ R  k3 h
}4 W) ^5 ]" B. [4 ^' ^1 a- B* y+ I

5 t2 M& T  `$ ~5 y: ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 ]8 V- u& w! w. s
{ 2 v) l# F8 M4 A) A9 I6 M1 V
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, c+ q/ y4 I8 N( I   copy_to_user(buf,&DRR_data,len); , S/ T! b, c) H; a9 Z0 }
   return 0;
: y* m/ g' f- s1 ]}2 q- Q2 C0 l+ ]1 S  j0 Y

! I3 y  z& G, z( T
3 f0 X" a" b$ Rstatic struct  file_operations mcbsp_fops=& {! J5 f) u* I( f& T5 R* s4 r6 m
{
5 M: ]9 A( P) F   .owner=THIS_MODULE,
2 |, }; C  u2 N+ {   .open=mcbsp_open,
+ e8 v* U. C9 n& g   .release=mcbsp_release,
, r& z* u' d6 ~% h# R- c! s) o   .write=mcbsp_write,
1 Q4 n- E0 a( d7 W9 B   .read=mcbsp_read,' P/ }' Z/ N1 _" }0 p5 m+ r& n/ @
};
  G0 q8 H1 c+ S( t$ W0 _; p! bstatic int __init MCBSP_init(void)
5 o; `$ s  a& w{
: S  b8 |4 I  R- }   int ret;. c+ r, J+ T2 q6 C
   unsigned  int   PINMUX1_REG_old;
, p0 R4 k  J- {1 Y3 }: c   unsigned  int   PINMUX18_REG_old;& F% R( g! M' S) V
   unsigned  int   PINMUX19_REG_old;
' d  j# ?/ {3 j% V   unsigned  int   temp;  . D6 W- I/ A9 t& b1 _- p/ w
   if(MCBSP_MAJOR)
0 E: o7 s0 n& Y# d; }- S" ~5 M8 F   {
. }2 o/ r' p# h+ d      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ D5 Y& U: U1 ^# w! B# y9 [* \
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) }# `3 D  V2 O. x& a& V0 |+ N  ?
   }
4 u  |0 }) _3 @) W7 L& m   else
; {6 K+ w+ A+ ^6 b% B" i) M   {+ H2 b/ S/ n0 W( x& b( o( p
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) F: ~1 N5 v# G2 m$ ?' Y
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 W% d' F( I: ^$ e" x: O2 `   }
9 C. {' K. d7 X; u8 g8 v4 ?5 M* Y   
4 I  l3 J1 P, Z& d4 M( U1 i   if(ret<0)* b  j9 q1 i  h
   {$ {# s/ W& D5 G, g* R
      printk(KERN_ERR "register chrdev fail!");% M4 ~1 P; N3 D: R# @
      return -1;7 R6 N0 o4 `6 H5 b# k8 t1 A' j
   }# J$ _; U/ W: K( c
   
# r4 `0 r4 W% ?- G; O   mcbsp_cdev=cdev_alloc();
( ]2 V4 D& t6 a* p7 t6 R   
9 K0 o& f0 E) ]5 O% F9 d, y1 s   if(mcbsp_cdev!=NULL)
; V) R% T9 u1 ?- }4 `6 W   {
% x8 h% A' I& |! Y2 c+ s4 s      cdev_init(mcbsp_cdev,&mcbsp_fops);, H4 T3 a- D1 W3 s
      mcbsp_cdev->ops=&mcbsp_fops;
) G# T6 N9 }# E+ T      mcbsp_cdev->owner=THIS_MODULE;  Q+ P7 e3 o& p+ g
      
1 G$ ]  z6 n" S      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
5 W0 k, M: D$ r* O) K          printk(KERN_ERR "register cdev fail!");8 N  W/ ?2 J# P* h, ^
      else
) L+ C" y0 [- M( o* ~+ f          printk(KERN_ERR "register success!\n");; _3 H% g1 D( G9 ?* K  X
   }' t! H7 R+ S! o) S
   else, ~9 ^2 Z  w; Z: ^' p% B$ h
   {
* U/ |: v  U& x8 b% ^5 @" s      printk(KERN_ERR "register cdev err!");) q1 }- a  t! e
      return -1;9 O" A3 V! n2 E" g
   }5 V5 {+ I7 s6 H2 f) p) M5 i& ]
   
8 t& X" |# _0 p& {  }3 Z' p. x! N  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
/ }* H! O5 m& F# r' H3 N! t- j. y   if(IS_ERR(mcbsp_class))
, X# j: q- C4 W, w* w   {: [3 O1 D7 T2 _' [) `
      printk(KERN_ERR "register class err!");+ O4 P: T) I. f) |
   return -1;; b9 C' o8 K; T& o- U
   }( I4 h4 ]4 J( o  [
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 [& S5 C% O4 C4 V: e% |# N% ]8 _! u5 s9 y" x9 G, r
   //PSC
4 b6 E6 t2 o" n; n   //add Enable MCBSP. s. Y3 T6 [" A; m, b
   //test
0 a, A6 [$ x/ i6 p   temp = 0x80000003;
# P: e$ X4 [1 ]) I1 K" L( s! E6 ~# T   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
, D6 m6 g3 b4 k& D& s   temp = 0x00000003;
4 ]  \/ }4 l- V' s$ y7 O/ u   writel(temp, IO_ADDRESS(PTCMD_ADDR));
7 Z; Y' M* L  ]5 @' D, C6 O1 k 6 q$ E$ M/ q/ x1 I) E/ R+ A5 I
   temp = 0x001FF201;5 ?) {9 U* }' {8 [, n* \
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 C& [# h0 C! R3 b7 _/ B
   
) b, V$ [, y8 I0 k1 o* l9 p   //PINMUX  
5 d. W; {5 ?5 {8 p* l, {   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 m% `5 Y0 h! C& }' n
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
$ l9 ~  d. D4 F- L   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
* I: k+ K# `% {3 G   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( q- M6 _; g( ^. Q3 f   
3 \" ?0 [& l/ V  o* K  L   //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 W- J/ B3 V2 [* ^' L   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
( F1 n6 U) k% D; p   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" g# f+ q# v( |# r- s. C   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 \1 `3 ^: S2 s
% y" F8 |: D. s" i5 T  `   //RESETn,L138_SHK28 i6 [# U$ q' {5 W3 k  R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
4 [6 Y8 c" |2 |% n   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 _7 I9 [, g1 L" Q& M1 h   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ X* Z  ?7 a0 |% |  v8 P
. ?+ A  L4 x9 i/ c  M' d1 @
. ?8 I5 ?- `+ p! w  //SPCR Register! y6 b* P3 _/ P& E* e+ S" f
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) Z) y5 q4 h% q  i, }& E
  temp = 0x03000000;//(DLB=0)5 u1 r3 e- [( I
// temp = 0x03008000;//(DLB=1)
6 T* N5 v# C1 B0 z4 n' @  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset4 L1 z5 Y3 Q) m/ G3 U3 p) I
  temp = readl(IO_ADDRESS(SPCR_ADDR));
& L$ o# [$ Z% p6 Z2 y  printk("temp=%x\n",temp);
7 s: `' t# ]6 c
* U2 ^1 i) o' n$ v9 v   //PCR Register
0 u: n9 H" i. h3 k/ L8 U  [( M9 R- T   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  A2 O9 L; E% |, ]
  // temp = 0x00000F0F;
& U9 s2 m& F" ]4 o8 z  temp = 0x00000B0F;$ F, V9 B  r- D1 ~( O
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 s$ z! K! n. p) K
  temp = readl(IO_ADDRESS(PCR_ADDR));5 ]2 @. B; A0 H
  printk("temp=%x\n",temp);  
- k! f' P5 ?7 S: Z   //SRGR Register# f4 t8 _. o: l- e% s9 R. O* \4 o
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 n' K4 i6 B1 H6 d& C% S2 h //temp = 0x301F000B;
: z+ ]3 J5 o* P/ r& o$ a4 [   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 E# {% K5 ?1 i% M  temp = readl(IO_ADDRESS(SRGR_ADDR));
& }6 B, g3 A3 i: @. A* ?  printk("temp=%x\n",temp);" W  y8 j& x* P: i- c9 F; q
   //RCR
1 b8 R: C5 @* q   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 w1 J, v# L7 V, |# G   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; k6 e* z( X% O, M- Z% U( X# b) O
   temp = 0x00440040;8 ^' _) o$ F3 g
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
: B# @# e/ v7 D# `. w   temp = readl(IO_ADDRESS(RCR_ADDR));
& N! i6 \# k8 T7 k3 X# M3 v   printk("temp=%x\n",temp);0 l1 V4 S/ P3 p* {! Y1 L
   //XCR
3 z# a) J- R$ }7 e   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 f# ]2 E6 e' D* f
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, t4 f4 x% E, t& N/ w0 E
   temp = 0x00440040;6 Z/ {1 _  H! W
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
/ o2 [/ G' w8 g$ J, R% ]* S- Q   temp = readl(IO_ADDRESS(XCR_ADDR));. e) N& R; Q  W& H' {% m3 B9 G
   printk("temp=%x\n",temp);
# r$ y) d- r. i0 B0 k! w5 ]' F5 i  udelay(100);0 J! a' y" y9 J$ y7 Y
  //SPCR Register
: G9 t) X, B3 j' z- o  S  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 A& P2 u+ C4 o7 t0 C. ?8 E% r  temp = 0x03C10001;   //DLB = 0 VS DLB = 11 L% a% O( u6 d8 |+ S
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
1 W, E0 g  _; s" M% H  D9 s  temp = readl(IO_ADDRESS(SPCR_ADDR));7 u+ Y9 f* C. a! {
  printk("temp=%x\n",temp);  t, L3 L' n  X$ U0 V3 M( q- o
  udelay(100);6 @& y/ e2 \& A# W4 C; f$ ~3 ?
9 z, r3 g( O1 e; W/ }6 N3 V; x
  //set GPIO direction
" L) h6 ~' u+ J   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));& T0 L/ X8 o3 `  H. C7 t4 F
   temp = temp | 0x00000100;//EPR----input  L4 w* u- V9 ~
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 ^" C. K( g2 s
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 N) x9 {$ R: U. z" ?

+ w5 T/ r6 ^3 o. X4 D( ]   return 0;7 K0 v1 \2 m% Z+ t; A
}+ O" D% R5 c, |, v, g2 q9 w- W5 E
static void __exit MCBSP_exit(void)5 k" K/ K: T. o; S  k/ H5 X! l
{
/ S9 y$ ]! Q! ~# A/ P/ A   printk("mcbsp chrdev exit!\n");# D$ @7 r& D' Y2 [' X2 T
   cdev_del(mcbsp_cdev);
2 F# ^4 P0 V( a; z7 T: @- o   unregister_chrdev_region(mcbsp_dev,count);
, Z/ b, b& Z0 e% g  G+ O1 h# k9 e   device_destroy(mcbsp_class,mcbsp_dev);0 f9 ^2 c, ?* k1 ^' \$ G( c
   class_destroy(mcbsp_class);
" c- x/ p8 L6 H2 @" k$ o3 c- [* ^" ^}
4 Z6 @9 J- {0 mmodule_init(MCBSP_init);
5 W  N! S* s4 D2 a1 D. a$ Smodule_exit(MCBSP_exit);2 s) H! `5 N- o2 K$ C

' U  p: a+ j1 V6 c7 SMODULE_LICENSE("GPL");
, k' `& K5 {! r1 n" C( b, N# @8 x, P4 i  b" x/ C+ \: h
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. U* I0 t9 ~( L, E3 k1 f6 T  m7 N
我的应用层的测试程序如下- J) o1 }2 u9 u! z; Y$ d- T( v
#include <stdio.h>
+ W, |* L* A( D8 z  W#include <string.h>
# L* r; H' E$ }9 q#include <fcntl.h>1 P* L% \* f. S) r- j7 Q: a) o
#include <unistd.h>3 l5 A$ z( Z  q( ^8 K4 P; X
#include <signal.h>
* a( g9 T. m# B#include <pthread.h>       //线程; i; N" `# A5 j# G
#include <stdlib.h>5 J* A/ @" l& ^  {) u0 {' q$ e
#include <pcap.h>          //捕获网口数据! r) r6 g. f" ^3 _7 e4 @
#include <semaphore.h>     //信号$ x$ Q, h! `4 u8 c! M) J
#include <sys/types.h>     //消息对列
$ [- \7 ]) l1 j, m, L& Q#include <sys/ipc.h>       //消息队列
1 [, z0 R3 Y/ T7 G( g) g#include <sys/msg.h>       //消息队列2 L& W  r7 y4 M" R
#include <sys/select.h>
% D9 M1 b+ ~- u/ @: {7 k#include <sys/syscall.h>( l; Y- ?5 ^4 V* y0 Y# h# q: q
#include <sys/stat.h>
/ A1 U" z* J, ]8 A- w  O#include <sys/mman.h>
, I  J) U  M$ H) Q6 P( p#define msleep(x) usleep(1000*x), f0 d+ b+ j0 {" p7 _: o6 N- X, h* I3 Z
4 c8 X* x6 b4 V6 N
int main()
3 t9 [2 z9 ?; ]' c3 y# J1 D{
$ {2 q) a8 Z" V# I# d    //MCBSP,ARM与AMBE2000交互设备& |9 T9 T6 n6 j1 I4 W% v+ Q
int fd;7 {1 h: G6 P; @6 W$ U# P2 U
unsigned short data_write = 0x5555;7 `) s  Q3 V- B0 U7 w* G
unsigned short data_read = 0x00;7 n& i1 J) \/ P1 x+ B% `
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 u; f) [/ `$ _5 g) O //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% A  `" H2 C: r4 C   
& g5 |  A3 o/ x  if(fd < 0)
9 S! E6 H% N* ?7 o. i" b  {
, Q+ w5 m' [$ g) I8 ?3 U) H& _. \     perror("open failed\n");
2 t! c% E( s! \$ H; H2 c9 w& c     return -1;
( d, r" a/ ?" y  }
% N% u4 A. y* B6 G3 }8 \4 F  
2 L3 |  \9 e6 b2 \( o; `% y1 ~  while(1)6 H! |8 V) T. [3 }
  {
; }4 f# [2 }7 W* C+ T" K* U+ p5 E   # G, O" |) ]4 ]' q; _1 ~
   //AMBE2000每次读写是24个字为一帧% P: Z: w# p* d( g$ E
   //写数据时将数据在底层存储起来,等到中断的时候再发送, L/ L$ n* i9 O+ o. z7 Z7 R! k: z* P$ F
   //AMBE2000输入数据是以0x13EC开头的! o2 \3 s4 r, h3 U! l  @. ~2 |5 l
   write(fd,&data_write,sizeof(unsigned short));
$ C9 y/ F+ U+ K2 J- L' ?0 }  \   
0 a* L/ p0 n$ O   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
) q& H: |/ t  ~  E# {3 }- c   read(fd,&data_read,sizeof(unsigned short));) U6 p6 x# k& A
   
2 n3 I5 O6 S4 r6 q8 `) x# Z# ^, ~   if(data_read == 0x13Ec)
- R) T1 A) v8 x4 H$ j   {7 G% g7 o$ @. c" M  ~
   
! @3 v: Q: U2 v6 D    printf("data_read = %x\n",data_read);
. m! B7 S' l- _- L3 d( i5 U   }4 W9 D! ~; W; t' b% S* ~. X
   
8 o0 {4 r6 }6 O2 _% z) {7 s   msleep(10);& J4 i- ^2 z- x6 A
  
" h$ y/ W7 g; @  u3 U8 z  /*
9 z( H. w" K# {) s  i   ioctl(fd,1);     o' a5 ~" P. ~2 x$ K
sleep(1);
. y# \" B  V$ ` ioctl(fd,0);
' G8 B& K& d/ Z/ P. w6 d sleep(1);! s" T( f  b- x; g$ u/ A' G' U
*/
* l4 H" O# Q- x/ A! K; s  g  }   
  z6 ?0 T- E3 r2 x return 0;
" k0 n" _/ c+ C1 N- a' m2 @6 O 1 m9 d0 P- P( _# h# t8 X
}
2 `( A4 ~6 B, E: Z1 a) O
( m* B6 _0 f  v1 H( _; o8 M多谢各位指教,谢谢! 急
+ ^5 S( h" O) ~2 T/ w8 |" d& A9 ]7 ~/ E. V$ `' t
' ?* u* S" z, W6 x
6 x- C( c6 x+ Y) C7 N+ E
& M+ q* q: v) C! U5 V% s
$ j+ T0 Q; g# `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 04:21 , Processed in 0.047244 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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