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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: + R& w. y) Y# k2 ]( N1 M3 S
/*
" p, s; u" ~9 a9 U) M9 `8 L9 ~ * Copyright (C) 2009 Texas Instruments Inc0 P$ J5 y* g: Z- K$ U# i7 t" X, W6 S* C
*4 |) n% q! ^, h+ T0 o/ e! k
* This program is free software; you can redistribute it and/or modify
2 `+ w5 J  d  Z: w * it under the terms of the GNU General Public License as published by
% l5 ?, A( |3 u6 f3 l  C  i. D9 @ * the Free Software Foundation; either version 2 of the License, or
2 L& r; |  p% V) K" {, u6 T8 Z * (at your option)any later version.( K! M  P4 ]% F1 R1 t  `6 A4 l
*) r. I, ~2 _4 q7 D) M
* This program is distributed in the hope that it will be useful,: c: P# R8 f9 s- w8 q6 }+ e
* but WITHOUT ANY WARRANTY; without even the implied warranty of1 c, p  ]1 T2 r0 V
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: L8 j2 j, O/ S, s% R' X  i( F8 i
* GNU General Public License for more details.
8 f* L; Q% q2 n *" L' b  a+ K- Y' D  Y/ D" O
* You should have received a copy of the GNU General Public License
, g" M0 g. g. ^- i& ~9 E, A * along with this program; if not, write to the Free Software7 U) S! r0 q2 `/ y  Q
* Foundati
7 f9 @7 D  ?6 q*/  b; y- C0 ^* h' e" V
#include <linux/module.h>
: l+ D+ f9 _# Q0 O* X. h2 L* d9 {#include <linux/init.h>' G2 o: k/ N: ~" _3 N2 i
#include <linux/errno.h># s9 `* U4 P6 i" T0 \5 A8 a
#include <linux/types.h>" w  ^' _# B+ ?: G# J, u
#include <linux/interrupt.h>
7 A0 d6 t- Z; R) f8 x#include <linux/io.h>
- K6 B& U0 v5 w#include <linux/sysctl.h>! Z+ p- {! T; y; }5 s2 |
#include <linux/mm.h>) M! ~7 k* }& c1 n/ r
#include <linux/delay.h>
: @2 k# D0 f* L8 P  `' o. u9 w# P#include<linux/kernel.h>* a, Y' m- C3 x/ M/ v
#include<linux/fs.h>
; o4 M0 n. _& b5 N1 U& P+ S7 }#include<linux/ioctl.h>4 T0 j( ~( S9 ~0 M) O
#include<linux/cdev.h>( I1 d8 U/ ^! ~1 }, [' y
#include<linux/kdev_t.h>
& v! p3 A6 e5 a' L- e9 J#include<linux/gpio.h>+ d2 \9 |  C# Y. o+ i* U
#include <mach/hardware.h>+ X' f) k( f3 W6 U: A& {
#include <mach/irqs.h>
5 V1 G0 v- P# a" r! m" e4 A) Q3 Y8 }3 f2 e
#include <asm/mach-types.h>
; N! l* {2 K9 q4 X#include <asm/mach/arch.h>
, S+ i) t) F' i2 n, D$ q$ B#include <mach/da8xx.h>
  X3 ^* F  `8 Z6 J* `& }#define  SYSCFG_BASE   0x01c140001 A8 i4 ~9 A. a+ X' v. B
