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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : V1 O& [: a& T& [  E& o4 f( a
/*
; y% @$ k. z( } * Copyright (C) 2009 Texas Instruments Inc
) J) O2 U; [- {7 }" @# G *
6 K5 I5 S$ Z) y, R+ ]9 D0 K * This program is free software; you can redistribute it and/or modify
/ I2 O# c2 F+ v5 O# e* i * it under the terms of the GNU General Public License as published by
: s. n5 _6 U. L0 G; ], `2 i+ `0 }% w * the Free Software Foundation; either version 2 of the License, or, G  M7 Y# }, h; u0 _: [
* (at your option)any later version.
0 C+ _  I+ M) z' c7 @ *' I8 @4 D" f/ I
* This program is distributed in the hope that it will be useful," |8 N$ {* \1 l% |* {% {
* but WITHOUT ANY WARRANTY; without even the implied warranty of5 M- s5 P+ B1 ^4 g
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 W+ K3 Y% i1 c! j * GNU General Public License for more details., K) a/ n( E/ S1 o
*
+ j2 j+ b7 p0 J3 m' O$ o0 ]" D * You should have received a copy of the GNU General Public License
! Z6 @: L0 r# E% k * along with this program; if not, write to the Free Software
/ L3 Y! z$ `2 o3 C/ q5 Z  j * Foundati9 S0 n2 U3 y( _3 K2 `( v/ `
*/  D/ m7 H+ h4 t) V
#include <linux/module.h>/ k3 _+ f! E( u7 ^* Y& R, {0 n
#include <linux/init.h>" N8 z7 C8 Z; X; B8 x" R
#include <linux/errno.h>
- y4 r! [' g4 i, v: M# z6 z0 z! K#include <linux/types.h>
$ O6 c* i3 Z! D0 p; [3 X2 h& k#include <linux/interrupt.h>
7 Y$ U! O: N8 m6 B1 p8 ^, n6 o#include <linux/io.h>9 w1 [7 p. f( {" ?5 T; }
#include <linux/sysctl.h>) h' \. `) s5 i! T4 H
#include <linux/mm.h>* N( x1 h7 B" t' N) [
#include <linux/delay.h>
3 o% s& i  s* Q8 q; B#include<linux/kernel.h>
9 z  h0 n/ N7 Y7 B#include<linux/fs.h>
8 F3 g) `9 e0 W#include<linux/ioctl.h>
2 U  p' o) j! L: |#include<linux/cdev.h>
0 v, q0 Y" t/ E: U7 t' v6 v#include<linux/kdev_t.h>. s( e# C8 B/ F% W
#include<linux/gpio.h>) Z* ]$ Z7 C. {
#include <mach/hardware.h>$ {! f+ Q. Q# y! C
#include <mach/irqs.h># X) O! }# G6 C. {0 e/ C3 Q7 ~  \

' s3 D  i2 }1 Y+ d; Z& r+ @9 ?, [0 y#include <asm/mach-types.h>) s4 j6 E) m0 C) Y& \8 }
#include <asm/mach/arch.h>
9 j5 i' I' y1 O( g- ~9 o6 d& P#include <mach/da8xx.h>  t- @8 A( N! S& [4 e& x
#define  SYSCFG_BASE   0x01c14000
/ ^6 r1 `0 d( N1 m#define  PINMUX1_OFFSET   0x124 2 {6 x; j& b- u
#define  PINMUX18_OFFSET  0x168 , B; q2 Y+ l6 z! o2 V+ l6 N
#define  PINMUX19_OFFSET  0x16c- @: y8 }8 N0 s/ t( ]# W, `
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ y7 K0 b- L" `: J9 J% W#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
8 P/ ]+ G- }0 t. _! ~# }% e" L& G#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
2 p5 \8 ]4 q4 @  ~( ^#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
; x0 W$ U) Z: D8 m/ S* U#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
5 u5 x0 i( e& _5 O: D* O& ]                            5 g9 G7 u9 l5 z+ @% x% v
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, p: n3 I+ B1 A! ^. P/ R
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR7 V9 b3 k$ i3 e* Y3 \
//PSC7 {4 N% y8 A* G+ g+ c' ~8 J2 x- S. A9 g
#define  PTCMD_ADDR   0x01E27120  
0 N! U0 `$ f# W" r1 P/ [: q#define  MDCTL15_ADDR 0x01E27A3C
  A( T# ?0 T5 L+ h4 y# Q, O, q#define  PDCTL1_ADDR  0x01E27304
  `: ?' `& q! U* m//GPIO8 direction  O! a6 w: Q( D% ^4 T' ?4 s
#define GPIO8_DIRECT  0x01E260B03 P) [5 a- D8 z6 [) {+ t2 N7 f
#define GPIO8_OUT     0x01E260B46 Y3 G( U; T, h0 F
#define GPIO8_IN     0x01E260C0* n: w# U( N4 U  x/ d
8 _& J) X3 Q- ~
//#define MCBSP1_RINT    99              6 W& o4 R1 \; d2 b" m* Y
//#define MCBSP1_XINT    100  6 ]4 U% K. o3 E5 |' E" ^; I
static int MCBSP_MAJOR=239;" J* X; _" Q/ _3 [) }
static int MCBSP_MINOR=0;# O* k* u% C: _9 }
static int count =1;9 M* M( V3 a* P1 w* p4 R/ }
* y% }( W& j: b, K+ s
#define MCBSP_NAME  "MCBSP-device"
, `$ m# B9 X- p' x, P
7 G+ C' O/ }! \2 {static struct cdev *mcbsp_cdev;
+ V9 v7 g/ k/ f# V8 j3 i, {1 ?: c- `static struct class *mcbsp_class;0 M# m2 b* O- n2 z8 a- x2 @8 |
static dev_t mcbsp_dev;/ {& z. M3 x) L! q7 x
unsigned int DRR_data;  c  `4 X# ?- W9 h& k1 H1 S
unsigned int DXR_data;9 }* t- L; A$ z% l7 `! i0 L
static int mcbsp_open(struct inode *inode,struct file *file)" {$ }( }! T! M1 e4 D( ?
{
7 C  {( F) d/ d0 ?2 V# ?   8 o! Z  O( H$ g1 R% Q! V
   //interrupt enable,initialized( h! G: i  r/ T. }
   unsigned int temp;, s$ C4 i! g6 T3 B+ K1 K
   //SLEEP_EN(GPIO8[10])---0/ P/ h! b+ l' C7 y, B& b' q( s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" k. V* n2 p2 m( \. |: \
   temp=temp&(~0x00000400);
+ t' Z0 ?) a& x* {   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' i2 i' B$ e5 m6 g. O/ w$ S! \& y  //RESETn(GPIO8[8])----0----1
4 U' ~8 n6 A7 V1 e7 M+ Z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: y2 c" M, W" r# `: `- C3 Q8 m   temp=temp&(~0x00000100);  m/ w, o/ y0 ]5 m) G2 r
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ ]- i4 S* x: N# u8 m! @* ^- J
   udelay(100);/ J9 g! i0 N. R! {5 i) A: M
   temp=temp| 0x00000100;
% A; M3 c" A9 V   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 T  W* @5 m" q6 r   udelay(100);
2 ?$ ?8 F# N5 f# {. I   printk("open success!\n");
9 a. W  c8 o2 l" p6 M) k' D0 L* R   return 0;8 Q1 ?) s, x( C0 ~
}
  {: r2 ]9 {, u' E. J7 z. ]$ ~( i1 U7 ?0 s* P, h' I- R
static int mcbsp_release(struct inode *inode,struct file *file)
! z" `7 P9 o* j+ ~% n{
) a4 O3 M- c# O& n   printk("release success!\n");0 E4 o9 g1 H$ M
   return 0;; P: f' m) w: m6 A; Q
}8 n3 ]; t0 `& P+ W
- a, h' l. v7 v: e3 a
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, e1 |) x/ R" u' D' |9 }9 U% h5 ?{: `$ ]1 b3 b1 m7 c2 c
    copy_from_user(&DXR_data,buf,len);
