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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " `( J. H8 R' ]; [% \
/*2 K, p! x( Q& M- F- U; b8 l' _
* Copyright (C) 2009 Texas Instruments Inc2 a# c* u$ O1 f* M. X; L) e
*
. o' V& b( m3 y, p6 q+ T( B * This program is free software; you can redistribute it and/or modify
. K2 M4 s/ o. }1 a  F6 I * it under the terms of the GNU General Public License as published by6 G7 Y3 I6 f+ N- Z5 ^' [
* the Free Software Foundation; either version 2 of the License, or1 [) l' K* t( U
* (at your option)any later version.
7 X6 Y  b- e7 u. s" U& O: E+ | *
: S) F& b- a, t! K3 l4 s' N * This program is distributed in the hope that it will be useful,6 n9 j3 H! `  X  F7 d6 ]+ s
* but WITHOUT ANY WARRANTY; without even the implied warranty of  N% l2 j/ c8 [4 C% c  ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 I, Q0 t1 q8 j% \/ p! u# N8 q; r$ e * GNU General Public License for more details.
' _7 A8 z, V5 ] *
; {% n  P* s/ Z- U7 A4 C& F * You should have received a copy of the GNU General Public License
- p% ~# A1 Y8 v! W6 w4 n* ^( n * along with this program; if not, write to the Free Software
# T( S7 y$ s! t+ N" j. g3 F. H  H# L$ J * Foundati' N( S& m1 p2 E3 ?8 t7 }
*/
2 M) C8 w) d+ z$ {5 A: p6 R; I: P. Q9 A#include <linux/module.h>6 |+ K% C: J7 Q& H* H  y
#include <linux/init.h>; W2 R( g6 c$ w4 t, @3 m) m+ r
#include <linux/errno.h>
! |4 w- J; P( X! l#include <linux/types.h>
0 Y  p, o3 s$ u# i5 X- J5 M3 T$ t. d#include <linux/interrupt.h>
) O4 ^# P' v! U) {% ~#include <linux/io.h>, m9 x6 g/ n- L2 p
#include <linux/sysctl.h>! u$ y3 P/ y3 ]
#include <linux/mm.h>
& h: i1 z6 f- [5 W- `, C#include <linux/delay.h>
5 i/ o/ Q1 z- J! }% q( [7 u#include<linux/kernel.h>
& ^# W+ Q4 I; J( j) G# U#include<linux/fs.h>% s' Q3 }3 p2 }, j, |& G3 b9 }
#include<linux/ioctl.h>- y1 j. ]$ x" U" j
#include<linux/cdev.h>
! s4 ?/ k% R) }. f1 h: N8 \4 ^#include<linux/kdev_t.h>3 q1 k& Q5 Z& W2 G. |6 j: ?
#include<linux/gpio.h>! g: X2 s- D8 W; H: w9 j# a
#include <mach/hardware.h>
: v6 A7 V9 R& Y2 V5 n3 M1 @! H#include <mach/irqs.h>  Z2 r' I- U0 S# q. a) \+ Y# c
0 Q( Z) G4 o) G4 h: b. Q) N
#include <asm/mach-types.h>
/ l8 S+ J& ~, N( ?& |#include <asm/mach/arch.h>
5 b# p* g7 R. d" R/ s3 x4 P7 U3 ?#include <mach/da8xx.h>
/ v! Y3 |8 D+ I  z( w8 o& ~" H#define  SYSCFG_BASE   0x01c14000" [6 @5 j# T. M2 j4 n
#define  PINMUX1_OFFSET   0x124
) I0 g7 o1 k; E#define  PINMUX18_OFFSET  0x168 ' M- B! ]7 j9 u; C4 y
#define  PINMUX19_OFFSET  0x16c! [3 H9 U) ]& `; k: q
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ k- C4 s8 C& K% q& p#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR( o! Y( c! n; H1 n6 T! Y% y# Z
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
$ n% b- s/ s* p2 N5 J#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) t* o8 b/ L! W5 E#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
5 }1 u. S* j- c1 O; v% Q: h                            " y# M" Y# T/ W4 N0 K, `1 _
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR7 E4 g+ O+ K. X3 m( Y7 I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR- t1 E. w0 x6 f4 e+ ?
//PSC$ ]) @" q( r6 L) f3 P; A
#define  PTCMD_ADDR   0x01E27120  ! |% g* }& U% H$ g. U: n
#define  MDCTL15_ADDR 0x01E27A3C
( \+ r7 G8 D3 E#define  PDCTL1_ADDR  0x01E27304& \( `) T& L! u  V# _
//GPIO8 direction2 [8 k, l' J- c/ H
#define GPIO8_DIRECT  0x01E260B0; H2 ~; U0 ~* {7 j
#define GPIO8_OUT     0x01E260B4. J' }. ]  k* F2 r8 v" Z8 w: J! K
#define GPIO8_IN     0x01E260C0
- N3 h/ C& b6 Y) d2 U
% {" a. V# e. R4 F$ `1 p//#define MCBSP1_RINT    99              
8 |  W% b! z/ Y9 c9 r7 |( ], k//#define MCBSP1_XINT    100  ; @, }' G3 O' S2 }" ^
static int MCBSP_MAJOR=239;* Q  W7 `3 @; f5 n, L! F
static int MCBSP_MINOR=0;
7 v- \" |* V5 X1 {static int count =1;5 w  ?/ J* U' Q. f* I

) e4 B1 F( E# W$ L) l) h#define MCBSP_NAME  "MCBSP-device"% h% [% B! ?3 b6 {% R+ _# |
- ?1 m3 w1 w  v$ v
static struct cdev *mcbsp_cdev;; g4 o- B0 x2 @5 z3 [+ P1 L1 c
static struct class *mcbsp_class;
9 z/ t5 T% ?  K2 E2 c/ C! Ostatic dev_t mcbsp_dev;
7 ~/ u2 ]4 [  e- B3 D8 a3 p, c  A1 Yunsigned int DRR_data;0 s( `7 P, x1 q- `/ c3 ?8 _; ~
unsigned int DXR_data;
, H( F9 R* }! Q9 O8 f4 xstatic int mcbsp_open(struct inode *inode,struct file *file)
$ k8 y; ]4 V/ @' b/ k+ s2 J$ k5 E8 S{
  R0 s' f+ J' f3 \$ x+ \   - {+ P3 ]4 r0 k+ W# ]
   //interrupt enable,initialized4 l$ W/ h& V' E7 i5 _" W
   unsigned int temp;* M( @8 m4 D: E* P3 n# i0 j8 x
   //SLEEP_EN(GPIO8[10])---0
8 p; h+ S5 L" v8 ]8 M7 I" k' X4 ~* [   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 h+ Z1 p2 I# o8 g   temp=temp&(~0x00000400);
$ Q( c+ D' x5 Z: [+ y  n( i   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! _; L. W) B0 }2 D$ l  //RESETn(GPIO8[8])----0----1
% e1 S9 q  p- P   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ ]" C7 k, e! X6 M4 U! }   temp=temp&(~0x00000100);
  r" J4 b! C4 W) s5 Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 [/ f5 e6 D: Y* u
   udelay(100);
4 ?9 [& C/ {& X9 ^! ]$ r$ t, o   temp=temp| 0x00000100;) c/ i' J; U* H
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, e& G; c) [* q" a; W$ f+ F+ J( p   udelay(100);+ p# F( h+ l$ a+ L
   printk("open success!\n");
3 F1 @" K5 h9 G' h5 D  u$ V   return 0;5 U) b7 h7 ^6 Z4 }
}4 t4 ~9 M# E( w2 p& V; W

/ o$ g' j3 V6 \6 y) B2 T6 V' |static int mcbsp_release(struct inode *inode,struct file *file)
( S" c' N) \* f* P/ X) o/ _( U{
2 H  R* \3 _9 a" m& E' U   printk("release success!\n");
; e% w+ o. H9 h! D% L   return 0;
) V& F+ Q4 B' M! [- A( K  m% x$ e}' l6 d4 n- g! n: G, b' w

) t* `. A$ h6 ^& v; v7 D. fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
) c8 w& G3 l5 l% s& t0 D, W{
( ?. J) M& ]- y6 p    copy_from_user(&DXR_data,buf,len);
5 ]1 n5 T+ Y5 i7 E" U    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
& S5 o7 c& E  D8 _    return 0;
9 U+ l( e7 M6 M$ r  A# W2 ?# N , Y% z, l/ C4 t' R
}
4 H/ h/ _5 z+ f9 ^+ d0 c/ u9 l9 G  s! ~% U& H
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 H. l# B/ ]# V% z9 L; K
{
3 k; Q+ u) n( j6 p, |   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- o9 p9 |* s1 K$ s
   copy_to_user(buf,&DRR_data,len); 3 @& A& u3 w, Q. D# ^- L
   return 0;
! a) ^8 P6 \2 S& z}9 @  P% c; w4 u  S. J& L& {1 j) ]
/ w+ P" R5 L1 [: S0 w
4 g7 u0 P5 i( T) N8 ~4 ]
static struct  file_operations mcbsp_fops=. g$ O8 [( b5 z! B* \, w/ ~3 X
{
0 P5 v2 T5 w2 L  m: d: B   .owner=THIS_MODULE,
4 c5 }! g" \4 W# M3 g6 y2 p   .open=mcbsp_open,
$ x2 ^/ w4 @8 n( X   .release=mcbsp_release,/ e- F7 H1 N- B# s3 ]' B6 w7 d
   .write=mcbsp_write,. p( z) ?) d: A. Z( i
   .read=mcbsp_read,9 W2 {, L7 ?: a
};2 ^  N, M& }: G( s5 h$ e9 H  S
static int __init MCBSP_init(void)+ h" T% J7 A/ D
{
! x# N( d0 f' E1 V5 V$ d   int ret;
: J  c" D" k8 c   unsigned  int   PINMUX1_REG_old;3 S1 l! `' \) q" x0 C
   unsigned  int   PINMUX18_REG_old;- [/ t5 T0 m0 N/ i5 j
   unsigned  int   PINMUX19_REG_old;
! w8 k- I: u( u; Y  v' b   unsigned  int   temp;  ' G' }9 b3 q, z! b0 F4 K* W% ?
   if(MCBSP_MAJOR)
+ O/ W. C$ b5 I9 s* }8 d+ _   {7 r$ y1 K3 ~3 j8 e3 I% q
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* T7 k2 P4 o7 H$ Y( q0 [      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* y2 O* ]4 U3 s3 g2 Y/ y1 p/ R   }) _: A; M; ?  f5 {- k. R
   else
/ W' y2 H9 r& G   {
; m& W! G& T8 p# e% ?      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 P: A! I$ O$ q" Z      MCBSP_MAJOR=MAJOR(mcbsp_dev);7 `; F; K, {3 o+ v, `7 ~0 H; h
   }
; C! u' S- c4 Y4 z* G+ m   
- b2 [" \( Q- Q   if(ret<0); }2 }1 h5 H9 O+ g0 Z
   {
$ R: m$ K. X! {) L      printk(KERN_ERR "register chrdev fail!");
* P: D  Q, B6 K. ]' P- L      return -1;
  z  K- g; n4 ]- K& f+ _   }
4 T- j: v, h1 q, W  A# \   
- S) H- x, c5 c  n' h   mcbsp_cdev=cdev_alloc();
8 v7 R/ f' g* \   
& L7 o; C" v8 t% w   if(mcbsp_cdev!=NULL)4 F) w4 Z  d! P4 g5 ?  ]4 V
   {- L0 I5 G( u' ]$ z/ ]
      cdev_init(mcbsp_cdev,&mcbsp_fops);
, j  R8 W3 W: s      mcbsp_cdev->ops=&mcbsp_fops;* P; ^! A/ |! ?5 e3 b
      mcbsp_cdev->owner=THIS_MODULE;
; ^4 o, n. H. @      4 D4 W- ^# O# R% f4 f+ u
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& G7 g* Z1 Q* V; D
          printk(KERN_ERR "register cdev fail!");
" M* q( A& W0 F# K      else
- z% c! d) n4 }  o          printk(KERN_ERR "register success!\n");
; u) o4 p0 K% I: {9 S5 z& G   }# C! B  [6 t. |- H/ y- n6 J0 _4 X, N
   else9 i  o& k8 t2 N9 K
   {4 z0 t) ?. V8 F
      printk(KERN_ERR "register cdev err!");
+ o2 U% a1 Z- K$ w      return -1;
& u- l% U5 @  B( d9 D3 m   }
, v. a, s. t5 V# u/ q/ L. r9 @( G   
/ ~; G: ?9 ^8 _$ I% i' g0 \2 q. ^  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' T: v. s4 B3 K# X: K( Z
   if(IS_ERR(mcbsp_class))
+ u/ E2 M1 J  D$ K0 V: _. x   {; {( S- s( Z' ^* x
      printk(KERN_ERR "register class err!");. H9 n+ e% @1 k
   return -1;1 r7 I6 Y) V, p) V
   }: n5 U4 ]8 m" q) B* M
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 a' V+ e, Y2 R
3 S) L2 v( T3 d& i: }( x. z. z   //PSC( K6 v* H2 u4 K) t8 M% W( h
   //add Enable MCBSP
- z6 @4 S$ v4 W1 F8 G% V* M" g+ e   //test
( W$ m! g$ M) s0 B# `+ F% [   temp = 0x80000003;* m2 j2 }& y  g# f- Q0 Q5 V$ L
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* D7 l: F/ B. v. c( A6 O   temp = 0x00000003;0 e3 J+ ]6 z+ k
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, y* m' h0 f+ O" R2 Q& Z
& Q* A# p6 s' u; |& Y: E   temp = 0x001FF201;
& p( g  \, j) B" ?& e: U   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ o1 u, i- m# o  l   
) L; m/ C0 k5 D& [   //PINMUX  ' w! h. O+ X  W
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) [/ |9 ~; \2 b3 h2 s; F8 N/ V; N5 o   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) \8 p  s1 ^6 h/ B1 [5 T6 L
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; p  Y0 b9 W: y# ], ~( o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 E) @/ M( }% \8 M& u# X
   . J$ Z; W3 R$ y
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
7 o) `/ Z9 L# h8 ]( ~3 b3 H! ], s   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 f. _& I: i: a4 Z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
5 a' f) F1 o* z, t  d+ V! d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- g& ?% F$ y& i# g4 @
# p6 L7 D0 k8 R$ t9 z/ e: N   //RESETn,L138_SHK2
* b9 u2 W% m/ e' J! K: j   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( f7 `: t/ \6 j4 O- Q- o5 R   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
" F; O1 u3 p- a, F   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; L$ x5 g6 b# t1 y/ `' e/ A+ N

* C2 I& X0 n- ~; G5 I+ t # }6 Y2 S1 G% w8 ~/ s- E) U
  //SPCR Register
6 V, N5 M- [# O* a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 [0 b  ^6 i( t3 A$ K  temp = 0x03000000;//(DLB=0)
4 ]8 S2 S& ~$ e // temp = 0x03008000;//(DLB=1)) }; S( X7 {, b! W& I
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset6 G4 z) p$ a# ~& B1 E  ]
  temp = readl(IO_ADDRESS(SPCR_ADDR));0 ~; _/ J$ u& \5 {( l9 C
  printk("temp=%x\n",temp);+ W) I, ?1 n0 x. G1 d: ^
2 N5 ]; E: l. q3 Q( v/ F1 G: `$ x
   //PCR Register
; S& |0 n9 ?+ {9 x7 {   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
; t) x! n2 ~6 c' r- H  // temp = 0x00000F0F;/ Y7 O+ x. k9 R; N  R- U6 r
  temp = 0x00000B0F;
; X3 C! h8 B# G9 J# y, x. T( J  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* T% I& G; h) G( ~$ y5 U  temp = readl(IO_ADDRESS(PCR_ADDR));( y3 l: b/ z& x, r  W; n
  printk("temp=%x\n",temp);  # x6 r: T. F/ m1 H7 v$ P# j
   //SRGR Register& Y7 a3 }: z" o$ r1 [* r$ v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 R+ L( F" K* }
//temp = 0x301F000B;+ ?/ H% a6 E8 v+ v+ C0 Q
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 T- o+ j9 I4 c1 U& N) c" q  temp = readl(IO_ADDRESS(SRGR_ADDR));9 b; t4 B- r! C6 `2 {# z
  printk("temp=%x\n",temp);/ D- j( H' z5 m9 b. G" t: D
   //RCR/ G8 H. n3 @4 L
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 J/ A* a8 }" O8 l$ g$ g
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& y, B8 e7 J4 T& K2 ^7 J! b
   temp = 0x00440040;9 e) a7 X( T* A1 d
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
# R4 y0 k; Y, O- t$ a   temp = readl(IO_ADDRESS(RCR_ADDR));$ b1 f6 {* f, i* L: e1 Y
   printk("temp=%x\n",temp);
) U/ I# r+ y/ v4 g' k; y! E9 ?   //XCR: L+ |& G( c4 m! y
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" G$ y( k  C3 K2 `8 T4 h6 J
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 h% i  i# ~; g- B& x0 x   temp = 0x00440040;* A0 A* d$ Z& Q6 u1 g
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   8 y+ I9 P2 J/ B0 F% D; O1 `
   temp = readl(IO_ADDRESS(XCR_ADDR));, Q3 B/ b, A2 z5 ?7 I) i1 @' f
   printk("temp=%x\n",temp);) N0 N- h9 q/ S
  udelay(100);
/ Y% ?: \6 e" d8 s5 v0 \8 @0 s  //SPCR Register7 l( e8 T5 O' V1 g" u) b: ~
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ m4 ^) J8 [  T8 l: E; P
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1* d9 w, n0 v. c6 r& Q, d% @. x: `
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
( u/ r  c! y' J+ b+ I. i- G. K2 h1 M  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 M0 R2 _$ k+ d# Q% D0 [) S, v3 @' Z# E5 K  printk("temp=%x\n",temp);
6 L* {' v+ I7 Q# z% F) ~  udelay(100);
9 l+ l- o1 u' T8 a
2 L- K: Q$ O4 I$ D+ D9 ]) i& E, C- q. e1 O  //set GPIO direction  A2 I& i/ J3 ?' Z! b
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; x! O9 Q& f) h' T
   temp = temp | 0x00000100;//EPR----input
1 A- L1 |9 _( s$ O   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& S4 b) U1 S  [
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
2 L3 j  n1 Z- n, Y- @
( V( m+ L; L/ A   return 0;
. X0 b8 s; ^+ ^' Y8 A9 K/ o}. j5 `! y2 J+ b' k7 @; N; m
static void __exit MCBSP_exit(void)6 s! X: T- e6 x
{- J* a* l$ ]  v% N( T, C
   printk("mcbsp chrdev exit!\n");. ]; [1 F8 T1 q. j) ]- ?
   cdev_del(mcbsp_cdev);
/ }6 W; o  b/ {   unregister_chrdev_region(mcbsp_dev,count);* c4 l) j" t7 f' o: p
   device_destroy(mcbsp_class,mcbsp_dev);
; S: x$ p3 c% Z7 W* i+ ]0 s* C   class_destroy(mcbsp_class);
; k) {; ~) B" H' p/ R}
& Z  f, H5 H8 }& Y4 Q7 ?: V3 Emodule_init(MCBSP_init);
4 p" @9 r+ ]$ C8 ?" nmodule_exit(MCBSP_exit);
4 t' X  b( d2 _2 v- C: }# {6 X6 Y8 m: }( M7 \# ~% Q
MODULE_LICENSE("GPL");3 P- w1 g" f4 S: L" ^& F

& \5 s4 a; B) U% y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& O7 N' k; a6 y0 k) d9 y
我的应用层的测试程序如下$ ?/ L  X; \) W2 N: U" K/ L3 v
#include <stdio.h>6 ?; {* @/ n% O& Q% i  s0 a0 f8 c# C( ~7 W/ b
#include <string.h>& L' o2 W/ ^3 z. T' y, f. |% U
#include <fcntl.h>
  o) T! B5 D3 U8 s$ q# }. X#include <unistd.h>7 I4 F. c! {/ ^4 Y