#define  PINMUX1_OFFSET   0x124
: k* }9 p$ b2 C$ x+ ]4 p#define  PINMUX18_OFFSET  0x168
! w( U" y( k5 ]; w9 j2 U3 ^" s#define  PINMUX19_OFFSET  0x16c
+ A& F5 y% e# s1 `#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
% ^5 F! \* t( L+ q% Z#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR# \  }/ e  C+ \' @0 F
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR& V5 B8 b# U* ~
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR2 l5 p* s* O! v, C- a
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR7 T$ {% a/ k8 ?, ?9 E. ~
                           
1 F& c. C% X5 `' j' j7 k( I& |#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, M; }9 |% y: O
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
' C, o6 P3 _, E2 p8 {5 A, U$ r//PSC' D$ v( W& ?. O9 ]
#define  PTCMD_ADDR   0x01E27120  
& Z, ]7 G% a5 U: V# R2 S! ~: I" l#define  MDCTL15_ADDR 0x01E27A3C
' l. T4 r4 w1 I8 c3 v* N#define  PDCTL1_ADDR  0x01E27304, t* Q. j9 ^5 U8 D1 t+ e( ^
//GPIO8 direction8 N) t0 F/ I2 c3 @
#define GPIO8_DIRECT  0x01E260B0
) @" i: V/ T  E: h. w. Y#define GPIO8_OUT     0x01E260B4' S- i, l/ e+ L6 v) Q, Z
#define GPIO8_IN     0x01E260C04 e0 O" ~' @" Y1 B& J, @
6 @+ o3 o  s+ t7 G* j
//#define MCBSP1_RINT    99              
. g" d6 X% ?6 q' X  l8 C//#define MCBSP1_XINT    100  % b! N* h' v6 S4 _) p$ O
static int MCBSP_MAJOR=239;
2 v! @9 H% V7 estatic int MCBSP_MINOR=0;  F8 N% V7 {& S
static int count =1;
2 R" P$ ^( C% i7 C1 h+ R; J. M
) a7 G7 C6 m8 H0 U' C% A, i#define MCBSP_NAME  "MCBSP-device"2 ~! Q- D! w' D" d8 G
9 T/ C, Y% B! R1 X! a
static struct cdev *mcbsp_cdev;1 y/ u- F7 u( V; e2 _2 Z
static struct class *mcbsp_class;
' @0 c" x. ?8 n" {2 e: Estatic dev_t mcbsp_dev;  L! z2 P+ w. ?+ ?7 {1 C  t0 h8 {
unsigned int DRR_data;3 M1 s% r; k* u* L
unsigned int DXR_data;2 F. E: K# P% c! ?& K+ k% d
static int mcbsp_open(struct inode *inode,struct file *file)
6 {# \! ]& O( O{8 W! E- c  z, d; [, H
   - K* {4 q1 E: g
   //interrupt enable,initialized
3 t& J& K( f( j/ I0 X+ R   unsigned int temp;7 X, a- p, _# F5 W6 ?
   //SLEEP_EN(GPIO8[10])---0
/ S0 Z" j, w; }" ^$ p   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 }$ Z2 O/ n5 a6 M/ r: _0 e, l
   temp=temp&(~0x00000400);/ e9 X  s( h. ^+ f# O1 L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; A! L7 M: I7 n% P$ r! T# h
  //RESETn(GPIO8[8])----0----1
% T$ b' k9 v6 U, M% F1 Q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! b6 c7 k5 U9 F2 @8 t4 |: \
   temp=temp&(~0x00000100);
# |$ P& }( ~, @3 ?/ v  }% P( Y! _3 x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---03 ~, |& S; n! z* }
   udelay(100);
  E+ B4 p. t) c' j5 v4 i   temp=temp| 0x00000100;" J4 h5 n) z% L5 a* ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 {0 J& o. c: {( ?
   udelay(100);
% u" Y- E" M5 }- Y$ I   printk("open success!\n");
4 L$ L1 R. T+ @1 @' G   return 0;. U8 E9 Y* i% t+ l( Y9 _0 Y
}$ X, [6 I7 B; m: Z

9 p; \( `% b7 r3 ^) zstatic int mcbsp_release(struct inode *inode,struct file *file); z. e) ?1 n  A" P; y0 ~1 B& t- G
{
& `6 L3 u& }" g   printk("release success!\n");
0 Y+ [$ u7 L  }# ?3 ^2 l, k. \+ X   return 0;" k% G2 b* [  ~4 T
}$ M. i6 m' Y. s" x% M' O
2 V2 h2 K6 Y3 I* B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( h8 e3 Z8 e3 J{  m' \1 g% R! U# ?6 }" ?
    copy_from_user(&DXR_data,buf,len);: X' j6 b8 |3 D  y; Q2 A, a3 P: H
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       4 Q/ a* u7 O4 J# q6 O! D% V" ?. P
    return 0;; e, e: D+ \& z
8 z6 {& e* W( a5 e
}
! ]9 P7 `' t' m7 L5 o  n
6 t+ \. H5 q7 g8 W$ ^$ W8 Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' S6 u) K; [( ]: h9 V5 z! w# g{
8 t6 T8 _! r) y6 R   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 D" J: f/ M  u  l1 {0 l' X$ j   copy_to_user(buf,&DRR_data,len); ' ^1 R( S8 E. j  @, @
   return 0;7 A6 [! Y: r4 R3 b
}& b8 G9 Q" ^, h5 n) i

) B! ~' w: k: X2 o" s. I
! U7 s" ^% M% N0 l# Ystatic struct  file_operations mcbsp_fops=
; M; W" S- G* ~; i4 b$ t{2 [3 E' i9 k- \
   .owner=THIS_MODULE,) l4 l7 X. X# Q; U* I% u9 B) Y
   .open=mcbsp_open,
