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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % A4 `7 y6 |4 A3 F
/*- S, o# D  }0 {, E) _
* Copyright (C) 2009 Texas Instruments Inc2 t& F  ?7 X; a4 ~
*! k! U" b# N" ]  g" H. V
* This program is free software; you can redistribute it and/or modify
  a5 w4 m4 J3 }6 U  b* P4 U, J * it under the terms of the GNU General Public License as published by6 r! i1 Z/ k! a; n, g
* the Free Software Foundation; either version 2 of the License, or
" h4 D; w9 J! H$ p! G * (at your option)any later version.
$ M6 [. o- M9 A2 e) y3 w+ J *
5 A3 v  L9 d5 M * This program is distributed in the hope that it will be useful,
- _3 m: S* x9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of& _8 v8 N/ m/ b' }1 A2 k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ M/ G5 K% |- C/ {
* GNU General Public License for more details., F+ m! s  D1 y7 p4 u4 ~
*
3 }6 r* R! O. q0 n * You should have received a copy of the GNU General Public License6 {' E9 f4 V* @2 i  E8 M
* along with this program; if not, write to the Free Software
2 A  t4 O0 F4 R) ^# ]% S * Foundati
2 w! T1 ?6 k- l) z$ X2 C6 A*/
' }* d( p7 H4 A#include <linux/module.h>
1 q3 I8 R; V. R1 q$ p% u#include <linux/init.h>
# \+ {% q5 R. j' H2 p0 d& D#include <linux/errno.h>9 U' o( g' N9 f
#include <linux/types.h>
' D) `" a  l* I8 {4 b#include <linux/interrupt.h>
- E1 r! U7 |0 g- Y8 f  [, g#include <linux/io.h>
2 o& O; U! @5 p5 l1 w3 j( y8 N' `& }#include <linux/sysctl.h>4 c% e# U6 n6 R2 Q* ]
#include <linux/mm.h>! O- }& w& d# i" H/ }
#include <linux/delay.h># g* K2 I' v/ B2 e& C9 y1 [
#include<linux/kernel.h>
5 a- r3 }+ r& z4 W#include<linux/fs.h>
9 S. x+ d7 b2 s. i1 s#include<linux/ioctl.h>" t' c; I1 _" \! B2 G
#include<linux/cdev.h>
  W! d& C; c- X- U5 r#include<linux/kdev_t.h>
$ O/ p: a: W' L#include<linux/gpio.h>
6 U6 {3 \5 e/ Q#include <mach/hardware.h>
. w8 I2 i( Q' G#include <mach/irqs.h># z- I* s$ i  V; F
) Q* S7 X' n4 T& C9 k$ @
#include <asm/mach-types.h>
2 T' c6 Q5 v9 @& l$ n& q: s#include <asm/mach/arch.h>
* l- N9 k. ^* }/ j* q; m5 q; N* R#include <mach/da8xx.h>
" ^6 e6 j, F; q2 y9 W9 S% W- H#define  SYSCFG_BASE   0x01c140002 \7 U5 H! t( B2 e4 E& T3 g
#define  PINMUX1_OFFSET   0x124 7 N+ t; a/ F  F0 l9 U* S
#define  PINMUX18_OFFSET  0x168
# j' b4 v. ^& b$ m* @  I9 ^#define  PINMUX19_OFFSET  0x16c4 |2 ?: k, K* u# u& O
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR4 ]. _) x, x: s6 e# S
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR( c7 M% @3 K- ?& f
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: l- o  j4 a  y' q1 V
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR* _; z- I; ~0 Z9 z9 F5 F" ?0 m' s
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 g' ]5 f' O. X                            ; V/ ~8 k( o" u
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR# e$ }4 M9 }6 T
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- U" `4 @5 ~/ C$ e//PSC6 a; E9 H, l" A, `* g+ N$ J! b( \
#define  PTCMD_ADDR   0x01E27120  0 H, i; ~) E; p9 a( L$ W
#define  MDCTL15_ADDR 0x01E27A3C( C' H( b* M$ g  f; s
#define  PDCTL1_ADDR  0x01E27304
2 J. z/ ]1 Y$ Y. n8 H3 m//GPIO8 direction% a  I- g" D" `
#define GPIO8_DIRECT  0x01E260B0, c% z+ a! G- [8 I
#define GPIO8_OUT     0x01E260B4
, C( G: r7 o! c5 |% y* Y5 q#define GPIO8_IN     0x01E260C0- v0 d  f9 z) d; a/ ^4 Q

2 R2 X1 \# H5 Q. c//#define MCBSP1_RINT    99              
# o$ D/ W3 L/ Y5 G- g//#define MCBSP1_XINT    100  
  Q/ s/ J1 R8 Y% o  P* _6 Q& |0 hstatic int MCBSP_MAJOR=239;
# P  v" o& L! t/ v9 b% estatic int MCBSP_MINOR=0;2 `# L& l' F5 F2 ^, f+ C, t2 _# y
static int count =1;6 j" |6 I- J; V3 Q' o
) q4 {- z+ p! r  g
#define MCBSP_NAME  "MCBSP-device", b2 A8 y" L: F( O& Y
( z  M) g. R# [' o% h, c+ B
static struct cdev *mcbsp_cdev;9 e/ n3 B: R- N9 Z' V! i
static struct class *mcbsp_class;
/ D2 \, d/ _3 F& \9 B4 Ustatic dev_t mcbsp_dev;/ T6 \, c7 R- R8 V% A
unsigned int DRR_data;
: a  U" g* G# }3 y" \- \3 U$ Funsigned int DXR_data;
+ H3 V3 V( l; f9 p& z# nstatic int mcbsp_open(struct inode *inode,struct file *file)  R4 r! ]1 ~8 |  d8 y/ b
{. S! r7 K+ \# U' q7 g- a1 n
   
# d$ t3 p9 J  }7 B% x) _5 n- l) O   //interrupt enable,initialized3 l; F( k, S; z2 ?7 g+ J- Q
   unsigned int temp;' o/ a4 X* `+ W3 L( z
   //SLEEP_EN(GPIO8[10])---0
9 U; R/ Y- t7 r3 r' h- n, `  G- b   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 Z& r- x7 |0 B- B- Q   temp=temp&(~0x00000400);( J) W( J% B+ l6 o( v$ v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ B, [. J+ e6 h  //RESETn(GPIO8[8])----0----1* e9 U$ @6 L. m; K- N$ _
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ B0 a3 M3 A& ~$ A; k
   temp=temp&(~0x00000100);4 d6 A+ U: ?8 \( w! w; V% v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' ?) K) b2 |  w5 Z! m
   udelay(100);
8 @+ e5 A; H" m   temp=temp| 0x00000100;
% G# J8 z" m- W5 s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% y) b+ S; p! c2 T  |   udelay(100);/ {- u$ U+ @6 G3 [' K# T  b
   printk("open success!\n");
8 i2 ~: _6 b7 `9 [( e2 ?   return 0;
" X  M7 {$ a9 y' a* V' }5 s" i}
8 k0 C$ S+ P( I- U! ?; P
4 U. }3 d# T8 Y. G! jstatic int mcbsp_release(struct inode *inode,struct file *file)
  W  d/ ?9 y. n1 N1 a& G+ W" M{
/ B3 O) t& d; k7 c1 R6 [   printk("release success!\n");0 ^: G* P: S0 v8 U1 k. z
   return 0;; w4 P6 W; w- }- _
}
7 _$ S% J* x: V- _7 X. v2 z' C2 r  o7 E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 Y7 R; }: V2 ?& x
{
: g5 ]) M- q0 @- W    copy_from_user(&DXR_data,buf,len);
7 r" F+ B; [. P  E$ R    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
! z" o! V; b6 r5 u, \6 z    return 0;+ A: f6 D: j+ a" X: g! N! ^

( i8 X- v3 \& W& E7 k) |: \8 L}
4 e7 `; ^5 p. k1 l# a; A( L( y4 ~7 Z" C$ y+ K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)* E# m* _6 b' U7 A
{ ) X% o( n% o- ~2 T. {1 d$ C
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, M7 {. h  g$ }3 l  ~* s
   copy_to_user(buf,&DRR_data,len);
# u  Q0 J8 [0 f$ C/ L2 n   return 0;
  s7 ]+ A: r& R$ R8 ?: v* G6 C  s8 O}
( I& E. w" Y$ y- {3 E' u8 ]! Q* m1 G/ M2 s' j7 a3 P
% r5 B7 u: H0 \3 l
static struct  file_operations mcbsp_fops=6 x) I0 {9 M, G" K
{
' j1 G  Z3 b# J% @9 B. \   .owner=THIS_MODULE,- f1 M2 P  n. _# m: [' k! u) q
   .open=mcbsp_open,
# k! Y5 l1 ~4 M: n+ R( ^   .release=mcbsp_release,! h9 }# s7 a% M- |/ M# v5 F
   .write=mcbsp_write,
. |! x: }! V7 N# \   .read=mcbsp_read,
2 I- i/ w' w: Q& B2 {2 d};
0 f0 q  c6 k* O9 Fstatic int __init MCBSP_init(void)& v) U$ C8 t5 b/ g, S! r5 Y# p
{" K3 |, E$ n' ?/ z, L
   int ret;
9 x: r5 [, u& U5 v- M9 W6 E2 J   unsigned  int   PINMUX1_REG_old;# V( u2 [8 U% J, f
   unsigned  int   PINMUX18_REG_old;
' E+ _+ f# [7 c. G7 m   unsigned  int   PINMUX19_REG_old;$ m4 f( r& P6 S6 b3 e5 ]3 p( a0 C8 P
   unsigned  int   temp;  ' z, H/ e; W3 s5 j
   if(MCBSP_MAJOR)
9 l% S/ b; q8 k5 q  W   {) R8 ^( u9 ~5 ~2 K& H: ~
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 ?7 t2 ^5 M; A, A; ]. X
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);8 l! k& r  A/ z% \) Q
   }* e9 d' R. f, L4 [7 K; Q& _
   else4 _/ B' K: ]3 k
   {  |- G+ @& b  y. M8 b* h) X1 Q1 u
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 a7 P, j0 s) W. n: @+ q+ |; Z" ^      MCBSP_MAJOR=MAJOR(mcbsp_dev);
! m; F1 V) Z# z; k7 D$ ~7 E4 v6 L6 G7 E   }, u  Y" o5 }+ s3 q* Q& [0 G
   " u6 D( X# }7 g/ S, J; u2 U
   if(ret<0)
% H, ^+ c1 X% ~2 Z: ?   {
7 n' s) t6 U. t+ w      printk(KERN_ERR "register chrdev fail!");
! H$ w' j5 n6 `1 X: D& n      return -1;: Y* a$ h3 O+ S& h( X0 R
   }
8 s, t7 j; [$ ?7 Q" h) ~% a; F   
* I" w7 F# r3 \+ Q   mcbsp_cdev=cdev_alloc();
/ ~( O! i: Y9 e. O. A+ r, a   : n; w9 c/ |6 E* _
   if(mcbsp_cdev!=NULL)' I+ g0 q9 [3 V0 o/ C
   {+ s. C& M! N4 g5 @4 l; z
      cdev_init(mcbsp_cdev,&mcbsp_fops);, f! J/ ?1 p! M% G$ r1 F& x, }
      mcbsp_cdev->ops=&mcbsp_fops;
+ j5 d( Q! j, A$ Y6 R      mcbsp_cdev->owner=THIS_MODULE;4 x: I: Z- x2 K% t/ Y) m
      
0 |4 N" \! N- {# [. _2 }6 i      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
  b7 d: R. ^# ^/ a          printk(KERN_ERR "register cdev fail!");; [  Z) A2 c: k& g
      else
* n, s' M4 t/ k3 f* @+ U          printk(KERN_ERR "register success!\n");$ ]8 R8 Y* Q; ?1 x
   }4 R: X* U2 u. @# H( Q. v
   else' X8 p& c7 h) Z# L  L, n) o
   {! l1 _' p% x9 q# x5 M3 Y% F( a
      printk(KERN_ERR "register cdev err!");  w" @0 m2 n! i7 A4 t  n+ X
      return -1;
$ w$ ]3 Z0 q( N   }
; c$ Y* C1 n4 M/ E1 V; o/ a   ) O# N. x* q7 j" b4 b4 X. x
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: Y+ t: f' ~3 T! B1 @6 b" j
   if(IS_ERR(mcbsp_class))3 v0 J7 m+ [; |, [2 ?
   {
+ y: D) ?' k  d' N      printk(KERN_ERR "register class err!");2 \9 d7 {! h& P9 p
   return -1;
! C* x. E. F: x* ^   }
  p! u0 a4 O; Q4 Z) h2 |, M% d* u! Y   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);, V7 T( G5 [+ K. O! Z, t9 @6 [- p
( t) B- y: [6 a: T% b  ^. y, _$ k
   //PSC7 p; v9 T! r" V! b
   //add Enable MCBSP" n7 Q1 V6 m9 S) G! _5 m
   //test- R* {% D/ E  v6 S0 [4 Y
   temp = 0x80000003;
. C3 f1 E/ W, \6 b, ~, `   writel(temp, IO_ADDRESS(MDCTL15_ADDR));0 o. O- A) \; ?3 W
   temp = 0x00000003;
/ _. L4 h- D( z" U4 s* g. V   writel(temp, IO_ADDRESS(PTCMD_ADDR));# z7 c! b! E1 u% j& E4 V& C
2 Z. g( [$ f+ f  }7 [, O/ v
   temp = 0x001FF201;
6 L: G+ T( G+ g   writel(temp, IO_ADDRESS(PDCTL1_ADDR));- J1 f; z9 U6 H& Z7 o
   
+ D, a- c, Q  ?2 O9 n  F  o( O   //PINMUX  
5 ^* }8 Y8 b" ~* G0 x4 a   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 _: y. M* N0 M  N/ b2 r7 ^" X8 s   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
" M: a3 S6 B2 y; ~4 k* I/ G   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
& u# m- r+ N6 K% c$ }9 R, {8 v   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 l- g" S) ^9 r# E% e6 ]7 I& u   ) x! p$ Z$ _! D
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
  X3 u. l* [+ Y" R   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" G0 v) C- I- X3 H6 ]   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 M. ?  T* ]: z( F1 |1 Q5 B0 {
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' y5 i; p4 x: j/ m

4 b5 m8 \) f1 {& H7 m   //RESETn,L138_SHK2
- F$ \: n: x: r' G: F   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
0 i( A( u8 n" D3 `   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 x% m5 v0 i0 l  ^0 M$ G) i. P7 I   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);. \* t6 ]4 ?2 K* F3 G
: v7 m! b0 u8 ~3 K0 Q/ Z% w4 p1 _
; W. m8 F( q( }' K3 V9 P3 n8 c
  //SPCR Register8 }6 ?5 l/ d# C( a( x6 C
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: T6 t. e, n" E$ z* M$ h6 V
  temp = 0x03000000;//(DLB=0)! S6 q+ r2 q8 e+ w; Z9 L- c
// temp = 0x03008000;//(DLB=1)9 m; y3 c" M+ t/ S  q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset. }, @6 t, O- {$ f, ^% _: o# Y
  temp = readl(IO_ADDRESS(SPCR_ADDR));% g% G- \! h$ v% C8 Q) x
  printk("temp=%x\n",temp);; q* S( p  w, b4 R% @
6 Z% ?. G4 w9 ]5 X' U* g& B8 p" A
   //PCR Register; r, u  x! Q; f7 P5 |
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) W0 @/ P) V8 l  // temp = 0x00000F0F;* p& j8 h# s0 B$ |# d3 t
  temp = 0x00000B0F;
  K% }6 W1 C0 ?8 \! O/ u0 ~6 p" A  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
