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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. ^0 O# v* p# [2 {/ t! ]  \- Z/*0 a3 K3 u; ~; G1 j2 q  N
* Copyright (C) 2009 Texas Instruments Inc
6 M7 h0 b  y9 K! r& p *) f2 ~" |+ K6 l' m$ X5 @
* This program is free software; you can redistribute it and/or modify
9 J% s8 W) M9 D1 Q. B2 l * it under the terms of the GNU General Public License as published by! e( H5 `- q# t7 H
* the Free Software Foundation; either version 2 of the License, or
4 Q0 G1 c: V2 {! u * (at your option)any later version.
6 `  Z% g( q- I2 p; }) E2 Y *# z+ ^: o" M+ n
* This program is distributed in the hope that it will be useful,
1 ?- u: q. [: U0 w8 D5 E; a * but WITHOUT ANY WARRANTY; without even the implied warranty of
$ W8 y5 Q" Q4 v# l$ D1 f  Y7 }! a8 p * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% P$ I: V% l, n. ?% k. M0 `7 N! x6 m
* GNU General Public License for more details.
/ {: d; n) P8 c5 P6 \( t *6 {8 o4 |& H6 j% O
* You should have received a copy of the GNU General Public License
/ z' j) D" I' v3 w7 C * along with this program; if not, write to the Free Software; c6 V" E+ s" q! K4 e6 n
* Foundati
5 C7 I5 U' [( q6 S* Q- R8 @*/
' m/ i; [9 [2 T#include <linux/module.h># c4 H* l6 N+ Z
#include <linux/init.h>
8 c9 D1 S- d) S; f% @#include <linux/errno.h>8 l* a4 L% f5 P3 b8 Y( c
#include <linux/types.h>( s# a1 {- q9 c2 a+ o2 \5 d6 Q
#include <linux/interrupt.h>6 T& F! G  R; \3 n: S2 X6 d
#include <linux/io.h>
7 b4 Y+ w7 C7 g" \. z0 g#include <linux/sysctl.h>6 S/ e1 j0 Q5 y: t' t
#include <linux/mm.h>
) t) U* ]4 b' m1 z#include <linux/delay.h>) t; D9 r  G9 G( z
#include<linux/kernel.h>( f& u/ q6 v0 b' M! [: Q1 c( k
#include<linux/fs.h>
6 X0 E6 w! J  j# x9 L) T#include<linux/ioctl.h>
- k$ ]; a! `4 h- M( y7 u- t* Q#include<linux/cdev.h>
  z5 `7 u$ D4 Q0 ^! Z#include<linux/kdev_t.h># b" M9 m4 @8 s! ]1 Z$ c: }/ H+ D
