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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 E  N- K7 l* ^0 z/*
9 Z! V" d- P2 _ * Copyright (C) 2009 Texas Instruments Inc
4 i" H% @# Y& {$ z' |, m* Z$ n *
. P+ Y, }3 i6 k% v5 j; L * This program is free software; you can redistribute it and/or modify! [4 H5 a* J* f/ ]
* it under the terms of the GNU General Public License as published by2 l& S$ T5 E: g! B1 n( n5 X
* the Free Software Foundation; either version 2 of the License, or
! U4 m0 v  {% ]& [6 ]  B * (at your option)any later version.
0 h# d8 k5 i% m, i *
- J: N% m1 c% W- K" v2 @  H! o * This program is distributed in the hope that it will be useful,0 @" G% d6 B, r0 e* O5 H
* but WITHOUT ANY WARRANTY; without even the implied warranty of0 I  ?/ @  w5 X  T  y/ L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& w9 _1 P$ W$ u! D* T1 H0 M
* GNU General Public License for more details.
, `; ^4 h: L* p3 C0 ^. { *& q/ [: \& m! [9 Z$ }4 I
* You should have received a copy of the GNU General Public License
; M: ^3 X" K2 \+ b4 | * along with this program; if not, write to the Free Software
# o2 i* ]) w; c& C1 M4 \ * Foundati4 I9 B8 w( W! o% [9 D
*/
# H4 p% {! g. {3 F$ e9 S#include <linux/module.h>' i% E# x6 y* Z5 P+ r
#include <linux/init.h>+ L) K% O3 ~3 h8 k1 X
#include <linux/errno.h>
% G" h* B. T6 j, K, M! n! Y; ~#include <linux/types.h>3 @+ {* C- }  z( ~1 c6 D" f8 j
#include <linux/interrupt.h>
+ ~: E: Y; e; P# e$ z& r) D#include <linux/io.h>- L% E# h/ f. o. F( h2 ~5 I
#include <linux/sysctl.h>
5 g, I: s' n6 V9 j$ w0 E#include <linux/mm.h>9 w) A7 e8 H' N
#include <linux/delay.h>; u2 ^# q! x6 P  V% A
#include<linux/kernel.h>
: ~+ x  e' ]5 G#include<linux/fs.h>
0 ~1 \  h& U( L8 u* _- i#include<linux/ioctl.h>
% |. V* S$ F$ @) e" J#include<linux/cdev.h>/ p) E, \- r2 L  j0 v: \
#include<linux/kdev_t.h>
* v& @9 Q( u% u7 Q! E#include<linux/gpio.h>
+ g7 @; z9 ^  H* s#include <mach/hardware.h>+ S# H' z$ k0 ]+ B) r) A
#include <mach/irqs.h>' E4 @7 L, c# I

2 t" M  k2 E. z0 O1 d7 |#include <asm/mach-types.h>$ G  R! x# W2 x" a; a: X
#include <asm/mach/arch.h>
9 y5 X  d  S1 S, K8 z3 b#include <mach/da8xx.h>% I/ }: k0 l& V' f6 U
#define  SYSCFG_BASE   0x01c14000
' e3 B2 W% f/ F$ {. ]6 P3 p) B#define  PINMUX1_OFFSET   0x124 0 H: `& @) v4 j( i% W
#define  PINMUX18_OFFSET  0x168
' s+ Q. e4 S& t0 \( k$ |. }#define  PINMUX19_OFFSET  0x16c
& G. n: P1 B9 V" q3 ?#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; K$ S1 a- ~" U6 w
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR! A" P9 E0 s+ i; l( D6 T
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR1 w6 a, n7 u0 [
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% f* C( [' D) g" E5 b#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
$ @2 Y; x# o5 X$ ^2 m                            ! g0 }" i* [; V$ g8 a/ }2 n
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR" b9 O3 ~* r1 ?. c2 T
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
, L3 x: I5 T3 V$ b; S5 ^# J+ X//PSC
4 C( y& t2 p- j* z) R#define  PTCMD_ADDR   0x01E27120  - j: L  A- Y7 W* S* m8 O
#define  MDCTL15_ADDR 0x01E27A3C. l- F1 F1 J9 y7 I0 I" g
#define  PDCTL1_ADDR  0x01E27304. I: M; J. o5 Y- K* d& r8 L* I' ?
//GPIO8 direction7 W/ |! n$ m# @# i" [, `
#define GPIO8_DIRECT  0x01E260B0
0 N+ v1 r9 W  X. B0 u- j( {) l( f0 T% U#define GPIO8_OUT     0x01E260B4) i  ^7 M% I5 ]% o* K7 H
#define GPIO8_IN     0x01E260C0
1 A! P+ b7 M+ W1 z8 C! w
* d" K) B+ `% y" `! t, J% K$ P//#define MCBSP1_RINT    99              9 x6 Z2 a- Z3 J" K; p( g
//#define MCBSP1_XINT    100  
, f- O" N6 |9 x+ x& hstatic int MCBSP_MAJOR=239;
  X' X: o( t$ j6 e6 ~8 _static int MCBSP_MINOR=0;
5 C7 _0 g; @1 e4 _8 b% j6 zstatic int count =1;3 \$ k# V8 B" O) [- e( ]

: |/ h6 R* y( z% T( ^9 m4 v#define MCBSP_NAME  "MCBSP-device"# [: b$ p6 l! g! {: ^

, @" f6 M: a* ?6 z/ k2 j7 _$ S2 ystatic struct cdev *mcbsp_cdev;  _( j5 a& b- f6 _' j
static struct class *mcbsp_class;
5 u  n) e. {! D; wstatic dev_t mcbsp_dev;
- B7 l  R' c) Qunsigned int DRR_data;. I* g1 _& ^! n: C
unsigned int DXR_data;
) N4 a4 A/ T4 gstatic int mcbsp_open(struct inode *inode,struct file *file)3 s1 w7 {8 u0 o5 J1 Y, E7 I% N
{2 D% H0 `; U7 P% \: R
   
/ {6 e1 c* @6 {' M" N% o. M: R   //interrupt enable,initialized( s! E5 _( C1 x1 o* r2 a
   unsigned int temp;: r6 ]4 [8 X3 U: S" b6 U: f
   //SLEEP_EN(GPIO8[10])---0
" v- g2 U" P1 K$ G* g1 `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 h& w6 `' ^9 {# }   temp=temp&(~0x00000400);
  }/ P" e0 n1 j1 h# N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: p) [0 Q0 q$ e1 A  //RESETn(GPIO8[8])----0----1
0 t) K  h. t) \7 o) |" V# W7 h: N   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( {. `: k3 j9 b. `: k) U8 C
   temp=temp&(~0x00000100);" O' J/ I$ s) f# h9 {3 p' t$ P/ K9 c7 N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
  z8 S6 [# `) _: i   udelay(100);
0 _( o! Y+ }' f% S( V4 P   temp=temp| 0x00000100;
0 g" l" u# G/ N, ~/ H3 o; f/ A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& }) X% ?7 w+ }
   udelay(100);. x" J: u5 V6 r& f  @. \! {  [) d
   printk("open success!\n");
0 j4 ^+ u. v' n- Y1 r# ~   return 0;
. s% J$ B. y7 i: z% S}0 c' ]+ X8 l; U; s9 u2 z% w, w3 |
$ h! I' ?( V( J# P( J# A
static int mcbsp_release(struct inode *inode,struct file *file)
# |. X. \# O$ t$ z8 W7 Q( N{
) K" b% R5 K7 t; O3 s: c   printk("release success!\n");: C4 b; r9 f  |2 a6 k0 p+ o
   return 0;! @: u  |6 ?" Y! ^/ H) ^( q
}0 O# w& C: i0 x% N6 J
" F* m3 [5 \' p) b) w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
6 V. _6 Z. F  `6 L7 U{
! L- G' w" }' F( x) v" n/ [" J    copy_from_user(&DXR_data,buf,len);* @( A0 a# h! j6 e8 V  Q
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       9 R& q: p+ {# _
    return 0;
. ]3 I1 [7 @( } % t- ^7 |1 {, f6 i- t- Q2 X
}, G; E* c" I5 }4 \) h9 \: A! H( }3 A
9 b; X3 M% l2 T+ Z1 G  _/ m/ j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)  A0 G# b! _  z5 y( c0 {
{ : X) L: H- I* l
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, d0 H6 x: e. ]0 O7 n
   copy_to_user(buf,&DRR_data,len); # J& W0 I5 j4 u6 B) v) t
   return 0;( n1 e. r6 N6 ?- Y1 R) u% ?
}/ {/ [- y3 t; L' Z% q

% I6 S4 c* j5 I  L; C3 x7 i: u9 E/ ]( R9 N  G
static struct  file_operations mcbsp_fops=# i5 a7 A: W0 x# ]
{
/ |, k+ u  ^: O8 u( ]   .owner=THIS_MODULE,
2 l( @/ ?4 L2 r) b& `7 i   .open=mcbsp_open,
9 B* ?! o& g. @2 U& \   .release=mcbsp_release,
8 N: T6 f9 U: Z. g+ Z   .write=mcbsp_write,
/ D; t) j+ r; E' N# w   .read=mcbsp_read,
* B; C/ A1 d0 V, f};, b* X4 i6 V2 S/ h
static int __init MCBSP_init(void)% q' Q. b# O( i9 y5 E$ H5 `
{
) G, G- D# x# ]0 |' t- w6 b7 y   int ret;4 u: R, s& ]; L8 ?. J, }) U
   unsigned  int   PINMUX1_REG_old;
