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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) G( @, Z; }, F9 b9 E/*0 @7 r  A, v1 J, B% q( K
* Copyright (C) 2009 Texas Instruments Inc7 _8 L4 F% @5 W6 B$ J- N2 I  e
*+ w0 |3 U: Y" X: ~  O2 R
* This program is free software; you can redistribute it and/or modify
3 ]5 D6 }; m; G' \ * it under the terms of the GNU General Public License as published by
& J# Z% G% V9 A& r8 O) M. O4 Z * the Free Software Foundation; either version 2 of the License, or- E9 k$ \9 B0 w( c7 I" X- C
* (at your option)any later version.
7 M% b2 d7 G6 c9 G& X. [ *
' u) {# j6 L2 E2 G1 F * This program is distributed in the hope that it will be useful,% I1 R( t) C  ]  h
* but WITHOUT ANY WARRANTY; without even the implied warranty of
0 ?- _( O) o1 y; F( C! f, m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) m; f7 w4 n) |/ j; n/ Q * GNU General Public License for more details.
, _5 S  t# R) v- w. p) e *
  D: a9 D% T0 k& w" K1 F, D5 _ * You should have received a copy of the GNU General Public License! a, [9 r* E% s
* along with this program; if not, write to the Free Software
$ }0 a) H  i# H * Foundati
2 z1 W0 }/ E4 m8 ^4 l, C4 }! Y4 @: P2 V* ^*/7 t& X2 H0 {  \& ~) s  t
#include <linux/module.h>
3 B. q" g3 Y/ Y! A( c. a#include <linux/init.h>( n5 w, V( r* Q' v/ E6 D1 r3 L
#include <linux/errno.h>; g% K7 h* j4 e& b4 a
#include <linux/types.h>
, c. x1 d" L; `& g" ]3 o: }# L#include <linux/interrupt.h>
6 m: h4 J% r- s& ^- H#include <linux/io.h>
$ a: R' _/ \$ M! |/ r6 _3 @  G#include <linux/sysctl.h>
9 ]0 f( P- z7 b#include <linux/mm.h>
" B. N, `8 a  H#include <linux/delay.h>6 i1 y4 B  U* r  r5 g. y2 N4 K! C# F
#include<linux/kernel.h>0 r) \& |: m1 r$ G6 j" p) z
#include<linux/fs.h>
8 g: J7 S7 m4 }#include<linux/ioctl.h>5 p* T% w; {$ r' t( ]3 ~
#include<linux/cdev.h>
; I* J8 s9 k6 `* e#include<linux/kdev_t.h>  j$ Q  r. l/ P2 K  T& D
#include<linux/gpio.h>
6 N  E5 J5 G' @" [#include <mach/hardware.h>
/ T7 H0 B; N# }2 D7 b* I/ D5 U#include <mach/irqs.h>$ W- a1 L4 V, r2 b
0 ~) @' V$ m3 m% @% W. V
#include <asm/mach-types.h>
' F2 [6 ~$ K+ t+ p#include <asm/mach/arch.h>$ I% Y) ?7 l: l5 j
#include <mach/da8xx.h>; u3 ]( N# Y5 P0 R# B8 A  J8 ?- x
#define  SYSCFG_BASE   0x01c14000
/ \9 F/ P* r8 D) Y1 j#define  PINMUX1_OFFSET   0x124 ( U0 ^4 z% a3 o' k8 [
#define  PINMUX18_OFFSET  0x168 2 m4 }/ R1 G% [# j& I
#define  PINMUX19_OFFSET  0x16c
6 n7 t8 J& n* B% d, y#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
0 d, q0 s/ _2 R4 {#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% u0 G8 i7 U: @% h4 y#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
. I$ N" _1 W" n4 M- g, T& J1 N! u#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR. E) T& |- J/ K9 K. N0 n/ c9 Q
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
! \3 W3 }3 H6 ~' L) Y' S                           
1 Z  b) _3 y! S% |9 i$ u8 D#define DXR_ADDR      0x01D11004  //MCBSP1_DXR2 E7 M3 b& f3 r* V' u
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
( B8 s, S* S( A, n5 o0 ?3 |3 D//PSC3 ?. f' b& y# z2 ?7 q
#define  PTCMD_ADDR   0x01E27120  
: z: t+ @) a' W4 e" f#define  MDCTL15_ADDR 0x01E27A3C8 W: J6 g# x* m0 _
#define  PDCTL1_ADDR  0x01E27304
! o% Y2 a* o3 G8 v- p- s//GPIO8 direction- X. e2 O/ U+ }6 }# r
#define GPIO8_DIRECT  0x01E260B0
9 n6 z8 g# q2 g% t* p#define GPIO8_OUT     0x01E260B4. N  \# {4 d: d) R/ O6 s) Z' v
#define GPIO8_IN     0x01E260C0/ m/ W8 \: X+ `% n
8 M: V: Z1 u! ]7 {! H/ c
//#define MCBSP1_RINT    99              % Z3 }, A9 G& }
//#define MCBSP1_XINT    100  " }" G4 H$ t# I$ b. A
static int MCBSP_MAJOR=239;2 Y0 A4 ?% Y8 R0 T& F0 k0 _/ g1 u
static int MCBSP_MINOR=0;  Q! v7 a8 L( @" ?
static int count =1;
8 Y/ v& g. q4 A/ T0 s7 t
7 k6 V! q9 o2 N& n6 f0 R#define MCBSP_NAME  "MCBSP-device"0 J& ^" M, ]" f! u+ Z
7 K! d. b' o* s# E6 |
static struct cdev *mcbsp_cdev;4 _9 c. t! _) |( X1 X
static struct class *mcbsp_class;
- W8 a- P- F) I$ u) B/ Ystatic dev_t mcbsp_dev;( c+ ~- F- h4 o' N: ~! M6 k
unsigned int DRR_data;
; S2 k9 M7 a; a' v# zunsigned int DXR_data;
! g$ a' V' E7 o* ostatic int mcbsp_open(struct inode *inode,struct file *file)
6 ?( P5 \/ _/ x{7 g" c+ |4 Q- H0 Z2 t- B
   
1 p- y( Z' q" t) x! F- @) x   //interrupt enable,initialized
$ k: @0 y6 N) X0 p: F. T   unsigned int temp;
" f( B6 D, x0 V; w" z   //SLEEP_EN(GPIO8[10])---0$ x% l, z! k$ i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, Z7 p: q& _. n& S( j' Q, j( O5 H   temp=temp&(~0x00000400);* ?, d6 _! t& P5 U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
; n% \; r) B( w1 x/ {, r/ t& V  //RESETn(GPIO8[8])----0----1( ?1 P1 y& [% n8 Z0 k1 ^0 N
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( Y# T( f/ M5 Y; h1 W+ X   temp=temp&(~0x00000100);) o7 \0 ?" \) E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, f7 b1 e3 B8 z: _" A  S   udelay(100);% m! G$ k' ?2 t7 P; f  q
   temp=temp| 0x00000100;/ N. ]" |, ^7 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' d$ W8 X) E. G# h( O, D# z
   udelay(100);8 i$ t; E4 D9 C% D( _1 U  E
   printk("open success!\n");
2 B; }# W- M, Z2 z$ t2 ]   return 0;# j! v4 j$ g1 K9 V, J7 {8 [# ?
}
8 b. j) B/ x1 R
! z  S, D6 d) y  A2 ?9 u. n! ?  w' ?static int mcbsp_release(struct inode *inode,struct file *file)# W* @" G" D4 h. C
{6 g' C/ t/ a- a0 |" W
   printk("release success!\n");/ f0 |0 |! E' \% G6 H: Y
   return 0;
, c, Z4 L4 U2 ^& M/ R, X3 H% K) K}
5 L0 D0 n  U1 \- d$ W7 d4 S% |% I. p0 F" j2 j: l- J
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
' B* K" J5 G; {, Z. |& W! H{
. i' B4 n0 i: d: _& R: C    copy_from_user(&DXR_data,buf,len);
' W0 X. f) h& b) d% W( V/ H; H9 k6 h    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 G! T: {# C& G0 F    return 0;! g: `" L, o/ W' d5 U$ c$ H9 e3 Z) S
( x. A9 h! ~- y9 ]2 @: U; T; J4 a
}
) ?: q( h' @  W3 E; b! w* n: G
" q0 B. {, v, z& x* U1 ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 |3 ^: U- Q5 ~8 O( I: {, A# K{   ^6 c4 l, D; b3 ?
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
$ i8 D5 x5 v) T1 }1 `5 \* D* I   copy_to_user(buf,&DRR_data,len); 2 O! P' H" t: T1 l9 I: _
   return 0;0 s8 H9 z- e) Y7 _5 H0 G$ Z8 c
}
, f8 O* _. Z; F/ n/ z  H1 t4 l+ E3 [/ D' K

5 R& }  q5 q4 zstatic struct  file_operations mcbsp_fops=
# W4 N! W, n% B# t/ X. J{
# G+ U- h* K( g: J# t   .owner=THIS_MODULE,
8 A8 i" c2 ~* I+ I   .open=mcbsp_open,$ E  p8 l3 q" M3 {
   .release=mcbsp_release,) p+ d# H  [1 Q6 {" m
   .write=mcbsp_write,4 C- O  v3 Y1 u: U9 K
   .read=mcbsp_read,6 E- A! W  z% i+ g) b
};3 F2 j3 a5 w: i( m( ?& ~/ s* S
static int __init MCBSP_init(void)
8 s6 S) v" s  j1 {* ]% ]" D{
2 J, S- P( S8 i5 G   int ret;
5 w8 W, a' ?% N& ]' o4 N; o   unsigned  int   PINMUX1_REG_old;
0 J$ Z2 V$ B8 t   unsigned  int   PINMUX18_REG_old;2 q) }# @! [! ?9 o
   unsigned  int   PINMUX19_REG_old;
; U" Q! ~" z0 w/ c+ \   unsigned  int   temp;  # O3 ]1 j9 y# e/ k0 P
   if(MCBSP_MAJOR)0 @- Q, D0 s- h9 t  _" ]9 U
   {, `0 S: \. q( ]& T- ~: b( j9 R, X0 I
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 F1 N4 I8 w7 ~2 N  ?4 N5 H
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
) s; s- R1 e* B/ `/ i   }  C, F$ I" N6 V+ d4 E' b) V1 y
   else. @. ^4 u4 E! D, A7 g' e
   {
* C) \! s7 C* S) a# ^      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) A+ K$ Q7 Q$ L' Y- H- Y5 x$ _: k8 h      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, d+ P, ]$ w$ Q( T) o   }
) U+ E7 j) K5 ], N   * l2 x- `/ l+ o0 |
   if(ret<0)
