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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " i4 i0 ?# g0 x3 ~
/*
( U3 C4 ^5 O, ?# a: L * Copyright (C) 2009 Texas Instruments Inc
4 n8 @# y5 r. V9 s) c6 _! |0 _% A1 X */ E$ X1 x2 D; c4 G' ~
* This program is free software; you can redistribute it and/or modify
, c4 [. U" C- D6 D/ ~, R3 ^) V0 C * it under the terms of the GNU General Public License as published by8 H# P+ \& d1 ^2 `
* the Free Software Foundation; either version 2 of the License, or
# L; w$ e0 J5 p. l9 ?% S; Q * (at your option)any later version.3 `4 r, \7 V6 `9 g/ H1 n
*
. ^' X( k/ ^3 l: r2 j2 N" K5 I6 [- F * This program is distributed in the hope that it will be useful,& F7 e: x6 @1 n; }
* but WITHOUT ANY WARRANTY; without even the implied warranty of
! K* D% N2 \- E" [' h * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
$ J" @% j& B; i" ?1 _/ P* p( O * GNU General Public License for more details.' Q  k! _3 z) a! _: u
*
# ^3 ?3 w% C! C; y! H; z * You should have received a copy of the GNU General Public License
/ P8 U- x0 z6 Z * along with this program; if not, write to the Free Software
2 \/ g, g5 V% e0 r9 m * Foundati
% M+ v9 O; ~# O/ {8 o3 z3 y*/
' @; P9 K+ ^6 g1 ~+ l  q4 k#include <linux/module.h>
' V$ o. U! n+ T' Q7 ^' n( A#include <linux/init.h>
. U" v! p% I9 P; O#include <linux/errno.h>2 h7 {( P. y; z6 O9 Y2 F' U& o) q
#include <linux/types.h>( [  ~( V8 M% k
#include <linux/interrupt.h>
" q: w) _% T: L. r2 x#include <linux/io.h>
: b* @% R; ^+ q#include <linux/sysctl.h>
* P0 e% C3 ?6 _3 C2 p1 _* `#include <linux/mm.h>
! |8 @4 \" J  ]$ F! I#include <linux/delay.h>
! }% d4 I3 R& g. y#include<linux/kernel.h>
' U* l; \  ?/ N5 \7 b, D* P#include<linux/fs.h>8 q. u4 ]: H# T5 {
#include<linux/ioctl.h>. ?& R" i' C2 s  X" c/ v
#include<linux/cdev.h>- X8 w# _. e5 x9 M1 i% M  Q
#include<linux/kdev_t.h>2 v4 n" f* u9 g$ z
#include<linux/gpio.h>  ?3 W2 _, D$ P( P3 h
#include <mach/hardware.h>2 C1 s7 A5 `  E) e5 R/ O
#include <mach/irqs.h>
5 s. F: i& E& D6 p; o' P2 ~! V6 z) l$ R; p* h8 A/ m7 F( f% @: p
#include <asm/mach-types.h>/ J# g2 w) I0 N7 B. _" f4 S
#include <asm/mach/arch.h>
! k1 M; R/ Z& E* O#include <mach/da8xx.h>/ V( c# b9 v1 E
#define  SYSCFG_BASE   0x01c14000, Z) t6 M& s6 _' G" n0 u2 {
#define  PINMUX1_OFFSET   0x124 ( d4 F" I5 I( E2 q0 d0 K% B$ V
#define  PINMUX18_OFFSET  0x168 + s$ V4 [1 d9 ]8 m0 a
#define  PINMUX19_OFFSET  0x16c  K$ L0 m4 v: {& v, `6 U+ ^
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR  d4 y1 k0 Z* A; y' v  j" C" ~
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR  s0 c% Y$ a+ b5 m0 R
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR! r- J* ]' H1 c8 p2 `, G9 ?
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; ^, E9 X7 i# C. M2 b3 _
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR3 n+ O5 O: e7 ]' S4 _
                           
