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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, r; Z" J$ X- F1 v/ a/*
6 r0 p, s0 G/ v) Q7 s( b+ T * Copyright (C) 2009 Texas Instruments Inc
  y# c  F0 ]6 Z. E4 `' E4 E *' q- ?2 l+ K4 S- |+ L' R
* This program is free software; you can redistribute it and/or modify' c0 s6 d- u' v$ k5 W1 A
* it under the terms of the GNU General Public License as published by
# a2 Z: d& @+ |$ [- J* ^) d2 U3 m * the Free Software Foundation; either version 2 of the License, or
! H- Y. m1 K! R8 ~9 q3 D * (at your option)any later version.0 _9 r' g# U; ]2 j! q2 c, v
*
7 n: w* B  |0 w! H8 F9 z/ @ * This program is distributed in the hope that it will be useful,
9 [+ M( ~' G7 |8 {) q- D8 L; a * but WITHOUT ANY WARRANTY; without even the implied warranty of. W8 @$ K( @6 [' D: @  F
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 _' B; j9 h1 J# l6 F) g; |0 p4 F * GNU General Public License for more details.- `/ ?6 v6 e* Y+ ^* N. |" u
*
& v) {4 M' ]/ F6 l * You should have received a copy of the GNU General Public License
0 [7 D0 b" D' T! z! n! _( r * along with this program; if not, write to the Free Software
  T8 A. j+ M, R( N% W3 X4 m * Foundati
& E' _8 }& o+ v*/) r! D  z8 A5 X* _- D
#include <linux/module.h>
$ K0 D8 T. T# h7 c' s% o#include <linux/init.h>
4 {( S( ?) a# z1 h2 p7 w" r0 ]& |#include <linux/errno.h>
( {! s7 |# Q8 J% t#include <linux/types.h>
0 k' F; W0 l* ?7 k" B#include <linux/interrupt.h>5 H# s" C5 [5 P9 g
#include <linux/io.h>+ `" K% M' U7 S6 n- p& m
#include <linux/sysctl.h>
& {' x8 r. t/ k1 e; E7 _#include <linux/mm.h>& B: ^6 ?% Q* N. b( @) O
#include <linux/delay.h>. Y# G$ l9 T4 y/ }9 A1 W2 }
#include<linux/kernel.h>/ `3 P' `3 _5 D+ g( M/ g0 E! V
#include<linux/fs.h>
( u6 n# A6 K, a#include<linux/ioctl.h>: t" m: S8 h9 `4 a8 A
#include<linux/cdev.h>/ H! q/ e) P7 E/ ^
#include<linux/kdev_t.h>6 F: G) k+ _* }, }0 ]# p
#include<linux/gpio.h>
! J0 W3 S! |% d! m#include <mach/hardware.h>
! R4 |9 y( L" M) |9 t$ f#include <mach/irqs.h>4 Q; N2 G1 x2 O& P
+ I$ j( p  |  `; ~! r! a3 o: O
#include <asm/mach-types.h>
4 ]) e. B/ V- L- {" r#include <asm/mach/arch.h>7 j( n! {. D0 C
#include <mach/da8xx.h>
. ?0 p( Q9 }) ~  b, @4 s8 _#define  SYSCFG_BASE   0x01c14000- T" B. h& Y2 N4 w9 [5 x: t) @' b
#define  PINMUX1_OFFSET   0x124 ; N& ~. U/ s$ n% A- H
#define  PINMUX18_OFFSET  0x168 $ {! _1 O$ n8 I6 Y# _
#define  PINMUX19_OFFSET  0x16c
* I. e9 M, T. v2 y8 X#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR0 h. Q& {/ @8 A" Q1 Y6 @
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR' H( J( X1 |/ {1 X3 t* F
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR: e* C: Y; g8 X( J8 X
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% ~+ P' ?" f# Q) K#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR" h* [- Z  a5 i
                           
6 C# u' ~; U7 S6 z# C#define DXR_ADDR      0x01D11004  //MCBSP1_DXR) i. C) H1 ?7 h, [5 P! {8 `
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) k: c9 b) [- E- f//PSC
* l" b, K  B3 ]: A8 h% [: m#define  PTCMD_ADDR   0x01E27120  8 N7 ]0 f0 E3 \, S4 ]  e( t% T; v
#define  MDCTL15_ADDR 0x01E27A3C# X. E7 F$ |# L2 a8 M
#define  PDCTL1_ADDR  0x01E27304- }! o7 S& t% A
//GPIO8 direction
- }$ Z% r5 d% ]! H$ s, K/ g0 o#define GPIO8_DIRECT  0x01E260B0
: @. j$ n$ {$ D( A' r* `# r$ Q#define GPIO8_OUT     0x01E260B4
# F* w4 e; w7 S& `#define GPIO8_IN     0x01E260C0
; m& A. Y, u; t' d2 H* I8 @' w
' G1 o( _3 e0 Y- ]3 m( h//#define MCBSP1_RINT    99              1 z* Z4 A$ j# _4 ]- K
//#define MCBSP1_XINT    100  
, N# N) q. V% y# i1 Z$ ?static int MCBSP_MAJOR=239;) l/ b: |" Z0 K, z. m5 n# y
static int MCBSP_MINOR=0;
+ ?* u0 n: W! X1 `static int count =1;
7 ~7 ~' x: U& \) x3 B9 J
! V$ [; v) w5 ?% x8 C#define MCBSP_NAME  "MCBSP-device"" P. `; Z% z; R1 {

3 x4 J2 @, D' w6 r! Astatic struct cdev *mcbsp_cdev;1 O* K8 K& z0 }7 U; h3 B
static struct class *mcbsp_class;
& t: d! A  X8 h) }& hstatic dev_t mcbsp_dev;3 C7 z( V% W% S% y# e, A! O
unsigned int DRR_data;
& N$ P+ F0 l9 }. \2 @' x7 Yunsigned int DXR_data;
& f  m# h4 c+ x/ C8 U3 B1 l: x1 {static int mcbsp_open(struct inode *inode,struct file *file)8 _& {- ]4 s$ }& r/ k/ [
{
( J- d9 g9 y0 t5 i- [" J' T$ C2 V0 o   , b  c+ i, \- W$ f1 V2 I; z
   //interrupt enable,initialized
; i, E* R7 [% C3 L# i   unsigned int temp;' |( U0 ], z! l/ N9 Z' {6 |
   //SLEEP_EN(GPIO8[10])---01 `, H$ c9 n; K1 g! A8 a" v
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 X. p' l* Q; m/ r4 I
   temp=temp&(~0x00000400);
* }1 c: K$ K" c  a5 N# W5 _   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ {% J- e& M+ M. @% Y, {6 F, }  //RESETn(GPIO8[8])----0----1
! I  n/ ~/ ?& C0 X7 O   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 U7 v5 H- r+ W! G( I. J: R
   temp=temp&(~0x00000100);. z0 L0 c9 |, Z7 ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0$ C, a0 K+ Z$ X' f
   udelay(100);
! T' o3 p6 s' Y' f# W7 h& }* g9 \! P  L2 V   temp=temp| 0x00000100;
! \$ S7 S. Y8 f; b6 q- d# E4 ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  F8 W' ]. E4 c0 S8 G
   udelay(100);
) o& ?6 v$ [2 G' Z   printk("open success!\n");
; b; m+ x5 S" F: |8 w% E& D5 D   return 0;( M  \. V' s- p! H2 g2 F1 s* W( \
}4 e7 x+ O: G+ G
# D- H7 j3 r2 K
static int mcbsp_release(struct inode *inode,struct file *file)
" L2 J4 d6 X; s& s3 r) o{
7 W; O+ a3 i( j7 o; z6 p7 O6 e8 U   printk("release success!\n");
# I' |& _. d$ d% [# ^4 |   return 0;! K4 k: S) U* y
}4 j' d- U' ?3 ]  m  `: ^' z% s
1 l8 R+ J' h3 |4 C2 K* Z, i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! z; H1 a2 ?* S{$ A) j. S# X3 M2 t
    copy_from_user(&DXR_data,buf,len);3 H  E/ j% I: t; Z9 u. Q; A
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       9 |% M# K6 D+ d% z- q
    return 0;* g0 R2 P+ ?( f, V% p5 N

8 R! }4 ?) ?) i9 `}
9 W# S3 ~- ^( Y" I2 C8 G
  y5 j9 O% t$ T* A% mstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% J1 k5 N3 h0 A" u7 a. B{
7 V, ]; ~+ Q- E% F' Y   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" k4 v) D* q8 i2 g$ u3 ?   copy_to_user(buf,&DRR_data,len); 9 e& A6 q# a% K) [$ i
   return 0;  \( [" G0 {  f7 C$ U! B
}( e3 C* I; v8 l4 r* }
! Y" J3 r0 [) X+ q8 S

  d9 q! p$ D& ]- k, _$ W& u1 K6 l  K* Vstatic struct  file_operations mcbsp_fops=
7 p1 [+ b, m& q. f" M{
* k, q) i1 N% V8 c" ?: T   .owner=THIS_MODULE,
7 l9 K# K! y) y8 U: ^$ j   .open=mcbsp_open,
: u2 Q) O! |- C6 f   .release=mcbsp_release,
8 K: `% c8 c- x8 i* K: u8 I   .write=mcbsp_write,+ f( |5 N# s5 F) m+ s$ V1 g
   .read=mcbsp_read,+ t' I# F( R4 _" V7 ~( F! i
};" j; {3 @% D3 n. u! h; S8 L
static int __init MCBSP_init(void)) L2 I$ _& c4 b* g  p3 j
{
7 D. V) s6 x  i  R- Z& P   int ret;) _4 @; ~1 Y4 V3 J! J
   unsigned  int   PINMUX1_REG_old;9 y- h9 @) d: _9 D( l  Y7 o
   unsigned  int   PINMUX18_REG_old;
; N' P# E1 Z1 J/ }. {9 |$ U/ E   unsigned  int   PINMUX19_REG_old;
  [+ C6 o# J1 {% _0 y8 `   unsigned  int   temp;  . h+ g* h- w, e- T' h
   if(MCBSP_MAJOR)
# y% h: v9 r' D) p   {
- \( l0 ~- N& T/ |8 E+ o      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% R* P- |* d- N4 i! v& B      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& m, f6 e6 J2 y9 E. W
   }: j: J: D5 y6 J2 J% t/ ]0 }
   else& [6 J' f' D6 t/ c: m! {
   {
& d7 _. J* F  M6 A) {8 h3 M5 L6 f- R      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
2 X3 k; V6 ]% j! u) J+ p      MCBSP_MAJOR=MAJOR(mcbsp_dev);0 p4 L8 W) \& W
   }
) d( D3 b  k* [" {$ r: P   ' |  ]: J  `# ~0 O+ E& \# @
   if(ret<0)+ S' `: k, R$ m  Q; ~
   {
% h+ [; K) U7 e8 s" ?1 s2 S      printk(KERN_ERR "register chrdev fail!");3 O  A, r0 j# j4 u1 @2 O( I- R4 C/ a
      return -1;
) q- m" v3 R0 t. B+ j& S   }5 v( \6 l6 \6 s
   
  C& ^7 S; F  s8 E7 j( v* G# g' x   mcbsp_cdev=cdev_alloc();+ o- d9 C& v/ B3 e' Y
   * i+ z# C) E  |4 H% M
   if(mcbsp_cdev!=NULL)
9 ^) C4 k* o; t% b  \   {$ F" C0 x% }4 a5 i: L2 m* n1 x4 F
      cdev_init(mcbsp_cdev,&mcbsp_fops);
4 D2 H. R- t/ F7 A2 j* {+ G9 d      mcbsp_cdev->ops=&mcbsp_fops;
6 e7 u! h  n0 |! T3 ?      mcbsp_cdev->owner=THIS_MODULE;
- ]9 l& `6 A' G2 D; c4 M" l- E      
! t6 a& {# S5 T      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ q# A  p; a; N          printk(KERN_ERR "register cdev fail!");
, |9 F& ^3 W' k2 a4 r1 e      else* c& l  _- Q4 m5 C6 d- K
          printk(KERN_ERR "register success!\n");
' K' x# n0 h* S! D( D   }& q. @2 x- R: {+ ^1 e
   else
& I" n; X* d7 I. A8 x   {6 F9 X' C+ k$ c3 I6 l
      printk(KERN_ERR "register cdev err!");
; g* G* \7 l1 l/ f      return -1;8 M! ^& \, l$ H) ?& D
   }
: M* a; K7 a4 s9 a   
7 M  _0 ?+ c! \3 S  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( M+ g# i# v. v: W   if(IS_ERR(mcbsp_class))
# V* N" H. v  ~# B   {
4 I$ b. C: I, S/ T9 Z      printk(KERN_ERR "register class err!");' j- y1 u5 {1 C7 o0 z. U/ w
   return -1;9 Z% S1 _0 E4 d3 C! A# f6 g
   }$ e6 P) s( R  c. n+ d& B
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! {( u1 a1 H$ m

) K$ m8 Y4 \& W! `7 u; j) Z' M   //PSC' i1 _( U9 b. o8 U7 W
   //add Enable MCBSP; C+ e0 G! s( s
   //test
- J: T. V+ ^1 O+ ?! l- d6 Z   temp = 0x80000003;
$ f$ r- Y9 G4 E4 I9 G3 g, e   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 u/ @  R1 u& f+ q3 Y
   temp = 0x00000003;- H9 w: V" G# \7 l
   writel(temp, IO_ADDRESS(PTCMD_ADDR));1 k* I( }( E5 T. B6 d. d

( t4 }9 m6 M& l7 U6 z% ?- |& v% L   temp = 0x001FF201;
& ^" ~" m. N) Z   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  |  d+ O" v% H- j# l  H5 o1 w   
# |2 m) i+ ]5 W# _' J" \' N   //PINMUX  9 Q1 Z! Q9 @& K) [) L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 ?4 C! u" Q6 t, x1 s$ [& J& p; i) w
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
: N( X* `. M8 P) X   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) r+ S/ l  o# C4 u3 Y  k( D
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ ^9 E7 r4 }3 T+ K1 o7 S   ( H" `3 G. |9 b% \5 d" C+ I
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 n$ [* Q) V( z$ ~   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  7 C! C* k4 v" O1 r8 u
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# I. u/ J% }: O% l+ m   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 F+ `1 E: g6 |1 H
/ E- m6 v0 a  {& i( \. I   //RESETn,L138_SHK2) s0 d- ]- Y+ M# C
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ) e. q2 O) R: p1 N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  }8 M! Y8 L8 Z1 g- q, `   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: A4 _- q8 X* u6 ? 9 _  [; W; f" k9 Y; b' a

2 Y. ~9 \! u9 O  //SPCR Register  p& H+ R4 j" y1 K. s
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset  A, n& X7 s+ V9 {4 p- U$ }
  temp = 0x03000000;//(DLB=0). V# f! P' @0 l+ _# ?; M
// temp = 0x03008000;//(DLB=1)1 t! u5 A' j- p" i4 G
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset/ M( L0 d4 ^# t' ]* V3 C3 z! J
  temp = readl(IO_ADDRESS(SPCR_ADDR));
- p/ K: K4 V6 n  printk("temp=%x\n",temp);- k8 ^) N. ?, ]7 P0 P8 F6 K5 V
& v8 ~! s% P/ w/ d, J9 b2 m2 L
   //PCR Register2 U' i0 V8 `, ^
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
. ]5 D$ X/ t' l  f5 F3 p3 L/ }3 y  // temp = 0x00000F0F;8 {% u/ ^% k' ~7 ?# g  a7 T9 S# P
  temp = 0x00000B0F;
+ E' f! w, N* W( }  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ) B2 x; ], a* f1 D) M# F* K% p2 E, ?# f
  temp = readl(IO_ADDRESS(PCR_ADDR));
2 {' K0 U* y& P3 m  printk("temp=%x\n",temp);  8 K7 q/ e9 V9 ?/ g2 n
   //SRGR Register
# Y. ?% @8 x3 `+ S  \8 L  P  C   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' L+ [' K" o1 z6 y8 F //temp = 0x301F000B;7 b9 i6 r, C. D) N3 S7 U- H
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. n: S: ^5 a0 p1 ~9 V  temp = readl(IO_ADDRESS(SRGR_ADDR));# E0 o/ J1 T8 H9 Z/ ^. Y; V: F, H
  printk("temp=%x\n",temp);0 j7 d1 |5 M9 H* O6 t: M
   //RCR$ @1 t( q, F: @) K& \
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
/ T* @5 \& @3 Z   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
* h- T& m3 |. ~; b   temp = 0x00440040;
" O* `/ Z% v7 h$ r7 N2 p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  d+ p/ {1 {; v8 [. B   temp = readl(IO_ADDRESS(RCR_ADDR));
1 O3 C0 @% c5 R5 M% q: A   printk("temp=%x\n",temp);
9 h) D) J; T1 a( p5 K   //XCR' C2 o* z( S! z! g) N9 }% d
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 j) ?) T* m$ E+ {. `. z! \9 i   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* z! B# `0 W: ?3 f  M+ T
   temp = 0x00440040;
/ z1 x4 e4 T: J* F8 M   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   - {& ?/ l5 [) w9 Z) N
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ I& K7 C  r: }   printk("temp=%x\n",temp);
( H. j+ Z2 ^3 j; d3 V  udelay(100);# ?( F, Q  E$ B- L! ]. ^
  //SPCR Register+ z: _1 i0 J; D$ N6 C0 [, E
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( X8 X0 a: q: e# @3 n
  temp = 0x03C10001;   //DLB = 0 VS DLB = 17 G8 _8 ]. ~8 v% l$ L. `
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" C. O, S+ l  t* k1 Q
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 f$ W- J* t3 e" j8 ^1 j
  printk("temp=%x\n",temp);
% M& S+ M. C! Q. E( w/ u& y  udelay(100);
. n$ \; G; ~. }4 a5 u" ]9 ~$ w9 [6 s0 v8 e) F
  //set GPIO direction
) ?" s: s9 l! V, p$ I   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( j1 N& h- B/ j   temp = temp | 0x00000100;//EPR----input
$ `) d. F( W- Z2 L   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& D# j: R+ E7 L; ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 I2 ]- L$ Q& L) V# P3 ^ 7 L+ {+ M; ?4 R! `$ n
   return 0;' q  h1 j! I, P8 l1 A0 g9 I. y
}/ v  V! ?% Q5 V* L& B
static void __exit MCBSP_exit(void)" G/ {) C! C- g: Z" N' e' X
{( Q+ e- ?, |  O3 q4 g$ D$ d/ X
   printk("mcbsp chrdev exit!\n");
/ F8 }* Y$ F0 T7 v4 f* `6 O- Z   cdev_del(mcbsp_cdev);! p3 R# Y) S* j) {# }# ?; m  ~
   unregister_chrdev_region(mcbsp_dev,count);2 l; d' |$ M. f! Z2 g7 F- ^& m0 S
   device_destroy(mcbsp_class,mcbsp_dev);  ], c# G7 i+ ?
   class_destroy(mcbsp_class);
. J3 C3 i$ p# v! m1 N  \2 Y& k}; t0 \/ v$ {" B& ?$ s8 U4 d
module_init(MCBSP_init);
! ?8 r, g7 N. S$ B9 @8 C0 Kmodule_exit(MCBSP_exit);, I0 q. A5 I! D9 M( n6 w! e/ j9 b
6 H$ k) k4 V% w- S9 F" k( q
MODULE_LICENSE("GPL");
/ i' l1 L0 y: |" g5 |% s9 b0 p% T5 I( O  |4 z- c7 h
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
+ b2 e( r3 H4 R7 V! ^% K) Z- q" V我的应用层的测试程序如下3 L' z9 w7 `) j: b" C6 u  }8 Q
#include <stdio.h>: @: a1 N$ O* {4 s) i* \2 r( }
#include <string.h>- P4 Q2 w) h* u
#include <fcntl.h>4 Q  T) S% k/ m
#include <unistd.h>
, m; u/ Q6 |  r. D6 J6 b( n#include <signal.h>. k8 O: I+ A) [) U
#include <pthread.h>       //线程
7 K: {; _/ W# V& z#include <stdlib.h>
, N9 u/ L8 ~4 y# z4 y( J5 ^#include <pcap.h>          //捕获网口数据: T% J0 U! Q8 X
#include <semaphore.h>     //信号. S" X" k* `& K  d% ~
#include <sys/types.h>     //消息对列
) V- o1 ^* T6 T' s" u- e$ L6 X#include <sys/ipc.h>       //消息队列
) ^! @. X' K0 }5 U3 t#include <sys/msg.h>       //消息队列
( {9 c% d1 ?! k#include <sys/select.h>' d/ R/ |* A6 L  q0 H  k2 Y0 Y, i
#include <sys/syscall.h>% o; b7 ^: u) O- ^& g$ C
#include <sys/stat.h>6 _0 w7 U- n) m$ W5 n5 y8 k+ \  D$ B
#include <sys/mman.h>
' ~/ E$ i9 d6 B& |5 X7 o#define msleep(x) usleep(1000*x). p2 b, t. R$ A' O9 b1 z% g2 R9 [

4 x- _6 m2 D5 }: D: {. tint main()
8 H0 S" M' {! j# A  s- o{ ; v) n9 F3 h& ^' m& r" g
    //MCBSP,ARM与AMBE2000交互设备
# v' @+ O" C6 |# `) a9 P, R int fd;* w8 z, Y9 p# K! D
unsigned short data_write = 0x5555;/ o/ E" o- a9 r- H; c
unsigned short data_read = 0x00;% |) t) Q! _4 ]( m. R& C9 n
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 s! P5 d0 A7 k6 _2 P //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- M$ I4 W4 i5 Z& g6 R3 U    3 {! W$ v/ F& U! P! l
  if(fd < 0)2 `4 s: ~& r) U. x, _' O+ Y
  {
. \' {+ q( t* ?9 s' A1 i     perror("open failed\n");4 @5 M$ z6 ]; O% l! }" _
     return -1;
6 a( v' y# v; Q8 }% h& f# V' }# n  }  l  H. w( f: ^: [
  
" e: S% I9 F7 u% h& A7 d  while(1)* g: V1 ^+ L/ n8 R4 T4 \; \( Z
  {
7 c0 A& X' M" L4 U" A8 Y9 i   4 ^3 m5 V( d; c% P' j* p
   //AMBE2000每次读写是24个字为一帧
) c" o$ K1 |7 I   //写数据时将数据在底层存储起来,等到中断的时候再发送
$ E+ v( z: g* `2 m* [/ r4 I   //AMBE2000输入数据是以0x13EC开头的
. Z4 Q+ G. o7 E$ h6 k2 G; z* k8 L# C   write(fd,&data_write,sizeof(unsigned short));
3 x* B% k9 f$ ^$ K   0 L; A0 y9 d# I: P0 J
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
! P0 o- e  X: h: ]( S   read(fd,&data_read,sizeof(unsigned short));
# g* ?3 p: g( K* y   : V" }) v  z9 P6 n' M5 y
   if(data_read == 0x13Ec)
7 C+ {/ p0 e' e# y- Q   {# I5 o  m' V: C  I* G( N& _( P
   
$ r9 e+ [0 y7 _3 w; x    printf("data_read = %x\n",data_read);7 v! A- N% z2 M6 _1 Q
   }9 `) X* y2 a8 [# E% U3 X
   
+ D9 ]1 O( h) x8 l3 E! T7 G' [8 ~2 n   msleep(10);7 {" x2 w) G; }! b* s# p
  
" D& b- Z, p4 |: t  /*
  @6 S$ I# F5 n7 d, P   ioctl(fd,1);   ; l# f* P  C, A9 j9 }0 s# ]$ U8 A
sleep(1);& \! @2 M5 A% m9 M. s5 \, D2 @
ioctl(fd,0);
. j  j! ~8 K/ F% d! k# C. { sleep(1);
+ ^# u/ H1 c! d4 E( T */
% f0 a3 Z, y5 X; Z+ W% ^  }   ; `7 m1 b1 [. ~, Y* l' d3 ]" R
return 0;
2 W* ]1 C% j0 ^7 ^5 c# ?
! D) @, B& M8 w7 W8 X& u6 R}
( Q+ s0 F: @& ]# I3 P2 O6 w( o/ [- a- P" ^+ @  U
多谢各位指教,谢谢! 急
/ Q7 }) {) C) u% _( z: o/ ~, X6 g8 K1 ]" ^
& e4 b% Y. Z) ^, b
6 n( o8 n' r) H  R7 A
2 [) p+ r* ^0 u: g% b

  j2 h( ?  {8 Y5 D9 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 12:38 , Processed in 0.065784 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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