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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - G% a4 Y4 V7 a6 L8 I
/** z1 V# t& l4 X
* Copyright (C) 2009 Texas Instruments Inc
: @1 x( c9 X6 W' H *- N$ w! P/ H4 Z4 {" o
* This program is free software; you can redistribute it and/or modify
* ]  A7 V1 r2 G5 a/ H * it under the terms of the GNU General Public License as published by! e, J  g( s, E4 k
* the Free Software Foundation; either version 2 of the License, or
, t/ S) t& Q3 j3 I- V1 _2 R8 Z$ D3 C * (at your option)any later version.
" F; r3 g; W9 T. d9 g3 ] *3 ]7 V5 U* |  |0 ]& Z+ }/ r
* This program is distributed in the hope that it will be useful,# t7 Z3 i, Q2 y0 t+ X3 e
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 O) e+ o( V. X; ?( v) H * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 _. C  t; G! ]3 E9 s1 ? * GNU General Public License for more details.' w7 @- q8 P+ @+ m) t
*6 X% H7 m4 h4 @' a8 I
* You should have received a copy of the GNU General Public License$ s9 u% _  E5 Q7 c0 i2 C6 m
* along with this program; if not, write to the Free Software9 |0 @- x1 P: z) N/ ^8 d
* Foundati
$ n: o7 b' v- [4 l4 ~* C- v*/
/ |! e, M' a1 H! Y& B% p2 M4 }#include <linux/module.h>  |: M/ c+ s1 w4 f/ U/ h
#include <linux/init.h>
5 }& F8 V* y  n. i' \) B0 k! ]#include <linux/errno.h>
5 n4 u; K' l5 y#include <linux/types.h>& j7 B0 ^3 q+ ]4 n
#include <linux/interrupt.h># l; J7 P3 [& I1 ?
#include <linux/io.h>. u$ q# r, j1 q4 t0 ?& l; w
#include <linux/sysctl.h>6 V  f  _8 G* A; `- R& U
#include <linux/mm.h>& F2 c, c- @: W8 ~
#include <linux/delay.h>+ W  N) S2 x6 K2 r1 x8 p/ z
#include<linux/kernel.h>$ t* a% u3 ^8 j. L! f, _
#include<linux/fs.h>
) A$ R- a) i0 l#include<linux/ioctl.h>" O; d: w, u6 Y$ ?
#include<linux/cdev.h>, P! }& j( ?1 G/ B0 F7 i8 ]
#include<linux/kdev_t.h>
7 `, l/ N! A, J5 i% y) T#include<linux/gpio.h>3 e) W3 K4 j- ?
#include <mach/hardware.h>
' {, }; ]8 L; k# k+ }' f  Y2 P#include <mach/irqs.h>. o4 S5 C4 H& h; h0 `( l% u
  V# y# J! Q8 U5 f9 L
#include <asm/mach-types.h>
9 p0 y3 q" v7 M: `) L( v& z#include <asm/mach/arch.h>: ^; u& a" W) A  o, d3 Y8 i0 `8 z% R
#include <mach/da8xx.h>* L  u4 T' n' i1 f  [5 i  R7 L
#define  SYSCFG_BASE   0x01c14000. E2 n/ e/ i4 @
#define  PINMUX1_OFFSET   0x124
9 Y* `* S; X8 u8 d5 n$ _6 Y#define  PINMUX18_OFFSET  0x168
: K& Z$ u4 L! I0 F#define  PINMUX19_OFFSET  0x16c# ?  A2 b. f0 N: u; `! G- l; |
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
6 }4 J% g9 I1 o$ `) ~#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 z0 v& r9 A+ v' _
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
* Y6 M# h& l7 k+ |3 \; j#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
- d9 [  r5 U$ W$ k/ _. R9 h#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
3 W3 c0 a% {* q1 i3 R                           
0 [8 @. l$ I5 M# l  X#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
# y+ E2 c1 v. f4 g8 x0 \. h" w#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
4 O. @) o) M8 X2 Q//PSC( O7 l  i0 d+ U  ?! E& R
#define  PTCMD_ADDR   0x01E27120  + {/ l# Y& S+ V) g* ~7 c
#define  MDCTL15_ADDR 0x01E27A3C
- i% P0 [9 P, i8 R#define  PDCTL1_ADDR  0x01E27304
7 @1 ^: S- b/ Y5 z7 e, X//GPIO8 direction
4 Y+ l) Y) ]* T( B( |#define GPIO8_DIRECT  0x01E260B0- q) F. [; U" h' o* E& f
#define GPIO8_OUT     0x01E260B4! q) M0 [/ d2 x7 S
#define GPIO8_IN     0x01E260C0
! n, Y3 N- @1 \7 U
% W: T6 b, Y+ o$ m( K2 |0 v//#define MCBSP1_RINT    99              
! x3 d2 C3 n1 U2 n( m# h//#define MCBSP1_XINT    100  
% @8 O  R7 c$ o3 P( d0 Lstatic int MCBSP_MAJOR=239;9 |, y# S8 t9 }9 \+ T  x5 }
static int MCBSP_MINOR=0;
( a2 G# _! K% z7 H; E* n/ xstatic int count =1;
: e+ Y/ `6 c2 z2 B8 Y, a5 R4 E  X+ C$ |; h3 Z& n. L) H1 X
#define MCBSP_NAME  "MCBSP-device"
. L- B* P0 O6 d. U2 L& R" i! Z
static struct cdev *mcbsp_cdev;1 Y5 i6 Y! d) a9 ]# y1 D. Z
static struct class *mcbsp_class;
3 ~$ c7 r3 R; Gstatic dev_t mcbsp_dev;- v2 C( H( D) d, Z
unsigned int DRR_data;
  Z. ^" S3 _1 ]2 f3 G" G  lunsigned int DXR_data;' y' e) n; W$ y
