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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : G! j7 H8 l* y+ _
/*
( n' N7 _  t/ s5 G$ A * Copyright (C) 2009 Texas Instruments Inc9 j8 B5 u" ~3 {1 `
*! P; N# l3 }+ E) x' p2 e5 e
* This program is free software; you can redistribute it and/or modify
$ w+ [/ A( ~0 z$ a * it under the terms of the GNU General Public License as published by
/ T' Y4 z$ E' z! d% _6 l * the Free Software Foundation; either version 2 of the License, or
2 O! Z5 y0 q& B$ e, e, k! p6 W1 |  ^ * (at your option)any later version.2 X/ U0 _7 \/ z( ?
*
; D7 e+ X# I; f, M/ q * This program is distributed in the hope that it will be useful,4 r! o* f+ i0 j2 g
* but WITHOUT ANY WARRANTY; without even the implied warranty of. L7 n8 Q: m3 ?/ ^3 U+ M4 E( n# e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  z' W6 s/ J8 F% O4 G' u * GNU General Public License for more details.
" W: v2 Y$ ^4 e: u' n; l$ z *) r( V" {5 Q% `. _+ C! a5 V" `
* You should have received a copy of the GNU General Public License
  Y. B% c$ n% a7 }0 [4 u1 o * along with this program; if not, write to the Free Software
3 f/ J* j. w5 e. e. G- B * Foundati0 W) \, b4 b; @/ a) |0 a$ H0 O
*/
' H) W9 z! w: U: @$ z- E#include <linux/module.h>% _8 l$ P- ~7 \. M+ N) N9 u2 Z
#include <linux/init.h>( Q7 r" f, c) M, ~! x
#include <linux/errno.h>: g3 M8 [: A. H+ N3 V' F
#include <linux/types.h>& J/ s( @% z2 N1 V3 x8 o1 J: O
#include <linux/interrupt.h>
7 ?1 r5 t* ?( O' f; ^6 b5 h& y#include <linux/io.h>2 @: u9 d. L/ X! P2 x* f
#include <linux/sysctl.h>% P) q$ H' }' ]% X* L
#include <linux/mm.h>. a7 A8 R* i. a8 Z* Z
#include <linux/delay.h>7 f  X1 H) r8 @; ~- _
#include<linux/kernel.h>
: n: c% f# V% y6 H5 Z- [8 R' R#include<linux/fs.h>7 {: E' ]5 x9 ?8 |5 r7 R* L! n
#include<linux/ioctl.h>2 J6 \. @3 n3 w3 c- M3 \- X: x
#include<linux/cdev.h>4 J- L) m5 X# l+ W6 b( N/ c4 f0 h
#include<linux/kdev_t.h>2 w& \, ]* m5 z! v
#include<linux/gpio.h>
6 V" a8 u1 I1 x7 {( Q6 D7 e#include <mach/hardware.h>
% B3 Z% Q4 ]  i8 S. a6 N+ r4 h#include <mach/irqs.h>. y" c# K1 h0 V  ~
1 r* i; `" Y' w3 S4 o) W! y
#include <asm/mach-types.h># l$ V  f- O8 U3 h
#include <asm/mach/arch.h>$ ?1 r" G& w- l# O
#include <mach/da8xx.h>0 M7 l3 d1 u3 {
#define  SYSCFG_BASE   0x01c14000
4 \$ |% c2 o5 ]* `5 n0 V4 l#define  PINMUX1_OFFSET   0x124 ! V$ `4 f4 _- ]. D
#define  PINMUX18_OFFSET  0x168 9 t- Y# _+ M* s3 _  g' S
#define  PINMUX19_OFFSET  0x16c
4 T6 e1 s4 C# ]! ?' l1 K9 \. z#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
4 K7 h. @% z( q#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, W* F* b' f& x; S# v  g#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
5 j+ p8 z7 S4 S. `2 T/ C#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR1 N: @. p# J+ Q0 m7 c
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
8 h" V7 [5 y' R- R( _                           
1 ?* N" V# L! [: z#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
/ @( G7 W2 U& ^. T7 t" H2 S' M#define DRR_ADDR      0x01D11000  //MCBSP1_DRR8 d# _) T. H) u5 u4 v0 V6 w
//PSC
! Z. B; q; x) u. u/ V- N#define  PTCMD_ADDR   0x01E27120  
; [4 a4 }0 H9 s. G: d3 K#define  MDCTL15_ADDR 0x01E27A3C: @5 i+ T! J' {. g, F& y
#define  PDCTL1_ADDR  0x01E273041 Y! Z4 r7 K( O* M; \$ `" {0 f) _
//GPIO8 direction
3 p4 Q+ y  w/ b3 m3 T& N#define GPIO8_DIRECT  0x01E260B02 z  f9 e. P& f( Y( g1 L6 z6 E& `! `
#define GPIO8_OUT     0x01E260B4; X) j+ Q2 ~8 a% `, j2 p
#define GPIO8_IN     0x01E260C0) E+ t3 X+ u! m$ T2 [1 I4 h
' Y) Z8 Q$ P, p2 r
//#define MCBSP1_RINT    99              
/ Q2 e7 m2 @& f  y3 M& y+ F. ^6 m//#define MCBSP1_XINT    100  $ r& D* c& W# V; R, e4 b; {4 Y7 u1 d
static int MCBSP_MAJOR=239;
3 h, B1 K9 a% K% o8 {! Q+ Estatic int MCBSP_MINOR=0;' ?& \8 Z! F5 h4 f8 n
static int count =1;
* h# n6 ^! C" v' y( \4 D" F7 Q; ?) M, O/ v. V* j
#define MCBSP_NAME  "MCBSP-device"  m+ X  N6 A2 W! t0 ]- x

9 N/ ~9 k$ N+ B, d% c0 Cstatic struct cdev *mcbsp_cdev;0 M. {1 {- [. s+ M. c
static struct class *mcbsp_class;) O/ B' G7 }& J) W
static dev_t mcbsp_dev;5 `- c" M- E1 C; E7 D7 `" v) X
unsigned int DRR_data;
* G" U9 y! b  S+ R7 xunsigned int DXR_data;: d% o; o* M- {9 r% ]
static int mcbsp_open(struct inode *inode,struct file *file)
- _. u6 D; H, g! c! V7 M{
2 f+ t; c7 B: B' P4 ?4 [" A   
) }4 d/ O$ p0 e$ a   //interrupt enable,initialized
, l. u4 I6 f7 e8 R   unsigned int temp;
' u; \- ~9 N' @$ I7 T" h8 n   //SLEEP_EN(GPIO8[10])---0
' M7 Z0 x8 \! D! X" C8 d9 `   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 p7 s- P% |( d% u( n- a
   temp=temp&(~0x00000400);- B0 e" \  U6 t* g  R; ^
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" b3 @! d1 {) K# W+ d  M' ~  //RESETn(GPIO8[8])----0----1
: m9 s: `& q, p' h4 i) k% a   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 ]  {$ w! Z- `3 p- n
   temp=temp&(~0x00000100);
7 z1 e" k# X3 Y8 e! |; V# |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! n3 y5 n' D" M: x( Y& v1 x) }
   udelay(100);
0 b9 V+ B$ X/ m4 p- a   temp=temp| 0x00000100;  J! x$ R8 T, U5 a& E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; _/ W0 v' @: B. t; v  A
   udelay(100);5 q% R2 o# F* [  I" \+ ^1 U
   printk("open success!\n");! N7 D  Y1 I) l( g0 D+ e
   return 0;
) |5 u+ }( M+ [% l+ ~! l}
7 h9 E7 ]6 B* G* l' G* `- o! p  z$ Q0 Q+ g6 [4 P
static int mcbsp_release(struct inode *inode,struct file *file)
) m5 @" ^+ L+ E( w/ ^  m# v{
0 {7 c0 a$ P2 `" Z7 l+ y- V   printk("release success!\n");/ f9 `) h7 F- D) R% }( s; {
   return 0;
" {- w8 R5 c5 ^}; N0 \; P' s9 r* j2 h
6 f4 l! a9 p+ n/ @. `; B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
  |% }! D" f! V3 m{2 S" A) ]% q) A8 O9 |
    copy_from_user(&DXR_data,buf,len);
+ v# w$ ^, `+ V& J" \    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) K9 b$ R6 u( s; F; ^: h* a% T    return 0;  Q! ?+ ~0 E5 {. G; c

' G1 [7 `1 i! W8 V* I, j' y}
  e% H3 I. s- i! D6 H! K& f/ {% ]6 v6 h. S/ g
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ k. Q3 k& W* P1 N4 J% E7 @" ?
{ 0 e+ Y8 |' m# |1 {& _9 B- j# |
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- E  Q$ E& D# b$ ~& v+ P7 v$ a   copy_to_user(buf,&DRR_data,len); ! A) _1 {/ R( e9 A8 ?4 G! e6 j
   return 0;' `  w( _' v5 x: T2 j" k1 `
}+ ?" w" |) _6 L% n