#include <signal.h>: I3 Q2 q  f$ V! ^( [& H, x
#include <pthread.h>       //线程
' H) Q% s- B  A" y0 ]#include <stdlib.h>4 D$ T$ v- D5 t, U& D
#include <pcap.h>          //捕获网口数据
8 T+ `& A. k& G6 R$ H8 l7 J#include <semaphore.h>     //信号
$ b$ H7 C" c% Z' y+ ]#include <sys/types.h>     //消息对列" U# i( H* R2 S$ u! H
#include <sys/ipc.h>       //消息队列. p2 N9 |) K  q( Q& \
#include <sys/msg.h>       //消息队列5 e- F% a5 R0 i7 A3 S. _
#include <sys/select.h>
5 H/ Y1 T$ |  k- w+ ]& H#include <sys/syscall.h>3 A* ?* \4 ^) h! B
#include <sys/stat.h>
: Y6 J! ?. p+ e% E* \3 B* Z: }#include <sys/mman.h>
: {6 W6 v1 Q$ x/ n; w; f- k" ?1 c! S7 h#define msleep(x) usleep(1000*x)
3 d! U! ^% {: J' _" p* l1 y. y+ ^& ]; ?; E, N
int main()/ m# n5 M) |7 @% w! p
{ # a( p: E* x5 _: U$ Z& v  {
    //MCBSP,ARM与AMBE2000交互设备
: a/ i  H3 {  q( m8 O) ] int fd;6 m3 V5 O6 O+ r& x
unsigned short data_write = 0x5555;' O, }/ F. R! u. V
unsigned short data_read = 0x00;
% ]6 p; J. X8 g  X1 m  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 G; i+ U5 c: c0 ~
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; d7 A. [. x/ ^& ^* |4 ^   
2 a0 i1 D' W; W3 w; w# c) \( t  if(fd < 0)- H; r. y1 w3 o+ A5 a- \' o
  {
, I8 f0 W+ q7 v/ O" N! q     perror("open failed\n");
0 s: z$ g; O: H1 [* O' O- d     return -1;
( l( V0 H/ Z4 l# y% e3 g  }) R0 Z4 U! N; \& F! e  G
  
& ?+ w- D% X$ R# k$ ?" k9 V  while(1)1 S" }4 r8 o. i1 n0 ^
  {
- _/ i# R) W% C5 a0 Q; |7 s& Y   0 M- r0 ~& _5 w- D6 q  @5 n) p2 e
   //AMBE2000每次读写是24个字为一帧: D7 p* o  G4 ~' I( {! v% @
   //写数据时将数据在底层存储起来,等到中断的时候再发送
( Y: Q  R1 r) ~7 L& I/ x* u   //AMBE2000输入数据是以0x13EC开头的: W6 a. |8 R' d
   write(fd,&data_write,sizeof(unsigned short));
* a0 s) A- a$ P- M$ m' |   # i  ~' i$ _7 S; a; d
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
2 z! s2 f) b/ Q9 s$ f4 G3 p   read(fd,&data_read,sizeof(unsigned short));* q6 W% M0 ~% M5 n6 K+ f
   8 U+ o1 V7 O1 x+ d. J
   if(data_read == 0x13Ec)* I; ?! H- K. f+ i+ p+ K# a
   {
* a; p* \$ ~. A% B" U. u+ `   
1 ?9 P. U0 m, e9 v) _0 t    printf("data_read = %x\n",data_read);& `* W. `$ A9 J
   }6 O5 |5 H* ^& t* V# l5 [
   / n8 |* [7 q  ~2 ~
   msleep(10);% e* Y  a4 D# J- X* R
  2 \$ B3 U7 \! t+ d5 p( K
  /*7 M4 `+ f- E/ F1 Y( M
   ioctl(fd,1);   8 N2 t8 ^+ E6 M" g: s( S
sleep(1);
: J* p6 g( w6 m- Q4 ^" ^ ioctl(fd,0);
. c& D( u* W8 {/ o+ h sleep(1);+ g8 n; l. ~3 m6 N% B$ P( G) N2 `
*/
! O$ f: D" [1 F4 d, l  }   
6 m1 c( v+ b2 e4 C! O: F2 @2 ?  \ return 0;
  ~. B2 t" y) b, R: z/ W. k' f- k
! J, J  q0 Z3 H: F}
& I- t; C. C8 v
* e8 t+ O- [9 [5 i# v% \多谢各位指教,谢谢! 急
  c9 j% B8 h) u: A" z. ]) h0 D5 R! n) l$ `6 s  S/ C7 G, J5 E/ G2 L/ |
! y/ n$ q0 m5 X/ ?5 [. m6 w8 H9 `

8 g# K0 S0 r5 i1 n$ e- P" P
) v9 b8 ?4 D4 U
/ J  P  l$ j6 N  i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 23:23 , Processed in 0.041222 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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