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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 h+ j+ ?- b' T1 ~9 F5 k5 W/*
, C2 i) c( `+ _% k * Copyright (C) 2009 Texas Instruments Inc
6 {3 c7 T# z. J9 B5 L. l5 g *
( F' t5 T. H8 s! U- x+ r/ J9 n * This program is free software; you can redistribute it and/or modify9 G' c/ {6 e4 P* R* A) ?: `2 O
* it under the terms of the GNU General Public License as published by
8 p0 z* _6 g2 p, A * the Free Software Foundation; either version 2 of the License, or
9 b9 D/ T+ a, d, n# b! R. V) ? * (at your option)any later version.
2 h8 B% C7 z9 x2 @8 c8 h */ j! F+ h" I- Z" Z1 o
* This program is distributed in the hope that it will be useful,
' L! d" B- ^2 t" M7 g * but WITHOUT ANY WARRANTY; without even the implied warranty of  K7 R# }3 D6 `0 z( x! Y0 M
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 }4 x/ N4 t4 R0 n * GNU General Public License for more details.
( I/ n' H7 o- j2 _4 x1 } *
" p+ z4 e) w) v- p, S * You should have received a copy of the GNU General Public License
  R% I7 `8 z8 m2 C * along with this program; if not, write to the Free Software- e+ @- Q3 D( M% G/ T) d& x) `
* Foundati8 e" D1 ?- l4 P+ X0 t4 l$ s- j
*/2 D! x5 p1 ^$ p& O% g9 }6 w4 Q  z
#include <linux/module.h>
' }. c* Y; l# E: u6 T4 |: ^#include <linux/init.h>! j1 Z- e) E3 s0 N
#include <linux/errno.h>
6 B$ K# M. O. v+ G: k  j% }" P#include <linux/types.h>
; Q/ n; c0 W2 O, p+ _: E#include <linux/interrupt.h>
- F5 l1 S% X8 O#include <linux/io.h>
8 L9 G9 M, Q/ v6 I& ^& u#include <linux/sysctl.h>
* I- i. q& j2 J- K& l& I* j#include <linux/mm.h>3 i" U- G' P3 ~
#include <linux/delay.h>
  c7 f" h9 U( Q- C% H+ h#include<linux/kernel.h>
