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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 y8 T& j5 h. s! a. r& l  }! S/*
) B  ~& F$ k) F' L* N * Copyright (C) 2009 Texas Instruments Inc6 k& v, L( D  I9 `) x
*  f6 |0 l- ]( y6 _9 U, w8 y
* This program is free software; you can redistribute it and/or modify2 s- @+ q4 D( W. |' H7 f
* it under the terms of the GNU General Public License as published by
! S3 x3 r3 M9 r4 d1 A4 g- A * the Free Software Foundation; either version 2 of the License, or
, ^2 R; Z& S( Y% e * (at your option)any later version.
; M/ Z; i6 b4 `4 K& h1 o *
( _2 ?/ x+ t3 g. s% Q" Y * This program is distributed in the hope that it will be useful,
+ u0 g- x9 e* I8 v * but WITHOUT ANY WARRANTY; without even the implied warranty of
" s" o( _# {1 E# `2 t, q# ?' T * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ I* i$ _& Z2 v. {* {% L * GNU General Public License for more details.  B( U. P2 c+ y* U
*
; f6 A( T/ S( v * You should have received a copy of the GNU General Public License
5 H6 ?2 L) D# w- ^4 T- i( } * along with this program; if not, write to the Free Software+ k2 z# }7 F7 B- T3 ~
* Foundati) v+ ]; l: j% _$ ?
*// ]. G. B8 {4 R6 j
#include <linux/module.h>5 \& {' u( u" l( A
#include <linux/init.h>$ s5 q1 F( }, ~  Q3 ]+ k4 Y/ |) A
#include <linux/errno.h>4 i, k( j+ O* P* \3 E
#include <linux/types.h>, j2 S* R+ ~8 `; @: A
#include <linux/interrupt.h>
, P9 k5 Q% B4 j) b' w#include <linux/io.h>
+ @6 c& x+ V( h0 z#include <linux/sysctl.h>
$ A9 {" b/ X) J#include <linux/mm.h>* f6 @4 b/ B& V  \: D
#include <linux/delay.h>
1 g4 B! f5 ]7 v5 E& P0 R#include<linux/kernel.h>
! M: C% u% e8 W% x, g#include<linux/fs.h>8 ]3 h- t6 X& q
#include<linux/ioctl.h>: ?5 l2 ~+ t! r6 p( L  G; N
#include<linux/cdev.h>' z! T: U5 B$ e, j/ h
#include<linux/kdev_t.h>
1 ~% T/ Q4 _: r6 H8 c  U4 c#include<linux/gpio.h>
7 p1 B0 o2 h& |/ z6 h. ~0 l# n#include <mach/hardware.h># P8 J! O/ P3 j/ ?: a
#include <mach/irqs.h>
9 N2 S$ G% h' T' V' M- C- k. o
#include <asm/mach-types.h>
5 g* @/ a' @0 r3 u+ S4 m#include <asm/mach/arch.h>$ x& X4 q+ v) J) @& H' ^2 A8 R7 v
#include <mach/da8xx.h>
0 A4 E1 L: ]; I  f0 i#define  SYSCFG_BASE   0x01c14000; D. H9 O9 u6 D+ t5 f, k1 ?
#define  PINMUX1_OFFSET   0x124 0 O; K) C3 c% Q1 j( B  K
#define  PINMUX18_OFFSET  0x168
, H7 \+ v, \3 j/ I#define  PINMUX19_OFFSET  0x16c# ~- @7 t% v3 x7 \2 k9 f+ e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
( T4 Q) E. D' @2 l( h; R#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. a  z; H5 M4 l4 a9 }/ N1 V# T+ {; i
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% i* l; f, j3 }4 w( d3 r3 K9 @#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
! z$ k5 B/ h6 u- B- }$ o. j7 x#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
0 B0 G' D- v# Z2 u7 @* l4 P                            / q5 p. V' x$ W- K& k6 m1 R
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR9 O8 h$ ?7 {& `5 [$ I( O
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR( q' b* N1 I2 V1 k. k0 o% E, \
//PSC/ u1 ^$ j3 N; b1 ?* I5 q9 w- H/ u
#define  PTCMD_ADDR   0x01E27120  ! P+ x/ Y& G+ y# L0 I+ u! T: d/ ?' L. l
#define  MDCTL15_ADDR 0x01E27A3C
( B4 Z, q  \& }0 K#define  PDCTL1_ADDR  0x01E27304$ t% p8 z! Y2 Z) R0 f4 h
//GPIO8 direction
# l/ D. R/ M; z1 B7 m- f#define GPIO8_DIRECT  0x01E260B0: Y. s) M7 d- g% ^, ?3 p. a: Y
#define GPIO8_OUT     0x01E260B4/ z* _+ b9 D; G8 v1 ~: }
#define GPIO8_IN     0x01E260C0# i1 i* v$ f1 N1 N1 [- r
# F7 l6 T8 f2 A6 E/ U7 v5 \
//#define MCBSP1_RINT    99              
. A$ E' ~# k; c' A. ]' C//#define MCBSP1_XINT    100  
& ]8 A( p3 P  y" P; [5 [static int MCBSP_MAJOR=239;
0 ^8 l/ C! u: Z, ~: D6 U- w! zstatic int MCBSP_MINOR=0;
# O% e8 V9 c4 @/ N4 U! o# X4 ~static int count =1;
% Y. v/ @8 s+ O  Z3 y+ Z# F+ q" w4 T& t
#define MCBSP_NAME  "MCBSP-device"* }5 Y7 }4 `& H, \+ V+ e% w& Z7 ]

