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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ L& Q- r* n3 u$ x/ p8 ?- p# U/*
! C4 F9 Z6 ^; Y/ l& W8 ~) Y * Copyright (C) 2009 Texas Instruments Inc
/ V" a- q' B2 ~  |- p: g' X# k5 h *
& T+ C/ @% ]7 L/ e- b1 ]& r5 J/ x, @ * This program is free software; you can redistribute it and/or modify/ R7 ^; S4 f; t7 [
* it under the terms of the GNU General Public License as published by& l& i- F( r  b
* the Free Software Foundation; either version 2 of the License, or
) l7 v# P7 ]5 Q# j& [ * (at your option)any later version.
5 D; I/ q. ^3 _9 T) u8 G$ b *9 Y2 y7 C, J( m8 h3 |" `! t) T- K4 o, Y
* This program is distributed in the hope that it will be useful,
, ^9 L8 M6 L7 `# L * but WITHOUT ANY WARRANTY; without even the implied warranty of
5 I& d% R* Q' G( c: Z( @  M7 W * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" J0 M1 g( L3 T9 B$ s: S * GNU General Public License for more details.# u& \: c9 J* r2 o
*
, O- X+ m3 k0 | * You should have received a copy of the GNU General Public License  y9 ~% H0 l( i; K; c
* along with this program; if not, write to the Free Software, ~* b2 p& g+ V: @6 c5 d
* Foundati  E; ~2 ]- h8 M$ ?
*/( g$ [5 F3 ^- e  F! |
#include <linux/module.h>
4 }6 t! w  V# |. P! \0 L( M#include <linux/init.h>
. K. A, h- Z- H; {' Y#include <linux/errno.h>
( K) M) W. Z0 S% b& E$ `& g, E#include <linux/types.h>0 A" K% c6 ?5 M
#include <linux/interrupt.h>) C- o6 |* A% K+ q' |) }; T9 d, R
#include <linux/io.h>9 o$ }: g( r+ ]% a( f+ u
#include <linux/sysctl.h>9 F. K: Y% Y4 g- P1 s3 ~
#include <linux/mm.h>% L7 J( W+ `2 `
#include <linux/delay.h>
. g& @- ~! T1 E. m1 [9 F7 I+ ]#include<linux/kernel.h>
4 U4 U/ M$ ?( A#include<linux/fs.h>
4 b: `! H" ~2 P#include<linux/ioctl.h>
/ R- e! Z' A- G#include<linux/cdev.h>
9 W) G+ e/ s& f! k+ g2 S#include<linux/kdev_t.h>+ i! z5 H1 n7 `: ^  `4 l' O; f, K
#include<linux/gpio.h>3 ?; @) l% ]" H( `* q
#include <mach/hardware.h>6 M2 y7 A4 c% J. `
#include <mach/irqs.h>. g) D8 N3 \& m) [' W+ R
. W1 Q4 n! k% t
#include <asm/mach-types.h>
- H; n6 m- q% T: {# F6 g: A& m' d#include <asm/mach/arch.h>& M* B4 j- f  E4 u1 _
#include <mach/da8xx.h>$ \8 P6 E' [2 \! a
#define  SYSCFG_BASE   0x01c14000+ q/ Q2 h7 Z) t
#define  PINMUX1_OFFSET   0x124
. X  j1 L& r: D2 k% u8 g* I% j#define  PINMUX18_OFFSET  0x168 2 G% m( Q' X, b% E) {
#define  PINMUX19_OFFSET  0x16c
& ^* s, @5 S% D, q& h% k) \#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
! g& V: Z2 ]3 C- U#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR1 X3 W! ?' \( Z6 j
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR6 v; [5 q4 ]7 p$ ?! D
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR/ C1 R3 H- |; N1 }; M! e
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! L4 i1 w# Y: N. w& F5 p                           
9 _, E0 n+ M* G: k% J#define DXR_ADDR      0x01D11004  //MCBSP1_DXR: T$ Z2 ^5 W" `% B3 c. l7 ^
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" b5 ~, P6 ~  f
//PSC1 q# U- O7 o8 N
#define  PTCMD_ADDR   0x01E27120  ! u$ O* P. ]& _9 a3 `) V( _
#define  MDCTL15_ADDR 0x01E27A3C3 N" q8 ~7 p, r# U* g$ `8 G1 z! x/ M
#define  PDCTL1_ADDR  0x01E27304( K4 o/ |$ v. _/ N) Z
//GPIO8 direction/ F1 O+ v0 P! z7 `* y# A# u8 a
#define GPIO8_DIRECT  0x01E260B0
- n" N, g6 m( H, C( H: p3 P#define GPIO8_OUT     0x01E260B4
) x, d/ d; |' e# \) V1 D& p4 ~#define GPIO8_IN     0x01E260C0& D/ k/ A0 I" l" Y: {$ |

  r; |" {7 I  {9 o  \. f//#define MCBSP1_RINT    99              
