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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / s, B. R  A7 Z; ?2 I3 x+ x9 Q3 W: A
/*
% U. s$ d. m# [" E* I * Copyright (C) 2009 Texas Instruments Inc9 C6 }' F1 j* x: Q1 f
*1 C2 g. e& d0 ]4 N( g
* This program is free software; you can redistribute it and/or modify( v' x' D* O4 L, k% _" s
* it under the terms of the GNU General Public License as published by4 e  Z4 ?6 S: Q7 a! ?  d
* the Free Software Foundation; either version 2 of the License, or
2 w2 \: Q) Z' C1 {9 [9 ^$ f * (at your option)any later version.
6 D3 h0 d: d1 c0 d *
5 M1 d( {0 _" y- A6 a$ q; _ * This program is distributed in the hope that it will be useful,
% D/ X; g3 N) K, \$ H/ n+ K * but WITHOUT ANY WARRANTY; without even the implied warranty of0 D1 N4 k8 a+ m4 n/ x- j9 [
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( O3 \( Y8 ?+ S) a; d4 r * GNU General Public License for more details.
% _6 W! u1 g# T3 _; O  k *
2 D% K, D0 O) L/ Y) J+ E * You should have received a copy of the GNU General Public License
/ h9 ], j+ @7 J' X* h! p * along with this program; if not, write to the Free Software
& z6 o; Q8 n2 p. M9 \+ \$ o * Foundati
) l+ A5 I3 e8 r' j! j  x' a! n3 B. C*/
1 h8 ?1 _+ G% `7 H- p" X; P#include <linux/module.h>- c) t. z' X7 ]: v. p) I
#include <linux/init.h>
  M% L, e, h4 S- H) U5 J6 w: `: Q#include <linux/errno.h>. F$ |) ~& d7 S+ a- p
#include <linux/types.h># x# }( G0 U9 A. A: `
#include <linux/interrupt.h>
% @3 }9 r7 a0 |* i#include <linux/io.h>" G6 a9 @. A% \# p, f0 S
#include <linux/sysctl.h>! P! S1 \' s" f. u# h6 b0 x: X
#include <linux/mm.h>) s! p) \# ?1 Q, `4 J
#include <linux/delay.h>
2 }/ i$ s8 l; k#include<linux/kernel.h>
  h1 N/ z- r& ~, |# O#include<linux/fs.h>! e4 ~* n5 f8 O3 h+ t2 S
