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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( S3 Z! q& _+ s5 e
/*3 f! J" p  j0 w$ |8 ]5 P4 L0 c
* Copyright (C) 2009 Texas Instruments Inc  l. o, U  ^+ c+ D$ }7 M% r
*+ _) e3 P4 w) p2 h7 {- O4 `
* This program is free software; you can redistribute it and/or modify& ?5 c. |6 O$ A$ E8 a5 L/ N5 f
* it under the terms of the GNU General Public License as published by
2 V; r7 O, w. P * the Free Software Foundation; either version 2 of the License, or7 h# @8 H* d3 ?5 @
* (at your option)any later version.8 e0 o2 g* I  D* b9 Z4 {
*
1 B( [" I) [; P# ]: K; j$ E9 Z * This program is distributed in the hope that it will be useful,3 Z# i( T/ O! o5 t/ f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
( F8 o/ n2 U7 l) \ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1 S' U9 y! g$ C( f; U6 ^
* GNU General Public License for more details.
) o+ b% f& {4 e4 L. v *
9 f7 Z( H% h( _1 K1 Y1 g1 b( Q * You should have received a copy of the GNU General Public License
- s/ t% E& p# W * along with this program; if not, write to the Free Software
# d# W) K7 Z( E: e * Foundati
" [( v, K4 {0 b$ G*/5 Z8 _" `9 G1 Y+ }" K8 ]
#include <linux/module.h>0 v; H1 p& @* k# i
#include <linux/init.h>+ b6 z0 F7 C' T; g' U3 y5 k" h, L
#include <linux/errno.h>2 I' z( n; V7 w$ u0 {
#include <linux/types.h>
. S) w: R: X4 d" K% F+ {$ j7 ?#include <linux/interrupt.h>$ i# K2 B- t, S4 ~, |" Y/ i$ r
#include <linux/io.h>+ j0 G* q; @) A0 ~
#include <linux/sysctl.h>
. c$ R9 ?# N# D* r#include <linux/mm.h>
( A3 m5 Y3 \, G" o- `& I8 b7 I#include <linux/delay.h>
+ a2 t, @! B3 M- ?#include<linux/kernel.h>
1 o( O2 k  r* P' i- Z# A+ J1 [' L#include<linux/fs.h>
+ t! b8 k& g/ U; }#include<linux/ioctl.h>' f/ X% U4 Q- @* @0 J9 j/ I
#include<linux/cdev.h>
4 i3 N) b% H; r: S* Q9 V6 C5 {#include<linux/kdev_t.h>7 L, Q# x. R! {7 c  t
#include<linux/gpio.h>' H$ Y$ w( ]! A% |, N8 b
#include <mach/hardware.h>
+ ]& t4 J3 i1 M$ k3 ^+ e1 U#include <mach/irqs.h>. M* f# k* L, M2 ^

