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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' o7 N8 s( ]+ e, }/*! B" n# v9 p7 a
* Copyright (C) 2009 Texas Instruments Inc' Z1 I4 ^+ p# W2 e  }# B) W
*
; F9 O7 u% z5 z) s * This program is free software; you can redistribute it and/or modify
, m, Q" g  i4 I3 Z' N * it under the terms of the GNU General Public License as published by
+ T# Q6 [" n: f * the Free Software Foundation; either version 2 of the License, or2 K5 q. s& q3 y$ E* O
* (at your option)any later version.
  B( b8 F7 }4 B. R# a' C' q *# o: J6 v) Z, n9 e# H0 P
* This program is distributed in the hope that it will be useful,4 K! m6 o- G2 C" C
* but WITHOUT ANY WARRANTY; without even the implied warranty of
; f' K4 x. n- L  [8 n+ J! P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 |7 a, ]9 x: Q6 k
* GNU General Public License for more details.
& c) W. J: O$ ]4 d) ~ *6 [, ]5 f. |. Q5 Z+ Y
* You should have received a copy of the GNU General Public License
- W" W9 X; ]2 f' j, ]0 K. a! N: ~1 ` * along with this program; if not, write to the Free Software
" T; k& K* A- k) r/ M& {$ b * Foundati& }9 _$ o5 _$ V* r3 D& P
*/. I  }: m: K: s6 i$ i
#include <linux/module.h>
6 c7 e! ?4 G! O0 x#include <linux/init.h>
7 R: j6 s9 X! q, @' v9 h#include <linux/errno.h>5 g0 D6 H% S* u" N! Z
#include <linux/types.h>
$ J1 ?( S2 h# D, C#include <linux/interrupt.h>+ s' Z' B1 f" J- _$ v( `6 E5 e
#include <linux/io.h>; N4 i- r* ?9 Y# l
#include <linux/sysctl.h>: \* g* _& r/ u
#include <linux/mm.h>
" |* Y. o4 j+ P% r#include <linux/delay.h>
( T' Y- l% I3 P, @6 P% v#include<linux/kernel.h>( L0 k- |& T4 s9 b+ E  @9 S/ M
#include<linux/fs.h>
; G% D9 J. o" D  V#include<linux/ioctl.h>
) c; D& g6 I& @7 b9 {( S#include<linux/cdev.h>
5 z; m" m3 x" ~4 |#include<linux/kdev_t.h>- R3 v; V: [: r
#include<linux/gpio.h>
+ k9 U, ]# ?* A7 m$ @& H#include <mach/hardware.h>
& r/ w: i. l" T9 u) x& a4 u& j1 T/ Z+ X#include <mach/irqs.h>4 f$ M$ f% q& O! W+ J7 e/ K9 H
3 W- l) g, M. Z, n
#include <asm/mach-types.h>9 F/ y" l' E, H9 m3 e( T0 q+ b  u. ]
#include <asm/mach/arch.h>
7 `2 R+ I7 K( `# g3 G2 i4 o#include <mach/da8xx.h>. b# P( Q1 D) Q& c. X0 i* Y, V! j
#define  SYSCFG_BASE   0x01c14000
: T4 j" h4 K- {- Q  @#define  PINMUX1_OFFSET   0x124
7 I2 M7 f" D2 c+ |& r) A4 @#define  PINMUX18_OFFSET  0x168
  A) w8 b* O7 _& w. R, T4 I#define  PINMUX19_OFFSET  0x16c