5 d" B+ r3 F/ A  k$ S- B( B: d; [# k' m0 d0 Q5 l7 b
static struct  file_operations mcbsp_fops=4 A% K3 X' B% O
{, [' @  v* ]& I) X
   .owner=THIS_MODULE,
$ j7 P! D6 y$ b* f   .open=mcbsp_open,$ X: m- i. `5 f3 P% |
   .release=mcbsp_release,
; g3 m# s0 y# X' B   .write=mcbsp_write,
9 H0 r, }" ?* C0 c  I7 l  t" s" [   .read=mcbsp_read,
* J% P6 T' n& S. L7 W( m  Y9 J};  V; u! }# ?9 k8 }( F
static int __init MCBSP_init(void)& m# Z! Y6 [3 T0 j+ q0 y
{
* e& v% C- G  x0 P   int ret;
7 r% Y- q# L7 `  \1 }   unsigned  int   PINMUX1_REG_old;
! `/ @: b) p- L6 y) @   unsigned  int   PINMUX18_REG_old;
2 `, X+ o  a2 C- M5 s   unsigned  int   PINMUX19_REG_old;1 L1 J$ a" D! q! c* n. N7 e
   unsigned  int   temp;  5 r) j) Z! N, I
   if(MCBSP_MAJOR)! O$ x- r5 d  o9 P/ S3 V
   {
' @6 t$ q. s( `3 K      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
+ D5 {" N% O5 V2 P( r6 L! r      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 V( f& t& f  H
   }% L& s: D/ J% q) v! P+ P
   else+ `" w' Q6 [, _8 [$ p
   {3 m0 C6 O5 z. Q+ F' \( W) C
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  J0 E% _& k  Q. g
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) f# R( |: B' f6 \- f4 ~   }8 e: R! y6 @6 k- h* p& L
   % K. z# t  }1 G- f* u
   if(ret<0)% K. z/ J6 o5 C$ |) c* n' ^
   {9 R. W2 [9 ~  M/ p2 r% v
      printk(KERN_ERR "register chrdev fail!");( D" S% U8 y4 ^3 e2 U. [8 O% H+ \
      return -1;
; i5 y6 F$ z0 S* C* `( [+ U; W   }+ h: F$ j$ ^: n) F. C$ f# V( q' v
   
