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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 h# Y' a+ q" l& V; p: J* t/*
: G  e  f  k4 W* w6 _9 G * Copyright (C) 2009 Texas Instruments Inc- V; v$ _2 h. _
*
6 x7 o$ L1 a2 O. {# _  ` * This program is free software; you can redistribute it and/or modify. o. |0 a  c; h3 W% u+ W
* it under the terms of the GNU General Public License as published by
2 v, h( N% R# A6 n * the Free Software Foundation; either version 2 of the License, or( a/ i! U: E2 \6 P- B, O/ _# @
* (at your option)any later version.) b- R2 i( r3 D% L4 b; n
*
( N5 v7 h* O8 q- {0 ?) t: o * This program is distributed in the hope that it will be useful,
. L: t' J3 u% T0 M. u  Y1 y * but WITHOUT ANY WARRANTY; without even the implied warranty of6 w# u2 W: I1 k7 U8 A* L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
. T) H& t9 I6 [: q) J * GNU General Public License for more details.! C' _4 J6 A4 C9 D+ {+ O, m
*$ o( U) y4 G% i$ _
* You should have received a copy of the GNU General Public License
5 D' y/ t2 a! ]6 r: \6 N * along with this program; if not, write to the Free Software  k6 q8 u0 N3 S! \( t2 ?/ }
* Foundati1 N' o+ Z! i2 Q, M, Y1 w& O3 {
*/- G+ W, l# m* M0 v8 T7 u! k
#include <linux/module.h>
7 F. {  L2 T* H! ]0 N- s#include <linux/init.h>8 W! X! o8 T, L. K7 J2 J5 j
#include <linux/errno.h># F' e& ]3 V! V/ Q3 M9 w8 V* e0 y
#include <linux/types.h>
& C' G8 }' G7 F, c* m#include <linux/interrupt.h>
5 f+ Q: `% O- s5 ]#include <linux/io.h>
& l: \) r* b9 z7 Q! p#include <linux/sysctl.h>
- o5 [3 l0 I  E& s#include <linux/mm.h>
, M, L$ D5 }! L6 ]5 ^! h/ Z#include <linux/delay.h>
$ r0 h5 W0 }4 X# P+ g# f#include<linux/kernel.h>
  k: t9 N  H# P9 N0 r8 ^#include<linux/fs.h>
8 S4 i( ~, [/ |8 f3 W( d/ @% a#include<linux/ioctl.h>
% m- B% c+ G. T, b#include<linux/cdev.h>( f6 E4 I( w+ G4 D; o: B0 l
#include<linux/kdev_t.h>7 T* G( P1 \# C3 e' z
#include<linux/gpio.h>
4 f, Q% R( T' l; }! n#include <mach/hardware.h>
( J" v/ ^9 ]5 r' O( T#include <mach/irqs.h>
! m3 G+ y; M- q. b0 }. Y
+ |4 g7 o6 `( z0 O/ R, C#include <asm/mach-types.h>; T. _$ t) {" L. c5 E
#include <asm/mach/arch.h>
# F: ]3 {: ^  V$ g8 ]% J- D3 X#include <mach/da8xx.h>
0 [1 [! U( p. _#define  SYSCFG_BASE   0x01c140004 x" u/ x3 @+ D
#define  PINMUX1_OFFSET   0x124 " z+ D- v3 x3 o2 ?( u4 {9 S7 `
#define  PINMUX18_OFFSET  0x168 ( y$ J0 `. f" n9 N$ Q$ u
#define  PINMUX19_OFFSET  0x16c4 q" k" b" C) f; p. q& Z/ @
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
& r, a5 R% M5 q& h  r, _  a+ S3 g#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 j2 S+ R- V1 Q& B+ b# s
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR6 L  I2 ]; W0 e. Q; p7 N
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ _. Y; `; C% ?" S7 E/ s
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ {( r1 c" T& y: H( j! m& N
                            " R9 Z8 \- _! b2 s: D6 v% M1 S
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR- l" y1 G  e* F/ v
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR' {4 K/ h* n. \! f' O9 D0 j
//PSC
# e& @3 W' ^" C$ \& U* V& Q% r#define  PTCMD_ADDR   0x01E27120  & Y! L$ K1 ~' a  ^0 a
#define  MDCTL15_ADDR 0x01E27A3C5 U) u- f; i1 D# }4 o) e" E7 Q
#define  PDCTL1_ADDR  0x01E27304
/ s+ U) m0 T* ^. ?% ?% ]' [! R//GPIO8 direction
  A$ f" F* r; T* N& C4 X#define GPIO8_DIRECT  0x01E260B0+ P& w5 \1 y2 P, r: v2 ?# R
#define GPIO8_OUT     0x01E260B4
2 |0 U: q- i2 t0 I#define GPIO8_IN     0x01E260C0
4 l% o4 L- ?- A% b; m  x7 [$ d/ g/ Z
//#define MCBSP1_RINT    99              ) k% j, z2 \4 _# o! x0 D9 o
//#define MCBSP1_XINT    100  0 N& U2 \1 U( F! a! a
static int MCBSP_MAJOR=239;' `5 B) s* M' G7 k; P7 o! W
static int MCBSP_MINOR=0;! m( ~; t+ e- R5 O, \8 O
static int count =1;
2 p3 F# P9 r4 Z2 `# O* r7 L
0 _) G3 v; d8 ~: q0 I8 s8 P#define MCBSP_NAME  "MCBSP-device"0 W1 T6 M& G3 {+ Q/ H
1 g: k( m5 d$ b* n# |! j  |; |
static struct cdev *mcbsp_cdev;5 a" v, ]: N: l5 A. T. g8 g% [% [8 d
static struct class *mcbsp_class;
$ ~& G1 Q+ g* q0 k! sstatic dev_t mcbsp_dev;1 ^6 M$ r2 _% H" z/ L! O
unsigned int DRR_data;3 n2 L; V, C0 p8 A% o# R3 A" \( T
unsigned int DXR_data;% S. k% N: K! X: R0 x5 J, @
static int mcbsp_open(struct inode *inode,struct file *file)
( k' m0 ~  B. H- Y5 Z. p2 }$ s{; ?: R" T+ }) S% |+ z# t
   8 h2 s% S) _1 n/ V" l, c/ `0 \( L
   //interrupt enable,initialized' U1 x: D9 [. \
   unsigned int temp;6 Z$ `5 u5 ^1 u( I, Y9 w, W, n
   //SLEEP_EN(GPIO8[10])---0
* x& u8 K- H: m. V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 n( f! V5 v4 ^   temp=temp&(~0x00000400);
- ?- R1 b. O! x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( k& \2 ]% H! C% a* R% U  //RESETn(GPIO8[8])----0----1
) Y+ `+ P( g2 V' E/ N, V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" [; p  d! }5 L
   temp=temp&(~0x00000100);& U7 ?  T0 H2 J8 t9 T" M
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. u# P9 O4 I$ [3 \- H   udelay(100);0 F( q6 F* [1 {& m5 ?0 _
   temp=temp| 0x00000100;
2 Z( V  k, f# q+ N% X4 w8 t/ Y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ \3 q( A' r% |3 u, b7 @
   udelay(100);4 }8 I3 Q" n* e( |7 y. [
   printk("open success!\n");1 i$ N9 c2 c1 g
   return 0;/ Z3 o  p. N& w* S7 V3 b
}
: O' R9 B2 `$ s0 E# z& x( |5 K0 P1 `$ ]; n4 \! c
static int mcbsp_release(struct inode *inode,struct file *file)1 I; k$ n$ a) ?, h: `0 B
{
  K* n* r0 x9 Z" u3 q( b* s   printk("release success!\n");4 @6 R+ a; S  f+ x: Z/ I
   return 0;
3 i- c( q4 i7 k- {}
* g# N) ^1 Y( {
/ u* L  w- Y; G: T+ y2 Xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 \) b$ H% J  @% K+ x1 g! p, Z
{- F0 O9 q5 k. \+ ~% k  [
    copy_from_user(&DXR_data,buf,len);
( A* ^9 q7 N7 o    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
, i7 D  L9 S: U5 e. ~. b    return 0;
" L+ t# V) `: Y 9 W" [3 s8 M, ?8 F6 a
}
! b1 j- E2 Z& f' H- s2 B: y0 |- ]6 k' s# y1 |
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 w$ f  W" _4 \' y" [) ]{ ! k" _4 v7 l$ i6 x: `1 Q; ?, h: N
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: Z0 J( K6 U" F. B* G$ H+ r- V! z
   copy_to_user(buf,&DRR_data,len);
2 J2 d, B1 S* C" Q; l   return 0;; {8 s- j9 ~  P
}! m  J1 p# N! V: X
0 \5 }! ^$ u0 r6 `1 Q

4 L' q6 N$ ^# T* L- O7 _static struct  file_operations mcbsp_fops=
6 T+ Z, `1 R, Y6 h- D{; P! a2 u" f8 C' w$ d5 `# ?
   .owner=THIS_MODULE,
' N0 y6 c  i5 W: O8 I9 Y   .open=mcbsp_open,: N& L! \+ O, n9 J( B$ Y
   .release=mcbsp_release,
! S: C. T3 A) L8 v   .write=mcbsp_write,
/ r' a% }5 f; |% v. x: Y- @1 c   .read=mcbsp_read,* M$ D* Q& c6 {) J% v1 Z0 U* J8 `
};
( X5 o% s0 G0 q& astatic int __init MCBSP_init(void)
7 d  [, }: [, R! ]$ D( b+ s{  H: \" A" s0 n: e* z4 l
   int ret;# z! |; s, [! B' h7 j
   unsigned  int   PINMUX1_REG_old;/ j" b  r/ r% c* G
   unsigned  int   PINMUX18_REG_old;' B5 \2 u& W6 K3 Q; X
   unsigned  int   PINMUX19_REG_old;( l0 j5 _) e: t. {
   unsigned  int   temp;  9 J  J% b, ~* ^
   if(MCBSP_MAJOR)5 x  e# K; D! j8 ?% z
   {
& [, D# L# u! ~9 ?3 L$ I2 o* @      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( c0 i" v+ W( F. N8 A
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: f1 f  [" P& e   }  W6 ]( f; K. y& Y
   else# V/ j/ W' _( e4 a+ k
   {" t8 h) `9 ]  c# E& B
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; D* A0 V/ E# c4 y6 S& p" Y- \
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
4 R% s+ }$ S. j6 B; P   }6 b0 k, l3 T/ d8 m
   
, Y3 ~% W1 T2 ]7 X! W. C* a- i   if(ret<0)# J8 [, g1 j! z' V2 Q& ~! t% q$ H
   {
: v3 X+ P: S) l9 z9 Y      printk(KERN_ERR "register chrdev fail!");
7 n7 n. {& O6 L9 [4 z      return -1;9 |; ^, @' {5 }% y
   }  ?$ y  e% M3 `* t0 \
   
: _  p" ?' g, ]5 Q$ r! I+ S% h   mcbsp_cdev=cdev_alloc();
  [* c# b$ ]: A( ^; b8 b   ( h9 G: g3 a/ o
   if(mcbsp_cdev!=NULL)
, R0 y) M; Z0 {$ `   {
* Q0 {( X( D" J9 T      cdev_init(mcbsp_cdev,&mcbsp_fops);( x6 W% x; V( ?" j* z# C$ `9 G- d) H
      mcbsp_cdev->ops=&mcbsp_fops;
6 K# v2 o7 L9 K! l4 J- z      mcbsp_cdev->owner=THIS_MODULE;9 b3 ^' ?+ V  b4 g" v
      
! s: j4 C) b2 L1 J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# Y: O5 |2 a. e  A- t  n* S- [% D
          printk(KERN_ERR "register cdev fail!");* P# f6 K" r) H1 Q
      else
) d; m$ a1 u; H6 Y5 y" \          printk(KERN_ERR "register success!\n");" T  [$ L* M2 H' s, I9 |( B. U
   }+ v$ g7 h' G# Z6 w+ w+ ?7 [6 M
   else) ?0 C# v3 P& t' E, D
   {
5 B! I! F9 [5 I! J7 x4 G      printk(KERN_ERR "register cdev err!");+ z4 [2 Z# U* C6 i
      return -1;
0 m9 w/ X6 x1 Q( M8 q   }& [/ ?5 l( n- x0 [
   5 Y- D2 G! D2 I$ k1 y& h0 F# U4 Q: ^
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( N1 i; Y6 I, q& h   if(IS_ERR(mcbsp_class)): r7 Z- Y& _/ q$ q  G. b
   {& C+ w: j+ m  O) C: R; z2 K; J
      printk(KERN_ERR "register class err!");
  B7 q# f( H( |, h+ h( }9 D* t5 k   return -1;
) z; n4 z2 {. E/ e   }7 ^/ g# O3 j# `9 t# z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ Z) v# Q0 S, _  s, ?/ ?
/ a; g+ a) {' S. \1 a
   //PSC) Q6 l) Z. d3 ^" }
   //add Enable MCBSP
7 T' |: H& r$ Z+ E- j: s' d   //test8 e0 k7 ~0 X2 o9 e
   temp = 0x80000003;: h/ L* z2 S9 Y- u5 x
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# p5 b2 Z& v- _   temp = 0x00000003;! `4 u( b" f6 @4 R
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
  y# m. x3 A7 @" Y
: n  t# {1 w: I4 Y3 t, Q) m   temp = 0x001FF201;
8 T0 ~/ Z8 O: J5 p3 `   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ Y$ ]. s+ K: T. R- W   ( m0 r$ Q# m& F  I1 i) v' Y: T" Q6 x
   //PINMUX  
* D- i4 j6 p' |3 v* |4 c. v   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 u3 g4 ]# J% e) v9 O; Q( k5 J
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; ]  K! Q+ P/ ~
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - r; Z! o7 r1 z& l# o7 G" F
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# C- f7 \9 `/ J1 d" u
   
# i6 F2 O4 `# o, H   //SLEEP_EN,EPR,L138_SHK1,L138_RC
9 Z' _5 p8 W1 C& a, e   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
2 j/ w0 G. q/ ^& j9 N: K) C0 F   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: ~2 o  y' J  i; ?. I" A+ z   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& Z/ e2 K$ G5 Y# ~ ' k# M" U* H6 j  _3 Y
   //RESETn,L138_SHK2( {) E+ i. A5 }0 F9 `* S3 H* S
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
* f$ s5 u& J! N2 @) @; A& U4 W   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 |5 \6 U- }+ X+ x8 Q   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 T3 J+ X3 o0 s; ]) m
6 _6 z& J/ j: x- z
9 B7 S) H* D$ q+ U6 O2 o$ ^* b  //SPCR Register
  }9 v# C2 ~  p* Z: H7 A& g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 s/ N) D6 K8 f8 D$ E2 X0 J1 w  temp = 0x03000000;//(DLB=0)
3 q6 @$ X" W) K2 G // temp = 0x03008000;//(DLB=1)' G. Q5 ^' S* [
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset" q9 M& y- e$ G, @. |% M
  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 F  K7 j4 B$ ]" o' @( h  printk("temp=%x\n",temp);
0 i& T- |5 e1 _0 ]! o& C% B
, F  N* L, O0 @6 M; X) J6 a   //PCR Register
0 P5 s1 @( r+ \/ U- E   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 t" L* [7 z7 v+ q" Z
  // temp = 0x00000F0F;
( n4 K. k' a( d8 v( y  temp = 0x00000B0F;
: m4 ]+ O) U$ ]8 t# g  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
; H9 l" K8 |, R5 q+ `4 b% N  temp = readl(IO_ADDRESS(PCR_ADDR));
7 ^) ^% T, L3 C" |8 o' E  printk("temp=%x\n",temp);  ! Y2 ]6 o& q$ }9 v) `
   //SRGR Register
1 q# V( N! E; U   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ F2 r5 t$ N5 I) I; p$ I7 @
//temp = 0x301F000B;
  E  d' G* }; W1 D   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized $ _7 y. k/ ?% ~3 h
  temp = readl(IO_ADDRESS(SRGR_ADDR));2 H* b5 l& m6 x& P1 m- _, b
  printk("temp=%x\n",temp);
" t. B$ x: ^  b   //RCR
6 t- m( a& E& M$ @3 a% h3 P' d) d# j   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ r- z# y1 ~. y6 [
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' a  ^" r  F6 j5 e% ?
   temp = 0x00440040;
3 L) X3 @$ ~5 Y   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) p# f$ F, f$ ^$ b% F
   temp = readl(IO_ADDRESS(RCR_ADDR));. ^: Q8 i& c+ D* ?& V
   printk("temp=%x\n",temp);
1 L- B5 \, G2 X% ^   //XCR
  h2 l. f0 x6 h3 l* `! q4 ]   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 ?! ^' P/ h/ I. R) \0 U
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0  a$ h# _, H5 E& A/ J6 g
   temp = 0x00440040;& o  h; r; Y1 @
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
/ m+ ~, d7 d6 z+ t" q   temp = readl(IO_ADDRESS(XCR_ADDR));
# H. H* }! Z2 d% E. T: t   printk("temp=%x\n",temp);' J' M- S/ d( X: P8 p4 N/ F7 Y
  udelay(100);% p) h$ E7 W6 L
  //SPCR Register
2 K. h2 O3 F5 v& I  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- g0 `/ C* w) e
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: `' ~% _0 c  b  z5 ]6 @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 T' V8 v, P+ d# e  S  temp = readl(IO_ADDRESS(SPCR_ADDR));. Y) C8 v$ B, |1 M9 p
  printk("temp=%x\n",temp);" {. }, `0 C/ M4 z. J) J( l
  udelay(100);
" U; N2 B: @; z% J# Z2 N0 @5 ?
- S( i) _& G' U4 z# K* ^  //set GPIO direction
# j: P2 z# o8 ^; [  t& W   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* n# j6 B) y" `0 u* ~& \   temp = temp | 0x00000100;//EPR----input
+ b$ j( q; N* e   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; L1 I) x* c9 ?   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 {0 s* T% Z1 e
: E* O- C0 ]! g6 A& r   return 0;. ~0 h  K" Q  j
}0 f. U% u. Y7 W
static void __exit MCBSP_exit(void)
9 W& O7 M  N2 S4 ?{
5 x$ r( W# j. A/ @( w+ R   printk("mcbsp chrdev exit!\n");
9 z# L$ U! H0 P# W1 u+ G( M# k. T   cdev_del(mcbsp_cdev);1 _. m! }* O6 c8 l4 U$ _8 W/ @( P0 S
   unregister_chrdev_region(mcbsp_dev,count);
5 G+ w6 L2 \0 C: K8 G. q$ a1 _   device_destroy(mcbsp_class,mcbsp_dev);$ A2 d! Q7 ?1 w+ j* R- `! ^
   class_destroy(mcbsp_class);
! p- V0 f& ~3 {}
- j2 z2 w0 V, M+ F. x; {* t0 _6 ymodule_init(MCBSP_init);6 Q2 H4 l/ G4 L
module_exit(MCBSP_exit);
' x2 n, |9 r5 z' U0 v- A7 x: ]% @
6 y3 z, S+ c- G$ HMODULE_LICENSE("GPL");
9 `2 Z7 ^4 o1 e$ }% Y3 K8 _5 M! M* t5 G2 y+ m. O" N
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. P4 j/ Z1 }4 W. |* a5 X3 N
我的应用层的测试程序如下6 d+ w9 C/ e4 ^
#include <stdio.h>. U1 r+ y9 t/ i
#include <string.h>
* i/ A/ o( Q' v2 a#include <fcntl.h>6 R" ]1 w5 U3 [4 U0 M
#include <unistd.h>
+ |0 Q; R2 `! \( g( ]#include <signal.h>
. n( y2 d) l( }. @6 F0 p! X#include <pthread.h>       //线程3 }, B) Z  A) L7 g4 y. v
#include <stdlib.h>
" i& ~+ c. ~5 u* I6 s#include <pcap.h>          //捕获网口数据
3 h3 ]4 c; R7 u! z2 q% c#include <semaphore.h>     //信号5 t$ g' D* v/ c1 k7 I7 B
#include <sys/types.h>     //消息对列
& N+ y0 C0 g. M: U#include <sys/ipc.h>       //消息队列( X2 R. G! g  G; L/ @
#include <sys/msg.h>       //消息队列/ w; S+ |' G5 L
#include <sys/select.h>. }- g: U. i/ B% X. ]* T' u
#include <sys/syscall.h>- j$ s: [! I. C2 J, C- v" W
#include <sys/stat.h>1 e: L. b2 o' l* g# g) L" c7 v
#include <sys/mman.h>0 j( H2 S* A0 u- h
#define msleep(x) usleep(1000*x)0 Y" z% w  v: Z# l# Y+ [
4 W7 B& w! }6 K. X+ [) _3 }# r5 z
int main(); x8 t9 U. M8 c9 e5 d
{ ) s; L0 v, m0 Q* @$ N% W
    //MCBSP,ARM与AMBE2000交互设备4 A% g% p4 o& G6 \
int fd;0 j9 P% W  n1 {/ ?" G
unsigned short data_write = 0x5555;
& B0 b1 n, n& q( Q) `' o7 B unsigned short data_read = 0x00;" g+ X* d( f) I+ @- J
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);' @0 l8 \' M: V' o+ E" s
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 s# a  q  G& f- D3 H" }  W
    3 P" M8 c/ R" l3 d; z" ~# @
  if(fd < 0)