#include<linux/gpio.h>
0 P7 B# d% f, a/ u& h" a! T% T#include <mach/hardware.h>3 }  `6 }" W) |# c8 _2 |
#include <mach/irqs.h>
& y1 U, T. l, a! u0 i
' b- D; Q& ~' o. z+ m. m#include <asm/mach-types.h>6 z2 o/ v) v5 m
#include <asm/mach/arch.h>+ g0 }5 S8 E$ S( {
#include <mach/da8xx.h>
% j* g! B1 {* Q% S  [/ S8 Y#define  SYSCFG_BASE   0x01c140008 F6 g- }/ l& f3 g
#define  PINMUX1_OFFSET   0x124 $ ~0 F* N+ F% v0 U
#define  PINMUX18_OFFSET  0x168 % n2 ^: p  S$ v# h# j' s
#define  PINMUX19_OFFSET  0x16c, h: ~3 m! E) o5 Z
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR  D0 g4 E( z; @; N( P
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR$ ?" c7 F- c: L. M2 F0 u4 h3 U
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( Y" K( f1 L6 b. y; s3 _) @3 A#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR5 |( ?( R' t* _; r7 P, u
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR, `) _- S1 K$ G. p3 L) s
                            + X+ X5 Y5 Y2 i# e. K4 O6 V0 o
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR1 M; g; q6 r. ?0 P, E3 q# k8 a
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 {% q" U, h5 Z/ C1 \
//PSC
# X. }( a" a8 U' \, g8 \6 h#define  PTCMD_ADDR   0x01E27120  
# F% B/ v1 ]: E. f- V! r#define  MDCTL15_ADDR 0x01E27A3C& m; k3 u6 Z1 g( D
#define  PDCTL1_ADDR  0x01E27304  k$ z' c: g6 r
//GPIO8 direction
2 N7 ^# b1 X: Q, M& V#define GPIO8_DIRECT  0x01E260B0
) I  f/ v( D/ J9 ^/ @. Q9 c* P' h#define GPIO8_OUT     0x01E260B4
  |9 }) K2 j4 q% \9 e#define GPIO8_IN     0x01E260C0
0 m& ^( I. `- h+ f8 I4 `
. ^& N, Q2 S" j8 Y  j& a//#define MCBSP1_RINT    99              
  W" ^# |% l+ o  {- l0 T! [//#define MCBSP1_XINT    100  ) ^7 I6 ~' N  x9 Z4 E
static int MCBSP_MAJOR=239;8 `& Z0 F3 u+ L! U) E  g0 q- u
static int MCBSP_MINOR=0;
6 }8 p3 ?1 P: e! Q: K( bstatic int count =1;
. c1 Z+ t/ i; H+ X, c7 X/ S3 d# s
#define MCBSP_NAME  "MCBSP-device"
" H3 F* }3 {& P$ ?$ V$ H
, c7 d; T. V6 V8 I* Mstatic struct cdev *mcbsp_cdev;! P- O0 t: Q- I' O
static struct class *mcbsp_class;0 f! F  r' w2 I- q" ?. w7 y3 y9 V
static dev_t mcbsp_dev;4 ?- W" M5 {& o
unsigned int DRR_data;, Z6 f# p# b. [8 G2 C% g9 A4 f
unsigned int DXR_data;3 S' y9 Z8 l* B; y0 E8 h! T
static int mcbsp_open(struct inode *inode,struct file *file)0 T% a0 k4 a8 y7 U7 |: J
{/ A, y! ]! ~5 u
   
  `$ e: V7 x9 C   //interrupt enable,initialized
/ O8 n  k0 g9 @   unsigned int temp;, p! A5 ^1 m! j: g: u! q
   //SLEEP_EN(GPIO8[10])---0
( Q# u0 G  w% |8 P2 t' J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* e3 `1 ^. D) J. [9 l1 D   temp=temp&(~0x00000400);( l4 _) N% S# n+ s4 F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! v; n) |* G  O; T% I7 L, ^
  //RESETn(GPIO8[8])----0----1
9 }5 D% ^7 C& {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 `- R% Z2 [" B; g, U3 R; x   temp=temp&(~0x00000100);
( Q! h9 d- x3 p2 L# l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ T8 C9 N6 l7 k8 B. }+ R% {' ~   udelay(100);* I7 H& _( Z. I4 c7 T
   temp=temp| 0x00000100;: ]0 ~0 e' y; `
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 v$ h- j# [% \# Q5 u4 d/ T
   udelay(100);4 G  K5 p% @8 @- m# D* G4 W$ U
   printk("open success!\n");
% x9 L3 }' }. ^   return 0;
& R0 U: [) e( ~  a+ k! |}8 x6 C5 `% t2 c

: `! E7 q: u; r% Y. F' m, nstatic int mcbsp_release(struct inode *inode,struct file *file)' ?5 D5 l; C9 v3 s( ~  _; I( H  f
{+ }; o) W! e  C4 W7 j* R
   printk("release success!\n");" W# h* }5 u' a' m& N
   return 0;4 @# U; U( a8 G3 L5 V" v5 B6 C
}' L' Z4 g: d. L8 T2 L) K& \$ ~$ Q
! k' q+ Y+ l7 G6 F: U) j0 j+ k/ {" Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ {3 G. n; u( D1 F/ w4 \4 v- e{. y) D- z0 b7 S. z- Y
    copy_from_user(&DXR_data,buf,len);
/ v  V% D9 s0 a" p1 X" q" `    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
7 o9 z: r+ H  a, ?& I: P    return 0;
% G- r8 g/ W: ]! a9 M
; x% a( Y* Q2 i- t& p4 t7 U9 S}
. ?4 K- J  p& w4 u, L) W0 G. Q& v" B. P& m3 L- R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) D- I, ^2 y* I; @- I8 i{
7 Y) V7 y" ~3 [- \/ `$ P   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));  m2 M8 v6 }6 T- s# B
   copy_to_user(buf,&DRR_data,len);
