McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ o" B4 |- l/ m/ Y
/*
+ @( J$ ?" J& U6 K7 U, |, f * Copyright (C) 2009 Texas Instruments Inc
( \; Q% J" z' x% i *5 R4 L3 w- |% r( ]2 @  }
* This program is free software; you can redistribute it and/or modify- k! h6 L! M, w& |8 f
* it under the terms of the GNU General Public License as published by
) M( E0 w3 \8 M& z$ q+ V3 g * the Free Software Foundation; either version 2 of the License, or9 k4 g% q2 i$ E6 Q0 M
* (at your option)any later version.2 r  c3 K% q; b" I8 ?
*
& x" i+ {, i- L2 V * This program is distributed in the hope that it will be useful,4 X/ r% k) u( Y" s
* but WITHOUT ANY WARRANTY; without even the implied warranty of
' y) ~/ I; _1 G: L# X! |5 Y3 g * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ b, D% t5 E0 J# y7 Q
* GNU General Public License for more details.
" o: y5 k1 y0 X0 A* E3 ?% X *
5 R( G% v1 \# G) R$ o* u0 F * You should have received a copy of the GNU General Public License
& L3 o  D6 y& V( g) Z * along with this program; if not, write to the Free Software4 Q; y2 c% }, f3 X" e2 k0 r7 v
* Foundati
$ |4 y$ O5 G' d*/
, I$ y: e* p- [#include <linux/module.h>
- @4 }! o' P; k; I7 F9 Y3 b#include <linux/init.h>
- V  y  \4 z- Q#include <linux/errno.h>: n7 C/ k' p. R3 E) d
#include <linux/types.h>
( _0 {5 O& }3 w7 ]- x5 J2 S#include <linux/interrupt.h>* O4 U4 R9 O' @9 {( r7 ?
#include <linux/io.h>
: ]3 w+ S* C8 z# h, W7 z* U/ o#include <linux/sysctl.h>- _  }& q) t& ?+ {0 Q$ d4 R
#include <linux/mm.h>
$ A3 a/ L4 Y/ y$ F6 I) K#include <linux/delay.h>
$ e3 @8 F0 U6 k8 g#include<linux/kernel.h>
$ t% T9 ^* s: A: ^4 a: p% b#include<linux/fs.h>6 D* R; q4 B, x0 `
#include<linux/ioctl.h>3 ^- ]8 S  J$ |  Z# y) y
#include<linux/cdev.h>% e$ g0 Q' l& y8 U" x9 P/ r: j
#include<linux/kdev_t.h>1 G7 s( Z( p! p# F7 M0 W' Q( p! z
#include<linux/gpio.h>: u' H8 `& z% S, E5 P4 _! Y: H
#include <mach/hardware.h>
! ^7 R$ ?. O* l0 g6 b#include <mach/irqs.h>9 H) `2 S2 n! K% _
. O0 v4 k$ e! O4 e
#include <asm/mach-types.h>- ~" I" B9 m$ J. e# h  ~# m
#include <asm/mach/arch.h>
7 a' O" y4 ~% h) u& U: W0 l#include <mach/da8xx.h>
$ ~4 s: n1 [, M4 G- c3 O' F#define  SYSCFG_BASE   0x01c14000
. g/ f6 W) m+ V+ M" D#define  PINMUX1_OFFSET   0x124
, C8 u6 F, ^1 E) F; X& R! L#define  PINMUX18_OFFSET  0x168
$ N- n+ p3 _+ c$ `( k2 Q" K#define  PINMUX19_OFFSET  0x16c4 L3 @9 W6 |; P+ |0 Q' M) m
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR6 i$ b; Y* N- p4 s, I
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
6 g% @  [3 t0 o# |#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* i  e1 O1 S' u& q: E7 k
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% `$ f" Z% |- m3 A0 m3 b6 {5 I
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
8 z: d. z+ m! I6 I                           
# c$ @4 \" {2 u& v  E4 S#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 I: {+ N+ I: J, P9 M: I. u#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
! ~  _& v- _0 }6 X" J//PSC  d& i8 `1 @* G. Q$ b8 e2 ]
#define  PTCMD_ADDR   0x01E27120  
2 F$ r1 p; i' e5 {" E8 X#define  MDCTL15_ADDR 0x01E27A3C
$ e/ `$ o8 ?; m0 _2 T#define  PDCTL1_ADDR  0x01E27304
; L4 h7 Y' W. X% E//GPIO8 direction
$ d, X, K1 x: ^" s- D#define GPIO8_DIRECT  0x01E260B05 n8 B! J# Q+ O0 v
#define GPIO8_OUT     0x01E260B4( V; l3 a- Q  g' ^, K
#define GPIO8_IN     0x01E260C0, ^$ c, ^. i1 S9 ~+ u) I3 d3 A
2 P( K4 r0 e* C! u% t; u* K
//#define MCBSP1_RINT    99              + H% S6 C8 _( l. q" n9 R0 ?
//#define MCBSP1_XINT    100  6 I$ u9 Q, e% R4 @9 W, A
static int MCBSP_MAJOR=239;! N% l8 W: {' z( i1 x- ?
static int MCBSP_MINOR=0;% ?4 J9 Q* u3 @' I$ c3 f9 i: }' b
static int count =1;, r" p" _( |$ g& S

) P1 K% Z. D, t; G$ s! ^#define MCBSP_NAME  "MCBSP-device"5 l+ ~% p  Y: Z" y2 d
5 L( T* ^0 G" h7 {& x1 Q! U" m- P
static struct cdev *mcbsp_cdev;
6 b/ q! k! d$ X+ Dstatic struct class *mcbsp_class;, }. ]3 K1 N/ G9 ~9 n
static dev_t mcbsp_dev;; ]% d( l0 I; H6 v! J. S5 [
unsigned int DRR_data;5 z6 t( e9 _4 M* V
unsigned int DXR_data;. ]- L0 D* o2 y, {: \
static int mcbsp_open(struct inode *inode,struct file *file)
* a: }, ]# S! Q, p$ Z3 v& a8 S% Z{
6 m$ E& ]4 i& O   2 I& M2 g9 C. E3 m3 J  n  x% J3 R
   //interrupt enable,initialized: Q( e9 I: h- _5 t+ F
   unsigned int temp;
: O) U/ e, q" y+ D   //SLEEP_EN(GPIO8[10])---00 G, x) \" [; f3 x* ?8 z3 V6 L
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));  w4 ^6 n' ~0 E6 }4 w) v0 _/ @9 s
   temp=temp&(~0x00000400);
& ]& \2 b5 y! N- G" L- }7 E6 I   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]7 m7 u# Y' @7 K7 s" I4 ^0 k
  //RESETn(GPIO8[8])----0----1
% R" u$ n  t* [   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* K2 k8 f% @$ R: H; K
   temp=temp&(~0x00000100);
0 M6 m* f( r) o) [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( _9 s" _' J( l$ I3 O) B   udelay(100);5 R6 X* B0 R. D9 z
   temp=temp| 0x00000100;
  y  `" Q) b% \& o& e   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
