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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ d. \0 p8 `! W7 D# ?/*0 y5 A$ [# O2 R/ s* k
* Copyright (C) 2009 Texas Instruments Inc4 i; E" g% N4 @/ `. q+ A# o
*) g" v! V) b) H2 B. ?5 _
* This program is free software; you can redistribute it and/or modify, g/ `6 O+ {4 d% [" e
* it under the terms of the GNU General Public License as published by+ C# O6 q  U' ]/ S# a* c- p; }7 _
* the Free Software Foundation; either version 2 of the License, or2 y/ t9 {$ k- {8 |2 {; A  ~9 w
* (at your option)any later version.& B8 ~6 L) q, G
*  a  c- h0 T! K$ b" y2 m
* This program is distributed in the hope that it will be useful,
2 W) ?  T2 Q7 n: q * but WITHOUT ANY WARRANTY; without even the implied warranty of. G& N" K# C5 y! ?& _2 y' ]. f
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 @6 z4 b4 N( w: p: W * GNU General Public License for more details.
2 p! w4 Y9 x3 ?( Z *
7 A- b. g; E& p4 Z: Y * You should have received a copy of the GNU General Public License$ j7 n; r) l; V* [) M+ e$ t
* along with this program; if not, write to the Free Software
+ x9 {, A, c; i0 q- H * Foundati# N7 Z; t' k$ h. O. g
*/
3 {/ h5 `) b$ Q- F/ k9 ?( d8 K#include <linux/module.h>' }/ w" i$ y$ z; H1 R, l
#include <linux/init.h>( B# u9 n- O6 u0 Y$ l: W# U
#include <linux/errno.h>2 {0 p' c6 L' q
#include <linux/types.h>6 D! \, `4 B# x9 `) \% l& J) U& V
#include <linux/interrupt.h>" c2 r, x2 f9 a  l
#include <linux/io.h>
5 d0 T) ?: O/ T$ O! \% c& j) `4 l#include <linux/sysctl.h>
& L5 M9 y$ \7 ~2 T* W4 y#include <linux/mm.h>
  H! c- l2 b8 r' l* y#include <linux/delay.h>
7 r* A3 ?* T! P- y! @#include<linux/kernel.h>, @3 @: W' \# `' L/ b. i
#include<linux/fs.h>
  P  p& [9 l7 W  k$ H8 |#include<linux/ioctl.h>
! e* `+ o8 l. w7 M: V' E#include<linux/cdev.h>
! K1 ?5 Z% o3 _9 a/ v1 c8 A#include<linux/kdev_t.h>
" X( j" x: o( [; ~#include<linux/gpio.h>1 M8 ?& R( |5 ~9 V7 E& L4 k# U
#include <mach/hardware.h>
& \8 j, Y6 W+ i# P9 @, d% w9 x3 _#include <mach/irqs.h>
3 Q  B& m# J% e/ F+ u" x. E$ G  ]+ u  f' h" N
#include <asm/mach-types.h>  B9 I& c2 D- u/ E
#include <asm/mach/arch.h>
& L0 h; G* e% Z5 {6 J#include <mach/da8xx.h>( T$ Q$ R  g3 p
#define  SYSCFG_BASE   0x01c14000
6 s# m2 b# r3 V8 Y9 F#define  PINMUX1_OFFSET   0x124
/ v7 ?5 d& o: x3 U#define  PINMUX18_OFFSET  0x168
' x' |* T& `" P. n. I#define  PINMUX19_OFFSET  0x16c
6 O7 c/ R- W9 x% U+ K8 e#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR# b2 s& p, Q' `, `
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ L* n( N* u% S0 _& t$ v: a#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& B8 f; r3 e  [' J0 y' d#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR3 |7 M1 \$ Y0 e
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR( |" b* G, I! ]* O# r4 _( P
                           
% _* }, U# F& a- Z7 Y; B5 Q+ R$ Q' S#define DXR_ADDR      0x01D11004  //MCBSP1_DXR4 p1 z* I" N9 {$ F& c+ M2 w
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR, m$ |2 v  n# [, H/ j
//PSC. X/ [; e+ m, R4 w+ }/ c
#define  PTCMD_ADDR   0x01E27120  
% L; b( ~) y1 x$ Y#define  MDCTL15_ADDR 0x01E27A3C
( i, x. N' N- L9 S#define  PDCTL1_ADDR  0x01E27304' b; f: x9 e+ W2 x( X3 I
//GPIO8 direction
5 D: k: v! b3 h8 R9 w0 ~#define GPIO8_DIRECT  0x01E260B0
: C8 n: I9 |! I2 R  q#define GPIO8_OUT     0x01E260B42 ]  u. z) |: Y: T. l$ |: P& w
#define GPIO8_IN     0x01E260C0
" L1 G5 U! `, E! y! F: G
/ `* m; U! W# v7 Z/ Q//#define MCBSP1_RINT    99              
; N" @- p- t; E. Z0 b1 b4 H//#define MCBSP1_XINT    100  4 ^" D  n! n3 W. a8 x; O
static int MCBSP_MAJOR=239;
' _; j' S/ s8 k  o8 Y5 ]static int MCBSP_MINOR=0;
7 E* ]8 \0 e: P2 Tstatic int count =1;
9 l7 R2 @' O/ V
+ N  K; f  ^4 m0 a+ U/ M#define MCBSP_NAME  "MCBSP-device"# U. G: O% G( z* S
" M( _" ?; M- k! I! v$ c2 i
static struct cdev *mcbsp_cdev;/ x) l% N$ J9 T3 @! ?) L0 G
static struct class *mcbsp_class;
9 X6 m. [. O2 J4 Ostatic dev_t mcbsp_dev;
" x- ], f. Q, @& U1 m" Nunsigned int DRR_data;, a# q! R  V) S
unsigned int DXR_data;/ ~+ T  w/ k6 [: M  I
static int mcbsp_open(struct inode *inode,struct file *file)
7 d/ w2 {2 A" p9 b; P{
& ^$ t, [# Y# H% g' \   
4 v; G# Q1 Y. i! j0 W   //interrupt enable,initialized* G. i' f  B/ e4 j' y5 j& H
   unsigned int temp;( K- c" B, p$ u4 t7 g
   //SLEEP_EN(GPIO8[10])---0' l  O8 n: ]6 o9 X0 l
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 R6 |9 Q6 a5 s$ u
   temp=temp&(~0x00000400);
' W0 t* @6 g" A4 d2 ~1 ?7 l. n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: K$ e8 C5 w- J) y- j. N, I; B! u  //RESETn(GPIO8[8])----0----1
. P- L7 f, ?2 M4 p6 v& A% d* E. X. C9 i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- E* Z1 E/ O! X6 `- u   temp=temp&(~0x00000100);6 o4 s: K* G" ?  _  M/ e, U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0: [" I, Q- ~+ W( t# }1 r1 L
   udelay(100);
6 i5 {' B2 h7 Z9 `( p* ?# |   temp=temp| 0x00000100;
' Z; D. S* M1 F   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1: ^. Q5 |9 ^  c: q- v# |* S$ o
   udelay(100);
- b6 F# \* i( o7 f" X4 N   printk("open success!\n");
! M: _- a& J; o& C- c0 y8 g+ ^   return 0;& D5 o3 g$ W4 y  ]9 C
}
$ V* N) P$ ], M; J$ l0 h
5 ^" O3 _- Z9 e  _& Rstatic int mcbsp_release(struct inode *inode,struct file *file)
/ L4 `8 A6 Z. ?( O& H5 G0 a{
( Y: Q9 u( {- h   printk("release success!\n");; k: |! V/ e3 s8 \: U7 F+ C6 D. z
   return 0;; Y, w. {8 }; X6 K
}! _0 Q# S7 l% U( {$ [

5 [- E! `2 b1 X# A4 W$ M% A  Astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 ]. j8 [5 B4 [) O% k
{# x- H7 z$ q3 T2 O9 b) t) n5 a
    copy_from_user(&DXR_data,buf,len);
8 }" \! l6 @8 y' n    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
5 e" A9 k3 o" x$ u' m# F+ _3 A2 Z. m, P    return 0;
1 Y: w# `, d, e, Y ; ^( X/ t$ g- |) ^1 Q% D
}/ V% m1 A8 _, x# u3 o; f+ T

+ Q( r% ~0 ?1 e# S2 W( Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& W% ~* }4 C* r7 F3 f2 z. o
{
% \* I$ M, `* ]2 H( C9 p" l   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));) [0 `8 m# R3 j- P& p2 T
   copy_to_user(buf,&DRR_data,len);
( Z2 ^& T* z2 s- t0 N   return 0;; S( Z  L" d5 k' c, V% p- ^
}0 n7 Z4 c1 f6 r, J; f$ y8 E. }

# D8 B/ t  {( d7 ]; `& g& ~* |  P. |% Z, @! }! x8 C1 o2 Q  D3 J' Z
static struct  file_operations mcbsp_fops=
* {9 k; [" n' x# f{
% M: r- f' e( d; _$ F   .owner=THIS_MODULE,  ?, R/ I* W( b
   .open=mcbsp_open,- A& e, A7 w6 Y5 @$ ?: F( @
   .release=mcbsp_release,4 d( e; N* f0 f) {1 ~
   .write=mcbsp_write,
/ l+ k( `& G/ L6 q* N. E   .read=mcbsp_read,
- Q! I# f6 Z( @0 P};
: q. S5 _- W3 g6 l4 ~% \8 b: bstatic int __init MCBSP_init(void)# [5 U0 V5 ?- h/ o4 K  @3 ]
{
1 Y  x, Z7 j8 u; c   int ret;, g/ o( t' P. l
   unsigned  int   PINMUX1_REG_old;8 e3 B3 e- Y7 W% S/ P" u: x
   unsigned  int   PINMUX18_REG_old;/ I" n1 A, d8 L' ]" b- n! ?3 O, N
   unsigned  int   PINMUX19_REG_old;
, [3 N! \# I( f   unsigned  int   temp;  
; |& R  k( `' h6 c' t/ m" J% ^, {   if(MCBSP_MAJOR)
$ {7 k9 n: \: H1 e+ E# y$ _1 K   {
3 U: a& r/ O% T3 ~9 ~+ m: H' s) O      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);6 o( j/ p2 t$ a9 H$ G
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 t4 O) [+ w% y: A/ u! \. v, u
   }" `8 @* C7 Q3 u0 Q8 r
   else3 L0 ^  G1 T& |# V  F1 Y. \& L# y
   {
5 _- Q; K, t! z  S7 y- j      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 N9 u1 i2 @0 X3 W; F      MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ v- M  c* d' H   }
$ ?4 q: }# Z9 [  I6 M0 ?7 M9 w: R  T) B   
6 Z% C; l; O! H/ Q  B   if(ret<0)* I# z; d( Q8 j: h. b
   {
; O) g/ S$ v; ]" c2 V" O. R/ Y      printk(KERN_ERR "register chrdev fail!");
1 c6 a/ Q% r9 T/ V3 A3 F$ s      return -1;: s4 `$ y- F  T5 Q9 {# D5 H
   }
9 I" a$ a* V4 J  t5 j5 T   4 E1 h, ?% p4 S+ u
   mcbsp_cdev=cdev_alloc();
* I; _2 V/ x/ a8 \' J- j8 L3 t   
- C+ s9 W, @+ m9 x, o   if(mcbsp_cdev!=NULL)
' c8 j, J1 Z& ~0 \' X2 s   {3 `5 N1 O4 y) a8 _% }7 d
      cdev_init(mcbsp_cdev,&mcbsp_fops);6 {8 b% s' f/ s
      mcbsp_cdev->ops=&mcbsp_fops;
4 p% }: i5 h! M' Z! V      mcbsp_cdev->owner=THIS_MODULE;: ]& i. [% H1 K2 i  o
      " Y& @# x7 u7 I4 e% o5 {
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 ]1 L& L! R( X6 B4 c) p          printk(KERN_ERR "register cdev fail!");3 e1 C0 D% ~/ b/ ^' u8 x
      else
% G( Z: k9 N7 w7 Z) ]' C" \          printk(KERN_ERR "register success!\n");
/ k2 l9 Y) u- _2 A   }7 R0 f  D7 O- o4 t( a# \
   else) j; o1 Q7 L9 B9 y+ E) k8 ^
   {7 D4 g: C# ]5 B1 n# V' H
      printk(KERN_ERR "register cdev err!");
& T3 E! \- V" A; x5 t, h% U      return -1;) O' f1 ^- R& |9 j9 j# ^$ o
   }/ T, ?; A6 b6 W
   . F0 j( t2 M$ J. r4 U3 }
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# x7 A" \' Y$ q/ K4 n
   if(IS_ERR(mcbsp_class))