2 z- J: M. h$ X# j5 c+ y. e$ S   return 0;- I) l3 }) y  h" w9 ~4 o4 s/ W0 s
}+ |1 D: G- K! T7 h! C2 y. M7 X

8 |2 Z; x  g7 F/ t" r' y
+ r7 c; Q1 N% i# W1 mstatic struct  file_operations mcbsp_fops=$ p$ A& C& m+ g: ~+ H" t
{
9 ^8 h2 x: u, j9 f! Q, o, e   .owner=THIS_MODULE,' b! W( f. }( Q! f
   .open=mcbsp_open,6 t2 H8 v* A% B( A% A" q+ ]
   .release=mcbsp_release,
) d* L9 Y( S# U2 \   .write=mcbsp_write,9 O9 S1 b" V: ~" O7 A
   .read=mcbsp_read,
  i; ^6 }# Z2 i1 \+ C7 M};
( e# R. Y0 }) e6 e3 H, s: q5 Cstatic int __init MCBSP_init(void)
9 t: B% n2 m( e" i7 U2 r{/ O7 h6 G. Y: h% r0 l) n
   int ret;
( w4 L& G+ u$ M: y; [: Z   unsigned  int   PINMUX1_REG_old;/ @3 Y: a6 x% B; p8 `8 T3 I* T# \
   unsigned  int   PINMUX18_REG_old;
( f( B) T& s' d) Z   unsigned  int   PINMUX19_REG_old;( Q6 Z( E. j# E8 D: l3 u9 q( [& S
   unsigned  int   temp;  - x/ Z- M$ [7 m/ S5 B
   if(MCBSP_MAJOR)2 I3 W& D+ b6 @% \' j/ S+ N
   {
& q* \2 J5 c$ N& R$ ~3 [$ H/ D      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# U6 F; Q' F  Q) L4 t( d
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! r) h' ]# ]3 d) e; g0 N( p
   }0 A5 g  ^5 B" S  C4 P5 @- X
   else
$ X& W3 v9 j& Y, ]8 B9 r   {
; I' v$ G+ m6 M! N      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 v" ?5 k1 p9 D) x2 c; O! ?
      MCBSP_MAJOR=MAJOR(mcbsp_dev);6 V0 O* Y, V. F1 c, \) S) v; b# P- Z
   }1 f" ~2 _& W1 L1 R
   & i6 }$ T' C& J7 o+ g3 d. P/ P
   if(ret<0)
" A. s) T: ~) t: m# h   {
( S8 [7 n: ?3 \, j# `) b      printk(KERN_ERR "register chrdev fail!");
7 x! L( V: l0 Q5 X! W2 h  h, J      return -1;
& t! u! p" k' t  X! W, H   }
1 X4 Z  K+ V- V   6 n& S/ ~& c6 I1 t6 h
   mcbsp_cdev=cdev_alloc();* @+ V# C) v( {1 [! m
   
+ k2 J6 _4 R2 e+ y# q. t) v1 {4 W   if(mcbsp_cdev!=NULL)
7 a, A' d6 |$ C1 ?3 o3 b, d   {
# h9 G" Z  T7 {+ j. x      cdev_init(mcbsp_cdev,&mcbsp_fops);
* X4 P& v8 _9 h2 I3 z/ k      mcbsp_cdev->ops=&mcbsp_fops;
0 N) p! s* C  E5 S# P      mcbsp_cdev->owner=THIS_MODULE;+ F0 U. P8 d( \5 R
      
: A% s- O! W1 Q2 X/ r      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 H: x8 m, i. k5 C' K
          printk(KERN_ERR "register cdev fail!");% [5 i. q6 y) p) s6 z$ Q
      else
% A& i' K* s* D5 a3 c8 K& o          printk(KERN_ERR "register success!\n");6 A+ k9 o) x) q& Q
   }
4 m3 l. I' \" |: x9 [   else
* S* c* O# F# u1 _8 \# b   {( T0 x- S* q, \6 e" [/ J9 Q; V+ d
      printk(KERN_ERR "register cdev err!");3 E! b7 z1 o, o8 m7 l4 D/ F
      return -1;) Y: {; m9 Y& Z5 V: @
   }
6 h& n, k+ Q6 \1 ^( m4 a2 Q   
8 K) f' P7 E8 z2 R9 p. a& q  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);  W/ C  c2 K' @5 G. D4 r
   if(IS_ERR(mcbsp_class))
8 l- x5 @- k) g# N( H   {, V6 I( V) G& l8 [
      printk(KERN_ERR "register class err!");
