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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % M5 y4 \5 V7 [
/*4 W7 Q7 `- O+ p! O
* Copyright (C) 2009 Texas Instruments Inc
- j- u  ]: s: `  Y4 G1 j" k *
& ^8 v9 i- Q: D) I3 { * This program is free software; you can redistribute it and/or modify- z6 K4 ^# c; g, P3 |; J; U5 q
* it under the terms of the GNU General Public License as published by
4 r" ]( e2 L5 N; J! U, I * the Free Software Foundation; either version 2 of the License, or
% ]$ T- D, D3 K3 S5 A+ t * (at your option)any later version.
( q' U- w: [/ ?; S( j9 Y* ^1 x *
5 V! x9 o2 p8 P, i$ h; c/ e9 Z * This program is distributed in the hope that it will be useful,. a' \6 c; l# _. @" [" h
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ j# R0 P. @! X8 ~, ~3 f0 Z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the4 a$ c. u3 E% [+ M  ^* D  u
* GNU General Public License for more details.8 _& {" {% M" R# ^( `" Z8 F
*
3 X) Q( k( H/ _+ n6 }7 k * You should have received a copy of the GNU General Public License* j/ N8 t. f$ I3 ~" x. d) k: X
* along with this program; if not, write to the Free Software6 |! t0 K9 L( y% D$ K& X4 {
* Foundati$ [# v) M/ z. L' y& X, a
*/& A  g3 n7 `# ]" V9 e& m
#include <linux/module.h>  }/ y. Q# B  _0 c' e: {' ?
#include <linux/init.h>/ ^' v/ B' |& ~& X
#include <linux/errno.h>
4 F* i7 S! J0 p#include <linux/types.h>9 W/ D, t0 F# y, l# U8 D7 N+ M& f
#include <linux/interrupt.h>) l: i: v. ]$ {3 K+ b
#include <linux/io.h>
" a2 q3 l, {% d" o5 i/ O#include <linux/sysctl.h>
: v6 Y  c5 q1 @1 b& q#include <linux/mm.h>9 H" J! Q- o+ K9 ?5 v+ X
#include <linux/delay.h>
* R/ v  [0 ~: U/ f3 ~#include<linux/kernel.h>* ?! J- `* u/ Y
#include<linux/fs.h>
$ d2 r# P8 R/ F+ t#include<linux/ioctl.h>
9 D% x) Q. @2 ~#include<linux/cdev.h>) ?" O( [, v" V4 F2 |$ \
#include<linux/kdev_t.h>6 e; E  b( j8 W7 W& }
#include<linux/gpio.h>
& @' H/ S3 c* a( v0 }#include <mach/hardware.h>
$ V4 A/ e& q, _#include <mach/irqs.h>
* m. ?& m0 m, N- B. Q/ o4 l
$ o$ C8 }5 t- o3 i) \#include <asm/mach-types.h>9 t/ \$ c6 n' @# q$ l
#include <asm/mach/arch.h>
% N, i5 O# Z+ b; o#include <mach/da8xx.h>9 y/ _. F# \0 ]- n8 j. m: o$ e, V
#define  SYSCFG_BASE   0x01c140006 w7 _: T. u# A: D0 a$ n5 K
#define  PINMUX1_OFFSET   0x124
4 j' I* B  o- T0 q& P9 \#define  PINMUX18_OFFSET  0x168
4 V0 q; R+ ]4 ?' V" r8 k$ s/ u#define  PINMUX19_OFFSET  0x16c% U& [6 _* U% U( u! F3 R+ @$ o
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
1 {; j0 h- @% K2 _. J. Q#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, A9 ?) j0 x/ k8 T" E5 c( N#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. g3 g! R  ^! B5 O
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
2 `, X& g! k/ l* z: C. n#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 P  Y# E7 t) |3 R5 f, H                            + Q5 m  D5 O) ]' D
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
. A/ H: s0 ?1 `! J# `#define DRR_ADDR      0x01D11000  //MCBSP1_DRR5 g5 a' a- u7 g$ V
//PSC; X. e  |. B; k
#define  PTCMD_ADDR   0x01E27120  & D7 [9 Z( S9 L, |) f8 {3 w/ h& g4 P- d
#define  MDCTL15_ADDR 0x01E27A3C
6 Y; T% C; l! T2 d4 m1 [/ j$ ]#define  PDCTL1_ADDR  0x01E27304
8 e7 ]' u0 b" b! |//GPIO8 direction
/ I! G" \' X; T$ X* }! [& }: b#define GPIO8_DIRECT  0x01E260B0; p1 {/ x0 T9 \6 C3 e. T
#define GPIO8_OUT     0x01E260B4
5 v# q; S# K. J$ p& ]#define GPIO8_IN     0x01E260C0) w3 X. j8 h, T4 o) t
& [2 K- Y1 h5 p: N' |( `
//#define MCBSP1_RINT    99              5 q" N. I) z" m$ h$ _: ?2 O
//#define MCBSP1_XINT    100  ) @7 |) Z4 p* N& y) t- l4 P
static int MCBSP_MAJOR=239;
, i6 t( A  _# |( m5 w) ~: [$ X! {static int MCBSP_MINOR=0;. Y" M, K4 P# n0 H) d. ~
static int count =1;
, K3 I0 o1 U. ?+ L4 d: I" }
9 v* W4 E/ ?5 {! e, Z, I#define MCBSP_NAME  "MCBSP-device"
4 L( R: s7 l$ E* W" b- N4 V
1 }& K7 l3 s) |9 p6 z/ o: O2 x6 Ystatic struct cdev *mcbsp_cdev;- B2 m% m9 }4 N
static struct class *mcbsp_class;( m* Q; R) N  v* M4 U* n
static dev_t mcbsp_dev;
/ G7 R: {2 J# k6 D) q4 aunsigned int DRR_data;
. D1 ?. n% b1 _* iunsigned int DXR_data;
0 G5 T3 v7 V; s) x) l2 Ustatic int mcbsp_open(struct inode *inode,struct file *file). H! \9 |, p; z- h, o% Z4 H
{1 L0 T/ ^1 G* v( b& F: |
   ! k9 ]. j. \8 o, ]' h1 t% V* @. t
   //interrupt enable,initialized* u7 m: _- q' {# G3 {, h6 N+ F+ w" B+ k
   unsigned int temp;; h0 m- p' r! Z
   //SLEEP_EN(GPIO8[10])---0* f/ m; b! D* S/ u3 H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& {+ X4 r' B7 G( [
   temp=temp&(~0x00000400);
