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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" c/ b7 o' f9 w7 m5 W1 P2 _# D/*/ B0 s$ R4 ]! N* v6 O
* Copyright (C) 2009 Texas Instruments Inc- O; R( `: w& G  t
*
5 H3 h. B' z* t2 O8 U' W * This program is free software; you can redistribute it and/or modify
! i. t. K! b7 Y4 a1 J9 B$ M& { * it under the terms of the GNU General Public License as published by2 y" p8 i' e# w! {4 N* H# h# D! i
* the Free Software Foundation; either version 2 of the License, or
1 ^) ?0 ^# k! m" Z9 E * (at your option)any later version.
- d0 e* i- n% D- T, ~8 S+ s- k2 [ *
: s5 z  O) j) Z0 F9 E * This program is distributed in the hope that it will be useful,
* U* P: ], f! G$ } * but WITHOUT ANY WARRANTY; without even the implied warranty of
. V  G2 a* }9 m4 n8 c * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 ^9 V' {5 u# `$ F+ I, B * GNU General Public License for more details.
& ^% H: I, Q5 Q1 G3 f9 L *+ Y/ z3 u; C( D; C
* You should have received a copy of the GNU General Public License" ~! s1 r- }+ H; K& [' Z
* along with this program; if not, write to the Free Software
: @, j+ `/ ?/ k4 }' n * Foundati2 b: v' w. {: K6 a7 \5 u+ K1 g
*/1 G# v2 {9 d9 [7 ^) Y
#include <linux/module.h>
: i4 ?  m; J0 ?: m% B#include <linux/init.h>
3 N4 y2 z& ?0 {#include <linux/errno.h>) W1 Z$ s* C& V5 t0 O( Z# b4 M
#include <linux/types.h>
) f3 {, @& ~/ I" ?7 H6 X: i$ D#include <linux/interrupt.h>
1 G5 A, ^  K8 ^: r& G, _#include <linux/io.h>1 G/ h$ K- b& L) g! s' ?
#include <linux/sysctl.h>
1 ]" U+ O" {# E2 `: K#include <linux/mm.h># j% u$ ^* o6 h5 n4 }4 E6 e5 w5 l
#include <linux/delay.h>
# }" G4 `7 y4 `& D; P/ e#include<linux/kernel.h>
4 O& _/ w, F# \) }#include<linux/fs.h>
) \/ d. S; i/ p$ S$ d#include<linux/ioctl.h>
- h: v6 O  D0 c#include<linux/cdev.h>
( B7 `, V; G& O4 x+ |9 u8 }$ s- k- o#include<linux/kdev_t.h>$ q/ r9 N3 |3 h5 N5 C" v7 H
#include<linux/gpio.h>
# T' t) E% v. j6 \  J#include <mach/hardware.h>
& E% Q- }& w# |% x, K0 P$ X#include <mach/irqs.h>
3 l+ [$ q& b! I9 m; z4 K  Q9 v5 V+ L! s! {* a) X& f6 j2 W
#include <asm/mach-types.h>6 U7 w- y" y' V8 [* ]0 R8 G
#include <asm/mach/arch.h>
& e6 `" S8 s5 q3 \6 [( b% V#include <mach/da8xx.h>
' V* ?# R2 O# }) H0 m1 y#define  SYSCFG_BASE   0x01c14000; l* W$ y! @$ {; x) f( r
#define  PINMUX1_OFFSET   0x124
% H0 z' R! P) T3 I0 v#define  PINMUX18_OFFSET  0x168 7 m  d% c# m1 m2 \
#define  PINMUX19_OFFSET  0x16c# r; k% h& ~  T
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR( c+ Z9 S* O% X, I( t
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
9 |! n" U! Q5 E% ~6 ?' u#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
! I0 u- j0 i$ W2 N2 z, D5 q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% _4 K4 K/ f9 Q- v" A
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, e# A, e5 t- v, E: z# L* ~% [                            8 L0 v# W' |8 x4 m
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR& R3 f2 s7 B2 B4 K7 e4 H
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
! T+ G+ q/ _9 |//PSC2 q/ m  h; [& x& F  ~$ |
#define  PTCMD_ADDR   0x01E27120  
/ A) c" i5 f$ b* `#define  MDCTL15_ADDR 0x01E27A3C
4 F( t+ z. L" [' i; k#define  PDCTL1_ADDR  0x01E27304
+ d9 D! X2 J1 m, R% `& I//GPIO8 direction% u, c1 w9 Y$ u3 W, ^7 x
#define GPIO8_DIRECT  0x01E260B05 y% {/ C. x8 ]9 \; a. Y! ^9 S
#define GPIO8_OUT     0x01E260B4; i% k/ D, q* n+ a) H
#define GPIO8_IN     0x01E260C0
+ p5 F0 u2 k, w! {6 L9 L! ]& @) y+ o# `$ B- r5 ^: D
//#define MCBSP1_RINT    99              1 j7 Y- E$ j6 {/ D' W3 Y
//#define MCBSP1_XINT    100  8 b3 V: \! Q" e) I4 P0 x3 ^! x
static int MCBSP_MAJOR=239;' R5 D- Y; P6 d- h# p5 f
static int MCBSP_MINOR=0;# g: O- u4 S8 ]- Z7 ?$ E/ l
static int count =1;
1 z9 S6 c" N4 f* I' x  Y% ~) A5 @$ c
#define MCBSP_NAME  "MCBSP-device"
0 H, T. g' f; C1 A2 l5 b3 m+ w# o% ^$ k" y
static struct cdev *mcbsp_cdev;1 v* k* e3 U% Z
static struct class *mcbsp_class;
/ p3 ]! O9 W, \9 K: ^static dev_t mcbsp_dev;
& x$ G' G& c! N+ ]" Hunsigned int DRR_data;# u/ [# R* B8 f
unsigned int DXR_data;6 b8 d/ Q# V0 ]
static int mcbsp_open(struct inode *inode,struct file *file)
4 e$ P7 C6 _( h7 \( ~. w$ g' b{6 s; i, u1 D( u3 o2 j# X: d
   ' _% ~# j( h3 r' W; q
   //interrupt enable,initialized
0 S$ h4 |9 h# A8 u6 s( X   unsigned int temp;! c. H- Q. T% X# u5 d
   //SLEEP_EN(GPIO8[10])---0
1 X, T# E6 |* Q+ R! ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# ^. }: W% x/ B1 ~   temp=temp&(~0x00000400);, v8 u5 z  |' N! G# E& G; p5 L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ q8 M' V* X" u8 Y* R  //RESETn(GPIO8[8])----0----1) e8 p9 K! d. ~& F4 F7 f. i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- ^3 V* j7 _4 J   temp=temp&(~0x00000100);
% F/ B5 U! @0 u; H% A6 d   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* b* ?* a8 R# \' L9 Q: t   udelay(100);
7 q& L' S+ c: a8 z. x/ R   temp=temp| 0x00000100;! q5 u" J: \+ C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1, W& ^/ J4 Q/ o1 Y- X
   udelay(100);
* k/ n; s) o- m, G   printk("open success!\n");/ L1 r" [9 B7 Y; {# w
   return 0;& @" N1 ]5 ^7 h* ^2 H9 q* U9 J, W
}* D# Y7 }4 u, Y) H8 N
: U3 P" F/ I; h. m
static int mcbsp_release(struct inode *inode,struct file *file)
% i4 [1 h+ J9 L+ [4 r3 [{* W( A: e7 J0 Q
   printk("release success!\n");
+ y' n: y) d+ E4 @! `   return 0;$ i, S  o) g0 y0 ]( r
}
2 U) E8 y4 h, j' N
# s; g5 S* j$ r* \static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% P+ }, s1 ^  l( b{
6 ]  o* J+ x& Y* N- v3 |    copy_from_user(&DXR_data,buf,len);# t7 \# u6 S3 d6 T, [% e2 w
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
! g8 d# ^, G6 ]' W% y    return 0;
) ]# p6 ]+ E: c/ K$ }- u. Q
4 M  |3 h6 ?) b& p  h9 X}! [8 a% ^( e( j* {# `7 A8 e

0 |0 F) N1 h, e) {4 x% j: E  z2 E4 Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
2 O8 h4 z  O0 p& F. T$ o9 J$ ^{ 0 o6 p, p3 i- f, g. M% W+ A
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" N6 U0 B& }# z' g% `" x
   copy_to_user(buf,&DRR_data,len);
. X5 P" }3 ?' S' q   return 0;5 G" G$ n! k1 E& j' p5 q4 `) Z0 m
}
  d2 O& ]6 L# k" G7 q3 Z% O3 y  {! J3 P3 \+ U. K2 U

* b! j6 U" K' L+ N8 R2 rstatic struct  file_operations mcbsp_fops=
$ l- e; H. l* Y{# |. W0 d  F- J; J1 D" A: n/ V. B6 m
   .owner=THIS_MODULE,
- t& v  j7 ^% m, s+ Y1 x3 N1 u   .open=mcbsp_open,
, P1 o8 }8 O2 _" I# K( r, u   .release=mcbsp_release,
& @! Q! P7 C) d   .write=mcbsp_write,4 D1 p; y* T; c) q
   .read=mcbsp_read,
5 m/ n; N) a: b/ b, d$ b- ]& [};& H6 s, ?: v$ t$ `
static int __init MCBSP_init(void)
; s0 B6 ^3 C2 C8 d) N4 V{, h4 v  i% b+ s& B, T
   int ret;, l! M6 k$ h, z# y; o6 ^
   unsigned  int   PINMUX1_REG_old;! K9 [+ q, M* j' `% I7 Z3 q
   unsigned  int   PINMUX18_REG_old;
