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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( ?9 p1 a: y: y2 P2 b2 V# |) ~
/*
0 S/ V5 L2 E+ R  F9 T * Copyright (C) 2009 Texas Instruments Inc, I2 Y+ [$ \7 ^! ~4 H% u2 F9 g6 w
*
- \3 L( ]  U6 t- C& y' P) ^ * This program is free software; you can redistribute it and/or modify
3 x$ m, Q. Y; h8 m. n0 `5 ]5 i * it under the terms of the GNU General Public License as published by
; U; Z' {0 {# a: m+ S: c * the Free Software Foundation; either version 2 of the License, or, k/ b; ~5 C" D( Y3 X- p# m# B
* (at your option)any later version.4 Y. L9 H: M% D5 d7 W3 S  j
*
* A& e; }' ?7 Q" G/ E! w! [ * This program is distributed in the hope that it will be useful,
% w8 N7 h/ e3 [ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1 M5 S7 P9 e+ {3 u' j2 g * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 u4 ~3 `  s# r% L. _
* GNU General Public License for more details.0 N- d2 j# P) }9 y; ^& [* j0 V  O7 K) n
*9 P) S# k' ?4 e8 |0 O6 {
* You should have received a copy of the GNU General Public License
- I. q& n2 r. g$ W$ Q. a2 M  S * along with this program; if not, write to the Free Software5 O/ s% {% r6 Q, ]( b1 H% n6 S
* Foundati1 g5 j& m( r4 {6 j* O" d5 _
*/
2 \! m, V9 o! y, t, K0 v$ q* m#include <linux/module.h>
4 x" R7 X" J6 A- W; c5 O* u#include <linux/init.h>5 x6 F4 T& s; G, ]
#include <linux/errno.h>
9 L$ n- w9 t, k1 g1 S#include <linux/types.h>, p1 g: t$ X1 D9 M9 r: C
#include <linux/interrupt.h>
% z& g% U" ^! h- b( X7 i( t#include <linux/io.h>
4 p+ v, R( d7 M  O. }#include <linux/sysctl.h>6 f* R$ X5 q( P: \
#include <linux/mm.h>
7 }1 k. k/ L, r' f, n: ?2 s2 `% H' G#include <linux/delay.h>
& A8 F5 ~* z0 L#include<linux/kernel.h>; {, X& [: ~2 k) z6 F  x- F9 i
#include<linux/fs.h>
4 x( \* Y5 v, {) u6 z2 G* X) V  r#include<linux/ioctl.h>1 O/ }2 `  V" h
#include<linux/cdev.h>
9 M* c2 g. s9 h#include<linux/kdev_t.h>
5 U! a' q3 G3 `#include<linux/gpio.h>2 f: k' |' n& x0 D
#include <mach/hardware.h>
! x* `! X) A% b& R; l  u/ R+ c& v; V#include <mach/irqs.h>; I: a. p2 a6 G: D; R& T

0 h9 M' `: ~, S9 ~! p9 c0 T#include <asm/mach-types.h>
) x7 d1 D/ Z; R  v. o#include <asm/mach/arch.h># p  b# q! F) {8 o/ E) y
#include <mach/da8xx.h>
; l4 D+ S6 U1 @% S1 N9 W#define  SYSCFG_BASE   0x01c14000; z. f& \" g7 N- N
#define  PINMUX1_OFFSET   0x124
( I' @3 Y5 A& a9 G#define  PINMUX18_OFFSET  0x168 / I9 G. t3 P# i; W3 c$ s
#define  PINMUX19_OFFSET  0x16c8 }7 c; u1 z/ n% B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ d' {& W& u" F$ ^7 R$ x$ @: a5 i#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR. r1 j  t* o, F
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
- [" W( X* a% f#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' E. \% o% a& L2 E8 @#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
% t8 x  j* f' n; m1 v1 R                           
* r. c/ G) t8 {3 S, J6 P7 d0 r#define DXR_ADDR      0x01D11004  //MCBSP1_DXR4 s. s# L- O$ C% E& I+ T; v
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
4 S& k! c$ y: O0 m4 b//PSC! m$ ]/ r* c  m4 J, K9 ?1 K2 ]5 P
#define  PTCMD_ADDR   0x01E27120  : `' m: K" X. F: N
#define  MDCTL15_ADDR 0x01E27A3C
9 t0 r. o3 B  O) {* Y#define  PDCTL1_ADDR  0x01E27304
" v% e2 p" X0 f: j. L5 [. l! H//GPIO8 direction& d9 x+ c; Y! z3 i; c% `* L
#define GPIO8_DIRECT  0x01E260B0- o. S' O( I) `  ]. R8 T. p, {
#define GPIO8_OUT     0x01E260B4
3 h! T, r; ]$ P4 I" B+ G#define GPIO8_IN     0x01E260C0' e9 |. d5 E  D  J8 j# u3 H2 ]5 q
9 c. Z( |  j- ^
//#define MCBSP1_RINT    99              2 I- I' K8 x) V
//#define MCBSP1_XINT    100  
2 m  K: z9 l5 Q6 z+ n9 Ustatic int MCBSP_MAJOR=239;
! y7 u7 H: I- g9 |static int MCBSP_MINOR=0;
* U+ w3 @! p7 w$ ~  }static int count =1;- u8 A* b- M9 |

8 V9 }- r, U: M+ ]9 v, l7 w2 G3 S#define MCBSP_NAME  "MCBSP-device"
' J- A8 y# J5 ~: N
+ O- v- t4 L" [1 l3 u4 }static struct cdev *mcbsp_cdev;( H& `) V! q. i* N, {1 U& d7 P  _
static struct class *mcbsp_class;
4 I. _0 T# i" Istatic dev_t mcbsp_dev;
1 n% L0 V. K4 Q* k; |" n" }6 ounsigned int DRR_data;
! z3 i1 \6 W- I6 ]+ W) ~% R& l1 p* _unsigned int DXR_data;1 B; o( l$ _+ L- |9 v: s
static int mcbsp_open(struct inode *inode,struct file *file)8 r8 Z. s+ }+ v9 n9 i
{  H+ ]/ q- g5 o1 x0 }1 l7 c
   - J2 h; U# Q0 ^. e
   //interrupt enable,initialized+ A' Z. F% W5 e- X# [8 R
   unsigned int temp;. G! `, u* I7 B3 \5 Z" O8 ~7 c
   //SLEEP_EN(GPIO8[10])---0
. f" c; G3 b) ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 @* Z1 H" K' J1 N% j' O- N   temp=temp&(~0x00000400);# L4 L! I5 L7 `/ R* L! J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! c( p, a- d4 G, u) m9 R  //RESETn(GPIO8[8])----0----19 W" ^5 {: L, A4 @6 {
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& D& e, F+ N+ O! X" d
   temp=temp&(~0x00000100);) _5 G% z( |, N1 h- x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( o4 {# I& E2 l% o4 ]4 ^   udelay(100);
) V! ?+ a# l) |, ^$ V" N   temp=temp| 0x00000100;
" i& m) N8 e) r/ z! P. t; E   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" Z+ K! ?9 i5 e# [' Z* x! n! _   udelay(100);9 ~7 [) J& o6 K/ x, k! O1 ~
   printk("open success!\n");
0 j8 k2 R5 C* g/ d% d7 x6 w   return 0;; y1 p. x9 L- ]% k' l' [
}7 L& ?- x/ Z+ `5 G0 E

% A3 x/ Z$ ~4 V/ X. |static int mcbsp_release(struct inode *inode,struct file *file)
( S0 Y* C; p4 G2 x3 w# c" o{
3 `* g: D1 F7 P6 N) a   printk("release success!\n");
) a* {: N5 n. [6 h4 f5 a: `* r   return 0;
. Q' ~# O9 X2 m9 }' j' l; h}
; w$ }) [( f9 Y1 V0 M" l6 @2 m; X1 n/ U1 ^8 t' o
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( x1 `2 O7 T; i) B1 G2 T{% `- D! j: T$ L6 @
    copy_from_user(&DXR_data,buf,len);
2 f+ j- [* O! z* J; J. H    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # W# v" ~' D# c0 `$ o0 K- w
    return 0;; c% r# ^' {3 \! J6 v
& l6 S6 a& d5 _& Q5 G! ]5 k2 f) Y% F
}8 N3 X" f. }/ i, R, W6 k6 ~