* H' G+ R) D1 e$ [% w2 l   udelay(100);
7 f$ W! S1 Q* m" i/ w0 P4 H7 r. i* p   printk("open success!\n");
( T$ r& J: V, X% g  {  q   return 0;5 n  O9 D( x# y: _3 N6 `! a4 x) B
}
8 a9 t! H5 h  K4 K$ V  @8 J" c" u( |4 U7 R+ m, Y
static int mcbsp_release(struct inode *inode,struct file *file)
6 b6 x: A0 m' Q1 P3 I{
! U0 y& `2 s$ h/ x3 @. `, f( h   printk("release success!\n");9 i$ f( L6 W# l1 o( S
   return 0;/ g8 v; R' B" a- a
}
3 K' g- R7 u4 L3 t, h
& F! Q( V; O+ q* mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)7 S3 n, _" R1 w2 Q7 C- d
{. H# ^$ `/ H$ P: f
    copy_from_user(&DXR_data,buf,len);
& V. d' ~4 P9 c/ X& c' H( H    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ S' `3 s0 x% ~3 [# h    return 0;* {% G: g. D( l( i* \+ E

( B# d0 x# I& M$ B) N7 F" i( u}
1 j$ b. o! g& {3 Y  f+ C$ p0 M: l& j% M0 {; I) ~
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 m6 J7 v" T7 K' V# [2 E! B0 d3 G$ ]{
3 m9 M' t1 a; S- _6 l% H1 J   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 y( i( S8 G, r" c% b! E
   copy_to_user(buf,&DRR_data,len);
! F$ {% `4 \" p7 n7 |   return 0;
5 ?& Q3 ^7 O# U6 c  c}
7 S+ s% B# e1 g- i' G- m0 t3 I
" A  j6 ~5 ?; M
( r8 q8 g3 x/ F3 Z+ w! P: tstatic struct  file_operations mcbsp_fops=: _" {5 \! ]9 Q3 Q  X
{( a" B. r7 P' Q+ C% M
   .owner=THIS_MODULE,
( h  f- y! k7 t. r6 {. Y  m   .open=mcbsp_open,
8 V# M4 E+ S, R+ I   .release=mcbsp_release,; v9 m* ~# m" ~1 p8 f1 B, H& e
   .write=mcbsp_write,
$ ?4 Z, A8 H* U. Z8 g' d   .read=mcbsp_read,& o+ s# l2 @/ \
};6 M+ n6 u5 I* ~+ v% _/ h" |
static int __init MCBSP_init(void)4 I$ s; o$ g( K& Y
{3 k1 x9 z5 `* n3 w, R
   int ret;
& N3 B# j9 _6 h( J1 `) W0 A8 u   unsigned  int   PINMUX1_REG_old;
" i2 M  L0 Y) g2 @, X# M   unsigned  int   PINMUX18_REG_old;0 G0 o" l9 Z; T' X
   unsigned  int   PINMUX19_REG_old;# ]2 ]+ Q9 G" w3 o- _. m! g
   unsigned  int   temp;  
1 I" r; a! |  [) X+ Y; b   if(MCBSP_MAJOR)
2 H6 e: ]9 e+ ?/ I! ?6 [5 }   {- U  d/ b. j9 S1 m0 P4 [
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);% d  p* b6 p  Z' I  O
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 M) D2 ]" l' [/ w/ d+ I* ?9 V
   }+ _: ?% h" |! z  `, C! @& a2 E2 g; U
   else7 ~2 _* }( H7 ?9 h. A/ Z/ Y. _3 p
   {) Z; i. `* l- n- ]7 u/ k* Q
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 {- e8 S  {/ s0 I
      MCBSP_MAJOR=MAJOR(mcbsp_dev);& k0 f* n) r! s: Y
   }$ y0 r4 |2 V6 r1 f. K. C% ^9 P
   & N  Q8 K" K3 M  \. k
   if(ret<0)# d5 Y) G8 w. \* q- Q6 h2 L7 I
   {7 I- F$ D9 ]; Q! N8 j, L5 N
      printk(KERN_ERR "register chrdev fail!");; O8 s* V& o, z/ U  K$ B7 W
      return -1;
" o" X  M6 F9 b   }
* W* r6 O6 J" Y5 m: h   1 ~* H7 C3 Z2 ?* b: Y; m5 w
   mcbsp_cdev=cdev_alloc();- Q3 L9 t5 O1 a  ?
   
2 V, i/ M0 M! T* k; W% o7 q   if(mcbsp_cdev!=NULL)
- m9 v  G! }# f   {9 K" U' W7 A. `- |0 ?. ?
      cdev_init(mcbsp_cdev,&mcbsp_fops);
% E" ]8 R! d2 v  \, |" x      mcbsp_cdev->ops=&mcbsp_fops;8 D0 u  k/ U1 o8 g5 ~) S/ q( J1 t( ?- v
      mcbsp_cdev->owner=THIS_MODULE;  X- c, R: X0 h0 B6 Q5 }& ]
      - D/ Y9 r$ v. B
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
9 X3 x$ ?( y7 m! _          printk(KERN_ERR "register cdev fail!");
, ]9 `+ e, ?+ r) U6 X      else
4 s/ C4 F, D% Z) m9 o( a2 k          printk(KERN_ERR "register success!\n");# M& J* @+ _! C; h6 h
   }3 c- F/ [$ a2 t% R( H
   else- O; e, M8 ~) I# M
   {0 R& B- N! B3 N! |" X2 `- y
      printk(KERN_ERR "register cdev err!");
  n7 @" b! y6 ~' P: V2 Q) f$ s      return -1;; W4 c, ?5 P- Y
   }
2 U" A. Q4 I: F! j- ~; N     Q4 B  |. c5 J3 B9 Y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) D( y$ k) V' ?0 `- \. U
   if(IS_ERR(mcbsp_class))
9 u7 T$ P3 i4 P2 U! r7 n% Y   {$ i) R2 ?6 g, B9 {
      printk(KERN_ERR "register class err!");/ H2 H% x+ u# D9 d; Y+ |: I5 Y
   return -1;
% T) d% h5 M" R9 E4 Z   }
/ L6 p: R8 u; X( y+ x   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' A2 H. ^2 ?# c( M2 d3 @! ^
: T4 R# {( ^$ {! |, b: r   //PSC3 H  p+ }3 E6 d7 ^
   //add Enable MCBSP
+ e7 d% @3 q. f   //test
2 C$ ^, Z8 n: @( k' N/ T& y' H  T) X6 X   temp = 0x80000003;  v9 Q3 l9 M* D$ ^$ ?1 \! O/ D
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));5 D' G3 J3 a. ^0 X3 Z& s
   temp = 0x00000003;
: l& C$ j% h8 b2 ^/ G   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& X8 u( j0 E5 j
/ O, Q- d7 [  G+ ?% }& W9 s' e& u   temp = 0x001FF201;
. ?9 |  n/ r0 }$ ?" V3 }- c6 u   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# b, x2 P1 C: {
   
  F1 p! H) ?: O% a+ L" B6 I   //PINMUX  
- {, K2 i! U& A* P   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,9 v, I& M/ }4 e5 h1 S' C: r
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  & y' u. h& I* f/ _8 I) [+ v
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; U, {2 Q9 Y& \- L" d) [   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 f2 k$ T& \4 S" s$ o0 m   4 N* B$ M; h5 x
   //SLEEP_EN,EPR,L138_SHK1,L138_RC! u2 G* J4 H1 M+ c7 l4 O- P' j
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
3 ^3 [7 t3 Q: Y* ^% q0 s   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" N& W: z* _6 y' e0 _& p   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% l0 R& H+ i. p. a' O# j+ b4 i

) N& _2 d& y0 L/ B8 c   //RESETn,L138_SHK2
- n4 E$ B- z! g1 |   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
. w( i) h* p+ l6 _8 _# M   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 G2 }( |5 {3 I, _$ J- H7 j0 f   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# N  G4 X. r9 _! L3 k' f
" i" f. N4 V% G

8 v, `( \6 d& Y  //SPCR Register* d/ h% R& Q. o
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 c4 u0 h# Y  R9 H" f( |  temp = 0x03000000;//(DLB=0)
4 ~2 u; B6 T+ t! u; v; x  v1 l // temp = 0x03008000;//(DLB=1)! F* G. a- l5 t- `) J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset; _: }3 G( y+ g% u
  temp = readl(IO_ADDRESS(SPCR_ADDR));
' L  N5 y" M! t- m, P$ ~6 N; G  printk("temp=%x\n",temp);' L/ V6 q- W+ Y4 J* p4 L# t
" c) Z" c; |) X" Q
   //PCR Register+ ?' v9 {7 G; x( x8 [
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 J# |  P. y' d2 U/ Z- Q7 s  // temp = 0x00000F0F;
5 Y: r& m$ E* o# {  temp = 0x00000B0F;0 q4 {, W- M5 [$ C1 j* b
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 x+ j9 \2 m% N+ R& W
  temp = readl(IO_ADDRESS(PCR_ADDR));4 {& Q/ q' z  ~& [
  printk("temp=%x\n",temp);  % d2 }; v. o' r/ Z; U
   //SRGR Register
3 M; @: X9 @2 n   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 y  ~' \- ]; |' z' B) A; m9 }
//temp = 0x301F000B;
3 ^4 i% L  u0 f   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 5 m/ t. ]5 |4 U6 \; {  ]. X. T
  temp = readl(IO_ADDRESS(SRGR_ADDR));
