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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; V* C0 K7 p; M
/*' H% |. U- w0 \! v  m3 |3 U4 n
* Copyright (C) 2009 Texas Instruments Inc: _. w) d3 @6 x; ]
*
& J0 p- b7 G/ B! v * This program is free software; you can redistribute it and/or modify- l% u4 `  P& R5 _: h  c1 l
* it under the terms of the GNU General Public License as published by
# C1 n$ g4 {' F! R' v- G, h * the Free Software Foundation; either version 2 of the License, or% o5 y) w9 F. S8 b! e* t
* (at your option)any later version.3 N' a$ ~' z4 T4 g3 G
*1 l4 G7 a: O( Z5 `; t, P
* This program is distributed in the hope that it will be useful,
' X5 r; j5 p+ |4 A4 u% H * but WITHOUT ANY WARRANTY; without even the implied warranty of9 U$ d. s1 q' D. i
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' ~  l9 `& o( M% O% J- I * GNU General Public License for more details.
9 x. n- M. o% A2 o1 E# P1 e ** s$ U0 h0 E7 {" y8 s
* You should have received a copy of the GNU General Public License- C; w8 P1 H" v% K( X
* along with this program; if not, write to the Free Software8 ?* }: q9 h, D! D; v) j
* Foundati
4 L) ^4 I' \% p+ F' \. a; r*/
- B) n, L5 a2 Y* p#include <linux/module.h>
: C- L0 h+ E2 x3 i# L#include <linux/init.h>: E$ a0 s( P8 `- Z1 P" e
#include <linux/errno.h>1 i% g; _3 z. J
#include <linux/types.h>
8 w% [( R" u' `8 q' d# y#include <linux/interrupt.h>
4 u; g* H: d* Z: W6 X8 s2 {* K#include <linux/io.h>; D0 M7 k! }3 @* w3 l
#include <linux/sysctl.h>
) U2 h; ~; \0 ]2 }#include <linux/mm.h>
3 u1 l* V# c6 j+ R/ D$ b#include <linux/delay.h>' @+ k* d4 h) p/ M# O! G7 V
#include<linux/kernel.h>, {* q8 K+ t; v, S+ R7 ?
#include<linux/fs.h>/ F6 j3 t- W& T) t
#include<linux/ioctl.h>
2 [, h: K& {- W* ~( D$ L. N#include<linux/cdev.h>! N: V' P2 i! S) P( h  D2 _
#include<linux/kdev_t.h>) |8 n( e) h. y6 w/ T, V5 Q5 V
#include<linux/gpio.h>
6 J  r  N- J8 k#include <mach/hardware.h>2 i  G, q. ^" [+ e4 d
#include <mach/irqs.h>8 T% k# n$ z7 {  r$ a, r! ?3 l* D! n

% ?& [  {! b1 H2 }2 Q8 }' V8 S4 H#include <asm/mach-types.h>
8 b6 h. Z0 Z. Y  p0 |#include <asm/mach/arch.h>& B* k# v9 e# j  V6 v
#include <mach/da8xx.h>, Y1 h" M; d2 C9 j% L- W# U, N
#define  SYSCFG_BASE   0x01c140000 L; a( _( f2 i, Z& ^9 k8 [
#define  PINMUX1_OFFSET   0x124
* r) `( y4 x" F0 x3 [#define  PINMUX18_OFFSET  0x168
5 T5 u; ^) S9 w. n( ?( S$ }, t5 ~#define  PINMUX19_OFFSET  0x16c
1 x. c2 m3 n* L#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
- Z( {  p# }4 g8 i% X& U2 ^' W#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ A4 M, F$ k5 r#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
, ^% k& E5 }. F1 _$ M#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR/ L/ }/ F. n. a3 F9 m
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
* |+ z: X+ w7 \# q$ R/ T                           
( S" _8 H  E  [! g7 H4 {#define DXR_ADDR      0x01D11004  //MCBSP1_DXR) h) ^( p( u. S. H2 b' X
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% \% J, h3 |* ]+ F/ p( B
//PSC& t  d. [/ d& P  Z0 J7 m7 h
#define  PTCMD_ADDR   0x01E27120  
! g$ L8 f! U" R+ i3 H6 f0 K#define  MDCTL15_ADDR 0x01E27A3C0 l% C( x7 ~3 W
#define  PDCTL1_ADDR  0x01E273047 p' }1 B  j  l: R  u1 y4 M9 F
//GPIO8 direction
# ?+ R  j8 ?3 G8 q6 B#define GPIO8_DIRECT  0x01E260B0
% e8 e- G' D0 g#define GPIO8_OUT     0x01E260B4
( Z$ W; Y( Z4 N3 e+ W# T#define GPIO8_IN     0x01E260C0  J5 @4 o6 g& ^; b% t" @' B
1 L# D8 w: c: ?0 j+ U7 W
//#define MCBSP1_RINT    99              
# C. J) S7 w) M* s//#define MCBSP1_XINT    100  
- ^2 B0 `8 V' l* p; U& G/ hstatic int MCBSP_MAJOR=239;
, F1 @$ Z. w) @( Astatic int MCBSP_MINOR=0;9 ?1 o7 W5 Z1 L5 O6 E
static int count =1;! ?3 V9 W: b; z

( m# m/ s- @, ^" X#define MCBSP_NAME  "MCBSP-device"
$ M. C8 E' I/ l* u/ B7 D6 Y
/ z2 t3 Y4 O% Q9 X$ m8 G  Nstatic struct cdev *mcbsp_cdev;! c* @! \0 x, b' Z% w$ U- q6 c
static struct class *mcbsp_class;/ d8 S( w  g+ K: `! u
static dev_t mcbsp_dev;" S+ o# W( G% @# ^0 a2 n
unsigned int DRR_data;, R3 I: `. O8 a4 N
unsigned int DXR_data;
# V' v) o& ^- ^3 `6 hstatic int mcbsp_open(struct inode *inode,struct file *file)
; D* I& o" J/ m3 X{
+ `( f1 s; o1 Y   ( K5 z4 L% i% N0 o* l
   //interrupt enable,initialized
& P, G1 ~& T3 |   unsigned int temp;' A0 \# q8 m3 y( g* Z
   //SLEEP_EN(GPIO8[10])---0
" z5 a8 m7 O0 r1 Q. x* {+ X; O   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; V8 w, a9 o0 j- _# I+ H" B* P   temp=temp&(~0x00000400);: `$ J8 z+ e% O0 c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]# q$ y7 q& Z8 G- F% Y' u
  //RESETn(GPIO8[8])----0----1
4 M1 \4 ^8 I; [+ X- f   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, i, }; U# O" e0 H# W' v: M
   temp=temp&(~0x00000100);
% Y. @- \3 i& S& n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---04 U7 K- G3 a1 W4 e9 D& C
   udelay(100);
+ t/ M! h9 }2 R* w0 Y* j' @   temp=temp| 0x00000100;. f- I7 W$ S1 x. Q/ ?2 l1 X
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 d  q! Q& `3 f6 C
   udelay(100);, ~* {" g5 ]- ]- J
   printk("open success!\n");
! ~) b8 t# R% j2 t- P0 T' u! P" S   return 0;. @9 X( x0 U. o$ B
}
' I# ^5 r7 a: O2 B( U! \7 p* Q5 i" I
static int mcbsp_release(struct inode *inode,struct file *file)' I; J6 [& }- Y. _; Z; h) f
{
- h" }% V8 H" Y# S1 k9 l# e   printk("release success!\n");
: S' @+ D- q% t  b4 `   return 0;
' p% A. R! j: n& g8 t" M}
( ]. {4 f7 V, w$ B8 |7 _
: H' E8 J! K; o: u- v6 ?, Z' @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, ~4 i/ Q/ n$ y$ o( E  U. T* N{
" G+ u1 O7 i3 s, j6 a6 ]7 O    copy_from_user(&DXR_data,buf,len);! h1 I3 R4 X# [% {5 M. w. s4 [4 N2 X
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) g7 g* t: b, n, p' f    return 0;4 o# K; |6 ^5 S& N; N2 J
6 N- _0 X6 g4 M2 x2 n7 o
}
( e8 a- K" S. a6 z+ {' m9 z: z% z
0 x+ j) X" m/ U8 cstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 L( a& N; @, b) T: q( i
{
" Y- o3 H' L+ t) D% u. N* C# ^3 O6 p   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; e3 O2 i$ P8 a4 Z. a6 p5 z
   copy_to_user(buf,&DRR_data,len); / Z+ T8 [: g$ T+ K
   return 0;9 G* e( a2 T, X0 S$ ]" E" h' \! _
}
! g+ Y, [0 a9 f) b8 Y5 |# B, r1 Q1 ?: |& o

  I* t* J& |- hstatic struct  file_operations mcbsp_fops=
8 x$ ?' W: L5 X+ ~8 c, P{4 @7 t& \" g) Q* J& v
   .owner=THIS_MODULE,. Y# r0 l  {7 _& p3 q) ]% Z
   .open=mcbsp_open,
  z) ]: b# N( ?# s) k8 t9 ~9 c0 G$ n   .release=mcbsp_release,
8 @1 s: J4 R- {- I; i   .write=mcbsp_write,
' h3 b' D; G( \5 h   .read=mcbsp_read,3 Y, T- Y" h; |( `) |& A
};
" G8 o: `; N) n$ Q7 J' R  Kstatic int __init MCBSP_init(void)
9 w; u5 v( w5 p, M{
% L- A! h$ }- i9 Z2 k, w   int ret;
6 Y- Z0 |  c$ L- L2 G& N   unsigned  int   PINMUX1_REG_old;
7 S: ^' a0 d# `) {( ~8 \# A   unsigned  int   PINMUX18_REG_old;( `8 A2 D, L8 P
   unsigned  int   PINMUX19_REG_old;" _  Q: M2 g0 p5 s: X. [. i
   unsigned  int   temp;  
# e9 S& i; q' p3 r% t. d2 B! ^   if(MCBSP_MAJOR)
. C8 Y3 w  V; i3 X% w   {
; g; C0 _+ j3 p0 `/ S5 o      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- V- e8 E. \' V3 h      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);. W- _- L# s+ p8 X
   }
! H  P, @, n0 _! n; I' G4 j( Q2 q   else
  f0 y; U4 F. f   {" @/ |% l& k9 ^7 T7 q; B2 ~
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);# t* H- J/ l6 \" X% X$ I6 q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, W8 b, `! B4 @" Z) |( L* W7 O6 V   }
# L- w3 P7 J2 G   6 ]6 y3 F" L2 ^, g
   if(ret<0)
' U0 T3 C$ n) x$ Q& Z   {1 f# N; E8 w6 I! p1 q
      printk(KERN_ERR "register chrdev fail!");
& L1 p1 |% m. t- @! T. H) q      return -1;
; U; R4 v, T# @, v6 F3 F4 D   }
4 s( N, A+ ^* I0 e! `. }& n   4 z: a1 e; N6 s' i
   mcbsp_cdev=cdev_alloc();; I4 @! E! C) `7 M: t4 J2 M* k4 e
   
' F) {- R3 S0 I4 }8 `: W; U) F   if(mcbsp_cdev!=NULL)3 v( u; ^; Y$ n6 j, p0 W$ I
   {
" x/ o+ y5 O. Z/ J, p. l5 a' S* P, N      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 U) e/ G4 B0 h( u0 S) f      mcbsp_cdev->ops=&mcbsp_fops;
0 Q1 b$ o" f/ y. z6 _      mcbsp_cdev->owner=THIS_MODULE;
6 ~: g/ l5 t5 e0 p/ V      
, Y+ P9 A6 Y+ X* ~! X0 l      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
7 F7 ]. d- B* y' y. {          printk(KERN_ERR "register cdev fail!");
4 z* M+ y( `0 c) v* X      else
$ Q+ n! W2 {5 x0 V2 g$ L          printk(KERN_ERR "register success!\n");  b6 _- ?* E6 q7 t- x
   }
4 t- u  R8 ^9 S) N7 o" b1 n   else: j9 K; |1 q2 A! {* X6 S& t
   {
, @' N& b4 J) v- N/ v+ P2 J% x6 C. p$ r! f      printk(KERN_ERR "register cdev err!");$ t$ P$ l1 ^: j. y
      return -1;+ K/ l3 T8 {1 {7 j! ^6 g( z3 x% {; `
   }
- _& r9 I  j$ B) e9 ~# C/ w% Z6 `   
3 F2 ~+ R% G3 M. P# ]  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# y  M: U- F' j* k1 c
   if(IS_ERR(mcbsp_class))8 Q7 V& l& {% k5 ~& X9 R8 I( s, E% Q
   {
" b* h% b% A* s: P. c- w3 o: w# `      printk(KERN_ERR "register class err!");+ N1 r  r9 J( I, r2 g
   return -1;
( N1 v7 E% k( m- }: }$ l   }4 T2 u0 I/ R9 ]( j+ t+ c7 k$ z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
9 L9 s& e. I6 F1 h) ^
9 @$ k9 Q# }4 y( [   //PSC
' ?' r& f) H; k! O, b6 k   //add Enable MCBSP
" m- u2 v( P" P; F8 v$ e   //test
# ]  L; p7 g+ ~& j0 c" Y8 y   temp = 0x80000003;; l* Y; T8 {9 t9 X: f; ^; {% j2 |
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; Y- x8 v( j* _   temp = 0x00000003;2 w6 R: w6 J5 t9 A5 B$ h% A
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
! t2 v9 X6 _  z* ^6 G9 L: ~ 3 X0 |' I- q+ n4 e3 q
   temp = 0x001FF201;: f6 V4 R9 e; G1 K4 e
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));% ]9 [$ h! {7 \' ?0 K4 t1 F
   
, ^9 W9 h8 k1 N   //PINMUX  
' I! L8 M) m- D/ I( {   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# X- S$ c% ]; S# E7 M/ f/ D4 x' ?   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 u& [+ E- A) F4 `
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   * ]% ?( t3 B  l& o
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 ^- |6 r; u  ~: c- @
   
* u; g+ z7 t/ ?& |5 f1 I   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ M3 \1 {9 b, Q4 ^   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
- Q( S  r5 U% `* N  N" z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   % _$ V/ v  c# a, [  ~
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ D7 Z* N; C+ r/ x ! s: N4 x# Q! j' `! u  C& R& P3 U
   //RESETn,L138_SHK2# f. |3 k- o, n: [# L# U
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
2 K: Q# S( p8 t' z/ _+ l   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   $ I; Y4 _+ K  H* o
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 z7 x+ _! Y# ]

& Z" A5 |4 n2 c& S+ h
1 y! `4 {$ Z0 a6 s9 `  //SPCR Register
+ [& V6 b  Z5 w" f0 M  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 K# h) Q7 M; Q1 h- E3 q6 c' H0 H( L* J
  temp = 0x03000000;//(DLB=0)0 m, f6 q6 D1 e
// temp = 0x03008000;//(DLB=1); m& S0 d$ }  E1 C8 A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset; p/ h2 q1 p- i# H2 T2 B
  temp = readl(IO_ADDRESS(SPCR_ADDR));! x3 }! G) Q& ?. Z) r  c* R3 c
  printk("temp=%x\n",temp);
- K0 F5 p- k. Q! J8 ^
5 K6 R0 N7 f( i! u1 j" B   //PCR Register6 p0 o7 H& _- N! E3 ]+ S9 H( U
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- N$ i& b$ u! A! T5 P4 n. d
  // temp = 0x00000F0F;
9 Z! ^4 f& {/ Y2 g5 a) V( L  temp = 0x00000B0F;) O& d5 q$ h& o0 S& B
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
2 ]3 m; V$ Q" E9 |  temp = readl(IO_ADDRESS(PCR_ADDR));
. C) c: N" P( h- `  printk("temp=%x\n",temp);  ! h/ X$ U/ L$ d& Z* D
   //SRGR Register
: Z- c3 _9 z4 j! a' A7 a) c   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
/ L- ?! Y8 ^) Q6 d //temp = 0x301F000B;3 F/ J/ n9 _% [. s3 t
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
+ R8 E, w; \* p- ]  temp = readl(IO_ADDRESS(SRGR_ADDR));
0 \  o/ N# |, T: b) [% H  S  printk("temp=%x\n",temp);6 {1 m: M+ ~& m# \8 _2 K, d1 V
   //RCR
  V9 Z5 p4 y* e+ ?4 Q" A. J' f   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 l- H3 u4 _4 t8 k   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' {* k+ s( v9 B) |& J& M
   temp = 0x00440040;
