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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & U; e7 ]. o+ p! J% S, W
/*
$ {5 C( `* ]: E; b * Copyright (C) 2009 Texas Instruments Inc
4 |( ~5 I2 e, E/ J- b4 {. L *
1 E% {( G( J  r * This program is free software; you can redistribute it and/or modify4 a. [+ S! O3 }+ f  ~4 d. ?* B
* it under the terms of the GNU General Public License as published by- ]2 E" Y( c& ^: T$ d/ G
* the Free Software Foundation; either version 2 of the License, or% v3 c4 l- p* D# F5 c
* (at your option)any later version., L% t3 z# w! `" b& k
*
8 D# T9 K2 W  {6 f! @9 Q5 X! z * This program is distributed in the hope that it will be useful,; P* H% |( |) x* f1 k+ F+ K
* but WITHOUT ANY WARRANTY; without even the implied warranty of" E! E1 I# x# ~5 m
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" x0 w3 d* p8 B
* GNU General Public License for more details.- m$ y5 m1 A8 O
*, B2 d! b$ a; F% E5 q3 n: d
* You should have received a copy of the GNU General Public License, N* r* ^' W) V# R
* along with this program; if not, write to the Free Software% E' p% T# f3 q; v
* Foundati
4 C: E" [7 J8 D+ w3 D5 G0 @' O- G*/6 ^- S7 r1 P  T. P5 C/ m
#include <linux/module.h>% {1 b+ Z3 M, d6 A! _
#include <linux/init.h>
. I0 d7 r' X" `3 H" j6 c- B$ L& q8 |#include <linux/errno.h>8 c7 ~/ ]/ a1 {5 t. q8 e. Q* N: c
#include <linux/types.h>
0 z' d8 o( z, f8 T3 N#include <linux/interrupt.h>
$ m3 I/ b) D+ ?+ G' x: t& p' k#include <linux/io.h>
! |4 X  W: Y+ O1 E1 {& P" _#include <linux/sysctl.h>6 i. Y, C/ `7 u" s) F
#include <linux/mm.h>
# F% o+ a, ?0 J$ z6 f* H+ |3 {2 y) Z; L#include <linux/delay.h>
$ r! ~/ X/ I1 w9 h. W) K#include<linux/kernel.h>. c9 g: N+ W3 P8 p. p0 i
#include<linux/fs.h>2 S( ]) h! ]. w  K% |: ?. Q( m' M2 V
#include<linux/ioctl.h>! G  ^+ W0 d3 u
#include<linux/cdev.h>0 a' D+ [( @0 B2 F1 q  ^
#include<linux/kdev_t.h>6 [7 B! B# y8 X2 q3 N
#include<linux/gpio.h>9 ~2 B, E; R; @, I+ N9 w" i; U- {
#include <mach/hardware.h>. K8 C2 y: v$ N
#include <mach/irqs.h>
2 w0 K- X. U: H- }& h% E* Z4 d6 k! ?1 _
#include <asm/mach-types.h>6 E+ P# G4 I: s5 b$ m
#include <asm/mach/arch.h>
2 O6 |. J3 B0 h3 J/ v#include <mach/da8xx.h>
+ y. I5 _& l: ~& t0 U#define  SYSCFG_BASE   0x01c14000
; S. @6 d; [: X0 H8 u) L4 d# Z& A#define  PINMUX1_OFFSET   0x124 % [2 K* R4 n4 Z' m0 d
#define  PINMUX18_OFFSET  0x168
3 D) W' O4 |8 b# k$ B#define  PINMUX19_OFFSET  0x16c
. f9 G( g$ k  U* m#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
; v9 \) `  B* }7 a#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 D, H- G  W3 \/ B  c- l" o" k#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. n: r; o; Y; L
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR- n1 ~& b$ l4 O5 B$ @
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
% b% ^8 H, u6 I, D6 }" }# t# w4 X$ r( l                           
" d' }6 F; k2 z; w. o# G#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
, Y" U3 J  Z+ j: u! M' t" i, r  d#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
; c$ r% j" C+ z% I; k//PSC
/ v5 @% ~- Z* K7 u" ?. ?; w5 C' f1 k#define  PTCMD_ADDR   0x01E27120  4 W2 j( u5 H$ o
#define  MDCTL15_ADDR 0x01E27A3C
$ K' v8 w% t( v9 L( U# ~! `#define  PDCTL1_ADDR  0x01E27304
. I. k5 V! I  c* @2 F//GPIO8 direction
. c; M! @/ A5 g& W0 B#define GPIO8_DIRECT  0x01E260B0; ^- t/ c# ~1 Q
#define GPIO8_OUT     0x01E260B4
! E" O' R; [) D0 {& l#define GPIO8_IN     0x01E260C00 N6 L+ Q  L5 r* V6 b! l

