嵌入式开发者社区

标题: McBSP时钟、同步、数据线不正常 [打印本页]

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: + c" q; c2 Z; w; |5 c
/*
! Z+ d: K7 T1 D8 x/ x- F: ?% A * Copyright (C) 2009 Texas Instruments Inc. j) b1 ^. Y" {
*0 p0 {. V1 F; S
* This program is free software; you can redistribute it and/or modify8 r. k' [0 g; d* P
* it under the terms of the GNU General Public License as published by
8 D/ ~/ u$ V4 X  J * the Free Software Foundation; either version 2 of the License, or4 ~5 d  @, \% o; S. v$ j
* (at your option)any later version.8 S2 W6 H2 t: X( z
*# Q$ |3 t$ O  w
* This program is distributed in the hope that it will be useful,
. M) b% b6 z7 B6 F4 |! B" T * but WITHOUT ANY WARRANTY; without even the implied warranty of
# F3 O9 N) u7 |$ L * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ w* I9 s. K2 | * GNU General Public License for more details./ W/ S" M+ a2 v8 U1 j% L7 \
*# J' Q* m; Z  t0 Y
* You should have received a copy of the GNU General Public License9 M! {/ M" Z: w+ O; z
* along with this program; if not, write to the Free Software
1 i0 P$ W0 k2 [% e, a3 i: V * Foundati! ^4 M  A' u. @+ [
*/
) T0 G6 i) a: f9 E; V4 Y#include <linux/module.h>
$ B% y1 D' d) S% R9 {: q#include <linux/init.h>* A: e) n' F2 B
#include <linux/errno.h>  E7 n  v: T7 W
#include <linux/types.h># U7 _$ Z$ L, x3 h3 C! K
#include <linux/interrupt.h>
, I6 Z! c! W- ~7 F; f#include <linux/io.h>
7 n- K# r! R1 S- a* h% o' d) h#include <linux/sysctl.h>
# O( M2 I: N3 M- u, P' X/ w#include <linux/mm.h>" |; ]6 M. Q. ~1 q9 u& q9 u+ B, j
#include <linux/delay.h>* M3 I8 _' S+ [3 G% ~
#include<linux/kernel.h>
) B) U8 T" f5 m9 i# C9 U# F#include<linux/fs.h>3 h1 s: G: D. c, C
#include<linux/ioctl.h>
  _: Z5 t1 @! k5 S3 Z* J9 M$ G#include<linux/cdev.h>
  p7 i' }" G4 H& M; m% |#include<linux/kdev_t.h>