" ]# F  E$ R3 }   {$ o; Y4 e' {' m7 T; t
      printk(KERN_ERR "register class err!");6 _  e* J8 `; a% a
   return -1;2 J& O4 M0 ^" U( s/ u
   }$ q3 i4 F! F+ O$ ]: Z4 z" {. i
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);% a( o( J4 N2 d
$ b8 h# u! l) C0 g# G0 E* J
   //PSC
3 Q/ @$ x0 G$ r6 Z# m- s   //add Enable MCBSP$ `8 U* B9 b/ R
   //test0 M" m. u1 y& J9 I! r$ R3 i# Q8 A
   temp = 0x80000003;
! F3 }  O# W% U) m3 j4 O7 D   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ L1 A* \( Y& E( l) G! @
   temp = 0x00000003;
- W7 L9 T3 r! E+ T% h   writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 s0 f: m( l5 q! F. h
9 I5 c; f: }7 S7 w. a% b   temp = 0x001FF201;
) s8 u% u% t# \; M! E7 r1 a% `$ E. {   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 W. u' V: l1 a; Z3 n( a$ r; z   
6 h) v+ B2 M/ ~- g   //PINMUX  
3 n& K/ a" P$ R+ m/ ]! w7 e   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* e" Z/ U. L0 P1 k$ g; z9 l
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 X1 E* y! v1 d# H( n6 R
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
2 g8 l- n! s* H4 H   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, p- P- k8 |2 c- ~   
, i% |7 r9 `; a7 y' t   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 V' z; y5 H1 x* G$ C
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
5 K2 J2 }, K: Z5 z! C' s6 ~  Y9 T   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ! V) V2 G$ X1 q6 _3 t+ w0 Y$ k
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);0 w9 w& g, _& O* z8 H$ E
3 Z( b* B* r# G9 ^. K1 G4 u
   //RESETn,L138_SHK2
- N" }- i3 R. q0 N& L) q/ W3 x0 Z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
3 q. S. }+ r) s0 v/ A* t9 R   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 `2 D4 S: [7 D9 ]   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 \  ^) _( r1 {

2 F4 T% w5 i+ U5 t, ]) t 2 m0 K3 v4 q- o" ]. L  a
  //SPCR Register- ^2 j  s$ ?( W+ Z; `
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. A' I$ H& L# F  h  temp = 0x03000000;//(DLB=0)
! ^% j+ C& }) H  F' r1 ^# a // temp = 0x03008000;//(DLB=1)
5 u) O- x2 P% \  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset- h) T% ?0 [1 z$ y4 `
  temp = readl(IO_ADDRESS(SPCR_ADDR));, s% P5 d3 I: ^/ h: W  h7 ~/ |
  printk("temp=%x\n",temp);, m+ U& g# K8 A. t' _  ~' ^
( ~: Z- {5 v% [! D& a9 K
   //PCR Register
/ z" |- e) g! i. R1 u8 T8 {   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 N0 n5 N. A& o5 h, U  // temp = 0x00000F0F;
7 T4 N# Q5 p$ \& t# U* s" g  temp = 0x00000B0F;% ~4 }* |! e0 v1 @" C1 [# O
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
; i$ X  L  P7 z6 {  temp = readl(IO_ADDRESS(PCR_ADDR));7 T/ l4 d$ n7 w! g
  printk("temp=%x\n",temp);  
1 ], y! a: W" W0 T" c   //SRGR Register: B0 g' Q. Z7 q. s$ s: r5 K( l
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==111 m9 o+ I: Y, I8 [, |: `3 V+ y  ]& u
//temp = 0x301F000B;4 G/ h; N! q2 p8 W7 o
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 }3 Z& }3 O( q2 @6 g- ]0 l+ Q  temp = readl(IO_ADDRESS(SRGR_ADDR));
9 z% u8 ^9 p; Y; l0 T  printk("temp=%x\n",temp);
9 e/ T8 Y( o4 ~! H3 k+ k   //RCR
/ Z# m; S( n1 E6 H- c" d   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ g6 P& B/ l: ]+ q   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 {+ @  t) e% V" j0 H) i# ?, w
   temp = 0x00440040;
& @4 g$ U) p* ?; I   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   / B# _# h# e+ l1 D. `
   temp = readl(IO_ADDRESS(RCR_ADDR));( |' O  \+ X" G- K- n1 @* w: A
   printk("temp=%x\n",temp);4 V) N  ?& F8 Q0 d4 F
   //XCR
