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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 x/ D) C3 [1 X$ g+ M( h8 G$ y/*4 s  |) X5 O  y* ~4 G
* Copyright (C) 2009 Texas Instruments Inc
5 I0 h7 q4 ?6 V6 d$ d/ _ *
% {; L: P. ~9 u+ `( Y6 D * This program is free software; you can redistribute it and/or modify
" O3 B+ r, J/ l  R1 w * it under the terms of the GNU General Public License as published by8 ~) T. p& C1 j+ y
* the Free Software Foundation; either version 2 of the License, or
# b5 O) v0 S( x, l" K! ` * (at your option)any later version.
* y4 r8 S( ?; N: z" q" E1 p' q% z *6 \5 R. _. k! n; J
* This program is distributed in the hope that it will be useful,
" f6 w# Z. \3 G1 z9 y! @ * but WITHOUT ANY WARRANTY; without even the implied warranty of% t6 L6 c' V1 q$ P! p% k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ H2 A- z: a2 T9 v2 E, F2 p * GNU General Public License for more details.
" L; p) t1 [( c4 I) l- @ *
1 T) B+ N+ `5 G/ P * You should have received a copy of the GNU General Public License  M3 R" P4 O8 j1 }% [+ e$ K5 F, ~
* along with this program; if not, write to the Free Software
) s$ K) O% e! b4 v7 ]) P. r * Foundati
, k; q4 B" Y% p*/5 L- h6 Z  a6 ]7 g* T: X5 E1 |
#include <linux/module.h>" K- ]4 B* }" u
#include <linux/init.h>) x+ P6 E0 j, c! J8 I9 P  F, m. f
#include <linux/errno.h>1 Z, X9 n$ E7 L. j% \7 O
#include <linux/types.h>% L" z# c# A, p
#include <linux/interrupt.h>* k% E9 \$ D' {+ ~/ L+ V1 x
#include <linux/io.h>, P$ x+ J) }" D' V. k  }
#include <linux/sysctl.h>
5 r, ?9 H& Y5 \#include <linux/mm.h>
' r/ D7 [- e* N#include <linux/delay.h>; Y8 u6 U% d" c% {/ e
#include<linux/kernel.h>9 i7 V0 ?( [; l0 A. F" G' }
#include<linux/fs.h>: T4 r. b: u0 p( J
#include<linux/ioctl.h>
( }4 d, V3 ~5 n% z( W#include<linux/cdev.h>  N4 w# }+ k3 U0 ~6 b/ E8 s
#include<linux/kdev_t.h>0 I: F$ O1 @9 v" ^
#include<linux/gpio.h>7 U2 y  Q( o; k/ r" ~( ]
#include <mach/hardware.h>7 T4 Z! R* p0 {# W# H
#include <mach/irqs.h>
9 I* }0 ~. |! D  n  q% w* g* W$ z1 E6 E! a7 G2 n/ T, X
#include <asm/mach-types.h>& Q' W4 Q2 m3 j2 O  w
#include <asm/mach/arch.h>. f% }2 l  M% a, w4 x& _
#include <mach/da8xx.h>
  @- y* n% c2 {+ I- ^% W#define  SYSCFG_BASE   0x01c14000
# B7 ?, E+ A6 j; n1 ^( J/ U#define  PINMUX1_OFFSET   0x124
" W# g2 e# [! X+ }4 N, w#define  PINMUX18_OFFSET  0x168
/ i0 ~# z! q" K* t5 ?. @#define  PINMUX19_OFFSET  0x16c
1 A+ K( {# H( r" }6 m. O#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR+ H* H; w# s( _* U1 n
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
- Z6 W  U6 a* ]* l: V1 e+ g#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
% Z4 s5 g$ t5 K0 n; Y, x8 f1 @$ P#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR. `/ Y0 u9 d. y$ M
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ c0 Q% Q$ }$ h5 B                           
1 Q  u- c6 o; p$ n#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 M$ [; e" J5 D2 @
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR7 h! C6 T* {) F1 y
//PSC6 W+ _6 t; f# M
#define  PTCMD_ADDR   0x01E27120  * D2 A" y, Q% ~% t( d5 |0 q; L
#define  MDCTL15_ADDR 0x01E27A3C
" r; }" ]& }# K& J8 p#define  PDCTL1_ADDR  0x01E27304
' ^6 [5 e6 d. g" m) r2 }7 ^//GPIO8 direction
. i& h( \9 d/ ^( i+ L9 n8 R#define GPIO8_DIRECT  0x01E260B0: Q$ S1 E/ I- x- }; p6 I+ D
#define GPIO8_OUT     0x01E260B4
. u) M9 c/ t2 G5 `- a. A$ p1 h#define GPIO8_IN     0x01E260C0
1 x5 B( ]* e7 `+ b1 t
% ^: p% J2 f. o: K/ w" Y0 o//#define MCBSP1_RINT    99              - `9 F* q) t+ T  d' B
//#define MCBSP1_XINT    100  
4 W. ~. i8 K4 ?  jstatic int MCBSP_MAJOR=239;
' P% f+ w0 k! _) y. k0 [static int MCBSP_MINOR=0;2 b, K: `7 l) D# g" C- l
static int count =1;
  Z6 R: J  n# x/ X! ~8 m+ c" _
" |! Y. K" T0 ^#define MCBSP_NAME  "MCBSP-device"
) _0 W) d, s9 q  G! S, b) j/ E
7 ~4 Z0 ~. M3 Ystatic struct cdev *mcbsp_cdev;+ Y. {$ M0 p" N9 @7 h" S! k4 y
static struct class *mcbsp_class;. b4 t) x2 ~# N, f8 `% k% E0 l& g
static dev_t mcbsp_dev;
$ x  o; z4 n8 M9 xunsigned int DRR_data;
! V; u( o: `: I0 {4 o4 G7 \# Qunsigned int DXR_data;
- B* Z  N* m3 M* _$ Gstatic int mcbsp_open(struct inode *inode,struct file *file)* k( l9 \8 V: r0 g7 ]
{8 c! f, D) O% u; z( u9 U
   
& e! n& Q+ ?: Q. U8 E   //interrupt enable,initialized( K2 p# v8 K0 |
   unsigned int temp;* r# J! d+ ^* j6 b: Y3 O
   //SLEEP_EN(GPIO8[10])---0
$ W1 j  [; f( ]1 o) w* e   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 {  X# P) f6 u$ I# L5 b   temp=temp&(~0x00000400);; Z7 n4 ]& ^. ^, C9 c$ c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ L  n2 p# Z4 r+ d( m  //RESETn(GPIO8[8])----0----1
7 o, W! e8 y( K+ O3 E* t   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! \3 j, T# m* B( _/ }; t; x0 c
   temp=temp&(~0x00000100);
4 O& M9 S7 W& N1 }   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; r* G0 ^* @+ Q   udelay(100);* v9 \/ X$ d6 X! f# H7 l$ e. v5 E
   temp=temp| 0x00000100;
  u8 w* g2 T6 h$ N9 U, J& q( n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
1 Y- b+ y' {. ^9 d   udelay(100);
2 G( i; `9 S, S# O5 [   printk("open success!\n");
$ O  t. L3 T* ^* E7 q; {& z   return 0;1 f  }2 S! t  p' {8 q: C7 B) G% z
}
( X' B+ w/ P- U/ ]# `8 d  u" {# h$ h& c- C+ {  K- T
static int mcbsp_release(struct inode *inode,struct file *file)
+ x; X  s) Q2 z5 L& i! z{+ ]* Q' S5 O& \& x. u# k* j
   printk("release success!\n");6 ~! c& b/ K+ w. h2 ~) {7 y
   return 0;
2 W+ V2 Z) h$ U3 N  i: e/ c}0 a  p* F( F, `' Q' W. t
) m: w/ d; _  h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, A% `6 d' G% u) W8 e{2 q5 ?0 i8 g, b3 k
    copy_from_user(&DXR_data,buf,len);
" E& X: S1 q" B8 G; D    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
1 e: v. j/ ~5 x; Z; \; H    return 0;- J5 f" T( A% e, ^. x
5 c- ?1 K& |3 w0 j  i
}
, z0 |) H6 c! H; Y1 }7 X0 B% b! B7 v5 J3 c5 \
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). N+ I( P  l* w* h7 m( W
{   i2 t1 V9 [8 t7 G) [# d
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));  D* M& _6 @; I! M3 ^
   copy_to_user(buf,&DRR_data,len);
; b) x3 {0 s/ r0 M$ [3 z   return 0;
1 K; o, O% d3 u* I! T}
: N" M( ~$ d3 s+ @$ z! Y# _4 F9 h2 E# m+ h0 F$ y0 R
+ k3 [$ d- ~5 n
static struct  file_operations mcbsp_fops=
: W8 o5 J. ^5 f6 l{
$ }$ v, l8 \3 r$ c' d   .owner=THIS_MODULE,' _" V- T. p/ {" y; p
   .open=mcbsp_open,
2 _: E7 I  ?7 f7 K: @! S) K- V   .release=mcbsp_release,' \. ]4 H6 R. g7 G
   .write=mcbsp_write,* O! g5 h3 r5 V2 G1 f
   .read=mcbsp_read,
7 F; Z: z- ?. a  f, @. Q};7 X6 T% G8 f- Y; l; L7 w
static int __init MCBSP_init(void)
, f8 O7 h4 E, w  S- U5 F{
9 T+ B+ y: F/ c$ ^/ H   int ret;; M9 W- t9 ^/ t. ?
   unsigned  int   PINMUX1_REG_old;
: [5 T; M5 A0 [4 ^! \1 W   unsigned  int   PINMUX18_REG_old;" H/ \3 a' A8 D0 H! a9 ^# C9 O
   unsigned  int   PINMUX19_REG_old;
+ b7 R& ]$ ]# N1 `( D0 K8 Q   unsigned  int   temp;  
7 |; x$ ?( F8 H9 `0 u% M7 v   if(MCBSP_MAJOR)
6 ~+ w1 x1 D2 N% n   {$ c" c8 Z) N- B$ o' }$ ^, [
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 f0 ]5 k& |) x" L
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 s) ?. H& H2 {' G9 b9 t5 Z
   }6 s, M- I/ m: W3 s9 o- Q
   else  X% |/ c4 N; T  B
   {9 z2 t( R6 n& A) p. R
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, f% K" Y4 _$ {
      MCBSP_MAJOR=MAJOR(mcbsp_dev);& G* ]. E* y8 J) u
   }
2 {, ~6 Q. M" Z" c" m! A   " y$ d$ z6 ?1 {5 m7 ]9 _6 W; s% w' j; E
   if(ret<0)6 {( x3 J; `. I  V# W# B1 I
   {
' F) `( |& B: |( P) A; `/ \+ q$ D      printk(KERN_ERR "register chrdev fail!");
2 Z( I, I# J, X      return -1;
& z$ {3 |, N0 [& n! S  _1 X   }; ]+ S; o1 _' o3 e
   $ J0 `2 O7 ?' Z# @1 [$ W* k
   mcbsp_cdev=cdev_alloc();, A, g- A; c$ j2 D! {  \
   % N, R1 }% T$ C; R
   if(mcbsp_cdev!=NULL)
5 T  g% ?# C- a* W# s) y   {2 j$ H: R% X1 q. S9 g2 n
      cdev_init(mcbsp_cdev,&mcbsp_fops);
/ d$ o& {" ]; a) {( K8 G      mcbsp_cdev->ops=&mcbsp_fops;, \1 {8 P, W" G) c$ e
      mcbsp_cdev->owner=THIS_MODULE;
+ R! A8 m% H  ^6 g! t) B      
4 c6 f( T. M: F0 t      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) q8 f6 a6 ^- a          printk(KERN_ERR "register cdev fail!");$ r0 o7 k( Z7 c$ b
      else( c, F3 T  i+ Z# L  j, ~
          printk(KERN_ERR "register success!\n");
% V$ e0 Y1 f( z" O5 ?5 i7 R   }
  ]; r" L3 d. y' _   else* {" _. W) c& b  |1 v
   {1 p8 D1 V' y) }& O; J
      printk(KERN_ERR "register cdev err!");
- X2 s6 G+ ^$ W2 o, m; x( ~% _      return -1;
4 k. V: y: W& M2 T) q5 I   }/ e: _1 j1 D, ?7 m/ x
   3 r% ^0 a" f& |# P+ G4 J, i
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) }$ L6 K( M( N3 S. U
   if(IS_ERR(mcbsp_class))
* a- L; [! @; h2 Y( N5 [% s& K   {
: N/ _  f" g6 Z$ A. Z      printk(KERN_ERR "register class err!");
8 V7 I9 ]9 k9 C. O9 Z% x5 R   return -1;
2 `9 ]6 }( z' j, P5 e7 A- B& F   }
2 L% c' i* t, ?- E* q3 V! r   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 M5 P$ }5 E$ [
4 c3 ^$ C" b  Z& `5 D. a
   //PSC9 X# }% X, N4 A+ t/ c
   //add Enable MCBSP
. Q2 f/ p# T$ T0 [( r   //test' k1 j& {9 a5 `) @8 m6 C6 @
   temp = 0x80000003;
# D& X1 w& J+ U1 M- q3 ?7 U% l   writel(temp, IO_ADDRESS(MDCTL15_ADDR));: j# G& j& P  r# \) ?0 c
   temp = 0x00000003;8 o0 U+ q5 {2 J( A# p, ]
   writel(temp, IO_ADDRESS(PTCMD_ADDR));3 P6 q* P5 p6 h
4 G. i$ \" b$ o' u
   temp = 0x001FF201;2 a+ b# T. y4 J
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" M, {% d$ e- g7 O: ?
   + u+ }( P# D1 p5 ~1 `
   //PINMUX  2 T# M, k: P8 i7 A
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! v, B  t5 a6 p4 Q9 j   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 I8 ?$ e: d- A* g( M  y
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : |# j8 j7 Y4 o; i5 @' w  }" r
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# U6 `% p. U0 ?! f9 m, V5 P$ I* }
   ( z# q8 u; j9 Z( O$ l) Z/ U4 l
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
! s" [, I) [) u" P5 _% s   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ' |, b5 Y+ H" ?; h/ N% F
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   + x$ o/ g% D0 t$ `
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" e& Q5 n# G+ s. y7 [7 d4 v; {' K

# h: M7 d8 ^% _1 m9 K   //RESETn,L138_SHK2
* r% ?: f$ x6 T! _  r" U* ^9 O   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  $ g: ], p7 r; ~) x+ {+ Q( F4 _
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   9 y1 W9 h6 f+ l  W' r3 E% d$ r
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 C% d1 \1 R6 `: n2 B' U
2 n  @. M* ~2 t" \' ]* w3 k0 r2 X- V
* x: H5 Y( ^* Q0 t2 O4 E' m  //SPCR Register- f+ g: R5 f+ S1 d3 _  L0 |
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset3 f, l* p2 w' m- U9 J
  temp = 0x03000000;//(DLB=0)
/ }  n8 Q6 u1 x; g0 E( a, }  _ // temp = 0x03008000;//(DLB=1)
' v" W2 @/ R# B+ r* o* ^) [  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
4 f, z( C' ]2 i" [3 Z, i  temp = readl(IO_ADDRESS(SPCR_ADDR));9 k) X) F2 v7 H
  printk("temp=%x\n",temp);
/ V" P2 g, P. l  V8 K. r8 `
& U; }; J3 }0 X   //PCR Register& ?- v+ x8 k% Q3 Y8 v4 \$ n9 y
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 o8 R9 H% L$ \8 O2 ]  // temp = 0x00000F0F;
( R& _9 |. l, U9 S0 J# u  temp = 0x00000B0F;
9 _, z) F1 f- m4 }5 ^1 f3 c  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized . l  G7 z0 ?0 ]4 b9 b1 P/ ?4 D* `
  temp = readl(IO_ADDRESS(PCR_ADDR));
2 M( I+ T: L  h0 l% u  printk("temp=%x\n",temp);  ; D* D# U  n5 d! ?6 ~
   //SRGR Register; \  _7 Z% u8 p5 @
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
, ?8 J4 E- Y' l- @! ~$ z2 V //temp = 0x301F000B;9 f+ W, L6 h5 w$ g% |
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ R' {* ^2 e& M) [" t  temp = readl(IO_ADDRESS(SRGR_ADDR));) |* S, L6 G* a( k. {. M* ?* \
  printk("temp=%x\n",temp);3 s/ }' X9 i/ k1 g3 e8 x& L: s5 [5 L  X
   //RCR
% n! n% `8 ]. R' z   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 D' W+ B4 J! u5 S0 e   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 K$ o: q7 X" E: b6 Y
   temp = 0x00440040;9 a; s9 S  l9 Q1 J1 d9 ?6 b
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
+ N! Y, H( i/ A+ ^; M/ {7 c6 D4 Q   temp = readl(IO_ADDRESS(RCR_ADDR));7 Q8 r; a' W9 y2 v) R, N" t
   printk("temp=%x\n",temp);
+ d, E7 W* }! a8 O  e   //XCR' h4 E* `7 @( \7 ]  L. _
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ G% g5 g/ ~- m
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" @9 X5 R/ b6 l) C   temp = 0x00440040;- m& q) }0 \0 a4 H& |/ O7 N& x
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ; |# {8 w1 h, k# O) b; N; \
   temp = readl(IO_ADDRESS(XCR_ADDR));
# e; Q3 p* }# p2 A2 U   printk("temp=%x\n",temp);
5 o. M. }$ C' m. I  y- U& ]; p  udelay(100);
! M" v3 `9 j1 H0 {& d! A( _6 X  //SPCR Register
& e0 n9 t" x/ b! D7 t  H: k) \  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, H  Q0 p) A' b  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 B+ Q, L" Q! d: o% {  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 c/ X7 e) T1 t6 K& {8 m' K( l0 s  temp = readl(IO_ADDRESS(SPCR_ADDR));2 i) _$ T1 k; k1 m3 B
  printk("temp=%x\n",temp);
( t1 h2 w, Z) g9 w( F: m! m; b  udelay(100);. Z+ _- f5 R! D% ?* K7 _

4 D  B4 q# o  A9 R. F# J2 }  //set GPIO direction
" a) x( T- N! a& g8 N) b   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 K3 i+ E7 w- r: w   temp = temp | 0x00000100;//EPR----input, F0 m4 ^- Q: [$ t1 I$ z
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) i  ?6 g9 s* {  V& e1 ^1 g& e, e   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ T6 `9 F1 T2 z3 G  ]- J6 G * h2 J) d. O1 v; Y
   return 0;- r$ `; f& ^/ [* U
}
3 M! O- i+ A! Z  ]9 n! ?static void __exit MCBSP_exit(void)* C1 A9 Y& @& O% x: g8 g
{; k( Q+ g( G+ c6 Z/ h+ |$ @5 u
   printk("mcbsp chrdev exit!\n");
1 T2 h) ^- `" _+ P8 O   cdev_del(mcbsp_cdev);
0 ]( }' Q1 |, l3 g4 Y   unregister_chrdev_region(mcbsp_dev,count);) d2 J7 P7 ^% P+ Q9 x; `
   device_destroy(mcbsp_class,mcbsp_dev);! @# C, w8 a. t/ {7 a
   class_destroy(mcbsp_class);& R/ u+ f# v$ ]6 S9 T0 d: O
}
8 ?1 E: O1 ~# h/ f" V- I* k0 Dmodule_init(MCBSP_init);
( k9 K9 P2 ?, w/ hmodule_exit(MCBSP_exit);' f5 u; x$ g  _2 r1 k3 g. ?5 A
: f- c! \  Y5 n8 O# J) G7 q
MODULE_LICENSE("GPL");
: }$ Y& j0 {6 e$ }& }. \4 }( X, `) [9 F( T7 }5 @5 Q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。  @+ t: T/ m# N
我的应用层的测试程序如下: ~; }9 a1 f% h8 s# G$ ?
#include <stdio.h>2 Z9 Z* H0 Q8 ~
#include <string.h>
" Y3 }1 M- }- n: c6 `#include <fcntl.h>  T0 J' i: }9 I2 ?& n) X* \
#include <unistd.h>, k, f& d8 D: E: o4 x. A! o
#include <signal.h>
# M0 ^7 J' t, s8 F8 q; R& r5 P#include <pthread.h>       //线程
9 M: }* z: R1 L7 ^& M+ t#include <stdlib.h>0 o9 P1 s/ p" y
#include <pcap.h>          //捕获网口数据
4 {( p+ H7 e, ~#include <semaphore.h>     //信号
6 P4 K, _+ b- J1 g  j7 @7 ~, s#include <sys/types.h>     //消息对列9 s: @1 @/ i- x' D- d; W! f4 t
#include <sys/ipc.h>       //消息队列3 L8 ?) J* ~/ ]! P5 E; V
#include <sys/msg.h>       //消息队列
" l6 H, H& R6 k; f" M#include <sys/select.h>, }0 X0 Q, x0 R* ~5 Q
#include <sys/syscall.h>
3 u+ [. g/ Z, C7 V#include <sys/stat.h>
0 O5 @4 c1 p+ E3 y8 e/ j#include <sys/mman.h>( {! d* n/ {; m2 E" r" g) X" ~1 }
#define msleep(x) usleep(1000*x)
7 s: T& o$ G3 r$ G
# {1 i3 p3 C3 }: t) Dint main()3 s- ~( n6 L% W& X) \  I
{ 9 _( {4 a6 |( a6 t/ r; O
    //MCBSP,ARM与AMBE2000交互设备
: @. Q: W- p9 I+ ^. S int fd;
8 p0 Q% ~. E* p' `% M unsigned short data_write = 0x5555;
/ m9 F8 Y8 c; i; H; _ unsigned short data_read = 0x00;5 _7 V4 K- t5 @2 A4 @9 [  O( t9 b
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" |- E( x" x$ \6 I4 `' s9 c //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ q, G; r5 Z- o2 w. \4 L2 v1 d
    ! K- D; @9 ]4 H9 v7 `, d$ ]3 _
  if(fd < 0)5 V2 m/ T3 j% ]/ ^5 J
  {
7 O/ v- f- D2 F+ Y9 d- S  x+ _5 N     perror("open failed\n");
6 _: ?/ ?. k9 b- D1 x5 r     return -1;
! n: ~% Z  T! M  }
8 p. t0 l9 D, x  
/ G8 Q" }( g$ ]# z1 t  C! J  while(1)( p& g  T. {, @0 l8 ?3 r6 O
  {( G* u1 J& T7 Q$ V
   / `% h& z: b3 m' o4 Q  _2 \
   //AMBE2000每次读写是24个字为一帧- c. J* F/ Z9 C- A$ _# p
   //写数据时将数据在底层存储起来,等到中断的时候再发送$ w( W3 _/ z8 @6 f% [
   //AMBE2000输入数据是以0x13EC开头的  N; I8 \+ i" \* ?# k& E  o
   write(fd,&data_write,sizeof(unsigned short));; U" [. a  Y7 S+ ~
   & Y6 F6 E* y5 E0 V8 G
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
$ |7 d, g1 |# c/ S/ \6 I4 N   read(fd,&data_read,sizeof(unsigned short));4 ~0 c8 C& M3 K9 a' ~5 c' k3 w$ V
   ) v5 z1 M; P/ B" {3 y
   if(data_read == 0x13Ec)- f5 d9 }/ E7 j5 k2 C  I
   {
9 U7 w7 P9 R7 \! x0 ^8 O   % a- `, S& ?% f. w- @7 j- G
    printf("data_read = %x\n",data_read);
$ ]+ t- d- j$ d6 N/ G1 ~* j   }- ~' t7 }4 Y, E& w
   ! z) q6 G5 u7 i7 H
   msleep(10);/ m+ n4 b  W( O
  
8 f1 X9 q; y6 {  a0 S: \  h4 C. E  /*, E' F4 }$ E8 s% Q
   ioctl(fd,1);   
  P3 Z. H, }$ r4 G. o sleep(1);! L3 }0 F$ F  b+ U, F* A9 U" o' |
ioctl(fd,0);6 c" `$ H$ f' M" ], x+ _0 f0 G1 U
sleep(1);
8 m# h/ ^2 X& ~3 b( l$ q */ 2 g- z1 b0 D' Z6 ?5 a
  }   6 n8 W- M( e+ t7 C8 I8 W
return 0;! ]; V6 V- M8 w* @9 Z, M

7 f5 p) O1 F: v9 n) Z}+ t& _" ]4 p; t! v
+ A( @4 J4 ]/ E8 e$ I- F8 n4 V/ b7 v9 Q
多谢各位指教,谢谢! 急- u) ]0 `5 A/ W: \! e
0 U4 d9 B, N% N* u3 a* y' \/ J
% [8 _% d/ V0 E$ g

; g6 r& h) l, m6 t9 c% A# p
$ y6 U) Q( b& Z% P( W. G/ f& X! `$ Y  D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 13:44 , Processed in 0.048815 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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