& n5 o1 t7 f6 C& Hstatic struct cdev *mcbsp_cdev;/ L5 z* e- O- t9 i: b6 g
static struct class *mcbsp_class;# h$ v' E" B' T/ o% L0 K* k5 o
static dev_t mcbsp_dev;9 r$ S3 ?, ]; ~; a
unsigned int DRR_data;
: q7 _+ S/ E  l# u8 }( H* y" o/ Hunsigned int DXR_data;; l; Z# q+ }, {4 q4 j( R
static int mcbsp_open(struct inode *inode,struct file *file)5 a7 Q, D  E# n# {4 H# E# F
{
6 }$ ]* E$ i" ~0 F$ w3 n, \, Y   
: }5 n8 @4 c6 }1 b! J   //interrupt enable,initialized
  z) i. R" |4 J7 Q* S   unsigned int temp;
0 Z/ Z0 g  k( ?3 X   //SLEEP_EN(GPIO8[10])---0$ |9 R) f1 Z& R$ E
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' u! z3 k; b$ s0 @( ]   temp=temp&(~0x00000400);
3 C' v* U7 E0 n1 r' Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 p7 B4 i9 Z) S  //RESETn(GPIO8[8])----0----1  a/ K" ?8 ]3 `. t1 L) v* E
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ P# v- C5 O9 A2 g
   temp=temp&(~0x00000100);- W# q8 Q) ]7 M% ]8 i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* f- C( Y; M, J' I/ b4 Y+ J5 r- r   udelay(100);
9 ^0 U& k2 B% y7 Y2 m8 Q   temp=temp| 0x00000100;) b) y9 \* o0 C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; k; a% r. r9 M4 u: h& X   udelay(100);
: w5 W6 ^9 X' X: v7 \   printk("open success!\n");7 ^- |" k% @7 n! c4 \1 U, h2 I
   return 0;
+ _: `( O& T: G) j2 j2 h/ L}- F! J7 X7 Y- z% D! }! K0 j

# j- @6 ~- ?6 E, w3 q4 kstatic int mcbsp_release(struct inode *inode,struct file *file)
: l3 I+ X4 I* X! x4 _  H* A' K: n{
+ T  |( U# s- c   printk("release success!\n");% B9 `& x% ~  l1 C
   return 0;# ]6 u+ b+ ]: r- e' u4 P4 \
}
, j1 `8 p; |5 b
6 C, b" p1 v2 x4 n4 j& z! Kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 X5 d; M, \7 c/ b{( D8 K8 z" A4 u* }( R& n- S) |- m. r
    copy_from_user(&DXR_data,buf,len);
* D: s0 d: z' k; y$ p    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       9 T& Q& [5 s1 B5 x0 \8 H) b+ x
    return 0;
; y, ^- o9 Q3 S5 {+ d ! K$ l' O! P& [2 R0 i
}
7 B4 s+ ?+ j) Q$ [1 y
- `6 u! m( G  G  j# Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* G! g( s- u5 ]- x4 }{
, j- Z9 `( A  K& D( b. F7 E3 X   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 I4 H; \* h% k4 s
   copy_to_user(buf,&DRR_data,len);
$ I# G' n6 Y5 @# n   return 0;
3 h- e) ?0 f. n: j}& {3 I3 [# t; Z2 r% m# w3 p& ]
: y& {' `1 ^6 P9 J' O

$ Z1 R5 v) X  X& G/ pstatic struct  file_operations mcbsp_fops=
6 k% G$ ]3 j9 p9 G{3 ~1 z/ V+ K& P; V8 O4 ]
   .owner=THIS_MODULE,