8 W) Q9 S" r- B//#define MCBSP1_XINT    100  
/ I6 o' @9 H& P7 i0 _static int MCBSP_MAJOR=239;1 q- U2 U6 H2 K9 {
static int MCBSP_MINOR=0;
4 F3 z$ h' A8 |& gstatic int count =1;  i# V+ ?* \0 o; Z& d  i/ C$ L, k  z
2 B4 W+ Y) D7 ^' e5 R) ^
#define MCBSP_NAME  "MCBSP-device"4 Y/ k8 j# K; Z" X

4 O8 l3 Q2 ^; b' [static struct cdev *mcbsp_cdev;
; w( v+ X5 M! a0 N# nstatic struct class *mcbsp_class;
0 d$ U; y) @4 m% A" Estatic dev_t mcbsp_dev;
' @2 \/ _. Q7 Q+ M7 Aunsigned int DRR_data;
3 G- ]/ l' I/ w3 D4 x8 u  Xunsigned int DXR_data;
  g1 D3 a/ `9 Z( tstatic int mcbsp_open(struct inode *inode,struct file *file)7 q/ `- O3 n* _' b. R
{
7 C# q( ^+ w5 t. U' y3 o& ]# Q7 T   
* O! @" q" s- _+ g! ^0 f   //interrupt enable,initialized
* g. ~  M' Q# o: H: C& t   unsigned int temp;9 e8 b  W" p2 R# n) o% ]
   //SLEEP_EN(GPIO8[10])---0! |5 T! {1 y$ B% O& f  I* D8 ~- l' ~
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 l- q( a9 b1 |8 x
   temp=temp&(~0x00000400);
2 E5 p8 B& \' |( q! h4 d' X   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 r( h6 ~+ N! z# C6 h( ^5 @  //RESETn(GPIO8[8])----0----1
2 [; ~1 v; H7 n$ r   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 J% n% \  R2 L( Q8 r# d- Z: i
   temp=temp&(~0x00000100);
9 k! H) H+ b+ I7 y: g% w   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 e4 A& m) q$ {! }0 c9 q# E7 M2 H
   udelay(100);
' |& Q$ |( ~3 G* [& X9 C6 g   temp=temp| 0x00000100;
& f3 h& @; c% Q! C* A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ S3 C& T- J$ Y$ R: V* z/ I   udelay(100);1 v8 X$ v3 H6 ]8 v
   printk("open success!\n");
3 {6 h( ?3 J. E% }+ B   return 0;
" P* p3 o1 z1 d* o. L2 l}+ g, z0 e& p: |: e! b

: D( A: H9 N+ ?' G/ O" D9 z) P. ustatic int mcbsp_release(struct inode *inode,struct file *file). @3 ~# B/ T7 |! b
{
4 B6 w# g. F9 ~+ y: ^5 Q, h1 F   printk("release success!\n");
" i4 |  A+ W7 Q! X6 S7 b3 ]   return 0;
' S+ O) V( [8 o( w6 y7 o; _}2 H3 ?6 ~) h* J4 F' u" f7 U

! y/ r+ i$ d2 Ystatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)$ I# }5 l2 E2 h8 J6 `2 j
{0 y- z4 H. q$ i- V
    copy_from_user(&DXR_data,buf,len);/ e$ l: Y2 z5 t4 `
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
; r- }6 {2 }7 C5 i! F, ]3 v    return 0;
: K6 I, q& P, l
  m8 m; v7 a5 t  f5 c. j}
5 d$ G: \5 t% D4 t& U: p  l
! H- z3 [  z$ L; \- h. Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
& w) l% X+ y' ]3 r1 Z6 U0 b1 O{ ' |$ H* u* g1 R  b/ _" f
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, o: ]9 H- [6 h& x* l/ A% i/ v   copy_to_user(buf,&DRR_data,len); & s. A1 y- }. I* o9 v# q9 l# Y/ i
   return 0;
- h1 q& \6 V, R* e/ K2 L}
+ g  }1 _9 U- f- m
# w: A: m& h" c: B! x$ ^
1 V4 g: ~0 A+ l( j$ [; Z! H/ ]7 ?static struct  file_operations mcbsp_fops=
1 q4 e8 a+ ]; C: p% o{8 g2 h  W2 x" J
   .owner=THIS_MODULE,
% Z1 g9 A7 `; ^6 t9 f, O- ?) p; ~   .open=mcbsp_open,, }) I  Y% @; H1 i7 A1 f
   .release=mcbsp_release,
* [! U3 _( u* @0 T8 j   .write=mcbsp_write,5 E+ N; q( l' ^6 P( s: a
   .read=mcbsp_read,
( ^" C, A4 z: z( V% H2 J, O};0 L2 p7 E7 P# \0 z5 z" S
static int __init MCBSP_init(void)
7 o# r! N0 \& ^/ K. B4 a5 S{' Y2 p2 ]5 G& X7 K# T
   int ret;
/ I: O/ B( ~- t& o% b. X. O6 Q   unsigned  int   PINMUX1_REG_old;
5 U- g0 d; i) J2 u! W& X/ B   unsigned  int   PINMUX18_REG_old;4 a, T6 c  \3 X$ k
   unsigned  int   PINMUX19_REG_old;
$ G) X4 r2 `( q8 a% M   unsigned  int   temp;  
! I* i% y0 F+ W9 t+ ?$ h; b   if(MCBSP_MAJOR)6 e% h: K5 w0 o0 Y' t% ~( H' `
   {3 W5 g/ ]& x1 c' o) k
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 |" {; E/ o& q9 R      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
8 x( E: e. N4 L   }
4 z, ?8 X* g& S% g   else
- n0 p  w. T7 ]' C  \+ S9 I   {
: E7 \0 x) }, v( g3 ^      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- U( b' X8 p: I) G- A1 c
      MCBSP_MAJOR=MAJOR(mcbsp_dev);  j: _4 o% b, X& X/ k  d) [
   }( g: _7 r; @0 r, i' z5 \1 H! C
   8 _2 O: W) ]. Q$ e
   if(ret<0)$ h1 D& b, q% d8 ?* i% F4 V" U+ x
   {
6 Z* Y: H! m- N' \4 N      printk(KERN_ERR "register chrdev fail!");
8 t, j- H* Z; D/ N      return -1;
, h8 Z9 i! Q3 K8 S6 M  ^   }- p+ A! d, ?, I' l, N0 W
   8 \3 K+ e( H5 P
   mcbsp_cdev=cdev_alloc();
- o4 v! X! u: E: L: X1 z# V   * T, y- {# G0 U( G4 _5 W
   if(mcbsp_cdev!=NULL)
& C/ n% I7 ]) B6 X   {1 ]! F& i  m; I: L) ~- |, ?
      cdev_init(mcbsp_cdev,&mcbsp_fops);# W8 T: T1 q/ o& h
      mcbsp_cdev->ops=&mcbsp_fops;
