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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, |6 N) j' _, r7 Y/*
- E! y2 z2 X. a: |! b1 ^ * Copyright (C) 2009 Texas Instruments Inc
5 U0 I) d4 `& R' j( S0 h *
! R: M( R2 E' g * This program is free software; you can redistribute it and/or modify& P$ @) d" {7 G( {  y8 [% Y2 n% a
* it under the terms of the GNU General Public License as published by/ \- v. Q/ S% I' s% U
* the Free Software Foundation; either version 2 of the License, or7 h7 F% J5 n1 W2 |- F( i
* (at your option)any later version.+ r# X0 n0 w* @4 H' a8 o! }. u
*' l5 \$ T. g9 ]( e/ y* U
* This program is distributed in the hope that it will be useful,
8 C! f) W5 ]+ C+ c9 y6 V# o * but WITHOUT ANY WARRANTY; without even the implied warranty of
- @7 _* v& v/ k6 P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 I) j4 G4 V: _
* GNU General Public License for more details.
! ]: K5 w+ p% t3 `. r& s2 y *
# k; I& q4 k( [. W0 Q% f! r% j * You should have received a copy of the GNU General Public License+ F. v& Q1 i* m: V9 E4 A
* along with this program; if not, write to the Free Software2 w+ D) h, |* I1 a& E6 v
* Foundati6 j' K" M1 k0 W( T
*/' Y0 p9 R5 y* v
#include <linux/module.h>
4 E& `; B: v) f, U4 y8 B8 M/ V5 u#include <linux/init.h>
4 Q2 x) v/ j2 h$ @( _. k0 y& {# h) n#include <linux/errno.h>
# G8 G1 T2 h7 o( Q# w) E; `9 t4 w6 q#include <linux/types.h>+ d( ^& t+ Q3 X% z6 g  s
#include <linux/interrupt.h>
% L, Z" F2 k: E% ~#include <linux/io.h>
1 Q  g% z( Z- V. P9 I/ \! H#include <linux/sysctl.h>* |6 F6 A0 m& X9 u+ C  l- n
#include <linux/mm.h>; k4 O# Z5 x5 r; Q8 l& w
#include <linux/delay.h>
7 E3 Q4 O# H- |2 b. S! `* r" a5 ~#include<linux/kernel.h>
. J3 V: g  S% n, O* u; f#include<linux/fs.h>  Z# T! P( H$ Q
#include<linux/ioctl.h>3 ]6 J0 v. P4 i
#include<linux/cdev.h>' [0 |' y% v: p- R6 ~
#include<linux/kdev_t.h>
7 T+ T: V* }- G! B; F, F#include<linux/gpio.h>
- V' m# b$ b2 X( u8 F9 ~#include <mach/hardware.h>
; B# c* Z5 z( W1 V+ ?+ |, }#include <mach/irqs.h>. b, G# B3 K# f
- h: _: s) L# F, N
#include <asm/mach-types.h>
; _( K* D& n7 I: h/ {. B" T#include <asm/mach/arch.h>
$ }) H, I3 O. d  D* ?; p#include <mach/da8xx.h>5 f  O1 e* }8 H: k6 E2 c. N
#define  SYSCFG_BASE   0x01c14000
) ]3 S* r. m/ q1 `% ?' n#define  PINMUX1_OFFSET   0x124
' N9 y: B" N) W/ _- v: P, p" m#define  PINMUX18_OFFSET  0x168
$ e2 i5 f5 U2 H$ @$ H4 s#define  PINMUX19_OFFSET  0x16c
# {: m0 s7 I3 s/ p, A3 U#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
* j9 T2 c% w* g/ j' O4 r#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ U. c+ L! {5 D5 k5 H2 Q* o) m#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 W, Y' o1 p/ [
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR! J- I+ M/ t3 V% ^
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR4 N$ {0 Z  }# x% p
                            9 t. J2 Q. @# z5 U7 P, p" p( O
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% c/ v7 r% S! N) T
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
8 W4 V; S. p8 y' C+ X) i//PSC
& c9 V- F, ~6 a. b3 H; R#define  PTCMD_ADDR   0x01E27120  
- ]4 \& Q1 e/ t; E2 Y) @#define  MDCTL15_ADDR 0x01E27A3C) \/ R/ ?: k; f9 L( ]
#define  PDCTL1_ADDR  0x01E27304' x1 ~, e) q' F' `5 L4 c) F( z9 \
//GPIO8 direction* B" C6 \! I- [! {$ o
#define GPIO8_DIRECT  0x01E260B0
* {, z/ g' @- ]+ A8 c/ z9 C! [1 ]5 X#define GPIO8_OUT     0x01E260B4
7 B7 y/ A- g8 p#define GPIO8_IN     0x01E260C0
" Q6 X. U9 @# Q' b" l2 y0 A
% R) p. C( {+ Y- b! a% U' j) _//#define MCBSP1_RINT    99              & {  E& @5 }2 A: m. r' \1 Z
//#define MCBSP1_XINT    100  
8 O" s/ Z$ y) t* x) Z* Estatic int MCBSP_MAJOR=239;
6 ?& J; ?" T0 a. f" e) Gstatic int MCBSP_MINOR=0;* J/ Z  h) T) d- m7 i" @2 S/ I
static int count =1;
, ~( q, n6 v8 c, u6 ?2 R' f3 ?5 F
#define MCBSP_NAME  "MCBSP-device". m3 K. t6 r% V% @9 e1 C. E
. E$ M+ s+ r3 V" u" L+ @4 k
static struct cdev *mcbsp_cdev;( j2 n- B+ G4 n7 D* W' N. Q0 U  [
static struct class *mcbsp_class;
* d6 z# M+ ?: \1 Y/ F- tstatic dev_t mcbsp_dev;
; P: w- p8 ^. _( a" \( ~unsigned int DRR_data;
6 B3 t5 I3 U4 e) q2 o6 S* `$ cunsigned int DXR_data;
. {# Z+ y) p% A/ Y# istatic int mcbsp_open(struct inode *inode,struct file *file)
/ l- \5 L7 _6 }1 O{
% U; ]5 y5 q; t. U6 @   
7 u% b" }, i( @& s$ m4 t   //interrupt enable,initialized0 S" O) x5 \& z5 l) `% M' Q% y
   unsigned int temp;8 s* T2 j0 X/ w7 u
   //SLEEP_EN(GPIO8[10])---0
% z2 Z6 I! u" u$ i7 j5 a* j. _' X   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ Y9 F  B; b# h& o2 b) x
   temp=temp&(~0x00000400);7 \; E' ?; U& ?( P
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( u5 z; v6 T$ y2 @3 ~
  //RESETn(GPIO8[8])----0----1
& g1 p1 c4 v3 R3 G. ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& `% Y/ E4 O3 |- |+ p" K   temp=temp&(~0x00000100);% ?% n" A1 R3 A# v/ k& e, R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---07 e$ H1 A: N1 n) f8 t
   udelay(100);
  ^9 R% i, b8 t   temp=temp| 0x00000100;$ B- T. S4 M) Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% Z" D* ~& f' @
   udelay(100);
5 T/ }$ `! R) q" k5 e8 v( v' M   printk("open success!\n");
0 y/ q) [) y  C  [% ?/ L0 `   return 0;
( w: q2 U" \- Y  ?' C; J9 i}9 ]/ P% o) k% C& M0 }
. m  r1 y8 O' ]7 V# j1 f
static int mcbsp_release(struct inode *inode,struct file *file)4 `5 E8 ?# L$ l0 J$ T% V% u+ U+ p
{$ [1 ?; f4 d& U, L2 ~' x. ^# X
   printk("release success!\n");
, Y; q5 K, l; W  ?   return 0;
! q& m2 t6 ~' D% u% T9 e}( O9 ^( y6 |* {- X, B

9 }0 ^1 d$ g! y# @$ d. R# [0 Zstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
9 `! @7 ^  E# n! {{5 b; G) D9 v) _# E! r
    copy_from_user(&DXR_data,buf,len);
! F/ M& x6 _, Y+ z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. Z5 F8 z! C+ D! g    return 0;$ z' M' V  @5 S* B$ N

- _  |" K* t1 Z) @: j, ]5 F}
) H  ^6 a* S0 Q; ?9 [  \" P# o) b3 n3 O) h' ~$ i
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 L' t( I- b2 c{
, @5 q5 ]% X" O, M6 o5 b   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; H& |- s8 P& F: f/ |" ]9 S
   copy_to_user(buf,&DRR_data,len);
4 R: D3 Q( j0 s# y: d- ~$ S   return 0;
# C( F. s  f) L8 e2 a  ~}8 x- W* C: ^4 _* m& W

# @' q) G* \. G0 r7 f  O3 P2 h5 G
9 J$ f8 f  M: w) q) i. r9 y3 g; T. istatic struct  file_operations mcbsp_fops=3 w1 l$ ]- [1 [# X9 e
{7 U7 J: J$ C* l5 w* I
   .owner=THIS_MODULE,
( [* M7 ^8 W  Z9 \" a' ~   .open=mcbsp_open,5 {6 ~  t  q2 V6 @* W7 e
   .release=mcbsp_release,( ~# D$ Y( i  K* U# F* ~1 h' l/ l
   .write=mcbsp_write,
3 W& i4 C/ T- L$ A+ e   .read=mcbsp_read,3 I3 O, R" l4 y
};. _: ~: O% k$ y$ v
static int __init MCBSP_init(void)4 e. i& M! ^. @6 P% X; Q; d7 C
{
7 n! _. C: f( Z9 ?1 c- f   int ret;
6 j' y8 ?$ u2 ~4 e   unsigned  int   PINMUX1_REG_old;
+ l" r% l* r* V6 W+ p7 q+ O# N6 C   unsigned  int   PINMUX18_REG_old;
4 ]2 H% f6 G$ z4 R6 C   unsigned  int   PINMUX19_REG_old;  m1 B/ s3 r- n
   unsigned  int   temp;  , I% @; @0 T7 k/ }% z. O  r3 O
   if(MCBSP_MAJOR)" p) F7 `- ~7 T, R
   {! ^) c: M: }) F2 d
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 `# r6 p' P2 A' d) l
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ E2 H+ I, q, ?1 k0 W+ b
   }
& |: u. `8 ~" R; O$ P* r9 W   else
( r3 X" x( V/ r; l; i  b( V  M   {- _, L& z. R9 Z7 x- y5 G* T
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
: a# r/ J! g9 j. S) k; J$ O3 i. y; L      MCBSP_MAJOR=MAJOR(mcbsp_dev);
0 t- y2 B! Y5 ]3 g. X! \! h. _   }' q' j1 v7 E) {9 e
   
8 ?' q5 U- `/ S9 Q3 [( V/ T1 J: w   if(ret<0)$ m8 y0 v" d; Z+ D. |7 b9 I" r
   {
# l+ K; p, ?8 t      printk(KERN_ERR "register chrdev fail!");# ^+ @/ f, |) @" H
      return -1;
3 N" ^0 F5 y/ P  N2 M, i   }8 X; ^. Y) m! M$ ^, `
   3 G2 M' Q" b, _  e
   mcbsp_cdev=cdev_alloc();5 L; D6 S4 x+ u$ O
   ' K' E) D8 y. L: C, T
   if(mcbsp_cdev!=NULL)
' i' C: e* x" N, k   {/ |/ |/ u9 t( z- {4 D! l* G; Q
      cdev_init(mcbsp_cdev,&mcbsp_fops);5 E6 L  ~. q) T3 S  Q" z+ S
      mcbsp_cdev->ops=&mcbsp_fops;
