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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 X1 C! }1 ^/ O1 l3 [/ f# n; N- I/*0 l2 \& a7 l* g
* Copyright (C) 2009 Texas Instruments Inc
4 c1 `$ y( [- g  {' O  {% I9 ~$ H *
+ q- k% I* N6 R! D& V, I9 @5 @$ K * This program is free software; you can redistribute it and/or modify4 p0 q5 E: O3 N  u
* it under the terms of the GNU General Public License as published by
  v9 i. j6 A! \1 z7 ^% t% W- j * the Free Software Foundation; either version 2 of the License, or. F- K1 q+ `0 o5 u
* (at your option)any later version.
3 G4 K# ]; f4 o$ \6 D+ R/ T *2 E; }, {- j% c1 m* `0 P
* This program is distributed in the hope that it will be useful,; r$ y9 I4 k$ y) N
* but WITHOUT ANY WARRANTY; without even the implied warranty of
$ A% F: `! ^2 C% e * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ m7 i+ Y% [% C+ N$ N3 \/ V% [- i
* GNU General Public License for more details.
$ t9 |- V$ |# a0 O! j *
+ l8 N# O  Z" e( C3 Y * You should have received a copy of the GNU General Public License
  ~  l7 {# Y2 m7 i0 o, @: N * along with this program; if not, write to the Free Software
- \6 B4 f; c0 k* u  r$ t- z9 [: P * Foundati3 ^/ T' w9 f8 Q- g
*/4 K0 ^6 `' x) K" \% Z$ a! U1 V
#include <linux/module.h>0 n6 R  `+ y, ]. c
#include <linux/init.h>
/ j  E' d& d/ H$ q#include <linux/errno.h>+ d  x% ~; Y& ]/ u+ ]- ~
#include <linux/types.h>7 _9 r7 W; S4 w9 W5 X; p' k
#include <linux/interrupt.h>" g  Y8 ]) w0 n; f: T2 c6 V2 M$ b
#include <linux/io.h>
9 Y7 Y) @  h3 e: @/ H  Y#include <linux/sysctl.h>' j% j( ^2 X+ l
#include <linux/mm.h># G- `$ m0 y: Y, i  E# k  b
#include <linux/delay.h>( @+ g1 S, m" S5 I- ^8 l0 a  L
#include<linux/kernel.h>& S1 r+ m1 @! p7 ~/ V& H  P3 c
#include<linux/fs.h>
, q7 h8 S' ~$ V5 ]& {! J$ {#include<linux/ioctl.h>
- ^' ]* _  R- y: W9 a; R0 U#include<linux/cdev.h>! @) ?- k  U3 Y* A$ h0 K0 a/ ?
#include<linux/kdev_t.h>" ~! w8 w7 h3 M8 N
#include<linux/gpio.h>
) T; \! }  H' _( S7 b% B) ?#include <mach/hardware.h>- x3 ]1 I7 ?! S  r7 e( p, I
#include <mach/irqs.h>
* i/ [2 u/ ~5 s1 U* |! u1 p/ C$ E5 z2 ]
#include <asm/mach-types.h>/ B0 Y+ A  i2 L2 Y% N6 J. C
#include <asm/mach/arch.h>
; W& i* }/ h. i( @#include <mach/da8xx.h>
, u$ u$ S1 M+ K$ S3 M#define  SYSCFG_BASE   0x01c14000
5 n8 T% L5 @; b6 w+ g7 ~' E. B5 s#define  PINMUX1_OFFSET   0x124 / A# j8 {! Z/ p5 z/ s% }, k: B
#define  PINMUX18_OFFSET  0x168 6 z$ q/ s) ]3 E1 U7 T, }- q( \) G
#define  PINMUX19_OFFSET  0x16c) w" l) k8 v& \0 j0 R! O
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
$ S+ e; P. K9 m#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR, \6 V6 ?: f- L) T' c3 i
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
# g9 L/ A6 F' i! @5 _9 e#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" ~+ m  t) f7 j* A$ c/ R
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
) s9 p. L8 |3 Q: @                           
. E# @& W, b# g#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
7 P3 [: Z1 [8 a( u0 O#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" y5 @$ Y7 G: Q6 X; T, c. @- V
//PSC4 n2 o- \( g8 q
#define  PTCMD_ADDR   0x01E27120  ( {" F, s0 S6 H$ O: w
#define  MDCTL15_ADDR 0x01E27A3C
! Y2 u1 e1 h0 O" h#define  PDCTL1_ADDR  0x01E27304/ E6 n1 ^6 a2 H' E# T* `3 c
//GPIO8 direction1 S" k. ^+ Z5 O9 Y
#define GPIO8_DIRECT  0x01E260B01 a1 j3 L4 ?- s4 i! |7 u% v$ M) X
#define GPIO8_OUT     0x01E260B4) {- F# J4 P3 c* F
#define GPIO8_IN     0x01E260C01 r& y- m0 W, k6 |; a5 m

! H* Z7 a* [- P0 }( c//#define MCBSP1_RINT    99              
: O8 n. X3 _( ?$ _( q+ B% L% V//#define MCBSP1_XINT    100  
, K/ X& R' s7 C; p* Vstatic int MCBSP_MAJOR=239;' ^* _; f$ h7 O0 h( o, V( S
static int MCBSP_MINOR=0;1 _+ v/ }; }2 s' a- T3 w
static int count =1;( X: H6 M/ s/ ~5 g
3 j$ o' }7 G. g
#define MCBSP_NAME  "MCBSP-device"
- U; {/ Y9 k1 c) P- b& ?3 o! D! Z5 Q) G, }0 D% u
static struct cdev *mcbsp_cdev;) N* n: u# ~0 h0 u9 ?: J! B& F. a
static struct class *mcbsp_class;9 x7 n" s* q, r  {8 J
static dev_t mcbsp_dev;
& H# n* ~$ q1 \' b( wunsigned int DRR_data;# c9 K# Y6 C1 z' x
unsigned int DXR_data;4 k$ b9 t' P, V6 U
static int mcbsp_open(struct inode *inode,struct file *file)9 X! I* J7 z& \* S, h2 Q6 ]- G8 |/ S: K
{( V5 }. U) s+ }0 k: n; S: Q
   
5 P+ O$ o, z2 O4 I. q) k, Q9 c   //interrupt enable,initialized( m' T8 T9 Y2 n, X! _3 X
   unsigned int temp;
% l- F% `" e* S* F' T! Z' k7 M- B   //SLEEP_EN(GPIO8[10])---0* h1 E. h/ }: V- A, _; w
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 S; W. B; D  Q1 d1 H4 [; C   temp=temp&(~0x00000400);& ^$ H9 b8 y# a9 z" x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. J9 T% g" P8 G1 r  //RESETn(GPIO8[8])----0----12 q. l+ m( ~& G' ~
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* j1 L$ O: u# Q8 C$ j
   temp=temp&(~0x00000100);
7 Q5 b, Z$ |* V- c# ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! T: ]. g5 \7 U4 _1 w' }! {   udelay(100);
  w6 y# x- f% Y! O3 l   temp=temp| 0x00000100;
- n* s4 r" R2 M+ U* F" k5 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( z$ [; |: _4 d" {   udelay(100);% A, X) _, u0 B( j, u  S3 O+ O# y
   printk("open success!\n");
- \# M) Q  l- U; }2 x   return 0;
1 i. a( ~5 R: b! S}
! n/ Y6 ]  `3 N' }
+ ?  `4 S+ ~7 bstatic int mcbsp_release(struct inode *inode,struct file *file)" ]4 t1 d- j8 g2 }) |  v5 I
{/ H$ i1 P7 P3 {! K' n# x9 z
   printk("release success!\n");
4 r# P8 S; ^$ i; _& e   return 0;' y0 Y2 p, v6 W  \* T+ R$ S
}+ x7 Y% p! H5 W- ], W& [* a6 C6 Y# o+ a
% k) u2 q9 g9 v( w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- T; j( d3 K+ J% E  k* N
{
0 i5 ?, n4 O3 t  m& Q% H/ Q2 n    copy_from_user(&DXR_data,buf,len);6 m" }3 \/ ], Y( X6 L0 m. v
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
1 L" N" Y0 t; K+ T1 {    return 0;" ^3 ^9 Q" b/ V9 M% {
! r$ C$ M2 k# n6 d, M. \' n
}
5 r( D9 L2 B) a: n5 h
/ h9 e; Y# u# W$ wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 a( z: [2 W7 n  N{
8 t! ~% [" u7 X4 ^   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# h/ X! @" Y7 ^* G0 |$ }   copy_to_user(buf,&DRR_data,len); 6 {) V8 i4 e3 K0 h/ I
   return 0;
4 l- Q: M% V# o/ m, E. `0 ~  P}0 m& |! @' j1 x7 F; |: ]: g' d  ?9 O