2 }0 ~. O: x7 b: j% i: U+ A/ ^   .release=mcbsp_release,
2 m" l$ ^/ @: H# T! ]8 E; t/ F   .write=mcbsp_write,4 S* U% T; W" K& [3 v; A
   .read=mcbsp_read,: e" ^: |; c; W: h1 D
};
& }& T0 H7 p8 v4 ystatic int __init MCBSP_init(void)7 n8 G# Q3 z, I" O4 m
{
9 R5 t( o! i; Z2 W   int ret;  f7 G6 \- d( Z  Z  c  p2 ?
   unsigned  int   PINMUX1_REG_old;4 E' k0 m: f; i. H6 C8 A
   unsigned  int   PINMUX18_REG_old;
4 g+ Z$ A: ^" J2 c   unsigned  int   PINMUX19_REG_old;
/ R) I2 a8 ]1 \8 b   unsigned  int   temp;  
2 h! C% ?! `% I+ O  \   if(MCBSP_MAJOR)5 f7 L$ I2 L( }0 N7 A. S2 S# f% |) l
   {
# _: n/ p# z4 E2 n      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% }( y8 [+ W/ b: x2 V      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 y& C( J4 u0 f2 _1 G0 Y- z
   }2 `2 N" k  @0 l# `, c4 u2 G) @0 \
   else5 V; w+ A' e5 R% g$ q
   {+ x  h  r- b, I7 c! v. d
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);# N) O; U3 M9 Z3 y1 j
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
( W5 b( Q8 U; }0 }, m   }1 h! q* M1 F7 v* h. q
   
' y6 B5 ~7 ?% K6 L; A: ?   if(ret<0)
- a9 N  s8 V! k! [   {
+ D: X! T5 D, P6 b: Q: n# ^      printk(KERN_ERR "register chrdev fail!");1 }% Q. V$ T! L" c1 J/ I
      return -1;% ?) c% w) h0 Z( G3 J
   }
9 t" U; f! \' k3 g& ^4 o: K   2 D5 t: Q: e, A
   mcbsp_cdev=cdev_alloc();
  _5 S  y  R+ ?   / J4 b' U9 q8 U
   if(mcbsp_cdev!=NULL)
# q* {  b7 m5 t, X3 W/ b   {
6 x7 d: c7 q" r  _      cdev_init(mcbsp_cdev,&mcbsp_fops);
% k* V; z9 G: ~      mcbsp_cdev->ops=&mcbsp_fops;4 Y0 w  y' s  f" U7 F
      mcbsp_cdev->owner=THIS_MODULE;+ w. l9 W! c$ o) S
      ) D* u' \# T0 ^& d: Y
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). Z- L9 m& z) Q) E2 a
          printk(KERN_ERR "register cdev fail!");
2 c" S0 L+ u1 ?      else6 K( V0 C1 l; q
          printk(KERN_ERR "register success!\n");; h+ K% i& D0 ~  t, t( K6 k
   }5 T% i/ \7 p9 a" x0 E
   else
" Y+ E: V& c- Q! ]2 e% i! y& [   {
3 p4 t4 e& a8 L3 A/ ~      printk(KERN_ERR "register cdev err!");- N& ?* d3 w0 e8 d/ j) x
      return -1;3 o" y  L+ X3 H. x4 J
   }