/ `, z- U7 r- `//#define MCBSP1_RINT    99              4 G0 j' E$ k4 O  u$ ~1 M9 A
//#define MCBSP1_XINT    100  
2 V  R1 i* ~- [# l% |static int MCBSP_MAJOR=239;8 X& x, R% d- ?  S% H2 ^
static int MCBSP_MINOR=0;
3 g5 ?# o9 J( Sstatic int count =1;7 |; `+ _$ ]4 Y5 ]! m
$ Q4 b* K2 h5 ~) V3 M
#define MCBSP_NAME  "MCBSP-device"
: b; `+ p5 e  j) g6 X
  i/ j' f* }# S( s/ |8 P+ Ostatic struct cdev *mcbsp_cdev;$ c  O9 {6 I; Y) G8 F
static struct class *mcbsp_class;
; z$ G. J, k) rstatic dev_t mcbsp_dev;& r' F; M" W) p6 y
unsigned int DRR_data;  ?( b( {; O4 S. h* \
unsigned int DXR_data;% U& h: V- D" h5 U
static int mcbsp_open(struct inode *inode,struct file *file)# N' U' T8 {. O) q$ v3 e, G8 u
{
: [; n" Q3 Y/ D+ ?% N   
1 f0 I6 \0 k0 q( q   //interrupt enable,initialized) M6 u2 d$ g4 I9 V9 Q- `. p
   unsigned int temp;
5 Y6 t( a3 W) t/ T# Y2 e   //SLEEP_EN(GPIO8[10])---0
6 n; h- x3 a" C7 \  ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 @! W  \/ E% L4 \
   temp=temp&(~0x00000400);
. X6 r! _9 G9 \0 P+ `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 U0 u& ^" T+ P& O3 x2 v) z$ ~+ r
  //RESETn(GPIO8[8])----0----1
6 [  z7 b$ _$ E6 d   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 e' d3 m4 \" t# }" f( Z   temp=temp&(~0x00000100);# C6 Z/ t; w+ s# g6 a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( ]& A: a* t; L2 f& k   udelay(100);' e  w) w! j3 z$ |
   temp=temp| 0x00000100;" v5 T/ \3 L' l. K# A$ H  H% t0 n
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ F  ^( W2 J( }# T! k   udelay(100);
" E4 V! u3 x0 Q$ I6 D' |! M   printk("open success!\n");
9 c: M4 F& R- Y9 B9 e# |3 K   return 0;
1 s# x1 m3 ]7 a0 _  k6 y3 ?}  o3 u5 S2 X% k

- P8 b6 ^" X0 Gstatic int mcbsp_release(struct inode *inode,struct file *file)
/ h- M/ Z( o$ @: q5 F: n{. z( E/ ^3 `3 L+ j0 y
   printk("release success!\n");
