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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  Q6 q6 l& D1 n1 W! b) I/*4 C4 z7 E9 i$ g. I
* Copyright (C) 2009 Texas Instruments Inc5 ^/ {" A$ }* B: D% K% K
*+ h( T) Z) C6 H! m, b
* This program is free software; you can redistribute it and/or modify, P& F. y  q, L
* it under the terms of the GNU General Public License as published by
, Y, _( u( p7 F# E; b7 u7 F) b * the Free Software Foundation; either version 2 of the License, or1 M' v1 A+ Y( E: D/ G
* (at your option)any later version.
6 {9 @9 c1 L$ Y# ^" W *- ?3 t7 c3 n7 L- }. B, Y8 B8 n/ Z9 c8 y
* This program is distributed in the hope that it will be useful,; X' t; {1 T6 E
* but WITHOUT ANY WARRANTY; without even the implied warranty of
+ B/ `+ c8 Q% E9 l) |& o9 `* C3 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' q; V9 v! e( q- @, T* N
* GNU General Public License for more details.2 X. n  u  Q; e# f# c" s
*
( ^: o/ `1 L( X, O * You should have received a copy of the GNU General Public License
; a/ x/ }5 Q- g' z& n * along with this program; if not, write to the Free Software  }% y# u+ f4 [1 l6 o" J. J0 ]
* Foundati! E6 ?) |4 w$ T' |
*/
* @2 ^4 {  R1 e- \#include <linux/module.h>
$ c+ S* s' U2 }4 u. t; U#include <linux/init.h>
8 R) Y/ A: x+ L! G3 r#include <linux/errno.h>
8 E6 W4 F; U7 o0 Z0 B' P4 k* z, }#include <linux/types.h>- ^+ Q3 [. H3 _
#include <linux/interrupt.h>$ s5 z! c2 P; u
#include <linux/io.h>6 s4 y0 `& m, {+ _9 _6 i
#include <linux/sysctl.h>
+ S* j8 E1 k8 s. a#include <linux/mm.h>0 M: J! f( @5 M2 H
#include <linux/delay.h>
: H) P* W  f- b+ X! F' [#include<linux/kernel.h>
9 [, o' B5 L/ K: c% f# d#include<linux/fs.h>
6 }2 X# [0 Y. |7 L/ D5 g, w#include<linux/ioctl.h>
; W1 i# M$ T8 r#include<linux/cdev.h># {5 M2 E6 ?; P2 e. p$ o) T) `9 O0 J' H; [
#include<linux/kdev_t.h>
. Q" C' n- I; g* M3 Z3 M9 d#include<linux/gpio.h>( S5 D$ T" X2 B' y  Q: H. w8 P
#include <mach/hardware.h>/ e9 V/ `% D  P9 Z) `1 y  q
#include <mach/irqs.h>
! v# J  |0 K7 M; t5 e  X
0 ?: o: |  [7 e( r, n6 q* L  |#include <asm/mach-types.h>' Z9 w& r1 U' E! y
#include <asm/mach/arch.h>6 H" P+ C5 n  g1 @* M, m
#include <mach/da8xx.h>
4 l8 \! X" H4 }% k( n  l#define  SYSCFG_BASE   0x01c14000: P' p6 [) q" S# ~9 d
#define  PINMUX1_OFFSET   0x124 ) N9 _* [9 r9 h( @; A
#define  PINMUX18_OFFSET  0x168
* }& n. E4 r+ A  \#define  PINMUX19_OFFSET  0x16c
4 q) h: T# n' ?( F#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' H! s9 q6 n1 [  N) G#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
* L8 n& K3 Y* \6 B4 O  B+ `) q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. P- E9 W( z7 a- h5 L
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
, _4 r2 v! S3 h1 u! j6 l: u7 c+ V& _#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR+ A: M: o! p. E/ \4 z* n. p0 f
                           
: q2 I% O/ W, z. t  ]# j3 h0 m#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
; p" T9 _7 L: i% L( F7 @#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
* L1 x9 |1 U& y7 O0 {" |//PSC
4 n* n7 c( ~0 J6 ]/ y#define  PTCMD_ADDR   0x01E27120  ; I( c" G2 r5 H; b- |0 }, B9 J
#define  MDCTL15_ADDR 0x01E27A3C
. c* }3 p- m/ v  D: G6 o0 T( ?+ ]; G#define  PDCTL1_ADDR  0x01E27304
* U+ r% h7 A" Y9 k3 a% A//GPIO8 direction, j/ O4 l0 |6 y
#define GPIO8_DIRECT  0x01E260B0: I/ f  u  D7 u9 k
#define GPIO8_OUT     0x01E260B4
3 A+ ?3 G( i6 s) d/ [+ D#define GPIO8_IN     0x01E260C0
7 z- L/ E7 X9 j" m4 c4 v$ t$ A/ F0 F8 r
//#define MCBSP1_RINT    99              
! w! w) w" `2 e- i//#define MCBSP1_XINT    100    z' T' `" ^8 C  l
static int MCBSP_MAJOR=239;* ~+ Z" K4 I: L, h
static int MCBSP_MINOR=0;2 S8 m8 Y0 M0 Y# O2 H0 N) w
static int count =1;6 s0 C' F# d3 R) ]
/ g' W6 o$ H2 b" y% z7 j$ l& ?, x" \. f
#define MCBSP_NAME  "MCBSP-device"
/ s1 E! T4 o+ B# \( t$ t
# B5 K. O. S8 V  H5 P" Lstatic struct cdev *mcbsp_cdev;
% M( Z6 V! x8 u& `6 D6 K/ wstatic struct class *mcbsp_class;
/ s7 O+ i# F+ r8 n: k+ D& fstatic dev_t mcbsp_dev;
, B/ ~3 i  k' C' cunsigned int DRR_data;
# ?# c' U7 Y3 b  |1 G8 s' C* m7 sunsigned int DXR_data;
% a3 D. R" Y& bstatic int mcbsp_open(struct inode *inode,struct file *file)
5 p4 K/ H- l# j6 H8 g{
7 G4 a( H% o' Z0 H   
4 F- K/ B) w9 d! y( y$ A" z   //interrupt enable,initialized
. ?6 V/ Y9 ^% ]* `! \! P; v6 h) j   unsigned int temp;; z& e+ {) j6 ~/ p3 F, P( D. k
   //SLEEP_EN(GPIO8[10])---0
/ W' z$ ]* h/ _8 P$ D   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ i6 g% N' b" m: u  r( V   temp=temp&(~0x00000400);4 ?) ~+ e; F1 m. W' P1 J, d0 O$ C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& }2 X5 |/ A5 d! s- U$ S
  //RESETn(GPIO8[8])----0----1
( U4 k3 h9 l: W: I" p5 O1 K   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' e: S$ `1 Z$ m  ?+ t' l
   temp=temp&(~0x00000100);7 [; c) a% g: O1 d9 y* m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& B! b4 i$ q+ ~9 \$ G  g
   udelay(100);
- `3 g$ S! h0 g0 ^! Z  g3 |+ q' L   temp=temp| 0x00000100;
0 D& l! \. @' q4 o   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  ^( j  A" Z% y( P   udelay(100);
- L3 l2 f$ u7 R6 V   printk("open success!\n");
, W- V: j  A8 P! \; N  ^: z6 U   return 0;( D5 {& Y; |; z; P1 K# r7 s' [. Q
}
: v! l* I) I4 X" t( d7 x- W8 V7 g# ]: v, S
static int mcbsp_release(struct inode *inode,struct file *file)" t% O$ I: h5 X6 z2 h* w3 U
{' r0 y. ^, x( {2 S' n3 n; [$ S
   printk("release success!\n");, V; U( ?$ G* A3 ^  @
   return 0;" K+ B2 _9 ?# M. L/ ~
}
2 M  Z; F6 C; }  h* x! t/ ?
6 O2 O* D1 O# @3 ]- k# b4 Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 P1 s7 p( e% g5 ]$ j{0 F+ X% q3 \4 X3 t
    copy_from_user(&DXR_data,buf,len);
$ `, D  z; _# Q( \) H    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
; A" S: t3 N6 V    return 0;7 T' P! n0 b- x, E# r
) m! d0 B3 f* b6 q* q
}
8 z2 g+ a6 o  X! T
+ P6 I* \* R6 C5 \% Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)- C1 C- R# {5 h/ {& f; H  x# ~" `
{
- p7 f# s$ y6 O( b+ [   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));6 I  Y& |; [& R% j+ C
   copy_to_user(buf,&DRR_data,len);
  v& {" X- s% b# b% ~   return 0;- e, w' C' D8 |$ j
}- @( f# q, v8 F6 _6 z8 `0 L

1 i+ a7 ~0 J" R) v0 F
* N  m+ U$ H8 _& Ustatic struct  file_operations mcbsp_fops=
$ E: W+ @2 N6 g5 |{
9 g% `$ y1 Q9 R+ I4 J- j9 H   .owner=THIS_MODULE,
& M7 T' X' F+ V9 |: L( e   .open=mcbsp_open,  F2 q% V- F( k! D- c' D' a0 l3 L8 e
   .release=mcbsp_release,
5 {/ w) P3 F8 T) v, w   .write=mcbsp_write,! i! A3 w6 P4 j5 M: @# P
   .read=mcbsp_read,+ x% T' m, s! F( I/ @% f0 V( ?3 c! z
};
- T5 I$ ~5 s. }static int __init MCBSP_init(void)
9 L% B2 P8 r/ [- H5 S, s{0 y" `$ y& g4 D% H+ D1 x
   int ret;
% Q% m2 q3 |$ \2 L   unsigned  int   PINMUX1_REG_old;
  j& w0 U2 r! S* s3 j   unsigned  int   PINMUX18_REG_old;
- C7 X$ C& @/ v1 G* F4 p; v- X   unsigned  int   PINMUX19_REG_old;
, j% s& P6 C- z$ |: k" l( I5 x   unsigned  int   temp;  ( d/ L9 F8 e  K" m
   if(MCBSP_MAJOR)
5 X% v# Z, ?, V: ?1 @# @   {8 Q" k) z5 \4 Q
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% Z3 ]/ R7 P0 ~      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ ]' |' f4 ^$ |9 R# E9 u$ v+ B   }
# j8 K2 Y+ M. Y7 j   else' w2 W( ^$ U; t
   {' S& W$ A( h! g* P
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" L) ~0 G, j" o' z7 D5 U0 T: x
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
$ {6 ?. F3 g6 v2 ^   }
& n" M/ L# E/ q' q7 ]  r   # a+ }% M+ ~! B9 o1 s
   if(ret<0)
8 U0 p1 N6 V+ G: F   {
& k) S' I  _" p5 G5 k      printk(KERN_ERR "register chrdev fail!");( f8 r  a, b, A
      return -1;
- O% F+ j9 X; i   }$ q. J* F. h0 X0 d/ U! D6 a" ?" h
   
9 ~( E' ]% P" h) @, `  X   mcbsp_cdev=cdev_alloc();: L' H4 C- P$ a
   
# J8 L4 @" x5 w1 h' O# E- |   if(mcbsp_cdev!=NULL)
. z3 y- X) }1 F- M   {
7 m" R0 M# o4 m, _      cdev_init(mcbsp_cdev,&mcbsp_fops);
! T1 {2 E! @6 s/ n9 q      mcbsp_cdev->ops=&mcbsp_fops;9 f( x* M1 @7 p$ F/ I2 Z4 {* W
      mcbsp_cdev->owner=THIS_MODULE;
8 N1 v$ \: _0 q8 E! M8 e8 n      ; j5 ^3 |! K, Z+ P- \7 J. v; u
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 H9 ]0 z8 o* M' J6 w3 f# y7 q          printk(KERN_ERR "register cdev fail!");
# b, B2 s0 b1 g5 v; n3 {1 s      else$ B# s! L( K: g- `
          printk(KERN_ERR "register success!\n");
8 U* I! w& I4 m3 `5 w4 ]   }
9 d7 }6 v" {7 g7 ~" z. U+ U   else( f! I7 A4 U: b$ D2 g& I2 ^
   {8 g/ x5 R: x: c+ A6 M: S1 Y
      printk(KERN_ERR "register cdev err!");- W5 ^# `/ y4 z4 ?) Z
      return -1;
! {$ A5 M, ?) p8 w- x6 ]   }5 H& Z) m' ~: T& b3 z% \+ J
   " K  l2 \! Y# V7 I2 C
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 D9 X% k7 {( o0 e6 T; K. W. B$ e   if(IS_ERR(mcbsp_class))) \; [0 Y+ I" O" Y' Y1 \% i. T; ^
   {. \* R( c, H& M
      printk(KERN_ERR "register class err!");; U0 Z" g) m4 A4 z) g4 R
   return -1;
3 x8 m. {8 s: V+ s   }. }4 a6 v+ w6 C/ M- J' r  V" C
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 s% M  @7 V6 {3 H3 V7 T, N$ z) |3 o2 Y
   //PSC% P" b; d; f( m# G
   //add Enable MCBSP
4 O4 l( k% k$ ?* X   //test
  h, J& |0 [: e, M4 z   temp = 0x80000003;5 \2 t$ S" u; g# l: j
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
- B: M" e, m- M& r) y% M   temp = 0x00000003;" I0 ?$ z; }/ c( i# u
   writel(temp, IO_ADDRESS(PTCMD_ADDR));& w, ]4 J+ e  D4 _- c! n
1 |0 E* e7 U: q* c7 b
   temp = 0x001FF201;; P& x% n  }! [+ K0 S
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ J8 f$ c5 N* I8 Y$ k, N   
, O  Q4 C+ |& ~$ D  L" D2 |  y: f   //PINMUX  
, q" |0 J1 [$ Q   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- c6 H1 Q" U- X( c& M9 |3 m) w. i
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    u9 J$ B! V: L) g" V% E' @
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ' n8 E0 Z+ R: M1 \9 t% ~9 O% t! N
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ z& G4 N: c' D1 X) x" i4 @  ]$ j# W   3 r2 i) l& f. H5 n! R+ [
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
9 J9 W3 z5 e2 K: q: `8 I   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
, \1 T$ _4 i3 R+ x* [5 P% ^3 y   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   / h9 [3 o& p, x  R3 x2 C) J
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ y) I/ k, Z9 \2 k+ g- R% z
, f/ o8 I8 E1 F1 Z5 _" T   //RESETn,L138_SHK2+ b  y( h( L+ A: Z" W
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ ]% s+ [4 Y' W
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
, `: B% z5 ]# A   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) D8 {- I& W5 }+ A9 c4 x, o

% W; B1 H) }2 W0 f7 m 8 A  r7 E) Y& F5 a
  //SPCR Register4 ~4 v) F7 B" m- z4 o! E& M
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; ^( q. _0 b: S- J8 R  temp = 0x03000000;//(DLB=0)% R  y8 J, \$ Y
// temp = 0x03008000;//(DLB=1)
" V2 I7 T2 r" ^; j+ b4 `  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ R0 f# z3 I. L$ k. T  temp = readl(IO_ADDRESS(SPCR_ADDR));2 H; w, @$ P1 L4 O$ N, X5 }: d# ^/ a
  printk("temp=%x\n",temp);
/ o  W/ S: }8 q7 C# D( a* k : c$ v1 F& A+ L% E- K! U* ~
   //PCR Register, |/ D/ n9 _0 P6 H# Y+ f7 @6 U0 M% P2 [
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; ?1 g! {' k, L' O+ t, h
  // temp = 0x00000F0F;3 k, a( [6 T4 T; W- I
  temp = 0x00000B0F;, L+ A4 s; t0 h' S# Z" E
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 1 r1 p8 \) I( c( _" I
  temp = readl(IO_ADDRESS(PCR_ADDR));
* U' x% B2 ~# y5 r. N' r  printk("temp=%x\n",temp);  9 H6 E0 z0 m5 Y& q
   //SRGR Register
8 W& a; V4 t/ a. @0 N   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' R. D( x2 V/ o# G //temp = 0x301F000B;3 z/ P2 @& S" P, M8 @( p
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 0 h0 S& T2 x+ S0 U9 _4 B& g. t
  temp = readl(IO_ADDRESS(SRGR_ADDR));
+ g- ]6 v( r+ ?9 p  printk("temp=%x\n",temp);  y, {0 X5 N7 D# m
   //RCR9 e! D% \) p, q8 B& i0 {& q
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,  S. C! `% X) l. X
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( ]4 ^' U( X* x# f% n   temp = 0x00440040;
! I3 k9 W- d9 R/ y   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   . z$ {0 j* B' Z3 w% c6 l0 |
   temp = readl(IO_ADDRESS(RCR_ADDR));' u* O& ~6 r/ o- y. c0 b) x
   printk("temp=%x\n",temp);" ]9 e' x$ n) Q" c, t( _5 _
   //XCR
6 n2 K6 Y4 u% R# U$ V) _, k( C   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- G+ d; M( H  I; {4 t+ c' {& C( p   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- e6 b( a* j% E- a7 \7 I/ Y
   temp = 0x00440040;; @" }3 h3 R" j3 ]6 K( F* g/ n% @
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
2 B" g% ?( G: A0 M6 U0 q9 O$ M4 t   temp = readl(IO_ADDRESS(XCR_ADDR));' m5 b  z) g) E( b6 A9 n, E
   printk("temp=%x\n",temp);9 }1 B- ^7 Y4 G* F
  udelay(100);
( ~) a7 H' C7 J: J- F  //SPCR Register
7 [$ U6 D' A3 V# K3 E  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 ?; T/ \0 o- a+ ~  f  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
$ A+ W2 c' s! B, e  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
9 I& R; X6 q. m0 c# ~' A  m8 [  temp = readl(IO_ADDRESS(SPCR_ADDR));+ W0 x. q5 j7 W; D: \+ F# S
  printk("temp=%x\n",temp);6 g0 Q; \- h! n/ _5 ~4 h
  udelay(100);
5 C5 G% ?" J3 `( ?, X2 V3 {
- o+ e6 g1 n) M: B  //set GPIO direction
1 [/ M* P: J- n7 _   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- V# [2 x1 X8 N: O2 o) z9 Q   temp = temp | 0x00000100;//EPR----input& ]! n4 m  Y# t
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) H" p$ w! }6 o3 n4 x1 q. Y9 F& @   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . O! l5 n( Z  S3 q! }

0 A6 ^, e4 T+ H3 s4 K   return 0;
8 O' x! X* s1 f}
+ B( M2 U; C7 Y: |1 C0 b# Xstatic void __exit MCBSP_exit(void); @" w- B1 b) t7 _: w
{2 U2 z; p. x: L
   printk("mcbsp chrdev exit!\n");
. P: _# M' Z! G2 O8 M$ c   cdev_del(mcbsp_cdev);
6 C) X" o0 @4 Y   unregister_chrdev_region(mcbsp_dev,count);( U) Q# I2 g; _
   device_destroy(mcbsp_class,mcbsp_dev);) |! T4 f8 e  F5 H2 z
   class_destroy(mcbsp_class);
9 y8 `$ x( W. j}4 e/ Z! u) h4 m( j" E9 b9 T
module_init(MCBSP_init);
; L! V9 n$ _! _/ \/ D4 R) Umodule_exit(MCBSP_exit);
- ~/ n& o- M+ s5 D5 M$ a" O7 ^  x! x1 Q- |; m! f1 c
MODULE_LICENSE("GPL");+ F) `6 B2 r1 l1 o+ d7 c6 \4 Z

8 u' m& m: e' A4 S我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
: T. v% `: s" F* u" H9 X我的应用层的测试程序如下# h2 G& V$ o" N( E; ^9 l* ], T- s) R
#include <stdio.h>
7 J0 i( C6 u' a1 [#include <string.h>
. A/ G7 Y8 k: G* p) E#include <fcntl.h>8 ~& N. L: Z7 k4 _: \* R8 o
#include <unistd.h>2 T2 H) Z$ f& I; ^" N" M+ V, }
#include <signal.h>
  P' J2 e  @3 f' D4 b; b3 v#include <pthread.h>       //线程
! w% |* B& G" z* O+ J8 V# h#include <stdlib.h>
  }+ y) {, r! u9 `$ D9 h#include <pcap.h>          //捕获网口数据
# k# Z) Z/ }6 e$ X' j: r4 g#include <semaphore.h>     //信号0 O1 S' m, D  \6 Q) g
#include <sys/types.h>     //消息对列
& |$ N6 V4 p# k5 n* K3 ^#include <sys/ipc.h>       //消息队列2 \7 M& T8 g) U, @# n- ]1 A
#include <sys/msg.h>       //消息队列
) ]3 {# Q' J3 `6 D#include <sys/select.h>& N( C; |- Y8 y1 X& z$ H$ d4 Q- q+ U$ s
#include <sys/syscall.h>3 [4 {* r7 q' d6 n
#include <sys/stat.h>) }4 Y5 r! x0 Q) e6 S
#include <sys/mman.h>
+ h* N. }" Y% X# a5 r#define msleep(x) usleep(1000*x)
1 _' L$ q( Y" i# v$ ~4 D- O$ s) H9 e; ~% U
int main()
' q% e  m6 k2 H/ w" u* u% E0 }{
/ T/ D* m; o$ e7 t0 a    //MCBSP,ARM与AMBE2000交互设备
, Z% B! \! o5 A" E# O int fd;
" a2 V4 T7 R/ [; ] unsigned short data_write = 0x5555;
0 s$ Q  r, Y/ i- v unsigned short data_read = 0x00;
; Y+ h8 |3 e5 h3 g5 f  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! c, K, J0 ]6 r/ F; _6 |4 u* f# @
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# r" i7 J/ B! ^$ q7 a% I
   
