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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 f$ G  _4 l7 Q, q+ r* f
/*
, ^1 S7 b8 [. V& V" R * Copyright (C) 2009 Texas Instruments Inc
7 k! w( n% x$ j1 k; ?: ]8 H *
! C7 B. }5 J/ c2 O5 v * This program is free software; you can redistribute it and/or modify
/ v3 m7 w' Q/ K* R9 S * it under the terms of the GNU General Public License as published by
4 ~+ W/ u; v! ~, i * the Free Software Foundation; either version 2 of the License, or
8 T7 n6 h, Y6 ^+ `2 J; ? * (at your option)any later version.! y. z0 _( j/ j% H9 U: O
*0 e* N: A( K# D& e) [/ ^
* This program is distributed in the hope that it will be useful,
8 I9 H" X3 K% J+ t0 g: A2 v * but WITHOUT ANY WARRANTY; without even the implied warranty of
& W4 P& M0 l+ t  ^2 T * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& ^0 o( N9 b2 p& U6 s) f  q% R8 g
* GNU General Public License for more details.( f% w- j& }: s% A$ x+ D
*. y4 z& k; Q  [# ~4 _( K
* You should have received a copy of the GNU General Public License
- r! E9 g1 ], P9 T9 p, O * along with this program; if not, write to the Free Software" V! b: A/ s; O
* Foundati. J' [! {7 k+ b2 B% \
*/9 ^! {* A! y! R
#include <linux/module.h>
- C4 t" b" G; e#include <linux/init.h># `2 |. M2 V; R4 E1 A; n
#include <linux/errno.h>
" i# I1 C* {3 v  {+ u! i3 u& e' Q+ D#include <linux/types.h>% g$ O) W  J9 S2 n- S* d& N
#include <linux/interrupt.h>
5 [8 P  J+ _% A8 D#include <linux/io.h>
0 x+ ]6 Y( X- y" Q#include <linux/sysctl.h>  Z( J5 N3 C. i9 W# G! y+ n; L
#include <linux/mm.h>
9 Y, p2 n- D( r8 ?, L# f9 v#include <linux/delay.h>
9 M0 N( D5 K0 H+ G0 M) N3 Y- M#include<linux/kernel.h>/ s: O! C* B+ z3 `+ h6 W  v& p6 }
#include<linux/fs.h>. q) n. P' q. d: _5 ~  B( q
#include<linux/ioctl.h>0 ~7 X7 t' c7 S" d: z& f
#include<linux/cdev.h>7 a8 F% R+ i* {  B, \' a, k
#include<linux/kdev_t.h>
* S9 ~/ S2 _* r$ L/ v- I#include<linux/gpio.h>; k8 x" K4 P) y
#include <mach/hardware.h>1 B1 ?3 s" h8 o. s; h0 w5 Y  K. }2 Z
#include <mach/irqs.h>
- L! m& v8 y' |% z8 O; ]. Y4 [( `- d! k
#include <asm/mach-types.h>  E! q( U' ^! m- ?5 I) L( Q9 e
#include <asm/mach/arch.h>
! j  D# _2 l% Z& c9 C% M# N2 d8 ?1 b#include <mach/da8xx.h>% I! }  c1 @8 Q, M
#define  SYSCFG_BASE   0x01c14000/ t! D/ s: w1 x/ L6 F) p& t! p
#define  PINMUX1_OFFSET   0x124 ( `  _! |$ I8 {) Y0 p" w8 s4 }* o- q# [
#define  PINMUX18_OFFSET  0x168 1 \* K. I& ?$ ]
#define  PINMUX19_OFFSET  0x16c
, v$ {; x! c$ q0 g) a% i7 D% h, G#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* i4 I) C, b, l: r; O
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
% t" ]4 Q) _, P: D  Z" T1 E9 b+ ?#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
8 t9 J  w  C  c0 t. L# |/ }. W#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR0 I! p, \' V  M  l  G* e
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR& P" S7 g, J- t5 t( ~
                            5 A# O: ]* z" U' Y
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR* O# ?( L7 U3 z2 ~
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
& f( l8 P, W% A4 [//PSC
- h& d$ B5 J6 }+ B- Q6 n#define  PTCMD_ADDR   0x01E27120  $ `$ C- o! {" r; |# w& w
#define  MDCTL15_ADDR 0x01E27A3C: {8 m! K- Y* Z3 L4 e
#define  PDCTL1_ADDR  0x01E27304
0 u; ~5 G3 P& k8 I, r, B: K//GPIO8 direction
, Y! m8 b7 R" P1 M6 ]#define GPIO8_DIRECT  0x01E260B0$ q/ p7 Y1 U/ G3 ]5 h! Y$ i7 I# x
#define GPIO8_OUT     0x01E260B4
. B+ l6 x9 X) F% M5 k* l#define GPIO8_IN     0x01E260C0
9 h& g# `& N; m6 F; t2 a: G! W6 G7 m* c  r: ~, `& z
//#define MCBSP1_RINT    99              
7 u: K+ h( p% V2 Y- [/ [  n//#define MCBSP1_XINT    100  * i3 l% B* |6 h& h  ~* I
static int MCBSP_MAJOR=239;4 W9 x; g2 D0 u
static int MCBSP_MINOR=0;( M2 i0 `2 J! Y
static int count =1;
. k6 N0 K  N) a" H4 O+ b9 @9 |5 A1 @2 q# w- L5 q4 a2 h) n  P
#define MCBSP_NAME  "MCBSP-device"' e4 y! Q; |$ l/ u
* H$ \% n$ U$ Q; U9 u+ W+ y% s9 O
static struct cdev *mcbsp_cdev;
6 ~. R+ I: k% m& h# G# Wstatic struct class *mcbsp_class;5 v- \9 j3 A3 l/ i% D% Z
static dev_t mcbsp_dev;# R. n" M1 I3 t! U+ w
unsigned int DRR_data;! `( L7 P$ e* ]' W) s6 _
unsigned int DXR_data;
7 z6 @+ K  E$ ^2 l& l  Lstatic int mcbsp_open(struct inode *inode,struct file *file)
2 A" h" c2 u- S$ Y. K1 J{
/ f/ q+ N' z* H; r0 c   
( ^" m* a$ O& g$ M8 \! j/ A   //interrupt enable,initialized( l* z6 w* D& s' z
   unsigned int temp;
& H9 y0 M% A' R   //SLEEP_EN(GPIO8[10])---0
  N% C& ]/ f& I8 S/ k   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* f) w2 |3 e4 K$ B  J: w5 b   temp=temp&(~0x00000400);
  f$ y% n' H3 w, B* N- y) Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ a0 l: n* k, V: T/ I+ d8 z  //RESETn(GPIO8[8])----0----1% Z( _6 ^( q4 X
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 A& r4 ~+ C) c1 L8 ^4 v8 L$ e( J
   temp=temp&(~0x00000100);
$ Z) \: z+ S" s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 J; a2 l* a) D- O
   udelay(100);
7 R+ b) A# R9 p# J$ r   temp=temp| 0x00000100;- B3 i3 m  t, C4 k, k/ C* p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; {: u' g9 _9 x+ I' r' H: j6 V% f8 k
   udelay(100);. L$ D" l" \6 D1 y/ e
   printk("open success!\n");
  N8 Z' P( [8 {% ~) V3 E2 H+ X   return 0;+ e1 e& L7 W; ~" j$ Y& W  u
}
& H' X, q' K" T' V
* B$ U7 y5 }2 a6 Sstatic int mcbsp_release(struct inode *inode,struct file *file)
, h* D. S; }3 z+ B{
5 X2 G+ t, a- |) X- |1 x% ?+ P/ |   printk("release success!\n");  j! a9 c" N# b  Z+ j- C& @
   return 0;" l$ k1 Y% P0 {* t$ E
}
: i' N" ~/ c; e' \5 @
, G! `3 `0 o! W" Sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  [' ~0 p( Z  v$ Y! A7 I: o4 \& P
{! K, j$ Q- y* ]$ X9 w
    copy_from_user(&DXR_data,buf,len);" }. _9 F" R3 \8 R
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - V. J5 V) j4 Y9 _3 g3 i; S- S
    return 0;/ x$ p% u$ |( D! I, u
& W$ k! b& ?% \4 \
}$ C9 Z2 v' @: K
1 [+ I+ j& K$ }( L3 v4 H
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" u3 s% U% \0 N$ ?
{
* N+ w  u7 l( G3 r   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));# Q8 J2 C1 h( q# M, K' J3 F
   copy_to_user(buf,&DRR_data,len);
9 O) J; H3 J- E) G   return 0;$ y0 i% Z2 z8 L/ D
}
: H) J/ t5 J. F4 i  \  h' H
$ |% J6 `: j4 X- I4 [, r) z/ U
0 y. ]+ a7 x$ t# R' Z- Mstatic struct  file_operations mcbsp_fops=
. N  ?9 R8 o9 m3 o2 {, H5 F{) V5 W" Z& Y# h+ j
   .owner=THIS_MODULE,5 z5 t$ N8 G, I5 s# H, |# w4 C
   .open=mcbsp_open,
! p; Q* u( u0 J   .release=mcbsp_release,
% U* }% T% W0 J- }   .write=mcbsp_write,9 g3 Q% l5 B1 [6 h( W, U
   .read=mcbsp_read,
& ~; O# Z- x* b9 t" U, u! G. f};  |* v( R. g5 c* d1 T
static int __init MCBSP_init(void)
- E0 G# b# f0 K/ v* @  I{
7 }: X$ O/ }0 a. I  S0 }% p   int ret;4 h# \4 G% h1 F- R: G4 l
   unsigned  int   PINMUX1_REG_old;3 t4 U+ n+ h* M' z  u/ }/ H
   unsigned  int   PINMUX18_REG_old;
  e% F9 c0 n2 X* J   unsigned  int   PINMUX19_REG_old;
$ C1 h3 r( b+ I5 d& R   unsigned  int   temp;  ) X4 y$ i4 f& `' S, v* b
   if(MCBSP_MAJOR)