' e8 D) v; t: l" s#include <asm/mach-types.h>
9 {4 _" l* y' M  ]/ ^9 n#include <asm/mach/arch.h>
4 `2 E2 k  @: G#include <mach/da8xx.h>0 [! ?% r" G2 v9 A2 x4 p3 t
#define  SYSCFG_BASE   0x01c14000
* A! v/ |# c6 S#define  PINMUX1_OFFSET   0x124
) _, e1 Y7 }* h, C9 ~#define  PINMUX18_OFFSET  0x168
4 @) t* I8 B/ N1 D# A) m#define  PINMUX19_OFFSET  0x16c; O* R8 D- n, Q
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: L9 W- n7 G# B' I
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR5 H% i; G- |/ u, q: N  V
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR/ f( F0 L$ r5 t" b$ o
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR  O7 `; \: f' h
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
: X$ ^7 U- d- b3 q                            ; w  d9 B' v; ]/ C8 x
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* P  P, D% J" C* P$ M7 m#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 p  ~& v4 v  g6 u! ^) t//PSC6 O9 \# ^+ t: ^5 n, w, C
#define  PTCMD_ADDR   0x01E27120  
% j4 T& Q7 S" E$ v0 Z#define  MDCTL15_ADDR 0x01E27A3C, D! ~$ O4 D6 ^) j: U( l
#define  PDCTL1_ADDR  0x01E273048 Z2 Y) S# }3 J8 {+ m' V% n
//GPIO8 direction
4 _0 B8 r6 r: h9 H; X0 ]' y#define GPIO8_DIRECT  0x01E260B0' Z4 c; k9 ?0 r+ C& B1 }
#define GPIO8_OUT     0x01E260B4! e- G& `- p, T  R1 a& p
#define GPIO8_IN     0x01E260C0* J" k/ C8 n6 B$ r
5 l& k2 ~, E: k& }+ ~2 I% u
//#define MCBSP1_RINT    99              
; F4 d: g: N& `" R, t" X//#define MCBSP1_XINT    100  $ r9 S" ]) G9 _5 T& E+ b
static int MCBSP_MAJOR=239;& `" E% S+ p0 f  H+ O4 X
static int MCBSP_MINOR=0;
3 i/ N3 X$ ~( @1 ~0 n' o8 N& Kstatic int count =1;
: w. d% k; l, n2 F' V3 ?+ M: r/ U8 r: m" d9 q: U
#define MCBSP_NAME  "MCBSP-device"8 E! i9 X) M: ~; f0 v4 y( A& ~
4 p8 J( ]" @2 `+ ~
static struct cdev *mcbsp_cdev;
* M% f! |2 Y. \5 M$ Ustatic struct class *mcbsp_class;
6 f  q; F( v+ J6 u" {static dev_t mcbsp_dev;. P) g* s2 t& K* J! F
unsigned int DRR_data;
0 A8 }; Z  [" N- Z( Iunsigned int DXR_data;
" X- [& M) C5 g7 ?4 J9 L9 q7 I& bstatic int mcbsp_open(struct inode *inode,struct file *file)
( F, y9 q- x" F# Q5 h2 N6 g{4 Y+ z* N$ B# i4 X( I( Q
   * w$ a/ y4 I$ _4 k! J. T* B, {% J+ w- s
   //interrupt enable,initialized
0 G6 N. T% O9 f. n/ Z2 V' W   unsigned int temp;
6 A( y& V+ v6 q8 }3 o$ X3 \0 V- B) M& o   //SLEEP_EN(GPIO8[10])---0" q+ H0 ]' w( s. ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% ]  Y2 `8 M8 @2 ~0 U2 m$ p   temp=temp&(~0x00000400);! M% w; u8 M4 |7 [0 W4 m) [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 y* C* I1 h4 d+ q9 n# E
  //RESETn(GPIO8[8])----0----1
; F  {0 J! g/ g: C   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ U( h) x  ]( Y5 N4 k7 k
   temp=temp&(~0x00000100);5 I8 O1 K7 _* v) t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ q9 P) x7 }& o: J& t   udelay(100);
6 |4 D, t) P7 m   temp=temp| 0x00000100;
& L2 m- `, l- y; P- n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---10 l1 f% l$ Y& x7 T
   udelay(100);* Y$ k  {; O5 G/ F+ T
   printk("open success!\n");- P: x; u" o: J& @9 \
   return 0;
! V" U" K3 o5 X9 _- S. H  m  P}
( d3 V! T2 P3 F0 V- E6 Q; I$ I, d( Z$ b7 d0 x0 m9 [; F8 N) r3 b
static int mcbsp_release(struct inode *inode,struct file *file)
8 F% L3 b4 a" [/ a4 X0 y{- H8 w' Q& Y/ [1 R; K. h- P1 z
   printk("release success!\n");5 H9 M6 S% D$ N. O" V( U: D  O! @
   return 0;
) X' D% y1 Z. }, N* {, A}! I+ a7 _. E1 h0 L1 X3 R
( {6 q3 K3 u  |6 B% F
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
" n4 w3 Z. {% M{% p, X; P: f# ?9 K( N
    copy_from_user(&DXR_data,buf,len);8 P# [, N1 ^6 o$ T  G
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
- x. a  |4 J5 ?: f    return 0;9 |% l" }$ I( A: Q

4 H8 N/ V6 c1 b- U: c}
3 [: q1 O8 r* o8 o0 N
7 `4 }% v- Y, L/ \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ E6 e3 O+ q" x* Y
{ 9 c" R/ K  @1 z
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 B4 l7 U3 o: P3 W! v. r9 t
   copy_to_user(buf,&DRR_data,len); ' w' x2 t3 A+ C, s2 D  K
   return 0;5 c8 }+ B' y7 z2 h4 j
}& w& F& F0 Y, W' d4 v3 N

) j+ s- F8 J2 b' Q
7 E* F+ `1 h& Lstatic struct  file_operations mcbsp_fops=
) ^8 p1 d! c1 e2 p( Q+ l{
0 D) z1 K+ m0 v* ^* m   .owner=THIS_MODULE,
# z  R+ |- t  q5 ?+ E- L. K   .open=mcbsp_open,
- ~( G8 p' L) E0 _9 B7 w- w   .release=mcbsp_release,
# C- E, J8 r& n$ \+ P   .write=mcbsp_write,! q' @) v9 _1 W% X2 v
   .read=mcbsp_read,' A$ L1 K8 u* j# p  C) W
};
# S, E8 h: m2 g. c2 Zstatic int __init MCBSP_init(void)
7 I0 @. ^' U: O: X4 Y{
7 y7 \, Z$ u! g2 l* X$ M) h   int ret;$ {  Q  \2 o# G
   unsigned  int   PINMUX1_REG_old;
+ Q7 l/ n, W3 n   unsigned  int   PINMUX18_REG_old;- r$ ?! W2 `; A. z
   unsigned  int   PINMUX19_REG_old;