7 M" v8 @1 x2 U. u! F) T#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 ]( ~8 X8 W7 h% T/ r/ T  u, X#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
( I  ~5 o. _2 S' J//PSC& Y1 c- r' [1 i9 x+ i! l9 K
#define  PTCMD_ADDR   0x01E27120  
0 A! p% S) }: h' `, s#define  MDCTL15_ADDR 0x01E27A3C
. j# {( B7 t  `8 L: ~3 B#define  PDCTL1_ADDR  0x01E27304
- o) b$ ?( t' q//GPIO8 direction
# Q$ Z- q; y8 j7 Q5 _# m! T4 U#define GPIO8_DIRECT  0x01E260B0
; @' j+ U) E6 E; o+ M6 a  z#define GPIO8_OUT     0x01E260B4( ]* R7 U2 }/ ?: i
#define GPIO8_IN     0x01E260C0& ~( x) v3 ~, k/ ~

1 R6 t8 U1 I. L# C0 {7 p" F//#define MCBSP1_RINT    99              6 T- Z8 z9 I# ]- ~9 k
//#define MCBSP1_XINT    100  
1 I" R% ~0 h4 Y* ?static int MCBSP_MAJOR=239;' ~' m* b/ k- \
static int MCBSP_MINOR=0;( Z  ]; I9 `$ z( k
static int count =1;3 [# J9 ?' d2 j0 Y. L

) |6 L2 q% B3 j  s% O#define MCBSP_NAME  "MCBSP-device"! g4 ~' t& B# Z, s; s1 L. }( l6 b
4 {$ p- ^2 x6 M% j' l# G: q
static struct cdev *mcbsp_cdev;
3 E, ]# {3 a- m$ l* }static struct class *mcbsp_class;  M, l/ }& L1 d( A5 Z' T
static dev_t mcbsp_dev;1 o! N0 G1 |! W, A# T$ O/ }' G- E
unsigned int DRR_data;9 o% M% a! a6 Z5 R8 u& ^) Q
unsigned int DXR_data;
1 `7 {$ A% F( |- F* Nstatic int mcbsp_open(struct inode *inode,struct file *file)2 C$ C2 O- ^! R4 d  S; |
{8 x# o" w. u! x9 Q
   . N2 {% v; K$ {$ M! p8 \: E
   //interrupt enable,initialized
3 \( N3 Z4 ~7 P/ }   unsigned int temp;
! n5 N8 `5 b$ x. p# x1 f   //SLEEP_EN(GPIO8[10])---0! H  d8 E7 h1 m6 z/ A( S9 ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 k4 S/ r4 T9 b6 {8 W  z   temp=temp&(~0x00000400);
( A( L' X( U# R9 b& J   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
9 ~7 q6 [) O, R: T3 T( w  //RESETn(GPIO8[8])----0----1# v8 o* b* Y) @
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 \' H. f* g7 R! K* o$ p' N  q   temp=temp&(~0x00000100);
  \  j3 n. Q$ D2 R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
% W/ q) v( ^' s5 k   udelay(100);
; o1 y$ m. Z2 L7 m9 N; n6 U2 H( c2 A* c   temp=temp| 0x00000100;
2 B" Z* R( C0 A8 U4 Z" R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
: z7 a" s3 j) p   udelay(100);6 y6 r9 \1 ~, M3 [/ k- e
   printk("open success!\n");7 S9 _. @. }' P+ s. J4 G
   return 0;
, p+ [5 j5 K" t5 m2 i}3 [' @5 V  P: i5 Q, o3 R
$ a( ~  y1 W% E! ~5 L
static int mcbsp_release(struct inode *inode,struct file *file)
. D7 H- z9 Q( f& \" b{
( q2 i6 M( |7 Y( l0 X   printk("release success!\n");+ j6 }+ `; ~) ~# n
   return 0;
8 v6 `/ [  M, N/ Y: M5 N}6 y$ i' L5 ]) K0 m* V. I

. Z) ]) b9 [7 A. M; Z& ]& W* I* fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 s- o3 q3 {" N/ K  y+ u! d0 G
{' z# t% m. T( o( I# c3 O& Z
    copy_from_user(&DXR_data,buf,len);: N$ z0 A0 d  i" k) H
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
( r8 l5 O, T8 i8 p6 i0 k7 U4 ^    return 0;
( }( a$ B- ~$ \: K$ S+ ~! @ % r1 Q8 S) i; j% Z- Y5 c. e1 ]6 h
}& X2 i1 I  ]1 P2 J: d! d9 a

. r% P: Z; ^& Q( w  Q1 F1 Lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( E7 `7 G! w* J% z{
$ S1 I7 p0 C2 o" W& R( d   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( r3 E1 z7 J% g, y7 Z5 }
   copy_to_user(buf,&DRR_data,len); $ |2 ~# j6 s2 Q0 d. G. @1 e* ^' A
   return 0;) m! R4 l" }- r( \* m* Q+ u0 f
}
7 r" x, A% k& Y4 @
; V9 m$ j6 d2 X" m5 V2 C; X% `+ F
) T5 Z% b% {2 U) ?static struct  file_operations mcbsp_fops=
* Z. J; ~& z- k8 ?) `( j$ B{' h2 r" A6 g0 ?- z; q1 h
   .owner=THIS_MODULE,% ]6 f/ d& w- r5 a0 e
   .open=mcbsp_open,
( M, M5 g, j& o) W  n   .release=mcbsp_release,
$ d- N; T( x# V4 F   .write=mcbsp_write,5 V9 H4 Q) ^3 Q$ `- I0 @1 m
   .read=mcbsp_read,3 N! p: Q) ^" r& c, H7 ~2 s
};
! u  U' }: N( d) Y# K2 Q& Fstatic int __init MCBSP_init(void)
4 C) C  l9 ]8 J, V8 h% r{
8 x8 ~& ^1 q% p5 ^9 D   int ret;' r' K0 u' x% r" {, K- X: M
   unsigned  int   PINMUX1_REG_old;& B0 |; n2 c* l9 E2 A
   unsigned  int   PINMUX18_REG_old;
( I. B) u- ?$ A8 e; o4 S5 d( x" m   unsigned  int   PINMUX19_REG_old;, q* S) Q6 P- k* {9 ~
   unsigned  int   temp;  
3 q) m) Z0 \  N6 R2 @   if(MCBSP_MAJOR)
/ z2 d" ^/ V" I1 {, E( b3 z   {9 R& w% e7 B+ v
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' e# n0 J- v: B
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);0 u: V) ~2 {8 e) ~( B6 L
   }
6 }$ p: t1 c& \! j& ~0 k/ e. C+ ]; X) B   else
: T2 |/ _1 o1 c- ^+ z. r0 `4 [   {3 a* n& v- @' @0 e# {7 O
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ b5 {7 J" L, d" w4 ?: M0 v. t4 K% `
      MCBSP_MAJOR=MAJOR(mcbsp_dev);* i- s. R) U/ B4 N
   }
