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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 A! p* E( h6 @  S+ ?
/*
  X& E4 g. p. p) f8 M( F * Copyright (C) 2009 Texas Instruments Inc# R1 O. D7 ^! ^1 p
*$ }) T7 t; z" m6 R: q6 U
* This program is free software; you can redistribute it and/or modify
) G& B* r* \" V. i4 V * it under the terms of the GNU General Public License as published by
5 q( m  C8 L& \ * the Free Software Foundation; either version 2 of the License, or
3 k* f; K% r0 h, S5 ?' K4 ]; J * (at your option)any later version.& B2 {8 s8 y1 M$ [4 \; c! `
*
4 |& Q* e# d. U7 P: @: p * This program is distributed in the hope that it will be useful,. A1 s; _7 \& h; @# e3 U
* but WITHOUT ANY WARRANTY; without even the implied warranty of' f2 ?2 t, S/ K. `: `0 L/ V) B+ \3 V
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 Y( l4 N4 s$ M; R6 N; o * GNU General Public License for more details.4 G4 H. ?0 f& I- b
*
: }5 c) G0 _. H" c9 }3 n3 v* n * You should have received a copy of the GNU General Public License* Y- o! H5 _# D: P1 w5 Z
* along with this program; if not, write to the Free Software* z  c2 A- n# a& f
* Foundati
: }8 G$ ]+ L" e+ C$ c" t1 f) x*/7 ]* A7 p+ o, x# U
#include <linux/module.h>. R/ h) L3 c' B* k) U( `
#include <linux/init.h>
; `; X/ x- C3 I' L6 ]: Q: i4 g9 r0 D#include <linux/errno.h>: ]: _/ i, Q7 x: [! d
#include <linux/types.h>
! X7 E  e7 B( L9 k% F+ `5 I7 d#include <linux/interrupt.h>
4 w5 s; x1 l6 J#include <linux/io.h>
4 f. a! X" G. L#include <linux/sysctl.h>
7 x6 ^7 \, h/ |1 y) [/ U#include <linux/mm.h>
" U- p! ]$ G+ t8 t% U2 v#include <linux/delay.h>
8 y6 ?, W0 X' S  p# b1 |0 L# b#include<linux/kernel.h>8 m7 O" d& s/ [. P' I( \
#include<linux/fs.h>
3 s/ c: `1 f- B# I! ^; _+ w#include<linux/ioctl.h>" _0 |4 e4 t/ ^( r" V7 a) `* q  m5 L
#include<linux/cdev.h>& P9 C& p2 W" F& k6 ]6 G6 s
#include<linux/kdev_t.h>
" T! Z3 b0 |7 X' G3 d0 M& g2 c9 ?#include<linux/gpio.h>+ @) }8 X8 L( n" k
#include <mach/hardware.h>
% d* G, E. [7 @# b9 P#include <mach/irqs.h>$ n/ T' [3 d% G( D$ b& e2 \, y

6 I: t4 A' F2 N- H& O#include <asm/mach-types.h>
6 r1 p& _# n. [0 I! J5 U#include <asm/mach/arch.h>  x" [$ ~1 a+ U! J
#include <mach/da8xx.h>
: g& H( i7 U* A. U7 {2 ~; B$ U#define  SYSCFG_BASE   0x01c140000 U8 L2 e& H$ |, ~
#define  PINMUX1_OFFSET   0x124
' h4 Y/ \! e" [5 l8 t: @2 F#define  PINMUX18_OFFSET  0x168 0 p, c5 X1 G: w3 n. K
#define  PINMUX19_OFFSET  0x16c2 b* u6 x6 Z% C6 Q; A
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR/ a4 A* n4 ]  V& F$ r( b
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR: }' |8 v6 k: O3 k+ i: p( {0 G
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
: Q8 f. u! V6 w4 G, `  R4 l! Y* F0 t#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' W3 I5 C0 ?8 E* ]9 H7 \5 _#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
' o) h& |2 |7 t7 f- T                            2 {9 X, f& {4 `
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR! u7 K7 d% V' l1 l. j* i
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 B9 a% i. o! b0 E. h9 x+ i7 H; E//PSC
! l% j  V  O/ b#define  PTCMD_ADDR   0x01E27120  5 r8 \, k7 ^/ Y  r& ?3 W
#define  MDCTL15_ADDR 0x01E27A3C
6 T" K$ M3 x* L5 R#define  PDCTL1_ADDR  0x01E27304, o" E& i. J! d8 [+ _
//GPIO8 direction
" z. c* H3 n  j/ G* ?; |6 s- u3 ~#define GPIO8_DIRECT  0x01E260B0- ?7 Q& `. n' L4 G- y3 P7 `5 ]
#define GPIO8_OUT     0x01E260B4
0 i- V& {6 o" K0 H#define GPIO8_IN     0x01E260C0, W* B4 I$ Z3 i( E' A

- }3 @: a' A  G//#define MCBSP1_RINT    99              
  [: I9 Y. r2 w8 A: a. P//#define MCBSP1_XINT    100  7 W* r( l2 C/ K8 r) K6 Z
static int MCBSP_MAJOR=239;
- r5 u/ \3 y, o" W- dstatic int MCBSP_MINOR=0;% x1 y# z5 \* J2 E
static int count =1;  j5 `. P+ \; Y, p
) ?5 h3 H" P4 T0 P1 U$ W/ R1 t
#define MCBSP_NAME  "MCBSP-device"
0 G* e! }5 {, |. A. }
. I9 W4 v% S4 {( dstatic struct cdev *mcbsp_cdev;
8 _, R9 K8 q7 p" j5 Z. Z- Xstatic struct class *mcbsp_class;
* }' u" b  Z* u0 j, F3 \# H+ @static dev_t mcbsp_dev;
5 K& H5 a+ O% T% f6 A1 \unsigned int DRR_data;. M! i& W, d9 |" ^
unsigned int DXR_data;/ f2 e0 o7 z8 m; a1 z
static int mcbsp_open(struct inode *inode,struct file *file)) s+ e6 n8 |2 m# A( }; R2 k
{6 h( X- y$ }" W
     ?/ X4 t  G! z; x4 I
   //interrupt enable,initialized# C: C  o7 E0 W  H
   unsigned int temp;
; N0 l8 I/ b8 ?7 v' f   //SLEEP_EN(GPIO8[10])---0
: s8 G% ?# }/ l0 B7 d/ @   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& N. }' E& T; l# q) i   temp=temp&(~0x00000400);  B+ Y2 i9 c0 Y$ ^" b
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ b+ K- p* }. d& E+ `  //RESETn(GPIO8[8])----0----1
9 S* F- H! }4 c8 q% H" G) f   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ V$ Z$ O5 y8 |* w) z7 i, O
   temp=temp&(~0x00000100);7 s8 l6 O7 \2 v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
' g* z5 ~2 H% D   udelay(100);2 C3 O- M4 O: U) l
   temp=temp| 0x00000100;
0 f. e/ }, [' M7 }1 n7 b   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ W6 \  Y3 c& ^  m' H+ s, q/ |$ |
   udelay(100);
7 w5 V" g% F$ x   printk("open success!\n");( u: E( y% ^& {$ }. L2 ], P3 l
   return 0;: I7 H; @$ L) a. G
}0 |9 w; w; x: A* U
0 \' i% K8 b8 ~) c* V$ s" \* ~
static int mcbsp_release(struct inode *inode,struct file *file)
- z; j0 j' a2 H6 S% R{
$ G) D$ U9 h) ^1 K   printk("release success!\n");
7 `8 e/ V$ N/ ?) ]! ~- [1 J   return 0;
0 h* q+ `" u/ l  h& [( ^. `}
0 a# o9 [' G! B) L. p8 ?1 e
6 n: p: \& ]) l$ T; x- Qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 E+ T% ~+ V: F2 C{
( h8 p% m, c! Z    copy_from_user(&DXR_data,buf,len);
: B: w' {9 G0 t5 `; T0 `: p0 Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' w( N& R: A; T
    return 0;
: r9 o1 e8 E; U0 B0 |
) @+ x: v9 E% L: w}: O, A. y; x: {2 b
) E! @: H9 `( v! x3 Z6 Z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)- T) F, E* z# |% p% _
{ + w8 n+ g' @9 X" V3 Q, S; ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
( J* h2 [8 n3 D) h" E   copy_to_user(buf,&DRR_data,len);
- N7 ?1 t- s7 F- Z   return 0;$ v! }. c1 _+ q3 R. b) h; C
}1 q) {2 L9 ?. E$ G2 q  Y& l

2 D8 X* y* H$ J4 X6 |1 s
; i8 i' B+ p! U' x9 ?static struct  file_operations mcbsp_fops=6 i: u9 e9 j4 |8 a- \
{+ \% p* q: z. C1 t
   .owner=THIS_MODULE,0 s; J4 U3 W3 J
   .open=mcbsp_open,% Z$ i5 Z2 \/ r
   .release=mcbsp_release,/ L4 q3 p$ f) _% r
   .write=mcbsp_write,6 {% x2 }9 ?# Q2 U* A% K# g# u( U
   .read=mcbsp_read,
7 d5 E$ b3 N* a# e4 b};
( S2 d# V5 }. `- j; T& |4 O! Mstatic int __init MCBSP_init(void)
5 r( _7 ?& ?2 {) B/ B4 p6 j( w{" d! v$ |% G& n  d7 S: h& n& |
   int ret;
* J0 p- x* p  c* U0 z" ]   unsigned  int   PINMUX1_REG_old;3 V+ U3 ~+ Y( _& `! [8 G( {
   unsigned  int   PINMUX18_REG_old;& b; _6 X: x, ?! q
   unsigned  int   PINMUX19_REG_old;
# ^, w# d5 |# J: P+ g   unsigned  int   temp;  
* g1 v# O% g) |   if(MCBSP_MAJOR)
8 y1 O* D( [* F: A+ @' U$ E   {
! j  U- z8 j  D$ u' Q0 `      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 j  F+ Y8 y5 o. d, E1 {! k      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);1 o* a& Q2 B7 a0 o) o3 y$ j
   }
& s7 ^& f, Q- h# ?. q& d$ k8 d   else
' C/ A8 H  ^$ m   {
7 i1 {8 m. W" B( Z) p; O- {+ R6 B      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
2 A1 E( L+ y9 Y      MCBSP_MAJOR=MAJOR(mcbsp_dev);
3 W  I6 ]7 x8 K   }
) T7 D4 J: T& }  P7 t; @* e! `   + Z' T3 t5 O! }  n' p8 p
   if(ret<0). `9 T" ]  s0 q/ W4 q
   {& w# C" [' \2 A  {  \' V
      printk(KERN_ERR "register chrdev fail!");) S7 E/ P0 K2 Z9 `4 O0 z
      return -1;$ o' V" O4 T2 t
   }
& `4 @. \5 P; b- B1 H   
9 W  F4 Z8 E: d0 ~3 ~/ Y3 V   mcbsp_cdev=cdev_alloc();5 o- B8 H" d- E; R2 k" I1 R
   ) w0 X+ X" Y, g) \5 R) s, S, m0 g$ h
   if(mcbsp_cdev!=NULL)
  a6 ^' k/ G* J- M/ u1 c' V   {
- }6 \4 M$ u9 B# p/ g( j  ~9 ?# m/ e      cdev_init(mcbsp_cdev,&mcbsp_fops);1 O3 C& \% C! e, N
      mcbsp_cdev->ops=&mcbsp_fops;, G2 g$ s% g0 p% G
      mcbsp_cdev->owner=THIS_MODULE;  F/ a* _5 H; M, a8 e
      5 D: T$ y3 c! A4 r& v
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))" Z+ Q* B. |. Y7 _
          printk(KERN_ERR "register cdev fail!");; `, `% M" Q* b* R2 F/ D. K; H; R; t' i
      else1 B. I) u  ]6 o2 C
          printk(KERN_ERR "register success!\n");; ?4 [3 C, `% A' d
   }8 v' p  B0 o9 N0 R- B* Y% P4 G( K
   else3 R/ q+ i' F3 i% v
   {, R6 J9 ~/ a" @9 o$ X
      printk(KERN_ERR "register cdev err!");6 H' O! ?6 [- x' p
      return -1;# Q  g" x2 d: `' v% w( T& {
   }+ b* R( n# _# S( }
   
7 F9 h9 j, Q) L4 Z9 E! g4 t6 A4 X* f  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' q! l9 a: Y9 O
   if(IS_ERR(mcbsp_class))