& O- Y9 d" |7 ~; i, V3 L, b% R   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
9 x+ Y+ j! j$ d% P& b, t4 }/ S   temp = readl(IO_ADDRESS(RCR_ADDR));
! [- ]. m- y( j; {   printk("temp=%x\n",temp);& Z) H2 b6 [2 b/ n1 b; C- S& Y# s
   //XCR+ |4 T8 C$ |7 `) R2 t
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ }* w$ t5 N3 o; A  S0 W5 C3 J   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. x- z- e4 u' L: ]. [
   temp = 0x00440040;
/ D  q7 I: }5 O, |1 ?! h, Q1 E   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; w( o! J! @: d* V( |! i& a( y
   temp = readl(IO_ADDRESS(XCR_ADDR));
4 {( M! ~% _; g% ~   printk("temp=%x\n",temp);3 o) \5 P2 G1 M7 T. ~, s/ m2 l4 F
  udelay(100);
  X7 s* Y) V  y% t  //SPCR Register
: G. ?' C* @8 i# v. a( m2 q  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, r3 J8 }% B7 ~* }9 A; @# o& O& \& [0 l  temp = 0x03C10001;   //DLB = 0 VS DLB = 1; k( }: T, h1 w" @- y, O
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
, `8 ?. K+ y# r" k2 A, b+ o( E, i  [  temp = readl(IO_ADDRESS(SPCR_ADDR));% V: [: `" c( m
  printk("temp=%x\n",temp);
, Q3 @) a, A9 y; `; S3 J" Z  udelay(100);% I$ E' l& J! q
9 S; W. I7 i! D7 f
  //set GPIO direction3 `4 Q3 \% D0 D9 w8 l1 I; e8 G
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 [' n" L' D- X* X/ q9 X
   temp = temp | 0x00000100;//EPR----input
% t% e1 O# Y8 v) w& p   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 x8 A5 W0 v1 o3 P; F   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
/ J$ y4 z! k  ]- e - B+ S. E7 G! D% L' [7 r- `2 {1 t
   return 0;8 f; v+ N* |* \) d( }" j
}) P* D  N2 X, {/ j! c+ ]
static void __exit MCBSP_exit(void)8 r; l) l+ X4 U1 j
{
/ e/ b# u2 o' s' e. x8 N   printk("mcbsp chrdev exit!\n");
7 h5 k7 X' E6 W1 i/ p9 G. r' O; M   cdev_del(mcbsp_cdev);
' u. }! L. B" `, o6 i* M   unregister_chrdev_region(mcbsp_dev,count);8 D, F6 ^3 g! y* t
   device_destroy(mcbsp_class,mcbsp_dev);
) [( Z/ y- [5 ]3 r; c% y6 c   class_destroy(mcbsp_class);
- p" q9 T/ u0 z& P$ Y* T9 H}; h8 }) ?5 u- k* \2 l
module_init(MCBSP_init);& H$ a0 |& W2 R. F* j
module_exit(MCBSP_exit);
  D! f/ h# J7 w2 f  u
( n9 J2 y* m6 v4 O$ U2 w- ?  zMODULE_LICENSE("GPL");
1 Q1 T2 k" s; K* u8 b; V. _$ V5 n, T# t
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# l1 V; k1 h) ?8 N
我的应用层的测试程序如下9 S/ S- g5 k2 d1 N* y( T- l- y
#include <stdio.h>
: i+ S( r) k+ ]. e( e4 H#include <string.h>% M7 I0 m  E4 |1 F' X7 @7 }  D
#include <fcntl.h>
- @' [0 J( j  m; x#include <unistd.h>
: Y8 ~% Z! d. d0 z+ T#include <signal.h>
. W$ f: K6 h. ~#include <pthread.h>       //线程, e, ?- ~) l# a
#include <stdlib.h>
/ D* v7 o" F3 b#include <pcap.h>          //捕获网口数据% D4 N( o" I) c7 w. G/ s* @
#include <semaphore.h>     //信号2 \. R7 f) g( a$ g7 u7 n
#include <sys/types.h>     //消息对列0 }1 z) o% W/ S& `1 e! e
#include <sys/ipc.h>       //消息队列
, [- l; }9 V2 x# E#include <sys/msg.h>       //消息队列
- A( m7 s/ W' C  a" k9 L- G#include <sys/select.h>! t& k8 P. ~/ U( v) `
#include <sys/syscall.h>  W, P1 W8 d( O5 j  t7 Y2 b
#include <sys/stat.h>. {' _. E) e* M1 `8 _1 _
#include <sys/mman.h>) x8 g3 @* E# s5 H7 X6 G' Z; J
#define msleep(x) usleep(1000*x)
3 n% U! R" c* a$ I% I0 f( ?& @, E) `# ?2 k7 s& A
int main()
7 O3 a4 G3 `, w) e, z{
4 y. Z  w4 N! w$ t/ I" m    //MCBSP,ARM与AMBE2000交互设备0 \, @  @" m# {; H7 S: z+ G
int fd;7 L8 y1 J* v* f! L3 Y. k
unsigned short data_write = 0x5555;) k; D0 o& `$ P% Q# ~& c' Y
unsigned short data_read = 0x00;
. J- [7 s& l  ?; |. W. h  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);- `) |6 Q) A" v  q
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" t) @1 x# }0 T   
; F/ ?# ]& v) ]$ }; ~  if(fd < 0)
8 Z; ?" R  J% V5 n* ]5 q  {$ {5 X' w$ Y; g3 R; ]5 ~
     perror("open failed\n");
+ N; U- M& j. _( W0 |     return -1;8 S( z- _6 h  \3 s: g. M
  }
  v& |3 u8 C+ e4 e4 M! h+ k  
$ g9 Z2 ^) e$ G  while(1)
/ F: ^4 p* G. B& U  {
1 `9 j4 {: z8 u6 y8 V   5 D. b) ]7 K7 X1 @4 `5 x
   //AMBE2000每次读写是24个字为一帧) g8 _$ ?9 V5 G, F6 B& J( c
   //写数据时将数据在底层存储起来,等到中断的时候再发送4 E, e. C6 C, s/ q; G2 C( I
   //AMBE2000输入数据是以0x13EC开头的/ \- w! j' \; D) e4 {  l8 Y7 }, y
   write(fd,&data_write,sizeof(unsigned short));
7 O) G8 }3 N- \# w, f0 I   
3 n2 g) V; U: T8 [# |7 ~   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
$ k, X; S9 m, A" @   read(fd,&data_read,sizeof(unsigned short));* N% l; h0 n: t
   : b4 N6 _. i+ v) N$ Y0 L
   if(data_read == 0x13Ec)
8 d; K% d( {4 r; t- m   {6 t) C7 f1 M" v6 N9 T* _
   
$ m3 y4 Q1 @8 I2 p    printf("data_read = %x\n",data_read);
- K5 q' M& l4 {; ^   }
* N7 O$ F' Q' y* o/ ?- `  W. E   
1 {. D# ~9 h' P   msleep(10);7 |& K. S% F; t5 C* H" S
  $ O4 g/ t% q( L5 X6 y8 y' q
  /*& X0 q7 p" v8 C9 n- _( C
   ioctl(fd,1);   + z# R; g+ N( l" L1 |9 w
sleep(1);. y& |7 }* x6 {
ioctl(fd,0);
/ @, o, j& Z0 M( I! M sleep(1);
, k% g6 H0 w6 f! P& c! g  E */
4 b) G* j0 w: W+ Z# k& C  }   4 {$ n& P# |! X+ j* u# x3 c" z
return 0;* A" s0 X6 y$ t4 q- \
& d2 R8 k# m; D
}
! B' C* _# r; v# ]$ ?8 d- R' ?, [4 F3 M$ h' H
多谢各位指教,谢谢! 急
& c+ _1 s0 `) h# ~3 O) q3 p* n
# r  e8 k2 {% G5 e6 C0 e# M; ]; T

. J3 \% S- s' j0 C+ z, T5 ?' g. r! n& U5 j

2 h$ }% M1 f2 a$ Z: X) ?+ ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-20 02:24 , Processed in 0.049716 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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