1 ?" y8 X* X. n2 T) X  if(fd < 0)
4 ~% x5 W/ ^2 K" ]9 B  {1 }8 q. B' B. i
     perror("open failed\n");
- N2 F; R- R  {1 c& V     return -1;
1 ]; P' u. g5 @  r- V  }
# P3 h% ]/ K! N8 t& L6 t& F0 S  
  N) V/ s& v8 T- i  while(1)
% \" {. N2 c8 J! k7 t* O. m5 ?  {- e  ]" b% G( }' v' F; ~, W
   
+ W1 @/ P. Y& n: _6 W. h   //AMBE2000每次读写是24个字为一帧7 l; B! Z& d$ C
   //写数据时将数据在底层存储起来,等到中断的时候再发送
' O3 N. z; l9 F   //AMBE2000输入数据是以0x13EC开头的
6 N! f: p0 G# a# h' Q, ~- H  U   write(fd,&data_write,sizeof(unsigned short));( U1 g7 F8 d# {  ?% \* _
   
. l6 w6 |: O2 }, h- r   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- X1 @. j# ?7 K  j   read(fd,&data_read,sizeof(unsigned short));
+ g$ Q3 P" h* T& b! p   
- `# O9 X; p4 @: ^# A  o8 g! G8 Q   if(data_read == 0x13Ec)
8 j" U4 G- P! f" F6 Z0 N" C; u' O   {8 N+ o) ^3 n  c& {) j: E1 E
   - I1 U9 S( P7 k! q0 j
    printf("data_read = %x\n",data_read);
: J& o8 H& c) [   }
7 F: M$ s  O, W& M! e* E   8 f3 T4 }7 r& ~  ]4 v- A0 W# F
   msleep(10);% z, t( |, j: ?# i' S
  ' y- l7 r5 a0 W# Z+ ^7 j
  /*% N& ~" H7 _9 W6 l- S# p7 ?% `
   ioctl(fd,1);   
5 z% T/ H# `+ Z/ u  v7 h: z& v sleep(1);& Y* {6 K& i$ C& N( X- G
ioctl(fd,0);
, p7 Z9 Y# y( m/ h6 R8 n sleep(1);. i( b* e6 [# `5 h
*/
2 R1 v+ v+ j+ q% p  }   9 R/ c4 W1 I9 ^
return 0;
, H6 Z$ C, g0 r
7 y- [8 @. ]/ A6 P7 g6 }: }! w}
! V* Q2 x8 @* I& J5 M' x1 p
) G; m$ E; \: L/ y# B0 e+ ^2 j多谢各位指教,谢谢! 急
, z: L8 E  h' S7 a% |' ~
5 m) W# w5 ~: o' p/ L$ u$ ^; p  d$ d# K* {1 s4 |

9 U6 ]$ F! x. |2 f
( H! J9 A! k$ J! C+ w7 i- j" y, q+ V: g5 _+ _2 k( a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 22:39 , Processed in 0.046228 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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