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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 i7 j% J: ~7 H5 b/*
5 |2 e" I- r+ x$ `0 K0 L * Copyright (C) 2009 Texas Instruments Inc" }8 S" L, N8 O: P' [" s
*
+ q9 z+ D0 q  [& t% ?! U * This program is free software; you can redistribute it and/or modify+ f& Q& V4 ]2 m% n3 k/ [
* it under the terms of the GNU General Public License as published by
1 \" i% G- b  I1 ]- S6 U * the Free Software Foundation; either version 2 of the License, or5 [, X! h2 ?3 u
* (at your option)any later version.
6 r8 D1 r& ~" q. ^- @& @/ P *
6 B# F; b4 {# P9 B7 Z3 p& g. m * This program is distributed in the hope that it will be useful,
' h( a6 `6 \5 d. S0 |: o* ^; ]- @ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5 Y) O$ T/ ^* s5 X9 C5 @( Q * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 ^8 k, e( Y: {) a0 a8 Y * GNU General Public License for more details.; n/ n- X* |9 d+ R/ @3 W" Q1 P
*
5 o, @2 e/ {1 z% ]: O8 ^2 Z' Y * You should have received a copy of the GNU General Public License
  }& _) o5 v1 ~4 C% {: y * along with this program; if not, write to the Free Software
/ C: {4 |1 |4 \9 Q5 k/ ~! @7 ^ * Foundati
3 B" t$ e$ c9 s8 j# h5 n*/
) ?/ n) T+ _9 k' S  s#include <linux/module.h>. {- Y/ {8 {: m. |# W6 k* b
#include <linux/init.h>
/ t' h# n% L7 z: u5 |% ~3 i9 k, U#include <linux/errno.h>6 v3 }9 X! h% c3 L/ r
#include <linux/types.h>
  Q$ R) [3 Q) j  {7 F#include <linux/interrupt.h>
' f7 [2 `, S  {: a. F. [. @6 _8 z#include <linux/io.h>
  `) n& I) ^1 u, H#include <linux/sysctl.h>: @9 }) Q1 r% _: J: M1 [) ^0 Z
#include <linux/mm.h>
5 m3 c3 e4 b, Q+ q# H% ~! i$ ?#include <linux/delay.h>
$ k. K. Y1 c) v+ S#include<linux/kernel.h>: y/ B7 }/ X" L
#include<linux/fs.h>
/ a$ \' a) t! e#include<linux/ioctl.h>. l) k6 B2 E+ x5 z) }
#include<linux/cdev.h>  ]1 O, @- E& f' w; s& u
#include<linux/kdev_t.h>, d. m8 z. i" F
#include<linux/gpio.h>
% Z9 g1 I7 R" ?#include <mach/hardware.h>7 C/ n0 n2 p" z# N5 ]
#include <mach/irqs.h>; i0 N& \' f9 O- w; G7 ^

: g. U4 B/ x+ h" T2 e#include <asm/mach-types.h>0 v9 Y$ [6 j& f: m9 O$ B
#include <asm/mach/arch.h>
# p# ?8 Y, E0 @' A( s& J0 U: k$ o#include <mach/da8xx.h>+ I( m3 d9 e: H" u0 t3 O6 y7 A
#define  SYSCFG_BASE   0x01c14000# M2 q: D9 b& A) l' q  i7 B
#define  PINMUX1_OFFSET   0x124 : V+ u: \: I8 }: b
#define  PINMUX18_OFFSET  0x168 4 M8 g' w( [2 z( T* ?
#define  PINMUX19_OFFSET  0x16c
6 `4 `( y( ^' d2 Q( z#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
& W0 g  _/ r) p  E7 k#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- c% t; p9 a5 P% c: V4 |
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% o. Y! I4 `7 e* c$ ^#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR7 `% [7 c7 m) x/ i& }& ]" _' A
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR1 n2 T' c- w1 ?# s8 t; k3 S+ v4 i5 A( l3 L
                            ( M- u2 |5 I0 @9 S" C& W6 E
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, ~' ?9 y$ C% d
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR8 C- ?! _5 t2 p# C
//PSC
8 M" @# J6 u3 W# x0 m) M8 J* a' ?#define  PTCMD_ADDR   0x01E27120  * N/ x* E# i" Y
#define  MDCTL15_ADDR 0x01E27A3C( [7 |" y6 s) ~
#define  PDCTL1_ADDR  0x01E27304
" E$ O  O" m5 i) a; M) w//GPIO8 direction
9 Y; _. l# K/ R- W/ G. e0 I#define GPIO8_DIRECT  0x01E260B0
5 o% Q# I& M7 o#define GPIO8_OUT     0x01E260B41 T1 _, d  B8 J* M
#define GPIO8_IN     0x01E260C0
# U" \8 N- E; J1 a3 R0 r( T* c. q" e5 ^; P5 Y, n: ~) h
//#define MCBSP1_RINT    99              . @# p# n1 m9 p9 z- F
//#define MCBSP1_XINT    100  4 s& c& }- _) n' }! x9 w# }) ~$ P
static int MCBSP_MAJOR=239;& w3 ?+ J: Q* J
static int MCBSP_MINOR=0;, J+ b$ l7 Y+ B
static int count =1;
+ m! X, g* q$ t  z$ R
: l5 \( w! I' `& F#define MCBSP_NAME  "MCBSP-device"1 |, T. ~$ S+ W! E, V
2 |2 t' c0 n) J4 K2 P9 ?
static struct cdev *mcbsp_cdev;6 b5 u7 x( Y' J' B' N4 W
static struct class *mcbsp_class;5 d  S3 j- R& y/ C; A1 y
static dev_t mcbsp_dev;  |; c( ~% b7 J+ X4 |( J
unsigned int DRR_data;
2 R9 i" `5 {/ O. e5 n8 _unsigned int DXR_data;# h1 Q, J/ M- w: V$ p5 H
static int mcbsp_open(struct inode *inode,struct file *file)
" ~. Y+ }8 f# I& J  Z. Q" x{! Z) b9 Q" r2 o8 {+ [0 ]
   * P$ Q' p. v# G, K
   //interrupt enable,initialized
+ }2 c8 ~/ Z1 `( m9 g! ~   unsigned int temp;
- x# y' U+ {: K) u, o! ~; {* D   //SLEEP_EN(GPIO8[10])---0
* \+ C+ n, S+ r* a  B! c1 Q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ l* X4 a  e% k. E$ q5 R
   temp=temp&(~0x00000400);
, @' m0 V- i0 z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 l5 p, [- y, v  //RESETn(GPIO8[8])----0----1
" p! y! G/ Q6 B8 _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- i3 w1 c' P5 G$ Y/ m   temp=temp&(~0x00000100);3 _+ V/ x6 v+ \5 S- r: U5 V
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ W' [# {/ `5 A2 C, ]: s# k, A
   udelay(100);* X( ^  b/ C: ~; ]/ C
   temp=temp| 0x00000100;# R8 j! x" e; i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 \2 k: P. h6 j! ^3 k4 t* n   udelay(100);3 n6 t4 `8 |9 A4 R" {. h( z) x8 W
   printk("open success!\n");
1 e6 d* p% d% O) |   return 0;8 J9 s; r  p+ Z7 @( u+ s
}$ S6 u6 y- u  s% n) @, P7 R4 W

