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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % R; S- H- `( l+ I4 t
/*7 C% e2 s' D# E" A" [
* Copyright (C) 2009 Texas Instruments Inc1 D" q! E1 e# X1 F& z
*
+ L7 n/ U- E2 q8 e0 `$ Q$ o * This program is free software; you can redistribute it and/or modify" G# `7 S& r6 \4 i
* it under the terms of the GNU General Public License as published by# f: D7 M) z( s# t, W8 d
* the Free Software Foundation; either version 2 of the License, or) e& S9 n3 r' |
* (at your option)any later version.
: o& f8 u2 r2 ~' u/ C *
5 `- i, ]/ D  C5 o9 m * This program is distributed in the hope that it will be useful,
, s4 ~$ ^% g. _" `! ]+ M, x+ [ * but WITHOUT ANY WARRANTY; without even the implied warranty of
" m; w  T  x, @: L * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ p$ R( ?; ~7 K3 {/ b
* GNU General Public License for more details.
& W& p( ~, _5 y  p4 F$ Y3 I# Z *
1 m  c4 {$ f8 s( G. i * You should have received a copy of the GNU General Public License
/ I0 ~  w: E- \+ A * along with this program; if not, write to the Free Software# O/ s# P/ x8 j5 h: f7 Y1 v3 @
* Foundati
) b- h6 k1 [; u9 K8 K. c) s, r7 p# L6 K*/4 s! [. }2 b/ Z  R
#include <linux/module.h>
1 K+ j  _3 @9 V, Z! Y  c#include <linux/init.h>
3 {: J8 [4 L7 T4 J$ @" o9 w  T& _#include <linux/errno.h>
% u. n! W% {% Z3 m#include <linux/types.h>2 {3 @& Z( v. n8 ~
#include <linux/interrupt.h>
+ N2 Z# C! L5 Q' i/ ^5 }#include <linux/io.h>3 Y- G3 C5 v& S5 N- F
#include <linux/sysctl.h>
  {* n( b, c; w% ~* Q#include <linux/mm.h>  o6 o0 B+ b5 z% A# F
#include <linux/delay.h>$ J( ^- G- x4 o- w6 v9 ^
#include<linux/kernel.h>% x, r1 J; t2 g' Z) g* @9 _* C
#include<linux/fs.h>: M3 [7 ]7 I; a+ y
#include<linux/ioctl.h>
4 N' r6 @. a8 x3 z$ x- @( a$ S#include<linux/cdev.h>
% R2 [* `. a) J: X1 J#include<linux/kdev_t.h>
6 a6 _! s0 h& y+ c8 o6 B#include<linux/gpio.h>
# F9 j# j5 j* ?% ?1 }6 M- L$ O' O#include <mach/hardware.h>
: g1 V! g% G% K- A9 i#include <mach/irqs.h>
# ^) \- M  t. F3 x. d9 e" [% u
& d9 N1 ^# C6 q9 J" c* U) C$ {0 C#include <asm/mach-types.h>
) A- Y! N3 g# F4 q$ {#include <asm/mach/arch.h>, O. ~; X3 i, N3 q9 ?
#include <mach/da8xx.h>+ @* w0 m% H6 m
#define  SYSCFG_BASE   0x01c14000) D" R+ J( U9 Q" ]  x
#define  PINMUX1_OFFSET   0x124
" D$ Z3 ]9 |% y, J, v#define  PINMUX18_OFFSET  0x168 ! \' M& A0 h5 y; M
#define  PINMUX19_OFFSET  0x16c7 \2 g/ Y' X& X% f/ i
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; `* _' |3 A) A$ R; O1 |# \+ {
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR$ Y, X9 Q$ P: @0 T& v; z9 K- p
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
7 G" z6 \4 f+ v+ g0 g#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  ^) f8 q0 T: x4 U
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
& @0 ]7 |' j# X' C9 j7 r6 t                            1 Q/ M" r4 n) c& P7 Y2 n; v3 h
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ j4 e! \' u; ?
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% z# Z6 D( Y0 [; c& H' B
//PSC
5 K/ p1 b, q7 p9 k) U& m#define  PTCMD_ADDR   0x01E27120  
) i" r6 ^" g; M/ J% S% M* f#define  MDCTL15_ADDR 0x01E27A3C
& d# q6 G+ ^, b& y#define  PDCTL1_ADDR  0x01E27304% ]( K6 m/ M, A/ r/ V5 {2 Y
//GPIO8 direction& {( s1 l# K9 n/ b" k8 }
#define GPIO8_DIRECT  0x01E260B0
7 s4 w0 I/ k/ p( D( m#define GPIO8_OUT     0x01E260B4
: a. ~% |* W2 u2 U/ U/ ~8 y#define GPIO8_IN     0x01E260C0$ v+ Z3 e2 f3 r. s" \2 H; X7 |! Z
, i$ A+ j5 B( P. L' b
//#define MCBSP1_RINT    99              
8 `  p! O6 o- v- X% e5 P: g0 Q0 a//#define MCBSP1_XINT    100  
# i7 ~' g/ s8 v; L# i; v) R. G5 }static int MCBSP_MAJOR=239;9 y  A5 X0 Z, I9 L
static int MCBSP_MINOR=0;9 t( u. R% N" k5 X( n; i
static int count =1;
. Z1 {& W+ l/ {8 ]& K) i- `' w7 T- r: H/ x: t$ O
#define MCBSP_NAME  "MCBSP-device"" }2 p6 J2 N8 K- Y$ _

) n* O- b- M$ w& z0 H2 [  Kstatic struct cdev *mcbsp_cdev;
3 Y( _& f* R, j$ h) u3 P# r" ?static struct class *mcbsp_class;
! F$ A& Y# z6 O1 d% ^static dev_t mcbsp_dev;
# |# c6 A, S+ d7 o# M( wunsigned int DRR_data;9 s: z+ i' s8 S
unsigned int DXR_data;
5 G' g7 n1 f1 j$ a$ ~static int mcbsp_open(struct inode *inode,struct file *file)
' I2 t/ |8 l- S( \: q: ]{
* V/ ]' w" c4 M# @   
# N1 y$ J) q* ?) w* ^! v   //interrupt enable,initialized
* S6 m. ~1 G5 h, K2 A   unsigned int temp;
  n& m: D" z* n* u/ d   //SLEEP_EN(GPIO8[10])---04 o: y/ k( w& _0 y+ W" c8 ]1 I
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 S8 t: E+ b, e! u3 P   temp=temp&(~0x00000400);
2 s7 S* H$ D) t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 p4 m: E* k" h* Z* _  //RESETn(GPIO8[8])----0----1
4 q9 ^3 C, e! K" @   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 N, l! X# U2 V& v4 x5 U- k3 V   temp=temp&(~0x00000100);
8 M0 T6 v5 j0 |- G6 D+ o9 ]   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 |7 m) K3 B) V$ g1 l, n
   udelay(100);
) v9 x' M5 x% l5 Q4 k+ W' W* u; E   temp=temp| 0x00000100;! v" ~( }% ^" u2 [! P% t* o: w6 c$ X
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% }$ t$ H: p1 s* V% p+ {
   udelay(100);
4 T8 }8 N  m0 `$ B   printk("open success!\n");
& r! H" R7 L# }1 L   return 0;9 u/ P2 Y& u. e# p& t6 t# s
}
! M% }5 R  ], X. ^& V/ N& V& B) {, v0 p2 J; ^2 T% }: w9 ?
static int mcbsp_release(struct inode *inode,struct file *file)  C8 d$ w+ i$ Y% `& M" K/ @
{
* _7 f* I& Z, L* I$ E   printk("release success!\n");
9 {. Y  D* q6 \7 k# f8 M8 E   return 0;7 J/ z2 I$ |8 `0 |
}9 r$ R# Q7 Y5 V5 h4 b+ [8 a
2 m+ b! Z9 v# F2 {% i6 S, w; g1 }
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' |2 O$ Y6 Z: W4 e3 g
{/ J; q, s# v4 C; n4 t- A% c  M
    copy_from_user(&DXR_data,buf,len);$ f& X) F6 V9 y( X7 O2 A7 ]" C
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ! E/ K; |1 a: f5 d+ z. d
    return 0;
; d/ J2 R; g" f) v/ Q ( N5 p6 m: u& l; D
}
: d1 O$ X. i; I- p0 _) [2 r9 e
" S3 o. N4 z! c4 Xstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 H, n/ E* `% A; O' f2 P  R{ * M# f% K$ X) k: ]: `6 k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, O: [! W2 Q1 ^% |
   copy_to_user(buf,&DRR_data,len);
) q% O7 c9 p! h2 u3 g" E. K8 x   return 0;
. ]" e- [/ c( Z0 U! [& i}
4 W" `0 E) x- X6 C, D$ B& U
' ~2 f6 f" y! P# u0 A7 }6 X. ]
1 f9 n9 r( v' |5 w# astatic struct  file_operations mcbsp_fops=
- w' `& ], K- f{# V, v  M. |7 b5 F" }" q
   .owner=THIS_MODULE,
- D, P7 f) S5 M" G7 I7 s   .open=mcbsp_open," y0 d2 r" w/ J! x9 U# g9 M6 \
   .release=mcbsp_release,
) `. f0 T0 i2 N' x0 R- |* [   .write=mcbsp_write,/ d9 B" y- V! A; F, h
   .read=mcbsp_read,/ G( f( G- @* z, N6 G: _3 |6 S
};3 y' h: t; n1 `
static int __init MCBSP_init(void)
7 _( W6 e$ ~+ E8 R% C- C4 v{' h- q. r3 Q7 f5 y/ h
   int ret;8 m0 @1 {- K% u( o: Z) l% M
   unsigned  int   PINMUX1_REG_old;, X. t$ A' Q# d' a2 H  s
   unsigned  int   PINMUX18_REG_old;
& J! s' v/ z0 z) D   unsigned  int   PINMUX19_REG_old;  A  H  e9 f$ y% b
   unsigned  int   temp;  
6 D" B3 w0 N: i: }) l   if(MCBSP_MAJOR)+ G1 U# d& N4 f/ l: j! c9 J! t
   {+ q4 P+ K4 I6 Y- ]: y% @
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
: S& k: H6 O1 L  R2 Z      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: Z$ k* r4 A7 J1 r; |$ o   }
" x' [' m( @9 R   else. N4 R2 j$ f. f* o0 j7 `
   {
& v* @7 I4 g3 O) v0 f/ ^7 O      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);% v3 c5 I. w( ^7 ^
      MCBSP_MAJOR=MAJOR(mcbsp_dev);0 E; {( W4 S! Z! Q4 k  v
   }
3 Y" f' k: n1 V  p% s9 c   
8 p( q2 t  S. ^1 \  c9 M   if(ret<0); u/ p- A( n; Y! _( R# m% X$ _+ P
   {
9 W2 O  t3 B) H9 y$ G7 l- ~2 G; f3 ~. t& R      printk(KERN_ERR "register chrdev fail!");
4 \! f' [* _9 b% L! W      return -1;
  t# ]0 ^" {, _* r/ h   }: b& _: t8 u. z1 m9 n
   ! H9 G- x5 C4 H8 h' r* u, H, Y
   mcbsp_cdev=cdev_alloc();0 S* [$ I: g  f4 V: M+ x) B2 X
   
8 }! X+ F% u8 {/ p   if(mcbsp_cdev!=NULL)
/ ?* o# S) k* w! @8 m% W+ F% I   {
: U! V5 |+ R8 v* i6 ?6 G+ h      cdev_init(mcbsp_cdev,&mcbsp_fops);
0 n: ~( P* k' }      mcbsp_cdev->ops=&mcbsp_fops;
$ I# o( s% |  l# Q  p8 `      mcbsp_cdev->owner=THIS_MODULE;
( O4 L% x/ `0 h6 m" ^      
2 H( t' [: s0 q9 v- O' ?3 u% q      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ P- @9 i% c% H! l7 X6 y( ?! F7 e! k
          printk(KERN_ERR "register cdev fail!");/ c+ g% ^. ^0 \
      else0 w; X0 }' A* G+ K) i4 B
          printk(KERN_ERR "register success!\n");
8 N7 `8 M4 l% T/ S% T$ ^0 q2 W4 v   }- U# N* t- D* P+ U
   else
, e, o0 {+ w# J) v) S# i   {
; V- Z, d3 c9 K. w# c) O      printk(KERN_ERR "register cdev err!");% c. `# ?+ d& n/ s
      return -1;
$ D+ h* y' l7 J   }
0 U9 i( m  U. @( s; ^   
$ r0 L1 T( @8 V  t9 G. V9 q8 Y  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
( C, m( L- R/ A9 \/ \/ [   if(IS_ERR(mcbsp_class))
) D) c2 p8 ?# e* p. u   {
+ T" N( l) O' C* w! u) x# t+ n) b      printk(KERN_ERR "register class err!");
5 _7 [) K% b8 o  P3 j: n, g: I   return -1;7 x( J# d* j/ V
   }! l2 _& e2 [6 a- d! R8 q, T2 s
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ {" ~9 x% a7 k7 x& }  \6 B4 W8 s0 i7 S$ }. c
   //PSC, {/ T$ X8 F, L( k4 \3 _6 O6 K
   //add Enable MCBSP
' ~% t6 j% Z/ c   //test2 C" V! @8 v! r3 F, S
   temp = 0x80000003;/ K$ H/ \) X# l1 N! Z( `: L
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));, u( |5 D9 o/ M* Z) o: z( b3 L
   temp = 0x00000003;
1 E  j+ h9 A/ h# s   writel(temp, IO_ADDRESS(PTCMD_ADDR));, u# [0 h8 }( e& ~1 l7 Y

; Z+ y4 A! R5 @( `9 w5 b4 e: G   temp = 0x001FF201;
9 ?- x; b/ w) P5 a9 y! F: T   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; W# K$ h) m8 B+ Y
   
/ S  Y/ H1 [7 x) c( A- g; c7 |2 D4 b   //PINMUX  % j7 \8 `" ^: S0 E$ ^) p2 x
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,3 B2 S5 w$ h2 n
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 Y9 z& s+ c7 R& T7 s* W# n$ l
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ' E* J' c1 ~. j$ c# q8 Y
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# ^* O% x, O- p" C. o! r2 r
   
; D. k3 b9 k! x' n, V( U( G' A; H   //SLEEP_EN,EPR,L138_SHK1,L138_RC
3 e: Y3 W3 E( S2 L& \9 m4 [# M   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ' L# i; e1 m* v6 p& z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   , {* d! O3 [% E1 h7 u8 c8 c$ h$ H
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 j1 J+ s* s* j3 l$ n2 z/ e& x

7 X; o9 i2 m7 i2 X  o- Q   //RESETn,L138_SHK2
. X" J5 }) z* J; a# l   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
2 O' c+ Z0 w* U! l- \- j   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 X# X5 o# a2 Q* _1 I1 ]5 M; a* L   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ x, N* V2 N, ]+ U3 ?4 a8 Z
. u6 X5 T* [- y" K% l0 s
! z0 B; x; @8 Y+ B
  //SPCR Register
; j( U4 R6 h+ f8 Y3 \. y  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) U% L8 [, \2 m$ y2 T  temp = 0x03000000;//(DLB=0)5 X5 ?1 B2 f! z5 \
// temp = 0x03008000;//(DLB=1)
3 m2 G9 Q8 ?* T) c  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
" [3 n2 H! W6 \! I: s9 o! @3 N# j; H  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ @' H. i4 [& Z$ N! V5 U  printk("temp=%x\n",temp);
9 y; b# t6 V4 r7 U   Y8 F5 Z& J& _: q3 Z" R
   //PCR Register5 Q3 V, z; `. y2 H3 K
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; w: c- @" p/ Y* C! H
  // temp = 0x00000F0F;$ n- x% W7 a) z9 W
  temp = 0x00000B0F;
8 c- Z! ?/ R6 n. A0 k7 v  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 t* w5 @% o5 ?0 M& K  p
  temp = readl(IO_ADDRESS(PCR_ADDR));
3 P1 E- h- W0 J/ m! }# z9 N  printk("temp=%x\n",temp);  " |' w+ M5 _- U" a) V5 F8 I
   //SRGR Register2 h8 Y6 {. _1 b$ J
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" i5 R3 S6 _9 ~0 H1 j! }: N
//temp = 0x301F000B;
2 [4 t$ m. F6 h6 P6 V$ S0 S   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' W( V; P; m: d! [) l
  temp = readl(IO_ADDRESS(SRGR_ADDR));
* G% z! I" C+ {3 f& `  printk("temp=%x\n",temp);
4 V" N& y1 \$ O# t$ p1 O   //RCR
* \$ f. N1 B" q: P. N( P8 s   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, D3 M. c6 E# J- W# U
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
  t6 E) [! X! m' q$ k3 b" L   temp = 0x00440040;
- p. Z+ ?" g# V   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* d6 ?  X* A% F   temp = readl(IO_ADDRESS(RCR_ADDR));
6 G8 _6 A, l* e% F  l2 I   printk("temp=%x\n",temp);
$ W. C0 V; P8 v4 E' ]; U7 |2 Q   //XCR7 V& W6 @4 E! q
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-15 ?) O6 y+ Q. n5 [1 _" Y/ }5 s5 u4 {
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" Z* Y" d7 d+ f& |: L
   temp = 0x00440040;
& F6 b2 s3 M3 f, e  s. R- B   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 a% o. T- x' Y9 c) R; {   temp = readl(IO_ADDRESS(XCR_ADDR));% }! G- ~9 W, R/ }
   printk("temp=%x\n",temp);* @; T, \8 ~& w. m+ s8 @. j* P
  udelay(100);
  ~) |; u" G6 W9 ~' X  //SPCR Register
: j' c. q: y- ~) ^% D' U  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
  z& a+ N0 F, k. ?% F! p5 h* n6 N  temp = 0x03C10001;   //DLB = 0 VS DLB = 10 i+ W* w3 Y+ Z' K+ C- H7 b: Y  p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
4 d) V3 g- U, O: Z  temp = readl(IO_ADDRESS(SPCR_ADDR));! X  ^9 c. G+ \# B
  printk("temp=%x\n",temp);
& w9 o4 V8 \) }/ h; b  udelay(100);
! t: L+ V! ~/ t7 j5 a
! n; r: I% u/ h  //set GPIO direction3 I# F2 _* J* m0 I2 B  ?
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 n" e; Y3 ~8 O. k3 Z9 x9 \   temp = temp | 0x00000100;//EPR----input$ e) u8 |* d. Y: G  v  I
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" f4 [; O8 p( M: f4 h   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. x6 p  F9 m: J9 G* I/ _2 T
! M0 @, y! N4 E- `  i( t. p) C   return 0;
2 V9 {5 x0 _) a: p}" G$ Q* u/ u# g& [/ l
static void __exit MCBSP_exit(void)
! m+ l1 o9 T9 I{
5 O& W3 \! B0 q/ y, T% T   printk("mcbsp chrdev exit!\n");
  E( S. J1 t7 i0 r9 ?! j   cdev_del(mcbsp_cdev);
3 R8 c7 @" {* ~% s7 K* D+ c   unregister_chrdev_region(mcbsp_dev,count);
" t6 z$ ?/ y6 _6 |6 z7 Q/ O( F   device_destroy(mcbsp_class,mcbsp_dev);
+ b. B. c. P9 G1 p) v& g   class_destroy(mcbsp_class);6 X# @: f" @3 Q8 j) I$ k6 }9 |" a2 S
}5 \8 p/ L& X  {/ y- F
module_init(MCBSP_init);
' f  L) w2 [2 p& `% E) o# j1 c2 I9 umodule_exit(MCBSP_exit);  \6 ]1 j2 g- t' s. N; r

7 {) G! I8 ]* P% @4 K' |7 Y$ E# nMODULE_LICENSE("GPL");
" E5 b( t. T- Y0 E1 K+ L
5 a" _  M4 u$ W" Y& ^+ ]我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 o0 d. ?) b9 T8 S1 T0 p+ X我的应用层的测试程序如下6 ~5 H& ^7 i  j& S) F! v/ Y& X- u
#include <stdio.h>8 [$ p" O0 f% G* m/ ~8 _
#include <string.h>
  \0 G, E# M# a& r#include <fcntl.h>7 C9 V3 r2 O  f: L% c; e
#include <unistd.h>
' T0 ?5 o5 x1 L, d#include <signal.h>
9 o% E: r3 i7 L#include <pthread.h>       //线程
$ R" ]  I3 {/ U, m#include <stdlib.h>8 d5 m% h% k0 U# \
#include <pcap.h>          //捕获网口数据
, l5 ~3 s5 ^1 h6 _8 `1 k#include <semaphore.h>     //信号) U4 K3 }) {' `8 g
#include <sys/types.h>     //消息对列( K" e4 `$ M/ U. H8 N+ C6 D
#include <sys/ipc.h>       //消息队列
  I1 ?# o5 r- A; m#include <sys/msg.h>       //消息队列
/ u: U0 n* B" K$ d# x#include <sys/select.h>/ C' K7 N8 J' Y$ v$ ^! B+ k- H
#include <sys/syscall.h>$ ^5 e5 |' A# h3 M' p
#include <sys/stat.h>9 x1 K2 H+ O- S' h
#include <sys/mman.h>
' k+ V, o+ Y' D4 [: `& M5 z1 @#define msleep(x) usleep(1000*x)
+ n: X- s8 a* P/ J3 C0 M) l/ t6 a6 Y* q" T
int main()
2 t: V; [" e1 D! `{ 0 |7 E5 Z# E6 Q9 |, D6 D; c4 {/ E
    //MCBSP,ARM与AMBE2000交互设备2 o3 o; ]0 e6 g
int fd;
+ `  n" l2 f3 h  P8 S4 n unsigned short data_write = 0x5555;" h+ l' Y' a7 A4 R! m
unsigned short data_read = 0x00;3 D5 ?- x7 i" Z8 f1 K
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 e8 y: P! r, f; f$ u //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. Z/ h5 M/ o* m' E- |
   
6 L* v2 x; v# g  H  A  if(fd < 0)
0 n7 r5 N; {- Y* c  {
# U0 j" ^  A$ a2 e     perror("open failed\n");! `! ~, J) F" @" E/ C# B2 c$ z
     return -1;+ @, D# L( j* s: H" \) r4 k
  }# `: Z& x9 Y' o
  
2 x; k, u" B& I# O  [  while(1)
& E. g+ v+ R! y6 o, z/ [/ V8 U  {
4 e; t7 Y3 i% `   " A# k9 x, b) T9 o1 W/ r
   //AMBE2000每次读写是24个字为一帧) K6 _2 e+ m3 Q5 L2 ^( Y# I1 x$ j4 G
   //写数据时将数据在底层存储起来,等到中断的时候再发送0 r0 g' F. k/ C
   //AMBE2000输入数据是以0x13EC开头的
  l. {% F$ s( K" ?   write(fd,&data_write,sizeof(unsigned short));
& q3 \0 k* Y! x5 [   
8 |( A- A7 a0 j& J   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & u* H) }8 x' e! o* Q
   read(fd,&data_read,sizeof(unsigned short));
3 e+ p9 Q: x1 _. F9 c5 Z   
  c! V9 W0 N. y9 b: f, f2 Z   if(data_read == 0x13Ec)7 T  D. q( L. q$ u( I
   {+ v3 ?: O; b/ c. }1 C
   % D1 r, L) x3 l. T5 p9 R! y- a
    printf("data_read = %x\n",data_read);
4 g- O& e/ I7 X2 u0 \: {% p2 f   }
8 L0 [. t8 p3 c   2 x. Z5 m1 P; `1 k6 p7 Y. v: ~
   msleep(10);
7 `  z# y: ^6 K( U  . Z  l% m$ H& @
  /*
! W6 ~7 a. x$ O& \( t   ioctl(fd,1);   
' C$ w8 r4 @1 e  L sleep(1);0 G+ u& q8 d/ E6 v# i% e7 M
ioctl(fd,0);! J5 B+ [4 w7 e
sleep(1);
: h$ s! ^' u3 d+ ]( [$ v */
$ h6 F8 X$ {# j4 \: }; w8 u  }   + ^' C8 {, t& c" H5 D7 E/ e6 n
return 0;( c. v& H& a$ s; t2 p

, K5 Z, |1 c4 D: d" ]/ @}
% K7 B5 z8 X* ~5 ~% \) @& a  [! z( h& V
多谢各位指教,谢谢! 急
2 Q% p& Q$ K+ M( P# D9 w
: `. I2 l9 g/ Q, m2 s' Q1 S6 P: A, Q+ k3 h
* Y( p6 R4 R+ P" p, K& v) @/ N3 w
0 ]7 l. b/ e2 `8 L0 x, ?) W* m% X" `

4 I" X) h5 O! d" [0 D- m% ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 06:21 , Processed in 0.047590 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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