0 Q6 r& J! m0 w" Z/ _6 C; e   return -1;% K6 I& V# P" ~5 L' G# {
   }: N2 _1 E) B" g
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 @0 x! ~4 ?1 L  K6 r% E4 F) E3 }3 R) C2 U1 P8 ^: d9 }0 j
   //PSC
7 d: F' L% v  C/ @  _/ z  P   //add Enable MCBSP
/ K8 d& J7 `9 D) E. B5 L0 i   //test/ t, X. D! R- ^( s7 D
   temp = 0x80000003;; z% `0 Y4 Z! W9 p8 z0 y
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 f+ i( d  q; X" e3 R5 W
   temp = 0x00000003;
0 U3 C" M1 V7 i6 I6 w3 G+ {   writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 V8 a% d( V4 b( u% j3 [9 ] - l2 B& F$ W( \, r
   temp = 0x001FF201;, e/ s; N- ]/ X: V3 _7 F
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 C2 P1 ]( y: G9 `+ R   / [2 S, x0 S9 E" X8 N3 }/ e2 z# ?
   //PINMUX  
8 y1 E4 `* \5 E, j0 X% G2 \, W$ A; _   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,  p4 Z0 I7 [3 J' f
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ O9 R8 E: L7 ~; l
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   6 X0 A2 U. f4 n2 e/ d- n$ d
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 T! @! x5 [: z$ Z   
; |5 m% X2 Z0 p7 u* ^! J   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) ~2 q: L1 Y1 }* z1 {0 Y( }   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 l' p9 K- ?: N) g1 r4 P5 v" K
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
8 C  V! o/ g3 t   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ k0 b; T5 m' H8 I

5 t( Y# k' J! o! i2 p   //RESETn,L138_SHK2
) f* y! C: C) @0 X2 _: Y3 X   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . I- D9 W- m# Q* G* C6 N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   1 B& Q% A! c: B. u# a) j
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( G6 o' `- G5 ^/ s
+ t- \" H6 z& s 1 a. u0 t0 N) M6 k
  //SPCR Register  Q- V( u+ d7 D; g
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. |' S9 s* o+ Z9 }. m% f; f
  temp = 0x03000000;//(DLB=0)
+ C3 h' t; {$ G' }+ K // temp = 0x03008000;//(DLB=1)
! }1 D3 k0 }( y' Z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
7 o( F+ J/ F0 v, U, [# P  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 a2 |/ P; P% C& o! T7 z  printk("temp=%x\n",temp);' X4 S0 L! |# n9 w; M8 C" ]& Z8 G3 g, }
6 S) x6 c$ g9 C4 o+ D5 X7 ?
   //PCR Register) A$ |5 M0 K/ l/ p
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ P, X, j9 u4 N) d0 x- `
  // temp = 0x00000F0F;
! [+ p  l7 f+ A% f6 ]- f* w  temp = 0x00000B0F;' C: G1 w% J' K3 T5 E
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
, Q2 x" t1 Q1 T) i5 \  temp = readl(IO_ADDRESS(PCR_ADDR));
9 H# w' a. S3 H4 j- x  printk("temp=%x\n",temp);  
! m, I) |" i( j0 }   //SRGR Register
& t( t" @6 B, r# N/ K   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" {5 p: y2 |1 P1 I' R4 C7 n. \
//temp = 0x301F000B;0 k% F  w6 v9 z; u/ X
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 [- {) B6 s# Z2 E5 |
  temp = readl(IO_ADDRESS(SRGR_ADDR));
. u5 [! a0 n6 S& ~4 u  printk("temp=%x\n",temp);' ]; j7 C' g" S% n; g1 p7 D% e# k
   //RCR
% r0 y* j4 }" g$ k. r. ]6 b   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 O" l6 W' |" I! M
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" r+ m$ B% B  A" _& ]! m( A' G
   temp = 0x00440040;
6 _: Q) R; X5 I% t' I% V   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
$ P$ C4 q  {/ G& w' z$ j1 p4 T   temp = readl(IO_ADDRESS(RCR_ADDR));
- @$ ]7 A) y/ f0 b7 k- m   printk("temp=%x\n",temp);
/ s. i3 L: e/ [; y   //XCR( c% T% h2 n# s: ~
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 w7 ~( \2 ?& [7 f; H$ K   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! c. p8 _/ f. G, x0 o
   temp = 0x00440040;  @% D  p9 n+ T+ m$ _1 D
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
. {0 n1 W# M3 X' ?; g: {5 ]+ ^3 p# p   temp = readl(IO_ADDRESS(XCR_ADDR));( I% o" u. x2 C3 S* v4 V, G
   printk("temp=%x\n",temp);
' {* M# ?0 ?) i8 _2 S; d1 c  udelay(100);. g  z+ J) i+ N; u6 J: g
  //SPCR Register, T$ m! C3 T  L1 J
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 o2 v9 ~; r; b  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: b7 Z( \) P: G' k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled& n% `* U$ x2 `6 ?0 H/ Y
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  \" s) t! x, `  printk("temp=%x\n",temp);
8 P7 t  x/ M* y+ M4 b  udelay(100);
  v' x& k2 w* y% u6 e
3 |0 Z. h, G0 F  //set GPIO direction+ y3 }" L, r! M$ K
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* T8 f- R) b3 T# L- Y* j1 t$ H0 b1 @   temp = temp | 0x00000100;//EPR----input& a! I7 X$ B2 d0 c/ `; d( o
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; I4 ?# `; _1 n4 d% `4 Y/ Z" y
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( y" Y6 V0 }. e/ C# M! V+ ^
" G/ m7 j7 q* L  m6 E5 G( ^: S" P
   return 0;0 U+ C2 z8 J/ n2 |
}
9 O5 I0 n2 B1 V- O# |" k5 x% k# Hstatic void __exit MCBSP_exit(void)5 ^: Y/ r+ C* S" U% G5 M' l
{$ M5 }, c# r3 b: N& k2 _
   printk("mcbsp chrdev exit!\n");