4 H) g& I) D1 i+ ?: {: Q- n/ W( D7 Z   return 0;# d. u* m2 z; v, o# ~* w& f* l' f
}
9 a( c) u9 M& l" [. B, J; u6 f- R) u. K
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 X0 c  E7 o. m, R. ?
{/ S/ A6 Q& t# |7 H3 j
    copy_from_user(&DXR_data,buf,len);
' ]) g: }; Y8 b6 K# z5 l& i8 g    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 F% @6 D& A0 {
    return 0;( F' U% H5 m7 m9 c% M6 l  z
' j* \9 B4 H4 v) y$ K( c6 _
}
" E  r, r* `1 M. C9 @$ x1 l5 x& r% h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ U& }9 t2 {( E& t, R8 z( F, c
{ % w. g2 T  V9 t2 [1 u
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# |3 T  N  v  R. M   copy_to_user(buf,&DRR_data,len); - b, [1 Q4 Q4 J/ E
   return 0;. v/ u- Z6 C5 U) T& H1 f
}; I: b2 w  ]7 s" k

9 P; N4 i: ]" i& w' o' W' X' e1 V" ^, N
static struct  file_operations mcbsp_fops=$ y) R, s* w/ R& S4 J6 y
{
7 [* L6 U: R5 y9 i/ A' S/ C: N/ B   .owner=THIS_MODULE,
% [7 P( r# ^/ F  E. t6 ~6 ?6 i   .open=mcbsp_open,
( L: G* x8 A; M- H0 A" o. A   .release=mcbsp_release,* l& y" u! [. _9 U" f
   .write=mcbsp_write,& ]7 K& ]/ Y" H# @% f1 C( i
   .read=mcbsp_read,
" P) q* A$ [: \};& a) H9 S: ?5 Y
static int __init MCBSP_init(void), t: {! q3 N) ?3 N! A
{( o8 |$ L  ~! \
   int ret;
) @# G  T' Q! I3 _4 E   unsigned  int   PINMUX1_REG_old;% u& c0 K# o: _- K
   unsigned  int   PINMUX18_REG_old;
  B9 y! r% v; ?% ]! E; O   unsigned  int   PINMUX19_REG_old;
! n4 n2 t( C6 ^6 _2 q& {   unsigned  int   temp;  0 U# G7 P2 K* |( p" E( f! A4 w
   if(MCBSP_MAJOR)' s" X5 F% ?& u9 V8 T. ~
   {/ b+ p" Y6 o( Z1 O% ]
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 R; F5 G9 Q) N7 i
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 |5 Y( M/ Y* {1 o% S+ J) r0 G   }- U  O# H" Y6 f6 M+ _
   else
7 t' d3 L( N# |0 Y  n% g   {/ N4 [; Q. i% y# N9 C7 K9 O; ]
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 F3 ]% M# Q* S      MCBSP_MAJOR=MAJOR(mcbsp_dev);' F4 C! h( I5 x# z- B/ l! [
   }, J8 |" V$ n) O2 J) \5 E
   3 s" ]. a) C! `0 F' P2 k- J2 S
   if(ret<0)
4 ~5 n0 U; J; z$ V1 Z$ c) v1 ?' N   {4 v5 i0 |& z: X* ^) k6 x
      printk(KERN_ERR "register chrdev fail!");
$ O2 x1 N. e& z7 l      return -1;" w6 m" U/ I: }$ E8 B" Q" i
   }
, e" |2 E4 Y2 x2 {+ @# x  {/ x% u+ n   
$ R/ u2 o2 ~  c' V( [   mcbsp_cdev=cdev_alloc();
& P3 }2 S; Q  f7 h. u   4 G* j1 A  S6 {" e2 [, ]# M
   if(mcbsp_cdev!=NULL)
  {1 z/ `9 P4 T2 R% b! n/ [& Y   {
( B3 B: k) {* h      cdev_init(mcbsp_cdev,&mcbsp_fops);
: v/ ~$ m6 L0 b7 }% u      mcbsp_cdev->ops=&mcbsp_fops;/ I1 Q% h- j6 }  w- e
      mcbsp_cdev->owner=THIS_MODULE;5 C- Y3 U# y- q' q* {: W+ g
        o  l) b- D5 g+ c# A
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( b1 L" a1 [2 n
          printk(KERN_ERR "register cdev fail!");2 j, w; m  t. K0 f; F7 ^" p9 U
      else% l8 `) n( x0 w; p3 A2 B
          printk(KERN_ERR "register success!\n");) v1 r( _( N. [0 w2 K
   }
" N, z! u, \2 p6 ]! i   else- q3 m: U9 o. {* G8 ?: i# v8 d9 N
   {# W! O' C; W$ b  o9 Z7 G
      printk(KERN_ERR "register cdev err!");: n6 l( l9 ?' M5 K1 F
      return -1;; u( u) Z0 w0 X
   }
6 C7 A4 l6 N6 |5 }- g- p   $ x' T5 a0 ~/ x
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);1 P8 N" O8 J2 E2 p8 [
   if(IS_ERR(mcbsp_class))3 x- J; ]6 Y8 p$ a6 ]) {
   {0 o: F, X9 y2 U! K9 v2 ^4 y  f/ M1 X% |
      printk(KERN_ERR "register class err!");. }$ x7 [! d- ]! E
   return -1;
( S, v- l- R+ v* w" w, D5 n, F/ A   }
+ U# n0 o3 ~+ n* Q3 I" I4 o   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; O$ O5 ~  W8 C; K9 J" z- @; x/ q5 z# @
4 o0 [0 ]9 N6 a  ~$ C1 T4 t   //PSC0 M  f: P: i, \0 Y0 J, o" \
   //add Enable MCBSP2 ]' x  g3 `8 a* V; z# Y$ ^
   //test
: O; `' M( L- M0 b1 T/ j   temp = 0x80000003;
, c% ?5 x* Y+ b9 U$ f$ E   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- f2 P. h8 C- y* C1 I$ O7 S( u
   temp = 0x00000003;
9 t8 Y8 p9 \2 s* A2 j2 Q   writel(temp, IO_ADDRESS(PTCMD_ADDR));0 M6 u2 M+ x" v9 ^3 |

/ c1 b) Y" Y; J  V" P( j" n0 g% u   temp = 0x001FF201;
+ V' M  ?' i9 l, F   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# z9 ]2 K$ Y2 W4 n   
" {$ Y$ }) z* E4 v   //PINMUX  $ t) v, V* r  L  m2 M( y( J
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ T4 Z" y+ \- U2 T   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ' p" H9 D$ j) N8 F( H* n
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
. g2 q% x( I# B8 {2 y$ z   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! n' K1 d# W) x' B: d6 k1 m
   
6 |3 b  j, ~# ?0 \  L7 W1 t   //SLEEP_EN,EPR,L138_SHK1,L138_RC
% U) e# H  i" i* m& W$ S$ u, b. V4 R   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  8 r- i$ ~; |7 e
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 z; @) s6 n: l' s8 n  ^+ g1 j# F4 c   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ {1 b6 I2 e  K2 C# ^ / n+ i1 H# d! T8 U  H
   //RESETn,L138_SHK2# Q% I5 H2 r! O1 n  I" H* g
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  3 P# o4 i$ x. q) Z* @
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   3 ~* J2 P4 J: `) p8 }
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" s- c2 J, [$ r  D# R; x6 a7 \ 1 v, p. Y- o4 q: z) ~/ h0 l% i4 O

  [* l! s% Y4 v4 D9 `1 ~* x0 w% d  //SPCR Register
: C' C3 P& I9 p  [9 B6 H* ?7 W  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( a3 R& H. w: _% M' ~
  temp = 0x03000000;//(DLB=0)8 `$ e0 n2 Y3 X' s. i; S7 z' v
// temp = 0x03008000;//(DLB=1)
1 m3 N5 W% \4 }( x: i/ r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset! A( }/ H: t( m/ u& D+ c
  temp = readl(IO_ADDRESS(SPCR_ADDR));4 f6 H1 J) Q3 {9 P9 g
  printk("temp=%x\n",temp);
) W7 Q& @+ W" e  `0 @  `
: C) D/ E+ I& J( z4 l# o9 q$ @   //PCR Register# {( x  [" C3 a* g) C
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 O: O3 |+ y7 v$ `
  // temp = 0x00000F0F;
! \  j; n: M% T& ]0 ]  temp = 0x00000B0F;
0 C; P- E6 R: h4 n  L; V- J4 O  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ) f2 R; B! n) a4 f" t
  temp = readl(IO_ADDRESS(PCR_ADDR));$ X" m4 ^9 @- u* m
  printk("temp=%x\n",temp);  
- V' e( r& @3 U" F( N   //SRGR Register
' I6 b+ q, e3 T1 b' b# W1 R/ N- x   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) Y) f. ]# k, D: A9 X+ R5 a //temp = 0x301F000B;8 b% c+ V! [. E* u
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
" {. u5 n6 _, @) f9 L  temp = readl(IO_ADDRESS(SRGR_ADDR));0 E' N. y1 m: h9 q6 ], V7 g. ^; n
  printk("temp=%x\n",temp);
) C4 h5 B. g, E# @   //RCR
, ~, A+ Z% T  o% u   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 C" N6 w; v1 W. J- A
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; V( I# P( i- T! J+ Q9 h   temp = 0x00440040;
1 L; Z1 N& Z- g   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) B9 \' T& {; f; \6 O; s
   temp = readl(IO_ADDRESS(RCR_ADDR));( J  D$ D3 Y/ ]8 a' H3 ~( t; O1 _
   printk("temp=%x\n",temp);8 S4 ^  }& h, A& n' W& D
   //XCR/ B+ x6 I& ?: b
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 H; L- A4 t" M4 B3 B# B3 e
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" m2 u& R: h5 }! e- G   temp = 0x00440040;
* L2 `2 y; F/ N   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 w) ?. F) s! S% f2 g   temp = readl(IO_ADDRESS(XCR_ADDR));
' j% x6 O8 a- `! W2 ]   printk("temp=%x\n",temp);
6 G" B& V, F; W, N8 D  udelay(100);3 {2 V+ S$ w3 ]+ F
  //SPCR Register% ?) r' Y* H6 v+ ~) D2 W, j" K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 t9 M4 u. q# ]3 Q# O4 A% ~  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; D0 _/ u+ f+ }1 m/ b0 i' q  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