( ]: Z7 L9 x; a1 Ustatic int mcbsp_release(struct inode *inode,struct file *file)' |9 F' u2 B6 l5 h3 J
{
: a) q* u$ x% B) P   printk("release success!\n");- |+ M0 Y! N8 d
   return 0;
( e5 c3 E9 J# |1 i6 s}; i$ Y4 e$ E! i  ~

, D+ Q& O$ w* O) m% D# l" G) N# wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 J* ^# [" m& r{3 J: o. [/ V/ J* T
    copy_from_user(&DXR_data,buf,len);
" L9 O8 g; y5 F: F, o1 ]    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
. ~3 T+ \  b# R7 c    return 0;
' D+ C8 L6 G3 [0 r
6 N6 ?, w6 C( y% z8 v$ f( ]}; n5 L9 n; r4 [. F. }$ x
: [7 [+ b0 E( J; D3 l, R' z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): R4 y$ }6 L* l7 G3 g4 F
{
3 @# n1 _7 L0 W: [# i( N   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: V3 A  y0 L: |   copy_to_user(buf,&DRR_data,len);
$ R6 c% q' S+ H- I   return 0;5 c5 X4 L; r& w
}2 j* V1 B6 A2 g: e3 p/ }- a
3 j/ v7 |2 z2 C5 r9 @& s
! t1 \. g1 h. S# r0 q) u
static struct  file_operations mcbsp_fops=0 Z& R  b" q) [3 C9 i  a( V# Y% M
{, v! A6 Y* T2 I) t. K) ?) g
   .owner=THIS_MODULE,7 F1 D; w" l+ M) w8 W4 v; |
   .open=mcbsp_open,
