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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 C. R+ `: f6 k$ ~7 A
/*
9 B7 e' T1 T* X# i% Z * Copyright (C) 2009 Texas Instruments Inc
  z8 b! @% \( b& U- H0 \- x! G *
" `) f2 N; o7 H. Y) n- _9 N( E# w * This program is free software; you can redistribute it and/or modify; u# `: |. z1 f4 |3 N8 u+ i
* it under the terms of the GNU General Public License as published by
& c) {- x4 ?% L$ {, \& ` * the Free Software Foundation; either version 2 of the License, or- I  b* Q1 ?# h; _$ ]3 D
* (at your option)any later version.' y' \) f7 S' c2 |
*' C5 x* L  x  Q3 C& l2 x) N8 r5 X" B
* This program is distributed in the hope that it will be useful,5 h, m7 w0 P) ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of& D  a5 j2 ]8 s& n1 S- l
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ {. c* u: O( f# D/ L* Y2 z. W$ W' J
* GNU General Public License for more details.( G. z) a5 H7 g9 i7 B; g
*% K6 [0 z9 B% ?8 }" M2 U, o
* You should have received a copy of the GNU General Public License# X# u7 L1 k  n/ _" E6 p9 y9 K( N
* along with this program; if not, write to the Free Software
# {# W! e" ?6 Q# u8 S6 I' v * Foundati
! R8 W: @, h8 K* N: Z& w6 W* M*/0 \8 r" X+ ]) K2 W% t# z% S6 M0 V' Z
#include <linux/module.h>2 I: {  b8 \- n7 u8 r& ]/ c
#include <linux/init.h>
8 T6 K, e( O' h; q#include <linux/errno.h>$ M! V; \4 J+ d; P& K" c
#include <linux/types.h>2 J0 D! j7 _* K' m2 b1 l
#include <linux/interrupt.h>
" W% z9 E" p  Y#include <linux/io.h>
5 ?3 N# j$ O* R- E' ^$ n; `#include <linux/sysctl.h>
" i: Y  ^9 j7 j: i5 }) Z5 C( I/ U( ~#include <linux/mm.h>
4 B, c3 A0 }; M#include <linux/delay.h>- @1 W3 M; l( s- M
#include<linux/kernel.h>( z% a) q) u! G/ N3 S' @) D4 e
#include<linux/fs.h>& T# y; d3 I7 G& w( p
#include<linux/ioctl.h>9 R4 [6 T! o/ |% A: \; z
#include<linux/cdev.h>$ t2 @- c8 l* R( ^
#include<linux/kdev_t.h>
& g& y9 y. R7 y+ \' f8 R1 s: J#include<linux/gpio.h>
5 }4 V) U, ^& v* Q9 A* z; ~* o#include <mach/hardware.h>  d4 H3 H) s5 ^7 M- w/ A5 j
#include <mach/irqs.h>7 e4 L3 m" }- H7 K4 w

3 |/ q/ ]6 u$ S2 M#include <asm/mach-types.h>6 y9 P% Q( J$ y6 R  X( ~8 h
#include <asm/mach/arch.h>5 c3 z; E2 b7 v/ ]5 j
#include <mach/da8xx.h>4 c& G$ u3 [% ~6 B# \# N* r7 K, @
#define  SYSCFG_BASE   0x01c14000* a# f9 e8 W2 R4 F, o
#define  PINMUX1_OFFSET   0x124 $ k5 ?$ E9 n; L1 j7 _
#define  PINMUX18_OFFSET  0x168
+ d8 I5 r2 r$ ^#define  PINMUX19_OFFSET  0x16c
+ `; v( W/ O& ?; I: P' G6 M#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) @% }8 z1 ?, N; O5 n#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" {' s- H4 ~: x1 B! u) T0 {
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
; W+ |6 L2 k- x! p#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR9 U. B& G5 Q+ x, {, t% Z
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
4 ^/ k+ P+ k8 \) P5 p  s" n                           
" O$ u' m. \( X  l#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
& g/ n; h! i4 Z" B5 B$ Y- q#define DRR_ADDR      0x01D11000  //MCBSP1_DRR7 W- w5 H3 F# R& y5 u; y$ Q
//PSC
' W( T, f5 B: a8 M7 ^1 k0 l8 r#define  PTCMD_ADDR   0x01E27120  
$ @8 C% d: ?/ A#define  MDCTL15_ADDR 0x01E27A3C3 u3 v: t- `9 f3 u5 b& ~
#define  PDCTL1_ADDR  0x01E27304
4 U8 a& V2 G6 L" T2 ]! {: Z//GPIO8 direction
1 W5 I7 u' A8 R) `2 e#define GPIO8_DIRECT  0x01E260B0% Q! }' f# C$ [8 C
#define GPIO8_OUT     0x01E260B41 J" \! D( [2 p1 W$ x/ z0 k
#define GPIO8_IN     0x01E260C0' v+ {+ \0 T$ J, }6 l* i