1 l8 ?( P0 B* l1 B2 y! M$ B% N7 [  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ a& E) y/ a, R. T$ a6 X  printk("temp=%x\n",temp);7 y2 R/ q( P% M/ p
  udelay(100);6 Z6 P7 T# v$ ]5 l: Q
, H3 ]& e7 k* h
  //set GPIO direction2 Y% E, x- e# G' Z' v
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ C% A7 _) R6 J4 x3 h% ^1 r5 V& f6 w   temp = temp | 0x00000100;//EPR----input
( ]/ G! o& e2 Y+ o; E% h1 k2 U   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: f+ @9 Q4 ?; k% h3 Z, K5 x9 p) P   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
7 d9 C8 a" [; ]9 n4 h2 j4 {/ }% p6 ^ 7 v6 x& W: }# A: N, g: A) a& V$ N
   return 0;
# Y+ @: m1 Y7 n, G4 V4 I7 h8 C}
3 u5 z# s( Y  d- Nstatic void __exit MCBSP_exit(void)2 _& A& D0 {8 w0 p) r- _
{
+ _8 i1 Z1 q& U4 [  K0 G, G# @# T   printk("mcbsp chrdev exit!\n");
9 D. e$ a6 R+ Z, f$ l: `   cdev_del(mcbsp_cdev);! \: w& n) C# e- y: D: k
   unregister_chrdev_region(mcbsp_dev,count);& o3 S7 W  O6 @- v* T8 Z
   device_destroy(mcbsp_class,mcbsp_dev);* ~; `, ]3 r! O4 q1 v
   class_destroy(mcbsp_class);4 B" v9 |/ D6 Z: D" z( x/ R, @
}
- U2 m2 `" D/ ?+ F4 I: S1 |module_init(MCBSP_init);& ]- C! S, b8 |
module_exit(MCBSP_exit);
4 n+ |6 M' {4 Y' t1 ^( g' k  A. i/ z1 s$ ]
MODULE_LICENSE("GPL");$ W3 B4 S) |& E5 W+ `4 V6 g
7 g: ]. J3 ?8 E3 K" [: \1 H' K
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 V2 {. g* ^9 t4 V$ V我的应用层的测试程序如下' a+ M3 A& b" \- y+ |
#include <stdio.h>4 v8 Z- G9 K* O4 ~
#include <string.h>( |& l1 C; X5 U$ V' z! x, d
#include <fcntl.h>
. \4 G' s5 @' Z- b4 f#include <unistd.h>
9 w9 I; J) ~& _6 K  S# c#include <signal.h>( b( J" I& M7 _& E( o) _4 o
#include <pthread.h>       //线程
- e4 ^9 f0 y7 V8 w" C6 n- ?#include <stdlib.h>
4 y" ]% m( P* s+ l# v$ G- U#include <pcap.h>          //捕获网口数据% u: F6 S& l( m! b2 L2 _
#include <semaphore.h>     //信号7 Y  o5 _  i- b% s% Y1 t2 {: f
#include <sys/types.h>     //消息对列
& V0 R4 a, N' M- `7 v#include <sys/ipc.h>       //消息队列
! Z2 E( s/ ]  M. e5 r6 y#include <sys/msg.h>       //消息队列
& ~3 f  [: o6 G) l#include <sys/select.h>
6 Z3 A) A+ N8 s4 g- O#include <sys/syscall.h>4 z6 c- }' P: W# A5 |- j& L
#include <sys/stat.h>* ?; ^% U, O7 \2 e
#include <sys/mman.h>% B$ n) X/ K1 s5 l9 `4 |. L
#define msleep(x) usleep(1000*x)
. i8 a. L3 e) u/ X9 O
" U6 Y+ Q# K8 e; f  [/ Y9 Lint main()" L. K. V+ O5 I$ L6 S" g1 a
{ ' P3 Z8 `: A; Y" w5 Y; |! j
    //MCBSP,ARM与AMBE2000交互设备" z: a! g7 `! Q6 h
int fd;; _' g0 j7 ]( m" ?
unsigned short data_write = 0x5555;
& s4 \3 d6 a6 b, l/ s unsigned short data_read = 0x00;
. M" I0 j* }3 L' z" h  i) S  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ L  n. i- P/ u4 N$ y  l //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' j6 \. C7 X$ ]8 H  o. l
   