/ O6 X( s% |/ U) s4 V7 n  L" l#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR1 Z; @2 e3 f8 g- h6 I1 H
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
! j+ p: `  Q2 r; m+ P#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( y$ t4 P  q6 o& U5 f' O: \#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR' o6 v  ~' q9 t  b
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ s" ~# Y9 a9 G$ U. d. Y' n
                           
- e8 C' H5 [  I2 P#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, H; m3 V0 b4 `# ^
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% n; I$ K, _4 V7 }" @1 I
//PSC
  O$ [# \* T4 y8 u#define  PTCMD_ADDR   0x01E27120  5 l* |. _4 M- R) j9 K2 k
#define  MDCTL15_ADDR 0x01E27A3C+ h+ R7 M4 U# N/ s. E9 p+ [5 q: k
#define  PDCTL1_ADDR  0x01E27304, C3 R/ ~- n2 ^1 Y6 K
//GPIO8 direction
0 @  y  ?) |' `. n- I/ {#define GPIO8_DIRECT  0x01E260B0/ A3 k8 G7 [6 S
#define GPIO8_OUT     0x01E260B4
8 Y7 ]1 L3 f; D$ P#define GPIO8_IN     0x01E260C0
/ w7 @  a! c8 z0 Z1 a! \$ `0 j
) e) i* F# @8 i& F//#define MCBSP1_RINT    99              
5 y0 ~3 @% q4 a( c0 p& s. _- z//#define MCBSP1_XINT    100  3 q. e$ t. P4 l* W2 f4 S
static int MCBSP_MAJOR=239;
# U/ P% J6 d/ i' P" E7 z& G3 m6 Ustatic int MCBSP_MINOR=0;6 n0 E4 x( U" j+ V" l/ d% m/ Y
static int count =1;
0 z) `9 T- |6 O* `! P
4 R5 h4 C; c! A$ k/ M+ X0 j" p#define MCBSP_NAME  "MCBSP-device"/ z8 D6 Z4 \7 h: ]3 B3 t

& A  a, B. @/ lstatic struct cdev *mcbsp_cdev;
8 c; F1 N7 p" T8 r$ h% `static struct class *mcbsp_class;- {4 a2 R- R  ^6 \
static dev_t mcbsp_dev;
+ X+ ~: l  ]3 Z% ~0 N) v5 Bunsigned int DRR_data;7 |8 K" T. T0 \1 o8 Y
unsigned int DXR_data;8 g- |9 @' g# k8 Z
static int mcbsp_open(struct inode *inode,struct file *file)
& G8 a+ x1 K0 @4 C) |; i{1 `3 x% `1 r, t8 G5 N4 _2 {/ S
   
2 f: s+ {# k5 S$ ^0 ]+ q6 v   //interrupt enable,initialized
# j. N' i/ j2 N: D& [   unsigned int temp;- F! Y* F0 M! C  f3 H' P; |( W
   //SLEEP_EN(GPIO8[10])---0
& L$ h# J! ]2 b/ ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 B' W, U3 u$ z
   temp=temp&(~0x00000400);
3 U; N  g. z6 f1 j7 W3 d   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' H9 x; ]5 i; O% h  @& u: u
  //RESETn(GPIO8[8])----0----1
- e4 `# k" S7 e3 ?   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 g6 m, M' [( Z0 S9 A5 i
   temp=temp&(~0x00000100);
, a7 L& v$ y, f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0" }" A$ v. H0 E) b5 T9 G- f
   udelay(100);* H0 E) @; a* p  {1 a2 p+ i
   temp=temp| 0x00000100;5 O2 n: r; o8 Q! M& D6 P/ H# i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% i8 [/ m! t3 U6 L5 J1 c
   udelay(100);0 j4 }4 Z2 k0 M; b
   printk("open success!\n");0 I, y# L2 R* K' d1 P
   return 0;
) V% \8 W5 Q8 p! o' U6 `' h( S}( b8 R: E3 I9 s8 s5 }
. R) c0 F( a4 f0 I# l
static int mcbsp_release(struct inode *inode,struct file *file)7 ~* n9 n. }$ D
{
& ]( q  j3 w, L$ l9 ~   printk("release success!\n");0 u: p2 J8 O' P" R4 j
   return 0;
- y/ h! j/ L- O) w" C}- l: G  Z. @+ ?- s
- a" d% _& h$ ^. `% g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- A. o' K# E) ?  _% j% J! p{, L* o2 G- c1 S# H6 @! W
    copy_from_user(&DXR_data,buf,len);9 s& O% n( I2 I! P. u, C
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. C/ n. S7 _. n4 v+ Q% k1 ]$ P    return 0;9 t; \# C- _  f. ~9 a' Y/ x
* N* U5 o$ Q8 T1 \, U+ m6 k
}
& A# ^: a, y: ^% Z7 ?% u. a5 q; h8 g# V0 t* p
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' V" H# P4 ^5 F# j9 f; o
{
/ B9 s: j7 Y  M9 k7 ~- I   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. ?0 k! p8 F+ o8 l   copy_to_user(buf,&DRR_data,len); ' @$ ?$ l9 [) v  A2 T7 t
   return 0;
- s. C' r  }' M0 C}  _5 u! E7 p2 {8 _5 S# j, ~3 [

2 o3 I, g( w1 u5 G2 F. ~$ f3 T9 ?! @. v. E+ l: Q7 ]2 [
static struct  file_operations mcbsp_fops=
6 Z  k3 c& y9 o{1 F7 l" f# X* O9 y
   .owner=THIS_MODULE,
( X7 \, C/ c( R   .open=mcbsp_open,
5 u# ~- S4 F; b0 V7 c6 W   .release=mcbsp_release," _/ ?  P* w# x
   .write=mcbsp_write,$ y3 h# l! ^& w4 U: w
   .read=mcbsp_read,
$ N' Q: K; e) l# @4 M/ ?};
/ V1 e% Q6 o* U% H- D& ^7 rstatic int __init MCBSP_init(void)
1 L/ z5 i. Q. \! ~  U3 y{3 w7 O4 z. H% d* L6 _4 X% q
   int ret;" l! F- ]( r. K+ Z5 ^
   unsigned  int   PINMUX1_REG_old;
) S& y' o8 P0 B+ G$ e" }( A   unsigned  int   PINMUX18_REG_old;
' J: z" z: X; O0 {. E# D, d8 ?# X   unsigned  int   PINMUX19_REG_old;
0 Y: X2 o; e% @+ p   unsigned  int   temp;  
. n* o. d1 R2 Y' M, a   if(MCBSP_MAJOR)
2 z$ y2 T6 K2 T  r   {
0 v3 B0 [7 h& ^7 j- l2 D      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 \; \2 E9 c# q7 O
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- ~5 f  J: r, ?3 `: E; {- c
   }
9 j1 R1 w0 f$ j% a7 v   else) }  ~0 R) ]5 s+ A4 W$ m
   {
6 W5 i! O8 D' |) M- q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 J" F9 y! ?) ]: z. f1 O      MCBSP_MAJOR=MAJOR(mcbsp_dev);% `# f; [' a$ G( ^9 M$ Z" ?
   }
  m. z- A: V5 O+ j  C   / L  V9 E9 Z  }7 B
   if(ret<0)
9 a: x, Z% B" H. T: d   {
# T, ?" n, {, r+ h      printk(KERN_ERR "register chrdev fail!");
" c6 C& r" G; ?9 j# F! Z; [      return -1;
* \6 h' X+ W5 p+ y0 `0 ~" y   }, W8 B, _3 O( U: S, j* V# l7 s, _
   
, E$ X, L% r) O   mcbsp_cdev=cdev_alloc();' }9 P( [2 _! F1 ^
   & S1 Y5 R, v9 d+ @. h- `
   if(mcbsp_cdev!=NULL): G* G9 T' B9 x) O6 B, `
   {2 e+ p0 R  w( V  u' ~
      cdev_init(mcbsp_cdev,&mcbsp_fops);' [' R' e, X/ ^# S1 W! S% l
      mcbsp_cdev->ops=&mcbsp_fops;; D, f0 w! C4 ]! c& y& }( b' J, Q9 m$ c
      mcbsp_cdev->owner=THIS_MODULE;
( H) k$ |4 ~, `, R& R      
9 U& v& [* z; v/ e" l# e4 L      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H6 q: ~0 s$ m, [8 y# B          printk(KERN_ERR "register cdev fail!");5 l2 m4 W$ \3 q9 I$ a" X& q# j
      else1 w+ U5 T$ x2 \. h9 {
          printk(KERN_ERR "register success!\n");
, W; W$ q& Y2 ]0 n   }6 a( K4 Q# \( E7 }+ Y! _
   else3 k# }3 f# r' W7 F  x7 j& V
   {4 _( d/ b4 k- _2 y3 t3 _
      printk(KERN_ERR "register cdev err!");9 d9 A! o; ~- p
      return -1;# l4 M* x$ g" h% i6 v
   }$ p$ H0 d2 c. b  v" I5 a2 S
   
8 D5 u; T) V" X3 c' a. u# F9 {% I  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! l4 }: a5 z7 ^; k# E) S9 ?% G
   if(IS_ERR(mcbsp_class))
7 S- n" U5 U& v* g   {5 |8 W* I. a: K. `3 g( |
      printk(KERN_ERR "register class err!");
) M$ o1 v9 [& M6 ^& ]# C   return -1;
3 A5 p" w: H" Y+ w. R1 x   }" J: j( J# ?' v  D2 T- M  v) m/ p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 u! u$ r- s  }! t8 Y3 e! i) V( Q: e7 w% \
   //PSC2 I- ?/ ^5 Z* U$ Z
   //add Enable MCBSP$ _% d9 ?  ^1 [& C8 Z9 t: ~/ \/ h
   //test
( j+ k! G1 d8 R) w' \$ x$ c   temp = 0x80000003;0 H6 |  V9 j  H2 U" a" [5 i
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));, K8 Q0 R9 r, T7 E, e6 p
   temp = 0x00000003;% a  G, D+ h- k
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
% ^) c2 C5 p3 m, M& y - ~* g1 x7 n6 j, P' Q0 N$ C' t
   temp = 0x001FF201;; q8 X. O0 F! B* F$ _* E3 H( p
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 v9 a8 E, \0 {
   
5 V  q' h! }; s. N9 L7 W. h   //PINMUX  
( F* ^/ h- e) u8 f" d2 k   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,, W& p  K5 t( y4 s
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
( L' e$ W8 n/ N: T% r   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ( _5 L$ P* B) e2 O- c/ k4 m
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" ?: G0 @) w/ N( u) v   
* m% A* @; L4 J) U& G/ v/ {+ D   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 @/ a- Q0 m0 j2 A1 \6 f   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ F" }+ I7 j! k. l( ?   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
* L$ [9 h4 Z- Q5 s   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- I2 [' j" \7 X! f9 d 7 t- _/ i& L& N+ i' c% K- C7 k
   //RESETn,L138_SHK2
3 F+ K6 \3 [5 `& A4 o   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 u0 v& Q1 O1 v- C
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& v" Q' _1 c2 ?! ~2 @9 B- R   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: M+ C+ h2 \8 l( w . {& t- A+ I5 h  X) r) ]# H

) t6 x& U& u8 |' g- @4 c- [  //SPCR Register
# J6 p% J/ _# j/ W; f2 ^6 `  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ H6 ]) ?4 ]9 Y$ \6 b
  temp = 0x03000000;//(DLB=0)/ [) }' Q; ?# @9 l! j# U
// temp = 0x03008000;//(DLB=1)' j7 x$ @5 W3 X
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- u3 J& I' L3 _& A0 _) B  temp = readl(IO_ADDRESS(SPCR_ADDR));- h9 F! z: `& q; ~- \; `
  printk("temp=%x\n",temp);
7 S) ^3 L! D7 ~  n 0 d* c+ `0 e: R( c, d% |" B, I9 q
   //PCR Register* s0 {1 i4 ~* W! P
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% u: W5 J8 H* I8 C( A7 r
  // temp = 0x00000F0F;
$ ~4 O% S" w/ I9 @- {# E  temp = 0x00000B0F;1 _' E3 P1 Z8 d! g, K$ J* s* C
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + l) q+ [5 S' g9 N# y# H: M) \
  temp = readl(IO_ADDRESS(PCR_ADDR));
4 O( x0 E5 o) _# b2 s  printk("temp=%x\n",temp);  
( T+ C- Q  f! w   //SRGR Register
/ h; ?& m9 Q6 V2 @! d   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* _& f* C" f5 Z //temp = 0x301F000B;
2 @# e" j% D& R   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' N; d  V$ d: u8 j. M' @0 H
  temp = readl(IO_ADDRESS(SRGR_ADDR));
: y) ?; D6 _3 y  printk("temp=%x\n",temp);
6 j8 T  P% e! V4 k4 Z   //RCR
# V# c! ^, B3 f1 D( e   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
! ]' K+ n8 d9 z$ ?8 g7 R. |% f   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; [) O* n& s, B3 f' ]
   temp = 0x00440040;
! J8 _1 R" ]/ D+ j2 W2 ~$ e+ K   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 U2 k0 y9 `1 m) y6 ]  w  U* R4 l- t   temp = readl(IO_ADDRESS(RCR_ADDR));
' F2 b8 `9 ^2 B; |! l   printk("temp=%x\n",temp);
1 s0 H5 T% s2 P8 w6 A: o   //XCR% O& }/ p3 L. q  G
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, A9 }( M2 B5 N* @# c: w; ?+ d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' n' `3 B/ f6 F1 D2 h   temp = 0x00440040;
  u' D8 x  H7 a) \   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   3 P; r7 i# [: k8 a8 c2 K
   temp = readl(IO_ADDRESS(XCR_ADDR));, o8 |, J5 d- y  d4 R
   printk("temp=%x\n",temp);
3 ^/ R. D0 j% C$ S7 T4 }  udelay(100);
% d- Z. R& u4 w4 C' [  //SPCR Register
7 Y3 Z( Q. m+ R- [' {5 ~  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 I" {, i+ J3 [; h6 w' \7 R
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: m, e1 G" X4 m
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
! m1 L6 }2 ^3 R7 q  temp = readl(IO_ADDRESS(SPCR_ADDR));4 @$ V# P& c; X. D4 _: c
  printk("temp=%x\n",temp);
9 H7 p1 R1 F: o0 h5 Y  udelay(100);
, G$ A& _# J7 c% Q) r% S2 a6 `
& U' N9 ?5 @! m8 M5 o" F9 X6 T  //set GPIO direction
% E; E! b& _: |! A2 c1 [0 x& X& F3 u3 D   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! {- T* S2 I# Y* D6 z, F4 `, p   temp = temp | 0x00000100;//EPR----input% ?3 c/ \9 j4 Q6 u
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; P2 M5 a4 m9 o9 Q/ X0 Y: g   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 K" W1 G! v) p% D# ~) i

! A. w0 w2 Z: K" M7 H- m$ Z6 x3 I3 t   return 0;6 O* E' @" g0 x4 I; n
}- F5 ?( x" E0 c, W1 ~" ?2 |6 p
static void __exit MCBSP_exit(void)
  u: x9 _3 ]7 G{
2 H+ x2 G7 ?# E6 W   printk("mcbsp chrdev exit!\n");
$ P7 \9 L) |' {6 {- Z, t% d   cdev_del(mcbsp_cdev);
: _# c+ f- k; m! }   unregister_chrdev_region(mcbsp_dev,count);* V9 V7 R  L; `9 ]% ]* p- k  @: Y( d
   device_destroy(mcbsp_class,mcbsp_dev);
3 w$ E  k$ c5 p# ~9 B   class_destroy(mcbsp_class);
- S9 D, [( e" V$ d6 x}+ v$ u; E! t& t, \: v  r
module_init(MCBSP_init);# P: F7 M) T  O; W
module_exit(MCBSP_exit);
8 c) U9 K7 G7 \3 R1 ~% |7 x) T% O& {! E1 B2 h9 d  t
MODULE_LICENSE("GPL");/ U* h, C7 v. G  x

0 @# P1 C- a% K1 b# p我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' f  @8 B1 ?3 u  c# q% D' j我的应用层的测试程序如下
( Z, X" J& E1 F4 {# u  Q5 N: E  a#include <stdio.h>
, G! e* f( ^' W" u% {#include <string.h>, q2 U" c! V3 n
#include <fcntl.h>
8 s  A3 [% e) y! G( [' X3 h#include <unistd.h>7 h% I0 v  }% o
#include <signal.h>( }5 c' b% R4 x% m2 Z% T
#include <pthread.h>       //线程7 {% Y! w$ L5 k
#include <stdlib.h>0 j# X2 P- z4 t* C' Z) @9 O$ d
#include <pcap.h>          //捕获网口数据: o. v8 c+ s3 o# s  b1 `6 S* [
#include <semaphore.h>     //信号
' ^+ R) i% l6 k# s; c#include <sys/types.h>     //消息对列- w  q$ h1 N# B" b$ t: B$ c2 X  ?2 u
#include <sys/ipc.h>       //消息队列* a  \8 ^( Q4 v7 l
#include <sys/msg.h>       //消息队列* d" n( d" F- q9 a: M! V
#include <sys/select.h>
( s: N3 y" b8 T% y1 m% Z#include <sys/syscall.h>
, Q1 |& Z3 a* _2 q, P. E#include <sys/stat.h>, F/ e6 t; M. U6 ?& K% @
#include <sys/mman.h>  c. f. F$ _) }- g- u/ H
#define msleep(x) usleep(1000*x)0 ?. k5 l4 {7 @* i* A

6 x2 a, R+ b1 K9 Fint main()
/ r* w0 O+ ]$ ^; _1 ?# L{ $ o' G6 P% q6 ^: B; S$ _, s
    //MCBSP,ARM与AMBE2000交互设备
, O( @* i9 O/ c/ P int fd;3 D7 }7 g) ]2 `6 ]9 R# j7 D
unsigned short data_write = 0x5555;
$ y1 U/ F& i# f5 ?- m, d) W$ }! Y, y unsigned short data_read = 0x00;" k8 Q# T0 b- g: l& m- S
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ a$ w6 t7 v: @# n" Y
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ {: F2 N! E! m4 H; Z' z
   
0 l4 D# i# p6 O) t) \  if(fd < 0)
4 M8 o0 |( w7 y. G3 N- f7 l2 ^# Y5 b  {* V" e( }' H) n6 \7 O
     perror("open failed\n");9 U4 ?! p. J3 p6 s+ @' }: Z
     return -1;
, v3 f0 h0 c* w! q6 D  }
1 Q6 I8 [% M0 @  e. X  
2 p5 }; ^" J9 {) P# A  m" V  while(1)
5 I. y. I( r! O3 r$ V1 I  ], A  {
/ J( y- v/ L# t   
& c. E9 W5 H" _. A, n   //AMBE2000每次读写是24个字为一帧
4 K3 a7 t( L  p" w. C- @' ]6 J/ ^   //写数据时将数据在底层存储起来,等到中断的时候再发送
% {  F! s) O- B1 u, n* j   //AMBE2000输入数据是以0x13EC开头的5 r$ B3 `& P5 ^3 ^+ J8 {
   write(fd,&data_write,sizeof(unsigned short));
5 c% r  I5 `) h! }" S5 }9 `   8 n% Y" [3 L* n3 X
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 G( H% z. a% c. u8 x
   read(fd,&data_read,sizeof(unsigned short));
6 C# I6 `; U$ y& v   
* M' ]* P( V# x5 A3 r7 s   if(data_read == 0x13Ec)
, j. H! e2 v' G   {+ `' `, g: T' I: H0 ]& A3 g0 I, [" e
   
8 f# ~" W8 U! ~; P# r1 s  [! Z    printf("data_read = %x\n",data_read);' O7 r5 o' ?. W6 X
   }
/ O9 ~9 J/ \5 e   
3 \6 n6 L2 T7 U7 b: l  P0 f0 P$ I   msleep(10);& W3 N  U! {8 [9 l
  
) K, B% A% W- l2 @  I! P; m  /*/ R# b9 ^/ F+ D1 L4 ]1 u, r. X( A7 C1 i
   ioctl(fd,1);   
. i7 Y( i7 K" r  i9 C( H sleep(1);3 |7 A3 f5 J# I- F7 Q8 x. c
ioctl(fd,0);  f( s4 |! p# v* `3 B
sleep(1);* ~. ?# c% G; u* M& t
*/
3 B4 p, X# ]% H* R  }   4 Y4 t7 m! i$ B0 Y) x5 m! Y
return 0;6 _& D- |5 ?( y/ D9 W! t' V

- g1 o0 C+ h# R/ {  a& }! H}6 J. _; Y$ K; o) N
0 @, c* T! v) A2 D& n' G7 d% q
多谢各位指教,谢谢! 急: d3 f( F" U2 D; W/ F! B. f
; h+ D0 S2 C" X1 {* L, A

" G- k4 n0 k1 x4 y3 ~% H" i$ n) _/ @0 ?) _
3 Z0 q2 q( u# Y8 m5 ~; b3 |/ K
9 n: s! s- x+ K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 07:07 , Processed in 0.043118 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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