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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: l5 L- W9 ?* r0 o& s) @/*/ r: V/ A& D, T: q$ ~/ \) }- b7 ^
* Copyright (C) 2009 Texas Instruments Inc& n( O+ [4 H) ?8 `2 O+ p( V7 z
*
* v1 f! ]  D' L. a) h9 j/ Y3 S * This program is free software; you can redistribute it and/or modify0 S1 H( m$ v3 s0 F+ O' V& q
* it under the terms of the GNU General Public License as published by4 d  l- o9 F: Y2 V, Y! n2 }+ T
* the Free Software Foundation; either version 2 of the License, or
" U0 M7 ]$ ^. c4 s( }- h * (at your option)any later version.- G( D" t( k$ i. j. f- U0 f$ h8 w
*
& P8 }( v% r* |4 m * This program is distributed in the hope that it will be useful,$ O, q; w% E/ c1 Z
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 a* S! @6 A! e9 w& g: M4 m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 i4 B9 p% A! {/ P * GNU General Public License for more details.
( K# i: `7 J- }& L *
6 x$ j3 n5 u9 f0 S7 j/ [ * You should have received a copy of the GNU General Public License7 t( z  q& M2 w4 C  {* h$ o
* along with this program; if not, write to the Free Software+ P) W) K& |8 F9 r# k8 F
* Foundati8 r. d, \* X; ?& R8 ]/ f8 d9 O$ k7 |
*/
2 Y; I4 t# b, y; M4 \$ h+ O#include <linux/module.h>5 Q' ~/ |. s; j8 Y; v' W8 V3 S
#include <linux/init.h>- q9 R3 m/ @1 ^- e+ r% E
#include <linux/errno.h>
, ~, J3 b/ R. E# @#include <linux/types.h>
+ M* y4 P" ^& P9 M1 ~) j#include <linux/interrupt.h>
7 n4 T4 f  t1 b( V6 H1 r  B% M! O#include <linux/io.h>
) L) h- e8 _" N, s4 p$ c6 a* U2 u# f5 q#include <linux/sysctl.h>
) }8 W# L! `2 M#include <linux/mm.h>& `( \) s* A5 a' k" |. Q& f
#include <linux/delay.h>
- N! a) y( c/ }3 z: T& p  \#include<linux/kernel.h>- l* c' [; ~& l) \
#include<linux/fs.h>/ D8 z5 z4 e7 Q7 F( a
#include<linux/ioctl.h>4 _0 a. m4 Z( y' e- k( H
#include<linux/cdev.h>8 N- t3 l, B  ~  {
#include<linux/kdev_t.h>! t1 e5 S% g# ?2 h( T9 _
#include<linux/gpio.h>
, L! \0 s8 A- ?4 H( j#include <mach/hardware.h>* ?/ s2 w9 X3 F6 n
#include <mach/irqs.h>5 I  ~. N7 d7 f% H" w! @
/ l( Q5 D6 g. I, \* C1 }( V
#include <asm/mach-types.h>2 o+ w5 ]% K8 V4 J# F
#include <asm/mach/arch.h>* I  F3 q3 x3 G* J  Z
#include <mach/da8xx.h>
* j$ W/ V- v* Z" @- _; k#define  SYSCFG_BASE   0x01c14000
& K# J4 D) N( D) u% G5 \7 v1 [#define  PINMUX1_OFFSET   0x124 % G1 k8 T; o4 W, \9 h6 t
#define  PINMUX18_OFFSET  0x168 . z1 ~8 t( \2 N5 ?3 m
#define  PINMUX19_OFFSET  0x16c7 i; x/ s/ \7 G8 i  G$ }* _" t
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR& r2 s, X0 I  T1 b" ?& m; [
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR* T- J: n' P# l: B
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 U3 \' {* A0 f8 y, b9 I& |/ ?7 A0 P#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
4 j9 X7 a: N( \, O#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR! q- ]  R* g- X) v1 B. X, ?! i
                           
7 z' V" \( |* O7 i0 f2 f% V9 v* S#define DXR_ADDR      0x01D11004  //MCBSP1_DXR2 |) [: b  @2 ~2 \$ B' q
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
$ k. i& Y, q: r6 \//PSC/ o3 q& g# C9 ?4 l" I2 _
#define  PTCMD_ADDR   0x01E27120  
+ C0 T# X' C( p  B; M2 O% t' M+ b6 c#define  MDCTL15_ADDR 0x01E27A3C
) c5 o/ G9 s. V5 w% y* E7 `* W/ z" }#define  PDCTL1_ADDR  0x01E273045 A9 v) x2 G0 ]3 V
//GPIO8 direction+ N( D$ K; V! K+ }& a2 Y& \. f4 a
#define GPIO8_DIRECT  0x01E260B0
7 V9 J5 w  t+ P5 [5 }( e: Y; J#define GPIO8_OUT     0x01E260B4! X; A/ \( E3 q) I
#define GPIO8_IN     0x01E260C0
" O3 c. T0 x9 a3 R+ |8 h' J* n
. O. h) Y; I& g: t; T% z//#define MCBSP1_RINT    99              3 h6 `; g8 `7 }; P/ a4 g
//#define MCBSP1_XINT    100  0 B. H; t9 \6 o: V" ~+ {/ k
static int MCBSP_MAJOR=239;
8 h! y  U6 \# i0 R8 M; K( rstatic int MCBSP_MINOR=0;
9 v" \4 B, V$ ~static int count =1;6 q% k6 p& O# V4 W
* ?- I2 c4 B7 P3 I- h& l/ _* @# P, z
#define MCBSP_NAME  "MCBSP-device"
0 l) E  S+ M7 v! p# P  Y! x. L7 N% R7 b5 A6 x/ u
static struct cdev *mcbsp_cdev;
& H( B- p$ m& y- Ustatic struct class *mcbsp_class;% T4 U& E2 D$ H; V# i7 C
static dev_t mcbsp_dev;
. j6 r) q' Y  r* X  ]unsigned int DRR_data;
. {. ]. ]+ r1 M, Y# xunsigned int DXR_data;" N7 P5 k+ L& u8 ]# u
static int mcbsp_open(struct inode *inode,struct file *file)
+ b/ y$ t; x8 @& j8 c{( V- `3 o# I  Y8 `8 [% l4 J& v
   , j; `3 U- t) L! b4 ]& J
   //interrupt enable,initialized% u6 C$ X" K9 T1 m* q- M  ?
   unsigned int temp;, a# j9 c! i- F6 S6 |6 A8 m2 b/ S
   //SLEEP_EN(GPIO8[10])---0& A7 N7 v) x, R. d6 Q4 f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 U  P/ Y' ]; T& E5 d& T3 R   temp=temp&(~0x00000400);: Q: ?; X! ~' b; [# Z! D
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]0 `# e9 s9 o/ c- m$ _
  //RESETn(GPIO8[8])----0----1& J" N8 ]5 K2 s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- Q0 [6 E2 u% x9 t7 K0 t7 M   temp=temp&(~0x00000100);' O* f& b2 i  ]: @  O
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
" z8 Q2 L" }% C3 z   udelay(100);. X, O- s( t' M, r3 f" v
   temp=temp| 0x00000100;
& }* U  w- p6 c8 a" K' f8 A7 f   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 B: Q. B. U+ z# k( c# G# r
   udelay(100);  L' V7 j' z+ `7 C; e5 M6 u4 r
   printk("open success!\n");8 X% n- x/ y2 |  M- J5 f4 J
   return 0;3 Y' d* Y: Y" _' Y$ P; a7 P
}4 v, K2 l1 S: |) Y3 c% y4 g6 d6 q( f
% D1 N9 k" |$ y5 H, a7 |; V
static int mcbsp_release(struct inode *inode,struct file *file)  D5 ?4 ?6 w$ n& H. p/ t0 S. E1 U0 Y
{
% _+ d7 i7 J4 i   printk("release success!\n");
" [/ Y, z/ ]7 H, f9 d" B   return 0;9 }: t/ Y1 N6 J7 X
}
0 t( `8 d8 ?! k! W" U* |1 l* a, @/ q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) C6 n6 |! J* h8 U3 R$ `+ L
{$ X0 d" Q7 F, w* g
    copy_from_user(&DXR_data,buf,len);
9 L$ O* s$ d( J; J2 N& U* ~' e    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       : E6 d# @1 |' {7 Z/ J: W
    return 0;
: ]0 T% O2 w8 J, d3 Y1 z 1 A* X) P9 z( C+ f
}
6 o9 ~) H5 k5 o5 ?. n
: r- E! P1 p& N5 b( b$ q* Q- \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 s9 g' E) R; _- u0 @9 b6 j0 l
{ ( @. Y' [# |& |7 h9 r
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 t) O9 G+ l5 G" V9 K  E) G7 t   copy_to_user(buf,&DRR_data,len);
7 ~  |, N0 k5 P% C9 J0 g   return 0;' a1 L1 T) z3 ~$ G0 \- G' D* r6 s
}
$ x4 u* K6 l' Z" g% G
6 f8 H' ]: V5 e3 w! J. s: O1 [
2 b& t2 ]) v% ]9 [' |2 V7 nstatic struct  file_operations mcbsp_fops=
% i7 r! _1 z$ n  F/ g' b  h* U. I1 t{
, I- X$ l: {8 [$ g# y   .owner=THIS_MODULE,
$ B) n. y5 c- G  p2 S& b   .open=mcbsp_open,7 N( C2 y, D7 r& L3 i
   .release=mcbsp_release,
- O0 A% c: \1 w5 j+ z   .write=mcbsp_write,& o) W. C" S* ?' h3 v1 U* w4 i+ X
   .read=mcbsp_read,5 s5 c% Z) A* s6 z1 r+ U: _# G
};8 V: a9 s% ~8 U+ m* v6 g+ D
static int __init MCBSP_init(void)
7 r5 h9 k/ h0 _& M8 E. S{
2 ?- \* s) d1 e8 u- @! l   int ret;
5 W$ ^" u6 w% e. n0 u0 M6 F   unsigned  int   PINMUX1_REG_old;
$ z1 a" d# C0 c3 l0 ^# K% p# A   unsigned  int   PINMUX18_REG_old;
' D  B1 o# W9 |2 x% c$ u! M   unsigned  int   PINMUX19_REG_old;
+ p: R* h% B' ]; h   unsigned  int   temp;  " C% J4 a; N0 m4 V& o, W4 T6 j
   if(MCBSP_MAJOR)
