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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! F" s8 H, P+ R3 ?/*) w7 w. E; M5 C7 H0 S: r. e
* Copyright (C) 2009 Texas Instruments Inc# O# {: ^5 J5 t/ L0 X& R
*" w4 `4 }# M  I2 |, X; Q
* This program is free software; you can redistribute it and/or modify& e5 R, E! z% D# ~% c' {
* it under the terms of the GNU General Public License as published by
: l) p( l; y$ ]. \# W& g3 K' D * the Free Software Foundation; either version 2 of the License, or$ E# U& r3 ]8 y/ Q' a; T3 s5 @
* (at your option)any later version.& K) F! Q; W, g* g* Z
*! w; _- t" D6 P: d; D# f' g
* This program is distributed in the hope that it will be useful,
* L1 E* X, X' E- Y& e9 a$ |) k * but WITHOUT ANY WARRANTY; without even the implied warranty of
; S" v4 q8 N; }) { * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% ]2 [4 u: u7 ~1 }0 m" \) p * GNU General Public License for more details.5 Z% N2 d& Y1 b6 u$ y
*
4 B/ h  P8 l5 R6 |4 o# T * You should have received a copy of the GNU General Public License5 s. T, M+ ]6 N& {5 k
* along with this program; if not, write to the Free Software1 f; b1 w% h0 l& |$ V9 p
* Foundati
: {2 u( ~* ^% V# V# r*/
- k6 m) ~9 E! [7 D; f#include <linux/module.h>
; g7 x  N* _: O#include <linux/init.h>
( T7 s8 \* a! d$ j* H0 U8 v#include <linux/errno.h>
( g( P# O2 H% _/ H#include <linux/types.h>
( \( z$ m) Z0 V- k, h+ O#include <linux/interrupt.h>
: O# L! q! n# W  y( }#include <linux/io.h>2 n+ k) T" n! r; G, i; A2 r' t
#include <linux/sysctl.h>& J' d" q" q( Q. j& T
#include <linux/mm.h>
6 @, ~3 l7 o( v# p3 n#include <linux/delay.h>
" m( q; q1 V5 x4 d3 @#include<linux/kernel.h>9 c9 V/ [2 x+ _' E1 G
#include<linux/fs.h>
1 b1 m' G9 a. ]- w! u8 Y- w#include<linux/ioctl.h>
$ U, ]! a) ~8 x. [; d5 n8 I5 S8 Q#include<linux/cdev.h>
; R) G) C$ d' w3 i- Z# q#include<linux/kdev_t.h>9 `6 ?. \( R! q* `
#include<linux/gpio.h>* j, n3 h) g0 C) b; C! w/ ?4 }
#include <mach/hardware.h>
1 q$ c" ?; L  N, s, \& r#include <mach/irqs.h>0 v, n! K8 L* \2 t7 E' X
: d1 _0 `' {; v6 N
#include <asm/mach-types.h>
& G7 M2 Q1 ?" B" |" z) w- s: _#include <asm/mach/arch.h>
4 O* e. ?# r- z0 X4 A+ ^#include <mach/da8xx.h>
6 f+ m" p; j  j; x#define  SYSCFG_BASE   0x01c14000# M+ ?9 q( Q. ~* Q: I0 Z# l* U' Y
#define  PINMUX1_OFFSET   0x124 - o) Q6 h5 g( ~4 x4 |; V7 y1 c
#define  PINMUX18_OFFSET  0x168
$ w0 ]& A  q  H+ a$ D6 b2 b#define  PINMUX19_OFFSET  0x16c
+ e7 e. v7 [, }#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
) K. U- N7 E4 s% D# C6 _# C#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
. _  e0 q1 {  l  t$ T#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% p; M2 A3 o, a#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
; K3 ^5 T# H" E& I4 p* l+ u$ ?#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
. [; `8 h3 Y7 O( E5 H6 K                           
% M  \4 O3 }3 R' F#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 p2 @3 f" q2 M# ^* _1 h#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
. X* b. f  z6 i5 M  M8 Z//PSC! ~7 n# \/ [& w! H* s- B
#define  PTCMD_ADDR   0x01E27120  4 `+ ], Q" q* i, x
#define  MDCTL15_ADDR 0x01E27A3C7 i8 A7 ], ~+ I6 O' A( G1 U' l9 z
#define  PDCTL1_ADDR  0x01E273040 u( W  s: X1 n% N" n7 H
//GPIO8 direction9 j; f. c4 H5 P" c: s" S+ l/ v
#define GPIO8_DIRECT  0x01E260B0
! P* j, t+ w, y7 x5 h7 T% \#define GPIO8_OUT     0x01E260B4: B' R) p0 u! r3 a; v0 Q
#define GPIO8_IN     0x01E260C07 Q) R/ y) k% o, r( R7 c" ^
# e4 u6 l2 W7 r
//#define MCBSP1_RINT    99              
1 x0 X1 R  r; ]4 ^//#define MCBSP1_XINT    100  ; P: P: t# U3 |1 e7 C* j
static int MCBSP_MAJOR=239;
1 k, l4 S, P- B6 k8 ~4 G& Istatic int MCBSP_MINOR=0;+ ]" |, R3 M, `
static int count =1;
- \5 @/ z' n( c9 ~6 L+ D
6 J" u  H  X# {! x  k* w- N- C# c#define MCBSP_NAME  "MCBSP-device"8 V- c5 P" ^+ R0 ~1 x5 H9 i

1 I, P2 t7 |' j, \4 Pstatic struct cdev *mcbsp_cdev;
! F1 ^- t) Q$ `/ qstatic struct class *mcbsp_class;
2 e3 i; z/ }' n; J) I, c0 a& ystatic dev_t mcbsp_dev;+ A' d# E- ?# n+ D4 V
unsigned int DRR_data;
5 N! E7 J- S0 [4 Z/ Junsigned int DXR_data;4 D! k" O" l- O+ L: z
static int mcbsp_open(struct inode *inode,struct file *file)
0 S$ G! y  d, z4 A  B0 c% X% c{
- k, k% w3 x8 ~! z. o3 |$ _   
5 b: g1 `4 M% W% W   //interrupt enable,initialized0 c) |8 G( W- t! k- ?2 B/ c
   unsigned int temp;& c6 ], {" l% [; Y, ]! k
   //SLEEP_EN(GPIO8[10])---0
- A% n' L, T4 B8 F   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 O* |2 X, J% ^6 T" ^7 q" J( J  ~   temp=temp&(~0x00000400);
% p$ k8 B1 q; F9 ?* M   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 _7 S8 j7 H$ f( ?: ~9 Y. b
  //RESETn(GPIO8[8])----0----1
0 Z# x! U- [, x  H* y7 a   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' o$ w  B, S7 [: q/ w
   temp=temp&(~0x00000100);) t: E& D: s& A
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 V, c& r* t/ O" l2 _, K   udelay(100);4 P( d* K7 N) D: y3 }9 ^
   temp=temp| 0x00000100;
7 q6 i. s  b' V   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  g1 @- t* `9 p! g* f9 {% h' }   udelay(100);; O3 @( A6 g, W; G6 I+ W
   printk("open success!\n");' r! t4 v$ Y/ V4 b# Q% w# m& }
   return 0;
+ Z. z8 [+ D3 C( t! T}
  @( h2 e- k; |+ a* Y$ P
& l8 |5 P0 H8 C/ X) l1 Gstatic int mcbsp_release(struct inode *inode,struct file *file)
# a7 L' l2 A6 x$ [1 N" p{
9 M. z& K" b5 Q( `3 F- c# R( t1 B, ~2 t   printk("release success!\n");
  _0 u1 q& p9 q0 A6 Z# W. D   return 0;  |& j& g$ _0 E( U( [9 ~+ E0 K( i
}. @4 D0 R& B" x
- b7 D2 w2 a+ o# O+ H$ n  l
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' {) g; s  p! D5 O4 S
{; s% b  a! z( ?) A( F0 G4 o
    copy_from_user(&DXR_data,buf,len);
3 A$ c$ a  T5 d4 f+ M) c& A! A4 G    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
9 |  d3 p; O' W% Q* r2 z  I    return 0;
$ z5 y! `8 h+ ]9 x. Z. q2 G$ R
, {/ P! }$ V* N0 A7 V9 A5 S6 V3 H}
3 B: e5 }5 q7 c3 h) Y  U! F6 }  \& R6 u* G
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ J$ Q9 Q& V1 |8 Y
{
/ f( o2 c, M  t: m, P/ Q   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ p( e. v2 ^3 s
   copy_to_user(buf,&DRR_data,len);
( {, q* P; i( e: v2 x   return 0;
: f: |) Y3 }3 v0 R}
. s' ]' J8 m. r7 @7 ]
; g; y2 L2 R/ u8 J, K) ]# F5 E' X) `% O% t. j. G; Z
static struct  file_operations mcbsp_fops=
1 G' Q* d. Z2 r) {{+ q" _8 k) l& b
   .owner=THIS_MODULE,1 ?0 r- a# [6 S$ B8 M% K" M
   .open=mcbsp_open,7 I* S5 K* |6 f- g5 T; h7 l5 k
   .release=mcbsp_release,  r( l, c  H3 I3 \* v4 z
   .write=mcbsp_write,4 A0 d: ^6 ?' {
   .read=mcbsp_read,
! M& s8 }+ V8 o};
# D) O$ X  ?( R, m8 @static int __init MCBSP_init(void): F- T* R0 v$ E: H1 I9 y" h
{6 u! ~7 n9 Z2 h1 B) _# A& n
   int ret;
) V' D7 y: `% z, c5 g% G& ?9 i- T: u   unsigned  int   PINMUX1_REG_old;
! W7 F2 v& P; I. @# c6 Y8 G   unsigned  int   PINMUX18_REG_old;
4 a' q4 c, X) q/ i1 R   unsigned  int   PINMUX19_REG_old;; R  P5 ~# ]; Z2 y+ O( ?4 A
   unsigned  int   temp;  $ [9 y0 J4 K, n1 v
   if(MCBSP_MAJOR)
! I: u5 h, c7 g. F  _9 X5 B' Q3 h: X2 L   {. G0 D' G- J: E$ Q" f( v: {6 v2 Q
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ Z7 x" R# L; B. m5 [+ O4 _5 Q3 Q      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# P/ O) L# O7 i   }6 [) Q& \9 r% A3 I9 _0 i
   else+ j* |. |+ F4 `( n& [) y3 `
   {
7 p1 C, H2 P& ]0 d% R      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ ^5 k9 Z& D% M7 W3 J
      MCBSP_MAJOR=MAJOR(mcbsp_dev);! \* {4 w$ ?; F
   }- S  y2 i2 x+ b. M+ }* U5 q
   & ^7 U/ W8 J# [, c; |2 E
   if(ret<0)7 `% U) w/ p7 V! }! d( _
   {
4 \- b/ |5 i5 o# W2 k- C      printk(KERN_ERR "register chrdev fail!");4 x/ ]8 a* Y! l
      return -1;" W* b7 t* j3 v5 a  f3 E
   }
) c& P8 v+ |% j$ x+ F$ L   
, E- E! o9 J6 @5 m   mcbsp_cdev=cdev_alloc();5 U7 Z, ^& `" m% {8 f
   
  f4 O+ x; }! i9 F2 n* Z5 d   if(mcbsp_cdev!=NULL)5 d+ A- V" K" K* |
   {; D& S$ [" E( N2 [/ a2 \$ ]
      cdev_init(mcbsp_cdev,&mcbsp_fops);
" A6 z8 W$ j6 t      mcbsp_cdev->ops=&mcbsp_fops;
1 `; V" |/ i" S3 I/ \$ {" S      mcbsp_cdev->owner=THIS_MODULE;
8 E1 }6 F3 o9 A% E( S      " `/ t- W. p& j! R9 r- ^8 I
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; j  V* H& A+ e0 y% z1 Q' p          printk(KERN_ERR "register cdev fail!");1 v6 |' |2 i/ m7 ^, ]' w2 l
      else
# I: c8 S+ S- c          printk(KERN_ERR "register success!\n");1 e2 e) q2 }% I0 a( o7 ?
   }4 s6 D) ~$ `9 @# C0 w
   else, X/ W5 m* h9 f
   {
9 j7 j3 k, B: Y1 L  b0 i      printk(KERN_ERR "register cdev err!");
, h+ H! X! d+ Z9 `      return -1;
5 v, w/ M8 d/ P! l0 Z   }
1 e. d" H9 E4 M6 \0 T* P- b/ d' z   5 I8 r2 }! ?1 o
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 ]# e$ R. j( `. K6 v, H3 c- ^
   if(IS_ERR(mcbsp_class))