# k# v  M+ o' E5 X! `5 F   unsigned  int   PINMUX19_REG_old;, f& T  A9 A6 I+ ^2 m1 Z1 H; t) H
   unsigned  int   temp;  . Y9 T" N" B& K8 n* G
   if(MCBSP_MAJOR)
2 `2 f" N! t0 Y6 t$ H, ]/ h   {
0 c- E' t2 p0 d, p8 O- ]      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' K) j% O% ]- w" j9 Y% h( B9 _0 _0 C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' o8 R6 ^7 H$ q  ^. ^   }
) \3 T$ T9 ]3 k: P: [0 X' s- F   else
5 o$ S3 S+ X- k& a) Q   {
. L: F7 c& o- b3 D* R      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 A' b9 [( j9 g( _7 K% M- t: J: G3 k! v      MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 C3 i: j0 q3 l6 T; A2 r4 }- c% C( l   }
: O7 q( U4 s* Z. }. X+ T' X( E   
' z9 x! P' d$ x" c/ \( w# M   if(ret<0), T: [7 V7 {$ P' K' ?6 ]5 b7 v5 b, m
   {6 ?* ]1 F! k% @- W' q
      printk(KERN_ERR "register chrdev fail!");
0 V9 O" R2 G5 I) q! Q/ b( [      return -1;
6 k! _/ [: `; X) e! I8 d   }
# J) i, q& O/ P   
' f5 B2 h7 r2 @( J" A   mcbsp_cdev=cdev_alloc();& H' O- W* E, @) p
   : w) d; l$ A% P3 u# Z4 c. ]; q
   if(mcbsp_cdev!=NULL)
