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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 q5 `4 v0 V( R% J/*
0 n, S& {3 M: p4 F% _ * Copyright (C) 2009 Texas Instruments Inc
4 Q6 C2 s1 F- V# H: D *
; v& _% k. B$ a4 N" ^* C * This program is free software; you can redistribute it and/or modify
; X' `" a, O: V; s5 a$ _2 _$ S" z8 A * it under the terms of the GNU General Public License as published by
! F. G8 K" j) o! T * the Free Software Foundation; either version 2 of the License, or) }! M2 X& _# m. f. X7 L" A
* (at your option)any later version.( B4 ]% v( I- E6 b6 l2 q3 P/ ^
*5 h) t1 l7 O$ q0 X' U' q/ L5 H
* This program is distributed in the hope that it will be useful,# z$ |; ~/ w9 v' v" F
* but WITHOUT ANY WARRANTY; without even the implied warranty of  L. p% ~3 ~0 |6 B  v' D. r! j! r4 E
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% h0 E! {/ T6 \7 }- K; c9 d9 J( _, [ * GNU General Public License for more details.
8 R% @0 M; ~5 b *+ a" u, u; d- `; o
* You should have received a copy of the GNU General Public License
3 x/ Z0 Y+ }* ?- e/ A/ Z) X) W1 f * along with this program; if not, write to the Free Software
  F$ \8 x9 @  n! z. R1 e" s. { * Foundati  g) Y9 B( \- ~
*/
" x* J" ~. e% t4 q/ C- G  [8 K#include <linux/module.h>" K! S; g" N, g2 f/ H5 B
#include <linux/init.h>
$ i$ e( v6 {5 W3 ~8 o" Y9 {. I#include <linux/errno.h>3 V- t, D: u: p" f9 O4 x! ^
#include <linux/types.h>4 t! R' q" _7 `
#include <linux/interrupt.h>6 X; C8 @6 D9 A2 j
#include <linux/io.h>0 w+ y  ^' P8 r
#include <linux/sysctl.h>: \( I! c4 N% b% Q3 I8 y
#include <linux/mm.h>, [, X8 @. M/ n+ @
#include <linux/delay.h>
. N4 a* V/ Q" l" E& L#include<linux/kernel.h>
. K! _/ |) s4 O* o+ {" A4 B#include<linux/fs.h>; y2 g. w8 f: j
#include<linux/ioctl.h>' J* x& {' f7 t; J
#include<linux/cdev.h>/ o! z8 a  ~6 A" V
#include<linux/kdev_t.h>
, J5 j$ n2 P1 t6 s4 f% r9 m#include<linux/gpio.h>$ E  L: Q" d8 J# h4 x: S9 G
#include <mach/hardware.h>4 w# X3 V# e" i3 y4 B& T* t4 M9 \
#include <mach/irqs.h>
$ }7 S9 t8 ?! [/ m; V* l% \" X
6 N4 i  Q* F, U$ w0 h; _7 a, w#include <asm/mach-types.h>5 x, p1 N8 b$ h, Q! d" R
#include <asm/mach/arch.h>
+ _7 J' k* B" a$ f7 i, n. r#include <mach/da8xx.h>: U% ^9 A! F( Y# {$ H7 u* a7 T0 n
#define  SYSCFG_BASE   0x01c14000
9 ~; c8 V2 L5 ~6 z. h0 R$ y) N#define  PINMUX1_OFFSET   0x124 % o$ A; F' L9 u% M7 Y/ D
#define  PINMUX18_OFFSET  0x168
( }- ^2 B, ?2 y9 E4 W' z#define  PINMUX19_OFFSET  0x16c0 C' j  P  V2 \+ u& R: B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR% L3 y' Q0 ^4 x2 g+ J; v
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 |. G( |7 D3 d7 ]4 ~
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR' x7 M- p8 o8 j/ H; l
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
. h/ z1 `! T* A7 ~$ V#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! q2 r% m% X, F8 t                            : x, u4 U4 \% Y( B7 b0 U' b( ]
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
1 ~: o, _$ ~$ g$ C! x, |#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  D0 I2 m- y, A) y& b% ?
//PSC7 c1 B) K$ {+ L
#define  PTCMD_ADDR   0x01E27120  + L2 c( _* n7 Z# {1 Q1 B
#define  MDCTL15_ADDR 0x01E27A3C" g, K: A" {4 z& w" ?$ n6 E
#define  PDCTL1_ADDR  0x01E27304
( L2 b! Y" Q8 }2 `/ Y& Q8 o- ^//GPIO8 direction, F6 \; s) y# }- s+ N% b
#define GPIO8_DIRECT  0x01E260B07 {4 m& T+ g8 }. N. Q1 @
#define GPIO8_OUT     0x01E260B47 @! p0 J+ \# y1 _
#define GPIO8_IN     0x01E260C0& `. T% S0 _4 C* P7 X, W
1 V1 {# ?3 G/ V5 r$ K
//#define MCBSP1_RINT    99              
6 ^# e1 Z4 U$ \* ?//#define MCBSP1_XINT    100  
3 v; E5 R+ l' Z! h# f4 l- V5 M/ vstatic int MCBSP_MAJOR=239;
: }" K) p$ Y6 C' cstatic int MCBSP_MINOR=0;/ t2 O) l5 w! \1 z" P
static int count =1;
/ g  b: p& X+ D; _& a5 g; s
3 n) R$ D* S3 T! h% D#define MCBSP_NAME  "MCBSP-device"
) a5 j% D$ ]. u
4 q# n8 z4 D) L  _2 Vstatic struct cdev *mcbsp_cdev;/ B; P. p9 b: P; S$ ?9 v* i
static struct class *mcbsp_class;4 N- H' K3 G0 s. j4 `: |+ C1 M0 V
static dev_t mcbsp_dev;  F6 K6 K  S5 p" }* n" @# v* l
unsigned int DRR_data;
+ h, i4 t: k, f4 u0 M) R! V* gunsigned int DXR_data;$ g( u' x4 c- `
static int mcbsp_open(struct inode *inode,struct file *file)
" u* T, p% A3 Y6 k* k{
1 D+ O7 J; K0 b6 k; C1 ]   3 S5 K* b, O# i* \  W7 d5 F5 X
   //interrupt enable,initialized