% g& h2 R: M, I) B   6 q8 {) ?3 g3 i4 n; B3 F1 B0 b  Y
   if(ret<0)
' T0 c' V: Y6 v: c; u7 l   {$ S* a, ]' H( u6 V) W
      printk(KERN_ERR "register chrdev fail!");5 g# @4 Q- ~) j! Z0 {1 Y
      return -1;9 K9 M7 f- [- e) Q' v
   }  z; a+ X3 C+ X+ P* ]. |0 }# F8 }
   $ x1 m- I3 K/ v" T
   mcbsp_cdev=cdev_alloc();
, U+ X7 Y1 i) O! J   
0 |+ v  I  a2 ]1 c# t& D   if(mcbsp_cdev!=NULL)+ W% G, f: [7 A* m
   {
# G& v0 i* {# p8 A6 t( B1 U      cdev_init(mcbsp_cdev,&mcbsp_fops);
  y/ G0 q7 ?* R* s      mcbsp_cdev->ops=&mcbsp_fops;- X" i  R" O9 d$ w% X7 m, ?0 T
      mcbsp_cdev->owner=THIS_MODULE;
6 e5 M3 q; @3 a, n' f! U/ S, v; Y      
5 a$ _0 m$ c9 A, }- V4 r) D1 H' T      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ v, G& c' \  T+ v) {. C
          printk(KERN_ERR "register cdev fail!");
- R, `5 d) Y9 \$ r5 L6 X* d      else. d7 F5 w7 o+ H, j, }- l
          printk(KERN_ERR "register success!\n");& T3 \+ d4 N" r
   }
0 l3 J6 J$ k6 x4 m   else& w4 I, z( J- ?4 b+ ?
   {
: |% q( ^4 u/ ^& @9 W6 B/ L      printk(KERN_ERR "register cdev err!");
, n# a0 p8 u( l1 b      return -1;
- m: b# m# X$ Q! a4 Z   }
' o" r6 \$ o, ]( n' z   0 N& U  K2 c2 F0 W) u
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) Y6 J' b4 h: y4 m5 Z4 s
   if(IS_ERR(mcbsp_class))6 P5 b7 i1 ^9 i" {" G% y, z8 V
   {7 R9 h; G9 e) |! Q+ N% Y) `
      printk(KERN_ERR "register class err!");
2 _0 h" I: L7 L. l! w6 d: I+ b   return -1;
* o6 ~, I4 t/ M/ B   }$ H) {2 X3 L$ _/ w% C4 a" H: @2 e
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- T1 u% N+ {: g9 y( E
, ?* j. p- a6 h8 [* N% G3 r   //PSC' d' S1 W9 E; R5 t' ~. Q
   //add Enable MCBSP  Z3 |3 A+ t: d8 Z+ J
   //test
9 B9 g, X, Q) X$ M   temp = 0x80000003;
4 H  M( P6 c/ c8 o: i+ o, m   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 `2 V# v& N$ j
   temp = 0x00000003;$ i2 j! C8 G4 L
   writel(temp, IO_ADDRESS(PTCMD_ADDR));1 d1 F' k0 [# n7 S  ^" Y4 H

# y) P9 J7 k  J4 y   temp = 0x001FF201;
1 q7 H9 U4 J  e* D8 |5 u  v   writel(temp, IO_ADDRESS(PDCTL1_ADDR));  s. n& f9 s& F/ X& N9 G
   
; h& E3 h8 d/ o- l1 e   //PINMUX  
$ n0 H$ {2 Q$ \, L   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,  B  `! i' F) a" k2 p) ~# R
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  , M5 X+ g; U0 E
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
  y( L; `) E! Q' Z+ h   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
8 W) m! k4 d! B3 h" \; n9 h   
$ s  `: p- Y9 U: I3 s   //SLEEP_EN,EPR,L138_SHK1,L138_RC
- b3 @5 |: F9 J. W   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ! F4 M; k: h  R# t( D( y- n
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   - S! Z$ r7 v) l
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 M; ]  d, L: F% k& J

3 g' v! ~! Z$ v( _* z! |! p& \   //RESETn,L138_SHK2
2 V- [/ Q' p9 h7 U6 X8 H4 f   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
6 l4 O/ y; f& x+ [! ]' F' t5 g% z5 H3 p   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   0 c% V8 e' |3 D/ H8 v! B
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);8 S9 P& P+ `4 h3 u9 `6 F

7 J1 Q4 }' L$ {) v, R; ?3 B; m- b
5 N4 E- K# B- E; E  P' q& r  //SPCR Register
% v4 ?; X2 H0 J3 c( Y$ T  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) ^: ]3 k0 o! F! N0 }! }  temp = 0x03000000;//(DLB=0)1 J3 X, ^$ [' w, G; E2 |8 q1 k4 q
// temp = 0x03008000;//(DLB=1)
% C0 Z& B# C1 X5 Y) D9 f6 f- F  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
5 h0 Z7 ~9 C. ?1 ?0 f/ l# N  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ r# r, C9 O1 B) J, }) L. Y) u$ Y  ^  printk("temp=%x\n",temp);
. i+ J" Q1 ]$ h; ^" V( I- B+ l
+ P% J2 @- ]- n& O   //PCR Register' e' v& }: g3 u* d$ E  v
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
8 i* {; _7 F2 t0 o* C6 D  // temp = 0x00000F0F;
0 `) d9 h, [* O* @# G& [  temp = 0x00000B0F;
, H9 G+ r, ]$ q/ ^* |* M; W5 ]* N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
4 D, H8 ~( T3 _' |  temp = readl(IO_ADDRESS(PCR_ADDR));  J/ x! q9 K5 t# C) K# _. S2 U
  printk("temp=%x\n",temp);  # x0 t- R/ q' Z3 ?
   //SRGR Register
) x) {0 L( ^" K8 [- C. ?5 B9 x+ ~0 c3 r   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11, ?& U( l8 |5 _! h% j( l8 Y0 X
//temp = 0x301F000B;
$ }* H3 V/ d; o   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
1 ^6 ~- Y% ?# U: V7 ]& q& R  temp = readl(IO_ADDRESS(SRGR_ADDR));  C6 O. ]* ?% d8 L/ g  |
  printk("temp=%x\n",temp);$ {! f6 r" l  L  C$ f
   //RCR
2 z' P9 B/ m# P1 j8 {2 S3 Y, b& g& g   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
  m6 E8 c; O+ K   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) w& W3 _$ L% I. }* W   temp = 0x00440040;( R1 c: p4 ]% U( o/ a2 \
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, d' D, t/ n4 `/ \) t; u: b   temp = readl(IO_ADDRESS(RCR_ADDR));
  j6 l6 _- t) L2 }) A, w6 ~* e   printk("temp=%x\n",temp);* M" o1 Q( u9 F4 g
   //XCR
  u4 [$ \& S7 B' B: t7 U* c   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
5 Z( O& d3 }/ k# n   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& O7 x$ j0 z1 u* Z) R& c# z: B' s
   temp = 0x00440040;
0 p3 a) ^) |) ~) ~; l   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   0 A3 k. ^4 V; l
   temp = readl(IO_ADDRESS(XCR_ADDR));