9 T, b3 j2 R6 u4 A. {" p# z   .release=mcbsp_release,! K# U( y6 s) E0 z" b; N
   .write=mcbsp_write,' u0 i% T& }/ O: B# e- Q
   .read=mcbsp_read,
  f/ p2 m, C& |7 Y: q3 \};; O6 E4 Z! a8 m7 i% x2 O% T. N
static int __init MCBSP_init(void)
( m/ Y6 I8 {+ _) ~- q; K( l{
' g# S- W0 B/ H) ?   int ret;
! E3 Q% t- c) @! |$ U* g& |# H& n   unsigned  int   PINMUX1_REG_old;7 |& j( f: s. c& P! C* r
   unsigned  int   PINMUX18_REG_old;) i5 a* f5 o9 P3 [% o
   unsigned  int   PINMUX19_REG_old;1 Z: F( x# |0 n7 j
   unsigned  int   temp;  : Q' `% T# S, q2 j% ^; F' X
   if(MCBSP_MAJOR)$ p! @' M5 {3 A6 q( ?
   {
2 S- e+ M) F5 ~: p      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- d. ]9 N" x! C
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* z6 v# T+ t. L& v7 ^9 w
   }
3 v' ~8 r, D  W# Z7 F   else
) e  G$ [9 {8 P" a: J5 w3 |   {* a, D$ s: I2 _4 P
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 h+ U# A# W2 l
      MCBSP_MAJOR=MAJOR(mcbsp_dev);$ t" {( O! E! n* x
   }
& \( X8 [5 o- T. L/ R   
7 x, f" y+ @1 r  [; `   if(ret<0)/ P' R+ H0 S9 R, {: Q( n5 k
   {
6 ?: t% F8 U& ~5 V% p      printk(KERN_ERR "register chrdev fail!");
. M* {( ?4 l) ^& u) D. R      return -1;9 l$ [: s+ e* G' `
   }' R+ S( E. L: g& w7 ?- Z4 a$ h5 D6 |
   
  ?7 x) n. u8 f6 m( O7 }  T; L% X   mcbsp_cdev=cdev_alloc();
( t; W. _- W. F* q/ c% r0 @7 K/ G+ ]   
0 b" U/ O  V# |8 Z& v' Y   if(mcbsp_cdev!=NULL)
2 S! U% b. Q6 [/ ^   {
- r! D" e  |( S2 u- b+ a: B      cdev_init(mcbsp_cdev,&mcbsp_fops);
" G% d4 q  h3 v: O      mcbsp_cdev->ops=&mcbsp_fops;
0 l$ Z) O  W7 U) K/ j6 g* }- S      mcbsp_cdev->owner=THIS_MODULE;
" B2 w5 _9 a  B' c, G* j+ M      
. \9 D) R3 k$ R, k      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), w& p2 \& F" O* \
          printk(KERN_ERR "register cdev fail!");
& A5 Q! e% u! V8 ?- V  ^      else* @2 V. t1 S: p
          printk(KERN_ERR "register success!\n");
- R6 b8 k/ r: ]/ W   }
0 K) N! r! N4 T   else: f, B: Y+ x  t- n" ]% H
   {
/ {1 N2 y* N) L2 i) s9 {      printk(KERN_ERR "register cdev err!");
: }+ F5 ?( S' N1 }4 g      return -1;5 u0 U! f( [' I" ^; W! C/ D
   }$ D# U$ F& U( I9 x* Y# s2 K* b
   