, |1 |. O: r: V" `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 ~  r8 p: X, P  //RESETn(GPIO8[8])----0----1- j# F0 }, q. ~2 A* E
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& f+ J! l6 }- _9 C& g3 V" i, w   temp=temp&(~0x00000100);
  L5 M4 [% l% g, r3 g   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( u+ T% n+ X7 S. V& q   udelay(100);
' o. F& }, ]7 j   temp=temp| 0x00000100;
- p# [( v3 t- l( w( K- p  N: i. L   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ P# P& r, w( D/ a. c7 N   udelay(100);' N* q+ c6 [, E
   printk("open success!\n");7 Q% G( U# l: c! g, t8 t
   return 0;0 {+ ^, y: ?1 V6 W. j4 g, P
}
7 W% {' |: t! g0 ~* n  T
! M9 U: u1 G4 L1 T9 c: Jstatic int mcbsp_release(struct inode *inode,struct file *file)
6 h6 k7 R& V+ [4 h6 n; `; J{9 u+ h3 G- i# a% z- w  X! h# Y' C
   printk("release success!\n");* f* w! K  e% B+ e  m
   return 0;0 |$ K4 m7 B% ^8 K
}
# o" ^2 f+ e! _9 H9 {$ B" |" f# j, |; i6 Y9 g) N8 a9 G
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( l, Z) P$ a) j+ I$ ?+ R{# Y# f6 H% A; ~; P
    copy_from_user(&DXR_data,buf,len);
; Q* I( o: c0 G9 t" i4 s4 z+ J    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 ?8 s1 {- }# t8 z; q5 G1 Y/ N2 M    return 0;; K2 H- p2 _/ q4 ]/ _1 R9 ^

% n% M$ f. j+ n0 }2 C; S}$ a! z( H/ u" @0 c7 P
/ p, X6 h7 T  E: Z# t
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 L. J6 j# p& [1 l
{
; l/ D. ?# I. Y9 j   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 W; Y0 c9 @6 q& }
   copy_to_user(buf,&DRR_data,len);
* @' o  ^9 g' ?& K& m   return 0;: p- i6 T: Y# N/ i( {* N; Q
}
6 F8 f8 S+ [# N! a2 P: M5 P  h
  w+ r2 @1 X& T8 w3 m0 z6 l% S" `# i& ]! C$ G! x* g
static struct  file_operations mcbsp_fops=, L% |2 x2 ]' l4 M2 j- ]$ i% v/ v
{# g* M( \7 [  A+ U! t. @
   .owner=THIS_MODULE,
/ M  Y8 v) A; z1 N. M   .open=mcbsp_open,% _5 b6 n  k4 a. D2 }0 y2 V3 L
   .release=mcbsp_release,) E; a  H- [8 ~& ]; T9 m
   .write=mcbsp_write,, g/ D8 \; y& S2 y
   .read=mcbsp_read,
/ _& A/ G1 K# w0 _7 y) v9 r9 T};
% c0 i. e: L& z! Gstatic int __init MCBSP_init(void)/ x' j6 Q# Y* {, j& }  H# f
{
2 W$ M- u- r8 g3 E   int ret;: K+ `. {0 W9 e# Q: T' c* x- d4 f
   unsigned  int   PINMUX1_REG_old;' P1 P5 A( M6 E  O
   unsigned  int   PINMUX18_REG_old;
+ D2 N  o, Y, `5 x, R  l2 U, f4 ^   unsigned  int   PINMUX19_REG_old;
2 s1 Y( W5 [# U   unsigned  int   temp;  ' M5 Z& j! i: s/ Z$ r
   if(MCBSP_MAJOR)+ S; s; {' X) ]) s4 v
   {
3 O3 Q6 W; |+ P4 b7 X3 [2 K  b      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' u, B5 W1 f7 U4 K      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ p) M6 |8 _6 k* i+ [   }
! J. d- e+ U$ K6 D* i+ T   else) b4 X5 s& i* m( p3 `( Q, D: t: a* H
   {( P+ _; b5 n6 _3 Q* N' D
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- i* q6 m0 N7 d3 d9 U3 _% g      MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 t3 \  X% N! E   }0 g! E. A4 y2 Z2 |
   
1 n* [0 l4 I' A% W1 H   if(ret<0)
, L  a5 {3 A: \$ {8 x: D9 I) M   {
$ `  Z, z3 v' n2 x2 Z% ~" }/ T      printk(KERN_ERR "register chrdev fail!");7 K* o+ j; l- r/ e- v6 {. @
      return -1;
0 v4 A- W/ _4 P3 y/ u% h   }# Z2 L& Z* C" }/ Q
   / }6 c/ J7 W  r( s% }/ i$ X
   mcbsp_cdev=cdev_alloc();
1 L* v! D6 p. p6 t4 y   
( ]5 ]8 p( R- }! C9 L2 P   if(mcbsp_cdev!=NULL)  K6 m- l% H3 }! ?* Q
   {7 v# W& [: Q3 \+ }
      cdev_init(mcbsp_cdev,&mcbsp_fops);
( O/ h' Y4 I0 G6 `* u7 T      mcbsp_cdev->ops=&mcbsp_fops;
4 k7 w) v  @9 {0 J      mcbsp_cdev->owner=THIS_MODULE;$ p/ O, Z: N* ?3 r" Z1 ~6 a
      
  o0 k5 V7 u$ b/ T1 n      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 K3 E+ |" Y7 m- l& I6 U
          printk(KERN_ERR "register cdev fail!");& _, i6 @3 ?% @; u
      else2 ^" W( m; a+ ^& _, D8 ?
          printk(KERN_ERR "register success!\n");
9 A. w! \: U% D2 ]" |9 `- l; L   }
3 ?0 m. s5 F0 `7 X   else% U* V& W5 o; S3 n1 H+ M
   {
( f2 m7 j- S# v) N, ]      printk(KERN_ERR "register cdev err!");
5 i$ t1 A4 ]) p7 X# \- ^& n( k      return -1;
& U! j4 a; m+ u5 Q( w   }. r  d; }4 @! n; q. P6 v
   
8 h+ \: j$ G) J/ g$ q6 W9 H  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: x& z5 K  }# p7 B   if(IS_ERR(mcbsp_class))
( ~$ h+ [) u' A' M   {8 b& f% a' M6 {0 S& s
      printk(KERN_ERR "register class err!");+ Q5 U6 f% r3 h. Z3 R* W
   return -1;
0 C' d; }! s3 m% K- e$ O" Z   }6 b/ N: L' E3 w6 m; H( S% g6 k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 w( A- v; k5 n6 l

3 Y, O1 Q: e4 v' f+ a. _- |4 B   //PSC, W8 y3 d/ l( g( }9 ^! w
   //add Enable MCBSP1 I' r6 B8 z# H$ V, I5 |( F
   //test# I4 ~# ]3 ]/ V/ j
   temp = 0x80000003;/ g3 R, F- z6 n8 Z5 ~" N
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 b# X8 s' P% ~6 a1 V  x   temp = 0x00000003;
" s" k' w6 r% R4 U   writel(temp, IO_ADDRESS(PTCMD_ADDR));- K" c8 w* ?! V: Z. Z

( d! [, N: u% X' t/ R3 u   temp = 0x001FF201;
/ ]" r- v6 h( l9 b1 u   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
* w. L0 e* p0 D" f   & ]' P$ h" Y( S% p& j3 ]# r
   //PINMUX  
' y2 o! C- O. O! e  r5 ~   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ `$ k7 p' S9 o$ A( Q/ `; n: k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  % s8 P" c5 S3 }4 R, s
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   9 ~" z$ P$ P3 h  ^( _5 C
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* M& `( U/ K: W     L) W2 W* N7 V
   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 E5 q+ W; B6 W' P
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  , T9 N4 h0 D8 e' @" R- e
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# a2 R' x, d, E# a* B; ?   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 T9 D/ T, n. x/ m/ q" j $ U4 _, @" G1 y( `  V. j# W
   //RESETn,L138_SHK2$ Y% x4 |6 |9 Y8 x
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  : S3 ^: j5 Y) X. y' i# w
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   8 @" s& n1 j& k, _
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! ?& ~, q) Z, N6 N4 |0 i9 N, U/ [
/ R  R! }, o2 i
) W5 _+ [. W: `8 N  //SPCR Register; K& d6 ?/ u# y; c$ T
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 V9 |) Z; Z, O4 F5 Q5 s( h* r. }  temp = 0x03000000;//(DLB=0)1 u! W3 x: Y, Y  s7 o% b! j
// temp = 0x03008000;//(DLB=1)% g9 v  O7 G6 Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
5 J8 C9 K  ]; O4 `+ m  temp = readl(IO_ADDRESS(SPCR_ADDR));  w8 J0 }- p. {1 a3 V6 U
  printk("temp=%x\n",temp);$ m3 c+ I8 g# e6 D

4 j5 G9 q" r  @( Y9 L   //PCR Register: ]; |  x3 c/ ^* H
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 J9 I# }) S# d* X  m) |  // temp = 0x00000F0F;
- _  q" x3 S4 {: w9 h$ k  temp = 0x00000B0F;
( [1 L/ G1 }3 Y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 ~3 S5 y5 K  }, H4 f  temp = readl(IO_ADDRESS(PCR_ADDR));
& K/ O2 A9 Q3 A  t* ?. F; `9 U) K  printk("temp=%x\n",temp);  
( Q, U- d! @3 Y: t, H   //SRGR Register- Z- T4 @; m  F- ~3 A
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 u) S: s% r6 T" x! k! Q7 w //temp = 0x301F000B;
( v* M- }5 K3 H' v% d' ]   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 M" e9 h) N' S* Y5 ]
  temp = readl(IO_ADDRESS(SRGR_ADDR));
; e! W/ s/ W; |* E9 F  printk("temp=%x\n",temp);
3 V- ?: L4 }5 D3 I; s   //RCR
. u( k) m( Q+ r4 E, w   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) m. x! `; j: O# G, V. v. X1 G+ L" C
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 ]6 {; g4 _1 @2 K) ^   temp = 0x00440040;
! F8 W' g$ B, c. L   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 G5 c- f; f5 n' @  ?   temp = readl(IO_ADDRESS(RCR_ADDR));; T9 Z/ l+ p; i% [- P
   printk("temp=%x\n",temp);
9 j. ?5 o1 O; j/ e% H, \9 I   //XCR1 h4 l) k$ u5 B- ~4 J
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 n. x( h5 ?- d- {8 N& A7 l
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; K% }2 R, [$ l3 ~2 c' k* b- k   temp = 0x00440040;
. Q% P- e9 S4 h0 X8 L5 m/ W   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   0 g: L1 F/ N7 Z) p% s
   temp = readl(IO_ADDRESS(XCR_ADDR));
4 q" E) {" E0 }! r5 y; ]* S2 M   printk("temp=%x\n",temp);# D$ _5 G' ], F# N5 Q! |9 Q
  udelay(100);  ~  p4 z# M9 G2 u+ J! l: C
  //SPCR Register# I0 g8 G6 L1 R/ B( Q
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 z3 Z& S7 [" N5 L+ @6 t; D% C
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
/ E: R' ^* d; i  W. Y/ n  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
7 }3 J7 k; i1 w. q4 @  temp = readl(IO_ADDRESS(SPCR_ADDR));: {. w9 l$ G' D! s$ f
  printk("temp=%x\n",temp);
! N! ?! |3 K" o4 y  udelay(100);
- U2 y4 }3 ?; ]% i
. A: d! R: ~  K0 |0 y' a3 T+ h  //set GPIO direction
3 O8 k8 w( y' o" L3 Q7 x1 F   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- w) R/ ?" u1 N; c3 h% f
   temp = temp | 0x00000100;//EPR----input
; W% B6 g( [1 N7 P0 j! Z8 l   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( J. S/ k/ @. r) T. }; q" J   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
7 j: W* `  Q$ p+ u
3 \! W$ Y/ {( T7 W/ |3 P$ F6 l   return 0;
  x6 `- ?! z) Y$ C% \! z}
2 k9 I/ `7 G! N# z# w  sstatic void __exit MCBSP_exit(void)9 M$ z. a1 y$ `/ b0 t" g
{
2 b3 O% k1 j& |  Z% I5 L" R   printk("mcbsp chrdev exit!\n");/ U( a1 I! ?! `# ~7 V, E
   cdev_del(mcbsp_cdev);
9 V* |* R" ?7 ?9 S9 \" A& ~' {   unregister_chrdev_region(mcbsp_dev,count);% a* w* Y% t6 d/ ~# Q$ j4 Q, [
   device_destroy(mcbsp_class,mcbsp_dev);' `2 U7 I. v$ r0 Q* o
   class_destroy(mcbsp_class);6 ~) F9 C" |- Z* f4 q' A
}. _  B" v; c4 g- u0 q
module_init(MCBSP_init);
; o  m( D6 E+ \module_exit(MCBSP_exit);
2 n2 X/ \  C2 }- I& W+ x( q2 O3 i" T. D/ A; W
MODULE_LICENSE("GPL");
) U/ k8 U2 C, F) K9 |, n3 I/ l" ~
3 K0 a4 E" `7 f. g4 }( r我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 ?( m5 V4 x9 h1 U* ~* U% r
我的应用层的测试程序如下8 i6 W6 {* V2 {  o
#include <stdio.h>
+ e' J3 N+ o2 G: x4 j#include <string.h>
5 u: A4 _3 s' q% S9 M#include <fcntl.h>
1 H/ X0 m5 F5 W5 t6 p# s#include <unistd.h>
% c: i6 y9 p) V#include <signal.h>8 I( f( A/ u- J0 I
#include <pthread.h>       //线程  b- t. t9 f1 Z  }# W
#include <stdlib.h>
" H, [  I" L% H#include <pcap.h>          //捕获网口数据
" P  X" M1 Z+ @% g) v% S#include <semaphore.h>     //信号
, g+ c$ g$ _9 B. \+ @+ g#include <sys/types.h>     //消息对列
; Z  ?! ]8 v6 g: ]! c, C#include <sys/ipc.h>       //消息队列
7 |. V" w% n% a9 t) a#include <sys/msg.h>       //消息队列2 j  \; I, k$ z& x
#include <sys/select.h>; q! t% Q2 B# ^% |0 g. O
#include <sys/syscall.h>
7 A7 ]2 L4 Z7 Y7 E& ~0 @; `#include <sys/stat.h>
+ ~* I1 J8 K4 \' d, S  P0 x+ ^) b( f5 @#include <sys/mman.h>
3 S+ y! z. k/ u! {#define msleep(x) usleep(1000*x)
  \' s2 M! Z6 m7 {9 q5 Y( @& ?
/ \9 ^2 u* v8 G" A. `, v( t3 d; Gint main()
  v7 P/ B- J* V{ ; }( m- @5 d6 x: Q1 W9 c
    //MCBSP,ARM与AMBE2000交互设备
5 J- k" e1 c6 m4 x int fd;
6 f( l; g( ?6 j# p' {3 j4 L unsigned short data_write = 0x5555;
0 j7 D; g9 K: Q1 }. w) m8 v& _6 c9 a unsigned short data_read = 0x00;/ `& [/ j! b1 b3 B$ n
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
' J- G6 L* J8 s* n* S8 F4 Q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 d$ o8 @1 z& z+ m* G
    ' i) ~& X! {) V4 b5 a3 U
  if(fd < 0)
2 ~6 U" E0 p7 N% L  {
' R* K$ a: H3 J; Q, h     perror("open failed\n");
5 n0 E8 ^* ?7 p+ P     return -1;( \7 {& E* p$ w7 h# T
  }( K/ [* V5 `1 |* h3 i
  5 X2 [3 T$ ?3 ?5 v3 H/ @
  while(1)
) C; K- W  X9 }6 l5 x  {8 P: X3 {- o! Z3 _6 [
   
) m" r% ^; q6 o0 _   //AMBE2000每次读写是24个字为一帧
2 S# K; X+ z: h0 T/ M   //写数据时将数据在底层存储起来,等到中断的时候再发送
6 W7 ]" @  {- ^& m2 j   //AMBE2000输入数据是以0x13EC开头的
; _  }* F6 n- y3 e   write(fd,&data_write,sizeof(unsigned short));$ V7 _" G1 a% Z/ \! `
   ; h1 F, `4 y0 M0 O' i, q7 g' Q2 f
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  * @4 {/ k: w! j7 N5 w) E. c- W
   read(fd,&data_read,sizeof(unsigned short));2 _+ {5 C4 P/ p
   5 E, H. e% L/ ]* @! \" g
   if(data_read == 0x13Ec)
8 [- l8 H1 E3 V7 m6 _! v1 Q9 q) O   {9 T! g% F; N* X! M7 s
   4 p& `4 C0 J3 e# r4 i, l6 {
    printf("data_read = %x\n",data_read);
. b6 a$ e" }: @; l; A9 d   }
9 |5 ]6 R/ Y# k9 b+ `3 A; u2 u. b   9 F& ^# s+ ~! G( U
   msleep(10);
" u/ F# `2 }  T2 Y0 q4 l8 S  
4 t. V$ i& J; l" V- g% O  /*
+ R$ f' `: W; z! U, D3 J   ioctl(fd,1);   
; k* b0 v% I0 K sleep(1);- a; K9 q$ G3 |7 Y, L$ p
ioctl(fd,0);
) c& U& _5 }  G+ K. v" H; o3 C sleep(1);
# j+ }/ ~8 j2 k) Q) i  N0 _ */ 9 r. D- @  w! A, d$ w
  }   
6 h& L. {( u0 @$ s4 Y8 J5 f return 0;0 J* R7 }) u1 D2 ?5 B* B

7 o+ d% e5 ^& C, l}& X  r9 m8 y" _2 q) r4 a
" h1 i- \7 e/ _8 m
多谢各位指教,谢谢! 急' ~* Z1 ]* W% ]: }. s

# p; Y9 @4 r) T/ ~0 \! ^0 h$ p2 f7 N$ h# p. ^- }5 @2 e, f
8 L0 v% T8 m. r
" ?, p2 A" p5 N% i2 [" e$ y
( M* m( ]6 y6 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 02:19 , Processed in 0.047671 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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