4 S% n! F. Y- r$ z3 g0 w7 [   .open=mcbsp_open,9 [. @' ~6 U- N1 w1 a
   .release=mcbsp_release,
* w  _+ L3 ^  e2 r   .write=mcbsp_write,0 \' D6 Y* s1 Y" C
   .read=mcbsp_read,
7 W0 K; I5 t  s};- `& m! w$ L% E
static int __init MCBSP_init(void)
$ J3 m% I! e' ~{
$ e0 R: f$ [  S% l7 q   int ret;2 ]* j3 f% P# k- s
   unsigned  int   PINMUX1_REG_old;! ?' ?* A% H2 d( s$ A
   unsigned  int   PINMUX18_REG_old;8 Q: g/ w& h/ y
   unsigned  int   PINMUX19_REG_old;5 v+ u$ d. ]1 u6 u* D/ |
   unsigned  int   temp;  8 |* j; b7 l+ w5 Z4 D) ~
   if(MCBSP_MAJOR)
+ d3 U6 g* m! @! p  K& `7 j5 b   {
- y/ h8 ], h: h, g, F9 k) h      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 {: r+ I; ~) Z% R  K      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 r6 ]: T6 T8 e; q' q: U   }
7 i, _2 K: ^. \) |: \% J   else4 e/ c, b- v  m( T
   {* O( [* p6 T9 U. E3 M6 z3 M, O
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& w* A) v: c1 Q' v9 P$ ]) b6 E! n
      MCBSP_MAJOR=MAJOR(mcbsp_dev);' W% l7 r+ P* Q
   }2 F! I+ X3 _+ u) S( h/ d% d1 c' u
   
0 y0 X1 g! E& x8 g5 ~5 Z6 Y, ~   if(ret<0)6 c* y  V3 @% x6 Z( V7 e4 H
   {
* g8 u( s5 |  f4 M6 W# O6 E      printk(KERN_ERR "register chrdev fail!");# K# K# p+ s4 ^, \( H+ K
      return -1;: X8 ~8 D6 k, F1 N
   }
: H  f" Z1 {- o( ?   
, W9 w* s  i* r: w; ?/ i8 k, ]   mcbsp_cdev=cdev_alloc();
" I% o! P. W5 m& g5 X   
6 m7 F. T  |: \3 B2 ]+ |   if(mcbsp_cdev!=NULL)3 D' F; h. P& @. j4 G
   {
8 A3 h. m. G. _- G$ ?      cdev_init(mcbsp_cdev,&mcbsp_fops);
' W( b. \- N+ R. u7 q      mcbsp_cdev->ops=&mcbsp_fops;: ?  F* T9 S# R/ u' G! d. I
      mcbsp_cdev->owner=THIS_MODULE;
7 k9 s) H) I1 I      . y: p* H! }2 Z- {  y0 E
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% F4 ~; X# \- b2 M. ~/ S
          printk(KERN_ERR "register cdev fail!");' S+ I1 }$ L+ f; T! }! ^! U) N: k
      else/ Q2 R+ P  \- v' x$ L
          printk(KERN_ERR "register success!\n");+ Z( J. O  }8 v* y! z
   }
