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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: ]* u, K0 A) t9 L6 ^  r& B/*
, t8 Q( j( E/ ?- Y2 A* _3 a * Copyright (C) 2009 Texas Instruments Inc
  T$ t- x2 v  W0 c *
' n: ]0 U' T( Z * This program is free software; you can redistribute it and/or modify1 e* B- B0 e+ f5 c( d" O; `
* it under the terms of the GNU General Public License as published by% z, T/ y) K1 y5 @: O$ ?
* the Free Software Foundation; either version 2 of the License, or+ E( E3 m/ ?. T) X2 [' c
* (at your option)any later version.( O& |% r2 D5 y7 x
*  z6 H+ }( l$ g
* This program is distributed in the hope that it will be useful,$ i) D+ y, \$ r$ U/ h
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 l, A5 K$ U  M; B9 r3 G* F- x" c3 n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the0 m" w6 y: ?! l7 v  _
* GNU General Public License for more details.
% s. f- R, u5 L1 n2 i *! i' p8 a' j: t" m) n2 R7 o8 u0 K
* You should have received a copy of the GNU General Public License; E: {( u5 h7 K. [9 f$ S
* along with this program; if not, write to the Free Software$ U% ?7 {. W; ~# W' H  M$ J* v
* Foundati
' u$ ]$ W6 }/ C: @: B6 ~: u*/9 c; V  y8 r* K; H. A
#include <linux/module.h>
- [* D! l3 \2 {9 Z#include <linux/init.h>+ N" {! C5 M* G# M* X
#include <linux/errno.h>
: H; O9 r' K; J#include <linux/types.h>
* c7 ]4 G6 h' k/ M7 m% `# L9 Y#include <linux/interrupt.h>6 b4 K- ?- N1 c9 i: P! k
#include <linux/io.h>
; t+ r) q0 c" @- A1 o" h# b6 ]#include <linux/sysctl.h>6 o8 @2 b0 r/ w- p9 W# ?3 {
#include <linux/mm.h>
6 U% m& ]2 V; z9 y7 t1 e; E#include <linux/delay.h>
8 ~# ^5 h! l" R: ]3 Q6 k#include<linux/kernel.h>
  |* r& J: m$ J3 t+ U' l9 B% Y#include<linux/fs.h>( l2 o" f7 S- r7 a" O- `
