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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 @3 U( N* P: w, x$ `
/*
: n8 F: ]0 r, X* L * Copyright (C) 2009 Texas Instruments Inc
2 b: b3 y8 y! `1 A( ~ *) \" C3 l& g2 c! j( V. `, b
* This program is free software; you can redistribute it and/or modify+ c" c# {' O% n' u- b2 ]
* it under the terms of the GNU General Public License as published by
) L5 w- l! S7 v/ j0 ~6 C& M5 f1 f5 Q * the Free Software Foundation; either version 2 of the License, or
9 ?# s. c7 Q& Z * (at your option)any later version.7 P. p0 i! |7 R- r
*
7 u0 w% S4 C% b4 p * This program is distributed in the hope that it will be useful,2 w, O$ `3 ]2 _9 i  d
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ s; t) a% i# c" a6 d  ^0 { * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the0 H6 O3 X) d: H" Z- N- P' G5 k! e
* GNU General Public License for more details.
. P% `. i, k# W# D *0 Q. t1 z& v3 G( E/ v4 F
* You should have received a copy of the GNU General Public License
3 v/ I; \# f7 k# I8 r * along with this program; if not, write to the Free Software) Q) _2 v0 a" Q3 [1 B3 j
* Foundati) j( Y' b# _& t* B) T; _+ L, w
*/4 }* g" n9 B, U; T0 K* k% K. e
#include <linux/module.h>9 V* o" @3 p" Q# o- t9 F
#include <linux/init.h>0 }+ Z4 Z* o' \  o: _4 y
#include <linux/errno.h>) G/ [8 }9 w& F) I- e9 q
#include <linux/types.h>5 |5 r2 w9 ]# D; H  t" W
#include <linux/interrupt.h>
0 j. v7 o' r4 d/ {#include <linux/io.h>
- w5 V, b2 g( U4 \/ D1 @* K" s8 e#include <linux/sysctl.h># ]( B" O7 R+ b$ d. e
#include <linux/mm.h>
3 c$ `- A+ R" A+ S#include <linux/delay.h>
' V8 X. M: `2 ^, Y' ~/ i& h#include<linux/kernel.h>+ s+ ]! G- X% f9 M* Y  v+ \6 x
#include<linux/fs.h>  S; [: {6 O7 V$ a; D# S) V
#include<linux/ioctl.h>; Z* X: G" S  M( a
#include<linux/cdev.h>. R+ v2 I) a) g0 f! w  Z  K* n. q
#include<linux/kdev_t.h>: \3 A& m. S% y' G
#include<linux/gpio.h>; N/ G7 M7 J8 b  y! z
#include <mach/hardware.h>
- T6 x: G& `" U; r8 i& z( ~#include <mach/irqs.h>8 s6 Z! L) l. d

2 C4 d; s% d+ {#include <asm/mach-types.h>
# q' D8 ~7 j* H# r/ F" U#include <asm/mach/arch.h>; Z4 u' h% @, Q7 }) g' ?
#include <mach/da8xx.h>) d# D& Q1 v+ W* K
#define  SYSCFG_BASE   0x01c14000" C, p/ ]6 N. F8 `- C+ K
#define  PINMUX1_OFFSET   0x124
0 C2 p% w, g4 y( F' q. H#define  PINMUX18_OFFSET  0x168
3 f% E4 X- B( [#define  PINMUX19_OFFSET  0x16c
0 t$ C5 v) C1 f  K2 m; M+ ~' U3 |#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
$ k4 y, x) V9 M/ Z0 I( w6 T#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ Z) X& ?! e6 d9 `% e; g+ d* q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR; b$ Z& D8 I5 A! A& w/ T) m
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ }8 g$ x% O/ h; J# E' i" A#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
+ y/ P+ ]- I" `: E( S/ n                           
8 ?1 p- D- d9 d, }2 z* f$ [4 u#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 \7 a5 [+ r7 M) w! g#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" V; \$ m: D% p' A) J
//PSC
( S/ f# K' I( r7 x' ^9 }- _#define  PTCMD_ADDR   0x01E27120  
4 z0 Y) N; J4 e1 H#define  MDCTL15_ADDR 0x01E27A3C
2 v7 q6 a6 c2 F" y  T2 B& ?' ^#define  PDCTL1_ADDR  0x01E27304
* H! p( f% w- D; [//GPIO8 direction: J, M. R, a  S" ]: J. F5 S+ B
#define GPIO8_DIRECT  0x01E260B0
# d1 s! d# j3 y! {: X#define GPIO8_OUT     0x01E260B4( C- G5 `# G: t( u4 i  v" s# a
#define GPIO8_IN     0x01E260C0
# Z: P( R1 \) ]  l
6 m  o* ^5 b' t) b: @//#define MCBSP1_RINT    99              % J/ C  \2 D. W' h5 ]* Q8 o
//#define MCBSP1_XINT    100  , o  w/ y/ H& w9 ^. K. B
static int MCBSP_MAJOR=239;
" _( Y% a# B& n% x3 {: t9 d/ Q2 c1 Qstatic int MCBSP_MINOR=0;
# u( a- X& K; d3 C8 l  s6 Estatic int count =1;
9 p5 Q# w6 c# \9 j( v- q" o+ E7 H* \" n$ C  c4 |
#define MCBSP_NAME  "MCBSP-device"2 H# y% g5 u/ f* |+ l( S

! j/ Y5 s  D* N- lstatic struct cdev *mcbsp_cdev;; y2 d/ c( l) Z' r8 z7 C
static struct class *mcbsp_class;# s' j( q5 P* ^( l/ D6 v
static dev_t mcbsp_dev;
; Q. g* G2 I) P( T6 ?' t3 i3 ]3 vunsigned int DRR_data;
; h% Z+ e4 {2 R1 gunsigned int DXR_data;/ G1 _4 n7 K0 V" {
static int mcbsp_open(struct inode *inode,struct file *file)) H1 W# {6 }  `
{7 Z0 Y' ], I6 k  f" p1 I
   
: Y) G2 I8 d6 `3 }- [2 i0 Z   //interrupt enable,initialized
) y: h/ `. f# l/ x6 h   unsigned int temp;
3 ~& y. q* v& v( o* S, g% W   //SLEEP_EN(GPIO8[10])---00 k# O5 Y8 x) d9 Q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 G5 L4 F. u/ r3 _7 o& B
   temp=temp&(~0x00000400);; o; ~4 m/ X( J) H0 _
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 F/ A* @* L7 ^( J( k2 Q  {4 v  //RESETn(GPIO8[8])----0----1/ s6 ]/ k0 f7 e9 A6 h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( A5 I* x  m" ~+ P   temp=temp&(~0x00000100);
& F: o2 }1 P0 `" C" [: h2 d9 ]   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 ^$ b3 f; r. S
   udelay(100);+ `7 m( m8 \- o% L( [% Y
   temp=temp| 0x00000100;
# \; m0 L6 w* m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; c+ e5 O9 ~! ?8 M+ Y& d   udelay(100);% J9 ]/ A4 D* E! I
   printk("open success!\n");8 D  J3 P/ Y1 J& G3 v2 ^3 z+ |
   return 0;" z7 d) _' o; S8 d2 D6 J
}
5 T, j) G+ U9 r: C
" z0 c8 o1 i" L* b: [% b1 Astatic int mcbsp_release(struct inode *inode,struct file *file)- @) a0 N1 r' B; p" a( f
{
5 h4 K% S8 }  z5 E   printk("release success!\n");) I; c+ L) z3 T/ G* `: C" _) f. Z
   return 0;+ ^6 U! W5 m" L$ x
}5 x  N) Q0 K( c# Y/ P' x; B

& T( u! T! {- k. u" x) X: |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): ~) @9 V- P# ~+ Q4 l
{
* C$ Z7 ?0 Y9 \  G7 W) U    copy_from_user(&DXR_data,buf,len);, y, A: }. A0 a$ i1 _: M, O/ k
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ; P6 p1 J8 c: a. x- @. v, @
    return 0;+ T5 H! w7 H# y. o: r- L6 D/ B, `

) _6 l1 W9 O. ~7 g$ P}
3 s( u  c" q* \; i  y3 l" m" y' y/ [4 {4 l, x! x. F+ a
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 b1 _& @1 w4 _$ F# \{ * W7 o$ P3 U7 [' S: V
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* q' Z* f2 X# }, m   copy_to_user(buf,&DRR_data,len);
, L$ ]" G0 u- I" s3 S  r   return 0;8 d6 A. ?+ u( Q* e# ?
}
7 M/ |. i. S1 G/ `) s
4 \, }# w4 w/ q9 g! ^) v: z9 t1 @3 P
1 w9 T+ M8 E8 F. j: g' fstatic struct  file_operations mcbsp_fops=0 Z1 v& m( C# A; e
{9 {$ U( Q& e" N9 P" G- s
   .owner=THIS_MODULE,
8 p6 R- b5 O) K, ^! [/ ~   .open=mcbsp_open,
) A) H% Q- J; b3 j6 B6 x/ h) H, M# j   .release=mcbsp_release,
' F. P/ \* H( T( v8 G. G& v1 _   .write=mcbsp_write,
# T1 T; |/ @8 E8 ~; R8 ^3 S4 I   .read=mcbsp_read,
+ ^7 ?8 h% D0 R' ?, O, q5 P};  R( W1 L$ P( D0 z! }! U/ @  Z
static int __init MCBSP_init(void)9 Z, T  m6 f0 k- o  O
{- p; B0 _% y* _3 _* }1 O0 U
   int ret;
  a1 n0 T- @) R$ F* s, ^6 m   unsigned  int   PINMUX1_REG_old;
4 q+ @0 Z" L; k/ T; I   unsigned  int   PINMUX18_REG_old;5 D8 d7 ?8 R" E3 K5 ^( x
   unsigned  int   PINMUX19_REG_old;2 z) C+ a) q" p8 h4 M9 S6 M
   unsigned  int   temp;  + Q6 z: [4 {5 u6 }
   if(MCBSP_MAJOR)
) M# B0 X/ C; _0 r* L' B   {. h9 p' K! ~1 x5 J" t
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ |  I( j, e+ Z+ y* Q8 g/ {0 ?  k      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' ~, r* k8 n  u! N( _% x2 h   }+ N5 }* {* c: |2 h& H
   else" z; l( D; h& ^- [# O
   {
. ^' r% h0 Q! J' P2 h6 i; h) D      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, Z& \, B0 ]3 T' z$ M      MCBSP_MAJOR=MAJOR(mcbsp_dev);
% G& G5 Z* s; y" a( `6 q2 P3 P2 i   }5 ]) g* t" n' i' l
   