' j. H: m. N, I4 }//#define MCBSP1_RINT    99                ^3 v8 q% V$ Z1 |
//#define MCBSP1_XINT    100  
: p4 V0 o  ?+ P9 e- Wstatic int MCBSP_MAJOR=239;
- _1 c0 x! M- @. u) Gstatic int MCBSP_MINOR=0;
0 u: B# M# M: f; N; ]static int count =1;
) B5 t$ M4 \; w. D0 X/ k! W. F7 h0 ^* o& d" Y& t) z  S, j! N
#define MCBSP_NAME  "MCBSP-device"
7 |0 S2 l3 @5 f6 w
' z. v- x" Y; ?1 bstatic struct cdev *mcbsp_cdev;
7 a% R. l3 d  w6 ^, O6 h! K3 ~9 N! U& {static struct class *mcbsp_class;" N! g! x6 u. {5 c" ~) ^2 m
static dev_t mcbsp_dev;
# s$ U* Y; l4 _4 L6 Iunsigned int DRR_data;
9 n; `4 c- D3 ?$ L8 o; `' runsigned int DXR_data;
6 F. f: e7 \( b2 D2 Tstatic int mcbsp_open(struct inode *inode,struct file *file)
+ T9 ]  X4 A  P{
) |3 |6 J/ j- r% U* b4 p   
  }; j7 R, H9 e9 J   //interrupt enable,initialized
