McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% l* ?) _3 }7 ~5 h; k5 _5 D/*
0 E- {# w3 N$ s: X' f * Copyright (C) 2009 Texas Instruments Inc' A( U  c5 \% v7 v
*. p: C$ b" A; O" l
* This program is free software; you can redistribute it and/or modify
# K  p# \$ ^9 a# r  K. I7 t! R  C * it under the terms of the GNU General Public License as published by
* C) l# z7 y# f% i; T * the Free Software Foundation; either version 2 of the License, or
) Q- o4 T- A, s * (at your option)any later version.4 b4 u7 |2 K( }! N% i
*; U( R) x# t" o5 a) L/ L
* This program is distributed in the hope that it will be useful,' ?! G. H& Z( n+ j* ~+ ]
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 m  u4 ?# B* o% O4 B8 P# b; } * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the) M$ O6 `5 S- o1 }1 n' E8 ~
* GNU General Public License for more details.3 S* ^1 D* a- M8 N. ?% _
*- h  W- z4 q! U
* You should have received a copy of the GNU General Public License
7 v- d+ w6 A6 X$ n& U6 T * along with this program; if not, write to the Free Software# p: X" N% \2 e9 w+ `1 W. [
* Foundati1 j! H. t  F# a$ z$ [9 }+ `2 d
*/7 k  G  `) _- [3 Z9 f& y+ z
#include <linux/module.h>" \& |. y5 C. V; b% s9 F
#include <linux/init.h>5 f& ?5 o: a. O9 _- Q: E
#include <linux/errno.h>
& r, k' `0 ~2 y/ o* D#include <linux/types.h>0 m# z8 s3 a) t  y% |6 R/ l3 e
#include <linux/interrupt.h>3 u5 I, t5 N% p, l! \/ K! b! M
#include <linux/io.h>; k: F- L5 j- a8 t5 n
#include <linux/sysctl.h>' F  e/ i! M6 @' t) j
#include <linux/mm.h>
5 m* p$ `  f4 N. z% ?#include <linux/delay.h>$ `2 B+ n# h! X: U( I
#include<linux/kernel.h>
$ P: x9 d5 E# e/ ~9 S#include<linux/fs.h>
+ L% X& |- q; [8 q0 B# n1 O#include<linux/ioctl.h>; k6 u; \- a6 ~8 B+ w
#include<linux/cdev.h>
8 Q. N7 Z0 W8 @  J5 v#include<linux/kdev_t.h>, r# m/ ^7 L. F: B  w1 ]& l: [
#include<linux/gpio.h>6 P# R$ |' x/ r& d
#include <mach/hardware.h>8 ^) l" z" t) g. A: O) Q
#include <mach/irqs.h>$ m* R% I% _, Y, O6 V
9 n  W  p9 j+ H, M9 O  C
#include <asm/mach-types.h>
1 v" [% l* V3 \0 o5 e! ^#include <asm/mach/arch.h>6 Q4 s9 q$ O0 c5 s0 {/ ]
#include <mach/da8xx.h>
6 r$ A" S; v% C! }4 w* f; ?) ]#define  SYSCFG_BASE   0x01c14000
) Q4 S2 z- l0 _# v3 ~, u#define  PINMUX1_OFFSET   0x124
! F- k* g- z1 [0 O4 W; b% G' p#define  PINMUX18_OFFSET  0x168
' G' @- A8 L9 g6 M+ L7 V6 j#define  PINMUX19_OFFSET  0x16c
# }1 v  b3 d% X( I: l, o#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR- x/ B8 x; b. {7 H! q- f: ~
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
  N8 V( E. o! K; d& M% K% I#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR& [) y; k. Q3 }) ~# m
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
  A6 ]! [* t* h5 x( D; J8 h( s. p. b#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR6 ?0 J4 @0 \! Y% [& h* B
                           
1 G" s+ S" P) ?+ ?. Y#define DXR_ADDR      0x01D11004  //MCBSP1_DXR( J: q9 H( T: N+ X$ W) @/ a9 H
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR- W- a0 v! e6 w* Z6 ?, r& |: b
//PSC
) @1 [) Z' V- Z& p4 q% T4 e#define  PTCMD_ADDR   0x01E27120  ; `; a( L  R; I" K. Z
#define  MDCTL15_ADDR 0x01E27A3C* T- V4 Y2 R$ u
#define  PDCTL1_ADDR  0x01E27304
- K5 h$ O+ ~- x  [  Z//GPIO8 direction) c. K5 r1 Q7 b: K' r  C
#define GPIO8_DIRECT  0x01E260B0
  {1 p2 E1 I: ^& s% S, P#define GPIO8_OUT     0x01E260B4
9 D* O# M8 l0 e) E- I. O#define GPIO8_IN     0x01E260C0
- D" V  u' m/ @2 q  w* u  a& Y) S+ z4 f
//#define MCBSP1_RINT    99              
  k6 t! q" l% [//#define MCBSP1_XINT    100  ' Q& s/ e4 D! x4 J$ ?
static int MCBSP_MAJOR=239;
/ k( y( J( T0 g3 F6 q' Qstatic int MCBSP_MINOR=0;
$ f/ N5 O3 @% a* fstatic int count =1;
& ]5 v+ {/ ?" _( v; ^4 j* R- {6 R" ?: S, s
#define MCBSP_NAME  "MCBSP-device"
0 m7 }, s+ \% G$ `
8 ~. l4 s# F2 d: e3 F+ f0 Istatic struct cdev *mcbsp_cdev;
8 N( [' L2 [2 Ostatic struct class *mcbsp_class;
* T4 G8 h( G6 @' m% O+ |; j/ s. xstatic dev_t mcbsp_dev;% a5 A' A+ O/ i1 K6 d- s- j
unsigned int DRR_data;
5 N* d& P* r: Z2 c; uunsigned int DXR_data;3 e3 I, V9 g2 A4 d
static int mcbsp_open(struct inode *inode,struct file *file)' E5 q6 Q+ o, o! p& I$ [- |
{1 f3 Q# m7 }8 m: F4 u; `( r9 m
   3 {; I' B# j8 `
   //interrupt enable,initialized
8 A# m- ?( ]3 Q+ p: o0 i   unsigned int temp;
: I+ z( m* M" j3 z. L6 V9 t2 O# ]   //SLEEP_EN(GPIO8[10])---0
- y: s4 B+ b; U6 z8 i5 |+ a8 ]   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. G4 u# R* x: D. s  n
   temp=temp&(~0x00000400);
4 @$ }% s& a) I1 q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" d( X, ?" K& `& J  //RESETn(GPIO8[8])----0----1
, B" [" u9 s# ^+ y& |   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* r3 Q" g. k4 |( T9 @
   temp=temp&(~0x00000100);
6 v4 g: k' c, O+ J& ^9 ]* L: B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 @6 Q$ J/ n* v, A3 [" l- B   udelay(100);
3 o6 }- |5 |# i- P4 \0 r4 m   temp=temp| 0x00000100;
6 N+ }5 y; H) _   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 u; J. a+ l/ f7 q   udelay(100);& y$ m! y9 z$ P/ j: r. \
   printk("open success!\n");
, _  H* y+ s. p) B% R# I; r   return 0;
* x: q3 I) ^! R1 T" c: m$ U4 F4 s7 s}
  |+ R/ ]* N0 B4 c% H8 e8 t% G3 @
; R' H2 f4 j! T" Ostatic int mcbsp_release(struct inode *inode,struct file *file), U. d$ G! }' ^8 i
{( o( c2 Z* \- S0 w
   printk("release success!\n");- t9 U* u8 T8 B
   return 0;
$ b: F- Z9 i- \/ Y. c3 F) @. a}
0 C" G$ ~  U4 W
& t0 }2 `" _5 u5 N0 Sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( b: _5 J5 ~0 w) v* K* ^, E{3 u$ T6 W2 z# N+ X6 p
    copy_from_user(&DXR_data,buf,len);
% c" _' Y6 u" L- |; ]" s' x    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
" E( x/ `3 R$ a, t    return 0;
+ T% i  `9 [7 p5 c
* }# s  K* a4 Z$ V! d}) N% s* V, D$ a( V& L4 Z/ v
7 ^5 @& V2 ?# u4 O1 ~3 q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 |: q6 M9 t- z  d/ S
{ 5 L- Y2 N5 j- {9 p% J
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' ~9 q2 E( X- h2 X: k
   copy_to_user(buf,&DRR_data,len);
; W/ v3 M; A; |: @. |; k/ t$ F   return 0;" k  }! Z& H$ Y. g
}
7 g" L7 o4 E5 b" K* `* N8 o$ Y% K( K+ C. G5 F( K2 }) H" ?

9 k8 ^1 S- P1 L) V+ Ostatic struct  file_operations mcbsp_fops=
. K9 q) r1 Z0 }. k9 j" b$ T; V# W0 F: b{
; V0 U3 i. t$ _2 Q" ^$ P* R/ s) I' X   .owner=THIS_MODULE,
# ]' a- g* V) u4 x   .open=mcbsp_open,
' U) w7 |( {/ a6 g% c' K   .release=mcbsp_release,
, o$ p9 t6 o6 Z4 l  @   .write=mcbsp_write,0 H4 }% m4 y, d% T
   .read=mcbsp_read,
+ ]2 Z" o' \" q5 q};  X$ k1 j+ S6 {! R
static int __init MCBSP_init(void)
! T. e+ I2 B6 T" U{) w; n/ k( R- y& R+ D1 V- d
   int ret;