. t& J- t9 ?: B   mcbsp_cdev=cdev_alloc();
( c5 P/ d: p7 m- D( H! Q: ?& ?   
4 s  y8 H% @+ i! V0 n& h4 L1 }   if(mcbsp_cdev!=NULL)/ @+ c; g# J" Y8 m9 h
   {
- d. Y( @7 \4 q- V5 K      cdev_init(mcbsp_cdev,&mcbsp_fops);
8 t+ \' o+ @1 F) T. z% _      mcbsp_cdev->ops=&mcbsp_fops;6 z% |, K, ~& I- E
      mcbsp_cdev->owner=THIS_MODULE;
$ D5 ^- m+ t+ e5 Y3 ~/ R      ; \# ?1 R2 U7 K$ v, y5 g6 ^: H
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ V/ Y! B( ^% o3 A  D          printk(KERN_ERR "register cdev fail!");
& U; K- B& }: n2 |- c" ~      else
2 v0 f) A# Y3 t/ X+ W          printk(KERN_ERR "register success!\n");
: W/ z1 q8 n3 D9 r3 e* ?3 R   }$ C+ _$ b& J- R: p8 `8 |9 ~) e3 a* y# I  b
   else% l5 S+ X% ?: y! y! Z
   {
: p! ~' I: x1 z9 P4 u4 t+ L      printk(KERN_ERR "register cdev err!");- O* e2 W3 s+ ?! X6 m: e
      return -1;
5 }. |) r9 c( \   }; _& `' x+ d. ?' o. D
   
# G3 e3 J- {, p1 ~/ v( f# s! C1 o  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
/ t0 I+ ?4 K- A   if(IS_ERR(mcbsp_class))
: \% U0 R. {! e  h/ c4 `6 K   {4 H; ~: X3 L. O& x
      printk(KERN_ERR "register class err!");: R0 o, F4 w6 ]. c. b" e* u+ X
   return -1;4 M" G6 F- W. }/ Y9 f9 N* ]( G) h
   }- {1 h$ ?9 O0 n
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 b% o& _! w) @0 G. `) h
& Q, D. Z7 d. p
   //PSC. P8 [/ l- H3 o/ s/ l0 g. l8 d
   //add Enable MCBSP
; d9 n8 K6 J: Z9 U" U   //test% \2 o0 ?( M5 g
   temp = 0x80000003;( L$ h$ K  Z' Q
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! u0 X2 Z! h2 `% U6 z7 _; c% t# N   temp = 0x00000003;
. _; I; Y8 p5 R" C, }   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 @( o0 T. _0 n* m7 E& D + |! E4 [9 s! z: ~7 ~0 w* U
   temp = 0x001FF201;
6 N( A- B2 C9 }   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& R8 j9 V3 [3 ~9 C3 o* |: W2 H( r   
% A7 [3 x+ v; X   //PINMUX  
) S, E  s2 ?! [  V# N/ }0 Z% g   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* L/ J6 Q% g/ l. F0 Z) S3 ]
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
' P! S; f, W+ |- v& V, T* ~; C1 N   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; }, B5 `. |0 g5 Y& K   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* e' {) y* y. O4 k1 O; M7 R
   
1 \" A4 d# {, ]- H2 n   //SLEEP_EN,EPR,L138_SHK1,L138_RC! K) q1 d8 z1 m. E
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
, I7 F9 E5 P/ x   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ) I4 q/ t2 U3 n: S$ D; x/ O; t
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! O/ J( Y7 _; Y- j. T $ e4 u) ?# D. N; y
   //RESETn,L138_SHK2
. r" _+ s  ]/ v; H% f% z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
# g+ l! s  [3 V3 X0 q- Y4 Y/ _/ @   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: b1 [1 Y4 ~2 m, y" n9 c  M   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; D; ]! @4 g3 c" W( w
  X  m$ c/ K% }5 a: ]2 G; ?6 ~) X + y9 A# S, s* Q- r& j$ Z7 a: Y
  //SPCR Register2 w# M! @' a7 ~
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 e  a9 ~0 P! G$ d: A4 g  temp = 0x03000000;//(DLB=0)4 U% q0 E( ]) X: s0 f; |8 I
// temp = 0x03008000;//(DLB=1)0 x: O7 T* S' I8 j
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset) D/ W5 v3 _* E& t) u
  temp = readl(IO_ADDRESS(SPCR_ADDR));