#include<linux/ioctl.h>
: o: n8 t/ o8 X& ~) W#include<linux/cdev.h>
7 p+ H3 H& x* Q# C' D; I#include<linux/kdev_t.h>
" ]9 c. V2 u, R9 v% X#include<linux/gpio.h>
- I. B  [  f: i, c#include <mach/hardware.h>
3 M8 ]2 z+ q! e+ v& q% K2 |2 ^4 `#include <mach/irqs.h>6 r& x! W! g. K: P& ]" Y3 w5 \3 J: ?
/ p5 O' e6 D+ J. |) Q( K1 C
#include <asm/mach-types.h>8 |6 z0 A8 E* a1 u: C# {3 M
#include <asm/mach/arch.h>! t: R6 G, Q; a- q9 o# Y
#include <mach/da8xx.h>
, {% i7 d, h) ]6 x" p. Q- T#define  SYSCFG_BASE   0x01c14000. V, U" n$ b  W! T
#define  PINMUX1_OFFSET   0x124
; Q# h, E1 q% [2 G6 q/ k5 ]' E3 g#define  PINMUX18_OFFSET  0x168 9 E& v: d& N# e7 ^2 v/ c8 ?& k- A
#define  PINMUX19_OFFSET  0x16c8 ^2 O5 Z( o. ^* n% c# O0 u8 Z# ~  B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR$ |& f6 G5 u- r/ z. L9 `
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 X) o& m# [, y$ `: H1 h& l
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
! U5 Z& {* T% y; @( K' {8 h; ]#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ z1 s9 i1 t4 ?  ^2 [# o" W
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
- q8 {0 n$ r! Z2 C: V% Z                           
# z+ ^+ ~- x5 V5 `  ~#define DXR_ADDR      0x01D11004  //MCBSP1_DXR0 j# g4 {! L. Z: H- V
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR& ]3 e1 a8 A% P0 K! A6 |1 f
//PSC9 Z( d# b! \5 C: z# ?+ Q1 e
#define  PTCMD_ADDR   0x01E27120  % q9 g8 a  |# e1 g; f5 S
#define  MDCTL15_ADDR 0x01E27A3C: B+ g1 f# V" ^1 g8 K0 s" T4 u9 ^
#define  PDCTL1_ADDR  0x01E27304
! s$ X/ ]7 v7 v8 I2 g//GPIO8 direction
. \# r* M4 K( Q& I5 V8 V" H#define GPIO8_DIRECT  0x01E260B04 f0 w- {* w' l0 q" V
#define GPIO8_OUT     0x01E260B4$ C  v: u7 D/ m, ~+ Y- {
#define GPIO8_IN     0x01E260C04 \! R- @' J. q  ?8 t
5 K/ A+ \- Y( \( D5 g5 V% g$ ^
//#define MCBSP1_RINT    99              4 K0 Q+ r4 c% G0 \
//#define MCBSP1_XINT    100  2 ]' p1 i5 I" G9 b9 G
static int MCBSP_MAJOR=239;
' q, u5 ~! W0 P7 s; ?1 ^" g( k7 ~static int MCBSP_MINOR=0;$ r) R) A, r" i) ~8 Y: Z$ ]  o! t
static int count =1;
3 v" D) X! l2 W" D( ]1 O1 e) _" }4 V4 h& A3 l2 `0 |0 ~% S
#define MCBSP_NAME  "MCBSP-device"
- o0 p& I  f3 v' H+ X* L! k& W' R; X/ i8 |3 s
static struct cdev *mcbsp_cdev;& V- j/ v5 C2 I) k2 v
static struct class *mcbsp_class;& f9 m9 v9 P4 _- ?: q  W/ g
static dev_t mcbsp_dev;" J8 x& K) F3 t$ c
unsigned int DRR_data;
- M" t  D3 O& Y- q2 |4 {1 sunsigned int DXR_data;6 u# r7 b& K' ]7 I
static int mcbsp_open(struct inode *inode,struct file *file)3 x- {+ k* v: ^2 H( F- [
{
; p* ~6 q" S9 I, y   
( H% `8 F, ?; k   //interrupt enable,initialized
8 V* V4 {! Y7 t/ j6 ?   unsigned int temp;
9 _* E+ e" e! O2 g   //SLEEP_EN(GPIO8[10])---0' }- \4 }6 e* d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 ~! u8 _! ^" G4 W   temp=temp&(~0x00000400);
! o* d4 e- E3 O' k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]* }7 c1 ^+ J4 R4 }3 ~
  //RESETn(GPIO8[8])----0----1
' I6 e' A! |# m# ~/ u1 J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 E- F5 I' v- A# x# a- w5 F   temp=temp&(~0x00000100);! [* r) m+ E6 j$ q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* O1 E8 s9 Q( y5 D$ t, u   udelay(100);" A9 K! W1 f2 ~. y& X
   temp=temp| 0x00000100;
  q5 c- O. }7 W$ A$ V, C  t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1: g1 ~5 Z+ S( @, r8 V
   udelay(100);
  Y; o# d2 C  ?; W+ t" V  \   printk("open success!\n");5 S$ s5 o; I' W+ S$ N$ y2 }
   return 0;* C8 p  ]( Q% h8 c7 h
}
2 J% D6 p- k  p6 U1 J* r/ o' y8 ?; v5 l& c4 S4 Y
static int mcbsp_release(struct inode *inode,struct file *file)8 s) \0 ~, Y$ ^( r8 q# |
{5 I% V9 e2 v# ?$ ]% M
   printk("release success!\n");
* Z; B  F* S& i/ s8 d& C' A- \2 R3 f   return 0;
# t7 e1 {* G2 @* B; k: i}
9 B7 E8 c6 v+ d7 {) @9 F
3 u: H" z; e5 k1 D! ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 [2 G0 O5 R" B+ ^% a0 w{! N2 j: Z! H6 n! C0 k
    copy_from_user(&DXR_data,buf,len);1 L& @8 L/ T  b+ O: r8 }" z
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
2 g1 X( H, `, A6 t" }    return 0;
9 j/ m/ ?7 e% {1 U4 o- ?, P/ w) t' E 4 V; [# I# _& R, E
}+ X) Q8 f& H- ^# H- `  r

3 t$ m+ A5 i1 M7 lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 [7 n) n- ~# T" E* i7 s, ~! f{ * Y% y7 c* S+ G  x& q& A! R. X# r8 ^
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 r( b! X6 _& ^$ ~9 r: A
   copy_to_user(buf,&DRR_data,len); " c( c( s4 j" G' i/ P" H* ?. i
   return 0;' e/ r3 j1 B2 |- b/ ]
}
7 d( k( _* V+ d* Z) \! g4 x7 c) [0 W3 N
5 b/ M0 x1 ]$ s4 _" f
static struct  file_operations mcbsp_fops=
- e6 g4 O) B2 g5 W{
& E# e8 b) s4 s% L5 W   .owner=THIS_MODULE,( q0 ^/ s" n" N/ ]  r1 }
   .open=mcbsp_open,) \$ l6 ]+ F* i
   .release=mcbsp_release,7 h; V+ T# F! _; r
   .write=mcbsp_write,6 v6 U2 z/ {1 @6 C" f
   .read=mcbsp_read,1 M# R# J0 Y" j- v' n
};
, z- q! ~: j$ S/ p2 ostatic int __init MCBSP_init(void)# ~5 t- T( U; L! c" J5 Q1 I) A
{' S$ ?7 x. L( V5 N8 |& q1 p
   int ret;3 f$ d/ P- W0 P" i) K. m
   unsigned  int   PINMUX1_REG_old;
& l- a# J. Y, l1 z% `$ T) @   unsigned  int   PINMUX18_REG_old;2 B( i; Z+ ?+ h% A0 u( A
   unsigned  int   PINMUX19_REG_old;
. N! ^' C1 u. D% W- ~8 E5 X% B3 L   unsigned  int   temp;  ( ~2 Y3 p4 h* k1 V! o, x/ l  e
   if(MCBSP_MAJOR)- k/ q" l2 J  r& F% w
   {' c) D4 P0 Y5 U7 k/ [/ Q1 u
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 E+ t- p9 [6 z' b) I$ P      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);8 C$ T5 \/ B% B( b
   }# y, K; I; E, }# j7 ^) E: d# \
   else
1 g, n0 |8 \# n7 b* h; S   {
! I! h3 G, Y" O; m# q/ X2 q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 j2 B! R0 y+ F" N
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
: f' ]6 f8 U5 _" K   }: p/ U3 N9 V0 s5 N
   
& l) b9 ]7 h3 f5 o7 f   if(ret<0)
9 k1 T; B5 }+ a' ~   {' O$ t+ C% u# Y  @0 U
      printk(KERN_ERR "register chrdev fail!");
7 J# b6 j: w' J3 c/ y; [      return -1;
& F1 c6 T' Q, n" N( [/ X   }
3 K4 ^2 l% R  a: x1 d   0 R7 a% |5 U( ~- D
   mcbsp_cdev=cdev_alloc();
1 b4 \* y7 T: E* j   
4 S4 E- W* S' H% I  x: s$ a   if(mcbsp_cdev!=NULL)! {# O' L% S* @6 P. K
   {
& Q" Q; p% W" H8 C0 ?! w7 u      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 U% R  k0 \1 i1 |      mcbsp_cdev->ops=&mcbsp_fops;( i4 \# R6 \7 h& |
      mcbsp_cdev->owner=THIS_MODULE;
# S6 R% Q  ^! x      3 g  Z+ c: [8 i$ N9 U" Y2 D" W
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' [, S9 q5 |" [& F' U$ ]/ I: M          printk(KERN_ERR "register cdev fail!");
- A$ j' ]* n/ J0 z9 O& [      else
! \+ S9 n# q2 O' F+ |: |% O          printk(KERN_ERR "register success!\n");9 p6 ]; W* c/ }9 z. p* A  f) e  h
   }* p3 C5 s. ^( N# x1 @$ b
   else
7 f& ?5 p/ y6 P, S  T   {" a0 {! D( @7 \$ A2 G; T  J3 i
      printk(KERN_ERR "register cdev err!");4 U) U& F; W  h3 q% D0 b" m3 V7 ^" A
      return -1;/ `$ m1 Y5 e5 ]) N2 y) \
   }. F8 v" F* R) @: M+ x7 X3 i
   
7 o, u1 s/ ?# {/ r: E  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
' l4 x* r  S, O: N( r   if(IS_ERR(mcbsp_class))
" U; e- _) d; U6 ^- f  g' l  c   {" {4 x* o9 s* `# h5 a
      printk(KERN_ERR "register class err!");
( r4 a) m( x! Z, d+ K) y; c1 e   return -1;
' r" ^2 k) L* I( z/ n% d   }4 X$ {* n8 s- g, Q
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 N5 U$ A$ Q5 D0 K
: a3 z7 N, C' w
   //PSC
! }8 K' x. ?- M* |& a: i* U4 i   //add Enable MCBSP
% c! ]; e( E2 ~5 y/ O3 K   //test8 _* b; }2 p2 d! A1 W, B, P) O4 z
   temp = 0x80000003;0 X; O1 p( L! {
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));3 l! p& \8 x; X' {5 D# P
   temp = 0x00000003;
' ^7 Y; \' c3 ^; g, }+ v( g   writel(temp, IO_ADDRESS(PTCMD_ADDR));( I6 x3 N( D5 ?7 [# y
7 s5 J% E* @6 A8 A3 `8 Q; g
   temp = 0x001FF201;' h6 V) T2 x5 e2 K
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: _3 ?5 o8 b" t! i0 i7 A" s
   + Y- M' k; z- _5 J5 v1 G4 @
   //PINMUX  % Q- b$ @- e8 i  v4 B  G( _( H% F
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: O  D8 V+ B; }) G   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
. Q2 `0 T% ^9 f) ], J   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
/ C1 H/ v" i+ U+ y: @$ I   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);0 e1 L+ o% \% K$ z
   
