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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 Q& w" x0 o0 G/ X/*1 J: L$ ^- e3 Z! g( E0 @
* Copyright (C) 2009 Texas Instruments Inc8 _& z: [/ H# ~" g8 w; Z
*( X; e4 ]+ A& i$ O$ F+ L
* This program is free software; you can redistribute it and/or modify
' J8 `9 }- @( ?4 c7 R" t * it under the terms of the GNU General Public License as published by& S* z! G! K: N, i6 O
* the Free Software Foundation; either version 2 of the License, or4 M( R, b; s" t% P+ N7 x
* (at your option)any later version.
, N( x/ ^. B. r- S *2 k  w) z$ \) Z, P3 t
* This program is distributed in the hope that it will be useful,) `! c+ U+ f0 w: f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
4 g  y9 S! J4 y! b# C8 L% I' } * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( F5 o2 @3 w1 ?; m! |& ~ * GNU General Public License for more details.
1 ?! o3 Q7 N( X! E( R" g *
5 I+ R, G2 X; Y6 j! L * You should have received a copy of the GNU General Public License
7 r& O$ Z9 r! D5 _: m * along with this program; if not, write to the Free Software4 c7 k. Z7 H. d
* Foundati, O! n* M; A$ n" p  [$ }. r
*/
$ h! ^" m! O; \; E7 G- M+ G2 s% V#include <linux/module.h>
+ T, \) K5 P/ i( l' }#include <linux/init.h>
% G8 v$ ^# |, C" I' f2 _2 O#include <linux/errno.h>
- _( E" @& a3 g% s+ G, `0 ^" X#include <linux/types.h>  D3 B2 L1 W$ I. x- }* j. j7 _
#include <linux/interrupt.h>
1 x: Q9 F3 S+ t1 V7 K#include <linux/io.h>2 e- |, \  G+ Q
#include <linux/sysctl.h>
* t& S" {5 V, i  ]- o) O#include <linux/mm.h>
: |  ~9 I9 s- g" x6 V#include <linux/delay.h>
9 v" _) e$ f- {9 n, P0 ], ]0 D* R& }4 O#include<linux/kernel.h>
3 m/ r2 P: M& K: S6 D#include<linux/fs.h>8 ]. i1 v5 e* x+ G; `) h
#include<linux/ioctl.h>
6 U  U7 I8 q+ y/ m#include<linux/cdev.h>$ K( q) N4 i2 o
#include<linux/kdev_t.h>4 W# S. x' q. }) ^
#include<linux/gpio.h>
* W: {7 x! `. U, x#include <mach/hardware.h>
( b  K8 i) ?- l( |, g#include <mach/irqs.h>
+ n( \8 r5 J/ r3 Y$ J: t
; f$ z2 \' L  i#include <asm/mach-types.h>
3 J+ \1 g: s1 v& |0 G' V: j& r- s#include <asm/mach/arch.h>6 y! n  X& k9 Y1 ?
#include <mach/da8xx.h>
  V/ ~6 f. v9 H6 a7 a4 h7 E( S; I" k& l#define  SYSCFG_BASE   0x01c14000
, i$ X6 Q: }' n: s9 O4 z#define  PINMUX1_OFFSET   0x124
8 b4 S. h# e, L' X, M$ g/ q#define  PINMUX18_OFFSET  0x168
) t) t) {& Q0 j2 r# m#define  PINMUX19_OFFSET  0x16c
: B& r7 d9 N! M+ _7 X9 a#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR% ?3 d5 n8 r% b# `/ v! Q: b
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR, o9 Q' B$ Y  v8 _
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
* S# m9 b* @3 m$ M% e5 D' G#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
6 |3 J' g2 _- c& q8 y& O0 V#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
0 H5 `: E: e1 S$ ~( M                            - `0 ^. Q0 X2 I$ E0 Z! X7 @
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! q: i7 X9 o9 }; p# b#define DRR_ADDR      0x01D11000  //MCBSP1_DRR; h* O: \" y# `3 N
//PSC, o9 r9 m) b7 S* n3 X
#define  PTCMD_ADDR   0x01E27120  ) C# o7 Z0 ~9 S
#define  MDCTL15_ADDR 0x01E27A3C
  {' e6 }) |8 J7 F#define  PDCTL1_ADDR  0x01E27304
2 K. ^: L. C8 {/ X7 {//GPIO8 direction
; B- p+ h6 `. c% f- k* v% q. e: m#define GPIO8_DIRECT  0x01E260B0, w1 u, v& p0 b" }$ o
#define GPIO8_OUT     0x01E260B4" F5 n' y( H0 E+ Z. h
#define GPIO8_IN     0x01E260C0! [! `  q# c( s: W- L

; V! p$ B. i$ F8 V//#define MCBSP1_RINT    99              
7 Q. |! O" G3 \' K4 H//#define MCBSP1_XINT    100  : t5 s/ t  V& z5 r' x- P: D8 ]6 @
static int MCBSP_MAJOR=239;+ M& S+ X. U4 o4 z' r+ |8 P3 Q- q
static int MCBSP_MINOR=0;
/ @' _' j+ p7 K$ W9 z& v. Gstatic int count =1;6 d- |% P: K, X5 [9 g2 z  O
, i, c& e' d+ ]: C& i1 h
#define MCBSP_NAME  "MCBSP-device"8 L, K+ I5 p# b. x6 w

. W& W3 `- R+ Fstatic struct cdev *mcbsp_cdev;, A$ Y3 k; ~) }% \0 ?- @2 P
static struct class *mcbsp_class;; j  `  x! ~- ^& e& ?6 ?0 x
static dev_t mcbsp_dev;
( o- X; Y* f: T0 I; O$ hunsigned int DRR_data;9 Q# t- r3 r" l1 t9 c! x2 x
unsigned int DXR_data;+ E) F8 g4 D6 m
static int mcbsp_open(struct inode *inode,struct file *file): P" Y/ z  ~9 s  R" u
{- G7 H5 n8 B. U) e6 |# i2 R/ l" h
   
$ W& |$ b; _) y! _3 S7 {  Z2 w   //interrupt enable,initialized
0 \! I6 P- g6 V  K1 @4 }% h$ u/ K7 f   unsigned int temp;
: L; |# ?% `# U6 z. \   //SLEEP_EN(GPIO8[10])---0
( t8 x8 k. ]- L- ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 t; k! k' J' G' c   temp=temp&(~0x00000400);
. C: c% \7 ?; v& d2 ^& \) l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' B) v: Q2 r- ^* G1 \1 L& Q. }
  //RESETn(GPIO8[8])----0----1
, W- M" e# b# i4 w7 q% u7 T7 L9 J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 {7 r" w0 v1 Z$ _" l, P7 M
   temp=temp&(~0x00000100);1 \6 ^7 G, V2 a, G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 |- K* g! v8 ~  `9 V, J
   udelay(100);/ X2 k2 V+ O3 j; E" D" W7 z) P8 y
   temp=temp| 0x00000100;
7 D7 }9 J% G  C8 f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 V. Q- J1 E- R/ m( C/ `% s   udelay(100);' s' n0 i" R, Z+ e7 o  F
   printk("open success!\n");
8 D5 c8 \$ y+ J" w8 B   return 0;5 @. u+ [  \- a8 ~0 t. \
}
) F# p6 ]2 n: S% X3 Q1 I" g& q1 z" ^( j3 X
static int mcbsp_release(struct inode *inode,struct file *file)/ U3 Y/ O1 P! |, z' Y1 D- C0 @8 F8 ?0 n
{
, u. [$ `4 O8 d/ s6 I' L  ^5 F   printk("release success!\n");3 a4 B' j- f% Y* `# p7 \
   return 0;
2 q+ x+ n, T& t% _" u}/ P; Q2 O; Z: t  s, M/ H

6 S4 M- P7 _" z. x8 m2 _static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 o% R* q& `: V5 q4 ]{: z6 c" x* W! z4 c! }  `
    copy_from_user(&DXR_data,buf,len);
# t  u6 `$ v5 l* ~    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ) ]' m( g6 c! O
    return 0;
  U( I2 D* z$ j
9 M; b! T/ N) w2 v" j}
* W1 ], I1 v* x, u2 m
( g$ u# z* y% i9 z9 K1 M/ v0 nstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% A/ F/ s& Y1 d& _# a5 G5 T{ ; P4 O9 M5 U# |! Q& b
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 z' @6 F( u4 x7 Z6 D3 w! P   copy_to_user(buf,&DRR_data,len);
6 f, M/ _4 K# i9 i   return 0;6 A: t9 S- T8 n) ~: J4 x
}
/ F/ d2 \3 \4 y8 k7 d4 J7 x9 e5 v( P4 O! j; {: d$ n" E/ j9 t

7 d+ `& H" O! s9 l, V5 |% n3 c) Zstatic struct  file_operations mcbsp_fops=- z& Q8 @; V2 O/ j% g6 m+ e
{
* K& i/ l+ |9 R+ E- p! B0 K  {% j  c   .owner=THIS_MODULE,
, T7 [" ~0 v5 l, s1 G   .open=mcbsp_open,5 m  w/ f: F+ M2 g" m
   .release=mcbsp_release,
# L0 s4 z0 q# ^- L/ o& @: K/ `   .write=mcbsp_write,) P! E) I5 x+ i9 j
   .read=mcbsp_read,
