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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * y# _. a# I! m% P& A  G
/*
7 |, z2 x: B% `, D$ P) i% R% b: h * Copyright (C) 2009 Texas Instruments Inc
8 n" `2 X- ^! k: C% U' G6 h *3 i* A7 x: g& n  Y& i1 q5 |
* This program is free software; you can redistribute it and/or modify8 ^! D; c# \7 b- T5 c" z1 }
* it under the terms of the GNU General Public License as published by
0 v7 r0 \5 R& b' b! S# b8 v  |% q * the Free Software Foundation; either version 2 of the License, or
" |- G% H# G/ ? * (at your option)any later version.
2 n- B  Y, c6 U0 V *
) M) N9 P, q; ~- G8 c' Z * This program is distributed in the hope that it will be useful,
: s' t5 c  i& p * but WITHOUT ANY WARRANTY; without even the implied warranty of
5 I% _7 S; U6 E+ Z7 o * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( l" N; n% {/ C# S/ b. a9 h * GNU General Public License for more details.
( C9 y4 {3 a2 j( y5 N *2 i! G* h" ^1 z
* You should have received a copy of the GNU General Public License
$ a$ M" \# K6 m4 \  t- H3 L/ n * along with this program; if not, write to the Free Software
9 Y; I: G7 a8 f$ L; j& ? * Foundati0 q- n& a/ m  H/ W4 y/ F5 I3 T- m/ {
*/1 ?8 T% c" G6 i+ E5 z) |( w
#include <linux/module.h>
8 y  e( C0 r# }1 ], ~1 Y#include <linux/init.h>
$ y/ r. D1 m: F0 ^  e& a- }#include <linux/errno.h>
' X8 t4 S. I5 g/ B- E7 [#include <linux/types.h>( _1 y- ]9 s5 C* Q2 y# Z
#include <linux/interrupt.h>8 L  ^4 C6 q2 H( }
#include <linux/io.h>$ D# H3 M8 M1 C4 N* ]" x" L* W
#include <linux/sysctl.h>3 [8 r# a" ^! w
#include <linux/mm.h>" y: Y5 W5 w$ d0 s
#include <linux/delay.h>  g$ e3 Y8 \* e! k
#include<linux/kernel.h>
# P2 E8 k- x* y; v; s#include<linux/fs.h>' ^: g2 C! ~0 A9 W3 ^$ [
#include<linux/ioctl.h>$ i, F3 |- U  B, J" J8 M
#include<linux/cdev.h>
! ]8 Y9 l* ]6 e0 f- ]4 k#include<linux/kdev_t.h>
' ^  a( w: ?. d4 Q- I#include<linux/gpio.h>$ x& L1 r7 y) b+ \
#include <mach/hardware.h>8 f' s. F/ @5 K. D/ y+ g
#include <mach/irqs.h>) N, w$ l, i) z+ j: f* a& \