% M8 ?7 Q* }) s! N2 T1 h  J   //SLEEP_EN,EPR,L138_SHK1,L138_RC
  O0 h1 P% Q$ Y( c/ i. S& m   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  / R, _6 n9 z, y, F
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ) B0 J8 d3 p6 i) U1 Q
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. f9 H  ~/ Z- K, F. B
- a6 t9 ]4 t: E% N* `1 A: H   //RESETn,L138_SHK2
: _( I) h+ L+ i( x9 T/ {0 L3 k   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ) U; N2 \7 F/ G5 m' h5 `
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   2 @% p0 M  L) _* |( v
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( Q; E- y3 k  N% v
1 {" b2 o+ L2 L2 y" \/ s
1 k5 R9 N; k4 \/ m* x- ^% C
  //SPCR Register
  Q) R+ V( N; F4 K* i2 C  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) T" B+ v5 Z, M& o7 Z3 J( n
  temp = 0x03000000;//(DLB=0)6 V/ @3 ]' f9 g3 i( }7 q# Y
// temp = 0x03008000;//(DLB=1)
4 r- b( K# u1 k+ B  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
; z: j: \7 O" M9 d: x  \9 M( D  temp = readl(IO_ADDRESS(SPCR_ADDR));  |/ m. l7 I$ w7 O: l3 Q
  printk("temp=%x\n",temp);+ r3 K; |: n8 N1 Z) F
# r$ g* |. O3 w0 E' t% s. _
   //PCR Register
# }" ]- m0 f% l& S- ^5 _6 Y   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
. J0 S- f1 _- H% }0 G  // temp = 0x00000F0F;0 ^' b) K% v( A. }
  temp = 0x00000B0F;
0 y+ _+ s0 Z' D, O( {  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
. O6 g1 o# ]: o6 ?  temp = readl(IO_ADDRESS(PCR_ADDR));0 W! U3 M4 R. a7 l7 X
  printk("temp=%x\n",temp);  ' J& \4 q+ S: o7 o: t
   //SRGR Register9 v( r1 E5 C  ^0 p/ k' Y3 U8 e: r
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( x0 h9 B4 G; \ //temp = 0x301F000B;' m" L$ T; H, R2 P
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
' H! g. _( e& m$ A8 z! q  X# e8 j  temp = readl(IO_ADDRESS(SRGR_ADDR));
& p1 I" a2 p. Z: j9 u  printk("temp=%x\n",temp);
# S7 q. w: D& |1 K2 ?   //RCR  Y8 T1 Z6 r$ s3 v6 d# P
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: [0 w/ B/ t3 E4 Q) A
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# I3 M+ P* A& \' J" u   temp = 0x00440040;" \& ]( s# J/ @  M5 X' P/ g5 D1 R
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
0 F+ J' ^) e1 O   temp = readl(IO_ADDRESS(RCR_ADDR));3 K2 E9 a6 [& {; o4 S9 f6 Y
   printk("temp=%x\n",temp);! S8 [! t- V: c9 W
   //XCR
8 `' K5 U: Y. @' O" S0 D   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( i. {1 h9 S& b- b
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 ~' L/ b7 m; _  \7 M* }- d   temp = 0x00440040;- B7 |2 M8 _, n
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   $ b- T8 C& K+ G' r* M( r
   temp = readl(IO_ADDRESS(XCR_ADDR));
7 y* ?- y9 i! g6 d( m; Q   printk("temp=%x\n",temp);) o8 D( u1 M2 L  D$ f
  udelay(100);
% ~* W# J. M. D9 ^" S  //SPCR Register
' ?3 w) W' s9 W" V# L  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 x: R2 g# _9 l3 V4 M* }6 y' }
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( O8 Y" Z/ F8 A3 @/ F: S
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled* m# U5 G8 Y$ M  l3 j3 b- ^& \
  temp = readl(IO_ADDRESS(SPCR_ADDR));6 y8 h- [  U' T$ z/ G0 e
  printk("temp=%x\n",temp);
/ I$ w5 [1 F6 h+ t0 x" ?* Z  udelay(100);7 K; C9 i0 D. \8 d
" j! b' P* @6 L' X( a; c. d6 ^
  //set GPIO direction
1 n6 N8 L3 Z9 G/ b   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# U+ M. e- y7 U3 i+ ~
   temp = temp | 0x00000100;//EPR----input
! X- D4 ~' ?, B& O   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 K  F& _$ i8 O; v2 l0 {
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! V7 L; d6 B% `1 K
3 c  d/ g. L2 j8 |
   return 0;
5 U) t4 \# n; t0 l$ J}2 P( N6 M. ]/ k0 l/ x6 c
static void __exit MCBSP_exit(void)7 J8 R: u& x; e& C7 \7 T
{& m& g# T/ J4 |5 Z  a" p4 J9 T
   printk("mcbsp chrdev exit!\n");
9 A# F: p# G; a9 L+ y/ ]) ]   cdev_del(mcbsp_cdev);. s, m4 ~: M- z) W! S$ k
   unregister_chrdev_region(mcbsp_dev,count);' l9 @. _& x) f, h/ Y! G
   device_destroy(mcbsp_class,mcbsp_dev);8 |% r5 A# b9 C1 N* ?
   class_destroy(mcbsp_class);
: v& K. H  t$ C! x/ V8 }- y}
& h  N3 s& s8 X7 I/ Q/ e0 v/ Emodule_init(MCBSP_init);
) _, v) u  W$ G0 s, `module_exit(MCBSP_exit);( ~; ?/ z5 f" B' E7 L% I2 S6 M
- e/ E, P2 R$ e3 d4 a' z
MODULE_LICENSE("GPL");
; K6 w$ @' X' \8 M$ ^" l: _- X* H" N3 }5 I% P( f. b7 r
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 ?: {/ _8 L# Q& N$ _; e4 P, N
我的应用层的测试程序如下* D+ A1 w) K2 i9 w( o
#include <stdio.h>
9 p% V3 u" v3 ^+ p8 c+ J* [. i#include <string.h>( ?/ }; t# ]+ Q5 E
#include <fcntl.h>5 P( ^! V2 U5 u+ r
#include <unistd.h>% V( f/ W4 |- g1 ]: T
#include <signal.h>
0 Z6 i1 j/ \0 E' w, _/ t#include <pthread.h>       //线程4 D) U. Z! C* e* j5 k! G1 S% p8 E: H
#include <stdlib.h>
' Z" g8 H- |& M) E#include <pcap.h>          //捕获网口数据9 {7 i4 A% B1 e' u- [, W# @
#include <semaphore.h>     //信号; H; j3 x8 V; Z; q$ i9 E# b9 M
#include <sys/types.h>     //消息对列5 v* Z8 J! J* s9 v
#include <sys/ipc.h>       //消息队列, b" L  Q4 U1 X; U) v+ W
#include <sys/msg.h>       //消息队列
4 t% v8 [, x' F8 b#include <sys/select.h>8 L" ?4 I2 i) a- L
#include <sys/syscall.h>
2 d4 n0 N. x2 C5 o3 G: f#include <sys/stat.h>! A" D0 H' w, z1 \( |3 X
#include <sys/mman.h>5 b0 l) X$ Z1 Y  h6 a5 A! I
#define msleep(x) usleep(1000*x)! K5 o  S! L! z0 F3 i' H+ d: [
4 R4 L; |4 ^. {8 Q
int main()
# U1 A: Y: W/ x' r& \{
5 M$ {7 n4 g' b! I9 r    //MCBSP,ARM与AMBE2000交互设备
' \) k% T) _; ?) d, p0 m" h int fd;- F8 D# O6 j7 v% S) s' A! A
unsigned short data_write = 0x5555;
7 b3 j( {( i6 A% F1 Z unsigned short data_read = 0x00;; w1 {. G% q5 A4 b. o  K% g& S
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# m: E/ c5 m( F) o! t
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ L* d+ K  V/ G; i( a- C+ [( k    6 [+ C  @9 z% A+ ~8 ?
  if(fd < 0)
# X/ p  H2 e# j+ {; {" }( ]$ ~; c  {
$ m7 E  R1 Q9 ^$ S: O     perror("open failed\n");9 i  ]% g* y3 Y- r% S) a# R' c& ~: _
     return -1;
# U2 v+ E* M6 f) i  ~; `  }
& N& O8 {: C$ q- u$ O1 p  
( u  J& V, d2 Z" o/ V7 E6 o  while(1)$ e- P2 {* R: I6 v! x3 k$ ~
  {
7 @* a+ U* D: r! v5 g0 p   
6 e4 N5 }. N1 v: C- p4 R   //AMBE2000每次读写是24个字为一帧
' Y. |" a: u% x! j/ I) j, w   //写数据时将数据在底层存储起来,等到中断的时候再发送: n$ X' E; {3 T) d8 h
   //AMBE2000输入数据是以0x13EC开头的
8 }9 h+ m8 d$ P' j2 ]6 r1 V8 A/ b   write(fd,&data_write,sizeof(unsigned short));
3 Z0 Y' R" l' s- ]- f   
$ w8 K- B8 D" Y; R2 H, }/ k4 i& `( i   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 R; h9 S1 F2 f/ @9 y- `
   read(fd,&data_read,sizeof(unsigned short));
