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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ n8 W2 X& {% u
/*! f' c: ?6 z+ k( T0 a( w
* Copyright (C) 2009 Texas Instruments Inc0 @# p) d# v0 n) y
*
3 {! f% b' B+ o# z, y * This program is free software; you can redistribute it and/or modify* {4 v+ W/ @3 @7 m8 t5 C
* it under the terms of the GNU General Public License as published by- z9 w/ b6 _4 `8 G* Q/ ^
* the Free Software Foundation; either version 2 of the License, or# V! p/ Q6 B+ V1 A' k
* (at your option)any later version.
) X, r3 G% o% d+ H *
% [4 L4 q1 e( U" _1 Z! d; s * This program is distributed in the hope that it will be useful,. M$ u1 p9 L7 W  e5 \/ L& F5 t* [$ A* `
* but WITHOUT ANY WARRANTY; without even the implied warranty of5 ~( N' ?" C/ G2 F; _9 ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  u- m/ Y1 Q+ l) }9 w1 X0 |- L * GNU General Public License for more details.- u4 P. O4 S8 W0 S$ M8 D: d- I: H
*5 s/ _  {; Y5 N# _1 h- ?; Z7 K) Y
* You should have received a copy of the GNU General Public License; N( Y1 }) k; `2 r
* along with this program; if not, write to the Free Software8 c0 {) m4 K$ f3 f0 {
* Foundati
( x3 Y4 J" J+ Q, `*/; v, k0 ?$ x0 t" F8 e4 ~
#include <linux/module.h>
# p+ j. z8 N! x. E2 H# N/ C#include <linux/init.h>
$ ^9 \/ A; a2 O' v0 e#include <linux/errno.h>% O4 l4 ?6 W6 t; S5 f1 u: i/ E. {
#include <linux/types.h>
% B( Y7 j4 h! N9 {7 n#include <linux/interrupt.h>( E3 o$ N" T8 k0 ]$ @* D7 o
#include <linux/io.h>
6 g' z" t  b% s; J. j) L#include <linux/sysctl.h>
& T9 D$ c) x( ~& h  Z3 {#include <linux/mm.h>% W) u9 E0 C. ^' Y0 [
#include <linux/delay.h>- _5 w" e+ |1 ]& M" _6 K  `
#include<linux/kernel.h>1 k3 K# U( w* E& S" H
#include<linux/fs.h>! v1 p" Q! Y8 o+ s1 e
#include<linux/ioctl.h>
" W" m0 `; @& P6 T# a#include<linux/cdev.h>
  i# M' w# Z. M: d# T2 {5 Q5 C( i7 {#include<linux/kdev_t.h>
1 j9 E; U$ X$ m& W0 u#include<linux/gpio.h>
& H" V( i% S# l1 {5 @#include <mach/hardware.h>
9 F  p* i) p% D5 d! Z% I: D  W#include <mach/irqs.h>
8 u8 N4 t0 O. }/ b7 [' s# J( v% S; n+ \: I( m4 O! V" E0 j4 ?" i( R8 G0 C
#include <asm/mach-types.h>; x' f0 @9 o& E. t' i( X, {
#include <asm/mach/arch.h>5 k6 n& n8 u! }
#include <mach/da8xx.h>/ m; P5 W, K7 |" V0 O. ^0 o
#define  SYSCFG_BASE   0x01c14000+ N* B: n# @. V& ?6 S
#define  PINMUX1_OFFSET   0x124 $ a' V9 [# i( F! w# N$ y1 W. ]
#define  PINMUX18_OFFSET  0x168 / `  R3 Z4 }9 d2 X! Y2 Z4 i
#define  PINMUX19_OFFSET  0x16c; B! M' k" t8 M/ U8 d; @
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR, E( K0 H7 @, E3 Q3 n  I. c
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 r) b4 L# a$ P( i1 c#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
  s2 N7 i2 t. [#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  @; U6 ^: T2 }: S1 I3 n* K
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
4 x! y, y, t" [2 P                           
; W; Y6 F  E3 ?! g0 D  _9 ?; n#define DXR_ADDR      0x01D11004  //MCBSP1_DXR6 U% N; H% R) i5 Z3 ~  @- B
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
) q/ S6 V, f! L1 P: L( k//PSC/ y. N2 k1 W6 M+ u. B' r
#define  PTCMD_ADDR   0x01E27120  ( T3 F( k& b' G& w* ~) _
#define  MDCTL15_ADDR 0x01E27A3C* ^$ l$ l3 p# b6 i7 M' C) y9 ^" x
#define  PDCTL1_ADDR  0x01E27304" H% ^4 z6 D! }2 }# E( w
//GPIO8 direction
2 j3 C4 ?2 g5 f( }; S#define GPIO8_DIRECT  0x01E260B0
/ Q: u) i- J" O1 p% V6 N/ A' Y* _#define GPIO8_OUT     0x01E260B4
: A3 A; l9 ~' A4 ?* }8 c#define GPIO8_IN     0x01E260C0
+ @! ?; b) M- n
$ _- N- `3 [  g* {//#define MCBSP1_RINT    99              + O+ h1 e  N) T! |( U9 I9 r' l
//#define MCBSP1_XINT    100  - u) d2 Q. c% M1 B
static int MCBSP_MAJOR=239;
! M$ o% `$ n+ U/ w& ~) S# }3 Ustatic int MCBSP_MINOR=0;, u* C8 Z( ^: y$ s) g8 r
static int count =1;& f. D1 h/ G7 C& n1 I( {/ A
7 j/ g$ e* K1 x$ S9 ]
#define MCBSP_NAME  "MCBSP-device"
/ w! d( \4 a, I. c3 M) D
* Y# g& `- T! ]6 m2 M- z0 }static struct cdev *mcbsp_cdev;
. k3 R- r' N/ X0 M- q4 Kstatic struct class *mcbsp_class;; _, l* y1 H5 Y6 z8 i; h3 }- ?$ t
static dev_t mcbsp_dev;
+ t4 R+ ~1 k3 R3 ^4 ~/ ~unsigned int DRR_data;) S. D  c$ Z) X4 y
unsigned int DXR_data;
; o1 t% g7 Y- m; p- |. tstatic int mcbsp_open(struct inode *inode,struct file *file)
. z2 ~. o& i/ ^$ ^8 ^) D' c% t{
  l  y% y) `% n7 H   1 f! t( o( w: _
   //interrupt enable,initialized
. P+ Q( K: k. C5 J& U   unsigned int temp;
5 n' L6 z1 r5 A- `6 k   //SLEEP_EN(GPIO8[10])---07 l& y  u* {' z: d+ B2 c
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# e  I/ j! I8 D/ I3 r  B   temp=temp&(~0x00000400);8 I/ K9 b* }4 {8 v( [( b
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- K7 q4 f- w9 {/ D  //RESETn(GPIO8[8])----0----1
  z3 \' R' g- t   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" w$ t' W  |/ i# V6 w
   temp=temp&(~0x00000100);
1 o- A+ x8 U' M8 O8 v+ U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
3 s2 ]+ Y2 y1 o/ \. N   udelay(100);
5 r1 G3 M3 V! M( A  C1 d5 t   temp=temp| 0x00000100;
8 W3 `$ S' b- y3 G" ~& Q2 I   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  U' h2 }1 L) B: j/ y# U
   udelay(100);7 i1 @! n: p2 }2 o5 W8 Y
   printk("open success!\n");* a, }+ ]8 u; |6 B, J7 z! H
   return 0;7 Y6 }: I9 l# K7 ^  c+ b+ b
}8 h+ z6 P* v+ F6 B
3 \4 k3 B& g8 y% r* }8 t2 M
static int mcbsp_release(struct inode *inode,struct file *file). ]2 @5 H2 w' {; s4 Z
{
- j; l! f9 F$ c) ~! z$ B6 [7 A   printk("release success!\n");
' T! i$ @/ f% T   return 0;$ o; e7 B6 o5 \; h) J
}; M; a8 }9 H) V
: l0 q, C( c. n1 U5 a+ l7 g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& F9 V- `3 E) g6 C, C) c  e
{9 z* y; Y; t0 U( t' ^
    copy_from_user(&DXR_data,buf,len);
# |8 j  F: C0 T. `    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
# C: r' d' ~' f$ [  I: h# _- b    return 0;$ q- b! c2 v1 @
* Q. v1 H% P. O) X% J* l
}7 W8 Q& Z- c2 h
4 Q# \5 S7 Q# ^0 p
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 e6 V8 x2 s$ n* X/ u& j/ c) S. Z
{ 0 [' t/ t# q6 i6 e5 v0 J; S( p
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' U8 ?: n$ T( i; J0 v! `9 @  k   copy_to_user(buf,&DRR_data,len); ; X! C$ X7 g, Y
   return 0;
& x, C2 V3 c& D  x* t}
: Q  A3 N2 r# w. p
1 A, ^7 E  R& S, x
* o( t, P, S7 m9 m% ]) B7 l1 Rstatic struct  file_operations mcbsp_fops=
* Q; ?) ]0 ^+ W; y{
  A! I  ^" ^' @" k$ Z1 s   .owner=THIS_MODULE,& v1 T- @4 t3 G* Y' O, ^
   .open=mcbsp_open,: E- }. _" j1 `/ m! b! l+ o
   .release=mcbsp_release,