6 X3 n7 e8 M! q% o   {9 h2 a/ u; c% @7 Q/ h  O' Q
      printk(KERN_ERR "register class err!");, @; N. g& ?* Q9 G2 l; d
   return -1;6 ^" P1 Y: y0 k7 D
   }& |: P6 W7 w9 K4 \
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ U+ L6 v; m7 ~! ]4 |, i8 ~$ K2 d
, v1 |$ E; V' H- u. g   //PSC
  J: w8 a+ {/ W: S' a3 {( z  V   //add Enable MCBSP
/ Y! W5 d- l3 F% a) u( y   //test! o* Y* N; g2 i
   temp = 0x80000003;
5 u+ e/ j' S0 A4 R# z; V9 O   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 q0 ?& @; E" D. W" |   temp = 0x00000003;# Y! d5 r/ W5 J7 t( ~  G
   writel(temp, IO_ADDRESS(PTCMD_ADDR));7 a9 g& a+ g; \$ X( u4 j
7 V( {( o0 a: K8 \" r, o* p
   temp = 0x001FF201;
: @- s; r1 o% d/ J! ]   writel(temp, IO_ADDRESS(PDCTL1_ADDR));, V4 ~+ \: E7 u5 k
   ' `. z4 i- j  N' S5 n6 w$ p
   //PINMUX    K7 J6 t$ q" N' ^+ L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" U2 ?' o, m) ~# G: L0 B" Y( a   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 B' c- s) n( i& c6 l  p6 k9 @
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
( c$ u: x/ j3 h6 y2 v  p5 j6 |   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  Y2 r# _( \6 L( d) L, V: N. U   
0 L: }/ S- H- X% L1 e: h. C   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ |& K5 A0 D) A  ?9 ^   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  & Z  w; g* R8 |" c
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
. k# g( S9 V) v5 F$ ?: E. f   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% Q8 {5 T1 p" G

3 g' J$ v, c0 ?$ K. V   //RESETn,L138_SHK2
0 i& B7 G" U) [2 R# _4 x; l* E   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
' F2 l. R, Y8 e; W' G   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
$ y) m& f5 V: F) y4 p   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
' p3 r: u' e$ d9 N5 e ' b7 Y8 Z2 G- j8 B* i! u
9 I. Q2 R8 S) L: K; y
  //SPCR Register  K* c9 v: o- y. N9 o0 H
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset" _5 C" `3 e: M; z9 L
  temp = 0x03000000;//(DLB=0)
  |: X! [* C. E/ x' d' j9 t4 B( E // temp = 0x03008000;//(DLB=1)( g( @7 T- [' `4 {1 Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
. V7 G9 l! Y5 `) ^1 Q7 ?6 A6 m  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 g" ~2 R0 t$ G# [: s' H2 C9 l( L* k  printk("temp=%x\n",temp);& O8 |9 b3 E  {5 a( f

' D* Q; e$ g1 `, ?. J   //PCR Register
, w0 c# `- y% O5 o0 _   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) w* ^" e4 I0 `
  // temp = 0x00000F0F;
- d$ P+ F! _8 @/ m$ @6 t& i2 k  temp = 0x00000B0F;
  j/ k5 p* e4 o* f9 I6 K/ {" A" a  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized - a* [& \5 [0 d9 s
  temp = readl(IO_ADDRESS(PCR_ADDR));) l7 }& [3 a4 N1 f  @+ I" a
  printk("temp=%x\n",temp);  
. l& N- C8 Y7 y9 t, G% A+ A   //SRGR Register
2 ^) c6 T* l  W- \5 B0 \. n; `   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 g$ S6 v4 N) y/ N //temp = 0x301F000B;
* S; u. Z/ @, a; K   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 9 a! a3 C0 x% d
  temp = readl(IO_ADDRESS(SRGR_ADDR));
0 \4 ?# v3 O( A/ A8 L6 ?( Q9 s# u) J  printk("temp=%x\n",temp);
$ u! n% n! \& [4 }5 P0 D   //RCR5 g' `6 g! [: G+ b3 e
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) J, Q/ V( T* P
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- k* [2 l0 ]2 q. c" o   temp = 0x00440040;
8 O. F$ y' M; B& L9 A/ s   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  A2 j4 @" X3 r  e   temp = readl(IO_ADDRESS(RCR_ADDR));
1 q" M$ I0 J7 Q% y4 c. h) K   printk("temp=%x\n",temp);
! ?1 v3 t6 d1 O1 Z   //XCR
9 U  F6 j: m8 s$ U. D   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
9 r0 j7 j+ q+ l6 [* Q/ C) M8 k   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 B: ?) H) A, |$ }) |8 I   temp = 0x00440040;# E5 L8 t6 L  r9 L$ {1 u; D
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 {3 O3 o) y: q6 q) U   temp = readl(IO_ADDRESS(XCR_ADDR));
& `8 g1 s0 X5 D4 u& }, e  y   printk("temp=%x\n",temp);
2 T' m- b7 e/ Y) O# z$ `# [  udelay(100);
- j7 d/ O2 g$ n3 C9 }  //SPCR Register/ ^$ U) [) b5 j
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 R7 N8 Z0 |0 C
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1, P; Y. m$ q3 J( z; [
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled) E, _# U$ g7 a
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) {- ]3 [& x! x$ y. E/ z  printk("temp=%x\n",temp);
# K8 ]2 m/ O1 \# f$ O  udelay(100);5 {: R4 D: M5 f( I/ ^1 H3 W* F
. a1 d1 F$ H7 }7 u5 z; D/ m
  //set GPIO direction