1 y; ^* L) N1 c5 q3 ]#include<linux/gpio.h>! {# k( D7 g$ X0 }5 T
#include <mach/hardware.h>
( g  v, g/ l  `# W  \! h: M5 h- c& b" {#include <mach/irqs.h>
# a! Y5 c% |6 s  M! {6 d2 f- y9 k- C4 U
#include <asm/mach-types.h>/ W5 m) N+ Y* Q! m$ h# w3 o" n
#include <asm/mach/arch.h>
/ E5 y5 V6 _& E2 P, z8 s+ C  }#include <mach/da8xx.h>
! S( E# t* J& ^! R7 Z" X#define  SYSCFG_BASE   0x01c14000
5 o2 Y9 N2 X7 T) e7 I; R#define  PINMUX1_OFFSET   0x124 5 }4 x  K: V6 p# d
#define  PINMUX18_OFFSET  0x168
# Q5 N% k, e/ ]/ A, z#define  PINMUX19_OFFSET  0x16c
% w" U: k+ H9 P  A6 t) a$ z#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR5 h& Q5 m7 U3 b1 u: r9 V
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR& D, u5 K( `5 R  Z3 f+ N8 Z
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
( u- M& U5 Z$ n: i. k: ]1 z: b#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
/ V1 N$ w  `( d) I  a#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR% T3 r+ e$ ~. v% b- W8 v( P& Q3 h
                            & m3 N: F7 z& O- H, b
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
9 G/ N9 E) }: b* g# Y2 a+ U#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 s; m( J5 q) f; H' [1 Z//PSC! H  H8 _1 e9 j7 q  F
#define  PTCMD_ADDR   0x01E27120  
  t( {8 S& y2 U" c* E#define  MDCTL15_ADDR 0x01E27A3C$ ^& o8 o) i1 j' |* p
#define  PDCTL1_ADDR  0x01E27304
6 e- b3 B8 f6 y9 Q. t0 |! t//GPIO8 direction/ r4 w9 I  P/ \, T  \  R7 g: @
#define GPIO8_DIRECT  0x01E260B0
6 @- E9 W2 u% L! o% j; d  o#define GPIO8_OUT     0x01E260B43 ^7 E+ h' W% e
#define GPIO8_IN     0x01E260C0# @3 o# `7 K- K. K5 D

" s' {5 M6 N( E: c( R. f% Q+ U& R//#define MCBSP1_RINT    99              
' [% L  @' x# y  v' ?" U//#define MCBSP1_XINT    100  * D  O/ Z3 f6 ~# \( e9 J4 o
static int MCBSP_MAJOR=239;) s9 W+ I$ s7 S5 \4 E$ z$ a
static int MCBSP_MINOR=0;& ~) ~9 l) O8 `2 v8 s# `; S0 I
static int count =1;# Q# U) U6 F& V8 g
; A* C0 F8 J* p2 F; O0 a
#define MCBSP_NAME  "MCBSP-device"
2 x. p# m0 c- o% [7 K! F' O5 p7 Y/ ]% p
static struct cdev *mcbsp_cdev;2 M4 L( u) l2 r2 T, M/ C) D, q" I
static struct class *mcbsp_class;
. {  p' p( O1 t% h3 M$ X2 P2 @+ Zstatic dev_t mcbsp_dev;
9 Z2 U, l$ l% \* {3 Y& funsigned int DRR_data;
( U# ?7 ]+ n& o# R- n  t2 x  Cunsigned int DXR_data;
. N' D& v1 p% c" i4 Pstatic int mcbsp_open(struct inode *inode,struct file *file)
5 B" {/ ^% z# r, \7 s- \) v) \( y. `{8 @. h" Q3 K# l' K/ z; R5 V4 f
   
. ?6 t4 f1 r+ n2 v! ~/ P7 |   //interrupt enable,initialized
% R" c2 @( j  o7 ^0 r3 ~: P   unsigned int temp;
0 i3 W" u, o3 _. `1 M8 A; H   //SLEEP_EN(GPIO8[10])---0
# f; U& v2 _2 X$ }  A0 R( r   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: p3 F3 z) [9 e; S! n) _# p   temp=temp&(~0x00000400);
, z% y! p: e2 k9 B6 I, J   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* J( Z8 l, K2 l5 S. i; H  //RESETn(GPIO8[8])----0----1
: P% N3 K' i- z& _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 x; R$ z- N9 I' Y7 L   temp=temp&(~0x00000100);' E, k) c% f1 _
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---03 s5 U$ H4 `& N# z
   udelay(100);/ \+ [7 }. l! a1 e9 [9 W* Q
   temp=temp| 0x00000100;
) S4 w% N, @" r; V: C$ t6 H9 F9 r   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& ~9 c+ K/ E( l) e6 r# f: o   udelay(100);
. P& a3 J: Z) n9 W1 h$ N   printk("open success!\n");
2 s% U. S  _, D4 r# J, v3 u   return 0;3 L" r! }6 c  s$ C" y; |; ^
}+ r2 L) _* s5 S- [- V: s
+ M$ J% n2 r  q; Z# R* [
static int mcbsp_release(struct inode *inode,struct file *file)
9 u1 S9 D! U5 R{
  |+ G9 A4 p: g   printk("release success!\n");
  c$ P9 Q: k4 Q: ~0 |. M: I( |   return 0;
! V; ^. g4 x7 Q( r}
  G5 e; s$ v. G, d7 g# A: J- U- S8 H  \/ {5 u% Y. i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 U' p$ L7 Y0 n* l
{- c$ k  j+ u" ]
    copy_from_user(&DXR_data,buf,len);
; A- D" i7 s7 t, Q" p    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" E' j- ~% m  T0 Y. b, c5 ?    return 0;
& M7 j% w: t( Q$ T# H4 _" o$ |- W
. s1 e6 [5 x7 b/ V0 g9 Q& c}
1 ?& |8 `5 j' G* t+ {5 k9 w+ a* P# @9 q% F, s5 {( @7 R8 W; U  W3 H7 R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) D6 i: h+ A' B9 `4 |4 g9 E! n{ + P& }4 ^8 J( d* R& H, u' L
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) f6 c/ ^5 G8 D; w8 J   copy_to_user(buf,&DRR_data,len);
- z0 Q; O+ S2 E. m5 l$ T; b/ o/ w7 N   return 0;" t: w# c. @3 p8 F9 T, c4 N* n( F
}
$ Z  _; N* ?1 d, A3 D
/ G0 i- S( F  _! s; s+ N
. T  u& |* e& m" N5 P0 B2 ostatic struct  file_operations mcbsp_fops=$ y& A! \  y! p9 z  u( `
{  ^# H7 l9 w1 m' m" f+ n9 Y
   .owner=THIS_MODULE,/ g# p% K; G/ U! j# l
   .open=mcbsp_open,
6 F& {' b2 F) A/ i3 F+ |" J5 u   .release=mcbsp_release,
# [6 G; g4 v" B   .write=mcbsp_write,
8 Q# l+ M/ o" z7 c# P" v% x   .read=mcbsp_read,
1 J% }' Z, I; E; i6 N  S! `) i};+ G( l. ?0 T' h5 R  {
static int __init MCBSP_init(void)
5 H' _6 x# t; C! J{
9 `8 s, Z7 X" S3 y+ ^   int ret;2 G5 P& ?% q% s* s. ^
   unsigned  int   PINMUX1_REG_old;% O6 M$ J7 Y9 A3 s6 B6 E
   unsigned  int   PINMUX18_REG_old;
' K. E: j1 L5 W' c$ C) A   unsigned  int   PINMUX19_REG_old;
; P' I- x/ ?" c   unsigned  int   temp;  
/ [& u1 G/ d) d7 P4 R5 O4 p   if(MCBSP_MAJOR)
; B/ v, T( Q7 b- t. C   {. o& Z# A; X5 _9 e
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* V, Y% M5 o' ?  ?( Z! B( _( {( [      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- V% y2 v/ W5 X: L% h; o
   }
8 R- {5 Q- C. ~7 @# D4 x% r$ ]   else7 U' L1 f- P% }9 u- W
   {  @* o! Z- q8 ?/ m! \  ?& _! ~
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- U9 V8 J! W* `# |5 Q0 p- z
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
0 F: S1 {% W# Q' P7 T   }
( p. o& K7 T* z   8 s3 |- @" M7 p# r3 C9 f
   if(ret<0)$ ]( b9 @  z! J  T0 P8 P3 W
   {
9 h0 |9 E/ K6 I: z% |( w      printk(KERN_ERR "register chrdev fail!");$ U! A9 A! w' A  d( X" u# L' Y
      return -1;
- @, \, U. ], t3 T   }
/ {! _5 |' k" p* i% G. n. h4 ~   
- X2 X9 r8 T7 u6 W/ Y9 [   mcbsp_cdev=cdev_alloc();7 R% v) \! J' D+ |; ~. E5 z* t& g
   " d; H8 R7 T9 w6 N6 B  O
   if(mcbsp_cdev!=NULL)
2 I- t. g% Q- J; n$ X2 S   {
6 r& f$ |8 e" G& w: Z6 ]' C      cdev_init(mcbsp_cdev,&mcbsp_fops);" ^& g. N* I! k( x. U
      mcbsp_cdev->ops=&mcbsp_fops;8 N% a1 T/ s& L: Z' u9 ]
      mcbsp_cdev->owner=THIS_MODULE;. u1 d: _4 _- o  U+ y- p. N4 R
      + q! Z& t. q# Y6 \+ W+ d
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" I/ _* ^. V- E, [          printk(KERN_ERR "register cdev fail!");
* J, g  @5 s! [      else
" e' ^9 u+ x0 z3 J5 x0 R- n6 X: I          printk(KERN_ERR "register success!\n");2 K5 e+ _' D8 h. `2 v8 ?* q; Q+ Q
   }0 T# p4 _# ~3 v5 a  M; J$ `
   else
) h; L. G6 v% F4 u6 o1 x4 M- K* y6 I' I   {
& q) C! e! z/ b      printk(KERN_ERR "register cdev err!");
; P' o5 E# h# T& H( b" r      return -1;7 x2 i) {7 {! I0 i" L
   }6 w% y$ U1 {  B2 X  B. g
   
# s& E! a1 F. t  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) l1 U- a6 X; g- r" W, B1 W2 E
   if(IS_ERR(mcbsp_class))7 i; H. _& w# t6 U# Z. S. [+ H
   {) y1 J- b9 L7 \
      printk(KERN_ERR "register class err!");
) Q7 t4 N$ S. v6 O0 B% G9 R( g8 J7 u! [   return -1;
4 P( w+ V: x( H  S9 J( H   }6 ^2 \% J( t  G( H1 k- [, G
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
9 m$ ?6 `" e6 e7 {2 A  C. U9 p( L- [! c  R6 k' ]8 K
   //PSC. z) c4 G- D4 h8 W( C( q4 t
   //add Enable MCBSP! f& ^$ x4 ?0 A4 ^
   //test
9 L2 l4 Q/ i3 x9 Z   temp = 0x80000003;/ }! y2 I% Y- a+ U% k# H/ ]0 W
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- t- L; k- W( z# q
   temp = 0x00000003;8 v; B1 G9 o$ W" w4 q# j: ~
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 M0 h9 N3 A9 Z8 ^, B! q! G# { 3 P/ v# N- o. k: O" {% U& Y& ^
   temp = 0x001FF201;
6 [: ~1 J: y' e2 L1 k   writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 \  `) l7 K7 v, k+ w2 y
   
3 @9 O6 G4 W; V$ m- G. F5 j! c   //PINMUX    @, j& a1 |1 \  R1 `
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,  X  N; H+ N# N+ [" O  z% ?/ ~
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
) }% }3 x+ x, I5 |2 x3 t   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
- @+ M% T% X3 T- R   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* x, v7 I% x: o. C  d+ ?   
2 L4 k3 b( B. L% P4 z4 c* {   //SLEEP_EN,EPR,L138_SHK1,L138_RC! t+ s" d/ @% m; f+ |  _6 b
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  8 v* E; e: }$ [& ?: {
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
! w. N7 d7 ^' [   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 N5 c+ s% s3 m( ^
/ C6 c" r( [' o   //RESETn,L138_SHK2& ?4 G' Q. ^0 Y& ]% `
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! C) J; I+ X+ K0 _( Z6 V   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: v# @  E  E4 j, H1 i5 f   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% s+ }5 `/ o$ B8 w( b0 U  E
! b: I9 P3 k% q: W, U  ~' E

* y( E# j5 ]  @& w* c  E" d: A  //SPCR Register
: o. K3 u6 M" J2 t3 l- Z  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' W2 u; M$ q6 r5 f$ v  temp = 0x03000000;//(DLB=0)1 ?. T4 ]' q; y" W; o* ]: ~
// temp = 0x03008000;//(DLB=1)
& l! k/ r6 {: A2 U% n! Y# B  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& i0 P2 M/ M. y  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 u( }3 P4 J7 g& l2 S+ W' ]# P; \" H  printk("temp=%x\n",temp);
4 n+ Q9 v- W5 H$ m: g 3 h! W+ M8 @  j* e: U# l4 `+ P$ g
   //PCR Register5 c% c' @/ D/ }& T7 l- ^) s
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 c  C! u0 }! |, U8 Q
  // temp = 0x00000F0F;% Y" W2 ?. B' {
  temp = 0x00000B0F;6 A! q$ N* @" o4 W* w
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   @+ n( e1 @0 h" R5 r% p0 _' O) e5 _1 Q" H
  temp = readl(IO_ADDRESS(PCR_ADDR));
$ W4 ]; v3 ?5 f6 o  printk("temp=%x\n",temp);  9 j# a2 c  h, O2 z
   //SRGR Register  }/ U, n6 C0 D  ?# d; B
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* M1 I# _. m& X! W# f% k //temp = 0x301F000B;
% v1 N7 ^7 r3 }- A& m  F; K# P   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized $ _" o# s! L; M2 v$ @
  temp = readl(IO_ADDRESS(SRGR_ADDR));: f5 L" l) t% q0 r- v' H; _
  printk("temp=%x\n",temp);
- ~$ o$ ]% i# x* E) O8 ~; d   //RCR
5 [0 j* s- [* t( P   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- T9 x) C' {. d, H) E' a
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' K* X! _/ a& l2 F! C# W2 S   temp = 0x00440040;
6 Q+ L) p5 l& s% m: M) n2 v   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ! i6 Z- Q8 F2 n5 B2 @' W$ e
   temp = readl(IO_ADDRESS(RCR_ADDR));1 y4 z- p* v  ^- m6 o- K
   printk("temp=%x\n",temp);
/ V% D: a- G% I4 W5 U6 k   //XCR
2 i. m) A7 k6 K) N% K   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-19 h& s$ v9 w, D
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! |+ P7 c& a; U( u% p
   temp = 0x00440040;1 T; Y3 Z; a- P6 C6 J* }
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; {) @0 f6 X1 h6 S" w6 ^( Q
   temp = readl(IO_ADDRESS(XCR_ADDR));" i& U" d) V2 D' I1 x( r+ Y
   printk("temp=%x\n",temp);( d, w8 V: H( X" L
  udelay(100);3 u( ?$ x' ]( ?8 _
  //SPCR Register
( N3 j/ \6 J0 P! _: P& [  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ }' G6 t/ H+ k
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
8 U( u( G5 O# |- m8 M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled' E& W5 S- X+ ^0 I; ^
  temp = readl(IO_ADDRESS(SPCR_ADDR));, C; h# M# ^8 h) o5 t2 p
  printk("temp=%x\n",temp);
$ r; S/ o% X8 d/ w  |& @  udelay(100);
! M, ?2 G- r# S1 F1 s
% n4 E, H: s9 V  //set GPIO direction9 [. ~% I2 B$ q5 o* ]) I  F
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 s. L+ C1 |% I* m" ^0 g1 J
   temp = temp | 0x00000100;//EPR----input5 n5 l9 o/ ]0 r# v6 ^3 I5 _
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
# }+ |5 z3 G6 {% j+ k+ v   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- i- a- ~" I" ^ ! I. y7 \% n2 `4 F$ @0 @
   return 0;! U) M4 v* r, c  i
}. y  W: T; I. T% r: X+ l
static void __exit MCBSP_exit(void)0 w% h" c0 x. A, C# k9 |5 A
{9 _7 m0 Y" ^1 d( Q4 g& F
   printk("mcbsp chrdev exit!\n");1 v& Y8 T1 j0 H# v% q2 K
   cdev_del(mcbsp_cdev);" C2 q( v% ]% `1 h( |7 ^
   unregister_chrdev_region(mcbsp_dev,count);
1 |0 m+ ~. [: n- e   device_destroy(mcbsp_class,mcbsp_dev);
1 L. G+ T$ Q/ B( V( n9 m  N, O: _   class_destroy(mcbsp_class);
$ S9 e, @2 c4 \( O/ f' \}2 O  g' d5 e! Z2 k- A0 K; N) x3 f: {
module_init(MCBSP_init);3 [+ i- b/ c( [1 b9 n3 G
module_exit(MCBSP_exit);
' o$ m" Q: z3 G# f4 U% v0 M) k2 E; N/ W. ?( v, U! ?. K& t( ?* s& D0 U
MODULE_LICENSE("GPL");- o) V' D1 Q: Y/ v3 V$ Z8 j+ Y
( z- t2 a/ H+ v1 h  p
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' N4 ^! s' i  f) e我的应用层的测试程序如下: l: R; W( D2 [
#include <stdio.h>
6 x) s2 w1 Q* b1 |: [#include <string.h># o& l4 w- L' b( h
#include <fcntl.h>5 ]/ O+ F9 s  k  D
#include <unistd.h>; n" P1 r1 ~  c$ r8 a: S3 e& L) B
#include <signal.h>1 n+ F" Y! v5 m, y
#include <pthread.h>       //线程; M# [. L* f/ P) W5 P6 M5 Z5 q
#include <stdlib.h>! Q  M& M& \5 Q- Z& z2 K6 m
#include <pcap.h>          //捕获网口数据
: C/ d- y2 a; k. K* u8 m8 P% p# N; h#include <semaphore.h>     //信号
9 x: k# _( b2 y3 ?4 L#include <sys/types.h>     //消息对列
# @/ _5 s4 N6 R; k$ t' s#include <sys/ipc.h>       //消息队列# _! G# S+ P  s* z4 H# _$ W! @$ T
#include <sys/msg.h>       //消息队列$ u6 }9 y, x8 S- h! x
#include <sys/select.h>" S6 _' Z" C* q. u* _3 X
#include <sys/syscall.h>8 n; M8 P7 P) M. ^  F+ G
#include <sys/stat.h>; j9 T3 \4 o& Q0 p) P
#include <sys/mman.h>
0 O9 Z& x, R! B#define msleep(x) usleep(1000*x)& w  y+ G1 K% V9 e3 d' Q" Y

2 k0 @; w6 l& ~! F( O, G4 I, qint main()
+ Z" Y8 D( ]9 I$ T{
0 {& u! T4 r+ O( V$ n    //MCBSP,ARM与AMBE2000交互设备. e# F7 O0 D! F2 u1 G
int fd;( g7 N+ R' C! r  _
unsigned short data_write = 0x5555;
' @, C$ E$ f6 C7 r unsigned short data_read = 0x00;
1 g; F! P4 Z! e/ \+ E9 n# L  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; x- d0 l& u* Z3 q& q
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 Y1 w4 H- X3 C8 H2 n& o4 F! e+ U
   
/ H  o' E- }5 W( U2 `5 X& y! G% E' `  if(fd < 0)
) W- ?3 V  t% E! P% A) g# O( V! _6 z  {; O& E0 }6 Z) z  N0 I
     perror("open failed\n");
. o$ C( j3 J4 n     return -1;- Y( F9 m7 n- `( d. h
  }
+ V  l2 Y$ O/ c  N0 c# [- E/ p  
: e1 y& k2 }' K8 j* l0 P  while(1)
1 f8 A8 h8 \8 T3 a% O' W# U  {! L8 }! I( ^- d- ?
   0 s/ }: I# w8 l4 f
   //AMBE2000每次读写是24个字为一帧
  f; ]7 b, o" y2 e7 T   //写数据时将数据在底层存储起来,等到中断的时候再发送7 h% y/ U9 Q* l* V9 P5 L- I' @
   //AMBE2000输入数据是以0x13EC开头的1 d( H8 J- o" F& v, s. S- s
   write(fd,&data_write,sizeof(unsigned short));
" j( d0 q5 N, s2 t/ z4 J6 j   # y. u- L7 V7 U4 Q0 ^2 X' S) B
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( Q+ ]. k, E0 O  ~3 o$ b
   read(fd,&data_read,sizeof(unsigned short));1 g8 M5 P; w7 L. F  k
   
4 l' Z: o! R4 i) _   if(data_read == 0x13Ec)
2 U5 e* O/ A- b7 n' u( L, q   {- r+ P6 g6 z( L; R: z
   
6 W9 @0 `5 L9 P    printf("data_read = %x\n",data_read);. ^7 u( q5 s3 G8 [
   }
! @' X" P* _1 {" S   . O5 l3 ]; T, N  W8 p
   msleep(10);
7 s3 F: h" A) J! i: k  ! B" S! b. c& s; ^/ |; o3 r
  /*
5 }8 S8 G- Y5 W/ h5 Z9 ?8 l1 D   ioctl(fd,1);   2 v/ Y. n/ {2 B/ C# ?6 L7 W
sleep(1);
  s1 I' h# I0 w ioctl(fd,0);. o' C& N; ?' V- i; q2 L* S% Y
sleep(1);, P' }6 \/ y2 \9 I8 M
*/
' p- m! N, j+ S1 P0 T9 }  }   
2 w4 q- l5 I' M( n" `0 x* o return 0;' T) q: t7 C. g$ _* f

4 G/ j% t, B: p( K$ A$ {: y& s}( v+ a: h3 U* e$ k9 N$ ~# ?8 V" y

2 m& Y  b; s6 a8 l多谢各位指教,谢谢! 急
  o8 v/ l+ V( e4 L# F9 T1 X. y' _. V- r
. ^3 o& [" H0 L" o

0 [- c/ M' j. e+ k
, d0 a& g% \/ [3 x; N( P
  K' x/ v$ l$ N( e




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4