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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
/ R) C9 u2 L! k1 U- t5 k6 Q# H4 ]/*
& u& d; ?3 \% h* x * Copyright (C) 2009 Texas Instruments Inc
" d  y8 E5 x0 a* F: P! F *1 o! T- L  n& G6 x$ c' F
* This program is free software; you can redistribute it and/or modify4 J- g7 i  O' O( m$ R8 |) H; z
* it under the terms of the GNU General Public License as published by, ~) f, }* t! W# S$ J% Y& d3 y
* the Free Software Foundation; either version 2 of the License, or
8 c+ B% {. ~* x+ Z. c% x# k; a * (at your option)any later version.
3 N- m5 F" ?# }9 L! R6 c *' [8 I4 R5 U& F, u
* This program is distributed in the hope that it will be useful,
: Q  g8 `0 h2 y) S4 C2 F * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 {8 e3 ?8 M7 Z2 X3 Q; ] * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! o) `8 r! Y1 c/ O/ v8 N2 j
* GNU General Public License for more details.
$ U5 S9 C0 u: b2 B2 E& O+ ~' x0 X *3 x1 P6 b9 G" U
* You should have received a copy of the GNU General Public License
/ g5 ~6 f- z  a# W * along with this program; if not, write to the Free Software% V) K4 ^& ~9 s8 A
* Foundati
4 y( ~; O- O* X# c*/
6 @4 e0 R% R4 |6 N* X#include <linux/module.h>7 V! ~; W6 v. E3 G% e3 D
#include <linux/init.h>
. }; s- S" g- H* o$ L#include <linux/errno.h>: ^+ t7 L% M* ?" b- N5 [! _
#include <linux/types.h>
  v9 }: |& t! r8 P& X8 ?  a, w#include <linux/interrupt.h>
0 f; ]" l& D9 H) p3 `8 |" S# z1 U#include <linux/io.h>, i3 |7 }! Q- y9 W0 K/ N: {! p
#include <linux/sysctl.h>2 z2 {4 m; W4 e. q% p+ Q
#include <linux/mm.h>
$ G; e) W2 y) ~" u0 E#include <linux/delay.h>
/ v% D" B" d, x( h' I  ]) Z$ ]# H2 I#include<linux/kernel.h>8 y* M; i/ i  z5 [; u$ Y  i
#include<linux/fs.h>
6 [. \8 V' Q; i5 S#include<linux/ioctl.h>
8 j, E5 Z5 P) V, F#include<linux/cdev.h>3 B7 N2 x9 O, S8 }( W3 t) _; H
#include<linux/kdev_t.h>  _) @) q$ S" E. \6 w
#include<linux/gpio.h>
* j. l( Z) D& m  v- s#include <mach/hardware.h>  \5 `9 L5 {+ ]8 |6 z2 w
#include <mach/irqs.h>
( V- C% B8 {* c. B0 t, z7 j2 n, X3 `7 H& F
#include <asm/mach-types.h>
' \1 L5 [/ r0 A1 V7 J/ }' \! A#include <asm/mach/arch.h>8 H' e$ Q  ?+ i6 x" S
#include <mach/da8xx.h>
1 e- q( X9 [0 L7 c" e0 k#define  SYSCFG_BASE   0x01c14000* d4 ?! T; f* E) `, o/ O& U  @5 ~
#define  PINMUX1_OFFSET   0x124
, H9 a! \  ~( B! f#define  PINMUX18_OFFSET  0x168 ; W6 N' W8 T7 @' y5 H* u
#define  PINMUX19_OFFSET  0x16c
# ?( L- K) v3 k( {#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' D  C8 V9 B0 M1 a1 j( P5 o$ G4 e, a( u#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, `; ]; N: ^% t" E3 U; ~#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR5 \" s- A2 K4 d+ n7 v: W$ B9 @
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) L1 C, O. e2 Q5 _: O7 }#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
# s- I& E* \( n0 R2 }3 ?                            " h- F. T" s* y& g: e
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
9 d: ?, M+ Z; ^9 E1 C( s1 ^$ W#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 L2 t0 N2 t4 E//PSC0 ~' H& O  O7 s; I
#define  PTCMD_ADDR   0x01E27120  # U0 z* U/ U3 ~  L$ f- l
#define  MDCTL15_ADDR 0x01E27A3C, Y8 a( k" K, b$ c6 y/ `0 M
#define  PDCTL1_ADDR  0x01E27304
, u7 K, E4 q+ e3 C//GPIO8 direction
7 F6 Y: h" q& R#define GPIO8_DIRECT  0x01E260B0. ?0 K; O4 h: ]+ _* P4 o6 f! \
#define GPIO8_OUT     0x01E260B4" j+ g) z; N) M; H
#define GPIO8_IN     0x01E260C0
: Y! W- P6 ?3 ]+ O5 n/ ^7 s/ _$ @2 i7 z; p0 K4 k, S" b4 @2 I
//#define MCBSP1_RINT    99              # R8 r# u) e! @3 m4 I! r7 a
//#define MCBSP1_XINT    100  . a% ^( j5 D: H
static int MCBSP_MAJOR=239;
" _  _& t6 }' p% E$ p8 G  @9 fstatic int MCBSP_MINOR=0;
. q8 g# @7 ^$ g. vstatic int count =1;+ N8 H. Y$ I# z
; _8 s, k+ S" |8 N; u) o4 c
#define MCBSP_NAME  "MCBSP-device"# ?0 ]  C# v# I
' p( Y; ^0 D. b# C+ t# C4 o
static struct cdev *mcbsp_cdev;/ i# q9 _' X/ G$ e
static struct class *mcbsp_class;! v8 e1 j' g$ C
static dev_t mcbsp_dev;- A' z( Z+ H4 m' N' e! x
unsigned int DRR_data;3 s3 G" I& ~: |) [! m. w
unsigned int DXR_data;
. n& |9 [% D# `4 {static int mcbsp_open(struct inode *inode,struct file *file)
/ R0 ?, C% F; n" v, m* V  ~{/ T6 k- `- S" F6 I! e
   6 y: M" K* Q/ z4 O8 F5 i) o0 K! _
   //interrupt enable,initialized
8 @1 }6 W' s! y" m, ?   unsigned int temp;6 m; T4 m! Z( v8 ]6 o3 z
   //SLEEP_EN(GPIO8[10])---0( X6 W: p9 Z9 D4 P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 D  o% x$ w& @) V
   temp=temp&(~0x00000400);9 ?% }2 n3 @* v3 E, t& F
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( y& ?8 D& S! W: @" C0 |
  //RESETn(GPIO8[8])----0----1
, {$ O3 d" u# u6 n( L3 F1 |9 d   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));  V2 [5 c1 h. _" O) l
   temp=temp&(~0x00000100);
" K4 V  r6 p! G2 ?, e" X# _! x- ~   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---03 M: `4 d  [0 G9 K
   udelay(100);2 M7 Q4 z3 P3 l$ W: M- I" N0 V/ E
   temp=temp| 0x00000100;
8 M; ~' e! e% D/ Y2 x3 o   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1, y9 v5 p+ L4 ]4 r# }+ f- D1 X
   udelay(100);
. K/ x, _. B* `& s2 A   printk("open success!\n");
4 T! w6 V7 y& u. Q  k# X( |( z2 y   return 0;0 J) j6 b2 \% ~, q5 E
}
; K; E  K2 X8 c: q- Z3 O
4 g* K. P: v' Q% astatic int mcbsp_release(struct inode *inode,struct file *file)
# S. I- z$ g, r) @7 a; G6 U{
. E. Y# p1 z9 j   printk("release success!\n");
& q6 u# v: w6 s7 W$ z2 L   return 0;
' Q) V' [, S' t+ k9 _' I9 z* {) }}- M, T4 N& H- P- {

: y' g  _: l) A4 d$ Q: estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
. l: t/ N8 f. U5 Z3 v. t5 N{7 }9 o/ ~" e  ]5 Z) G* V
    copy_from_user(&DXR_data,buf,len);) E5 X9 f" ~$ N5 w2 w3 B/ ]+ i
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
% X4 o+ o  w. y* e/ h; f    return 0;" J: o4 B4 Z; P+ E) |; \
  _% j/ A' F4 v, }5 i
}
7 ?( {3 A, [2 I
2 ~2 K% b9 d7 Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" O' |' v5 `) E8 m( _{
! h7 K3 i5 v) o) J: k   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 t- e0 z' N2 x, h7 }; Y
   copy_to_user(buf,&DRR_data,len);
