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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- j& l  d) [) }, C9 f& f/*9 U$ M; D2 A) B( P
* Copyright (C) 2009 Texas Instruments Inc
' L( W7 n- F/ A5 h/ n/ d *
' Z7 e. j* z0 _0 O * This program is free software; you can redistribute it and/or modify' o; B& h% J3 V. v/ e+ C' q
* it under the terms of the GNU General Public License as published by
8 @! f* v7 @( P0 I2 v1 v% t3 w# h * the Free Software Foundation; either version 2 of the License, or
2 C4 H& t! m$ k" @/ d, { * (at your option)any later version.7 [0 o; O6 w; ]% q. J) n; l" i
*
& d* f# d/ V8 R! |1 l * This program is distributed in the hope that it will be useful,
0 M( ^& O' L4 `8 n * but WITHOUT ANY WARRANTY; without even the implied warranty of! x) H+ O2 {0 Z" [2 q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" l4 k0 a" X+ r- C: {$ X * GNU General Public License for more details.
5 n$ C7 R7 F* m. A7 Y) i *9 z1 {" z; T. s' ^
* You should have received a copy of the GNU General Public License
/ Y1 r( Q1 s; s/ f: Z: d. X' a * along with this program; if not, write to the Free Software7 ?4 {0 X" f7 F5 N, n+ E& j! e0 N
* Foundati, Q& x2 u0 `: [0 B6 P
*/8 D; y5 M$ r, ]! e4 a% u( j" A
#include <linux/module.h>3 Z) M- L' Q9 ]* E2 `" S8 r
#include <linux/init.h>
% o$ b  S6 W. v6 A#include <linux/errno.h>' r9 b% Y- n! ~9 u3 Q4 @
#include <linux/types.h>: F# v6 h, g8 h; T( y
#include <linux/interrupt.h>
' m7 v5 S  U) J2 [: d  f+ f% R#include <linux/io.h>& P& \. |$ O0 V3 z
#include <linux/sysctl.h>3 l9 B& p+ }; Y& |# H
#include <linux/mm.h>
* ~2 q/ l+ v( w9 X; h5 v$ h#include <linux/delay.h>, C& y6 H' ^1 ?9 h; F" s/ A
#include<linux/kernel.h>0 U5 t/ S9 S: G3 n! |: d
#include<linux/fs.h>
8 k0 O1 J0 C2 o#include<linux/ioctl.h>
' l' j9 c& c! g% i1 [  w: M#include<linux/cdev.h>) H! N  x0 i" \: E" M; O
#include<linux/kdev_t.h>
% \8 z0 z* `1 [# l- N, w# z% [. z) b* m#include<linux/gpio.h>, k$ ?0 H6 F% W' B( E
#include <mach/hardware.h>
/ K% S2 l  K- n; Z4 w* \7 g#include <mach/irqs.h>
; h4 v- T8 X2 a8 [6 i! E& }7 g6 n2 z9 [" N$ o/ d9 n
#include <asm/mach-types.h>
9 ~* {% s4 G: S$ M% P#include <asm/mach/arch.h>
9 |& K5 t+ ]# t( R& n& ]$ s2 r#include <mach/da8xx.h>- g& H5 M8 }$ ?3 k) c: X3 F
#define  SYSCFG_BASE   0x01c14000
# U7 J' ~1 J, w3 d6 p8 t6 ]#define  PINMUX1_OFFSET   0x124
  X5 [8 O! E4 w2 P#define  PINMUX18_OFFSET  0x168 + `- V! ]. ]1 B2 I5 P8 |5 L2 s
#define  PINMUX19_OFFSET  0x16c
  u* x, q& H2 {& m2 m) x#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
8 j2 m# Z2 h; @0 ?- L' S; Y7 n#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR8 r7 j* l- K9 p  O
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR9 X; ?: w6 C0 m2 T
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% W- y* [. @4 n/ _#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR0 a) i3 l: F% U/ Z: \
                           
& o3 O" l& N& U4 q+ l#define DXR_ADDR      0x01D11004  //MCBSP1_DXR* K4 G" U! g! b6 G1 m+ A) u+ [  H1 M
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR0 n6 B9 o; J, J& C
//PSC4 X# B6 q- p# \) e/ {. v* M5 a
#define  PTCMD_ADDR   0x01E27120  # }% y& S8 v/ E
#define  MDCTL15_ADDR 0x01E27A3C5 a& m" c$ a* c) G
#define  PDCTL1_ADDR  0x01E273048 z6 M" p4 G1 D6 P6 o
//GPIO8 direction
2 V! C2 k; c0 |5 r( A6 `8 h8 e: a#define GPIO8_DIRECT  0x01E260B0
9 }# i/ Z8 C/ {. w#define GPIO8_OUT     0x01E260B4
7 M8 }3 A' k' ~2 g* X5 n3 i% U- L#define GPIO8_IN     0x01E260C05 n1 F2 `# i8 k. U

+ {% ?- B* o$ [, k//#define MCBSP1_RINT    99              " V. S' G# }' y( B# C
//#define MCBSP1_XINT    100  
+ s; g/ }4 |& v( t& `- }static int MCBSP_MAJOR=239;1 y9 V  i2 l) I/ a! m
static int MCBSP_MINOR=0;
$ V# W# }+ s2 v! b$ x7 m: astatic int count =1;4 x7 h8 J& X( B1 o* h8 d
# K0 m/ {% v7 n; o! ?# G# `8 F
#define MCBSP_NAME  "MCBSP-device"1 p: t- d  V) H+ s5 B0 }) a5 B
! o4 T# g! V5 D3 p7 Q' z$ [
static struct cdev *mcbsp_cdev;
5 L, y. K8 e& P. P, k% o% z  ystatic struct class *mcbsp_class;: l& h9 ~5 f. E" |, [. n" Q5 }
static dev_t mcbsp_dev;' P4 E( {' F4 Y- o5 F% D8 ]+ ^
unsigned int DRR_data;
; q8 o$ D: Q* junsigned int DXR_data;
, \" e" t* t* @2 |. \static int mcbsp_open(struct inode *inode,struct file *file)6 G8 `1 k6 f- \  k
{
+ p# E; q( A4 z( t' d   
$ C) D6 W% I. x+ D2 ^* |3 F   //interrupt enable,initialized; L& V- Y. Y; m
   unsigned int temp;$ s! V6 N' `% S+ \1 P( f  T
   //SLEEP_EN(GPIO8[10])---0
8 R3 i& A; M) n* N4 f9 ?& h( W   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ n9 x3 [4 D, W; r   temp=temp&(~0x00000400);
2 r6 d9 x! {& D7 A  Q2 e! U2 [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 j- q* r$ ^2 p2 G! m
  //RESETn(GPIO8[8])----0----1
! k, t; F. d$ Y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 ^. E/ x* B, u" \6 |! ^# z   temp=temp&(~0x00000100);
* G9 d& Q/ r4 U. h$ X2 i   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. q: K4 l, P$ R+ d- E   udelay(100);
2 j; d/ G2 A6 ^3 U" U  H$ A   temp=temp| 0x00000100;
1 b# f7 p. C" L" ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* I1 g9 ^6 i) E* y4 q- _4 d
   udelay(100);
( I* j5 S$ J' L8 w0 h( i9 z   printk("open success!\n");1 @% d4 V- E/ t2 w" @
   return 0;
7 f+ f1 B6 b5 N( F# M}
1 }1 l  y/ Y* U& z* y, R/ B3 N( X: q
static int mcbsp_release(struct inode *inode,struct file *file)1 I" U: {/ v/ m+ w: F
{8 N5 s* ~/ e' H/ m4 a$ f
   printk("release success!\n");
6 O8 l  t7 M# ]( k2 W8 `; m   return 0;" C, X! ?8 r7 i# X; v  ~0 k9 k  v
}. A+ b$ k6 q2 ~1 l* x& _
$ ]! A3 h* |( U) p) Y" s
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 j+ ^- J) [9 |$ k! t+ |
{6 R6 i# R) Q  ~
    copy_from_user(&DXR_data,buf,len);4 l2 Y1 \7 ~" t0 p
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # J* ^+ H& b1 m; G7 ~
    return 0;
% I3 r* r) ?7 S. Q, j. Z8 j
6 s6 a9 V- \. k! q7 w+ b}
$ K* i8 d& a& c8 r* R' \+ T( F
- U3 b+ A, P6 ?0 Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
& T7 }0 ~2 v0 R{   {8 J* n: C: m% N
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' T) I9 F& t+ F, k2 I" J   copy_to_user(buf,&DRR_data,len);
( s. D& n1 Y7 X! c   return 0;2 H. H+ k: ~; E  t- o: }
}
4 m& o& f6 f$ f  q$ D
9 f0 `2 G+ `% }- M" Z! p7 |0 `7 i, g' r8 j2 ?1 i: F: v0 A9 P& {
static struct  file_operations mcbsp_fops=
6 e( X/ d1 @0 K! t2 Z5 O{
- z! a+ R: R, J, _& X" _   .owner=THIS_MODULE,
% _; a( Y; o& H" m/ I4 n$ Z7 V. J   .open=mcbsp_open,
8 z$ N' k7 a8 R& Z   .release=mcbsp_release,  Y# K" i3 }) A9 l5 o& I! p
   .write=mcbsp_write,7 ]2 h; m- e2 ~7 B; a% m
   .read=mcbsp_read,
3 t5 S! g* ?4 G2 y# ?5 H};! P, h. H+ \& G. c* r
static int __init MCBSP_init(void)+ X% S* Q( ~( I. r
{+ o$ m: Z4 I. f. U! C/ R
   int ret;% F" m7 ~3 f  y  F: A
   unsigned  int   PINMUX1_REG_old;* a0 `3 \7 l# b
   unsigned  int   PINMUX18_REG_old;5 D6 q5 k5 a# n! z+ z
   unsigned  int   PINMUX19_REG_old;
  t$ S5 n! C/ t$ b8 A* g6 _   unsigned  int   temp;  
" p0 E4 h" d+ T   if(MCBSP_MAJOR)
; G7 j/ q0 H$ s% O2 X   {$ h" D3 Z' ^7 \. c1 K( U5 P& i8 c
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 Q9 i/ @1 B, |! k# @
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ _* U2 |- a" b: v- i   }, y" F) E) p' c* M, Y
   else/ F0 Y" X2 E; l& |. }% Z( Z
   {5 Q; S4 [6 Y+ J1 F8 t
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& Z7 `$ ]' @7 k2 P! e, z6 C' l. O  x
      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 S$ q% C9 X$ i7 ]7 T
   }( Y, H- F1 S% H# M, m% v
   ; O9 B2 o4 E1 C7 Q0 ?0 e8 ^
   if(ret<0)' x- E/ M( T- l: V
   {$ Z( a6 [+ u* @' I. x
      printk(KERN_ERR "register chrdev fail!");
# s6 H4 g% B- Q4 l4 Z; Y4 e& x      return -1;' g! B, J& c. R* S
   }
5 k  r$ D8 |6 r/ ]   
; E( y' }+ r- ?  ~  N% B8 p0 ]! k   mcbsp_cdev=cdev_alloc();% m( B- O2 L  u! G/ t, }
   
7 C6 R! k4 ]* W   if(mcbsp_cdev!=NULL)7 P5 k2 h) P0 A% c0 M3 @% e
   {
5 o( c4 J! ?* l      cdev_init(mcbsp_cdev,&mcbsp_fops);
$ r! n/ u. @0 D6 I% l% ?$ T      mcbsp_cdev->ops=&mcbsp_fops;
' V) r7 ?3 F2 w# J5 l      mcbsp_cdev->owner=THIS_MODULE;) w/ s+ F- R# }1 X
      & r- J7 c+ U! S
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( T  V' I' C  B& v& w          printk(KERN_ERR "register cdev fail!");
/ W% z, u; G, ^* P7 j* m+ e& ~      else$ k) G5 B( \! F
          printk(KERN_ERR "register success!\n");% ?3 W# Q$ m& ^+ h4 K' z$ N% f
   }" \4 Z8 Q- ?# g
   else
5 h8 R. l, {7 a   {
4 Y7 N- I' n2 c2 o; Y0 u      printk(KERN_ERR "register cdev err!");0 d: G9 Y  }2 P4 f0 J/ D
      return -1;
  Z6 L; u; M% `6 b! y( F   }- l) C* p, X6 j' v" v
   
9 I* |  H- s/ ]  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 Z2 B  R8 y4 |$ `
   if(IS_ERR(mcbsp_class))
, U8 g5 q6 E# o' T, h   {
$ Z' W  l# ~. X3 C3 y: X      printk(KERN_ERR "register class err!");
: M, H7 Q$ N4 Y   return -1;, h% H/ o# [* p; r8 l: M. k; w
   }
* |3 A8 |6 V* \, m   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 Z& {5 V# p0 }& }: R3 `
" Z3 V% q% H! `* k8 I  Y5 E   //PSC6 c! b) |7 S$ G2 Q5 o  Y$ c/ s6 n
   //add Enable MCBSP
. U4 P9 k6 \( J, C  O   //test4 T8 r3 |$ K; ~' }
   temp = 0x80000003;
( t; `, _6 b+ x# y/ ^$ o. L2 Y( j7 P   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ u' Q! P* h4 K+ [. }   temp = 0x00000003;
9 f. n7 F6 B3 \* `# ^   writel(temp, IO_ADDRESS(PTCMD_ADDR));$ Z5 X3 y% p& e# v$ M( n
, C) J% V5 L4 V6 y
   temp = 0x001FF201;! r, E6 H5 t+ c9 N
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
5 T# z- p* e) U; B7 R; ^' F/ ]6 ~4 O   
" f+ n6 c- T5 \   //PINMUX  
/ s  S2 l5 i6 Q1 z9 {9 H1 @, B4 n   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: m- a# ]9 E* X8 B, M" Q- U
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 V- H* j" s$ L1 N- c# t" o4 U* V   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   2 Q% X4 F  G  Z
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);/ p2 q! h0 w+ w0 K- A, [
   
# m5 G6 L* \5 A* p) O' Z   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 {* K- Q# {' J; t% d   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . Q6 J; O, j4 V/ e' j) i8 ]
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   2 L9 b" k% g1 E: v  r9 W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ \- H6 F: C, F! D( K

6 }7 f9 v6 o0 J( D) r9 I- `   //RESETn,L138_SHK23 k/ B2 }8 W+ F, q) I/ c- G: e
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : V0 w+ v+ O- |0 t0 C9 t6 s8 @' _
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
; J; H% u7 v+ W' k4 d   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 f5 i1 b. O* s0 W4 t $ f: ~) X7 ^9 \

8 T6 N/ Y2 ?/ t. l9 t2 I" u  //SPCR Register
" b. ?! `% N0 l8 D9 @5 m  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 `5 P! b  n1 a+ n8 b1 W
  temp = 0x03000000;//(DLB=0)6 O* U2 S% M/ M3 t3 C- M
// temp = 0x03008000;//(DLB=1)
" S1 C, M4 v$ E' E8 Q  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset$ ?, y' x6 F; b% S: l  W4 o/ q( ^
  temp = readl(IO_ADDRESS(SPCR_ADDR));+ k  _- z, ~2 S$ V
  printk("temp=%x\n",temp);
8 C) V# q: h% |. p
  C3 F0 C3 [; u6 I" @   //PCR Register1 f* S" X2 _& g. r  G
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( X% j0 F% {" I. G  F5 |* L  // temp = 0x00000F0F;* F& L1 v0 v+ w0 k
  temp = 0x00000B0F;
# i- h% z3 m8 ^  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
/ i* b0 i, M. G# q4 h$ ]9 S  temp = readl(IO_ADDRESS(PCR_ADDR));' I% S/ c' d( g" F2 a4 x
  printk("temp=%x\n",temp);  
: H/ b% U9 H* w   //SRGR Register  w. h+ ?+ n) W7 I
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 l0 x2 u3 X  u* r. n$ M //temp = 0x301F000B;
5 X' T& v/ }/ \  h" r7 N3 K9 a( F' I   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 8 s$ @, Z. F; x
  temp = readl(IO_ADDRESS(SRGR_ADDR));  T  x' j( z" T: ~/ z: s9 B
  printk("temp=%x\n",temp);$ C7 G' A0 D: B
   //RCR: [0 G  H. l$ J/ `- l7 p6 d
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 q5 |" i& Q' k9 G   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 N0 S% P9 A$ P$ ]! U8 |
   temp = 0x00440040;1 V# P+ N6 m* M
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   + P8 `' R. q/ @. T
   temp = readl(IO_ADDRESS(RCR_ADDR));( U2 S( K1 ^* ^$ p
   printk("temp=%x\n",temp);
) h' ~& E) }: `4 D: H4 K   //XCR& z6 [$ r% D9 F: @, r
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) j! {! d) ]" C1 m- S" |* b% E
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 l. Q% Q5 {! G0 L1 Y, V  G   temp = 0x00440040;
, \* N; W0 K, m7 n- z; ?   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
$ \2 f; W0 z* i# x   temp = readl(IO_ADDRESS(XCR_ADDR));5 M# `1 w2 g7 W( h$ E7 r" [
   printk("temp=%x\n",temp);! b, D' v0 s, Y( w. v
  udelay(100);5 x/ e! E+ `; T4 l0 h8 f
  //SPCR Register
& a  _; y9 ~, m1 b' l1 f  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: M: S& R; u- j( }; V) d  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
6 N8 m. Z+ u4 J* d! o# W# s" t  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
3 j: N* `6 A/ C( }! ?  temp = readl(IO_ADDRESS(SPCR_ADDR));  \3 |4 u* [8 }; J2 i& S
  printk("temp=%x\n",temp);/ M& S$ z" G4 s3 m
  udelay(100);' Z8 S5 V. F  _% f8 h/ P
- I: `1 a/ D2 i0 ?
  //set GPIO direction
7 G" |8 {! Y. m: C9 j$ e  q9 U   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 w7 R  |% d  [9 }  O0 N: e   temp = temp | 0x00000100;//EPR----input
# J' V# \- d9 I$ R8 Y5 K! N0 Q. [6 [7 @   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output7 Z" D. m+ u0 D( g! {- B) U
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + M& S  k% t1 h8 ~3 L4 a

+ X9 |5 k) w& x4 c   return 0;* P' x* H" B  W# K
}% G5 m# u1 L8 n6 k" _6 e" f7 e; ^* m6 a
static void __exit MCBSP_exit(void)" v+ F/ `  B  r- T0 F6 i, I
{2 G" Z1 [7 U2 S& d7 h8 U
   printk("mcbsp chrdev exit!\n");
, B' p+ p0 n- O, Q6 s, y, ?   cdev_del(mcbsp_cdev);5 S/ E3 V, F% v; w$ e
   unregister_chrdev_region(mcbsp_dev,count);( W: _0 O2 b$ _$ I1 c" z
   device_destroy(mcbsp_class,mcbsp_dev);
8 r$ Q/ _0 t' v: {7 k6 m3 h   class_destroy(mcbsp_class);7 H6 a+ K" t# l
}
' R  \1 S: ]. A3 N* f0 \module_init(MCBSP_init);
' J: W+ n' J# _+ @' zmodule_exit(MCBSP_exit);
& ?% g( \+ Z  }4 I8 ?4 l2 M- e' a9 [  Q$ W7 D9 X
MODULE_LICENSE("GPL");/ b3 N) k+ h5 l' M- U  Q8 |& Y4 k

6 J+ ?$ B* T1 x1 B8 _6 g6 C( \4 I我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 K% |8 Q, g! G7 _& z! z我的应用层的测试程序如下) [% c2 c. f* S
#include <stdio.h>
8 e' m# _; g8 _  o* H1 Y# J* W8 N% ]5 Y: ^6 C#include <string.h>
& U+ Q* x- w' s. i5 m  g6 e4 U#include <fcntl.h>
" H' C. C% q# i6 A$ D#include <unistd.h>
& Q  X+ }$ z) b' H6 z" A#include <signal.h>. L& F, W. Y/ z3 P  I
#include <pthread.h>       //线程- m! y: V+ N( q' ~& H
#include <stdlib.h>
3 k7 _) S0 v- m/ c#include <pcap.h>          //捕获网口数据3 m# U& D2 X' j: h) n
#include <semaphore.h>     //信号
# k% |4 H" N6 C* l9 h" s; P#include <sys/types.h>     //消息对列
  [& Z/ D- I6 B* I" k: O4 V) @#include <sys/ipc.h>       //消息队列
! W3 v  _, S8 S  x8 q* e  L#include <sys/msg.h>       //消息队列- O3 j9 p' ?' z  ]# A, {
#include <sys/select.h>
% n0 Q, `  F$ v9 T#include <sys/syscall.h>
3 ]/ @' q0 K; i- I#include <sys/stat.h>
  ]  T( F* i4 h0 S7 B#include <sys/mman.h>1 Y3 {5 ?6 n3 ]1 l3 z  P
#define msleep(x) usleep(1000*x)
7 N7 B7 J6 E& f% V, y
! L4 s3 G' |) i- m% T+ X" J/ Gint main()6 O; X7 a/ ]8 |0 E! r5 h
{
. ~% L0 t2 X( I2 n. [: p    //MCBSP,ARM与AMBE2000交互设备1 Q! P9 T+ |* H" T- A6 [; N0 T
int fd;
5 d$ Q5 o9 E' y. o7 G$ l7 x7 J7 m6 w unsigned short data_write = 0x5555;+ o3 T; O4 o' j
unsigned short data_read = 0x00;0 ?1 K+ k/ Y8 j3 i6 `4 c" J2 M! Y9 T
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* `% B$ R1 T5 O& O  {' h, X5 j //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 ?2 {' V; l/ B+ E   
# Y# d- G: J. \6 u) |! Q9 y; C- p3 k' _  if(fd < 0)" X0 d' g. k" H- C4 c  c
  {7 f3 P8 j! y) e3 c% O
     perror("open failed\n");8 `2 p4 g) Z" \( r- C# R
     return -1;0 `; H: {4 z: C; P) `
  }! |3 F8 F( J! V# U& t$ O5 _
  4 a3 P5 ]9 z+ e" a/ J( Z. d" Q+ ?
  while(1)
0 i3 I. }. A! C: ]: {3 B  {% s: x4 K, w' |" R# @, S7 K/ m# `
   ; x2 Z* T; S( D% B- H3 I
   //AMBE2000每次读写是24个字为一帧, ^  d6 k7 K" K) O# Y" h
   //写数据时将数据在底层存储起来,等到中断的时候再发送+ b+ F0 H% ^, H7 z1 c) p
   //AMBE2000输入数据是以0x13EC开头的% t; d( B. A2 i( v" S+ F
   write(fd,&data_write,sizeof(unsigned short));
$ h9 S, a! \. Y7 m   * ~" N# i! Y: k7 t4 u( d
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层    \0 N1 Z5 |' s4 w, ~& V
   read(fd,&data_read,sizeof(unsigned short));. [+ |  b3 x7 S( l! [
   
' f1 K' K  l5 D4 T( p   if(data_read == 0x13Ec)
/ l6 c5 G, f+ i- z   {% r1 G7 G9 _$ w8 {* x9 W
   
- d; X5 C! J" k4 G8 a8 |' l9 d    printf("data_read = %x\n",data_read);, E- n  O& p2 R7 p2 F, W+ W+ V# n
   }
2 B3 o+ d$ p* ~* v   
: N! p- A! H! n2 [! b/ M   msleep(10);
' r+ i! _; U* O/ K  
6 [. C7 p, |/ z/ d; h! Z  /*! r% N; a5 `# B9 ]0 G. t
   ioctl(fd,1);   " W+ N4 C2 g' f' x0 A
sleep(1);
9 d' A/ a  f6 H$ Z ioctl(fd,0);
9 A/ v2 n+ X% L) }8 F sleep(1);
+ Y7 \( w" D* k  U7 H* _. h */
7 m. Y. Q- ^) F" ]1 }& F  }   4 h9 m3 j0 s5 `; ^& t; X
return 0;5 n+ Z- p* S% X+ q4 k0 V
0 T) E) b6 C- m: D7 R1 g
}7 ^% k. S" H# R) g, d" V& M
. R8 i3 Q5 v3 h3 ^- |
多谢各位指教,谢谢! 急
& b$ J' v1 L7 `+ w& L& L
$ ^6 i- O$ e; ~8 |4 D2 t9 t
" a' I- M) ^; R) `# w0 L2 o) a
3 Y5 M: x  S; s2 m" i4 [0 l7 Z* W6 P0 ^9 M' Q8 g8 j: m! W/ @
/ c& V/ G9 S& o9 b% m5 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 05:20 , Processed in 0.046036 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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