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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : M- a  @' a9 z, B
/*
" A0 n+ Q5 C  V: \# R) M* I * Copyright (C) 2009 Texas Instruments Inc6 h8 n$ |6 K4 q* z0 s+ ]' c6 R
*) C) e- i0 D3 _* Q' }* |
* This program is free software; you can redistribute it and/or modify. C+ H$ J" t6 G% S+ n, `' f% m2 G
* it under the terms of the GNU General Public License as published by, N6 m0 ~+ `: \! t  c$ V- f& z: Q
* the Free Software Foundation; either version 2 of the License, or
, |0 o7 D& q: U: H* o6 q * (at your option)any later version.3 F+ M8 `8 d6 b
*
- T7 }% R; @9 i4 }: j& m8 r * This program is distributed in the hope that it will be useful,
! g& g8 H. x6 d+ X- T * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ p2 S# P( E: j6 n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 M' E& p( R5 O4 x5 o * GNU General Public License for more details.1 f1 \" x4 o6 R2 m3 R
*$ t, ], y6 k: g- ]$ F
* You should have received a copy of the GNU General Public License
0 t- G9 E' g' I; X$ y/ y * along with this program; if not, write to the Free Software
* ~3 }4 V6 V3 k- @ * Foundati" b8 X2 D  T2 A3 r% [8 n$ w
*/9 E7 u9 z  i& M; x* `' x
#include <linux/module.h>
( _1 u+ D+ f4 |* X#include <linux/init.h>& _( K: r" A; f/ `: G, ]" X
#include <linux/errno.h>
( s4 n# y7 A) ~" U#include <linux/types.h>& |! b! k" s$ U1 v2 r# K# @' H& ]2 Z
#include <linux/interrupt.h>
% w, ~) b" P5 i9 J: w1 X#include <linux/io.h>
' m2 `* l8 M  V) G8 z#include <linux/sysctl.h>2 [& m' y. H* P
#include <linux/mm.h>
3 i2 K8 E: t. f5 j( H$ n+ f#include <linux/delay.h>! _1 ^2 ~% f7 G/ A
#include<linux/kernel.h>
) R6 k1 a9 q" @" x#include<linux/fs.h>
% ~" c! A7 t: D5 Y) R#include<linux/ioctl.h>
7 y, K- d( Q, o#include<linux/cdev.h>" H3 E$ w7 N# ^: ?
#include<linux/kdev_t.h># \3 G/ _$ ?  s
#include<linux/gpio.h>
: q+ ^, j* q, D" _#include <mach/hardware.h>. w, j$ I! Q8 f! g) ?& y! a5 N
#include <mach/irqs.h>
. P1 q8 S+ |9 M* Z, N8 ^; N% W7 t: o, T7 w: [. q' ?/ S( U" e2 l
#include <asm/mach-types.h>
) Y) R/ M6 \: D#include <asm/mach/arch.h>+ {  y7 t. E( E# e, J: d
#include <mach/da8xx.h>
) V- A+ r4 ?1 H1 k, V9 ]4 _#define  SYSCFG_BASE   0x01c14000
! H( \- ]  w, y#define  PINMUX1_OFFSET   0x124 $ F) U1 D8 O2 |  y1 P/ z& \) A
#define  PINMUX18_OFFSET  0x168   |$ \: [8 A( ?3 w
#define  PINMUX19_OFFSET  0x16c
+ }( i1 S, d. }2 h. Y#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR8 _: ~7 f6 I8 [0 F4 G
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 S7 {% U$ D+ v* S- k7 D& l9 v
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR" e5 t* j' ?  Y2 ^# u) }
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR6 \2 E! \9 |4 G3 [9 v3 G
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 M4 q% C" e$ U5 s1 u& j/ L                            # R. g9 ^+ g; S  g
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
- o7 I4 J' d/ K* a6 i) j+ B% p#define DRR_ADDR      0x01D11000  //MCBSP1_DRR0 g$ E) u% l1 O6 j! l
//PSC
+ v- s$ p6 m$ C! J: K5 J#define  PTCMD_ADDR   0x01E27120  $ M1 B3 z7 G1 s  H$ E6 R3 P$ }2 v8 q
#define  MDCTL15_ADDR 0x01E27A3C4 _. s) t1 o! Y
#define  PDCTL1_ADDR  0x01E27304
$ m8 p+ g) q$ L//GPIO8 direction
5 u6 C3 Z( u" @9 }#define GPIO8_DIRECT  0x01E260B0
, o. ]0 R7 v# n4 p* N" v#define GPIO8_OUT     0x01E260B4/ w) S% s1 e) b% S/ o
#define GPIO8_IN     0x01E260C05 }1 r6 ~- K$ Y  Q. M* G! m* k1 L5 u
2 j1 s1 W) S; Q  I
//#define MCBSP1_RINT    99                ^5 V! {4 \3 W" j
//#define MCBSP1_XINT    100  ' L. z% |- W% t
static int MCBSP_MAJOR=239;
' I& V  `8 J! ~' C5 wstatic int MCBSP_MINOR=0;- v! W) t( V# ~! T. L( G6 R
static int count =1;
/ Y8 O* G' [5 @, Z" Z7 A
$ Y+ C$ d) c" C9 x/ X  m#define MCBSP_NAME  "MCBSP-device"8 Z7 Q. p- c& i8 m

