McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) i2 ^) b  ?4 U/*' m2 d7 T/ J- l, F+ I
* Copyright (C) 2009 Texas Instruments Inc( j0 z. U& a- _' w( M. w8 R* G' o
*
, C" R2 A4 W2 d  I * This program is free software; you can redistribute it and/or modify8 K# Q! {# A2 p# f0 {- Z
* it under the terms of the GNU General Public License as published by
# ?( O  a. E7 }! s * the Free Software Foundation; either version 2 of the License, or% R( ^$ m' Q8 T
* (at your option)any later version.
  v4 }" |$ J( n" }" L ** P% B# S% T  ~# L
* This program is distributed in the hope that it will be useful,0 `# D5 }' l5 B5 l
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 j7 s( `7 g& v" D/ Y$ X/ k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 O, I- o  q* R4 m3 j% I: W0 z8 D! R7 x * GNU General Public License for more details.
* E$ G, d1 g( } *
0 W$ p9 _+ E' z6 p# M2 Z8 D * You should have received a copy of the GNU General Public License
* ]5 S5 ^; O+ g4 y! U1 w * along with this program; if not, write to the Free Software
& y" F1 q2 a6 D% T * Foundati
6 h0 R% x. A0 w, z' j# {, i*/8 o$ w* z  Q' Z+ @
#include <linux/module.h>
3 J& Z) w+ ?- M) r1 e#include <linux/init.h>9 y3 D0 t1 T- ~2 H8 ]
#include <linux/errno.h>/ A$ Y8 p4 }  C
#include <linux/types.h>/ `# Y2 y2 V+ ]+ l4 F% o0 ]
#include <linux/interrupt.h>9 ~9 u8 k+ J" ^" Z
#include <linux/io.h>8 ^7 V; M9 C9 d, I" Z  I
#include <linux/sysctl.h>1 _' D4 j- h& P$ {2 b6 }. e; s3 t
#include <linux/mm.h>
" H: b' h$ \5 o6 x#include <linux/delay.h>
7 O# h  i6 d8 p) i  I#include<linux/kernel.h>) c+ J. _3 N: w+ E& W
#include<linux/fs.h>
6 a6 H" W' Y8 v0 Y% P5 E; k#include<linux/ioctl.h>+ P, i) Z; M: {. w3 E. h
#include<linux/cdev.h># W0 d& |" \9 c( a. a# E
#include<linux/kdev_t.h>
6 V' w1 Z- o; Z4 K2 t5 K& H5 D#include<linux/gpio.h>8 _1 [2 o! {0 K& e8 `
#include <mach/hardware.h>/ B8 ^! Y' m' h3 b7 U
#include <mach/irqs.h>
( z  Y) n& t) e- j' t9 m6 E1 `* |& _5 P8 G  x0 A4 U- z1 S! H  t3 i, F0 W
#include <asm/mach-types.h>
* K# e7 |( D$ O, _#include <asm/mach/arch.h>
% s, \" G; \' f#include <mach/da8xx.h>
1 j0 }$ x7 r* T* C#define  SYSCFG_BASE   0x01c14000# x9 V3 Y9 q% m8 |+ Z$ o2 _1 _- V
#define  PINMUX1_OFFSET   0x124
9 ?8 J3 i5 T- n! ?( n2 M#define  PINMUX18_OFFSET  0x168 ! `- h) J/ `- V; V
#define  PINMUX19_OFFSET  0x16c' S8 E5 |, v& Q
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
: y9 D0 M  |& l$ ~% a% R6 y9 t#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR, }6 z6 C; t! i9 T0 \- l% H
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ z4 w. B! o# L5 A: q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
. U2 N$ C( b/ k9 H" E$ C#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
* e- p, W, Q" \  x                           
+ K6 `6 Z8 h: d! t# p: r- A#define DXR_ADDR      0x01D11004  //MCBSP1_DXR5 T0 r; X8 @: B  q7 F  N
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 [: Q/ h: X# _" |
//PSC: H8 a2 R+ p6 d' \$ J7 B: O
#define  PTCMD_ADDR   0x01E27120  
- W  m) d2 ^" q/ z$ O#define  MDCTL15_ADDR 0x01E27A3C
2 h1 X' ]: V6 ^# h- \- S#define  PDCTL1_ADDR  0x01E27304
: A- X; G6 j, t' h1 E! D//GPIO8 direction: h# X/ h' H* h( p. }9 z4 J3 f  w- ?
#define GPIO8_DIRECT  0x01E260B0
3 ^$ u8 j# _4 v$ ^9 o  `#define GPIO8_OUT     0x01E260B4( u) }0 K$ Y, D1 Z. s' a
#define GPIO8_IN     0x01E260C0
& ~& E+ ]* @0 c/ q6 `  q; ?: {/ g  P9 Q& G6 d
//#define MCBSP1_RINT    99              + {/ Z; I, f% S8 w
//#define MCBSP1_XINT    100  ) Z: r& e- I$ \; e1 U
static int MCBSP_MAJOR=239;
/ \7 X- W* b" G$ ~" Cstatic int MCBSP_MINOR=0;' H8 w& G# T; X' }; r  M
static int count =1;, c7 [8 P# z' u" U* U# a
0 E# {$ M+ F  c$ `
#define MCBSP_NAME  "MCBSP-device"
! a1 q& a6 O3 j7 O; H6 y7 w
* K$ O2 o) @! v6 f$ Z6 L2 }static struct cdev *mcbsp_cdev;  x" F. f6 ~1 N8 {/ |, I
static struct class *mcbsp_class;. z; ^+ d9 t- Z% J& J/ ?
static dev_t mcbsp_dev;
  u8 P0 B: f3 M4 }" U& W- n* Gunsigned int DRR_data;: Q1 g9 H5 v) S