5 A8 x- x% h/ G+ g0 x  printk("temp=%x\n",temp);& x' t8 c. N9 d( c2 Q3 M: D
   //RCR  k" S9 M, i- [+ a3 A
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* w. W( }; y* F6 ^2 x6 O" V   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) m: E) S; a! [6 {# u. Z   temp = 0x00440040;
# ~' ^/ Q2 f4 I   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
& d3 z% N: X9 ~! `! S   temp = readl(IO_ADDRESS(RCR_ADDR));
* j' J; S  i" D$ K% U   printk("temp=%x\n",temp);
0 ]2 c+ T/ q8 G  j* b; y) y7 P5 j6 T   //XCR7 ~; t, Y- T2 x% e/ N
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ b) C$ a0 n; r- U9 T& [$ V   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 o, ?) v7 x% e# M( n  J4 X2 B
   temp = 0x00440040;9 }! X8 K5 v6 o2 h' @7 a
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   % u! @, q4 O3 j! ]
   temp = readl(IO_ADDRESS(XCR_ADDR));
4 C: A8 c1 E% [( Z; g" z$ ?   printk("temp=%x\n",temp);
4 M' m* w. U9 t1 ^( n, P  udelay(100);+ @! F: W( F7 C8 o2 q5 }& P
  //SPCR Register( n0 Z& K; o2 D+ @/ }& B
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 Q( Q8 ~4 a7 Z& {
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
3 U7 `2 H" J' x- |$ g9 W7 H7 a2 s3 N  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled8 `. ^/ O5 t3 o
  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 G- ?! G# l- L  printk("temp=%x\n",temp);9 q4 Y1 f4 M1 L& L* i
  udelay(100);