+ J. o+ O4 j9 b  Xstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* e! B& T. O; t; j/ W" t{
! ^) z- P+ h/ a   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 Y' x# X: s! ~' \2 Y: k7 A4 z
   copy_to_user(buf,&DRR_data,len);
+ f/ T, U8 O5 s! B   return 0;6 G8 Q3 u5 K8 ~7 d" [
}
2 i4 s& z! k! A2 {
2 r- V: O! D8 r+ O- O* \
7 P8 R6 O; N& _- F3 Bstatic struct  file_operations mcbsp_fops=
. w7 }( q: a4 L- Q! g{
) L% P; H' p' w& X( L+ T- t   .owner=THIS_MODULE,* I+ X8 W9 ?+ G0 R: k; m- [0 D
   .open=mcbsp_open,
' X) k% m- B2 A   .release=mcbsp_release,
( ?* K+ I9 M: k+ F   .write=mcbsp_write,
7 m1 n4 S% T) l1 f; J; I   .read=mcbsp_read,9 b% y/ g0 ?- @
};
; F/ c* E) s! @6 F, Tstatic int __init MCBSP_init(void)
- \7 Y2 V$ {- I8 y8 t0 g6 F1 J2 O{  Z' ^2 ]) i$ \; M: w; \
   int ret;* w2 k* C8 o$ B( E8 w
   unsigned  int   PINMUX1_REG_old;
8 q7 G8 `* \3 L9 |( w   unsigned  int   PINMUX18_REG_old;
3 v: c: ?+ N, Y& t   unsigned  int   PINMUX19_REG_old;
) h0 V7 R& C! x% s   unsigned  int   temp;  " g! N( C$ G2 J0 T! ?
   if(MCBSP_MAJOR)
. K7 v+ T6 C9 ^- f' ^; T   {
7 v5 }$ [. f, U4 n      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 i+ e2 M: F' J3 _4 Q
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ ?5 s4 M! K; ?/ {, ]   }
0 @, A2 j3 D  i' ~) n! y% f7 C   else* u( u& K% f9 e; G
   {
! W8 {2 A0 F+ G( _5 Q3 K      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- b+ ^; l: E* X- ^
      MCBSP_MAJOR=MAJOR(mcbsp_dev);( U; j1 C" b) c9 k. E
   }
# ^# d9 a. m: h. L   - U) U$ S, G' m+ c2 C+ W/ u
   if(ret<0)
7 w) O) S! z+ M( ^* q   {
( t$ u4 k1 S, Y" m! s      printk(KERN_ERR "register chrdev fail!");
7 }; D. s. u" D  |! Q      return -1;
' W* W, Z/ _0 F# Z- _5 n, A   }
" e. C$ W' }3 j0 Y( E   4 f& [* S$ i7 T5 V: v
   mcbsp_cdev=cdev_alloc();
: ?" Y: x0 {" u/ {% |! G+ R' B   " q4 ~, O* ]% X" ^3 v6 h
   if(mcbsp_cdev!=NULL)
( D) b2 i9 |. w   {
4 m* ?. a, f- ~" t' a      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 [4 F9 C6 ^; Y9 @      mcbsp_cdev->ops=&mcbsp_fops;
* _0 T1 j/ P. g9 z      mcbsp_cdev->owner=THIS_MODULE;
) h" R7 e) _% i3 m; U      ( w3 R9 X3 L' h* F; G* l, {  _, l
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))* t# ~9 s, y& f' p7 |5 z2 B
          printk(KERN_ERR "register cdev fail!");* h- t9 T$ c  M9 Q3 s
      else
5 [3 _; C8 V7 d& R6 F$ S          printk(KERN_ERR "register success!\n");2 g+ _9 O  R1 I. C5 t$ j
   }( a. k/ j! N3 Z  i6 u/ {& f
   else8 p' C$ l* F+ w  t
   {
  `  P% _  t9 [' O) f8 a: D* y      printk(KERN_ERR "register cdev err!");
; W8 x; q. y2 Y: u, W2 |: k      return -1;
* @1 m( y0 m: S. }" L& R   }9 D& U' M# r1 \. h
   
- C7 ^7 W2 ]. L  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
" Q/ i( ?8 X- t/ D2 {   if(IS_ERR(mcbsp_class))
7 v( x2 `+ ]) r. J3 |/ s; `  h   {; L4 T9 w( K3 a6 m1 u
      printk(KERN_ERR "register class err!");
. `1 V6 N3 z: w) R# S   return -1;4 k3 \& Z& }* t& j0 a3 k, ~, }' D* a
   }
5 t! h, c4 K6 A: r' j% M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( V  t. N/ s/ O% u. S3 q" i

! x: s- ^! _8 @- Y   //PSC
5 w* [' \. c/ T   //add Enable MCBSP! {4 R# W/ c, G% e# F
   //test
9 U1 k$ E1 h, |  j   temp = 0x80000003;
% q" P/ I2 O8 L5 g6 f   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ E: o- k) i  B$ f9 M8 \( d* g/ B   temp = 0x00000003;$ d8 }( t( y/ I. |# _1 v# u
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& S9 u$ J( ~/ S4 b( T4 i$ L
$ R1 [% r7 o0 }5 j   temp = 0x001FF201;
/ z7 O2 Q6 k4 I7 E6 ]  O: p   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
" {+ G1 ~6 I( ^0 w   ; z/ W3 h7 C( G, ?7 O
   //PINMUX  ' v1 R2 |. ^+ w7 e* b) J
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ Z+ Z; S$ ^) D$ l   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 U$ e, c! W" V) L* a7 k( V
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 w- X- \6 N3 A1 N* H% r. |3 i   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: K0 n/ k& B% I4 u
   . p  |' ~7 F7 o# v/ {; O
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
% t  W  v% F8 Z% T+ `5 A" D0 H   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
6 f0 x' @  Z' x0 r! C   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ' P8 @! H5 [: g4 [5 Q
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);3 ?2 W  L2 o2 L9 A9 u

( U4 G* f5 ]5 u$ A   //RESETn,L138_SHK2
" \% r4 G7 X* r: K  k   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
8 D5 U9 J# V( E( F/ O- |   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
% h' ^" t, H/ A0 @, G  b1 u9 C; _# N   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
  y/ V: z: H: x& c ; D' {: f1 U1 I2 }" Y
& @! ?6 q  }8 R: ^! j) t
  //SPCR Register3 D8 n8 i2 U* o, a) h1 p
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 e+ A! ]) @& e  temp = 0x03000000;//(DLB=0)+ l9 c  Q1 G* _% H# ^4 W- k: |
// temp = 0x03008000;//(DLB=1)1 \. v! L) h. R+ P  q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# W) h% k' `1 a  g! F
  temp = readl(IO_ADDRESS(SPCR_ADDR));* r( X# a. A4 o3 N% K- L( h
  printk("temp=%x\n",temp);
6 w  q1 `$ Z, [7 }
0 u" `) s+ _" c) M   //PCR Register2 w  t8 ~* |  e1 }* l7 n" R
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
. G/ u& F/ \- }- r: n- l5 m  // temp = 0x00000F0F;& M: j8 a' G) g
  temp = 0x00000B0F;9 {/ c* M: S; ~. Q' U( R- ^
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ; Z) e  n$ \8 J8 t8 i
  temp = readl(IO_ADDRESS(PCR_ADDR));, D( T' b; A: q' f, A
  printk("temp=%x\n",temp);  
$ ~5 I2 ~6 B+ F7 Z1 B$ X   //SRGR Register/ h" ]$ Y6 g* T. N8 x2 v+ l# Q
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 @- i; X8 C4 P$ ]2 g //temp = 0x301F000B;
$ D2 M+ l  u8 V5 z6 y+ Q2 g/ j, s   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. B. ]: I( ?$ J' o  temp = readl(IO_ADDRESS(SRGR_ADDR));( T' C7 E0 j- P" a! E( C" k. D
  printk("temp=%x\n",temp);
' B9 F2 v1 A; ?; k  q& `   //RCR
# U! k+ X* n& x  s* x% I   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,# K  b0 `" ]- O3 W! B/ i9 J9 \# E
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 |! b* N1 R: [; l# J   temp = 0x00440040;
8 E% U2 k8 P" H$ p# B2 u3 S- G6 }   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
' b3 G7 r' p7 y/ k6 F4 i$ ?5 w   temp = readl(IO_ADDRESS(RCR_ADDR));3 T. \, Z3 e3 k! S
   printk("temp=%x\n",temp);
# u; |0 W- F4 X8 `  i& B( ^1 R- \4 S   //XCR
. U" }" w/ a1 h1 R. \. V0 l$ m   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; }5 ?+ {7 d. I; K: C4 X  x9 e   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. Q9 T, O! r9 R
   temp = 0x00440040;
/ Y8 I/ }* J7 P   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
% r2 V' L) K6 E% }$ V8 f   temp = readl(IO_ADDRESS(XCR_ADDR));
3 e8 [; q8 {* B6 v   printk("temp=%x\n",temp);( R' e& y# e4 ?7 k2 F: u' E
  udelay(100);* e! j. X! v# Z
  //SPCR Register, `( T: m1 h# E1 o
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
# H1 W0 b, n* S) g1 k% E  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
( X0 j) S9 L9 Y$ j4 {  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
; u- J4 m5 Q' h, W  temp = readl(IO_ADDRESS(SPCR_ADDR));
% W4 W$ m5 }* A! X5 e1 f  printk("temp=%x\n",temp);3 _2 k7 G# Z; F# `  w) c2 P$ G% H: b
  udelay(100);" J! _' ^) ~6 P/ p( ^

: M$ _1 i0 [! y( M  //set GPIO direction3 ~$ d5 ^9 V4 l% X' ?3 e& A
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
) ?8 ~4 _3 ~! |# X3 J, X   temp = temp | 0x00000100;//EPR----input
$ C# O- a  T% h2 `% |. O   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. c/ t# q1 P% h3 U( l   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 H  p! ?' K* W* Z5 R

1 \! K; Z2 x5 a7 _0 G   return 0;/ i- g3 v$ T' Q$ Y5 B
}
1 P2 ]' P& `( K% E& Qstatic void __exit MCBSP_exit(void)
; @6 M7 l" W: o0 s{+ L/ x9 H; }9 a- l7 K
   printk("mcbsp chrdev exit!\n");
  v/ F: k9 o# n0 `+ v' z   cdev_del(mcbsp_cdev);
: t" R* G$ Z1 n  {$ B, H   unregister_chrdev_region(mcbsp_dev,count);
# @$ o9 E& q6 @! H0 P   device_destroy(mcbsp_class,mcbsp_dev);# g7 p7 S3 j6 ^+ Z- g9 P3 }8 u
   class_destroy(mcbsp_class);
# V/ ?8 F6 F7 y}, ~7 i* T6 V- {
module_init(MCBSP_init);
- G) H# t9 C+ h4 w' k3 bmodule_exit(MCBSP_exit);  ~5 x& b; o/ r& a7 h- _5 N
! ]& _$ x4 p; q* e% C- s* ?
MODULE_LICENSE("GPL");2 e0 i9 h- w6 {. f2 f6 F
$ a# i7 _9 D1 g: X4 P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 v3 \9 F7 s$ t. m" Y# e' v5 J! f
我的应用层的测试程序如下6 L0 g/ U& O, J
#include <stdio.h>
! N' B& i& X2 d# @& M1 T0 a& `#include <string.h>* k# T9 M! R! H, |
#include <fcntl.h>3 L6 w1 ?+ c9 B- l4 ~4 n
#include <unistd.h>& H! ~* P8 q" O$ v1 z: B- b' f9 O* R- E
#include <signal.h>! v4 z& p5 _2 k7 ^' C
#include <pthread.h>       //线程
! R  k, H( J! ?3 |! h! b  ?. R#include <stdlib.h>
! e8 W) b) U1 Z3 `6 S- X/ B) M#include <pcap.h>          //捕获网口数据7 |5 M% Y9 D% B; t' W
#include <semaphore.h>     //信号' K' J5 \3 Q! n& z( t
#include <sys/types.h>     //消息对列
3 k7 ?) n' ~* F8 z( a. ^. R. W& D#include <sys/ipc.h>       //消息队列: P+ w+ h0 }0 f+ B7 G7 o
#include <sys/msg.h>       //消息队列1 e' n' k6 v( L) W* ?$ q" |
#include <sys/select.h>( L% _- _/ g5 b# Z, ~
#include <sys/syscall.h>+ _5 P7 o3 U( D$ G
#include <sys/stat.h>
2 n" N8 {3 ?: q#include <sys/mman.h>
) G4 v1 ?, x8 J1 A* g% J#define msleep(x) usleep(1000*x)% \3 J& B7 `0 t! x% C8 y+ F
# p. ]# m$ D$ {/ G1 V7 A
int main(). m* G. g3 ~2 d2 Q8 \" \  [4 W5 u' l
{ 3 O' B( j8 f7 N3 N
    //MCBSP,ARM与AMBE2000交互设备
6 N4 j( |2 R- [/ D int fd;
; W, y: c9 o5 Z- ]! B; S: W* E  R unsigned short data_write = 0x5555;
9 S% |; V; a& n7 I% M unsigned short data_read = 0x00;# I, ]- o. s/ M8 ^) @, D! ~
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 U1 t) F0 l7 c& W; r$ W' J& X
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* a. D5 |9 A, d$ U1 P% C   
8 @- |5 V' z2 n* @  if(fd < 0)* d1 b9 P% r, D
  {# s. s' ?1 c8 A! Z' n
     perror("open failed\n");
# Z# o. j% A! m5 |# k. F     return -1;8 j2 ]4 a! g/ k7 U8 z. h/ |
  }
; }$ g+ |+ J0 p1 s# M  * p! T$ I, X# L; D! Y7 W: [
  while(1)
) }; Y% T: i& n: `% m3 R' _9 J  {' m: `- B0 U3 z, g: O+ u
   : ?7 f4 \8 ~( \  x$ E
   //AMBE2000每次读写是24个字为一帧" B8 S$ a; _3 S* G
   //写数据时将数据在底层存储起来,等到中断的时候再发送
# c2 S4 O$ a- z# X) I   //AMBE2000输入数据是以0x13EC开头的
  }9 U* _$ ~" H) o   write(fd,&data_write,sizeof(unsigned short));& O9 m0 F# G+ U/ @
   / q; w& j5 c5 h+ s7 Z/ k3 L
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
7 y0 @, I; W1 ^4 T6 t* A) V/ a   read(fd,&data_read,sizeof(unsigned short));  x# l" p: V( g+ {3 @- y1 r# P
   
