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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( r8 {" e: i+ q' b1 w, o/*
& |- ]9 H% V; E$ c$ e * Copyright (C) 2009 Texas Instruments Inc; X2 _% ^0 m# j
*' Y0 L1 l& E! {# x  [7 b- I' M. x
* This program is free software; you can redistribute it and/or modify# Y" ?" F* b; a' n
* it under the terms of the GNU General Public License as published by) w3 {; C/ W+ I9 L# z3 y" D, V
* the Free Software Foundation; either version 2 of the License, or
3 {& f6 u& T# Y5 {* n: D' _ * (at your option)any later version.: K# n+ u- J0 V2 u9 F& M
*& L* s" P( y( P; |' E" ~: K
* This program is distributed in the hope that it will be useful,) M( L' c/ V# O$ b. v! {' F' Q. f
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ e) Q* n/ |" c9 ]. M0 P
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 O6 S6 z9 X. B' c * GNU General Public License for more details.0 K/ y, u& A' I! P
*, Y( l6 ^( _$ C0 r
* You should have received a copy of the GNU General Public License# D5 s5 U/ G" j3 d# J. i
* along with this program; if not, write to the Free Software
, {9 @# I: S' s: S5 g1 L* m- _9 e# o * Foundati
! ^# w, n1 h) w*/1 j+ m" b1 x( g4 J
#include <linux/module.h>. _; [  B  e0 o. h* q. ?! Y
#include <linux/init.h>
) c, h' G$ W% V6 W, e#include <linux/errno.h>' `& f! k: y9 j2 I
#include <linux/types.h>8 E5 m( e; a+ X6 n! w& s  T: y
#include <linux/interrupt.h>" W7 i) ]6 z5 G" _* h7 \7 c
#include <linux/io.h>+ B6 A2 R9 b/ i: d" G+ p
#include <linux/sysctl.h>
* Z) g9 Q0 n9 B& Z8 r( `* H5 D#include <linux/mm.h>. U% B" J7 L4 h* n
#include <linux/delay.h>
. t" g: Z. d1 K9 F4 v( a/ z$ p#include<linux/kernel.h>) U/ `. X7 g1 X8 `
#include<linux/fs.h># ?0 X) Y4 @; N- c. V' [" h; b. W
#include<linux/ioctl.h>  }. t/ E, w6 z% y
#include<linux/cdev.h>
% X' `" X" G5 q  v" N& f$ d8 Q) |& h#include<linux/kdev_t.h>
0 Y  t+ P/ d9 w" Q: v$ C# F$ i8 t#include<linux/gpio.h>
+ J& b8 _% l5 l2 Z. a: J) d9 b#include <mach/hardware.h>
6 @4 j" y! a; o: k" e#include <mach/irqs.h>( }1 v. W. T1 w7 S+ r6 L5 [9 w

0 r6 I! k: Z" a# u# S#include <asm/mach-types.h>
+ q( k3 E2 m1 c& a: X# ^#include <asm/mach/arch.h>
, K1 `8 ]/ n& T2 Q2 m2 q* D. S#include <mach/da8xx.h>
$ Y5 G" R5 o4 Q2 E0 Y* {#define  SYSCFG_BASE   0x01c14000
7 K6 g% X; r8 B* I* _7 F" x#define  PINMUX1_OFFSET   0x124
. n6 x- j* c& t' q: u#define  PINMUX18_OFFSET  0x168 * d" a1 [8 d, Z( Y0 l2 g
#define  PINMUX19_OFFSET  0x16c2 V- x8 w! q0 e1 U1 v
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR- x& L/ _8 ^! l9 }6 \
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR4 T' a# I+ @5 ~$ X
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
" W' x( r8 Z& \#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" E  h( }7 g/ ?' Z& h#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR1 T) d! ?  q9 B) `/ k
                            1 \. {. r0 K- q% _3 @
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
( p2 \; S- g' n" U2 ]3 L' w; M$ U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 K9 t& B( e( a- c( s! m//PSC! L9 g: B' i5 c) O0 W" {5 T" \
#define  PTCMD_ADDR   0x01E27120  % L8 k; P  `3 y; y& @* s
#define  MDCTL15_ADDR 0x01E27A3C/ [( v* H. G7 G1 P) m) g
#define  PDCTL1_ADDR  0x01E27304! W* b. O: x2 V. G' }  D
//GPIO8 direction
& p6 ~  b1 F2 l( V4 u# e$ x#define GPIO8_DIRECT  0x01E260B0
7 F" T6 R" I2 \+ [) L8 Y; K#define GPIO8_OUT     0x01E260B4
  k) r2 P' \8 \: V#define GPIO8_IN     0x01E260C0; ~5 H; @! Z- N

, t5 o! n! Z- r6 ~: S//#define MCBSP1_RINT    99              
; `8 l+ P" H! F% S* {//#define MCBSP1_XINT    100  ( X0 K; A8 ^+ K& `! r
static int MCBSP_MAJOR=239;9 ?, r9 H/ Z) q
static int MCBSP_MINOR=0;( w+ F  I+ X+ _" m
static int count =1;
  P0 W( z% d/ o6 b3 ?% D$ b1 \8 Q; K4 X. E. U  d
#define MCBSP_NAME  "MCBSP-device"
% ?/ F1 e; R6 q" Y9 @. `/ Y
4 K. N1 s, X, sstatic struct cdev *mcbsp_cdev;' w5 X" k# v1 w$ s: c$ {/ p) w
static struct class *mcbsp_class;! C. u9 G8 f- C3 q# g
static dev_t mcbsp_dev;  k. {6 n6 X$ k+ l3 x1 T: ~* m; K
unsigned int DRR_data;
8 u; u6 F* a$ U  ?- \. |4 uunsigned int DXR_data;
! q1 V9 Y6 B9 F- G  tstatic int mcbsp_open(struct inode *inode,struct file *file)
/ m4 {0 Q7 B" K4 C6 |{* L5 U) s2 @$ z, ~; J  V7 a2 a# R/ T
   
" l* y( |+ R+ P5 g   //interrupt enable,initialized
9 u" U& T9 y* [& v$ |) F8 h& ^( H   unsigned int temp;5 b0 g9 O1 W1 ?. C5 G5 Q3 G7 {
   //SLEEP_EN(GPIO8[10])---0  ]  `1 x) ?. w
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' v) q0 j( o+ l+ n% G! B9 y
   temp=temp&(~0x00000400);
$ c/ X! ]& x4 h: A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: d) s$ ]! ?6 Z1 ]% h/ S0 d" g  //RESETn(GPIO8[8])----0----10 }3 Z; ]& {4 O! [: M$ T
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, `/ P/ P/ ?4 U8 H% C   temp=temp&(~0x00000100);, n0 @: R8 W. O+ C4 r0 n
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. ]2 `) a8 u+ w2 h  R8 _2 b! j
   udelay(100);9 q0 Y/ e8 ^: w! z0 I, _
   temp=temp| 0x00000100;# r* F7 J) o+ V8 u, Y) u: P. J8 d/ d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% F  a2 Q4 X8 D# A. j   udelay(100);# r" [2 S4 k8 v- P- U
   printk("open success!\n");# I3 B) [/ ~6 O
   return 0;' N4 V0 R; M5 K  D
}
9 S1 ^  d4 f9 N1 j' d7 r" Z6 z" f1 f1 q( @2 a) g3 X' C  w8 Z7 D& ]7 H0 H) ~
static int mcbsp_release(struct inode *inode,struct file *file)
& f, J% l; [7 {& g# K{) T+ C  E* i3 ^- r, o
   printk("release success!\n");; h! w  ~: [: w9 F% `( K: Y2 K$ U
   return 0;
0 j, T# r- e5 n3 W8 y2 O}& z! f0 G. a1 l5 }5 ^
& h2 n8 o3 l4 {) h/ J* G, ]
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ w% N1 x$ M( R
{2 D. E2 N. P: c; ~9 w7 a9 M
    copy_from_user(&DXR_data,buf,len);
: W4 P. l2 ?+ g, m! [6 c    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       & c. T( ~, a# ]* W. V5 g/ a1 s0 H+ r
    return 0;
% i. o  K" p+ E2 v ' n0 C7 ]$ B+ q! a
}
5 ~! \# b& c% E( G$ c2 H' J: w! b  ]& O9 g5 v  E4 ]1 K7 w( Z% `
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
  V! T2 m3 J& \{ 9 \5 x6 A: d2 h6 G6 o
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: T4 f5 v' @3 j; K: s; X
   copy_to_user(buf,&DRR_data,len);
  v9 h& J3 t* C4 X& Y' ]   return 0;
: H8 S2 [( u0 V8 G3 i}
% S! i% L$ r" [1 ?6 S  B4 Y$ V- j# i/ B( a
  j$ x" x  T+ k
static struct  file_operations mcbsp_fops=
+ m; B' w0 W' s( H{
1 M" W* D. r. V0 b   .owner=THIS_MODULE,
( r0 ^! k) H- W7 E! C8 I   .open=mcbsp_open,
2 b9 s7 P* U$ a) D2 q" @" ]   .release=mcbsp_release," ~3 z. i, l4 Z2 i5 [, i
   .write=mcbsp_write,5 m; i) u  M) T+ l
   .read=mcbsp_read,
  w/ x7 A% C; |: }1 p};+ y% Q3 F( j* K
static int __init MCBSP_init(void)6 n4 @% p  p& x
{! C0 j: V8 i5 a% o* A0 c
   int ret;
9 S7 [$ P* h- ~) I   unsigned  int   PINMUX1_REG_old;5 ~4 k) _8 R1 @* G! X- s2 h" J9 f7 E
   unsigned  int   PINMUX18_REG_old;: F! f4 H9 R! x. c$ q$ X
   unsigned  int   PINMUX19_REG_old;' @  ]5 a/ c" x' n' o+ b
   unsigned  int   temp;  
1 F+ O* ]1 ]$ ?   if(MCBSP_MAJOR)5 L4 Q' b" D( o% Z& K$ [3 g
   {3 Y# w0 v% y1 m
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 x5 }0 O: l$ K* Q( i, `      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 _9 ?& z2 b2 w; j  Z( d7 U   }; S$ s# V# Z$ c5 n" {. @* V
   else1 z7 [+ m) x" U; c
   {
% G  m, F( o- d  K      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
  K3 e9 ^: H6 [1 @4 J4 E  ]      MCBSP_MAJOR=MAJOR(mcbsp_dev);
% |0 O0 |% `7 Z* y) I" ^   }
* i' A# p6 l- k1 s/ v9 I9 i   % S6 g. a% P6 G$ y
   if(ret<0)* ~' ~1 z0 @5 }* v8 F0 h" d: t/ `
   {" m8 f2 ~& `( z2 M) i# \0 m. u: F" ]
      printk(KERN_ERR "register chrdev fail!");0 o. U6 h# i& O
      return -1;- ^9 o* d- }1 Q4 B/ {; c& }
   }$ i+ T4 B, z8 y) a' A3 c7 Y% j
   ' j7 j8 Z- g' s. P: X0 }
   mcbsp_cdev=cdev_alloc();