9 G7 h; n- R  d8 c4 M4 r2 v; B
# }( s- \  Q6 p  //set GPIO direction
% X4 M8 d$ J( B* `, N: A   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' [! W7 p2 G1 h6 p; U
   temp = temp | 0x00000100;//EPR----input
, Q. v4 J9 p* ~& R/ l8 k% ~! v   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* r5 X& ^* }; G* `0 ?  g   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 n8 Y, ~$ a5 i' ^6 i3 _
+ @% b& ~4 O) U: y) y" y+ V" f
   return 0;
5 P0 r3 m9 e7 _" m- O. M1 w}
8 p. X. O: S- p; q$ x4 \static void __exit MCBSP_exit(void)& M& r! T* o$ x) h# k2 `0 u7 T5 T
{  e3 b+ O9 o1 H4 U
   printk("mcbsp chrdev exit!\n");
% T! q5 X+ I7 |- j& ]   cdev_del(mcbsp_cdev);+ M! z& h4 F3 |9 V8 P% w1 S
   unregister_chrdev_region(mcbsp_dev,count);
- @& x* Q1 b5 [/ y   device_destroy(mcbsp_class,mcbsp_dev);+ y1 a- Q9 O  z' ?6 e7 o4 {
   class_destroy(mcbsp_class);3 G  V0 b& z: o( H9 y0 i1 i4 G4 J
}& ^  N$ b; O  [6 F& r
module_init(MCBSP_init);" e1 G" X* G* R* S
module_exit(MCBSP_exit);
2 u; j, u/ Q+ U1 y
8 ^6 I$ G* ~6 v3 dMODULE_LICENSE("GPL");
  T# N, j6 ]. I+ z
& t4 N; [; J# Q& ~1 j我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 _& x) T$ I  E# g9 i
我的应用层的测试程序如下
- j# `5 d! f( L- j#include <stdio.h>
- p' B% B$ h8 p6 g- o9 l#include <string.h>' J( M; b2 _* }7 N( w2 l$ f" @
#include <fcntl.h>  a3 V+ V# ]  r. o( t
#include <unistd.h>$ |% k) Y& N4 D, ~# t
#include <signal.h>2 a4 m5 N& P, _3 j
#include <pthread.h>       //线程
4 d1 _7 B! p# s- H  _#include <stdlib.h>, t, N( l2 o  K0 }. M
#include <pcap.h>          //捕获网口数据. E  x, i" ]& q: u
#include <semaphore.h>     //信号6 J+ d, f9 J2 l' w& p" B. M9 d
#include <sys/types.h>     //消息对列0 I- {0 P/ P1 q# g. i$ w7 c- A; }
#include <sys/ipc.h>       //消息队列8 }" g2 p5 c4 W" _' p
#include <sys/msg.h>       //消息队列) {8 b! ^3 u9 s# b
#include <sys/select.h>
& B& M6 _$ s* Z* @. ^3 f1 N#include <sys/syscall.h>5 _4 k$ |0 Y7 @' n; ^+ J
#include <sys/stat.h>
& l8 A3 [$ ^* L, \' R, w#include <sys/mman.h>/ ~$ {& f, a% W" Q& |+ ^
#define msleep(x) usleep(1000*x)
; C7 Q% W$ E& `; I1 G
3 V) Q1 |& k$ L+ l7 Hint main()0 s6 s7 Q) i! ?: I. j; u$ B
{
5 L# q* \' ~% c, J+ R5 @! p    //MCBSP,ARM与AMBE2000交互设备$ A+ L2 Z& L; d  ]
int fd;' f$ H2 U; R# [" l4 E' g# ]
unsigned short data_write = 0x5555;
6 k! I1 k9 Q4 `0 Q5 T unsigned short data_read = 0x00;
7 ]; \- z- u) m, i$ P  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);  x$ C9 m+ ]  z% [
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- l' ?2 D, [, c; x8 Z) V# N   
8 S5 a6 l7 a' `/ G$ v  if(fd < 0)! F2 A( m0 }  F6 ~. o* ~6 I4 |$ F$ I
  {' O# g+ Q' V( U. t& y& G- y  r
     perror("open failed\n");
: S0 C2 t! ]( {! J     return -1;+ |- E$ L, z, K& X. Z7 r6 a* n
  }0 e& U8 s/ X7 c0 E+ l0 ^
  7 b" [( q% Y4 Z
  while(1)
8 J8 B" d5 x3 Y5 n' p6 A" T  {. I7 l% J9 X4 `) C9 o( R2 Y
   
. C( e2 [8 [" `( p3 T. g$ F   //AMBE2000每次读写是24个字为一帧# A+ Y6 c- w- k; d0 I2 k8 a2 n
   //写数据时将数据在底层存储起来,等到中断的时候再发送# Q+ @1 w( j# i: O( B" Z
   //AMBE2000输入数据是以0x13EC开头的! [' M0 q) l5 c$ x6 i! e2 R
   write(fd,&data_write,sizeof(unsigned short));
5 G4 e0 w# T. H) i8 T# [, ]/ w   
9 L7 c5 Y/ K$ @6 M# [   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
4 {6 D. M" e% o. Q6 f  O   read(fd,&data_read,sizeof(unsigned short));- ?% `( R0 M# j3 o" a
   0 [' C3 N+ X9 v  ]# V. ?- O/ H
   if(data_read == 0x13Ec)" X: m; ?" P/ y7 R+ t
   {
& e+ n0 ^0 V7 c0 H   ! m: j9 z) }" Z% f
    printf("data_read = %x\n",data_read);
" K8 Y) O, R- M* U   }
  u  C7 x8 _$ ^: D" k1 |% R' l   
3 q" \2 a& _6 F& [" i# f9 k   msleep(10);/ @7 g' O% X  W- f
  4 m% U7 l: B; }! J  h
  /*) V. t; Q' C3 u" B/ D. r5 F& T0 S6 q
   ioctl(fd,1);   
5 d# n' ^. `& H1 U sleep(1);
3 }8 `- u( q- a2 ^ ioctl(fd,0);% f3 T- w8 y9 p" q; O+ A! H
sleep(1);
& K3 ~0 X$ n" {: n2 a* w4 Z */
" h# @" g% n  `# n# e; ?( V) H% l4 K  }   $ p! `( r0 `" a  V# m
return 0;; x0 Y* X0 ~4 a

3 m! Y- x- D# {' t5 i) e1 F}
1 J* {+ y7 H1 j$ L
1 y1 E! h! A) d, K4 }多谢各位指教,谢谢! 急. j6 C' Q9 D# a9 ~4 D
5 P& w/ u& M+ n% T! d1 y8 ]

6 ~! `1 Y4 F- d, l5 y. s2 a: y  g! N' U" H: n

3 P  m( H- r/ D" ?& D
- [0 M5 _! s8 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-15 10:58 , Processed in 0.040400 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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