4 o+ I! Z) \/ J; x. m$ U' ]7 H   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* f  l' h8 m0 @8 m4 |6 C
   temp = temp | 0x00000100;//EPR----input
) P' P6 ?7 {/ Z: p( K+ x   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
8 p- i0 z0 I" ]0 l1 j   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& J8 R: @4 e6 m6 V/ v; J1 {) Q % r( M* @2 Y; H9 v8 e/ [& @
   return 0;1 a3 i2 ]7 M( e- D  o1 P
}
+ }# }8 d, d) Q. E! t- L. zstatic void __exit MCBSP_exit(void)
9 U, ~6 e. }) N1 m- K{
# l2 A7 C- |" V$ s/ z   printk("mcbsp chrdev exit!\n");* b. ^& h; R4 r( r
   cdev_del(mcbsp_cdev);
8 L; u4 Y. S; p$ n/ _4 \5 u- r7 ?0 |2 f   unregister_chrdev_region(mcbsp_dev,count);3 Y3 Z! T; X! H% }& Y
   device_destroy(mcbsp_class,mcbsp_dev);
% x0 A6 l6 C- |, x   class_destroy(mcbsp_class);% z" q# k4 S4 v3 L) S
}
) D7 l6 s5 w: e3 Imodule_init(MCBSP_init);
0 J* b6 Z: g* u- Jmodule_exit(MCBSP_exit);$ i# g1 Y* H3 A6 i  W