# B% A6 Q, h" M. {" q: K. _   {
3 X/ Z4 [9 Y5 o) ^# o. I      cdev_init(mcbsp_cdev,&mcbsp_fops);
) E- Y! T6 B, u; {      mcbsp_cdev->ops=&mcbsp_fops;
0 B2 X5 A* t' b$ H      mcbsp_cdev->owner=THIS_MODULE;6 ^3 a) x& a- A( D; e0 U( u
      
" v. q3 [, i1 p+ m      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* C# u% |) k0 Y( k! W          printk(KERN_ERR "register cdev fail!");' \) f( ]. Q0 j+ h: \! V: D6 W
      else5 y6 @) t2 H6 G! v$ ?
          printk(KERN_ERR "register success!\n");
) i  V# X0 ?1 N   }
0 v$ x1 K) ?7 c& T! A" W5 Y% W/ r5 c   else
# x: S; K' ]# U6 F# [4 S   {
& [/ ~5 A5 B. O% g; B      printk(KERN_ERR "register cdev err!");
$ B5 x! L7 ?7 l1 J' ?5 R6 h8 L      return -1;" [! i$ j$ T: [: J. l1 l6 N
   }
" ^" k' r3 j# a2 \   + f1 _+ V: y$ k+ H1 B4 @( n% O
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 `* f8 i3 @* Q/ |
   if(IS_ERR(mcbsp_class))
# z( u- y8 G( d' [: f! j   {4 `1 O, O  w5 o% \. [. ?2 K1 _
      printk(KERN_ERR "register class err!");; I$ g1 U4 x1 o) r: Z
   return -1;