static int mcbsp_open(struct inode *inode,struct file *file)* W0 ]  o$ W- c* H+ j8 j/ ]3 `
{
/ r* D) _- }8 @. C+ w   
2 W3 O3 J$ D9 E, `   //interrupt enable,initialized
+ R# w! s' w2 `0 Z* g: e+ F   unsigned int temp;
; q& g- a/ u% H8 _* k   //SLEEP_EN(GPIO8[10])---0" |' }  a7 s6 o
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 ~" _! M+ {# T# R. M2 P$ G' T
   temp=temp&(~0x00000400);
' F3 N+ b' X! M# L9 ~% e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ k+ r, B; Q0 v; b
  //RESETn(GPIO8[8])----0----1
! u; u: U0 R; n' M, [  K' E0 C! V9 O7 J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ {1 u0 R0 ]' c& ]. |* [& h) h8 I
   temp=temp&(~0x00000100);
8 S# U7 U' o. k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
/ ^  }! x# A+ f% C9 C   udelay(100);
8 g" Q& t- F/ d! D5 x! U; u   temp=temp| 0x00000100;
' V3 V  M# e7 W0 o/ u5 l# N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. R  b5 m9 J' |1 Q0 B! T   udelay(100);
8 v$ T3 j2 I5 W6 Z   printk("open success!\n");
3 k6 w: `3 u2 I: L5 W- A5 _6 ~) d   return 0;
4 s# w$ N, O. y( w# B/ @$ L}% A% I6 F5 d) g2 ^

& {9 R, i- _6 ]/ w0 Ostatic int mcbsp_release(struct inode *inode,struct file *file)) Y7 P, q" ]/ Y" z8 f7 i$ R# z
{/ s, V7 i9 F! A
   printk("release success!\n");
7 H3 j0 d4 o# S+ W. w   return 0;
9 j& d$ b* l3 p: _  P4 `) Z( I2 X8 ~}* R) Z) i7 c" Y3 T