# N; v5 n4 ?( V# B" u   unsigned int temp;
# {) n0 ~. o! \3 Y/ V( v   //SLEEP_EN(GPIO8[10])---0/ y4 ^( P+ h2 d4 G" m+ ]1 r0 g
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" e/ t6 r( A( V, s2 A. ], D3 o5 ~   temp=temp&(~0x00000400);/ F3 v' h3 f1 z/ Q4 U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ O& ]) m) y  h# G, a5 J
  //RESETn(GPIO8[8])----0----1  K/ i4 k5 V  z% B! b1 e
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, W9 c$ C* q9 }  f
   temp=temp&(~0x00000100);$ l5 F9 f+ y- H8 R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- s& i! b; U; K! y8 D   udelay(100);9 `5 G! G; _" B  X( r: Y
   temp=temp| 0x00000100;. b% M0 r" g2 p) o2 o6 m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" W: k' b5 W# [9 j4 P7 s
   udelay(100);( z3 L% B! N0 l0 W# h: M! t, F
   printk("open success!\n");& a3 F2 [$ v: B
   return 0;
( Q# {' D1 d9 T, q}
$ ?% h# \1 u- _; M1 I8 U1 J8 f" n& v
static int mcbsp_release(struct inode *inode,struct file *file)3 F2 n" g* m8 }: Z5 M" f
{4 J, ~- F- |. A, ]0 g2 J1 J
   printk("release success!\n");
& D7 W& v0 ^8 e  n$ n6 f) `  M6 S   return 0;9 p% p' f3 a" W% d# J0 J5 G
}  S" n, E* h! o  r

  Z( h0 |2 ?6 _5 a2 f' |" F* t+ nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! T9 s. c6 A6 ?, ]0 G
{# t' Y# L9 D/ ?3 _4 |4 F
    copy_from_user(&DXR_data,buf,len);" q" e% M# x* u7 H% P: ~- X/ @0 p
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' A3 ~7 G! e  S; f0 O
    return 0;) ^0 K, b8 j- [8 [

* Q9 i& I( L* ]4 K3 ]0 d}
, @7 p' V) m: e, r1 H) C) I2 N
1 ~) [0 j, L' _! H3 Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 O( c  h: M( F- E  G{
% B$ y0 \) t' @: ~6 q   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, m$ l8 L5 s& G  I# f( J   copy_to_user(buf,&DRR_data,len);
5 N2 S% D: \( ]  |' ]" ]% c' w   return 0;
. s. N9 v/ ?; m" _, r}& a( j$ }# l& v$ x% p( M* G1 Y
% U% f& V- G8 j- u, C2 e! W/ H