6 l) E2 p7 n! A2 a3 I6 D; h7 ?   unsigned  int   PINMUX18_REG_old;
$ n) ?/ {2 |  T- w8 \   unsigned  int   PINMUX19_REG_old;
! ?0 w- @6 _  M: o  Z- N* Q  W   unsigned  int   temp;  9 Z; k6 M' ~6 w, j
   if(MCBSP_MAJOR)
3 D) m- x' b7 H( s, s2 H" X   {
9 R( W$ V! O' w! {9 ^      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 L" }; ]- q# T( r4 o/ f      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ x; w$ \" o7 }5 I9 ~0 a/ u   }9 ^5 [* ]$ I" ~, X4 p, _
   else7 ?# T2 `/ x+ q% `7 x9 X% d+ ~$ o6 o% K2 t
   {: n+ F; C: e# L
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
: I' F6 C3 \. j4 E! O5 C      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ {7 b- v# `: C! A- Q
   }7 H8 z. C% h2 S" O5 h/ z
   4 B1 y% ]1 X( k% z4 |
   if(ret<0)
. z$ c* D* F7 a" S7 h2 w& V   {& U( p3 s6 J- B, z3 p; ]2 r
      printk(KERN_ERR "register chrdev fail!");
% W) p# _) A, P, e3 G6 e+ x0 x      return -1;
1 q9 ^) v( L. V# g3 W5 p) `6 T* t   }
2 S, N+ o' p! b5 y/ b, A* G   2 B0 F9 c5 w& W! U/ L* V9 X
   mcbsp_cdev=cdev_alloc();
) ?* l. l' w  t1 F% w! g+ @9 e& ]   
6 x, ?/ j( Y- e7 z3 d   if(mcbsp_cdev!=NULL)0 {- A: j8 n1 O- R6 ^3 g; L" V6 m7 |
   {
* U+ L4 i- w8 _7 F. {% ^0 [      cdev_init(mcbsp_cdev,&mcbsp_fops);$ l0 k+ A: ~* e' x
      mcbsp_cdev->ops=&mcbsp_fops;
; ]/ s1 D5 w6 j9 p5 z* B( `      mcbsp_cdev->owner=THIS_MODULE;* D5 T8 O  y2 `& @/ e6 h
      , Q' {6 R9 v$ u$ R" W
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( p; ?& k3 `- ^' h          printk(KERN_ERR "register cdev fail!");& o3 g) ^# K+ y/ t6 _
      else
- Y$ c8 _! u/ T1 B          printk(KERN_ERR "register success!\n");8 u# _/ ^% N9 V
   }
2 l3 J2 `, k" P5 p- I, a, p& ^7 L   else
3 {* ?- i. }" n! U' M3 T! F$ i   {% M+ f! P* @& B* `4 n
      printk(KERN_ERR "register cdev err!");8 b) H- Z" l: J. s8 x7 s
      return -1;
! a8 V- n5 S3 f' f3 q   }  H/ S0 c2 H- V0 @1 {# C! B9 b
   
7 S+ {& u1 v3 M* l% K! r) \  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* h" K. p% J2 i% E5 _
   if(IS_ERR(mcbsp_class))
/ a. J1 v* N/ D6 G7 ?   {! ~3 e& a6 g! @2 a3 J5 k4 @. t
      printk(KERN_ERR "register class err!");8 A. U! O& F7 }- T; b. F
   return -1;
* O0 `) b; G, ?: O6 j) p   }
  b4 B& z/ N# H# L; k   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; ~/ C7 n' m" N; G1 A
) t1 x- N# Q1 a2 [+ f
   //PSC
8 {9 V, D  ~0 z- w* e   //add Enable MCBSP/ g% }7 a2 O1 n# s8 q/ G* A
   //test
1 v: v9 b' n5 b* ?# R* @, _# H* }   temp = 0x80000003;
( R! B8 Y# L. g& q; @2 e& p   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% f% W3 S$ m: F- W& i' G3 a   temp = 0x00000003;  Q5 d1 o  W" O. q
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 j7 i' k. r% f' u' }+ Q7 k4 D# G
) u, t' O' D7 i  }# @$ D" s0 I( T   temp = 0x001FF201;: M% m  u9 M. Y# J9 W
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: \3 e( i1 B" P& ~& C$ `+ L" P   5 R0 o+ {, F7 o" f9 i
   //PINMUX  
6 H/ z) g( G, g0 J) l& O   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& f$ j) p3 K2 z$ V' Y2 w, S) d
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  / Q. {! }/ b5 ?; x3 w' R8 o7 a; k& }
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
2 r( [5 e6 C* g   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# w: I5 Q  ~$ L
     S- X* g6 x+ f/ x* ?1 |
   //SLEEP_EN,EPR,L138_SHK1,L138_RC: M/ Z$ `. d/ ^. _+ ~: w$ E
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ( t4 \) q" n- |( E5 p
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 U! G- e% `; P1 w2 D) Z
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* n  `6 C$ K0 N! [- p
3 q4 R6 o# W0 H+ U$ g4 k9 m( J5 y   //RESETn,L138_SHK2
, s: [4 k" z, X7 X   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : ]7 b/ J* D$ b5 ?0 L
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   5 \# i2 O2 a! n) G* Q) ~9 P8 @
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 o9 X+ S1 N" Q 3 e9 a& \4 h+ M' F

3 q4 c8 B& V- _  K$ D* |6 g& u+ J  //SPCR Register
& v3 s& S6 X# Z' D; g$ ]  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 ~1 P! R6 E7 B4 U) m& x" u% X$ \  temp = 0x03000000;//(DLB=0)
7 N! E0 e( }: h7 A8 b2 M // temp = 0x03008000;//(DLB=1)# ?- @+ ]& B9 w8 F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  T7 m  Y! Q7 B3 `9 @3 t# x; L  temp = readl(IO_ADDRESS(SPCR_ADDR));. o5 I) k7 ?1 Y0 N8 a+ L" R
  printk("temp=%x\n",temp);. ~5 G' G5 A) t& Y/ e& S
3 m$ ?. h0 C) o
   //PCR Register- M) e4 z. o, |/ x
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% z6 K* v' t4 I7 T! P, M  // temp = 0x00000F0F;* N# _4 I) y3 e' B8 t* x9 `
  temp = 0x00000B0F;8 X) _6 }7 `( V. z% E
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " o% o# Y7 ^5 D" m  d
  temp = readl(IO_ADDRESS(PCR_ADDR));
. \9 D( Y: y% F- F8 s( T' J6 ?  printk("temp=%x\n",temp);  ( A6 d1 T  Y+ p5 t& o8 X" J
   //SRGR Register$ c; Y! U; X+ h" D$ |" I7 o6 R
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* ?, R, c- f  s; k
//temp = 0x301F000B;/ Q8 E+ R% T6 ^1 d% b2 i
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
! Z& ~) j6 b1 R+ W  temp = readl(IO_ADDRESS(SRGR_ADDR));+ S6 u: {- S) I7 Q1 W
  printk("temp=%x\n",temp);
# Z% w& B7 [* a# k& V6 G   //RCR) X4 \- A- y; @  ]" i
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. g  G3 @/ c- p8 R) M, l6 F
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 N8 _" K2 d! I; j- e) M   temp = 0x00440040;
+ X) O, ^4 C. ~- @5 p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
4 y/ g3 {$ X, h2 N- E   temp = readl(IO_ADDRESS(RCR_ADDR));
5 Z- A& o; {7 A   printk("temp=%x\n",temp);
2 E: k0 E3 `' W( E. w. E   //XCR' b: D% b: x* ~+ |4 g! @/ s
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 D% y, m: g, `5 p) q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) z- b. {3 j3 {1 {3 r
   temp = 0x00440040;
  s7 ~, n7 [: O5 V% i9 Q- [# }   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + n6 I: z" l8 e' s+ @5 V& J
   temp = readl(IO_ADDRESS(XCR_ADDR));: O1 T1 o7 r; N7 n* [# @
   printk("temp=%x\n",temp);$ W# e, }: K2 ]( v- w
  udelay(100);
* m$ K% `4 u7 ?) W( Y  //SPCR Register
7 q, \* A" b4 f# x$ @- f" z  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! u; f- k0 t* J6 |
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( ]  ?. G/ p: c2 z! `
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled& z) N" @' ]! V+ f  X$ S
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 b, i/ M8 Y9 p* h4 t( L  printk("temp=%x\n",temp);
2 P! J% t7 k; Z. O' O, X  udelay(100);; @6 m" I" n2 _5 x6 H9 {
# D3 W4 O% C% {. X! {/ y+ Q: y$ \3 b- l
  //set GPIO direction' w1 z* y  r  ^  @. L. u
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
$ b0 Q( g. X& z  P# R   temp = temp | 0x00000100;//EPR----input
$ F2 Y& j6 I  Q6 ]; [   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ R  V8 c% W8 {3 J: X   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 W2 |: ]5 X$ ~% r ' \$ R* x' X. z, l  i( Z
   return 0;
2 ~% ?6 o& p6 P) s1 w+ H}
0 \8 ^( F' f; K2 Vstatic void __exit MCBSP_exit(void)
6 {' F8 S  V* z- m5 d5 F; W{* S: x2 Y3 K4 x( E) H7 u
   printk("mcbsp chrdev exit!\n");4 u- o: m' F; Z8 c" z" x% c, Z
   cdev_del(mcbsp_cdev);
' u% v) p) f5 N2 D# w5 J   unregister_chrdev_region(mcbsp_dev,count);, J& ~. r# e3 N) W: Z- ?$ C2 ?
   device_destroy(mcbsp_class,mcbsp_dev);
6 T) q9 B; Z1 K# W8 T& A. Y   class_destroy(mcbsp_class);+ A& s) r( h& W
}
* V" v( O: }' T' j3 o' f* J7 Lmodule_init(MCBSP_init);
# o8 M, T$ @9 d+ ?module_exit(MCBSP_exit);
0 u& Q% o; M4 l, Z. _: f) f) ~. z2 A; `% x* Z: k8 o
MODULE_LICENSE("GPL");) f: \* p9 O, U: ]

6 ]( d: [3 }) e我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- m; A, M; d" c' n/ |7 ^我的应用层的测试程序如下8 g. `! t' B, ?7 _' N
#include <stdio.h>" `+ d! l5 V7 y! d+ c6 @
#include <string.h>
' h  ^( L4 r; A7 q5 s' x, ]#include <fcntl.h>- N8 T) K6 \  k
#include <unistd.h>
$ b& l7 u* ?1 H/ }3 b( a7 B0 A#include <signal.h>
6 r# c) I& J6 T$ |5 C#include <pthread.h>       //线程8 o( W' F4 f6 {1 S, p" ?
#include <stdlib.h>4 s2 I) n0 N& D& d9 R
#include <pcap.h>          //捕获网口数据
; }  E% q7 }, w, T& z* Q, V#include <semaphore.h>     //信号$ U# K( N) I& a' u9 y! B7 Q/ @
#include <sys/types.h>     //消息对列
: J) K, M0 H& v, M6 p#include <sys/ipc.h>       //消息队列& X, z, q! n, Q7 }
#include <sys/msg.h>       //消息队列
6 H  M5 M2 |8 c) A4 Q#include <sys/select.h>
! t; ?. X$ z7 h) U) y! D) {#include <sys/syscall.h>
' b( Q1 o. [# e% W, b#include <sys/stat.h>
' E  G* W  N% q+ p! S#include <sys/mman.h>
- m0 e) K" y3 Y7 ~+ F#define msleep(x) usleep(1000*x)
+ @7 Z9 ]/ z8 J" r* Y$ U/ m( Y6 a# s
int main()
. R6 i% l6 X/ D5 Y- A) v{
" A* V/ ?% J$ `$ t; L; I    //MCBSP,ARM与AMBE2000交互设备- [) i, u, [$ w# W# \) v, Q
int fd;2 O! ?5 N3 b* G  R8 E" {2 |; w
unsigned short data_write = 0x5555;
9 K7 J; Z. G9 ~9 I" m unsigned short data_read = 0x00;
8 I( N: z, V" x4 D- ]. n3 L' E0 V  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. l) T0 B) K9 G1 W //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ W4 r! \+ U  l7 O- e/ `   
' c8 [2 s& L' B. R, ]. q6 \& f9 X  if(fd < 0)' M( W; @3 ~2 j- t
  {
5 q7 {: S& C* o7 i$ {2 P) Y     perror("open failed\n");
" y1 G# s3 h1 Y7 Y  \% \" W     return -1;: \& e0 @; d1 d7 U9 R
  }
% ~) \9 L1 L" Y2 _  1 q- L* l9 R, n% ^4 ]  F+ i9 t, x
  while(1)/ b; e7 \- z8 R! ~/ ]& A
  {
0 }" j5 {) [1 F2 t2 m7 j   & q9 h# y3 ^: x! l* ^' ?
   //AMBE2000每次读写是24个字为一帧, W4 k3 H& L6 \. @
   //写数据时将数据在底层存储起来,等到中断的时候再发送2 d$ ^; h) m8 G
   //AMBE2000输入数据是以0x13EC开头的! j: d9 q' I; P0 U# X# o
   write(fd,&data_write,sizeof(unsigned short));8 t, a- ]' x$ G* |* f& z* c7 h! W
   