6 u3 c1 S0 S8 zstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; I: r1 y/ r2 d{7 I' F4 j  W- i4 b$ v3 h
    copy_from_user(&DXR_data,buf,len);& {$ F7 K* D: [
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       8 g  o: k6 d. y
    return 0;
! z2 ^2 C$ p" b! q+ Z # y$ `  x% ~  I& M5 @
}3 M: h. r! f0 Q' H9 z
6 o0 T" G0 R3 C" ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
6 l$ c$ `5 p* S0 ?6 z4 a- Z{ ! K! a1 t/ i& ?" }) [' h% c
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; K; I# ~/ w: O6 z4 W
   copy_to_user(buf,&DRR_data,len); / ?/ w; ^7 N7 I5 ~- v1 I5 v* K; R3 I
   return 0;9 h, N8 t$ H  I8 d
}
8 Y" Y# b( s" M; J' ^6 B: r
9 v( G/ m* s& O3 l; |( [
+ A, I% A- ^! ~3 Nstatic struct  file_operations mcbsp_fops=/ h0 g7 N& S; a* _2 {4 b# t  F. F
{$ C1 A1 t- v- g, {$ r
   .owner=THIS_MODULE,) X  D* O9 t8 Z8 y* T
   .open=mcbsp_open,; F, B1 o7 l) ]: ~; N7 i
   .release=mcbsp_release,. Z# B5 z) K+ N6 d
   .write=mcbsp_write,
6 z9 j4 D) j. }2 i1 f5 j% J   .read=mcbsp_read,
8 k# a1 W- m! C, }! X7 y};
$ f  ~" {4 o" N' L( lstatic int __init MCBSP_init(void)
3 Z4 D/ u' u: Z" Y& C% C- L7 R1 h1 t{6 W* R; W( r, `$ `
   int ret;/ H8 U7 E' r( S4 N8 P
   unsigned  int   PINMUX1_REG_old;
7 Z# }' L0 O( c; ?* n. B$ N   unsigned  int   PINMUX18_REG_old;' a* j% z2 H! c. U1 d. f- _
   unsigned  int   PINMUX19_REG_old;
3 w7 R0 T1 A; F$ J; \   unsigned  int   temp;  
; }4 R) ~3 [2 p% {6 E/ b. M   if(MCBSP_MAJOR)
) d+ j# W' L8 C5 U0 o5 ~; D& n   {" T) O7 _$ I  h- a% W3 o; ^* t
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% t# |6 [+ Q- x2 j      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
5 j& J( z8 l& N# i& I   }
$ I& j0 {* ?; O- T" E   else- U/ C) d. _, q( Q) m  S; o% ?1 X" s
   {
2 ^. V% E9 i; F      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
) e' V& X  X& f: X; t$ A      MCBSP_MAJOR=MAJOR(mcbsp_dev);+ T: O  u- s* K
   }  _$ P. O8 q' b% G' f' r$ J3 ^' c
   
5 m  C( u1 x7 R+ E   if(ret<0)
5 T2 u* V1 I# q5 [3 j8 S/ g   {
! _! e9 o" d, P) f7 F6 j      printk(KERN_ERR "register chrdev fail!");8 O* k. t% q; m2 x  b0 R! x1 R
      return -1;0 \" c; [3 i& }4 i, `  U0 f8 W1 Y
   }
# N4 X3 B  L) a; \" ~   
( o9 d% `+ q; q. |: g% `   mcbsp_cdev=cdev_alloc();
1 {2 C" U% p: B   4 _2 w$ h! s) `5 `0 S
   if(mcbsp_cdev!=NULL)- C  ?, s, p3 _# T1 q) e  L
   {' G3 }/ B% a1 U: P4 O2 U8 J
      cdev_init(mcbsp_cdev,&mcbsp_fops);, w8 W% R5 s2 o" g/ ~+ K
      mcbsp_cdev->ops=&mcbsp_fops;! _2 O( Y1 H7 I3 E8 d8 q. t8 j
      mcbsp_cdev->owner=THIS_MODULE;: Y  W$ F/ S( \/ b$ m
      
: D7 g8 l% I( G) J: x      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
7 L  N  w) }2 o  \( `; u* t! F          printk(KERN_ERR "register cdev fail!");
5 e7 ~( J% z0 [+ ]      else  e8 C8 ~  k. i! Q4 Q0 q2 g/ y
          printk(KERN_ERR "register success!\n");
3 _3 |0 P- Y3 t5 U  S( `; O4 ^   }
+ J. u" a& j0 q' v0 {% M   else9 I/ c9 s* Z" X8 g1 ~
   {4 e+ k. x) A# j9 H3 Y+ Q
      printk(KERN_ERR "register cdev err!");7 f2 V4 A6 n1 _+ p& p4 `  d
      return -1;
3 q: h) @+ o* p6 v   }
* L2 Q: q( {! p$ B/ Q( O   
$ ^; }: }6 X* b2 e' H9 U8 P  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, N; Z) l6 X6 `0 D/ x, }' K: [% a+ l   if(IS_ERR(mcbsp_class)); K* u& o! D0 h* r% B4 L
   {: `3 F0 Z0 Z7 R
      printk(KERN_ERR "register class err!");
1 M9 K- h" j* w$ ]& N   return -1;
$ e5 v* \4 a0 ]3 t$ c  }  O# T% L0 }2 k   }) {, k; Y4 y+ F
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: l5 f; q" @  _5 C, h% w- M6 r% J4 V% r% t* u1 t
   //PSC
: o+ Q( e5 B* F) R& C2 P   //add Enable MCBSP
$ e% v- P' {& F   //test
, n9 ^9 x6 X( n5 }2 \) k   temp = 0x80000003;
0 G. `: ?& v# \4 l   writel(temp, IO_ADDRESS(MDCTL15_ADDR));! N: L6 I; K( R- d$ w: J& V
   temp = 0x00000003;! ]5 t+ z1 s8 r+ E, P" Z* Q$ z1 p
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
7 e9 G$ u9 O* O7 k6 o
9 L' {8 ~7 I. E- j$ p/ D! J   temp = 0x001FF201;
: H9 V4 [2 l) g8 _   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ K- @/ j3 s5 v- C' e8 o/ R   4 ?5 }" G$ d( K0 I' f* q
   //PINMUX  
* ^5 _3 l* ^, h+ ~% f& _  n& M' z   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' B$ T) r2 q6 b% e8 c   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ( ?6 l* r; e: L! {: e, b" M; p
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   0 F. [1 {) s4 K+ A8 b
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
8 L# e9 n) V' V- u$ y8 ^5 h   
4 B2 I5 l0 `0 e& I7 N" X   //SLEEP_EN,EPR,L138_SHK1,L138_RC
% o/ n: \8 z2 B: E   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ; ]- b  b  x4 _& I" h
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: R1 ~( m* m! s  e   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 a1 K3 O, j' I6 W8 R9 \
5 a1 Q- j0 ?6 |- K
   //RESETn,L138_SHK2; E$ e+ y* A. P
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
. @0 U& o, K; d, p5 V   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   4 S2 [7 [) S9 T) t
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' S% G  K# P) @/ M% j
. s3 z1 {" f8 k0 C# q
  z6 |0 {' g/ |4 z/ o4 A
  //SPCR Register4 k% f) }6 M$ v
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 w4 t( O, ~5 [6 V/ V$ O: ~# {  temp = 0x03000000;//(DLB=0)
2 I: |. o% d& c+ P( t' z // temp = 0x03008000;//(DLB=1)
% Q/ q6 O- ]: D; J, `8 `  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
4 U/ m5 f/ p/ b9 {- l  temp = readl(IO_ADDRESS(SPCR_ADDR));* {! d+ d; n' e3 x! F! E
  printk("temp=%x\n",temp);
* J2 f; \) t: u" T! Y / `1 c4 ]5 r4 [$ }! Z$ K
   //PCR Register
& o7 C6 |4 P% l3 d; R4 P   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( @6 d+ l+ F; g% T) ]2 ^9 n6 W  // temp = 0x00000F0F;& W# y9 v1 h4 q3 d8 s4 C7 u
  temp = 0x00000B0F;; m% N& K: U" N+ c: M) Q+ X
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* J5 ~6 @% j1 r3 K- L/ a- c, m  temp = readl(IO_ADDRESS(PCR_ADDR));
* l6 z, g1 e8 d' I7 x& q  printk("temp=%x\n",temp);  
! ~( p' c. U7 j, G3 Z/ T) u0 i( f* F   //SRGR Register
  h$ o( D7 H0 C   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; x, d# \0 ]- G2 j  p- E+ @ //temp = 0x301F000B;- ~8 X6 t; E0 W& k7 o. H* ?
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 ~) G( R% e  U. ^4 o2 }  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 J# j1 F+ o. S( c4 d; M( S  printk("temp=%x\n",temp);( j+ M* `4 A6 F  J& _- ?
   //RCR( s% _$ C3 H! j' L5 G
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& m& g) `9 l8 H& j" Y4 z7 Z+ j   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 n8 a6 j$ Y/ v- W: ~
   temp = 0x00440040;% p3 _$ `% K3 D9 Z2 A& j
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   9 P' e3 \1 m; G: C
   temp = readl(IO_ADDRESS(RCR_ADDR));
! X) D1 P2 h$ _- `& u   printk("temp=%x\n",temp);
8 Z) c& w  Y. G' i4 h   //XCR
7 |/ K+ |3 R3 i   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
$ [( N, E, n5 n0 W1 C0 [, \, l   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 v# r, q" a2 E$ |* y   temp = 0x00440040;- _5 h7 P: Q0 k% T1 d' i: f
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ! t1 m" g& }) {! J) `
   temp = readl(IO_ADDRESS(XCR_ADDR));
; }; h1 L' [9 A5 \( k3 _' U* O   printk("temp=%x\n",temp);
* F! ]. A7 e6 \# z  C! {0 z* L  udelay(100);4 }" P0 V1 I9 E! h8 M
  //SPCR Register
