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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 r! S$ ^7 a9 {2 [
/*6 u  E$ v3 ?+ J2 X
* Copyright (C) 2009 Texas Instruments Inc
: c/ ^1 j" j8 Z2 X$ w' M4 a! Y5 D *  n! Y+ M* m. ^" V
* This program is free software; you can redistribute it and/or modify
6 E) }# P% j6 X8 X8 E# w * it under the terms of the GNU General Public License as published by9 A. v" Z* E0 N/ z8 V9 T
* the Free Software Foundation; either version 2 of the License, or
1 h" o3 I; Z( R. K * (at your option)any later version.* ]7 g5 ]; f* `/ i8 c* o
*+ e. M/ k0 ~3 a7 _3 v! P3 ?
* This program is distributed in the hope that it will be useful,
5 ?$ C- F; b4 }- C1 J * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 W4 o4 [- Y' w* y8 A6 C * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 w& E- L% b# y- k
* GNU General Public License for more details.9 H0 v6 w/ D! R, n
*
6 D; L: d. C+ q5 z% ^4 Q' h * You should have received a copy of the GNU General Public License! L5 h9 m0 z; Z' P; v, P
* along with this program; if not, write to the Free Software/ A, I* Z- }8 d
* Foundati- e) i% g2 [  C( \
*/
6 G+ F, M( O2 C; S0 j, _+ `# \/ K' Y#include <linux/module.h>
; d0 d0 t3 ?" ^, V4 J7 u4 k#include <linux/init.h>
. H0 k1 g, S7 W3 t# ~#include <linux/errno.h>
% |# G% v! w9 p7 L# z#include <linux/types.h>2 N9 c* H) l& A% K
#include <linux/interrupt.h>
5 ~. j( W  p- d( J2 e#include <linux/io.h>
1 ~5 E" m+ s  D& U9 o9 Q  h#include <linux/sysctl.h>: t- {. y9 n- I0 P4 ~- \
#include <linux/mm.h>
/ Z' z9 M% x) z  ~+ n' b#include <linux/delay.h>
8 b7 q' P1 n9 X/ Y8 r5 `+ S#include<linux/kernel.h>2 M! k8 k& o# w% I9 X# @4 F
#include<linux/fs.h>2 x+ v  b  k# ~/ b! o
#include<linux/ioctl.h>
6 d, h& s/ |8 J2 H' @#include<linux/cdev.h>
8 r  x- M" ]3 R$ z- h& a#include<linux/kdev_t.h>, U; b# P7 r# V7 y2 T
#include<linux/gpio.h>2 |7 N4 n% P0 q& i3 v/ `9 B6 Y5 x
#include <mach/hardware.h>
. x% o, L: c$ V: z+ @, \#include <mach/irqs.h>1 ~5 X3 L2 P. G) J3 p$ ^
' N+ G' d/ v' [  g" P
#include <asm/mach-types.h>
8 |5 w$ }8 p6 r  d, J#include <asm/mach/arch.h>5 p8 D1 Y9 @* I2 K
#include <mach/da8xx.h>) _1 R9 f0 g5 }$ q$ ?
#define  SYSCFG_BASE   0x01c14000! a, @/ z  l# ^% E" k  u
#define  PINMUX1_OFFSET   0x124
! c# V$ Z- x: I$ T) m! K" e! v! a#define  PINMUX18_OFFSET  0x168
: D# [2 r% Y4 m- u# D, _! |1 `+ u#define  PINMUX19_OFFSET  0x16c
. K2 R" q- r, V0 L  a# m#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
0 d5 [* X0 Q4 f& T+ {#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ Z8 K6 \/ }% U6 `) Y  p#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
6 D! \* ^' ~/ ?% e" i& e#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR4 u. f3 Q) J5 @
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; H5 ]3 D' g1 r  t                            6 N) e: y  `2 V6 P" J. f) Z  ~
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR. N1 b& J# U$ L" {
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR; e/ v/ M- @/ f8 {/ l. ^4 p
//PSC
% q. M" w; }7 ]#define  PTCMD_ADDR   0x01E27120  
& ~; g* \8 y% Y) r. B6 u#define  MDCTL15_ADDR 0x01E27A3C5 F& `9 H7 ^% Z2 ~  K# G
#define  PDCTL1_ADDR  0x01E27304
9 d) v) ^/ n: o( c, ]0 A//GPIO8 direction8 r2 s5 C, V; J( v3 H
#define GPIO8_DIRECT  0x01E260B0
& z) @% P& a, E6 K0 Z#define GPIO8_OUT     0x01E260B4+ [! o9 C& t) T' T
#define GPIO8_IN     0x01E260C01 a2 o+ w6 i& w7 D& i