' x: M* Q' S/ B: z1 Y   unsigned  int   PINMUX1_REG_old;) I, G# t4 C* h
   unsigned  int   PINMUX18_REG_old;
' e* o2 {7 q0 K   unsigned  int   PINMUX19_REG_old;
1 ]( h8 L+ @8 f2 ~( }/ J, C   unsigned  int   temp;  - S9 {3 b. {8 Y5 X
   if(MCBSP_MAJOR)9 N+ m8 ]* s0 v9 F. @8 ]8 k
   {
' Y: v* N* Z; P# k3 B      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 D' p+ L& f( H# ]& g: g- ?4 U# ~      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 Q: e0 @; u+ f+ h! b
   }. B$ \7 |, |  `1 u; A+ }
   else0 R5 |* u0 L2 l8 u0 g& B, k* G! m
   {
6 h1 A) n- ?8 G; \1 L$ \      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 Y' [! M% g% n& |) G, l      MCBSP_MAJOR=MAJOR(mcbsp_dev);; L8 P$ c+ J3 {3 l1 A$ C) f
   }
7 [2 a6 u6 d9 l' e* Q$ k   2 r+ J4 C" \6 h* E6 @  T5 U# `
   if(ret<0)1 H7 P! q: U8 B8 c5 T9 R
   {! ^4 ]# ]) v1 a0 p) _+ W
      printk(KERN_ERR "register chrdev fail!");; r; m, V, w/ L: M
      return -1;, X, O9 e- r6 ?+ W# f8 R8 h3 F9 [
   }
: [9 B: w7 O& ~+ U5 M# O   + v, p: H& x6 F, y. x5 ?8 ~
   mcbsp_cdev=cdev_alloc();
* x$ o" `3 A) _, ~2 ^5 x# D   
* T9 W% n+ U5 r% I( f   if(mcbsp_cdev!=NULL)
# W/ P+ F5 r5 F" Q   {
6 O) H4 c* `: [- _9 e4 b& x9 g      cdev_init(mcbsp_cdev,&mcbsp_fops);) V* s7 r! T1 s/ z4 }
      mcbsp_cdev->ops=&mcbsp_fops;. p* m* x& q" a! Q& M3 J
      mcbsp_cdev->owner=THIS_MODULE;
7 v( D/ l; \7 K3 A+ Q# c      
* D- U( k- y. J8 J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' G+ c0 K* V+ [* G2 o) [# R          printk(KERN_ERR "register cdev fail!");( l" U2 \8 ?& D  i6 f5 f: M: V/ e
      else
/ Z- h7 y0 G/ p          printk(KERN_ERR "register success!\n");
, T) R& j, X4 ]* f- X) d2 f   }
8 B$ v- i9 i! V. _6 v   else
/ {, G( G8 y: g7 k7 K1 h   {
1 g1 }2 e" @7 d/ F8 u( N9 e      printk(KERN_ERR "register cdev err!");
2 h" `5 m8 Q- m0 k3 F      return -1;
( o1 C! z* |1 v$ q5 }   }9 D0 N: e! e  X2 y/ }
   5 d( e* b) V2 j2 w+ [
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 P7 \% H2 o* x3 G
   if(IS_ERR(mcbsp_class))- D- |& k3 d8 A% R
   {  u. g5 A  `3 ~9 k" e
      printk(KERN_ERR "register class err!");3 r$ u8 B# Q5 R4 C: e+ ^+ e
   return -1;, }+ v: Q7 q( }% s  n
   }
7 h  A4 p! x6 D5 V; D   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! S: d6 C0 L7 L$ t

8 E% o9 i% R% y) G# A1 G   //PSC
7 b4 @  ^  }% O( v   //add Enable MCBSP
: Z; b0 [% |. w& a3 P7 \7 n' K! ?* K$ j   //test
: m% ^( [) ^* `& a3 l   temp = 0x80000003;
* u" U9 Z& d7 o: `1 }4 p7 E9 F   writel(temp, IO_ADDRESS(MDCTL15_ADDR));0 M, s" d+ h7 ?# ?. u
   temp = 0x00000003;& }) n- h, C; f6 V- G5 j. c
   writel(temp, IO_ADDRESS(PTCMD_ADDR));  j' j( f1 h- T3 e, A, ]