& g% b3 o5 M3 [      mcbsp_cdev->owner=THIS_MODULE;  r) u; R& x7 n* N& G: P& X7 ]
      2 D! Y% V/ \6 }8 g$ ~5 ]& P6 {* s" w
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
4 S  s: Y# r9 J/ t8 u5 E/ M! T' ^          printk(KERN_ERR "register cdev fail!");
2 V3 j) p  i% `, n: N# `* G      else
# v! H3 H* V/ s: J9 _: W$ h          printk(KERN_ERR "register success!\n");9 }0 c9 }) ]! e6 n
   }
: V* D, u* V9 y% k8 m   else
" E: M2 m. }& P7 ]' e   {8 b  y# l; ~9 e
      printk(KERN_ERR "register cdev err!");3 }4 K. Z9 l' ~( N$ e0 c9 _5 C
      return -1;
7 j, H: S: p; ?   }/ Q* D4 T; Y0 c( C
   
( U& b  X/ [% g  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) d" i$ h9 p' C: n! Q   if(IS_ERR(mcbsp_class))) j; j; x0 }8 s
   {
& }2 T3 N( z- @; `# T, f( M/ ^      printk(KERN_ERR "register class err!");
/ b! y2 o6 b, }5 i6 z/ V; q   return -1;! [3 \8 _6 e- c# C; y  W2 A/ y
   }
, s. Y$ U! a$ x0 t9 l: x6 J   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# a( Z5 f9 V- o' z( S* U
9 s8 @5 O" d( G. |. M, s   //PSC3 K3 ]8 F- I! _% k( Q1 b% ]7 F
   //add Enable MCBSP
7 L3 Z* H1 h5 m& w2 t   //test
7 [, ~% J! F2 G  A! ?   temp = 0x80000003;
) v9 v; N, t% ]  I8 |: B  _   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 w" F" n8 j" W, m: L) \* |
   temp = 0x00000003;
% h+ {/ e: k/ I0 M3 _. a   writel(temp, IO_ADDRESS(PTCMD_ADDR));1 d9 `7 E) x! n7 n

4 o' k* U/ ~# p0 ~' ~3 a, E   temp = 0x001FF201;
4 V+ v' s8 B% q* ]8 W/ ]   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; F; N8 K/ h+ @' K" N4 h" ]
   + z1 M4 t5 Y% G$ }  K
   //PINMUX  