( Y; ~$ d# }6 R: C+ w6 D: `   printk("temp=%x\n",temp);8 ]. T' q9 s( d: T3 t2 E
  udelay(100);
- h5 U5 C  m/ i  //SPCR Register
. ^8 N4 y. T3 e  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) h. h1 g# U% O) [/ S0 d
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
* W9 S4 W4 C( y/ e( n( M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
4 f( l7 t5 _# B$ _. q: q  temp = readl(IO_ADDRESS(SPCR_ADDR));) w4 R. d. y0 N: L/ b% V+ H2 w
  printk("temp=%x\n",temp);0 a! v2 L9 V0 _, }; j: E; o1 K! S
  udelay(100);
, v6 F  i; {3 J) f) u1 `- U& A9 N
$ i4 k/ z! v5 X+ }  //set GPIO direction
/ {8 d5 r+ f9 y. d( V  X8 Y   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* d( l% Z- z0 d  `: t# Z
   temp = temp | 0x00000100;//EPR----input) Z, K# D' C1 n- h) e6 F) @: U- L, y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( {; B! y: a8 s! l3 [# P+ [7 ^0 r
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 I$ }: w- s6 r: {- x4 R
4 V3 D9 R( r. h
   return 0;
$ H( K* e; g: i* G, C% N- J}
& }; Q) T% F" o. v8 W4 Tstatic void __exit MCBSP_exit(void)
" h2 M- Z, n5 G( D1 s* F2 {{: s' x8 U) s7 Y% c/ s
   printk("mcbsp chrdev exit!\n");6 w) a) K$ ]8 ?+ W
   cdev_del(mcbsp_cdev);