; v, v# f: _4 a6 z* L   return 0;2 C5 A& c) o: R  U8 X
}
& c3 L5 j3 ]! W; l& O& n+ n
; O5 [# b; v2 `, h' t
. z- f! I/ m. dstatic struct  file_operations mcbsp_fops=0 P7 S' R7 X! N1 i3 N8 r
{
" _+ S# g( r" C   .owner=THIS_MODULE,
6 m' ?3 M) X' a+ L/ a; |: g6 j   .open=mcbsp_open,
" F) _5 ?/ p) i5 B7 }' j2 l' y7 R+ b   .release=mcbsp_release,
- x& W0 K# R5 y/ f   .write=mcbsp_write,
. `9 A) c  n; a6 w- m& P   .read=mcbsp_read,
5 N; K0 B  N& V};7 k# o+ x8 V$ L
static int __init MCBSP_init(void), v5 o& R+ @$ B4 X$ D+ a5 K$ Y
{
2 i0 w0 r7 B. B# n8 r   int ret;, g$ b2 f/ @" C" G4 U  j' U: U0 Z6 W  W
   unsigned  int   PINMUX1_REG_old;
# Z1 I# b3 Y3 ]% z( F7 B5 ?   unsigned  int   PINMUX18_REG_old;
6 G3 d% z7 R3 B3 z/ t" r   unsigned  int   PINMUX19_REG_old;$ ?+ t+ Y& i5 G* I. A
   unsigned  int   temp;  
( L1 M+ \4 A# v" Y   if(MCBSP_MAJOR)
, `. S! M7 T. h( F   {. p8 i, {7 u0 _3 o# P- K/ L8 L
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 [( y9 z, C* t: k& G
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& L- B+ n& Z& J2 Q, b3 e- O3 B   }5 |9 o. @( N8 K4 M' s8 d2 z
   else  Z7 ?& Q6 ^  j
   {
! H/ n+ l' H6 o7 V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);0 ~: ?/ a0 S, ^! W* c
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) N; M% C( b4 `/ `$ y
   }! \' k: y. b5 l
   $ m6 I9 s& Q% J2 J" m
   if(ret<0)
4 |8 u: d, L- y2 C- v$ \   {
+ L7 F5 i4 [/ i7 L1 i. _      printk(KERN_ERR "register chrdev fail!");: Q) R/ ?- l. l% n2 W4 ?
      return -1;
6 Q% \0 b  H) L1 {6 {   }# Q, j4 w( w8 ], \# F
   ( d' r" F. J% n
   mcbsp_cdev=cdev_alloc();; [% @" r# j& P# U8 V5 q% c% s
   
8 V/ K/ i' o. t. B) j4 b   if(mcbsp_cdev!=NULL)* h5 l, G$ i& D2 {. v2 O4 h
   {
, {2 n* {+ B2 n$ r$ f9 j* a& }      cdev_init(mcbsp_cdev,&mcbsp_fops);6 m! b8 ]( V3 m& ^/ e4 M
      mcbsp_cdev->ops=&mcbsp_fops;
: s9 H# e& ^( ?      mcbsp_cdev->owner=THIS_MODULE;7 V2 ~3 x6 J* w+ N. N- W2 U
      
& W- a+ a3 ]# f9 G, y      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( w# [1 D+ }% Z- Z+ `7 [+ _          printk(KERN_ERR "register cdev fail!");
$ [0 h4 c! N% N( h# o' \7 v* V      else
+ A6 O; W' o( A9 R# ~' p          printk(KERN_ERR "register success!\n");
0 z6 w: ]9 c# V, v   }/ E7 N/ Z# e' W+ o2 i  P9 G/ t6 o
   else1 U1 P3 h$ O# m: L: v% @6 T3 Q
   {& C$ H) e$ e% I! w: M( a
      printk(KERN_ERR "register cdev err!");
8 ]& \2 s4 L, U2 l3 P+ X, G5 Q( k      return -1;
& t0 G  Y% S  t/ z   }6 L. T1 v: S4 Q! [& q
   
! p5 k- Q9 \; W  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, c* G1 F: e" X6 G   if(IS_ERR(mcbsp_class))
% m7 w3 z, q; u( f4 X7 r   {* s) y9 {/ d5 C2 {* ~
      printk(KERN_ERR "register class err!");
9 E& H( y3 O7 N0 u9 F& Y: V4 T   return -1;
6 f& B/ n- Q4 x& t5 c  P   }, t* V3 i" O/ q$ k3 Y1 _: n
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# ^1 b, b# \; i, t1 T' q3 x5 ~! p( Q6 E7 I2 N9 T6 Y
   //PSC
* t' k- O, M! t* P2 I& W: X6 A   //add Enable MCBSP( q, T1 x' l4 R8 ~3 M6 ^
   //test& _3 U4 n  V, Y9 b6 G/ G
   temp = 0x80000003;
. Y9 _" r! c3 v$ t+ A; w   writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 Y1 }! |+ x( G
   temp = 0x00000003;7 ?, ~  _% w$ h" Y! Z% S
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 b  ~$ m6 d' F( J( D' S  t9 V # j7 Q( ~" ~$ U+ A7 F, `
   temp = 0x001FF201;9 L" }/ `1 g( f7 z; E; ^
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ I: x& M+ T* k, G3 p' P4 o   
5 @- ?- i$ {0 O* Z  T* z$ i   //PINMUX  " {) @9 _  e, P) [# U
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. u4 w# x* g8 T9 d4 I6 S
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 w7 W* o, {+ G7 ^; n   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
* |" U9 M2 r- g0 b, R" t) ^   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- i/ K# y: G$ g
   * S% j* Z9 i: a, x0 W* u/ j
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
1 P3 F9 f9 F# G: m   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . k+ d5 i' ^9 i" F  l; `6 g% a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# }. u  ?5 q$ y: d: E   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);- B* u+ H8 f  Y8 y  ^% M. M& j
, B$ Y( v# K' G, h* D; @6 ], m  o
   //RESETn,L138_SHK2
4 w1 P0 o+ a+ K& w  h4 t4 d: a   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
- ~6 E9 ~* X* [5 O! m6 G   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' a0 H7 S+ `' Z/ C
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( J0 u! s9 ^, x( C6 J) k9 i
$ Q4 C- p* T6 P; Q: d, {
) u! E5 q( d1 m" ]8 p  //SPCR Register
8 J" l* K0 o+ F. {# U/ r- [. r2 ~9 |1 x  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 j* J. \5 F+ ]& z6 q
  temp = 0x03000000;//(DLB=0)# z) K5 H& ?7 K! N: q4 o
// temp = 0x03008000;//(DLB=1)
- j: s1 |4 g2 K* s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
( _8 e9 `; ~5 y- d( `$ [$ M  temp = readl(IO_ADDRESS(SPCR_ADDR));
! s  s; w) Y, ~* Y3 _. b- _  printk("temp=%x\n",temp);8 n/ T# K  \" z, `5 t! A/ y. N# G

8 m5 I' t1 V- n5 T% c   //PCR Register# k4 P4 Z! k; y
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 C1 `" m4 S7 P1 P: p! q  // temp = 0x00000F0F;6 S" a1 h% ?( A0 Z  u4 K
  temp = 0x00000B0F;
* g; _- v, R3 f) i  L# t# f  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
; q3 t# V; y3 N# c( j, d  temp = readl(IO_ADDRESS(PCR_ADDR));! O; q# }3 A% l+ O) [1 e' j
  printk("temp=%x\n",temp);  
# u$ p' `9 y" |3 ^% }  Z5 K+ Z   //SRGR Register9 U$ G2 x8 u* n
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 b5 T: Y: a% _5 y
//temp = 0x301F000B;
! |- K% O% S+ V* A7 T' U0 R   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized & v; K0 M& b* F% M& [; \3 j
  temp = readl(IO_ADDRESS(SRGR_ADDR));: a3 t) g  j+ _/ f
  printk("temp=%x\n",temp);
: Y$ n  `* F; Y7 Y3 c   //RCR
9 U' }& O# g: O+ x   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 A7 @1 @6 L+ ?& l* F9 e
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0: y# W& O* \2 U" L' I- W" ]9 w2 D
   temp = 0x00440040;
, I. G8 c' `- f( a+ i7 f) G: ~   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   4 V: N- e) z5 u
   temp = readl(IO_ADDRESS(RCR_ADDR));+ a, O# L2 _# Y8 }1 N' C" X
   printk("temp=%x\n",temp);
' M9 \7 q' x. g" M   //XCR$ b8 O5 `3 \3 |1 w; v' X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1  x5 _3 n+ g1 n1 @' K
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ M0 E% ^, x  G8 m! i$ A   temp = 0x00440040;) r( ^4 ]# `, o
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
: s: s. \) b! {! r+ h9 O   temp = readl(IO_ADDRESS(XCR_ADDR));/ n! h9 q: t1 g" V; @
   printk("temp=%x\n",temp);' p; y$ M) P* h+ @- C) ~" f' I* o6 ?4 O" r
  udelay(100);$ v, b3 J4 l2 `% a& Y+ @$ q& J
  //SPCR Register! P- z8 }' d% [4 l" D, `( \
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 }5 c; t8 @2 L. C9 B/ o& ~- _% [
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ Q3 a% j7 E$ W) @4 _5 c9 e
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled! t; N; m3 Y; C2 Q
  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ u. X0 Y6 M0 F" \( {) K( A  printk("temp=%x\n",temp);
/ j& Y: j' d: ]* g. d* v  udelay(100);
8 W6 U* k/ x6 Y7 d2 G% K
/ M8 C  Y9 R3 Z0 C  //set GPIO direction' e1 R; U& b1 ~0 [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));7 t2 [4 F, ]$ n% `) m) \: S
   temp = temp | 0x00000100;//EPR----input
8 ]) [' L0 |3 B   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! Z% S" J+ n8 k1 O+ @
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 m* q' T% N; R , q- w( K% f3 D$ s, w
   return 0;
4 Z" ?$ x4 s3 R7 `* {  Y}
8 F" j/ q. i2 g' ?2 _% F0 r5 n7 wstatic void __exit MCBSP_exit(void)
& j. U" j& P8 q* E+ q( ]* e4 e{7 n" M! K/ a# G8 `9 h
   printk("mcbsp chrdev exit!\n");& v# f' n. p+ m4 A; f3 v
   cdev_del(mcbsp_cdev);
$ e( z+ g! u, L1 ?" P( k, q  M- j3 W   unregister_chrdev_region(mcbsp_dev,count);: w7 x0 N. M; X6 ]( [
   device_destroy(mcbsp_class,mcbsp_dev);
7 R. s$ f5 s: K: {) D+ H   class_destroy(mcbsp_class);
' j2 W8 `; ^% n# S}: N+ L9 O; c* G3 a/ J3 G+ q
module_init(MCBSP_init);
; a6 }( A1 H' m! qmodule_exit(MCBSP_exit);) ?; C. |) s7 _, ]5 F/ I* w1 [' K

8 G  ^9 E* X9 O3 K. bMODULE_LICENSE("GPL");5 @9 f  [$ w% P" h( i
+ t$ ~* l* i8 F+ x' ~. h
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
  \! i$ r: V; m! M我的应用层的测试程序如下
* o# g( U# X# y#include <stdio.h>
& j. s' Q1 }& Y  B+ A- [0 \7 ^#include <string.h>
% r- Y  i4 e) m+ X#include <fcntl.h>4 _9 Q5 p" C5 `/ H* b% y1 D% D
#include <unistd.h>
# y0 z. C* L! F# ^#include <signal.h>
- n1 t  Y' v7 f. H9 T& o. h#include <pthread.h>       //线程
2 @9 G' C; y/ C#include <stdlib.h>; V2 f: e. Q0 z/ ^7 N( N
#include <pcap.h>          //捕获网口数据
/ O2 N: P, |' S- L" m#include <semaphore.h>     //信号$ k7 j; Y: \7 H* ?1 ?# g7 [
#include <sys/types.h>     //消息对列& H2 A1 i" f5 G/ m, P
#include <sys/ipc.h>       //消息队列) Z2 ]0 C! e2 c2 w) L
#include <sys/msg.h>       //消息队列* L0 M% O0 B: K$ b' o& ?
#include <sys/select.h>/ A6 I5 Y% w% x! f3 Y0 v2 O
#include <sys/syscall.h>0 ]3 j3 I% M3 R, I' u1 ?  g4 {
#include <sys/stat.h>
7 J7 X8 G7 X  @) X6 \+ N, t#include <sys/mman.h>
* R3 Z; v. O3 Z& b: ^# D#define msleep(x) usleep(1000*x)
# H7 s; |! a5 T. t. A. ?" n4 ^/ {" p* q7 j' u  R
int main()
3 Z  W% m4 j" M9 m# w" Q* o9 Y2 G{
0 p) o  c2 H* o- a2 h2 i    //MCBSP,ARM与AMBE2000交互设备
' s  F% P0 r5 N7 N; E4 q& i. ~; @ int fd;
9 I% M4 x- c; e8 }" Z+ P unsigned short data_write = 0x5555;
! I6 i% l; {3 {4 @  J4 l5 V unsigned short data_read = 0x00;4 S+ G1 L( k$ r# w5 g3 z
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. |7 T0 p6 c8 N, }7 b! }  q4 e //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- Y1 Q) B: R/ h' _4 {    - M/ ?+ |; m3 F1 V
  if(fd < 0)! A) ?! z# Y+ Y
  {% @7 Q3 K/ H8 b- j
     perror("open failed\n");7 z) o3 ^( I5 o" k2 m
     return -1;) X; X+ O, g3 m
  }
6 X; `" P6 X  f  ; G; C. K2 }/ w7 n) o: r" k: d* W
  while(1)7 X# S0 k# J+ X4 x  |0 }7 V: t
  {0 [; b1 W; C2 U& C$ Q" x' o  x
   
: Q7 e9 m% Z* W$ ~  b  g7 {   //AMBE2000每次读写是24个字为一帧0 E3 b2 u6 g6 N) r2 U0 c1 _3 c3 F
   //写数据时将数据在底层存储起来,等到中断的时候再发送/ E1 n+ `" k( e: y
   //AMBE2000输入数据是以0x13EC开头的) I- t* ]5 ^7 M1 x  B
   write(fd,&data_write,sizeof(unsigned short));
) O/ s" j2 y9 s   
- f1 O0 o( G" @, N/ k3 k   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  4 p: K4 Z  U* m; F0 m2 O
   read(fd,&data_read,sizeof(unsigned short));
2 v! J1 U( v1 p# f7 p- B7 |   # Q# x6 e& [- a. b- O
   if(data_read == 0x13Ec)) H- K& J& v6 f$ J: b
   {: V2 A* V+ C2 l
   
: m) R6 d( r- S- A1 Y    printf("data_read = %x\n",data_read);. u& i- K0 m; W. X3 H, y. b8 t
   }
" L/ @4 t0 L8 u: ?/ o   
% R* s7 ]5 b8 {) V' v6 c   msleep(10);% R- C" O/ J% b1 j( L4 `% Y
  9 f) Y! m/ Z4 l
  /*: O. z' i+ F" B; O/ T, y
   ioctl(fd,1);   7 ^1 m+ Q- i% ~! ]
sleep(1);7 H3 l* X' O& L. S3 [0 ^" i! ?
ioctl(fd,0);4 o" j) f2 w1 l9 x9 V8 ^5 }8 ?- @# R) V
sleep(1);2 t$ Z! H! m4 i7 R
*/ 4 C" T8 F% y& O; ~% [: u
  }   9 J7 B% |/ O( L' i' p0 i
return 0;) d- a" v9 P# G: X
4 l% u1 a  f) ?/ y+ [' r. R2 R
}
. g0 Q6 w! M7 p4 z$ F, i
7 A2 G  r6 O/ h6 M9 V多谢各位指教,谢谢! 急
5 _% r& M+ G) w4 I; x8 @
0 J; C" X: S  L6 F: X! j
* d2 X9 L* q( p* t7 U0 u6 I
0 m0 G7 S7 x) E2 @2 E1 s: {
0 r  O! E% H8 \& l- c
; ^- D( E7 d* _- s# M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 14:54 , Processed in 0.044049 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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