( w- J& V$ h4 A  temp = readl(IO_ADDRESS(PCR_ADDR));6 t) R6 \: V  w: o/ R0 w
  printk("temp=%x\n",temp);  0 N& Y. `- |) O: N6 N
   //SRGR Register
- m" R. P- o, Y# e; l   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! y% \  ?, K8 z- l //temp = 0x301F000B;. {/ u5 \% R" A1 F; i
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
% m% ?$ k" g: V/ S1 C  temp = readl(IO_ADDRESS(SRGR_ADDR));! Y! T2 [" i4 G8 _' M1 \" g
  printk("temp=%x\n",temp);
7 I7 O& L' j" m; A   //RCR
+ \7 B& a/ a1 r! i. ~+ L; x   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. z6 D( @" Y% ]0 V' ?
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0  i' L  B* w' y7 V# e: n! z
   temp = 0x00440040;  G  s- K( ]  Q  O6 W
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   8 o+ h3 k9 Z0 L# b0 R+ \. Q, f1 m4 r
   temp = readl(IO_ADDRESS(RCR_ADDR));% F% t- B* _! M; ?
   printk("temp=%x\n",temp);
; S  }+ g1 k6 A9 H   //XCR
+ J5 @  L% B' J' s. `9 z   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ d) _) u2 Z/ b
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) `9 r& }8 J" b0 ?) a! }- [' g
   temp = 0x00440040;
. ]3 X$ c; C; h. W   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   . Y* u" O7 a+ f4 m/ E: b2 U  D3 {
   temp = readl(IO_ADDRESS(XCR_ADDR));2 s- g7 A! y+ l8 d2 l7 y7 G' S
   printk("temp=%x\n",temp);3 w3 ]" x5 q- U  R# ]' ?
  udelay(100);$ Y% X: T* B' g; q7 Z
  //SPCR Register6 w: s4 G* B8 J
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1  L( x4 s0 A- Y' C, R0 K
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
* U7 j. h; U5 l+ m3 D: }  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled) l- Q9 A) H; P! T/ k+ |
  temp = readl(IO_ADDRESS(SPCR_ADDR));6 Q2 J' C, ^) h4 x5 H+ P& G1 f
  printk("temp=%x\n",temp);) K% S4 N" s6 s3 X* v2 x
  udelay(100);
1 e/ G$ }5 K/ x4 u$ _5 Z9 N/ s- |8 V; M9 [
  //set GPIO direction6 j2 t" U  F$ j. E7 O8 M0 ]0 f
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));7 f% P" H' p- S+ i  V0 [. I
   temp = temp | 0x00000100;//EPR----input) h5 `# q: [/ N& H5 H* j  U9 `
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 d& w7 M. [* `& R8 w7 m   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * S6 ?! q2 I, W9 r# B, o

/ [' b# L! g% O& `9 v# p4 O7 }/ l5 A   return 0;
7 `1 |1 }& G# J( n}
1 o4 ]% p1 j  E2 Z7 j& Y2 Fstatic void __exit MCBSP_exit(void)
  t0 C+ z: h2 o{# I% c" q5 ], B, I8 C
   printk("mcbsp chrdev exit!\n");; k1 s! r6 S1 ?1 m5 s1 y/ j
   cdev_del(mcbsp_cdev);; f! }( N0 T$ I) O9 R
   unregister_chrdev_region(mcbsp_dev,count);
! K) j! j- E  c3 @& Q5 ~1 ~: p0 ]   device_destroy(mcbsp_class,mcbsp_dev);5 p6 d" f* r+ C5 f. p4 ~
   class_destroy(mcbsp_class);
  p3 N' `) o6 r" M2 m# m}7 {1 O% ~4 q3 e) k5 x$ X