/ @! C1 N0 X7 e7 Z0 o  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# t8 c9 m& \2 L' A3 F: h6 e, E   if(IS_ERR(mcbsp_class))
& c- Q2 K8 C: k% x   {
; u$ u" M; ?5 Y: _! i/ j2 [( U      printk(KERN_ERR "register class err!");
0 q7 ?( c8 r9 @  l/ r; W   return -1;
$ }. o( j3 y4 u# s5 v$ }8 s( N: y   }
8 X# b/ u, {- V* n: S' Q. h+ L0 b   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. K+ j, J. o- s/ g9 v7 l
% m8 o- s2 s1 }/ x
   //PSC7 Y4 A- h0 o" J5 K5 t# L! M
   //add Enable MCBSP
2 o. b8 X$ W3 v" P. V   //test
- ^8 `& u% q0 ?! A2 d( j. B/ l   temp = 0x80000003;
1 U* R' H. O# r# K2 L2 }4 V. O7 m   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ r% B% T: h3 R3 K7 ]5 A# T
   temp = 0x00000003;
  e, ?: G( m: K   writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 k9 K7 D: I8 x% h- i9 Y 8 F3 B3 t7 O+ b# K
   temp = 0x001FF201;7 v/ t' ?1 L, @7 x
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));' \% P2 r, @1 b. Q& \+ N
   
3 c. @. i& n2 @+ \; t2 l   //PINMUX  * y: }" J1 [$ s0 ^3 V/ I  r
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 D. K2 J& Q# K; Y. R
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  * d8 a9 F+ Y1 p: K. x, f% O
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
, K, ]! ~6 H  w8 W   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) l& p) u1 n: n, v5 y: k; ]
   
2 b8 X7 h- b( R9 a! F   //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ A1 q. A/ Z" ]( H   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % w: K# D, r( F. W
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   $ Y; R0 o* A% o
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);3 v  N* v: E$ D" ]$ a& v
$ z3 G% \3 \/ x: V- A' ?
   //RESETn,L138_SHK2
' \1 f  z2 ]6 {+ d  N   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : _# j1 i8 ~( D* N7 i4 K
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
4 L1 I- v0 y9 M4 g* l4 C   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ f1 a5 m1 p4 x% H# ^
# q: K; U1 P- F# ]

* j# R. Y1 o) M9 K5 u) Q  //SPCR Register
" |0 j  ?+ y/ m6 q  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 R- y; b* A2 k0 @: ?) H7 I. S* h5 o( a  temp = 0x03000000;//(DLB=0)- A& |- y, C/ T0 L/ N8 ~
// temp = 0x03008000;//(DLB=1)
# z* e2 v% `* t1 D! u' t  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset0 E& @3 O4 U/ H- w4 N, K0 @
  temp = readl(IO_ADDRESS(SPCR_ADDR));! S4 v5 i5 A9 M' ]3 J: a& P5 X. K
  printk("temp=%x\n",temp);" G. h5 A$ G9 T2 f5 B

0 d9 Q* `5 Y& y* [7 M   //PCR Register
* C* g0 g) ^' D& I: P" E4 f   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) L) s7 N% ~6 t; ~3 J  // temp = 0x00000F0F;
" N% X* O1 _/ q! f9 c  temp = 0x00000B0F;
! b  ?6 X. H2 z3 L2 C  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
+ H  s3 O  t6 D4 S1 {" ?* @  temp = readl(IO_ADDRESS(PCR_ADDR));
' A$ I* J% l; \* ]  printk("temp=%x\n",temp);  
) f+ r" V5 d/ a; w9 e   //SRGR Register) D5 Q9 d  d# k7 f5 j
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 R" n! K5 N6 f/ w5 Y
//temp = 0x301F000B;
; c' u' D. R/ s   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 ^5 \% B: O1 _( @4 h  temp = readl(IO_ADDRESS(SRGR_ADDR));
* ^: k8 k+ Z) O, O) V8 s  printk("temp=%x\n",temp);, N" x( R6 l# C% n& N+ |% j0 m, ~
   //RCR
  S& x3 `- Z/ R0 n   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( v$ S, M3 [# n0 D0 m4 f
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 s0 E1 @4 ~/ M1 V: i: ?
   temp = 0x00440040;6 m0 b, n# Q8 W9 K4 ]3 O# t! Z* N5 i
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* _6 F. G; Z* l$ E   temp = readl(IO_ADDRESS(RCR_ADDR));
4 Q2 f* l! p! y& _6 r' F   printk("temp=%x\n",temp);  y- @" E) u# K/ p  w7 Z/ y$ v
   //XCR
( }. ]! f/ Y" [, T5 J3 F   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ b/ F& W4 D( @) f3 A* t
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
, |" p# v! t1 i  g$ v  f   temp = 0x00440040;
8 ]# z2 R# Y) Y/ s- c- e   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   2 I  |" F; `/ o6 m0 d# i* M' `
   temp = readl(IO_ADDRESS(XCR_ADDR));3 A2 T- v+ B$ u, P8 q
   printk("temp=%x\n",temp);
& `# {  B# T; j) }' w+ {  udelay(100);
# [( ?0 x" b6 _; A4 q1 g& P  //SPCR Register7 z4 `3 g: i% M5 |- _6 v
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 O( G, [5 z" Z* _- z' C) Z  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ Z7 e$ e+ q$ K+ N
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled8 c0 S1 s* h" W, U4 ~' Z
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) C2 @4 F7 ]1 D8 L6 U" d  printk("temp=%x\n",temp);
1 C' s: s! e/ k* f  udelay(100);0 m5 l' V6 l* a  k& p
9 L9 |& \3 L1 ^3 d. \# C
  //set GPIO direction" r! n) a, H% F6 S3 Y
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 }# o7 g8 |  N   temp = temp | 0x00000100;//EPR----input
) q; x2 E$ E; Z% N* u5 m   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ |, [0 p3 F) F   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 v# I. e. g4 e5 P* H # i! n6 H( a9 b# s+ _4 U
   return 0;