: Q. o; a: S+ X/ |: w   .write=mcbsp_write,
, b$ D9 [/ K0 k# Y   .read=mcbsp_read,
  g4 v  r4 @1 E& W  o9 O9 K2 r};7 m7 Y& E! v; x: t$ [  K& |5 M
static int __init MCBSP_init(void)" q; L# D$ C( S1 B1 j- _
{; s9 K! p8 E4 q! s! l% e
   int ret;; o8 t! H) b2 j" v: j  d, T0 @
   unsigned  int   PINMUX1_REG_old;
  `4 n7 _( r" n0 f2 V   unsigned  int   PINMUX18_REG_old;
2 _& e' g; I: P0 ]/ y  U   unsigned  int   PINMUX19_REG_old;9 j2 N9 i- c2 p. q. Y* q
   unsigned  int   temp;  
6 T, [) x1 a2 ?- r; y4 B, h  q+ N   if(MCBSP_MAJOR)
5 b& C$ d: K6 v; M9 O9 J2 \; I2 q   {
9 B6 y2 f3 J$ d- t$ e" g8 j8 g      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
5 Q+ m- A0 q$ x      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" M, A' Z" n: `  q1 F9 M+ y
   }; U( j7 ~$ a2 T8 k
   else
/ |/ K; S* N4 i; P' V   {$ R7 D8 }" o9 M/ k5 v
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
4 l8 E5 @8 t; n. u* G      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; o0 b0 Y4 b3 T( i' S' M   }
: B$ F$ o+ ]8 q& d+ {  T! g$ z" w" u   , l! ^6 V9 b/ ~+ R& D5 }/ j, |% Q
   if(ret<0)  r& r/ F' v) b, ?0 S, P6 A
   {6 d. F8 O1 y0 R+ R2 E
      printk(KERN_ERR "register chrdev fail!");# N: Q2 A6 j7 X
      return -1;7 |' \9 Q; w7 k# @+ a/ V9 t
   }1 s& S* P7 T6 S1 p$ H% L$ N' L
     T* _5 A+ i) P2 l
   mcbsp_cdev=cdev_alloc();