5 Z3 b6 L, p  \0 [; ?# U
   temp = 0x001FF201;
: @' {) V* y+ f& R1 r. k8 f& ?" u   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- j3 R: B7 u/ h9 w$ M. c' v1 D: D8 n   
) c; u8 t3 T$ O, F4 g% {4 g   //PINMUX  , ]. `) S; F; R2 m$ J
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,4 E; b& d- X+ c) ]( B( y# h7 [
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
# s9 u0 E; x. l   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ' r2 f- ~; D# G3 j# S: y0 k
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 V8 ]/ R# E, U  L# ]
   
7 {7 r. S! p7 `+ Z, b/ D   //SLEEP_EN,EPR,L138_SHK1,L138_RC
% |! c0 r7 |  k   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
8 h2 e7 q1 U5 e' @1 X4 k+ W3 V/ u6 M   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   8 i- g0 E  P  v+ q. P. B/ v- ~* l
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 `' b" U* M% \1 V8 q, d# ?# T& r

! t$ v, Z9 \  s   //RESETn,L138_SHK2% Q" w: \) o) p% b% j/ N
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : [9 Q" v9 B; x9 r$ n
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   7 \9 W" {4 F! E3 P9 t
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ r; l; e# B% A  n# R : M( {" a6 B+ z) q% X8 ]( n, g

" {/ W" {" J$ ?' E  //SPCR Register! p$ J5 w) @$ H# s
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset1 t7 b& r% S/ U& ~3 ]; r0 q& L' ^
  temp = 0x03000000;//(DLB=0)
. r, d% i8 {" S  ? // temp = 0x03008000;//(DLB=1); m2 V" X: ?1 F. L) b
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
+ ?  i6 g; ?( h" u% b0 ~7 a  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ N; W( y! U& H, g2 m  printk("temp=%x\n",temp);
* l$ B5 U. S9 g2 `# T5 j
3 K" e7 p/ v+ v* Y   //PCR Register
1 f7 g5 a) o! ], J5 h   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 z' k! Z7 F1 K( c: o3 u" c  // temp = 0x00000F0F;
. I, Y& c& w  [! x  }0 K  temp = 0x00000B0F;5 ]: a  @. h$ H% H
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ d4 l, e5 @9 Z' Q# v( E4 z+ c+ t5 M
  temp = readl(IO_ADDRESS(PCR_ADDR));
8 h! A8 s6 n  t% U2 v4 m9 ^  printk("temp=%x\n",temp);  2 e+ V4 ~. M% Y$ x6 u% M; }
   //SRGR Register* Y7 q- k7 }( D, {. p( V0 e
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
, Y1 z& N7 [: ]. J( _! D( k //temp = 0x301F000B;
- W3 O# E( u+ q   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 {' G+ I. z# j  temp = readl(IO_ADDRESS(SRGR_ADDR));% |' P( I1 s7 u- a7 _$ g6 V! l2 G+ p
  printk("temp=%x\n",temp);/ E6 {- H4 ^8 i: E& g
   //RCR
3 m+ l5 X) [* n  t   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! A8 C: s* M' Z
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 S$ e/ X9 j' H   temp = 0x00440040;
3 _2 C& d& z5 V, e   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
% l1 X* K! `' ~# M  |- S) @   temp = readl(IO_ADDRESS(RCR_ADDR));
% P, O( Q" U( O) w0 s   printk("temp=%x\n",temp);
# t1 B2 x+ Q1 Y( o" r   //XCR( y$ g% }! h+ p2 ~1 H5 V! _
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ S$ }7 A  @1 x) ]: a2 O
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: l! m( j8 e9 W2 g; J
   temp = 0x00440040;5 z- V% E* B" w& Y. a9 T' x' T0 L
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; D$ `$ D; m  q4 |# Q! x: p
   temp = readl(IO_ADDRESS(XCR_ADDR));
: H' y1 c" R0 u5 g) Y   printk("temp=%x\n",temp);( E7 `/ z, N/ t. e
  udelay(100);& ]) N9 r) U. K- T9 v
  //SPCR Register0 p7 N# ^$ I7 K/ k3 W, o
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* j. C& E  w6 k  temp = 0x03C10001;   //DLB = 0 VS DLB = 16 x; i6 U( Y3 Z) R) q0 n+ @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled) w# l# J* g, N: M
  temp = readl(IO_ADDRESS(SPCR_ADDR));
