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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; |# K4 a( D0 u1 t
/*
$ U; W# r' s% ~ * Copyright (C) 2009 Texas Instruments Inc4 t4 l+ V. k% F; h5 `, x
*
; d7 f; {$ q- u: W0 D1 k * This program is free software; you can redistribute it and/or modify$ _. ^6 d; o* }
* it under the terms of the GNU General Public License as published by2 d% e* J- t7 \; B$ H4 Y
* the Free Software Foundation; either version 2 of the License, or* b( ?2 l- \) H
* (at your option)any later version.) l/ v; B5 C/ ~
*
( c6 M% V: m  k; [3 r- t1 ?; W  I * This program is distributed in the hope that it will be useful,
. m/ r3 g8 M/ o% M( }% p3 z6 ? * but WITHOUT ANY WARRANTY; without even the implied warranty of9 e2 d+ G/ A4 H& z' f$ q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; i" Y9 r4 }) c3 c6 i * GNU General Public License for more details.# L3 \- n1 f5 z4 C7 N  g8 L
*. v. h, ~# m4 Y
* You should have received a copy of the GNU General Public License" _& w# Z( S( z
* along with this program; if not, write to the Free Software
$ l* q% m! O/ P( p) z * Foundati
. w% A. D* ^+ W- `$ C- U( i9 u*/
6 r& A; R- G: A0 H6 k#include <linux/module.h>$ z4 \8 m  _( F
#include <linux/init.h>) t( w4 _1 H, C( k/ m0 Z
#include <linux/errno.h>' S3 u( Y! M2 P, Y* |- L0 Y# P
#include <linux/types.h>
* S+ h# R1 r: f8 R' ?#include <linux/interrupt.h>. j* L# ~# R# A" A+ @
#include <linux/io.h>7 `' q3 C  a; v) a
#include <linux/sysctl.h>
5 m3 d3 I2 B$ J0 i) D: S+ S#include <linux/mm.h>
, j2 }  H; J4 s6 k#include <linux/delay.h>
% l" w0 `' r8 V1 ?#include<linux/kernel.h># b8 j6 b4 J3 O' g; i6 |3 B
#include<linux/fs.h>; N  F# C7 C" b* {% p7 o# x
#include<linux/ioctl.h>
! c$ i: ~4 S+ ?) D" B, m# u7 P#include<linux/cdev.h>- T$ C5 J  J4 e# @0 u* L& S, [% X
#include<linux/kdev_t.h>
  E" k" D) R( T& @) D/ `7 c#include<linux/gpio.h>. V7 o' C5 k2 z( I
#include <mach/hardware.h>
$ X+ }; B# o  k3 l' a8 p! u0 k#include <mach/irqs.h>
) L# b' f( g. A
4 u4 ?) j' Y2 O' f% o#include <asm/mach-types.h>7 T' Z% F& V" W3 z' w
#include <asm/mach/arch.h>
" T" T$ u  D0 t* u#include <mach/da8xx.h>
, a: X& e. i7 _( B3 b* e#define  SYSCFG_BASE   0x01c140000 u3 R$ K* m! I* d
#define  PINMUX1_OFFSET   0x124 7 s$ U, B+ H8 t. l, ]7 a0 ~3 Y' L
#define  PINMUX18_OFFSET  0x168
8 o4 I( ^* ]( q& k0 {/ O( l#define  PINMUX19_OFFSET  0x16c; \" o- i: `5 `+ i4 {
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
- ]# V+ }) A! T7 M#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: \9 `3 b, B' H* p0 i( T#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 G# P; W& r! t; o& S' ]
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 C% n2 C2 ]5 p- `: b#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
9 t" W9 s7 W: Z2 k+ o, v                           
+ r! G, @, [( f( A1 E% a4 S# h  w#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
- }& l$ i8 J9 B#define DRR_ADDR      0x01D11000  //MCBSP1_DRR& U( D8 y5 A0 W( M3 B  ^
//PSC3 i7 I$ X1 J) E* J
#define  PTCMD_ADDR   0x01E27120  
" Z6 m% z" e1 K3 L+ R' V8 `#define  MDCTL15_ADDR 0x01E27A3C4 |7 m7 x! N3 E% {5 @/ n
#define  PDCTL1_ADDR  0x01E27304
2 x$ e# T; o  Y//GPIO8 direction! [% Z8 f% d4 [# d6 T8 G
#define GPIO8_DIRECT  0x01E260B08 c/ b- X6 C# h+ ?: x' h
#define GPIO8_OUT     0x01E260B4; C$ d9 r8 p1 z9 R. |. a
#define GPIO8_IN     0x01E260C0
% ]& d" v* R- r4 I" A  x5 \; A; ]
6 Z' _9 g. p9 x* n( J; V6 A& ?, E! P//#define MCBSP1_RINT    99                B! H! i( b4 `/ x3 c
//#define MCBSP1_XINT    100  : n- y5 n( A" t0 h2 D% N
static int MCBSP_MAJOR=239;
2 a& Z% o# B1 F( d/ ~, V5 F  Q/ E1 Zstatic int MCBSP_MINOR=0;
' ^4 b9 q/ T' Qstatic int count =1;
( L# S, K( j; u2 y+ p* T; N; W
( {2 `0 m8 N' Y% I! Y) @7 i#define MCBSP_NAME  "MCBSP-device"
: @' V9 N8 i+ C% j$ d, Q6 i; T+ m; A, y0 R9 Q, \
static struct cdev *mcbsp_cdev;
! q0 b6 D- Q8 \  W2 ]; j7 mstatic struct class *mcbsp_class;
2 ?0 W% I0 A' G6 ]2 g3 A  vstatic dev_t mcbsp_dev;0 N8 [& j, T  z9 I2 A# i9 \
unsigned int DRR_data;
& i3 t4 l$ V; o' B* R$ y9 S! Qunsigned int DXR_data;# c) l8 b, I# D4 z$ T  ^) U
static int mcbsp_open(struct inode *inode,struct file *file)+ F8 S: T7 R! s  p8 q$ W
{
( x+ w+ R) o6 s! a   . V" Q: J. B8 \+ u: z5 \- d: _
   //interrupt enable,initialized# Y# o' C  E5 U2 v5 G
   unsigned int temp;2 Z' j' v) V! [  {
   //SLEEP_EN(GPIO8[10])---0
% Q" x# W+ c+ A# [: W$ U- A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 u1 J* W/ M4 x1 L) H4 o
   temp=temp&(~0x00000400);
1 w& S/ G9 K: \( n. F  u   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' \1 H$ n( p4 Z8 T1 {  //RESETn(GPIO8[8])----0----1; x0 o! a4 H; y8 M2 b! K5 O
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ ^7 _) n  p$ v' i  {0 ^
   temp=temp&(~0x00000100);
! Z* @, V- a' e2 K$ i6 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
1 T$ {" i7 P+ ]# ?   udelay(100);
0 w2 V$ d& Y5 B6 @0 ~6 F& N   temp=temp| 0x00000100;
5 x1 a8 o: |! p; j   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ _5 ]* W8 T6 g. @5 \9 L. }$ I   udelay(100);
" l2 S. W# z. X4 H( K   printk("open success!\n");& a8 w2 w( j4 J9 h% M7 [
   return 0;/ n  Z' r- m" o  b
}9 I4 Z* u( k  v
2 Z1 l: S  x5 f' |9 S: I; m
static int mcbsp_release(struct inode *inode,struct file *file)
$ A5 _) Z1 y" o/ ]6 ?4 W: A{
1 q# V3 H8 L; o1 y6 J   printk("release success!\n");  T9 t% \1 \0 `) Z# b0 M
   return 0;; f( ?. n9 l! `) Q7 `+ @% |
}
; K' a# E. h6 T6 t
! {2 C0 l* H: q$ U" u$ o5 u4 j( qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* P( n8 n/ o- G1 l2 H* ~( Y
{4 A% t8 z$ V+ |( d# o; H
    copy_from_user(&DXR_data,buf,len);
9 D$ `6 ^6 f8 v2 J    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       & D. R* g  t7 d% ]
    return 0;, T/ y0 E6 p" ]
; [( L# n" T3 q1 r; z
}3 k8 W7 }' a- I" |
4 t+ l2 F1 R6 [; I* Q" }
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( e* w# h! {: k. q; }7 G% H{
) i" b6 v/ i( r1 R. v& B   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 E! `, `; P$ q) v" r0 @
   copy_to_user(buf,&DRR_data,len);
$ Y6 z3 _# N& z$ c   return 0;
6 s, a$ V2 }( `6 D. D8 ~}8 s$ J+ V" R( E

) H, |! h: l4 v6 R3 r
& N  Q# C! j" wstatic struct  file_operations mcbsp_fops=1 x3 K' f& J: e9 O. {
{4 H+ p, e2 I, b" {& P0 I$ T+ E
   .owner=THIS_MODULE,. B6 |) B$ C( F6 S: M0 }
   .open=mcbsp_open,3 q, D% ^1 ?, M  p+ l% H
   .release=mcbsp_release,
1 D. k  z3 P& Q* z   .write=mcbsp_write,
, ^% M) N* O6 S5 K5 o0 L   .read=mcbsp_read,2 \  x( i& T3 ^' s( M  l
};
; y9 x; h6 F* A" y) kstatic int __init MCBSP_init(void)/ W4 a0 G; c7 ?) `9 d* U& y$ t, M
{
& U$ r2 h# R$ C" R6 e  f   int ret;
- r1 j8 D" N( Y" W& e5 a/ l# @( A   unsigned  int   PINMUX1_REG_old;' X; n+ C) U1 e0 t1 w- P  b, S+ O
   unsigned  int   PINMUX18_REG_old;: W) u! R: P. e& n
   unsigned  int   PINMUX19_REG_old;
( m) p6 c! Q' [/ z( T   unsigned  int   temp;  
; g4 z# {+ W3 v! n   if(MCBSP_MAJOR)
' ]; Q7 q# R) f3 F% q: _   {! |, Z# r9 {, S
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 P. r3 P' b1 C' G- u# i
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ N7 Z5 G- L) u; Q6 U* u
   }