, M! ?; ^! N7 U" }   if(ret<0)" ^) S3 q6 s% F6 E3 c' L* v
   {3 Z3 [) `8 T! Q6 M7 v3 ]
      printk(KERN_ERR "register chrdev fail!");+ W' l# O+ Q$ n( O0 a7 U! U
      return -1;
1 g% P  Q! T% h% k, k& |! @   }+ ~# x" q9 J2 T* Q
   , w1 r$ @/ Y# S8 w* I% }0 i
   mcbsp_cdev=cdev_alloc();7 R- }+ [# V# ^+ N; {1 u# \2 H
   9 [2 K& T- w0 ~0 g( w
   if(mcbsp_cdev!=NULL)
4 @9 H* \: s3 m" x1 V2 D   {
; |' t0 A3 i9 _( h% ^      cdev_init(mcbsp_cdev,&mcbsp_fops);6 o3 P0 o7 f" u' {. j3 d# }4 s
      mcbsp_cdev->ops=&mcbsp_fops;
- Y" B, \# F3 T% `; h      mcbsp_cdev->owner=THIS_MODULE;
, C/ u* H' Y- `6 J7 _      
- {! d" h9 @, O7 J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 [6 A. p6 t8 V5 ~2 [
          printk(KERN_ERR "register cdev fail!");
% A) V5 g7 Q6 Z# f* i: u2 `      else+ |: x. s& g1 b3 b) W! j/ U* K
          printk(KERN_ERR "register success!\n");
, [; Y2 @: c4 B! |, C5 ]   }
2 N( n" [1 B3 K  f& E: |   else' E4 O  h8 l, a5 s. C
   {
6 ^+ G  R! U7 h0 l9 g      printk(KERN_ERR "register cdev err!");, i# s1 l$ T& g0 a8 P( I7 W# x" o
      return -1;
8 K7 E' }% e' J* E+ r/ o4 c   }
# f* I- q0 ]6 ~   
2 F5 `  e3 ]( ?" u8 N' N7 |  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, S& k' Q3 i4 |; n   if(IS_ERR(mcbsp_class))# V" X! m5 K# ?$ l
   {
9 Q$ v! X' e+ Y3 D7 u      printk(KERN_ERR "register class err!");
& ?- b4 H6 y/ N   return -1;
. M% I1 t3 B, p8 j2 J  F   }
% z  F# d3 n) T/ \' a: c   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' r$ C4 K8 _/ c

, ]* ?' E6 f( @+ v  m& R) T! O   //PSC0 x. x4 t, @* R$ ^" p/ A
   //add Enable MCBSP
1 I" X* x, G2 e, T; F# [   //test
  t  K6 o5 A# @* o$ n   temp = 0x80000003;) k" ~2 Q6 x  w: }7 s% {7 `
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( [! q; ~& k5 N$ q   temp = 0x00000003;
; u* k0 {- o% ]; L   writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ ^, h4 P5 z% Z
0 Z1 f8 D4 [/ P: g   temp = 0x001FF201;# L0 f6 X. B/ ?2 x
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: }' o5 P: |  M) ~4 M
   
4 B8 B0 w$ [# V5 p7 _   //PINMUX  
$ R4 v9 Q) q! h$ o# Z1 k5 p   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,9 n# P6 s& E) a3 A/ M2 k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    f6 m8 a- ]1 K; U( Y- R
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   1 g9 ]4 X$ J8 b5 c9 c
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; p$ a; h* I- d& p   
/ m* Q% V% Y) W% \' w   //SLEEP_EN,EPR,L138_SHK1,L138_RC- u; L+ i3 n+ ?2 N# z& c
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 [) A- p4 U2 P% K0 P/ `7 O
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & M- i% S. I$ c1 j
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# h- Q4 z, e/ G4 q. Q& k9 m7 X

7 q4 L& h3 H; f4 E9 I   //RESETn,L138_SHK23 c7 w+ q- s: A- F2 ]
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : t' t6 h6 W1 i$ ?! E
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
+ G  ]2 E( G; u2 V% u   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);5 U$ ?6 [9 n+ e7 Z

9 e6 [# |! \, e; V( c
  C8 P' l5 f1 u+ T* n  //SPCR Register
2 a$ }. v( r0 X, H2 e  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
, n0 }" f8 ?3 D6 |  temp = 0x03000000;//(DLB=0); M6 ^& ^% h! Y1 T6 L, Z
// temp = 0x03008000;//(DLB=1)
' f* _6 ?* G/ ~# {1 B* M* v  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
! }6 E0 k/ p7 i9 m: j3 z; F0 F1 u  temp = readl(IO_ADDRESS(SPCR_ADDR));0 s* Q% _, _# U8 C* M) ~/ D
  printk("temp=%x\n",temp);
  q  [" V" N$ U( X7 i8 c 8 Y9 C/ C8 V7 Z  i
   //PCR Register
) o) T& K- n3 z  E' b2 ^   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- A8 k- ^) N2 m1 Z# I3 Y/ D9 F% l8 ]  // temp = 0x00000F0F;; X( J0 d- r) l: k
  temp = 0x00000B0F;
: \5 Q. ]: j! [% o. [+ Y1 B- C  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 x! R* @3 \" P' R! _  temp = readl(IO_ADDRESS(PCR_ADDR));$ d' d2 K5 n# ~3 A) r4 K  U% f3 Q
  printk("temp=%x\n",temp);  
9 c* P0 F7 x# T1 S   //SRGR Register4 u" c$ U; D' N: c3 f, M5 y1 B% C# o
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) W: a' B0 z8 Z$ j- P# }  W //temp = 0x301F000B;
8 z5 Y( S+ z9 z8 a. z2 `# R6 z& _/ R   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 0 V& s" {- y( i4 |1 @+ C/ G6 z  X1 |
  temp = readl(IO_ADDRESS(SRGR_ADDR));
7 f1 q& @; P& i( U% C  printk("temp=%x\n",temp);( B' ?( R0 N& U
   //RCR
% R  d9 H2 j. ~2 Q9 a* I! n  n% {   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 n+ X8 W8 P. i9 C   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) F& F% @. ]" [. X   temp = 0x00440040;
+ D: |) a" w4 s& x* r; Y4 |   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & T% Q$ |5 _: s( ?! q& T% r
   temp = readl(IO_ADDRESS(RCR_ADDR));7 M1 v$ ]) T* X+ Y
   printk("temp=%x\n",temp);; @8 n% P: Y# J' [5 N
   //XCR2 r# c  W7 C  r9 i; ^* ?
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, E( I$ }8 j% Q6 k7 {& I$ F
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  E5 c: n9 @+ F   temp = 0x00440040;
/ r) [3 D0 l" V: @5 _# {: L  W   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized     m) y: n# z/ b5 G  W' |/ u* [
   temp = readl(IO_ADDRESS(XCR_ADDR));0 y$ h6 u. k$ [2 B  q- Q
   printk("temp=%x\n",temp);; s0 b& B4 t; n; Q7 P
  udelay(100);' A' @2 X% I" C- E$ [
  //SPCR Register
0 R( ?5 N1 H' D0 a1 |" }& v  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1  A8 S% k" c* v: E
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 [# A* R5 K. g4 X1 {  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
/ K) s- \! [; G* q3 \7 D. C  temp = readl(IO_ADDRESS(SPCR_ADDR));+ a7 w- E  Y6 T# [; C
  printk("temp=%x\n",temp);
8 V7 c5 G" w+ |  udelay(100);2 X: p7 u2 b# |( a; d8 j

; c- U1 i- a& T* x* `5 Z8 \  //set GPIO direction
3 ^5 y) j5 E; M1 S   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));  t7 F# `8 Q) V7 B! Y. Y: b1 Q9 s
   temp = temp | 0x00000100;//EPR----input
# {. k. o, A6 T   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ j* n& ?0 }+ H4 ]0 t   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 h6 |) U6 ~$ U4 c# @+ O4 S6 x
( p# u4 f7 \& n8 V" I+ \/ A   return 0;
/ [& o6 g7 u+ i, i0 ~}, p- A4 t8 s* z3 s. o
static void __exit MCBSP_exit(void)
& _& |( [1 ^2 v/ ^+ D1 V{
# }  u) K* l/ V; S: ]1 D$ [2 E3 ~   printk("mcbsp chrdev exit!\n");$ ~+ {' G: D! r5 J6 _* Y! S. S5 l
   cdev_del(mcbsp_cdev);
$ b  o$ z2 p( N  M) w   unregister_chrdev_region(mcbsp_dev,count);
2 O' i, g/ a8 |) B+ P+ o! t   device_destroy(mcbsp_class,mcbsp_dev);; E7 b" O- Z# F# U  E+ _4 r
   class_destroy(mcbsp_class);
; N  x$ z, |5 o0 ]1 _" Y; Y. a9 m}4 y3 C8 Z( i' V2 v
module_init(MCBSP_init);
8 p( k; N2 a+ Z4 zmodule_exit(MCBSP_exit);& M: I. {' r2 w% D- l7 k7 q
9 M% Y) Y4 Y( a* P- G: V# l
MODULE_LICENSE("GPL");
: ]* @0 R, Y, _: @4 ?4 w; j3 S" p; |% {+ P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" K4 V- R4 x$ @/ n# ?
我的应用层的测试程序如下
* G; p1 V, ]( Y0 p/ U9 R: O9 d#include <stdio.h>% Z# [- h% g8 e; r) j
#include <string.h>" V, N* \/ S! ^" P9 d8 k
#include <fcntl.h>3 h/ {  b  P8 I- V3 a
#include <unistd.h>
' T7 c5 W. I- s+ @5 @" P/ u1 }$ N) I#include <signal.h>
. e" |. ~9 f( u3 A/ `#include <pthread.h>       //线程
1 x& Y# f: }9 I2 v#include <stdlib.h>1 d3 J. c) m& E2 D$ P# ^* e
#include <pcap.h>          //捕获网口数据! _* n: M* L6 [9 @; F# g
#include <semaphore.h>     //信号
9 b3 [6 ^; D) _#include <sys/types.h>     //消息对列
* C: R  y* a& a#include <sys/ipc.h>       //消息队列$ W! |7 Z0 p5 r, K
#include <sys/msg.h>       //消息队列9 @0 w& r& g4 ~
#include <sys/select.h>, Y" z0 M" S& i( S3 B( E, z& i
#include <sys/syscall.h>
( Y9 C4 t6 Y+ I' v6 o9 Q9 {#include <sys/stat.h>
/ B9 t: K% P' i9 X% K, F. @# m#include <sys/mman.h>
) ?7 j1 n4 V# z# ?$ c( z#define msleep(x) usleep(1000*x)
+ k, D+ Z& Z$ {* C2 z
/ B3 Y. y  d+ T' Aint main()) b; X! F5 _( I3 j, P& X2 L
{
# j1 h3 t0 @+ Z3 d% g    //MCBSP,ARM与AMBE2000交互设备) p* C( p* J! t: n1 p. C
int fd;( s3 l/ z, I0 a9 [! S4 {
unsigned short data_write = 0x5555;  K. q3 m3 w9 S0 z
unsigned short data_read = 0x00;" p2 s2 q8 x# v( h6 n1 a7 M( Z
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( v) o4 b$ E2 o* L0 j1 C% c/ n4 J: q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 h& \, x; w0 T" s   
+ M$ a; G; m$ p; V7 y; E& w  if(fd < 0)
$ W# ?' i( a6 ^) D4 K& f  {
" _2 B7 M- a( C7 }$ P/ H     perror("open failed\n");
* U% u! j. M( w# H     return -1;
& |3 l* T& k# Q# V: g4 F0 q; X  }1 I& L1 c% n1 k; F2 n
  
9 q) Q$ {& O2 a& \! u3 ~  while(1)0 v# D9 f0 n: C1 L6 v7 a, K
  {2 C6 v( g* n/ i/ F5 y
   # |: u7 c8 r9 b( ^& x0 q  S
   //AMBE2000每次读写是24个字为一帧
- c2 x6 l% }" }, B2 m( B- i   //写数据时将数据在底层存储起来,等到中断的时候再发送* ]/ G0 Y: Z9 j* Q. Y  ]! [
   //AMBE2000输入数据是以0x13EC开头的/ N$ ^7 f! @) }* ~
   write(fd,&data_write,sizeof(unsigned short));
5 L; P' Y+ _0 f. k0 U: M: w6 v% P) D   
+ m8 k+ Q5 X5 Q3 D, q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  # X( ]" z$ \( @# a9 [! a
   read(fd,&data_read,sizeof(unsigned short));4 c0 K# i6 P: P
   
4 T! y& M1 T# ?0 e3 C+ w3 a   if(data_read == 0x13Ec)8 V0 _( g# |/ Z2 s' m0 F
   {( c! b) z9 K# B
   
, B$ x0 K4 x; }$ p    printf("data_read = %x\n",data_read);' z+ H  u6 }. E  c' `" \; E( |
   }& z. {; |; ?9 n& W
   
% O2 k) \, |4 W) r; u8 e9 O   msleep(10);
8 _* W1 v( M7 n! q1 X/ a5 p: M  
0 b  }' C/ o! s% {7 N  /*; Z, M; k0 _7 ?2 W/ B
   ioctl(fd,1);   
  @6 s: y2 l5 ]* H: X sleep(1);
  ?* q5 p+ @; s% `3 V, l! r2 J ioctl(fd,0);7 ]8 x# o2 X0 ?6 X. H
sleep(1);3 }7 j, v" C! G4 Z* d+ Q6 h- F
*/
2 G8 t  z# c/ A, a, h  }   
7 \- w2 n! E3 U. b0 r return 0;
2 J4 W4 o) o% {' y0 O+ u
, F' q& c' F# l' Z6 V/ W- @0 n}
: {# o: @' }! d  V# z% d1 \
" ]; L* w$ K, |' N多谢各位指教,谢谢! 急* F. C, Z5 L- q: j1 \
$ w& Q$ v, T# A8 U

* E1 l4 s% k" N  Z7 f3 {' H0 a0 k) A8 J2 X) J

* E+ i9 `8 h7 U  @, l! E3 F$ \3 B7 T% r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 12:21 , Processed in 0.052955 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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