! h- S; {! k9 j( a8 _" ~( u   unsigned int temp;+ t* Z" G& e6 Y9 M0 L/ J4 z+ G
   //SLEEP_EN(GPIO8[10])---0
  {0 ]/ a9 N% B) P/ A6 s   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; C/ V* e5 _" z' ~4 F) L, \
   temp=temp&(~0x00000400);) ~2 X9 e8 D  f5 W2 O3 V
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' ^# _! o# F. P
  //RESETn(GPIO8[8])----0----1+ N( q! Z2 v: D& _! \+ E0 d% l
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ ^9 J# u. @. G0 \  [+ h   temp=temp&(~0x00000100);0 e5 q/ J7 [5 i) q# ?8 X
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 I, ?  b- o( p
   udelay(100);3 }0 H! p( t* b2 V7 |
   temp=temp| 0x00000100;' g5 k8 L6 ^& x/ a5 y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 J9 r! Y% D8 H. g$ o" I3 j$ m   udelay(100);- t0 z0 N( E5 ]% g1 j
   printk("open success!\n");! t$ Y9 R& V+ i/ x! I
   return 0;
8 t  X: f" J2 @$ \# X  \& q}+ ]1 {8 |5 Z- C; ^3 Z
- T+ k/ h1 n) z4 `+ `& l
static int mcbsp_release(struct inode *inode,struct file *file)8 X/ Z: Q) |0 z; c1 C9 f
{
. M  L# e# B, `+ O; @" x   printk("release success!\n");
6 R/ x5 G. F! L: ?" C6 F   return 0;3 p8 t4 H3 [" j4 W! i1 ~
}
* Q5 u' [" j. K+ |* i
  g% n' Y! K$ t+ ]/ c& v. Mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 m$ U* v( f& [
{
+ Q. o$ P3 J1 V  ~    copy_from_user(&DXR_data,buf,len);
; f( q( d, s" F( w2 y) o5 |- |    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" P8 T3 k1 r6 q( D+ p$ y    return 0;2 v4 \' q$ t8 D' X' {) l6 K, ]' P
  I, _, P) G  W8 _5 d* z; p
}
0 ^: M' x% ^. F& j! n  I. @6 f6 P9 K& @8 ^: S  o* `9 E7 q1 K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; J  O3 |7 G: u  P{ 7 t$ h) K; W9 z6 C5 Z
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) B, {5 _1 D0 Y% Z' _   copy_to_user(buf,&DRR_data,len); , J4 ^+ R3 P! Z' b
   return 0;$ A3 L; M# A0 d- y8 R, V
}: |( C* _0 p1 X% ]

+ W5 B$ n6 I/ G* @  w$ ]( w2 q) g4 S  a+ _# n9 H* o' \- O
static struct  file_operations mcbsp_fops=2 m# j9 F( a8 `6 I5 _
{; U( @; C$ E  q* F$ u( W
   .owner=THIS_MODULE,
1 e* [- \, C- h: Q0 m   .open=mcbsp_open,% v$ w2 M: l4 F, |
   .release=mcbsp_release,
7 L+ v' ~( L2 U$ c  G; g/ S   .write=mcbsp_write,2 w* R0 D, c. k0 o
   .read=mcbsp_read,2 M9 y; x; a2 x* x1 A
};6 E4 L0 ~$ w3 c
static int __init MCBSP_init(void)
) E. O$ ~9 Z. ^3 d$ b. H{
# R: b" Z6 ~4 V6 d   int ret;/ l% U1 z( n2 k9 Q( p: z) M2 y8 r# f2 O
   unsigned  int   PINMUX1_REG_old;: d5 \9 ]8 |3 Q! N* D" q
   unsigned  int   PINMUX18_REG_old;
5 X5 L6 {) v9 g  d$ J   unsigned  int   PINMUX19_REG_old;
! _' }) x7 K$ e8 b1 r# z   unsigned  int   temp;  
5 R4 B; y# O8 d' o5 i) K% X   if(MCBSP_MAJOR)
2 b) b0 z8 e$ }' q% m- U   {. |. O8 s3 L8 _5 i$ _
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ f% h. |/ X% ^+ r" S; x      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# b/ ^/ c; [* _5 l, B7 I" v3 P   }
, H7 w$ J7 o- Q5 F1 k   else% p; z* I7 t( h, e  `7 u
   {2 N+ X. {1 T7 j) ]
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ D" z3 _8 B. g" z% h  {: r- U8 C  O
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
' e7 n$ I3 _; g   }9 H' y6 ~4 O# v4 {: x4 o+ n
   
  z; v4 |/ C1 j! v5 O* R4 X   if(ret<0)
6 G0 |* M5 z% b, [% Q$ K   {
4 K2 Z5 P& U- w# H4 r      printk(KERN_ERR "register chrdev fail!");
. Z) h/ P* O+ W+ m6 x4 q: P& v      return -1;1 {0 p' i8 O2 r! l
   }1 L! b6 B; C& r: r  i
   
9 Z4 |( B) `; l   mcbsp_cdev=cdev_alloc();! O" A2 y' i7 h& r0 ^( H- D
   
9 }' A* ]$ Q8 b4 P   if(mcbsp_cdev!=NULL)
- j  z6 j6 Z1 K2 r) h/ I! q  {   {5 h1 R; P8 g. i" q' ?# W3 A
      cdev_init(mcbsp_cdev,&mcbsp_fops);# E) Y, o& I! m2 n* k3 q
      mcbsp_cdev->ops=&mcbsp_fops;
3 B8 U' q# P: Q% V      mcbsp_cdev->owner=THIS_MODULE;1 k/ j# ~3 c: @1 _
      1 M) c. A) Y- q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# M! m1 F' Q" V9 T) ]$ z
          printk(KERN_ERR "register cdev fail!");0 @' T3 M* Y, D
      else
, F8 W9 a" S& E8 Q          printk(KERN_ERR "register success!\n");- d; _& [: H; L  L/ N3 F" h
   }
6 V4 c4 u* d& B   else
' G! C6 _0 h; n4 K, D4 D- Y0 o   {9 y3 G$ f# o' m  X! a1 j! f
      printk(KERN_ERR "register cdev err!");