4 i& X: w- E/ v8 Z  z   cdev_del(mcbsp_cdev);
" l. N5 Y* i: R! G+ F6 C0 t7 U! s% Z   unregister_chrdev_region(mcbsp_dev,count);+ k: c$ U0 k  |$ J) f) X
   device_destroy(mcbsp_class,mcbsp_dev);2 t: ^- X. x5 q6 I4 J+ F# r8 }
   class_destroy(mcbsp_class);0 }4 R- {2 a. y9 Z1 g6 s
}
+ l8 q0 N0 `! k8 O0 Rmodule_init(MCBSP_init);
: l8 X* L, m+ Q  M/ Y9 A/ w( nmodule_exit(MCBSP_exit);3 v# z! o6 Z4 P5 U. L& U

1 X7 t: C- N. ^5 B6 b- ]; ]MODULE_LICENSE("GPL");
' C, R" g- ^5 \  C3 L6 E: }5 X/ b, D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
7 K. S! K1 n2 e0 v- |1 o我的应用层的测试程序如下
: A5 L( |: \, R: T6 B#include <stdio.h>6 i- Z8 \8 ~, a5 F% T  [. J, Y8 H
#include <string.h>3 B' i  t& y  a' N+ M, o
#include <fcntl.h>- Y1 s3 J- R6 ^/ ^% B! o- Q) Z
#include <unistd.h>
$ y$ R, t7 O+ t) @% L#include <signal.h>
% C+ P; [$ `; b0 i: D4 p3 [#include <pthread.h>       //线程
1 }5 e, o+ A& [* v; V6 W#include <stdlib.h>
: p7 T' y  B% u( ~#include <pcap.h>          //捕获网口数据0 e8 D+ O; s: F. D
#include <semaphore.h>     //信号
( g; u# W' L5 n% t- V#include <sys/types.h>     //消息对列( J* Q8 H9 D0 n( o
#include <sys/ipc.h>       //消息队列' I  O1 B6 c! K' H$ L
#include <sys/msg.h>       //消息队列) C: s0 M3 t" v. e3 u: W: V
#include <sys/select.h>" Y' e5 T; p; h) W
#include <sys/syscall.h>' R, z6 l& g# A& W3 J/ \
#include <sys/stat.h>
9 L& p4 @5 h4 w9 A9 v0 _3 u6 b#include <sys/mman.h>
& x% E7 i) k; y' p* P0 \#define msleep(x) usleep(1000*x)
/ u/ ]/ E% i0 L3 p( P
3 G: ~" m$ p& J* eint main()
7 J. o  }% T+ S{
8 |6 q  ]; x% v2 X    //MCBSP,ARM与AMBE2000交互设备
5 M# t1 E2 W  a) o int fd;
; h, E3 Q5 }) d; V2 D unsigned short data_write = 0x5555;+ \/ ~) B; u2 J5 _
unsigned short data_read = 0x00;
* ?  c# l. f8 t5 L. o5 ^  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( ~8 X9 w4 `. D% l* u5 g3 T
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 y/ T6 H  [3 D7 S# Q7 J
    : N9 ?8 h5 D1 v9 Q
  if(fd < 0)
" y2 Q* g. R& Z8 m7 T( h0 I' m  {, N: C' x# w& s) `
     perror("open failed\n");  y( v& j# a% n& A6 R: _3 @  y
     return -1;
0 q( }- O$ ^( Z& T* i  a  }
1 R* m$ J$ W- g" F7 ]  @5 N" j  ' R  A# Q, m4 j; @- I
  while(1)# r. |! i0 f) Z+ x
  {
" _8 U( M' K0 D+ }  H) U   2 h+ J7 R5 I* \: ~' o" V& R2 a
   //AMBE2000每次读写是24个字为一帧; {) B% r6 U8 y) k) a
   //写数据时将数据在底层存储起来,等到中断的时候再发送
$ L% p8 S' k: _% f2 m, S1 m; o% n8 n   //AMBE2000输入数据是以0x13EC开头的
9 L1 a: u' L/ i2 U* g5 n) r   write(fd,&data_write,sizeof(unsigned short));
1 h: f8 Q% c+ v   
' t7 V; B- S1 Z" t/ ?7 y   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  9 z& J" U: A/ d: ]9 i0 |- |
   read(fd,&data_read,sizeof(unsigned short));' P# s* {3 H+ j. B
   
3 D! `- D# X. q   if(data_read == 0x13Ec)
+ Z1 `" R% }/ j1 N; O9 h3 \   {
, d& B1 _5 R4 w: d   1 ?9 Z: g, c9 E8 Y$ z
    printf("data_read = %x\n",data_read);
* P1 w4 R5 O1 a# b8 @   }
7 ?8 ^7 ^  L$ s- K, w0 a. l% ]   
# H1 v6 a( R8 L3 q$ Y   msleep(10);
. ~. A$ G( o) v% B  9 _, [. n3 k: d7 b) v5 x
  /*  k$ L! K% N( ?" a0 k
   ioctl(fd,1);   
2 W4 j7 b) V0 V7 {  q" K sleep(1);0 N( I, A5 [( V1 U  c& e0 m+ B
ioctl(fd,0);
: p) e+ K$ e5 U7 o7 _ sleep(1);
0 v3 E& M5 K3 E; `1 ?2 Z1 N */
% a+ @) C9 i/ D, T4 W  }   
( j2 K0 _! \7 }& r2 S return 0;
( T  h5 F5 b& t2 c6 } ; T2 O6 e% ?& i! D. v  Q
}; Y/ F, N" r5 ~

/ Z+ \" `+ x5 d: o, O8 q多谢各位指教,谢谢! 急
& w: K% s/ y6 b0 G* N
9 ^& P3 e) L: `$ d9 x( J! t& G" W, f1 p0 q

6 j4 D* @  Q8 {( n1 e8 v( j/ ]. w6 M# k$ g. Z0 {

3 D3 c9 g! w) f  F% X/ O! Y; P' K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 06:59 , Processed in 0.047451 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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