7 e9 m/ f- ~) U, P, c+ K8 d/ u0 j! i  if(fd < 0)+ f8 Q2 c0 A: u
  {# W- H, d6 o( C0 }& T
     perror("open failed\n");
4 H. `3 h& Y9 O9 q# `5 J* e3 D* R9 E     return -1;
5 O  x' }. @3 _) q. B2 X& P  }
3 ?9 J$ Y. E1 b% }/ k# D9 Q  
2 a5 y; y& G8 H0 K7 g. O1 J) r  while(1)- r2 E; \! U: V* n1 S
  {* f4 o# }7 W- g6 B  N
   
2 {" r+ b! @6 M& W( ?; }   //AMBE2000每次读写是24个字为一帧3 x5 }) V8 {& a# u4 V5 b* \6 U
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 @  T% e' {* e  C" j4 j
   //AMBE2000输入数据是以0x13EC开头的$ n$ a4 Z  b( n$ O3 |2 ?1 y/ ~
   write(fd,&data_write,sizeof(unsigned short));) \; Z; n& B6 H# L
   ; Y$ D! |* q( g2 W: k% e9 {
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
1 E3 a: Y: z& K   read(fd,&data_read,sizeof(unsigned short));
* D' [" a& }- ~1 z7 [* h1 s   % j& X6 \4 k1 G, b* b
   if(data_read == 0x13Ec)
) m9 j4 k9 B' A6 W   {
& E! c5 \' e. h, K6 ^9 m   
0 \% H) u' Q' E6 k# `  s# k% G    printf("data_read = %x\n",data_read);, x9 {' x6 O: A% ~6 d( ]. V
   }