5 h) b; h' m1 E* _# u$ j      return -1;
$ U# I) H% d0 u. s. {   }; S5 w# d! Y4 Y6 E
   , A. y! N8 b( T  P' q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* {1 |' }8 ^+ g% \) v
   if(IS_ERR(mcbsp_class))
% S9 y3 s9 U, S) y6 I   {3 }, z4 M  w$ E2 D/ b7 J
      printk(KERN_ERR "register class err!");
5 H3 ]) a& _% o  q$ a3 [! D& u! T) U   return -1;3 i, E% ?2 D$ G" _) {
   }
# H2 v) u6 T) m- R3 \8 y% Y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- O+ i- b7 A2 J; e/ |8 e3 D: C; O' U

3 V  z) K- S" N   //PSC
9 I1 @2 [; u$ j   //add Enable MCBSP; _. p4 f' y, F2 ?" Z
   //test
, ?5 ?$ c. O5 g. h2 [   temp = 0x80000003;8 Q8 i* V9 p/ @5 w. V  @3 _; V
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
  o7 _' N8 n1 R% O2 a: L- i5 T* y   temp = 0x00000003;
3 q/ b" G- O  q9 E* }0 L3 b6 }   writel(temp, IO_ADDRESS(PTCMD_ADDR));: G+ ^) ?7 z% h. K, [6 |- z
4 _( C" i! ]% X1 w, c8 [& r
   temp = 0x001FF201;8 K0 t2 D% q, X0 b- k
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) h3 x; k3 P7 X1 B4 x+ z8 K3 E
   
5 u. q) N, M! c, g   //PINMUX  
. _) |. i+ i0 v: k) \   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 [' [% q* U" I/ E9 a   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
0 x. N5 U& s- i! F# Q, k   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
, f" S* B2 G# m# S% a6 y5 J   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 x" C9 c) J; F% b4 j   
" ?9 J7 x+ A' h; A% o1 Z5 L   //SLEEP_EN,EPR,L138_SHK1,L138_RC
8 L( D* R# P9 f- u   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 U7 u) K6 R) D, L   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ( u* W6 u! e% C) s. [6 m% M
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 w1 \6 L; b- X- i- ?9 q: Z
& Q0 \4 p) J0 t2 g6 s6 r/ Z
   //RESETn,L138_SHK2
4 s2 k% V* L1 G   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- b1 o% X# A/ G( e- Z; e  V   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
5 ^- v$ N3 b* n. x: ?3 e   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. X5 T3 y8 _( W% X
' h6 z0 T' }: S9 T, } 7 [: J4 ?: N$ P1 k! b- l" ^  R
  //SPCR Register
" `5 |7 H3 R0 n  \& v  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ J* e; }7 J* }4 h3 `" q
  temp = 0x03000000;//(DLB=0)
' y0 J' Z. H; [: S( ~ // temp = 0x03008000;//(DLB=1)
) A) ^7 H4 X) D7 J4 m3 i- O# M2 L  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; }$ {5 x) [1 P- T4 J  y  temp = readl(IO_ADDRESS(SPCR_ADDR));+ [* R& s% c0 f
  printk("temp=%x\n",temp);
& N: v) i; N, j# K # r# x' ^  z1 @  @& t$ U
   //PCR Register