6 w! z( c1 s% U2 Z3 o( y2 R6 r. l  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) |$ ], {2 C, O
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
9 Q$ B! U5 B/ D+ F( W0 }9 v( C1 a  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ r6 h2 m' L* t: G
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ Y$ `7 M* I/ |* x  {( {  printk("temp=%x\n",temp);( n+ Q7 S% v+ U8 {
  udelay(100);
6 F* ^0 G& H8 W) \0 K! ^' X% b8 S9 X+ I- x( C. i- B
  //set GPIO direction
3 {! h0 a+ s, K2 ^1 F   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 k/ j3 ?- |! {9 t" [/ Q   temp = temp | 0x00000100;//EPR----input4 a1 m# Q+ z) [5 w4 ]6 \
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output- z. `% f" X8 l1 O7 f: ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * p. i7 K, ?- ~. ]! L

, y+ Q6 l5 t7 f+ x9 f/ _   return 0;: C* B; k; ?3 F4 [3 z* a
}
0 Q( F: t# S: r, Estatic void __exit MCBSP_exit(void)
% P7 q$ y$ u. V& d% r; P6 ~2 r{9 ?  M5 Q" Z" h  h; k0 c
   printk("mcbsp chrdev exit!\n");
+ d3 G5 s8 ^# u   cdev_del(mcbsp_cdev);
+ C& E  B8 }- ^: G   unregister_chrdev_region(mcbsp_dev,count);
, q! h5 f: U( Z4 j9 d   device_destroy(mcbsp_class,mcbsp_dev);
2 U8 P% ^8 |0 y% q+ B5 _- ^   class_destroy(mcbsp_class);' l0 U- t0 A, X+ Q
}9 R5 R5 i7 {+ M/ S3 Z' Z
module_init(MCBSP_init);
" w) ^) q$ z! C7 v; K: K" ymodule_exit(MCBSP_exit);7 D6 I! D% w: j1 j# N

+ p3 G) g5 [9 Q  m6 u" i5 H9 l8 p) }' W/ YMODULE_LICENSE("GPL");
  E8 U3 Y" U  ]7 S- m
! h. a8 \8 X+ A; r5 F$ j- s. ?  E5 X我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) K* I7 z* t/ t4 o* T" c我的应用层的测试程序如下1 M; R; x- N6 e+ O/ m/ u
#include <stdio.h>1 l& X% a, Q) c3 C, B* \2 t
#include <string.h>3 ?" p2 a1 f- y6 F- J
#include <fcntl.h>
: q8 l' h5 r( i! J' O( D#include <unistd.h>9 x0 J. X  S' M1 T
#include <signal.h>
/ d0 Z5 I6 T* }* \! }#include <pthread.h>       //线程
& D+ u0 o/ k& g#include <stdlib.h>
; A  ~: w4 F+ M# s& F+ j6 o: d4 f+ u#include <pcap.h>          //捕获网口数据
3 h) m! g5 W9 ^) t& h' h( J#include <semaphore.h>     //信号: g6 M6 X4 R1 r% [! K
#include <sys/types.h>     //消息对列
& o* x. D6 C' d4 r, G  M0 W+ A2 h#include <sys/ipc.h>       //消息队列% R2 D2 E7 g6 R
#include <sys/msg.h>       //消息队列
. O5 E( v& m  k8 n) I. p#include <sys/select.h>
3 c8 E1 u/ `+ a4 E#include <sys/syscall.h>
* }7 T0 G( ]1 `6 N8 w' y3 F- b#include <sys/stat.h>9 {3 j) r5 _% x# I# g
#include <sys/mman.h>: P/ {* P! e2 [! |3 e# Y
#define msleep(x) usleep(1000*x)  B" f3 E0 Q. E. e* K
$ `: a4 Y) W3 Q/ {* k
int main()+ U7 ?6 G, U( g6 @! K4 }. z
{
# |0 I' o5 m8 Q+ M; S6 N6 W    //MCBSP,ARM与AMBE2000交互设备! ?5 m- S* J$ y9 ^0 U
int fd;3 g) ~& K+ f9 V' E
unsigned short data_write = 0x5555;4 f" G( z, C3 C$ Y/ ^' e1 I; N* h
unsigned short data_read = 0x00;( C& r! T* ?& u! _4 z( Z
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; f$ |& N% V/ b( _
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 d7 O5 M  P9 Y  P- e
   
6 r/ _0 m2 C  D/ E9 k/ S  if(fd < 0)( c3 _$ x, _* Q& B" J
  {
& k' y9 l; @% j" H( n7 x     perror("open failed\n");1 g2 j9 J/ X. r7 i6 l' b1 ]6 k( n
     return -1;
/ n. C% z, ^; r- X" S5 |5 |' p& S  }, F6 A& _$ k8 w" w9 R/ r# O
  
: \. h3 |- D% y7 Z' r& |. e  while(1)
# Z7 o' Q& `3 s  {
" b* u! E/ I8 D7 k0 Y5 e   2 c5 M4 R" J% D3 u( i; M7 H
   //AMBE2000每次读写是24个字为一帧/ T4 a+ e. A2 D& J. x
   //写数据时将数据在底层存储起来,等到中断的时候再发送
8 V& H7 m( s- I9 P   //AMBE2000输入数据是以0x13EC开头的! }, O  H, u- A- T: A- x% P" [
   write(fd,&data_write,sizeof(unsigned short));
3 T$ E' ?, N+ Q- N- \. k' ?     b2 N% @1 P; s8 b! R- Z, e" r  s6 K
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  # Q5 v: I% s( }1 @/ |; P7 h9 L& F
   read(fd,&data_read,sizeof(unsigned short));
4 x( z: a. s7 p( w; Q8 c. ~   - m6 f# C5 I4 a
   if(data_read == 0x13Ec), U, O1 [/ |+ a% L$ }, |# T
   {* f. I  U$ H7 h) o2 C! P$ m; `! ?1 h
   
$ \* ?, J* A8 k! T; U( a0 t    printf("data_read = %x\n",data_read);- h" @) ?  C) K. o' x: Z
   }2 z( h0 N. W# T' |4 m
   
9 S1 G$ E/ H. R, \, N/ o   msleep(10);* e; _$ U! }8 b+ t3 A* G0 e0 ]
  
! a6 K8 t- f0 N& K  /*+ `2 N% g, {3 A) A0 U- y
   ioctl(fd,1);   ! }  R* M8 H8 V4 K+ f1 J
sleep(1);1 ?4 D. k8 @# ?$ Z- e& l$ r. q
ioctl(fd,0);7 z6 \/ p" [9 X  g; T! \
sleep(1);& q3 u' c# b/ t: M. H3 I
*/ ; X1 {. h2 P8 s) N+ U8 p7 I' V
  }   : d- p4 P1 _; Y
return 0;
+ q2 W5 U  d- x3 k0 q4 s
$ O, j5 d9 {3 B; I" ~2 i}0 s9 ]( b6 l1 ^5 [, T8 m

1 v; t3 C( G4 n多谢各位指教,谢谢! 急& _) m* K0 n' L, m# W# s
+ S; P7 L8 e; S+ R: R; u" @# y

6 R5 T+ G* E0 P( n2 Q9 j8 }  l) k' Y! O

; O& K6 W) \$ _9 g- X- m& O
; r5 z  Z2 ?; j, B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 15:42 , Processed in 0.048434 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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