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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 `4 g' A9 j* u2 {% k- }) {  G/*5 P3 l0 d$ D9 @/ L; x6 {5 x
* Copyright (C) 2009 Texas Instruments Inc
- E: [% A; q( C *
% x* t; Q9 s- U$ F, M * This program is free software; you can redistribute it and/or modify' A* J* B. L; m. x
* it under the terms of the GNU General Public License as published by# P1 X' w8 T0 z" k4 X& t
* the Free Software Foundation; either version 2 of the License, or
5 {: Q6 a3 R! ^- K- g7 E) z1 Q * (at your option)any later version.
! L5 f4 _. p2 f( U0 K9 L; H: h4 _ *% R2 F; @8 o; K! A* r6 b/ ^/ r
* This program is distributed in the hope that it will be useful,
' U) q, X  z- j& m- `/ I% s; t * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 h1 |0 @( a6 \0 D$ H0 H * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! H8 R6 ?# Z6 ~9 s3 R9 ^7 f
* GNU General Public License for more details.
" y/ P- R1 p% E1 ], k: G *
1 R4 Q! ]" R  Q! q( X$ B * You should have received a copy of the GNU General Public License
! x3 N( ?) r3 } * along with this program; if not, write to the Free Software
8 c8 h' m( E5 S; t7 y$ s/ L * Foundati3 R4 G" p! e  G
*/
. d, H. k2 H" h#include <linux/module.h>
6 Y2 t. x9 S) w1 @/ [* h#include <linux/init.h>
& ]5 z) e2 p6 J) k4 h#include <linux/errno.h>+ \& \. W1 V( t# u  m) ?- o
#include <linux/types.h>5 P$ n3 ]# G& J) ?( h
#include <linux/interrupt.h>4 w' V. |9 @" `/ |9 T8 Z! ]- m
#include <linux/io.h>2 H. u' C" y: A
#include <linux/sysctl.h>0 i# M6 S' U4 w3 H! i
#include <linux/mm.h>
; _: b' z! H) p#include <linux/delay.h>
2 q, t" v$ X6 Q4 Q. {#include<linux/kernel.h>
, T; G. N5 k, |' `4 f#include<linux/fs.h>
$ R0 ]- r# z' l; L7 b- O# L#include<linux/ioctl.h>
7 }$ ^8 T: I# a: u  u7 [#include<linux/cdev.h>4 |% i$ R" F0 X# E3 l
#include<linux/kdev_t.h>
6 ^- a7 G  o+ m0 `1 ?5 I9 [#include<linux/gpio.h>8 k/ Q( F' S0 t
#include <mach/hardware.h>3 X: G( K6 s: w9 R6 k
#include <mach/irqs.h>( z! A+ I! n) P8 ~4 n
) i; F9 t, H& P* E! j6 C- P
#include <asm/mach-types.h>
9 v, z/ u: A1 n#include <asm/mach/arch.h>! e) V" b! Y  o; a/ a
#include <mach/da8xx.h>
' g* j. R0 _* P" c( b$ `0 H#define  SYSCFG_BASE   0x01c14000) C% V% i' N& ]1 F& d/ z/ k* F7 m
#define  PINMUX1_OFFSET   0x124
/ Z* W6 `  Y* O3 N# `#define  PINMUX18_OFFSET  0x168
+ q' V& r) ^2 k" j1 z#define  PINMUX19_OFFSET  0x16c9 X8 Q& d& ~# u* {! B! ^4 }  c4 T
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 L* }% p4 I6 k& O& S% e9 o) L
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR: \2 Y: j! Y0 `6 w
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 c2 h0 v  x! `7 u! c6 X#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ I& V0 n: T4 u. a, c% |#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' o8 t+ T: m. P  ?
                            1 ?% H2 c8 h9 b
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  @) u" U$ @5 J& O& p#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
8 K3 D& l+ Y0 F# a//PSC
' Y) p" V+ p# L6 e+ R) t4 n#define  PTCMD_ADDR   0x01E27120  
5 L: a5 K9 l7 G  w#define  MDCTL15_ADDR 0x01E27A3C7 ^. @, q: v1 w3 n1 I6 f
#define  PDCTL1_ADDR  0x01E27304
+ Q+ I2 V) h+ M* ]7 l" ?% n//GPIO8 direction
' V. A, S0 f  D: \" T$ Y/ D#define GPIO8_DIRECT  0x01E260B02 P2 w; t9 I; P) V
#define GPIO8_OUT     0x01E260B4
* c$ \2 Y0 R' A. y#define GPIO8_IN     0x01E260C0# A0 t5 q  B  J5 x) d/ p