unsigned int DXR_data;9 r7 U* x: Z9 c* O1 t; S
static int mcbsp_open(struct inode *inode,struct file *file)2 x3 ?/ I/ i0 M! J. M5 j5 ~
{) g/ i& ]% j& ^' u" J, C* |2 }
   $ H$ l7 n! ^; U* r; g1 b) |3 W
   //interrupt enable,initialized/ D  `/ \- V' O- p/ K' F/ i
   unsigned int temp;
: Y8 X/ t* \% \* ]7 t: i   //SLEEP_EN(GPIO8[10])---0! p( L3 r  W- h  i3 T4 ~/ J
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" B% N$ t: Y# q8 x3 J" o
   temp=temp&(~0x00000400);
1 m- `. v$ V, _, Y" V. k; m4 d; h   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( y1 _- {) t3 w8 D, ]  //RESETn(GPIO8[8])----0----1& |& n# r5 e# s8 E) R" h  k; [
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- e) l2 A# h4 ]) x$ T% t   temp=temp&(~0x00000100);
( J7 _- C! w, H8 n: ^& h% S   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, M2 Z7 T2 ]3 W: h; z4 n5 \4 L
   udelay(100);0 d; t# l7 `- ~' I/ @
   temp=temp| 0x00000100;
$ t, v% D  ^: J# R" ^- J7 O   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! n3 ?& k3 v; K   udelay(100);! x  n$ b' i7 e+ m
   printk("open success!\n");2 f# O! K  P2 J4 }
   return 0;2 Q1 k' v# f) A; K- b5 z* I: T
}) X5 a; b' ?7 v  v& _1 K. i
" I/ n/ ^: T* X: [5 x' m
static int mcbsp_release(struct inode *inode,struct file *file)
2 s' t5 L0 r" f7 R) p/ g: L; ~{
' ]: c( Z% J# a  [% ~6 q   printk("release success!\n");
. J6 c$ ?$ H( R, j   return 0;& h% {$ s! j+ H9 h
}
3 k7 B' k% v6 Y6 B/ U$ Z  ?, k4 x7 |! @- B4 n' }$ c
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# t, j6 @, d, d) v/ U( d+ x{
( u( F+ L& X" }( u4 Z    copy_from_user(&DXR_data,buf,len);7 J( x! Q/ b3 Y0 j2 R; m
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ H; X# v4 @0 a7 X" C/ n    return 0;
/ Y* m/ f1 R& f 7 r7 d7 ?+ J. J1 J! Z- T  f
}+ Q7 j  p+ {4 P
5 f. ~. X' m8 v$ C) ^, L
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)  V9 W" o% Z5 s# l  }( ]* l& b' {
{
3 L* r4 w, @0 f# h   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));+ P/ ^( S& n# B' j  V
   copy_to_user(buf,&DRR_data,len); ) m% |+ g' q, A( T# P1 ~' e
   return 0;( u$ d5 A0 Z" x9 @
}* |% j5 l, ?1 }2 q# g6 q