: g" G' z, E5 s; p, C$ b8 E   
4 |5 [+ c$ R5 Q8 B: x2 P4 e   if(mcbsp_cdev!=NULL)
; \* k  X6 r; n: L   {6 i& H' o7 |8 J
      cdev_init(mcbsp_cdev,&mcbsp_fops);
  G( q" q, |; a! V3 v. t# [. D7 p: ]$ i      mcbsp_cdev->ops=&mcbsp_fops;& r/ E; P8 W  M+ R
      mcbsp_cdev->owner=THIS_MODULE;
( C5 _/ Q# P, N6 p0 U( C      
0 r' x% L* C2 Y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; p# o7 \3 S: N1 U% K7 f* d          printk(KERN_ERR "register cdev fail!");
4 {0 E1 I5 T) y. t. d) U      else
$ P7 ~% O7 n1 @' p, \0 s" N          printk(KERN_ERR "register success!\n");2 R2 D! u7 E% O8 n- c; X+ L5 I6 j
   }1 d: C7 r9 ~, h3 H9 F' J
   else, L- x! U5 ~8 ?- f, o
   {! l) ^1 w$ E: ]" P
      printk(KERN_ERR "register cdev err!");
. e1 M% e  l* ~5 @+ _1 Q# _      return -1;: c: G% A2 s' B, `1 k$ ?
   }% @% c* F  S$ h1 e( z/ {7 N; Y  u
   ; c1 ~4 ]8 y- h* [3 Z; [
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 j& H' N2 W2 ^0 i1 |" I! @+ \
   if(IS_ERR(mcbsp_class))
, q  E0 v* [) j2 j   {
1 p& R; d8 _& p# e& c$ G6 ]      printk(KERN_ERR "register class err!");
* J" u1 ]2 [* `2 N6 l6 o- h   return -1;
7 h  t) g$ v5 H1 ^0 K& Z% T   }- ^! Z8 o, o* Z4 C$ w! Y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* r0 l' H$ W( C. a$ p1 h% d5 {
  P. T5 l% G+ g  Q9 l   //PSC
# G' Q8 _# \! s* O: l: K   //add Enable MCBSP
6 \1 }2 h" g( @   //test
; S7 C1 N# i# @* R9 c4 V& {* R- X! g   temp = 0x80000003;# Z2 [  ?0 X7 Z3 T
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 t' s6 E: w2 |( q2 l9 V9 O+ D   temp = 0x00000003;
0 C: k5 }6 D- V0 Q2 R; f- {   writel(temp, IO_ADDRESS(PTCMD_ADDR));
. }- E2 M5 S$ P  F( f
; k2 g5 n( M' k# g# ^   temp = 0x001FF201;7 K5 |' `& S: C6 X- D+ i! Z" a
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( L1 Z+ i2 t. g0 {8 |! u0 d   
$ Y7 \, |4 q. q7 m- H( v6 D" ~   //PINMUX  0 [9 a! g7 P, Y# Q/ o9 X
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. S# p8 Y# p( W6 x0 o   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ! @8 H0 Y* m+ L. {$ ?
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - R6 w/ [$ B. y' |. S8 X5 l+ t& S
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% [! j, i; u/ `, R" L2 k
   
" [6 A: }$ O, \9 M7 z4 G0 ~& ]   //SLEEP_EN,EPR,L138_SHK1,L138_RC/ c8 R3 M$ h3 O4 C! k
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
9 {$ Q  K+ |. D7 i   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: ]! Z! L' C& b1 {   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& x4 h1 [' i8 @* p0 J$ v

+ |; u% }& T7 d0 p   //RESETn,L138_SHK2
+ a1 u+ S! z* U: l& I: C9 E) E   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( T9 [; r) D0 {) |; n* E, s3 k
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
1 p9 R: N  ^1 f; [8 c) x/ m  D( Y6 o   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 i0 J. D" G( _5 ], I+ J 0 [  `; ^. s/ k4 r
* ]# A  t3 S$ N# a& d) z
  //SPCR Register. Q' F& z1 v6 n$ c9 A/ [) n: [1 G
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset  t: ?1 @+ C3 }+ @- b
  temp = 0x03000000;//(DLB=0)" c/ n+ B( g* M) Z# ^