5 {0 }1 A/ o8 c: J   else
2 `' K% k1 [# r" J7 \" p   {
- h% M' \0 q7 v) a& K      printk(KERN_ERR "register cdev err!");
9 C& d. f# b1 O      return -1;% l: S+ c& x& R4 b4 ~
   }8 \. ^7 }4 L- y, ~5 F9 G
   
4 R5 k0 g/ b; X* \, Y; n+ T$ ?  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 ^6 h' ~: o4 S7 r% t  \2 k1 {   if(IS_ERR(mcbsp_class))
$ \& q' K  ]9 g8 n4 T5 m   {
, I2 t5 z$ e' e; K      printk(KERN_ERR "register class err!");) B. I9 C0 q' v- q
   return -1;
- G/ W. m# I) s   }
  U) D: S$ K8 w2 S! h, u5 {   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 ]( o' y  a" H9 s8 _
+ L* a$ D. |: o4 H5 o   //PSC$ P* x1 v$ L8 d; a) f/ O' u2 j
   //add Enable MCBSP  Z$ j. z' a4 X7 y' C" G( _7 r
   //test, j5 l3 n6 \. ^: g# l
   temp = 0x80000003;5 f) G2 }1 E6 q9 L; f) w
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 e) `2 @; A% a# B, j   temp = 0x00000003;: ~( Q# C( [7 a  l" b, m
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& ?3 ]& y5 D# U+ c4 G% S - k  H$ g$ v  G' p9 Z& V9 ?
   temp = 0x001FF201;
