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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 l# |$ z+ o7 `% H2 i& C+ t8 O, W( I/*
" C' `; S" k5 Y% p* ~8 A5 [ * Copyright (C) 2009 Texas Instruments Inc9 l  Q6 P8 p6 Y% y; g
*' ]7 h9 g: w. n: r- D
* This program is free software; you can redistribute it and/or modify9 q9 Z6 M# b) F
* it under the terms of the GNU General Public License as published by; ~: A7 [; B8 Q3 C1 Q
* the Free Software Foundation; either version 2 of the License, or" w, y9 I( g  \( m
* (at your option)any later version.
* J" n! l# _( s3 G9 u *
$ m" o# N9 R4 e. J* a% W2 M * This program is distributed in the hope that it will be useful,! S; K5 @' d+ ?5 }0 D% b" a
* but WITHOUT ANY WARRANTY; without even the implied warranty of  p8 r- R2 ?) V( x, @& d& P
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 _( W3 G  x# Q6 j, M+ ] * GNU General Public License for more details.+ ?: S  \1 I3 [" W% k* _
*
5 O/ l  r! X1 v * You should have received a copy of the GNU General Public License
1 q6 E, h/ E; z6 J, Q0 Y' F * along with this program; if not, write to the Free Software
! t' l  S6 j- p% k' `, P$ s4 S; k * Foundati6 P( x$ m7 V! z. w
*/
$ K" {9 n9 k3 P#include <linux/module.h>7 j% U# A: E# K: C8 |# S5 G
#include <linux/init.h>
4 A6 K. m4 k( [: _+ `" ~#include <linux/errno.h>. [7 p7 K% x# E/ L/ {
#include <linux/types.h>' p- y+ l" w, q6 a( Q
#include <linux/interrupt.h>  S3 H! Z5 X; Q; J( |
#include <linux/io.h>
/ B# i  g7 ~6 P' E; n# w8 z#include <linux/sysctl.h>; f5 [& T) [2 p0 \- w1 t% G7 ~( _
#include <linux/mm.h>3 X8 H4 E* \9 j' v
#include <linux/delay.h>
  z; W3 h  I2 i! g+ z  w3 m7 h#include<linux/kernel.h>
, _0 O. ~0 `; f#include<linux/fs.h>
' O: n6 U) l/ K' f7 D#include<linux/ioctl.h>$ i) R5 [  B  ^
#include<linux/cdev.h>
1 R4 U, [3 Q# g* r1 j# {#include<linux/kdev_t.h>
! h& `' C! }2 y#include<linux/gpio.h>
1 _" U1 N& D, u6 ?; T. I) R1 }#include <mach/hardware.h>. X" _4 ]# G. B; Y% R9 s! Z( N
#include <mach/irqs.h>
( f" R8 Z# G7 O) L4 h; o
# J$ @* |8 S' K$ {3 p/ H+ P#include <asm/mach-types.h>
2 V) B3 r# {" A9 e$ {#include <asm/mach/arch.h>* u( m0 a: p9 R* e! B* W  @; M
#include <mach/da8xx.h>
* p  h- ?# |, t#define  SYSCFG_BASE   0x01c14000
9 H5 @) Z( G; M5 K#define  PINMUX1_OFFSET   0x124 3 f( y0 @# H; n/ b& H: A
#define  PINMUX18_OFFSET  0x168
' b- o) V; A6 f" P' q( g4 X) w#define  PINMUX19_OFFSET  0x16c
7 N7 Z0 Q3 i, W( {& Z# _#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
5 q& E- _) W# J3 Z" R$ y1 e7 M#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% e, T1 |$ z/ y$ F# ]) [#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR, r* H' b* L9 X0 h) q$ w$ d4 k
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR) ?+ D; A7 M% X4 q4 z' t3 k
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR2 H4 t; Z1 A% _
                           
0 _/ h. h+ K3 w! f! o5 Y#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
1 Z2 G3 |5 [5 e( Z' ^4 z! O! z% T#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
5 p+ ~7 Z( N! o0 l//PSC) E+ L, W  O' U' c5 G0 d' J. I
#define  PTCMD_ADDR   0x01E27120  
& B  h) n: E* {. ?  v#define  MDCTL15_ADDR 0x01E27A3C
, o8 q- v# B  W5 w& @#define  PDCTL1_ADDR  0x01E27304( V; f3 A6 i4 h/ U
//GPIO8 direction
: x/ L) ]0 W1 ?& _/ R' W9 s#define GPIO8_DIRECT  0x01E260B0( n% h  K  W3 U5 {) B, t) c% a8 @
#define GPIO8_OUT     0x01E260B4: C3 `. z- ^( [7 U/ W, d- X
#define GPIO8_IN     0x01E260C0) |: ]  Z- P; F

# c! o6 W9 U" q- F/ S6 t8 s. x//#define MCBSP1_RINT    99              
4 |6 k( G. g0 n) O% x5 e//#define MCBSP1_XINT    100  % |  e% k; \% ^5 M' p
static int MCBSP_MAJOR=239;; {) U5 t1 ?) @' i% g; }6 R; {  s
static int MCBSP_MINOR=0;$ J$ k  k% e% `% p, H: K, B
static int count =1;, H/ y" z! X; W8 v; d

% N0 M$ [6 ?% o' d( a' {' h#define MCBSP_NAME  "MCBSP-device"
$ }. ~& J" M7 n- F
# C+ r- y# u7 Z4 a# J1 s1 Ustatic struct cdev *mcbsp_cdev;
+ n# |+ P+ v; Q3 i  Cstatic struct class *mcbsp_class;' N9 E- q' M1 H5 K/ D% J
static dev_t mcbsp_dev;7 v8 o: M7 h2 Y" T' C; j
unsigned int DRR_data;0 V& ?) L# K/ d, E7 _
unsigned int DXR_data;' n; b5 Y, n6 `$ f
static int mcbsp_open(struct inode *inode,struct file *file)
2 z& I  Z7 x1 _% T{( R9 `# n6 [' F" @
   , {$ k# w6 _  Q8 O5 \, e9 p
   //interrupt enable,initialized
3 F8 ^2 A" H- p5 Y2 L0 ]   unsigned int temp;
3 R" \9 Z9 q4 B0 A9 o# r' e   //SLEEP_EN(GPIO8[10])---0
7 R. U2 @0 y) s6 i+ y( }8 g: a; J" p2 H   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 A6 G2 R9 y" `! H6 l! k% Y
   temp=temp&(~0x00000400);1 m2 i4 P2 @$ M  t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]7 G3 M; d" T  {5 B& Z% Z1 ?2 X
  //RESETn(GPIO8[8])----0----14 b* D- J4 ^. r; p7 |, {
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# ^  d- E6 j/ j) x* X
   temp=temp&(~0x00000100);
- ?; A1 c3 `9 i   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 h* g! w  j  [! K8 S   udelay(100);
; v9 y/ w& U2 T   temp=temp| 0x00000100;; B& H% }0 L1 D$ W- y( r
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" V5 |6 b* K" }% r7 _   udelay(100);! W  G8 c" S) R8 u
   printk("open success!\n");
6 C" B  J2 K0 x) j) I$ D! j   return 0;
0 H8 U4 z9 A3 [( ]: S}, i4 U+ ?/ d8 x- c+ U

7 b) `3 M4 c$ b- X3 E+ Ystatic int mcbsp_release(struct inode *inode,struct file *file)% l* z! N6 G' I3 }& a0 @! X$ ?
{) a& I* o2 D3 q. T  Z
   printk("release success!\n");
! ~* b3 k# h. G1 _+ Q$ p   return 0;/ M" O' k7 a0 n: N. Z. p
}3 {' K7 q/ o& S. p$ ~' L9 I7 N

% h( `7 j) H" G0 O7 Bstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! i9 c; r3 O8 Z) ]2 A{
, w: ^4 a( D- M* _    copy_from_user(&DXR_data,buf,len);3 l9 ?6 t% ]% T  f9 l$ s2 U( ?
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ( O% L  ^1 J4 ~, w! L3 _" U
    return 0;
/ l6 ^6 J1 S% S6 m, l
+ A( s- L" c2 |2 o" G- Z  X( L}$ Z. f7 L' v; A! r4 [* j4 {; S
& k+ h  o; o/ t( a
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)) m8 m8 |- T7 D  A# u
{ * W0 D; R' L+ h; \$ F
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 o1 J$ x; w4 Y6 w1 x$ M  ~
   copy_to_user(buf,&DRR_data,len);
" f; s, K" p7 E1 Z+ M# o' S   return 0;
3 h8 Y; ?) Y/ ?}8 c# G3 Y! E5 N" l- m6 C
' f9 s% t/ O6 ?$ T( `

6 L* U3 P/ K8 I3 E& b8 N$ y* H; astatic struct  file_operations mcbsp_fops=1 [# |  F- x7 s8 x
{
- |& h6 m' D7 l' q& u0 k0 H. |   .owner=THIS_MODULE,; l4 c: v% z. o+ a$ U
   .open=mcbsp_open,4 k; T8 r0 |; F: @, o
   .release=mcbsp_release,
" \) ]/ l/ v/ w# ^' ]   .write=mcbsp_write,
7 ~& m0 ]% p2 S" Y: [   .read=mcbsp_read,% w6 h% u( i, K4 @# C
};
/ t$ i+ Q5 V# w/ wstatic int __init MCBSP_init(void)5 ?- Y/ P6 u) R
{
, E- p( m& i6 {" P5 F3 \- B. o7 e   int ret;
! T; I0 s, }# c# b0 x8 ]   unsigned  int   PINMUX1_REG_old;9 a2 L+ a- g/ |3 q( A# @
   unsigned  int   PINMUX18_REG_old;
4 v' o5 P$ ^/ S5 k   unsigned  int   PINMUX19_REG_old;: M; V2 I5 q9 y0 ^
   unsigned  int   temp;  8 Y) X3 I, {( h* U# h
   if(MCBSP_MAJOR)5 Q# d8 Q$ _- O& s3 D
   {1 A4 }8 |$ ]' z  S% _
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ V+ J0 s0 }# x0 n$ I4 [7 }; x. x
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 i& c  H7 {. Y4 g( W' c
   }
: b( S* D4 z( F% r   else
/ y5 S% C7 J9 R+ l- ~5 L2 j, l4 h4 l   {( w0 M! ^$ V- F* J' o
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 f; M7 x/ U2 k# U5 c; L
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
* u' @0 H% y8 D7 D( ~8 V6 ]   }
  J! j3 W9 }, W$ V  R   
3 s5 w) R1 {0 z# D# N( K8 |+ ^1 ?3 p   if(ret<0)9 L$ y3 |* Z% V
   {# a, ?5 K/ b8 d1 J' B* W
      printk(KERN_ERR "register chrdev fail!");6 \6 z( x! U; j4 ~  i
      return -1;
1 M: l- o5 C7 \# K   }$ a2 t' V. J8 u- H
   * w( ~* K, [, G" Q) w; J& x
   mcbsp_cdev=cdev_alloc();4 d, @& l  d4 x* `/ }
   , y9 Q" y0 [1 j
   if(mcbsp_cdev!=NULL)
4 ~2 y1 t9 m; }$ g  ^. G, k9 P  h   {  p8 x( A9 K* _* e/ e
      cdev_init(mcbsp_cdev,&mcbsp_fops);
0 S: V1 b" {& F' P, w. l1 u( `$ m% V      mcbsp_cdev->ops=&mcbsp_fops;
9 L# i8 c9 K8 O& w( W# I      mcbsp_cdev->owner=THIS_MODULE;
! w2 A. |7 y1 g4 l" ~: z7 c      
- p% X. q" e) x' _      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! Q. v* K8 U/ \) r          printk(KERN_ERR "register cdev fail!");6 H, {; F  A4 v" X. P- i
      else
" g8 ]5 f+ c7 r  o: m6 L          printk(KERN_ERR "register success!\n");. M+ g. a9 K! |9 d  K
   }& v& d4 y( T, w) Y/ ], }- Y
   else
/ w* S) |" _. d6 m$ Q% P$ F; J   {
6 G- u  x8 G; R      printk(KERN_ERR "register cdev err!");. u' f. t; N& Z1 p) E
      return -1;
# ]1 r" H0 X, \: K8 F   }/ M. ]6 }: h9 a% w# s
   " t# \4 Z5 ?+ x7 @- ~4 r
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ K% A1 w$ }5 Z' d' s2 l( I) b
   if(IS_ERR(mcbsp_class))
9 E2 ^$ D  S% E# e   {, q, B5 {2 j3 ]+ u1 ]
      printk(KERN_ERR "register class err!");1 Q3 m& b7 U% r& W3 ]. K* L% _
   return -1;8 b( r# v- U# Z7 h' g
   }' |, u1 M$ j- P# O& H' b' B5 `
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 D# c2 {. [4 p. U

- [4 A" E: U# u; ^. C7 g   //PSC
( i; M# C7 M! `7 w" \8 E+ ^6 ?! u   //add Enable MCBSP$ e* N- q) A/ f1 C# F& v
   //test
- \! m1 [3 e0 |" U; X- F8 h   temp = 0x80000003;
" m: x/ G4 d; n  Y% e$ H+ T   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 }+ y1 R) h4 \* x- D   temp = 0x00000003;- G! \9 {# F# X- _- s# \3 {
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 m9 F: I9 Z, N& A3 _: S7 F0 j 4 L6 m: h: F6 u) I0 [1 X
   temp = 0x001FF201;8 b' s/ k$ u0 c3 x5 k  X
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; ?$ M3 @7 }& H2 e- m4 J8 B
   6 ]8 J1 Z! Y; L0 D! ^) t
   //PINMUX  
6 t$ Z5 O5 O/ `# B% Y   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ c0 w$ `) J% x% y" r3 \
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
: S$ Y" h9 g2 Q' Y# ~% x+ |2 y   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ; `7 D8 E  y+ }. Z- a
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) t$ @+ S8 d- ~! w$ b& q5 n0 J9 m
   ( j# Y/ A" i8 L- e2 O. ~5 k+ L, E
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) C. H9 f% ~( n  b( Q0 Z   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  * @( G# Z1 r- q+ f  E
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   * [, F6 H% f& M( B' W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% M5 w7 K2 S$ H( p  P ! H: \6 B" H3 B/ ^
   //RESETn,L138_SHK2
$ ~7 X6 Z; n3 G% C   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
8 w2 U3 p4 ^8 n  h. J2 f1 k5 S   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ( H* \9 [, k: ?1 ?" |/ [9 Q
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# Z, f- ^1 ?* J; S* L
6 K1 k$ E7 e% \9 z9 s( y
5 Z9 T) M4 j+ y) T" ?( Z) w  //SPCR Register
0 ^2 D% F9 C  w( M  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- U. V5 a! U9 z0 z
  temp = 0x03000000;//(DLB=0)
* \# }: t2 B% F+ y0 l0 `0 L // temp = 0x03008000;//(DLB=1)  l9 w+ ]# P% m6 y# P# R; L
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ l  \; d! Y. A* Z
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  j$ M# I  r; Y! C- d% g9 f1 m% c4 G  printk("temp=%x\n",temp);
  {, e1 J, ~. i/ w2 K $ v/ |1 I* H) _1 f: M
   //PCR Register- g3 h, o0 X9 h+ p5 ^/ g
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( S" S0 V0 q. c( K$ d  // temp = 0x00000F0F;
. a& h+ Z% ?( e  temp = 0x00000B0F;
% F4 R6 J; Z4 |9 s& L  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized * C" Z, w% n; |- X
  temp = readl(IO_ADDRESS(PCR_ADDR));
+ o6 d3 H# e" y, R& ~' o  }$ L  f  printk("temp=%x\n",temp);  1 _0 Y/ k' o* N. o7 S
   //SRGR Register2 U! I! `$ d& d. P! F  B
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 U/ i4 k8 e/ X1 d( y4 R
//temp = 0x301F000B;
+ _( M( }$ J9 [* p   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
( u4 a! c& T9 X2 q' Z. O  temp = readl(IO_ADDRESS(SRGR_ADDR));
% b0 M. E; L; q2 P6 U5 I  printk("temp=%x\n",temp);) m8 a' M) N; `: m- x
   //RCR" b5 C7 ^! v+ |; s( q$ @
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% S; J; ^* ?, K: o7 G8 s9 v
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0: ?% e6 m/ k& G9 J/ ?+ V
   temp = 0x00440040;
: g: V+ l: N. V: W+ }: ?   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & D. B. [/ s' q4 G4 o% v5 M9 G- i( n
   temp = readl(IO_ADDRESS(RCR_ADDR));
' y5 s% l: ^, r: w" U   printk("temp=%x\n",temp);
$ v+ l: v7 b! n3 M3 H   //XCR% j6 |/ V' x9 D+ P+ o7 m
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( `2 e4 Y# |* S/ V
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* ]0 V" j5 ?) x0 m  N
   temp = 0x00440040;, J+ E1 _$ I  _7 B
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 c! D3 \, {  v/ H
   temp = readl(IO_ADDRESS(XCR_ADDR));
( l, O; K9 H. a7 K   printk("temp=%x\n",temp);* H( a9 P2 @. i( j, M% ?" C3 T
  udelay(100);
! P/ d' j4 j$ i1 V  Y  //SPCR Register, \" N) s% g1 g% z0 R9 _. z+ [
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-14 f. B0 _, N1 V8 s) M
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
0 S- \8 b3 K. n- H# m0 G  A* R3 H  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
) T' ~/ C9 J% {9 l9 o) O7 P  temp = readl(IO_ADDRESS(SPCR_ADDR));
% r# `- B4 G+ p3 @' ?) j9 L  printk("temp=%x\n",temp);+ \: P5 Q) R$ A9 W' m/ }
  udelay(100);" }: W+ a8 C6 e% u6 B# N
) p; u& f( S/ ^8 p5 c: h. ?
  //set GPIO direction
& z2 C9 e) R& U  T   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 K( _" q0 ^# ^   temp = temp | 0x00000100;//EPR----input
  I+ C2 F3 u3 G   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 e* a) R8 {7 _+ d# Q- J   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + g! s& S8 V) K3 r' u5 }) I  H

* J9 ]3 t; ?& ?  H2 y2 C   return 0;- g! P3 t! A1 \# M# s
}
! a/ ?- Z  g* z  H- E6 Kstatic void __exit MCBSP_exit(void)( R, c/ c5 V/ ]+ l
{' Y/ r# u- J  }, B8 K" \2 `9 z/ f
   printk("mcbsp chrdev exit!\n");7 H" B2 B0 L3 k6 C# A; Z& p$ Q
   cdev_del(mcbsp_cdev);
. n+ ]) Q4 h3 R# h   unregister_chrdev_region(mcbsp_dev,count);, D$ K! j* V/ E: N
   device_destroy(mcbsp_class,mcbsp_dev);
6 M* R+ ^: n6 v! |   class_destroy(mcbsp_class);' K) m4 k9 r0 [( D% U: a* b8 o
}
0 p4 e6 C* I2 Tmodule_init(MCBSP_init);! h. Y! v6 U2 ?, w7 b8 C8 a
module_exit(MCBSP_exit);6 `" R4 X. Q+ m, C) m, v
$ V9 X5 @% t: I. j2 f
MODULE_LICENSE("GPL");" N3 \, N6 A6 r( G6 v- e

  Z( B# m6 X. Y+ E: a# c; F9 c我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; ], a" Z! t3 G7 V我的应用层的测试程序如下0 F2 W9 H4 t% E7 d4 Z5 Z' d
#include <stdio.h>
8 {. a$ b, \' I9 ?#include <string.h>
0 o% T7 M4 m1 M+ l8 v#include <fcntl.h>
$ ~* Q, m4 Y5 U0 n#include <unistd.h>
7 E2 r8 B9 d! k* T: o; Q#include <signal.h>) O( z% ^9 o# B/ K
#include <pthread.h>       //线程# r  X  H6 W$ |( r
#include <stdlib.h>1 K6 P( V& {/ w. H1 X4 [
#include <pcap.h>          //捕获网口数据7 l1 \' P4 r0 A3 g; R
#include <semaphore.h>     //信号$ j' m3 T# b$ O* A; U
#include <sys/types.h>     //消息对列4 G7 ?8 }# w5 g: F! x5 ?
#include <sys/ipc.h>       //消息队列9 m4 f. n" ?: \$ R6 X
#include <sys/msg.h>       //消息队列7 Q" \" F. h3 Z$ d" Y0 q
#include <sys/select.h>
4 u0 c! T# L5 A5 v( P9 f) D#include <sys/syscall.h>- M- M  V# Y( ^" I8 k: K) A
#include <sys/stat.h>
# H1 V# L  ~+ S% o, w: D* u" ]#include <sys/mman.h>
* Q: P3 T) R6 r9 g7 G9 I7 S#define msleep(x) usleep(1000*x)
: ?* e* q3 }& G7 E0 d
- [5 A5 Z/ B& t. k6 H* S+ Y! mint main(): l% k! {! l$ j8 [- ]
{
: L/ l$ h% j8 L, W% p# a( ?6 o  H    //MCBSP,ARM与AMBE2000交互设备4 u0 H$ [) z+ {& O( w
int fd;
$ |; B3 X& o6 @' [ unsigned short data_write = 0x5555;8 k5 d( V" z2 A* ^! u* T
unsigned short data_read = 0x00;
/ b5 I$ K( L; M! \' M  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 j" F9 n: b% W) M; K( v
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 \, {) z* O6 Y: ]7 W  U. T    % A9 Z5 F: ]* w  U. p* o9 N
  if(fd < 0)
+ f2 U1 R/ U. W: b9 Q* l  {
3 p  R! p# [1 z1 K; X; C7 J     perror("open failed\n");: \  G- H& f7 G3 V, T, A$ j
     return -1;/ V0 G& n" a4 s  N- K7 a
  }6 |) ~6 M% [* Q' F+ _) \
  
; F4 G9 F/ j- F# ~  while(1)5 C5 F6 q- v+ T' _1 e# r3 Y: B
  {, Q/ L$ ]0 ^* x/ G
   % k; }1 Q& j- E$ O; l
   //AMBE2000每次读写是24个字为一帧
% k, O1 ^7 F: d+ V/ m# K   //写数据时将数据在底层存储起来,等到中断的时候再发送
; I% H5 L7 _7 A. e/ Y   //AMBE2000输入数据是以0x13EC开头的
0 k+ R  d: l5 A: T& [/ V   write(fd,&data_write,sizeof(unsigned short));/ B7 X8 n6 r# O- |' H" T
   
: G, ~% o( ~, C8 N) C. V   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
6 n* i1 g" ?2 z4 f   read(fd,&data_read,sizeof(unsigned short));6 C% S/ l, ^+ |  B2 K, {& v
   
7 z/ E& x- \. N2 z8 T5 I   if(data_read == 0x13Ec)3 q' ^& F# i; I$ \. J
   {
9 n6 q: }6 S5 R* W2 x" n   
! y8 @3 R$ R6 T. [    printf("data_read = %x\n",data_read);
. [2 J/ O5 y: g+ d6 l   }$ M* I* v$ h( q7 e: b# M
   % d7 ?. W* ]3 h0 i2 A- U' D
   msleep(10);: E9 V6 A- P1 [& D) n9 ^7 C1 r
  
2 I" [- B6 a; w  /*
; \% G8 J3 f  ]! d3 T1 @' O   ioctl(fd,1);   " v0 H8 T! `/ R. V- q8 p- f1 v
sleep(1);+ ^% I( h. U0 f, Y& t; \0 V
ioctl(fd,0);( P: W$ X1 \3 r* L' t0 y
sleep(1);% Z9 }, K! Z! e7 A& r7 n# T: W
*/
7 o" S9 ~, }% a( @! x  }   
! T: C, f9 l( q# r return 0;; s/ l$ v8 q: J

5 o' {  ]; ~# _  C+ g8 H}5 l8 `8 V3 Z# |8 K" C9 l) L4 z
" G) ]) J  G4 \
多谢各位指教,谢谢! 急0 X4 V2 Q- r# J' F& E5 g
6 S& X6 p: {; v. p/ x
. c1 j1 A2 g* J3 F' E0 u5 Q
. K" n$ W; X; a
  \, b: N) W+ K- j0 V
: a$ y, k1 `1 L; E; N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 19:50 , Processed in 0.048510 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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