2 O: @' w) l( C) {7 B5 o1 ^#include <asm/mach-types.h>0 t* d& m1 s. \5 f+ N, g8 Y6 Q
#include <asm/mach/arch.h>
/ A# {( V, [# n8 T#include <mach/da8xx.h>
8 Z9 G0 t! o+ e  i4 p. x#define  SYSCFG_BASE   0x01c140004 L  e* G& n, g
#define  PINMUX1_OFFSET   0x124
, l3 ?$ N& n+ Q" K#define  PINMUX18_OFFSET  0x168
+ P4 M, S8 [8 P  U" B6 Q4 k& @7 f#define  PINMUX19_OFFSET  0x16c) N% l1 L6 `2 T3 N5 G9 u
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; I  G; @" O. a" k& i
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
' e: y4 J$ z0 R' a# S#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR2 ?' ?% ?' Q. r  L, k  |1 ~0 R
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
& M6 r8 {/ z. t* `) p#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
' F+ u0 J+ f4 L2 H                            6 J& P0 d$ j; D2 I" n4 b9 h' w4 U# B
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
9 Z& q8 O5 G0 @4 s6 Q/ R#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% [( N0 \/ a2 R% F! [# o
//PSC& r8 t5 ^9 S- S6 x+ A3 g" ]' {% |
#define  PTCMD_ADDR   0x01E27120  
4 C) D/ c1 c5 |  |#define  MDCTL15_ADDR 0x01E27A3C
9 _4 p4 }! N% Y- o) N, W1 l#define  PDCTL1_ADDR  0x01E27304+ K# |% H- n! f- g8 ~/ N
//GPIO8 direction
- E' [+ ~; X$ g. v; X#define GPIO8_DIRECT  0x01E260B0
$ R1 u" {- f. O#define GPIO8_OUT     0x01E260B4
/ M2 P3 g- R' {( q#define GPIO8_IN     0x01E260C0
6 [4 v/ v$ N+ j* T+ s0 k# }  z) b' L- N  R$ ?9 R
//#define MCBSP1_RINT    99              
- U' A% i3 d" z0 x( v1 k( I/ C//#define MCBSP1_XINT    100  
1 h; s' T$ u$ |0 I4 Zstatic int MCBSP_MAJOR=239;
) U) E6 \3 ^  R' a; qstatic int MCBSP_MINOR=0;
% F3 g: F" b4 H4 y* {6 Sstatic int count =1;
1 D8 ]5 R' }* q$ S5 d; N$ V: a6 o8 ^& y1 C: ~3 k" Y( v. X
#define MCBSP_NAME  "MCBSP-device"
/ G- w( ?# v1 m7 A1 c  S9 F6 ]1 F% D- B+ F9 k
static struct cdev *mcbsp_cdev;5 n. c) K: k: |$ }% }
static struct class *mcbsp_class;, J( q0 W; f% p: e- K8 Y
static dev_t mcbsp_dev;' Z. ]+ s5 J/ o, r
unsigned int DRR_data;% v2 ~4 m* `. d0 e( A
unsigned int DXR_data;- \0 l' o% u- i( ]  o, c* b; x
static int mcbsp_open(struct inode *inode,struct file *file)4 I. ?0 V( E7 X3 ]3 v
{/ w+ a  i# H6 v4 T
   - j4 b. b6 k" Q3 u9 h# e
   //interrupt enable,initialized+ t4 |2 T* b" a5 i# s  Q. a# a
   unsigned int temp;
. P( T# E* g2 M2 ]* y/ C6 a, U   //SLEEP_EN(GPIO8[10])---0
& s$ ]; C$ V( x( o   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 d3 I" Q% Z8 v9 e) Q' |. _! Q5 k/ W
   temp=temp&(~0x00000400);  ~8 s4 m9 Q* {- E! l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 e# y( a+ P( k& w: F1 ]
  //RESETn(GPIO8[8])----0----1
% Z( e8 b/ q' J* F   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 o6 o# T" ?0 f8 b) A, g
   temp=temp&(~0x00000100);  s) V( n7 w( c: n2 s) w
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
' N/ C0 z1 E( @  c8 T7 q" [   udelay(100);
+ ~, m  A& Y3 Z8 j! i   temp=temp| 0x00000100;
) ^5 L( G5 u# o% i2 N- R* l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 @1 `8 B  L7 N8 U# G
   udelay(100);
) O( t# n/ M) j   printk("open success!\n");0 o. o! b) N7 d1 F
   return 0;
6 i9 N' C' o4 i7 J2 p7 T" G}( R0 \: R$ y% c9 `6 V5 X

) Z' \, B9 v1 @- Nstatic int mcbsp_release(struct inode *inode,struct file *file), q3 ], `( Y/ q. `! _, z
{
5 F. W8 m. I. d% I' u   printk("release success!\n");
4 v# e" Z0 `& `5 w) M- F" s   return 0;& t7 v& ]. D9 O' C& b1 n
}$ f1 f% r3 w8 ^" d5 i+ J, V

2 a4 T1 k7 ~( i, B1 D3 x; u6 g2 fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 Z3 |+ Y( s4 U! f, y6 K, F5 I{4 t% ~% `  f+ }8 V
    copy_from_user(&DXR_data,buf,len);
* j+ K' V5 u' d( l% X! A    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
# c/ S) L# b2 d2 a+ j% U6 H    return 0;
/ F% W8 K' M$ k0 e
6 C: P6 x) t, T, b7 z}
2 W. P1 I! {& R8 K! `0 k* n: o3 |" d  ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: C9 s% S' \0 y/ m4 }{
7 K& f# ]4 c: x$ K! c   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
$ Q7 K7 j( b0 |2 M   copy_to_user(buf,&DRR_data,len); ( i! g0 V7 B  O3 |7 |4 o
   return 0;
1 {3 f1 u4 l( H; W! L4 }}" c8 W: ^( p4 b5 L3 w
8 x7 y8 X7 W$ T: W5 I* m

! p4 y$ S9 e& u" lstatic struct  file_operations mcbsp_fops=# J9 v) A' Y' Q
{
# r2 i" R2 R+ o! c  H9 F   .owner=THIS_MODULE,5 F. R. L4 t, ~% K
   .open=mcbsp_open,3 ?0 i: ~5 z3 V' W, E& b7 Y
   .release=mcbsp_release,- Q* S5 h: y0 O
   .write=mcbsp_write,0 k, q- r( y3 @# C. \
   .read=mcbsp_read,! S# G7 H/ @' g# R/ K  }
};2 a1 ?- m2 C5 A; U6 U3 p
static int __init MCBSP_init(void): |- q7 I# Q  d  s* L: ~& d
{' V1 C0 b  }5 Y4 I2 [/ w3 {2 x
   int ret;
+ j/ e$ N1 |8 m0 f   unsigned  int   PINMUX1_REG_old;
- _9 D5 M* H* u+ s7 `   unsigned  int   PINMUX18_REG_old;
' ^: I! {# i9 m. j" _   unsigned  int   PINMUX19_REG_old;
: p/ y9 H! @/ M& f" o   unsigned  int   temp;  
3 U, q5 n2 P7 ]7 l9 f   if(MCBSP_MAJOR)
( u. M& H# Z( t; r% k   {! r$ W) P( W' z8 D; u) C
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 [) M9 A; S- L8 W+ Y      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) B: a, B8 T2 q0 p  c
   }: J# \% R# z/ r( G$ Q6 d% S
   else# z% s0 l1 Z7 }! j
   {6 {) n) v2 s! f: e: \7 r/ }9 Y
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 T( ]1 Z, m" R5 B5 G7 ?( ~% B; L      MCBSP_MAJOR=MAJOR(mcbsp_dev);8 v, K3 ?3 G* |9 k) {! ]3 @
   }8 X3 p5 y" H2 }  M4 \
   
5 B9 t; l7 D' X: M5 y0 E   if(ret<0)& U1 W3 I3 h+ u; u/ {
   {" s( U# D) U* g6 _
      printk(KERN_ERR "register chrdev fail!");2 D% f( Z. T/ c# k7 v8 Q9 G
      return -1;( p0 G6 k. B  y+ O% |
   }) N: R1 ~4 l5 }+ e
   
2 S2 l% r8 k! c/ p   mcbsp_cdev=cdev_alloc();
" h, m/ k: ^/ t4 |' }8 D! M% b/ F6 a   
2 k( o2 k. t2 `9 n   if(mcbsp_cdev!=NULL)
: ~6 d. d' n9 g, g$ m$ E   {% T: n! S4 X  ]& [$ H
      cdev_init(mcbsp_cdev,&mcbsp_fops);% \- N" ?0 ]) m% k; K
      mcbsp_cdev->ops=&mcbsp_fops;
6 {: g" I0 p6 @0 E; z' j. w! }0 m      mcbsp_cdev->owner=THIS_MODULE;
! S' \# G) f4 _& a: {' S      
2 p: U4 Y' ?6 M      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H+ Z) N: ?; U# C' w4 }# W3 |: z          printk(KERN_ERR "register cdev fail!");
9 f2 `, C9 B* Y4 I% I! T      else
  o; Q5 _+ m! O          printk(KERN_ERR "register success!\n");% s% \1 u( K! M/ j: ^. A
   }0 i3 _5 A* x/ j* t
   else0 v7 P) r. l" U4 C  m
   {
+ d: m% d1 t" {7 k: s: d8 U7 t/ u  a      printk(KERN_ERR "register cdev err!");  l) k* L2 T7 K5 ~* a" h
      return -1;
: e( z5 L* k$ h, _- g& {   }1 K. u  [9 {2 j1 b1 V+ f  Z0 l
   
( X& r( H. F# y" r. U6 F, d# |1 I  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; V7 {3 p7 V! L% K* B; j
   if(IS_ERR(mcbsp_class))
' I  q& T# F' n/ X( ~* m- z+ Q   {
" ~" A- y0 I" r$ M1 I6 w      printk(KERN_ERR "register class err!");
8 v/ D. ~+ g. _7 }3 i4 p# x   return -1;
0 V. s2 ]* T" F& S   }
- [& ~, R$ A+ K8 d$ z: }; i   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 W, E% v' {: Q1 _. m5 R, s0 V! ~: `& s: Y, G. A8 R/ r0 i1 T% e
   //PSC1 Q% H& E3 Y) Z3 i
   //add Enable MCBSP
* V) G# e4 R! L# J2 `   //test
5 O. L- |* {5 F# |   temp = 0x80000003;7 e7 K; _& ^$ `; q& _
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 `) T( H3 y. E' Z8 F* m   temp = 0x00000003;
' M1 F; r. E8 e$ }1 Q" S2 Q, @" K   writel(temp, IO_ADDRESS(PTCMD_ADDR));' q' B4 u& F4 c/ R  _1 ]& A: p7 l% b

4 v* d& Y& g* A+ J$ d7 U   temp = 0x001FF201;4 |1 j- j) l# m% A. Y  A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));! T' p: G; a6 Y7 H# ?" Y6 t3 \$ D
   
9 O, \, \% B1 y1 P% D$ t* q   //PINMUX  1 v, i" j% ^6 R# G0 Y
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) }6 h- i: @# T5 s5 C7 K3 [
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  : d) o) s; E! r) s
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
' ^( ~& C# V" S   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 |+ e- D" Z0 N6 x+ M$ f   
. o% Q9 `# X9 ?9 w4 U   //SLEEP_EN,EPR,L138_SHK1,L138_RC, M5 o5 i$ j; P) v: t: h& ]
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ( M! t9 ]0 C% F2 F( u
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   $ _, S8 o# G7 [/ x- `
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- n5 g* z6 [; x
9 @3 E7 H) j$ S   //RESETn,L138_SHK2
6 K3 V. c" w% x, M5 i; `   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
8 T* Y6 X' m( a' b) p   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! [) n+ |5 f; Y7 w   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% Y5 ^, F( \# i- ~  b
; q3 `+ R- n) T* s 8 q! H3 J6 ~. g. y9 }
  //SPCR Register- ?& w, U, r4 _0 H3 D; O, U1 i
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
# I! I2 J! ]  U4 _) ~$ j6 ~* R' J2 `  temp = 0x03000000;//(DLB=0)  |( e0 J( H* D6 B1 `/ v8 ~
// temp = 0x03008000;//(DLB=1)
0 g0 V. k0 y7 \) V( j* O; u/ d! z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset1 {1 \2 C" h( b( L5 L# v5 Q$ `
  temp = readl(IO_ADDRESS(SPCR_ADDR));: U5 ^. t' G. D% ^/ o# e
  printk("temp=%x\n",temp);" V" l3 v3 M/ H- ]6 A# M0 e

8 r- k! a; {( K( c2 M1 I3 m   //PCR Register' ?1 [2 x; R, O5 k% O( R  i5 W
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
" ~; N9 C! W4 B& W- q2 H  // temp = 0x00000F0F;
9 w3 ?) K9 w, Y$ Z$ M5 V  temp = 0x00000B0F;
! t, O8 ^9 A- @+ d  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ) T8 u- I$ k# \% ^
  temp = readl(IO_ADDRESS(PCR_ADDR));
$ E/ m1 U5 {) O4 ?  printk("temp=%x\n",temp);  
+ P6 O( Y% ]9 V  O$ G/ O! N3 t: u4 X   //SRGR Register2 T( S; u0 G7 `/ w- {) f
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- Y& X7 P! W+ {# w //temp = 0x301F000B;
6 }4 W6 T9 e7 q8 A& j. h/ X   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: ^+ g4 D* K; S3 x, o: x9 N  temp = readl(IO_ADDRESS(SRGR_ADDR));& @$ w9 Y  V* i0 T4 w! }; P% p
  printk("temp=%x\n",temp);
6 B4 b/ |, e' Y: n   //RCR
# w  J0 @' g) e% V, V4 ~   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ _$ C) i: l$ d4 Q/ f* z' d
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0) X7 D! M; v( m3 C  |3 q8 ~
   temp = 0x00440040;
: O0 q9 n- }. A5 D" S   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   8 G7 ^3 E6 }( C8 D
   temp = readl(IO_ADDRESS(RCR_ADDR));  d6 B+ F) t" }3 H) W
   printk("temp=%x\n",temp);9 }0 [4 q) ^! ?
   //XCR
6 e, p/ ?7 d# K" m; ?! J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; x1 @7 g4 N  ^( X  \
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* e8 ^6 ]' u4 F   temp = 0x00440040;2 h. Y3 ]2 I# K* n. a
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
* W9 v& N6 b/ \' a0 f2 N( W, l) h   temp = readl(IO_ADDRESS(XCR_ADDR));! U0 a  G9 W0 A$ \- F4 Z7 d7 d
   printk("temp=%x\n",temp);
1 K7 x0 M' {0 `: E7 i" x- {  udelay(100);) _5 c" x2 a4 P5 ~) l
  //SPCR Register
. E! H. f" \) U1 u4 b8 B  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" \/ r/ g4 z5 {" Z$ f/ e  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
: S2 c8 x" v1 P7 M0 M( v- C  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 m. |2 O2 f- {: ]& V7 _" S  temp = readl(IO_ADDRESS(SPCR_ADDR));
! A+ I7 W# L2 _  printk("temp=%x\n",temp);, G  f- s8 J9 X6 l
  udelay(100);
3 M9 E3 P* r3 C4 w0 g9 W2 I0 S0 w4 G! J
  //set GPIO direction9 P. j! F' p* O1 k8 h
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( `! a  M9 A6 g. ^* S2 h  H   temp = temp | 0x00000100;//EPR----input
# b1 T/ ^/ m4 A% s  G/ V: c$ ^   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) O" x6 L4 Z* e+ b2 l( L5 _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& r% C% M$ k  ~
: U, m5 ^# U. m, J& D5 V   return 0;
4 Q, ?2 t( g$ h; U}
( S: D' G( d8 W9 @' vstatic void __exit MCBSP_exit(void)5 P3 O; ~3 u. \+ \" p! z+ d
{
( W+ J6 Z- t' z$ a7 ]5 W   printk("mcbsp chrdev exit!\n");
% u0 R1 s. K( x) ^   cdev_del(mcbsp_cdev);
( f6 d6 y  D' y; i6 l   unregister_chrdev_region(mcbsp_dev,count);/ O) P- F5 j, K9 A4 t; Q
   device_destroy(mcbsp_class,mcbsp_dev);
7 `0 t+ O6 P+ p1 R6 P   class_destroy(mcbsp_class);
) n+ f  ~0 w$ e) I- Q}
+ F/ y: I& t7 W/ \' }5 M. [/ Vmodule_init(MCBSP_init);
. ]1 Y# u- E- Q, o* s- j% _5 \module_exit(MCBSP_exit);
/ b  z: E# O  J7 v# m  d! i, _/ N0 `+ Z6 `, j% S1 \' y; G- `( a
MODULE_LICENSE("GPL");0 s  U. I- Q9 r. `# ^2 }" \2 f
3 a6 O# f" p5 x- |# w
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。( f1 r. ]2 k: B1 \; J" N6 C- E
我的应用层的测试程序如下
& R. X9 V! p/ ?- y' @#include <stdio.h>
5 w6 t. T! t6 E: }#include <string.h>  e! [2 k, i4 r+ @6 Z
#include <fcntl.h>
0 \1 U4 |/ n* R% E- U8 j; [#include <unistd.h>; `- o4 Z2 D: e9 {/ [6 R
#include <signal.h>
: l3 p9 C1 L: w0 q8 l+ A% i#include <pthread.h>       //线程. R4 W3 S( v; b" T" m# d
#include <stdlib.h>. s9 l  K7 r4 h0 x" S' o1 J
#include <pcap.h>          //捕获网口数据
! L; s9 ?7 ^; V) v8 \* W#include <semaphore.h>     //信号
. F9 A; m4 p* ~, B4 ?# X#include <sys/types.h>     //消息对列& j7 |+ T- S3 E) E; w4 t; }
#include <sys/ipc.h>       //消息队列8 C+ G: M$ v" O# L! D, e* s
#include <sys/msg.h>       //消息队列
( {4 {- l) A8 `' o# {/ q# U#include <sys/select.h>% ]2 c( `1 `0 B# i5 W* q- A& y6 o
#include <sys/syscall.h>
1 p+ z: o. ?2 h/ p#include <sys/stat.h>
+ p, ^' C6 |1 ]#include <sys/mman.h>
1 j6 Y2 q3 T' U( @; @8 ^8 o#define msleep(x) usleep(1000*x)
: ?; ~' a$ J- e: H* H7 H( i9 B
) J3 Z3 e1 U3 a+ C* d) I5 J/ B' p% ?int main()
) l5 q" e- w: y: I{
4 J, C0 C, _2 [1 y' R1 Z4 \3 h    //MCBSP,ARM与AMBE2000交互设备
: o) y' z1 r* a5 T/ _6 Z0 w int fd;# e; b  E  @3 ~9 F6 b2 F9 h
unsigned short data_write = 0x5555;
% t1 ?! E- S5 ^: D% z unsigned short data_read = 0x00;
, u+ }( G5 C* f8 j# C& n/ u8 @  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& v/ D) B& e: r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 P& a) U- Q: v  o/ _; Z2 Z+ |
   
2 ^  q; d6 |! c  if(fd < 0)" \) U- \, M# e8 T9 L
  {
) W8 u2 H* q1 L0 R! ]     perror("open failed\n");, \) w! j1 S  }2 V; H
     return -1;
9 v4 P1 q/ L# s2 l! L6 g  }3 S4 b) N5 j+ s- P
  3 k# r# }1 l. |. ], B3 c
  while(1)
/ E: u9 F6 y( D* \3 E  {2 ?1 r& Z  }; H0 M1 n- r
   
# o; d# O' |1 q" ?& ~   //AMBE2000每次读写是24个字为一帧
4 {! D! w* a( B& z4 R   //写数据时将数据在底层存储起来,等到中断的时候再发送9 i0 s1 ^; m3 V3 b3 `
   //AMBE2000输入数据是以0x13EC开头的
5 [1 q( N6 A2 M2 B   write(fd,&data_write,sizeof(unsigned short));6 C: {1 B8 a8 s
   ; f  N1 V' _9 }+ L" b# h
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
1 f- G5 d' X$ @$ A9 O   read(fd,&data_read,sizeof(unsigned short));" a$ o" x( e+ S: {. w3 z
   
6 x1 G$ W) b+ Q1 d9 ^' L) ^   if(data_read == 0x13Ec)9 a- i' S( G1 `
   {
# ?: A/ _. S+ }/ o/ c; Q  n5 `   
- j  j) l4 L! }. E: ~    printf("data_read = %x\n",data_read);3 _. N3 K* T1 S4 ]9 A
   }  l; H2 ]! E+ M9 f+ ?) y: h7 }
   / M4 _# B: ^. ~- ]8 q: ?2 V8 |; ?( L7 n
   msleep(10);
! |# F& f0 q1 B8 K  P) p  * N4 T4 W9 ^; [
  /*
4 i/ j, V! u4 G   ioctl(fd,1);   ; I- P  p) W- A  A) z' l
sleep(1);
! P* {- y# C4 u ioctl(fd,0);
/ Y5 Y) s8 K2 ?) p  `3 d. B sleep(1);
) L& G& L5 N, ~# G9 T */
# U/ E  K$ {; v; T1 v  }   
6 i/ |/ T+ j2 k: g$ Y return 0;
3 u5 M% K, F. D# R/ P 8 d5 \8 h: m% n% `) h- k
}
3 t4 T! c9 N% i' q/ p, E+ V" ~/ ~5 E
) Q! }# [7 s- V# q+ B多谢各位指教,谢谢! 急
9 L9 r1 n* Z) }, V2 Z2 m$ _+ p: }, z& s+ p! W

7 ^' Z3 G  C  r. N( {& z( B! |# h
* v+ A0 j8 p: K9 ~

% J$ A! K9 b& z1 q  h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 21:48 , Processed in 0.043872 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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