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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 H& z; T4 k3 m) f: \& i2 g
/*
8 q0 O& P6 j) l! W4 @ * Copyright (C) 2009 Texas Instruments Inc
% w3 b$ Y4 {4 t% w *
6 @0 T1 C( s5 o" w% I! p# { * This program is free software; you can redistribute it and/or modify0 r! A2 d9 B; T! r( j( _. c
* it under the terms of the GNU General Public License as published by2 {/ m5 v! l, R: r
* the Free Software Foundation; either version 2 of the License, or
4 b. r( _3 J# o1 q8 G) c  ? * (at your option)any later version.
& A$ [3 J6 a/ q$ p *2 V4 i; V  F- X* X% q& k; o: f
* This program is distributed in the hope that it will be useful,
% I/ O; Q9 k. `) I# p- r9 m( ~4 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
4 ~: ~& z: V) d: }8 P6 h$ x# c% Y9 G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 E5 o$ L: [5 H; z
* GNU General Public License for more details.$ U( w  N5 ~  R9 [/ _
*7 k- {3 k* E# W' ^6 [- K) T+ X+ j
* You should have received a copy of the GNU General Public License# P/ l1 ?3 x2 t6 r  s% v
* along with this program; if not, write to the Free Software$ B/ X* ?# K' t# t+ b- \
* Foundati
: W6 A6 b2 r: O9 q/ s3 c*/4 R7 _% t. @: q
#include <linux/module.h>, {7 Z+ n% e6 I% s
#include <linux/init.h>5 C! O! W. b4 x
#include <linux/errno.h>6 a5 V8 w0 [' R2 o
#include <linux/types.h>
1 b2 {' J. E; B& J3 R& l' z#include <linux/interrupt.h>: j1 G6 O7 i9 s* t* i
#include <linux/io.h>
) T' R* H4 W) n' ~$ u#include <linux/sysctl.h>
, r! J( f- u3 H, A#include <linux/mm.h>, Y& E- Q, n8 t3 w
#include <linux/delay.h>
9 m& u* Q% J$ u% v1 W0 a! `# M#include<linux/kernel.h>  w  r: e8 K1 E" m5 n
#include<linux/fs.h>
5 S4 n3 f4 b$ F#include<linux/ioctl.h>
$ p. N% @8 G* @#include<linux/cdev.h>
/ s8 Y" H# x: n9 M+ `4 U2 o#include<linux/kdev_t.h>
2 Q$ b% b) l4 @3 k#include<linux/gpio.h>2 t/ S; b; Y9 K0 E) f" M7 Z
#include <mach/hardware.h>
8 `5 m/ Y( ?5 l# l#include <mach/irqs.h>( S' ^% t3 Q3 p! ]  N7 b: U9 X3 f

& f1 q3 {7 ^; h3 {#include <asm/mach-types.h>) A$ X0 K  g; j& l; {3 c3 k5 s/ W
#include <asm/mach/arch.h>/ d1 d* O* ~9 Q3 l/ ?
#include <mach/da8xx.h>: F4 V; |+ H9 C1 A& H1 v6 R
#define  SYSCFG_BASE   0x01c14000
$ N% B; \' @+ G#define  PINMUX1_OFFSET   0x124 5 e6 U& b! M/ ?; l; V
#define  PINMUX18_OFFSET  0x168
. K% ^2 R7 C$ R, n  a#define  PINMUX19_OFFSET  0x16c
' O. _6 X' t( _: V1 K1 v! p- x: Y' Y2 K#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR, s  |9 s3 m- L) E3 b  D
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
! K8 y9 {, H" B, e# M& v#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR" i1 _3 m: G0 w7 N3 H7 _; V
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR2 y9 m, g1 Y/ d, N8 D
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
$ l: v; U( {3 _4 o: H                            . d5 o8 X6 Y# b' h) V2 I
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! @' t' U7 m, y9 }#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
# c" X! a  [6 T# Q//PSC
* \3 E* p2 [3 T! q/ E3 j2 I: c, x#define  PTCMD_ADDR   0x01E27120  : Z% r' N, B" \. y
#define  MDCTL15_ADDR 0x01E27A3C5 p- z8 E; y0 D
#define  PDCTL1_ADDR  0x01E27304+ i' O) p( k1 q8 c0 Z. z5 Z. n
//GPIO8 direction. l, L$ L7 E9 y+ P- P8 N% Y4 D
#define GPIO8_DIRECT  0x01E260B04 A' P  c& U& o% V$ h8 C; h+ t" B
#define GPIO8_OUT     0x01E260B4
9 Q" p1 i1 X% q2 K5 p, j% ~#define GPIO8_IN     0x01E260C0
( G3 z1 |6 q. Y  M
$ `( x, i# T1 C1 w; B. I% D//#define MCBSP1_RINT    99              ; x; g- e2 @, S0 A5 k
//#define MCBSP1_XINT    100  1 D! Q# C3 t5 r( p  Y  {
static int MCBSP_MAJOR=239;" r+ M8 q* k5 s/ d+ B  X1 M
static int MCBSP_MINOR=0;
& r6 n/ N: _  e0 X, F( v( o* v. `; Rstatic int count =1;! {5 X& Z% _- u: v8 ?' m

* p' U: b1 \% L% h8 H! D' g#define MCBSP_NAME  "MCBSP-device"* \* t; s9 @, N% d3 i

8 r$ k9 j' a2 s0 bstatic struct cdev *mcbsp_cdev;
5 ~6 n& O6 m2 V5 gstatic struct class *mcbsp_class;2 H6 ]5 N6 Z* l% u
static dev_t mcbsp_dev;
& @  R2 y% `: B3 V, Eunsigned int DRR_data;
0 F% s& j+ D; V0 v/ g( S) \& u& o9 s, Gunsigned int DXR_data;6 `$ [/ C5 _0 e
static int mcbsp_open(struct inode *inode,struct file *file)6 s. @, `- @+ S0 h+ F# B& \
{
& [$ Q+ |2 X+ I   
  P' U/ A2 N8 n7 l" G   //interrupt enable,initialized
: K; U6 H6 C! H' E, {) G+ G   unsigned int temp;
/ z( y; ~9 g( q; ^4 {   //SLEEP_EN(GPIO8[10])---0
1 a" {% G5 \0 r5 }+ O3 Q7 C   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; V) O& B/ D6 x, g( ]0 p2 e
   temp=temp&(~0x00000400);' [# R1 D" [1 p- q. r" F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  i. }8 P( D! P7 q7 Q  //RESETn(GPIO8[8])----0----1
" j$ Z4 X( r" H- h( w   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  ?% V& H. B+ ?( Q   temp=temp&(~0x00000100);& X+ T! Y3 y; w  n. _/ d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- \6 P4 S6 d' K! i1 S/ n
   udelay(100);8 |: A& \# K- M- P
   temp=temp| 0x00000100;
! N$ n0 ~( b! p   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---10 G  V0 Q( R! p) \; r+ l0 t$ t
   udelay(100);; E4 C' y8 a3 c* X/ o& X8 o
   printk("open success!\n");
( Q8 a6 V, J+ Q: \+ K# X8 Q   return 0;
! S" R1 w! S4 Q$ T) @6 l}) k$ ?' Y0 ~; d
6 S; `* g' ]6 R* ]3 f
static int mcbsp_release(struct inode *inode,struct file *file): ~- F* p* G* M% x6 d. [3 o+ X
{
+ i' o/ M7 }4 b1 q/ u1 {   printk("release success!\n");
! \4 k* j0 ~4 f& }) l- e   return 0;1 {7 i2 ?6 F$ [; `" x7 X0 L& K3 j
}& k! z: k  ]5 c0 m3 C0 a/ C" |

5 M: ^( \: H' R7 O; c" Y' e) o9 Ystatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ P! m# p$ V- ^$ ~
{1 z& B3 O* t- _% E  x9 T: I& Z9 M
    copy_from_user(&DXR_data,buf,len);
) s: s) g& j$ Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
7 K% _% N9 B0 j/ m" g8 E$ w    return 0;7 ?. J$ \/ J) p/ Y- ^

5 A# H) n1 t" L}3 [$ ]- z; e2 c
6 g5 A8 e% b* o. ^- b
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)8 M, n/ m, J1 @  o& H" Q0 {, V/ E
{ 0 x8 @, @7 q: c5 J
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
( V) {" k, {- ^   copy_to_user(buf,&DRR_data,len); : s9 ~$ S8 D/ w4 r' L
   return 0;
  \6 [+ c0 S" d$ ~7 c- \}
( z  q1 ~4 d7 d6 x* B
1 k& W2 Z, @5 o* I1 r/ m" h9 D+ W+ B9 H' W9 [
static struct  file_operations mcbsp_fops=. E; `$ C  I8 j( U' P; d
{( e% u: @' g' M" v0 G
   .owner=THIS_MODULE,
" x) N2 G5 C& T   .open=mcbsp_open,
7 }  t. j) D# K# f: `  T* w) t   .release=mcbsp_release,0 O+ @+ B; W5 _8 p2 v0 A% {1 i4 M
   .write=mcbsp_write,# I" \  ?& Z! m0 c, c5 w) m* n3 ~
   .read=mcbsp_read,
+ J6 k" \' G5 G/ w# W: B};; H+ n6 b7 J" R6 k! w
static int __init MCBSP_init(void)8 `! D1 f% Y( v% W
{6 P, X/ q2 R- p& H2 H
   int ret;
. S: P" N8 g& G6 P- S   unsigned  int   PINMUX1_REG_old;2 K# `$ P4 I) ]# Q
   unsigned  int   PINMUX18_REG_old;
+ `) M" A! T$ Q0 C/ O' x   unsigned  int   PINMUX19_REG_old;/ s* ^- @2 s% x# A# Y2 T# h# n# O0 ?
   unsigned  int   temp;  ( A- R$ x7 u8 X3 j/ q
   if(MCBSP_MAJOR)+ r$ p; a' `9 W- M( w2 ^) O
   {2 Y0 o# X1 g5 n/ W2 ?% t
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, n1 `+ d. ?$ U9 Q, T  [      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" g) M. L. J0 g2 H5 }
   }
6 l9 l+ i8 H7 b4 ^/ U* W   else
! Y: R6 g' K: i: ^. q. }) F( y: I. r   {
4 D3 i1 O/ \- J0 w: E) _3 X      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
$ G  M& U: |# G% {0 o7 a      MCBSP_MAJOR=MAJOR(mcbsp_dev);8 u* }3 U3 u. H& f, X5 a
   }  s0 `" M$ S& k" F0 g0 ^
   3 {( ~% r, G0 P2 E% O6 z
   if(ret<0)
& J( H+ A' [& K+ w1 T' X4 P   {
; `" E" M* O+ y: w- @  Z/ ~0 O      printk(KERN_ERR "register chrdev fail!");
+ U( D# s% }* p! z! J6 c+ C9 I" ^      return -1;, G+ ?- m6 ]# z8 q4 y
   }& [8 V$ [$ ]% d- i; k+ H
   
- b  T) s% v" q   mcbsp_cdev=cdev_alloc();
% l: X  K6 ^+ W& [5 b   7 x, U2 g. o3 [' a2 k# X6 Z
   if(mcbsp_cdev!=NULL)
* K* R' v1 M+ |   {
: Y; g; F1 I+ ~* U- N      cdev_init(mcbsp_cdev,&mcbsp_fops);9 [# a, D- Z$ R3 y1 q0 I. ?7 D
      mcbsp_cdev->ops=&mcbsp_fops;
& ^6 E6 p3 X+ s: N5 |" A      mcbsp_cdev->owner=THIS_MODULE;$ |8 s! Z3 s+ x& v7 p2 ]( w; F5 u9 A
      , B) D+ m' z! ]) U1 L; z
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))* T* R- b! Y% ~# e0 J
          printk(KERN_ERR "register cdev fail!");
6 l0 P& q% N/ ?      else
# f  S( z$ e% H: \9 B/ m* w          printk(KERN_ERR "register success!\n");8 I* m5 [/ F2 w# ~7 x' H
   }
7 S& y  r; W1 X* |1 Y2 C  n   else
2 `, {9 I0 \: d0 l   {
- o' g; j! c3 Q# B9 c5 J      printk(KERN_ERR "register cdev err!");7 K: t1 X6 Q, a1 o
      return -1;- u9 c2 j' V9 ~" R2 j$ ?: J
   }
# j% F3 _4 t# X, X1 Z   2 l. p6 V- l7 r6 x' ?% q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- u2 S! ~; r+ D7 h3 I" s
   if(IS_ERR(mcbsp_class))8 [' |0 V: [* t  U, _
   {/ g+ d1 y& M( V% v
      printk(KERN_ERR "register class err!");
: t# A1 F* c1 g! V8 U% _( Q$ t   return -1;
& ~5 S+ s, z+ ^; Z* k9 p   }) K2 ]" v) D+ i$ d
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 \. E* q) O( ?: B% L
! X) W% U" r# e  o" o- C
   //PSC
( E% {: C7 @8 {( y; v# Q8 V1 t" g   //add Enable MCBSP
  @2 `( ?6 V) F# W/ q* b7 W: o   //test5 u* h9 m7 Q0 e4 w1 k8 f7 I$ Q
   temp = 0x80000003;
; h% l# ]8 ?5 D3 W) ^# x   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
' @3 g! E# E2 @. v' ~9 D2 ~2 P   temp = 0x00000003;
5 j  c! Q2 W  E' L9 t/ J5 {: V+ U2 w   writel(temp, IO_ADDRESS(PTCMD_ADDR));/ o1 c" q0 }) E, g7 @
0 W$ }' j; j0 o9 F% t9 w  i
   temp = 0x001FF201;
' G; i7 ~5 H* o( B% \   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" y; ~3 P% k' _" D
   
. e* V0 {- A9 C1 ^   //PINMUX  ) p) a/ d& r2 ^. G
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,# }5 g4 I0 t7 v- v
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
1 u$ o' h7 H# \. N+ R   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   $ x/ T* Q: }. x) s
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! q: g. n( M0 [# g   - W. w0 `: n) p. N: s! u5 {
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ V7 O+ |! @& L6 x/ z. g, }2 Y   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ @( q/ X/ C8 h8 o, p$ a: f   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
' [, \  p. g( D6 D9 D* a   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 w( Y/ _* W/ _; `; e& I* k

+ i  _6 X. I5 Y% B   //RESETn,L138_SHK2
3 ?% b& [" t+ T7 b: A. n: R1 Y   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  # F! k4 q  c. i  [+ N8 @3 r
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! g3 C( l" U$ U& i+ ~2 U   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% r$ x; X+ V" h, s7 s, v 2 ]2 [& D' X2 j7 B* R! r

% G" e$ f7 a; B- a  //SPCR Register) d. y9 w2 |% f; ?4 n/ d
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. ~) j! F: h: }: ?5 l: P9 z; V+ Z
  temp = 0x03000000;//(DLB=0): c* v% H; Y4 O- \) E! x/ Q
// temp = 0x03008000;//(DLB=1)- i) R0 R. r- R: q0 q2 ]
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ e1 _; X) z6 P7 D. L. @
  temp = readl(IO_ADDRESS(SPCR_ADDR));$ `9 g/ ~$ E" ?
  printk("temp=%x\n",temp);6 ^% G/ c, n1 e7 C' ]
+ d* D) |7 ~( W7 W
   //PCR Register& F  I  |, y, U% l1 ]4 ^: a5 _: B
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 m+ Q" t9 ^  s; x) p! w. ]  // temp = 0x00000F0F;
+ v- k" D9 n9 I( _2 E  temp = 0x00000B0F;
- B4 K: O% ~4 _5 y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 f/ T, u, v0 D& Q: ^7 B  temp = readl(IO_ADDRESS(PCR_ADDR));
" e+ \& V, u& \8 g- A  |  printk("temp=%x\n",temp);  6 `& P* @) j4 C8 ^
   //SRGR Register3 l& L2 V/ g* p3 e7 J7 v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 r; j# [0 B& X8 s) o+ ~4 Z6 X# F
//temp = 0x301F000B;. @' c. X/ p0 F: b
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 y. i' e2 \$ u) O" L, Y, L  temp = readl(IO_ADDRESS(SRGR_ADDR));
/ K1 O7 E- n9 I6 z  printk("temp=%x\n",temp);
' Z" g8 e4 n- l% p3 Q   //RCR
4 h8 ]- E, z) d, P2 Y2 R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& i2 D* e! [3 l! R0 s4 {   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 T- B. w% o% G: I, P* {
   temp = 0x00440040;
) V5 P( Y7 ^6 W* R% w, i+ ~- C   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - a5 l9 @4 a3 @6 ?
   temp = readl(IO_ADDRESS(RCR_ADDR));
0 h2 A7 x7 Z. n; R: n: f: ]   printk("temp=%x\n",temp);
. @+ C! s6 k  R' u   //XCR2 \3 l3 Z+ l9 Z1 K% r* F1 R
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* E7 r% O$ O. k& G3 b0 `! M. X   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, Y6 [- {& X7 \6 B/ u4 d1 s
   temp = 0x00440040;
+ Z  C4 d" P* ^" a, P. v   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
8 b8 w7 O1 |1 W   temp = readl(IO_ADDRESS(XCR_ADDR));
; C7 Q+ n# t4 t8 u   printk("temp=%x\n",temp);
, H1 d( H4 r* v7 i  udelay(100);& R  G' |4 }5 }" Y
  //SPCR Register' `8 ]) L; k+ t! S% b0 k
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 m( ~% t! ?9 a% b% V) M4 y  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
7 y6 G8 w, i% k* u/ |  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
* a4 b, C1 H; ?+ F" K  temp = readl(IO_ADDRESS(SPCR_ADDR));% A3 P0 o% a2 F3 F- s# l% n4 C2 P% Q
  printk("temp=%x\n",temp);
* S  A2 l/ R# j# e5 j4 T. A  udelay(100);
7 L3 H4 {" b- J: `9 G' \/ i5 n5 e3 Z0 s9 X* U
  //set GPIO direction
3 z2 H( k8 E9 G9 @* v6 W8 G. P   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 b4 B# q6 a0 Q9 Y5 ~   temp = temp | 0x00000100;//EPR----input5 \/ t: R/ X- G8 F' _& ~5 V
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
, f# F* ^* [! W8 h3 o8 e9 Y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - E+ z3 a0 f0 q

$ g7 a8 _$ t" D9 v: R3 L+ j   return 0;
& U. |4 {1 b& n}
! `- ?7 N9 R3 l: F" y/ vstatic void __exit MCBSP_exit(void), @5 z2 {& s0 R5 p+ X
{
) {9 C% z; c, c3 j   printk("mcbsp chrdev exit!\n");
! {' r  e( |1 b5 `  j; }) P% e   cdev_del(mcbsp_cdev);0 I  {9 r0 s4 p7 n# P2 E0 z
   unregister_chrdev_region(mcbsp_dev,count);
3 C! V5 Q. Q( k0 `$ u" Q   device_destroy(mcbsp_class,mcbsp_dev);& x8 e& ^0 v% d1 G: Z( Q# m  L
   class_destroy(mcbsp_class);
7 ^8 p; }& j; z}" \* m5 J4 p' A7 \, M
module_init(MCBSP_init);6 b7 ?$ ^; h" o* ~1 {# @& [8 ^. F+ i
module_exit(MCBSP_exit);
+ @  X' u8 \  n2 Z6 K) N8 i( G6 g; [/ q1 f- i3 S
MODULE_LICENSE("GPL");
" P; ]4 K& \4 r( A, T0 k: a" H
9 i, w: ^% {/ ]. |, F我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! v8 ?0 \. k6 b+ I我的应用层的测试程序如下
* P  @* ]. a, [: u3 V3 c) w#include <stdio.h># A1 J( A- d" Q* R  q
#include <string.h>
. C, m7 S0 T4 X' l#include <fcntl.h>
  i; t& i# [: l5 ~/ @, I#include <unistd.h>
1 O" C+ N$ h& ]( C; J) A+ t#include <signal.h>+ i3 J$ Y4 I# Y
#include <pthread.h>       //线程: S( e' O; \' }6 V% E9 b
#include <stdlib.h>
; a2 _( H( i  n* [! H, G#include <pcap.h>          //捕获网口数据
+ O# j& I5 I2 @% a4 g# C! Q9 `. u#include <semaphore.h>     //信号
' T) W  p: b( y) q3 D5 T* d( W#include <sys/types.h>     //消息对列0 @0 z4 c# X. p3 B4 `, K
#include <sys/ipc.h>       //消息队列
! @) W5 x& {  N- R4 Q#include <sys/msg.h>       //消息队列
  \- y+ N5 H- T7 P* F/ l#include <sys/select.h>
; V( {+ o7 s" d+ A) X' J% l#include <sys/syscall.h>  k5 M8 B  s0 i) C. y
#include <sys/stat.h>) q  P* u* w3 V9 c/ U
#include <sys/mman.h>
2 |. Z! Z/ G) A. d7 q#define msleep(x) usleep(1000*x)1 {8 a4 I% S; J4 U9 r
4 d6 J& Y( k5 k# j. C8 b+ c4 q
int main()
6 K8 K' h, _) P4 u{ " o; R/ S' S4 w1 z- K
    //MCBSP,ARM与AMBE2000交互设备( b) r: U' |. i! c8 O( q. {
int fd;- S- O2 x2 o( x0 Q; d) }
unsigned short data_write = 0x5555;
5 [* U# p4 C& W* U/ D- } unsigned short data_read = 0x00;1 C* Y$ m9 }- M$ e
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 l; s) T/ s+ n; S
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 ?1 Q5 a3 _1 {/ m2 I+ d    4 I# l9 O% w' g# y# }. v
  if(fd < 0)
7 B+ `5 n* v. N- J8 b- |  {3 e* r) `; G( ?6 A- k' H
     perror("open failed\n");! q" v3 e. V0 b  j" f  n; b
     return -1;
6 s3 U1 K# X8 ]; v" O7 I  }
( K7 D! e. T& c2 W" p8 s  
1 t" o4 ]( }% [9 [  while(1)
1 Z7 K2 P. @8 y, T! m  {! v  i: s4 \6 W7 A* X
   ' `, J2 V: r+ q9 {0 e
   //AMBE2000每次读写是24个字为一帧3 z$ ^, X3 a. N+ L+ ]- v2 d
   //写数据时将数据在底层存储起来,等到中断的时候再发送- f' `9 Y  N8 a* _. a2 @, x
   //AMBE2000输入数据是以0x13EC开头的
7 b) i2 F7 s+ w9 o) ~* w3 B   write(fd,&data_write,sizeof(unsigned short));4 B5 l1 z. y1 B3 \. d- w
     P+ l$ Q  _( G9 S
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 v8 R/ T$ p2 Z/ i1 K' x2 k7 @  n
   read(fd,&data_read,sizeof(unsigned short));
1 d5 `* y6 Z; [6 ^- v. _7 Y   2 f  \2 z/ y8 h
   if(data_read == 0x13Ec)& e  |4 b0 O6 d3 ?
   {
% G7 B0 U  s5 w4 V; q7 ]   + _' u: ~# V( ?4 H1 k5 M* }
    printf("data_read = %x\n",data_read);! n( c( B& |, e. O& Y/ v
   }
, m$ l3 x4 T2 `   , P7 o; p- `+ v
   msleep(10);
. v, i2 e! s" J. f+ I  6 Y! C: B6 W! B. Y' G* e/ |
  /*/ x4 d9 d  Z8 K2 I+ y0 {" H( P4 ?& @
   ioctl(fd,1);   
3 ?( |% v1 g+ [, | sleep(1);
5 J* d% L; k8 W8 r8 N( g: V( d8 r ioctl(fd,0);; i" e, x) U% K
sleep(1);1 _2 B2 r8 p* ^
*/ ' W9 g3 a9 D* M" b
  }   
; W! n5 H7 R! ?  }& A  E return 0;
: l4 W0 ~$ y: `0 G. N/ a   v9 w9 O3 \- L( v  f1 X, I
}
, N8 p; R- D- Q! ?; D
8 h3 Q, G9 n3 R3 ~0 s% U多谢各位指教,谢谢! 急/ B5 R* S  J* k
& D7 {$ j! X# i' P! k* l
0 {9 e+ u8 T) P- `8 [$ y! _# k1 `

' ^' c  ^7 o; k
: ~) P  R* b" X* I; W# ]* w
0 q( n3 V& }/ A( j0 E8 d- W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 15:14 , Processed in 0.049954 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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