- {; S9 r6 ?0 F# M6 [  I" D3 N9 X2 C#include<linux/fs.h># l  @5 b0 U& m/ U! P
#include<linux/ioctl.h>( k, J: C, v4 |  L7 M9 D2 O
#include<linux/cdev.h>7 H8 ?' R& u4 x
#include<linux/kdev_t.h>  ?" R7 q. J; x
#include<linux/gpio.h># G, ^- M$ P  |* h
#include <mach/hardware.h>
' s8 n2 V5 r! V#include <mach/irqs.h>3 J- {1 N! A" f
# ^& C  \# @1 |! I3 {
#include <asm/mach-types.h>  n0 g. P* H* m& [/ V/ b
#include <asm/mach/arch.h>
. B, T3 w% M: i% ^( x  n$ V( I#include <mach/da8xx.h>6 ~1 d: x  J; P
#define  SYSCFG_BASE   0x01c140003 L/ x6 \- {6 p4 ~" o! N& Z
#define  PINMUX1_OFFSET   0x124 # b0 W. Q) N6 U2 }' r; P8 d
#define  PINMUX18_OFFSET  0x168
& k$ q! g1 ?( k' a# |2 M8 k#define  PINMUX19_OFFSET  0x16c
& E+ Z8 i% _& @8 a+ ^; f1 a  \#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR' x3 D4 u1 P& h, n
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR) p. k/ B. g/ {. {* F
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
8 Q/ x- @! {+ C& c6 {4 R) t#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
) f8 H; o/ b# t7 I4 \* P#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
: _$ a" J- a& q0 y% ?                            8 D; {1 l- I4 _6 V( q0 z
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR! N- y/ r6 h2 u+ x3 Y6 \  S( Z
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
3 J# X3 n. D) c1 r8 e//PSC% \9 s* l+ K9 [0 M8 i
#define  PTCMD_ADDR   0x01E27120  
0 u, s. W9 a2 Z/ F% p) N; I#define  MDCTL15_ADDR 0x01E27A3C
% B6 N! |6 N8 `% |2 _6 N) n; i#define  PDCTL1_ADDR  0x01E273041 ~% @+ ]1 N! Y- o  f
//GPIO8 direction9 n) s2 \* k. d$ x$ m8 m# Q% @
#define GPIO8_DIRECT  0x01E260B0; o: U% W; X; v  c  ?
#define GPIO8_OUT     0x01E260B4& o7 c4 T) D/ R( v4 Q
#define GPIO8_IN     0x01E260C0
( d0 ~  k# O: l/ f$ k! R' H4 ^8 N( G' r3 t% n0 d, h
//#define MCBSP1_RINT    99              ' ?# W) B/ u5 l+ |( q7 z: v
//#define MCBSP1_XINT    100  
3 G; o, q# _! A- tstatic int MCBSP_MAJOR=239;- ]& _  n5 s! u) P' h
static int MCBSP_MINOR=0;
' }7 i/ f- o& [% gstatic int count =1;. f" Z6 ^& W3 s$ X/ P' e. i

: k5 Z: l. f( x- Y5 A: q#define MCBSP_NAME  "MCBSP-device"' T9 o$ \0 y) T! ^
8 v( g8 |3 s1 }; ]8 T
static struct cdev *mcbsp_cdev;
" M1 E' T2 {4 R8 r, h* N( q6 p* e4 \static struct class *mcbsp_class;9 n1 h+ ]9 z' @" Z
static dev_t mcbsp_dev;# o- {; l4 A1 v6 V+ z7 {
unsigned int DRR_data;
7 l7 N; S4 s2 }3 q( h0 \unsigned int DXR_data;
9 K; s2 J( n! s! L- I: A& X1 vstatic int mcbsp_open(struct inode *inode,struct file *file)' l/ L+ ?0 @! W0 _* D
{
1 \$ B* D1 U+ k$ X) M8 X0 R   
+ j0 U. F. @0 P) f$ m, n  T   //interrupt enable,initialized
4 v* n8 u; w& T: K" s/ h3 `   unsigned int temp;
$ `1 V1 \$ s9 w9 s9 h, L   //SLEEP_EN(GPIO8[10])---0
* E, h: q9 E3 M' |; r5 ~/ B   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 u+ K( n( N4 d6 j
   temp=temp&(~0x00000400);' A  t% {+ t3 u5 C! n/ a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 i$ ^, r; a$ A- Y/ `  //RESETn(GPIO8[8])----0----1% j" P7 h4 |! Q, O; b5 Y; n! r. P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 n: L$ E' `$ n  R# P9 i
   temp=temp&(~0x00000100);
0 e. {. T" g, q* \   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 y9 N9 A! m2 ~0 |$ M% M% U
   udelay(100);
8 x' R8 @' R$ j/ Y   temp=temp| 0x00000100;
$ [$ L( _9 i0 p+ s9 V2 O0 l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  K, M" o! I6 k: L9 r* T   udelay(100);8 Q( x( A6 J' M! B8 G
   printk("open success!\n");! g& n* _1 k  H$ q0 [9 T, j
   return 0;
) q$ H/ s' l: d% M9 n}
9 K8 d' i& G4 J9 K3 C0 E
: {; I; Y1 j2 Q, b# Pstatic int mcbsp_release(struct inode *inode,struct file *file)
( v- d" B* F% e{9 h! {0 x5 i3 S: G4 }; I2 T
   printk("release success!\n");
  o( k) Y( o; ^2 G& _   return 0;
: k* g8 g; m$ V/ J}0 v4 r1 F0 ?" i) E5 R, W
) u0 A6 |9 |" A1 v& d
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( C& \$ E/ e0 M" u2 `. D- E{
- }  |7 c" B- v3 z/ x2 O2 C    copy_from_user(&DXR_data,buf,len);
1 }% A# p8 D) n6 l: c    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       + F8 Z: v: H2 \  s7 q  d
    return 0;) {' x" j) |! O1 v  ]7 E& x) V$ M$ q

4 J% i; a+ p+ P. f7 \6 H}
6 g, u* [8 S0 y, i2 `
8 j# O9 R; P9 ~  |! Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)- W2 q0 A2 n$ k, v+ h# O
{ ( r& M8 o- a6 g4 Z6 e& R
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 r; ]# W) c' d, J: l, o
   copy_to_user(buf,&DRR_data,len);
0 Q# R( p9 H' S" Y& V  B, r4 r" b   return 0;0 C6 O0 t+ H% \9 G! b7 _. t
}. c& D3 P% V9 \

3 C; x4 r6 D5 w: P* W. j
( V, C8 Z/ s( H( i$ ]static struct  file_operations mcbsp_fops=8 N9 o; i9 ?) H, {' k8 h" p
{% r3 [  s( w% H3 `% y
   .owner=THIS_MODULE,
; P+ c% ^1 U4 x, ]   .open=mcbsp_open,4 l& u3 q: c0 y9 A* U
   .release=mcbsp_release,
! `1 z* p+ y: V   .write=mcbsp_write,
! l* R" i5 M4 q! k" P( @   .read=mcbsp_read,; `3 |1 r; |. a% ^& c9 z; O
};
8 t  F, H$ V, q+ Estatic int __init MCBSP_init(void)" x, O1 `1 r4 d6 S# @$ d8 a$ T- D
{) I  a: U  S6 q1 q
   int ret;
5 p( X7 J7 a$ A8 d/ m   unsigned  int   PINMUX1_REG_old;0 A3 L  r! \! ^4 l9 p4 R
   unsigned  int   PINMUX18_REG_old;
" Q! p3 f/ }" f  M# q! R' d7 J   unsigned  int   PINMUX19_REG_old;
3 ~' E0 R) J% t5 N1 @' z   unsigned  int   temp;  9 j! C9 i+ S4 ^3 R, z( j
   if(MCBSP_MAJOR); e2 j) V; z5 o' `6 j! ~' K
   {
/ b8 S( H+ A: E3 _      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. o, Z- y# T6 h, c- F
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! M' f! s& K7 m+ I( s; _: ?
   }% D8 E- ?7 L$ G4 q# C
   else( z; i/ P2 ]- Q8 A$ [
   {8 t( y/ q& x  c1 v* V6 b% F& u6 U
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 |' t* i  n8 T6 @' o$ G) y
      MCBSP_MAJOR=MAJOR(mcbsp_dev);. S, o  H  \) o' W
   }# i! E/ w6 ^% M' k5 F
   
: |8 `4 k/ d( Y5 w" K% r- J* j   if(ret<0)
/ l$ {) @' I/ D$ i2 B- V2 }3 b! Z   {
7 b' U% L4 u7 Z4 a4 z/ _/ j      printk(KERN_ERR "register chrdev fail!");
: T$ N7 x! R) S( M# d8 E      return -1;$ W1 s5 y/ ~6 w8 T& ?7 M4 ?
   }, H. K! R, @: g. c; Y& m$ x
   
% a, C% {9 T( I3 c   mcbsp_cdev=cdev_alloc();
" o7 a! U4 m( N! }   . i; @9 c! s6 z( ^1 I8 K0 `
   if(mcbsp_cdev!=NULL)8 W! Z; E" s: m4 U
   {8 x7 l$ j* `5 W8 g! H! f
      cdev_init(mcbsp_cdev,&mcbsp_fops);
" R4 D, T  V4 r  g. _# j. |      mcbsp_cdev->ops=&mcbsp_fops;% S  C' [: G/ Z1 H5 j1 h1 w
      mcbsp_cdev->owner=THIS_MODULE;: m% ?3 G! c1 m
        ^* u  w* p7 P, G) K& w1 f( {
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! z) B4 M6 r: G( n
          printk(KERN_ERR "register cdev fail!");
# ?* T/ T3 T" V- l# S. Y: C9 v      else
3 q* j3 |9 x6 k          printk(KERN_ERR "register success!\n");% t  |, C1 m! m$ h* N1 V) E0 t
   }
+ b& i- r6 m+ o; k2 A% X   else
: P. I5 E3 T. I- H   {$ E# C7 [4 w7 c7 G% }) B  h3 H( E* H! ?
      printk(KERN_ERR "register cdev err!");0 \8 I/ x1 u' d  A
      return -1;6 z7 \9 B0 k. M  p
   }
2 Q0 d) T& Z% s) P: n/ h   5 p- [2 o7 _( F- [5 Y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);  I) p0 D+ }" ^, m% F6 Q' z
   if(IS_ERR(mcbsp_class))# ~/ v  [* z6 Y$ M7 k: t5 a8 w
   {5 A1 Z! |2 D& V5 f8 X8 J
      printk(KERN_ERR "register class err!");( M1 c# K3 M0 ?5 a6 ?# U
   return -1;
' S) d5 l  U  W8 j: g% a' w5 b   }' J" Z$ ?0 t+ K0 _2 N- g
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- q4 z4 {5 o" A* Y% z
2 C3 p% ^6 E7 B; K; k: _   //PSC9 _3 r/ U  @: a
   //add Enable MCBSP
. ]( d; o. g0 {+ m) U   //test
9 c3 s1 x) }4 ~3 S2 l( e1 A   temp = 0x80000003;6 g9 E: d3 E; `* A* ^
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ R: R3 |& ?+ m: d4 M5 }3 l
   temp = 0x00000003;
( q7 A( {% p: I1 G# t! _   writel(temp, IO_ADDRESS(PTCMD_ADDR));: {' k9 V, e7 Q# d& j$ D
8 u, a: D7 k+ v' j, m- z8 Q
   temp = 0x001FF201;0 |5 Q/ w& o" O8 n( F0 \
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 I& }; f' l' \3 b: P4 ]0 R# l
   
# E; F. y( |: x   //PINMUX  
" l$ N7 Y( c# k4 E2 C( B% j   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: ^$ w; X; |2 B; o7 ^   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 [6 t. `" V( y* R! ?- q6 u* _
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   % L, U$ G% Z1 [# c
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ J# X6 K) \; ~+ e   
3 s% Q% `4 K1 F3 G; Y   //SLEEP_EN,EPR,L138_SHK1,L138_RC+ j- P' K, c" P; d) ]( R) n; J4 _% R
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
/ S2 Q) x% j- a( S. L9 o$ X   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
) _6 B" z4 {. l, X2 l   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 ]3 x& Z9 J4 f" a  n3 K

' t" N8 Y+ N% E& d) r' @# G   //RESETn,L138_SHK2
2 K. V* `3 G1 _   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . g& _6 n; l  G0 t: O
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
3 g/ I4 W1 c8 ?0 `" g   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. Z9 t( x: S  _+ i( A # W4 x! y5 U, W% a
7 t$ F+ }1 h; d1 ~7 ~5 r
  //SPCR Register
1 x" k$ I. X% ]$ C7 Q  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) q& _0 T  v7 s  z# J! e
  temp = 0x03000000;//(DLB=0)
8 J+ k6 q) J6 ~* W! r% ?: V // temp = 0x03008000;//(DLB=1)
& L! o& {5 s& @/ b0 d2 [  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset) p; N( h& J1 L4 S. q3 X2 M/ b4 m" [
  temp = readl(IO_ADDRESS(SPCR_ADDR));
& G8 i! K3 o" I$ F5 I  printk("temp=%x\n",temp);
: q: r! b, W$ r8 i- J# | ( p/ Z' ~7 k+ O: q
   //PCR Register: f" O2 i- P% ^* ~
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( }9 m) m4 z: O# N4 ]* f, q  // temp = 0x00000F0F;7 X$ X# @; b9 o% @& U
  temp = 0x00000B0F;
$ W# J9 ^1 M0 ?: l0 K- j  N+ }# ]  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
- t3 U4 P  X) u3 S5 t% s; o  temp = readl(IO_ADDRESS(PCR_ADDR));
' F, h* d& p! }; E7 l( |+ m  printk("temp=%x\n",temp);  
3 \* I) a( r% _  C  s+ J( Y# b   //SRGR Register5 h0 j6 d: k- \; N2 u) N, a6 |
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* F1 L6 Q+ w2 _ //temp = 0x301F000B;# m' v$ ^. C3 v
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ c8 b4 ]  o! t/ Q' s8 M  temp = readl(IO_ADDRESS(SRGR_ADDR));
( ?* N1 l: ~( q# O+ Y& f7 ^5 K  printk("temp=%x\n",temp);4 n# _# w* S  g9 l4 x! z, X" a
   //RCR& o; [& v. l# Q$ y: r
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 i  D( d. u- [- X' q" v   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0/ a, Z& Z& q5 y9 |
   temp = 0x00440040;
6 g6 s; D! J$ I/ `8 \" h/ i   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized     i, r( |. I5 I2 v
   temp = readl(IO_ADDRESS(RCR_ADDR));' o7 c- T3 V/ F8 N# m, }& T
   printk("temp=%x\n",temp);. _. G+ W/ r. Q8 F  b$ ^
   //XCR7 z- K( z9 r) ]) z( P, c
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) D( K0 S) R" g
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-00 Q8 }! y1 ^; }4 B$ m( c* _
   temp = 0x00440040;! ~5 q+ I9 v* p) I( B* b! S8 D
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( n) `3 o/ g& m, @   temp = readl(IO_ADDRESS(XCR_ADDR));/ S) q, s8 b3 m* Z
   printk("temp=%x\n",temp);5 `- ~" S* ?; ]8 `  L+ D
  udelay(100);
+ A  ?; @. i" S( `, g4 r  //SPCR Register% e0 I/ L) L$ Z% P; x3 K
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 P! O/ b7 I8 Y9 W6 q) s' Q' K6 k  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
3 Y) c1 Q, w9 z1 t9 W  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled: D: v9 ^' ^$ n! J
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 g  i, @1 f5 X! j9 n8 k  printk("temp=%x\n",temp);( R1 ~7 F, c# A/ g" O
  udelay(100);, \4 K1 R2 g. n# L
5 H. J7 G0 y3 e4 B" L- |
  //set GPIO direction
$ L9 @3 ^  K" P. g) U4 o* ~; e   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 {$ d" Z# l- d$ {  J% [! x# o
   temp = temp | 0x00000100;//EPR----input
6 z2 {# c* R# |6 Y* h" j: j   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. k8 D1 W4 e5 g; D" g. f8 p   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ z. O; ^9 V$ ^4 H2 ]* k# o
( q8 y2 \4 D1 o/ q: y   return 0;
# D; p0 ]8 c( {- N- ]' a}2 C- Z2 P) z# n- T1 p
static void __exit MCBSP_exit(void)
1 y% E: g% H& m8 A+ l% ?{
6 S9 n, G3 F. ?7 Z   printk("mcbsp chrdev exit!\n");8 l9 X- A+ ?- W+ r
   cdev_del(mcbsp_cdev);
/ g8 B1 ~8 k4 Q/ w$ p   unregister_chrdev_region(mcbsp_dev,count);
/ r+ Z- B5 t$ |5 B' W' o   device_destroy(mcbsp_class,mcbsp_dev);$ [5 I: @4 a/ k+ _) _5 f
   class_destroy(mcbsp_class);8 T, A+ j. n" ~# o
}  P0 }2 B* z! C% x: S3 z
module_init(MCBSP_init);
( A* d# r, w4 ~$ Hmodule_exit(MCBSP_exit);9 X$ R. ~, H; R# x7 j. L/ m% i
$ h1 _1 F& \% e4 \* j) U
MODULE_LICENSE("GPL");! W/ u8 A2 D8 v( V
6 g' k+ I. h% k
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- n! [! [8 p0 H$ i
我的应用层的测试程序如下, I4 E" S1 P# {2 [0 E7 k3 z
#include <stdio.h>
2 J, o9 s) F+ E" T4 ~#include <string.h>0 U7 G# S! A: m4 o. E
#include <fcntl.h>) E/ n' v7 U$ x2 R( X+ }4 Q! ]% P
#include <unistd.h>
$ Z- {# K4 S& y/ F#include <signal.h>
$ ]! Q4 o2 o% Q$ E# n' G#include <pthread.h>       //线程1 A( d# r+ L7 \0 K6 ]4 A
#include <stdlib.h>' {' @7 W/ C4 V/ n# c/ `6 B
#include <pcap.h>          //捕获网口数据
1 t/ D5 z8 `: u- J1 @#include <semaphore.h>     //信号0 s1 k7 Z- b% ?# ?4 q6 u% }
#include <sys/types.h>     //消息对列
% F2 p! Y) \) P5 g" W8 t#include <sys/ipc.h>       //消息队列
; {* _4 i4 \4 u5 R. M; o  c" r7 k- w#include <sys/msg.h>       //消息队列  ]3 q8 Y, d/ i4 w) d
#include <sys/select.h>
4 |+ H4 _! e% \( E$ [/ l#include <sys/syscall.h>
+ X( Z  k8 r2 U#include <sys/stat.h>; S& M0 p' H, A9 q) i2 R1 x: Z
#include <sys/mman.h># z2 g! T0 X: d8 r# K& N: J* q
#define msleep(x) usleep(1000*x)1 k% V+ |( `( e0 S* H: J2 m

. I" r% B7 F9 @int main(). ^  T$ v: x% N5 e. o7 u
{
( O, z  c* y" {$ K4 }    //MCBSP,ARM与AMBE2000交互设备  T/ ]) t7 }7 y3 u3 D9 \% V! M
int fd;4 W# h8 o! c! J7 \1 g7 G) \
unsigned short data_write = 0x5555;
" d) C$ |1 |: r4 }9 L unsigned short data_read = 0x00;* ]9 E. n: a% i- \& S
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: q3 z3 ~+ F: j //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) n! v. B! G2 r
    4 a7 b6 V3 h4 |7 J4 `- ~' R- |
  if(fd < 0)
$ x# }: U) z' v' Y2 r  {
( G4 p: h& E+ e2 u7 g     perror("open failed\n");
. b5 ?: I4 `" B/ x( @1 g, H. p# c     return -1;% ~4 p! l' _9 y9 E8 `. ~
  }2 |" S" |7 x5 O8 O$ r1 G& A5 }
  4 ~5 J" c6 [6 k, J& T+ t( X( X
  while(1)8 O7 W2 h6 y3 ~9 z
  {
4 `0 z$ B8 l* N0 W, Y   4 G( ~/ Q8 L( d+ z. ~' L
   //AMBE2000每次读写是24个字为一帧6 w- X! q+ a  c( k* l+ [1 m
   //写数据时将数据在底层存储起来,等到中断的时候再发送8 n# P8 @( p' \$ t& o$ l9 O
   //AMBE2000输入数据是以0x13EC开头的5 L6 C- ^' w; h3 Q  k, F5 w
   write(fd,&data_write,sizeof(unsigned short));$ G: f" d& F8 C
   
0 j' M$ |* q5 I) l   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
/ L* j$ I+ P# s# k2 x+ ]   read(fd,&data_read,sizeof(unsigned short));
% K0 a- ^8 ?  t# t8 v   
2 U, C. t0 q* A3 z, V' u$ B+ g7 L   if(data_read == 0x13Ec)
. ?( U' K, C& U- s9 b& ], V/ T   {; D' Q  e6 p9 c% a
   3 K( D7 e2 N: V9 d
    printf("data_read = %x\n",data_read);
; I( s5 Z# c, n; T   }" G' ~* U0 B) S
   2 {/ E3 q! ]; g' X4 X+ f/ l1 d
   msleep(10);
+ }7 i$ Z" o2 e' w" n- ]- J1 f. k( O  5 l. D4 k9 O% G) n2 Q# t
  /*
7 d" B1 ?1 k1 q( ~0 |- d$ R   ioctl(fd,1);   
; V- n- C4 K  n  {: I" Z$ { sleep(1);4 P9 B  Q% o+ ]3 F
ioctl(fd,0);
; v) I+ z) L% L sleep(1);
% \, X! ^7 x9 X */ 9 i5 T4 ]# O, p+ {' p- e7 u% s3 z1 q7 x
  }   
8 k, b* I6 R! j1 B8 n return 0;
7 m6 H3 B$ l6 V% I5 c* L& C; x
- s  O0 p( t& W5 I1 u3 W+ X}
' r# P) a. W6 \3 O
4 [; ]8 y$ B5 I. c" U: W. w, d多谢各位指教,谢谢! 急
, I4 d+ v1 A) i; W" @5 ]. C0 u4 _5 `4 l' m* U( w
2 U0 F9 Y- i+ {# d

3 e% E  f+ P9 k
9 W' k, z% n( t! W0 n9 j
0 C! q4 S  m6 H$ k- ~7 p3 d# Y7 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 11:45 , Processed in 0.051625 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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