8 K6 o1 M+ H. s7 z" w3 k5 j4 ~' X   {5 J  C+ {( W$ P1 R2 u
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
! N: B% Z$ B3 E0 s% n# D6 s      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 |$ w' F  o/ W7 x" a, ~   }
% M2 w. X" k" C* t1 d- H) z6 A   else& p( o) o9 F1 ]5 u) g
   {5 t, T) g! C0 O# {; t# ]6 d0 V
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, m7 v$ d) g) u/ l& [# z; p
      MCBSP_MAJOR=MAJOR(mcbsp_dev);: I5 ]. u- z3 V9 }
   }
. y' H: a4 j) z5 u$ R# Y( j   
7 c# M  y) i  [6 M   if(ret<0)
  X8 v8 X) R! ?! u# V9 g+ n1 E3 E+ k   {1 c' w* n! `' H" l9 B* j4 w
      printk(KERN_ERR "register chrdev fail!");
# R7 J' p# @. O' Y5 d      return -1;
: {9 H* E8 p3 P   }. E  s& @2 L; s
   
- \1 Z2 o, Y8 K/ U% a6 i* Z   mcbsp_cdev=cdev_alloc();- Y9 [7 @" F8 ]
   . U: v0 e- m  k( L6 l+ h9 l: h, t
   if(mcbsp_cdev!=NULL)  H+ V1 }' x8 o
   {
3 p, }& x9 X0 _; ^  @2 u6 a0 N6 x4 h      cdev_init(mcbsp_cdev,&mcbsp_fops);+ m% k' Y. [0 s
      mcbsp_cdev->ops=&mcbsp_fops;
# w* F4 b; \, j, S      mcbsp_cdev->owner=THIS_MODULE;' }2 {( O% X( z# W* r/ x/ @. J
      & S( Z/ e$ j1 v2 y- l
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 i$ j4 C0 M1 Z4 ^9 Z$ D          printk(KERN_ERR "register cdev fail!");; g& M- E, N5 I2 P
      else# u- s( K- j4 W) A
          printk(KERN_ERR "register success!\n");6 G# F/ P& U4 `& D$ U% Q7 F
   }
) L0 X/ P4 X; y1 z3 V5 n   else1 K# ~+ y& E" p& C8 g
   {& Q% q/ ^# v; z. t4 x5 R
      printk(KERN_ERR "register cdev err!");$ k) T3 d8 e8 P2 F
      return -1;8 }3 s7 Y; z$ `, I0 x& A1 U' j
   }- P/ k! W$ x$ K8 M3 H2 }: I
   3 W/ u8 c! ?0 S: C/ B5 @9 s
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 t, j+ j% M1 a* K* j   if(IS_ERR(mcbsp_class))3 @+ {  Q% M7 C
   {
' P+ T. u. @! Y      printk(KERN_ERR "register class err!");
! B' z! P, g% u   return -1;: d; o5 c! A$ z% @6 U1 c; p
   }
3 C6 t" ?/ ]0 |9 H   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);/ d1 u. l6 B: F# Z! L% y
9 d* z2 v$ u: G% A
   //PSC
1 r2 Z0 X; g" L- U' e5 V8 j0 w   //add Enable MCBSP' \/ v: h  X" C
   //test$ @# \! N& Z( \' u3 i9 J& A$ @
   temp = 0x80000003;' p% p" ?6 e( c  Y! J# i
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 |% F# z. o( a) @. F   temp = 0x00000003;* M: `: h) \7 ^: m
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 y! c7 K  t" o8 V" @9 B 2 C( O+ m( G% [7 c+ d% J. B
   temp = 0x001FF201;
8 y+ f8 q4 G! z0 I   writel(temp, IO_ADDRESS(PDCTL1_ADDR));& P5 X+ O" e9 A, S
   
$ p; N) M+ c. m8 i   //PINMUX  + B4 t% `# y& R% a
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ {: I1 Q9 I+ v
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 ~) I6 o/ Z3 }1 w) Q   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   , p# s$ g* w1 ^
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* {5 u  Q# d+ {; }  N/ h3 Z/ j
   
+ |% g. s% g, m! D5 m; T   //SLEEP_EN,EPR,L138_SHK1,L138_RC8 g0 p! i( p! h6 I, V8 d" u" G
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % R5 X9 ^( x2 ^, k2 j! u2 X
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   7 R$ G( L* _' E9 G
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, k9 }5 y' H% Q1 f2 \! L$ { + s6 Y) H/ b, \! j. @
   //RESETn,L138_SHK2( {) T) R- o6 F$ z- f/ W; M3 R
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
% r9 [) a! @! `. O4 v( h' V! r* F, T+ P   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! j( \" x1 U: E. I* g# {! V   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 b2 ?+ T5 s7 F0 f7 t# N
2 R: f; v4 Y; d9 h3 b

" X& M, z& a/ V* N1 Y% b  //SPCR Register; C1 ~0 l+ R' v; g
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset1 k2 z- `- }( M+ ?8 ]
  temp = 0x03000000;//(DLB=0)
6 P1 G$ D* `! D0 f  ]$ U+ X // temp = 0x03008000;//(DLB=1)5 O( q. i6 [# |5 y+ H% D
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset4 W8 P/ A. L/ {
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 X2 @, e- ?! O& @: D
  printk("temp=%x\n",temp);! D: o1 A2 P3 U1 d
& D  T/ a" y% p/ X4 T6 ^
   //PCR Register, V* O0 }& n- c: l
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-01 F# ?) f4 U: s) G
  // temp = 0x00000F0F;8 L* U. S5 D1 m* `& X. r! s( U; }
  temp = 0x00000B0F;, g7 t9 K! O8 i6 M( q
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
4 T& V( s) E* @  temp = readl(IO_ADDRESS(PCR_ADDR));) @& m% k; f# N  J9 b9 g- z
  printk("temp=%x\n",temp);  6 v9 j. w% h: K  a
   //SRGR Register2 B) N) ~4 f; k& }" ~. K
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
$ Z4 p1 {4 U4 A3 I //temp = 0x301F000B;
5 o) Y7 O; l8 z9 i& F, P% m   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
3 e$ e- e' y: b! I2 w. G  temp = readl(IO_ADDRESS(SRGR_ADDR));. y: |  Q1 W+ }4 o2 |/ F5 U7 n( u9 D
  printk("temp=%x\n",temp);
6 a! h  x" L  F   //RCR
8 K6 f" X- U8 T  m4 D( I   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 M0 V' ?  l! u2 M8 \# e- `   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ a. X9 P, w/ j   temp = 0x00440040;
& ?& X4 \+ e" a' d& g   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   , F: V+ U% R; `3 `
   temp = readl(IO_ADDRESS(RCR_ADDR));; G3 y; u' y5 s; b/ ^
   printk("temp=%x\n",temp);: X+ o# N5 ?2 e- c7 n# e5 U" j
   //XCR
6 E( M1 T5 g0 U% L) U   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' Z& k+ f: g  _" c! \$ D$ l   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  L1 c. a0 K8 k7 c5 e0 u   temp = 0x00440040;
2 K6 O7 I" a7 P7 R   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 P7 s& e) T2 [% r! P& C$ E7 y+ X! H   temp = readl(IO_ADDRESS(XCR_ADDR));
6 i9 i- |; t" G0 `   printk("temp=%x\n",temp);3 ]. C# V0 B0 v; |1 c3 w7 Q6 \
  udelay(100);
% u7 k' f; T! _: a  Y3 N- _2 }5 M  //SPCR Register
; b# a5 o. L4 D# r6 Y  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! \# z0 R  B' o- C9 K: p
  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 S. l* \$ g* r6 v7 j1 {! N
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 U- K" W7 a3 ^* ^  temp = readl(IO_ADDRESS(SPCR_ADDR));# ]) w, h" }& L5 I
  printk("temp=%x\n",temp);
! N: X- P: F# X3 j! F0 ?  udelay(100);& o7 k% j# y! K) D" |: Y

+ E7 q" i+ V/ ^  //set GPIO direction( q& K2 S: @' [. N2 Z2 `; e3 j; D
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));& h3 m0 ?" R6 `# x0 m' T
   temp = temp | 0x00000100;//EPR----input* Q9 r# B! C) b3 A7 w
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 c4 C4 z7 a0 _: I
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! l" m6 u5 D$ l9 c! e  J' ^
0 ^& G: k) c, j9 u% o: v# I
   return 0;4 q0 K; w4 `9 N8 ^3 ?  l8 G
}+ k/ ?# d" p7 S
static void __exit MCBSP_exit(void)! v- e* r- ?( c( @! C& @% ?* j9 I9 a
{
, u! D0 @) P: e5 G   printk("mcbsp chrdev exit!\n");
9 Z# O  K7 N8 ]6 u   cdev_del(mcbsp_cdev);
, a3 z. c: A4 M' y. Q% q   unregister_chrdev_region(mcbsp_dev,count);
  h/ L+ C; L' p9 T$ C* v2 f   device_destroy(mcbsp_class,mcbsp_dev);
4 o/ j. j# @5 O9 V3 w   class_destroy(mcbsp_class);
' |* q" p2 M9 ^+ P6 h3 z}2 |2 Z5 J4 |; N/ k! C9 M
module_init(MCBSP_init);
* \8 i- ?8 Z/ H- L$ f- k" wmodule_exit(MCBSP_exit);  h4 K- W- @! z4 y, W- Z: v9 c$ Q

# E5 c1 g1 e% T6 BMODULE_LICENSE("GPL");# ?5 F3 y  G6 x5 B7 j
6 \0 q5 j2 X5 `1 ]! P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, Y; D1 y- D2 \2 C( n$ P' d5 w我的应用层的测试程序如下
3 B2 {& d8 l' W/ v#include <stdio.h>; y4 q7 b( W. A0 K1 E
#include <string.h>
( U% Z. ]$ {6 Y; k( I6 t#include <fcntl.h>9 s/ A! I; I. j  Y
#include <unistd.h>/ \' X* _3 e$ |$ T8 i/ Z1 K+ O
#include <signal.h>  Z: s+ @" U$ I: q5 R0 i
#include <pthread.h>       //线程3 w& k* v( v! W7 i6 p/ ^' D
#include <stdlib.h>; K; G  k) P" I* p
#include <pcap.h>          //捕获网口数据/ C4 [7 S5 p5 p0 a: u3 S# A! @5 {, a
#include <semaphore.h>     //信号
7 D- d* s- m. y#include <sys/types.h>     //消息对列% t. m) W2 }" `( b. v% ~$ O0 @2 S0 Q
#include <sys/ipc.h>       //消息队列
" }; P$ d3 u- ?) t0 D" W9 O#include <sys/msg.h>       //消息队列0 K$ d9 [1 B, z7 K+ q
#include <sys/select.h>* q& E/ l! g2 a! |4 Y
#include <sys/syscall.h>4 D' y+ x! v+ ]+ Z) a/ N5 B: U
#include <sys/stat.h>, v3 r, [" `" P6 t9 X7 |+ ~4 D7 R% \1 G
#include <sys/mman.h>; ~) s; S: |8 f8 r, E  v, [4 y- r
#define msleep(x) usleep(1000*x)
! h# q4 W  x$ Y% X. b) Q, p) \& u, V
int main()3 R3 z$ |" l0 O0 H
{   t. C0 _( N/ g
    //MCBSP,ARM与AMBE2000交互设备+ p1 [8 T0 q7 Y, i9 q$ t" B6 X+ K+ q9 W
int fd;
5 H3 H/ p+ N6 ]' q* W unsigned short data_write = 0x5555;( e. o) b" ]2 F/ s/ k, S9 @2 y
unsigned short data_read = 0x00;8 r; g" R. w- `7 H
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ T* O/ Z9 `0 j2 \
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ N$ H7 p% \! _4 X5 e1 ]& M   
4 z* y8 t3 {  |2 A  E  if(fd < 0)
# A- W% H0 l9 C7 l# h( ~  {
0 ~1 u' L% V- }% p9 M% K     perror("open failed\n");$ q* T1 R# y* M- _0 R  @8 F' G7 Q
     return -1;4 n9 c) Y3 s: q, j+ P
  }
' \) v1 W' q8 a' F' [' O# s  
5 X: }; c) d  ]  p  while(1)
# W# a* S  I  f2 Z  {% T) z. i1 i. m/ d) c
   
9 c2 D6 ]( f& n# r2 j   //AMBE2000每次读写是24个字为一帧
, M1 y7 e& X/ C1 B. l- s1 ?   //写数据时将数据在底层存储起来,等到中断的时候再发送$ g& @" K$ ^; h) e
   //AMBE2000输入数据是以0x13EC开头的$ ]( T' u5 j: p
   write(fd,&data_write,sizeof(unsigned short));- O7 z6 X% m! s# |; ~
   & u4 A/ F: Z% I) _6 P0 W' f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 o$ [" y7 K5 i9 n' [
   read(fd,&data_read,sizeof(unsigned short));
( J$ w( E- z( B0 l  q/ P7 J   
; ?* o4 B# I- C3 ]4 l   if(data_read == 0x13Ec)
: j) k' ~  N3 \   {
) o' z5 H7 i5 m9 `! D8 ]   
8 H; ^# D2 m  I+ w2 X7 e    printf("data_read = %x\n",data_read);: [' e2 N# |" M: j
   }
5 D- o. l! c  A; `8 g   
4 |! h5 A5 g( j& i9 y0 g% [# j   msleep(10);
: G1 U( k% x* G" q8 E* Q  7 L7 S5 A# V6 @6 ?8 I$ h4 ?
  /*- k  d+ U" Z$ L# L3 a+ }( b) \" v. ^" ?
   ioctl(fd,1);   5 a6 x* D' d7 q/ I, Q
sleep(1);
$ B5 a2 ]0 z; R- D9 u- l' i' K  N ioctl(fd,0);* Y0 n# f( u# S: Q. J1 C0 V. ?
sleep(1);. n) A: T/ ]! K- I0 f. r' ?9 V
*/
5 t* k) h' k$ K) z  }   ! b; d0 A9 U" n# ]& f0 ?
return 0;% ?5 R, |& U3 U9 W
4 H7 k4 y6 c5 E3 z3 D0 ^' c- E% O% x
}
0 H3 V1 A4 n* F& ~6 ]! h) n: r- A1 u, W9 y3 P2 f7 l
多谢各位指教,谢谢! 急, Q8 S- N# R7 s

% }3 [/ w. A. W( y' W, l8 d. S, J" `0 a$ |; E7 g* m' w

. }1 L; I7 a, v+ h% ~9 h: z# S. F6 P) f; \7 \
6 f: a0 _0 w! y/ k& ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 15:38 , Processed in 0.058872 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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