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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: o, a) N. m. x3 ?, Y* s: @/*
2 `- @. f* s7 z$ T6 h: L * Copyright (C) 2009 Texas Instruments Inc- N. _/ J0 Q  V
*
6 x  ~3 _+ Q9 p  K# O9 o  L; Q! X * This program is free software; you can redistribute it and/or modify. U  r0 G; [9 P( M4 i# `
* it under the terms of the GNU General Public License as published by+ Z& I9 q. z! u8 V7 L$ S% T
* the Free Software Foundation; either version 2 of the License, or5 p& w$ }% S4 S1 X+ c
* (at your option)any later version.0 R' Q7 L5 w# t( |+ l1 X
*
5 g& s, V7 U9 H2 l% T7 j * This program is distributed in the hope that it will be useful,) F  a0 Z4 `: }7 {
* but WITHOUT ANY WARRANTY; without even the implied warranty of& H6 P9 |' U! e' s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# U3 h' e, Z, e4 C9 \7 t  ] * GNU General Public License for more details.- N$ q' E4 e5 e! M6 |3 n  b
*: M# w, L) k% A( d
* You should have received a copy of the GNU General Public License
9 S# G: B. k, ^& h# S; Z * along with this program; if not, write to the Free Software) l3 \! d  i0 D- r
* Foundati: T1 y. a* D8 q! N
*/
+ F, _$ J6 _" @2 G: N, ]#include <linux/module.h>
  R2 Z3 M7 J( Q2 J* U. x1 L3 T+ T#include <linux/init.h>
  s1 m' }2 H, y9 z#include <linux/errno.h>
3 o5 f, x7 J7 ^8 x#include <linux/types.h>/ ?9 ~( y0 K7 R- \6 g5 X& \9 i
#include <linux/interrupt.h>
5 }: k) B0 |) l* |1 i3 m8 H/ x& ?#include <linux/io.h>  x* k# e* J" g; T5 j
#include <linux/sysctl.h>
& v9 U$ w6 B  _0 r! `3 U9 O# W* Q& }& y1 M#include <linux/mm.h>
. \( @* i9 P* M2 b8 C( }#include <linux/delay.h>5 N) p- n  c* Q, u
#include<linux/kernel.h>( s8 E  n2 q2 s8 V  v
#include<linux/fs.h>5 w! l5 X/ H0 Q( W5 _) G
#include<linux/ioctl.h>! m+ Z4 F1 _' k5 _0 t
#include<linux/cdev.h>
% V- F: s  B0 d/ g: h#include<linux/kdev_t.h>8 i" q2 W( ]* m7 c5 W9 r  s
#include<linux/gpio.h>
& Y- A8 v/ s8 @: K0 R% W#include <mach/hardware.h>+ A3 o0 l% y5 I" K% a& ]' U
#include <mach/irqs.h>9 l- z( C  c/ w2 |% W+ r$ L

$ B, V; c5 E9 `; m2 w#include <asm/mach-types.h>
* x$ r$ Y; i( H( i, Z0 ?: \! q! `#include <asm/mach/arch.h>
$ ^8 g6 y( T: ^" h#include <mach/da8xx.h>
. P8 g: J+ p2 n* y- z#define  SYSCFG_BASE   0x01c14000
  `  P, {$ _9 G* b) `* c, ]+ k% X#define  PINMUX1_OFFSET   0x124 ! C( z, L9 t9 w& A
#define  PINMUX18_OFFSET  0x168 / f/ q$ V: s$ u3 x4 |" m0 z
#define  PINMUX19_OFFSET  0x16c
1 I2 ~( S1 q- R! H# E# S#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR4 x* ?1 j5 R, L7 c) M  v' c. W& {
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR! v' y4 V/ R% B& {; m$ A8 r
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR' C1 @# A6 M) W
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
% K4 U) M$ ^- V: u+ b9 N#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR( F4 d6 R9 A) B0 {9 A- G1 ?
                           
9 y  }" [7 B  Q/ {# F$ H. Y; R' t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
" _4 }; ^8 R3 w% c" {4 B4 D' D#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- M) f* m# `8 p//PSC
8 l1 |( z- l1 |* G7 E#define  PTCMD_ADDR   0x01E27120  
2 K7 n, S8 c; ?9 g#define  MDCTL15_ADDR 0x01E27A3C! p3 n7 z5 U" s3 Y# L
#define  PDCTL1_ADDR  0x01E27304
4 n' d! H3 P2 i* H//GPIO8 direction
, g/ ?# V1 Q- i0 v5 f% P6 o* R* h! u#define GPIO8_DIRECT  0x01E260B0
! G7 u9 f+ v, @& X4 z#define GPIO8_OUT     0x01E260B4
% A% f' m: Z: ]6 a' h+ ^#define GPIO8_IN     0x01E260C0
, b& Z6 Z! J. u# o! r  @( e6 X9 i. ^# G  D$ D2 W& X9 |& G; ^# [
//#define MCBSP1_RINT    99              
' [0 M9 c. G, L* Q) |6 N//#define MCBSP1_XINT    100  , h: Z) Q! j- `! m! ?
static int MCBSP_MAJOR=239;
# O; }* w6 o: p$ nstatic int MCBSP_MINOR=0;) _1 b( C: t! W  a8 n- S, G5 ^3 I
static int count =1;
% y& P3 j2 @! K% k8 N. C  {
; @% f" Z" ]+ A( a' y& Z4 ~5 `#define MCBSP_NAME  "MCBSP-device"
& f! t( W) @, |9 W
9 A$ U# n" B0 ^7 ?static struct cdev *mcbsp_cdev;# S9 ]& o, k# D3 e
static struct class *mcbsp_class;6 j6 r! x5 u* b- L( R- ?
static dev_t mcbsp_dev;
3 _6 _( [% W* }2 [8 [unsigned int DRR_data;* O7 v, T& {( I; P$ e1 f% t6 i; K
unsigned int DXR_data;# V8 o' q' w& A2 Y$ z' y  F0 Z
static int mcbsp_open(struct inode *inode,struct file *file)
7 c! Y0 U( U9 u{
9 v8 Y( |1 s; v( l% a6 `! Q   
5 o( ~  f  h  k* }- \" k- Z! ^   //interrupt enable,initialized# w: K/ b9 S! {; h5 {8 |
   unsigned int temp;
; P0 G4 k% W( o+ m6 M   //SLEEP_EN(GPIO8[10])---0# t. v) n- v& ^$ e2 C6 f; J4 E8 p
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 |2 [( S" W* O' P& p   temp=temp&(~0x00000400);: I( |4 u& v1 c6 o7 i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% g- c4 E# [$ B3 b% y
  //RESETn(GPIO8[8])----0----1
! {3 U1 G; d4 w; o% `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 V6 k. U2 z  {$ V: ]4 O& N   temp=temp&(~0x00000100);& y& X5 s# k- p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 d' }9 Y0 F- E! b   udelay(100);! k8 L6 g1 r, K+ b3 g8 f
   temp=temp| 0x00000100;
8 z1 z9 q7 [( b   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) z8 P! X4 s( h( h* p0 T
   udelay(100);
0 s( g/ k6 N3 D   printk("open success!\n");
* h' ~* G" }* f5 j8 H8 r   return 0;
+ u5 E1 ~5 W. f6 N4 f# {# f}9 I# V( m& c$ H  [; a: r, z  |

& j: H% x4 b  Xstatic int mcbsp_release(struct inode *inode,struct file *file)
6 ~3 t4 V$ o# b7 `! w6 V, w{
. j7 E/ i0 @, R3 J9 r! C   printk("release success!\n");5 [7 f' O0 I, K8 H
   return 0;
7 X; N! x" V9 ]7 u' G; w0 G1 K}
8 ^8 y, u# w) r
: r6 t. Y1 H4 b3 ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ o7 d5 L2 `( [0 m, q
{
( \, R0 I3 _. y: t) S    copy_from_user(&DXR_data,buf,len);
: q: f- V/ b" Y6 y2 u) K0 M    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 _: u8 L7 x/ `1 x7 T1 h: n: c1 }    return 0;
( z9 @$ z% Z8 p- g; T( C
" C$ U5 _5 L/ f- ^0 e8 Q}
. ?7 E, }" a$ u  j* C- M- Y& @
9 ?6 {8 V0 x% ]4 t# l- v# F! t. Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ {4 l6 l& o0 X7 F6 c2 K4 M% ^% @! q/ S
{ 6 |1 c- Q. w- B8 B( K6 B8 b* y
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 ~$ U3 K! X# i, c8 y   copy_to_user(buf,&DRR_data,len); / C5 r% F+ H" z! P5 e" u
   return 0;% D$ `3 t! z/ J7 @# {7 o' I. r
}
) L  |' N% I' `2 q9 ~
# {" s) |" k2 b+ M6 y1 `" P
% b- y6 d) |3 @) rstatic struct  file_operations mcbsp_fops=- G8 O# d! D: K6 P! b" B
{) `& M- V$ w0 ]
   .owner=THIS_MODULE,9 A' J7 U. F2 Y, T% t3 w5 V$ k
   .open=mcbsp_open,
( @" A1 x1 U3 m( K+ F% ^6 f: n6 S3 D   .release=mcbsp_release," W  P9 H* D1 o" c( S
   .write=mcbsp_write,
7 [: |' J- g8 ^& K! ]   .read=mcbsp_read,3 X3 P3 ?/ w6 b- Z# Z& Y
};
4 O( n2 K( x0 L3 T' k; v9 Istatic int __init MCBSP_init(void)7 p6 k' W% o- c, j2 D9 h8 _* N
{- S6 I( w2 N( o; |7 C! L
   int ret;7 G% R2 f  v/ o1 B9 R& Y, l* v. E
   unsigned  int   PINMUX1_REG_old;* p$ N! \/ {( X7 i$ k
   unsigned  int   PINMUX18_REG_old;0 u, ?( d, ]3 n
   unsigned  int   PINMUX19_REG_old;: q! Z/ E& B6 C( o( m
   unsigned  int   temp;  2 R& o! r* d5 {4 O
   if(MCBSP_MAJOR)
2 Y! _( J$ U8 z   {1 ^, @8 P. ], O: J: ~- `
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
# M9 r# B% z% H$ C# I. g      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( x; R) `/ P1 \( U* _2 P& C
   }7 I3 u; v5 Q& s, M
   else
- ?# p7 v( ]7 d* W5 U   {5 {: w7 `; q$ H
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! A, q% o9 A; W6 ^# s- ?( H% v3 D
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
$ q8 W( [8 V$ F/ D: z   }
' ?' g3 b' E4 Y$ T. R0 U   
( [% C7 p! t# S- K/ a% P   if(ret<0)
: l6 \8 g7 H$ A$ B1 @   {7 C3 N7 F( i/ @
      printk(KERN_ERR "register chrdev fail!");4 F# b1 x: d9 }* f. J
      return -1;
  I' @. i& P# x/ [; F+ l3 _" ^) T2 D: m   }
2 ^( I! L/ w! Y; T* p   4 }, j4 J; ?! |8 n5 N5 i
   mcbsp_cdev=cdev_alloc();$ r/ g3 a8 R+ M" C4 A' e
   1 J- T/ ~6 V, q
   if(mcbsp_cdev!=NULL)- [" c. @8 u/ o' W* r2 ?
   {
5 t  M% Q- H+ i      cdev_init(mcbsp_cdev,&mcbsp_fops);
# M! ?" |1 M) \" V5 N2 J# h  G      mcbsp_cdev->ops=&mcbsp_fops;. q/ O+ Z4 v! D
      mcbsp_cdev->owner=THIS_MODULE;, \, ]# G, a8 i  C6 ?: {& V
      & A1 D# k. D- Z& @0 R
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" c' @2 A7 R0 `! k0 t) T          printk(KERN_ERR "register cdev fail!");
' Q$ J; Q( r# r  y& Y1 g9 s      else
6 z, H% L2 ?2 L' d8 p          printk(KERN_ERR "register success!\n");
4 S0 ?3 L+ H; J   }
  o! A/ i; |6 ~   else7 t- a# L# x% F1 e) Y8 \
   {
0 P) K1 W4 F0 _2 Q- [( ^1 t, X2 z      printk(KERN_ERR "register cdev err!");8 l& F9 I% N5 b3 d
      return -1;
5 R6 ]/ |: D3 p. h   }0 Q, G: L) |! G7 Q
   ; H& J: Y9 O. h
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ e1 S. B/ C- }0 Z
   if(IS_ERR(mcbsp_class))6 |4 O  G9 ^8 m( P8 P' L. M
   {1 r4 h* {- X) r3 h+ Q6 d: \- ]
      printk(KERN_ERR "register class err!");
9 M1 \0 ~5 C% H4 w2 @; u0 m   return -1;
& I/ N0 S/ |8 E$ j# a9 j6 ]! ?6 ^   }! B4 r7 [' \$ O
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
% J' v2 q: M- \4 T0 T
+ I6 \. \- L5 R8 ^* A% d3 I7 i   //PSC, k9 w: d" E4 Z$ Y& Q  |
   //add Enable MCBSP
2 ~$ @7 G# i: b2 [' X   //test: k4 Z5 f$ c2 S- w# @$ o! @% d
   temp = 0x80000003;) q6 L8 E( T3 n& @9 O6 Z- j4 [* b
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! q( C" G' i5 G   temp = 0x00000003;" s9 v, Q2 W3 ~, @1 _6 `- c
   writel(temp, IO_ADDRESS(PTCMD_ADDR));' ]- {( `- S6 F3 c
  `8 ~" e7 t  @
   temp = 0x001FF201;
' ~- ~5 G/ n! H! ^* O" u   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) A! e6 t1 B9 E2 D  A
   # h1 q7 j- e# `4 A  f
   //PINMUX  
) Z% Y  r5 K3 J   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* w- {  e: m9 u) s" ~
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
% o) i* Y0 ^7 P$ ?  F- D9 O, u- p   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 L% R" Z4 O( n$ d; J6 i' W( t0 a   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: j& k3 R& t9 m" O& p' [
   ' A% n1 I' w# R$ F
   //SLEEP_EN,EPR,L138_SHK1,L138_RC% i% v3 g2 N* l' J
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
! B" A& v! ~$ n$ P   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 b, T# `5 U; n; E) W6 ?
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ F( A$ n8 B5 @! k- r( v
6 \& P( ~& y# g- {' j9 n4 F   //RESETn,L138_SHK2
8 q" [6 u% |* ?2 ^   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- b0 G0 s3 Y4 h' `) j   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   + \- Q/ p! m- Y) x% {9 A
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# T! f) [, F; L4 m3 n
( ?) Q! ~# ], x; O$ V4 v, w

7 h0 y$ t( r; f! x0 c. m  //SPCR Register5 K) E0 a8 W0 `9 i" X1 y
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; Y/ a* M0 w/ I2 v! ~1 q) y
  temp = 0x03000000;//(DLB=0)
- z8 `0 q$ ^" _( f. a8 [ // temp = 0x03008000;//(DLB=1)1 E4 ?) n0 t) b7 ]/ A) u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset5 `8 I. q. j' g0 m. g
  temp = readl(IO_ADDRESS(SPCR_ADDR));
* [: u! V- E6 u" k* n" T  printk("temp=%x\n",temp);7 p- ?: i+ V6 H* l

- F# ~  H; }  i9 k   //PCR Register" R: u0 R' v9 o4 [5 s; [
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' [; R+ ]9 n/ X8 x
  // temp = 0x00000F0F;
; ~% O9 v4 J: C9 n9 j! h  temp = 0x00000B0F;
6 a% ]. i+ W% G" `. C  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 2 f" }8 ^  g+ h  y
  temp = readl(IO_ADDRESS(PCR_ADDR));
& z  e. i8 w- a, t; G  printk("temp=%x\n",temp);  
1 ?1 B# i0 o; f, Y" e% C5 r, ?   //SRGR Register
+ s$ a6 w! R1 f" R7 B$ S   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* g$ A4 x/ m: l9 M, y+ }7 m/ a  Y
//temp = 0x301F000B;
, T( ^0 i6 e2 z+ @  ^' S+ z( ]   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 4 Z& @# x& J4 c+ `5 O
  temp = readl(IO_ADDRESS(SRGR_ADDR));  p3 h1 Y: r; k' b
  printk("temp=%x\n",temp);1 M& I! L, \& h: q9 M5 w
   //RCR, z& i" e" ?. N8 k1 l1 Q5 m
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ c/ r  n8 ~. T; u
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, R( {2 ?1 W' W
   temp = 0x00440040;/ G* n& f% q6 c% c. J0 c
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
4 B6 ~. c  k8 |0 _! {" z; b* K, ]   temp = readl(IO_ADDRESS(RCR_ADDR));
0 `, F. @0 Q+ [  C   printk("temp=%x\n",temp);
  C& ^/ f. m9 h7 i/ f8 ]$ }   //XCR( p: M5 U. Z, u* p6 t7 P
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) F6 f) O- q) P6 d
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 P/ V6 u, z! J7 s9 a& c9 ?   temp = 0x00440040;
; I0 e. B$ F7 [  D' t   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
) J) p/ F! C3 z6 z   temp = readl(IO_ADDRESS(XCR_ADDR));2 E6 S1 F; [) n3 g# q. x
   printk("temp=%x\n",temp);) R9 U7 w: B- ~+ B. ]% N. R
  udelay(100);6 B. [0 c" q7 n& Y
  //SPCR Register- D4 \8 z' |8 x7 a4 r; w/ z
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, P  P* C1 q* q4 Z9 B+ b3 F/ b
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  S$ F2 J4 Y4 h  o- K6 Y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled+ B/ Z. i" N/ K& ]% n7 [
  temp = readl(IO_ADDRESS(SPCR_ADDR));: J2 O: l. I* U/ `) K
  printk("temp=%x\n",temp);
/ i8 i( s( c% }, c7 ]$ P  udelay(100);
" o9 a3 k; I9 O; P! {9 a* N9 Z
! W' q& f7 S- b+ U  //set GPIO direction
* P, P$ f; M" d: c: y# q   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* M9 t6 w: `" K' R. V& a   temp = temp | 0x00000100;//EPR----input! o( @8 o  }8 T
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 F* F6 P/ _: V( W- M2 z+ c5 t   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ' P3 G7 L2 T" O. X# F
0 M8 j5 @. p/ ^5 _& q
   return 0;
: }% w# U' y+ t" T, X3 y7 M}
' U/ g5 H+ o' Q9 o! b% D' V/ Lstatic void __exit MCBSP_exit(void)
# q6 V% q4 o! S: c3 ^8 q{
3 _* b6 `7 O# V3 i" x   printk("mcbsp chrdev exit!\n");" K1 l' N5 b# p. Q
   cdev_del(mcbsp_cdev);" g# |9 M, t4 W7 |, Q2 X; P" M; j
   unregister_chrdev_region(mcbsp_dev,count);/ {( X- I2 n7 l4 R6 x, W# \
   device_destroy(mcbsp_class,mcbsp_dev);6 ?' R7 S: \% K: G; m! F; v# Q# y
   class_destroy(mcbsp_class);
8 [) {* d. H2 O) l1 F}
5 k" w7 @' B; r3 x4 p& [module_init(MCBSP_init);
6 J8 A1 I- b6 _7 R4 z8 r+ A$ ]6 l* umodule_exit(MCBSP_exit);# `# s8 L3 w- n. |+ z/ w

% G; |+ S+ y5 r8 uMODULE_LICENSE("GPL");
, F. ]2 E, ^! |' V# f* |/ m" [1 _; t1 w* w$ K, J7 K! Y( u2 f: X% @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 g  ~6 W8 i0 G) K# x/ Y8 {
我的应用层的测试程序如下+ B, V4 m3 L$ }3 }, n
#include <stdio.h>2 J1 e! ^5 F& Y* t. N0 i
#include <string.h>" A: l0 ~+ l! L; x$ w2 g; ^% l
#include <fcntl.h>6 r& @$ U2 _/ g; I
#include <unistd.h>' _& v1 K! X# e- S# l- S
#include <signal.h>- J. A! n& u% w& N( Q
#include <pthread.h>       //线程
% ]0 @; ?6 l2 j( S% K#include <stdlib.h>3 m# d1 i+ P+ K/ H0 L. x- q
#include <pcap.h>          //捕获网口数据
& M2 R$ i  x3 X( c/ E5 _#include <semaphore.h>     //信号
, o8 ^# T9 E3 l/ v0 o; u) C3 \! V#include <sys/types.h>     //消息对列
  s. N8 L; @+ o" M' r7 c" a% R$ V#include <sys/ipc.h>       //消息队列
4 j* h0 ^2 D: y4 _4 I- s$ G1 N#include <sys/msg.h>       //消息队列* w! V* c% Z( @. x7 M+ p% z
#include <sys/select.h>
( G% |# ?" \( f#include <sys/syscall.h>
" a. a. s1 V5 @#include <sys/stat.h>- D1 K+ \, z9 w: D$ F5 o% m
#include <sys/mman.h>
& u! Y$ h5 K/ g: Q5 L#define msleep(x) usleep(1000*x)! E" ~: @$ r% C& K1 G7 f6 \

' a5 A, Z9 d( ?6 B$ j( s, h$ Xint main()) T% J% D, F. l) Y) V1 ]
{
9 ?) l- R' d' g+ @, g    //MCBSP,ARM与AMBE2000交互设备1 j* I) J5 L8 ]
int fd;
# f8 l5 d0 N' f) |8 _7 Y' o unsigned short data_write = 0x5555;+ ]5 E' b9 |1 |8 Y/ W- n
unsigned short data_read = 0x00;7 g+ o4 D3 @* j0 r  w, I
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% V7 t. ^1 f* \0 N' Z$ j& J. B0 O' f
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 W% O9 N% {) G/ t; m! k/ n    ; p: L) t5 j2 @& n
  if(fd < 0)/ ^4 z/ W% X  ?- {+ H7 A$ H( E
  {
: u  ?3 l# Z5 G# t( ?) S/ y     perror("open failed\n");7 Q  O( ^3 h3 F/ Y- R( ?
     return -1;
# \3 L; a- M6 z$ H1 O( u# x  }) l# x* u7 S2 d2 |1 _5 w7 O) U
  4 L2 s: b& B1 j0 j! {
  while(1)0 i$ [: m  L/ T
  {
* s! X9 s$ h3 |/ V: {3 _   " U/ A. p! W3 r0 Q+ x1 h! D
   //AMBE2000每次读写是24个字为一帧
" Z% _  N/ r+ W7 g4 x* d   //写数据时将数据在底层存储起来,等到中断的时候再发送
7 \/ D/ v+ n+ M: z   //AMBE2000输入数据是以0x13EC开头的
4 h/ ~) K; {2 I; J   write(fd,&data_write,sizeof(unsigned short));
/ h8 n3 b% z" L/ W( L) l   5 W; O0 H6 w& S* }, g* M3 U6 v4 l
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 t0 `5 L# V( G3 g
   read(fd,&data_read,sizeof(unsigned short));' n+ u% L0 I4 |2 G- L
   5 X" ~7 R% l. ?* N+ k! |# y- q
   if(data_read == 0x13Ec), [' H1 p/ O; x4 \. H
   {
# v8 l* }; t# @$ H   ; k6 |: Z( A7 B  {4 x
    printf("data_read = %x\n",data_read);
& }9 N9 _" O3 X, m7 L& l   }9 O  `2 c9 W. Z2 x1 U
   1 r& @0 h: g) P8 G$ n5 k7 y0 J$ z
   msleep(10);7 i4 V; t8 k: J
  & U  Y& p4 W/ k4 z+ g1 X" H
  /*
9 ^5 Z5 W1 Q+ K   ioctl(fd,1);   6 q$ H- P( T" y% [1 E
sleep(1);
$ C8 J" B+ m# P( O7 I5 W ioctl(fd,0);
, m$ k: j+ Z8 t4 ~1 j sleep(1);6 Z* O$ N% m5 m
*/ 8 V) z- l1 p3 i1 J
  }   * U+ \( G7 G, Y2 h  r: h* C. o* M. J
return 0;
4 A3 R' j) i3 w( o& y7 w1 z+ e. ^
! O5 d7 g9 ]/ v! X; @' L  ~}
  X: F1 {% v) O$ J% Z( H  |/ D/ ]( K5 H6 P
多谢各位指教,谢谢! 急
+ x' z! w2 N$ Q2 f* ?3 b
8 ~. `# \$ G8 m  H7 H
  L3 |6 G' F! z# M5 v! M7 y1 N4 N- c  P6 A5 ^

- ^9 L" R; M1 `2 q, {' m3 E# K$ R9 l$ Y/ @9 K0 f- y3 e. |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-10 08:14 , Processed in 0.046881 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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