McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; W) [0 B9 Q$ C  i
/*  @* O# `3 l4 x
* Copyright (C) 2009 Texas Instruments Inc
- l7 i+ }& K) e/ R *
% ~$ ?6 i9 z3 A4 R7 O# | * This program is free software; you can redistribute it and/or modify
2 Z- A! E  c  d, H * it under the terms of the GNU General Public License as published by$ F0 N$ C5 `$ \6 I1 l: E8 ?* V
* the Free Software Foundation; either version 2 of the License, or2 \. s4 h% _; D1 N* I
* (at your option)any later version.
1 r6 {7 C2 F% |& U9 N *
, ~/ }( G! x! U, N& s * This program is distributed in the hope that it will be useful,
$ u, l7 M7 h4 i4 s) {+ Q4 ~ * but WITHOUT ANY WARRANTY; without even the implied warranty of6 e3 F* e. F0 W
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 U4 T( Q; ^2 y! [5 e+ h5 t * GNU General Public License for more details.: N) Z$ N6 ^6 K3 Q# |( C5 V+ ]
*" r! C$ P2 }$ g/ J( ^* k# B5 f& M- d" i
* You should have received a copy of the GNU General Public License  M5 u5 t5 E# Y  `6 _" m
* along with this program; if not, write to the Free Software
) o- _$ T& I( F5 u( J* ]6 s * Foundati
# R, T' h* i: X3 H* h$ i7 {" z*/9 ]; K( B2 x" G8 k/ {
#include <linux/module.h>% e: V0 ^% {$ g$ S$ [
#include <linux/init.h>
. }7 E0 `6 z  H) Y/ o( K#include <linux/errno.h>  b6 b5 `0 D  J1 @+ z1 A7 H
#include <linux/types.h>5 b  O' Z" N2 @' p
#include <linux/interrupt.h>
* y: p, o8 x$ r$ _* C' \#include <linux/io.h>& e& E; h5 m" X0 E" V9 P8 I; j9 ^* \  {
#include <linux/sysctl.h>
  O# E* J. L5 b& y7 m4 \#include <linux/mm.h>4 f$ q9 H" X/ c+ i- x' w
#include <linux/delay.h>
  S; E9 T, R1 y( }6 O#include<linux/kernel.h>
. q; j; ?# t. {/ z#include<linux/fs.h>
: ?+ Q* d& q. q% y5 l* d/ B#include<linux/ioctl.h>
3 t# n' i  `' I; I# l2 T#include<linux/cdev.h>
( a. c" e0 R# @#include<linux/kdev_t.h>
4 ^5 r- r, R: t. x#include<linux/gpio.h>" Y( r/ ^( w+ E1 E# ~7 u( [
#include <mach/hardware.h>
1 P/ o' S+ ]  P- v#include <mach/irqs.h>
3 ]7 C8 O) J& \  z% N9 v* E: q
& w9 n7 ?; \" B( K4 j! Z5 h5 x7 W#include <asm/mach-types.h>
( _, m0 y& i2 i0 L#include <asm/mach/arch.h>
3 n$ D& ]0 x! T& ^# `#include <mach/da8xx.h>7 \( {' U+ q! C4 K9 u
#define  SYSCFG_BASE   0x01c14000
8 n: c6 W7 b6 ~, p0 g2 z3 @# y#define  PINMUX1_OFFSET   0x124
6 P& V2 a6 X, _6 p8 c: U5 L" L6 `#define  PINMUX18_OFFSET  0x168 / m* p. O5 T3 l7 ]6 T
#define  PINMUX19_OFFSET  0x16c
  r% K) D5 Q; v4 |#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR- N$ z+ s) Y/ s3 _
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
8 l/ t& p) ?: [% h. J- `#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR! Y, O0 r) j7 L2 A- t8 B/ c
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ I3 J% l* ~0 \' v$ q#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR# z& Y1 a5 W. v; D, j
                            2 k. G8 f  C+ c" z* C4 ?0 A" r; |
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
: U6 {2 e! ]9 w, P% M! p( R5 v#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
+ ]! u- O/ n* S) L& U% w//PSC
+ W& _& L7 I4 j5 h# a#define  PTCMD_ADDR   0x01E27120  3 A" O8 b+ b7 M( s
#define  MDCTL15_ADDR 0x01E27A3C
4 Q2 K8 Q5 E2 m4 Y) j3 [* y- `( n#define  PDCTL1_ADDR  0x01E27304
) v& V) t8 X6 z- _  v//GPIO8 direction/ I2 [# q$ _$ X6 _
#define GPIO8_DIRECT  0x01E260B0
! i9 r% r/ C& L% Z3 y" S#define GPIO8_OUT     0x01E260B4
  O; _/ k( R) A2 H* e#define GPIO8_IN     0x01E260C0
