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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
6 ?( H( I, ]1 j' A1 z5 F5 G) D/** A7 U& S8 N$ ~% |/ S4 l
* Copyright (C) 2009 Texas Instruments Inc
$ i$ ?3 O8 [0 o) N# G0 |3 i; U *
9 c0 v# Y* D2 b* O1 V0 z. N * This program is free software; you can redistribute it and/or modify3 ^. b) C) A3 Q3 v7 d
* it under the terms of the GNU General Public License as published by
3 a  p3 q  r  ~9 t) X * the Free Software Foundation; either version 2 of the License, or5 d+ j9 {$ U) Z8 c! X7 V
* (at your option)any later version.
% R3 L5 Q' V" E0 Y *: F( U  f. ?2 Y4 {8 ]- J
* This program is distributed in the hope that it will be useful,+ M2 T: C$ k* i
* but WITHOUT ANY WARRANTY; without even the implied warranty of! y  p! Y7 w( d+ S1 C8 J
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9 x$ q/ t2 t7 {% y9 h, |
* GNU General Public License for more details./ z* J' U  ]. Z! z5 @
*7 S  \; ^& y! ~% _/ @0 k0 F/ h! C
* You should have received a copy of the GNU General Public License
5 O& l' ~% E0 E0 u) s, X * along with this program; if not, write to the Free Software0 I+ k3 @* W) n/ T+ H9 U
* Foundati
% M# A5 X" e, P( _*/
" |' |- k- C% q2 B6 N8 `3 k1 @#include <linux/module.h>
& N3 G) `' T& n0 D, X. f#include <linux/init.h>4 d$ G/ c3 z+ r4 w, [3 ]: q
#include <linux/errno.h>
; N) Z2 n! x: E#include <linux/types.h>
$ r8 _0 v4 b# @. |5 C/ W6 c#include <linux/interrupt.h>
, E8 e( G& g% }#include <linux/io.h>
6 @4 d4 q  {3 v% r9 R4 g#include <linux/sysctl.h>2 B" Q9 `* _' k: l# I* [7 ?# F
#include <linux/mm.h>
7 c0 _) M; @3 Y4 H#include <linux/delay.h>
# ~1 f5 S% t! ^; i1 E/ W+ N9 S+ V#include<linux/kernel.h>+ h" X8 E4 ^. a$ `! {+ s3 y; t- }2 ?$ Q
#include<linux/fs.h>7 f6 }3 }- M+ h' V1 P
#include<linux/ioctl.h>
" i0 z- `) k/ [$ k. c3 ]#include<linux/cdev.h>& R! F" L3 W& b& x: W
#include<linux/kdev_t.h>
' M0 t/ x# ], R#include<linux/gpio.h>, J+ w+ k& T0 F9 C; r8 _5 Z$ ]0 a
#include <mach/hardware.h>
/ p7 Z% J6 [+ x& x/ a#include <mach/irqs.h>
: d5 I. R, m# A( x% G
; V, x7 p0 }! _# x- [#include <asm/mach-types.h>
2 ]: E: u# ^2 {( g  r#include <asm/mach/arch.h>2 u. {( \; d% e
#include <mach/da8xx.h>& Z+ ]3 f9 W1 d' O
#define  SYSCFG_BASE   0x01c14000
" j! s& I: ?0 J5 a8 `#define  PINMUX1_OFFSET   0x124
, H- x5 L/ d' M1 `- w$ f#define  PINMUX18_OFFSET  0x168 + I4 i3 i2 i" g! v4 K* i
#define  PINMUX19_OFFSET  0x16c+ r! y: }  _' F# x" T( [, n
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) z4 u" G( M8 |#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR8 ?2 G& j% Q' f6 L2 C$ M
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
6 D1 f' d- A! p+ k  w& Q' K$ g0 C; i#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
/ @; Y1 `, S( G6 f4 H- r" u) [#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR" S$ k* q* ]) y. y' N3 u$ S. i
                           
9 y+ J9 Q) b" h+ f: P) M#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% N( ?' x, ]: }6 b5 A& k
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 A$ l' k& V7 x& D/ C# t: d* K//PSC( X. j  Y4 F4 i5 o3 V! I
#define  PTCMD_ADDR   0x01E27120  3 {/ {! \# c8 a% c! u
#define  MDCTL15_ADDR 0x01E27A3C, w# B$ Y1 C, i3 l+ V3 R2 n$ @$ ]
#define  PDCTL1_ADDR  0x01E27304
% _5 G1 |* |) |/ C+ M//GPIO8 direction7 O: R! _& t, ?4 W( f0 }* x3 E
#define GPIO8_DIRECT  0x01E260B0
' v' Y! x# F8 J#define GPIO8_OUT     0x01E260B4" @6 R8 x4 A% K& |9 j
#define GPIO8_IN     0x01E260C0
( h2 a9 I3 N7 m7 t3 I, W5 i. D) l0 N$ E$ a" L$ R
//#define MCBSP1_RINT    99              ( Y; f2 S: ^5 j) o
//#define MCBSP1_XINT    100  7 H! P% ]( T' e4 V8 `
static int MCBSP_MAJOR=239;
% m( @) Q! P3 ~+ R0 z, b# h7 q7 h) X% g( Cstatic int MCBSP_MINOR=0;5 c$ i: i* K7 x! K$ B% E: w4 I4 |! x
static int count =1;
- P1 e5 s; J; @4 c+ i( _) ?6 Z% {; t  S+ A1 Q1 g& r$ C
#define MCBSP_NAME  "MCBSP-device": C# Z6 E; y/ e1 J
# p3 `6 H  b, s8 V0 ^
static struct cdev *mcbsp_cdev;, ^  L0 c/ r. \( a
static struct class *mcbsp_class;# {/ H) _+ K+ Z0 N
static dev_t mcbsp_dev;4 g# P! [9 M+ _3 C5 F) J" i) l
unsigned int DRR_data;
+ B+ J. K2 {7 A8 lunsigned int DXR_data;% B  U6 K4 k: Q3 G
static int mcbsp_open(struct inode *inode,struct file *file)
; T& p6 X1 R; {: d% n) x9 L6 k! m{% v) I* \# a4 [5 c3 z1 \5 V
   ' M' S% U9 @3 o- D
   //interrupt enable,initialized& F1 j' z/ b' }
   unsigned int temp;
; a) W8 F  O- i8 j8 X% o% z   //SLEEP_EN(GPIO8[10])---05 l/ W  i0 |4 f( p- m" r1 ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 H0 o0 S; X' D% t( i. `$ C  R; {) J% }   temp=temp&(~0x00000400);. ^  C, w6 z: U" j. [9 P% _( f: m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 [+ v6 E$ f! j  //RESETn(GPIO8[8])----0----11 _6 ^2 {% g4 _" _# M' u$ n% ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! Q6 o+ X, o) J( ?2 a, B4 `
   temp=temp&(~0x00000100);
5 U$ b& z  ^4 J9 `# u8 \- M& a   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; [, I: f1 T+ L+ z9 W; l   udelay(100);, w% W* u6 l, ?0 m5 w
   temp=temp| 0x00000100;; w5 l9 N( e; E, X9 o+ d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
9 V5 \) n) h* z! ^- p: B   udelay(100);  j6 L  q3 }3 l) N' k7 u
   printk("open success!\n");# z. V3 V& H0 E. P+ L) d4 G& W
   return 0;
* B' S: ?1 Y- N0 K3 _& Z}
$ y" K* N4 Y- L0 r
/ Z/ ^; S9 P( C. Q1 b1 c1 n/ Vstatic int mcbsp_release(struct inode *inode,struct file *file)
0 m- l  m8 X/ [* M2 n- U$ V2 c{
% m3 }! g% s' K' K  I$ D   printk("release success!\n");
# c! B9 M* _% L# z$ c4 o1 u! _   return 0;  A$ Z9 V* C3 h1 Y5 x
}6 ]' C8 f, f9 ]
! o7 m4 M: ]* N% ^! M
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)# u- S+ E  D/ X- ^/ g& j
{
) S2 s3 M' W& g" ^$ L! R    copy_from_user(&DXR_data,buf,len);
+ O4 s" L& t+ V( _% h    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) u* H; F+ B. M5 G9 G    return 0;; U- ~. Q' K0 ]: s6 T
& D5 {/ O/ v6 O8 |2 d
}
* o; `/ _+ `! u& r. O9 @; m( f8 C) \5 X, |1 C5 v
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ I- T. |# i3 ^  M7 V
{
: S: V: q( Z8 m! [) l   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 {8 L3 @" L. \  l
   copy_to_user(buf,&DRR_data,len);
8 D$ \! t7 \+ o9 u! q7 B   return 0;1 T" }2 K  ^. w. h7 u3 N# ?' Z
}
( P7 P& h& t: F$ r9 g! W! {3 |* i0 z4 @# ^& x5 t

) T+ |* f8 Q' t- \0 w# Wstatic struct  file_operations mcbsp_fops=
" ]! c) @+ K, |3 T! M, g( I{
% j- X5 m9 T. A5 ~& b, l$ Y% ~3 t   .owner=THIS_MODULE,* D; \' }/ ?/ f1 t7 c3 f6 S
   .open=mcbsp_open,
5 \& e3 y! S8 f8 D2 a/ {+ H0 h   .release=mcbsp_release,# x  K& i+ N# ^/ ~7 W$ G
   .write=mcbsp_write,
. ?. t- S- r. A4 m+ u+ R   .read=mcbsp_read,
7 T. }! _2 R) A- d8 \5 |/ u};3 v1 d% `+ {6 {* A1 m, ?
static int __init MCBSP_init(void)( m' `7 W  r- J; j! t8 `
{9 R3 u" ^" ?; U# T- t) F7 s% R1 @9 i
   int ret;8 k. W/ f4 [! T2 o8 }$ S
   unsigned  int   PINMUX1_REG_old;
9 i) g# T1 D0 M2 n' d. }# N   unsigned  int   PINMUX18_REG_old;
* @* k; K+ x  i4 e2 N   unsigned  int   PINMUX19_REG_old;7 C$ L* C- G: Q* F8 t3 P) }
   unsigned  int   temp;  
& Y! l: S( E- [   if(MCBSP_MAJOR)1 H3 j2 O* ]7 b" l4 ^# j9 J
   {* W* w+ Y- A$ i3 ?/ b8 p
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* ]4 k# c1 D, h- R8 n# j      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 b3 k' C. L& y& {% c3 B
   }
% t6 ?7 i, G3 r/ h1 I# C   else/ U8 V- Q! H( {: W; Q' k
   {* `7 M! E' C( [6 H0 a& F. [0 L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( \$ J" ^  q) J
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 L1 [' q- L4 Z3 r0 K8 S/ I   }$ m# o0 x' U; p* d
   
$ s! W" \3 M# R   if(ret<0)
. E3 p, U+ w" q. N/ n* b7 [( L5 D   {
- j  b0 j6 P7 `0 g  h- ?      printk(KERN_ERR "register chrdev fail!");. ]" z+ y8 l3 @1 _& i. L8 @6 a# d$ |
      return -1;, D5 p6 _% ]: E) ~' l
   }
