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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
7 O# g0 C! x! [4 N3 v/*0 g! b# Q; O: R. t- D6 M
* Copyright (C) 2009 Texas Instruments Inc
1 U# {. I8 y0 X  s* p *
4 j% F# z+ c# K6 N! j* R * This program is free software; you can redistribute it and/or modify- X/ d0 O9 C6 n0 ^9 j# n) J
* it under the terms of the GNU General Public License as published by$ C8 J7 n& I) W0 e* X1 P! ]7 [
* the Free Software Foundation; either version 2 of the License, or' T4 D2 J$ a1 W" q* I/ Q
* (at your option)any later version.
( p& b: w& g' @* O *) U6 m2 X- w" P
* This program is distributed in the hope that it will be useful,
4 ~. N( {# H7 [) @1 f * but WITHOUT ANY WARRANTY; without even the implied warranty of6 d. m; O# z. a' [) B" ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 ^$ ~( ?# l- B3 L1 }
* GNU General Public License for more details.. {  U4 x9 `# [# F$ @* F
*$ S) g, X5 Z9 _0 f
* You should have received a copy of the GNU General Public License
7 H, h! T" L+ y$ q; M: S * along with this program; if not, write to the Free Software4 U# Y8 J3 T  Z" k; A( Q
* Foundati
# `" \+ J5 |" }7 \" t*/
7 ]+ y4 v! U8 j( o- T#include <linux/module.h># X0 ~" T/ o7 o/ Y1 E
#include <linux/init.h>7 ~, ~+ [5 _6 ]: t
#include <linux/errno.h>
2 E/ a+ y0 b, i( C( d#include <linux/types.h>
. @5 r6 j# q' w8 p1 o7 ]#include <linux/interrupt.h>" i' m% p% l" x6 d
#include <linux/io.h>
: K  a! o* [1 T% z  L/ n  ~#include <linux/sysctl.h>
* M* _, @# S/ F: J, z* v#include <linux/mm.h>
4 n6 {7 j, j* [& T' m#include <linux/delay.h>
5 A$ z5 Y+ d6 K8 Y+ E#include<linux/kernel.h>
  I) e. v# m9 R7 i( `% f: m#include<linux/fs.h>" o/ m. }( X. u8 Z! M
#include<linux/ioctl.h>
3 p) Z8 C5 ?$ }1 {6 ?#include<linux/cdev.h>
1 R: K8 u) O- i#include<linux/kdev_t.h>7 |, S$ u. X; Z; }1 j/ O
#include<linux/gpio.h>2 L$ }- Z9 V9 E3 X1 c" E; g
#include <mach/hardware.h>, S8 p, c- \- W% v+ D
#include <mach/irqs.h>- O, y3 r6 n' o, V6 w8 F: z7 C
4 f8 W1 P/ f/ M3 O5 d! N' j- [
#include <asm/mach-types.h>
3 `1 E; A- Z  p/ z#include <asm/mach/arch.h>
2 Z& [% r! O- }; \# H. u4 J#include <mach/da8xx.h>) L& t- V! E; Q2 d. V
#define  SYSCFG_BASE   0x01c14000
" @, V" [8 h2 Q! ?- n#define  PINMUX1_OFFSET   0x124
# Y7 r9 c+ Q; X" f$ ]/ _#define  PINMUX18_OFFSET  0x168
7 d! B0 e/ g- b  I* e& \% E) Q#define  PINMUX19_OFFSET  0x16c# H+ h) r' K  k& P" p7 t, J
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
  d+ V0 }& w" [  h#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR* \/ d/ e# R  m/ z% e  e
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
5 i& y7 F/ k  A#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR8 v$ n1 l1 ^  X8 ~
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ {) c0 }/ z6 q( C" p
                           
/ p. ~7 [' N! w. D, O2 T#define DXR_ADDR      0x01D11004  //MCBSP1_DXR/ R3 E  X: i; e! b
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR+ W. t8 `5 {! a
//PSC" d7 w0 I. @7 W
#define  PTCMD_ADDR   0x01E27120  0 A* M+ z" N  N! f* \6 W
#define  MDCTL15_ADDR 0x01E27A3C4 f1 e+ z! j6 ?6 e
#define  PDCTL1_ADDR  0x01E27304
' _5 t/ b' q2 b! K  z$ q//GPIO8 direction
  Q$ h1 b/ |5 K' U% [# v9 y8 ?9 Y#define GPIO8_DIRECT  0x01E260B0* m) D5 u. Z6 i. I: W
#define GPIO8_OUT     0x01E260B4$ r+ Q2 D& w0 r+ q# D
#define GPIO8_IN     0x01E260C09 y9 P! G8 R8 c3 O# i) A; M5 i

  e) T. g3 N9 Z# W: ^1 z: ~2 a//#define MCBSP1_RINT    99              ' i; _+ D; H8 p5 c4 S, B
//#define MCBSP1_XINT    100  1 c- s$ F! J. C% M8 r! x$ Z" C5 n+ j
static int MCBSP_MAJOR=239;
9 l3 H0 q! ?+ y& m# v/ B# {; fstatic int MCBSP_MINOR=0;4 J5 A& v9 e! T1 E$ q0 k( A( Z$ P
static int count =1;2 ]) {; V% v3 H5 A! t

7 m5 H* c& U" O. x  s! F; p. |& ]; x#define MCBSP_NAME  "MCBSP-device"3 }! {* w$ d1 t( O' U6 a

( Q9 l4 m" i: f9 \static struct cdev *mcbsp_cdev;* S* }' y5 f" q2 D) U( r9 l& W) ?; u
static struct class *mcbsp_class;1 _' v3 E# g* s% V1 G
static dev_t mcbsp_dev;
% {* i3 N( u* r/ g$ t/ q  r& Eunsigned int DRR_data;% O& }* I1 O1 |" J
unsigned int DXR_data;
8 v; h% t  T2 n% B' }, G' A1 e+ Dstatic int mcbsp_open(struct inode *inode,struct file *file)
  t3 T' y9 r0 |/ @0 x) f{
6 B0 |+ k3 V' k4 z% O/ e   3 Y- E! _8 p: t4 c9 E
   //interrupt enable,initialized
1 p7 q% z  ?0 U6 |: P9 R5 B   unsigned int temp;
4 R  ^1 a0 B- J! a( o; k" @) T   //SLEEP_EN(GPIO8[10])---0
* W% @( N5 X; `% x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( B* n" A! A7 t5 T7 M   temp=temp&(~0x00000400);2 W7 q7 _- o. c& M4 i5 z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- w4 U( R' f1 C+ L8 o
  //RESETn(GPIO8[8])----0----1
4 P+ b4 B; c9 |' V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 G6 b, c' B0 b  r' h3 R   temp=temp&(~0x00000100);% x0 Z2 d9 L9 ^" J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# d: c' {- D) ]. i8 ]- B/ @   udelay(100);/ L! [$ E- R- K) i" H  ?% V
   temp=temp| 0x00000100;  y* o7 [$ v4 u4 |  B. W9 ~1 j
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1  e2 n7 C4 n/ F5 L$ B  o& t) q2 M
   udelay(100);7 j+ @( @3 {+ G
   printk("open success!\n");
: g! D* f% z$ r, q9 {  F   return 0;
. L9 N6 V1 @! X& M}: F$ r- ?1 E& a* f' z' {' q: w% g
! y0 q1 Q' z/ u/ }0 a
static int mcbsp_release(struct inode *inode,struct file *file)
; r, M2 Y/ _+ ^/ v2 @7 J{9 g1 B7 y; q$ U" R, B' w
   printk("release success!\n");: ?  D( e, `. L7 z$ u
   return 0;
+ h8 t5 t5 Z- E}- g1 J( K/ W4 \* n- S: u# I
& v$ b; _0 K% W# S' V" s& o
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 e6 i* k. H  W- v{! J" e: H) x$ S9 p
    copy_from_user(&DXR_data,buf,len);! [: H1 t  n6 n( Z
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
: F. l* s4 m& G+ O( B: w) s6 j    return 0;3 I% Q- w% }. |# {
% A* m: h# v: b8 w. a% {! [
}
  h; k9 Y. o" l, `, R
8 _9 D- x  u: L: @! i4 Z, estatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 T; V- @* i) }8 ~: J7 p
{
# a8 G( U% N; c( n   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));# F) s  R+ y+ n; I
   copy_to_user(buf,&DRR_data,len);
9 N0 D' Q; ]# A7 D5 ?7 ?7 G   return 0;+ j. N% J% C0 i7 S. m, {0 G2 U+ ?
}+ S9 P3 j: Q' f; Y' h  ^1 v

! L) d  f" O2 ^# T* s
9 {* \' @* R, N- n3 Q/ \8 N4 P: H+ rstatic struct  file_operations mcbsp_fops=1 C7 S4 ]% z/ Y0 v( L% x5 Q' n
{
! Z5 P( R, {6 Z* [   .owner=THIS_MODULE,
9 }8 U; u& |. B8 ?1 V6 v- _% b7 p   .open=mcbsp_open,
( ~; a. W0 v, O  M3 j   .release=mcbsp_release,, P6 y1 S, `  M# y7 x! t
   .write=mcbsp_write,7 `& T4 V! }8 R
   .read=mcbsp_read,
, N+ F$ M0 J2 Z' h. `" |$ r};9 M1 s8 p, D5 o
static int __init MCBSP_init(void)
6 g6 i' r& d3 r{2 U2 R, P0 i7 i/ W9 j$ c, W
   int ret;: K3 K% f3 z+ F( V% r6 X
   unsigned  int   PINMUX1_REG_old;% I6 p, i3 V" Y6 x! ]
   unsigned  int   PINMUX18_REG_old;8 H7 d8 Q& f8 R0 A8 e' Z- F! ^' ?# T
   unsigned  int   PINMUX19_REG_old;
4 h5 ]. p# u" `- y8 k3 q   unsigned  int   temp;  
7 b8 _6 j7 D; I& x8 K8 L! h* u   if(MCBSP_MAJOR)
. V! V3 |# T/ R8 F% p# H6 Y   {0 s. z+ P0 F, F+ ]) b
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 u$ i" M* c6 `7 X7 e* N      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' A% N; R' y6 e1 n' M- Y/ d/ t
   }, ^' @7 j: C0 x' [4 ]: D* O; T& I
   else# K1 Z' o5 j$ |/ d8 o* P& k# v  P
   {/ C% Y  e/ P1 ^2 m4 n8 J* d, Z2 V
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# g& Z; [2 X: p$ a5 }      MCBSP_MAJOR=MAJOR(mcbsp_dev);+ S$ F- j2 Z+ s7 Y" G/ l
   }
' J6 l; x) |7 a) j9 A. G9 `* e   
- k2 O) Z' {3 Z' {' _# F5 V   if(ret<0)
* U4 X+ y; L- r   {; y8 h5 h+ y7 P) r9 \" S: \3 S
      printk(KERN_ERR "register chrdev fail!");
) y6 o- K! ~" A' T0 j/ W      return -1;4 x; d( V4 H7 |0 Z" C/ c. ~: _8 U
   }
# j8 b# s+ ?! o  W   % G% H1 O: b6 [& S" Q4 B& t5 \
   mcbsp_cdev=cdev_alloc();
- ?& ~7 L8 q) U   
/ c1 j- z/ @' Y" i! q2 w4 u   if(mcbsp_cdev!=NULL)
8 j) J4 p$ Y" I: k5 |+ H+ C   {
9 H# f# K3 y" e2 p$ u- M9 z* }* s- G5 f; @      cdev_init(mcbsp_cdev,&mcbsp_fops);
' }- B! r( u  z0 ]6 P% x! M- F( F      mcbsp_cdev->ops=&mcbsp_fops;0 c( v' Y; k) n- K+ b* F
      mcbsp_cdev->owner=THIS_MODULE;! f( i' ?4 g7 K; r+ G3 E
      
0 E; K3 [3 S; N' t      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ K% X3 f% }5 `! `- L
          printk(KERN_ERR "register cdev fail!");& |& [6 s) ]8 }
      else# K4 k/ u% c' m: |- N* T% A8 t
          printk(KERN_ERR "register success!\n");8 q, ]% W$ [7 I9 ^8 P! S! N
   }
( ~4 t: i7 e* g$ D# _- [; Y4 P0 v   else& }  v( [1 Y6 A6 Q; A
   {7 T% z$ n2 R' z% c
      printk(KERN_ERR "register cdev err!");" E/ s1 U: T& w8 i' R4 c: o, b
      return -1;
: `9 V$ p% r7 o   }
7 ?0 J4 e' Q/ i) @   
4 r$ T4 d  ]6 l  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 V* |& u! \; I2 s) n2 U! U- F4 N   if(IS_ERR(mcbsp_class))" k6 f* ~. I5 R
   {! \% P% o/ J5 Y5 F
      printk(KERN_ERR "register class err!");
  p- m) _/ g) A0 }& }4 ]; v   return -1;6 z5 h  ?3 x$ i  |) R
   }
1 y, K6 }% r. x, i   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ k: y9 K$ p$ u7 N
" q0 H7 m3 M! F7 @2 v  \3 ?. u   //PSC
& K$ c5 k8 F* E+ |% O! B$ V+ ?( R   //add Enable MCBSP
, r# ~  W6 q; Q1 w; ~   //test  g6 K" [* ?( ^$ Y7 x
   temp = 0x80000003;
; e, `( r' y* h, H   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; V# B; c7 V- ~
   temp = 0x00000003;  @  y! E* k2 h. V
   writel(temp, IO_ADDRESS(PTCMD_ADDR));8 s- m* P6 J: W  }6 V! [9 n# O

; j. E# M2 X# S   temp = 0x001FF201;
6 F+ x* L$ r1 t7 i   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" h' y& \4 R5 E7 _/ Q4 D6 p* x
   
5 ]2 Q4 A1 T5 s" H& u3 u8 ~   //PINMUX    I" J0 [2 ]  E2 I9 n  \
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 s8 g: I0 a* o8 U5 c   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; X5 y. B; m5 S: w: Y# Z
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 |7 d) s0 [6 ?7 Y, ^' J6 U   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% g, S* a* |+ i   
5 s3 ~' ]" W1 }% ~  F* Z   //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 M- L$ G2 A% U4 N8 M   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
  j( m' N# _- y3 m' i, L& s& G   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 G' S1 F0 o9 G   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
  ~8 A% N; K1 C% g' Z8 i( f( I# s ! s' y. a# \: W4 l
   //RESETn,L138_SHK2
% S  T. `4 @/ X# Z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
, Z! `8 Q$ [2 w1 y$ ?7 c3 f- v   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
9 Y2 V/ T- L! Y  _3 {7 |% E   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; p) w3 v) t7 k2 A% u( a3 [

1 }; g: @5 T6 q6 T' h
  j6 x3 C" B/ F  L  //SPCR Register; P1 N/ l7 O/ b* m' v
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: \, t  u+ @7 ?7 \% K
  temp = 0x03000000;//(DLB=0)7 s& h8 ?# n& C/ m1 Y, y, X
// temp = 0x03008000;//(DLB=1)
+ e% \3 H% i- O% q% h8 }  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* F% m: L, E/ {1 a
  temp = readl(IO_ADDRESS(SPCR_ADDR));
5 l/ _$ P* a4 b- \7 W: b  printk("temp=%x\n",temp);
8 [/ z" {) l! k. {' N0 O9 B! Y+ Z( _8 u ; V3 j' y; @' j; C/ o
   //PCR Register
& j1 f) X. \1 s4 G) V" d/ R   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
$ K  {& C- X' v+ H3 H' P6 N7 N' u4 z  // temp = 0x00000F0F;" c" R$ f1 _8 S- @8 N
  temp = 0x00000B0F;
5 d" C" X7 |! Q9 f6 ^  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized - r9 m* [$ ?! [( I$ I) B& S
  temp = readl(IO_ADDRESS(PCR_ADDR));5 a# b" [: Z# i2 u. D
  printk("temp=%x\n",temp);  
7 @4 u- y- m4 {2 Y1 f2 s   //SRGR Register
9 J  N5 q2 ]4 `0 b/ {3 f; U   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 M! A0 F* v2 R$ z5 Z //temp = 0x301F000B;
; K( U; ^' d6 d( H   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized - o& `4 D, M6 W8 \8 p
  temp = readl(IO_ADDRESS(SRGR_ADDR));, t/ C3 y4 N7 ^  u) b" r/ n! d
  printk("temp=%x\n",temp);
& ~$ G6 _8 T8 P! }1 w* J" m   //RCR; U6 k/ }6 q: G8 k& A
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
) U% g5 o3 X& k8 Z- {9 ~4 d# ~   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0+ A$ {* B8 C! Y" O; z
   temp = 0x00440040;6 k/ r8 y  q0 H1 [: D
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   # h7 a" }" y( B9 _/ F7 h5 t
   temp = readl(IO_ADDRESS(RCR_ADDR));
( F" b& `4 X3 s# j   printk("temp=%x\n",temp);- C9 A; i0 j  C6 H
   //XCR# H6 I* o' Q( J$ g4 P
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" N) b+ ^' z" V8 B- Q, b- p) H
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) k/ a$ Z9 m( x# a: ?   temp = 0x00440040;9 J" ]0 p4 O4 i' l- ]9 S, m2 f
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
# W4 Q% |; c. ?& J3 k: a, x9 Y- j" w   temp = readl(IO_ADDRESS(XCR_ADDR));
' D8 e5 ]  B+ D' J   printk("temp=%x\n",temp);& i* [# p# ?$ q& z% {6 h. Q) }
  udelay(100);3 a2 F7 K$ x: b  Q7 x- y
  //SPCR Register) q1 u1 {$ @: Z& w8 D
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 V# S: g7 x2 G: @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( k! w1 f! |6 [  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. d2 v* x3 W' ^# v2 s
  temp = readl(IO_ADDRESS(SPCR_ADDR));4 t  _3 \; H% L+ F3 P
  printk("temp=%x\n",temp);$ F' A0 l3 W6 L2 i" H% i
  udelay(100);0 ~: |; y& @( B/ E  @# r
1 I* Z- z" k$ N6 W) n
  //set GPIO direction1 \1 A( g  V) \# M
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));  u: Q' U5 {- v% t# g
   temp = temp | 0x00000100;//EPR----input
3 k$ o- s1 x& {- p+ _2 ?1 p9 l( K   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 {% a8 ]( s0 v/ z4 x   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 ?/ c6 [$ d2 U" _  h6 N3 p3 g 2 x& j1 O$ R9 m7 H
   return 0;
- }" U& f6 }0 y& c& z$ r}+ O: l' c# A# m! \
static void __exit MCBSP_exit(void)8 B& C, Z" w, h5 H( e  d
{/ g3 Q4 j  P' O
   printk("mcbsp chrdev exit!\n");
. M/ B9 r# q( m4 f- b+ q  {0 u# r   cdev_del(mcbsp_cdev);
& h7 ~0 b. d3 q' L( H   unregister_chrdev_region(mcbsp_dev,count);- G8 e4 J) _7 F; n& R7 x& f1 }& ^
   device_destroy(mcbsp_class,mcbsp_dev);
* [5 i0 L8 r% A* C& `; ]   class_destroy(mcbsp_class);$ G: x" v& h. j2 }& x) ^
}( ~/ q' a3 d, B1 U2 K# v
module_init(MCBSP_init);
8 {/ X' Y( M0 O$ k4 Emodule_exit(MCBSP_exit);
8 t) c( K* L0 u+ |) a: m
8 r1 i* Q  T) pMODULE_LICENSE("GPL");4 C4 J  f+ m$ {& p* }2 K) W/ O

3 E" s. X3 G) ^4 }/ ~我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 l8 [6 E" m1 ]9 E2 D; Q4 C
我的应用层的测试程序如下, x; A3 z1 T' X1 M
#include <stdio.h>6 ?' `7 F: n! D, J2 C/ W: O! t
#include <string.h>% H" L' M7 b, F  H0 X
#include <fcntl.h>! z$ q9 j1 z( t0 C
#include <unistd.h>
, ?- ~2 r5 q4 W2 U7 d2 t#include <signal.h>
/ G# p! [4 k) E: f#include <pthread.h>       //线程
3 u6 q5 L1 S0 i" y5 p! w* F#include <stdlib.h>
. E3 k3 E; g0 a& ]- e' H7 v' j#include <pcap.h>          //捕获网口数据% i% X: K3 `# k
#include <semaphore.h>     //信号
6 B  P( i! M- H5 A- m$ a, x; G) T#include <sys/types.h>     //消息对列
% l- W7 k# Z1 H6 ~* j#include <sys/ipc.h>       //消息队列9 P5 }' r# m* y$ G0 ~
#include <sys/msg.h>       //消息队列
4 R( _  x: X# K6 y5 V7 n5 m8 ~#include <sys/select.h>
! Q5 N: m1 b2 q#include <sys/syscall.h>2 T$ s6 S! B3 ~+ k6 k6 X! |
#include <sys/stat.h>. r8 r5 S7 ~7 s0 W$ u. z
#include <sys/mman.h># g, s& [7 z+ A; X4 O$ M
#define msleep(x) usleep(1000*x)
& M9 K  u! Y* A+ ]; @2 K: Z- Z0 ?& z2 c) T( ?7 H! j/ f/ b
int main()4 n) F- A  L" m
{
( r7 _. `* n1 f    //MCBSP,ARM与AMBE2000交互设备, z/ C* s( ?0 L
int fd;
7 S+ T: g  C+ e" |" ?9 L unsigned short data_write = 0x5555;
3 [7 ]) }' H' d$ Q  a, U$ m unsigned short data_read = 0x00;
0 T1 d- u. D! C& E( u6 i0 Y  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! f$ s3 I% x5 {1 u: U  |$ P
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 X, M/ g  T) A2 K& M! M2 V( [
   
# S3 b  ~' l8 ~6 ]5 Z+ A' C% O. S  if(fd < 0)+ e0 d5 h  `9 o' A* Y6 Y' K
  {
! K! m% G- N% Y( T  Y) S. z& \     perror("open failed\n");
0 \$ r+ P; y  M$ ~     return -1;' R. y. R0 b, {' z: i; c4 N
  }/ t: P  u- l3 |0 c) K& U
  + [7 d# e# X$ U2 T
  while(1): k4 z" Q) L/ F3 w4 X
  {
9 m& t1 t, s% A2 B- ]$ c; e9 O   
3 Z$ D; ]4 r$ H! j" \! l0 I& e   //AMBE2000每次读写是24个字为一帧
" y* B5 B4 ^4 I( n7 a* K- x   //写数据时将数据在底层存储起来,等到中断的时候再发送! j. G' P( k- F- Q
   //AMBE2000输入数据是以0x13EC开头的3 Z6 x% F, M* y
   write(fd,&data_write,sizeof(unsigned short));
4 j8 E% ^; Y& I7 `/ T! z1 U9 e; n( [   
% I  C) s4 r+ x3 X2 M3 O# ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  8 B! W- A* A  p! ?9 O. @. ]1 y
   read(fd,&data_read,sizeof(unsigned short));
; @5 z! w; I& m) A0 N   
0 R# t' f0 Z! X# D5 R   if(data_read == 0x13Ec)! m% q* r5 J& n. _6 _
   {
% S( R6 W& K- m% m  o! L2 {* z- J   
* a% `9 E% L* `" u( T    printf("data_read = %x\n",data_read);, B5 L4 {& @3 J- A
   }# m" Z" W% B2 V
   
3 ?' l/ o3 A5 W6 \   msleep(10);9 U! W3 n9 [2 h( M
  
( o8 t: N* g' o6 R5 W* c  /*  X4 `4 j% e( R9 t" J
   ioctl(fd,1);   
* G( L  I. o' l7 Y, @3 \3 P' S sleep(1);
) |6 o% s+ T3 A' J ioctl(fd,0);
7 i5 _  ~& ^- ~  w! c4 D, [ sleep(1);
, g: J# f* m: ?7 r9 n6 C% f+ L5 D4 j */
$ g! o; _, D/ t  }   8 K  j2 N' N  M' S+ C0 ^: I- e
return 0;
) V5 H' y/ c" l
  Z' A) u4 Z+ G" v}
4 [0 \  m' z" ^; D+ f! l/ o2 k0 ~3 G
多谢各位指教,谢谢! 急
- C5 n8 j: I8 X5 p% R0 n2 O5 \3 ?" B! m# w) D, p. v
1 S' h% q2 G: x9 t0 ?
! V- D' D+ b! J! h+ m

5 U  \: i* C, ?6 c
: c9 Y+ p+ T! m3 E5 B# b* u" w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 05:42 , Processed in 0.048411 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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