7 W, y2 N; ?/ U6 b; T; _+ \6 O( _$ O6 Q6 O/ O7 L
//#define MCBSP1_RINT    99              
& |" o$ m8 e' A; z! Y! c//#define MCBSP1_XINT    100  ( Y7 _% {$ v+ J* l9 @; n
static int MCBSP_MAJOR=239;
: ?# c. c- v. C: F# F$ _4 @static int MCBSP_MINOR=0;0 S8 L1 z1 p" S/ {, v3 U
static int count =1;
+ F4 N8 F( [! @* Z4 b6 L0 A+ L+ P( _+ I8 u" O/ U4 c! v
#define MCBSP_NAME  "MCBSP-device"
6 z7 M0 f( }, {$ h' t) o# L3 F& N. ~! |& @' N8 ~
static struct cdev *mcbsp_cdev;' p% K0 e2 T7 u* g
static struct class *mcbsp_class;9 l' ^* F8 ]% W
static dev_t mcbsp_dev;7 Z1 \7 R$ D, X
unsigned int DRR_data;
5 l: X0 I) Y0 m$ L! Q9 tunsigned int DXR_data;
/ x7 }. w3 {. Mstatic int mcbsp_open(struct inode *inode,struct file *file). U! c) D; L, H- S& z6 V
{  {. y* W; B# C& u; L
   3 Y* n3 ]: j3 ?+ U3 g
   //interrupt enable,initialized& u7 R" k3 B; j3 M
   unsigned int temp;3 z0 ]  Z  g/ i3 {1 P
   //SLEEP_EN(GPIO8[10])---0
3 }. _5 o' \4 a$ E5 _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ C9 g# g7 t2 ^- U: p   temp=temp&(~0x00000400);! s, E, U9 ^  [# M
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' [4 v9 O) B! \  V
  //RESETn(GPIO8[8])----0----1
# p8 k, L  V* j3 D  m9 b, T   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' L4 q" E- L& p5 C: g& ?+ M
   temp=temp&(~0x00000100);
& \+ l) T5 x  d3 }$ Z( X  T( i# b4 }   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 G7 b+ ]) P& K& O
   udelay(100);& l5 k$ b& v- K! N! O* v! R
   temp=temp| 0x00000100;
! V  w7 f) F  E0 K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& r5 }0 a( l7 K$ R- _
   udelay(100);
7 i1 P$ k: {6 ]% ]( [6 u   printk("open success!\n");
0 m. U- B2 d7 D: Y   return 0;
4 T( T0 u- h: w! D8 O}
7 W+ M8 [. ^9 R- k" q8 Q; z5 S& h! ^! g6 W- K
static int mcbsp_release(struct inode *inode,struct file *file)
% p, F3 V! T6 p9 q6 w6 \0 h{; s$ U1 v; G3 T9 A# _" ?3 B
   printk("release success!\n");
% k2 ~2 ^0 W9 s: Y' _+ U0 X   return 0;
) Z4 L  G- X' D6 a  [}
/ b6 H% y, O' D
7 i( D8 y6 r+ @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): k; @- x8 G# d+ j% a' j0 V& Z
{+ I* }- p5 u6 A# I  `
    copy_from_user(&DXR_data,buf,len);; ]; e7 M$ c, @! |6 p6 k& l. q
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 {  \& D8 u7 e    return 0;
. _  Z. }, X  W
3 A* n/ G: V0 y6 r" ~$ G# k/ R" {}
$ O- o- g! m% ]9 m0 H; a% V
7 y& r( @, q! O) y/ L8 F9 R4 Mstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% F/ _1 u3 c1 ], ~6 ]0 s{ " U0 `: l+ x9 P7 Q6 G4 N) v
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- U  r4 Z5 N9 T0 `   copy_to_user(buf,&DRR_data,len);
( d" c, I6 d6 Q7 j, {1 ~$ l2 Q   return 0;; W/ u% `* W" k+ v2 g# h" m
}
9 V" m9 _& k% A9 X% z
5 G% Z" ^+ C$ n+ o, y# P* J) r" l' [( C; m% c- ]7 ?( }
static struct  file_operations mcbsp_fops=
$ E1 z1 E; k9 I0 p, O{9 k. T/ \, n3 p8 f( y
   .owner=THIS_MODULE,; r' J- ~8 v  P
   .open=mcbsp_open,9 M. c: f4 p5 b' b7 w) J. `
   .release=mcbsp_release,
' l( G# x6 |2 Z, l& f2 m- `! @: q   .write=mcbsp_write,# m( ^' |( r# d4 J* Z1 n5 v
   .read=mcbsp_read,: c# E2 N7 f! K9 M  ^! m
};* p2 k4 t/ D+ |# o
static int __init MCBSP_init(void)
- T1 i% w: i! f2 t& a{$ q" I; u5 I2 i8 b# ?
   int ret;) \3 \  ?& s2 F" Q
   unsigned  int   PINMUX1_REG_old;; @- g5 f+ W5 H+ M
   unsigned  int   PINMUX18_REG_old;8 k1 u8 l) D) q' }% \
   unsigned  int   PINMUX19_REG_old;