( C, q* s4 ?  {8 [  i//#define MCBSP1_RINT    99              
. Q$ W5 r- t/ z9 u+ L//#define MCBSP1_XINT    100  - S5 W/ H5 v, o' u' W8 \
static int MCBSP_MAJOR=239;( H9 H5 z: X7 P. c
static int MCBSP_MINOR=0;
( v& [( M: e$ R! Z& w  J3 Istatic int count =1;
8 v; H: S3 b  F( i9 l. p# V3 W5 r. z% q% r
#define MCBSP_NAME  "MCBSP-device"
/ {+ ^  J. Z$ F* }' j: }6 I, t7 X& e- l; y
static struct cdev *mcbsp_cdev;
6 k: D5 _; R" ~/ O9 cstatic struct class *mcbsp_class;; g2 T% d- s+ i% O8 Z
static dev_t mcbsp_dev;( |8 w9 J$ I9 L( [
unsigned int DRR_data;4 ~) o6 @1 Q3 B4 D8 D+ |) H
unsigned int DXR_data;
- \# J$ o/ T6 [: \1 f4 Hstatic int mcbsp_open(struct inode *inode,struct file *file)
4 o6 J) U5 d' T9 \{
( |" r6 [! p- [/ e   / M5 ?3 O5 k" Z) i+ |
   //interrupt enable,initialized
' g  {) }! v, C6 r  F  z$ D9 y7 e   unsigned int temp;
) s' f7 \% I3 Y7 ]   //SLEEP_EN(GPIO8[10])---06 M* H* Y/ N2 N; G& F$ J; H% H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; g/ ^3 u# i" n+ W5 j   temp=temp&(~0x00000400);& d( S+ C3 ]  Y0 d4 a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' Q. {1 w, l  p/ [6 F7 l0 Z
  //RESETn(GPIO8[8])----0----1
' ?' W3 M+ q# b   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 D3 c5 n4 c( A1 O7 S, V
   temp=temp&(~0x00000100);% J% D" J: x. Z4 K
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' U4 p/ U( o+ n6 ]5 e7 ^% o( S
   udelay(100);
, y8 o6 n; J% k4 y6 J% N   temp=temp| 0x00000100;; G( G0 c+ |3 a/ N" y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 a& X! M0 M/ e7 M   udelay(100);9 g% o# ]3 D9 R: b: i
   printk("open success!\n");
6 c, I: w( r' {, p8 `6 }) }2 F8 h. U   return 0;
1 v3 @* M) P; L0 w}
7 @! g3 x' o/ k6 h0 O
; V$ z" |) V! R4 Astatic int mcbsp_release(struct inode *inode,struct file *file)
; K/ a0 P2 R, _% m' g  B{- ~. _: j) h$ x3 |2 ^5 f/ x: G
   printk("release success!\n");
% W5 ^* H* V, d! {$ N# l  h( N   return 0;, `& v, R; l7 z2 O5 m& V2 T) a
}
( V  i, H: {; ?' |
+ |; E5 A: D1 q1 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) b- [' n) Q: l% u) j
{4 {. `. C" O* `/ P. O( W
    copy_from_user(&DXR_data,buf,len);
# y. e3 }3 B) X0 e" c% c$ X4 _, Z' d    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
3 T& b( B% o, s8 P2 ?  K) t0 S    return 0;! e1 Y" }: i/ H

3 S# e: B8 b$ H4 Q7 w& L' k$ w}
- j8 o/ X5 Q3 h+ J  q& i* B/ v
9 B3 ?2 Z! Z, F3 Lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ \" w  B# I/ n1 f4 [$ h& s/ x
{ 8 h$ \& u0 \7 G7 A
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; `7 @9 X7 l; g  ~   copy_to_user(buf,&DRR_data,len);
  |4 j9 G$ L" }  P& w. e   return 0;
  E4 q8 i: l& Y' E0 _' q1 |}1 S. |& Y$ D$ b6 Q* l
* r' T! M( V9 [' _1 o
, F' W# t# O  P9 }
static struct  file_operations mcbsp_fops=
4 b! v+ o) l* D; P3 b3 G9 R4 ^- t{
8 B# c" K+ v# @+ X) j- j   .owner=THIS_MODULE,  X' C& L7 X  T$ `  p# F
   .open=mcbsp_open,
( j, R' P7 Z1 b* x/ B2 E- q7 t   .release=mcbsp_release,
7 K9 A7 m2 A$ t7 S7 W   .write=mcbsp_write,
* H1 r9 n( b8 t5 c' u8 L* V   .read=mcbsp_read,5 I9 u, K: f5 x7 O( }: z
};) C3 v: C- u, O6 J5 Q& p
static int __init MCBSP_init(void)
" R" X. ?! H6 {" d+ B' I{9 W5 v( B) [6 m* F% Y3 Y. z
   int ret;4 Q, V8 n/ ?3 G1 T  W* z
   unsigned  int   PINMUX1_REG_old;
8 C; m2 q5 b3 C: K$ L7 x/ l   unsigned  int   PINMUX18_REG_old;5 {* n" T. P3 M' }6 Y  s: J/ j+ U
   unsigned  int   PINMUX19_REG_old;% ~8 S- {. ]7 F& n* Q7 F8 Q  }# p
   unsigned  int   temp;  . }0 O* X% Q( R9 R
   if(MCBSP_MAJOR)
' f: x( c/ f3 O9 d) W. D   {
) t3 G" k6 p( M4 J) j$ y      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ W, U. H4 C  f7 L
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, [- w6 @8 c. G
   }
+ D5 }7 a" x1 @2 l: ?# ~. C   else
3 g: q6 Z1 z; D7 q  g9 ^   {
, V2 x( u  f1 V7 ]3 L) {9 m      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
  `; m0 P" g. [      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 D3 J' R3 s- ]" Q( M   }
- D1 x  X8 A5 ~3 v( g0 M2 _% |   
1 E) {# m' G9 r& n' W) U5 z   if(ret<0). u0 \! z) F* H) c, k; ?
   {
) m  M# e% D6 i" f: V; W      printk(KERN_ERR "register chrdev fail!");) M0 n2 g8 Z, u, C
      return -1;1 H$ O8 \% w' w1 H
   }, e; Q! ]+ G/ k0 h6 c
   3 x6 X+ u2 ^* n8 g0 l$ b1 P  I/ [
   mcbsp_cdev=cdev_alloc();
* E, {5 B2 C" j   - s0 V5 L4 v1 L. @6 r% M1 j7 s
   if(mcbsp_cdev!=NULL)+ d6 [" V) ]5 V# r1 ?
   {# k- T' N3 x# \" K( R
      cdev_init(mcbsp_cdev,&mcbsp_fops);* n7 [2 x4 X: C" T5 h" `
      mcbsp_cdev->ops=&mcbsp_fops;: c7 ^$ u& H/ S
      mcbsp_cdev->owner=THIS_MODULE;
2 O! O5 f+ A& P+ g; V1 a" C      
* N$ |/ L' y3 `! h7 }. _& J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! y6 o" ~: v& p1 o# x" [+ c
          printk(KERN_ERR "register cdev fail!");
. N* k) K6 q; B9 Q& F5 U      else) [& N$ `' l& I- j( W! X) t* R
          printk(KERN_ERR "register success!\n");
% O" {% a) @- m* p   }! r- i. F4 f, |$ Z/ l' f! ~& p7 S
   else
2 G9 ]0 n% _8 l  S   {5 g. n4 c" k9 I; ~6 ~, ^7 c) u
      printk(KERN_ERR "register cdev err!");
. ?" l1 G* w8 F7 g      return -1;
7 P, W! J5 m1 u7 f$ a7 R   }
, H/ j2 w. ^' W  b. G   
& |8 \) N/ ]0 w  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! @% M; J/ K2 g$ S% ^  M& C6 e0 Q
   if(IS_ERR(mcbsp_class))
& T4 S% A( `; @   {
9 h" Z/ n0 u0 T0 H/ ~      printk(KERN_ERR "register class err!");
1 q' j0 u; S9 H   return -1;7 q. O4 A+ f4 Q8 B5 ^, y/ k, L
   }
$ ~8 D: Y$ P3 I/ m8 [4 D2 W5 {. Z   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 m3 D$ t8 E0 d

! O7 O; |) B5 F. h7 D: A" u   //PSC) s# k! w3 C( R4 G( u
   //add Enable MCBSP, W1 S/ d/ x8 b3 o0 F8 y7 P; \* B& `" m* }
   //test
( D9 b9 h' v8 b* M' D" |3 z   temp = 0x80000003;
/ E( g' c: C# P: N   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( _. k( Q9 V# g   temp = 0x00000003;
5 v) v. X* w$ s& q6 f/ o3 O   writel(temp, IO_ADDRESS(PTCMD_ADDR));* f9 Z4 S: B6 `4 L: i- h
2 g6 z, `1 e3 _" k, A
   temp = 0x001FF201;4 F( u7 F- V. d7 L
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ `+ z6 W4 X- |: X6 f
   
1 G+ L2 b  N  k2 A   //PINMUX  
, n1 T9 u+ I0 p& \! }) r   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* d8 g5 h$ g" z1 x/ T0 q" m3 h: S   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
* S( E& f7 D0 L: K- T0 u   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) X6 E2 p/ p$ e) g$ A
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! y/ y0 ^( S  a1 M8 U2 d; t' e     h4 }" H. e' ^, g
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
& P! q8 P9 F, Z6 R6 o" X   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . x5 O0 z  @4 C5 h
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
8 f" B& J' }4 y5 u* _$ a. R: {   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
; S9 O0 j- m$ ~1 ^
3 S4 v$ |) D% C1 @- L' J9 E   //RESETn,L138_SHK2
8 K! X$ q4 j. }) U, T/ s( ?   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( d( g1 u% w$ ~# U* u   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 J2 ]7 _, l. g. O   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
  R' E( M5 h' ?  {+ i
7 A; \3 k: U- b8 w: e- o: w' t
& M& v6 E$ L, s" S  ^+ n  //SPCR Register
% j+ S$ H& G, j  `3 m  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) n: ^! k% n8 B7 n. ]; J. O5 R; k# H
  temp = 0x03000000;//(DLB=0)" C! z. h( D. Z/ Z! w/ q
// temp = 0x03008000;//(DLB=1)
+ N( U& |; x8 P  h, i$ y% }* z: k: }  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset3 a" X$ o1 o4 F% O
  temp = readl(IO_ADDRESS(SPCR_ADDR));+ c" b1 l$ }5 f+ ]& X# m9 x; K
  printk("temp=%x\n",temp);; a- K% t5 g( ^' S1 L* v

$ f+ R3 J1 {% @6 B8 V   //PCR Register0 N& U3 @% k0 Y4 g% h6 i; j. B$ ]
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 P5 k/ T  V3 I: X4 e; L- l! s1 Q  // temp = 0x00000F0F;
+ O8 B% |, ]" I" |6 ^: }  temp = 0x00000B0F;
' B, \  \* V7 s) x/ ?2 i* V  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 A, q+ `/ ?+ N0 P$ I! s  temp = readl(IO_ADDRESS(PCR_ADDR));
7 j; S/ a  `# `$ H  printk("temp=%x\n",temp);  
% r) K4 b- z7 h( b   //SRGR Register7 A0 n# v  b9 r4 I
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 L$ U* X) m$ ~0 x
//temp = 0x301F000B;! J/ d' V6 F  r, B# P
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 I% U2 S/ s* L7 ^7 E  temp = readl(IO_ADDRESS(SRGR_ADDR));1 L0 ~1 u1 C: u# C* u* G/ m' m& D+ e
  printk("temp=%x\n",temp);+ o+ R2 K1 A6 w* l) V9 y$ T
   //RCR
' u4 C3 a: j- G& R' N* @1 x   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 R" _2 }6 f% I" p
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
, q+ H9 M3 O7 y. f   temp = 0x00440040;9 N/ U: r6 B# A2 Y8 u) X
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 T  T/ r/ H: I# L. E6 X) |6 G$ `   temp = readl(IO_ADDRESS(RCR_ADDR));2 ]  y3 ^1 n8 `! D1 m: D# R
   printk("temp=%x\n",temp);2 S+ ?5 X! Q+ v
   //XCR
' D8 H, `& ~! ^, J' c( O  K6 z) d0 t   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; b1 J2 {9 n( R* v
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; l+ ^) q) n% z
   temp = 0x00440040;( U' I7 F5 K$ b# R1 d
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
3 l1 _; a8 @) K   temp = readl(IO_ADDRESS(XCR_ADDR));
' _- L+ g, R1 E' N; j+ A   printk("temp=%x\n",temp);+ F6 w& r. v0 [, ~  F
  udelay(100);
1 _' Y' b/ r6 ?  //SPCR Register
1 c* Q) A( E- N3 c+ t3 `  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% T+ D% ~, A* i: x, [( x  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
0 u- x" ?/ v( g- P$ I0 j  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled% O1 k2 ?; o/ p, E9 Q  [+ K: P
  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ c5 C  C" }8 O7 ?$ g: P) @' x  printk("temp=%x\n",temp);8 O6 K# d( V! q+ I) O- s4 q
  udelay(100);
7 M: u, E/ p+ ^# M" F$ L4 R2 R
0 n) [* q. G. n6 I  X% v  //set GPIO direction
7 |: `' I4 E1 h* X. m: \8 ]   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 A; J  S) z5 W' P7 k
   temp = temp | 0x00000100;//EPR----input! t( P/ \# N8 P) T  d9 X
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& n: _8 }  C. Z, {# k   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * q' i- Y' c/ B/ ^* o

; V& v4 f: z4 k: A   return 0;( J6 y3 S8 A) h# A7 @: |0 Q- L
}
+ b7 B2 n3 V+ V4 M. \static void __exit MCBSP_exit(void)
* F# n& {4 G  p9 g8 N{
2 y; q& I7 {% ?6 }3 T   printk("mcbsp chrdev exit!\n");
3 ~( |( Y$ O# [- p! L0 b3 `2 J" F   cdev_del(mcbsp_cdev);) V  c9 v6 e; Q: U1 |
   unregister_chrdev_region(mcbsp_dev,count);# z  F, Q- {. [6 y) d9 k5 S! ]4 ^
   device_destroy(mcbsp_class,mcbsp_dev);
% u" g2 s* K3 b" I5 v   class_destroy(mcbsp_class);/ o1 z2 t2 E9 X* `! z
}
* H6 p; b9 @- b" u  P* P% vmodule_init(MCBSP_init);3 R% Y/ i) K5 X( T2 c( x/ F+ q
module_exit(MCBSP_exit);* h* {; B# H/ y, u6 a

9 Y* I) ^. o2 {2 s6 K$ U; aMODULE_LICENSE("GPL");
+ y) m4 ]& s$ U5 V4 |* ^7 }* z7 I- k7 X# P0 V8 v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. y, ~% S. _2 ~. Y
我的应用层的测试程序如下
! n, x# J9 ?/ y# h#include <stdio.h>! ~1 o; U6 i! r/ n
#include <string.h>
: S5 s$ V" \9 g, ?4 y. u4 S#include <fcntl.h>
, P, A( Y) {9 U; i. Z, S! K$ U  N#include <unistd.h>
; V# w) {9 @4 d6 T#include <signal.h>
3 g! K: d# |4 h3 o" Y& P% F; M#include <pthread.h>       //线程
( c8 B( O/ F( T" J#include <stdlib.h>8 d$ r! @# ^. |5 I, ?
#include <pcap.h>          //捕获网口数据7 q: w6 e( \7 F0 i
#include <semaphore.h>     //信号
: {0 `# d" E8 |" T#include <sys/types.h>     //消息对列4 K2 U; a% E, g; `$ L) Z
#include <sys/ipc.h>       //消息队列( S& D1 H4 ^8 K/ |2 q: R
#include <sys/msg.h>       //消息队列/ a* K4 T2 \4 }
#include <sys/select.h>% B) ^) h' f- w6 Y
#include <sys/syscall.h>
" B: l8 R+ L& d) c. f7 Y#include <sys/stat.h>
- {% z2 k: c2 K5 v#include <sys/mman.h>
/ C7 `# C( X2 H! r#define msleep(x) usleep(1000*x)
1 Y2 Y* g! w/ J) ], T
. I' N) H3 L" ?; yint main()4 y3 O5 |' S5 F  W( r3 U2 C
{
' ?, ]# t- Q# R+ @4 o0 O3 o& ]7 B    //MCBSP,ARM与AMBE2000交互设备# I- V1 V* i3 C0 Z# t
int fd;! o% M; T5 ]2 }$ G! D7 w
unsigned short data_write = 0x5555;
: A  [' E, j6 m. ~; g  G$ J unsigned short data_read = 0x00;
, |. ~, m" e& M" m, s6 y9 n1 o( ?  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& `  U$ [3 j6 |! O
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, Y3 D6 y1 B" `) F
   
8 {/ x, y5 _/ s, D' `/ x, y2 I3 S  if(fd < 0)
4 A# o/ S: y$ C  {
' ^. L2 A; [6 Y3 M7 K     perror("open failed\n");+ i; m& b% D9 k+ `5 C* ]# q6 L
     return -1;. ]7 e% v6 a% j8 _# ^6 Y3 X
  }
/ ]% |9 r" p! N$ w  
) |- I* q; M/ D! @  while(1)7 q9 V5 y( x* @& Q
  {
7 Y! D2 X! I8 |, [: l2 _1 v' ^   
. H8 L6 y+ ]1 g8 o0 p   //AMBE2000每次读写是24个字为一帧
! G, F, Z' h* [# `# X- u   //写数据时将数据在底层存储起来,等到中断的时候再发送
- A7 h0 Z7 ~6 L/ U5 U   //AMBE2000输入数据是以0x13EC开头的
. }6 Q, I5 B( t4 ~/ m. u   write(fd,&data_write,sizeof(unsigned short));4 j3 P6 B# ^9 N0 ~- w; W0 g3 d
   7 ^8 ~# Z. o9 }; Y! S% z* q
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  5 \% ^) {( Q" j, C4 U
   read(fd,&data_read,sizeof(unsigned short));0 Q( @) n8 a; O. f
   
2 y2 @+ t6 V' _4 I/ e   if(data_read == 0x13Ec)
% d! P, b' F$ L% Y) F   {
! b% @6 B, P0 n* @" _   
. G9 q  W+ N' D6 e    printf("data_read = %x\n",data_read);8 ^4 ^% F6 _3 u
   }5 {4 \# t8 b8 R6 J  q8 \
   * Z. v6 F( g6 T; j
   msleep(10);
4 s) T. l; ~1 R& ?! ~# q: s  1 f2 N$ G4 j, q$ L! c3 A! h: T
  /*
( P. B# @4 W- W" n( Y- N/ B   ioctl(fd,1);   5 f& l% w! `4 ?! \2 H% V4 X) z* X
sleep(1);2 Z! I) @* E1 b
ioctl(fd,0);
! _/ {; Z2 s) o. q" R sleep(1);! y7 E2 Q- l6 e& _& y2 D
*/ 7 ?2 D# K7 ]4 }3 y7 X( _
  }   
% g' q# g4 L- z8 F return 0;
6 P- w) o3 b. P) Q" G# d) M
* a- R4 U& |7 S' F, I0 K4 Q}: N( X3 O7 F7 }( c% S! b! H- p
% H( v0 R/ {* O3 ^) y. d, z
多谢各位指教,谢谢! 急( G& [1 Z' B' v$ |, P8 b0 Y; r
4 \0 ^  t( T: M" y5 v2 `
9 s0 F: h4 q! n* c7 W, N
0 P) ^# k% [3 V3 v* _0 c
% ~! G7 B& z3 r: T1 y4 H

9 g" n* E; w* k6 E! h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 13:27 , Processed in 0.047596 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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