5 k! Q2 f( I2 l0 I$ F+ N' o    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       , f! w- `$ M7 @8 ^3 E2 M
    return 0;
1 B6 q; y* v! j& o% U
& A, r# V3 ?3 _+ r) \* B6 S}
! Y1 l8 Y6 q* Y+ u  L4 z( r! V7 d) k4 v
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* J  t9 G  C1 y: Z4 n8 ~# s{ ' k: |3 u9 _5 p8 ]" O* {
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 ~% u1 j  ^; w: `+ [! o% w
   copy_to_user(buf,&DRR_data,len); 7 q" J  x& s6 I
   return 0;
( W  ?4 z1 `7 n4 R; A# c! W}: O' f! o. }9 c

1 B' s6 j. |, h: P( j$ Q0 @$ y1 e4 D; m" `7 H) e) X; P
static struct  file_operations mcbsp_fops=9 L; g7 V: V" k2 H3 J6 W* A
{' g8 U/ m# A( ?& c& J* u( h
   .owner=THIS_MODULE,
9 L: T4 {! y1 q   .open=mcbsp_open,; Q$ V: @4 D  R* x) ~8 ]% V
   .release=mcbsp_release,: s+ c7 p9 s' d% X/ V; A  t. w- X
   .write=mcbsp_write,
6 p* }" h+ C; R( I+ G   .read=mcbsp_read,+ f0 P0 O* ?2 P& _$ v' T1 H+ r
};
7 G( n+ b4 L- u& R& z+ gstatic int __init MCBSP_init(void)* K2 i3 F7 I! h
{
- R$ w; V+ h1 T$ P7 R' D   int ret;
# Q  X9 E3 f) S2 y+ Y2 N* z3 q   unsigned  int   PINMUX1_REG_old;* ^" o+ m4 ?+ c/ L6 f
   unsigned  int   PINMUX18_REG_old;
5 U' F9 M1 `7 W% z/ }   unsigned  int   PINMUX19_REG_old;' B$ r% K" m* W. O  I5 P( J
   unsigned  int   temp;  
5 U- m; L2 g+ d8 h9 x   if(MCBSP_MAJOR)
) A  T7 l" E% W9 T" ]0 l   {: ~2 @& M. i( B) k; j0 G/ b! Q
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" R2 x7 ?  p  x6 A& m
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 E2 H" H+ i3 M, s' u& A( k9 R! u   }6 W4 L/ h) \- i; {
   else2 t) x4 r0 r8 F$ p
   {7 Z2 N8 I6 c) N- q
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; K/ S2 G- Z" ^1 \1 w3 p6 m: w' B/ T      MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 p( r% Z/ m" Q  v# o   }
+ m: n5 [8 B" T( j5 e, b   
5 Y) W0 c1 d1 c: f/ Q/ C. N   if(ret<0)
: \+ K8 G4 E8 ?   {6 t/ [: K$ d! m$ k. a9 e5 P* F
      printk(KERN_ERR "register chrdev fail!");
( v3 ^( w. J0 B$ o: z& C      return -1;
, W4 h7 {) c& d' \$ T8 `- A0 q   }1 T, K  b0 e9 x! y+ T& c
   9 g7 X' {$ X4 C0 N% f6 d
   mcbsp_cdev=cdev_alloc();! S$ F0 C+ r( Y2 X6 f
   ; ~' D, d1 B  D0 m/ r2 _
   if(mcbsp_cdev!=NULL)
4 P2 k( e$ |2 V! o   {
# D) B  {+ b+ D- s      cdev_init(mcbsp_cdev,&mcbsp_fops);
* W1 i2 `1 F. ?" X2 c" {      mcbsp_cdev->ops=&mcbsp_fops;
' [0 Z1 Z0 j0 L3 x. ?      mcbsp_cdev->owner=THIS_MODULE;
# H0 X' F, h: L3 s9 q7 ]      0 y7 u3 F$ B. m4 Y& P; z+ m( q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 o5 W1 l6 \) L( U3 k          printk(KERN_ERR "register cdev fail!");- l, U6 _8 V7 m% [3 i' N
      else9 C. K" z* F, Z- C# J7 ]
          printk(KERN_ERR "register success!\n");
' k3 r+ e+ J( u) ?9 P3 a8 J; P   }9 T6 i; j' F8 C! J! }1 z0 p$ w  o- F
   else
' p# M. n5 z. _8 T8 f   {1 n( d. K  N* {5 h
      printk(KERN_ERR "register cdev err!");
7 D  z& l! E) U/ T      return -1;5 E9 c+ Z) s8 @% v! C
   }1 ]; q7 a/ |& z$ r( u
   , X' F4 a, G8 h5 q3 e9 o
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& ?8 I, W) }( H9 q! ]' J
   if(IS_ERR(mcbsp_class))% ?3 O9 c% W0 `+ D% }3 P; P
   {
' F4 Q( z, m( ]      printk(KERN_ERR "register class err!");
% ~( M- H5 _$ S3 O9 a) T2 I! {) R   return -1;
4 r) e1 C1 b; b7 p   }
6 Q1 z/ u& W; h& u6 ~   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
) s4 ^# `( G: O8 P) {' {2 b' i
' ^! s, t, O/ h" `6 n  |   //PSC, F" T6 [$ v+ ^# u5 u
   //add Enable MCBSP% D' G# k/ s0 @( b$ V
   //test
& O) v6 t' f2 }" M* W+ Z   temp = 0x80000003;- w& ^: x1 i& e4 e$ v1 a! }
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));' o( \0 R9 R! j' T3 n
   temp = 0x00000003;
2 \% T9 O" @- N   writel(temp, IO_ADDRESS(PTCMD_ADDR));. `, z% w& E$ k1 y

4 v( [' D  {  R   temp = 0x001FF201;' _* J7 X" D& m# A6 e: i1 e2 g
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ n6 R+ }& A. K" G   
4 O- t, O2 J8 i9 k- G   //PINMUX  : |; S4 b8 L) w# T0 B
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( a4 a% D' g1 {6 o- q5 ~0 t   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  % G4 ?0 c7 P) `, Q; x9 J3 _& b
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 t+ {6 y4 G) r% b   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- z: j4 U) `; p
   # W5 ^" Y) t+ e7 E* _9 X
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; b( i' y. R1 l& C& L' T$ `   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ M+ s! j; C# {) b$ k   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
6 w6 f  G# C! Z" r* S   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) X6 \  k/ i  {6 ]" l; F$ w
* b! f8 H) q! s   //RESETn,L138_SHK2$ U% ]) e. X( w
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);    k- X" g$ O/ u; t, I# t- G" a  c
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , t  X0 j8 L9 i% J# D0 ]; o
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 R4 `- I) |3 D/ \6 c: ?# G+ i 3 O, y: k% T) j1 j( b
/ T; H3 F- H- k7 Z
  //SPCR Register( Y1 ?, n; z! c
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; r3 O' p5 S/ j
  temp = 0x03000000;//(DLB=0), s; p% p% t8 X0 T* @3 y1 `