5 {4 _$ O5 [9 o2 }; v   {
* \, ^8 C" l- ]- [7 x      printk(KERN_ERR "register class err!");  o. |0 O1 k8 A1 m& M( _; ^7 {
   return -1;
* p7 ?" {/ n) y( [9 Z   }
, g% f$ _  A: A1 P! Z  H0 s, p, Q0 r$ p   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. V% h( H" @: s4 z0 t

- R% ?2 _8 i- _- L! ]5 _5 F. C   //PSC
) b) i5 w" ?3 R) s$ j5 s   //add Enable MCBSP
7 |0 x1 \; D  M% o5 X   //test( E$ k  l5 Y7 r! B( E  O; @
   temp = 0x80000003;
: V: A* z8 U! M% `$ A" c9 o6 V* t3 C   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 [" _2 H  _5 z' D
   temp = 0x00000003;
$ y9 V* M8 |+ J+ J4 F* r; [   writel(temp, IO_ADDRESS(PTCMD_ADDR));$ K6 ?3 b/ x% N# x# N5 Q
" e4 T7 H; x: A6 e, G( X+ r  j
   temp = 0x001FF201;# Z9 G" u8 f4 s$ e
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));8 q6 `/ P0 q" S1 D  S
   : X! R2 |: |) r- \/ b9 K
   //PINMUX  