- B: g( P+ a/ {. N& U5 ~7 u  printk("temp=%x\n",temp);
8 ]9 _1 M0 t5 T5 X6 D # x) `9 H' D! f+ B+ q- I; {0 K9 K
   //PCR Register1 l' X3 E( Z2 D; Q( S/ G3 h% b
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0+ ^% f/ W0 A4 Z8 [+ \0 X
  // temp = 0x00000F0F;
0 E4 A, n  F) o' e8 X  temp = 0x00000B0F;
# n5 M' n: X' q, h7 e  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ' o1 p" r3 ?) p% P
  temp = readl(IO_ADDRESS(PCR_ADDR));
3 g: u% F2 u6 _1 A  printk("temp=%x\n",temp);  
1 N) j4 J- z4 m0 t5 }$ f9 }   //SRGR Register/ z, B: {! s  z% f1 }4 }) ~7 k
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# W( i- ]& @( `
//temp = 0x301F000B;
1 S4 X; [. h4 v9 [   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ; s3 u+ _5 }  b
  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 v) S4 x0 A3 I; F9 Z& s  printk("temp=%x\n",temp);
6 G  _& P+ x+ N, M6 X   //RCR) Q, W& w/ [) H( [6 e% q( L
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 X% q2 K8 ]2 S! Y  M
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 l# o/ m3 K& g5 {
   temp = 0x00440040;4 P* m2 f# A! G6 |  O! `
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   % t' B! h/ R8 l4 [! \: k
   temp = readl(IO_ADDRESS(RCR_ADDR));' @+ G+ _8 H/ J, q7 y
   printk("temp=%x\n",temp);
