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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . W# J; l' Z1 T/ J- e6 p2 {
/*
* L% J5 k  y; }5 P0 s! L/ u * Copyright (C) 2009 Texas Instruments Inc
, u0 K' v0 k0 y5 a6 q) L8 G *4 D. _6 _5 `& E( _+ ]$ W
* This program is free software; you can redistribute it and/or modify
3 E' Z! f4 W; C% @ * it under the terms of the GNU General Public License as published by
' k6 d8 T/ d" m. w" g * the Free Software Foundation; either version 2 of the License, or  S: |+ Y2 \2 j. @! @4 _- h7 g: n- ~
* (at your option)any later version.
, s. J! D0 V  {$ c2 |4 B- e *2 ?* t% u( o4 r8 H) c$ H! d
* This program is distributed in the hope that it will be useful,1 Y3 f, h' w: {6 l1 y
* but WITHOUT ANY WARRANTY; without even the implied warranty of, j; j: q9 m$ l  ^. h1 Y( x% g
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the. q% r5 ^0 g: J- R# |) n0 @
* GNU General Public License for more details.
& @1 d/ V! Q9 ~+ G- Q- U *) l5 G. z9 p! z4 ^: h
* You should have received a copy of the GNU General Public License, Y* }1 Z+ R" z+ t& @
* along with this program; if not, write to the Free Software
, D- V& z8 W3 g% l$ r+ d * Foundati
# G/ ~( Y. _/ r  R*/
" a1 Z/ E$ |$ v6 U5 l" P. F: \#include <linux/module.h>
' ]* s$ j+ a) P5 J6 K+ a% e: h4 L+ k#include <linux/init.h>
! M# T+ ^1 A, h& W: c% _( ^#include <linux/errno.h>) ]. X2 `2 R  o& A; E, T6 S
#include <linux/types.h>$ N+ l0 I3 D' C6 |, M
#include <linux/interrupt.h>
2 `+ N  F' l& C# R- f/ `! |#include <linux/io.h>) E  |. F5 O* _/ G5 \* g) q8 J- D
#include <linux/sysctl.h>5 A4 m  o  F( c8 f6 Y5 P) f  R
#include <linux/mm.h>
$ C9 U5 e# U! i#include <linux/delay.h>
0 W6 o  r7 A( K/ `' n, H0 G#include<linux/kernel.h>
/ G; K. a: W+ Y, q% u1 U#include<linux/fs.h>
7 ~) \3 v3 q2 s6 H7 f#include<linux/ioctl.h>5 v4 k- Y8 u# S% Y! ]) I0 x7 M& H
#include<linux/cdev.h>
( R# C) `  U/ u% d. T. }2 @2 v#include<linux/kdev_t.h>
; u6 {; D! h  w4 s5 ]5 a#include<linux/gpio.h>9 [) g" w7 c7 L- Y8 ?) D
#include <mach/hardware.h>) r4 b5 T  |0 U. a7 e  m( C
#include <mach/irqs.h>& }1 Z) l5 f) |/ o$ X; u( I* p