/ B" |, W+ E' Tstatic struct  file_operations mcbsp_fops=
; i& V5 I3 g/ Q{
- N, ~0 h: _6 L( }5 O$ N* q   .owner=THIS_MODULE,
' E( q! T- F1 S' R   .open=mcbsp_open,
7 f, Y4 ^2 U$ y+ |  W' w   .release=mcbsp_release,2 L1 I) e3 k* a/ S( H% R$ ?4 D
   .write=mcbsp_write,
& ^/ N3 l9 ]# K' U   .read=mcbsp_read,
6 ]+ u$ N; y9 [( b  |1 p7 R1 F};
8 m* @1 Z; _0 p! H2 D  _/ k$ ~static int __init MCBSP_init(void)$ V# |' J9 L3 v! Q6 Q# L) ?
{0 a8 f2 F1 @- R) v
   int ret;
- n' Y4 m8 s9 I. j# P5 ^   unsigned  int   PINMUX1_REG_old;! \- i8 E& I/ s. H3 x" G
   unsigned  int   PINMUX18_REG_old;0 u+ G, o+ x% r/ ]2 A. Y, @  C( k
   unsigned  int   PINMUX19_REG_old;
* |! ^0 H! Z3 \: ^   unsigned  int   temp;  $ \* n) r+ ~% M  q
   if(MCBSP_MAJOR)5 C6 w/ Y2 p3 S6 s8 H
   {' A- T0 |7 x5 K6 N& C" Y8 `4 L
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 d2 G0 `) ]; o# ]
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% s' s5 R# q. |( j3 V/ f/ K) J  B& T   }6 Y  p0 F! g5 o) R! f
   else4 B- @! J+ ]5 c
   {, y/ |/ r" V; z  v, z
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& K1 @8 X; ?* D$ f6 m/ l      MCBSP_MAJOR=MAJOR(mcbsp_dev);
# T2 L7 `$ L: B# x  V- K1 N7 C   }% x/ X4 K9 D  z$ m5 r7 q
   
' K! Y1 j: b6 L( j  C. U0 M  ~/ K   if(ret<0)) X: `, v& ~. X7 k2 e4 R
   {! J3 j0 r+ O6 B- R7 E
      printk(KERN_ERR "register chrdev fail!");* h6 I% B  q1 K# a" {! p
      return -1;" |: X2 K% Q. Q8 E1 I
   }+ y! ?* u; n/ M# J+ B
   0 h' {% N$ @  N6 ~' {; H& S
   mcbsp_cdev=cdev_alloc();6 Y$ j2 z; x+ W; {' k
   # T0 A7 N' {( J% @
   if(mcbsp_cdev!=NULL)5 `. b+ r. [$ t- o6 e4 o
   {( j3 b3 }# i& |- A, S% Q
      cdev_init(mcbsp_cdev,&mcbsp_fops);0 \1 F6 `' ]( A( h7 g
      mcbsp_cdev->ops=&mcbsp_fops;
; g# _2 B- Y3 k( p" [* E: w: i/ ^      mcbsp_cdev->owner=THIS_MODULE;
, k/ \- F$ A9 f: X- Z2 K      ) r* G+ V5 g0 ^
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 ?4 z# _0 p( q2 X, k$ G
          printk(KERN_ERR "register cdev fail!");; x, }. C# p0 R+ D* o+ ^
      else5 x( e! p& ?; [2 m# v2 t
          printk(KERN_ERR "register success!\n");
3 S8 n! k( C/ t, [* _   }
8 @* \" M4 g. E% B+ l0 D   else2 l0 S  H! X% _9 E
   {9 D2 P7 k8 t: X5 ~0 {5 a, B% w
      printk(KERN_ERR "register cdev err!");
7 `1 q: r3 o, V8 n      return -1;- a+ F  }9 e9 J4 Y
   }
. n6 t  f& o  F+ Z$ ]. U3 a1 \   , R: ~% L6 ~, h
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- o; k, U5 d' X/ u   if(IS_ERR(mcbsp_class))6 @( B7 F7 Q& ^$ [# y
   {
( t6 `! j' i1 O; g+ Y2 o# f      printk(KERN_ERR "register class err!");* J5 I' E: N0 C% l3 a% N, Q8 j
   return -1;
8 p; [# b! k0 ~" b: s5 P   }# [, H) X1 [2 S7 Z" ]# N3 W
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ z) q8 B" ~  ~, A6 D6 `- ]! M5 Q6 D
   //PSC1 K' Y/ d1 e" o% H6 k# L, q+ t& C
   //add Enable MCBSP
6 j7 \; O8 W! M   //test/ T. g  G* P4 |6 N3 q
   temp = 0x80000003;
+ \  A8 v! A7 _8 i2 C- E% r   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 Z. V9 n* D3 w; y6 u; k   temp = 0x00000003;
& _8 U5 S% T, ~0 [3 c   writel(temp, IO_ADDRESS(PTCMD_ADDR));7 \  @! t8 B& w* {
  n. x2 L. {  W  u! R" f
   temp = 0x001FF201;/ l! O0 b1 c9 r2 e' ~
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; t7 ^; W# w6 d; F6 z, l' g4 L   + e! ?, P' L, B* o- y- q$ b
   //PINMUX  
. T* G" M4 _7 K& Q# p0 C   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: X- E$ F  ~: \  R   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  5 H0 i+ D- n" M# x- L+ B% k
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ( o8 L. {6 o& E' S/ I
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: C8 _1 ]0 R, Z2 f, n& ]5 t   
& c/ ]4 d! |. W- l: \: \   //SLEEP_EN,EPR,L138_SHK1,L138_RC/ j4 b: @1 N; q$ b  J$ }
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
: s6 ], o- `( _- @/ W: u   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
9 ]- P: p" |' S! D   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: \  u7 ^, m! [1 d
6 \+ r2 R' b" t
   //RESETn,L138_SHK2  X. X; d5 N, F0 `5 r3 u
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
4 @9 I0 x8 _( C6 g) J& s6 y" Z" @0 ]   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   % K/ A! F9 f  B. ?" o. s
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 w$ A5 I! c& g# A. p7 ]& u 6 i$ k/ m. N! u

* _. h. P) s- C  }  //SPCR Register% r5 q/ z$ k; z! A2 X
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 N2 l3 W1 h6 M% j; H6 h6 v6 e
  temp = 0x03000000;//(DLB=0)5 V: o0 ]9 z2 ~. H2 u
// temp = 0x03008000;//(DLB=1)
3 G- U  m' ?7 U! C$ X  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ s0 K, r8 M' G  temp = readl(IO_ADDRESS(SPCR_ADDR));
5 J, @; C8 Q4 I& h9 I+ w& u+ I1 r& x  printk("temp=%x\n",temp);
) I* T5 c% K& _3 B3 D/ b5 D 8 v# l+ s5 I9 |; N( A. I
   //PCR Register) Q' T: S& @6 g; f8 M$ L  ?
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) X$ e5 r, J$ |# n6 U; h1 r  // temp = 0x00000F0F;5 r2 Z# ~* a3 Y' o. a2 L' {
  temp = 0x00000B0F;
9 m9 m. Q' F, s6 b' T  U2 O  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " k4 W- a" ~% E) I5 i4 E
  temp = readl(IO_ADDRESS(PCR_ADDR));3 F! r& p  S) e  w* J5 v
  printk("temp=%x\n",temp);  $ i, a2 f# \/ ~# U
   //SRGR Register0 D' z' J) S/ e! G. k0 x; |
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==119 t1 {) o+ u1 u" y& Z
//temp = 0x301F000B;- {# H) u4 f. z; h$ D3 M0 ^
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* I$ f8 E# y* ?# n8 n5 P  temp = readl(IO_ADDRESS(SRGR_ADDR));: D3 e8 s: @( D& u3 u, e
  printk("temp=%x\n",temp);8 X8 x+ D  c! |2 h; C9 |
   //RCR" I9 a! r  V' H, H' S; d& {3 u) O
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 G( B' x# x) p) U* P" j( o   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# O+ S, W4 w" u: r   temp = 0x00440040;& |! e2 A5 A. k# i3 r, N* W
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
8 i- u* ]. q) M   temp = readl(IO_ADDRESS(RCR_ADDR));6 q+ k4 k5 s. p7 s2 r4 S
   printk("temp=%x\n",temp);