+ ], w% i$ b) F0 d   //XCR
6 n) b6 Y2 S* L/ g% J; O   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. [) }: p; g# i  j- d! y% Y6 {% Q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! _/ R1 ~$ j, M
   temp = 0x00440040;
5 _# {& ]+ L% w   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   8 h. K5 j' n& ?  y; z1 N3 ]6 s
   temp = readl(IO_ADDRESS(XCR_ADDR));5 H: N! D2 E' [) p( {% E
   printk("temp=%x\n",temp);
7 i# Z3 [) A4 q$ v" i  udelay(100);6 t9 g! v/ r; [$ j1 D# t9 q
  //SPCR Register) F' ]4 @7 p% p) E1 U
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: A6 W5 x" u3 X/ ]* H) u
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: ?2 W+ y2 M$ [. C) c) e+ }
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled! ?9 S$ e$ H" ~& x
  temp = readl(IO_ADDRESS(SPCR_ADDR));
' y4 o& V0 V" p3 J/ w4 n; R3 o" ?* j  printk("temp=%x\n",temp);: A2 d* X- x( U' y
  udelay(100);" h* P1 J& s$ h; \$ Z4 T, F" y9 @

: i: V4 F* i" r0 o) ~. T, g  //set GPIO direction9 I, F' M: b% h+ T) o
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ [7 V0 d+ h5 k. D- j5 z; x+ o
   temp = temp | 0x00000100;//EPR----input
/ n1 O* u7 z2 e, |6 W, p   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output- \$ F7 b! ]- {  p! @. w$ V
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 n$ ~+ e6 O. O; U
8 h' |, o9 o8 S. H
   return 0;
3 a# d$ e& ^5 {# f8 R}
* x" w9 ]* \' Bstatic void __exit MCBSP_exit(void): o( s6 z- `2 o( j0 G  B
{0 W1 E) P3 S* Y8 o
   printk("mcbsp chrdev exit!\n");8 _" j: x  d" U: \7 P9 m* f! A
   cdev_del(mcbsp_cdev);
1 f' }0 L4 `2 _  Y. R5 V' o   unregister_chrdev_region(mcbsp_dev,count);
* r& m6 [( ^+ Z0 {( s   device_destroy(mcbsp_class,mcbsp_dev);6 Z" W+ V0 \' d; f7 q0 _
   class_destroy(mcbsp_class);& h( r9 f$ M1 ~0 x/ J
}" m- W1 m- k! N, [- }
module_init(MCBSP_init);- a* {0 {4 O: S" Q/ [) t* `
module_exit(MCBSP_exit);- p0 f6 D% S. T9 @$ }

, R" _& P3 Q5 Z4 SMODULE_LICENSE("GPL");
' l) g/ b  n9 g7 L7 r- Q/ z
  S3 w2 s5 x/ x* N  [* Y) b我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 `( s! c. x" g/ g5 u6 [我的应用层的测试程序如下6 S+ o6 x6 a# a: d! a
#include <stdio.h>
: @6 o0 g; X9 H* M7 w- {% p# j#include <string.h>
7 ?7 ~9 o/ e/ E. ]0 l#include <fcntl.h>
/ U/ z+ C' D) U  e& u#include <unistd.h>
* R* _' p' f# A4 Q#include <signal.h>
7 d& U: v+ g6 w2 ]/ X0 G- X* F#include <pthread.h>       //线程
" A# v& ?. W$ J% M* }2 J2 Y#include <stdlib.h>
5 q6 X# @( Z7 _) m. o#include <pcap.h>          //捕获网口数据9 F3 i4 G. a7 I2 _* D, a
#include <semaphore.h>     //信号: t7 m* ], c! E8 j& F. Z2 W4 `3 C
#include <sys/types.h>     //消息对列
  s( Q# \# e, `/ V#include <sys/ipc.h>       //消息队列* _, R" q' ~! H6 u# E
#include <sys/msg.h>       //消息队列, t7 d9 S8 h; s0 C# t0 p" W
#include <sys/select.h>
: \3 L9 R+ ^/ |# S0 `#include <sys/syscall.h>! ]7 f% K) T# F8 o3 b2 {' E
#include <sys/stat.h>
1 A/ i% }7 r4 {- D) |' k0 W#include <sys/mman.h>
9 p/ n6 l& p0 Y#define msleep(x) usleep(1000*x)
& `! ~% i( G% x# D& M2 [5 m, V, B$ a& h! x$ z; ~
int main()
, D+ }2 i: u8 s7 _; t5 q  V5 j{ - A+ Z& N+ d& ^* h" n5 E; K" z
    //MCBSP,ARM与AMBE2000交互设备! u% ^' o5 C( r" O! b
int fd;5 K1 D; y2 {: X
unsigned short data_write = 0x5555;4 B- U" T; g2 M& y
unsigned short data_read = 0x00;
. }: @0 ]$ ~+ a; I2 W( a  f" F  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 Z/ N/ q3 }( i7 T# j8 E1 w7 N" @8 {  `
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: e& Y' r8 Y$ X
    # R3 E; s+ v! `8 }
  if(fd < 0)
& y; b) W2 w: _" N' p  {2 \* k7 |( \1 o" r. j2 D
     perror("open failed\n");' I6 N4 N3 q/ o. }
     return -1;
( `' A) ]8 H( Q1 F  }2 O2 k! p7 l7 D1 d, ~
  - O0 q+ Z2 _* c9 d; Q8 B
  while(1)
# l9 j3 J5 b) f( U3 S  {/ U5 T# K# A3 S8 G
   
4 U0 w3 E9 ?0 F, r) G3 C2 S   //AMBE2000每次读写是24个字为一帧
% c# q' F6 _- W0 ^# D) W   //写数据时将数据在底层存储起来,等到中断的时候再发送
: P6 r3 k0 p/ _7 [5 ~& s9 X   //AMBE2000输入数据是以0x13EC开头的
$ A( E$ u5 }/ G- ^' Q% ]: [   write(fd,&data_write,sizeof(unsigned short));: T/ }# Z& m% e
   : r' V! ]) P6 p; @# D
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( o, ^( }- i6 s2 q* e$ Z, A
   read(fd,&data_read,sizeof(unsigned short));
$ y5 R! w! |3 `* }   
# j  q  c0 m& X3 i4 U' M   if(data_read == 0x13Ec)
* W' o0 f$ I/ }9 a, V   {$ T( g1 L6 j$ e5 T
   4 o: b) X, N. @! F# D: }8 h
    printf("data_read = %x\n",data_read);& h" D2 p2 N2 G$ v9 [" c( `
   }
2 ~0 \" n- \1 p7 C: o, h. f  v0 J   
0 H* F# X% P% I) a/ b   msleep(10);" ?5 `7 }& {9 l& w# R- r
  : v& ^+ ^, _2 R# m. b  u
  /*! _6 l: N% \3 P  z4 b8 Q3 n: F( n
   ioctl(fd,1);   
' @, Q% e! v2 y0 P9 a4 D$ w7 v8 t sleep(1);
+ ^1 {4 D# ?2 @ ioctl(fd,0);! q+ |2 J% [/ R/ j, l' ^+ K' p; k
sleep(1);
/ o- e  G9 _& Q */ % _/ X  R8 i6 S/ \3 u) L
  }   ! E, \$ ]) s+ V9 t  J- F
return 0;
3 s7 F1 }& n9 B' S" i: [; d
* G  M  ~3 {0 C2 t/ O7 q}, e' h* C# p$ A( }- }1 F% ?
& E) R& n- |( q  Y" T1 b
多谢各位指教,谢谢! 急! Q: P0 j; S* ~
, r6 }: c. O! B% g4 G2 p9 e& J

5 d) u/ A: A( o* F
% B+ q; j8 B: y# w) j9 O6 J8 \" E* e  s, J# i. N
, M/ T; r- O; s- g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 19:22 , Processed in 0.048057 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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