% k4 R6 L" p* f9 u8 q; ~, p4 P   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% |+ f* `) ]7 l5 i7 j/ \0 @
  // temp = 0x00000F0F;
  }2 M  x( Y# ]$ D  temp = 0x00000B0F;! o9 u! _% d8 r) I/ `. w2 X
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
  A* ?- \4 W: B9 ?# A# Q; F/ E  temp = readl(IO_ADDRESS(PCR_ADDR));! S0 U( \& _7 v! Y! Y# ^
  printk("temp=%x\n",temp);  
( X1 D+ C1 L; b# K- h   //SRGR Register+ L7 ?3 [$ d, x2 ^6 V
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( _( L8 _5 a8 ^8 E# _& v //temp = 0x301F000B;
5 y% Z- p7 A2 T8 v6 g  J   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) T9 u* K! x3 k8 q" U  t& F3 F8 s
  temp = readl(IO_ADDRESS(SRGR_ADDR));
+ k! n/ b& G0 E6 z) R) O9 ^+ `  printk("temp=%x\n",temp);
0 F0 ?3 [( s! O* G   //RCR3 o6 g+ K) u8 P; i- r1 A" F# d
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 M! V& c, F2 w( I" k& H   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ E& J1 s4 y' a# u, G   temp = 0x00440040;( t% N  m8 P# T4 w- @  e7 Z8 i3 L8 d4 a
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   " V9 ]5 G. j) p/ z& u: j! R8 h
   temp = readl(IO_ADDRESS(RCR_ADDR));. A' m" \& |$ Y- Z0 v
   printk("temp=%x\n",temp);# M$ X: J, ]7 k. {$ z0 L
   //XCR
% Z# K" @! n: F  q: I$ l   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 X; \% Z' G) |" V0 S
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 p8 J9 ^, c+ ^' |3 Y   temp = 0x00440040;3 |; _2 p) g, e  ~3 c
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 r# q) S- H3 ]7 T. d4 |5 L: n   temp = readl(IO_ADDRESS(XCR_ADDR));
% `. v  ~+ \0 \7 i4 ]   printk("temp=%x\n",temp);" x# B) @( L# C
  udelay(100);
& A; h0 p% P' N  K$ E' \! h3 i" D  //SPCR Register
4 K" r' I2 h4 Q* j* i, m  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 u- x( g  v' Q% u  temp = 0x03C10001;   //DLB = 0 VS DLB = 1! _' B6 D- d) ?. z0 u+ m0 ?/ T  P
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
1 l3 S) v  W- v9 x, N  S9 m  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 C5 x0 H+ _0 K" F# p; F  printk("temp=%x\n",temp);' o7 c" c' l' j' n
  udelay(100);: V) w4 _  o' T, k0 {. j9 @