5 Z8 |  M- _5 R. a8 _' A  {
! N! t  U6 i* n: \     perror("open failed\n");' b6 Y/ M$ F; x3 c3 ]
     return -1;
9 ^. s; \, D4 S4 V6 l  }
; \/ l6 P. \2 K, v& }+ l  
5 ?: Q& B0 k( P8 S! O  while(1)
% m5 I( c& ~# S6 Z  {  J- h: l* m/ ^: U8 J6 Z, l3 a
   2 C# V) c! Y" d, \
   //AMBE2000每次读写是24个字为一帧0 M+ k! E, v4 l, b" p6 [
   //写数据时将数据在底层存储起来,等到中断的时候再发送8 n5 M$ ]6 S# e& P: h
   //AMBE2000输入数据是以0x13EC开头的$ S. O+ j/ w/ N7 m
   write(fd,&data_write,sizeof(unsigned short));6 M4 e( f  C* V; ]) n3 p9 m; |* C
   . k2 I) x+ c( ]2 I* a: j% K  @
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
) r3 T: R3 a  x   read(fd,&data_read,sizeof(unsigned short));. m7 v3 n1 b  G7 G6 ]$ U
   
& o6 ^3 b. Y. i   if(data_read == 0x13Ec)
7 S: U9 ^# r: f% y- z9 c; T   {
# U" c- N) f" |5 C. S; |   3 l8 j! H8 h! Z
    printf("data_read = %x\n",data_read);& ?0 u; g3 U0 g; o* ]
   }