2 ]$ k  S9 ^; S4 g8 G   ( N; U5 I6 X; `5 _) w
   if(data_read == 0x13Ec)
! T+ p" c6 j! m   {
- ^6 j: ~4 X9 x3 L) K9 y   
& s; ]# @1 W; ^: D; D    printf("data_read = %x\n",data_read);4 J9 S. z1 f& F8 f- c5 R7 ]
   }6 I, b9 M3 }7 w8 K: ?8 y
   6 Z! K3 F2 B8 K  R" z. D1 t
   msleep(10);5 N- |5 q  J  t* m
  & Z1 G6 L' F7 E+ L% A' y$ k& O: x
  /*
- T/ S) ?" W& T: s! o% R   ioctl(fd,1);   
" P/ K& o, `: a6 Z) a! _ sleep(1);% Z2 O9 K0 c9 s
ioctl(fd,0);" W# S$ D; e* R6 B+ A/ E" U1 g  b
sleep(1);
: K! b5 {0 l2 a( p */ ) J( _" z6 i/ ^9 b3 A9 a
  }   
  m( v' r* E% I9 ]' Y return 0;8 _& C7 ]0 ?" K3 l, s  G

9 x) H6 K7 `/ t1 c6 @% v}) y, V& k; m% H6 D8 u+ e# h: Z: \
, `: t, @2 r; P$ k" x3 E
多谢各位指教,谢谢! 急; N3 z& L+ K+ n/ p8 `# _

+ J- l1 \: A3 i5 G# [/ i  B
- `* J& Y8 M3 n+ d. J! l' _/ W' `0 W3 K3 X9 r0 p( {  ^: E# _1 v

: [/ O# g: k2 t; c
! @/ C  ]0 G! B! u9 u: Y9 T5 X$ v3 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 04:23 , Processed in 0.048871 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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