5 i! G1 [# Y' ^( V9 D. p+ J   writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 @  y- F4 E) U3 d
   
/ W2 z' w2 E3 a% z% s& M   //PINMUX  
( [- a  r0 c; \* l1 [) n0 J. p8 T) ^   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. @& i5 V# v# P2 u( ^
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 m0 C4 D& r5 ]   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ( }# l2 t: Z& \) n9 Y. ]9 N2 H
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 {2 L' t0 `# @  r) G8 i1 S+ F
   
: U" E8 i7 P1 Y8 o' n( G) Y   //SLEEP_EN,EPR,L138_SHK1,L138_RC$ u7 @  b1 g4 {6 `; b7 u- b
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
4 B) ?4 r; V) z6 Z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   8 o" F2 }, W6 d1 \# `1 h; C" [
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);* }) e4 v, [7 A9 b
8 \" D- ~; @$ u( c# L  m
   //RESETn,L138_SHK22 M: b& V+ M2 |
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
4 c6 U6 n9 e& w: O' X2 n+ t! T   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   + m  Z8 j4 p) q: v  j, J0 u
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
  C2 Z3 Y. {' w . g, y* l  p- w
; i: X2 e6 m* w
  //SPCR Register8 B5 \% f8 c, K4 J
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' A* X5 a* [! N2 o( J8 y  temp = 0x03000000;//(DLB=0)1 S' i. X; u" G- w, ?
// temp = 0x03008000;//(DLB=1): k8 e' n6 w2 T* r! V' L+ v% d* w! l
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ H5 Q( m7 C5 X9 Z9 |" e+ J- x  temp = readl(IO_ADDRESS(SPCR_ADDR));5 ]% |5 M% z6 j/ n- W
  printk("temp=%x\n",temp);
& s! c5 H! i4 g4 {& O
7 _0 J- Q. c1 D# T   //PCR Register  Z2 f7 }6 o  `& I' u0 H5 n; L
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 n8 J3 u7 J: i- M% ~- B( `! M  // temp = 0x00000F0F;
' N$ J1 H9 a7 d% u  temp = 0x00000B0F;
3 j& u$ ?; u( M9 {3 Y( l1 B  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   F3 j; t& O) w! C( ?: a) K
  temp = readl(IO_ADDRESS(PCR_ADDR));
/ T6 d# I& D0 M0 F6 }' _  printk("temp=%x\n",temp);  9 r! r% \/ X1 m2 t
   //SRGR Register
5 l  s9 ?1 w* ~" E+ j   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ w+ ~) _7 ~& T
//temp = 0x301F000B;
5 \* r# [7 d+ X, J   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. f' w- {0 o  {  temp = readl(IO_ADDRESS(SRGR_ADDR));, W+ r$ P5 f1 b2 t! Z5 B3 W, m
  printk("temp=%x\n",temp);) D5 T* D  E6 f" U  O
   //RCR2 G1 w1 r$ m" F8 _* z2 e& t- B
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 E% {5 I: S+ l5 l  }9 g- Z# z- P
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 N1 f( P9 H8 F$ j7 _6 A
   temp = 0x00440040;
6 E7 V! h: L7 l   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
! N/ T" ?  h6 s* P   temp = readl(IO_ADDRESS(RCR_ADDR));
, k! J( }- C5 Z/ p/ @% N   printk("temp=%x\n",temp);
  h! S& G6 r6 o2 p, k   //XCR
% R5 @$ ~6 V2 L4 |   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* g; ~* r$ j1 {, F! N# O) L   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 C/ o4 A( N! R6 V
   temp = 0x00440040;
# B7 N" S9 X2 {  W- e0 \: d   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
. [% o8 K0 R2 t+ h* ^   temp = readl(IO_ADDRESS(XCR_ADDR));
( v$ q+ f0 D. @   printk("temp=%x\n",temp);
; D* b9 [* K1 M6 m- M  udelay(100);# S9 d% D+ @9 R5 k, s" Q' K
  //SPCR Register5 q) z) [6 \3 K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 I8 _* |" W- b$ i  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
# Q& O+ E6 I' Q+ o  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
' t, y# m5 b# r' S5 m. O' j6 U  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ p! S4 J+ i) R# t* P2 [. I7 y5 W  printk("temp=%x\n",temp);
$ ~* B* V2 R, Z* O2 }  udelay(100);, p9 Y% E) Y" D3 A
, F: }/ `9 |. |: ^( c6 M3 u  C
  //set GPIO direction4 Z' R. i* K( {3 P' ?* }6 E8 H
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));  O" ^- \; H0 A/ F
   temp = temp | 0x00000100;//EPR----input4 {1 S0 P  M# Y; k% v( O: }
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. |1 X$ o. l* F2 I+ L5 @* b
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; P9 g# V4 b! f 5 U5 _2 G: Q" N$ p" }* b, D
   return 0;5 o8 J2 U7 }& o! W
}8 o- h4 D% P3 \' d+ U3 ?
static void __exit MCBSP_exit(void)- E) R2 N" Q8 ]8 ^5 e
{2 Z9 A% O- j# r4 f
   printk("mcbsp chrdev exit!\n");& W8 j3 t; w- @8 i0 @
   cdev_del(mcbsp_cdev);! {! s3 \% \* \9 I* f1 E
   unregister_chrdev_region(mcbsp_dev,count);' r. H  o7 w5 a/ S, m8 Y) G8 V+ b: }5 L
   device_destroy(mcbsp_class,mcbsp_dev);
; J* ~0 H. \8 v1 Z3 T8 G& x  k   class_destroy(mcbsp_class);2 a: z- q2 m% K5 X! i9 n
}
1 s3 j7 _4 z+ a, v3 c# Lmodule_init(MCBSP_init);
4 k7 K! J% b8 `3 u  P3 i7 ymodule_exit(MCBSP_exit);% x  X7 M0 Q* m: M; e1 v
. ?/ e6 A& d& P  z) F- M! r4 r
MODULE_LICENSE("GPL");
6 B& W( t0 G5 x$ ]  O2 B' ^! v+ E) F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 J; f" }7 e) J( U: y
我的应用层的测试程序如下
/ U3 C  H2 |7 r* C# F: [#include <stdio.h>
1 n! W& Z) U4 l$ x: K#include <string.h>; P7 e# s* [6 C
#include <fcntl.h>
  e" S5 z( W/ f  \#include <unistd.h>! D) f3 K7 g0 T3 P
#include <signal.h>
+ x' Q7 I7 y) D#include <pthread.h>       //线程* f& Y  G5 i. D# @" j' n- D
#include <stdlib.h>, f% E& u4 x( D, o
#include <pcap.h>          //捕获网口数据: }5 I: C( u" a
#include <semaphore.h>     //信号
0 k0 H  E$ \( n$ a( B' |#include <sys/types.h>     //消息对列: M$ H4 o# d- ]) c0 N% K
#include <sys/ipc.h>       //消息队列# a+ W$ q1 h: X
#include <sys/msg.h>       //消息队列
+ V0 O. k1 o5 P# F& `#include <sys/select.h>
! [9 G1 D- X2 X; u! {2 T% J#include <sys/syscall.h>! p5 a/ Y0 V7 J; V  d
#include <sys/stat.h>
* b4 o! y+ Y% ^! W3 I3 K' M#include <sys/mman.h>' ^2 P1 Q0 O& R, y1 M, s# _
#define msleep(x) usleep(1000*x)3 p6 b3 V  m- [* X, {5 l

4 i# X7 L$ I/ \; y- J& z1 ~int main()8 e% Z% h5 O5 s/ S
{ + C$ j# k* a# A& J  v- `1 o
    //MCBSP,ARM与AMBE2000交互设备
, V& }" y( D+ y3 B/ Y9 Z" e7 q4 f& E& y int fd;' W0 g1 Q; H& h3 X' X0 K0 y
unsigned short data_write = 0x5555;' @/ B( \4 ?. O% ^% G
unsigned short data_read = 0x00;
: Q5 a+ E0 O; V" M  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 A2 [) [1 [+ y5 D
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 L1 @) y/ o$ c- P; `  e- L8 }/ `   
- D3 v* O7 B! f. h: p! X, }7 {  if(fd < 0)0 ^- n( ?: Z1 t4 N4 l" p
  {% l' w3 X0 S+ ?) ^% ?
     perror("open failed\n");
0 Y9 e/ d  b: N  U     return -1;
7 _8 |1 D# P3 q2 ^# n  }
" b! c% d/ Q/ p, C  r1 v) b$ r$ l  , c* h5 U0 y, X7 p' G
  while(1)
% g; |3 R$ _# J6 K( y' ]  {2 N* B7 X$ H5 w" p/ w9 H
   
) o6 r2 L/ |) [8 _+ |   //AMBE2000每次读写是24个字为一帧
+ P6 i4 t) }- u! D0 v& z, S   //写数据时将数据在底层存储起来,等到中断的时候再发送' g$ ?3 z0 o- w' P* [
   //AMBE2000输入数据是以0x13EC开头的
3 {9 t, G! P0 W' ~' [   write(fd,&data_write,sizeof(unsigned short));
" u: r, w8 J! ~- }$ p4 j   6 b6 {% S" K; ^) ?3 O% U' k; A
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
) l. |1 p! {9 u" h! C0 g; l   read(fd,&data_read,sizeof(unsigned short));, h/ t5 h  u8 o; D8 E" b& Z, n
   
4 U6 O: \6 S+ _+ j   if(data_read == 0x13Ec)& {1 _+ m( a* j$ `5 ~. C
   {( h5 _$ C' W' c8 F5 L
   
0 x7 Q2 K! U& w    printf("data_read = %x\n",data_read);
/ S) D) D$ d2 e, s   }( q7 W. ~6 c9 e# t/ j& m& O; Y  Z
   
' A. S9 j5 ]3 {$ |9 \( W   msleep(10);
. {4 X7 }: K& Y6 [  
2 u9 `% T% [, m  /*
& w  S" T* Q( r& s   ioctl(fd,1);   ) s. ]% u3 y: b- E7 _
sleep(1);
) s% Q" H" B6 z ioctl(fd,0);
+ k( }) r# `& v: `% b sleep(1);
3 S6 }/ _7 z8 W3 f8 F- D */ , l/ D4 B+ w+ M
  }     I) D# a" }5 L5 }& g
return 0;
9 j( x# K/ C, ~& v
8 S1 {: Y: l8 f! W5 z3 ?, L}6 k/ D) I3 ]) w* ]1 _

8 {$ _0 L8 H  D1 K  U+ K* \多谢各位指教,谢谢! 急# m4 F& k  w. n5 r: R

: u! J2 F7 g" ~0 o/ M9 I% t9 X
% t% c: ~- O* H! p9 ~( ^: p$ r3 B$ F+ H4 w

' d# N8 Z4 q; i% N9 B1 O+ C& d) g- a# j" ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 05:38 , Processed in 0.049872 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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