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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) ?( {/ r& w6 c6 v/*
9 N- v: k0 _5 |) L: F0 `2 | * Copyright (C) 2009 Texas Instruments Inc
! y2 o* `; P5 u- O *3 I# A+ p! m& a7 G, x  p
* This program is free software; you can redistribute it and/or modify! j# N2 a" U: s; F5 G1 _! m
* it under the terms of the GNU General Public License as published by8 I: Y' x4 B/ M, \! i4 q, p: F: g
* the Free Software Foundation; either version 2 of the License, or! ]1 @+ X9 b1 E5 U  n
* (at your option)any later version.+ ?6 W& J) _! t+ q) o1 ^) y; _# v
*
+ v+ u; \8 w3 k$ A- z * This program is distributed in the hope that it will be useful,
# T+ S: O. y+ E2 C$ I. @ * but WITHOUT ANY WARRANTY; without even the implied warranty of! i( m9 V0 ~. U0 J* x: ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) B+ e8 f; `) t- [, [ * GNU General Public License for more details.
* ^, v/ ?, g: D1 j% B *4 O/ w& b# T6 X) \& F! j
* You should have received a copy of the GNU General Public License
  K/ p/ W9 ^& D6 C  u1 p; H8 v# l: I * along with this program; if not, write to the Free Software
( d! w& M; u9 T6 e * Foundati' o( g" b5 o8 K8 {0 F/ E6 S" G3 e
*/
; M2 f6 q+ g3 T4 g& R) u#include <linux/module.h>' O0 p+ p1 H% M. Q% b
#include <linux/init.h>' {/ H9 l5 [  _) z! g
#include <linux/errno.h>- W7 r7 ?, d; \* C/ ]1 F+ e6 J
#include <linux/types.h>
1 u9 B( o9 E; k+ B& u3 F2 g#include <linux/interrupt.h>, E& h6 W" s2 H" z( N
#include <linux/io.h>1 L. s% D6 I, U, `$ G6 P
#include <linux/sysctl.h>0 U2 B& M" H5 a
#include <linux/mm.h>
* I, Y2 H% W9 h, s% I#include <linux/delay.h>
6 K) [0 q* k6 \#include<linux/kernel.h>2 e8 a- u9 n$ t; k- J% Y7 v5 L! {
#include<linux/fs.h>
; w6 z, X; r0 ]2 b! V& I" Z#include<linux/ioctl.h>
% ^- t- ?6 B; I) u- k8 U( e& S#include<linux/cdev.h>  \1 C7 F# \& k* u) F
#include<linux/kdev_t.h>
8 S( @8 M; H* N( k#include<linux/gpio.h>
+ d; N# u! e( z. D- b- G4 o#include <mach/hardware.h>
3 u# n# F2 X4 U) f#include <mach/irqs.h>* D* k5 l1 q6 t; n# O" h# D

! L" e& }$ W1 c& {5 u# h, d: ^+ R#include <asm/mach-types.h>" K5 W/ P/ u5 z
#include <asm/mach/arch.h>
' D- t4 S1 Q% r& ]* S' \* {6 H& W#include <mach/da8xx.h>
& b% v& Q  E, q9 o: e& H#define  SYSCFG_BASE   0x01c14000
/ o! A7 g2 i9 {6 U#define  PINMUX1_OFFSET   0x124 ; u- d' e4 X% ?* v( [+ U/ W$ P% \
#define  PINMUX18_OFFSET  0x168
4 h* I4 O. u' Q* P3 P: J#define  PINMUX19_OFFSET  0x16c
* E! G. i6 h" Q; M: ~. x& N. m4 ~#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
+ P: u, D' P, y9 x. ^) e( M: J0 p#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
& u# {' G+ A$ d; }! h% N#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 J2 w0 ]$ |$ z: w#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ A; G3 Q, z1 }3 n#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
$ e, |' }$ G( E% R6 E" O" {$ L; Y) U                           
# ]. }0 t8 v' G# V5 v#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
& E: r6 a) R$ R# h5 E* T" E#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
6 Q& Y! T( z5 I//PSC
( G# m' T4 ~* E4 B# H+ d#define  PTCMD_ADDR   0x01E27120  
; r7 r8 t1 F4 ]( `% j#define  MDCTL15_ADDR 0x01E27A3C6 p3 @  Z: a2 F1 F
#define  PDCTL1_ADDR  0x01E27304- Q& t( Q# p* {" j
//GPIO8 direction
: ?) a' l$ S* g& Q. w#define GPIO8_DIRECT  0x01E260B0
* ~5 p' j( |+ N#define GPIO8_OUT     0x01E260B4
, z$ U- y4 l* @9 Z% D: \! q; H$ p) w#define GPIO8_IN     0x01E260C0- i0 a! c6 `$ F  K# d8 O
' S5 J# d. q5 K* }4 y
//#define MCBSP1_RINT    99              
; X- w! G: `" g, |+ a6 f, W# L//#define MCBSP1_XINT    100  / S. S4 j6 {; T7 r$ y. S9 [4 p
static int MCBSP_MAJOR=239;5 _4 x% N; X6 t# s$ ?
static int MCBSP_MINOR=0;3 Z/ H3 ?5 r' R$ s; Q  ?, i# O4 x
static int count =1;- C: L. K1 a# @, K

8 a6 @/ \$ W6 M4 x#define MCBSP_NAME  "MCBSP-device"
8 A; f$ w3 ]/ W  t% e2 ]( o! s  X$ h5 _( a" n- W" g- j
static struct cdev *mcbsp_cdev;
6 B7 w' E1 e: ]& S+ \6 T4 I5 F3 hstatic struct class *mcbsp_class;6 ^+ z/ Z: d% ]; d5 q
static dev_t mcbsp_dev;& r8 M" h+ V6 R8 W! e0 R4 I4 _! }0 ~
unsigned int DRR_data;$ i$ `0 z3 v5 u1 K  Q8 p, v: M
unsigned int DXR_data;
4 a& b% f- \! {0 M! u- a# _. Qstatic int mcbsp_open(struct inode *inode,struct file *file)
9 X  s% H+ i7 m* f0 u{% q  o1 I3 H% o6 E8 O8 n
   5 B# q, M1 R: |( y
   //interrupt enable,initialized
7 J9 m6 M5 w0 {- b8 _8 t. k% X   unsigned int temp;; H# @( v) Z; l- r- g
   //SLEEP_EN(GPIO8[10])---0/ e8 h! s, z. M. g& A; ^5 j$ f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" z3 ?9 X- T& g0 j, p   temp=temp&(~0x00000400);
, V4 @; Y7 I3 m8 h9 y# g8 `) I   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' t* U% y( e+ ?; ?  //RESETn(GPIO8[8])----0----1
/ D, ~! a5 t# A% t  j% F) |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: Z* ^4 k/ I' @- G   temp=temp&(~0x00000100);# r6 {" E) p9 c7 N- ^+ d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- I/ j  y4 j) v8 h" W6 p% q4 y
   udelay(100);. t! i+ m1 v' @. R
   temp=temp| 0x00000100;" b) m! h+ [' _# K8 h/ j, J0 K/ u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 z2 d' {) V9 [   udelay(100);
" {: H9 N/ r* ]3 }   printk("open success!\n");" E* W% S# e! J: R* c. C4 l
   return 0;7 X& @; _$ t1 J
}3 k' P9 J" t. {+ X- V

3 i; D; N" m. rstatic int mcbsp_release(struct inode *inode,struct file *file)
$ v# W" h* b$ O2 Y" C1 `{5 E/ A4 t0 N- N0 B
   printk("release success!\n");
& _5 Y3 D) I! U" ?! S   return 0;& L$ h5 ]- h& y3 [
}
8 M/ [$ m' n: u$ l$ J/ a, \* v$ b2 @/ B* U& [- B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
5 \5 p6 g+ A* C" j' }9 h9 h{
: _( a) o. C  H) m5 n6 o5 R9 q9 _    copy_from_user(&DXR_data,buf,len);
, M; `, r$ `  [3 y6 `/ p& P; ~6 b    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - w' Z: I, _, U$ d
    return 0;
" F2 g0 t' s4 l9 T
6 _- D7 h( h5 V& w) F9 e}
$ P0 M0 g# ]/ Z$ g: G/ g
. v, X0 c* P9 Wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" m* }0 u3 m" E
{ $ @7 H: n7 L# m" }/ f) |1 j5 b
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* o$ }* H/ t2 r) m3 b   copy_to_user(buf,&DRR_data,len); 3 Y/ k& R* l6 h4 i' O4 {/ y+ e
   return 0;
7 m! k  A- ]; L0 j4 [}, ?) V# p9 P: X7 d; j3 G
) H% U0 _0 a# r; X

. W4 R: w4 |3 ~) t5 }" Istatic struct  file_operations mcbsp_fops=  g. g/ z1 h5 K4 }
{
* ]& I  B1 l/ K$ k/ n   .owner=THIS_MODULE,
  V! z$ _0 T  w5 s   .open=mcbsp_open,; a7 A% w) T4 ]3 S
   .release=mcbsp_release,; X& e& @0 }- f, a- J' d$ M
   .write=mcbsp_write,
( l( @. ~, E/ r& C   .read=mcbsp_read,
( n6 P2 P; p' B) U/ h# L$ y" U};
0 ~3 k. z5 F# ustatic int __init MCBSP_init(void)
1 |( b$ ~( h, d  o{
" W& K0 g4 a! |  T   int ret;
* S( }7 f( V, n+ M! k   unsigned  int   PINMUX1_REG_old;* R" t/ O4 x& S; E$ C& w
   unsigned  int   PINMUX18_REG_old;8 A4 l! r* ^4 o* _8 F( U
   unsigned  int   PINMUX19_REG_old;
! C$ p/ \  s  }+ Q7 m( t/ {   unsigned  int   temp;  
% O" o6 i& C0 @. V3 }& |   if(MCBSP_MAJOR)
' S$ h5 Z; t6 d( v/ B2 _; h   {
. B3 M# T2 J4 V% R% b      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* I' L5 O! ?" n( u( s$ e! M- h* S/ \      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- g" L$ d8 y( y( e& @; l8 F/ \2 E
   }
# ]' q9 V8 M2 ]/ J   else- s  j  T# v' {; N
   {$ j, Y5 ]$ P5 U4 u
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 R0 a' j1 n! f) V! J, Z( u      MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 F; Q* E& A( r0 b8 o5 Y8 o   }/ K% ?9 y* ?/ z- R7 A, n
   5 m  S* Z% N6 `5 \. i( E& H0 f
   if(ret<0)+ c% S" l- {/ W$ n; @
   {- G; i* D, ]  a+ }8 \' ^, z4 K" H
      printk(KERN_ERR "register chrdev fail!");8 U, z# B# R! l4 c
      return -1;% y: h6 v. |* {5 z  y+ s9 W2 J0 T
   }
  O$ u" p* ?+ I1 y+ l; X   
7 r& F* n6 ~2 s  x' N   mcbsp_cdev=cdev_alloc();8 w9 a1 U! L4 H1 |3 l
   , `# G! {7 L) o4 F4 D
   if(mcbsp_cdev!=NULL)" `1 M, L4 q7 k! y  V' ^' g6 v' ?
   {3 R' F) m" ?: ?5 n
      cdev_init(mcbsp_cdev,&mcbsp_fops);
: M5 a: t- G5 @1 S) K4 I      mcbsp_cdev->ops=&mcbsp_fops;
7 i7 i/ h  t) S' @5 K+ {/ ?  C      mcbsp_cdev->owner=THIS_MODULE;8 w1 U3 h8 H0 d9 H5 X  P
      
7 T: R& g( T0 ]. O6 H      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% H0 d# q3 i9 k9 i4 r% X& p$ s$ ]
          printk(KERN_ERR "register cdev fail!");0 O, @* ]$ U: Q( U% ^
      else
: X7 l7 n9 S8 x. O          printk(KERN_ERR "register success!\n");
% t2 q& p. _# d; l' [) B7 H   }
% r8 q9 o/ @% x, R! ~8 ^) e/ E   else
1 s, |( q, r+ P2 [3 T+ S0 W8 `( s( Y   {; _6 u1 t3 J. m" O4 Z
      printk(KERN_ERR "register cdev err!");# ^! ~2 [+ ]* h+ K
      return -1;. i& _9 `5 d% O) p! \
   }3 o! D* ]% m4 V; M6 w, U+ ]
   
: H1 [) t! y! a2 }  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- @7 B, K" C& o   if(IS_ERR(mcbsp_class))9 _: D8 p$ N1 p
   {
" F2 D! P2 Z4 s7 T      printk(KERN_ERR "register class err!");, j6 Z. X& R. P0 _1 e* Y8 [, G+ h$ z' X
   return -1;
0 s: g) s4 U' l" _4 C2 d6 ~+ {   }& A* ]( K1 B" I& l2 g! V6 S
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! y8 ~! {; }) H$ ?9 w- j: i; K! l+ K0 X9 e
   //PSC
" g$ D% q5 m* c, J7 T   //add Enable MCBSP9 i; U/ U  H# v* P
   //test
1 _  T; d' v  Z3 m: l   temp = 0x80000003;. S, Q+ e1 O9 ^& }) [
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; h5 R3 _+ O- o
   temp = 0x00000003;' n0 T+ s/ o& p" J4 [, T
   writel(temp, IO_ADDRESS(PTCMD_ADDR));9 V6 n; x9 x3 ]+ A