( c( w& h& ]5 K' f      mcbsp_cdev->owner=THIS_MODULE;
7 h7 T& r$ k, z0 |4 J      
8 F9 ?3 a7 x, ]      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 d  \0 t) t% k( e( X2 l# s  z$ T
          printk(KERN_ERR "register cdev fail!");
0 h8 B0 H; @, i/ A      else4 X- c4 R+ {' X
          printk(KERN_ERR "register success!\n");7 O7 A& U8 o( ^; m4 Q! @6 a7 D8 s$ j
   }
; _; N4 m3 O5 k* D   else7 P' j  W, E, X- o8 ^
   {
; D7 I5 r* X" C6 i+ _0 i: |. ^      printk(KERN_ERR "register cdev err!");
( S) A, O$ b! E; Y: v$ r      return -1;
$ g# e% w1 t' p3 D' P5 ]2 a   }
5 `  F' Q! a! ~& ~2 A- T   
, f, l; H3 f  K$ Q9 q  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 h4 b8 |; S8 f- ~/ P& j   if(IS_ERR(mcbsp_class)), l, u% `$ y; ~
   {
# X+ n2 B9 t5 \      printk(KERN_ERR "register class err!");" W- V) ~* l0 T; [1 u
   return -1;* \2 \/ z0 F0 x, a1 ^2 D; F
   }
9 N5 Q. j* E. F, f) _: \/ ?   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 Q! e% q: t' ?; v

/ U9 D" w% \. J( v1 H   //PSC
% E4 B( v- }: w* |0 I( M( P% p  M   //add Enable MCBSP" X( I; o. k( V6 x
   //test& U$ L2 K  l, R9 P% k! c* j/ {
   temp = 0x80000003;, A# g% V$ b: L% j" v7 ?: z
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# q- s* w$ U* C: I7 `   temp = 0x00000003;) Q4 @9 L5 Z! [$ f% n% O
   writel(temp, IO_ADDRESS(PTCMD_ADDR));8 g9 i2 q/ z. O/ P& Q: D. x7 l' w. @; V
# S* T6 {# S  U6 R$ A* E' L4 U
   temp = 0x001FF201;" y3 w4 J- ^6 }
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));8 E- l) v! z; D) \. s
   2 x1 A. B. A8 S7 M& _6 v& Y) S# B
   //PINMUX  " g9 s+ Y9 T7 ]& v% t( l" v
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: R  t) M* h9 |& M. X
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  5 D' k/ b0 J+ @2 w  D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ; {1 w) u0 v4 t5 ^/ M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
8 P2 {+ b& m+ @, x   
8 h6 L8 y  d0 |9 n3 o   //SLEEP_EN,EPR,L138_SHK1,L138_RC# M% f4 N. u  f4 f
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
1 {/ g6 P  I$ e5 h   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 T' S4 Q9 W5 {$ e3 J' ]
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' R9 O$ @  T2 ~1 |# L, w8 J3 w
8 @; N2 l- F7 y% @' X   //RESETn,L138_SHK2
- r# z- m( _! N   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
3 t! Z5 v% W! b; E( w3 v1 C   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   " k+ L7 i" W' A* R4 w; S/ I
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);5 K8 Q+ L  W8 l. B; f" L5 u

5 B+ O: r+ J* @" d . [; ^: ]4 P- r  W/ I0 A; K
  //SPCR Register; C% \+ _) S9 Z, j% u
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! o9 i. ]9 y, z3 ~* i8 X' h! y  temp = 0x03000000;//(DLB=0)4 [! j+ V  ]& i; b3 y4 S7 F& @
// temp = 0x03008000;//(DLB=1)
1 z% ?; \! i/ P/ D* a* k  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, c2 ?0 N- z9 D6 \: V4 k  temp = readl(IO_ADDRESS(SPCR_ADDR));- D% v5 p& M1 s# Q* W) L" o; V
  printk("temp=%x\n",temp);