; s- r9 {7 t4 Q2 V3 {   unregister_chrdev_region(mcbsp_dev,count);
; k; B: F9 p5 s0 ]" i   device_destroy(mcbsp_class,mcbsp_dev);$ m  }; S+ D, p) `7 T
   class_destroy(mcbsp_class);
, H0 L& j, v7 w9 G) ~' S$ W* M}
- J6 T" N9 \9 t6 V6 `5 j, `module_init(MCBSP_init);
1 \/ G7 z6 s. m) `. emodule_exit(MCBSP_exit);2 K% L" |9 Y# i- R$ B
0 O- @; T/ ~7 X) u9 N
MODULE_LICENSE("GPL");5 l$ \8 J0 w8 P' a5 O/ U

$ F' }0 g4 s* R: w9 z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ A! c: P) ]) j7 s  A
我的应用层的测试程序如下# Z" F7 R! `3 t, P) U& g
#include <stdio.h>
' v+ ~) z) c" J- c#include <string.h>9 B0 }# b7 h8 S" Q- C2 i
#include <fcntl.h>: ]8 _  X) H# `/ x4 i
#include <unistd.h>: |) r" {) \) H; c; Z1 w
#include <signal.h>* n0 d2 X4 {9 k, D. \. k& Z/ d2 h
#include <pthread.h>       //线程
! C4 S1 i% O( x0 I#include <stdlib.h>7 J* {! P4 t9 t+ K. X
#include <pcap.h>          //捕获网口数据6 H4 F# ^* M; Z6 e  F: d9 {
#include <semaphore.h>     //信号
; S( c4 P( I. p1 Z#include <sys/types.h>     //消息对列
" l" W+ h' X' E& G: I- j#include <sys/ipc.h>       //消息队列
6 f% x1 I6 N% _4 N! ]#include <sys/msg.h>       //消息队列, e: {- N- W" c+ Z) {& ?0 o% ~
#include <sys/select.h>3 E( m3 E4 a7 c* X, X) h$ x: J
#include <sys/syscall.h>
# P  U9 x3 k8 P+ a0 c#include <sys/stat.h>0 ]+ A. \  L; e8 @" N- l' s
#include <sys/mman.h>5 v. X5 _! W/ F% K" z) e
#define msleep(x) usleep(1000*x)
0 d& ]2 G' ^7 E( R
+ R( ]# A( ~6 r6 Eint main()
/ A+ u7 R" o" z" X{ ; |; K; T, X6 y! O) I
    //MCBSP,ARM与AMBE2000交互设备
& f+ ~% o2 j" ?3 M, i; Q4 V' y7 k9 _/ ? int fd;3 G6 Z: r7 L$ f5 X) N8 H
unsigned short data_write = 0x5555;$ I. A/ c0 j( @& X, Z
unsigned short data_read = 0x00;- F( g$ a7 _" Y+ k$ y; O. T
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% ]: _% N5 _  V8 {$ H
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) o9 h; ~" o5 z
   
6 h1 |1 _) ^) g) [& s  n  if(fd < 0)
. N1 X/ S6 ?( I0 d  {/ d( @4 j( Y! k; L" m2 Z9 }3 w
     perror("open failed\n");
9 ]* V* A7 f' Y+ ?6 x9 n     return -1;$ v, [1 s4 c; [
  }
% ]$ E( B- j  D+ B* Q& H6 |  
# {% ?5 v5 e8 U0 a! W5 i  while(1)
  X9 n2 p; r$ O% f3 q  {
. R9 L4 ]% Z4 a) F+ Z& J9 P   # b! O4 q: v" L' F9 U& B
   //AMBE2000每次读写是24个字为一帧' k: z6 \- y+ N# k# O
   //写数据时将数据在底层存储起来,等到中断的时候再发送
% z6 M% V6 I: z8 @  M5 k   //AMBE2000输入数据是以0x13EC开头的
) l; p% H6 @5 `8 w" Q# x   write(fd,&data_write,sizeof(unsigned short));
8 j! U  d( U" T# [3 u5 A2 _   
! ]: Q  p+ |# w9 J! K   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  3 ?& x& e9 h7 I4 p1 W. J6 m0 Q" |
   read(fd,&data_read,sizeof(unsigned short));
5 ~1 K& @: a3 w   # u1 H4 {7 G0 a& j3 x8 |+ u; M
   if(data_read == 0x13Ec)4 x# i" e; q! e2 `1 ?
   {
# g5 Q" m! e. _( o# w+ X. t, y+ g' D   5 Z+ L& X" W1 @, J
    printf("data_read = %x\n",data_read);% }, K2 O9 v4 A# R, E$ M8 a
   }