9 j* X  W4 J- C; W4 [. x% x  ~   
( K4 C+ w7 r( d( J- m  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) |( n! C4 v2 |  [  |, F2 \
   if(IS_ERR(mcbsp_class))
7 Z, v; O/ \7 E1 G- W7 P( I* Y+ H   {% Z# u* b* E. a# g2 o
      printk(KERN_ERR "register class err!");
; q6 x' G1 n  k! ]$ |   return -1;
2 p. j- z$ O' f; S7 L3 J. R   }
0 L$ d) V& u; |) I0 v   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
& X# T( M. L* x8 k& V8 x  j& ?( f- f3 j+ a
   //PSC
$ [0 g' _" t- I5 e8 D# J- t2 ?) F   //add Enable MCBSP5 l  F7 j1 V# X
   //test
2 f2 O& o8 i  U. s1 g) U   temp = 0x80000003;
, M7 Z9 L5 w' [! Z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 L* e- G' E/ @, f   temp = 0x00000003;' Y& K; A6 k) P' |2 l
   writel(temp, IO_ADDRESS(PTCMD_ADDR));$ b& n9 }" r- \8 P" I% j# k/ r

3 D; D( V7 }, r2 a; u! @4 Y   temp = 0x001FF201;0 i' @% p+ c$ V7 c
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));' u& b* n4 H$ B& R9 d% ]
   & X5 m/ i/ F; f3 r5 i8 m
   //PINMUX  
( `5 D% ~, {% L% q  ^" Y   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: |% W- m3 r% b) Y0 @2 U, D. t# ^   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 Z9 y; H) K& ]/ l: O8 @
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : Q' |3 ]9 k, w, F3 W3 w
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 K3 F  Q2 X8 ?' Z: Z* C   4 {2 P2 r! ~7 b+ A$ v7 Q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC. x- a% R3 V2 m0 u  \# K
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
# {# b. j" @: w   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & e; [1 g8 K5 g* \# p7 K8 q7 b
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 \) D9 n; l$ k8 q0 _, h
. r6 Y3 K( }$ i6 {$ Q4 T   //RESETn,L138_SHK2
9 o* [& \" }0 b0 e+ a- y& C' n   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
, d0 ?$ F! K5 R4 `   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , ~. b% L4 u) ^& _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& N6 }: k& G& k) X2 d* V" t7 z
  L2 z4 ?6 `) [" @
8 ^* E+ k# o6 P  //SPCR Register7 r+ s& ^' i+ M" c, c, x! q: w7 [+ f
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 J3 n) Y; M4 x  [7 U4 w% s2 O  temp = 0x03000000;//(DLB=0)8 G% J& g' C, C+ p" k" P' f- Z8 T% I
// temp = 0x03008000;//(DLB=1)
4 C3 e/ @* N- n9 V" W  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  Z% [  e& P# k* ]+ S2 n2 K, {7 e: s  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 U  u* c  ?  d/ ]6 R6 T, v  printk("temp=%x\n",temp);
( Q0 I# Y) j5 j9 `* z/ j7 X/ i, E( A 9 t) \0 S2 y& |$ J: |
   //PCR Register1 D8 B2 R- R9 A2 g; U% t# ]
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 e) V3 \9 z. o7 e2 }
  // temp = 0x00000F0F;