( V( z: }% g- T* P
   temp = 0x001FF201;* l+ ^2 h9 }! f% I7 u% C$ ]* a* o
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));( W: h- [; F4 h; {
   
6 d0 L8 W+ ~' n8 ^1 J- U2 [   //PINMUX  4 [4 M4 v# ?4 }$ c
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* D8 f6 a6 T2 m1 H6 {7 B: s) H   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ! C/ r' n- ~# {- X+ s4 [
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   + j7 y8 Z- u0 b9 ^+ t
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 C: B' h& F( h0 c   , N! o. X4 z1 B) m
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
- M# z$ r4 T) D9 Y) ~$ P$ A3 {   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  2 d7 B' t' D% ?$ O+ [
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
) q6 `7 D' X3 ]2 y: F% k; y   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ I8 |; w% r6 ?  E3 L7 y 5 m; [4 z8 a4 ^/ O
   //RESETn,L138_SHK2, h: [+ a2 ]5 N! ]6 i4 e$ m
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
) v# Q: k( M/ ?: ^6 N$ ]  Z. A   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
; N2 t' I% }" m1 K  O  ]   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( R9 r( o5 ?5 d9 b( p+ l' c $ T8 [1 s) O( ]: \7 \3 I  ^8 g
7 \* R8 y+ W9 w- \5 r8 ?3 S  r
  //SPCR Register
* a, p( ?, j' s# u1 ]. p  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ `& I% ^2 g8 F0 W/ f- o6 R  temp = 0x03000000;//(DLB=0)- H. W1 T: O; m' |% @) q& ], |
// temp = 0x03008000;//(DLB=1)
' C) m6 O3 _6 g$ F  m8 ^  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset  D- e8 Q+ O- C  s: t/ H
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% U' o2 _  h8 R/ O/ p, c' [/ w  printk("temp=%x\n",temp);
) q$ [9 S% g7 {7 F$ P9 o : k8 E, n' a! V, m$ G( h
   //PCR Register
6 t4 l" @9 s. X/ J   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# W6 f- q4 T1 M' l
  // temp = 0x00000F0F;
7 _1 ]  u1 a0 d! f+ T  temp = 0x00000B0F;
4 y- S' D: Q/ s7 T/ W  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + a# B, N8 u4 f; j0 \
  temp = readl(IO_ADDRESS(PCR_ADDR));
6 g# ]5 l$ i) _0 c. y2 U# E: Z  printk("temp=%x\n",temp);  
7 K5 R/ I7 B; K. d) D   //SRGR Register. A' P9 u- w0 k$ z2 y% S
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 v: V) q) h! x+ L* D% g //temp = 0x301F000B;, a/ ^( T2 a/ l  Q* d$ @
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 9 b/ x4 D, B: G! s8 h
  temp = readl(IO_ADDRESS(SRGR_ADDR));' t4 t. b) h" \; ~7 \( f0 L& o+ [+ e. s
  printk("temp=%x\n",temp);6 [# h; K; {7 H0 X
   //RCR7 H1 p1 x6 e- ]1 ~
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,; n% Y5 Q3 A  W6 ^: H
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- E( Y. O% ^+ b% n. |  O9 |7 _# j   temp = 0x00440040;7 `8 t/ _/ L, B. w1 _
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, c. K2 n1 j3 U, v- a: P/ ?$ C0 C   temp = readl(IO_ADDRESS(RCR_ADDR));, D4 E+ l* z: a8 {# S* J
   printk("temp=%x\n",temp);
8 m0 E  G# L, K: y# V  _   //XCR
9 N! C8 z8 t) f/ i6 T3 }1 e   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1  U4 _( t  D5 H! w1 q# Z
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# A( f( o+ B( C3 r% k4 ~5 C
   temp = 0x00440040;
* v3 h2 Z; Z& y3 N; _   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
' m9 z6 @* X1 R1 k7 f1 ?   temp = readl(IO_ADDRESS(XCR_ADDR));. S" D6 @* F$ L" Q" V% h; I0 }
   printk("temp=%x\n",temp);' o1 B  H" h4 c
  udelay(100);
5 Z; @0 k! u4 T% v) C/ i9 p2 r$ l  //SPCR Register; j4 W; s9 o! q8 z
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- O4 M$ X* C7 ~
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. @9 M' q4 x& c0 ]2 L9 o
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled0 {: Q& B, X5 r' i/ q
  temp = readl(IO_ADDRESS(SPCR_ADDR));2 z( F0 S, W. |* S- k! h
  printk("temp=%x\n",temp);( T& X$ g6 @4 Q; V, X
  udelay(100);3 E# Z; a9 Z7 h$ J

! ^3 \9 t2 ]/ @' e! |# C) \7 N  //set GPIO direction$ P% ^  M. U1 ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- B4 d4 j6 ~' |
   temp = temp | 0x00000100;//EPR----input
; E) z7 G, ?- K6 `0 F8 S0 h# k  \   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
8 k  ]& L; l8 V+ I- I( m, K   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); / b; ]9 o5 @" P8 e) d% X7 M: P
* G7 w$ |* _* H# {% y
   return 0;
- q/ c, z8 {8 u* k}3 @! c* j; o# U# j, j
static void __exit MCBSP_exit(void)
3 L$ M6 c1 {( Y% \! A  E; w{
) b7 K+ N4 ~; ^- R   printk("mcbsp chrdev exit!\n");
" M) b" D  @$ U- M" `   cdev_del(mcbsp_cdev);
( ^# j; G& ]1 W2 C   unregister_chrdev_region(mcbsp_dev,count);: w& E/ ]3 H; r2 P1 U: |- l
   device_destroy(mcbsp_class,mcbsp_dev);/ S" I3 P6 E$ k! K) T5 g6 o, n
   class_destroy(mcbsp_class);
' ?' f3 R2 e1 x' u" a% M% h}
+ I- B  V7 p; O; d6 Y  ~% `module_init(MCBSP_init);
) v9 Y8 C$ x& U* H# b( X- |module_exit(MCBSP_exit);
! M( Y/ J; R: f1 {# o; U3 }) E4 x* f
( U8 w7 g% p7 c; f$ u( _" UMODULE_LICENSE("GPL");
# m9 e/ w3 X- J( L) O4 R) D- u; n! m9 F: M2 Z$ ]
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( ^" H9 X& }1 u* P* D我的应用层的测试程序如下* r! n: M! J: P+ x
#include <stdio.h>
, \3 C! K; @$ J4 F; ~# ?# [#include <string.h>4 P& j1 ?5 s9 _
#include <fcntl.h># S( u; [8 [$ x- a6 P& y6 v9 c
#include <unistd.h>) E4 T+ V4 e6 ?' a% N* E0 J
#include <signal.h>" X( d0 ~, @' a" C. R
#include <pthread.h>       //线程
! R' o1 _  i  \/ Z/ x9 J#include <stdlib.h>/ g! y& [8 n* f- k
#include <pcap.h>          //捕获网口数据' U0 L2 x: N: Q; r$ E; N
#include <semaphore.h>     //信号
2 ^9 Q) K7 X. [) u4 ~#include <sys/types.h>     //消息对列/ r) e) I( W3 o5 v
#include <sys/ipc.h>       //消息队列
1 ]  U- D( k0 i# Y) ^#include <sys/msg.h>       //消息队列
" w: @+ E- v0 F7 y* w: n4 W# A' |#include <sys/select.h>' v& L- R# r+ M. D2 _5 B) T, ?2 Y' ^
#include <sys/syscall.h>
7 f; V+ h, }* ?$ u4 R#include <sys/stat.h>
' r9 a: }% V1 ^* l3 j, H# K# o#include <sys/mman.h>
- b! @. K0 z6 z( k8 j#define msleep(x) usleep(1000*x)
+ _$ f$ @. b- S6 J
: D2 U3 b: l0 h  e7 yint main()1 V; L' G" q* _' r+ w" ?
{ ( W4 I" Y& @! e6 Y* f! D  c
    //MCBSP,ARM与AMBE2000交互设备$ P% ~, i' K# ]
int fd;
$ U/ m/ s- S# f6 R6 m; j0 P unsigned short data_write = 0x5555;
6 H  j5 e  L9 J  }* a# f$ ]( d# p unsigned short data_read = 0x00;
& T! Y# Y3 h' V; m7 h  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ p! g7 O5 `8 Y3 X1 V
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 t5 ?. A/ U2 k: P   
# q: W" {5 P* k8 r% I( l5 C  if(fd < 0)* ?. G/ E. `' p) R1 p( e; l. o, x1 }
  {6 r0 h1 _8 B9 }) V, x! ?
     perror("open failed\n");
8 _4 q6 d# D1 y1 r     return -1;
- m  ]; z, n2 T, e, y7 a( }  }
5 g4 l, O* E# r) t8 @9 b  ! |& P4 I$ Z* v  G$ V0 z4 v
  while(1)