6 ^5 g+ [  ?. R, X; R   unsigned  int   temp;  
9 X6 m) W+ a* X% T8 i" k. @   if(MCBSP_MAJOR)
, a0 y, u. N; M: W   {# n6 g5 |& U2 w0 V" f; x) O
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- I  X2 B6 Z! p9 H. v- V
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( Z5 o, X% n; `; ~" g% \
   }
( ^5 ^0 [" a, T% ~$ x   else. x" ^5 A% U, }  a
   {
+ ^% m; f9 U" S2 _# S* J      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 m* k" b+ {& g- y! x) o      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ [% \1 D$ I2 f0 s8 z   }
  b: d5 z; B3 `   ; m; Z; ~% B. y" y( `: |( p, N6 Q3 l
   if(ret<0)
: H* S+ H4 r) [+ Z1 A   {  k4 k. p7 _, H# g
      printk(KERN_ERR "register chrdev fail!");
/ m' D- w; z. J+ Y% \  K      return -1;
1 ]& C6 C6 q7 j0 X: w' n   }5 a5 L" L: B# V0 u, v& w
     N+ s1 @# W) l
   mcbsp_cdev=cdev_alloc();
+ f1 w/ r0 c% |0 D; k   9 Z/ F* T' j6 ?) v5 \* o4 P
   if(mcbsp_cdev!=NULL); h$ u( U& G4 J" e
   {. P9 `7 p! N' W2 c
      cdev_init(mcbsp_cdev,&mcbsp_fops);# N. R2 Y5 v) ]2 u6 y: B5 S
      mcbsp_cdev->ops=&mcbsp_fops;
8 H# t# i3 d+ Z: U      mcbsp_cdev->owner=THIS_MODULE;& T$ d9 [: L7 a4 i
      # o) b: {6 B6 o0 B2 }0 u4 V0 S
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, ]" I1 S& Q$ g+ R          printk(KERN_ERR "register cdev fail!");+ d& c& T- Q& o* V$ z. ^' }. S
      else' }2 ?2 ~2 u! H) L; L4 P
          printk(KERN_ERR "register success!\n");
: R' m3 }$ t4 @1 }2 _* \   }* l! R  W1 G8 d1 s7 a% s% j' J0 u
   else+ m2 h# E1 V3 J: u% t# O6 Z+ |) T
   {$ I4 T* [. I/ Z0 }9 L$ w
      printk(KERN_ERR "register cdev err!");2 G1 d2 B4 B2 H& Y* e
      return -1;
- h$ n* r0 O, J   }
" Q- O: W8 `$ X3 H2 o. X   
: ]# j' B$ G( @8 E5 y* `* R- _' y  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! |3 d( j9 ^8 Z& b0 \
   if(IS_ERR(mcbsp_class)): X" |: }& n) n9 M5 j# _* S
   {
. S% [! T" M( n' t  R0 @: D5 ~      printk(KERN_ERR "register class err!");
, ^- C3 B/ U. V, l3 N( \; H+ b3 }   return -1;
! B! P6 u& r, {2 e% \4 \9 H   }* O" k- {$ _  v. r
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 }6 M: t6 B! y9 ]

: R1 O% o9 w. ]3 K( {, U6 m, m   //PSC+ [( X* C  f" s) O; ^# b7 U5 N6 ^
   //add Enable MCBSP
" o; i( _6 N. a4 o) @' ?   //test
1 u' U" [. R1 l, v' [/ h   temp = 0x80000003;
) T4 Z+ U7 G% c0 U0 |   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% Q- z8 c9 q  m4 B1 D   temp = 0x00000003;
) }1 l4 X& o, E0 D) H   writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 p' w. ^% M/ }; r6 K/ @5 G5 J" b
2 [+ Q& {3 z+ R+ q/ t   temp = 0x001FF201;
) p  x2 y4 X( b- u5 N3 g5 d   writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 X% _9 P8 A0 _0 V! x: Y7 v
   $ K; L$ y% Y1 }4 B5 L- I# \4 P
   //PINMUX  
9 f: j$ Q9 \( D, \   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" d, Q8 d5 [# o0 ^# {1 F   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  : Q' T, H& `5 [, Q/ D' [( i# o
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
+ a9 M/ @) y4 j5 a  R5 Z( F4 f! w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% K9 N% I- }% `   
! ~& ^" a& F. P0 N4 Q! j# ?   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) ^' s% X, y6 d! j9 ]; k/ e3 Z& ^   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  3 h- ~/ R: M7 h  {$ n( s; E9 l
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
0 U2 F% x+ }  y9 ]4 `1 p   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) v7 U. _0 M% Z9 x3 T& E( L
7 C! R" U4 g& b! O: F   //RESETn,L138_SHK2
+ d4 O' D3 T# g( b2 W; |   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  , C% r3 m. \/ B* Y( T. I6 j
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   7 V% |7 ~4 e. c  r- P
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" e4 K- g' ~" a" Z+ Q- b* I

: ?6 C  I# n; J3 z
( Q) l* [* Y' A% _4 y9 B  //SPCR Register
& F" t; q8 P4 z( L# Y5 H9 ~- s8 r9 k  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 w6 ]( F+ `0 t! M* L  s# `4 M  temp = 0x03000000;//(DLB=0)7 k6 \# x# P+ w) L4 y! S
// temp = 0x03008000;//(DLB=1)2 j6 c. X* a( I* Z; ~* Q, e
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
/ G" `  s# ?6 V( ]) Q) J  temp = readl(IO_ADDRESS(SPCR_ADDR));
, N* `6 B9 p, j* i$ j( p7 a  printk("temp=%x\n",temp);9 B, X8 D  G/ W4 N* s7 x1 O

" V0 e1 R" o7 f/ p& j, o8 q# z2 l   //PCR Register6 ^: n+ ?( @' A% D, n. h
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
2 d% a2 R5 b& x: ^1 s: m  // temp = 0x00000F0F;
- s: Q- n* ?0 F( @, T: q  temp = 0x00000B0F;3 p1 D. G( i4 f0 j9 h5 f
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized / |2 a% ~: [3 t# J
  temp = readl(IO_ADDRESS(PCR_ADDR));
6 P, b* \9 s- L! ^' |8 O( y! Q3 g6 m  printk("temp=%x\n",temp);  
' Z! I% `/ {1 e/ n* b" `   //SRGR Register  o+ b# y; R7 K" S# B* m
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; V, v' Q, X. } //temp = 0x301F000B;0 _! n# t, ?6 _! Y0 C
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 `! w: ?8 u4 q3 `  temp = readl(IO_ADDRESS(SRGR_ADDR));
4 d2 K; U, `$ F  A  printk("temp=%x\n",temp);
$ s7 X2 Q# `  o' q   //RCR; D! H5 S' g1 i* m
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- q% u9 c* e/ W& q& Y, R2 f/ h  p
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ L: R- w+ _9 l. \   temp = 0x00440040;
- I; p) D4 y+ e/ M4 c  m- b   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, j& u$ {+ f9 ?- h0 S   temp = readl(IO_ADDRESS(RCR_ADDR));) U3 \0 c4 \, X6 P! n
   printk("temp=%x\n",temp);7 d0 T! y/ |/ K6 p( y
   //XCR5 A9 T6 i: E, q5 h! N6 N
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: ^' d0 {4 T- G* u
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* X, F% c: `+ u& }* t9 T
   temp = 0x00440040;$ b, p3 u- D. b& n# j6 g) g
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   0 s; n" S- n: x( i0 O, X. f- u
   temp = readl(IO_ADDRESS(XCR_ADDR));0 H+ `2 S7 v$ Z% f
   printk("temp=%x\n",temp);
9 W# n+ \2 X" `2 V2 M, k  udelay(100);) @& x, U, x4 }8 d% H4 A
  //SPCR Register
" e- [2 }( f2 a& n5 |) N& k  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! t5 m4 q$ N7 D, T/ P% Z
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1$ L+ q% v% l5 I. l" [: L: C& T
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled  H! v" F" w; e  A8 i( \
  temp = readl(IO_ADDRESS(SPCR_ADDR));
; B$ p( ^  [8 i6 G  printk("temp=%x\n",temp);1 u1 P' D  _$ {* _9 B: s
  udelay(100);
# t( p5 A: k9 x/ N  f4 ^  B# C  R" m0 V; Q- m4 z
  //set GPIO direction
0 R0 S& a& z/ X3 r& V   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ z( N# M2 M! ?( K# `6 e( G6 [
   temp = temp | 0x00000100;//EPR----input1 P$ [" L* H: r
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
6 p: G$ v; N6 u" q. _5 X6 A   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " |9 [; \+ e% l2 {
& a& v  O. C% o
   return 0;; {% I! q* e! y7 [% ?
}- B( |  b  J) U" e+ ^6 ^
static void __exit MCBSP_exit(void)  {. O+ x2 ~: m: j
{
' x4 O! B# _6 E8 B" ]5 A   printk("mcbsp chrdev exit!\n");0 r* o4 _. d( r' I1 K& }: h4 m
   cdev_del(mcbsp_cdev);) U; f0 X: x# [* i& O; ?$ v4 J
   unregister_chrdev_region(mcbsp_dev,count);: f0 L3 O5 A/ b
   device_destroy(mcbsp_class,mcbsp_dev);0 M- I4 Q) F$ p# W
   class_destroy(mcbsp_class);9 ?  s+ _5 C/ h' t, E, j
}
- w/ S- h" @3 Lmodule_init(MCBSP_init);
: z- m/ l8 r+ e( a$ Vmodule_exit(MCBSP_exit);
6 ?$ u/ @; t! l+ _: O& W) C2 s6 ?* M+ _- G2 g3 m
MODULE_LICENSE("GPL");
% z4 r) j& G5 I$ I" E. V. r2 _2 H& c9 N# H, c. M5 N( l
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* e2 o( H2 b2 y0 k% a我的应用层的测试程序如下7 k6 q; n8 V) ~7 F) V
#include <stdio.h>: D( A3 e7 m1 {* L! L5 m
#include <string.h>
4 ~, V. A& [% Q  q* _  Z#include <fcntl.h>+ e) x2 H9 D  h; X) _
#include <unistd.h>
2 |. h' S7 C& g2 b#include <signal.h>
% H. l( l4 ]4 f" |/ T# u#include <pthread.h>       //线程
5 ?. s4 n+ o' K  a/ f+ l" P- N#include <stdlib.h>
3 t# ]5 S7 t9 U& C#include <pcap.h>          //捕获网口数据
* O. R0 F9 e# h+ H#include <semaphore.h>     //信号+ z: D9 Y; i: P9 ~8 o
#include <sys/types.h>     //消息对列
9 ^' U$ t; Y5 q% w" x6 L1 X1 t% q#include <sys/ipc.h>       //消息队列9 m1 |% Y* I7 r( r2 t' R6 @6 `
#include <sys/msg.h>       //消息队列
: J8 Y3 X3 a/ I8 z# Y$ V#include <sys/select.h>' [/ N) a' w& T/ r( p% O& b
#include <sys/syscall.h>
- z; |% E" Y. Y#include <sys/stat.h>
  j& x- w0 t* H% C5 ?#include <sys/mman.h>
( F4 @. U/ s5 i( ?- A( A#define msleep(x) usleep(1000*x)
) c$ l* I! h: X' ?3 S
/ n& q: }2 `) Y" c, dint main()- ?0 C5 j9 `2 i2 V7 u8 i
{ 1 s: B% j8 a6 W& z. U
    //MCBSP,ARM与AMBE2000交互设备0 D( G1 w+ U# F. o: G
int fd;) r! @5 D$ S# \7 K$ {
unsigned short data_write = 0x5555;
8 x) o) v, X$ n" s4 a4 o unsigned short data_read = 0x00;
4 S) F* `2 E: I- }; U9 x% |6 n  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( d# u. z7 R. Y3 w. f3 c9 x2 f
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" R+ k9 J, \4 Q. U2 U
    & e* o& O$ j6 T: e2 v, |
  if(fd < 0)- w4 {. I! O2 r: `' F
  {0 ?/ G3 p4 Z2 T7 N- ?! }
     perror("open failed\n");
" D: G7 @6 x& L     return -1;- o3 u5 p* W% [$ N3 \1 B0 |
  }
/ P% N+ K6 |  f  V" I5 P  
! ~( k3 c' V+ F/ c2 |( F& N4 z! b  while(1)
+ ^+ M* O1 J, ^! f5 h8 A  m  {( [" t2 I/ A4 t
   
8 k# t. n$ y1 F, F2 i6 k% `2 e   //AMBE2000每次读写是24个字为一帧
) y( b2 [9 {+ z# i   //写数据时将数据在底层存储起来,等到中断的时候再发送( s3 n( ~5 o5 A; `
   //AMBE2000输入数据是以0x13EC开头的
: Y7 `' S6 Z& `" `) Q4 l: T   write(fd,&data_write,sizeof(unsigned short));+ E) ~$ q* W5 R+ o% A
   
% F& o% Z9 J- K   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  4 \" C8 l1 y, S. P0 m' o" s* T
   read(fd,&data_read,sizeof(unsigned short));: c7 Q7 D; l0 X4 K+ T1 s& v( T
   , c0 @. _# C3 U
   if(data_read == 0x13Ec)) n) a; F9 Y6 C/ U& i
   {
8 k, J2 }" _* x& H+ a  {  C: u   - R5 [* p6 V/ o4 ^: z) g+ N7 C
    printf("data_read = %x\n",data_read);
$ ]) y+ n3 q" s$ |! t2 b, ]! E   }9 ]; d) e$ S2 }6 n! {- ^
   
  `: y' o  f  Z" Z2 G1 M1 F( {   msleep(10);
. v& v' w4 f$ W' N  Q  $ L! @3 H0 }( L4 ^6 n
  /*
# F/ X  T+ E8 {   ioctl(fd,1);   
* O. \7 {* u/ j7 g5 m- D  c$ t sleep(1);
* \! k# ^! E1 g% H( _0 U- z7 Q ioctl(fd,0);
+ C) F! y4 Z4 T sleep(1);' Z- x+ w/ [8 l( b" b1 M- S: S0 Q3 c
*/
: t5 a6 `2 {+ K4 D  P& R  }   
/ W/ y3 ?5 N  ^% p0 w9 ^2 J& ` return 0;" h2 y( R' H4 l/ J9 D

! p5 C) G7 l7 _5 L}! D  o- v6 y' I/ R$ O) k
/ Y6 k2 j5 h' E  Y1 r. d. S& i
多谢各位指教,谢谢! 急6 `3 Q" |8 n( e0 p# h. _

, P: L9 n* |% [, c% h; W  Q9 \' c' S5 g. u5 z, ], ?1 m

& S8 _8 S6 ]! P; U& W+ C/ H* D6 z$ P/ J& @, F( x" `* m9 b' A
5 B. j( J& D& m- C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 08:10 , Processed in 0.042302 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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