// temp = 0x03008000;//(DLB=1)
) L2 f  Z1 Q! F' ~# l& j1 g5 z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% R: t" c5 A+ S3 \& K  S  temp = readl(IO_ADDRESS(SPCR_ADDR));
" `8 A( N+ C2 U2 }) g  printk("temp=%x\n",temp);" b7 H; X* O" l7 V5 }
/ i5 Q: k; M0 M" r1 o; k" M( q
   //PCR Register( v  n' d+ R: g9 P
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; E" D  z( S! G% }& B0 Q
  // temp = 0x00000F0F;& ^  _; a: _6 v0 v# |
  temp = 0x00000B0F;
' S0 r* [+ u8 D! X+ d2 K  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 j. K7 p( g2 t7 W9 ~6 O  temp = readl(IO_ADDRESS(PCR_ADDR));( U; P! k/ s9 i  I) z( x7 l
  printk("temp=%x\n",temp);  
2 q$ s' ?- _. G- t0 x   //SRGR Register
4 j% a# d  s# Z* D" N   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( h& ~  r0 L6 S: d
//temp = 0x301F000B;
3 I( J: j0 C3 P   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
1 F8 P( q* D6 m$ c, U8 x  temp = readl(IO_ADDRESS(SRGR_ADDR));+ i3 ^& x6 ~& m
  printk("temp=%x\n",temp);
: ~: H! M( X  c, c, a4 ?$ a   //RCR
7 P: r6 w. J1 K" }   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
; Q" e" c* G; t0 r* M5 P   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 p7 T" l) N( F+ P- P( H   temp = 0x00440040;: w, z* b+ G" H
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
" P- k# h4 ^4 K7 f2 m   temp = readl(IO_ADDRESS(RCR_ADDR));. E% l0 q6 _! v6 }
   printk("temp=%x\n",temp);* W6 E' W/ U, h5 A, Z% M
   //XCR+ }7 N, X7 S5 d! Q4 o
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 M' x( I& J# L& f1 C" f   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. R: O  J3 m% H$ \. ^) ], [) B   temp = 0x00440040;. f$ |4 P3 b7 F6 z
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 ]+ @! x' G) U8 {1 R5 X
   temp = readl(IO_ADDRESS(XCR_ADDR));0 R/ T5 P- M2 j9 y0 |
   printk("temp=%x\n",temp);
1 g0 e; H5 D; E0 f* e5 ]  udelay(100);
& i  N; s, F- f  S" m0 G# f  //SPCR Register
% I) \' p$ o. v/ H  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( T* v) m; V0 r! q& I( R/ m  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, Z/ c7 B, b7 ]1 Z/ V& L5 x  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
! X* h  M' j/ i  U3 H* f  temp = readl(IO_ADDRESS(SPCR_ADDR));
: k1 n" [5 P% P" R5 ?( ^  printk("temp=%x\n",temp);' u" d; V0 H% M% I
  udelay(100);2 N& v, _; D+ o3 f: O$ Z- a7 q
) _+ ~" I  O4 p4 Y" X
  //set GPIO direction+ U: T' }: H' v. \/ z+ f
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
. t* v- m1 O; k* L7 o' w   temp = temp | 0x00000100;//EPR----input
0 i: g; i5 g4 x6 }3 a  A9 j1 D   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& G; v- o5 b6 z0 l9 [   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ B9 e1 j% Y$ C. h$ J9 X- \ 8 `( v/ V9 D  q, S5 U$ e; _# V  y
   return 0;
  z7 f( r! s& e" g% F}1 b3 r. V+ u! x0 L
static void __exit MCBSP_exit(void)
  l8 m1 F+ z3 X7 L{, w6 y3 [+ [" o6 E
   printk("mcbsp chrdev exit!\n");
, H  K: F* H2 N: O% n5 N% Q/ [/ M( _  _   cdev_del(mcbsp_cdev);
5 Z/ H( v- P, G. m, \+ Y/ {9 \   unregister_chrdev_region(mcbsp_dev,count);
6 D/ |$ y, r8 A1 s% b% i* U   device_destroy(mcbsp_class,mcbsp_dev);" r/ l4 }. H4 Q% T$ c$ W8 Y( K# J
   class_destroy(mcbsp_class);: v1 W  _0 ~: k( F9 o
}! v/ ]# }7 O& n/ @) m1 ~" u4 f
module_init(MCBSP_init);* o- k* E# A5 o0 ]9 V: U" f
module_exit(MCBSP_exit);, F0 w  H9 V# ?

7 `( t5 U  D* G, DMODULE_LICENSE("GPL");
0 v: E8 G/ ]" p# J5 i; c3 ?* ]0 g: Q4 U% n: C
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' m7 J: e0 P& a' R+ q2 T) c
我的应用层的测试程序如下7 k) e. ^. P+ r& A8 P! t
#include <stdio.h>
  r) a1 w: ?8 }7 L. E#include <string.h>& c) _' H3 ?. I' ?& i1 x