3 d6 u' L: _$ V* N! ^% d& g5 @: WMODULE_LICENSE("GPL");" D6 u$ ]6 v3 U- m5 h4 Q4 N

8 ?; b+ X$ I: k# C/ ^& ?( T) I我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
+ e" I9 d8 @. k2 f8 P8 I* R$ O; X6 w* d我的应用层的测试程序如下
; K' }. T5 e2 B$ ~. S; j8 W" o#include <stdio.h>% C' K8 }* }0 l+ ~3 |! M9 A$ K
#include <string.h>( @" i: w) p, W9 K
#include <fcntl.h>
/ R0 R! O, p3 T! E# `#include <unistd.h>
4 w- c& w4 J" u# T# H8 a#include <signal.h>
0 |/ l" i* ?5 H! U: }#include <pthread.h>       //线程: b0 R9 G5 p. C) u
#include <stdlib.h>9 \) ~. O4 K/ b: ~6 `1 _2 d
#include <pcap.h>          //捕获网口数据9 P& k+ c9 M; l* ]/ j$ {8 V6 d7 z
#include <semaphore.h>     //信号: h2 F1 X1 d8 p3 F9 I# g8 |
#include <sys/types.h>     //消息对列0 r; C* n  ~1 b6 S
#include <sys/ipc.h>       //消息队列
, r6 l% B! ^9 I8 K/ C#include <sys/msg.h>       //消息队列/ E  b" T. g+ ?5 J
#include <sys/select.h>2 b' ?* W$ q7 m8 x; E
#include <sys/syscall.h>7 c/ V! S) ?; [8 U' v) Q7 K9 d
#include <sys/stat.h>
! Y( P4 g3 D! p0 {+ X9 ^% s#include <sys/mman.h>
% |* I5 V$ ~( r8 i! E* u- D#define msleep(x) usleep(1000*x)
1 E- @: C0 X- l5 a' E6 P, E- Z- y% f6 |8 f
int main()0 e6 n4 {3 s5 \/ b" e7 D0 q. y4 N
{ , z# a, k2 @; {3 J/ g
    //MCBSP,ARM与AMBE2000交互设备; R; r2 p0 |4 z# V& ^3 G2 |
int fd;8 ^/ n7 t; W, A( _8 n# Y
unsigned short data_write = 0x5555;) H' @2 p) v8 U0 F  Z
unsigned short data_read = 0x00;4 Y7 V% F& J3 P0 B7 Y/ S. E
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# `% a- w7 h% H. C //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' w& d7 Y- t0 p- S$ J2 B: }
   
& ?, i. P' Q5 R8 j+ b) j" d- h; ~  if(fd < 0)
4 h) |4 _, F8 B7 c5 R/ m  {
% G" y. n! q: ~. m& |8 K1 {) g     perror("open failed\n");
% ?. v6 u4 W) r  t: P     return -1;  m$ Q6 z) e5 K8 ~( d% }
  }- I  D% N/ B* D* l1 g% ^- S5 ?6 v
  
. \; Q1 I4 l! k. v  while(1)7 o# u  z% K* s- ]& {8 v8 |4 F
  {
5 @& u! B- m! v& V   3 Z: @1 R  O" b4 o; U; t
   //AMBE2000每次读写是24个字为一帧  \* R7 d) e7 G; W
   //写数据时将数据在底层存储起来,等到中断的时候再发送
6 G5 p- `& S# M% G6 C   //AMBE2000输入数据是以0x13EC开头的
! l' b8 @& B/ c' J   write(fd,&data_write,sizeof(unsigned short));" U: k5 C5 D. ~
   6 t1 @/ ~3 T5 D
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 }6 Z8 f  v; \* S0 i2 _   read(fd,&data_read,sizeof(unsigned short));9 `% d1 J! \  e5 B$ L* {2 [
   
. c! h; Y/ r& Q* ]" S   if(data_read == 0x13Ec)+ q# K" O4 `+ J4 s% Q
   {* I3 C3 p# w: U6 l0 d  y
   . m# V/ E' }1 d, X0 r4 r9 V
    printf("data_read = %x\n",data_read);& e  x1 s; G  C" y2 c" |' }
   }( L! A( p0 L! S, T' Z
   
- ^' P: [/ [. l$ Z# W  a& R) ]   msleep(10);% e0 Z0 A- f3 b, o/ o; h: X% W4 p
  ( H. F8 F) x8 x& b! ?) X
  /*
  ~( i1 t6 X0 F5 ]   ioctl(fd,1);   
$ D2 Y/ L- q& e+ K# S7 k sleep(1);
7 V; I' {( _, K3 d6 [1 P. } ioctl(fd,0);
1 k" C$ d0 r" }* l+ } sleep(1);
1 k! m) x2 Y$ d' L */
0 o" J9 I; o# N4 k, z# a9 x  }   
, C: O) }  \" H6 u+ A' Q8 R return 0;
2 [5 l1 R. g1 r, y- V$ w
" Y+ Q5 w8 m/ _9 I}# G. N5 p/ {: {4 d% i) Z) y3 m

" J6 F7 P$ u  w+ U6 @多谢各位指教,谢谢! 急7 m0 l3 t9 D) _+ v4 u
( r5 e) }5 y4 j! M; u' H

2 J' t. N0 c  w8 t8 ]8 T  N
! V+ F$ U- g: M) N9 K& r
' }8 r, ?& I, m% Q6 @
" r+ Z" n2 ^; {- B$ r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 23:50 , Processed in 0.052430 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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