3 x: g  D# d* I- v* V: D4 B9 Q};' _7 c/ s1 j! |+ @. Z2 w
static int __init MCBSP_init(void)
. o3 q* \( q9 Z) b{( Q, N- c6 G0 r& Y5 i
   int ret;
5 d8 c9 w. J$ L( i5 S3 L   unsigned  int   PINMUX1_REG_old;
( ^3 k- D% {1 x% W1 V5 ]   unsigned  int   PINMUX18_REG_old;
2 `' ]$ g5 D- J   unsigned  int   PINMUX19_REG_old;7 P$ u) O  N9 X
   unsigned  int   temp;  ' K6 C- w( k. H+ z" C) X
   if(MCBSP_MAJOR)
  Z/ _6 u. E. N9 a, c! q   {
* I: |4 T- Y  G  D: a      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" ]% s! [3 D: m1 E7 a# r5 \      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);; N& V3 @* W8 R
   }
7 S/ j9 ?' O* A5 t9 V$ B9 B   else6 `0 ~' S  b0 {
   {
# B9 s4 Z3 O% c: g3 q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);/ y5 M: o( E2 S2 Z, a/ I
      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 m" I! U! g3 E- C8 S; z9 z
   }5 Y' w2 V2 G  f. h: z2 }
   " E' t& {! y! T5 d# d0 v& V
   if(ret<0)
* {) [0 u( c1 Y4 T( v2 x   {
% U+ p: v5 p9 t$ H# X      printk(KERN_ERR "register chrdev fail!");
6 Z# J1 Q3 f' |% K0 z+ ?$ l      return -1;8 y; l& I! v5 j5 l4 z4 {
   }
' m% N" a8 n! H2 B* w& j   ( ]3 ]9 R! }. N! e2 ]7 }2 t' `
   mcbsp_cdev=cdev_alloc();
3 h5 T* f4 d0 P2 i, @   
0 g% b% y, m% A5 f: W$ _3 s   if(mcbsp_cdev!=NULL)
2 Y4 P2 y' ?7 y9 M' [6 V   {
- O4 ?' q6 ^, B- l: J% r- Q+ f      cdev_init(mcbsp_cdev,&mcbsp_fops);
) J8 _, I: E& D- @      mcbsp_cdev->ops=&mcbsp_fops;3 v( g' e* I) ^
      mcbsp_cdev->owner=THIS_MODULE;
/ w  b) Y2 |6 U7 o( B: j0 e      
$ Z6 E4 E4 s  @& H      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! Q: u- i' ^7 @# ^          printk(KERN_ERR "register cdev fail!");4 y/ A5 T1 R) M) y+ u/ m
      else$ I, w8 Z% X4 A3 c4 Y5 |
          printk(KERN_ERR "register success!\n");
  {% t$ m( l1 V, j   }
7 u( c' J& J) G   else4 E1 Q$ Z4 r/ e  }% }6 p
   {$ T8 ?! F6 Q+ ~6 i% V
      printk(KERN_ERR "register cdev err!");) R/ A% W9 T7 j, G1 t
      return -1;6 W; _( W1 |+ q' k; i0 d' H  Z  L* k
   }/ ]% V" V. ]- c8 _
   
* M" |* ^7 v: y! A9 {  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
% C7 t* H) z$ }   if(IS_ERR(mcbsp_class)); v, C4 Y, c5 C. F& h) w8 C/ ^( |# u
   {
9 a0 i% `9 s5 r      printk(KERN_ERR "register class err!");! l6 w7 ^- B1 O0 ?: c2 a
   return -1;
; q4 `" a' w, O/ p" n8 W   }
4 H  Q" j0 ]7 ?5 W   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 h* e2 S/ ~2 f" L, N
5 P! \* f9 E# X: z0 M: p   //PSC8 j9 X5 q$ h  G0 U% r' n' o: n
   //add Enable MCBSP; i6 f; e  m0 V$ p3 i7 B
   //test' K: |6 j6 x( e+ c
   temp = 0x80000003;
; \( u$ G+ X% B; M) s   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 |6 m3 u/ w* o   temp = 0x00000003;
% l5 l* s: ?  x4 ^. I& O3 F& C   writel(temp, IO_ADDRESS(PTCMD_ADDR));( B0 N8 h% `  B$ r! c

, G& Z6 ^3 ^! N* a* z0 S' n: @   temp = 0x001FF201;
* }2 }" Z* E8 X5 H   writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 u9 s- C% h8 v7 Y' _& ~* K) t
   
. x) k7 I$ p3 H; N; A5 A   //PINMUX  * L% l! {+ `$ b3 L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 i  r) r4 T2 C; `! j
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
  x. M6 |6 U3 W   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; U& B- O8 ^( ^! z% ], K   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. o* [5 t" Y8 H7 k8 G7 l- b   % v$ J" j' [& G# y+ c) J, n
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 h! q, F! v) S% M) }* M6 U   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  9 y' a1 K5 ~$ B+ \" L) u( Z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & ~. L9 Z9 ]6 `8 J! M$ f0 i, N, X
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 f% ^+ ~# D4 p$ E, r' v# o) Y- X
4 G" y: X7 k! a2 n   //RESETn,L138_SHK20 N# U, a7 g8 b( K/ S3 R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
7 I3 u5 x9 d* }+ I! g1 I7 {   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;     h$ L' b6 z+ B6 W
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& i9 O  z7 N, _! M+ Y( X
0 N& U8 q, @+ S  Z1 `+ D 4 L8 v2 E% \) ~
  //SPCR Register
" z3 o+ D8 \. M+ D5 k" m6 @$ E: G  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
8 z" v$ H' p! p# K# n* o) W! D  temp = 0x03000000;//(DLB=0)/ j' R- \  W7 d6 y0 }
// temp = 0x03008000;//(DLB=1)
4 I- y/ W% {: W) o/ e  `& M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset0 i* s' h' ~$ B
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 \- d7 H$ E) k* n( L# R  printk("temp=%x\n",temp);+ B* T$ Z$ x' `" a9 |6 d
. g2 ?8 e0 y3 _* S4 V0 c
   //PCR Register& p& Z6 k# C$ {3 u( ~3 u
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 o2 V' [$ K1 `6 [2 a9 k
  // temp = 0x00000F0F;
$ o3 B  o) j; d8 Z$ ?  temp = 0x00000B0F;
6 S4 [0 L3 `; q: {( q1 @+ O  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized / @' _! R. _/ U( c+ X, L; D
  temp = readl(IO_ADDRESS(PCR_ADDR));1 r) [# ?$ b" Q9 F% W
  printk("temp=%x\n",temp);  
7 b# _+ T* _- f6 y6 P   //SRGR Register
- E2 ]" M+ f4 s% }/ H( Q   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* ]: B3 R7 S5 W, A. z8 r //temp = 0x301F000B;
# ^( \. P6 F, q/ s: ]6 C   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* A, c1 r" K2 o5 [% w  temp = readl(IO_ADDRESS(SRGR_ADDR));6 s2 Z, y$ g  H- ]9 y' V
  printk("temp=%x\n",temp);+ _$ A3 ]; i* O8 J
   //RCR! I3 d9 J/ i7 b8 e6 ^# _5 ^
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 p# N6 w# U$ o* @$ L
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 e( q( P; c. J" ~8 Z
   temp = 0x00440040;
& {& f0 T7 S4 t6 R6 q8 N   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
" ]1 O( O( h7 N- A% h   temp = readl(IO_ADDRESS(RCR_ADDR));
, N. U5 U' B* m, D: D   printk("temp=%x\n",temp);
' S; b0 `, r- a6 z2 ]( N   //XCR
" g) k4 z5 B9 X) X   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& [3 n% }  z/ X   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' {( W+ u/ i" v7 I, B* D0 |2 a   temp = 0x00440040;( r5 O/ z5 ~9 L* c; m- O+ Z* b
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   9 w: p, d( N. j+ R& C
   temp = readl(IO_ADDRESS(XCR_ADDR));
4 d7 L9 U! [; O. [1 ^, |   printk("temp=%x\n",temp);7 C& H8 N+ u& s+ [7 W4 W' k
  udelay(100);
9 t3 G: J% ]9 X. b3 b6 ~/ {  //SPCR Register& }- y/ W, }7 S. a2 v
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1; M$ \' P1 `% T- B
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1* H) r2 U  \! {
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled! P! E0 y0 O; G; w
  temp = readl(IO_ADDRESS(SPCR_ADDR));9 D8 ~& S* o( x( ]: Q+ _+ g9 }
  printk("temp=%x\n",temp);- H$ Z* e3 }; E9 c: B- h
  udelay(100);- @4 T1 N  I+ R& R, r. \

, |+ [* Y4 Z* y. F3 f& E  }- i  //set GPIO direction9 o  F, ~5 v8 o8 B. s; q; V' Y& ?4 E
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- K$ n' _! Z- o( n  F   temp = temp | 0x00000100;//EPR----input
) N3 F4 A: v; O$ }3 c% v! t   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" B+ J% T% ^0 B" m
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 3 m5 ?) }" A, N: ^! J8 q# N
, a& z! o. C. n( t9 [6 G( J# U7 V
   return 0;& m2 \( h/ K) g/ j- d) |& z/ h" {
}
, O1 [; [, Y' x6 I6 q9 n  sstatic void __exit MCBSP_exit(void)! b2 H6 A, e+ l7 N+ K
{, L" t6 U& J& Z0 O
   printk("mcbsp chrdev exit!\n");' y! m3 u/ B, n: S1 G( H9 x
   cdev_del(mcbsp_cdev);
# w) y3 Q' C0 D: {: k& r% Y   unregister_chrdev_region(mcbsp_dev,count);: `  K- c5 w+ I' V" x
   device_destroy(mcbsp_class,mcbsp_dev);/ {) g9 p! b* m1 V3 T. w% i
   class_destroy(mcbsp_class);
. p! L- B. j* [4 ^}, }( ?7 _# {% B
module_init(MCBSP_init);
4 V, d7 X5 }+ `; k7 gmodule_exit(MCBSP_exit);- S5 K/ _  S+ e. H/ [1 H: S
7 y% g. l$ R" [+ T$ A- T3 f8 T
MODULE_LICENSE("GPL");+ H+ P9 ]5 y) J& }0 Z
+ R+ b, }3 C- A0 s' m
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 ^8 e+ y: M. g7 @  S% p
我的应用层的测试程序如下/ R. r3 t) p! z8 Y: g
#include <stdio.h>% K) }+ M2 Z6 v5 ]. s9 w. R8 d
#include <string.h>
5 m# m% M' ]% U#include <fcntl.h>: W. b' _3 }" e$ R6 J
#include <unistd.h>2 D& p# f) S* R) i: x) {; q3 @
#include <signal.h>
) F) k! {* x7 M1 {0 Y/ B#include <pthread.h>       //线程/ L: q  |- Y' U1 Z: `( h
#include <stdlib.h>- b7 i7 ^/ E/ s: N, I8 F3 g8 f
#include <pcap.h>          //捕获网口数据& F2 h  \7 ?- H  I" j  {* F
#include <semaphore.h>     //信号; e  A. |% i% @: {1 Y# L( b8 U
#include <sys/types.h>     //消息对列1 n) Q; P! H' K2 y' B" l* u
#include <sys/ipc.h>       //消息队列
- x  M; b  O( C( P3 Z, t' Q( h  e#include <sys/msg.h>       //消息队列
# z( w3 L" C8 |8 [9 G#include <sys/select.h>& V, l. w* X+ |: k+ ^$ M; a9 _
#include <sys/syscall.h>
$ t; N1 a! W% ~#include <sys/stat.h>* @9 ]# N. b; Z  o
#include <sys/mman.h>3 {3 j, m  M' s9 U1 O) }' d; Q
#define msleep(x) usleep(1000*x)3 A. ^; L2 _! {8 ?+ L7 k
6 O" K9 B; D$ D# T2 f
int main()
$ w0 S8 i- @2 z3 N. M{
) p, a+ ]& r- R, v4 `: d' z. y4 ?( q4 a    //MCBSP,ARM与AMBE2000交互设备
7 a- o3 z+ n4 v+ N) D, p7 L int fd;
) C' q/ J/ l1 R1 k) D. i8 K" g. m unsigned short data_write = 0x5555;
, n' }! a/ z6 D# M* g unsigned short data_read = 0x00;
0 q/ I  v0 }1 b. M) ?. r  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 k, v6 s, [8 }4 I7 f+ \4 ]% z //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' ?) u) X$ ~  q2 e% Q! W6 M. F
    ' s# J0 B0 Z6 d% y& E
  if(fd < 0); \" t! W4 N: E* j3 v+ ^0 {! c+ D
  {
! }- b3 z! [' @! V/ j  n* L. H     perror("open failed\n");
( r, I0 L/ j; U) ?     return -1;1 L) h+ e$ l7 w( K( n  l  E$ L% d
  }
4 g. |  N. i2 n. T% @  7 Q/ O/ x7 F# J' l  l  [9 H
  while(1)% @, R; b! v2 r5 U) ^! L8 R4 J
  {
2 Q7 u. U; y  [# Z' \; [3 o   
4 F' \0 u# r$ G# `   //AMBE2000每次读写是24个字为一帧3 _  g6 C. g* \& u
   //写数据时将数据在底层存储起来,等到中断的时候再发送+ v6 A" @0 A. h4 L& x! ]3 |% K
   //AMBE2000输入数据是以0x13EC开头的* X1 l, d' C3 E# @  {4 i- M) @
   write(fd,&data_write,sizeof(unsigned short));
6 _& \8 X8 T/ J   
$ u+ f* F3 g" a% v+ Y7 f   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  5 s$ z/ Y7 v9 p4 n/ `
   read(fd,&data_read,sizeof(unsigned short));" S: B/ o% i! C% X; X6 e" [4 a
   9 `+ d0 Z  [" Y3 r) Y" E
   if(data_read == 0x13Ec)' J# U  V) [! Q% u. b0 D7 p+ F  x
   {
- a' b& x: h3 }8 I1 M   
, b; d: k& C) t$ j    printf("data_read = %x\n",data_read);
& @# m) V$ G& C0 b- J   }
( L4 c$ x- y; {. ?6 Y& E   
* a! X% r) ^/ S5 J/ n5 T   msleep(10);
0 O- {8 R) }% W# y6 S; M  
, |( c$ v$ P" C* @  /*
- A; w& @5 c3 m   ioctl(fd,1);   : u) S9 H1 @1 ]5 g$ e  Q' `
sleep(1);4 U4 a2 h( @1 N; y+ a4 X3 P) f) G
ioctl(fd,0);! q8 l! v5 T# P& i1 S1 e/ C# T4 Z7 o
sleep(1);8 t' T3 N& t5 |$ D( [
*/
2 S+ f3 C9 s* }; C  }   / |4 C5 Y% q/ @( B, s9 n1 ?
return 0;
% S' F# f$ N9 {/ L$ j- W  |   X: m, e2 L* `% R/ \9 u
}
  C6 G1 G5 f6 L' }% c0 \+ p1 u0 C9 M  s
多谢各位指教,谢谢! 急) g# N4 G0 ^- ^, u3 q
4 G& [1 w0 g* o' }
2 Y% j5 E! U1 M/ d' ^; e

3 \* v* T0 \+ f5 g7 A; `
2 V- e1 c4 ^6 Z( B/ l& a7 q) o. n5 Z  Y+ o' F- a' t- f% T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 05:28 , Processed in 0.053685 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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