- B3 \4 ?! n' A9 a( S
6 x: s# B8 R3 ~. R   //PCR Register: l; V4 Q+ P/ R& S# [0 M+ b
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ X9 t; o2 a& M4 `
  // temp = 0x00000F0F;
' U% c+ ^5 N5 \  E. o- X  temp = 0x00000B0F;0 `# S) V0 {% i( h7 M& k
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 0 u$ _# x' g3 A, p: q* P
  temp = readl(IO_ADDRESS(PCR_ADDR));" @* f5 j  l0 u6 @/ H2 ^
  printk("temp=%x\n",temp);  
6 H6 p, Q9 F2 {, `9 {1 {1 D& ]   //SRGR Register
& l& Q* Z% u  H. e% S6 {   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 L* l6 I  Q& `- ]$ E- T
//temp = 0x301F000B;/ g& ?  a6 `1 R! N
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized . h2 a0 S- ?: E4 {0 I
  temp = readl(IO_ADDRESS(SRGR_ADDR));
5 U. U1 e: W! q8 w( i$ K' c0 G  printk("temp=%x\n",temp);; |( G$ c) {' I& t# @" _. R( o6 u
   //RCR2 a! T5 l3 D  i6 J& k: y! z& a: y) Z
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 b, s" G  \! W  T3 P) a4 j; K$ T% w
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 w2 K$ y. l; ~. b/ L9 R8 _
   temp = 0x00440040;" g! K: D' h' F% l' g
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
: M& m2 w+ y4 v   temp = readl(IO_ADDRESS(RCR_ADDR));
: k! @7 n: m# H; n! |: g   printk("temp=%x\n",temp);; F- `% d0 y8 p6 q
   //XCR) B$ c5 K$ U: v* o2 w. L3 x
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1. z6 j6 D) b# Z  s( k
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 G' \/ A6 ]5 P# O! Q5 R2 o   temp = 0x00440040;; Y5 V* u3 j' g( A' B
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( F8 k( k4 B! O2 j2 A- P   temp = readl(IO_ADDRESS(XCR_ADDR));
% v- Z" P9 D  L' k+ V   printk("temp=%x\n",temp);3 n7 S% @; K! g1 e- ~
  udelay(100);2 i6 E# C" b. h: e- n
  //SPCR Register. f0 q% d4 q! S7 Y5 @+ n% z7 L# u8 Z
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1# z: [% r: F& M, n9 `
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
# k: j" g5 E+ O$ X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" v) K. i& X/ x0 P
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  r/ f, u, n2 Y* M  printk("temp=%x\n",temp);
/ s+ ]3 @8 ~9 Y! O4 G  udelay(100);
; Z; g5 r  O. S. K2 g
6 Y6 y: A' Q+ F! z5 W  //set GPIO direction
3 I) E" t0 W: B/ n/ f$ z   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 X9 j& h! {9 b5 h. Q+ S
   temp = temp | 0x00000100;//EPR----input8 I* T/ B1 U, U% _5 |) J
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 v* S8 l- L) n7 |   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' t  K' _! N& l2 t/ s, X * \; W- J6 o7 r0 k+ l3 d1 I
   return 0;8 M- {9 N; c; ]. ^$ F( J! R9 g5 {
}* E) j" W7 U5 T' }( f' j' g
static void __exit MCBSP_exit(void)
: O% ]& j, q/ j2 I{
9 z6 o8 S. H- d' c; q8 S7 t6 \- }   printk("mcbsp chrdev exit!\n");
& N8 Q4 X" {$ n  I$ _4 _6 d" _   cdev_del(mcbsp_cdev);
7 I$ p6 A$ _* ?7 f% _) S   unregister_chrdev_region(mcbsp_dev,count);% f2 e& K7 G( f9 Y$ q. z% Q; q+ W
   device_destroy(mcbsp_class,mcbsp_dev);( l  x  ^7 x6 J: E8 U+ r4 ^# C
   class_destroy(mcbsp_class);/ q$ n. Z+ k+ A1 n
}- ]. u  Q% x/ t' |) F+ u* V
module_init(MCBSP_init);
1 F, p* B3 e3 a( D3 n- k7 Bmodule_exit(MCBSP_exit);# K7 O# a& g" D! N8 T  X- P

7 A9 ^  ?& Q4 _! ^5 b% z* Y# W, vMODULE_LICENSE("GPL");
4 [* d( s1 E9 I) g! R3 q1 N  j8 s2 X" ~5 r
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. e0 c# E1 x& A8 ~6 a我的应用层的测试程序如下
; W$ E$ F5 f' A9 d#include <stdio.h>% f2 r1 ~! l6 o) e  q
#include <string.h>
3 o& W% c" {8 \6 }" A#include <fcntl.h>: q. w8 s4 ^: K: F% u- T* Q
#include <unistd.h>
- ~( B6 C* x0 R#include <signal.h>
7 W* ]' g! O6 p# y  A  z5 y0 A( C#include <pthread.h>       //线程1 S# ^7 \+ @* f% `/ m, j! t
#include <stdlib.h>* D; u+ |2 m  a# s' w, J
#include <pcap.h>          //捕获网口数据
) a' {( G' m; [/ _3 C( W$ \, w#include <semaphore.h>     //信号0 p8 ]% p' q! d8 u# v# b" p
#include <sys/types.h>     //消息对列( b% P9 x# z  |0 l2 S
#include <sys/ipc.h>       //消息队列) Q+ y4 x/ b8 p
#include <sys/msg.h>       //消息队列
) d/ N" w' U8 V) d#include <sys/select.h>
4 F) o: z% s& @  }- G" m#include <sys/syscall.h>
! f/ m8 j/ N7 U' [) d0 P#include <sys/stat.h>
! `2 j3 j1 D0 N8 R#include <sys/mman.h>: K! q- c, w* o" K0 |' |* }
#define msleep(x) usleep(1000*x)
4 r. E; c% V/ Z( r; T: u/ ?0 Y0 T9 g9 H% Z
int main()
$ y0 y8 c0 k8 f{
+ T; X2 [+ o9 [    //MCBSP,ARM与AMBE2000交互设备$ p! u3 |% I* ?$ l' [0 S' \1 {
int fd;
" y/ _( @( a; O; M unsigned short data_write = 0x5555;' l. M) x+ e% D( ^
unsigned short data_read = 0x00;
6 i& Z# I0 _: B+ x  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 t, \2 N! P  G; ?1 g) d //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 e2 g/ b& N$ d" o
    % g8 S: W8 E- l$ O
  if(fd < 0)
- L9 u0 ?. f! _# f  {
+ O' _& w1 w" ]4 \6 u- N     perror("open failed\n");
  p2 a% E1 z6 n. c/ Z/ t2 ?( i     return -1;& W8 T* q% d6 }# j# g! R9 E
  }3 Y. b5 M/ m- Z$ }, x- u
  " ~, t' w' X: G
  while(1)
. |9 I. }) f! r- v  {" G" Y3 m  @1 k& z7 H3 I  Q9 S
   6 ~" Y* o3 p  t! G( X
   //AMBE2000每次读写是24个字为一帧4 D$ w& \1 p  w9 E. h
   //写数据时将数据在底层存储起来,等到中断的时候再发送
5 s8 X- @) b8 r' H, M   //AMBE2000输入数据是以0x13EC开头的; t1 D3 x2 Z# e; i% u" x- y7 C
   write(fd,&data_write,sizeof(unsigned short));6 E& n" Y% S( M2 U2 z7 G9 E* V# P
   
1 c; `. F: [% d! U   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  8 H4 `! ~2 c) r3 D) J6 F' _
   read(fd,&data_read,sizeof(unsigned short));+ i8 `, L1 N: P  Y
   
7 N0 k4 t2 @' G4 H   if(data_read == 0x13Ec)
: P) f9 p4 _8 z% x+ j   {! T4 W( W* a7 C; v3 w2 o' j; B$ E
   8 S  w7 B* m/ L7 j$ y: s; D' ~
    printf("data_read = %x\n",data_read);
5 q9 L& C& L2 Z8 h   }
6 O* C; T$ V" j+ }9 n- u   & g& t+ l1 Y* z  L
   msleep(10);: l9 n0 c6 q* i& r
  
9 z" J# g' S! i, s' f, ~  /*
7 w1 k$ n5 _+ S+ v% b& x   ioctl(fd,1);   0 k% ^! ~: a( c
sleep(1);( l* k0 a8 A# H) H
ioctl(fd,0);
! n6 s/ ^, E! w4 x  e$ P sleep(1);& a% g3 ]+ G$ v+ t/ ~) B% U/ |
*/ - Y" Y) C3 j0 u1 H3 Y+ q* r) Q* ]" A
  }   ' r" X. t1 n! _* L
return 0;
: S( }- {8 N. s4 s# p& c) y: A4 u   G: }! w  U. p) P: z% u. s
}
7 k7 h* w+ l# o+ `2 Y* s; d
% n0 q9 e  E4 K2 L! j多谢各位指教,谢谢! 急  h6 r( `0 `( E% S: o7 |% P
( n' y6 z1 [+ c7 ~5 h; d( A! h4 N

0 f) N, p+ Q: `. I1 z/ V! N* K( y, Y, ]: J2 K. ^- d; C6 p

( X) j8 B: r1 ^! U: B0 \* E
- M* r- M& U, L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 04:48 , Processed in 0.053349 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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