$ \$ @9 C0 i  }, {: P
5 Y* j0 d5 |) O  v2 Mstatic struct  file_operations mcbsp_fops=2 }7 c# u1 }  |, c5 K/ I! h5 R0 _
{& W, |* R, p' E+ E' Y8 Y/ ^
   .owner=THIS_MODULE,
8 ^& t& D/ k! U& B( m1 [   .open=mcbsp_open,7 F! |0 z# t$ J1 p9 `
   .release=mcbsp_release,: F! Q3 t! m/ R  X; d: F1 {# @
   .write=mcbsp_write,
4 q8 r! n$ Y3 N. {   .read=mcbsp_read,
3 U0 L$ M; f( z8 r: N# W6 ~& a};' C4 j  l. s$ M0 i
static int __init MCBSP_init(void); C6 P8 @( v" L* ~
{
2 L4 K, [* Y+ C: z# L   int ret;
# y1 E7 t2 U5 r   unsigned  int   PINMUX1_REG_old;* n) h8 N" n- T6 l1 V1 e
   unsigned  int   PINMUX18_REG_old;
$ U4 L# G* ?# U6 ]( B$ u: U   unsigned  int   PINMUX19_REG_old;
, g# C; v' T# v4 z! }$ n, t, r   unsigned  int   temp;  
: B' O; y' G% @- A2 C1 a   if(MCBSP_MAJOR)1 H5 l* V3 S) |) ~" V* @* r7 K
   {
- i3 q' G/ A8 R9 s) O      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 w4 Q$ w2 C& K
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ F9 [) W3 v2 H' S  M6 T" [
   }+ U  c! X% E4 }+ L0 u! D  H( Z
   else, B7 ]) O" D6 M# D) z  L. o
   {2 n* W! E5 o' C3 I& r
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 @3 \! M. s( z- b  ^      MCBSP_MAJOR=MAJOR(mcbsp_dev);' s; E+ o! \' I
   }
& R4 Z0 r( B7 \. V$ C   
4 ]  t( W& b+ w: z6 R   if(ret<0)
7 B: P- M( e" A3 n+ j) G0 ^. G4 y   {- x: f& y; d, _/ j, f
      printk(KERN_ERR "register chrdev fail!");/ i$ f0 w8 k4 ~/ R- ^+ w0 U
      return -1;
3 M  d- M& K. L/ M) e   }
1 u. Z4 a- X$ e3 h: H3 H+ r7 B! k   : L- E) R9 ^( f7 |* M
   mcbsp_cdev=cdev_alloc();2 p9 E' v& u& B- `) I
   % \* D$ L( c7 w# F3 ?, x$ k! G
   if(mcbsp_cdev!=NULL)  s. f0 k3 x, q; V; r/ O
   {
# [; k) w$ C2 P' K      cdev_init(mcbsp_cdev,&mcbsp_fops);  M; S. B, t: R& }5 f& T2 O
      mcbsp_cdev->ops=&mcbsp_fops;
( k# k" {$ r/ V      mcbsp_cdev->owner=THIS_MODULE;
3 o; Y/ k- E  p. T      
! Y8 `7 P8 M6 e9 d% G. N      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 o; k' q1 U4 F1 k( s! s8 ?; ~& u8 u
          printk(KERN_ERR "register cdev fail!");
0 ]9 ]5 w) M! _/ E; q      else
* m, O0 X7 _# |6 t2 D, k7 Q          printk(KERN_ERR "register success!\n");
8 J4 V% q; {. P0 R1 P7 \( U4 m* C( F   }
5 ?! i# j3 s2 g8 a   else/ P, ?5 n/ P1 P! I
   {
: S7 W3 }' {% u9 o; E$ ~      printk(KERN_ERR "register cdev err!");
3 U" {- Z2 S& v& F      return -1;& Y1 n/ b$ S: j% `5 @
   }. ~$ N/ c% Y7 X+ x' B% s! u  O
   
' d7 t6 B5 |5 s( M" Y4 ~( ~  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 {) ^7 w# }' C3 ]! l. d   if(IS_ERR(mcbsp_class))" s6 U2 |" R! @/ X4 t, F" X
   {
, `% |2 J5 c; W      printk(KERN_ERR "register class err!");
  w( F+ V; d/ \   return -1;; Y. [4 C- j- E5 ~
   }
* W9 R2 E& Y) ~& w  j0 h5 S! ?, p   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ M# f) k' _) u) c

1 C. M: ^' V4 i; U2 G   //PSC
5 G0 a6 @1 f6 l* l   //add Enable MCBSP  I( @% Y; v5 \9 {) {2 k
   //test% y1 S6 \5 Q6 b2 w  d3 H
   temp = 0x80000003;
6 w1 l9 b  e( h, ?& q% C   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 k# K$ K  f1 I* \! n* h! Q0 s
   temp = 0x00000003;6 l% ~. D4 K/ O1 ~
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 ]* |& `- g3 ^4 c5 v) I
! e& `4 B' r, P' V   temp = 0x001FF201;& m4 e1 ^$ Y- ^4 b* ]
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));1 U4 D- r9 p# x: z5 g4 H
     z# T3 W) h0 n$ m% p1 I* G$ `
   //PINMUX  6 F3 E& O1 C1 s# n" p
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) C0 O2 x2 a' d+ R, Y# }- h, C
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    C+ I, n9 L6 t& Q) k+ d
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: X4 L4 i) j* K) W/ \& Z* o   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' W! J7 w/ Z; Z: J5 I* e- P5 u) b) ?
   
9 K8 P2 k1 M% |$ |0 W6 @$ k   //SLEEP_EN,EPR,L138_SHK1,L138_RC9 E2 e. X8 N- r5 \- ?- _
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
! p& x; G+ S1 {. z8 ?   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
  O: [0 _+ t3 k# j7 ?! n- Q   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 Q5 Y/ U. y9 X6 ]1 E4 ~
9 ]# b7 u4 O: r
   //RESETn,L138_SHK2
8 H% i  K2 A7 y3 R5 z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  - J! t! S' T, D
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
$ Y4 L2 K; P4 f! O5 a, @8 v   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) W5 M5 E% Y9 e! M2 L
& `4 X# m% R: w" Y& B0 ]0 X
; H7 X+ o6 k6 W/ B! s, A  //SPCR Register5 S  F: `+ j6 {, `2 r
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. \, f' L5 m; s1 M  }8 N# `- W4 E  temp = 0x03000000;//(DLB=0)
3 q: n. o: q6 N7 z // temp = 0x03008000;//(DLB=1)
; S+ z1 z0 ~. \' w  V$ X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* H: S2 D/ n8 m4 i4 ?
  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ X2 ?! M& I) \  printk("temp=%x\n",temp);- }& [7 d, U9 ~( b9 S

/ K2 e* t$ C2 `, E. i   //PCR Register
9 B) L- E* f+ [8 J   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 E5 [! D1 s# `  // temp = 0x00000F0F;
1 J! Y; H/ c  m# u! d+ a& q  temp = 0x00000B0F;' }1 T, e' O) J: l/ m/ e' M
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 G# i4 {+ f" r' E5 p& }  temp = readl(IO_ADDRESS(PCR_ADDR));1 X3 R/ X3 J7 e* b" o  z, \& p" f
  printk("temp=%x\n",temp);  
3 y6 S( x) k8 u0 E   //SRGR Register
+ i! [+ B) o$ y4 h1 a9 u   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' r4 a, L# \+ ^* J1 u' [5 q
//temp = 0x301F000B;( [6 X& n7 g- f3 u6 L9 D
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 Q( o" B7 P/ Q4 T$ f# i
  temp = readl(IO_ADDRESS(SRGR_ADDR));
- v$ }" U7 B4 \8 e  printk("temp=%x\n",temp);+ r+ u* W: P+ o* l% q
   //RCR
9 o9 @. g6 P9 u! f8 C   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 X, s4 ?% n  i. i( x0 w" u4 [
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 E$ c* Y; n- _6 p) q; F8 h3 e
   temp = 0x00440040;
( [# g* T: N) V5 m   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 n3 J+ a" V0 N2 H4 a. C   temp = readl(IO_ADDRESS(RCR_ADDR));& {' Q) B) Q. f; U
   printk("temp=%x\n",temp);
" a0 J# h. q# n1 K( U   //XCR
) i5 f' |+ M+ g. t& M   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 y* r$ d' v  z- u
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 e7 s) i  i+ h( G
   temp = 0x00440040;' t3 S* j& y2 q7 L5 i* A$ Q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
3 J0 p" v" q9 y" P   temp = readl(IO_ADDRESS(XCR_ADDR));
" m# x+ _5 ^6 l) T+ K) q7 [   printk("temp=%x\n",temp);, v" \( [& v4 j, |% C7 l) y  R
  udelay(100);0 V1 n6 g( {' V  i
  //SPCR Register" U& B  w4 ?6 K% `4 }) [* m- @
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& ~. d: o6 q" Q" \6 `0 V. v  temp = 0x03C10001;   //DLB = 0 VS DLB = 16 b5 ~% ~; p( r
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
( Z- W0 O4 a( g  temp = readl(IO_ADDRESS(SPCR_ADDR));& o( k5 U, f; M: I8 ?" f
  printk("temp=%x\n",temp);! k9 K0 C' l1 F; B5 I8 }+ v
  udelay(100);# j- I" e& c, P. h- m1 ]% h
; ], Y. z% Q/ T2 H9 F" f9 V
  //set GPIO direction
! q$ ]1 F3 M) D7 U5 b3 x7 D+ ]   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 O. F/ K! E1 g4 r1 a9 v* J   temp = temp | 0x00000100;//EPR----input# {+ V* t2 J5 i( `; {* R
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% I! F( Z. C: ]" a  r, z3 ]3 _" q   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " P* O, v0 d9 I2 r9 {; F! t8 m
4 Q, ^+ C) f2 G: R" q# o$ b& z
   return 0;9 R$ Z- {4 f. d; H7 A# ^; ?
}
/ u* ?& r; w2 ?, M2 xstatic void __exit MCBSP_exit(void)5 s( i3 c: y3 ~9 s( f% z5 k
{. p3 |, \0 I+ z, N8 `
   printk("mcbsp chrdev exit!\n");& a0 k5 @7 }" q5 b
   cdev_del(mcbsp_cdev);
4 y0 t- Q' ]5 B7 U- q* z$ [) g$ W3 v4 \   unregister_chrdev_region(mcbsp_dev,count);( C  n0 Q5 G: ?- @
   device_destroy(mcbsp_class,mcbsp_dev);% Q; V* a+ A- F. V
   class_destroy(mcbsp_class);& i' t: ?( C- s2 n
}8 f& Y0 Y0 @) i; E; c
module_init(MCBSP_init);
; ]  E# w9 X3 z1 N& L& Umodule_exit(MCBSP_exit);
% Z* A% L. U% O: B0 t% J3 U2 k
, G0 H0 t6 j- CMODULE_LICENSE("GPL");$ Y6 t; [  |( P! r+ Z7 {/ I
0 O1 j5 T; n$ D/ Y
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) z& v' ?" v- O6 l5 Q3 n我的应用层的测试程序如下
# ?3 O! n; e$ R6 X#include <stdio.h>3 `& F0 _$ W( M* R8 F. `+ e
#include <string.h>
4 m! [. v) R# {) u#include <fcntl.h>
7 t: v$ U+ F) E8 q% |  \#include <unistd.h>$ A3 r4 G% L+ j+ Q7 U
#include <signal.h>1 N- @7 }1 f' T- J
#include <pthread.h>       //线程
* q% b" M8 h" ^, H#include <stdlib.h>9 i+ z% \0 W' O8 j
#include <pcap.h>          //捕获网口数据( n" \& k6 M  E: w7 l- Q- ^
#include <semaphore.h>     //信号7 `& q* Q7 l' b6 w, w+ S1 s, `# K0 O
#include <sys/types.h>     //消息对列7 ]( |) K' z* ?3 q4 y7 F/ m
#include <sys/ipc.h>       //消息队列% z0 Q; z! o0 i$ p0 Y2 t
#include <sys/msg.h>       //消息队列
2 j) \  q$ S: `  ]! M4 r; Q#include <sys/select.h>
& w, O- g; _# M5 w. a3 U/ h8 Z+ S( |#include <sys/syscall.h>; O$ T0 |: c: B! S, J3 e7 T
#include <sys/stat.h>
$ H$ c7 r! O* \6 D% X# k* Z5 J: p$ ?#include <sys/mman.h>1 C/ W7 N  H. J9 R9 W: k7 _
#define msleep(x) usleep(1000*x): a# T2 d7 i3 e2 {5 H

( w- t) C$ q" M7 ?6 J& ]2 mint main()7 L+ \6 Y. N( E' u! S# ?. A: U
{ $ J5 @3 P& g) L9 h5 L
    //MCBSP,ARM与AMBE2000交互设备
* U8 G  D. i2 ?2 ^: r) e int fd;* {* e3 K& G* v9 M2 Q" L% I
unsigned short data_write = 0x5555;
; e! q, A: p  Y0 M& h& S: ] unsigned short data_read = 0x00;
9 @: l: k1 J- \3 o) e  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& \/ j) y7 l+ d) S# [  V( b
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% r; J1 v$ s1 {; D; u5 R: h   
( H# f  D! d9 g+ Z4 R  if(fd < 0)0 R7 n* G3 o3 C. y
  {
9 g( ?% [- h+ F# ?/ Z     perror("open failed\n");2 R0 ?: e) `; w6 B$ W5 o& k0 d
     return -1;
- G! _4 y. T: s# P4 Y3 w  }
7 _4 w. Y  ^5 [/ o; z2 [/ Z" ]  ) H( [2 L; q9 b; m& K/ d* ~- r
  while(1)4 T3 |6 B( |6 B0 h3 F
  {3 g7 X2 _; A& F. _  I
   
, E! P# g- X( C$ ?   //AMBE2000每次读写是24个字为一帧0 Y/ A+ M9 ?) R( H
   //写数据时将数据在底层存储起来,等到中断的时候再发送, c- I% g# U- D: R
   //AMBE2000输入数据是以0x13EC开头的+ @2 _% N2 p0 z
   write(fd,&data_write,sizeof(unsigned short));
6 q& J& y0 t  K2 S0 P   6 _" B$ S2 E1 S* W3 P
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
% E, P* m1 V- u9 V, f) t2 S6 c$ f. r   read(fd,&data_read,sizeof(unsigned short));
- P  c4 V( `, I8 Q+ u/ `   
  ^* o/ F4 G7 L+ F   if(data_read == 0x13Ec)
- R8 F- W3 R1 q6 H6 ]' C   {% X% j4 C' l- @0 `! f+ d) H3 K0 N
   : Z% y+ ^  W; s! {9 p4 t6 w
    printf("data_read = %x\n",data_read);* n  N* I' U2 z
   }+ X( D" |7 g* E
   
+ d' p: I* |( J' a, m# J   msleep(10);
3 ]: |# C% ~9 o: n' {% o# X) H( v4 _" Y  
6 [1 A2 Z; c6 P1 B  /*5 C; w! W. L: u3 l, M
   ioctl(fd,1);   ' A3 F- e0 q; j  Q; n. c9 q
sleep(1);" R3 _$ s6 ]6 M/ F  L
ioctl(fd,0);
- i3 R- t/ P2 s7 G7 S, C# Y! p" k+ S sleep(1);
( r, \1 N# W/ i* q */ 4 B8 S/ w% u3 S# _( W
  }   
# T3 c; T# M! `+ d7 O. z return 0;" a2 R. X, W) ]. m4 F" @2 h

8 b; w: h) c, _7 u: u. g( a}  l5 m; Z* f, O5 W

3 I; H- `3 F2 r! u, F多谢各位指教,谢谢! 急
. h# A8 T- J  x' \0 g2 c0 v$ ]) |5 S5 e: P
' d8 S! x/ J2 {& Z7 ]* p
' |, b3 Z$ J3 }; Q. i& i+ L
3 g( m& H9 ^! y  c* j5 U

2 A+ {' d6 i5 C- b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 08:01 , Processed in 0.041434 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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