, l  ^* c3 Y$ e* q   6 a2 [* V# W# \1 O2 I6 a
   msleep(10);
  ]( O5 d4 F  j* S/ S% Q" c  
, h  z% v7 u* Z% f4 J, G  /*
0 g$ h: J# R" H1 R   ioctl(fd,1);   
. Y5 d- y  N6 x+ |' M sleep(1);5 r" y" [! J+ c, N8 W
ioctl(fd,0);
: p1 e5 X; C. p5 {) I+ g sleep(1);
( Y" m* g2 Q% C% |! ~" Z */
9 c0 q/ s" v. ^/ v  }   
3 l4 m3 c  S! `! L6 } return 0;
" Z) A+ ^- u) U$ K( k
+ m3 m& ?& M( U0 d$ |}
' w2 l! m7 Q8 U* j% P4 x9 \5 g2 D. [5 x- D% {
多谢各位指教,谢谢! 急2 P+ g: F" w: C/ q5 {) [
7 A/ H, }6 D! S5 \. A" |8 P
, Q. x% M9 G( v& R9 a' |% q
/ u4 u* C* `) h# }) _) i! w% g% t
5 P& f# A3 m" |% M) \' m- l

1 h4 J( D  S- m& T! j/ r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 04:35 , Processed in 0.046283 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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