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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 g4 L5 g9 j4 l7 _1 V/*' G; z" [) l$ P* S" a7 I; I$ I
* Copyright (C) 2009 Texas Instruments Inc
$ h" j. g. x, ? *
$ K* N' a6 Y% S% J * This program is free software; you can redistribute it and/or modify8 `8 q+ H, O1 g8 u
* it under the terms of the GNU General Public License as published by
4 H2 X, _, e2 O2 |  X * the Free Software Foundation; either version 2 of the License, or' }: A5 I8 q/ A" x& x/ v  \
* (at your option)any later version.' h7 }- Y, s; s1 b" d
*  B5 J( ~, e! J( ?
* This program is distributed in the hope that it will be useful,
' ]* |* j' k7 x) j% [0 {( s * but WITHOUT ANY WARRANTY; without even the implied warranty of
0 I9 V$ j- F$ m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- H2 }. K! |9 m2 N8 i  ~0 V3 m * GNU General Public License for more details.) _& W4 @8 p- F/ `4 F& d7 }+ s
*
5 A5 R9 B) X2 f+ v * You should have received a copy of the GNU General Public License  l* [. M8 \5 x4 G
* along with this program; if not, write to the Free Software0 K, b" F. D0 k% Y9 N# {4 e% w
* Foundati: m9 N9 V- R& g/ H
*/
; Y0 `  p  F2 N0 `4 x#include <linux/module.h>
( \0 \$ m' a; `5 A2 B5 o# _#include <linux/init.h>
* p; m6 P+ F9 q. X* s- z. h  X  u#include <linux/errno.h>
9 s! f! ^6 q4 E3 O$ D, @+ P! z#include <linux/types.h>. ~8 w- K# Z8 r
#include <linux/interrupt.h>. }) H9 W' N% h. I0 _4 z5 {
#include <linux/io.h>0 A' N+ \$ m& X: V1 _
#include <linux/sysctl.h>5 m' t1 l9 J; K( I2 g- h5 ]; T5 T
#include <linux/mm.h>) g& |6 {7 r/ H$ Q9 T2 O" D( e0 h
#include <linux/delay.h>& E7 b) U+ O3 A; a3 E, T; @  s
#include<linux/kernel.h>
$ q6 _0 e: D! f! |& L#include<linux/fs.h>, D, i  Q6 P* M
#include<linux/ioctl.h>3 ~; B, P0 B) Y% G2 k' r' K
#include<linux/cdev.h>5 b5 |" t) B. y' c8 L* X2 q
#include<linux/kdev_t.h>+ P, R2 T9 E) D6 R2 ^
#include<linux/gpio.h>
: O, n8 X& b+ ]3 B8 {+ j#include <mach/hardware.h>1 c) W: Y$ J8 ~% p; f  U. q" l2 L
#include <mach/irqs.h>
1 `& k# P. C( \0 n2 A
' P) R. c. t$ T7 D4 `#include <asm/mach-types.h>
' b8 @! W3 l! }#include <asm/mach/arch.h>( I8 W) `# {& D% d" Q6 l( ~
#include <mach/da8xx.h>3 a) q! a* }( Q" O& V
#define  SYSCFG_BASE   0x01c140006 Q6 O: }' U' r
#define  PINMUX1_OFFSET   0x124
% b' r( P& y/ A0 b5 |: r$ n) g#define  PINMUX18_OFFSET  0x168 % ?! e" `" }( x0 F
#define  PINMUX19_OFFSET  0x16c: P; }5 _, u' K0 j$ m: t
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
! d9 G# n8 B. w& T, ]- E3 S$ h5 ?#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR9 c- T* k$ h7 S3 U2 p" t. k6 w, g# n1 I
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR0 x8 v, s' i3 h/ {% l$ l1 B
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) I5 M5 ~) G! k( ]4 c# d#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR, H+ y, V1 D- }8 [( V
                            % y0 Y: ?  ~8 [' P2 E1 t& M" J; D
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
' s; K6 u  n9 R% r( b9 z. N3 p/ q#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
/ w: J# `3 n) h! s//PSC
! W4 [3 h6 h9 u3 Z" M#define  PTCMD_ADDR   0x01E27120  
& n/ l6 |+ A* G5 `3 w& M3 J6 w#define  MDCTL15_ADDR 0x01E27A3C
& e: x% |6 q  L* w9 @#define  PDCTL1_ADDR  0x01E27304# M' ?# B/ [, q
//GPIO8 direction
% |" e$ D; s. ]0 C#define GPIO8_DIRECT  0x01E260B0( N/ g2 E/ @0 u% }$ ?% }1 f
#define GPIO8_OUT     0x01E260B4
1 P; Q$ x! `$ ^1 t: z#define GPIO8_IN     0x01E260C01 M7 s& {" ~' Y+ z/ g4 \$ v
' n2 l, A$ Y% o) h/ {. b
//#define MCBSP1_RINT    99              
/ T' F+ [  |$ g6 K4 B" `! M4 [//#define MCBSP1_XINT    100  
7 z- v* i8 U  ~( {static int MCBSP_MAJOR=239;
" S$ W+ E: h7 e9 z2 [. Ostatic int MCBSP_MINOR=0;1 s) |1 A, {# c; a
static int count =1;
! Z' F; w7 K" G& `9 o1 c! S$ E# p; f, T/ n* W9 z; ?
#define MCBSP_NAME  "MCBSP-device"
/ V0 \6 u3 r7 v6 q/ W( s
0 K! ?- o- m, O+ `7 N5 x' n4 I! w5 rstatic struct cdev *mcbsp_cdev;5 q! L5 P8 y; z$ I0 K$ _6 [' Q
static struct class *mcbsp_class;
' d3 _$ d) g; k' F( N% t' @9 F0 wstatic dev_t mcbsp_dev;7 k, C$ r) R( o+ ~1 }) Z9 }+ l
unsigned int DRR_data;
* c, Y3 n3 [# u* Q3 `- wunsigned int DXR_data;2 U( _" S9 v( Q# S9 o; W+ X) d  P6 C
static int mcbsp_open(struct inode *inode,struct file *file)
2 T6 i/ A5 C: @5 H) B! e{3 ~0 K0 I* p$ u+ Q9 W/ K. W& X
   
7 C' ?# p7 ?; @! @/ g   //interrupt enable,initialized) X% `; s, `" Y/ M2 N7 r1 ]
   unsigned int temp;+ H6 n& K/ p# x1 Q7 C
   //SLEEP_EN(GPIO8[10])---0
. W5 i5 }+ |: U, s   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) Y5 R6 W2 i$ k$ c# i; q6 E
   temp=temp&(~0x00000400);
: L: {3 e1 V2 ^4 z1 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- v% B; b2 W- C2 P
  //RESETn(GPIO8[8])----0----1
2 u" G% K  R: T- O; A6 R& ?   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; W5 |% P, c7 D( x+ @% T( s
   temp=temp&(~0x00000100);) U/ o8 n  O% I0 t6 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
9 ]* |# o: B$ E+ n9 o   udelay(100);$ p7 W$ m  H* q' U3 w5 L
   temp=temp| 0x00000100;
$ c% e8 X' ^; D' U# o) C# u9 C  B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
$ m6 \1 D% k5 s" _: X% ~$ C   udelay(100);; z. \- @3 k4 j& [, N% c+ ]
   printk("open success!\n");
& T9 ]$ ]& Q, G+ k   return 0;
5 I6 l) @  T: Z% H) ~9 f}
; H% k; e4 Q3 u* d7 N$ X3 L' G3 u
static int mcbsp_release(struct inode *inode,struct file *file)$ @7 o) }4 H* o! V) Z
{
' B3 W7 L1 j& o+ j- E4 N% F   printk("release success!\n");
% e" L' l, G3 @6 l$ U5 f6 X   return 0;
3 T$ {2 O5 d* d4 m}
- Q8 Q" m- U' |% f2 t+ Y
! b8 D8 a' E3 e7 x/ vstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. b( U, Q9 [; r5 y1 \{
& k& `  v3 J; Y    copy_from_user(&DXR_data,buf,len);4 w* n2 `% H' s
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
: n( v& b( c6 N) C# s( P/ }    return 0;6 _8 z( V% z( n2 t- t& D) ], D2 K

7 D. f5 }7 R: j: [: k  E0 {' f}
( j$ N# Q# q7 ~* Y- e* n, y5 g4 U+ N. U
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 A. ~) _5 q( M! d6 l3 @1 T( `* y{
( a" `+ N$ {2 y) V) q. }   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" c, N! c1 q0 j: ^9 X3 _% O   copy_to_user(buf,&DRR_data,len);
, c' i) a8 q! N) Y; M1 j1 m   return 0;6 T5 H) E( h8 o* H" \( S
}
( q% w$ k. C9 W
2 y. r, [! E- L) r, q% v9 Z, U6 u
* J6 r. ?1 @9 E# T* y; a& Mstatic struct  file_operations mcbsp_fops=
7 k* ~9 R& x! x{
( l; `& E6 C! C$ K6 m+ S* o: X   .owner=THIS_MODULE,$ f+ a6 d% K, s, {+ A1 t. T$ F
   .open=mcbsp_open,6 n3 n" X/ w7 r
   .release=mcbsp_release,
1 o/ t$ X" H+ M: x: k   .write=mcbsp_write,7 S) [1 u1 A/ E
   .read=mcbsp_read,& t0 @$ H0 w* m
};) {  m4 C. Q6 k9 J- }( C, `
static int __init MCBSP_init(void)% A7 T$ _0 U& H  h' p: G: W2 P5 `% b9 t
{
$ u% [( L6 S( I! a) l. y   int ret;! d: Q8 T9 q' q9 Z" |1 ^! B
   unsigned  int   PINMUX1_REG_old;
1 l$ D; H  {1 X$ f% v  ~' _2 K+ ?% E   unsigned  int   PINMUX18_REG_old;5 j) g% g3 E% y
   unsigned  int   PINMUX19_REG_old;
- @( g7 {9 E  g2 \2 V   unsigned  int   temp;  
9 Z3 z, U$ ?. ^) R: _* w6 ?   if(MCBSP_MAJOR)' Y; C' S- m' `0 B/ Q
   {: }  r* S5 t+ w
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 z8 g* X  o4 V8 Y8 I: j* w
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! S0 z7 {! W# @4 B, a- ?   }
( \! C/ g) t; [/ e" N- l( f. N9 K0 ~   else
8 ^9 s# V( l* F* J) v; t1 F0 a   {; D" v% G2 ~0 d! }5 |# u
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, c& _# _" P6 P- U
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# M4 G: D2 w" [/ S
   }
1 j$ j. [8 K3 h2 |: F- W* Q. b8 `+ l   
+ F4 i9 j% P- q; H! {, U* s   if(ret<0)
$ h# p1 H/ n, D1 A9 w  c   {- E% B; {; N. C# j
      printk(KERN_ERR "register chrdev fail!");6 {, L, |* A' ]+ y) l6 M( w2 C
      return -1;
0 w( z8 l; G" p6 r/ @0 E   }* O7 r* ^3 w9 k; V  c
   ( {9 n1 y( s9 D8 Y
   mcbsp_cdev=cdev_alloc();' q8 A- J8 w, E. m9 t: }
   / {4 [  e& o- k, P$ `* A
   if(mcbsp_cdev!=NULL)
9 a6 \! k% N2 V+ e4 v6 |   {9 M* w7 }; b9 k) Y0 I2 j+ f
      cdev_init(mcbsp_cdev,&mcbsp_fops);: y" G; H5 S9 w% n+ N6 |6 n
      mcbsp_cdev->ops=&mcbsp_fops;: D+ j( q' d" D6 q8 z
      mcbsp_cdev->owner=THIS_MODULE;4 @6 k% t; V. C+ k! O( o/ m0 I: I4 @
      
' P: v0 @/ |& y( d. R  T      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- U$ N' ?. j( t6 s          printk(KERN_ERR "register cdev fail!");% M4 [* E" p% j% Y5 j: q8 z
      else4 ]2 r6 i2 f4 t4 r
          printk(KERN_ERR "register success!\n");
) P$ v  Z& m$ e7 r# a% l   }
6 w' _# I- O7 s' r' n   else# F! d5 E  T4 b! f+ G6 D' F$ E
   {% H! ^  r" E2 t& T1 v. W
      printk(KERN_ERR "register cdev err!");- `4 G' B. _* g. N
      return -1;
% P! X- w- Q8 M3 _# }' V/ o   }* t* m! Z3 x' f) R7 s
   5 S/ H7 n1 x3 f$ d( F6 T) f
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" W" I; d  x9 w% H
   if(IS_ERR(mcbsp_class))
+ o- R1 T: B2 t- ^. n  u) O( c  W   {
+ i# z: z* {; r) j' @; o4 \      printk(KERN_ERR "register class err!");! r" |# Q/ `0 `
   return -1;
- u6 E0 C: B& o$ x   }6 j: o) r* |: k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 J2 N. h! U  t$ D
4 T' e9 I3 j: B' w5 J' B
   //PSC
: p3 W# G* _. W9 e   //add Enable MCBSP
: f4 u6 X+ s. `3 `% F4 Y5 J   //test
; ^5 ?! ~5 I, _2 P' P" B3 o0 X   temp = 0x80000003;4 s9 g1 }6 C5 [% V) C$ S' k
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- C2 U; Y9 }3 H8 O. p
   temp = 0x00000003;; ?! {( H3 W" U( Y0 W8 L) ^
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
. A9 L: B2 V- G& e% s5 _9 m 5 A# u) q6 k4 y. C2 |7 D: v
   temp = 0x001FF201;! b6 H; ~; x8 L9 L* k3 E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 h+ ?# o) q* `( m+ t9 ]   
% A+ E* B& c( x" o: S% }" Q   //PINMUX  : i' [9 E$ V( r+ r
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 U# r5 M* L% c; K) w
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
( z! M' a1 S/ h( O   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   , X$ X9 {% |) K1 s3 g+ ]
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" S& l4 v5 G4 R$ W
   ) N% w0 F. ^2 I6 O; O
   //SLEEP_EN,EPR,L138_SHK1,L138_RC3 j6 r- p) [$ g
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  8 j2 L! _; R% J' G4 C: |
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ! E2 Z9 }: c' I" O
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 S, [' X! E; l( y$ b( j
0 M, _0 y# t/ H: y$ _8 r   //RESETn,L138_SHK20 [1 K7 C2 z7 S
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ' Z0 V5 {2 `/ I" B9 [
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   # m# L1 Z' @* y8 c$ |
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);! M5 a3 F/ z! f4 c, _2 P& L8 D
8 l8 o$ e5 [3 j+ o  P- @6 n# `0 C% o- m
. L5 c5 ]3 b/ ^9 R/ ]3 g$ I) {
  //SPCR Register
$ _# u& c2 t1 ^2 a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! I& k5 ~9 Q& d) i" g2 _. c8 i, h  temp = 0x03000000;//(DLB=0)$ e5 L- U% i8 ?% Z' R6 D% n9 F& b1 n
// temp = 0x03008000;//(DLB=1). }# {1 P; ?! U# ]7 {
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
9 r# I: a! i# Q7 r4 O  temp = readl(IO_ADDRESS(SPCR_ADDR));
; {$ p! b) k5 a! c8 v  printk("temp=%x\n",temp);+ q/ W- `2 ~. F+ O# }3 n$ {
* d2 h# w* O- a; C- [
   //PCR Register
6 Y! s8 W" g7 K( c9 {   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0. W- o: U  o, G% L
  // temp = 0x00000F0F;
3 @4 x# A. C/ L2 _2 d1 s' G  temp = 0x00000B0F;
8 c' Z3 W* u1 D9 y4 n# P- p  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' s) a* ?: V& M, q% Y  temp = readl(IO_ADDRESS(PCR_ADDR));8 c6 ~8 I$ D- C( b1 V  B7 M4 i6 j. G  L
  printk("temp=%x\n",temp);  - i9 ?5 r5 |" }" G1 x
   //SRGR Register! ~& r4 V- w9 n- k
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' \5 \4 `, s- H
//temp = 0x301F000B;
9 [  {+ o% ^* o; O6 F   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 7 ?/ q, U& z$ Q& k6 C, y
  temp = readl(IO_ADDRESS(SRGR_ADDR));
. x' ]& A2 x; \, X; |  printk("temp=%x\n",temp);7 R5 p; r0 p2 k+ q
   //RCR
3 C2 J* f, b4 N- p$ e   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 A6 l: K4 V# s/ T   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- n# M8 B1 U5 y* A' d+ P   temp = 0x00440040;
$ f. k$ n% ~* n" }: O5 ?! Y6 Y   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & l! z& S( |- @8 J$ o: w
   temp = readl(IO_ADDRESS(RCR_ADDR));
! S" i4 a, I: q* A: W' m" `   printk("temp=%x\n",temp);
7 _6 F7 @/ s" |' ~$ Y# _   //XCR
* O0 T7 N  |4 J8 r1 F0 z$ k# J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" T. h& R8 b: F   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-01 |7 _4 n! Q/ D
   temp = 0x00440040;3 \- `- q0 M+ {# l4 _$ @7 {: }
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
" }; c% N. ]7 W. X/ r- ]: [   temp = readl(IO_ADDRESS(XCR_ADDR));
* {; ?' L( \. {   printk("temp=%x\n",temp);' W2 i$ @5 g) f' X! r+ ^) P5 X
  udelay(100);' E2 B: ~  j, N6 f
  //SPCR Register* ^5 w* G5 m: z% _
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 E" W& @1 T/ t- P
  temp = 0x03C10001;   //DLB = 0 VS DLB = 13 p9 Y2 M( c- P: M8 b& a- I
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
( d! D  s1 Z! U& ?, `! g; d  temp = readl(IO_ADDRESS(SPCR_ADDR));" {, T1 e9 }* k; L8 ^
  printk("temp=%x\n",temp);
" _4 G8 i$ {) `9 o$ ?6 q7 A  udelay(100);
8 B* c5 v9 a( V4 ?  q4 y2 A
8 z/ w  J- R0 {: J9 J  //set GPIO direction
$ {2 E) R% O" {7 U  |8 c% I   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 S, I( F. V7 f) v   temp = temp | 0x00000100;//EPR----input3 L0 B; `$ M5 Y/ w8 m( s
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, `% y% E- Q- x, W, t9 H
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' a  C; V% O* x4 [! }, s 9 q" {" n5 Q5 n3 {. j
   return 0;
+ Y6 x9 d. T# F}) ^8 P% C! T6 N* ?- B4 `$ [' F( V$ e
static void __exit MCBSP_exit(void); z) R  Z: k" u' x
{
5 i; k& H6 m! y8 A   printk("mcbsp chrdev exit!\n");/ P! ]! G1 o4 D( |
   cdev_del(mcbsp_cdev);( b2 _) z7 o& P) y( `) x* o( F
   unregister_chrdev_region(mcbsp_dev,count);
5 F( [1 j- E8 e( Z3 o   device_destroy(mcbsp_class,mcbsp_dev);
- y$ L6 X- i* D- X, P- O! r   class_destroy(mcbsp_class);7 I! L: ?/ v4 H2 B/ S
}7 o( s3 n# h& j
module_init(MCBSP_init);
* B4 x. a: |" o2 ymodule_exit(MCBSP_exit);
6 q+ u8 f5 ]4 h' K, s: c3 C4 U0 v! }! L, R
MODULE_LICENSE("GPL");0 l) f5 }2 I4 R' A
0 y, r: E/ _2 v5 j
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 }, F) f5 i7 U/ T" W3 Z' h" W, [# _3 K
我的应用层的测试程序如下6 Y/ \% F7 O; G# u8 ?( J
#include <stdio.h>
5 s( u; x# ^; Q4 {+ h- R9 P#include <string.h>; Q+ h4 X) c& f/ c8 o0 \# E3 k
#include <fcntl.h>. G6 E/ _5 T+ n$ D: \  z
#include <unistd.h>$ `1 x4 r0 r" `- n! s  I6 q2 q
#include <signal.h>
: V$ B3 W% L' d#include <pthread.h>       //线程- ?: i* B* a5 C; p
#include <stdlib.h>' n, j8 Z" {2 P7 L4 {5 ?9 q
#include <pcap.h>          //捕获网口数据/ n0 d- N: @, L4 ~0 n+ ^: o
#include <semaphore.h>     //信号
4 O$ H- l% C* w; P  W#include <sys/types.h>     //消息对列  N1 u& n$ z% X5 e! ]
#include <sys/ipc.h>       //消息队列, I( e/ v# Y6 u- ^; a5 y( c
#include <sys/msg.h>       //消息队列; I7 ^- _3 |9 i0 P3 W
#include <sys/select.h>
# n  T+ w0 f* g# Q#include <sys/syscall.h>
) V' D5 q! x+ f2 K) O5 [4 k#include <sys/stat.h>& |8 V+ [) X6 S. E# R
#include <sys/mman.h>
# S: H- u8 a, F/ Z5 L' o0 @#define msleep(x) usleep(1000*x)6 O+ S$ v& e" y; n8 M6 @$ d  l4 B
2 J) q) m2 ~/ Q) Y9 d
int main(), h: d8 x1 @0 m, Y" G' D3 Q! A4 P& M
{
0 W' B" z0 N. N0 q" o# C2 h3 _    //MCBSP,ARM与AMBE2000交互设备
( ^9 H) j6 m% j7 L2 j. C+ `( x int fd;8 O+ x7 n2 E% ~* |' s
unsigned short data_write = 0x5555;
" N& `! X8 A4 z2 n$ a unsigned short data_read = 0x00;
5 U1 H3 [5 @# ~- ^- l4 z0 F  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 v# [/ k& s& S( S9 }
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: b7 E$ p6 [1 Y  c
    & P6 {! \( t9 g. s" k) f* n
  if(fd < 0). D  l9 g, P! b1 }3 P: A
  {& K8 Q  N: B2 I- w, M
     perror("open failed\n");5 q+ U7 d9 N" w3 `- J8 x
     return -1;
2 D. V' V4 ^$ s$ o2 `  }
' Q, D# j7 o1 w( z  6 H0 `# Z+ x/ k5 O
  while(1)  S- X$ ?& h& p: W) w1 ^# a
  {
  w. U$ ]( M5 D$ a( s) ~   ) m6 _1 S0 |0 {1 v
   //AMBE2000每次读写是24个字为一帧+ c2 ~: y% O1 P( l+ i; @
   //写数据时将数据在底层存储起来,等到中断的时候再发送- o$ V" k1 O. L$ M  s3 D& R. K% @
   //AMBE2000输入数据是以0x13EC开头的5 l5 d: U% \$ r1 o6 g$ S
   write(fd,&data_write,sizeof(unsigned short));$ B2 T4 o( ?. b; N( A: L2 q0 a+ P
   
% B$ }& p8 p" l. c9 f   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 Y0 j" i# y/ S  E( ^6 {- o   read(fd,&data_read,sizeof(unsigned short));' z. ^% Q( F: w2 M) i9 t
   
/ p7 a; f" C3 P7 }- z   if(data_read == 0x13Ec)) q) A' a* i% h# X# B& P+ v/ p; V: W
   {4 e$ x) n6 |% \; L
   9 {& ?& L" [( x7 P
    printf("data_read = %x\n",data_read);- \$ A- w2 v; X+ a7 J; i
   }
0 U: m8 `1 W7 s9 \   
& x7 o2 h- k' X6 {7 i* C* J6 n   msleep(10);
; i) l  m" N+ w6 V  
) k% O9 W, \+ M. e0 \3 `  /*
9 B+ C' g- I2 Z  h. v% K   ioctl(fd,1);   # ?/ y9 ]% n8 B5 M4 ]
sleep(1);
! g+ p/ R% m0 h# Z/ [- [! U: \- j$ N' A ioctl(fd,0);0 f9 L5 x, p" @5 Z# A# ^9 K& g( W. i
sleep(1);
$ o1 P7 f3 Y4 g4 h */ - w9 d6 S& U' c
  }   * \/ Y5 D* A9 `' g- b$ a4 k
return 0;
* v  Z- _; m  G6 d# ^
9 ~' T* U/ Y% d' f: j+ i}
( T6 K2 o: P! i" h4 Y, O; J% E  Z/ ?# j
多谢各位指教,谢谢! 急
; ?8 Q; q4 A' w0 V0 [6 k. \. W
: J5 b! H9 {, q8 e$ x! q' r  S) L( U9 v1 }. w0 `2 R! Z$ ]9 n
, R& R, h, ~$ @8 _+ \$ Z$ ~/ q

/ N+ @9 H/ r' M4 p1 ~! X( U; S$ @+ ]5 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 22:19 , Processed in 0.042759 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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