2 V: B& h: O7 D) n   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& i- Z& l0 o2 \' \2 ]" k; o   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% g& R) |6 ?" B, `# B; B   temp = 0x00440040;
8 O( f# x' X  }5 d/ K" Z+ _* m$ @   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
: M! J4 p7 w7 t  M/ U   temp = readl(IO_ADDRESS(XCR_ADDR));
8 D* d5 n  S- n, |: k" q   printk("temp=%x\n",temp);  K# r8 C5 q# b3 u6 Q
  udelay(100);
% v$ ^/ j- T2 `/ d8 o- u4 Y- F  //SPCR Register
. d+ ~6 I3 c9 ?" ]- ?  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& Z% f4 A; u7 j4 x, ]  i  temp = 0x03C10001;   //DLB = 0 VS DLB = 14 d% \$ ?( D+ R9 ?9 U* @' D! R
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 n, J. q8 k. }' _  temp = readl(IO_ADDRESS(SPCR_ADDR));: _5 ]# Z" O9 W4 x4 }0 _+ i! H, f
  printk("temp=%x\n",temp);$ U! T% X/ H. t8 a7 V! n
  udelay(100);! o4 \7 ?0 n  A! |9 Y
9 n  R5 t" T: H, @' [9 F  u9 Z- _
  //set GPIO direction' D! m. [6 A' x3 S4 \0 Q. h: Y
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 w% A) x7 J; K  R$ ]8 ?   temp = temp | 0x00000100;//EPR----input
+ \4 r* g2 R6 p   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) G; S# H' e; O  y- d2 G! j/ c2 S7 b0 n
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 1 v1 b6 g& p: H# }
" W" }# a4 j& f; A7 j
   return 0;
0 H& K: c4 e; @: i  j4 n}" c: K# W0 S, P, s9 F- {/ K
static void __exit MCBSP_exit(void). a) F$ h* U, d- s" g2 a
{, R/ L7 Q6 b3 k4 @/ J' m
   printk("mcbsp chrdev exit!\n");) `/ Y4 H0 V- A; P9 X2 n* M
   cdev_del(mcbsp_cdev);
: _" h9 X  @4 Z* S* ]- {   unregister_chrdev_region(mcbsp_dev,count);
& ~$ S  z4 v! E   device_destroy(mcbsp_class,mcbsp_dev);6 I0 r4 v, i* ^/ i+ B0 A' e
   class_destroy(mcbsp_class);7 q# a3 P$ m; |7 J! i
}* z  q" m. J, k; z
module_init(MCBSP_init);( ^' B7 S7 O7 |# w" L: k
module_exit(MCBSP_exit);
5 `6 ]/ h+ j, {# Y- n! M3 W- t! F6 J$ F& v; V. h/ X
MODULE_LICENSE("GPL");
3 @5 i. D' C2 f% K" V: l
. |" n3 o1 w1 J1 V, T3 e4 V9 o我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- z* V& s& Y3 l; T" s
我的应用层的测试程序如下
; \! i% z/ O2 N" }5 _( u#include <stdio.h>
+ T' m$ t: u, Z8 H#include <string.h>6 W% d7 |0 A" r' F' |" O
#include <fcntl.h># W" c+ C, D4 _* D1 y% d+ Z( a# y, m6 H" S
#include <unistd.h>
' L9 g! F. ~$ ~% G% b9 O#include <signal.h>
) C) P% w4 f0 ~$ k4 k; y#include <pthread.h>       //线程
( X. a; b/ b1 O: u  a8 i$ N, W#include <stdlib.h>. O6 C) d9 w8 g; {9 ]
#include <pcap.h>          //捕获网口数据3 Z8 h+ U2 M6 I  y. Q) Y. T
#include <semaphore.h>     //信号
* H8 I& G* A8 e. f* G#include <sys/types.h>     //消息对列  M  T* I( H# _7 E
#include <sys/ipc.h>       //消息队列
5 v/ }0 K$ B# @0 I#include <sys/msg.h>       //消息队列$ t0 C# ^! i5 D& ~
#include <sys/select.h>
# X3 g- w( f; C: N0 Z#include <sys/syscall.h>
" `) \- a7 y2 L7 n, E; g6 @& W#include <sys/stat.h>  h: w8 p9 j" Z0 [+ }
#include <sys/mman.h>
" V9 y0 Y- q$ P: _#define msleep(x) usleep(1000*x)( K1 d. @' E/ n$ U/ K. t