# |8 ]5 k. o! `   {- e7 H5 }5 w- {/ G
      printk(KERN_ERR "register chrdev fail!");
+ W, g: m7 e! h& t      return -1;: W$ A. {  n9 L5 H6 ^. w% G
   }5 N7 g' F+ G1 Z% }  }5 m
   
/ V; {! W$ e: P& x' Z   mcbsp_cdev=cdev_alloc();! F) w! Y1 u, [( X* w0 R% `5 u! T
   
7 H1 f& h: D4 J3 z' q/ E   if(mcbsp_cdev!=NULL)
& e0 z) @- H+ X; Z6 C, L$ Y   {
) y. e' ^  f( @0 `& B      cdev_init(mcbsp_cdev,&mcbsp_fops);
9 w8 O- ^5 O* R( _; `# R9 u      mcbsp_cdev->ops=&mcbsp_fops;+ G. E' @- M- p$ U* ~0 u/ m" P7 s
      mcbsp_cdev->owner=THIS_MODULE;  P! J2 }* A( k/ c, \9 ~
      
+ X2 m0 o8 n; _( {+ x      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))  |5 y8 |' v5 O9 b0 L5 e! l* z
          printk(KERN_ERR "register cdev fail!");
4 a7 a( Z. O% J- \      else, k! [& }  |/ e6 _) r! ?  A
          printk(KERN_ERR "register success!\n");
: ~! [6 D" v  P3 E+ L   }7 H# [& a! u: {
   else
% Q7 ?" K( J. A   {0 {) x- E; n* ~% P& G9 Y, _
      printk(KERN_ERR "register cdev err!");
5 v' x" k- M& H7 m6 K      return -1;
: I. A$ z, T' g: O( W   }
. s9 x) w% |: f  F# D1 h0 c- E   
: v; x0 A8 ?7 x$ N; W  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* @$ C8 b3 j0 X) H8 i9 `
   if(IS_ERR(mcbsp_class))8 I. r% u* u$ U
   {
1 a: k& d2 n- ?$ e      printk(KERN_ERR "register class err!");
  h# R, Z8 I8 J0 }8 |. m+ N   return -1;( T; u8 d2 Z- \# }2 G8 |" n3 k5 g
   }1 N( y( @" \5 b5 L9 E2 p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 W% H" \0 n3 R" N' r7 S
4 L  V+ R- q7 u6 j6 C  _4 T
   //PSC7 A) e8 ^! `' C/ a0 |1 n
   //add Enable MCBSP& e. |& p! f  p: q7 c+ j# W
   //test$ B; r  m% M' {& f! {' H) C! u9 K
   temp = 0x80000003;! R" F+ }7 X! p& P! I+ w9 ~9 }  d6 e
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 b# X; f% f5 r1 Z# J1 G/ v   temp = 0x00000003;  I( O# }( M4 w1 F, e, u& _
   writel(temp, IO_ADDRESS(PTCMD_ADDR));' E; y% K' r7 R, b% j
* O3 b9 |% f6 G; w# T' _
   temp = 0x001FF201;0 ?' e7 n. {/ r: a4 v
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));2 D+ {) r5 L. S6 Z
   
- v3 x# A& V, i% P   //PINMUX  
3 e% N  M" w4 A, ]' {9 c   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 h1 i! \. n" }, D* e5 ^( _) S% I/ P
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
! R* L2 O2 [* N& Y) U$ G# g6 U   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
* m4 o5 }! C, G& l. L! Z' S6 h   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, R8 y  A2 m1 [5 d; t   , }$ u( p: d" Z0 N
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
9 e( H$ N# O* _6 I   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 @0 d* F1 [& ?% @$ k$ T' U
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   2 y2 m& ~! ]9 k9 }; ~
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 p; D3 |8 N' l9 P, K# S$ ] ; P4 b. R6 ^( J2 @: b) J
   //RESETn,L138_SHK2