0 I: w7 W; S4 x: G# a3 {   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& _& d7 B, k, l9 {
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; {3 h9 L5 }; [7 X/ Q   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   0 C$ Q; U4 ^) w9 }2 O. D; S  z
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 R* H  S* x; M8 y6 C   ( t8 o( z7 a9 L- d- q6 G+ r
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
8 P! ~( }3 X" k3 v1 R: c   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
( W0 {$ X; h& S, E5 `# s   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% a+ r% m# @9 _! P, A  l   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( u, c$ u6 t2 |2 S# ~
: F+ ?% T. `( `, E9 v
   //RESETn,L138_SHK2& e5 \. e6 e9 P9 b, w
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  6 M7 ^# g6 S/ T9 v
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
' u7 }2 m) j1 w2 U   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 P* }$ A6 O+ g7 S+ p. A
. ?* q+ |- A+ ?% k/ K5 D$ O8 E% E1 A

3 ?0 p3 `" e6 u7 Z  X# \0 q; S; e3 ]! r  //SPCR Register
' p3 e9 n0 H4 ~. f" y  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  J6 d3 b, a' a4 @/ s  temp = 0x03000000;//(DLB=0)
8 G) b6 T5 m5 C2 D# r, ]4 l$ ~ // temp = 0x03008000;//(DLB=1)5 a& p2 N" u2 l8 |2 J4 S
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ _  Z- ?7 c# L  T
  temp = readl(IO_ADDRESS(SPCR_ADDR));  x" e" x, u& @
  printk("temp=%x\n",temp);9 \6 ]$ @( n; _+ b0 [; d: c, n

; d9 G" g6 ^/ r+ J  n1 U5 X$ I   //PCR Register
( e+ W- t, u0 X5 M. |1 e   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 P  a. a3 E# @  S  // temp = 0x00000F0F;. \$ _; e' U- R- t- Z
  temp = 0x00000B0F;
! N% M1 |9 v9 @4 ^$ M" A& V# B  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' U+ Q% W0 A- {7 }5 @, }% b! K8 q  temp = readl(IO_ADDRESS(PCR_ADDR));$ @0 K! @1 L3 W! V
  printk("temp=%x\n",temp);  
( F/ L0 e% a7 ~) Q4 E% G   //SRGR Register0 A: u: L1 q$ x4 v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# Y' u9 L$ t7 T  v$ l7 z
//temp = 0x301F000B;
9 Z, I' E; I+ J$ o, X8 `. y" k   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 ^0 E# ]! |+ t( T  o, j  temp = readl(IO_ADDRESS(SRGR_ADDR));2 i, t1 U% r9 h7 Y0 I0 h
  printk("temp=%x\n",temp);8 b( h; }% V9 h  p5 P1 U
   //RCR
2 ^, I8 `7 O+ R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. m7 V5 L, r+ Y; z0 ?5 c
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# e% X& z- x9 `  @   temp = 0x00440040;( \5 X/ E! a9 R  X  b0 j/ @
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  ~) ]8 y9 J) [3 n6 r( z9 U! `   temp = readl(IO_ADDRESS(RCR_ADDR));6 j3 o1 c* `! Y
   printk("temp=%x\n",temp);3 b( b4 t& J9 `: e
   //XCR
6 L3 @3 R0 N) i; }" j! @   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; `3 F, ]) Q2 ?' i   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 g* G% _* K5 N$ c
   temp = 0x00440040;# o4 W% G9 F& [5 Y
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( ]. Y7 C: K7 p! F- g/ T. i, k   temp = readl(IO_ADDRESS(XCR_ADDR));0 f% L5 a, p0 ^* d6 k3 f4 R4 b$ f+ D
   printk("temp=%x\n",temp);* W( D3 @% X  [" [. a/ ^8 a' n" _
  udelay(100);
: ^- J7 l0 r% o- F4 p% |- h' L  //SPCR Register
/ N5 p' l! @( G5 o1 C  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% z) g) S4 }5 n6 S+ ~9 M  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
1 {# o* ^, u4 u- Z* [: r7 f  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
. t& D* t- X2 Y# D) i8 D. H  temp = readl(IO_ADDRESS(SPCR_ADDR));
' G# O! S7 V8 c: X/ N/ U  printk("temp=%x\n",temp);4 c4 a, p) a. R1 }( _  ]8 l% f
  udelay(100);
9 Y% Y; I+ x2 X/ [! f. E! H6 ]. Z! ^7 v# {. i
  //set GPIO direction7 J2 t# V, Q6 K0 C/ r) G4 n
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( Y. O" \' q5 S4 U   temp = temp | 0x00000100;//EPR----input* C$ I% Q, ^9 J# q4 y0 A
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 H% B( d' N' H  P* |   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
8 s9 z$ G4 y1 z0 Z( P# X$ r7 } " d/ k" @9 g, a5 K6 Q
   return 0;
' B3 |* l( R6 N' f0 e* F}
/ D9 S3 k8 w. p% b! w- ~# U5 ]static void __exit MCBSP_exit(void)
8 ]. m2 o0 e6 R3 p1 R/ G3 i; Q{  K9 p" j; Q' o; E% y+ N: I0 E
   printk("mcbsp chrdev exit!\n");* i0 K. I' }0 D$ P
   cdev_del(mcbsp_cdev);
, f$ ]2 n# b: j   unregister_chrdev_region(mcbsp_dev,count);
* S$ J  s: |: ^4 _* q* s0 F   device_destroy(mcbsp_class,mcbsp_dev);9 H4 d. Q4 x( G5 b
   class_destroy(mcbsp_class);/ O0 R) B! c7 i1 ?
}
6 _6 P. M$ Z2 D& E: _module_init(MCBSP_init);8 B6 z6 ~( t4 D! |6 z+ ?+ q; w
module_exit(MCBSP_exit);8 u; u! t8 x5 F$ |
: g  n6 S3 f9 @& N3 |5 c
MODULE_LICENSE("GPL");
5 A3 s3 X; g- t6 a) z7 ]  r
- z! ]# a7 _- y4 M我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ V7 y3 V# g; D) {6 I( @我的应用层的测试程序如下
- k( @# i) @3 y% [% c: [# J#include <stdio.h>
* [0 Q* V) |& a2 ^. ~$ c#include <string.h>
. Q5 F, g- I* N/ y- t8 X( o#include <fcntl.h>1 b( A2 Q. e3 v& p5 c
#include <unistd.h>
4 b- q8 S' q6 C9 ~+ N#include <signal.h>/ n- t; `; H4 _7 G6 h
#include <pthread.h>       //线程
4 Q2 e0 B8 i1 {* T' q+ _* e#include <stdlib.h>- N" \0 X' r" n5 Z9 C0 \1 W
#include <pcap.h>          //捕获网口数据
+ K# C+ v# }( D* R: ]/ P#include <semaphore.h>     //信号; b3 E  h  e7 v! W6 o7 N5 A" z) e$ j
#include <sys/types.h>     //消息对列) E7 e1 r( d1 \0 p
#include <sys/ipc.h>       //消息队列' ^/ I8 x" w/ l3 L, j6 p4 }
#include <sys/msg.h>       //消息队列& v! N, Q$ \0 t! Y& V
#include <sys/select.h>
" p1 `+ M# ^! i, G0 `: T* F#include <sys/syscall.h>
' M. G  Q; O7 t4 w, q3 m  B#include <sys/stat.h>
2 y& M7 U. H* O; D#include <sys/mman.h>
# @; ?' ~: h% C' {! G9 X#define msleep(x) usleep(1000*x)! G# ~1 ?. v, A2 J4 E
6 G5 G' ]9 k& i: z* K, h
int main()
5 e8 {0 x: f9 w, c* \9 s6 ~$ B; x9 \{
) L0 W) _6 v8 R1 p5 V    //MCBSP,ARM与AMBE2000交互设备
' h; S) l. D$ e' t- s8 P  B4 x int fd;+ _3 M- |' p/ z* R5 J6 j+ F2 C5 N
unsigned short data_write = 0x5555;
( H4 r" |) q9 f1 J unsigned short data_read = 0x00;
3 @& j. K& m4 S5 B4 P  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ x) h6 D7 ?8 Q# p4 J* R //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" l) V! R+ z5 ?/ d3 i9 X; N7 M; K2 Y
   
. W5 v# }4 S. b+ k; H/ d0 g  if(fd < 0)  E% s9 O& w4 Z* U0 I
  {
. G0 n* Z# M2 f3 |' y2 G     perror("open failed\n");
9 T/ l. k, W/ E. \2 \8 J     return -1;% q( E2 x% j- ]2 R
  }4 x. G' ~' a  q8 ]
  
4 ?5 U- z; D0 Q9 x  while(1)
% w  A8 F4 P+ O. Y  {
4 |) h8 A0 i4 D   
8 E6 |1 E1 t; O5 i3 ^4 ]   //AMBE2000每次读写是24个字为一帧
. U+ v/ ^# v4 |5 h   //写数据时将数据在底层存储起来,等到中断的时候再发送9 `& f  J& T7 ?& B# Q( F" U
   //AMBE2000输入数据是以0x13EC开头的" V; t1 a+ E3 ^- b$ {3 E0 I
   write(fd,&data_write,sizeof(unsigned short));6 J, {2 m" C$ ^, k
   
: {2 Z) Y' E1 m! ^1 k: i6 H% `   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; A0 b% s" E) l* I! R% F  N
   read(fd,&data_read,sizeof(unsigned short));
: k) C9 n8 Q/ v+ _! u9 s& D$ \   2 F2 [7 ^8 L/ s  G! C% L
   if(data_read == 0x13Ec): ?/ C! r/ A% Z
   {
$ `; m4 R( V$ [  w/ l  }   
8 ?4 {! L, a7 e    printf("data_read = %x\n",data_read);# p# m- r& @/ X# W- P3 K2 l4 T
   }
2 M. o. K& p5 |" M0 G+ ?   ; b5 }$ Q4 Y/ H! [- I+ c3 [
   msleep(10);
. L; a, l2 ?$ s0 O: L( c6 O  
4 p" H6 E  @9 j4 ^  /*0 d; C+ ~; O) m: ~& q- y& \& |
   ioctl(fd,1);   ) k1 L" X( N, R3 W
sleep(1);. G( i0 j, P7 x7 v+ ?. n9 S
ioctl(fd,0);
3 t' j9 \% w* ^) u sleep(1);
8 G% E/ C8 I1 Y+ ] */
& W/ @' B/ P6 E' M' V  }   & ~2 q, {% d& o& x
return 0;
* f  {/ E; @# J  X$ d! f
8 F4 `& b+ W3 ^& s}/ I; k  f; R- p# i3 P6 [% X
* u) s; l6 H% \( H# J6 S6 r# m
多谢各位指教,谢谢! 急
, f$ G& C' N( Q; _* Y# x% ?1 w% @1 C1 w6 L

6 u: @3 ?  f! M% O) B& C
, M% a+ S1 d5 ]! v' r7 \& j$ E$ t+ }  W

$ n4 _2 T, a0 F/ j& A6 ], n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 18:27 , Processed in 0.045393 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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