4 q! t  |3 v$ T1 n% A! P! f* {* a; M: P4 N  c5 S% ^# @
static struct  file_operations mcbsp_fops=0 |/ w% `' w4 z0 U4 E
{) s& y9 X3 e% ~2 }0 O
   .owner=THIS_MODULE,
9 X! ~5 E) b6 X4 Y9 P   .open=mcbsp_open,
9 g" K3 n6 Z$ R1 S7 d) Z5 Z   .release=mcbsp_release,
# h- u# X$ g- Y" ]1 F# Z   .write=mcbsp_write,! c  R& x, z: C' `: e! ~& X! d, M4 A# M
   .read=mcbsp_read,
/ {! E. K' p: f  }/ S" O  u3 U! `};4 ?1 z5 T( G/ h. E& d+ T
static int __init MCBSP_init(void)' Z; z% ?+ E3 M( f8 u' @( l
{
: [$ e1 c/ r& L* Q, \   int ret;
  Z$ O7 N/ @( s/ e6 V1 @, M1 k* \   unsigned  int   PINMUX1_REG_old;
% v. C. t3 c. Z& S  Y9 E   unsigned  int   PINMUX18_REG_old;
3 ?7 X5 C- ^; y/ w) {- n  A   unsigned  int   PINMUX19_REG_old;
/ T" J0 n7 a0 F( C1 @9 q! V, y   unsigned  int   temp;  
0 p. I+ a0 \- B+ E/ ^   if(MCBSP_MAJOR)
3 `5 p9 _. _; [) V   {! a  z' [  }, M
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 ^9 N, |# a3 T+ C! P1 Y% s
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ Q& o# w. D! V  Z
   }
3 T/ A1 {& `: [   else
& v4 I% A' e, d4 E7 x  x  Y# ^   {
* d* Z) `3 l% i' r# I) {$ W      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- _8 e: \5 B+ X5 A3 h8 s      MCBSP_MAJOR=MAJOR(mcbsp_dev);+ o. F* d: j& \" r; W% K
   }
) D* m/ a" M* X   
) p7 T- E) u6 ^6 J   if(ret<0)# }. u7 F; w; k
   {
% \2 c+ F4 ~) p; p2 J1 \      printk(KERN_ERR "register chrdev fail!");
, \7 g& b3 L+ R) B, [) l      return -1;
4 ?% w3 V. ?5 m2 ?) B! Q   }- A5 N! u) Y/ P" s: a1 A$ S' R
   
/ Z% m2 S: R4 H, L3 U$ D   mcbsp_cdev=cdev_alloc();
0 W/ S% k% f+ `8 v( J2 U   
+ a7 N" B0 a7 R, Q2 v   if(mcbsp_cdev!=NULL)
2 ]7 z6 {8 W" N: @1 ?4 ^   {
, M9 I  O( t- Q4 D; X      cdev_init(mcbsp_cdev,&mcbsp_fops);% _' N' v. S2 X1 ~5 ?2 `/ B
      mcbsp_cdev->ops=&mcbsp_fops;
3 l- p  w) `$ |      mcbsp_cdev->owner=THIS_MODULE;
8 L2 q' ~' o6 I* }. P* h      
" l6 P% J/ ]: H! ~0 N      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' y( s" V. u6 x2 x          printk(KERN_ERR "register cdev fail!");4 X& c: F& X4 H
      else
% `$ t8 `3 k$ @  Q1 T          printk(KERN_ERR "register success!\n");( _5 v1 z0 u/ m& T' ^" u, X# n
   }
8 m" m+ o# n/ ]" c6 b. J2 i   else
, c( f. ]: B" c# ?1 r7 x   {
* h* |5 T' R6 @/ M7 w      printk(KERN_ERR "register cdev err!");
, k( ~* U4 H) Z3 g      return -1;
) v9 ?$ U' d, g' Z1 h1 F2 I   }7 z& b* d: U# p4 ]" G
   " V8 i5 V- ?* W5 A
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 P& `0 S  c- f. w/ `
   if(IS_ERR(mcbsp_class))
* w1 f- A' Q+ L' O$ s   {% n, Y& @! T5 _$ }+ [0 ~  s/ X
      printk(KERN_ERR "register class err!");# n, z' g$ U( q9 f
   return -1;7 B% m( g( P& l- @
   }
9 `6 n3 N; o8 U/ n   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 n( M. b$ Y: N; B/ p' F& o- I! \
   //PSC. y5 ^$ Y* A) r: s; A: r. u
   //add Enable MCBSP  g+ r, \3 ]6 w/ L* \
   //test5 R, ]. X& S: S' z9 R
   temp = 0x80000003;
- c1 I1 y0 I7 a8 V   writel(temp, IO_ADDRESS(MDCTL15_ADDR));, o: s* F; B- O8 X. e
   temp = 0x00000003;6 i& ]* f' J2 m( I. p
   writel(temp, IO_ADDRESS(PTCMD_ADDR));) ^7 f/ j! V$ a% K
- P$ D7 A" O/ ?  z
   temp = 0x001FF201;; A: m3 T9 u2 M. |8 ~: ~, d
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 c2 b( [2 p- i7 }, R   
  A: p  Z  u! n# C, \/ |/ r* w8 L   //PINMUX  
, j- A1 p5 Y( Y. @; g7 K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 a. u% }5 u% I+ X2 z2 l2 N
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  " Y: Y5 A% I: |" f8 i' N
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   3 d2 p& D, @8 e2 P7 }
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- B% Z8 \0 i. U$ e   
" K' E, @5 Q% ~' Y* z   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 e8 i7 P, x* B( T+ R6 a
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
2 l1 C9 k4 G% }/ s% h# u$ z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   * o! {3 t# j  u& t0 X6 U, S
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% f# R: a/ H( D0 i' r# L8 ~2 g8 P5 {

! V8 }0 Z1 L2 b* E6 Z" y   //RESETn,L138_SHK2
8 K* S3 N* G: O% K   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
$ D  o, y9 P) j( w0 K   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
+ @) i7 ~& p; }( J/ A   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ _% Y; D8 `, f' J4 i" g

- k- m; U+ w. l7 N8 }
& o* _5 [0 |8 A4 m  u  //SPCR Register
5 o+ m% g7 L  j, {5 c  g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
4 Z# ~: ~' q" L% W! K) F  temp = 0x03000000;//(DLB=0)
! }* ?/ p3 U! |+ E/ F; }# ?& p! {6 p // temp = 0x03008000;//(DLB=1)
& o6 ^' V( \1 @8 ?5 E8 Z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% t! [+ b' P4 \  temp = readl(IO_ADDRESS(SPCR_ADDR));
2 _: n$ A  A& ~5 O; r  printk("temp=%x\n",temp);. P" j1 X; W( z9 K8 ]
# ~, l. W4 ?' T2 [" F
   //PCR Register
7 `7 M# W. h5 u) G# _  o8 e   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 M, t/ l% i; S9 Z$ W+ L2 T( P  // temp = 0x00000F0F;$ y, }2 Z0 W. @5 \4 K! |% y/ p
  temp = 0x00000B0F;
$ I9 K% a7 b+ U0 g" w, G  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized . m& I/ d0 W# ~5 R- x/ W
  temp = readl(IO_ADDRESS(PCR_ADDR));( l* ?! }3 k! U( b. [
  printk("temp=%x\n",temp);  
2 L1 e8 ^7 w4 X   //SRGR Register1 a0 r( s; m* ^( l) I
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( I2 g! U, w% p
//temp = 0x301F000B;
7 b. Q: O& i1 n6 Y; l, t& a. X: @2 o   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ( r" k8 P, ]& R
  temp = readl(IO_ADDRESS(SRGR_ADDR));
! J7 b- ^& @8 _) Z  printk("temp=%x\n",temp);" j" b, W, H2 M2 T) L8 N
   //RCR% C) m: s- ~2 r( o4 R( C5 v& V
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 O+ B: B% A: ~2 E2 i( D8 i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
7 L4 U$ N' A* E" T1 k  H   temp = 0x00440040;2 e; H' O; l; h/ l8 w' U% U2 C, ]' r
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& ]- T1 ], a1 I. c7 G! K& _! ?   temp = readl(IO_ADDRESS(RCR_ADDR));
$ I# @7 N: r6 q" K6 I  i! b   printk("temp=%x\n",temp);
2 q  H) g! T) O  h8 X' o. B   //XCR- m, Q& z/ z: H: v
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: f1 r0 t- m3 A   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 K$ d+ |/ O  ]9 B9 S   temp = 0x00440040;
& c  X3 J2 C- K; F2 i/ b   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
) z( x9 @: ^+ O2 f5 Y1 h   temp = readl(IO_ADDRESS(XCR_ADDR));+ L4 j; B1 w) H. V
   printk("temp=%x\n",temp);* U. V, m1 m; ?. J; h* }# f
  udelay(100);
* [, [4 Q& k4 l- w& ?; b6 \, h& M4 S  //SPCR Register
/ |( S" s; K+ X# y7 W' S  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 p* G. o( R: F$ Z, l) @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
# l6 _7 U7 A2 F& J( ~1 y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled: U( P" K4 w% O7 v' T
  temp = readl(IO_ADDRESS(SPCR_ADDR));
) I+ I  C+ u, p) j- X7 T  printk("temp=%x\n",temp);+ K9 ?) h& y9 p/ b  ]8 y. c
  udelay(100);7 Y$ N( D4 d; ~" h
7 ?! W- X' N. e7 ]6 Y) J) @( W
  //set GPIO direction
$ V: \, q5 D4 m   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- J( C2 _6 Y* ^3 x* x* H
   temp = temp | 0x00000100;//EPR----input3 B. @8 L, |! P+ z$ N& g
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 C6 _. }: ^2 l( S
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 \; V% Z$ @+ S0 P3 ~5 I 8 ~5 B& j( V' u$ J. o0 W0 D  r
   return 0;
& p; t* l6 `( k" s' L}
" r+ g6 s# A/ R5 m+ d/ ystatic void __exit MCBSP_exit(void)
8 J$ {# d: U' |& b: [/ m; |7 t{! }# g( M9 r  u* b' V
   printk("mcbsp chrdev exit!\n");
+ e9 O" o# p3 G$ L   cdev_del(mcbsp_cdev);  G) J% K$ r& O) C' E' t0 p8 y9 P& T, H# u
   unregister_chrdev_region(mcbsp_dev,count);
2 p$ i$ l$ B6 N3 T5 R  n   device_destroy(mcbsp_class,mcbsp_dev);& ?3 a! y& B4 Y- u( y/ i& h1 G
   class_destroy(mcbsp_class);! [6 z# {" D; ~+ k
}
% Y9 N+ N+ i) H4 Umodule_init(MCBSP_init);
4 m2 `/ v0 u6 p, S) _9 t1 m  cmodule_exit(MCBSP_exit);
7 T5 M3 l% b8 o7 x0 w: N: h
7 q! X- Y* p# \. u5 }- J6 A9 SMODULE_LICENSE("GPL");: o: l- K( l1 [7 y8 O1 v
5 @* Z; I+ i' Q3 i9 r, `' F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 P) P. G4 L* l
我的应用层的测试程序如下
5 w. l* t1 v! e1 S#include <stdio.h>
" C8 t  F+ M. Y5 D#include <string.h>
* V$ Z/ {8 E& p#include <fcntl.h>" g0 U7 h( _; p, s6 i
#include <unistd.h>
4 {6 Q+ ]7 ?9 ]5 w! l#include <signal.h>- \6 H  \- ^" k' m( a2 u
#include <pthread.h>       //线程( C) h) e$ G8 Z8 y
#include <stdlib.h>
3 f4 F* s1 H) g+ O7 X#include <pcap.h>          //捕获网口数据
. W' i% W, q$ Q9 r" }+ S; T! M& R#include <semaphore.h>     //信号
7 ~  F( H2 k' L$ t: g" r#include <sys/types.h>     //消息对列) C; |; F2 ^. d2 `1 i2 {
#include <sys/ipc.h>       //消息队列1 B  G- l6 b  m
#include <sys/msg.h>       //消息队列
  x( `' }, _" J#include <sys/select.h>& c9 `& v7 I. d- Y
#include <sys/syscall.h>
; l$ Z  }8 ?# ^+ n9 v#include <sys/stat.h>6 a9 z4 v5 W, I* U9 D4 M$ w1 Z2 P$ ~) t
#include <sys/mman.h>5 u1 m  b9 V/ ]9 Y0 q
#define msleep(x) usleep(1000*x)
& z& A5 R1 y. C6 n7 M+ _+ p. X. l+ S+ O# ^% j/ f0 }6 U; F. d
int main()4 C) q8 Z6 V0 r4 U. a+ y) X
{ % C; x) H) f7 Z$ N- A4 o
    //MCBSP,ARM与AMBE2000交互设备
8 ^/ P$ }# \3 J+ x6 V: y int fd;
! k) \6 {4 I$ Y0 k& z unsigned short data_write = 0x5555;
. X! u3 ^3 U8 \: P unsigned short data_read = 0x00;. _% ^- t# `+ L5 V0 m; m
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ b5 s7 K' |) I! n0 F/ c; Y //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# R+ w' `" [, z- J* ~   
" C. F8 C  Y  s: v7 b8 j/ j2 u4 A  if(fd < 0)
# f4 p& n; E* o% {  {
# C- W- e. W4 T; e. N     perror("open failed\n");/ G) D1 a' S" V
     return -1;+ `: e) a) K& I/ a3 o9 k6 Z8 m2 D
  }5 _( h* c! a+ r3 k1 y
  
( |) [9 w9 \6 B8 i8 ^- x( W  while(1)' i8 e) d, R: i7 l, k# `. s
  {
: V. l" x3 z; G5 F" w   
; \  I1 P) C( b- P& r2 ~   //AMBE2000每次读写是24个字为一帧
0 G6 {1 z3 z+ O   //写数据时将数据在底层存储起来,等到中断的时候再发送0 X/ h" Q! ~: E/ ^/ {; ]) J8 @
   //AMBE2000输入数据是以0x13EC开头的6 P- |% t; y. E# K! `$ \
   write(fd,&data_write,sizeof(unsigned short));% V# a4 ~' k; B1 k- s: _7 E/ j( \( ?
   
! d# G; i1 Y7 m, k: s5 q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* K3 v, ?0 T- x1 ~, y! L# E   read(fd,&data_read,sizeof(unsigned short));
. R% }1 {6 t+ t# N; i1 Q   ) I' X- F; p; P9 ~. H
   if(data_read == 0x13Ec)
9 y0 s- [0 S8 H7 J   {
; [) E( g9 p4 ^  T% T) f   9 u! L. M0 H4 p+ e; q
    printf("data_read = %x\n",data_read);
& x2 l6 T3 O8 A+ I% o/ u4 g& i   }
4 E/ ?8 a/ ~4 J* y9 |   7 }- J+ x- D) K6 Q9 F9 e2 n
   msleep(10);
4 I7 Z# H4 |& F# @/ H+ I7 |% I  
( x' r* d  v/ E; `: p. H2 Z  /*9 |# e$ @: x' ~5 ^' b! s4 F8 J
   ioctl(fd,1);   
, T1 U6 j6 ?+ M8 e9 Q& X# }+ f sleep(1);" l: m+ g+ ^: m+ @5 q! T
ioctl(fd,0);% s1 L( H3 N4 o& K
sleep(1);- a/ g+ X0 {$ x+ B0 @
*/ , i. {- X, J) x/ @& ]" j
  }   
9 U) s5 ?0 i' D8 }" O* D$ J return 0;
2 O1 c. ?4 x( F
, k4 ]- a! f: d- C}
. y% n5 Z) F; o+ X5 V% Q( w' T) d% H4 g9 i: m: W0 ]
多谢各位指教,谢谢! 急: Z+ S- X5 U8 \# r2 X/ j# j
" x6 T- u* s! K- w; _

8 r4 Z/ a" b+ w1 b- I+ U- ]3 u5 O" e% S$ C9 M
+ u# d) X9 D7 f, U% I! l

4 m9 ~7 j/ ]" `0 Y2 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 10:07 , Processed in 0.042398 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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