: r* ]' z1 V* U   unsigned  int   temp;  
) A) H( b2 m% e! E+ y! z   if(MCBSP_MAJOR)
2 j. ~$ n, O* i   {
/ n8 d: {- m( a5 G; K" g2 }4 h1 ^      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ _8 E) \  A2 h      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: b2 f7 M# d0 M7 R" h) r   }
0 P7 V2 |2 ~: I) y) p: X* s# [   else* [* O& Z9 ]3 p/ R; J: s+ @
   {! ?8 }. v9 f8 u0 S+ ~% T
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 x! {0 G% b" ~8 ^2 G      MCBSP_MAJOR=MAJOR(mcbsp_dev);* A- a' r% x# ^: O
   }9 S$ K, l7 [$ c# t" M2 h1 }5 s) F
   
( d5 R$ n* x% `# m' w5 {   if(ret<0)
8 A  R: y! y: ]: Y   {
. b; W% U' @- d( y. t- U      printk(KERN_ERR "register chrdev fail!");6 Q3 e9 y0 ^0 @9 S- U- M
      return -1;
  E" Q* m' L9 G   }0 s! b9 k2 P/ r4 z) J' q
   
# w% Y$ i7 u' X! g   mcbsp_cdev=cdev_alloc();
, p) ~+ j1 Z1 [. R   
. Z: W; ^) ~% q/ u* ]8 v   if(mcbsp_cdev!=NULL)+ G2 T5 K8 w0 V0 A5 ~3 d) }
   {( Q$ i  j& O. }# X" F: L1 @
      cdev_init(mcbsp_cdev,&mcbsp_fops);5 z0 }9 y: O1 c8 C- ?& r3 w. r; _
      mcbsp_cdev->ops=&mcbsp_fops;
& n9 ~" R: R6 J      mcbsp_cdev->owner=THIS_MODULE;- j' f3 P& V* Y/ Z7 C8 d- F7 a
      
4 c" W6 W2 K3 A" J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ t; \% C3 R% X2 ?9 R5 X' ^4 }  _. f          printk(KERN_ERR "register cdev fail!");
: i4 k  G2 R, r4 Q4 o' y  e) |      else
7 Z; `; V4 \/ V0 v, b          printk(KERN_ERR "register success!\n");
- e7 `2 T) _+ h) U  r, q4 n! }7 z   }
: q! j" [% G4 G2 f( O) W# A0 @( Y   else
( z5 G3 j0 d" F) w9 [   {5 V" J, c' R+ T* i
      printk(KERN_ERR "register cdev err!");
! O% ?5 T; d$ F' E9 Y3 l+ n% q& @  C      return -1;
: |; C' s+ c' v' U) e* }   }
; v7 D1 L5 n, J, |! K6 C   
/ Z: _( C# F% G* E& S% c# ]3 Q  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% S' [" s0 D/ Z. F) z8 V
   if(IS_ERR(mcbsp_class))
  ^3 m% B$ O/ T, H$ v   {
" C; B7 y8 N9 ^7 k, J+ W      printk(KERN_ERR "register class err!");
8 C( B' C2 @! R3 I0 `   return -1;$ b8 n8 o& ~5 ?' n) k. V
   }
( I- {, A/ J- k3 p   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' a0 j" G9 X! K5 M, F

4 X4 d7 G" ]3 Z7 M: N- y   //PSC2 x8 u9 A3 e4 P
   //add Enable MCBSP
- E6 Z4 a3 M4 f' s: n   //test$ |# z+ e4 l, u0 e3 h8 l
   temp = 0x80000003;! L/ s* q: y) G: o! [+ J# D; D
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));: R/ B5 K* [% v5 t7 A2 d7 n, V
   temp = 0x00000003;( W; r. p* U- a! ^& h/ d
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
; V3 S& P7 f) F7 h. @1 G# U6 H ! u+ b5 j  ?: ?2 m$ t
   temp = 0x001FF201;! r3 {% B) [8 O- A* s1 x
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' A- U0 t, i4 {5 b6 s   
! P, r8 v6 l% b5 e' a# K, O   //PINMUX    A; [& W+ c2 i1 Y
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,' d  D( `0 q. H2 ~1 Q; f% A$ R' [
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 z% q/ x; X: e; u
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   1 b$ {. i5 H( i
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- J+ {# X0 L) S1 F, _   
, q- @* k5 d% ~0 }   //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 q+ @* n2 M7 e3 h7 @, q' H; }   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; A6 v! D1 U/ l% n   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   * P% L3 L3 y/ z! d
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( b) h: y& ?# _% x; y
, K. t1 S4 P* m6 I
   //RESETn,L138_SHK23 f9 p' G. V) J  n( O2 E. x
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
$ t. i' H/ i$ C, h5 |5 E  f   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   $ o! F9 z5 E$ S5 E8 c
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 h. Z" s" w# ^4 V & W' h1 v3 K7 b# N
- w( p$ n' j6 \% Q: H, Q! S
  //SPCR Register
) k8 r; B2 q" r0 J7 b* G  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" l( j1 [8 {0 ~8 m  temp = 0x03000000;//(DLB=0)
( Q8 G4 d1 `( Y1 K9 { // temp = 0x03008000;//(DLB=1)9 ?6 ]( c- Y2 j2 D  `9 Z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
6 l9 r- s3 s5 j  temp = readl(IO_ADDRESS(SPCR_ADDR));
0 }! u. L+ r; Y( V1 o8 H  printk("temp=%x\n",temp);+ X: O) A! g+ P( p6 |& W

3 q4 n3 p2 f$ w! B) Z   //PCR Register( J' V" u4 i$ c% S
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* P3 p# j3 ~! O; {9 T  // temp = 0x00000F0F;
! ~& b( D( L) ^) n0 i( I  L! H1 D  temp = 0x00000B0F;7 L9 E3 p4 T5 _( h1 J- N2 U
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* z% s' u- u+ X' `  temp = readl(IO_ADDRESS(PCR_ADDR));
) @) N5 x$ L- t( @0 }3 t  printk("temp=%x\n",temp);  9 m0 K8 i' y- {7 p7 I; I9 P
   //SRGR Register
" f4 t/ x6 W$ C. x. h' V, h" A2 E3 t   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% P5 S$ N: |0 W2 B; A! J2 ^1 H //temp = 0x301F000B;
3 g% G% C) Y1 Y5 a2 O   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
/ Y# E& Y1 r4 w" K  temp = readl(IO_ADDRESS(SRGR_ADDR));2 z/ v5 A2 g% ~3 A8 k# @
  printk("temp=%x\n",temp);1 b1 E1 v$ _" g/ C9 H3 S
   //RCR; I$ L6 o2 o' M, b# }
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 x3 e' X: q# x3 T) D2 S   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. M! a2 d/ ?/ c' A& a! J' F' z; t   temp = 0x00440040;  H; j7 w4 `/ _" u/ t* [8 g* @
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   6 c$ t+ ?8 O! R& r# w
   temp = readl(IO_ADDRESS(RCR_ADDR));
( D7 t9 P4 Q- T, k$ |5 b; g   printk("temp=%x\n",temp);2 g( q+ p/ S1 E3 j: U
   //XCR
# z" c& |6 M) J. O4 G4 W1 B+ B7 C   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: {0 _% q0 _$ D1 n8 @/ m2 w
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 i# M) a8 J2 f1 l% S# u
   temp = 0x00440040;
* S) ~* c5 z5 P3 \/ p7 L/ C: Z   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
  X/ s8 c" H- U( N   temp = readl(IO_ADDRESS(XCR_ADDR));
" \/ L  M$ [. _! n0 }$ H/ s% J5 ?   printk("temp=%x\n",temp);
+ N8 }) e) b% ~* V  udelay(100);
' C* e9 x& D6 x5 B8 h) U! n  //SPCR Register
) Y8 V( v( s: Y4 F; h6 ?' `2 G  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 c, e* Y8 l: r0 O% t8 w" {5 M9 y  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 R' P. f2 X$ G  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled3 S8 P2 \: g7 |) L
  temp = readl(IO_ADDRESS(SPCR_ADDR));5 D! s1 }. s% x0 r( ], N7 y
  printk("temp=%x\n",temp);# j+ z) U, M5 h. X- Q) A! R
  udelay(100);7 P5 m1 a9 B, I7 i4 x5 U3 ^3 N
! \5 h0 N7 W# S0 ]( s& n
  //set GPIO direction- L4 I- K2 {6 |5 @: w- o) r
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
  W! J4 W6 x, I8 M* m   temp = temp | 0x00000100;//EPR----input& D/ M* `: f# W$ L/ G" g8 `, B
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
' L  m" S; A" E   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
% W" ]* R) Y0 A: {* l- I7 r- F9 P 9 _+ ~+ D/ X3 y3 ^% |
   return 0;
  X! A8 u$ b0 w3 y- g3 W}. H. |7 T# M5 f* H: U
static void __exit MCBSP_exit(void); f% D8 g8 c1 {
{
+ S& K2 i6 X( O; Z3 Z   printk("mcbsp chrdev exit!\n");' `" I% W/ U9 x! n
   cdev_del(mcbsp_cdev);
2 C1 g, f& Q3 V: k' a- }4 u   unregister_chrdev_region(mcbsp_dev,count);
' w! @6 E( q- I7 w  W8 L9 q   device_destroy(mcbsp_class,mcbsp_dev);* C- y' {; \- @2 `
   class_destroy(mcbsp_class);2 b) J2 H1 _0 U( ]0 D
}
( J& y" z# L' [9 ]5 c1 y; j- b2 j) umodule_init(MCBSP_init);) t# J' c) q( [0 R0 M6 |
module_exit(MCBSP_exit);
0 P: C- ^/ G( Q6 I$ z3 g; K" `1 i5 ?$ ]  l$ ^/ m# \- N: F
MODULE_LICENSE("GPL");- R8 i, y* z( _4 a
- T' ~; F2 R% h9 g; X# h3 H7 e
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! Y! c7 }. i5 ~4 b+ C
我的应用层的测试程序如下% J* `6 D& E* q2 T% D  z' s
#include <stdio.h>
7 d6 [- \' q4 h& z- H0 g#include <string.h>' M) c4 D: Z% ?8 @
#include <fcntl.h>
8 [$ b0 @) r' F) V0 K. [#include <unistd.h>
7 W/ Y! K7 L2 ^2 X$ @#include <signal.h>+ }  ]5 c7 H4 }. r* F
#include <pthread.h>       //线程! e. z# S" H4 [% Z
#include <stdlib.h>; L  V0 y3 ?7 h* ^3 v$ c5 v/ N6 `
#include <pcap.h>          //捕获网口数据
6 y. D* a! w! q6 A3 n) K& S#include <semaphore.h>     //信号
* v  m4 p9 Q1 p  `0 i#include <sys/types.h>     //消息对列/ F/ k% D/ c/ r: {) t( r# J
#include <sys/ipc.h>       //消息队列$ O4 [: M1 G' a! k, ~& Q
#include <sys/msg.h>       //消息队列3 M2 Z# X7 \9 S6 I* E3 H5 E4 z* R
#include <sys/select.h>6 t, x) z$ f, \! C$ C# ~$ |
#include <sys/syscall.h>
: H6 n8 {2 s: i$ H* h4 g6 j4 ?: e! \#include <sys/stat.h>
- O* A+ o* ?, u#include <sys/mman.h>* q9 L- d. t! m7 c7 R% h
#define msleep(x) usleep(1000*x)
* V. A1 V9 w$ t( b3 B, }; k- ]7 [, S7 u4 Q! \, Y
int main()
( V6 x" P3 p$ p, g{ 0 W0 Z3 l: [2 }1 d) Z+ r& r4 u
    //MCBSP,ARM与AMBE2000交互设备
: w! l$ }! j7 D- t+ J int fd;
$ m/ Y( N8 Q! d unsigned short data_write = 0x5555;
; s. @& `9 S7 `1 c unsigned short data_read = 0x00;
6 U. M8 m5 k  a" E" D  u. j7 H  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; g. j( w7 J( p5 J) F; N
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) c4 V8 D5 k1 z$ a, ?6 W    ) @/ X7 _& ~% T" X- v, Y; `
  if(fd < 0)
8 Y6 ^, y/ I5 O/ \" K  j3 B1 G/ x( {  {* d3 M% q# D# Q. L2 a; x
     perror("open failed\n");
. y' v6 {; {* z     return -1;1 U( N8 `, p* L: [+ {; D
  }
  }  g" H# T* s2 i  
" E4 h$ U) ^* Q! c9 D  while(1)
7 J5 p% `: ?# X8 V0 |9 T4 e1 A+ h  {
3 u# f- u; @% T! I' {   & h6 M1 p' G% ~, C+ `1 V
   //AMBE2000每次读写是24个字为一帧
- B" D- u. v; v, H   //写数据时将数据在底层存储起来,等到中断的时候再发送
) o' E1 h. r* \* M. i$ \   //AMBE2000输入数据是以0x13EC开头的& |) B/ G" K9 V, S5 N
   write(fd,&data_write,sizeof(unsigned short));8 M2 I* b9 W1 h5 Q2 W
   
3 U' c+ O0 x6 P( _; L   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
8 w( Q% K$ Z, x  S- R9 [2 {   read(fd,&data_read,sizeof(unsigned short));. }! l) z5 f+ y! P5 Z4 r4 W9 k
   $ Q, p$ a2 V# L
   if(data_read == 0x13Ec)
, N. E7 `* ]# q; y' L   {
3 ]! g3 r- }( L; C   
& I; V1 O1 g- z7 A, x    printf("data_read = %x\n",data_read);3 p# g" E" R% [+ }& a
   }
/ G: I# l- R- f8 L1 v% Y: }   
9 h; ~( m4 R$ Q6 t4 Y   msleep(10);
. O' `% l5 d) b( q1 S  
8 @3 @; d8 P( j5 S' X5 k  /*
1 d/ t, s) ?1 k" |0 S* c, r# ]+ _   ioctl(fd,1);   
# H3 e. t9 C4 n* f sleep(1);8 }  C" S0 h4 M5 i  `; T
ioctl(fd,0);
2 {! n5 z7 _, F, L7 Q% _2 F sleep(1);
1 g, s' T( D2 n" u3 Q/ l */ . r; M7 k7 _+ V+ s$ K9 z7 R& Y
  }   
6 L% q0 O5 A& e return 0;8 e; R, ^+ i" h+ S( r

! L5 ~: [' O, S( v}
" K+ C( }! J1 B2 Y1 a8 r; G' T% |
$ ?% |# l8 N* J' N- ?5 u多谢各位指教,谢谢! 急+ @7 p" C" h4 p( U; U9 j% ]

- ~& E- u4 |4 _. i, u; y  m8 j& Q7 S# R/ f6 @) E/ @

" l+ A* S* H# c0 e9 U  W
8 U' }) t% l: E
/ U0 n7 O* z: N7 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 11:11 , Processed in 0.055798 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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