$ h; X+ b7 Q8 `$ O3 d( L   * q5 n& D3 r# X) |) G+ `8 U" W7 D
   if(mcbsp_cdev!=NULL)
* s7 s4 S* c4 n  z# Q& z   {
  c" X: M, |4 ?& h3 S; [" L      cdev_init(mcbsp_cdev,&mcbsp_fops);
- C# y: W  R5 @# W* n5 W3 p* T, L      mcbsp_cdev->ops=&mcbsp_fops;. k# d& [$ \" x  a2 A( l$ E7 s3 G8 y
      mcbsp_cdev->owner=THIS_MODULE;6 ?6 U5 |  A; o2 f6 M4 O
      
9 j: }* Y" Y. t, r  V3 ^0 c2 F      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 h& r: T, C* P, k" A          printk(KERN_ERR "register cdev fail!");
) X: ^$ _+ d- Z! ~3 D      else6 }' T5 B" j2 B  O
          printk(KERN_ERR "register success!\n");6 V/ C: `- G6 u+ b  V
   }2 i( }2 R9 p1 Z" L/ }9 `% |
   else
$ f+ a8 q. v$ b& h   {
4 V$ ^6 i: `3 N+ p. a      printk(KERN_ERR "register cdev err!");, L, ~( g! ~# A" e: i& p
      return -1;
1 c' B) s5 Z0 U1 }5 p. n   }* [& [5 U7 s% Y# M
   - X, i) P9 [, }: x& ]
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% L" F# C5 D9 r% f
   if(IS_ERR(mcbsp_class))
, u# f- a5 V. G+ a, O   {
# a7 N. `# o4 @: N/ L/ P      printk(KERN_ERR "register class err!");9 I0 t' k. k* b. `  v" S
   return -1;
5 e" ~4 u- \, ^4 W   }9 O4 n! {+ N3 J4 U- `/ g0 j
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 w- H- z2 B( p' U( i$ w1 T5 l# x
( @8 `: i& y' b) E9 R; r
   //PSC2 h+ O+ o$ o& [
   //add Enable MCBSP
/ f) `2 T* o5 @' j( P   //test# B2 v+ H2 A; ~
   temp = 0x80000003;
8 G6 Y1 k# u9 c, D3 {. z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
" f) j4 q# z* _9 w! o% b   temp = 0x00000003;0 v* G: Z$ t( v7 R$ o7 q3 x
   writel(temp, IO_ADDRESS(PTCMD_ADDR));, ?3 U9 G# G+ I. v8 T$ z7 B

% ~4 V% A* |* X! Z* C2 W   temp = 0x001FF201;' ?' S2 ?7 ]4 B0 N& N. d: u6 F
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) J+ T6 v* T# `6 R8 u# m6 K$ d
   $ c: }+ l1 O4 D$ J, C' v! C1 L/ ~
   //PINMUX  