, N% a5 d" Y9 v+ Wstatic struct cdev *mcbsp_cdev;  ~" {/ m, V& O/ s7 c
static struct class *mcbsp_class;
4 ]) {( B4 H. \static dev_t mcbsp_dev;
- r4 V/ e' J0 h& K# u5 Z9 l0 m6 z& ?unsigned int DRR_data;
) W% k) O/ S& c5 |$ \, R% e7 xunsigned int DXR_data;3 \3 u; H& G( F
static int mcbsp_open(struct inode *inode,struct file *file)! u% [1 |- F7 D3 z& ~
{
# z9 z9 r7 ^( W   + v/ Q9 ]6 H% f: I  p  B( H
   //interrupt enable,initialized2 k7 r& e9 V0 w. \6 O! G5 `
   unsigned int temp;3 D  Y  x5 E% W; c2 R; p9 w
   //SLEEP_EN(GPIO8[10])---0
( w1 Y, F2 |) k2 A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 e/ |: z0 |5 v% S: {. s
   temp=temp&(~0x00000400);% J) X, P. F, q, m8 k
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( F+ M! I( ?4 z9 {4 G
  //RESETn(GPIO8[8])----0----1
# l/ i$ x: \3 ]6 u, R" z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ {$ `; Y4 S8 [$ G3 }+ q; D   temp=temp&(~0x00000100);4 T; ~, t; f. X8 s2 O# Q* [7 l- q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
0 c% T& {# S" |: D1 K& c3 a   udelay(100);
8 ~) p  S% `( J0 d+ \/ ?   temp=temp| 0x00000100;& K# x- N' q! v
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" r) S+ t/ A- {6 X
   udelay(100);9 n6 J, Y7 q0 H! X5 b% e/ S
   printk("open success!\n");
/ z0 F/ A. c) n  T2 J2 J   return 0;
( F  C. ]" X* F( |( G: Z9 `}- M% @2 `" J( c: F% `
4 L$ v) J7 V# ?& p
static int mcbsp_release(struct inode *inode,struct file *file)
2 d! w1 M! f4 l- p5 v{
" H" G" C- z$ K, N7 n$ ?   printk("release success!\n");
7 n7 i& i  @$ W* }/ w: Q   return 0;% T0 I) w  W9 i5 ^8 M& D
}# W/ i2 j% _- v4 m$ _! i

' [" a8 }2 H  }8 w2 [  ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: H' W  M! ^* O, v! R$ e  s{. N+ y* \( Q+ t% a. y/ l
    copy_from_user(&DXR_data,buf,len);
/ @4 C2 e+ \: j8 r& i5 V' `% ]    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       2 f8 h- K5 k8 k
    return 0;& J6 T" ?5 m% m9 O1 p* Q# r
5 O9 q% X: h+ W! W: R) e- Y
}3 s; g% }5 ?, f+ I6 j' W. U, W
; F3 i$ F: d5 m& r! Y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 P- g# w1 N0 n9 x+ Z( }  R{
: a7 ~; O* t" T' X& S6 h   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 P* j6 K5 U. h" K& N
   copy_to_user(buf,&DRR_data,len); 8 P/ L( H. W+ I6 n# B
   return 0;
0 M) {, N( o! n4 y$ }1 c6 ]}
6 D* s+ v/ W; ]5 K. n- A2 w' ]9 {8 `, B. [+ u! }
* b) O# G  A5 g- X+ ^6 |$ H: x
static struct  file_operations mcbsp_fops=
6 ]4 J% Y% f8 F8 E9 c{
; _* L+ R% s" @  i" B. t   .owner=THIS_MODULE,
- d& F, O7 z+ Y& [9 X4 Z   .open=mcbsp_open,' m( f, F/ ~; g6 `2 o4 R- A! R
   .release=mcbsp_release,
/ _7 ^. a& e! q$ q   .write=mcbsp_write,
$ h, O. W0 y& z, M& J" I   .read=mcbsp_read,
8 q9 {, w& H! t. _5 D" U8 \  l};
  d$ E! q. r8 @# A& kstatic int __init MCBSP_init(void)
/ ]7 x; z  x, B  ?8 {{
$ M8 @2 ]5 u# B2 @# e   int ret;7 J9 }( z* |# m# f: S! p
   unsigned  int   PINMUX1_REG_old;- @/ h7 R9 @& q+ q& o2 {$ n
   unsigned  int   PINMUX18_REG_old;
5 W9 r! m; V- t, e1 T   unsigned  int   PINMUX19_REG_old;2 b/ r! J8 r# u5 s
   unsigned  int   temp;  2 o$ G, b- G" [& w0 t( Q/ x6 c
   if(MCBSP_MAJOR)
! z' S8 @, L' P$ U* L   {* d0 _0 @3 O; B' d
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 F8 Z7 {+ g4 Y& C- G# V8 A/ Z$ ^3 [: _      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* ]' s. @+ d0 [# g
   }. z$ x4 j) y: B& y$ X# A
   else' n5 Y3 i2 e9 Z7 [" e8 Y4 X8 H# x" L
   {
" P& g; T: d# I" K  v! a      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);% j! H* a! R% ^- S3 z- `
      MCBSP_MAJOR=MAJOR(mcbsp_dev);: `4 j, g( B* D1 j, U: Q
   }
0 k' b( d8 {: ?  A- t2 L' C   
. k( _+ j0 S* G7 e  a7 m   if(ret<0)
+ ?, W% Q2 B, J5 |2 v   {0 d( g0 X5 K# z) u; h5 h- U/ t
      printk(KERN_ERR "register chrdev fail!");3 t+ w" u& l5 J& H# b2 T
      return -1;6 A5 H; q" F0 F, S6 L# K0 p; I
   }/ j; N& J- C1 z$ l
   
3 t9 V; t( {+ t8 t5 S7 S' c3 Q) s   mcbsp_cdev=cdev_alloc();
0 C. Y9 b) t6 I5 x% N   
% P! u0 l+ O. ?8 A/ T+ s: d   if(mcbsp_cdev!=NULL)
# L" t5 d+ d4 w" Y7 P   {
- L0 w: V' Q; r8 |6 z3 }( y. Q$ N- f      cdev_init(mcbsp_cdev,&mcbsp_fops);
. Y' m# \$ ?8 `7 M      mcbsp_cdev->ops=&mcbsp_fops;  {- D* {! S) m* N/ Y7 d
      mcbsp_cdev->owner=THIS_MODULE;8 `2 V+ H# q1 O' d
      
" u. }+ ?: d; W, I      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' \: V) {" h* L0 I; i: U
          printk(KERN_ERR "register cdev fail!");
; t) x0 @' J( g      else
, D1 p* ?6 `. u! L9 G) `1 S          printk(KERN_ERR "register success!\n");
2 Y3 M# _/ e# S0 ]' \& C   }
7 A8 S! ?; E& y) R. _; \( F   else' T2 \2 Q$ v* T& z( K# E
   {" J. g9 t, f/ m  Y
      printk(KERN_ERR "register cdev err!");
. [- b9 C6 m1 j" z; [: n4 y      return -1;9 |5 h& l( V6 z8 e0 X: C
   }4 k8 x8 D3 Y2 E. `
   : f  Q; B2 I+ M8 C, f, \3 ^
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; t) c5 h/ b- p) f: _
   if(IS_ERR(mcbsp_class))
* \" q( {7 G8 q( J   {
2 U! d" d# f; k0 W% S5 p  O& U! `      printk(KERN_ERR "register class err!");
* e' O9 E; u- |2 {# e9 w7 \1 @   return -1;
9 B% x; ?. o' h   }
3 B$ a: C" E! _+ F   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# D- x, d. c7 W$ }2 t0 @6 L6 }9 S5 F3 U& n
   //PSC& E2 ~) T) q$ n# z' U  |
   //add Enable MCBSP' F$ v1 P1 c; p! U
   //test& N$ C7 |; j! C9 x; V  q7 j; `
   temp = 0x80000003;
( `) b0 ]1 J; T7 H  a: q   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; w  J/ y. ^# ~( O& B: Y
   temp = 0x00000003;
' J* a/ S" r3 X( C   writel(temp, IO_ADDRESS(PTCMD_ADDR));! f5 V0 B2 ?8 f' m& {+ K6 e

4 L2 U; n3 d4 y# Q0 m/ p& y   temp = 0x001FF201;
# l& y: M" x( f+ g$ U   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 ]! V1 E6 m7 R4 ~0 _   
- Y( ?# s5 ~. W4 C1 @, f   //PINMUX  
6 _$ o8 `, i& v( s8 x1 Y   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 r( r" l" _% v/ C9 g   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 h( G2 I' v. V/ F* g. k7 Y  S
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   + S0 C' l- i- }) o# a, J8 B
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) k( W) L1 S) {
   
) L2 E- z2 ^9 z' J+ ^' e: t   //SLEEP_EN,EPR,L138_SHK1,L138_RC' G0 F5 f: b! S8 O
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
- _! e2 {% _% r4 J2 O2 Y   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 y& M; x+ M9 a0 @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# l9 |; |, _! A. r) y: I0 o) ]0 [
9 c+ f8 }8 L+ P' J5 T; z7 o   //RESETn,L138_SHK2
; {: j# K; d4 ]   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  8 b. c6 L+ ]  C' _, e0 L
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
! v% S% H8 Q* {( O. N' R# G) ~$ ]   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 F$ S* K2 J) C7 V  B# B6 i / F' Z+ _+ Q3 q7 U5 j& s. ~

8 B6 F, S+ F5 B: R  //SPCR Register7 |, D# D0 u/ @2 P2 u0 `  C' `
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset& B& A3 {2 _; K! H1 W6 {, L9 Q
  temp = 0x03000000;//(DLB=0)6 l+ I. B5 k# J0 A( b
// temp = 0x03008000;//(DLB=1)
4 a0 _: j2 D8 W* K& v+ J3 @  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
! B' |3 G9 t: X+ ^4 S6 J  temp = readl(IO_ADDRESS(SPCR_ADDR));
( B/ B( z: e0 P! N  H! a  printk("temp=%x\n",temp);
# \+ t# Q) \9 E6 P; `& a; Z
) @5 W( X$ M8 j3 a/ C   //PCR Register
& Z. s* N* f+ T" Q   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 Q% X( K) G4 z- X% d/ O* e  // temp = 0x00000F0F;6 I% f( s$ j4 A/ L" G6 x
  temp = 0x00000B0F;
- ~6 ]6 w' y) W2 ~, I. Z  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 T5 i$ l* T4 I+ z4 g  temp = readl(IO_ADDRESS(PCR_ADDR));
7 A  j! E* q! I" u5 k0 D, h* k  printk("temp=%x\n",temp);  , Y; Z0 s, q+ @- O
   //SRGR Register4 K- f2 L5 N. N* X2 n$ T. t
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: i* U' }' n! M
//temp = 0x301F000B;
7 m  P2 Y8 ^; }# m6 T   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 0 w1 o: g  X# s5 M$ o
  temp = readl(IO_ADDRESS(SRGR_ADDR));
' F5 P* s/ m. ^& N$ Q  printk("temp=%x\n",temp);
& N, W3 M! ]! F: {4 r8 ?* I   //RCR
; [0 w+ h" c; k( a, u   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( _8 t( `- b4 v4 ?4 _
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' y7 A5 [% ?; w  p1 C1 m5 p5 x   temp = 0x00440040;/ P% c' w7 {6 B. S+ z
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 I) Q( f6 W- g$ j4 E. P   temp = readl(IO_ADDRESS(RCR_ADDR));
4 a, P& ^! S/ t0 m, u6 v1 A   printk("temp=%x\n",temp);
( F* H0 _( Y$ |9 o& g8 O1 |5 \" |  _   //XCR5 n4 \. k7 @8 s
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ D- b( T- N7 B3 X- L; m6 J0 Z1 S0 N
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( q8 R& r* `) B- Z4 ]- ^
   temp = 0x00440040;
0 ]; o: G' r  p7 r$ I* [   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 n3 z- n8 Q1 g: p) Q! f/ t   temp = readl(IO_ADDRESS(XCR_ADDR));! [5 S% U* H7 v3 C' u! L: f$ F
   printk("temp=%x\n",temp);
5 I1 q, X6 e9 m" B$ X# o  udelay(100);
7 x& {% m) ^! b) c( p, l( S- z  }  //SPCR Register
+ B1 O1 T* a4 S' g1 K$ F7 h* n- `  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; ~& F, H5 `! J# f" \+ K& V6 y  temp = 0x03C10001;   //DLB = 0 VS DLB = 19 ]  x+ x) l4 Z1 D3 S- u
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
3 T6 g0 K- ?# Y+ P+ o. S/ }9 _9 V  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ r0 H) E; W# n: u# l) V- w) b  printk("temp=%x\n",temp);
% ^" S& A3 W  S1 J7 A1 k  udelay(100);# Y: {" [1 O3 l; Y0 v# x
8 m# q" J* D  w; \* x! u7 R  K0 R9 e
  //set GPIO direction4 R7 E5 u5 I7 h7 ^+ F
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 ^  w& A6 M0 F/ x- D6 C
   temp = temp | 0x00000100;//EPR----input) \. H( S. R" G& [9 M
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 z5 c+ `; ]/ P) F% Q  H4 G
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ' P. x6 v: Z+ p
( I0 Q8 \6 Z+ h
   return 0;
( S, l3 |; B+ Z4 y}
! j9 f4 V& u9 P6 J- b1 V5 o' Lstatic void __exit MCBSP_exit(void)
% A8 n. y9 ?+ f9 J# ^- N{. m5 R2 c* |. \% A3 R# {" J
   printk("mcbsp chrdev exit!\n");
5 J. Q# H) L2 f- t* Z8 B* m   cdev_del(mcbsp_cdev);: y/ h: }+ [9 X3 Z+ O8 t
   unregister_chrdev_region(mcbsp_dev,count);/ p6 y/ @3 A. O7 ^% ^$ A
   device_destroy(mcbsp_class,mcbsp_dev);
4 D  f5 J9 ]/ v   class_destroy(mcbsp_class);
6 Y$ Z3 R1 H8 h}" o4 g; K; D  @$ v5 C4 _: M
module_init(MCBSP_init);4 ^5 g0 [+ m6 L, ^( U0 k
module_exit(MCBSP_exit);5 X  Y) v: `6 ~
: s+ j/ s' p8 B& ?
MODULE_LICENSE("GPL");8 U2 |0 Z: L; E, F
( J) h) E2 a, }7 l6 z+ z! `  m* b( n
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 D: a3 J$ o9 i) U
我的应用层的测试程序如下
( I$ A+ p. i, w8 _+ \+ h#include <stdio.h>
2 _: [, o$ r: r7 G( E#include <string.h>' Y/ a% n0 k3 u5 @: L% a: m5 X# c
#include <fcntl.h>1 P  c8 O& `/ G; I
#include <unistd.h>; k  k4 @8 A( F& t
#include <signal.h>/ m, h, h: q, b4 W, `: k
#include <pthread.h>       //线程
- A' Q3 n8 W# m$ M0 X% n#include <stdlib.h>
% }$ O. ^; ~& h#include <pcap.h>          //捕获网口数据- m$ @2 @2 o! {
#include <semaphore.h>     //信号
/ [2 o* ^0 R) u% a/ ~, d6 Q#include <sys/types.h>     //消息对列
2 T3 ^& j( T4 \#include <sys/ipc.h>       //消息队列
9 E+ J8 N- f; I2 F0 n% T#include <sys/msg.h>       //消息队列
( T. X* e9 R. |! W#include <sys/select.h>
" J! j6 P( Z+ n6 b#include <sys/syscall.h>+ z  T' t2 _1 ~
#include <sys/stat.h>
1 V9 }8 J$ j' |5 T#include <sys/mman.h>0 O5 K2 J0 Y5 R5 b% [, W9 j
#define msleep(x) usleep(1000*x)
- Y' _- ?& O2 A- z  W. i
- U) w8 }/ C2 N. Sint main()
/ e  v4 Q: q3 ?8 [! z- E{
" k% Z. d5 w! x  }6 k, ^, m- j    //MCBSP,ARM与AMBE2000交互设备
& A9 C- Z& S% Q int fd;9 \' Y4 R6 @3 e/ T+ _
unsigned short data_write = 0x5555;
8 ?  i9 B: m. {( G$ o- P, N& B unsigned short data_read = 0x00;2 J2 f1 J- y3 U* }# n  u) J
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ M; a: @. b9 e6 e. r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( p: }' n: W/ c# U7 L* ?$ I9 G
   
: I; f! z+ J, S9 v& `) k: o6 L( e  if(fd < 0)
, N" @3 [& E# N* V5 j1 ]  {
) E6 ~6 x+ a2 O3 C# b     perror("open failed\n");$ q, }" h8 K0 ]* g, W/ v
     return -1;1 A7 s" f6 V% ~7 [: C
  }( E/ H* O) |( g$ P) D! B( [; V5 \+ M
  
% d4 L" U$ _! B+ K  while(1)
& l, a; v( w8 B) z) A8 ]9 g; A  {
) }0 q5 x6 b7 y/ V! Q% V7 q   
; v# N& W7 ]2 D* r: s* j: g- D   //AMBE2000每次读写是24个字为一帧/ ?( i8 A9 [# w2 |
   //写数据时将数据在底层存储起来,等到中断的时候再发送
! z8 T% Z# H1 s# _; B/ L/ ?   //AMBE2000输入数据是以0x13EC开头的& E4 |* D4 g1 @& W7 z+ ~3 M* Q
   write(fd,&data_write,sizeof(unsigned short));
& m+ \& J! g, N; g   2 d7 S6 h, ]% P/ ^, t7 }
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  : S; N' X3 ~1 B% j3 T' W& c
   read(fd,&data_read,sizeof(unsigned short));
  W: R$ |. o6 }8 x5 p1 a5 d0 B- o   
, n% t6 v4 i' C- N" O6 `" d   if(data_read == 0x13Ec)/ H5 r& Y! q, e, W" Q0 p
   {0 G1 |$ ^' }* R
   5 t% X/ s9 x7 H: J& L0 y
    printf("data_read = %x\n",data_read);8 E0 m) d$ d- s+ r( K, u
   }
: Q* b; W( D/ q$ ~9 V( D5 e+ [8 P   
( z5 J! M' y6 K' I: q7 D2 `1 R   msleep(10);$ B# F% F+ ?6 V% e) i* n
  
5 Y+ l# w/ p& j9 G- K  /*
$ L, N& W) E  g0 ^5 f   ioctl(fd,1);   
7 A* w9 l# q# r% R" Q$ d5 w1 c/ p sleep(1);, Y, t8 ?* ?: L+ G& q  y; u
ioctl(fd,0);
/ v: e0 F! H3 m% a) |$ ?) y# Q, O3 @ sleep(1);
) k9 ^3 }! v$ d/ }2 W3 a */ 1 r: P: K1 `! T* a4 M" R
  }   : x5 a! b5 z" j$ D
return 0;
+ ^  ?# D8 c  y+ n $ [2 v% x& S8 l1 F5 s
}  ^+ X9 `7 h1 D

0 ^; W, `, _: k3 U" {: p% {2 n多谢各位指教,谢谢! 急
/ O* ]. m; P% j' w& I* K( `6 j3 s4 j$ s. j4 K

0 u4 |: L, C) g/ O( _* {) m0 @& C$ K

( O, n% W% ?/ g1 V5 ~; H' R0 @0 |, H4 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 13:14 , Processed in 0.049483 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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