! H9 s9 ]* k% F5 Y! D1 F" |# |   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ O) v/ ]  h, ]2 ?" p' B' p   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  7 Z2 B0 a8 _4 M# r9 _
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   " _5 C7 B4 p7 ?$ K9 J9 a$ e
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  k- g% z0 P  o) r" f   
3 O3 z7 U( l& h1 g( K   //SLEEP_EN,EPR,L138_SHK1,L138_RC: J  e) Y& s& D% q: f/ ?& H9 D
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ( N$ [- Z; K+ j
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
3 x8 W1 E; n* N* T8 N2 C. q   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 C  E% i# F0 k! R( k

' U  x  y& i& A+ d   //RESETn,L138_SHK2
" l. R7 n5 }9 f: v  m5 W, x   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
% N6 f6 k" g) u4 E% a1 V   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 q, L# m, B4 V2 M2 R   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 S  j/ \1 [$ ?( b* I3 N- m' ?) h( |

1 @7 v5 H9 Q% u, a% U* t * \% z4 ^5 w% y& W5 c: g
  //SPCR Register
4 H. P. A# E: F- E+ a( t  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  L) w' B4 s. s. z  temp = 0x03000000;//(DLB=0)
2 \4 s0 ^* q9 H // temp = 0x03008000;//(DLB=1)0 M: r( X; h7 G2 A4 H
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
: x, y' J& a2 l4 O; R/ A* M( Q5 w  temp = readl(IO_ADDRESS(SPCR_ADDR));/ s' e0 _: M. r0 M2 v, G  H
  printk("temp=%x\n",temp);
, n& N0 O; M! i" j2 `4 \2 r7 w
; Q  h5 l9 R/ w5 b6 y4 L( j   //PCR Register. t; k% ~" t- V! |- u0 [6 p+ l
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  Y' e3 C$ h, E
  // temp = 0x00000F0F;
: Y) B: w1 C) W4 f" W' w# F  S  n  temp = 0x00000B0F;$ G2 Q8 U. ^( \7 r) k
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 0 ]( B. n8 d- A/ ~
  temp = readl(IO_ADDRESS(PCR_ADDR));
. \, {' u, p6 K  d  printk("temp=%x\n",temp);  1 e1 u5 ]0 S7 g% W- Y7 ~6 q0 v
   //SRGR Register3 ]7 B% {+ V- H; ]% w! c" E, R
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# {1 N! ~$ J4 X6 q' f: w5 Z
//temp = 0x301F000B;  o4 a: P2 |  N$ X! `3 g8 R
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 i7 ]0 U0 [7 k+ P; J
  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 h. n. r; Y& s5 m! E" ]  printk("temp=%x\n",temp);
7 i: i! S* o. J7 v  I" a   //RCR
& E& C% _) ]1 B1 c) f" A   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: }1 ^# I3 e. a3 w7 u: G   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 i" j4 z; G- x. q- d
   temp = 0x00440040;
. h5 v4 w; `5 T& g2 ~+ f6 p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
5 m6 Y  C# M4 D( z9 t2 W   temp = readl(IO_ADDRESS(RCR_ADDR));
! _( A9 w8 F7 a# M) w5 z   printk("temp=%x\n",temp);
) m# Z/ ]6 c  S   //XCR
0 C/ G- q, ^$ x* T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! H* f% d# f0 ]. I0 C1 H2 [* N2 R   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 x; P1 _( r- v- U   temp = 0x00440040;6 }3 s' M! Z( O7 i
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
4 L) v5 C, ^! [" v; T   temp = readl(IO_ADDRESS(XCR_ADDR));
/ F% V* T2 K4 t# V+ C: N* V% G   printk("temp=%x\n",temp);/ a& O8 }2 h$ {2 Z8 X
  udelay(100);7 E4 l  q) A9 H& H& |6 _
  //SPCR Register. o  Z  ?, S( I9 C1 z
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1  K: i: q" a8 y/ \
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1- q5 i" W, e- K+ C4 c8 i
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled% f* X% k1 D* K! `: ^# L
  temp = readl(IO_ADDRESS(SPCR_ADDR));$ H7 M% I* @: _, p& m) ]
  printk("temp=%x\n",temp);