module_init(MCBSP_init);: X) S1 M2 P! c! r, O
module_exit(MCBSP_exit);
( y0 M/ h2 R- B& h, |2 |; v. Z1 f' Y' l' B& t/ y
MODULE_LICENSE("GPL");$ l' o2 C. R) r- V* {. p3 r3 D) `  H
+ e. n; }; N- K) M; _. q( h# a
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。: P) F, q6 E8 X' j- }# \
我的应用层的测试程序如下
& T5 e9 `- p: \' Z#include <stdio.h>
% J, Y8 H0 ^. f! m6 f5 a: b1 A#include <string.h>
5 ^# v; y6 R3 t1 x0 d#include <fcntl.h>
" X4 M) e8 F9 `#include <unistd.h>! I- E; ?/ F' t& ?- ]
#include <signal.h>6 d5 [2 v0 u: J# p9 G! N3 W+ F; a( y. M
#include <pthread.h>       //线程
! }6 p) |! J! D4 l9 y" F4 z) d5 m#include <stdlib.h>
$ r3 i/ B, G- q7 ~  W% f#include <pcap.h>          //捕获网口数据
5 i- [) W; f# n2 l#include <semaphore.h>     //信号- [$ A+ [% g; N
#include <sys/types.h>     //消息对列
$ v6 Q: ^7 {# ?- V3 c#include <sys/ipc.h>       //消息队列
6 T$ _) p# N5 K1 E! u& k#include <sys/msg.h>       //消息队列
. J2 B. Z! h* K% u3 d1 W) q#include <sys/select.h>
3 `1 j' @; e9 O. i#include <sys/syscall.h>
, y/ o) D3 O4 C- e" }$ C#include <sys/stat.h>
9 K) l% L/ S, |#include <sys/mman.h>
* o- i5 }$ ?% _1 \2 U#define msleep(x) usleep(1000*x)
8 c6 ^+ n3 ?' P
# Z9 ~. l* }3 @. q& M, `' Vint main(), S" p8 p% g5 u1 y: C4 x# `3 x) C
{
  v( Q( q& g- Q' E    //MCBSP,ARM与AMBE2000交互设备/ }. A, q8 V9 [( X4 y5 O7 f
int fd;
/ h/ |1 i5 T: X: D  \# Q unsigned short data_write = 0x5555;, J( k+ x; S! j# ?* G
unsigned short data_read = 0x00;4 V8 q! L1 K1 F& q
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: a# Q$ e: w5 F. Z% Z- Z
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, p& a2 L' _* |# f, D' s- _   
( X! ~/ [8 w( J& `  if(fd < 0)3 \3 V5 y. V- x8 k5 B
  {
. x0 p0 q$ ~( {3 [     perror("open failed\n");
+ D: n" a0 _& j$ H# M; [/ b     return -1;( p% F+ ]) x3 c( N2 E7 G
  }7 y+ x6 p1 S) |' ?3 T0 v
  
/ m6 H" D2 J7 \- x0 ?8 V  while(1)7 t' u, r" G1 O2 y. l
  {2 [7 F5 p% \% x+ l$ h; ]" y
   : [: `6 K3 |5 s6 I
   //AMBE2000每次读写是24个字为一帧
: e$ ^2 C& O# p# e" R! d   //写数据时将数据在底层存储起来,等到中断的时候再发送% c  g7 ]2 l1 r! y# A; T+ C- X
   //AMBE2000输入数据是以0x13EC开头的9 e7 U8 q# `$ Z5 Y9 q& _: n
   write(fd,&data_write,sizeof(unsigned short));
. ^7 W  _+ T7 I  X   / d8 o" H! n8 A6 \
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
; w/ C. Z% e0 c9 o( g   read(fd,&data_read,sizeof(unsigned short));
% i* ]( a# _; {" q   4 P1 O! R/ [" I1 Y
   if(data_read == 0x13Ec)% v% X% M  O$ \: E, I* A9 Y) N+ l
   {
2 @! ?# i  @* w$ l0 Y/ c7 F   + O3 z' c+ d! V# v1 T) M
    printf("data_read = %x\n",data_read);
, t/ a; t* h8 k' w9 }; ]   }
4 \: H! p3 `$ S4 P2 m5 b) L( w   1 @' ~3 P& F/ m
   msleep(10);1 \1 h5 l, w- z- Y
  % E. w! [8 H1 G8 O5 T: ~, O) c4 W6 s
  /*" A. @  V& [2 `& o" @* m' v$ {
   ioctl(fd,1);   
/ A, H2 U3 ~- x: l# F sleep(1);# N, t- J4 b+ P' G7 a
ioctl(fd,0);
. B$ r- E" m$ @( U$ Z1 u2 Q, B# v) L sleep(1);
8 ^& k+ ^! ?% A, X" u */ * `6 P* m1 v, M; R  O. N
  }   
( d! Z; l$ [' ~' R5 ^ return 0;
! N# ]+ l/ B3 J* V/ Q4 Y& ^! g
/ a5 H9 u* K7 I8 `; q# o+ E, Q4 ]}
! F0 j  y- u* w; z9 H
% `. i3 k9 s2 K% W* a: U" c; E% u多谢各位指教,谢谢! 急0 P; U( Z1 N% f/ Z8 {2 u

! l9 Z$ A; n! M+ u* j6 D2 G1 ~3 `% U9 u
4 \, h3 ?6 S1 L% w$ v2 S0 C/ C
5 u; Z; Z9 S; B" a
; N' [) |! S% E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 23:48 , Processed in 0.041851 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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