8 y+ F- n- Y& c' L" D; L$ ?  C6 p   
1 t( }, r2 F- Y, e- q* q% N7 P9 I   msleep(10);- ~4 J2 \6 |4 c
  4 _3 q5 R! O: }$ r
  /*
9 d. C! I) l- D: y  Z) S   ioctl(fd,1);   . c7 `7 C# c2 \  t( D" H' Z
sleep(1);9 ]* L/ u4 M3 s% {
ioctl(fd,0);% q! _% o- \0 U! d" q9 L
sleep(1);- b" E% r, m5 h
*/
% ]( W, Q* H! D$ ~  V- ^6 S6 X  }   / N( _# F* b. Q# h7 O3 `! j
return 0;
7 O% t  ?( a5 U" {: M, b2 v % T+ C' U( n1 E: L2 R2 d, O+ y3 E
}' ?/ n5 Z1 W* F' {
0 |1 S: j: Z$ P# g/ V9 A) N- z
多谢各位指教,谢谢! 急
/ a' M0 Y3 G: V3 y  l. B  a0 p
2 c8 T; P' g, U7 Z% F
$ m# H- T) J- q" r' h" o3 I1 }! g: P9 R& l' `- V1 B
  ^* ?2 T" T* n3 w- k
3 i" e' r( Z, J- o" X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 02:23 , Processed in 0.047493 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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