& j/ `9 d3 ^+ A) l% _  J, H" Z/ R   else; l. f6 s( C9 v( ], n
   {1 J' x( G- v0 I, k- p8 ~7 W6 ]
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 C2 W! U; M5 M  J+ D7 A; q      MCBSP_MAJOR=MAJOR(mcbsp_dev);
. Y) W, k9 E' e( m* G. O& X" f+ A   }4 H5 {$ Q1 N% O
   ' m0 n; U2 f4 w  q4 U2 }3 v2 v
   if(ret<0)/ r* {& W( u) O7 T  e3 S7 n
   {4 h9 Y8 N! F* K. c
      printk(KERN_ERR "register chrdev fail!");6 A+ T! q! ?4 ^, v$ N  G
      return -1;
$ G+ B3 ]2 ^+ `7 O; q% D1 B# K5 J   }+ y- ^% ~+ t# ~/ ^" a% C
   # I/ R% M  U* i5 h  }
   mcbsp_cdev=cdev_alloc();
* F8 {8 F7 X, v5 |1 x" q4 i   1 K4 w2 Y: e7 T  B( Q% O5 @# Y
   if(mcbsp_cdev!=NULL)) [, W+ Y& {4 x% k# N2 `
   {
& G. G9 [5 U1 V5 t% n6 h, T4 T9 S      cdev_init(mcbsp_cdev,&mcbsp_fops);
5 e: Z( z8 {; `, Z2 N* @      mcbsp_cdev->ops=&mcbsp_fops;/ a  @( y6 ?; A6 E7 c5 E/ u
      mcbsp_cdev->owner=THIS_MODULE;
. R& o6 e! u) S) M' B/ I" h, @      
) `8 D$ m% [8 y; i" K) `  e      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), `' U7 E7 Z: g7 ^: t
          printk(KERN_ERR "register cdev fail!");
7 W4 _( j- A. B+ G      else
5 h* S# V9 S1 q5 e2 D  F7 F          printk(KERN_ERR "register success!\n");$ M/ L8 X3 {9 T! z/ s+ d
   }
  g; o/ ^0 k* ~6 k/ M# `5 _   else/ \& Z: b/ x# E1 h
   {
% L+ V' f. r3 |7 I      printk(KERN_ERR "register cdev err!");! p9 I) @7 {, I6 N% Z* X5 C# Y
      return -1;
2 g: W9 ]- q& F1 S7 C( G3 N   }
& `3 q3 L6 U& w" S' u. f  u) K# l     z) |6 s# T7 W3 Z9 |, [+ B& m
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: |( T$ }: w- v- Z* E. [$ Z4 ^/ v   if(IS_ERR(mcbsp_class)); ~% O+ i  @7 u7 \
   {
! Q" E9 l, R" V3 I! a1 q( ?3 d% x+ z" Q      printk(KERN_ERR "register class err!");
  P2 r+ u8 W' Z: R3 @' |$ \   return -1;8 |" {: ]( \0 o! y+ x3 L
   }
3 ?% [! q0 f6 [8 J* M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);7 V7 ?/ Y0 u8 t" L# J

4 _/ `6 \5 P% K* K   //PSC
* V, ^; n" t! ~/ _0 j: `# A   //add Enable MCBSP
3 M5 |+ X4 T) }# ?( G, G$ i8 J% g; i   //test. a; d. i. X0 E& S8 Y- U
   temp = 0x80000003;1 t4 `5 e: {' k9 p5 E$ Z7 j* p/ d, i
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 n3 z7 L4 ^( S   temp = 0x00000003;
! f0 U& e" W% {4 Z2 p   writel(temp, IO_ADDRESS(PTCMD_ADDR));2 S* k9 p9 }3 Z- Q+ g+ ^. m  n
, h' z9 l1 ~  f3 \% X" }
   temp = 0x001FF201;/ H% _9 |; d) [& T; r
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 e9 O" c7 Y( c1 {! [/ R1 B9 ?   
0 M" A8 g* t0 v& T   //PINMUX  
$ E# m7 q; J/ I/ D% f# j: l( s   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 Q( i/ Y- I4 x, X) F) k   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 E9 i9 ?6 j3 w. u0 j2 S  X2 t
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
' T; w4 x0 B3 S# S( ~! h4 C3 x   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% y" H& N, R8 S0 O4 M% ~5 L   
+ [) c& e: Z! J, i   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 p. C' @/ w9 m4 r
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
# b. d1 i' o! j4 W6 K   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;     o2 |6 O4 ^5 N2 M9 Z
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' h$ z* Z7 k5 ^$ m! P8 q
2 D: L% ?4 U# V) ?   //RESETn,L138_SHK2' W2 p: }3 N( J0 S
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . C% y' O. i$ X4 O5 s% x' ]* s
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   0 e5 a. q/ n$ s9 i$ M- S
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. t7 A! {% p* Y4 b6 |% t ! m1 [. s' {/ ]: `$ i, E

: Z0 L4 U$ `! t  //SPCR Register
8 R6 H4 ~4 E" u3 h  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. i; }. b  Y9 T4 c* d* g, w/ T  temp = 0x03000000;//(DLB=0)5 c4 f5 w1 \- y# V* M
// temp = 0x03008000;//(DLB=1)% [* j$ |# L% ^4 \% \. `) v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% j2 R2 E$ M  \# f+ j$ Z  temp = readl(IO_ADDRESS(SPCR_ADDR));
4 {: T. G. u4 F0 R% K  printk("temp=%x\n",temp);) d0 U2 M5 }" q# n- |' J

7 ]9 z# r0 v* W& ~9 y0 L   //PCR Register6 G! r, o/ O# ?" s  [
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, ^, O& @, G0 m- H1 {
  // temp = 0x00000F0F;. q1 p1 A- _' m0 u
  temp = 0x00000B0F;
, E* U& R- H; P, K0 {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
! `4 P7 T  ~9 p  temp = readl(IO_ADDRESS(PCR_ADDR));
$ v% @% b, J; j+ x* d& K- f% e+ x! l  printk("temp=%x\n",temp);  " T0 }2 ~' K1 q1 c- E
   //SRGR Register) e; W; j* W, R) w( s0 A3 l
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 K- I. B8 H! C5 @2 f& `, T //temp = 0x301F000B;
! u* B& H9 r" `; _" J4 l   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
- D$ t8 J+ z. c! \# a' I  temp = readl(IO_ADDRESS(SRGR_ADDR));
2 Z. x1 {0 @2 m$ b8 E  printk("temp=%x\n",temp);+ Z! J3 B3 t' t  O6 E# G$ I& O. b
   //RCR
! h2 o6 D; x7 C7 L9 G5 E   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," ]! z0 [) [+ h: j6 k6 x0 d
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! [! N. K* v. E
   temp = 0x00440040;: M. j6 |& `$ a+ _) d( P- a
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, g; Q/ N, `+ G+ E' V& ^   temp = readl(IO_ADDRESS(RCR_ADDR));0 h5 V& u1 ^6 J# C( c% I7 U
   printk("temp=%x\n",temp);
2 Q" U: |/ U" G   //XCR
" Q/ A) _1 H! @8 `, c. V& U   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; _$ V, h# ]5 _$ R3 O: O6 t   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 r0 m8 _% B) R) ~. T0 |& K" h, i
   temp = 0x00440040;
& G- t5 j8 T) ]   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 G" d+ i. Z0 G" u  s   temp = readl(IO_ADDRESS(XCR_ADDR));
5 c' o; ?9 u1 m2 a2 S3 p7 {   printk("temp=%x\n",temp);2 X; X" Z; `6 o% f; g- {$ {
  udelay(100);
: x  P0 R$ D  {  //SPCR Register
: a. ?) {1 d8 }3 S8 u+ O! V6 ]  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 ?  T  f. n3 {2 a  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
. N) L) G9 b& T. L6 X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled+ T5 T/ l5 l/ H$ E0 `
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 b; C1 g7 u8 O  printk("temp=%x\n",temp);
( a3 `2 I/ E7 O; ~, e  udelay(100);
7 ?9 G: T4 M% S$ o- [4 O5 g/ u
+ ?, H% i4 I% J8 d  //set GPIO direction0 Z( N* ^$ |2 Y2 N
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' W2 D0 N2 ?: a: q! F8 l   temp = temp | 0x00000100;//EPR----input
5 [3 y3 l: u9 x, a( ]2 v; s* @   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 H- ?" U* `2 u( _- U2 S; M) g
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
! q' N3 i# l6 ~' a% d6 Y. e" w! N* ]% i
( R+ X' N5 }1 ~   return 0;
4 j$ x- ~' `/ U}# O2 A/ Y& i# J7 U8 }' z& ], D! X! V
static void __exit MCBSP_exit(void)
2 k' T# R, ]- A1 C) j2 c{- c# v0 m/ b) P  G' k
   printk("mcbsp chrdev exit!\n");
7 G) e8 Y  Q  ~+ E$ P; G  o   cdev_del(mcbsp_cdev);
8 p3 {' }. k( V1 W( f7 \  _   unregister_chrdev_region(mcbsp_dev,count);
5 a9 a$ N4 D  ^3 c) Z   device_destroy(mcbsp_class,mcbsp_dev);
1 M) I4 V: T/ ~, q2 q   class_destroy(mcbsp_class);
* Z+ u5 x1 Z$ L9 t- T}
* T: [6 S9 b+ J$ Amodule_init(MCBSP_init);4 j4 K2 ^% A/ g6 n( k3 \' a
module_exit(MCBSP_exit);
* c$ v4 B: K$ }/ J2 s2 l% y  ]! }5 h; l' e* u5 V3 h3 e' A
MODULE_LICENSE("GPL");
3 [# _9 ]" F% H1 g1 T+ u+ z* R5 w1 Y6 G# g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 |- }" v+ A& {+ i我的应用层的测试程序如下2 h5 l" t1 c( z- ~5 e( J1 B
#include <stdio.h>
5 q) ^4 U5 q4 R( J8 Z" ~* Y+ D#include <string.h>
+ [* u- z% X" Q" W6 S#include <fcntl.h>! K( M* B& \/ D% U5 x6 A
#include <unistd.h>, h7 ^; [$ I: h2 m
#include <signal.h>
3 \& T, y: J) X( R/ S#include <pthread.h>       //线程
  E% i% M0 U" K' x5 {, q" l#include <stdlib.h>
2 v5 ], b* W, G- K5 c  ^#include <pcap.h>          //捕获网口数据
! ^; E. K" [& n, K  u! A#include <semaphore.h>     //信号5 E. N6 h& h4 r/ X; O/ l
#include <sys/types.h>     //消息对列
% u9 v6 K  C7 w$ ^# i( P: V4 B6 f#include <sys/ipc.h>       //消息队列
9 n# B, u5 |( v' R#include <sys/msg.h>       //消息队列- x& u+ L6 Z5 Z* B) ~- ?
#include <sys/select.h>$ s2 _: X  i( d2 ]3 a) V
#include <sys/syscall.h>
% o; H& s9 A+ S- g6 J9 i( I" ]#include <sys/stat.h>
' O# u4 G/ P% Q5 _: [#include <sys/mman.h>
4 e- e5 r$ v  h* K! P- M#define msleep(x) usleep(1000*x)' B6 t, \+ j) j. F: m

) i, v# a8 G. v$ y: z; `$ wint main()4 C: K6 F+ c' E
{
/ y+ Y# t# N5 m( s0 u    //MCBSP,ARM与AMBE2000交互设备+ B% P3 L" t/ n+ }, M* M* c, u
int fd;( A  ]$ a* P  r5 A/ }7 q
unsigned short data_write = 0x5555;
; Z( V2 E2 [7 O1 ]. Z& ]: o$ p0 f# f unsigned short data_read = 0x00;7 w! K- K6 U+ h, K& h8 M$ ]$ q
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, t5 w% g' i6 E4 @# [$ w' A //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 B5 W* v/ {' J: q, x
    0 ^/ D6 ]& f4 a
  if(fd < 0); _4 J" k8 b2 F% D3 }" _- M& N
  {
! z4 y, @5 G" O     perror("open failed\n");( f9 f$ v5 J, {7 Z
     return -1;3 y* o; [& R! s
  }
7 D. ^7 T/ F% V& C  0 B* E# e$ `5 ^& C* P
  while(1)% i( l) O4 K1 J6 r& j# _6 n+ P
  {- V2 I# r* C* ^' Q
   ' M3 o/ q% C' ^
   //AMBE2000每次读写是24个字为一帧& |- S: W9 o$ c0 w% G5 \, ]
   //写数据时将数据在底层存储起来,等到中断的时候再发送3 r) V2 E* J: S1 u& B! H8 e; I$ k
   //AMBE2000输入数据是以0x13EC开头的% H0 L  O5 f/ h$ f5 H0 Q% d
   write(fd,&data_write,sizeof(unsigned short));
1 K% S1 u; g7 f0 c! u4 y   : a( l6 l" R6 J, `' r
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
9 |# {' X8 M4 q7 Q( `' q   read(fd,&data_read,sizeof(unsigned short));9 |/ Y+ B3 n3 ^7 s' [0 F4 H
   
# P! ~' j+ g8 k3 Z* s, Y   if(data_read == 0x13Ec)
; L3 J! o: l3 j+ |0 m& v: s   {: a4 ]- L: B; r; [9 N( s
     e6 i- J8 p! h* s. J
    printf("data_read = %x\n",data_read);& Y2 a! z* H6 O0 D: E) x) Y1 P( S
   }
% p1 q+ n2 ?+ U4 H8 H! X   : ^  o  H0 |* s( s* n
   msleep(10);
3 Z2 c) Y' [9 A& ?  
9 m# _( S9 c' ~: J8 n5 v4 c. a" v  /*
( w1 F# i- J# b# M  q5 f   ioctl(fd,1);   + t* t- m2 o4 k+ K0 K6 w
sleep(1);) d0 p# q. w$ d) a& ]6 r
ioctl(fd,0);# \3 f3 D( j4 S
sleep(1);
" H4 U, [# k/ H; _4 @9 f8 O3 U */
6 Y5 F) h, A. y- V9 x$ K  }   6 c1 Q$ [- g4 \/ w/ Y7 s2 R2 l! o
return 0;/ o1 x1 J! T( T5 j( \+ ^+ P

3 o; b& W8 J( Q}
6 f1 |) u+ K4 ]$ g
7 g5 U  D4 W, W* z* w0 ]多谢各位指教,谢谢! 急$ k: v: _% |+ F/ ~) \

  ?& [' F; a# x" z1 M! [+ o) I" I4 d5 q9 o' r- [
4 U" r. N* e5 \0 {1 j( ~
6 s* W8 g% B+ y

7 T5 h; ]7 [0 n3 o4 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 18:06 , Processed in 0.046137 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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