/ A% L. c) A* q% x2 \}! |. @4 `/ k9 m  x
static void __exit MCBSP_exit(void). X. E' o7 G( E/ S* C
{
  l- |; ?7 y4 c   printk("mcbsp chrdev exit!\n");
( q$ J: W  K) @, E8 d9 j   cdev_del(mcbsp_cdev);
' k$ O1 w; Z( v2 H   unregister_chrdev_region(mcbsp_dev,count);7 a. M& f8 u; K$ w8 h
   device_destroy(mcbsp_class,mcbsp_dev);
! E# s- O4 Y3 u3 n0 \7 f$ T   class_destroy(mcbsp_class);" S+ u9 r9 d' H1 L/ `; P, Y
}
9 [, O5 w: {: ]7 _- S, z9 xmodule_init(MCBSP_init);
7 M/ U" B5 j& o9 d8 U# S4 o! cmodule_exit(MCBSP_exit);
0 ~+ ?5 D9 J! x- C  s+ p
7 w" C8 f/ t/ S4 w0 q, P3 i6 {MODULE_LICENSE("GPL");
$ O5 n! n9 Z+ I( O# ]
8 \7 p! @! n) z! l6 [我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 T' t) ^2 V. S5 d0 Y0 {1 S我的应用层的测试程序如下2 ?! r: T4 i1 H6 {
#include <stdio.h>
2 u' E* b6 O( h6 k9 _$ |5 f; p#include <string.h>
( ?# l3 B, G# ^% z) k6 c: J#include <fcntl.h>% s# x( z2 h/ w; |
#include <unistd.h>- g' A! y$ S+ m* |
#include <signal.h>8 {9 s' Q9 C* r% I
#include <pthread.h>       //线程% L* z' \" T. m' B/ h
#include <stdlib.h>2 t# K% Y9 w% g$ n; Z! L
#include <pcap.h>          //捕获网口数据4 m* v! {: Z1 {0 G
#include <semaphore.h>     //信号
/ ]' @/ E2 }9 E, r#include <sys/types.h>     //消息对列
6 }0 e+ m4 x1 w* s! `#include <sys/ipc.h>       //消息队列
4 P- \# i0 S% Q5 W3 A" u#include <sys/msg.h>       //消息队列/ j% N  F7 x6 k
#include <sys/select.h>: }% a- `( N% }. G/ R( W5 \# _
#include <sys/syscall.h>5 H4 O. |) ]  {( H: F& O
#include <sys/stat.h>
5 E. W  r. L4 ]" l" p0 A#include <sys/mman.h>
. D; q  O( I- G2 l2 e#define msleep(x) usleep(1000*x)$ `( S% U  y. S- C- @- f$ f

. d8 T% ?1 V' {: _8 H7 U; rint main()
$ N6 V. t* d4 f) }) G{
1 G( R$ ?( m4 I/ p$ a  b" v    //MCBSP,ARM与AMBE2000交互设备
$ k- _% [" l+ y7 ]0 i$ @. Y$ \ int fd;) g+ x2 @( q7 e6 w) E
unsigned short data_write = 0x5555;) W% J& ~1 o0 W8 w# X4 K) L
unsigned short data_read = 0x00;
$ m$ `" `% u* ~, g- n8 T) `. w  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 O7 ~  M/ _6 O //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, {" r9 u' G4 i* d" {6 v    , K# M2 q1 L6 B! f: A
  if(fd < 0)
4 \) v2 Q4 Y4 r" Y: p4 |  {3 N; v8 z0 D0 ]+ j: A
     perror("open failed\n");
- J; J$ _1 H7 g     return -1;
# t& v9 N/ I& t$ |* \9 J  }
/ @: T8 E  b, ]1 c  
2 A/ P. _2 \$ I  ]  while(1)- k$ z% V: \% H1 [  W
  {6 r' @0 }" g/ d  t; P& m
   / m* k3 P$ ~+ `# V& L
   //AMBE2000每次读写是24个字为一帧0 g3 Y7 [/ z' G4 N4 T* `
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 w+ O& ~4 B0 D# B
   //AMBE2000输入数据是以0x13EC开头的& O+ t/ `) l7 P6 u9 r+ U! ]
   write(fd,&data_write,sizeof(unsigned short));* L! _! v6 F3 [0 _
   
6 y( T9 k2 {' n: ^5 B   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  0 B+ s; H6 z: c; e: A4 _
   read(fd,&data_read,sizeof(unsigned short));- {% P. K7 q- h- T. i
   
& p: U" X( f, O0 P   if(data_read == 0x13Ec)) u9 s( R3 D! P& t" O
   {
* T5 k( Z9 [# X$ ?$ Y& C; N- \+ f; q   
, T8 S; P) W- O* D% L+ w0 \- _1 `    printf("data_read = %x\n",data_read);
% |# N+ e9 G6 w5 j7 s! l* y   }
9 g5 W; O) t0 [$ P* u! w% ~   ; d8 }6 Z' k9 _0 @9 r5 _
   msleep(10);; E7 p0 R0 q1 [5 y
  2 N0 O: N0 \" |  _6 x' |2 Z' U8 |* P0 e
  /*7 |; f3 N! @, \' w3 p
   ioctl(fd,1);   7 y9 s+ W" U5 C; @6 e6 }. K
sleep(1);: F) A5 Z: S; c# W
ioctl(fd,0);6 i: M8 R* N. {+ N4 p
sleep(1);
$ ]8 G, C( J! A: F */
- T4 l. O9 s0 G$ y  }   " w- A2 f7 _- r) M, \! K
return 0;
; z6 s1 i: q7 ?. t$ S/ ~ ) f0 h8 |; s* O9 B- `1 w
}
+ z" m/ H, s+ S% f- X$ i9 D
$ a- n' P: o7 X$ D  l$ Y2 R多谢各位指教,谢谢! 急0 u  J& E/ y4 h$ g0 `
# V! N' Q$ _  w' [

$ D# U' p4 l0 c8 l2 r, d" H, B
$ s8 V# P$ k: M$ {+ l, `
* _% p; R" w4 S; ]8 f/ L
- B+ c, Y) s4 O( M; B# @  U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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