5 |4 d* i  b: x! j" D( e, ~   //XCR
9 X3 e1 B2 h$ I1 G   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
( K! Y6 a  {3 ^" I# t   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. w  m0 _/ }, g# m   temp = 0x00440040;6 Z" g) x- M' d6 ~+ @% u9 _
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
% J; f. \1 L( h2 N! S+ W, T   temp = readl(IO_ADDRESS(XCR_ADDR));% z" z' }5 I* g' }
   printk("temp=%x\n",temp);
. m+ u5 N7 ^! H: w' X9 [  udelay(100);
$ |" m- Z% v, S4 @  x% B* U  //SPCR Register+ X+ i! }" G+ l1 q0 j, e
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( w# E0 x0 }" I: K$ p  temp = 0x03C10001;   //DLB = 0 VS DLB = 12 ]* p" ]7 S; A0 b1 t1 H+ e
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: e. ?& ~1 k; _9 M  temp = readl(IO_ADDRESS(SPCR_ADDR));9 E0 i5 k% B( J9 i, a2 Y
  printk("temp=%x\n",temp);
2 e; P2 g& e: K8 z$ y, C! K  udelay(100);
1 b/ J4 a' S1 h% h. \+ t; z& x/ H3 ^! Q8 g! A5 |0 v
  //set GPIO direction
# f; L/ Q. X9 D( k+ S   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. r$ {  ~+ k! Z/ M
   temp = temp | 0x00000100;//EPR----input
. u; x& \. p8 m4 B  J1 d   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" |  @7 N) @3 p/ X8 @   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & s' Z- }1 }8 o

) h: M1 F" }5 K4 w4 F2 Q+ v% F   return 0;6 C$ \+ m6 U3 Q# p2 _& q) m# Q. l
}
0 {8 a7 e; d+ m5 M$ x  N, Estatic void __exit MCBSP_exit(void)
" ^( \( m) t+ w9 X- ]. ]# ]  H{; B1 m3 S9 E: E( [
   printk("mcbsp chrdev exit!\n");$ k" ~$ `3 Z. t* C1 N# C
   cdev_del(mcbsp_cdev);2 Q2 f9 w5 ^' ?
   unregister_chrdev_region(mcbsp_dev,count);3 c/ C! i* h% x1 y' K
   device_destroy(mcbsp_class,mcbsp_dev);
1 ]3 c! K/ N1 O) r   class_destroy(mcbsp_class);
8 x' Y' v6 n6 M' }; h+ {5 }}2 s; I* v4 o1 R
module_init(MCBSP_init);( R6 s  p3 Y3 H+ A4 B  R& b( e
module_exit(MCBSP_exit);
1 ^" n/ R0 c9 X& }3 N$ p/ o1 F& \" s) E9 L
MODULE_LICENSE("GPL");$ W' E. q# A+ x* u2 }* F
  h4 \0 n1 s9 }7 I
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。% h4 a4 Z; j( S. {7 ?3 C( D
我的应用层的测试程序如下* X' \$ `9 @0 T1 g6 H" h1 r; S- ]
#include <stdio.h>/ j$ W7 Y. Q8 E
#include <string.h>6 t0 f3 ^: D( I& I4 G- `
#include <fcntl.h>1 D; x( N; R* u7 F+ E- k
#include <unistd.h>
6 Y3 \' Z; z5 l1 @#include <signal.h>
% ~% H# V3 @0 Z! P) K& Z#include <pthread.h>       //线程
- [! Q/ l% d' T) b* }% F#include <stdlib.h>- [0 n/ r: p7 ]8 g! [5 M
#include <pcap.h>          //捕获网口数据2 a" l/ f8 g$ h2 f
#include <semaphore.h>     //信号
8 ?0 Z* j: v, R1 N#include <sys/types.h>     //消息对列
: c+ Z, Q; W$ e" b! H- e5 M#include <sys/ipc.h>       //消息队列
6 _5 v) p6 I: O! C/ \8 w#include <sys/msg.h>       //消息队列
4 o" B# S9 E1 p1 S' G; u#include <sys/select.h>' q! W4 K# ~; a' f& A  Q
#include <sys/syscall.h>
, t$ {0 ~4 }; [7 L5 [5 x, D" f#include <sys/stat.h>
" Z* g# x- h/ o. R#include <sys/mman.h>
, H) O& A( ^3 a* B+ M' d#define msleep(x) usleep(1000*x)
' m) C3 \* ^  C% g8 S) H$ X6 X( j, P; y# S$ S
int main()! l0 o$ Y8 Z4 l9 v2 x  r
{ 0 W2 {* y% e* R3 w9 Z; }
    //MCBSP,ARM与AMBE2000交互设备
- u4 L' f7 L* u. V9 X. P& B- c& P int fd;0 N" z" i; ~) H; V2 ~0 |$ o' K0 |8 k) n* H
unsigned short data_write = 0x5555;: z; L+ }" u3 Y/ g& _8 S/ U
unsigned short data_read = 0x00;
. \6 n9 f; g& Y! P. Q! O3 G3 K2 g4 Q  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 p1 O  i/ g. H/ t6 F# }: ` //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; Z+ o% z. J+ _  T    ) S0 q: x% ?! u4 l
  if(fd < 0)) m6 Q+ w! n7 t4 I- ^
  {
' U$ o, E2 ~" c4 `1 n     perror("open failed\n");0 I/ o0 a8 H9 G  d! q  o
     return -1;5 |# F5 c  [4 T9 r
  }% A) m- m) d3 _, L$ |& k
  
4 w* Y) w* k9 R+ Q' c1 q) M& u: W  while(1)
. r, T& U" U! M9 t1 A  \  }  {
7 ~5 L1 X2 v# `" I! ~   5 c4 @9 N1 l0 [9 w
   //AMBE2000每次读写是24个字为一帧: e4 x+ _8 B; @1 |
   //写数据时将数据在底层存储起来,等到中断的时候再发送
& x4 M: _" F1 [! E# W   //AMBE2000输入数据是以0x13EC开头的
( J$ O7 q8 s! g# k  t   write(fd,&data_write,sizeof(unsigned short));
. ~9 D' W! e- y% j% v9 C! {0 @9 m   " g, [. ?; g9 o
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  0 N. U) v8 w. C8 K
   read(fd,&data_read,sizeof(unsigned short));
( S' i7 r% v* }3 l8 N( W   
5 ?0 a! @- P" g5 i. d" s9 p8 B   if(data_read == 0x13Ec)
- m; Z! j+ O) `4 d! Y2 ]; }* s   {
5 J/ Z5 @# O# f4 x  m2 ^+ C+ w  g" c/ n   4 n$ G/ N4 n1 Y3 \4 t. Y0 ]
    printf("data_read = %x\n",data_read);
, m, }- ~* y( P' C+ I   }' |' p& |  Z; k& Z3 V% D. Q
   
/ G( l) Q3 p/ {+ l7 M/ C7 s   msleep(10);( {7 Z5 \( @4 p4 K) `0 }7 V
  1 I7 v3 c9 K7 m: J2 b  Q
  /*2 A4 d# \2 H2 j, B# I; R2 x6 ~- d% A
   ioctl(fd,1);   : p0 f" |, X6 @+ D% s: t) C$ V
sleep(1);5 G  A% e  A4 r) f: f
ioctl(fd,0);- r- ^: x3 D& O" g) H, Q
sleep(1);
+ }+ R( X  k/ Y! A */ & e$ j' R7 x1 v7 ^7 E# d
  }   # e% K* Q* b% o: R* H
return 0;
1 H  @* R! w  [. k" [ + e5 }0 M/ E9 R4 t
}
5 E+ G+ U( ~0 j  V6 d* ~$ A; C% f1 {5 ?! a/ L6 B
多谢各位指教,谢谢! 急; p  v6 l4 ?" e( v# G7 {% T

  P8 C1 P' X, k" I( E8 `7 B
2 @2 J' Z0 {) `4 l+ P4 O0 `3 R* u. `5 G+ I

7 E$ c, W4 T, B( J3 e" @- U/ l
1 ^: W5 W; i( S3 ]1 n: U! Y- C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 02:55 , Processed in 0.049651 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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