#include <fcntl.h>
4 H/ Q% q3 E% y* }% a#include <unistd.h>' l/ D. N& |5 M) N6 w8 Q: S
#include <signal.h>2 g4 J+ D0 Y! w5 y% D; Z* j* M8 s
#include <pthread.h>       //线程! @# t$ I- T" u# t2 E
#include <stdlib.h>
$ j3 Y) K) V- e5 B. E$ Y6 k#include <pcap.h>          //捕获网口数据. e6 G4 h" q4 E
#include <semaphore.h>     //信号: l( k% p, r# k; r
#include <sys/types.h>     //消息对列  ~$ }0 |# }; A: ]
#include <sys/ipc.h>       //消息队列( V0 q( X- P+ J8 w
#include <sys/msg.h>       //消息队列( i* w& {1 I9 P5 M0 o7 R
#include <sys/select.h>- j% ^. y- z  V' O( y0 H% l2 B
#include <sys/syscall.h>; L& ]' W; y* m7 g) @4 d& \4 T+ a
#include <sys/stat.h>9 c# R+ v4 i' t0 |
#include <sys/mman.h>4 A( W; L. q4 X' S) ~: n6 T4 I, A
#define msleep(x) usleep(1000*x)4 A# |6 F& x8 ~, @
7 v& u- z" S- P$ E+ M$ o
int main()
  u# L& H) L( S{
) g' C5 j* D3 d/ |/ z1 ^' P6 W    //MCBSP,ARM与AMBE2000交互设备7 T& b& ]/ ^- i: D3 ]' R
int fd;
$ l; J0 v6 ]% |* n2 ^$ y  h unsigned short data_write = 0x5555;$ V2 @+ l% Y" `( B2 @+ d% f
unsigned short data_read = 0x00;. T- c6 L) ^  u
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 m/ q$ b& a5 i- a* g
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 R2 t0 G! k, ~! l, P
   
