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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
1 d  j, T2 ]  H/*
% B- u8 T+ @7 w, |: C1 {6 a, c * Copyright (C) 2009 Texas Instruments Inc# W9 l: B  \* |- c  t2 {3 j
*/ \) @) X7 G' t7 V% N
* This program is free software; you can redistribute it and/or modify
& u- ~; a9 s( B% z, K * it under the terms of the GNU General Public License as published by! V, ^+ d! @# w1 i  C2 n
* the Free Software Foundation; either version 2 of the License, or& u$ \/ k% p. q0 g: t4 \# @' O" }3 B
* (at your option)any later version.
/ w0 V& _, X, b5 Q/ N  V *+ M. _1 j! t3 t2 B
* This program is distributed in the hope that it will be useful,
6 D7 W+ ]9 K( p7 [ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 U7 }0 [! |: ~5 l. r& q$ Z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 ^. {- ]3 ~* ?! W0 m% A
* GNU General Public License for more details.7 v5 x0 A* w# u7 p# Q. z3 h
*% |/ l& p, y- G- Z' Q7 }; W' T0 G$ {
* You should have received a copy of the GNU General Public License
  Q  B5 w  r( c! D, ~" _8 \ * along with this program; if not, write to the Free Software6 d- ~3 u" E0 e  Y; m
* Foundati) ^0 H5 I! K+ n7 m; Y1 b
*/
: t2 e3 g! V" t! N5 B#include <linux/module.h>
0 Y5 f4 u. V6 a& p( j& z: h2 V: r#include <linux/init.h>) ^( b' Q5 R- v7 p
#include <linux/errno.h>5 @; {( B: D% {5 s/ q4 Z0 M
#include <linux/types.h>
- c4 y3 S3 l5 ^7 D( f#include <linux/interrupt.h>
+ y, c! m' n3 R/ a7 P# S#include <linux/io.h>8 N5 a) W$ N: }* T$ |$ n, ]
#include <linux/sysctl.h>6 _* x* o0 m8 S( X" m0 h2 V0 N
#include <linux/mm.h>
/ m' E+ W/ I9 @& P8 i0 x#include <linux/delay.h>8 N1 w( I2 O: T& ^" g9 U: |
#include<linux/kernel.h>  R  q3 q) N- h8 F# D
#include<linux/fs.h>1 v3 i+ g. G8 }7 }4 r
#include<linux/ioctl.h>
: I- b& C! `$ g, G& S1 a#include<linux/cdev.h>$ {7 Z7 k7 E( ^' h
#include<linux/kdev_t.h>
3 C( w, j  L# A+ e% m#include<linux/gpio.h>
* p7 T5 |0 \1 S: U' X#include <mach/hardware.h>6 _5 D1 [( H- @& O, b, w
#include <mach/irqs.h>) {! v; `& [  O' w

% i: n0 l* N* v$ a# o6 R+ Y#include <asm/mach-types.h>
7 d. X( i2 Z9 H0 B# u#include <asm/mach/arch.h>' J4 X. a6 {' ~: @$ v: }( W+ M! d
#include <mach/da8xx.h>% |5 S* @3 h; i$ a8 S0 ^9 `
#define  SYSCFG_BASE   0x01c14000' H; I# _) L% {! L5 S
#define  PINMUX1_OFFSET   0x124
3 p9 j, {3 [* T) Y2 }0 E, f#define  PINMUX18_OFFSET  0x168 7 D: ~" F/ e1 w' W  I
#define  PINMUX19_OFFSET  0x16c
# ^: J. U4 M4 L% V. X0 `#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
  f4 \* \4 s9 w+ i  U#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
- @. `7 _: ~, {: `4 M, Y2 `#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR. B  [8 e: w9 f. @. x
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
2 x6 }- g8 ?9 C, Z2 M) n, c8 Y#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
) `8 I, Z. a2 ~" w1 d                           
* U) J7 l! u. k$ J2 M2 D; s/ R6 V' A#define DXR_ADDR      0x01D11004  //MCBSP1_DXR( N) P+ ^* K, H3 Z) ^7 i
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR: [0 x# M+ o5 c% o0 t# y# {& G
//PSC4 {7 [* k- M  A
#define  PTCMD_ADDR   0x01E27120  4 G- Q! m# M: m) ?( `
#define  MDCTL15_ADDR 0x01E27A3C) }; }/ U2 l% L& A/ ^9 y: W( |  i
#define  PDCTL1_ADDR  0x01E27304$ `2 S! Q0 q2 d$ G& B1 B4 L
//GPIO8 direction
4 n. |$ I) K) |' c( y7 j  s( W7 j7 k#define GPIO8_DIRECT  0x01E260B06 Q% s0 C( s( l
#define GPIO8_OUT     0x01E260B4
% q+ z, t% x. N# g2 H# m+ K#define GPIO8_IN     0x01E260C0
+ l# A+ {. Z9 ?& c
! `" s$ L( r. ?/ k! R: V- z//#define MCBSP1_RINT    99                [7 _( l5 T3 H: S4 f- z. s# ?
//#define MCBSP1_XINT    100  
/ T: \8 t# _1 m; M( M' }/ q6 Hstatic int MCBSP_MAJOR=239;: f! ~4 H6 h9 A. f1 h* q5 a7 ]3 `
static int MCBSP_MINOR=0;
" m9 e2 Y! j; Z# y2 x( G% l7 Ostatic int count =1;0 l, d7 i) i% ]

, V$ o+ _+ p, n7 f& x  z8 H, K#define MCBSP_NAME  "MCBSP-device"/ c& i4 l: ]: z1 k& U1 P1 S( \! M4 F
: ^$ }; X# R4 Y
static struct cdev *mcbsp_cdev;
2 x: f7 }7 L4 y( u* Gstatic struct class *mcbsp_class;5 q* B4 [1 y3 ]
static dev_t mcbsp_dev;$ l- V& ~6 e3 n% X5 _
unsigned int DRR_data;
6 J( p* K7 v3 m2 G" t7 d$ Vunsigned int DXR_data;/ s2 b# x. o0 X/ e1 K
static int mcbsp_open(struct inode *inode,struct file *file)
, ^8 I. v! G# K9 G% V{; f8 M6 p5 X2 S% ^
   1 q) y/ o& Z5 ]- c
   //interrupt enable,initialized% D8 v% s. X0 }/ A+ E1 x
   unsigned int temp;9 Z$ n) T, ?" h; }
   //SLEEP_EN(GPIO8[10])---0/ a- F4 {* ?5 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# k" e1 ]$ @: h   temp=temp&(~0x00000400);
0 h3 F& K) x& B$ D' h; U$ q# o/ f% o. d   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( p& z6 f1 v+ I, W- a
  //RESETn(GPIO8[8])----0----18 Y: ~  c0 d1 E6 H
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 z' I+ Q- y, y
   temp=temp&(~0x00000100);  F+ c' j/ I# D0 O' l& K1 G/ ]2 Q/ _
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 u8 ?/ l' m% @8 w% q   udelay(100);# z) P. M: L! v  o) G+ ^9 _6 u
   temp=temp| 0x00000100;- S8 }+ O5 v$ @9 `) |/ x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 P( G- L8 p: m. e/ Q7 e   udelay(100);- U6 w# }5 t6 c: z
   printk("open success!\n");3 v6 G+ S9 c$ J) S$ Y& W
   return 0;. i2 z5 ~4 T' {8 ]: H) z4 @9 n
}
  ?" A7 W( X0 s+ W- k/ [) h. t% y% U- _
static int mcbsp_release(struct inode *inode,struct file *file)8 Q+ W9 o8 t$ g" G$ Y
{" G$ m) Z4 z. p& h: {- [# a* {8 T
   printk("release success!\n");/ }8 \6 ^& m2 D$ h8 P2 P
   return 0;8 r6 v" [8 F- q) f8 i7 }+ S
}& \6 d" {  }* W# {/ }

4 L, T5 C/ Y/ C9 ]static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 G1 R3 D: I5 e3 h
{
# {+ Z) T3 ?* }: K3 U3 P% C0 [    copy_from_user(&DXR_data,buf,len);
. F( S0 {- t# `0 d) [    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       & D, a/ o/ w6 q& m( g5 {) s
    return 0;
( d+ `$ K$ N3 j$ ?5 k" O3 V3 R! ^2 U 9 A6 a; V9 M  R, Z* ^5 K
}
0 j) p2 L6 L) K$ D. ~; ?8 n
; e5 d! U  t/ ]0 Pstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
/ X. B7 x, H( E% _5 L0 q+ k" {/ J* D6 b. C{
( [" m# b& A( q- b   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
( }" x2 Q) Q1 j7 c8 r5 P   copy_to_user(buf,&DRR_data,len);
( F& }- g3 C/ k! Y   return 0;
9 e7 E' T1 v6 v+ }}8 `, n" a4 @! D* \9 l0 e; `0 x

/ a  l! p- I8 }' d9 O3 z; l3 b
4 _# C! F& e( n; ustatic struct  file_operations mcbsp_fops=0 d2 q# Z# b+ Z- J4 h/ x. ~
{
% P1 B* f# |' T' U& _   .owner=THIS_MODULE,
9 M$ E6 K% A, c5 H) Y8 n# P   .open=mcbsp_open,3 }) y; X- n3 T. k
   .release=mcbsp_release,# I2 [+ R+ d3 Q2 r
   .write=mcbsp_write,
: G  I4 H3 d' ^1 w8 [& @   .read=mcbsp_read,
2 Z$ @. b, s" q5 U8 y% b- k2 G};
8 Q2 j9 |) Z0 b* q( s8 [8 Estatic int __init MCBSP_init(void)" [) _# o: B. f
{  Z' }* d5 }5 f0 W7 Q" d* D3 `
   int ret;. I! b* r: C+ C( U" \
   unsigned  int   PINMUX1_REG_old;6 z$ v- i& A# F; g! e9 A0 I9 [
   unsigned  int   PINMUX18_REG_old;# g  R5 T+ V- b
   unsigned  int   PINMUX19_REG_old;0 Q. Q1 q; k& Y0 }' }
   unsigned  int   temp;  
  l% e: z! L$ }" I  V5 {$ R   if(MCBSP_MAJOR), u9 m6 X2 X+ Q  l; G! i
   {7 |$ E5 c7 n9 }' L1 @2 N
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 |6 V  @& ~1 H& U& H
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 Z$ I% e5 W! B3 }1 t   }
# Y2 R9 E+ X) n5 c9 o2 F   else
5 J' ?/ v8 }$ J, Q$ V   {
# I$ f5 n' C- m: w) X4 s& ?      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. A) H# [5 s5 r9 p      MCBSP_MAJOR=MAJOR(mcbsp_dev);4 n/ Y* ?/ y0 q% g6 b% Y* t
   }5 l7 J! C2 ^+ }2 a8 s9 T5 e
     I* t  c* T$ e* u8 c- y. ?# I
   if(ret<0)* @+ s! Z% J$ \  R" L
   {( P  k3 \7 }* i
      printk(KERN_ERR "register chrdev fail!");8 b0 q4 w1 e  K5 A9 v! F
      return -1;
4 e9 C2 f8 ]/ d3 R" b' [! `   }
( @6 x+ Y+ p+ X; j; n( m   ' i! f: `3 j7 H) A
   mcbsp_cdev=cdev_alloc();; q6 s# k9 p9 F: |
   - D' q+ o+ _; S- d; v
   if(mcbsp_cdev!=NULL)- x) \& y# |( l' v  |
   {
: x+ G  d* f" W. M4 p: G, Q      cdev_init(mcbsp_cdev,&mcbsp_fops);; V7 x, K/ Q( J' O" `9 U& u! U
      mcbsp_cdev->ops=&mcbsp_fops;% Z( D6 Q- m8 f5 y
      mcbsp_cdev->owner=THIS_MODULE;
5 K, x5 t: H  H# i      1 I  Q- _4 X0 \! v
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))- k( B3 P( ~7 {0 {' u
          printk(KERN_ERR "register cdev fail!");9 c' P" t& G- }( W2 W5 P- T) A5 i1 }
      else
4 D; x$ o9 x# M& d. t: U& s: H          printk(KERN_ERR "register success!\n");- `5 n0 s1 d# ]0 Q
   }# m9 h% x9 D  r) d, M
   else
5 w0 U& X8 m: G6 j4 o0 [   {
7 p, S! _% r* Z! C  a& z      printk(KERN_ERR "register cdev err!");
7 r. m) z) r' N2 |      return -1;
& E/ T4 [, ~' w& m# m2 g5 i   }+ o0 h# w) H; z
   
' \8 E8 }; w( j* `  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
' r0 _* j' }% |   if(IS_ERR(mcbsp_class))# {; D, w2 Q. m+ v9 Y; o
   {6 X( d) s9 U) B9 x: v& }0 Q
      printk(KERN_ERR "register class err!");) S2 L5 w; A! l* h
   return -1;" s8 ]/ @1 y! ^2 o' U
   }0 {/ \, ~1 I6 m* e
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( D% b: U4 C0 t* {& t- a

3 T8 A$ g- w  N   //PSC# j9 w- D+ y  `5 s4 I
   //add Enable MCBSP
4 B, w3 e4 i# _- c   //test
  V! @: M8 r+ t8 A, A   temp = 0x80000003;1 h. z* E; y0 c# B
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));& U+ _- p' |0 W; ~5 _
   temp = 0x00000003;
: l2 x+ n+ Z5 V$ o   writel(temp, IO_ADDRESS(PTCMD_ADDR));
  P7 @. j* }4 V- D  Z. p! \5 e) e0 e