5 ^8 K9 [% r! ]' x  //set GPIO direction6 V1 i$ }- J% ^. n3 a" v/ H0 r3 L
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
1 j3 L5 N  A& p. `   temp = temp | 0x00000100;//EPR----input
( t. C" i. }# S- k- v4 O   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& Z  A% c! ~- T3 v
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 K  }; ?" G" i  z9 ~9 t4 N" D% S6 B , r/ ^4 \' F3 C
   return 0;7 n8 U  U# l6 C) a
}
) @& ?9 [( Z$ mstatic void __exit MCBSP_exit(void)4 S# P/ Z+ n/ S6 J( s0 ~" U
{$ N* [8 l+ R* x- i
   printk("mcbsp chrdev exit!\n");
+ e9 F# d) f) A   cdev_del(mcbsp_cdev);
1 s7 J: F) x* k$ ^   unregister_chrdev_region(mcbsp_dev,count);& V( G$ f8 u  g- s# u6 w+ c% R
   device_destroy(mcbsp_class,mcbsp_dev);$ {- [: P4 ]8 R% q$ y, d% M
   class_destroy(mcbsp_class);
2 {( z, o- l4 r}" S' `- w7 R6 h; Q7 {+ g, M
module_init(MCBSP_init);2 W4 ~' L: i$ s3 F9 j* e& P4 L
module_exit(MCBSP_exit);
. C$ F$ N! T, Y& R% D: j9 j' w5 R: s( Q1 e
MODULE_LICENSE("GPL");
; w$ ^. R, w* Q& r- r1 ^
0 G( {4 U8 @. h  Y0 f3 t" E! K8 ~我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ F4 Q/ C. x7 l
我的应用层的测试程序如下* t- r$ J% f( ?9 u' _
#include <stdio.h>* @% P# {* `# i0 t
#include <string.h>
, E9 ~( b8 W0 H; Y. O#include <fcntl.h>6 ]4 w, Z% \: D4 o
#include <unistd.h>
& g, c. a8 ~$ g8 M( j6 {#include <signal.h>
$ N3 I: s( D: z% H#include <pthread.h>       //线程
" ~& @$ I7 C5 Y#include <stdlib.h>
. f3 H+ Q- J! {& l1 B& ^#include <pcap.h>          //捕获网口数据
6 T: h8 v8 j& c3 Z( t( t! x#include <semaphore.h>     //信号
; s# F; }/ P7 z; _8 H#include <sys/types.h>     //消息对列
- l4 H; E+ T& ^. U0 Z1 n#include <sys/ipc.h>       //消息队列
1 I# C' O* g- ]#include <sys/msg.h>       //消息队列( \' i$ _1 }: r- ?+ y0 r6 S% ?
#include <sys/select.h>: k4 |/ Z: Y& {( l# H
#include <sys/syscall.h># G8 z8 D/ y: \& I# [! w
#include <sys/stat.h>& r% ]- a5 w. f7 j- U
#include <sys/mman.h>: }' T9 J0 R1 x- c
#define msleep(x) usleep(1000*x)
# c( k! m5 l; Y
) f: P' ]. D, [. u4 {- mint main()$ X% e, \1 X, e* B. J
{ . Z2 Q- I" D) k. k9 U" c: `
    //MCBSP,ARM与AMBE2000交互设备
, z4 O# T$ M1 K1 V int fd;$ M2 x5 m, [4 e
unsigned short data_write = 0x5555;
( o# r& Y3 Q; M9 g* P( |" p0 Z unsigned short data_read = 0x00;
9 G1 q% L1 b8 v# Q& _  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 o* L9 r* E, c3 R //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 D' y; |: o5 c1 V, L9 x! b    + e! t4 M  b' D0 q0 D5 S2 J% |  H: y& x
  if(fd < 0)
; v# k8 m& I4 y, o- Y8 q  {
( }2 n# B+ S7 @8 t     perror("open failed\n");
, [3 H% N+ Z7 _& r8 S3 K' ]     return -1;6 M8 b* h; Z5 m( p% B" X
  }
$ F& h) n1 z& h1 ?- B  
. J5 U! j) r4 x6 K! A8 k& m. `: s  while(1)- g% N, ~' [, j7 T- X# ?5 F; H# F+ ^4 b
  {
4 x) u. a  w3 [5 w& f8 _' X! g   . ~* K9 p2 ]4 C" B
   //AMBE2000每次读写是24个字为一帧
+ a7 s* X" {. C8 n3 q! x   //写数据时将数据在底层存储起来,等到中断的时候再发送
* f" N+ d8 B3 M. Q   //AMBE2000输入数据是以0x13EC开头的
9 _, ^# O* b; X( B- j/ W   write(fd,&data_write,sizeof(unsigned short));1 J# W( ^; [' r8 M/ h8 P
   
4 r- `& g! R( ~0 G   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
. r( ?8 r0 I/ v; W; F& L1 f   read(fd,&data_read,sizeof(unsigned short));0 G+ B+ L- j0 d+ }5 H3 v& h
   
* Y9 H% h4 c) m1 ?# J   if(data_read == 0x13Ec)
; e$ n2 l3 D/ q  C( J4 i   {
0 k" O+ x; D' Y3 I   
! D  W& b; N1 w0 Q. L    printf("data_read = %x\n",data_read);
2 ~2 q* F+ B) H   }
' u: B8 j) p9 o9 e7 X. Z+ L8 a0 i   
8 l0 A4 a! d- j2 U) p' u4 B   msleep(10);3 f) m$ i0 z' i8 F/ e
  8 U3 p. w% g" c& ^2 ]& t* d% z' @
  /*
& `( L$ y2 a  o. T# l& a8 y   ioctl(fd,1);     U* o4 A. w7 Y5 ~& R0 L& u. |
sleep(1);0 {( M% f6 P* j. W: p- ^" _7 t: T) C
ioctl(fd,0);+ Z- w; y' F6 |9 Z# D8 F
sleep(1);# L" _$ a* O+ G7 F9 H
*/
& w% W  h8 e8 C9 F/ Q; b  }   
( E0 e" `: p8 {# R$ y2 D return 0;
6 _5 l. b% R7 y9 `: D
8 R* A6 Q  h" ^4 C}, a0 }% W2 F. A" s9 ?

  Z3 N: l. Z: E# f: S. J* h多谢各位指教,谢谢! 急5 h+ s4 f( h' {6 r& O# \

+ t  Y& }! Z' ^# _7 j) ^( G1 Z/ b5 ?2 o1 D; B
8 ]' C2 L6 d0 E& H. Q
6 X7 o4 d6 s( f* f+ }

) Q5 v1 c7 ]& D/ H% I! q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 03:07 , Processed in 0.041726 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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