// temp = 0x03008000;//(DLB=1)
) V) r* B& r' `5 I1 B- c  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; G5 U3 a3 c8 @7 M  I$ g  temp = readl(IO_ADDRESS(SPCR_ADDR));6 k- q# q, W0 j8 I4 d; h
  printk("temp=%x\n",temp);: [) r0 E9 T+ g# I( j" }

8 f1 n5 F8 a" g) O   //PCR Register/ h) L8 U  Y9 M( b
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 D7 ?  b! B& I; [
  // temp = 0x00000F0F;  M" l' ^) x9 O- o2 j' v
  temp = 0x00000B0F;5 k+ o/ V6 j8 `7 O2 _; q
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
: \% y4 L, E+ _) H) _  w  temp = readl(IO_ADDRESS(PCR_ADDR));8 ~4 L+ ?" v3 h/ T. H. {& w
  printk("temp=%x\n",temp);  9 @& x8 M2 f( z0 k2 K& ~
   //SRGR Register& M  D+ a8 E; l3 t3 v" x8 W0 U4 N, g; c
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ k5 D  b1 P+ a" F$ k  g
//temp = 0x301F000B;
3 j  t) }* E3 e4 x0 W   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' i& q( j0 w6 f/ S
  temp = readl(IO_ADDRESS(SRGR_ADDR));
$ O- K7 k* U. N: t  w  printk("temp=%x\n",temp);; [2 I* M5 F' t7 G3 i( |- l3 U
   //RCR
& _! B6 U5 ?# k   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* Q4 r5 }' F" M- v' a3 q   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 |! L8 H6 z7 ]( c
   temp = 0x00440040;
1 b$ [/ s& b4 R- @/ o* }1 a   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
2 X+ [# O: w+ o1 i+ ^) Y- Y   temp = readl(IO_ADDRESS(RCR_ADDR));
5 c' ^" N# Q0 ~/ G+ D   printk("temp=%x\n",temp);% e7 G, V" O" T
   //XCR
; W, c" X, P2 b9 o3 m$ {% T: N   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" \  B1 v! r1 A
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& \; b* i8 C2 [+ E
   temp = 0x00440040;
- m! B/ n- g# `. l4 K& C4 I8 C7 b   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " D4 E; z7 J2 H; }% r2 D9 y) V
   temp = readl(IO_ADDRESS(XCR_ADDR));" ^! t# p- }4 o% E
   printk("temp=%x\n",temp);4 q+ O& y6 w" E
  udelay(100);5 K5 `5 Y5 E8 ], n' \; z
  //SPCR Register
3 A( M# }- I1 n  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% ^+ e' D& p9 U6 M2 C- B4 E: G/ i6 Y. B  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
. P1 j5 L( o' y& K; ?+ S  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
# y) p- t1 d8 {5 F2 m5 h  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 L' Q# P! j' Q$ s! D7 T5 E5 f  printk("temp=%x\n",temp);1 y! a4 S1 u  s; V
  udelay(100);$ }* K/ W3 @$ b$ z; b
6 x, _- b& A8 i# v% f: V  W
  //set GPIO direction
7 S* W  a* J% F$ t/ A4 H) |9 g   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ ^3 X, K* l$ _, N* v1 R3 }% y: f9 |' V   temp = temp | 0x00000100;//EPR----input
, W) ?( G( j; u7 g8 H   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
0 W# u) z# R0 g  p/ C- U5 _   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 c: w; L* n* `6 e# y* I2 h

2 Z! y4 \; e7 |1 X, [   return 0;; `1 h. `) {( z7 G5 z' _
}! `. v! W9 R( P$ {% @
static void __exit MCBSP_exit(void)
6 F; r  D! O- L) \, S& I6 L{; ]/ h, c; L; l9 \# {
   printk("mcbsp chrdev exit!\n");
) L4 G1 M! K$ a2 n2 m2 u   cdev_del(mcbsp_cdev);
: X0 C2 I) ^; _# U) H: x   unregister_chrdev_region(mcbsp_dev,count);
: a, Q$ G* s6 h) y7 \   device_destroy(mcbsp_class,mcbsp_dev);
/ Z) q( w4 s* W( v" L5 ]* D   class_destroy(mcbsp_class);# d  W/ P- U" n$ n- x
}/ G" }+ a% F" `% g/ e2 `" E$ B; w
module_init(MCBSP_init);
* n$ s0 L" ?! f* b6 z+ Lmodule_exit(MCBSP_exit);
# l, o5 b# \9 L, K3 I6 n
! O4 w  s" r2 E0 G, MMODULE_LICENSE("GPL");& n0 R) n' [3 w
, {- P; A+ T% O2 L3 ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ a( D9 ^$ v, Q
我的应用层的测试程序如下- B& i. f, v) W  T* a
#include <stdio.h>
' p2 `3 Y5 k& R  Q#include <string.h>
- d7 s2 {: h( g6 o9 _7 v7 f" n#include <fcntl.h>
" l( S# a" t( V- a- s/ d#include <unistd.h>
* T. F7 ~5 ~2 p& U, }+ d' E#include <signal.h>' V# b. I5 f- K0 m
#include <pthread.h>       //线程
1 U  q8 Y9 M2 y0 Q3 h( m4 [6 e+ p- s#include <stdlib.h>
" g7 p( _: V: e& O/ K8 x#include <pcap.h>          //捕获网口数据
( X$ a9 X. T& R7 ^6 _7 e#include <semaphore.h>     //信号3 a5 S7 y* {7 s1 m, j: L+ ]2 H1 X
#include <sys/types.h>     //消息对列
% i( ^: B/ i5 k* e6 {- @' V#include <sys/ipc.h>       //消息队列
  v) Y& v! e% ]8 S2 A- Y& e5 A#include <sys/msg.h>       //消息队列
6 q( L0 n# C, M; Q- f/ U- h#include <sys/select.h>; R( i- y- t# ]5 i$ K! N+ _/ ~( n
#include <sys/syscall.h>
0 z1 I- ]' g* C, M#include <sys/stat.h>, q0 Z) ~% D) y7 Z
#include <sys/mman.h># w3 G, P  o9 B
#define msleep(x) usleep(1000*x)6 ~0 {* O$ ^) i1 U6 E
+ n$ {6 z; m6 [$ Z' q
int main()
8 d. `# L/ M& b  g" |: P# Z{
9 S! G  `" Z9 I, x- s  h    //MCBSP,ARM与AMBE2000交互设备
$ Q7 e0 A) w$ ^ int fd;
" x, g) F; O% V1 p7 N" n unsigned short data_write = 0x5555;( _6 b% V- `0 h* M% U" v% @
unsigned short data_read = 0x00;
8 T' G, E% ~; }5 }" g  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, S& Y0 i2 o" M3 I/ h* `8 G
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. V2 N4 |* @9 n8 b
    1 }. O0 n: v. W5 Y
  if(fd < 0)
% ?. [* _% n5 _- ]  {8 m+ L" v/ H4 Z- f1 e. ?6 i
     perror("open failed\n");
8 }. X$ m8 K. A, a" R9 h     return -1;5 \% M& I- `. T. X* [
  }
# {' M' @- R! v0 X' H6 B2 _  + c' q  h7 O% O
  while(1)
: \' M0 `# ^' F  {
8 ~$ Z  C- I, r' q2 l   % R  S; S1 ]3 T; ^/ {* |
   //AMBE2000每次读写是24个字为一帧
+ e* n$ `! I4 Q) {, i5 K, N1 a( S$ x0 M   //写数据时将数据在底层存储起来,等到中断的时候再发送0 H% L% D4 S5 Q
   //AMBE2000输入数据是以0x13EC开头的4 v# y+ z0 E; s5 b( ~7 ?2 h8 M: L+ Z
   write(fd,&data_write,sizeof(unsigned short));1 J. V* s+ [3 ]! a2 ^( J
   & O; ~! z. V3 }
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & n! j3 u2 R' Y: e9 w0 D- p
   read(fd,&data_read,sizeof(unsigned short));/ G# t( @6 w0 A0 R' P
   
7 e. }8 d- n0 t3 k4 }- O   if(data_read == 0x13Ec)3 ]& ^/ V3 b% l' U) o+ n
   {
. J) E) ^  t4 I+ X$ G1 E0 g   ; m2 P1 M- Y- E! A% u
    printf("data_read = %x\n",data_read);2 n' i1 y+ R2 z- N$ _
   }& \, T% R6 z' X7 `, D2 z
   
- `$ d. K5 L& w  \; s* |$ f! {   msleep(10);
& R) D/ ^1 B: g  h7 f  3 |# E* `) ?+ g+ n; Z9 J: n. T8 z
  /*
8 m! p8 U% R7 }) n( W0 B   ioctl(fd,1);   
9 J, v0 O' Q! v! F) U: n: O sleep(1);
/ X, X2 W: `: X7 y- @ ioctl(fd,0);4 V! \* P1 z0 O) {& I! i
sleep(1);
# b5 U' P* D( k$ {5 u* h+ ] */ * l6 ~" d  I" ~- ~& X5 T
  }   
' X) n, h& Z* {4 E6 M9 f( h6 H return 0;0 X& g$ ~" Z/ R) D2 \" {
% _  ^% N% n$ m
}
: k  L" q  |* D( w7 @
4 f, T$ G8 P% P; w! x- z; [$ {% {( ?多谢各位指教,谢谢! 急3 B( i; D2 C2 h8 ?9 j: U- x

" X4 |7 R1 V( f3 j* l8 _2 T# i3 [& C/ }) v6 l
9 Q+ f/ I8 \- e0 |6 j2 @
( A# }4 u! M  W. J, N

* H" g) F# P1 S* k  o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 18:24 , Processed in 0.043949 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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