6 U; m3 e+ \1 _, z* ~( |) U   }8 ~3 F1 O8 i$ P1 D* \0 p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ c7 K. k  o: M7 l! W' v( u7 u; Z. A: Q# q( ]7 A
   //PSC
: T& C$ F. b2 H. C3 i   //add Enable MCBSP
4 y. O+ H2 x% P   //test( S2 {' `! X) {/ y# u
   temp = 0x80000003;
# [* a4 ~% g8 E# M  `% d  p+ O, O   writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 O: |# I% e3 k9 c2 C/ k
   temp = 0x00000003;2 D- _" r2 ~: Z7 n4 h
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
# e; Q* _( S4 V. Z7 d  L& F: U
' d2 u  p/ ]$ S( R8 {   temp = 0x001FF201;
) o9 S. f+ Z: Y; V7 k: l; g   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 A6 |# `6 m7 J6 Q& Y* z- w* N   & \& T! p" o  _3 A
   //PINMUX  3 c7 ?, J1 o, z  p9 w1 i
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
& C9 D/ M% |# F/ Z& D   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  6 f" E9 @+ X7 u" j
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
. J; w" _+ X) @1 M- X; P9 F   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ D& T5 p: f! H* v
   
- v1 h" q8 P. p- D   //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ u8 u- k1 ~+ l1 w   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  : [9 E3 i4 ]8 m. Z, T4 a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   , q) d2 w) `, y" O7 l
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! [  B  ^# P! w5 M8 r( w$ H2 z. M

4 j3 o3 J6 c- N; [- g0 l7 Y   //RESETn,L138_SHK2& t6 E' G2 ]* s" z. u! ]6 E7 q
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
, e7 `2 Y8 z; q   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 t# u7 q2 H) ^. K   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 o9 s* }7 I) d4 q: V/ }( K. g$ G  ]4 g+ J
  r- P6 y# m! H' H. C" K$ t# S+ O

8 U: Y+ Q; T2 a. S+ s6 H  //SPCR Register
. X6 D! w6 |: h' h- Q8 T: k2 T  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset8 b# u4 M- j3 ]+ R
  temp = 0x03000000;//(DLB=0). s* ~$ D/ Y" P8 Z0 v
// temp = 0x03008000;//(DLB=1)
- ?, f" m* M. H+ W3 u  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* F: N  T+ H8 Q3 K$ W- P" ?+ \+ @
  temp = readl(IO_ADDRESS(SPCR_ADDR));
; T. e" d0 |" S3 n  printk("temp=%x\n",temp);3 s% b2 X0 H- w& I+ S( V

# }4 s( C. [, g0 K   //PCR Register; \' ?- o& P$ ~
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( P5 E* n2 O' a# A% R- j3 l  // temp = 0x00000F0F;* o/ h% [* t- t
  temp = 0x00000B0F;
1 s- k* n+ T2 b, c  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ) {  R# j" f* Y
  temp = readl(IO_ADDRESS(PCR_ADDR));
$ z# T; l1 l) `9 j" b  printk("temp=%x\n",temp);  
  W" j! ~6 c1 ~   //SRGR Register& v: N& F9 L- q6 O$ b/ x
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
$ X0 t$ X+ P# ^$ c //temp = 0x301F000B;
3 J+ h: ?, ?4 O9 e/ H3 I   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized / Y: y& g' T2 r
  temp = readl(IO_ADDRESS(SRGR_ADDR));
* d4 \+ n* s/ g' m1 R  printk("temp=%x\n",temp);$ }1 L6 B: v, o5 s8 D/ C3 @
   //RCR, f. G1 Y/ l' k$ S4 C. I
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: X& o6 `/ x, Y, J7 x- R- t   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 j  q1 s. g- d6 |) C* l& Q
   temp = 0x00440040;) D; Z: [% x: {, m1 J
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   3 s5 x3 n0 b) S/ V% Y) q0 J2 j2 z! E
   temp = readl(IO_ADDRESS(RCR_ADDR));
1 V) m' U4 A% `  F# U   printk("temp=%x\n",temp);+ G# I, l1 k0 d- S" P( o+ E* A
   //XCR5 e6 x9 ^& B/ s1 E: @' P
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) M; X3 r1 V' C9 W& o
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
# c0 S7 @5 {3 |/ R   temp = 0x00440040;
" L' y1 H' b3 Z$ v  V% O/ _; g! y   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   . X% L2 m% a2 F/ c! q+ E
   temp = readl(IO_ADDRESS(XCR_ADDR));
9 @$ R' U- g1 X/ q! ~7 O" ~   printk("temp=%x\n",temp);
. n# j! {  H$ V% A# d  udelay(100);
& y7 l" ^2 X3 c8 j  //SPCR Register7 q/ H; l; y( J& P, g9 B9 A& |- x
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' O3 `8 B! [7 @8 e7 [  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, O7 p: ?6 n# P! K( S. F  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" x  D/ M5 f6 E) z( F
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( a! K/ q5 w: z+ ^  printk("temp=%x\n",temp);; I6 G, j: K$ w
  udelay(100);
6 a: M4 y! v6 q# E7 v7 U: z9 J. p9 p$ n' F
  //set GPIO direction
3 B% a5 d# Z9 C0 @) g$ K   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 e+ W3 r0 }4 J+ ^9 f1 o" q. o   temp = temp | 0x00000100;//EPR----input
2 U& X  z. K9 H$ @& a   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 ?. d% N  S( d8 v3 x8 g  G7 v, D  O
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 P2 C$ g; q' l! w* Q

9 P4 f" l) E. L- f+ m/ s6 Q   return 0;1 N) `# T1 I1 H* s# z3 v- `& Y
}7 @$ d1 E0 c6 k0 b- Z7 c1 g
static void __exit MCBSP_exit(void)9 A9 W) D& l8 Q* C9 G
{
; ?/ a, m% D% y% ^: i   printk("mcbsp chrdev exit!\n");
4 n2 I* n& \8 a2 ~! O+ k5 h. Y5 x   cdev_del(mcbsp_cdev);
6 i' r6 i7 C5 D4 y   unregister_chrdev_region(mcbsp_dev,count);3 T6 g, k' Z0 y
   device_destroy(mcbsp_class,mcbsp_dev);
2 n5 f2 I# g) K9 {   class_destroy(mcbsp_class);  T9 \9 @9 S7 g4 h9 k# |$ b
}
! Q) z! e5 d, n4 ymodule_init(MCBSP_init);! w8 \+ _; B- ?! R0 |# p& v
module_exit(MCBSP_exit);
3 _' n# i- Y7 H' B5 v( V
2 ^: I/ o) v. D! j: oMODULE_LICENSE("GPL");
; [+ O/ X* f# \  P4 r% v$ v, z% J( Z$ w) y. y  ?+ T
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" L& Y/ c, G+ t我的应用层的测试程序如下* W. l: ^9 F- _# m, g
#include <stdio.h>
/ O3 X1 X# e2 {5 ~$ E7 `; A3 |2 z( [#include <string.h>
: e% i- T1 z- a. Y; Q. a#include <fcntl.h>
! U  z0 Z( Y  p  Z  L! l#include <unistd.h>$ P& Y. Z% j2 e% R5 n' ?
#include <signal.h>- w; z" C% P0 [6 o8 j9 ]
#include <pthread.h>       //线程
- }' Q: j( a; h( t* V7 g: b; b5 Y#include <stdlib.h>
$ I- N$ k' i, P6 u. e, D#include <pcap.h>          //捕获网口数据4 i8 V+ f/ }5 g7 p- x
#include <semaphore.h>     //信号7 D' t) [8 O8 u! V$ j# m8 D
#include <sys/types.h>     //消息对列8 p( K% O+ ^  N1 \' R# `
#include <sys/ipc.h>       //消息队列
0 y# u" [( `  n6 S% f- W2 ~#include <sys/msg.h>       //消息队列! A7 o' U3 @/ s' n8 L% t6 [
#include <sys/select.h>. i* ~) K* C- g$ B# e
#include <sys/syscall.h>3 [* s# P. n1 P4 V
#include <sys/stat.h>
5 B# p, \( r* ]3 b  R/ ?5 P#include <sys/mman.h>
; Z2 R% e7 {& k1 S* l#define msleep(x) usleep(1000*x)( N5 K2 L: }  @8 y# P
0 a& {+ e! _. N0 U7 i9 D
int main()8 m) c: w8 v2 e/ g& G
{ # z1 i8 r% W& M' S- s" ~" ]9 {
    //MCBSP,ARM与AMBE2000交互设备' p2 F( X. l* S4 ~$ d0 Z- y
int fd;
& s3 W3 D& O7 v; R* g unsigned short data_write = 0x5555;$ s1 |6 o- ]* C$ b: b4 _: u8 T/ ]
unsigned short data_read = 0x00;
! S5 ?/ u$ u" u  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ h2 q  P+ r( {
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* j1 X; Z6 d6 q$ s- r  N    5 d* U4 ?0 I% n
  if(fd < 0)/ g# }5 q4 x. X) Y6 Z8 p+ U# K
  {
& i) b0 _" ]1 Q$ J7 |     perror("open failed\n");5 o8 R# C  z- Z0 v
     return -1;3 r; ?7 X* X# x# Z# L: T  Z
  }4 \3 F, y4 b7 L. P# e
  ( j8 q5 `; h* k; |. d8 ?# j& `- y
  while(1)( ~3 F/ u7 v' L/ T
  {
' O6 u) O, u1 q% e+ y   7 p3 q4 x0 P0 f' i! V% q/ S
   //AMBE2000每次读写是24个字为一帧) P) Q3 m1 X, B4 s
   //写数据时将数据在底层存储起来,等到中断的时候再发送; x3 n7 l, A3 K
   //AMBE2000输入数据是以0x13EC开头的. R: H' Q: n0 D: j) Y' @
   write(fd,&data_write,sizeof(unsigned short));+ e& `' v/ ~4 m! ?! [# A5 z8 \
   ! X. `) [& \1 D6 \: \4 }" D2 f$ [3 N
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  3 _9 P1 m# k  _7 j
   read(fd,&data_read,sizeof(unsigned short));6 h. r4 L; q) w9 ?& y$ Z
   
+ z2 `& U0 D2 B% N   if(data_read == 0x13Ec)
7 O8 R9 f' L  q; A) f7 _* x  B6 A( |   {: G- B* r$ s4 p6 \1 Z$ _3 O  S
   
5 @$ H5 F& ]* Z  x0 }    printf("data_read = %x\n",data_read);
1 ]1 C5 E8 \9 O* U. p   }
8 I- ~$ H( S5 J4 `- r   
: {- F8 g' K" k   msleep(10);
$ k1 h, a2 R+ y4 c  
7 A; u: Q: r9 ~  y# x6 {  /*
, `. a, A" M3 @   ioctl(fd,1);   : @5 W1 c8 }8 q  [% ?/ ?, |8 z
sleep(1);: s5 q& s1 k3 Z& z4 Q
ioctl(fd,0);
9 a5 H8 \4 l# S6 S; \& {: K sleep(1);
/ d, q' N& w# ` */
/ G+ A% n; x" {; H: b2 }  }   $ e- H: h) ?- i" W8 L
return 0;
" ~6 @  y. {% `1 N! J' d
, [0 C5 T" N! n' C- a% _}
' Y/ B! X% H2 S5 H4 z( @2 G% F" ^1 ^* H% Y6 G2 `
多谢各位指教,谢谢! 急
2 |( {" y; ^+ U' W7 |0 b8 ]
" L0 O, o! ^% c- K  R( k
8 j+ |+ g0 @' i6 @! P
# G, B4 U- L; ]7 [- I, A$ g5 v7 [0 O3 \, r7 g4 l6 Q5 j6 O

/ Q' v2 j8 r( p  K  q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 03:48 , Processed in 0.046626 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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