5 Q0 I1 U+ \5 [- k   0 A! ]$ f! B" U
   mcbsp_cdev=cdev_alloc();* K5 w- F, I$ G, C% b
   
/ s' s% A2 b# H& t; V/ C9 j   if(mcbsp_cdev!=NULL)' ^0 j( b, z' E0 \& p
   {
/ n0 G# Y: m2 b# U5 j+ d2 Q5 Q% @      cdev_init(mcbsp_cdev,&mcbsp_fops);/ m9 D: e5 E! i* B
      mcbsp_cdev->ops=&mcbsp_fops;) J+ m5 ~. J1 G; _, D' @
      mcbsp_cdev->owner=THIS_MODULE;
) s7 f0 j2 h) @7 r8 d4 l      
0 L" f4 P1 Y- ~) m5 u1 n- O" p2 @      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) H1 U# }. |% I- w4 K. P; J# q, t
          printk(KERN_ERR "register cdev fail!");
3 [. c4 @( {5 Z1 ?4 T/ w; S      else% H" w! Q8 N7 T( B+ w4 i
          printk(KERN_ERR "register success!\n");
/ N7 `# M+ M( g# Z7 L7 [, J   }! i+ m; {- \3 v% I
   else
! c( {; M' c* P0 ]   {
! U' e  h( i  V/ r      printk(KERN_ERR "register cdev err!");. @7 D4 x; A/ m9 q
      return -1;% v# q. l& `9 ]9 S) e# K
   }