( o) \: g9 m9 `! r7 {! ]. c  temp = 0x00000B0F;
1 a  Y* |  u4 x- d3 j. Z, D/ a8 C2 l  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 1 G# P  U% M0 K/ Y/ S2 b8 u- S
  temp = readl(IO_ADDRESS(PCR_ADDR));- o. f2 S2 I) ]/ y
  printk("temp=%x\n",temp);  & b8 p2 U# n$ J* R* i& Q
   //SRGR Register
8 Z  \, _# \$ Y. o; a0 F   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 i2 X0 x5 e1 ^' g! Y, O7 D5 q //temp = 0x301F000B;
% |6 V  Z* Z% S7 v( A   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 6 R1 g0 }2 _  E+ E
  temp = readl(IO_ADDRESS(SRGR_ADDR));
: _9 b! [* x! ~  printk("temp=%x\n",temp);
% q' s" N: w6 T1 w   //RCR  J+ w  w- C+ B. z0 D
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: Q* A) b' V2 A   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0% ]- b/ R9 l! |4 d+ L' y$ d
   temp = 0x00440040;# P5 W" P( Q9 ]/ P- m6 z7 b
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 ~- K6 T; y8 t5 `; E   temp = readl(IO_ADDRESS(RCR_ADDR));# d, ]+ u! N" @5 B; V( P2 z
   printk("temp=%x\n",temp);; Q: W; j% r8 k9 _
   //XCR* i# {; J# J0 L5 I; p& T5 a
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' k6 g) k5 Q5 |8 J# o6 e1 B   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 ~5 x- d7 q/ u/ X! c; {   temp = 0x00440040;. `$ |6 g, c, ~% q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
& M9 }3 \/ \; _2 J. s# K1 n   temp = readl(IO_ADDRESS(XCR_ADDR));+ O) }4 l% \& r! d  S) V9 [4 C& t- a
   printk("temp=%x\n",temp);  ?  a. t% [' T! t4 ?/ s4 K/ b  }
  udelay(100);
. ~  I% e( s' j% f: L0 Q7 P1 Q  //SPCR Register
9 @7 N# E* @% f. o  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 x$ B" ]/ Z, T  t$ i5 S2 G  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
! S* Q6 }/ S8 {  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" ^$ ~% D" P5 F4 x6 O
  temp = readl(IO_ADDRESS(SPCR_ADDR));" B! F9 [9 ?2 z* T$ u0 t
  printk("temp=%x\n",temp);
5 }8 u& T% T- p8 w1 h  d  udelay(100);
& s  R; u: X( ~; m$ _* {2 W) f0 g) T( t) u5 E8 l6 v
  //set GPIO direction
1 f* R4 ~# m/ X$ d   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' [' Y  u: x! A7 O
   temp = temp | 0x00000100;//EPR----input# W$ ]. y/ F$ v; u7 j4 @" H) @, \
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- G+ L" j$ {0 ?( ?1 h' y! t% ?   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));   s, i( f' u( O' q5 C

/ P3 m+ n4 t. \5 m4 m   return 0;/ U$ j# B& i, [% m2 d( H; u9 s
}$ m% D2 c  `2 V1 e3 Q! B& g
static void __exit MCBSP_exit(void)
- f7 x' w7 p% x{/ a3 ^- T! z" b5 {! J
   printk("mcbsp chrdev exit!\n");
4 i  z+ j: P# C1 O/ k/ I( H   cdev_del(mcbsp_cdev);
8 }  U6 }# F2 S1 L0 `   unregister_chrdev_region(mcbsp_dev,count);- h3 k4 L5 x, [& J: P1 [; G# B
   device_destroy(mcbsp_class,mcbsp_dev);
3 A# L6 F( B1 V; x2 _; ~: \7 K   class_destroy(mcbsp_class);, v1 }* ?; v5 k4 k: ~
}
( H: f1 S; Q4 Imodule_init(MCBSP_init);5 R( \  I: v4 A
module_exit(MCBSP_exit);
5 G- T  _6 H9 \) k7 r3 B! ^  I9 m- T  p
MODULE_LICENSE("GPL");. _) @0 z  A: Z) U  H6 B
7 D. h4 g0 I* p0 y+ y9 J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ W  p; }% ]+ t+ {  U) @
我的应用层的测试程序如下) P6 _, q$ Q, L2 C. {" r9 d
#include <stdio.h>
8 M& f2 y; ^9 g0 t#include <string.h>
' f  w& {/ y6 Y4 _#include <fcntl.h>7 g9 I' U7 Q+ G4 `) }
#include <unistd.h>
, O5 s% ^! y7 M8 h#include <signal.h>
9 {( e6 Q6 W9 p5 F#include <pthread.h>       //线程9 ~2 F, Q# h: O; A8 j
#include <stdlib.h>6 K0 q7 S. b& j4 {! e7 Z: j( D1 n
#include <pcap.h>          //捕获网口数据
& M6 v2 f" O1 x* h& w+ f) y4 I#include <semaphore.h>     //信号
# D! \" U* W9 t( s7 C9 B#include <sys/types.h>     //消息对列, r8 S# F2 V1 Z- D
#include <sys/ipc.h>       //消息队列! G& [! ~& o* |2 Q9 Z, O( L4 n
#include <sys/msg.h>       //消息队列
& v4 Q4 D9 O; d, F7 @#include <sys/select.h>% @& g5 b! o0 Z" m% u9 X
#include <sys/syscall.h>6 N3 L! j+ i4 R0 s; f% ?" v7 R
#include <sys/stat.h>
4 k0 l( N  I7 _: v5 s& A* Y+ [7 k3 B9 G#include <sys/mman.h>$ X4 o. s" z! L9 J* L5 k. K0 N
#define msleep(x) usleep(1000*x)
( J8 q2 }* r8 ^8 L
  q, }) ^: j- Q' K" e4 rint main()
" x: L+ m( O6 Q9 S' w5 ?5 E! r{
- j( N# B5 N3 r4 u7 N    //MCBSP,ARM与AMBE2000交互设备6 O3 s3 d; \& y/ ?) G
int fd;
! c. |: n( Q# Q+ Y unsigned short data_write = 0x5555;6 G( K) \, d( ]
unsigned short data_read = 0x00;" ^4 _' G# o; v
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: c0 C  Y# L" T2 X( q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 p0 \5 X' H, e/ L   
: P0 Q- Q/ X/ ?  if(fd < 0)4 _$ F* c. w0 E2 f  q4 ]. r
  {
& }! s3 ^* \, Y$ s     perror("open failed\n");9 t6 K2 ^9 h  p- ]! x3 d$ W
     return -1;
/ J9 @' z# ^. w% C) ]  }% d$ C7 V: b5 `6 R$ k" N
  ; x2 L' h7 a6 @5 `8 x( ~* d
  while(1)
8 G3 \+ L  u& {6 o2 m! m  {
/ B; S1 c- N! W" k9 V9 n   - B; I1 M* r$ J) b0 g3 {8 k
   //AMBE2000每次读写是24个字为一帧
$ ^& C% G6 F  G/ @6 }# u' H" B  B- K   //写数据时将数据在底层存储起来,等到中断的时候再发送) K: c( f: J* j% P0 u/ i
   //AMBE2000输入数据是以0x13EC开头的
- e3 Z) W' {' O8 B0 y5 p# ^   write(fd,&data_write,sizeof(unsigned short));7 |! O& R& x) X! x: a
   & @* ~9 a/ c6 A5 U; _: @# O1 G- ~( z
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* S) s) ^$ J8 ^5 Y  i. {1 n   read(fd,&data_read,sizeof(unsigned short));2 I5 q" E$ B+ s5 z- e& L/ K, O
   
9 U4 v* n3 l- U! j$ q- p2 m   if(data_read == 0x13Ec)
6 H$ t2 S- N; k* I   {+ n0 j# j4 m2 H7 q- j
   
" o1 G; [) Z1 d1 ?9 R" T' d) m    printf("data_read = %x\n",data_read);
2 i4 R& d& `% h" G# c  L& P6 [% n% {   }% d# d2 T( Q/ Q8 l* q
   & y6 x: K& T2 r3 X
   msleep(10);3 B0 q( x) i/ K8 k2 }; F7 p9 a
  - g8 I8 Q1 S+ {! V% }5 M4 b
  /*5 r* Q/ `( S1 q6 Q5 b
   ioctl(fd,1);   1 s  T- g$ Z+ y2 B2 s
sleep(1);* a0 w8 d' W4 N1 l3 H8 D
ioctl(fd,0);( g; B1 l% J6 U; y) g5 ^! `
sleep(1);8 @3 W0 p) Y5 y3 f7 F
*/ 9 W% X! F. i5 V; S4 N* I1 ?
  }   
: e8 J( H9 y0 Q. ]+ p/ {6 } return 0;- ]6 E4 ^. }8 }1 |* V& T+ C3 w: T

7 O0 _4 D7 k1 k) f}6 ~1 E5 M& Z" C4 s6 w6 X( ]3 ?! |& V

" V2 p- s( q. l: A5 q+ P多谢各位指教,谢谢! 急* N! Z+ G' J7 y
; v- c) H! a/ C5 `) j' |

& @1 `0 g+ L# N) P, E" a3 V, N
6 Q. {- Y. v5 p) @4 B$ n, b! N- [, c: K; d/ G" n

3 a0 l2 b" _1 ]: L5 F7 w3 K7 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 22:14 , Processed in 0.044501 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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