8 k- r: w+ s3 @/ k8 V   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & J3 T0 |+ B: j( F6 w$ O" E
   read(fd,&data_read,sizeof(unsigned short));- p. C  t6 P" o. I, P( p% z
   + c$ Q$ |# `; M" V7 [$ \+ B7 a3 q
   if(data_read == 0x13Ec), Z: p+ k. G8 b) ]. C
   {$ x* q4 s& I! W
   5 R$ U! }% j6 }7 E
    printf("data_read = %x\n",data_read);
) o# N  G6 F  M7 N' y* S, C0 N   }2 h  N% r9 \3 S3 E+ `! b# n7 D' O
   
* M. E9 v  S2 O3 _2 p   msleep(10);
; C1 a0 b2 ]* v* Q  A% m# z5 u" Y  
- Q/ e( N7 O6 _9 C  /*
# |( L; p- U2 j  c1 b9 Q   ioctl(fd,1);   
8 |, t- o% S3 |8 P8 P# @ sleep(1);1 m) U/ r6 a' U  l( v$ n
ioctl(fd,0);3 m& B4 e2 v! H$ r
sleep(1);
: K( A5 Z+ A* J: s */ + Y, `4 ?# F/ w4 f( f6 `
  }   
) ?! y* R9 ?" R" l return 0;
' N% F2 B1 D3 g! ^4 l) n
# Q, v  R7 D3 D8 ]% v}
4 P. S- p! @/ D
- j1 [0 x0 A( {! z+ r: i/ L9 m多谢各位指教,谢谢! 急* B/ H* m- T4 i. u- s. S

3 ]( B4 i+ l) T& U# a# o6 Z$ X
% T' I' J) L1 {4 _: E3 @* A5 Z& ^6 M7 W' B( u# J
* Y( c" r4 f# y; x# }3 [7 |
# I: [( s7 _! J% X  h9 v6 V# T! B" @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 04:52 , Processed in 0.040950 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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