2 n; Q& Y4 J7 Q1 K- C# Q   temp = 0x001FF201;
. m: C2 z7 F# W$ h4 ?8 W7 R3 Y   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# b" X* Z7 [% k- k# x
   
' T1 U/ }! ^, B. j, H   //PINMUX  
; z, A" P8 M1 f3 u& a; q6 @, J" x   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
9 H+ H3 _3 D  w9 }9 H   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  8 y9 B- L. A& N$ X3 m0 q! \
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
. p- V6 Z/ c: T' w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; {- W) u% v! w$ `3 d, K, O   
/ P. |0 A+ ^: I- D* [; L$ }3 K   //SLEEP_EN,EPR,L138_SHK1,L138_RC- T% |; w  c/ ^% A+ s) ?+ \! c7 C
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
0 W; F, x2 T0 a; V* h$ t   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
% K" X3 a/ {: p. M  n+ l& x+ a5 I, H   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" B3 X. E# Y3 ^

/ |& q* E$ `: k1 |' Z8 D   //RESETn,L138_SHK2+ l, [1 R  _6 A3 ^+ o& s
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ( R! o% J; q9 z) f. s
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
* J4 l* d( Z( k: U) X; V6 e& M$ e   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& L# h( P( U3 P/ h, C8 ]! N

! y  g% k7 y1 t
4 x; l7 ^* J; t  //SPCR Register
  h. V' O0 Y2 F8 b' Z  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ p6 T( ~8 y' V, @. N& ~5 ?
  temp = 0x03000000;//(DLB=0)
1 ~% P) V! a3 {, h# X  n0 O // temp = 0x03008000;//(DLB=1)+ m8 y! M8 j+ ]4 ?' u$ R) {1 d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset- p% i; o4 Z0 A7 u2 S9 ~, h
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, i% V' b! E6 o1 }  n( a3 p# f  printk("temp=%x\n",temp);, i- H8 {& g4 b  |' ?0 [4 n
  m1 I3 f& L  n% K* u2 q4 `
   //PCR Register