#include<linux/ioctl.h>! L  L3 j4 M$ i- h: }7 p
#include<linux/cdev.h>* f+ K, u, \1 Q! i% R
#include<linux/kdev_t.h>7 [) K3 n) q1 H# a, K/ ^
#include<linux/gpio.h>
( g0 v$ E7 U, B( s0 [* \#include <mach/hardware.h>2 L# e8 W2 a( m, _, I5 o
#include <mach/irqs.h>
6 t8 @- g# ~8 Y0 m. h1 B, N1 [6 t9 _4 h
#include <asm/mach-types.h>3 U4 O7 y7 B( g8 e& _& l
#include <asm/mach/arch.h>5 q& Q! n3 F9 K, u
#include <mach/da8xx.h>
  _( Q# V2 ^  F  r#define  SYSCFG_BASE   0x01c14000
4 j1 i1 x+ E) ?, F+ ]& Q#define  PINMUX1_OFFSET   0x124
7 i) Z$ r  |6 V1 X#define  PINMUX18_OFFSET  0x168
0 I4 {: T, p1 J#define  PINMUX19_OFFSET  0x16c
$ M) t: [8 {& F# b$ z6 B#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* a4 v- X$ R3 {# ^( o. T, q
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR% r* K. U. W# v
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
, v# B2 N$ n+ X, x3 e#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; n0 A0 m- M7 Y8 P- b5 D
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 y$ P4 ]$ ^' R. R8 i1 Z- ?                           
; T& @. u7 X. @: T1 g: m  |0 C#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 f! A* o5 t0 N  V# x3 i7 W#define DRR_ADDR      0x01D11000  //MCBSP1_DRR4 L7 g' |( e4 q) _7 {5 D
//PSC4 C. m4 v6 D* W4 A. l
#define  PTCMD_ADDR   0x01E27120  7 \" U5 @" w' d8 d8 b, E
#define  MDCTL15_ADDR 0x01E27A3C- I! T2 |' x* d  Z* z$ ~3 M
#define  PDCTL1_ADDR  0x01E27304
6 M+ v4 ]2 [% m. a" t# }4 q! l//GPIO8 direction
. P5 d7 H$ ^0 @#define GPIO8_DIRECT  0x01E260B05 E  c; o- Q1 p* R) I
#define GPIO8_OUT     0x01E260B4
6 K0 o1 @  _. b: |- z5 @#define GPIO8_IN     0x01E260C0
* }/ e8 L4 L4 e4 _) \* _. D
8 a! }6 I8 Z; x//#define MCBSP1_RINT    99              
7 U7 E7 B) p1 p5 i+ G//#define MCBSP1_XINT    100  
! ]/ J& u+ ~. }9 d5 \' d# v* b; istatic int MCBSP_MAJOR=239;. B! j- F* c8 Z4 U! m8 o' y0 q
static int MCBSP_MINOR=0;1 i: `, B) a1 Y% _2 q
static int count =1;
) `' a5 q5 X4 Y! j0 ~: M, A. N, J& ]& {* X
#define MCBSP_NAME  "MCBSP-device"
" e7 U% [9 T. \" X  ^# F2 O2 H8 H! e- f. A& U
static struct cdev *mcbsp_cdev;
" P- z1 h3 r) @5 w- B* s9 cstatic struct class *mcbsp_class;/ o  q2 n1 Z! s7 v: ?" i
static dev_t mcbsp_dev;" Y6 D1 [% y( r: s  O
unsigned int DRR_data;6 ^3 V% q% D) Y9 x: y9 i. [
unsigned int DXR_data;
, T' C" d1 j8 B6 s* f" P9 Dstatic int mcbsp_open(struct inode *inode,struct file *file)4 x% Z9 [/ y; F
{1 x/ D  p# x6 w% R
   ' C3 ?, _# Q9 l) H
   //interrupt enable,initialized
9 s8 `8 f, \( D2 V; Z   unsigned int temp;* H& d" ~0 B. i( B3 W# V) E' S# S; H+ \
   //SLEEP_EN(GPIO8[10])---0
1 q0 g0 U8 ?$ _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 U5 v" A1 z! @1 H8 L
   temp=temp&(~0x00000400);6 h# \4 H  X, R: K. d# E7 v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, ~0 m  r/ F5 b8 N- U) w2 {7 r  //RESETn(GPIO8[8])----0----1# V2 F' o; z+ s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" u: S. R# @: |6 W- ^- z# ~2 s   temp=temp&(~0x00000100);
! O, h" A4 I" {   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
/ ^3 m- P) M* _* n! F0 L   udelay(100);& F/ n0 d9 v; E) U. j! r
   temp=temp| 0x00000100;
, x/ o  u0 P: N& F- `$ ^; q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ \$ X& h, H' O0 v1 ^
   udelay(100);
$ F& {/ a' Q6 R5 }% g% O5 N   printk("open success!\n");; K' Y. ^$ I. S8 z2 e  w# p' ^
   return 0;# b& B0 R# P% @
}& ?7 X  O" `* ]& h. K' I$ ~
7 \* s6 z0 ^1 A# k
static int mcbsp_release(struct inode *inode,struct file *file)1 i7 N- N% F1 A0 d& X* j
{
4 d( K3 S  ~* e" I$ z. l   printk("release success!\n");( c1 W6 s7 C1 G7 l
   return 0;
! [/ o, q; _5 E4 T6 K: M}5 M$ F& v7 E' S% S
; T5 E' ^: n% z$ ~9 q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* X: p5 F1 M- [0 D1 ~
{5 k9 F. l3 \/ \1 \, x
    copy_from_user(&DXR_data,buf,len);
, B3 Y1 Q* j# \$ v    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" H9 R% [  P5 o2 Q    return 0;5 b* h2 Q0 X" I1 a
' D4 j" L/ V9 J* _- ~
}
0 Y8 \8 \- _( ?/ U/ v) C' ~5 u0 A- X2 y) H
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! e7 e3 r. k) t0 o/ {( k1 {
{
8 U$ `' r5 I. U/ k& \( J: Z$ c   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# J* b8 e: S( r3 y$ e   copy_to_user(buf,&DRR_data,len);
6 B1 F( n- a  f# x   return 0;
! o! i% O0 ?$ ]* n6 A, v: t% i}# c( x. o  i% G) S8 ^) K* n/ S
$ h: _4 o3 c, v  S8 N+ J- z" J
  f) g$ Z* P! w/ k, D  }6 h" f% A
static struct  file_operations mcbsp_fops=
: d4 {" I4 u9 C6 q, D& ~{) P) c4 x/ b1 s5 ^
   .owner=THIS_MODULE,
) P$ _  `/ ~7 Z" b" e/ B   .open=mcbsp_open,$ ?& ^( ^1 J3 @
   .release=mcbsp_release,0 G' p+ p* E5 e: N3 p# w: M6 H
   .write=mcbsp_write,; o# ~( o/ J0 X. @# a! V/ i6 U
   .read=mcbsp_read,
: W. N0 a6 q. }9 i' y2 z' V};
2 v! s' i2 `! @( o: ?static int __init MCBSP_init(void)
3 t* t0 v8 A# w! L, X5 ~9 Y{8 E  i4 F* }, a. {
   int ret;( `: B' ?9 F0 l, i+ X
   unsigned  int   PINMUX1_REG_old;
1 E. v: B- O7 ^1 t   unsigned  int   PINMUX18_REG_old;4 W2 P, B6 s8 T. A$ B. `3 C
   unsigned  int   PINMUX19_REG_old;4 f- _$ W" C4 |! j2 M
   unsigned  int   temp;  , |# r1 k' ]9 `- S
   if(MCBSP_MAJOR)
) b3 Y% K  d* u   {1 n/ |9 y" U; F. q1 L
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 s) t4 t6 x* x* ~" [# B: _5 `) U* H
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
; A& |+ L6 T, e" Q9 Q& Q( U   }
: K- ^2 W8 m, x4 P3 o+ r   else! M! F0 N' Y- }4 H" K
   {
" e% E" j2 O) b# U% y+ D- V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 q' @' |+ v2 I; ~1 i& e3 o" Z) R
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ r8 R: v8 D8 g5 K   }
6 u  |( C" _8 h- D; f9 s   
( n! n2 g8 q# M$ C' c   if(ret<0)4 D! @0 Y+ \: \  G, x
   {2 T" N2 l! w: z  l5 S( F
      printk(KERN_ERR "register chrdev fail!");- K, j% n8 p3 S+ N
      return -1;% I3 V  V" V0 n
   }
% m, p1 n2 u" c" P1 c5 o' d  j   
) K! o% Y# W& S3 T   mcbsp_cdev=cdev_alloc();% k2 g1 z+ _/ I# _
   ; d) e; B" x+ O" i1 [: B
   if(mcbsp_cdev!=NULL)
8 o5 ]7 ~) t4 b" S   {& H3 g; Y+ s6 r; o: G& d6 J
      cdev_init(mcbsp_cdev,&mcbsp_fops);. j6 B6 h; `7 q. n
      mcbsp_cdev->ops=&mcbsp_fops;
: g0 p8 a7 Z$ |/ {      mcbsp_cdev->owner=THIS_MODULE;
/ B$ H$ C9 J/ T1 ~/ A1 l/ Q      ! c0 g, H, R" D2 @: G
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) X3 V, z2 H8 L3 o
          printk(KERN_ERR "register cdev fail!");
$ {, n: _4 o$ P  ?) X! s9 i1 n      else8 t2 G3 m& f. h3 ?% j/ }* H
          printk(KERN_ERR "register success!\n");
% u; [# g- q% x) l   }6 @7 j: P% o, M. ~8 E5 ?+ I0 K
   else
$ D8 o( Z( }; n6 [5 _1 o% W5 {( J   {
  c9 `9 S/ W: h" J3 w: Y9 q      printk(KERN_ERR "register cdev err!");
7 R2 a' L8 D- t# p1 Z      return -1;
! h1 D1 K4 |* ^" ]: [2 V2 b   }" N0 w9 ^2 g* D# n% |( }
   
, m4 m7 Q: E; X) {$ k  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 E1 w! L: A+ {1 ?. x' b4 {   if(IS_ERR(mcbsp_class))3 x, G' @' q8 k# z
   {
. ^+ a' t" [5 |: H  p6 \      printk(KERN_ERR "register class err!");% p& A; q5 Z+ ]3 r8 I! b1 W2 u
   return -1;6 Q; s1 Z9 M5 [
   }; ]- ]& |6 H8 o
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" z& X1 J$ B) P* n' S" w- D+ M
& R' \- P1 j2 H- G! U+ Y; b
   //PSC
( ^) v$ h. f1 C1 H* F, @- G   //add Enable MCBSP) S$ G5 o5 ?9 R( N- m
   //test
' c3 L5 ~+ D: T* M# H) Q+ X2 ^   temp = 0x80000003;4 w: ~2 m- T) M0 P4 {) A" h
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( _/ m0 w1 M0 D( `   temp = 0x00000003;3 b# ~" T1 l1 b# @
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
% `1 ]% H% r' H9 G. \ 5 B9 k8 X( u) N5 h9 r& B6 ?
   temp = 0x001FF201;7 `* \% m( @9 H8 c' J
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: X5 F1 Y4 J+ _   
4 T- i! X, C5 \) e( [" \   //PINMUX  
( Q) m0 o& o. j6 o+ E: L; D- `   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 @- s; U2 s7 Z1 z: _& r   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  4 N5 {* m4 e) m, L  o( D5 }: O0 ]
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   # j7 g$ B9 m& f" Z( M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);, w- p% {. ^5 L
   
6 n0 J& W& n( p/ C- F   //SLEEP_EN,EPR,L138_SHK1,L138_RC8 ?3 q& c* [* x9 l6 A4 ~' Q
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
( }- A% y  c6 `. @   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
2 a9 j! M, A+ V3 [7 k* V   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ i! K4 X; L2 W3 {6 c5 Z

5 A& X( ?& h5 ^4 H7 }* i   //RESETn,L138_SHK2
7 B- a/ d; j' H& S+ t& u   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( w+ S  f% L2 a: |   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
( \0 }6 q7 b) H7 `9 T   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& k, x* s6 f" o " f, \6 D! ?! [5 M3 @  m& M$ L' S
8 U& `  b, \9 X/ v0 J
  //SPCR Register; ^. z6 P- S' m4 Q  n) C6 ]+ x
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 [' c' R+ y% i
  temp = 0x03000000;//(DLB=0)/ \6 n0 c1 Q( s6 [9 {9 @
// temp = 0x03008000;//(DLB=1)0 g1 ]3 ]' F; ]: \, M- j' q( }
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
1 L- d9 U; Y( }; O1 A  g& x  temp = readl(IO_ADDRESS(SPCR_ADDR));
# t/ R* S3 l  m  ?/ t  printk("temp=%x\n",temp);
+ _; F, q% z2 i 3 i* f% o- E  G) Q- g, {  _
   //PCR Register3 g7 H4 {: A& Z1 h( O  S
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  u: n. G7 Z$ a& p, }( y, U! a
  // temp = 0x00000F0F;5 U; E+ a# M9 H/ o5 U, d( h
  temp = 0x00000B0F;
! ?, A7 [0 g9 j8 ?& j/ J) c4 D  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* D8 Z" D7 o1 D2 G, m  temp = readl(IO_ADDRESS(PCR_ADDR));
2 R/ K; S8 A$ B  printk("temp=%x\n",temp);  8 B) ?! F+ F, H% q" R
   //SRGR Register2 K; B+ f7 F* S, r
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 b' t2 K5 {: |* g //temp = 0x301F000B;
: G3 ~5 o6 ]4 b" ], B9 y* D   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
% r6 C1 s7 [6 I  temp = readl(IO_ADDRESS(SRGR_ADDR));2 u9 H3 q( [: J3 q" m  F; Q
  printk("temp=%x\n",temp);4 c; X* G+ g+ c9 }
   //RCR) A) q& `+ ]' V  S2 b( |! U
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
( Z9 i6 P! S+ x* }6 N   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 A, J/ q( L* F: h3 D: ^* d! }
   temp = 0x00440040;- A3 p: I/ o: {1 t  {
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 c: {' k. p' u: e* Z! p   temp = readl(IO_ADDRESS(RCR_ADDR));1 H7 }% `, Z( k4 B7 {% V' W
   printk("temp=%x\n",temp);
9 M6 g) c* F( v# O4 r6 G2 M9 o   //XCR
  H8 _3 l9 R% i! D5 x   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- R! m" ~' O) q2 _4 l
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 n  I8 b1 _  s$ c7 J6 i" g! y   temp = 0x00440040;( `7 N* m; \( Q, J+ i- z
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   . R% o! ]& D9 k8 C4 o
   temp = readl(IO_ADDRESS(XCR_ADDR));- G, B: r2 U) m$ `
   printk("temp=%x\n",temp);8 F% ?5 z7 l. }  u/ Q2 I
  udelay(100);
3 j$ P* z6 z! s: ~* V. {* l  //SPCR Register
7 w8 a& [+ y% |! l1 o. r  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, Z9 D1 }# o/ S7 d# \( R5 i
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
& Q, U! @5 }+ L' G+ m" L  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
" X  q5 k4 ~" |! q* e% y7 P8 v  temp = readl(IO_ADDRESS(SPCR_ADDR));
( V# U* z( f8 |) l& B# C8 C$ K2 K  printk("temp=%x\n",temp);% f) m- C" U' p# U
  udelay(100);
6 o4 m! F) H" Y" L; H4 H+ Q1 S- w7 h3 c# Q) u* e  [) s7 L
  //set GPIO direction7 t+ Y: R$ b6 b' R) R( z
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 x. g+ M' |0 o1 t) x4 a
   temp = temp | 0x00000100;//EPR----input( a; I4 T8 L: H4 |7 A7 S& w
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- Q, u% I7 c1 b8 p/ \0 S0 h3 H. Y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! @6 O6 `: Y8 B' @- V& `+ `3 p

5 f& Y' X4 X' D6 O0 }3 ?   return 0;8 Z& l1 E# T( N% y! O
}8 x& C: s( w' _/ h
static void __exit MCBSP_exit(void)
8 y+ z' I- F# ]  o( [3 h- m{/ \$ u; }. h9 r+ `6 @, Z
   printk("mcbsp chrdev exit!\n");
4 e% z$ o( ?( X# n6 x8 p1 C   cdev_del(mcbsp_cdev);
3 J4 K7 e6 l4 V! N5 d2 M, u   unregister_chrdev_region(mcbsp_dev,count);9 r: Q( h* }0 k
   device_destroy(mcbsp_class,mcbsp_dev);
7 y7 N6 y% ?  |6 R* B! K   class_destroy(mcbsp_class);1 E, e/ K1 S; k, C  \
}4 b0 p3 }$ `9 i; E0 i: k
module_init(MCBSP_init);
. D4 z/ y0 c5 ?' t3 v: ]module_exit(MCBSP_exit);
$ S" @5 V- d- z# V2 V3 `) P1 `2 P
MODULE_LICENSE("GPL");
, W- B) \8 Z1 a6 k+ S* |- I  @  l* s% S$ Q% t5 y. Z2 u
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
6 L( D% k, x3 i  w' e我的应用层的测试程序如下
, i+ k, ^. o8 W% k! F#include <stdio.h>: y; T4 p+ }) U$ A, [- C
#include <string.h>% L8 v2 E2 g1 h) `2 a) N& }) D. }
#include <fcntl.h>
! k9 E  `+ \2 d; }+ |#include <unistd.h>& f- |& ~0 n8 _, @4 k& @! B
#include <signal.h>
5 z" s# v& }9 W3 v" o#include <pthread.h>       //线程
% z) W5 z/ S# Y$ H  _7 S2 |( X#include <stdlib.h>/ _' V1 @/ P3 W' [* W, Y) o
#include <pcap.h>          //捕获网口数据
% r% a) E) w- D) q% S0 _, N* s#include <semaphore.h>     //信号
" B, }. f9 I3 y( A#include <sys/types.h>     //消息对列2 F4 Y) D. r7 j. E! b" V
#include <sys/ipc.h>       //消息队列
. V; |" r" @& i; T2 h0 r; {#include <sys/msg.h>       //消息队列
; u* W3 a* U0 a' \9 M% M9 p- Z#include <sys/select.h>
! [/ Y8 e: S; Y# ]4 N0 T#include <sys/syscall.h>
8 v8 {; _* ], m# S; d3 S#include <sys/stat.h># O/ ^2 z/ T. ?" m- T/ ?  {+ f, X
#include <sys/mman.h>( Z" o3 ~; U; J
#define msleep(x) usleep(1000*x)) V+ |- g. n' ?

4 n9 l/ W+ r# r9 P& uint main()
. q" v0 j) y3 N8 e{ ( \, i! c! Y: ^4 S, P! t
    //MCBSP,ARM与AMBE2000交互设备
# f/ K9 H" |9 D+ L, I8 ?9 [* V int fd;
9 [, N) ~& A  I  h+ X# N unsigned short data_write = 0x5555;$ O. v4 ^; `! H
unsigned short data_read = 0x00;, w9 T9 ?6 W% e' \  w  [: I0 F/ }8 [
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ B$ L+ j) J+ ?- n: y9 z //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 W  ]+ l1 M- _: w8 \  C
   