; }! i$ D/ u& Y9 l) f# w#include <asm/mach-types.h>
. ?  T% ~9 _. U. q#include <asm/mach/arch.h>$ a2 f+ M) ~/ i. {1 T0 k
#include <mach/da8xx.h># O7 M# n2 u' f/ t3 n$ q2 n
#define  SYSCFG_BASE   0x01c14000
+ ^- w' \' B2 Q4 X9 S( O#define  PINMUX1_OFFSET   0x124
6 R9 I; M) v- l#define  PINMUX18_OFFSET  0x168
- \6 _" I4 n" J, P) U1 K- q#define  PINMUX19_OFFSET  0x16c; s  p" q$ ]7 X& ^& D; Z8 Y
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" ?" y0 Q0 _9 \- D
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: Z' n1 P7 G  e$ ]#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR7 _& X0 D: m2 T# I
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; k7 U1 G0 h$ h
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
# E% u. k# a. @& T" {6 G1 M% f! Y                            ) p6 T0 r- ^) O# _2 E2 o2 f
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR) d9 k) X4 y, n% i+ L, v
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR+ ]) [, @9 F% E
//PSC
6 Z( `5 S6 V$ P7 i! |1 A1 w' w#define  PTCMD_ADDR   0x01E27120  
( G: w2 c7 m4 f( x0 |1 O1 ]#define  MDCTL15_ADDR 0x01E27A3C7 D9 d% }0 v- T, [0 [# }
#define  PDCTL1_ADDR  0x01E27304
8 n4 |0 ], `0 I; H; t' `//GPIO8 direction
! \  y0 ?7 T! Q4 C#define GPIO8_DIRECT  0x01E260B0* J! k/ t/ U9 H3 s
#define GPIO8_OUT     0x01E260B4
) w! ]3 n9 ^7 E6 p# `#define GPIO8_IN     0x01E260C0
5 H3 b; W7 P% l  g$ ]2 h1 `# f- p( [4 q
//#define MCBSP1_RINT    99              4 A8 V8 E( Q3 V! Z* i1 ^
//#define MCBSP1_XINT    100  ) {" I- [/ \9 z# |6 X( S! ?: G
static int MCBSP_MAJOR=239;
6 q: w, C2 }2 s0 d+ O8 q& w5 zstatic int MCBSP_MINOR=0;
, e/ i2 J2 ~) Z% d: x: o4 z, jstatic int count =1;
% W" ^- |( c, v* u" O0 y' J: Z9 z0 V# B4 @$ Q) d
#define MCBSP_NAME  "MCBSP-device"7 `3 g8 ~9 K' A- x3 v$ X) E3 o
- z9 w' g- L& U% K' }
static struct cdev *mcbsp_cdev;
) D* r( L. Q' Ostatic struct class *mcbsp_class;
0 v/ v. t  _$ S3 Lstatic dev_t mcbsp_dev;6 x7 k. d9 U  V  |" v- P$ a
unsigned int DRR_data;
9 ?$ C; R$ n9 O1 Q! i! k+ I/ |unsigned int DXR_data;1 \( n7 L6 ?4 b/ O
static int mcbsp_open(struct inode *inode,struct file *file)
+ v, \3 a; W7 h" W{
* A& J! }9 u5 h2 A" o8 Z   ! _  B/ ^& R# D9 C$ w6 C3 v
   //interrupt enable,initialized
5 [% U4 v  W" [: \. R   unsigned int temp;
: R" C0 h" _8 g% C   //SLEEP_EN(GPIO8[10])---0
# y- D) T( k- U2 k" V   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 }1 q3 b& Y3 k; Q( x
   temp=temp&(~0x00000400);
/ t0 w0 A: P. x9 j8 t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- F9 z. ]; r, {. K; A
  //RESETn(GPIO8[8])----0----1
& }. \0 K# }8 l# H# B0 B( y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ }# S" m$ Y2 {5 B7 h
   temp=temp&(~0x00000100);3 t/ ^# \# L% g
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 k2 i( C$ r% e( p- d- ~   udelay(100);( p& c0 ^% v+ [% d, b8 U3 i
   temp=temp| 0x00000100;
' n) l* @5 Z/ y5 x2 ^/ K0 v& g! v   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; P8 ]! W% V2 O9 o+ W
   udelay(100);
/ O. W/ |# \1 k! N/ ]# u! O   printk("open success!\n");0 _+ t2 |; D! e0 J1 H
   return 0;+ E! n# Y: G7 g  h3 Y3 _
}
8 t) o' p2 X7 H4 |, E" |. Z6 n# F4 L/ k5 h7 [) V
static int mcbsp_release(struct inode *inode,struct file *file)
& {! q) r9 j, }{0 d2 v& x) m/ ?* f6 o9 }& m
   printk("release success!\n");
. z" t" ^& {! {8 e+ v   return 0;
7 r/ c$ [0 }' N% {% C! b: P}  r# N& A# r% `$ z& U8 {2 P

* t/ s0 ^- @1 t! kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- Y# l, B# e+ Z; d' h* p
{
/ h. _% @2 j$ I2 i* Y    copy_from_user(&DXR_data,buf,len);
' U! n! n8 s) M- I- J    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
$ k3 b- `1 L% r$ g4 S: z% b5 e2 w; q    return 0;
& Q/ \0 _4 u8 n4 c$ m , ^, D# Y; D% s
}
  l. _  H1 i- w3 T7 K3 C- q, z& |$ u- D/ \" r
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 D5 e2 X  e$ [; \  A, J( j% _/ z, w{ 7 {: n# Y7 H( g' c) V" P
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- i+ S8 l3 \  W* O  ~8 e
   copy_to_user(buf,&DRR_data,len);
2 e( g& P) D1 e4 P- D% f$ J' n   return 0;
8 ^9 ?& i6 n+ `' C}
6 r$ O0 `5 ?4 P/ \" \# f+ x, u) x3 e5 @+ X$ W) T: @: |9 o

' V1 n; u7 Q( f3 gstatic struct  file_operations mcbsp_fops=
) I. j6 X2 Y! k{
" q; E5 d  e  ?1 m, R6 Y& S3 V   .owner=THIS_MODULE," k& v2 ]0 D2 t" N$ s" E
   .open=mcbsp_open,8 S2 x9 M; O( x$ ], R
   .release=mcbsp_release,  {! B! `' k3 G9 w9 I/ V
   .write=mcbsp_write,
2 N* Y" p0 S9 j' l% Y0 {" @( s$ j   .read=mcbsp_read,
6 s" w) s# z4 E0 v# P, y! x};
  C7 l- m- _1 n8 cstatic int __init MCBSP_init(void)3 p5 x$ L. Y/ V& P% V1 ?3 |
{
: r5 O8 `& G8 i$ `8 N, |; Q8 \9 k   int ret;
# h$ \" S3 y1 }: {: T2 f9 r( W; N   unsigned  int   PINMUX1_REG_old;5 l$ P+ i, B& X
   unsigned  int   PINMUX18_REG_old;' t$ k: y  Y9 m$ Y7 ~. @7 l8 N
   unsigned  int   PINMUX19_REG_old;
% ?- t1 r4 k! [" i  e8 K   unsigned  int   temp;  / _( `: p; T, \4 J- J
   if(MCBSP_MAJOR). N  N3 `) X  ?! j& ?- M6 V
   {9 }& H( `  d! V
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* K* @% F: x0 ?' D9 q4 {      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
5 d; s9 o+ T9 b9 A   }: ?5 L3 @0 |: O9 l: H
   else! S$ F! S% [5 U  M. N
   {
" @& A4 ?% W, P+ q% U- }% t9 V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: G4 ^+ J% T5 B! b1 L/ E8 k6 H
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 o7 K% n0 [" ^3 U   }
' P1 X$ X- s/ T* T2 h2 M- [   
4 e8 k* I$ F; O: T   if(ret<0)- N) L; o6 {7 q  i2 p2 a
   {
( T: _+ l( Q, G. P' p      printk(KERN_ERR "register chrdev fail!");
9 ?3 b$ Y# K% b      return -1;+ B- J  `; T2 Z( o' U
   }! \4 V! R& a# K
   , ^' I) P& _* H6 `) a
   mcbsp_cdev=cdev_alloc();7 }3 F4 V- D0 o, D2 Y! _% J8 J. X
   5 X& s: R" w& j( e& p
   if(mcbsp_cdev!=NULL)
/ A9 w$ D+ M* F/ k; r& n   {
' {" J- D6 k5 Y) `% A      cdev_init(mcbsp_cdev,&mcbsp_fops);
- R: x* o- n0 J& n. K      mcbsp_cdev->ops=&mcbsp_fops;( u* k2 _: l6 `/ @: |2 U$ t2 b
      mcbsp_cdev->owner=THIS_MODULE;
, q/ O8 e  i2 u4 r$ k: H1 f: a        Z* }, _# M' U+ ?- a
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
/ j/ b) }: l! v: U7 A* U% x          printk(KERN_ERR "register cdev fail!");
, `. s; b/ v& g4 N: x2 ~      else
$ a% F% y2 d; Q0 M          printk(KERN_ERR "register success!\n");
( Z% N" x+ c; B: }" M( R+ A9 @# j   }( k1 W3 |+ B- U) c& m
   else5 p' X3 j: j9 x
   {
" Z; p& Z7 @/ F7 A      printk(KERN_ERR "register cdev err!");
" G. O, z1 y/ M- H( @% x      return -1;4 L" P5 ^) E0 Y1 F& e
   }
# F. {6 x* T" m" I6 v- j% N   
5 F! e' o% D. ]  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# D' I" g1 V9 L: q0 B* L% u
   if(IS_ERR(mcbsp_class))
1 J% G& S& y2 w7 p7 g- C( v   {
6 X6 b! i' Q; v; a6 T" y- ]) h      printk(KERN_ERR "register class err!");
/ m/ ^, ]1 i. @5 I0 g   return -1;
  ^* S# \# w; v   }! P3 u4 x: K' Q$ W7 B9 m
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; @- E' x0 S0 }) m$ n- e4 H5 u+ k$ h* @+ s
   //PSC
; h+ P0 c, K2 J  h4 u' Q* A& Q   //add Enable MCBSP
+ E: ?& s' j0 t2 n   //test5 u+ B% H. ?5 d9 X6 _. y$ k
   temp = 0x80000003;
! ^. }( |6 j5 |   writel(temp, IO_ADDRESS(MDCTL15_ADDR));, h! n# S- d9 O! K
   temp = 0x00000003;/ ?2 T: P2 b) Z% o# p
   writel(temp, IO_ADDRESS(PTCMD_ADDR));& L9 T9 n* m% J; o# z

6 A% f! {1 g$ W8 c7 F9 w: S9 H& r4 f   temp = 0x001FF201;
5 |2 V3 T7 `6 ?6 R* q; Y3 B   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
2 m2 }, E( W1 ?2 d* e3 k   7 {9 ~1 o2 [+ f
   //PINMUX  
( U, ]( y6 w& O) v0 I2 M   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. O) d# r, b$ [3 X  Z   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 S8 k5 x# K8 q3 \/ v# }5 R7 B
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
6 b% i) @( L: U   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ w% q, q' F2 E' q( E+ ^+ W   5 p4 q1 T5 Y3 A* A, Q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 N) A  x, L+ d8 r
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
  D* g( @/ V# o0 G8 h5 B$ z2 L4 V" F   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   . d8 }) P2 t& d. t: {# j6 W
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 w0 f! N, `% [- o$ a2 x" x! v4 |. Y
8 [- a1 A! x) A7 |/ R9 G4 E   //RESETn,L138_SHK2" g- C9 c9 `2 ~7 \3 ~8 v4 S
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
& r" @, x& ^) |   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   8 ^: e& z, J6 _2 r' Q4 c
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ Y1 f1 h6 i, g3 s7 R4 w; e
% b: }$ t- s" a' w& o6 r/ t
; g/ v: l# O2 g0 d
  //SPCR Register
. H* f8 o1 ]% P' D, a: ^  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- f8 Z6 M8 P# S) x2 N  temp = 0x03000000;//(DLB=0)# o2 M4 O# @1 b( x& b( O
// temp = 0x03008000;//(DLB=1)# P* I3 F; V8 ^% X3 a2 Z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset/ M! W) \0 \2 f$ y- z) r# o
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, _+ I' z7 J1 h1 R  printk("temp=%x\n",temp);; l. B2 B+ \  r

1 _3 _+ [/ w- C8 V- i1 r   //PCR Register
1 q0 ]5 U( q% `   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  B( s8 g' `* a4 L1 U. k4 O, I  // temp = 0x00000F0F;
) U/ P+ @1 s: A* R- X  temp = 0x00000B0F;
9 U. k8 }" a+ z  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 7 Q* a; U  }/ V6 ~  F- ?& ]
  temp = readl(IO_ADDRESS(PCR_ADDR));
1 O' u) Z8 D; W, E  printk("temp=%x\n",temp);  
( Y) @# T7 H& {2 ~4 I   //SRGR Register" `* l5 _: a; J/ i( c$ Q0 p9 O
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 D- |% B* {/ P8 }
//temp = 0x301F000B;" m6 i) Z5 W! q: l" W" s; d; D
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized % }, X5 z# c- m3 I4 \* c. k* }# ]
  temp = readl(IO_ADDRESS(SRGR_ADDR));
& f2 `$ v, E0 F% T3 O% e$ K  printk("temp=%x\n",temp);8 [' `2 G: o/ B
   //RCR
6 p& ?# ]8 ?  ~$ k8 X' P% B  g   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 |! u8 h8 \0 s7 K  ?' i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ I0 e& t% P' \3 X& f3 E
   temp = 0x00440040;
4 c/ x7 ]* X$ q" Q. K   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   * a* F# n# v' k; M& ?
   temp = readl(IO_ADDRESS(RCR_ADDR));) f" q/ ]' N6 [8 M
   printk("temp=%x\n",temp);9 i6 H: ?8 |7 K- U
   //XCR
6 @- j' _$ I* S0 M) v   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-15 c4 |9 i# T. _! ^8 i! o% d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 H3 L7 W2 i# Z% J0 I" d5 q" g   temp = 0x00440040;9 T" b5 B6 J3 b; e* b  G
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ' V/ m% Y! r% W
   temp = readl(IO_ADDRESS(XCR_ADDR));; Z1 H3 x+ a' }, U+ w/ U5 z7 M
   printk("temp=%x\n",temp);8 U. d2 k3 ~5 x) f) y$ O  G. h5 [
  udelay(100);/ F' O& f1 l  H2 B- G
  //SPCR Register
% f! L0 z: K, _9 e/ l- d! B  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 o9 ^/ t1 I* U1 Z) J7 W! g  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
9 P6 ]9 L& @' F! T7 q) p( h! {  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
# A5 }& }' g0 J1 }0 F6 u/ y  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ S) b9 i5 Q% A" Y  printk("temp=%x\n",temp);: q- p8 U$ Z0 e% {: }3 G5 R
  udelay(100);% O  [9 a8 @+ J3 D, y

0 C; V' G  K$ X+ ^  //set GPIO direction7 [- w! b: C( i+ {# b
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- i3 }1 {, x7 W5 Q5 X
   temp = temp | 0x00000100;//EPR----input  |7 X2 R" l0 s8 O  W
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& W1 V- t( o0 m/ s6 j7 E* _: Q% W   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * `- A9 k5 t+ }; t: H8 b
  K1 h% S- q3 a. M2 @0 G
   return 0;; r9 w# F: i8 `
}
# E) G8 y# s& Z' {+ Vstatic void __exit MCBSP_exit(void)
0 ?2 X8 a. d6 }( {0 w: @8 m6 u- G% L{0 T* q; d/ q% Z$ R5 U
   printk("mcbsp chrdev exit!\n");
4 G8 _, s3 y' a' k   cdev_del(mcbsp_cdev);6 {7 h* R& s  i3 N% d
   unregister_chrdev_region(mcbsp_dev,count);
4 }2 E: o! V* L" b* |: V8 K   device_destroy(mcbsp_class,mcbsp_dev);
8 M* M7 S4 Y0 P. v" N+ \   class_destroy(mcbsp_class);0 A/ }0 u  Y7 U  h
}; L8 j/ e. W0 \. Z
module_init(MCBSP_init);
5 ^7 v2 j8 h4 N1 e9 O! Ymodule_exit(MCBSP_exit);
0 e- ]# g7 V% I( P9 l  p: k( \! J3 a
MODULE_LICENSE("GPL");6 w' {' }& {4 T# f' u) Y) ]

* X; a6 u0 l1 n8 M我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 B' J4 R3 V$ c5 D- u( r" c
我的应用层的测试程序如下
2 a$ K3 `. L8 B( Q+ _; C#include <stdio.h>
/ y9 `: m! @( i3 H( g#include <string.h>
' i' }. k; F2 Y* Y#include <fcntl.h>
3 }$ l4 \: r- K! a: c#include <unistd.h>5 U3 S, W  R  ?4 o% L) M3 b) c
#include <signal.h>( y) ~1 s- ^% S8 n$ M
#include <pthread.h>       //线程
; l; F, J$ p: P, f7 j+ Z% o#include <stdlib.h>
1 c* g6 ?1 k( ]( B3 t$ s#include <pcap.h>          //捕获网口数据2 b/ C, y1 W5 B4 _1 a
#include <semaphore.h>     //信号
/ ^5 r& x1 E6 ^* c& u#include <sys/types.h>     //消息对列) h* b4 [2 e  m5 |7 ?$ {9 _) U" I" x1 `
#include <sys/ipc.h>       //消息队列% ~& s- r1 k/ m& N# a' T" x
#include <sys/msg.h>       //消息队列
) i$ H. c; Q, O& {#include <sys/select.h>
) b, T6 r. q1 E' M8 P' o, j, M' P#include <sys/syscall.h>
0 u$ y: ]$ S* g1 o#include <sys/stat.h>
( E& ?# ]( y! K#include <sys/mman.h>8 @: a% Q) W9 M: S" Q! D' g
#define msleep(x) usleep(1000*x)
$ K- Y) s3 D) S$ }4 e3 Q! u1 T+ N% `5 n: [/ B; D) d1 ]
int main()7 X  B9 H0 y9 i: {# d1 g6 H
{ : ]8 o' f& \  O% D7 K6 l5 S
    //MCBSP,ARM与AMBE2000交互设备
: [% x4 L+ O0 D) J/ a  J) y3 E int fd;3 i: i$ m) u: w- d! w% Y
unsigned short data_write = 0x5555;
$ y7 a* x. O& Q; A: B8 {% o unsigned short data_read = 0x00;& P& I, J& \- s. a# s9 c$ K4 g/ X
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" T! j: h% \5 T, w$ `7 @
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 h. m# t" u: \   
8 z% C' |0 D4 `2 R* w4 O( ^  x; F  if(fd < 0)# a1 o9 e$ o- S/ I7 Y2 n
  {4 M* q  G$ M/ [, G- ]8 a9 r% ]& Q
     perror("open failed\n");
" Y' N7 W: y, K. w6 ]& }     return -1;
! f  a+ f2 _5 h) O8 T; A  }
$ H5 q, N- D5 g6 |2 \* Y( z  
  \7 K) @; H3 y5 ^# {7 E  while(1)8 T- J2 r$ G% q7 x" k
  {0 q: K) w. N0 l: n
   
8 p2 C- h/ a% x9 D% v1 I   //AMBE2000每次读写是24个字为一帧
! Z' H$ K0 C- z8 ~' \# K   //写数据时将数据在底层存储起来,等到中断的时候再发送4 J5 i$ V, U$ ~, w2 p5 k
   //AMBE2000输入数据是以0x13EC开头的
% n! L7 ~) q0 r# h+ [+ m   write(fd,&data_write,sizeof(unsigned short));
$ e/ U! l. s6 h; T   
9 `0 ^7 p+ A' X3 N- ?7 D   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  / }+ \( T) A9 d0 m* I
   read(fd,&data_read,sizeof(unsigned short));& |$ i' c( u9 L* N
   
4 T% G3 M6 s: a2 v  Q6 }   if(data_read == 0x13Ec)
! f2 [1 z4 o7 T. R* J   {
# ?# [4 z6 O! L6 w+ B   
+ J9 z8 q! R) ~! N, ^    printf("data_read = %x\n",data_read);
& B" M4 m9 Z0 t2 o  M0 ]   }
) T& O& W# D2 r* `% w: K1 w   8 F" I, N2 t9 ?# R% q- C
   msleep(10);
8 |! \4 p! p& ^; a    J; E' n1 n+ G' d8 [
  /*
* m, [7 I- _  D$ e+ C' T: h   ioctl(fd,1);   " k& ?+ u; B" _0 N7 p4 p
sleep(1);3 P/ q$ X4 D; b9 p: u* G
ioctl(fd,0);0 C% ~0 y- t" g, ]% d; j
sleep(1);$ v7 ?- U9 |" V1 `3 n' x/ H8 @! Z
*/ * N6 o: {4 h( w# [! O9 o- z6 C
  }   
8 y8 V" Z% Q% h" A" u- Z' i+ d( @ return 0;
: s  q+ z% P/ y) x: x
7 U3 e7 B# _/ \}/ f  O" r6 y; D
' v( o& {4 V" Y; N% A; p9 A$ S2 c, V
多谢各位指教,谢谢! 急
! }: t) p, E$ w$ ~7 \# K
9 w  x& T: s( e1 R" a
# O. z6 p1 H, i, y% u: ?1 }1 F: p' N/ \$ |8 i9 y
3 I4 G! f* ~# i
+ A3 H  d- k+ N8 N& ~' e/ a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 14:09 , Processed in 0.050787 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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