, u" c+ W. A1 y   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-06 P5 V* `& a$ k- P1 k3 ~* G
  // temp = 0x00000F0F;) B" S. h9 R$ v) A8 d3 D
  temp = 0x00000B0F;5 b5 t6 F% n8 e  }5 B5 v9 k5 g6 H
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
/ z' T6 }+ Q3 p. F% I/ w  temp = readl(IO_ADDRESS(PCR_ADDR));
- q9 n- H% {/ o" ^  printk("temp=%x\n",temp);  ) p! M7 |8 l) g8 x3 n" T8 B
   //SRGR Register
6 d! W8 C1 p- q2 u$ j   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% y7 G! }0 y2 |) j6 Y //temp = 0x301F000B;
4 g( n5 c/ B6 T4 x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized & W  L5 ?% C- e( b) ~
  temp = readl(IO_ADDRESS(SRGR_ADDR));( h/ H3 _4 \1 ~! K% M
  printk("temp=%x\n",temp);9 e/ M5 S3 j2 ?& Z& ]
   //RCR
. [* B# w; Y1 ]2 I4 M# @7 l   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* K" D# t5 D, {! t   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0# Z8 g! G' d. x( o3 s
   temp = 0x00440040;
: M- p; m# c& p3 [' P# W   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
; J! G, S4 Q4 [& P1 m2 F7 r" W   temp = readl(IO_ADDRESS(RCR_ADDR));
! X' }# W4 z9 ?/ i   printk("temp=%x\n",temp);8 y: k* x. W4 i# E. _
   //XCR* Z2 u1 }3 p% r+ v) n
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% `: A& p; R$ B% x! A7 q1 i
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 M6 ^4 ~% v+ m! N. {2 c; A1 O   temp = 0x00440040;
7 d( o! P' n8 I+ N) _. C/ d   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# q# \% ]+ L( V0 T, d$ R   temp = readl(IO_ADDRESS(XCR_ADDR));! F9 V( H# N7 j
   printk("temp=%x\n",temp);
! s$ P8 o/ f) o8 v7 L' I  udelay(100);  q1 ?0 y5 P- Q: d; N
  //SPCR Register& U1 l2 [" W( ]8 i- i
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1  h$ H9 Y) g1 `8 S# E8 e- e
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1$ y0 J. T& z2 t2 \! _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled6 ^) h7 S9 M3 \5 A. h
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 Y( f; p9 p  K) O  p  r. L+ W
  printk("temp=%x\n",temp);
4 o" }! Q+ ?) b  udelay(100);
; B2 E: ~. c- x8 w1 x9 W8 I
0 r9 l0 v& ^5 z  //set GPIO direction2 J1 d4 P6 R& O
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# x, l6 t- p/ Z" |; o" K7 T   temp = temp | 0x00000100;//EPR----input# m  E. j( @! p! ~8 b: G. k2 e" ^
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" _; x& E: z  E/ l
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 S, R/ h9 ^5 N: ]' `& f. s0 Y' W 4 H% i8 p  C5 z9 |5 ]
   return 0;+ W! o1 g# B$ J, N
}% X. J, Y. P( d, v- P* A; ~. J# G
static void __exit MCBSP_exit(void): ~/ p' Q1 b, g0 [  f/ O
{
* D! M: j! M' ^; v2 G   printk("mcbsp chrdev exit!\n");0 t3 D  ~% n: S6 D8 v. ?! Z+ x5 R% n
   cdev_del(mcbsp_cdev);. m! X% l3 a7 I+ y: d
   unregister_chrdev_region(mcbsp_dev,count);4 h& ^, @; ^% v- m/ i& y4 _  s
   device_destroy(mcbsp_class,mcbsp_dev);- b8 {1 e) z& g% V) _6 D0 `$ w
   class_destroy(mcbsp_class);/ Q' l  e6 v4 R0 i2 T: G: F
}
- c' x3 [0 ?" Imodule_init(MCBSP_init);
/ X4 `! i6 ^; }) s, I" \( {module_exit(MCBSP_exit);7 t) w6 E% @1 X* p$ [
  @5 i% C1 \9 _, e4 r. r9 \