, g/ ^7 ^" [  R; V0 p   {
+ ~$ a$ E# @0 w+ j, J: N$ j5 L      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 w+ X, {3 a/ C) J
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 N: K0 h  d" r9 Y/ Z1 D( S. @* Q' m   }
3 q8 J; r3 s" n& F3 a   else
3 w0 Q. f& _, g6 u* K( i- W   {. P+ X/ H- u  }( e2 `; U' q
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, Y8 w$ g2 V- j6 B
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
3 X  c1 [' c. ?5 Z& D& {   }
" U" a( Y. c! ~: ?! l2 t   
- c8 W. m! ^$ K+ u   if(ret<0)
9 L& c9 d% K4 B3 i; S- f7 n7 J   {# x/ C# T- v3 P! \
      printk(KERN_ERR "register chrdev fail!");
3 ~5 C7 E: M$ b      return -1;1 ^( u7 F. x6 X7 @, G
   }
5 j6 O+ v9 _6 |0 }   
: s' Y1 b6 U7 S5 t   mcbsp_cdev=cdev_alloc();/ e, ]9 d# i* }  I  o0 z. ~
   . Q, l% h! o6 g" G: E2 p( U4 P0 t1 a
   if(mcbsp_cdev!=NULL)- P3 ]) {$ b4 x
   {
! G$ ^1 r0 ?- S" N: N( x# {      cdev_init(mcbsp_cdev,&mcbsp_fops);
' n5 y$ k" f! y& Z# Z' Y9 P4 b      mcbsp_cdev->ops=&mcbsp_fops;; Y) y" \) s3 y, C* g( }
      mcbsp_cdev->owner=THIS_MODULE;* _% |3 g: T* D* \) x' h% @! W' c
      
- P7 X% z; K) m4 r, b6 p# q& [      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) I5 P& s* a% C" ^/ \' m2 n1 X  ~          printk(KERN_ERR "register cdev fail!");
& Y, Z9 f- X/ y* K      else
5 C) D$ z$ C$ [+ c          printk(KERN_ERR "register success!\n");% g$ C- M: ], Y7 @. h+ |2 a
   }. T1 y( k, D8 I
   else
, e) b! f/ K0 i! J/ z( @; L   {
7 a' r: B. v' s# m      printk(KERN_ERR "register cdev err!");0 x1 _( K6 x! F3 U8 E/ W6 D
      return -1;  t# }' g/ C8 h! J4 c! X
   }! \9 {* K. D  b( I9 T  a' ?# E
   + R$ r$ \! X* e. b9 H- t
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
$ \- y9 U2 p) _   if(IS_ERR(mcbsp_class))
' M* {' i- D4 I: ^+ U   {7 i/ L, L: R) O
      printk(KERN_ERR "register class err!");
9 {: @. h1 m; |$ x6 W, ~4 M   return -1;- C, L$ M$ y3 K5 W1 V
   }
* u" b  t4 B" [# K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ o3 ?0 d  b, G$ h, L) _5 z! ~& t, g( }) [, _+ l$ C
   //PSC: E/ F) E1 \& L3 h6 z; p1 h
   //add Enable MCBSP: Z5 {$ q- {0 ]6 ~9 q8 z
   //test$ {& N4 P" e5 o4 \9 M" Z- e" V3 S
   temp = 0x80000003;# p  p6 Z/ y+ V$ t4 Q* P
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
" e6 m' {3 X) I5 G3 @0 a" j5 n   temp = 0x00000003;8 v. d4 D" U5 K- }+ i
   writel(temp, IO_ADDRESS(PTCMD_ADDR));* `1 p+ y; W) Z) Z8 f+ ?7 h