' [/ ]+ J4 b7 |//#define MCBSP1_RINT    99              
) f( r2 q/ x4 C, X3 S# m# d6 @//#define MCBSP1_XINT    100  
/ ?2 E; z! D3 u$ E3 c& n9 v% K1 Cstatic int MCBSP_MAJOR=239;
: c6 e" Z, }4 ^% P0 Nstatic int MCBSP_MINOR=0;9 n# i+ t$ j3 ~, C! @
static int count =1;  Y# P4 Z" u. s
! H0 }$ }( x1 ^% e  W
#define MCBSP_NAME  "MCBSP-device". W3 w' i& \* s4 W) {6 @
8 l% i% A  y0 N- B$ ], t, I0 \
static struct cdev *mcbsp_cdev;6 G  ?0 s& W  c3 H* G  ?  X' i
static struct class *mcbsp_class;( C* n% U$ b: l* D
static dev_t mcbsp_dev;
) ?' [6 `" }; x1 Zunsigned int DRR_data;$ U! s2 [- I! A- p. a
unsigned int DXR_data;( }8 D) d$ a/ t+ V
static int mcbsp_open(struct inode *inode,struct file *file)' [* d" I# i  {! R( I
{
/ B3 d( Q# x; B- P7 P" E   
- Q9 z" T1 l2 k) }" s( v$ J   //interrupt enable,initialized  q, a( v: W; W- D3 Q7 t& g7 T
   unsigned int temp;  R/ w/ L! [3 j6 `& r$ f
   //SLEEP_EN(GPIO8[10])---07 X- {' W% e; a, r3 K3 B9 f
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- g% ?4 c7 J7 @  l
   temp=temp&(~0x00000400);
. ]5 C+ O1 n' C6 Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]  V& k) U' V! X) t5 v% ?) c' s
  //RESETn(GPIO8[8])----0----1. w4 y- {' C5 f8 j3 i" n9 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));  ]$ ^# N, L# l, S- Y( \
   temp=temp&(~0x00000100);
! e" u& x: N" z5 P+ `0 y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 v/ M+ ~9 O' b5 B5 q4 B% e
   udelay(100);
: |' ]4 c. K1 J- C( {   temp=temp| 0x00000100;! q0 ~6 Z" l- B; w# \7 x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( W- r8 V" A! ?& S' u* b   udelay(100);* R( r: H" r5 H2 l- I
   printk("open success!\n");7 N4 f0 v( A  `- F7 e
   return 0;7 A/ X* ~; `7 n- I3 @0 p$ ]3 w- C/ v
}  j- Z- M& I& g. G& x, y
# \- g& M: G( c$ L! |* A- {) C( [
static int mcbsp_release(struct inode *inode,struct file *file)  i& t7 x( x) E; a, p# ?3 F* v- M
{
, c: \- B0 w7 }& V" d   printk("release success!\n");0 t5 ^) u9 l) U# D/ R  f
   return 0;
9 X4 Y2 Z3 q1 l# G# l1 c1 I}0 G7 U3 a: R0 _3 Z4 {0 _
: U4 H; {9 J: q4 ?7 \5 K; i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): b( _2 p3 m4 R7 f: `( \, S% ?( Y5 W
{
; z& z8 t- ]; w! N    copy_from_user(&DXR_data,buf,len);
( P4 x# k1 W0 D: x. z# F% J( s    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
2 x( T) ]* t5 w1 A/ ?* Z5 z) l* P    return 0;$ C/ p" T9 @0 ?9 j2 L
& |; j* l2 S0 b
}
+ N& H( j9 r" O1 T3 W6 w% V3 b, ?$ d( D. G. N/ y" F% S2 F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 k: r$ I& D2 n2 [/ k1 Z0 i
{
0 G& V- E  E3 O  {6 N& P  ~   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" \# Y2 |, ~; [
   copy_to_user(buf,&DRR_data,len);
5 r( ?, E4 k( j0 a9 w& ^   return 0;6 x0 u3 K/ |9 V+ ?, q
}0 a, k1 g# [! Q; |# H! x& K7 ^7 b0 }

7 Z8 T$ B. y9 s
' L, @- N3 }5 S; O3 Rstatic struct  file_operations mcbsp_fops=
1 G; Y. U3 I/ t- i7 N{
" Y. m5 t6 n/ A8 R: L- {   .owner=THIS_MODULE," i8 w. d% _/ S# s$ W
   .open=mcbsp_open,. B# t3 C6 o8 _2 K
   .release=mcbsp_release,
; L- L& K7 ~4 s8 G6 `' M! M   .write=mcbsp_write,
/ Q- o; p6 `1 C2 Q' j   .read=mcbsp_read,! n) Y4 f8 Z& s9 d# Q" R
};
" P# m& l: W: r' w' ustatic int __init MCBSP_init(void)/ ]) i9 b/ g4 }4 _# j$ B1 v
{; C* L2 ^- p6 e0 P3 e  B7 K
   int ret;% _6 `' }7 r' {( T; n: `
   unsigned  int   PINMUX1_REG_old;
+ @5 s" |7 R9 Z( ~% v. n/ _   unsigned  int   PINMUX18_REG_old;
0 l5 _; {9 O$ s   unsigned  int   PINMUX19_REG_old;9 _* G% t  F+ x( ~0 O3 O
   unsigned  int   temp;  
, x. j0 ?! _, H- F% [   if(MCBSP_MAJOR)
# i  p. ]1 m& A: t   {
% C* n6 \; k% L0 ]+ H: l/ g      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# N% }3 d7 E" y6 V/ V0 H5 Y
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' Z; @7 [0 p# k3 b0 f2 `# @& l   }
8 x, A% K' j) f2 K% `" M. ]5 Z   else- ]7 L/ }) m" U9 P+ ~3 N
   {+ T7 s- ^2 g1 U' H& T. d
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);/ ]4 ^& \3 g- m& y9 _
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 c) N: O( F' G1 b' ?   }
( p# R* a5 u1 ~   4 Y" g$ h' I5 y/ |2 {' n
   if(ret<0)" @" @6 a" q9 c  K5 O% r
   {9 i9 `1 n0 w7 w3 ^
      printk(KERN_ERR "register chrdev fail!");
: u% Q: ~9 G& b) ^! R      return -1;
* N  M' @9 T5 f7 r3 \, B: `   }0 q4 q! X/ c3 @0 g
     S8 ^  r( Z& c- D2 [9 j
   mcbsp_cdev=cdev_alloc();, a) D8 O7 O& I0 s, I3 a2 H6 t" T
   : h& x, D7 Z# I4 T7 A9 D) ]$ B- _
   if(mcbsp_cdev!=NULL)# ~! T; ^& R+ u
   {
- c2 z6 k1 s- S' x5 W      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 l6 W# F6 c8 z3 ?' C: o- H      mcbsp_cdev->ops=&mcbsp_fops;
$ x; d& X- E* ?5 {: K/ b& E7 N      mcbsp_cdev->owner=THIS_MODULE;
" {4 e: m, q# ?# V+ e. @2 M. n      " j6 k" P. _! x( ]1 Z. w: W
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) u2 M& v' p; R0 @- Y
          printk(KERN_ERR "register cdev fail!");
9 D9 ^: {* U+ G6 f5 R      else0 w) {5 ~4 n2 L
          printk(KERN_ERR "register success!\n");
! w6 m1 D5 Z4 d- L& U   }
  N/ J8 N( _0 z) u2 Q7 z# Y( A   else
8 Z8 {# o' J4 l0 ?   {1 W% X8 V$ l- Y8 e, S& d. P. W
      printk(KERN_ERR "register cdev err!");1 A9 V7 ]# B* V! N% k. l, C
      return -1;
7 [+ g4 g5 q' C2 }, U$ T   }
1 ^! b$ W' ]( e# B   
, f7 _) Z% w- a) M  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 b5 U9 {8 R* J  ~1 W& U   if(IS_ERR(mcbsp_class))
! u) R- a3 s2 U" f1 P   {6 l" ?& Q7 B5 B* f& z* B4 D' Y
      printk(KERN_ERR "register class err!");
1 Q# G/ W5 I2 O3 L5 |   return -1;9 z* f. [1 B5 L$ b1 t6 T
   }  T' [! G, C# L; B7 f
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. j5 C5 b5 w7 {$ P% d

6 q9 P& e0 Q+ m  p8 c! C   //PSC& q4 d( V* \( h
   //add Enable MCBSP
+ D1 m# W$ s# M* H. w6 P5 c( A& ^   //test
' U. A% t8 N+ X* Y& E   temp = 0x80000003;1 r% _9 y; l* i" Y6 O
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& A) q' T7 O! v. Z! C, [   temp = 0x00000003;
. {* W3 l' Q5 |  [% }# a   writel(temp, IO_ADDRESS(PTCMD_ADDR));) A$ p& U! x2 I' U* X5 ?% n! I
8 g' o0 Q2 P! t; }2 [7 W+ i5 P
   temp = 0x001FF201;9 O+ w3 j! F1 m8 o' a
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- j% k  z! V, a+ H" g, y1 ^+ B* u   
' u( P& T* S# X3 ]1 F+ N( V   //PINMUX  2 d( }# u. H$ m: W
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
  j5 g0 g! e6 z5 f   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
7 [$ ~) Q0 B  ^  J+ i! u& ]1 `+ `  e   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! |  ^& y( s1 Z4 z4 r   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 O/ y, T# p+ N
   5 Z* s! T0 z, t( ~0 ^' g
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) l9 H/ Z  U# E: |" ?* C$ i, v   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . B$ o9 d$ g' E% l1 X" e! X9 A
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 x- T, |% M4 f1 R+ R1 w
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 I+ o8 ~1 |; j; M+ [

! w  `3 x9 M9 n! R# C+ u/ l5 L" N   //RESETn,L138_SHK2
6 @3 H# N4 D/ k$ r/ T2 `   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
! |. {7 |( V  P" m- u; R4 B   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 U& ^; _/ z5 n" o# [' ?& j   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- O. d* Y' \" Q5 U$ L  b) z+ e0 K 0 T! \! V! n! l% O
2 ^4 v3 d! N7 j9 q9 `( O
  //SPCR Register
2 S2 T3 i8 D& X) M, }, L  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* i1 R3 J1 O2 ]3 L& q  temp = 0x03000000;//(DLB=0)% K* l' a. u# i4 g
// temp = 0x03008000;//(DLB=1)# y8 q" q& Z* R1 G7 D" @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
8 s0 ^. ?5 Q& `* {, s* @8 W& e  temp = readl(IO_ADDRESS(SPCR_ADDR));4 E, C% Q  o2 p9 `
  printk("temp=%x\n",temp);# p4 ~7 b% v, n0 ?" f. E
' A) f7 u- @9 g+ k* f( E
   //PCR Register% l1 Y) {+ }# @2 {1 v
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: L; W- x, J7 w4 M
  // temp = 0x00000F0F;
, j9 ~; `4 o* v8 D$ T5 o  t  temp = 0x00000B0F;. _% M+ E, A/ _: x7 K* y( k
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
; |+ C# o% L7 v$ R& e. ]  temp = readl(IO_ADDRESS(PCR_ADDR));. s' V6 |$ |* t
  printk("temp=%x\n",temp);  
* h5 d  o! }5 ]$ o. m, Q   //SRGR Register
. h  K) f8 o( x' ^   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
3 E  r2 m) t1 v$ z //temp = 0x301F000B;: {6 c" v  E7 o5 S8 e
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
; O/ ^5 z' r" f9 k3 F3 z; x% J  temp = readl(IO_ADDRESS(SRGR_ADDR));
! I1 }5 H% y9 D5 {9 X3 O  printk("temp=%x\n",temp);
6 z+ L4 |9 R' v+ V$ j   //RCR; V0 g# J- C" _
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 K2 K8 e4 Y  K& J0 |# a9 x5 j/ E4 d
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ y9 f" v3 J% }+ l# Y7 K8 r& @' F   temp = 0x00440040;
" r$ I8 X5 p# O$ d1 }5 n   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
. f. q/ U% {5 z  c7 M   temp = readl(IO_ADDRESS(RCR_ADDR));# h) K  p( Q. a$ C6 @  x2 P% L6 [
   printk("temp=%x\n",temp);
' k8 \8 D/ t% W0 F- Y   //XCR) L* }% D" ^7 l( P% i
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 K2 g7 Y! r6 W* o& h# x   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; G) [" r5 c7 ^+ m% t
   temp = 0x00440040;8 s6 @$ A+ [  g. X2 U2 _
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   % F% f" c3 _! e  a( n; E
   temp = readl(IO_ADDRESS(XCR_ADDR));
8 n! B% }, }' \" ^3 U# Q   printk("temp=%x\n",temp);
! ~$ w8 l5 R# J: u  udelay(100);4 o  Z0 K! o+ y# @+ ^8 u0 O
  //SPCR Register8 i- ]" @; [  L/ v8 D4 v3 K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! s0 T/ }$ v, f
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1& B/ L+ P: l$ R; \, j: F! Q* v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
! P/ f  @" y, I5 X5 |. o, j0 Z- M1 x  temp = readl(IO_ADDRESS(SPCR_ADDR));, M/ e6 F+ W9 V2 t8 o4 ^; P
  printk("temp=%x\n",temp);
$ N4 X7 ?- w' h* w  udelay(100);6 ~, }6 B1 C3 r" c8 z# D* j4 w
1 o# e  _! d) P8 a% ~2 \
  //set GPIO direction9 D7 Z  v) i, z- z' X
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% Y# U7 Y8 u: \5 J   temp = temp | 0x00000100;//EPR----input- t7 L. ^( m6 ~6 H; j- F
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* J9 ]# w8 y" C
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 l% W  z) m9 m* E

$ R* ?# r4 P5 G   return 0;2 t3 i* N# O: M& D7 ^. O: H0 |" ^7 R
}
* [& u* D8 r9 jstatic void __exit MCBSP_exit(void); c7 \! t) ]& U/ i) v7 G
{
! u  ^+ j: J5 g8 p   printk("mcbsp chrdev exit!\n");$ N1 f& P- d( P) M7 s* u
   cdev_del(mcbsp_cdev);. {# ~+ X  w# N* J0 p5 X
   unregister_chrdev_region(mcbsp_dev,count);
# n+ w  C7 B- w: U' r, ~   device_destroy(mcbsp_class,mcbsp_dev);
9 u5 V* L/ l5 H2 Z   class_destroy(mcbsp_class);3 _  i, p# b8 L- U
}+ n9 v+ B0 X8 \9 q; a
module_init(MCBSP_init);
; X) r/ M1 M% c- xmodule_exit(MCBSP_exit);. W/ @' b5 y. z# D1 @# r- i
+ I  @) y! {+ g1 n) Q4 T+ J2 k9 n" F, O
MODULE_LICENSE("GPL");% R6 Y; H8 }. B+ w

4 e# f) F) u; m我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, m8 f6 }0 c) w1 G3 s" j/ T我的应用层的测试程序如下
1 S% }" d  _( s4 l- N, f' K- x#include <stdio.h>
" ~9 g" b) F5 t: U#include <string.h>
. {' w' L% C1 T. t#include <fcntl.h>" n7 f7 Q: v6 z
#include <unistd.h>
: V9 R/ j* I. \& Z& F#include <signal.h>
8 h  l; U, y: R" Y' p/ V) ^#include <pthread.h>       //线程
( }! N: L3 D) n  N( a9 A#include <stdlib.h>
* t6 Z5 H. J1 o+ B#include <pcap.h>          //捕获网口数据
+ w0 w2 V$ Z# S" b- s! k#include <semaphore.h>     //信号5 f3 L6 S- {/ d% o( l
#include <sys/types.h>     //消息对列
; |2 k( T" @( b! N& I+ R#include <sys/ipc.h>       //消息队列
' j6 R' \% p. P1 l9 A#include <sys/msg.h>       //消息队列- t# |$ X: g- a1 b2 `: W- Q& v
#include <sys/select.h>, R' Y( f& I- \* @" M5 v1 @
#include <sys/syscall.h>! |" b  ~6 W; z+ y4 _3 M
#include <sys/stat.h>
) u' {% ?+ K, }+ V6 }( t0 H3 z: S#include <sys/mman.h>5 B- r4 \. L; B5 a
#define msleep(x) usleep(1000*x)6 k& N% m) \% O8 D7 ]+ P0 \

) T; g9 F: A" c* ?% ^int main()
" z9 ]7 O2 ]$ k, S* E. k, S{
& v, P$ E8 X0 `- e+ }! m3 ?    //MCBSP,ARM与AMBE2000交互设备
7 M; w: v9 ]( b7 M2 h# d$ r int fd;
+ M* ?. c7 C. F' N unsigned short data_write = 0x5555;7 ~, A6 p; _- o5 a
unsigned short data_read = 0x00;
; |) K2 [% X, P) v; G# E& e# @  {  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& F; r1 ]5 }9 u
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' P% E6 n, ^, P2 j3 [# ~    ' Z  f; L% ]& K$ L/ ]- j1 W8 U
  if(fd < 0)0 {$ q  n0 f$ H, v
  {
+ g$ U$ W+ G" o% f/ S! r( ?     perror("open failed\n");
3 y' `* o0 V  U2 Y/ ?5 f' z, V) ]     return -1;
- ~* V  i$ C8 z$ R  }, V1 E- B- Z  z! V6 p
  3 Z* k$ H1 s8 w5 S$ }
  while(1)
) {$ ?. y' _% y9 V0 J  {
: `# @& f9 R% R$ L5 Q; I/ C) A   - y  x: w- V) \% e
   //AMBE2000每次读写是24个字为一帧
/ P; L5 O) f, W, u! E   //写数据时将数据在底层存储起来,等到中断的时候再发送
' V  F( ^7 e, k   //AMBE2000输入数据是以0x13EC开头的
& _* T0 O  G! z6 K' J   write(fd,&data_write,sizeof(unsigned short));8 Y1 }7 P5 L- \0 }- U( |( o7 [( M
   
% Y/ K" n; w& l, |1 Y4 C   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
! }* x5 g9 k3 ~% u( v$ i3 P   read(fd,&data_read,sizeof(unsigned short));7 N6 ?$ T+ r) i8 n, c2 {* S
   
, ~$ l% _) M7 C+ _* t! k   if(data_read == 0x13Ec)
( G- }, }# ]9 M- T) z6 Z* g   {& g2 D) ]- P# G. a# {% S! k$ n
   
3 B) V( x: q8 E6 D7 L    printf("data_read = %x\n",data_read);
- o5 j7 X* m# E* i, t/ X   }
/ G0 e( v& W' i9 k   
1 o- K2 @% S4 i( r1 M. `   msleep(10);
! M) g% w+ k& m1 m: Q% T4 L6 T  2 ]" ?* L3 T! S1 ?& Y0 ^$ W
  /*
, M( {, h& V& C" }( ^8 t   ioctl(fd,1);   5 D3 d  b9 `9 I) S8 C, z+ R
sleep(1);
" e% @, s+ x! g6 G; b: d9 o ioctl(fd,0);5 y6 R1 e3 v6 C* \
sleep(1);! Y+ K" I/ o& S7 R1 o
*/
5 ]" x5 U- C1 T7 E  }   9 N) }. @0 V& j6 R0 m$ t
return 0;- Q' I! R2 X: ?6 q1 [  X; a; s  f) i

/ s( f# n5 g. W% _( Y) a* [# `}/ o1 ^. @5 Y* W9 d6 j
; B. @& b8 @. c# d0 z, |
多谢各位指教,谢谢! 急! f5 P& x8 g9 v5 N1 O4 R* C

- n/ d) T+ Y; i; ?5 a: L0 q7 G
$ ?; D2 k' b6 x$ a4 B( E# }" }  q$ }. W# Z7 j# Z% i
, Q/ x- k4 V) J2 V; V
; j3 ~' [% F/ i* k' s6 |0 m3 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 21:21 , Processed in 0.047791 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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