MODULE_LICENSE("GPL");6 ~5 I' T* u" W
1 I2 s5 x' x/ I2 r5 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
+ Q5 F$ P: n4 ~& G: B我的应用层的测试程序如下
( M1 j3 j# ^' n6 i3 H" f4 r#include <stdio.h>
# x$ I! N0 [% K0 v- a0 l7 p+ W#include <string.h>) d3 m( ~5 c) C, v& X: d$ x1 ]
#include <fcntl.h>
  a& g" N) G9 N#include <unistd.h>8 W8 n: V9 [$ p' D$ a/ p' t+ g
#include <signal.h>
6 y* H+ A- b1 s1 c5 B#include <pthread.h>       //线程9 q: K0 J* s" `* s6 p
#include <stdlib.h>
! t( C1 @9 S' p. h8 p& I# c" ^8 f#include <pcap.h>          //捕获网口数据
' x" Y8 }; W! K9 A/ Y/ |9 @#include <semaphore.h>     //信号
$ I; _) y- r' L2 P6 e* x5 D1 y#include <sys/types.h>     //消息对列
7 u) B" p: m9 w% Q) o#include <sys/ipc.h>       //消息队列
0 L( J. T+ \4 U#include <sys/msg.h>       //消息队列
2 a$ c# Z% a( W* e- q#include <sys/select.h>: l) W" ]; r! g* |4 F8 u
#include <sys/syscall.h>7 P. v0 g7 p; B; G2 D6 e
#include <sys/stat.h>
8 k9 g: C+ n8 I7 D0 r#include <sys/mman.h>
* |. p* z3 ^' ]$ h5 A( V1 t7 k#define msleep(x) usleep(1000*x)2 e! S9 r7 W3 t( S' G: e( N- ]2 \
! H, {% s2 x: X& \8 T# I
int main()
" Y. y9 ?" `) }: n0 s2 C# j{
2 G* e" F8 c8 L- ~2 {    //MCBSP,ARM与AMBE2000交互设备
% y& @, Z: r: g/ N1 n int fd;5 B! S) j( h" T! J; j
unsigned short data_write = 0x5555;
3 ^5 i8 \7 c8 n  X! q unsigned short data_read = 0x00;
1 v$ i- ]/ y/ P5 ]3 K  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, r- f4 a9 b- v4 t6 B( ~ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 `- J) U$ \; T! X( H. j# i   
/ \4 b5 N# H2 G2 \3 X3 P6 I  if(fd < 0)- f- _! l9 R7 |# y  x9 r( a
  {
+ j2 Q) N2 T8 E6 G9 H  Z0 X+ r     perror("open failed\n");: T. f4 X: u# Q/ M- C6 n2 e* c+ Y
     return -1;2 y7 l+ Q- l: n2 }1 {; J8 W
  }
' O/ B, O/ q# d0 x) Z, p  
$ _7 D& U% e) z& a  while(1)7 m' ~. g6 e+ b8 Z! J5 `. _( s
  {
# F' G0 n! m, ?$ c: ~   
' a6 m6 `' d, D! _- L# k8 g9 R% N   //AMBE2000每次读写是24个字为一帧
( M7 Y/ `) W, K  _0 j   //写数据时将数据在底层存储起来,等到中断的时候再发送
/ ^& E( o) I/ L2 x   //AMBE2000输入数据是以0x13EC开头的
& ]& X& w: i) p5 a- @   write(fd,&data_write,sizeof(unsigned short));. u) \7 i7 Q3 [! \
     S: S9 X. M! Q3 R5 P
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
3 k5 l, C# e# x( P   read(fd,&data_read,sizeof(unsigned short));
0 s# l3 W8 A+ i/ G6 u5 ~1 K4 F   ! ~. O- R: M; @! q8 ?- `+ `
   if(data_read == 0x13Ec)1 |4 m# H; s; x; W; F; ?  u
   {
1 i8 q* l  D5 O* _& G  H' T   
4 g+ @8 K# C1 [; y    printf("data_read = %x\n",data_read);
7 J* G+ L5 M; n# N- U* G   }
) N% Y/ K' w. A1 W3 F   
' Z% |# \; k# ~- \" x   msleep(10);
7 J) t" ~. W( Z+ E  
+ I' a2 d+ v- g' n  /*6 u4 L) d+ }' D) _
   ioctl(fd,1);   * q9 u! Q+ r7 h6 y* [* F/ S
sleep(1);
, v8 B4 d( K$ P2 r2 P+ ?# A ioctl(fd,0);0 Y" z6 |+ J+ q$ S4 V9 j
sleep(1);
7 G$ p& V8 S' n1 W */
# ]# O" ~/ V; [- g' [  }   
; a. b) ~9 u  B% u" ^, w return 0;
% r* `1 u( M' N4 W; W
" V. f4 R5 v9 s! l/ @+ m- l: k}+ ?: p9 l4 Q0 S- g7 D8 S' d# b& k

+ @' X5 O4 A7 I1 p3 W多谢各位指教,谢谢! 急
  M( {% [& M: |( x& D. |- p; r6 k
8 ]# ^6 y* M8 q- h, }

( v( `- u( p+ L! H5 |
9 p% N& ~. \! s* `. M: U) ^4 d" E6 O" Y- z+ M- k3 x( i. h. ?8 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 02:49 , Processed in 0.047985 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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