/ n& R3 e" B4 p( t1 }* V& \   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: K: b" b, }9 x: l+ G  a6 @. K   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 m  r) W  w5 Z/ |9 A   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
2 i" I9 k* N: ~) m* Q: H+ k   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 A* C3 B4 ^, }% k
   * g$ @/ K, p' Z/ k* f, b; b
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 n, G% c. Q+ w7 ~: r. o   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  9 N7 ?1 [$ y- ~
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
  `4 @' p/ a. t7 y& i7 [2 M5 ~   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- g* v" i* j9 G9 B" p + G- `; B; t9 \( e. N- p
   //RESETn,L138_SHK28 j6 S! t+ L. B' V% P, F
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
7 W1 ~  t0 L4 E4 N' I8 R! n   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 _1 y/ K7 h2 [; G6 b* K  H; ^   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. u8 q6 X& ]! E# [
- K1 Q. b' Y- }# E& R$ t! D
% {2 i9 N+ q' @6 r2 g  //SPCR Register5 V& B+ R$ Z% o- u, @! k1 A) C# W
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( p  c# K5 ~, g: Z# [
  temp = 0x03000000;//(DLB=0)* y( s8 a$ Q  R; {% W  G  T! ^
// temp = 0x03008000;//(DLB=1)
0 N- v$ w, C0 P: f- v0 F! H2 M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ z$ h- u- H* K7 V
  temp = readl(IO_ADDRESS(SPCR_ADDR));1 b* X% n5 w* \$ Q
  printk("temp=%x\n",temp);0 }% M- g: d- O% o
$ L+ U3 j, g: ?; w: @0 N! J
   //PCR Register
) o* M- F  A' }( \5 w1 V   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
# ?3 x1 g5 ^: c6 H: q  t  // temp = 0x00000F0F;. e& y% F4 U" @2 Z
  temp = 0x00000B0F;" O0 {4 h- [/ J  y+ F1 }
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
$ l( P& G" I+ Q& b, j. o# q( s  temp = readl(IO_ADDRESS(PCR_ADDR));
: J9 ]( E- Z6 N, g3 Z) O- |8 q1 @  printk("temp=%x\n",temp);  
) y4 ?( U- C( h   //SRGR Register, j- i% Y' O! d: ~: o7 G
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11  B# D1 X" P1 G/ {" I$ n; u
//temp = 0x301F000B;: G2 b0 }( j6 E( E
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
5 U& A8 w3 i" x2 e  temp = readl(IO_ADDRESS(SRGR_ADDR));
$ `# h% Z% _% F9 G  printk("temp=%x\n",temp);
( e) X! b' y, x4 y$ B   //RCR, w; x4 |7 \8 G# O
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
# \1 Q, Q* |5 P- t8 ]7 V   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 \& n! H" a0 [- L6 j8 ]8 ?
   temp = 0x00440040;. r, h' i- q8 K  i' w8 {) ?/ A7 I( I
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized     S8 ^, ^7 b  i  B2 q/ L0 h3 G
   temp = readl(IO_ADDRESS(RCR_ADDR));
  Y" K7 N2 w/ p0 b, K' `* S+ x   printk("temp=%x\n",temp);) g7 ~/ B8 Y+ [) L3 Y0 Z. y
   //XCR0 }8 X4 \( A! \4 |8 k% t  Z4 `
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
# V- M; P0 w- p5 o1 m6 |% ?   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 u# d9 U# E7 U7 \
   temp = 0x00440040;
% [" v: R( Z6 z# l; S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " y& \3 E' j& ]! L& Q' V+ v* v
   temp = readl(IO_ADDRESS(XCR_ADDR));
% L5 ?. N& d- y0 l   printk("temp=%x\n",temp);. a! j4 P' n6 \" `* O9 n
  udelay(100);, |3 p) A9 K) t7 x; d
  //SPCR Register6 T# C# J9 S# n5 x; \
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! ?! L" s/ R2 ]
  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 P  p" h, L. c( A+ u. {
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled  u/ H( `# {6 s8 [6 _! @) ~$ f
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  y0 t) f4 K! ~) H  }6 r  printk("temp=%x\n",temp);1 i& S3 `7 P0 A4 _8 Y5 F8 k
  udelay(100);
- C  H' j% j8 U) D" a- o( U2 ^" J; Y# Q& s. n
  //set GPIO direction: P, g. o# W: A% X8 c/ R2 h* }4 T
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 y3 S/ a/ i& u# T/ c" p1 [. z
   temp = temp | 0x00000100;//EPR----input# a' Y4 Y4 U4 R& D/ X# Q
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output/ K' k! q% r# p1 g% t* {
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 Z6 P- M6 M3 }( ^4 b3 k
+ Y/ ^- j' m6 E. p- [' f( g   return 0;
  o8 X. A( @% b$ B2 D}
" M$ q+ d8 X" f0 f( ^) D4 xstatic void __exit MCBSP_exit(void)4 t; D- n4 \; x: c
{8 H" W' e1 m/ m. v! @% k8 J8 d
   printk("mcbsp chrdev exit!\n");
! V9 u$ v$ U& _; u$ E8 X$ B   cdev_del(mcbsp_cdev);
2 n- n3 ~3 E6 d. T: i   unregister_chrdev_region(mcbsp_dev,count);
* ?" o1 o: Z1 ]# g9 y   device_destroy(mcbsp_class,mcbsp_dev);
& ]+ P3 Y. b9 r( V/ O   class_destroy(mcbsp_class);5 }  t$ |/ f& }8 X( O
}) T6 {. z! U, Q7 j/ Y
module_init(MCBSP_init);
0 s; E  o/ P% Gmodule_exit(MCBSP_exit);# ?) j) f4 x: [' Y2 a
0 d( v9 M  O5 r$ _! Y
MODULE_LICENSE("GPL");
4 Q( |( \& |- v& _, ~; r" y7 A# {3 Z, F! a  o+ U
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' P9 i' x- z* K
我的应用层的测试程序如下8 Q7 I: \, O( G! A/ J8 A
#include <stdio.h>
6 ]6 c8 e+ g7 z2 i' W#include <string.h>
; M! A, q& z8 X5 O9 m#include <fcntl.h>
* m- {- o& ]# U& V% N' }#include <unistd.h>
! u6 y% B" q9 Q9 G& T5 J#include <signal.h>4 V. ?. m$ B  z
#include <pthread.h>       //线程: r* {; a1 q& ^5 ~
#include <stdlib.h>8 m$ b. u, L8 u$ }
#include <pcap.h>          //捕获网口数据1 V  l5 d* x2 ?. [# }8 ?
#include <semaphore.h>     //信号
4 Z- ]' V  r4 m#include <sys/types.h>     //消息对列
0 J) T. z. H5 \5 B#include <sys/ipc.h>       //消息队列$ @& D9 N# w3 @0 w; Z
#include <sys/msg.h>       //消息队列; h* \& c8 x: C- |) [
#include <sys/select.h>
6 E5 R+ k( }6 n9 U#include <sys/syscall.h>
1 R: C2 N3 w! L3 P, y#include <sys/stat.h>
* W1 ?7 z2 v, T#include <sys/mman.h>2 o  L- z% m  o, j$ A7 ^
#define msleep(x) usleep(1000*x)* ~9 X3 ]" Z" ]3 s8 \+ q

5 Q, Y/ e. I  f# u. ~& \, kint main()8 q9 V& M+ o+ I- I/ D
{
0 j) v5 @/ {# i    //MCBSP,ARM与AMBE2000交互设备7 l0 M5 X$ r  n4 z8 C4 R8 o
int fd;! p2 z0 D5 @/ J9 b4 e& p  @
unsigned short data_write = 0x5555;
9 g5 V, X4 v4 H; T7 V unsigned short data_read = 0x00;
; @; x; f, j: D3 }  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 E' P$ C: G" E+ A( D //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 p6 |7 H! {4 V: l; u" s" V
    , }- Z& L! p  x
  if(fd < 0)
" }7 S6 p8 y6 k$ l5 J3 n3 e" p  {: Z5 Z& G- L2 N6 ?% k- x
     perror("open failed\n");
+ k  M) Y# u. Y/ K3 Q     return -1;
% U# X1 W6 i2 N" s2 m9 L" z" c  }
! N2 s' K+ j& B' w, P$ K! t  
9 e4 q2 ?: e( n, J5 K  while(1)% J3 h& O& I' z1 B2 k% f: I
  {7 [+ w, [! E. `2 H" O: x7 i
   8 f1 `( @- g3 o- E( H
   //AMBE2000每次读写是24个字为一帧
1 b  a; u  i' L$ _9 u   //写数据时将数据在底层存储起来,等到中断的时候再发送" e" j/ W* A, R/ d  T
   //AMBE2000输入数据是以0x13EC开头的* V$ b) m- Z" h, v* c3 w
   write(fd,&data_write,sizeof(unsigned short));% F) O) A7 ^+ }0 i% ]+ ~* E* u/ h
   
. u% p+ }0 }  i+ c) b9 V. d( ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
0 q# P1 ~8 `/ Y3 z* R   read(fd,&data_read,sizeof(unsigned short));% p6 |" R% h1 V/ I
   
) `' n3 [8 U; K. @. F* E) r$ ?   if(data_read == 0x13Ec)6 R3 O& E. [0 Y, r$ i
   {: E! s1 d7 x* g) w: ]) s5 b
   & g# f0 C; W* j  Z
    printf("data_read = %x\n",data_read);  g) `: ~7 b: G0 R% b
   }/ C7 s  [8 F+ O6 n
   9 G: J; b  n0 H+ q  a
   msleep(10);
7 x1 o& H6 {3 @& F' d+ M  
$ |; c# u) R0 L$ ^( W0 W  /*
5 O/ ~1 [$ M6 N' x   ioctl(fd,1);   
7 c4 z; K  `  k sleep(1);# h1 q8 L* g( k& d
ioctl(fd,0);+ d: f: u0 H/ G4 i
sleep(1);
3 J$ U5 b: l6 C$ f5 a */
* j) c# h. {, J3 O" N* G  }   : x. I; e7 w" H" x& X2 E5 |
return 0;
! M$ }( w' {! C 4 }  k# W* u1 S2 [9 T
}! p, d1 w) `2 r0 i8 o$ Y
7 |6 _% E9 p9 \( W1 g
多谢各位指教,谢谢! 急
2 E" y" h8 ]( O5 {+ r3 f3 H( C0 L$ U; L4 ?4 _+ A

' b7 A9 q6 O" b) a8 \' W4 k
! v9 P( a, A! k1 I8 n/ w0 u7 w6 V  l9 M. z
* _* r( a, r7 X( D1 h' ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 13:02 , Processed in 0.049646 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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