7 L" @; M; P; c, p' k/ T3 ^   temp = 0x001FF201;* U( ~7 U  J( Y$ o" o0 E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ w, o6 T0 f+ g0 O5 Y   4 S' }& m8 I( Q3 b7 P) Q& ~! H
   //PINMUX  
  w, k- V7 y/ C3 H' n# Z4 s& y5 {   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& {+ \1 D+ u- b8 N
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
5 j4 H/ m" X; P5 O  P   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;     g- D6 u0 m& G' P+ ]
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);5 j3 R% e  b$ Z, }
   6 U8 R* Q5 o- x, U
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 G5 W9 t0 h- `5 U. H   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
$ f! |* q% |; e& m   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 E; ]' a5 f& b
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) M7 n( Z$ {1 V+ n, A" z% Q7 q. |
9 b% @' M; J& R* b. _, k; ~0 ]   //RESETn,L138_SHK25 v1 R& ~7 Q5 E/ p: }: b
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . ^2 ^& I8 F0 l' O( c; Q
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
3 {6 m& M6 r. l6 h   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);8 ~1 [7 u8 Y# v9 N7 A. g7 B
+ {4 u, o9 i4 ~* b

0 y6 V8 z0 W* q' X3 C( s- X& `" G3 {" e  //SPCR Register
) G% R$ z" M; e. v9 A0 J7 ?  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ Z( n8 t8 ?1 Q1 d" u& G9 L* r# t
  temp = 0x03000000;//(DLB=0)+ O- b, Y$ n# R
