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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 N+ V* P& t  y5 j& G. l0 C
/*
) g9 ~. H! u  F+ `4 _ * Copyright (C) 2009 Texas Instruments Inc+ I  p0 {$ D5 r- m
*
( ~" S2 w4 P, G% _ * This program is free software; you can redistribute it and/or modify5 K; x$ @$ ~& I! C5 b
* it under the terms of the GNU General Public License as published by9 |/ u( b" e9 D3 W  w
* the Free Software Foundation; either version 2 of the License, or" S8 _5 B4 F% [/ f3 ~! ]2 W
* (at your option)any later version.
) K0 ^7 Y# n8 G1 h$ C+ P *
' E1 \/ b" U& x0 f' o# C8 k * This program is distributed in the hope that it will be useful,
* p8 s( ^5 P% V* \4 A0 W * but WITHOUT ANY WARRANTY; without even the implied warranty of2 F" \: A! Z: B
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- g* v3 K/ w; o& _" K
* GNU General Public License for more details.& @* s8 C/ V0 N* G/ X0 D) k: }
** Z" G# z& u" w) w9 V8 O5 i
* You should have received a copy of the GNU General Public License
9 G5 ?4 i- P' C * along with this program; if not, write to the Free Software
, O$ ?, k( f" u& V* m1 T0 O * Foundati
) }+ \7 ?8 Z& ^*/' q, E/ ?: x& a' c! f$ b% k
#include <linux/module.h>
+ t& r8 K$ B  L: O  P#include <linux/init.h>5 D8 j, X. l' h: s: ?2 ~4 G
#include <linux/errno.h>$ d+ V: n: P: [6 x# p) g; k1 }
#include <linux/types.h>
% p* B9 e( F4 y) b# b8 E3 X#include <linux/interrupt.h>7 G& v3 _0 W5 D9 F( F- {
#include <linux/io.h>6 |2 t6 w- e& C$ N& p
#include <linux/sysctl.h>$ d  |' M8 [9 D! }2 U9 o
#include <linux/mm.h>
4 T$ w( I+ L% t& a#include <linux/delay.h>* v. c' B% y0 ~+ p; v3 J/ E
#include<linux/kernel.h>
& F: e" P' }, j#include<linux/fs.h>! D) @! Q0 y! S0 ~. H  s. E
#include<linux/ioctl.h>8 L- {4 ?) F+ y7 k
#include<linux/cdev.h>
& \5 w- n! N" @( [) G+ x#include<linux/kdev_t.h>2 c( v, @& T2 {: a- Z7 o% i
#include<linux/gpio.h>
1 f# H; X! E' P- @* E6 z#include <mach/hardware.h>! r& P' \* ~! U- C
#include <mach/irqs.h>
' l& V. y' b; I$ q9 F/ n  z. u( R+ d4 g. q2 b
#include <asm/mach-types.h>
: M. |# f6 Y2 N2 _  i#include <asm/mach/arch.h>
' {, I/ \$ a( M" X9 w) z#include <mach/da8xx.h>
2 B% l: u5 B$ B& ~#define  SYSCFG_BASE   0x01c14000& \  n: {+ a1 |1 R; }1 R0 y
#define  PINMUX1_OFFSET   0x124 , ^/ K, B; @3 ?! ]- `$ G
#define  PINMUX18_OFFSET  0x168 . K  c* _8 P9 I6 {4 {* n
#define  PINMUX19_OFFSET  0x16c
- P  Q1 F  x5 ]# c+ Z/ C#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR, m0 I" @; t$ S
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR( k7 D4 d' S+ J! Z* g( U* a
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 r! e2 ~. |9 N- R0 [! c#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR8 q. c$ G- `# ^7 }: q) q! |
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
: C& A1 |: N3 x9 Z! w                            1 R% x% ]# D9 D
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
) ?* a2 `3 L, m7 R2 e$ ~#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- S. g- U3 X1 S. S  a( C//PSC3 K  g4 m) {) x# Y! ~  f5 g
#define  PTCMD_ADDR   0x01E27120  * X3 s( n! p, G
#define  MDCTL15_ADDR 0x01E27A3C0 l3 P/ B7 ]$ B5 e
#define  PDCTL1_ADDR  0x01E27304
( G! m# m" }( u7 \1 V2 N7 b//GPIO8 direction
' T! X+ g( j5 Z! s#define GPIO8_DIRECT  0x01E260B04 ~' d' @& m. d/ ^7 V) W
#define GPIO8_OUT     0x01E260B4
8 |4 ~8 k! M+ H9 y9 `#define GPIO8_IN     0x01E260C0
6 I4 r8 K# p3 E3 L( o* k# G2 z- d/ L# z8 P6 b9 G  M3 F
//#define MCBSP1_RINT    99              
% i+ q: t/ [$ S# m//#define MCBSP1_XINT    100  
3 A; [, }* L' F. q, R2 v8 nstatic int MCBSP_MAJOR=239;
: L3 ?: k/ V3 ^2 K+ \/ k( astatic int MCBSP_MINOR=0;5 s4 f. w+ F- Q- k7 e" D
static int count =1;, j! j; L2 j, `5 ~' `+ r
5 N1 w: [: v# L4 i, m: A$ P( S* w
#define MCBSP_NAME  "MCBSP-device"
& Z3 m" J! m  Q" ]9 ^6 ~: M% p, W5 k9 _! K0 F& m  O& @
static struct cdev *mcbsp_cdev;
- X3 K4 f- l# N0 k" z: g. ^  J- pstatic struct class *mcbsp_class;
! b+ b# q. w- Z3 ?' ~& f0 u$ ystatic dev_t mcbsp_dev;
; i# V( \6 V" z3 Q6 @* Dunsigned int DRR_data;
  \0 ?' X: H' ~# e* m/ J! Uunsigned int DXR_data;
1 t& Z8 T# S7 J' Z$ U, hstatic int mcbsp_open(struct inode *inode,struct file *file)0 P& M! w9 Q6 P- C1 G( ~' ]/ R  X
{3 G) j' w2 Q8 N8 y9 a  r3 e0 Q9 [
   
+ p1 M" q+ {/ Q7 k" `, m2 n   //interrupt enable,initialized
# N* p3 R" b" r% C+ J7 h   unsigned int temp;- D- d8 ~. X$ `0 n1 n
   //SLEEP_EN(GPIO8[10])---05 M# v$ n; G* j( w8 g2 ?+ u. l
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" F" a3 b+ X3 f9 {
   temp=temp&(~0x00000400);& ^4 X: N9 Q5 Y) l) m2 C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ V( {# ~* T* v/ c6 |+ f
  //RESETn(GPIO8[8])----0----1
4 V, C2 K6 l' j& ^+ j$ _/ |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: ^/ v# _$ R4 H   temp=temp&(~0x00000100);% I# t# F8 D, O+ S% [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) }$ ~. E! j4 S0 }
   udelay(100);0 Q& G+ q& j) d
   temp=temp| 0x00000100;
/ U" u2 H; J6 @+ |6 \6 H( R3 t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 w8 [. i: Y* p6 k9 f# Y+ ~   udelay(100);
4 ?0 j6 Y" e- a   printk("open success!\n");, G/ @' s! [# P: }) G" y" l0 T0 d
   return 0;2 n9 _2 [* t7 R' Y1 E. D
}
, U8 `  V+ n. K. ^% C& w( w
( k: |% A  `( _# X$ ^  F  J& \static int mcbsp_release(struct inode *inode,struct file *file)* R, E$ ~) I  n' R# N$ H: i
{
0 }9 e' M" P, k& h, U' d   printk("release success!\n");
0 Q2 T# Y+ Q7 o& \   return 0;
, p' i2 X) L: `' h* Z5 x+ F( P}# i# h+ f+ x7 D
3 [7 W# R6 I: P9 ]; y
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- f; C. E4 G0 X/ H  g0 }{
8 U. t) G# P9 A+ @( B& R# q    copy_from_user(&DXR_data,buf,len);2 L9 X: T- r+ F
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. _* z( @/ F( C9 p" g, j2 j    return 0;& `; d" \8 J9 A  q0 @7 ?

! ]: g; X. k; n- u}
! z" `5 r: F5 L" A: q0 m5 `% ^+ V. |# |. }$ L5 l% w
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 P- V1 [+ U+ h1 p
{
+ h) Q6 c5 x7 b, {; K   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" Y* O" T& V; T" L/ R/ W   copy_to_user(buf,&DRR_data,len);
' n) V8 {! C) A' o. t   return 0;
$ b8 R" r1 c% ?- G: D$ E6 s9 S: u}1 X& k! i3 L* i; t  m0 D- D
# q, b1 ?9 G8 M+ u
7 R, u' P0 `6 d4 q! Y3 Y
static struct  file_operations mcbsp_fops=
; ~; d9 p3 V/ i! M% d, X; A{
: j9 p/ h" \; Z% h+ m4 ^   .owner=THIS_MODULE,7 u: z* u' J! A. L
   .open=mcbsp_open,$ l7 b* }, `1 w5 H1 }3 B" L( f
   .release=mcbsp_release,9 _' n. D2 d$ R- m& P
   .write=mcbsp_write,1 Y3 |" c$ V: v. S; R5 `1 ~
   .read=mcbsp_read,% r# d/ d0 }" D0 [" e
};. n/ p1 e, ]$ b# l+ l, l
static int __init MCBSP_init(void)5 q7 t" f; o- k! H4 Z# D# e5 }
{
; t/ I& n6 @3 O* }4 x$ I3 T  i   int ret;7 J9 u5 y- j. l
   unsigned  int   PINMUX1_REG_old;7 ]6 E$ G% s' f$ D, C1 i5 a
   unsigned  int   PINMUX18_REG_old;
7 h0 s; c! l* y! ?6 G, S   unsigned  int   PINMUX19_REG_old;$ {4 }4 K7 l0 j+ c, i
   unsigned  int   temp;  
. A, z5 R8 [/ t8 m- R# a   if(MCBSP_MAJOR)
1 N5 ~% L0 j3 M. K4 O   {& v! k  g- {5 {
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
& C0 c3 j4 s0 A1 C      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* d9 _: s, v+ H, b1 Q. d
   }0 o# }' H/ L% G' N+ j
   else
' Y2 |* w- j) M8 E   {
* m' h6 y+ x% ~% d, @) J      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 v3 X; ], y! C" }, W' ^# H
      MCBSP_MAJOR=MAJOR(mcbsp_dev);8 E1 j1 ~1 p) g- o  N
   }% E  g  t; F; z& Q
   
* |9 z2 e  `: [! C8 ~% ^/ F   if(ret<0)- @  d- a! }( O- F& D7 w
   {
# x- V0 b1 e5 o      printk(KERN_ERR "register chrdev fail!");
* v* ?8 A6 v& N8 m; d3 z- `      return -1;  L, I2 o1 A8 r8 C( x1 E. [1 G
   }# b( i( d# B% N, q% P
   3 j8 w! e( x: r4 z  Z5 I% R8 O
   mcbsp_cdev=cdev_alloc();; K4 H! F! b8 Y+ c1 a
   / e. q5 {' Y1 r7 O; ~/ ]( {
   if(mcbsp_cdev!=NULL)
7 t1 c5 o% d8 G2 D   {
4 x5 {0 [$ U  a$ b7 F3 q& `      cdev_init(mcbsp_cdev,&mcbsp_fops);% ^" `; y  u9 T% X. y. ^
      mcbsp_cdev->ops=&mcbsp_fops;2 }1 _: x; P- L( Q
      mcbsp_cdev->owner=THIS_MODULE;
  K* Q1 `1 [, M2 P. J+ e      3 r+ x1 w8 k  ?: H
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' P+ M# S( ~5 i          printk(KERN_ERR "register cdev fail!");
! k! ], U" t; }      else
$ D- S  ?6 d+ {; R7 ~0 C" _4 a          printk(KERN_ERR "register success!\n");
( o5 x2 L  u' f" a/ F$ ]! h   }
, i! P0 X$ T8 m6 e9 D" |9 Q   else
( v5 j& j8 W: u1 N: \4 k, _# S   {
) m  U' t0 Y  P' `% R$ b      printk(KERN_ERR "register cdev err!");
/ Q( |) R7 }$ v7 F' j  k      return -1;
& ^: i& J& F. c1 S( B   }
: V4 u  ~/ i- S; l- l- R9 ?( R& k   
% R1 \" p. q: `* y3 W, O. k  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 t: p% z8 l) T; ^   if(IS_ERR(mcbsp_class))+ ^3 l5 Q; [& K4 L
   {) L! [. [) }/ S; P8 M% H. f% {- g; M
      printk(KERN_ERR "register class err!");' E0 C/ A# ?* `/ s
   return -1;" F( i: G! {+ N: l+ N( ^6 A2 o- M
   }
: ~9 u; ]) X5 I! J3 C) o0 `   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
. u9 L, {/ K! U/ w5 j* K2 R& b( T
   //PSC
2 u7 @4 O$ R" \. R, p   //add Enable MCBSP; W* N2 N- ]4 E8 V+ Y
   //test
* @- j% E, J1 S: m   temp = 0x80000003;! \* k1 ~& z9 d3 a
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 i5 u$ D' q# Q$ U+ b
   temp = 0x00000003;! ^, X- F% W  _6 H1 `- ]; Z; v+ [
   writel(temp, IO_ADDRESS(PTCMD_ADDR));7 n4 `+ {1 H+ E& @; m( e
* s3 v  Y; a; M
   temp = 0x001FF201;% P! X3 j  b; B9 W
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ o! q2 I, S1 X
   
- N" z# E" Q! S0 K9 F; t' z  I   //PINMUX  7 C0 f3 Y3 q* R
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 C! u' w  P4 g2 F
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
& ~: w0 |! N7 R: Z+ o   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & ~% i2 r. g4 o& R0 W
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: t5 u. k1 r. M% G! W0 _
   
; R# C  M2 B7 s0 @   //SLEEP_EN,EPR,L138_SHK1,L138_RC& V1 [& x, }+ F  z1 V
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ v! s) Z; Q# A. W0 x: W1 W
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
5 I) S0 p% [0 d  I1 G   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& N  b6 X7 ]  v, y2 S- G- b; `

* J7 ^$ s% i0 B1 o, m   //RESETn,L138_SHK2
: W6 B: [3 Z  U! d( q9 D# W; p   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 T. t7 S7 R2 ]0 J' l: \- g   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   0 T: N- ^+ _: i- a% t# p* Y1 B
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);0 y# m4 y. b  D( t+ H

. J4 P, w. y6 @7 [
& |' G: e, f, _' H2 n& u+ m* G  //SPCR Register
( k# \1 [, Q/ n7 ?( M  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 m0 C1 L; H2 X* C" _" b/ O2 w  temp = 0x03000000;//(DLB=0)2 l4 k4 z) d  L5 I! y
// temp = 0x03008000;//(DLB=1)) Z7 e1 T& F8 A; [" C
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset  M+ a5 `; @" @/ z* d
  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 S: v4 z3 p& Y! l  printk("temp=%x\n",temp);
  K- E! v, B/ T6 d5 ~9 Z; J: h
3 X& D2 X" u) a+ R   //PCR Register# L% {) u* V" H4 p
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- ^! a  }* \0 `: t
  // temp = 0x00000F0F;( W: O2 N' K. ^  T) c
  temp = 0x00000B0F;4 Y; t- b  g0 W: i) A
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized # ~* \' }; P" w
  temp = readl(IO_ADDRESS(PCR_ADDR));: g* I7 q) D" S- |# o' G$ `0 N) l) p
  printk("temp=%x\n",temp);  
- m% P, H1 U4 |( H) @7 m' G   //SRGR Register
" S$ a! F9 h% \/ V/ t2 H+ z, t   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; O  \/ N9 x7 u) w% x
//temp = 0x301F000B;; m& C+ i' b& p' J* z2 I0 x! U
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
5 e5 c/ Z1 e. w  temp = readl(IO_ADDRESS(SRGR_ADDR));' e4 U. |0 v4 f6 {
  printk("temp=%x\n",temp);
: g# j: a3 ?3 }, a5 d4 X: F   //RCR4 Y( Y& l2 Q, o( S. k3 D" X1 R
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,; x9 C8 @% X) b% x! @2 t
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 E6 w/ I8 J) N# k* Y6 ]
   temp = 0x00440040;
! R; v0 J* [" ?$ P   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   / t. J" T( w( t( s, h0 W# a3 H
   temp = readl(IO_ADDRESS(RCR_ADDR));
- C9 f" R9 J% q2 e! o/ f# r   printk("temp=%x\n",temp);
- V- n% H7 X. R1 p   //XCR6 {. P  r1 y% O( S: v1 ^5 Q
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ \' N2 ?6 Z! k3 i
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
4 R. L& \5 ]3 H7 n   temp = 0x00440040;6 L2 T. a# q5 y6 ]- u+ {: n0 M
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
5 f! b6 k( S, u9 |   temp = readl(IO_ADDRESS(XCR_ADDR));/ k6 L5 @  W) G0 K8 c3 j" s' u! b
   printk("temp=%x\n",temp);
: O1 t; p  }: \9 g/ q% v: |- x  A  udelay(100);+ v# O( l- ^3 K! I2 `( ?( X, |$ T- U
  //SPCR Register5 G# J( K5 z1 w; w  a
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 B+ ^7 d8 d& @1 _. N
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
2 n: {. j- {1 ], E) a, I* f. W  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
0 |  z3 @0 q$ P7 F* @  temp = readl(IO_ADDRESS(SPCR_ADDR));) _1 |9 |0 U# T0 m1 s5 e; S
  printk("temp=%x\n",temp);
# ^+ t; d  R# S& h+ S3 B% j  udelay(100);
# k2 {& [' c- s5 _: e' ^( h
9 t5 `# @+ `3 u- p+ _5 m5 t* t% v  //set GPIO direction
0 k6 I" K! V8 }5 w; g3 n/ P   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 b/ a/ H+ w2 ^$ I" L   temp = temp | 0x00000100;//EPR----input4 @( Q9 T' \4 d2 \5 ~( U
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output6 F* v2 J1 I) d/ X2 d# o5 R, O
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ |7 d$ t. `8 |7 I: M# w% b3 k
* A: ^' U# q- O4 J3 n7 m
   return 0;$ y. I' F: ^- Z7 K. P  A+ i/ e
}) N( D* Y. f! q+ G
static void __exit MCBSP_exit(void)0 I% `0 T2 L( f5 _3 \) O
{
7 [& i7 A/ S) L4 ]$ ?( v   printk("mcbsp chrdev exit!\n");% z" w2 {; M& Z& R, @+ p$ @
   cdev_del(mcbsp_cdev);
$ h# T2 t+ }9 n* G9 C   unregister_chrdev_region(mcbsp_dev,count);
2 z# B+ i2 e% X5 p$ T% t. ?   device_destroy(mcbsp_class,mcbsp_dev);
2 m1 ~( l  P4 i1 e, H* z" }$ k( a! c! \  l   class_destroy(mcbsp_class);
7 i: j; p! B3 H8 X9 a}
2 M; i2 C& O; U8 r* z# R5 \module_init(MCBSP_init);  A: u) |0 s# ~- c4 {
module_exit(MCBSP_exit);- }0 V2 b& |: o- y3 ~+ {2 i
; W6 e6 U$ E7 j( u% L+ J3 l% E8 ^
MODULE_LICENSE("GPL");
( j) t$ p) t( ^" {  |8 U) V8 c* ^+ g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( t' b8 p: [% T. u0 h- p我的应用层的测试程序如下3 ^! g9 C' m$ p: U1 i9 }& E& f9 G
#include <stdio.h>
4 _) e8 w/ s9 R& R! D#include <string.h>1 H! e. y2 X. g, K
#include <fcntl.h>' k( S; _4 s. W
#include <unistd.h>
4 q: |! D4 z0 R2 m; m+ S; T#include <signal.h>7 n4 W3 |- @) |7 Q8 ~# ~, J+ f( H1 A
#include <pthread.h>       //线程
) }8 ~' C. ?( J#include <stdlib.h>
! T( S. C: |' h3 S) g9 d#include <pcap.h>          //捕获网口数据
2 [+ V" c1 D! _# O. Q#include <semaphore.h>     //信号
! B" u! \0 l+ n6 k4 i#include <sys/types.h>     //消息对列
' D- U+ ~9 s% o+ ]( R( \#include <sys/ipc.h>       //消息队列; C% \: H8 i4 k3 v
#include <sys/msg.h>       //消息队列3 }) i( E* O' I7 Y
#include <sys/select.h>, y& P: m+ T8 F# }' y9 x
#include <sys/syscall.h>+ |0 H& w2 ?: Q$ v
#include <sys/stat.h>
) L" T# V" R3 h6 m/ j* r#include <sys/mman.h>
; {2 S* K4 N  [& q9 ^9 r#define msleep(x) usleep(1000*x)
/ o# z% K$ T+ Z1 \* r, z( ]
: l* V/ A; ]: y6 {5 Bint main()
3 N2 M* P- D4 m' X: G{ & L; s5 [+ a  O6 u8 w' E5 R: ]
    //MCBSP,ARM与AMBE2000交互设备
  J: q  Z" q. E  X, ]# o! a6 ^ int fd;
* }! N* P: p" q( Z+ d( C unsigned short data_write = 0x5555;
  C; e8 i+ t4 R+ ^ unsigned short data_read = 0x00;3 t6 M& a  T, H( }+ g9 ?  t
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 X, Q7 \! s" k, ~5 S; c2 T7 H
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 V0 f- t2 [8 w- {8 R) V
   
  g& X/ O. I% W9 S' s  if(fd < 0)& g7 v( `8 K  M' d) w$ \" m/ I
  {
; p, R# U  J0 }' R5 ~0 a# F, z. H     perror("open failed\n");
; _- `1 Y9 T1 a/ L- ]     return -1;
8 u4 W! V" ^6 z0 T7 G  }
5 z# t  q& d# \! J  1 K' ?4 J) z$ `# A1 v
  while(1)( _1 M! g& @" M" o. }  F
  {, Z& v9 c4 H% Z- c$ T) N7 u" l, I
   
" t$ x. N$ S3 d' a   //AMBE2000每次读写是24个字为一帧
2 P. F' G/ H9 l$ l$ O   //写数据时将数据在底层存储起来,等到中断的时候再发送
. s6 C3 M* v- T+ e) X   //AMBE2000输入数据是以0x13EC开头的' O+ `5 K! u: E3 G5 r
   write(fd,&data_write,sizeof(unsigned short));& _/ C/ |& Y/ l3 Q' F4 l
   3 @) i, s) K- D" ]! G% y% y. H
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
2 ^8 X9 |" j4 f* J. Q   read(fd,&data_read,sizeof(unsigned short));
) C) X& [5 F% O' z% }, X   8 K8 d# h# P8 N1 }
   if(data_read == 0x13Ec)
# t3 d1 t3 W) h5 z" ]9 I: X   {9 ]2 [5 W2 m, M2 y5 ^) C0 R) X
   
) u: }. n* g, s" ~3 p! F* w$ l9 G0 \    printf("data_read = %x\n",data_read);
6 T& G: i9 ?& ?: {, J   }
7 @0 c) a$ i- T! p   5 R0 v0 v) p  m- ]
   msleep(10);0 H* |; g# _5 K
  
" [0 Z& a' C8 L; ^/ [# M) B  /*
8 L: b0 ?# u1 J' I: R/ x  q9 c   ioctl(fd,1);   
) R6 X. e+ f: J1 Y' A# s3 U% w sleep(1);
9 {, u  q6 t- t# R( u/ H/ I/ n# P ioctl(fd,0);
1 z6 j4 S" V0 a, T; }# I$ ^ sleep(1);: ~) _! W5 a# \
*/
0 W& k' n1 h7 O5 y' @& u& X% U! w  }   
$ ^5 ~8 E% ?; T return 0;
7 ^( O, U+ Z: M2 B. ~ / ~( {+ _  A$ L7 J; N# y1 p
}* I4 K* m/ \8 P1 M1 c) j0 ~
/ n+ Y7 R& z# w6 g, n. A
多谢各位指教,谢谢! 急0 b" V' u+ z& |" q) \2 E( i- c

) F% t! y1 R6 F4 D& x6 O+ i: q+ _( Q$ d& D% F5 B+ E
* ^! K2 K" P! t' |% i2 c
3 E# s; g! Z! U% R
. G3 O* T* u/ V: f7 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 02:59 , Processed in 0.049568 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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