7 f# j/ U8 v8 s, w4 H; @  e   - r" M4 G- F  L7 v5 K% @
   msleep(10);5 x: q! c( H2 V
  
$ }5 W# x) W8 Y2 R: i  /*
8 l0 A  a1 ~' b. H   ioctl(fd,1);   
! U( q; h! U/ J5 ~  r sleep(1);, B  S% |; {1 u% k/ |
ioctl(fd,0);5 [. k/ q6 h4 p  X9 r0 [" T
sleep(1);
  P9 @/ _/ T% s) L2 }' U3 f */ % v* C. g1 L# g
  }   - {$ i: e, R; O  U; K; w
return 0;
: H" s0 K3 `6 k - t0 K) I; L0 M/ V* t! k% ^& D
}& S6 j" }# M1 L  a! @1 i, D

, u' M# Z3 Z3 E$ R7 Q, O( ?8 R7 s多谢各位指教,谢谢! 急) K) `' O" Y. N; \

4 d/ z3 H9 d: M# U6 y& Y% [
- y5 ^4 f% Y: a6 J5 Z3 N; I- Y- n5 b8 g# E

7 C$ o0 v& \) @% f  ~/ J( M, a, r3 B2 P. |  @+ ^4 I" k5 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 09:07 , Processed in 0.069345 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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