// temp = 0x03008000;//(DLB=1)
8 t- o4 s+ S. R; i; O  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# r3 f8 ~5 @7 P/ h, }, c
  temp = readl(IO_ADDRESS(SPCR_ADDR));
5 a5 I8 Y  U* L! g8 b1 R  printk("temp=%x\n",temp);  T  G4 O7 [! g$ [7 U
& y! @# V* F) G$ `) c4 g8 B
   //PCR Register
) G% C# g! k. C. x" L" z8 Q   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ }3 c7 @; W( ^
  // temp = 0x00000F0F;
: A% @. d7 q" w* |& N0 U  temp = 0x00000B0F;
  }7 F( b) u4 e2 X& ^2 m9 x4 j  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized # O9 f5 m" y! F1 O$ s) v
  temp = readl(IO_ADDRESS(PCR_ADDR));
. |  ?! [0 o' f3 \+ D  printk("temp=%x\n",temp);  
. j0 A' A% p# e& Y8 Y8 n- A4 B   //SRGR Register3 E7 [0 {6 ]8 J7 |. N, D: f. W
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==119 z$ {+ ?" l3 m
//temp = 0x301F000B;9 f0 H" F9 w4 W3 V
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 W- T, e& M  ^5 o: n! _  temp = readl(IO_ADDRESS(SRGR_ADDR));7 G" K: n( o. c/ Z7 |
  printk("temp=%x\n",temp);
; S' d" g' y+ K( K: i! ^* h   //RCR
7 ]' B8 B  V7 B- I/ A6 t* T; y   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! _& j7 L" a, n5 k% W" u$ g6 Q$ x! h
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( j) ^; f4 d, Y9 q' D   temp = 0x00440040;6 G6 X" {# F& P9 d: s& @. w# E1 i2 o
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ( e; z$ P% U9 z
   temp = readl(IO_ADDRESS(RCR_ADDR));
2 H! P1 c9 M/ G; {   printk("temp=%x\n",temp);% K( r) O4 @; A9 t
   //XCR0 L5 Y, T, o+ q5 ]2 s" I* B
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
6 K  A( I% c, Z, ]' I   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# w! l, `, R9 N0 o1 b* t2 _' _
   temp = 0x00440040;( p% P' ]% Y8 W* y, K+ ^
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
6 h+ z! I$ _/ B8 `. ^   temp = readl(IO_ADDRESS(XCR_ADDR));
; h9 f$ u% R% u7 W, q. A$ v- b! |   printk("temp=%x\n",temp);" @0 [- \9 N3 K& ~
  udelay(100);3 H0 Z5 |7 b0 j5 H; W; Z
  //SPCR Register
8 ~- c" I$ o4 K  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; w9 M) w$ X* ^) m6 d  temp = 0x03C10001;   //DLB = 0 VS DLB = 12 ], t, B& |+ P& Y3 k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
, A) ?+ L( O* S+ M  temp = readl(IO_ADDRESS(SPCR_ADDR));
* q) P0 _% t7 m" {4 b  printk("temp=%x\n",temp);; y) _0 C4 I  O& d, z- }* j
  udelay(100);
/ ^8 _$ F# }9 {+ N: t
: L  @% k1 Z: a  //set GPIO direction
* H5 k( Y! E  U$ K1 i! m, }# ]' f   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
( V' `6 U( l" D" J4 M( i, O   temp = temp | 0x00000100;//EPR----input0 u% o( {* c  F. I" J4 N
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 \% ~' C% e5 h   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
8 s) Q: ^* C6 N1 F; j ' o4 V0 [0 w7 U( a
   return 0;
! t- j. n# v# l7 Y7 e9 [' R}
/ O8 w8 K4 H# kstatic void __exit MCBSP_exit(void)
. R8 \1 f5 g6 N& h{, \! p3 N+ x! L5 N
   printk("mcbsp chrdev exit!\n");
, Y; \; X6 _1 ~+ ^9 M* t   cdev_del(mcbsp_cdev);/ K& ?/ l( c2 P* a% g, \$ |3 J$ ]
   unregister_chrdev_region(mcbsp_dev,count);
. i) W- W; A* B5 D' [   device_destroy(mcbsp_class,mcbsp_dev);
+ X, [; S) l5 a$ _6 n   class_destroy(mcbsp_class);
( W1 Y. g8 u" E" b" A}) A  h0 G2 R4 m) Z
module_init(MCBSP_init);) B9 {, c# Y/ C# r5 q
module_exit(MCBSP_exit);' J0 f' W! _) x0 j( \3 O: l
4 k# M2 P$ M' B2 c& ?% A$ m
MODULE_LICENSE("GPL");
0 B& U" \& u% g; W+ Y7 x, H! D1 L0 a) k# h4 q# \! }7 c
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. Y2 C7 R: i( P- t4 _9 Z) ~
我的应用层的测试程序如下; _3 d3 @/ G& e' K) _
#include <stdio.h>( N) c- Z5 z! t/ r, q; X4 J8 h' h7 B
#include <string.h>& {1 m1 w- h& \- f" [3 |0 J
#include <fcntl.h>
, F' s3 q; L& o% ]  ~9 h#include <unistd.h>
6 ~: \" G* ^) S1 {7 @#include <signal.h>
+ H' m  J* T- m( k- X6 t#include <pthread.h>       //线程
0 f% W) F; L/ E' K( m$ X#include <stdlib.h>; \+ L1 H% b1 ^* ^( i
#include <pcap.h>          //捕获网口数据2 C3 d" H$ K; F& ~
#include <semaphore.h>     //信号3 S: t, G: P+ {: a/ E
#include <sys/types.h>     //消息对列6 u" s$ M4 T  H! W) m- A& j- S
#include <sys/ipc.h>       //消息队列
9 F. q) o- w; t4 h/ t#include <sys/msg.h>       //消息队列
+ s4 E, F! M. Z# h0 f#include <sys/select.h>" C8 Y9 l; A0 c: a0 l1 E9 K
#include <sys/syscall.h>2 n4 @/ `$ B9 p3 Q$ \$ I
#include <sys/stat.h>* a7 @# K0 h* D2 z! v* I
#include <sys/mman.h>4 o8 R# n" B! `% f4 o
#define msleep(x) usleep(1000*x)
0 w  q: ]; |% w; \" Y' y) r! Y
  o/ l# ?. k# y3 q& rint main()0 o7 @1 U' X6 k4 p
{
% C/ o! f2 w2 R' Y    //MCBSP,ARM与AMBE2000交互设备4 a+ Q% @# Q+ \6 ]1 T
int fd;
; M8 y( U) E0 M* G- ~% n unsigned short data_write = 0x5555;
. O) }( U/ O9 \/ }) u unsigned short data_read = 0x00;
7 f7 \/ W  L2 g5 ~- O  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. z  w1 {6 X* F! m; Y3 F; X //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ s  ]3 R, k: Z# d0 Q% `    9 K" [7 f1 D2 b7 c1 Q. [* t: v0 R
  if(fd < 0)
2 Y0 O; R) ?' Q. d; N+ m; ?  {
3 n1 l7 o! w) I% {+ {8 o     perror("open failed\n");
( C) i* [& @: \* k) c9 U. B     return -1;, D5 i1 C; g, A7 t% g
  }: ~; G4 r6 |: z! m5 _
  - F2 N5 M3 w# S- G3 p/ C6 y% p
  while(1)* i. ^  X& d2 B( i1 q$ H/ h
  {6 a# l- U5 e* E, ~0 d
   
' x9 t6 r% g& R  a6 ~/ D3 a   //AMBE2000每次读写是24个字为一帧
1 g- C) {& @' ]# s" P' K   //写数据时将数据在底层存储起来,等到中断的时候再发送* K5 r; `5 O. _% Z+ `1 l
   //AMBE2000输入数据是以0x13EC开头的
# D- i  c; b! Q( ?   write(fd,&data_write,sizeof(unsigned short));
+ X# {" \3 B* i" I$ z  t- L3 p   ' q* p7 j1 B2 b; M4 ]
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
, J7 r1 z7 b/ J/ O   read(fd,&data_read,sizeof(unsigned short));# h8 t7 i/ Z! j% @& |& V  O
   * T4 Q& c% Y: T: s. V" P. f% a- n
   if(data_read == 0x13Ec)' B0 `+ y; P1 j
   {
1 l: D, ?3 G4 ]# S, D5 O7 k4 w7 f   
+ D' q" B7 o4 G; m- @6 h    printf("data_read = %x\n",data_read);
4 v9 {% H3 d* `% l   }
8 w# {) @5 S* @* l   
- Z9 X% o. W  h, {3 |) l( `- s   msleep(10);
8 a3 V7 E' o7 c5 ~  ' S) Z  J/ S+ x) E' y
  /*
" x# E: e' @# T" x   ioctl(fd,1);   4 D  p* m4 e! B! p
sleep(1);
$ n; N$ g' U' L! d- X ioctl(fd,0);  m  a$ j; j( Z# r7 ?) C
sleep(1);
: o$ U" [6 M* r& l */ + K" A6 C" a/ e9 N, R9 N
  }   
0 _) w, [8 T1 q' k- }$ e4 k. ? return 0;
/ W; l- N) V& ?0 ^) p! z
! G" w# j& A; s}! D9 H* u: v* x1 }3 \) x# x
, P! i( K: J0 x2 [
多谢各位指教,谢谢! 急
+ E0 W4 a$ ?+ t8 e6 @8 g( `( M+ B4 m3 ^9 u  ~! Z

0 h$ P9 [5 h6 _* o
; x6 e7 J5 @* N4 \
8 }$ S% O* S! J- A+ X+ A; v
3 N( v$ p5 ?" Q" U6 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 09:18 , Processed in 0.051689 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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