- s  T5 B- q" H2 b. L. T( ?! W  s   
! L7 ~/ M8 l# Q) c. p  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 ?1 M- q( I$ M# U4 z$ U+ v   if(IS_ERR(mcbsp_class))
0 z1 D( x! y8 P4 V: w   {
0 S5 V6 L: Q" o      printk(KERN_ERR "register class err!");  S; K2 S$ o( Z' Q$ {9 w
   return -1;+ f" H9 Y0 V+ y! w
   }% V$ l7 X/ P; X5 p+ C0 h1 S
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: t  S/ _4 A' I. u6 Q) }% p
0 o/ u7 M2 Y4 `, ?& Y0 s: N8 P8 {   //PSC
( B: z! A* i& V   //add Enable MCBSP
) K+ K) a' A" T3 A. @   //test) o# {9 `  D5 p1 d; u8 ?* h: E; D! M( R
   temp = 0x80000003;
9 f4 F& M3 o7 E+ ~$ v, I5 h   writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 W$ n0 T- y. E* S# D; t+ p# F
   temp = 0x00000003;
9 T! a, C! V- R- k5 t   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- z0 y1 g. f/ t- f( P' ~ 3 r% X* u9 P% W2 G
   temp = 0x001FF201;, R* x" M* a( f# \
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 R) U2 o9 ^7 p
   4 e  L" g5 H" p" J; x# F
   //PINMUX  + H. |' Z7 U/ L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,% q8 X1 p* F% p: A
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
$ J1 F6 j% U1 S, u& s   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : m" M) @- l7 ]  R! C# H* J
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ Y. v  Q' r) w   5 m# Z& M$ y) I: M7 n0 `% u; q1 a9 C& u
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
; m' z* ]" b* S" T" _6 x0 i   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  7 Q( a% h7 [( d) Y$ S. ?) c
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
, [7 v/ N$ m$ U. j9 B4 l/ s( o   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( h8 Y2 N) F+ O ) [# h8 V  ?* X
   //RESETn,L138_SHK28 Z7 Q! u$ \) N2 x9 b( n% j9 D
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  4 K& r# u+ g# p
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   + v3 N1 L, u  `/ z. o
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 s# O& r' B' u% X( g$ S! j
( S( l! V2 r0 Y, m3 q
& a$ W6 @2 D4 f8 B" C
  //SPCR Register! |6 }4 P- \  D' ?$ h" S
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! |  E) A6 Z: |( k( m7 L0 r
  temp = 0x03000000;//(DLB=0)
* C' a3 {. v; x+ s // temp = 0x03008000;//(DLB=1)
9 n$ _, W' q7 z2 e' X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset5 a# z, {6 O; U$ _8 z+ @2 o; W  X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% l& d: U! B: Z) a* x5 m  printk("temp=%x\n",temp);
; t2 ^$ Z" b. J1 E5 i1 @
3 _3 M: J. _" ]; r1 e. O: c1 z' S( O   //PCR Register7 O) Z5 [; J- t; Y& f, e) c
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
. h4 w$ z  |1 p9 l  // temp = 0x00000F0F;
, G' t7 {( g5 a6 F& ^- H  temp = 0x00000B0F;
$ v% y# z; Y4 N9 Q0 b' m  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized & V! D, k. |. r; }
  temp = readl(IO_ADDRESS(PCR_ADDR));
- {9 |( k/ ?0 q# `! X  printk("temp=%x\n",temp);    z* P. l* O/ k* h# }" ?# N
   //SRGR Register9 G$ E% ?: m- ]. a1 d3 D
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: Q2 ]$ v% }# K: t //temp = 0x301F000B;/ U7 S& b) @9 H
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
! Q; J; |5 W" J$ Y$ Y  temp = readl(IO_ADDRESS(SRGR_ADDR));
0 l" ~; j) V# D' \4 |& h, S  printk("temp=%x\n",temp);
8 [0 G' \# A7 L" D9 i: w/ O   //RCR
5 Y6 z/ [' Q3 s& o8 u4 m2 M7 {# g! C, l   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," W: T% ]8 J) W& s7 X5 _
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ f* B* z4 u" \
   temp = 0x00440040;
6 U  G" ~5 M; x* F$ v$ _   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
" g8 x3 @* L+ d1 `, D   temp = readl(IO_ADDRESS(RCR_ADDR));
4 [( U5 t1 f2 n- p7 `6 E8 [6 v   printk("temp=%x\n",temp);
! N! ?1 P1 L4 u( y. ^8 Q& i   //XCR8 r2 D- h8 P2 [' C" i$ K
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- U, S5 Q! ~, k) _5 N" @   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 ~/ D/ x- f  R" w) U: _: {$ i
   temp = 0x00440040;. n8 Q% E4 U5 Z: D) C, z6 ?2 f
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ) Q. s1 P% ]. s$ M
   temp = readl(IO_ADDRESS(XCR_ADDR));4 N0 C/ G0 D+ d
   printk("temp=%x\n",temp);' F& y6 D" ]' |# }
  udelay(100);
/ ^% Q7 i+ c& \* U5 v, J) n  //SPCR Register
; C/ ^+ E! e. M5 L  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; T0 X! i! x* M5 T6 E. A4 y, D. q  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  ]* v; J2 E. m& P$ R* ?: `: }
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
' L3 n* G9 P1 }/ Z7 ]$ j+ [  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 v2 L- g; A# |; k" N  printk("temp=%x\n",temp);
) j+ Z8 v, s6 M  udelay(100);# W: L5 |1 {$ d' L+ W/ p0 K9 f

" j, V- W% u% E0 z! e" A) C  //set GPIO direction
, ?* @( ^2 B3 R: S/ C- Y/ I# s+ Q' u6 x, }   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
  m( W+ F+ q4 S+ q; }; z  m   temp = temp | 0x00000100;//EPR----input# \0 W/ }9 b& P3 C  x( T
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. L6 A8 g1 Z: r1 w+ \$ j
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
  d& b! N& c, v6 D9 l! w
: l8 A, T" v$ Z; @   return 0;
  f7 i' {9 a" H" e* ~5 q) }}
7 D. t% r! B# g- s+ [) K5 zstatic void __exit MCBSP_exit(void)* M1 A/ a) e  i$ l, Y* t, M1 J+ t8 j
{' s1 O, j8 P* j
   printk("mcbsp chrdev exit!\n");
  M- x5 S3 S& ?   cdev_del(mcbsp_cdev);
  u/ j+ r5 O5 _" \( g* ]  k; I7 t   unregister_chrdev_region(mcbsp_dev,count);
  d) n; w8 }6 d/ F   device_destroy(mcbsp_class,mcbsp_dev);
! W3 u" N7 k2 X8 X4 c( n8 l   class_destroy(mcbsp_class);; x/ R* t) L' X( ]8 ]. l2 \
}
6 _5 T# h; _! z" }module_init(MCBSP_init);
  a) \+ R+ U- _6 @% ]! jmodule_exit(MCBSP_exit);$ h' {* C& t/ C& H6 U% B1 _( i
% q& ?, y* z0 X! a; O6 }9 D
MODULE_LICENSE("GPL");
; s# N" Q  @5 E) K! B1 p4 R& @1 M; \( i+ k! ^
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" i& |1 c3 U2 H' I- v3 d! L
我的应用层的测试程序如下. @: j0 ?# e4 H6 S2 g
#include <stdio.h>
- `# n( Q! U9 S6 `#include <string.h>2 [5 o" V; k# a7 k, U7 e+ F. n- B+ }' c
#include <fcntl.h>
6 Y9 d& g* k3 ~+ T$ }, f; e9 J" Q; M#include <unistd.h>
# q7 x" V+ ~7 d( [5 x) {#include <signal.h>
2 M2 N: @/ O) |#include <pthread.h>       //线程
8 Z4 a7 _3 g6 ?7 Y" O) ~#include <stdlib.h>
( y+ q% n# J, ^; j2 P#include <pcap.h>          //捕获网口数据, `* ?, m# a0 O6 a+ [( Q7 k
#include <semaphore.h>     //信号
7 y) r) T8 B' I  |#include <sys/types.h>     //消息对列
( Z) I2 A4 K& j2 I! R4 k#include <sys/ipc.h>       //消息队列
( u. Z  Y$ l( j. D/ ?, P#include <sys/msg.h>       //消息队列
4 h5 z; ~: e) a#include <sys/select.h>
3 T6 ?4 x2 i$ L1 E4 |9 @) o1 ^7 G#include <sys/syscall.h>
+ q' p: S' I( B#include <sys/stat.h>
$ q+ K7 A% ^0 W; I) b* d' C#include <sys/mman.h>: y4 E* D: S6 A4 w" D1 a& f
#define msleep(x) usleep(1000*x)
1 C- S8 B8 W' a0 }; c5 o! U5 @/ P: H- P: c2 @2 u  ]: J- d
int main()0 |( \8 i0 @1 y: C: X1 i
{ ! Q! m, J+ v5 U: H' ~3 S& W( c
    //MCBSP,ARM与AMBE2000交互设备
9 B  n7 S, r, M7 b8 {5 N* u int fd;
( E. {" t/ s% g0 L4 \: Y/ O. e unsigned short data_write = 0x5555;- [9 `! f1 p1 s+ e( _
unsigned short data_read = 0x00;
$ B1 I9 h' r- {: L" F! i" e  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: k. t6 _2 Z2 B8 }: r+ k# E# y
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);5 J: e( i6 s. ^
   
& m5 d* R, _( u% }  if(fd < 0)5 T- H% r! K/ J! D# {1 w! A
  {
5 q% B- O3 J. v" `' x     perror("open failed\n");
" g7 k9 }0 ~. Z     return -1;
* b$ v$ L8 @; F5 N/ A4 O+ s  }
( t  e# J# _, D$ u5 Y  
5 w) d3 m" S0 [# T, j4 G! R  while(1)
& m& g9 w0 `: a0 p/ H  {2 e( G/ Y5 i4 t% c1 [6 w
   ! \# d& S: x9 o! O8 G& O
   //AMBE2000每次读写是24个字为一帧
% f( |* q, u: r) m+ I   //写数据时将数据在底层存储起来,等到中断的时候再发送7 j0 M* O. k' ]# q$ |9 W
   //AMBE2000输入数据是以0x13EC开头的. H0 S' x, Z$ E
   write(fd,&data_write,sizeof(unsigned short));
4 E; E" O9 H; h   
+ J; g! Q) h0 ~6 M2 c" O   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  . T5 e# w8 t5 V9 H0 @& `2 m7 X
   read(fd,&data_read,sizeof(unsigned short));
6 B, ~. h+ S- D, v. {/ w   & e% c+ q5 Z. T) g* @8 s  C
   if(data_read == 0x13Ec)  W# a0 c2 R  A. i1 b
   {0 ~" b2 _+ N* m) P9 x" a9 t* _( f
   7 t9 E& B9 Z5 `6 |( c  K  J
    printf("data_read = %x\n",data_read);( f5 E+ o3 [, b: G
   }
1 e! ^, Z/ n: E  W/ b# A- B   4 q$ i; S$ r8 r; q" c# x) Q( F1 L
   msleep(10);- A) G* [0 x( D  T+ [; n
  
  i( J- \& c$ ^7 a" l$ r  /*( u  k3 [: G5 I* Z
   ioctl(fd,1);   
9 v/ W, R; y# u7 K# f( ~5 l1 n sleep(1);& C* }. Y( |1 ^" e6 I# B2 [3 x& o
ioctl(fd,0);
5 U% O7 M5 t6 E9 b7 f sleep(1);
+ {% I3 {! m* M' ~ */
9 W7 e! m* E, H* @: z: k) B7 x  }   * E6 S. Y( i# N3 s5 n$ I8 l
return 0;# Z* O/ n- g$ e' \

0 I8 H6 b1 X9 G" Z$ [}
* l/ K' ~+ ?  G: X, V- E  |: b  G) u6 z! K6 z
多谢各位指教,谢谢! 急
+ Z% \) L. M. |0 o% x; ~
; h# o$ s9 o* o* z- O8 m# o2 x, ^9 z& c4 X( z
$ i3 Y/ g: U6 f  O8 b' c# E

1 r2 R$ z! i. v+ ^. O' ]; \9 F
$ n6 ^5 ~  C  K8 R9 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 04:49 , Processed in 0.050993 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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