" ~! b! `4 T5 q+ Z; c  v/ h' v  printk("temp=%x\n",temp);& f! I3 W7 A2 b0 j9 }3 n
  udelay(100);
4 T$ X; q% o& I- t# G1 B/ R  g3 A+ k9 ]3 P8 j7 S' _  i
  //set GPIO direction$ }* F0 Z6 e, D2 s& J, M- [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; {5 D5 V0 E4 O0 Z: f4 a   temp = temp | 0x00000100;//EPR----input7 o  I7 }  T8 n9 E7 u, O, E
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ o' u: Q' V) _8 x* P$ y
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : d  Y  V% s4 t: k
/ q6 h- O; z) K: L
   return 0;. o2 }% B: G) k
}
+ N4 {+ I4 W5 f7 A( Z7 R2 Bstatic void __exit MCBSP_exit(void)
1 w  N5 p) V7 f8 w% g{
2 ~7 Y4 F: s+ a7 N2 i6 D5 W   printk("mcbsp chrdev exit!\n");
0 z+ }7 \2 J$ G0 D, V   cdev_del(mcbsp_cdev);" v8 Y$ F. a2 n: i6 B! r
   unregister_chrdev_region(mcbsp_dev,count);
6 m5 V- q; m* H  K! V/ o   device_destroy(mcbsp_class,mcbsp_dev);
6 u9 c' H! ^- q( M+ n   class_destroy(mcbsp_class);2 I; ]- I) H' }. v2 b) I# A
}
$ c0 d+ `9 b! a3 ^, ^0 _module_init(MCBSP_init);6 e6 c+ V* {0 \' D. q6 \& D
module_exit(MCBSP_exit);
; Y+ W' w/ r9 I3 z* d! ^0 v2 a: J5 @
MODULE_LICENSE("GPL");+ u$ E9 a' \8 L; g7 |3 s: ]

4 S8 B+ W4 ]3 o! b! t& X我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
9 u- H+ t: k8 \我的应用层的测试程序如下7 l6 u$ \1 e: S
#include <stdio.h>
0 R1 B- B; s" b3 l  Y6 J#include <string.h>
7 j5 \8 `# K7 F  N1 Q#include <fcntl.h>
; j% f) O9 X0 @0 @#include <unistd.h>
/ C7 \8 w& i& v0 P) m# o# z  Z#include <signal.h>- Z- l8 E5 F) A. W6 g: a
#include <pthread.h>       //线程
& a1 J' O5 }* l7 m* O, _#include <stdlib.h>- d; |; ?6 K) r( E$ I
#include <pcap.h>          //捕获网口数据
( ^6 y7 {) A3 ?9 N2 `5 s& D, A. s9 G#include <semaphore.h>     //信号' V6 N' v7 \* D1 A" w7 c* s
#include <sys/types.h>     //消息对列
9 Y3 Y! W* N8 y% b0 n# w#include <sys/ipc.h>       //消息队列
% y- K& N% h! D  K8 t7 m#include <sys/msg.h>       //消息队列
5 E, r& w( y% t7 Q#include <sys/select.h>
- d5 v2 `& y  }#include <sys/syscall.h>+ ?5 t) ]0 t& H9 J, ~
#include <sys/stat.h>
- q/ P6 {: D# K" D1 X#include <sys/mman.h>6 Q& f( U8 N0 I1 ]' N# z0 S2 g  I7 P0 b
#define msleep(x) usleep(1000*x)
; Z/ n% b% `; u% ]' b1 S; J: c4 X& i$ F) z" F: m" ?) n) b
int main()
( \; f+ G8 @" R! M2 o, M{
. I1 o. U  u, n. @4 B3 J0 V! n    //MCBSP,ARM与AMBE2000交互设备( u  A, D4 I% F+ z3 d0 [4 t1 _
int fd;
% Y- K/ g. y9 o. @2 W( l# V unsigned short data_write = 0x5555;
5 T; @$ R' D9 \0 W unsigned short data_read = 0x00;. ^. [* B0 j$ t# W% o/ t2 \7 J8 c
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: o  k6 q" R! ^, _1 L& C
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 [+ h4 b0 c! I2 s
   
3 [* M, k; G* B* m# m5 [' t  if(fd < 0)* R. T' o& D6 M2 _& U
  {+ t$ n+ z4 Q! r  x/ W' D) {# D
     perror("open failed\n");
( Z6 C+ b  q% J6 }: K     return -1;: f0 G9 m; B: \$ x6 G
  }
  ^' J4 n  `0 O9 Q" ?  % e9 Y2 _7 z9 T5 c( ^1 v. ~
  while(1)
6 C; A2 q/ t. e. ?" U9 l' H' J2 d3 o  {
+ V6 t( o. a" A7 D0 x2 ^   2 V& y2 V& A8 @
   //AMBE2000每次读写是24个字为一帧  c. _  @% p7 X* x
   //写数据时将数据在底层存储起来,等到中断的时候再发送" i1 @5 b9 f8 s, D# l, V! R
   //AMBE2000输入数据是以0x13EC开头的
1 n, |" \) j( q1 ]1 b4 g) z6 U, g8 k   write(fd,&data_write,sizeof(unsigned short));
3 w/ x, k( Y, @$ a. p   ! Q8 f1 z- m2 Q3 _5 p7 x. f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- P& I* Q  ^1 f* _. f2 l3 J) j   read(fd,&data_read,sizeof(unsigned short));
$ H! K. m$ a2 G, k( b3 i   4 m" Q- K) I* n5 f- [9 T$ a: y
   if(data_read == 0x13Ec)& ?* i$ a" l8 ]  V; v7 ?& Y
   {
' d9 o# V1 ]* S  ?) R   
6 ^4 D2 o2 R+ z1 s  C$ }! e    printf("data_read = %x\n",data_read);
$ x- A# N! d. ]7 q* k   }
) Z" j( p1 a0 I( M: ~   - ^2 w* K4 U/ _) J! o( p
   msleep(10);
( o$ a7 B! Y) E. x2 x; _  
) L, _# L& O: d5 f+ r+ i# X4 g# R  /*1 R# Y* ?+ K4 n! U/ \& e
   ioctl(fd,1);   
2 y! P6 i; p- o) q6 \ sleep(1);4 T- q, o5 [' X* g
ioctl(fd,0);
3 m- t; e" a5 E7 y sleep(1);. Q1 ^  P  ^7 E, N0 r$ n" l
*/ 2 t3 b# ?, T3 f- U1 M
  }   
% v2 [0 y' T6 |, ^8 [* Y/ \ return 0;$ u! D: ?& `0 @$ N# f
5 O" x" j  @, z% Y1 F$ Z, m
}) z/ L" a) {4 ^! v0 L
/ ~: L# ?/ ^( }" v* W" R% S
多谢各位指教,谢谢! 急6 ^$ G. N' o; M/ K" @  W

$ s$ p  v) W7 C5 B) S5 x
/ m% h/ V, c% V! b! N; e# S6 }6 Y& A/ w9 r: O

8 E, w5 }) ]% p' `0 ], m. Y7 M) u7 \$ [7 n: e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-26 18:19 , Processed in 0.046485 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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