/ `3 V& Z5 q. Yint main()
  X1 y' E: P' |, A* O{
! ?9 l& {! o2 ~. z1 g    //MCBSP,ARM与AMBE2000交互设备
5 U0 Y7 }* q) x5 W int fd;6 L% c. [! E& s5 l7 c
unsigned short data_write = 0x5555;. h/ t) k7 [" {2 b
unsigned short data_read = 0x00;' k- V/ C1 x: D& a* ?' R6 Y% M
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 U0 f8 T$ X+ ~6 r: _" W% O8 i. h
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 u7 L/ k- g8 X1 U+ S    & P3 {7 f. R" }' i' `
  if(fd < 0)
* E# d! [; u. S: }( O& ~9 p4 L* Y4 K/ F  {* p  {6 ?, L4 @+ V
     perror("open failed\n");- j) J& E1 h2 s% u0 n; r
     return -1;
4 g5 S! f  o* R  }
5 U; T' Y5 }. w2 ^7 C  
$ \. X$ M, [# p$ \; |  while(1)" O0 {: ]- Q) D- B
  {
' \. G) ?  O4 T- w. l) D$ m  Q) f& I   $ v5 A% C+ g9 z) K
   //AMBE2000每次读写是24个字为一帧
6 O" {! H" }- K6 d9 Y1 T9 \+ p0 A6 A; u   //写数据时将数据在底层存储起来,等到中断的时候再发送
% |, {5 y7 m* b& Y& l" R- q   //AMBE2000输入数据是以0x13EC开头的
* [! T: `( a7 t8 i7 {, S1 v   write(fd,&data_write,sizeof(unsigned short));: r! L; q' _0 O$ c
   ( ~1 a; U% `9 G* \$ \0 f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
6 d" Q* r0 [$ x9 j6 L0 G0 X  B   read(fd,&data_read,sizeof(unsigned short));9 u, l# @7 m& t% H
   
# V8 u$ s- F: ]( s  D, a& Q   if(data_read == 0x13Ec)
( G% Y( ?& T+ Y/ w& r& c+ N# N   {
- Q1 O- B5 T% _* j, R0 d4 j* `5 B* X   
; t1 u: O" v# @8 e/ l% x    printf("data_read = %x\n",data_read);+ w/ [- H: H9 Z
   }& X: S- O9 F$ |) R  j# t5 Q
   
1 ]9 v1 b5 @. Z   msleep(10);  N% K9 T- I# k7 N# V
  
6 `/ O. |1 j6 T' _  /*
5 K% `. c& I, \. K   ioctl(fd,1);   
1 u/ U) u* J% M8 E" S6 V sleep(1);
- c* i0 K0 V. k2 \5 J, C ioctl(fd,0);
3 S+ T) @8 \3 y$ V, `' b sleep(1);' z3 `0 R# _3 h) `. ~
*/
9 j6 ?/ D% u9 T5 J  }   
& C( P, ~# j9 H7 N3 F/ M# I8 u return 0;
' j0 t1 z5 \$ R& ]
! q9 Y! o" Q5 Q  I. M: k$ R% a* j}: h5 I; [  w/ ]! r0 ?( F. w+ {/ v
* a2 O2 O; y8 q7 l, `
多谢各位指教,谢谢! 急1 ~4 y  Z" W& ^5 B
8 M6 ~& u! o1 \8 E% n; J
& o9 d. ^+ J9 P7 l( r$ [
8 t3 t* |: f& d

6 ~  C& |; I6 k0 i2 ]8 o
# L: @0 N( ~3 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 16:17 , Processed in 0.049025 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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