2 B% Q+ `2 R: V! l: ~  }+ Q. T  udelay(100);
9 Q: ?' m: R9 U4 A* J' j
0 R, k5 B: R$ \4 [$ N  //set GPIO direction
7 I( Y* g+ {2 O1 m. u   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% ~4 ~8 f, |( H5 K
   temp = temp | 0x00000100;//EPR----input5 I+ ?$ A8 G& w" e7 T& a2 O
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) J( i( z( d3 q. M0 ?% v
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 ~+ |9 q" S: B& V  m2 n

, Y+ j: v8 u! D! D  u& ^1 F& V% w   return 0;2 M8 u9 y# @. ^4 Y
}$ O1 r+ S. J% D& i1 f
static void __exit MCBSP_exit(void)* a* A/ C& u8 J' }% q+ @4 L& i
{
- N0 X8 z& E5 ?" g0 T   printk("mcbsp chrdev exit!\n");# P% y, f6 q  K  h4 R
   cdev_del(mcbsp_cdev);" S/ ^  A9 a8 R
   unregister_chrdev_region(mcbsp_dev,count);4 o% L; k. n7 T
   device_destroy(mcbsp_class,mcbsp_dev);) z" u, R2 y4 |6 D! n3 V
   class_destroy(mcbsp_class);
- B2 H. m9 J8 y2 b2 [}
: I4 {( @$ ^/ Q# E$ Vmodule_init(MCBSP_init);. b% U& T! X% ]2 G) j
module_exit(MCBSP_exit);
# T1 M$ ^6 V  g1 J* n
  b  K6 @: J" ~9 cMODULE_LICENSE("GPL");
; H5 U6 L" ~0 \8 y. J4 `7 o( y, k" o
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。: `6 L, U( f" j/ ~  T  _
我的应用层的测试程序如下
8 V& Y  X" Q  R- z( a* L# ~#include <stdio.h>
4 I% J0 ?9 P& R0 e4 G6 w#include <string.h>' A% [3 g& m; L- s+ v
#include <fcntl.h>
% R3 f) w& \1 r- o/ D5 p5 b* J#include <unistd.h>6 H5 H( j7 y" f# X
#include <signal.h>( d6 Z! ]1 k& M4 L
#include <pthread.h>       //线程
2 e  R4 O% W: K$ n9 ]#include <stdlib.h>
0 N/ z2 ~  y- d) Z- f  G2 H6 g#include <pcap.h>          //捕获网口数据
" B6 H1 ]9 D3 m5 j#include <semaphore.h>     //信号
0 X4 M6 ]3 O4 v* d+ g#include <sys/types.h>     //消息对列! m* K. i; v- ~! G# e
#include <sys/ipc.h>       //消息队列# y& Z8 I. d. w- `, G* i; o
#include <sys/msg.h>       //消息队列' y0 R9 Q" O% s
#include <sys/select.h>; k" f+ ?( A2 E4 f9 Y
#include <sys/syscall.h>
2 p; F6 f2 Q& N9 S. B5 Y#include <sys/stat.h>
' f9 b* {1 v& v( a0 r, }8 N#include <sys/mman.h>0 {% d. ~2 Z  b% m4 @1 w2 ~
#define msleep(x) usleep(1000*x)
# d! Q( y$ q8 b, j4 d) {8 d! B& x  E) T. Z9 \$ _
int main()
$ y( y& j; X& e{   Z( z1 z* t+ p3 a: L- T
    //MCBSP,ARM与AMBE2000交互设备
+ h$ O$ B# O! d3 v int fd;
  T0 p5 K9 _# @2 w' t unsigned short data_write = 0x5555;/ k4 W" ~9 R& d: o; H/ ^
unsigned short data_read = 0x00;& E8 |) }0 E4 o
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 o; O0 @% O6 C: ^) y3 W+ X* f7 M
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ m+ x  P% x0 K4 I# G   
! {8 P$ {  g* x  if(fd < 0)! }( _, g! H) M0 T% F" }( R' k
  {7 E' k8 W3 ^2 L, b0 q9 o" X# ~: K
     perror("open failed\n");4 e% k( F. g" \2 |8 b& S9 j
     return -1;
' x# v% \( s6 }6 c- j  }( f2 L9 h/ ]; f* {: q
  2 D4 z, Q9 ]) o1 i4 l: N6 M, o
  while(1)# K2 `8 z$ M. t, O( b
  {. p+ q" k$ n* J% S" j8 U8 Q
   
- W; t- g! A2 E. \* v$ Z: U   //AMBE2000每次读写是24个字为一帧
8 Q# N8 ~! c: }  W1 @   //写数据时将数据在底层存储起来,等到中断的时候再发送
% N4 e6 w: h$ W   //AMBE2000输入数据是以0x13EC开头的9 c2 w4 N- ^$ [" P2 E$ q2 R- R
   write(fd,&data_write,sizeof(unsigned short));2 l% {8 o5 Z& l! @8 p
   ! y+ _; |) b; o7 U7 J* ~; X
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
( {  g. h0 }6 j1 ]  J. A7 d   read(fd,&data_read,sizeof(unsigned short));6 D) L- A; C" p
   ; M. L$ z" }5 E3 v* A1 H$ C3 Y
   if(data_read == 0x13Ec)
, u. F* k' o4 t) L9 d/ s   {$ a$ ~! C. ?: G" j  a) m0 P% I
   1 D  `2 }6 H( P7 `+ L! w! b1 V
    printf("data_read = %x\n",data_read);2 o/ f' t& Y8 p
   }) K0 [" a* I  K( o- Y' a
   
* X. M& g& F, M   msleep(10);
9 d2 ]; v1 k1 O  , c% u. j5 n1 V9 |% a: ~1 s
  /*
1 B7 O( t7 P/ d* ~) w, `   ioctl(fd,1);   - u8 ]7 z6 g8 g# ~! E
sleep(1);1 g. ^3 S6 @. L5 O0 h$ |( \) C( q/ f
ioctl(fd,0);
; f7 F# s+ v+ Q' z sleep(1);/ H' W: _6 J) a3 S
*/ % m, H& L' d5 N  R; w# }7 J" U4 j
  }   
+ ~4 n' w  ]) [- V& u# z. R, J& l return 0;
/ W5 \; q/ g; U. W* M+ h$ T% T3 C . |* \- t" e- S7 @9 \
}
7 Q. j# f5 ^' i. n7 X  ~* o9 K% e0 K' f( \
多谢各位指教,谢谢! 急
% E* C3 y8 ]$ A- h) H# P
; L6 S4 F! h+ T; M3 y
/ Q6 Y; K: t- x% {9 C
4 G$ R1 o4 _) _4 t
( H2 A; d; x  s2 u/ H, w! Q3 o8 x$ [9 c. \0 a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 13:26 , Processed in 0.042633 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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