& {* K2 r5 b  {   if(data_read == 0x13Ec)+ Q. @, C$ N  c4 @
   {
/ ^# ?1 z9 D9 A. D  U( s- v$ a( }     Q# a7 @5 V/ U8 p% P& U
    printf("data_read = %x\n",data_read);" M$ o' V5 I5 d2 M+ w
   }0 C: y! w2 ^3 ]2 D# `* }* b+ N
   ; C8 h& e: _( P" H( W7 B
   msleep(10);/ h  f, w; x& `
  
8 `* A( z1 F) w% |& z  /*
4 W0 X3 s3 ?& }9 y9 w$ E0 S3 M   ioctl(fd,1);   
  L  `2 N' }. r/ T/ P) @" D sleep(1);$ X& Z) J. B0 O7 h! M+ D8 _" k3 k
ioctl(fd,0);+ A* z; l/ G2 v* M9 Q, l
sleep(1);+ o4 _: l7 `( i/ s
*/ ; D$ I, H! N9 E7 A4 t- ]7 L1 A( {8 E
  }   
' \2 l1 I, @* v* n+ Z3 ]: e return 0;
' x  L2 Q+ q1 ~  j
* S7 L! b7 R- v}% Y" q5 o+ B  h2 o1 b/ f& d

$ }" H& C+ h3 ~5 V# S- l多谢各位指教,谢谢! 急7 J7 [" C# b9 l  {/ y2 g

$ Z% c4 ?! g5 j5 H9 V4 \; ^2 U6 c0 ]8 v$ A6 K
: a: C  y* I& b" T  m1 @/ g2 r# H: U
/ P6 {8 e! i$ o
# s: M3 p' ~/ ?( K6 ~8 T, n: F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 08:52 , Processed in 0.043406 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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