- ~. a% m. |9 z" L7 c7 K! G; s/ j  if(fd < 0)
7 o# S& U! A+ x# L) K  {
. ], B+ n7 F3 m0 _8 g. s3 l     perror("open failed\n");
3 E: r6 z; L. @6 c! Q     return -1;
& m* c; V" q9 R$ n  }
% x$ h# [% ^: l' {( O" r1 N  7 o" ^* Z( a  [# C- U8 @
  while(1)- F2 P: s( h. w* u/ A7 n" e
  {3 e) b: `1 K# u/ z3 n
   
1 g6 Y$ r( ]  k5 q3 Z% r   //AMBE2000每次读写是24个字为一帧
8 H( k5 I  P, g& m   //写数据时将数据在底层存储起来,等到中断的时候再发送
& n/ W, r( F. f* h+ U7 u   //AMBE2000输入数据是以0x13EC开头的. Q: b: x9 C2 X4 ^' Y2 J! x1 Q4 [
   write(fd,&data_write,sizeof(unsigned short));
- b2 _$ Z0 f; p4 S7 x, a3 b; p   
. P7 v" E- _5 j' X: Y   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  " J* K8 j, X) Q& o+ }7 z- c  m
   read(fd,&data_read,sizeof(unsigned short));
/ [8 ]  F0 Q; Z; D+ \4 D   
; M) k; X% F- q2 D1 B; p   if(data_read == 0x13Ec)
, B# K9 B4 Q6 s   {
% p& e/ P- \" Q  ?2 K. p8 q   
/ ^. E# r6 [0 t; H' V    printf("data_read = %x\n",data_read);& f0 l# J: K* I) F; d: J
   }
1 W6 G+ l" m! p4 `   
# Q. [" i$ Q( C# H9 s; B4 u3 t   msleep(10);
# o  i; i. O) v* {. m9 l0 x  " d; }5 K% G$ T. e
  /*! h$ A( E+ c* i/ p
   ioctl(fd,1);   ) ]/ {' n4 T( b% S8 }
sleep(1);( N, x$ [( y6 Y, j8 u/ \! c
ioctl(fd,0);, l+ \; V, R& g- Z+ W' C
sleep(1);
# ?* }. R1 K8 G% I */ . Z$ _  J. ]4 D) v+ y) ~! I
  }   
5 }9 C1 ]# i7 Q) }* r return 0;# G: P, A6 j1 p8 v$ s
. }1 i: y; _8 \$ \+ @+ z
}  W5 ^8 H, p! K. }

$ x, C7 u, T+ p4 O0 Q5 Q$ r多谢各位指教,谢谢! 急
0 J0 R! p0 H6 R( v% s) d8 ^: K, H/ ~# {  Y; Q1 f
, C$ N- ^% d( q: b1 _; h
3 m7 b6 ?& e, j& s

4 X; Z( n8 a# e- T; i- |& f; n4 U9 e3 d3 P' h* T7 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 02:28 , Processed in 0.041571 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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