; i) s# g7 l& p, s  {/ d+ q0 _3 c" x7 O6 v* ]) g
   ) K+ p$ t$ D$ l" h& W% h- H. U
   //AMBE2000每次读写是24个字为一帧
$ F$ R. V. Y4 ^4 N& A7 K5 T   //写数据时将数据在底层存储起来,等到中断的时候再发送% e9 P, a7 @8 }$ ]
   //AMBE2000输入数据是以0x13EC开头的
! L) A( m- e) }4 F" s* ^# k   write(fd,&data_write,sizeof(unsigned short));* e" f" |! G: C- ]) W6 i) Q! ]
   + u/ _3 N$ U% Z! U( }+ ]
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
, p0 ^! R$ L- |+ c0 b! `   read(fd,&data_read,sizeof(unsigned short));. M4 U0 ]% r+ d% O
   
3 ]* w  i/ b& g7 f3 }  B   if(data_read == 0x13Ec)
3 p+ u. C8 }2 f# _$ Z   {3 u4 K& C+ N' `& O5 I3 m
   ' x3 h% t( e3 i5 ?
    printf("data_read = %x\n",data_read);7 X; D. w% X8 g# l* N) S7 X
   }1 M5 H* l5 n4 `+ B2 Z+ B
   
, R. h5 ~" B7 u7 p: v" g5 \   msleep(10);4 g/ }/ }1 A* F0 a
  
! t3 A7 M' K/ i8 k  /*
, S7 ?1 W, C  d" B2 P   ioctl(fd,1);   
1 N7 V7 {% ]5 E3 N. D8 X, n sleep(1);
2 k( S! Y. j7 Z. M- b" \ ioctl(fd,0);
! w) j" e+ [% L sleep(1);" U, I' w. I3 v  U2 J  w1 }
*/
/ p6 W- n& e- p; j7 w7 l  }   . e* k6 S% z! J) v" d
return 0;
, Q3 ^. ~3 T/ x: t. J0 K+ Q) ] ! t# e! R0 q% A7 E# J
}: P* ?; ?4 k2 I5 k! [

8 E9 w0 S) x! _* G+ G, l多谢各位指教,谢谢! 急4 g8 y2 g3 g5 @2 O: g" O' I
, S; w: }6 j) j# V& V' T  V
- V/ U+ d7 ~. f4 z# M

( ?9 f! `. c. i
- {( d: R* ]0 u# s" [/ e8 g. W7 D2 n( T& L, d2 ?/ i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 18:01 , Processed in 0.049622 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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