1 v* b* f: D) ~1 H$ D, s$ o4 J& ^   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
' O6 U+ Q+ z. Q& B  u4 J   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
0 n! l, Q: K0 L) ?/ J6 {   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 @* A  F7 H+ X1 Z0 ]" b( y* F) V& }+ L
% B( s8 ]; [- y, X& b2 N

' l' B( x6 t/ d- B% v  |! y( G  //SPCR Register
5 ?/ }; B2 i) m: q! G9 u: e  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 W( N- [0 J" o1 |, S% a4 C* v  temp = 0x03000000;//(DLB=0)9 M0 d+ b: Q7 ^* Z
// temp = 0x03008000;//(DLB=1)
' C1 s. }5 u! K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset5 z9 M2 Z( t' V, H0 e( Q
  temp = readl(IO_ADDRESS(SPCR_ADDR));6 k9 E9 e, E( U$ q  r5 L% e5 I
  printk("temp=%x\n",temp);
- z9 k* F+ s0 D : p  V* x  c1 |7 i, U) j
   //PCR Register
. i2 K+ K) L6 V5 W   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-02 K/ p6 g- N; d" A: S: a7 _
  // temp = 0x00000F0F;
2 f6 c1 P8 Y3 \3 r1 L  R1 b  temp = 0x00000B0F;
6 k% O2 B1 R* }# h  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
! a) J( N8 t! y2 b5 g5 m  temp = readl(IO_ADDRESS(PCR_ADDR));
* V" k- o, ~6 |* g# m6 M3 s  printk("temp=%x\n",temp);  
0 N' v/ K0 l3 F! E& x4 B   //SRGR Register
! t) a3 r5 X$ A( J' U3 `# ]   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 @* U3 F0 M7 y //temp = 0x301F000B;
7 U3 }6 g8 k7 ]5 G   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ ^* J( |" I, _5 f  temp = readl(IO_ADDRESS(SRGR_ADDR));
  h! C/ U: A/ i  printk("temp=%x\n",temp);2 z" o, M% D2 C# q& C/ e2 c/ ~
   //RCR
" _/ W  W0 q# ?  _   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) Q4 x1 @3 O# z   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 D2 C9 Z2 e0 S5 A- n
   temp = 0x00440040;
8 Y5 n% N7 y+ t( N( }1 h   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
3 A" q0 U7 q) i: i   temp = readl(IO_ADDRESS(RCR_ADDR));
- v) C# t/ S/ d# e! d& M   printk("temp=%x\n",temp);
( v6 R8 o1 I  ~' s   //XCR7 q% }  ^% A9 X& o* s  m3 f5 D% l
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 l6 {$ h+ K, c1 _6 `' V/ K' Y   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. ?" @$ t( h' |! m0 h! y+ [   temp = 0x00440040;
  x" q% t6 j$ j+ P   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
" ]4 k. s) k; v; m   temp = readl(IO_ADDRESS(XCR_ADDR));
( ?1 @$ O: L% i   printk("temp=%x\n",temp);( P+ a- ?2 K3 r7 Y) I4 O
  udelay(100);7 ?$ \8 j: K" t7 A& T+ f) P
  //SPCR Register) T1 i# H. x# z, v- K2 {9 u, Z4 Y
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 g5 q( Y2 @( S, P8 Z
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 P$ l% W3 J" f  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
5 R( E$ m+ }0 j+ H) @- z  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ u& q0 S  T- G# n9 l  printk("temp=%x\n",temp);2 {% Q/ x+ f/ c
  udelay(100);$ Z( c  A* r; H! O- h5 t

8 j0 q6 C2 i! A8 ]) ?  //set GPIO direction& y) m. `* C, M/ k" S! B$ U
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
. h$ Z7 s$ s$ i$ J$ S2 i   temp = temp | 0x00000100;//EPR----input( U! w8 T3 \3 [' R4 h- y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ _' ?2 B6 \/ K* t
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 X2 W. W+ D( K! T8 r+ t  d( |# T

; x: O7 v/ {7 k) w" d+ x   return 0;3 D+ E! l) u! `0 F% K1 m" i: C
}, g( L, L+ \; s
static void __exit MCBSP_exit(void)- ^" E' p& `4 e% s( ]. R
{
3 s; R/ @# m( X, x# z   printk("mcbsp chrdev exit!\n");
" t2 u( a# f1 Z" ]9 }! n   cdev_del(mcbsp_cdev);
0 j6 {/ J9 f0 T9 O6 [9 f9 n( Q   unregister_chrdev_region(mcbsp_dev,count);0 u! z- X0 F% a& ^$ w
   device_destroy(mcbsp_class,mcbsp_dev);" ^9 t  Q( v! Z1 ^1 T* R
   class_destroy(mcbsp_class);
0 p/ R( z4 v& P' [% u. \) r7 V) N}2 O: `- A2 x/ A* `1 M$ u
module_init(MCBSP_init);& E, ?- v8 l7 Z9 x
module_exit(MCBSP_exit);: y3 H/ w$ X( |) L* B6 H
6 V0 y/ \9 H. a
MODULE_LICENSE("GPL");" N2 S$ E. V2 ~9 k! v" `

4 @" N; e6 X  k- D( g2 b我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& m. N" V+ Y& C& T" w: Q  Q. G' W. Q我的应用层的测试程序如下
$ X4 q9 C2 W, C9 b/ H8 t! D! `#include <stdio.h>
1 p+ R5 ~6 O5 a6 F, U#include <string.h>
" F5 Z% `  C; Y#include <fcntl.h>
6 e/ u8 @& _/ F, p+ W4 X#include <unistd.h>
% O* `% }8 w4 y  b+ q- ~#include <signal.h>
# z7 y  M+ f+ V& R, Q3 G1 b; h9 [#include <pthread.h>       //线程3 R  P1 H2 q2 ?. t6 K( F
#include <stdlib.h>
" j6 m+ h; y. f3 A7 w8 V#include <pcap.h>          //捕获网口数据4 q& S, E# o2 D/ ?/ c( q% Q
#include <semaphore.h>     //信号
5 o7 I$ }9 @& G9 ?2 {' x/ [; U#include <sys/types.h>     //消息对列) J- B7 P) U# C$ @( g
#include <sys/ipc.h>       //消息队列
- A2 n8 t$ i: W( j2 E" G; e#include <sys/msg.h>       //消息队列/ G% ~8 c) {3 M8 l( J
#include <sys/select.h>$ f3 P2 W! N' R+ G) B+ i$ i
#include <sys/syscall.h>
2 n' B  {; z; Z#include <sys/stat.h>* J  @3 ^* H; t
#include <sys/mman.h>7 C# g0 n: O/ o# d. o/ X
#define msleep(x) usleep(1000*x)
: Q; h6 z5 k6 n7 k* E
1 H1 a( j# h" Z* E3 Aint main()
' z% A/ k' l0 y{ 9 L- J4 j3 _3 Y
    //MCBSP,ARM与AMBE2000交互设备
& k1 }' v5 v# s/ B6 e int fd;0 a" R6 r' ?% O# l) j! T
unsigned short data_write = 0x5555;& v( j9 B+ s3 F4 B
unsigned short data_read = 0x00;+ R& m: }" X3 z* X
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 K' ]/ e- c( R2 C7 Q( u
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' T. L) g: c4 C- @& T) w4 g   
6 Q6 y5 `& y- _2 q% v9 n  z, I  if(fd < 0)
3 p1 g3 R$ X: H$ q  {
6 d9 Z  G' d! j; u; m+ P" \  t) S" C     perror("open failed\n");, B$ `: c! a; E8 }3 n
     return -1;
8 G  ~2 K$ }8 ]: m2 G% f/ ~  }
. S7 E* V) q2 s  9 |0 {% t  c) I
  while(1)
4 S$ ]$ I% b0 p! L1 w3 V: y  {5 J% \" N- V8 g4 p7 @
   
! c% d. h' H. F: Q   //AMBE2000每次读写是24个字为一帧' ~) O2 @7 q' m1 h& t
   //写数据时将数据在底层存储起来,等到中断的时候再发送
3 E3 g( I1 \3 m: H9 |* D8 r6 K' e   //AMBE2000输入数据是以0x13EC开头的! _6 O! }) t/ V
   write(fd,&data_write,sizeof(unsigned short));+ f/ W1 o2 I$ F4 m, z  R- N2 I. l
   ' V. V: j; n1 h, N
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ! W. b$ Y9 D! B+ G" V
   read(fd,&data_read,sizeof(unsigned short));
7 v, }/ ^. w; z; E   
, m' n/ D5 K& l& D   if(data_read == 0x13Ec)
- V3 i& Y7 T$ R. R5 o' K   {8 K6 {- [5 j2 f4 B7 N% I
   - u$ V8 q4 L7 D/ t: a; g
    printf("data_read = %x\n",data_read);
. ]  p% ?( d2 G* U6 d  a   }
% o% ], c1 W( X, Y   
% e0 M: K! P  [   msleep(10);& B& b  n/ B4 X# Y
  
: a6 P; w. o$ h/ v/ M1 U) B  /*
: B8 f) m1 J' t8 D1 i# U, e   ioctl(fd,1);   
6 N! E- k9 ?2 o sleep(1);/ w* I0 F8 K0 }# j8 C" H
ioctl(fd,0);
; I( I+ ^9 s+ O' x" X, [  { sleep(1);
( ^4 x6 }( o+ p4 o, ~/ `2 A */
  q( e% N5 Q# u; q# V+ R  }   . {& v; E' {8 g
return 0;) C7 _, |% T; V) s2 H% `3 R

/ T1 e1 n) ^( J}  S* Y5 _. d5 Y- [5 Z* h2 i

/ @! Z1 B4 [3 o多谢各位指教,谢谢! 急  e4 ?$ o) Y9 x7 _0 F% b
" e5 n7 p! |/ \4 _, B
" A* V0 P# b- P, V& S" c
1 ?) F! i) t7 ~! H. P
. h1 K; ?7 [& I. s% n$ `

6 r; |# b3 Y2 f$ O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 16:00 , Processed in 0.048433 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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