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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( K% p/ Z$ c* v5 C6 |4 {
/*
% i: @% [5 s% F  [) i* U * Copyright (C) 2009 Texas Instruments Inc
& \4 Y" U* ^% }7 h *
3 S$ F/ P  h% K& r * This program is free software; you can redistribute it and/or modify" L6 j6 _) V9 h5 P  m3 e+ R
* it under the terms of the GNU General Public License as published by
1 _# `8 i6 r- j * the Free Software Foundation; either version 2 of the License, or- l; ?- w/ t& G+ l8 O/ N5 H
* (at your option)any later version.
  k' ]# `1 v1 Z9 _+ a *
' M0 u. X/ h. O! I3 E/ t * This program is distributed in the hope that it will be useful,
0 G! y- l4 V9 L/ o' B3 |% g+ G * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 y3 o  N& B8 V% K * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ a* n4 T' P9 C- j
* GNU General Public License for more details.0 D) G" Q1 d0 D
*
% j1 `1 G: X6 A% L * You should have received a copy of the GNU General Public License* q5 \# t, N! _# ^' a, J, c
* along with this program; if not, write to the Free Software
; t) S& ], y$ w7 Z * Foundati( z: ]- ]) _* N9 s0 @3 R, j3 ]; w
*/
/ Z- v' @2 o& F9 v/ r! J9 F#include <linux/module.h>" W6 {9 ?% V% D9 t$ D6 M) I0 R- x/ i
#include <linux/init.h>
: g' ]3 w* U* k5 b% e% D4 d; t#include <linux/errno.h>
9 R1 B4 {: \. ?#include <linux/types.h>
4 V8 v6 g$ @3 i/ E# ^- D3 y#include <linux/interrupt.h>) F3 H4 G' C0 E: c  e
#include <linux/io.h>) [2 Z. F  {$ i4 c7 C% C
#include <linux/sysctl.h>
+ M9 }6 V4 e& }7 w8 K* N#include <linux/mm.h>
/ s( v. G7 K0 K/ ]#include <linux/delay.h>
8 ^3 F8 E6 F2 V9 L' w3 F& U#include<linux/kernel.h>
) p" n- T% \+ w# `0 B2 c! s#include<linux/fs.h>
3 |: i; x) x  x#include<linux/ioctl.h>) O. m4 V' r/ s: T2 A# k; ^" y
#include<linux/cdev.h>5 v8 R: P  c% X: ^
#include<linux/kdev_t.h>" [# _8 `2 s) G9 W9 L# `. q
#include<linux/gpio.h>4 P, K0 w9 q( S0 h$ Q; |
#include <mach/hardware.h>
) V0 {: \, z: P0 n3 Z; B5 j+ P#include <mach/irqs.h>  ~2 V) L+ W+ n2 B4 U5 e- A: u3 c

& l& K) l9 K3 V- y#include <asm/mach-types.h>- Q/ ^/ z/ A( {( i; o$ M
#include <asm/mach/arch.h>: ^% |1 C, N1 x( w  X
#include <mach/da8xx.h>+ q  B" S: [% b4 j4 y8 k2 w
#define  SYSCFG_BASE   0x01c14000" f* u0 l# H4 `  D1 N' K
#define  PINMUX1_OFFSET   0x124
$ ~6 v# m/ c' [& r& X* H#define  PINMUX18_OFFSET  0x168
' {# N6 {7 P3 [#define  PINMUX19_OFFSET  0x16c% a+ U; V& T( Q7 \' e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR1 c1 I1 ~5 e! K  z1 d; m( D& r
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
1 ^! r$ x2 s( v3 I  B, E#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR+ D0 \$ I+ F, `% U
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
9 @1 N% [! g( b' K#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
8 `( P, y% v$ M# G# |6 P                           
6 r& e" f! h! i3 q#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 ~1 S5 [) `" J" w#define DRR_ADDR      0x01D11000  //MCBSP1_DRR3 A* E& o6 F* e
//PSC& ~5 _/ |' _9 U) a
#define  PTCMD_ADDR   0x01E27120  
; B/ t8 ]& {7 T( O' v0 X6 S#define  MDCTL15_ADDR 0x01E27A3C
1 ~7 b/ Z; e  T# l) w7 i8 J#define  PDCTL1_ADDR  0x01E273047 g- }: A7 ^5 @8 O
//GPIO8 direction
% I8 q3 `/ {5 X$ W#define GPIO8_DIRECT  0x01E260B0. q: Z/ Y; r- d+ J% j$ P: }/ x; ~
#define GPIO8_OUT     0x01E260B4, ^9 o" J1 E; r3 @( \. k7 O% V
#define GPIO8_IN     0x01E260C0
# N- j- x- U4 w
1 h( F/ J6 d. z; s# g6 i) R//#define MCBSP1_RINT    99              
3 V- c1 L' R8 V" u0 w- ?//#define MCBSP1_XINT    100  3 l# y& z/ W5 ^5 V; K9 B5 l6 s/ c
static int MCBSP_MAJOR=239;
( X8 g/ `" ?( U  [static int MCBSP_MINOR=0;2 o3 F" ]  [* h/ f
static int count =1;' P5 D1 V' C* [
0 J# {, g1 w3 w- n1 z5 m( s4 V" F6 B
#define MCBSP_NAME  "MCBSP-device"
' X  N) a6 M7 n  V/ \5 A0 j- t* T8 p* A
static struct cdev *mcbsp_cdev;
+ V; v% b$ [5 V7 E6 m$ rstatic struct class *mcbsp_class;
  Y1 X0 x1 F: x: T: [static dev_t mcbsp_dev;
8 c$ s5 G0 _8 J7 v6 P) Lunsigned int DRR_data;# H& E. Q+ _. t2 x
unsigned int DXR_data;
4 l1 l  e& A+ {6 A  y$ Pstatic int mcbsp_open(struct inode *inode,struct file *file)
6 z# c8 [8 @: c  ]7 v{
0 m, `6 o7 i0 H& p/ o% H3 v   # I/ ~( ~/ J, u# B8 Q* E
   //interrupt enable,initialized
& @) J& ~4 R& a9 m) v& N   unsigned int temp;$ ?! }1 y/ }) Q4 J9 m8 L5 a
   //SLEEP_EN(GPIO8[10])---0
/ b$ }$ r/ Y! Y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  M' O  W) C! q   temp=temp&(~0x00000400);
; ?( N& |$ t* q2 g8 k0 S   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" U$ ]" E% y6 }' Q5 z6 W: R
  //RESETn(GPIO8[8])----0----1' N; X) [5 B( \) p/ n
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 L# D" n3 I, R6 W8 ?$ @. d* U& {
   temp=temp&(~0x00000100);
3 Q, l4 N7 L0 \# N1 i( o8 F   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0: _$ a, ]4 N% l( e4 u9 p
   udelay(100);
* g  Z  o% R) x: C; m0 Y   temp=temp| 0x00000100;9 J5 W- ?3 O. \0 l* a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) v% M2 c4 Z0 B! F4 h3 r: V( p   udelay(100);, n* E- G0 i9 U1 I2 I+ V& D8 v7 k* b
   printk("open success!\n");
6 I- u5 I. v; q! ~! [/ Y& l   return 0;. o6 e2 x, m2 B2 n- f' |. H
}- Q! q, z+ a$ f$ J6 f

  p% k$ O, E" O% i, fstatic int mcbsp_release(struct inode *inode,struct file *file)
3 u2 B; z! W3 E, Q) ?& u{
7 I* f9 v& I/ R: P   printk("release success!\n");/ K" @  _; l4 a
   return 0;6 b( d1 m# p; s; B4 e
}5 }* O, Z7 A) K3 L* g2 j
+ I/ M, o( e) h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ a0 |/ F7 w) d, N4 M{5 n: P# l- x' M. t. E
    copy_from_user(&DXR_data,buf,len);  m4 u" t6 }, S
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - H* g# h- p: M1 `% w, E
    return 0;
- _, N( \+ f) D5 ~' N ! G7 ?- K; p8 ]- G& d2 v
}$ b2 y- e7 i* c( T' ], g1 s8 g* L3 u

2 p# V7 h3 M$ [/ L! s, Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' q. Z  q) R- J5 N4 e: V* \0 O7 }{ : W* }7 s8 Z& g, e- X6 ?" N
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
  C& f' I7 x+ I) X   copy_to_user(buf,&DRR_data,len); * B4 g# q" ^9 Z# s
   return 0;
  k( f6 S! c0 [1 K' B. \}8 Y1 Z) q2 h, [( n- h5 g

) ^& X2 j* Z, [0 m8 U6 c& C9 |1 ?' W$ l) j
static struct  file_operations mcbsp_fops=8 i0 o9 H  O2 B  U$ o
{
: y6 n# P5 M% O( p( |3 B- P   .owner=THIS_MODULE,8 f8 T2 ^) v( [, E
   .open=mcbsp_open,5 q: Z1 {7 M( j0 b* T+ y  N- ^" |
   .release=mcbsp_release,
9 s  I/ S! ]. T0 m& R8 {$ @5 A7 M   .write=mcbsp_write,
: h% S% S& ^. q   .read=mcbsp_read,) |; U3 Y1 Z/ w  ?
};) U" o  \. W- q1 R
static int __init MCBSP_init(void)
% h: r( u9 A2 u  ?. |0 o$ P1 E- D& W+ Z{' Z9 }. ]! F  h+ T; C% r: \4 V) X
   int ret;
& x* w: [6 @  u2 S  h/ W   unsigned  int   PINMUX1_REG_old;
2 X/ k, z$ }6 C) N5 m  J. {) |- y   unsigned  int   PINMUX18_REG_old;6 t9 d2 ^! ^, l
   unsigned  int   PINMUX19_REG_old;
+ F" D) N2 P' ~3 r1 H   unsigned  int   temp;  
6 r" D) q) V% X/ m9 H+ g   if(MCBSP_MAJOR)8 E4 U) m2 J% x! E
   {
" T0 M. |$ A; r6 O2 u0 g      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ K1 _8 o0 y+ x  k0 k$ X& V2 O
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 U' h1 z8 G4 K   }7 k1 f5 |) b1 X7 q) r8 u
   else
8 r1 N) g$ ^5 w* k) J& z; d   {: V) t' ?7 `+ N" B# u8 X
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
/ j- \' y9 }$ N# y+ n      MCBSP_MAJOR=MAJOR(mcbsp_dev);) ]/ \8 R* ]! x1 R* y  f
   }
1 E6 V0 c6 v# m+ w   
* n  k- ]' \4 x  p4 l2 \' I/ t   if(ret<0)& R6 A# M0 J& R  p
   {8 |4 v) K2 G8 Y7 b- G& G
      printk(KERN_ERR "register chrdev fail!");
+ i  R: y2 P1 h( H; j      return -1;7 P6 J% K' q6 P
   }: X. l7 ^! K1 |+ l, I* t$ O* N
   # m* Q! R8 M# ~1 s, g
   mcbsp_cdev=cdev_alloc();
5 `" {7 h. e/ z3 Z0 Y3 x5 J( K2 }8 _   
4 ]  u7 E* K5 W3 }6 H" ^3 Z' l- m   if(mcbsp_cdev!=NULL)
$ R8 M: m( I9 z  b; {9 s: ]. _0 a   {
' G7 X" Q( r# w- N7 _6 z1 J, K0 C7 f      cdev_init(mcbsp_cdev,&mcbsp_fops);! n5 o4 z& g: ]* Q1 J0 _1 ^
      mcbsp_cdev->ops=&mcbsp_fops;
" e! G, j3 J2 o      mcbsp_cdev->owner=THIS_MODULE;+ b8 g4 p( m+ c  R; W" ~
      
' v+ Y5 D' D6 H1 s& H8 y) @; r/ b      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
# h% [, ^) m, D5 v: @3 c          printk(KERN_ERR "register cdev fail!");; ?  k6 i4 J  g: K; s0 c( ]% h
      else
. i" y- K' e1 m" z+ Y          printk(KERN_ERR "register success!\n");6 ~- K# y+ F2 o8 [
   }( H! r& h+ r6 }8 |3 U- [+ Y
   else: c& u* v2 J5 J7 K0 c4 f
   {
. F6 R  ^3 L/ z: G) l( e' d, U* R      printk(KERN_ERR "register cdev err!");9 R" w: y1 L, f# O, _2 G
      return -1;6 L* x+ I3 n  f' i. z
   }
" m% v9 r0 G+ h0 U2 s$ R   ) R8 Y* ?4 o$ ?
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# {; n+ J; z7 ~# v; `9 g
   if(IS_ERR(mcbsp_class)), O! g, a- A; ]8 W1 V9 j+ t0 `
   {3 o- L: x3 r, m
      printk(KERN_ERR "register class err!");) g5 b1 E3 g' A# Z
   return -1;
7 j5 Z( b2 Z' z# J# o: f   }; V1 H3 x- b' a: [+ G
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( ]* Z. m1 i0 q) X' g" j& @0 i  m' G- A" H5 ^% z
   //PSC& K  t" ?+ |1 K$ u
   //add Enable MCBSP5 x$ _1 `7 T5 Y$ F0 i9 q8 [5 v
   //test
& H5 b& L) d' Z7 d9 P3 P- q: J   temp = 0x80000003;
2 E8 O1 f4 w8 O; ^+ d   writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 N( ]' F# ~5 d1 G5 B3 H& W9 \
   temp = 0x00000003;
: t7 K5 o, @! b: Y   writel(temp, IO_ADDRESS(PTCMD_ADDR));3 S+ \# D. Y1 l& d: d7 B8 c  y. m

1 V2 i# v2 y* W& X. K/ K  |3 \   temp = 0x001FF201;
5 N9 Z& O) ~- B1 J' x   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ c0 v8 l/ I, I& U8 W   
- F& ?8 Y2 n. `3 b   //PINMUX  $ s) [; `% ?2 L
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. |. ?0 S  D; R; t   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  1 \5 K3 E7 |: N* M. x- z+ L
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 N/ R0 f1 t1 l( l   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 g5 i7 r$ B+ c: \8 N" B   
; s  D$ }. p/ }7 V   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 h1 R" v* {3 L- D% ]9 U7 S   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  - `0 p7 c1 Q  _% p
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   # P  B9 O$ I3 @0 Z$ u+ b( a
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! W' b% N2 H* b: X

+ k8 [# |$ v, A2 Q6 `9 p. u   //RESETn,L138_SHK2! B! I* O" q6 E  r0 I
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  8 |: ]; H" y/ v! e
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! p6 w6 }$ _. w" d# ?) ]# p* M! L8 G   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( k4 S9 l" o0 m3 X9 M/ P / q1 J4 V) v- a* `& L' e6 W' n
/ C9 C8 l# Z, d3 m& Q: y
  //SPCR Register8 H' `$ a7 D& ]1 J; S% K" @/ k: \' x
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
/ q: w" x, T" h! _  temp = 0x03000000;//(DLB=0)5 a0 ]. p6 G' Y4 h# O+ q
// temp = 0x03008000;//(DLB=1)0 z# n8 S/ \! ^5 z5 k; q' i# j3 z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
/ F% y6 d# K1 M3 E  u$ f0 r/ E  temp = readl(IO_ADDRESS(SPCR_ADDR));
  M! q4 Q. R& g6 A  printk("temp=%x\n",temp);/ e$ m; g: c* _1 I; i7 J3 R$ ^
( J5 Z: O, o  [0 r
   //PCR Register
  U1 w2 F' I- G" {5 Z   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 N4 a8 ^7 n  k: C) c5 K; b
  // temp = 0x00000F0F;7 Q$ |2 ~0 z4 x
  temp = 0x00000B0F;5 V. u1 w  `1 y& |- `
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
2 m+ D" g, V% y5 n4 G5 Q9 U  temp = readl(IO_ADDRESS(PCR_ADDR));1 I2 |( M( \) |: i
  printk("temp=%x\n",temp);    C: [# g: T5 m
   //SRGR Register# v6 B! J6 Z  @& u' w
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 s$ w3 s3 s- t4 R
//temp = 0x301F000B;
; h/ d4 [# w3 G+ S   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 1 ^' a1 S1 W" n% g, h0 t8 B
  temp = readl(IO_ADDRESS(SRGR_ADDR));/ k% w% `/ V1 `/ v: q4 z: V! E0 a" c0 y
  printk("temp=%x\n",temp);' f5 |6 B1 Q0 X; c& O2 N. ?. O; n
   //RCR* _2 w- `: g% S
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 q- j" O4 O/ p   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& }& W: k* O5 L* U' @0 V8 E- ^6 j
   temp = 0x00440040;
( c0 p) y7 g' C0 ~2 n* \   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - K* `) H7 E% e1 j9 {- q4 N
   temp = readl(IO_ADDRESS(RCR_ADDR));
9 Q, X9 O& B# w   printk("temp=%x\n",temp);- p; J7 I" U: {
   //XCR+ B+ Y4 e( [" p2 _1 S
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ h7 d1 u9 X1 H' @$ x* \0 j
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 a9 }3 I3 s" A. _) n
   temp = 0x00440040;3 t4 _# |: T3 v& U- ?  _1 \
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + b/ Z0 ]8 A3 _
   temp = readl(IO_ADDRESS(XCR_ADDR));
* u% V% ~! |6 I8 h   printk("temp=%x\n",temp);
' H9 X( z* d1 g! k- d5 r  udelay(100);
* n  b# F) }+ j) J" J( s9 \8 ]+ ]9 c  //SPCR Register$ X( f" n0 m/ y/ }2 z- W1 O$ P+ g2 p
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1/ I0 c4 o) e1 S+ G# H' Y* b
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
0 [- v2 B" x% r; M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" i& z$ o8 T, v) i) q, B2 T! o
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ G/ _4 w* ?$ [& \5 R  printk("temp=%x\n",temp);
6 ?8 H, y: d; I' t% X2 ^" h7 N7 a  udelay(100);: w' l. i; Y+ J0 O. k3 _$ \
' g' ]& o6 y% v4 K
  //set GPIO direction4 q# q6 L, p  u$ u; Q+ l' L
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% H! C; K9 w* Z+ b! J3 S   temp = temp | 0x00000100;//EPR----input
% ]9 |& l  M& C/ s. L   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, b5 C" D# Z6 L" ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- m3 u) t/ ~  A8 @ , ?$ }  s% c* ^; ^1 L1 k6 N; L
   return 0;! m6 O# Q2 z. S$ Z/ Q# b
}
& ~7 ?5 }7 X* k0 h5 D. Dstatic void __exit MCBSP_exit(void)0 H  ]3 d0 g- Y0 F0 v+ ~% E0 L
{
" b* x8 I$ l7 H" s   printk("mcbsp chrdev exit!\n");# e% C6 \: q" v) ^" k& v+ J3 q- I
   cdev_del(mcbsp_cdev);4 R" P  l  K' u- E: V: y
   unregister_chrdev_region(mcbsp_dev,count);) l9 I7 r' I% X) A# b$ Y
   device_destroy(mcbsp_class,mcbsp_dev);0 a7 _( H& f7 H3 v8 w
   class_destroy(mcbsp_class);  Z+ g: ]7 `- j0 p" i( g
}3 l; x( u  y- b% Z) r  ^, D
module_init(MCBSP_init);" b* A6 Z$ f9 i- F
module_exit(MCBSP_exit);2 l9 C2 Z8 }8 G/ n6 |

+ t4 r! t( R/ i& t. @MODULE_LICENSE("GPL");
+ [) M9 B  P2 T' T* Y; r" x+ t. u  V- }/ }8 r
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 _/ x  M# }0 e# M
我的应用层的测试程序如下
7 m7 h+ o6 \; @% v( j( [#include <stdio.h>* z7 A& x$ G& x9 C: e! F& T: P0 V9 T: G
#include <string.h>
. G" j, W2 I( B, B9 A8 [/ L9 [; E#include <fcntl.h>
- l. y$ |1 c- A5 d* d#include <unistd.h>4 S; Z' {, D" T/ l6 B; m
#include <signal.h>( x# Z! n$ e3 `
#include <pthread.h>       //线程0 _  Y; Z$ _2 w. D$ |# [6 I
#include <stdlib.h>
/ w" _. G: _( q3 n#include <pcap.h>          //捕获网口数据
% j7 H7 N1 l8 F  U, u#include <semaphore.h>     //信号
7 x. [) {1 _5 T5 j8 g' F( n1 U#include <sys/types.h>     //消息对列
/ ]+ g2 B& A& L( R#include <sys/ipc.h>       //消息队列
  I7 M4 |* E9 x! Q0 D" M  P#include <sys/msg.h>       //消息队列: H- @0 x7 O, q
#include <sys/select.h>
3 N* ~0 L& a" ^3 J#include <sys/syscall.h>7 y+ }' u$ r6 X( ^/ E& i7 p2 ]
#include <sys/stat.h>2 v! X; p. ~; Y
#include <sys/mman.h>& ?- Z; H; B9 \; \3 E' t
#define msleep(x) usleep(1000*x)
3 D3 }2 H( P9 z+ U/ s: g' T! r6 g* T  D5 ]8 Y
int main()1 q; m0 M, N2 u1 R) k
{ 5 Y0 L9 w' Z# o# Z0 q4 j9 j, N& p6 {
    //MCBSP,ARM与AMBE2000交互设备
, f5 o5 |* _! {: @0 w int fd;
, Y" ~$ B; m1 O# ]) B unsigned short data_write = 0x5555;
  n5 X$ @7 H0 N6 L4 [* S unsigned short data_read = 0x00;
/ |5 n; `" v/ c  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) x/ q, {  t" W1 x //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 I2 v, v3 D" w# ~   
% Q; K2 f; i+ A  I0 K  if(fd < 0)
( x# R3 `( B( `* U! {  {
7 f4 }' w: @, P3 d4 W     perror("open failed\n");
# k/ h' t- J) m# n     return -1;
! r: o8 o3 r9 h8 {. X# o0 k  }$ P- _3 O  P4 `& W
  
1 d" L+ D% T6 ^0 o8 ?/ ]  while(1)
1 k. V3 V' N- v( A  _6 P) p$ j  {! T! l( w9 I6 z
   
. l+ }# y( S, i. M   //AMBE2000每次读写是24个字为一帧
7 c: e( Q+ \2 H   //写数据时将数据在底层存储起来,等到中断的时候再发送+ |7 \1 M# O3 ~% a9 R
   //AMBE2000输入数据是以0x13EC开头的
. ~' T+ C5 ~/ Y0 d* _   write(fd,&data_write,sizeof(unsigned short));
$ T- D; {) v4 {3 B0 T4 X' f   $ Y9 q* i+ r: c& ]. K: R
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
, k/ d4 z8 O2 c' f/ l" W3 ?   read(fd,&data_read,sizeof(unsigned short));
. a: b+ ?$ K& [* M   $ L5 ^- I. y- j: S4 I$ S
   if(data_read == 0x13Ec)
0 T' V# i( o: J( ]/ B0 s! S) Y+ M   {* o" N+ ]8 a* v( S3 _0 n
   
9 G* y" s# p& O: [2 I. }4 z7 H    printf("data_read = %x\n",data_read);
; {( @% x2 b9 s. ?- ^   }& [7 A) i* {6 u. N  r* @+ ]
   
( |# }+ v/ g. v1 J4 U% O7 s' |; `. `   msleep(10);
, X3 |2 Y8 J: h6 |- B  ( x, [! p: H4 J2 t7 C( o1 g  u- F
  /*
: N0 d/ o) K% M! J: E: B9 O1 R/ y5 Y   ioctl(fd,1);   7 V9 B5 K9 ]- b2 H' s
sleep(1);
$ [- E- ^. w2 X5 E) \ ioctl(fd,0);! Q0 v: V- G  m! k8 Q
sleep(1);
1 j, o5 i0 T: V% ^ */
/ w# C- u: Y+ I  }   8 T/ F3 X4 Y. S' y9 M9 |/ h! C
return 0;$ D; Y9 R- Q5 f# l3 H
- B' Z2 w  _/ v; e! p* `2 U% B7 U) o, M
}
+ F; L/ H, f/ O1 {
: E* `8 W( ]/ Q3 [2 a) l+ d) }多谢各位指教,谢谢! 急
& V& E0 y; E* @1 j) a& K3 g# }0 v1 \  q$ m. F4 |
4 [% h7 Z! H" K# W7 P$ _

, \( m$ {/ z* Y. ]0 G+ c$ Z; L* P1 J/ k$ E4 ]7 L

2 p! I1 V2 f# I5 W, [6 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 07:33 , Processed in 0.048974 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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