; P3 X( b4 J5 F4 @" M/ w$ I: E  if(fd < 0)  c7 m% `# \7 s) V1 K/ R# C& L6 q
  {
1 i  G/ Q/ t7 L* h+ _4 a     perror("open failed\n");
) ^1 y; L4 t2 ^- c* c' Q  U7 M     return -1;1 A9 ], M) Z+ D. q
  }
& _: K4 p6 U+ ?( T9 n$ \9 D  
+ N/ H+ a/ R9 q$ ^7 H% j. x5 l- ]! Q8 p  while(1)
) b' A. c& W6 t6 `  {
: `, K' `4 Y0 m9 X+ k; ?   
* O  N8 a/ H" Z9 a) h   //AMBE2000每次读写是24个字为一帧* L% c0 ~9 H5 P9 {3 U9 i. L" B7 p# Q
   //写数据时将数据在底层存储起来,等到中断的时候再发送
6 _2 ~" P3 t# R. g2 N4 p   //AMBE2000输入数据是以0x13EC开头的* E+ o7 S0 y8 ?7 W0 W/ Y: h
   write(fd,&data_write,sizeof(unsigned short));
" ~% n# E$ k) `  l- }' a   
" z, W1 L( G* p* |   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  * s5 Z1 B+ L" n3 U- g  F
   read(fd,&data_read,sizeof(unsigned short));/ G1 h: Z- J) A( W1 Q
   6 a& q( s3 B2 r# q( U  c
   if(data_read == 0x13Ec)
# F7 M3 T! I: T  G( X% o: E# u4 ?   {9 O+ ^- Y" e' x+ @# `: K
   
6 V/ E- n8 o1 j. R9 k5 W    printf("data_read = %x\n",data_read);
: M& k" S# R4 V( I4 m% }   }
; l& F1 `. j8 S) Q4 s8 ]   
$ J1 W( a4 E) t/ s9 N   msleep(10);
9 L  g5 D6 _9 b% T: E" h$ e  p  
$ l" R4 ~9 l* q  i; Z. G  /*
- o4 D. F, q* h9 \" x   ioctl(fd,1);   
/ A% S5 t/ h: Z sleep(1);
: a/ j1 s: a3 ]) P, w  h4 s$ t" r ioctl(fd,0);8 ?' Z3 X/ [: k9 L/ J
sleep(1);
4 Q  T8 P. p5 w */
' E8 `+ B1 E) j  r! ]: W3 w! p  }   # j) N" P/ ?3 v2 Z- R) h
return 0;+ ?* ?& _( k" C/ y
! S9 [0 F+ y1 z! V9 U0 g1 J
}7 |1 s7 |! T* \, s

4 L1 j3 w8 I6 v- H6 [$ b1 t) I; m多谢各位指教,谢谢! 急9 _0 f4 z: Q! {# e+ w
4 h) D, r4 V3 q9 E8 b. Z& _
' v$ F6 q/ v% f* k( i3 G" T
& R: X5 a/ ?- T. x

# E$ y1 d) W  p9 ?& b% i1 C
6 d) b# k) ~  d' t) b( p% p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 19:52 , Processed in 0.053944 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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