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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ r7 m) I5 t/ h2 \" K/*
* v$ \3 D+ e3 F7 X * Copyright (C) 2009 Texas Instruments Inc
+ V; O2 l4 I4 F9 U) L2 z *
. t# p" p. q& i, I/ v! h7 P: e * This program is free software; you can redistribute it and/or modify& _6 \, _3 c$ f' v, }
* it under the terms of the GNU General Public License as published by( `; g5 X: K2 S% i
* the Free Software Foundation; either version 2 of the License, or9 |& i6 t: X1 Q, q7 \- m
* (at your option)any later version.
. u. M/ a7 o- W, d *
* t3 h0 k% g% ]- C) H- c * This program is distributed in the hope that it will be useful,% ]$ M  q& W- ^+ b7 M
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ s( Y$ G% v8 e) g- _$ ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the( s& x% z( F  s
* GNU General Public License for more details.
2 Q! z3 `- d, F *( \3 [' ]/ v0 W3 A7 H) |
* You should have received a copy of the GNU General Public License
! h3 N2 @4 u) b5 I2 z1 g * along with this program; if not, write to the Free Software; {8 r. F% F) s4 n. D/ i! H
* Foundati
7 e$ z. o' g' Y2 S1 r1 V% F*/. q8 p- A" c- R9 d1 i
#include <linux/module.h>0 H. o1 }! |) I
#include <linux/init.h>3 ]; y1 K0 n" T  Z
#include <linux/errno.h>
& u4 b( n0 c+ ?( d" h: A1 ^8 N#include <linux/types.h>7 G, l( e* z2 O7 b7 `4 m2 Z; l
#include <linux/interrupt.h># b1 T' O! z  O4 o5 T
#include <linux/io.h>5 ^( |( \" R8 p; n; a+ ]* D
#include <linux/sysctl.h>
' p. K3 E5 M6 H" S#include <linux/mm.h>/ t. c4 V/ d+ w- a$ E  N) x/ r' \
#include <linux/delay.h>. X% w5 X  y7 r( J
#include<linux/kernel.h>" _8 ]2 c* H" Z  p' G
#include<linux/fs.h>  x! W6 p, F7 v& E' o0 _* M
#include<linux/ioctl.h>
# {1 |! t. V2 |* f" N#include<linux/cdev.h>
: M6 H! d6 p; v9 U$ ~#include<linux/kdev_t.h>. W8 t0 W0 M. i; w9 Z5 r- d
#include<linux/gpio.h>2 e; Z- n" x( J1 |. X, D
#include <mach/hardware.h>
* V5 X+ Y% Z4 ?# E#include <mach/irqs.h>  g. J  W' v7 ^1 B$ ]! z
& v" ?8 T4 H3 O4 t" \4 V" ~
#include <asm/mach-types.h>, z# J" [% a/ L4 p3 d
#include <asm/mach/arch.h>
( {# e# {' F2 F; e5 Z& W% |#include <mach/da8xx.h>
" }& N. j: T8 A( R#define  SYSCFG_BASE   0x01c14000
8 C. T" Q" R2 ]+ Q! }) k( M* X6 u#define  PINMUX1_OFFSET   0x124
; \  d' {$ J+ B+ m% ~3 A: s# e#define  PINMUX18_OFFSET  0x168 5 z' i. K8 `% ?
#define  PINMUX19_OFFSET  0x16c" ?8 f4 B. \. B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
6 M4 V& X, _# j- L! y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR* B( y  ]4 m/ `  I
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
5 |. n- }; m$ k, b% S3 x  E1 f#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR( k2 S1 p( ?% S5 M% ^
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
5 c4 E# B6 B* d                           
$ ]0 v! ]: n) p* H* L0 }#define DXR_ADDR      0x01D11004  //MCBSP1_DXR. h6 f3 w/ F. r4 ^: E- w1 B( }
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR$ [6 p6 v5 W) W& p# z# ?
//PSC9 }' T3 r- Y0 e
#define  PTCMD_ADDR   0x01E27120  
1 I3 s! {0 w# n; A#define  MDCTL15_ADDR 0x01E27A3C' O' ]) m" k0 K# I
#define  PDCTL1_ADDR  0x01E27304
' R/ d! F. z8 Z) Q+ h3 r% R//GPIO8 direction5 t1 l4 e! a7 I: g6 ~8 t0 k
#define GPIO8_DIRECT  0x01E260B0
6 W. v- T7 L% L0 {. S#define GPIO8_OUT     0x01E260B4; Z3 E! p7 I% c7 }, F9 H
#define GPIO8_IN     0x01E260C0
2 @7 X. }9 H4 \$ K: I! v  ?$ V, q# d( V
//#define MCBSP1_RINT    99              # |6 A$ q+ o, H, y. q( M" S
//#define MCBSP1_XINT    100    P% ]% i9 ?7 h* x) j. U
static int MCBSP_MAJOR=239;
" \1 Q8 i6 X3 h5 N/ pstatic int MCBSP_MINOR=0;5 s+ ]* ]9 d  j  b: p
static int count =1;
3 L& r7 V; r' V& _, r% c+ x! H8 q+ s  m5 `+ O, n- R% W
#define MCBSP_NAME  "MCBSP-device"
" P' p& p6 T! Q8 z' w, l: N5 v
) O$ R6 V+ f' R- P7 rstatic struct cdev *mcbsp_cdev;
( i" z8 }4 q1 _* n4 ~, l5 nstatic struct class *mcbsp_class;; @7 X6 w1 f5 E1 M2 x; ?
static dev_t mcbsp_dev;4 ?) N. M) L1 W
unsigned int DRR_data;
3 T( n$ X$ s# n! e7 v0 n3 _& cunsigned int DXR_data;
- S. A+ P* @0 g/ q+ |static int mcbsp_open(struct inode *inode,struct file *file)0 x* `/ w4 E* J# O3 p( q
{
/ x0 F  o. u* ^9 q* Z2 }   , K" X: m* `% j: d0 p- ~& {) h; I! w
   //interrupt enable,initialized
7 E6 }$ M0 v. u: K1 z& G   unsigned int temp;
5 x) ?! V5 B0 n+ `! @0 s   //SLEEP_EN(GPIO8[10])---0
$ h3 Z* a+ R; W: x& o   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! N* a3 ?  D3 z* C7 y! i3 u" P   temp=temp&(~0x00000400);
$ V: a, G" y  K0 D   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
9 x0 `/ m- V3 U1 r. E, c- o  //RESETn(GPIO8[8])----0----18 {9 x/ s* c# x7 M& p: L, l
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# D. |/ k3 k* p1 ^' k$ Y, q% ^# o0 N
   temp=temp&(~0x00000100);0 T: S5 l( q4 C  A3 }4 U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 n2 G; o' z: o
   udelay(100);
; r# ?7 C2 D: P- ^, m   temp=temp| 0x00000100;
. o" @- w$ p, J$ y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
$ n4 w  p' I+ o5 B- {( U$ C   udelay(100);! T/ B1 u7 O+ ^" B: z1 M6 ?, v
   printk("open success!\n");+ \$ A/ f( P! u- [7 ]7 T+ K4 i
   return 0;
3 {  Z: E2 D3 r' [8 Y% D6 F}
( Q4 A* _- n8 _6 Q$ r' s6 G/ z" l2 N( ?& n* j( s1 `
static int mcbsp_release(struct inode *inode,struct file *file)9 S. ~# h- X2 u) J
{* s) `! E% @9 B/ a
   printk("release success!\n");5 }; m8 N  O" @% I6 P9 p
   return 0;" ^" ~1 o  P# b, a8 N
}
/ E- i+ B3 L8 w/ i; ?$ v/ n( v
8 I4 G: b3 e8 o7 Hstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% Q. y! a% T& A" |{
6 r! |- Q( E+ L! k" a    copy_from_user(&DXR_data,buf,len);+ Z8 a3 t% f0 m/ e( ~3 C' E
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       8 b% g0 C0 z, u5 M5 ]
    return 0;
$ O7 ]) w+ j8 W* Y% [; z
# N: b% M9 C3 O) Q}
; l5 a1 L  V- I* F& L4 W/ i
% k' w7 Y; D! D! Ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 e2 Q0 C$ i) ~- w+ Z( F/ U' q{ 2 Y/ _% K1 u1 B7 j0 q" d- j( k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));# m- d/ L( k1 ?1 G5 h7 w5 g8 L% c
   copy_to_user(buf,&DRR_data,len);
7 n; i# _5 N1 W0 t   return 0;* B5 o; @2 E# y' Z. Q
}
" _" r+ l0 g, Q. \/ K0 n# c+ _& S$ o2 Z+ S2 K

( {4 q& x$ B$ ?' z+ Y1 wstatic struct  file_operations mcbsp_fops=; ^; b2 W+ m6 O/ R1 _
{" }* t9 C( u1 e4 G, H
   .owner=THIS_MODULE,* c" U3 G' Y( I5 S
   .open=mcbsp_open,0 A; o- W# V/ Q9 X* B% a5 u
   .release=mcbsp_release,0 D& W; q! E4 N1 `# K2 L
   .write=mcbsp_write,( M  X, ]' Z  G& f7 B- q& ^
   .read=mcbsp_read,$ G8 n& c% _7 H
};8 @: k8 _+ O; L  Q% b2 n( ^
static int __init MCBSP_init(void)
6 q) G" Z# p3 f* X$ O) u8 E( [+ L9 {5 f{# z3 a( C+ W. z% H
   int ret;
2 s( Z5 B( n- |   unsigned  int   PINMUX1_REG_old;
5 t! R2 ?' W) ?7 e   unsigned  int   PINMUX18_REG_old;$ Y( ?; G% ]7 x4 b
   unsigned  int   PINMUX19_REG_old;
4 Q; j. W  Z# ^7 x2 g5 a; ~   unsigned  int   temp;  * d) Z: |0 u6 m. }! E6 P
   if(MCBSP_MAJOR)
  D! C3 ~+ r+ h! E6 ?4 |: a   {+ {9 ]( y9 g$ c1 G6 A
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 }1 ~9 G1 \- r4 w      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" b; I3 n8 {4 g$ l( @9 E' u   }
* ^4 K4 t: c4 x. n3 |, k   else
# m5 e9 x. K- x1 C- [) G. y+ C   {
7 w% V$ _% L9 D. F  b' b, ?0 m. t      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( ~$ s( K1 b$ r
      MCBSP_MAJOR=MAJOR(mcbsp_dev);. `- i: A" j+ @4 P( R
   }
; e) T. c/ N- f( v. X   
, z& b% u+ `% g8 n$ D   if(ret<0)
% b9 ]: A& `* c0 c   {
- v5 z) o) ~3 r* c; l      printk(KERN_ERR "register chrdev fail!");
" L( n) M% ?8 N) c6 S. v1 p      return -1;
4 B% s) w% c" l: _7 q1 {, e   }  s# J9 u7 A4 }: X; b
   $ |4 E* Q% ?$ d- y( h" \
   mcbsp_cdev=cdev_alloc();4 O, L! V8 L$ X! E: p, h
   0 Y! H/ _8 @' B' N/ D
   if(mcbsp_cdev!=NULL)
( I& J# v% j: \4 m' @   {' |  L: P/ G. r: q$ f
      cdev_init(mcbsp_cdev,&mcbsp_fops);
; \4 @+ [: R9 ~5 |- C, M      mcbsp_cdev->ops=&mcbsp_fops;
# M0 g) e* K& m$ h4 g$ B      mcbsp_cdev->owner=THIS_MODULE;
, Q4 {9 m2 }7 a: ]4 Y1 s6 B# t* T      
' G0 [8 |* y% z" n9 ~( N      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
& V$ K1 s- w3 M- Z6 O% G- I          printk(KERN_ERR "register cdev fail!");
( A9 `" ~" y! g9 o      else1 u! O( K, E: H6 F2 g/ ^
          printk(KERN_ERR "register success!\n");  a* j. \+ T5 C9 x! e1 r
   }
6 U5 ^  P: v+ n' C. X   else
' U4 z$ }3 T0 w4 `( e) u1 C! }   {  C( C# u. ]/ E3 f' {0 ~5 s
      printk(KERN_ERR "register cdev err!");
4 B4 a  s) O9 ^6 k      return -1;
! m. @  B' O' f9 c' t- l   }0 W( ?) q5 P/ y( N9 B* s
   
; H8 [- {" G  l# w, L" ?# b% \  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! x; V  n! x/ c( P% E) i* y
   if(IS_ERR(mcbsp_class))
9 h" Y0 U6 p& ]' Q/ x4 }   {
; V; C' @+ w6 U2 r      printk(KERN_ERR "register class err!");" C! r( G  F1 }1 A' x" \- Q3 Z
   return -1;
6 x* c* ^, Q8 T# R# W. M) t   }
/ G  @6 Y2 {3 F+ f- K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 Y9 L; S% [1 {7 z6 L
8 j0 j' w7 z% u- ^. Z
   //PSC
! g; W/ H! V# t: a0 }% @  D" ?9 U0 A   //add Enable MCBSP
2 P9 ?4 S) z# h( Q5 s  E  D8 [   //test
+ m/ h! X: n/ A+ n6 L   temp = 0x80000003;
) y: s2 u4 u$ u   writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ N! a$ E! `1 C" _$ Y. S
   temp = 0x00000003;
' i6 N. C5 G% E$ X( j, A   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, t: K) D1 C8 u3 H% {* y9 x
- |( V. \; @* U4 k) y& C   temp = 0x001FF201;! a& H$ d+ q) F8 c; X
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- ~- F: G! D7 d. @$ z  q( j   
* e4 {' Q' _3 C   //PINMUX  : m! S9 m# Q& |' `( _* C
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* I; a2 h* K" b  {   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  + _2 d6 _% O9 h5 E1 d( c/ {$ o/ E
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
! h% |4 M2 g( ^% `7 s8 x& P) A   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 \1 `: ?4 d+ @0 h; ^; `) l
   
1 a2 N/ t" U# W3 A' [   //SLEEP_EN,EPR,L138_SHK1,L138_RC
2 j" ~) y& C; `% j/ D   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  5 x# L* R4 d) x/ D+ x. I
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
- T% w! M% }! g3 E   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* s. l; J8 i9 x3 x1 O* i
# f  H# l& c8 w  ^0 H, }   //RESETn,L138_SHK2% K/ Q$ D7 w/ @
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  1 q; M! [: l9 v* h+ `2 {& U
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  J) e; P5 B6 ^& k7 r   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 S" W% O) d3 ~7 Y
/ X5 h% j# V* _6 N4 l ' S" s7 M$ |9 @7 ]" }  ]' [8 v( ~6 E
  //SPCR Register6 s7 @' R0 z1 w7 c6 v% V/ w3 c9 i. f
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* R, U' O& O0 I5 D8 Y  \+ D) M, \) W  temp = 0x03000000;//(DLB=0)/ b/ I9 z% p% B3 G
// temp = 0x03008000;//(DLB=1)+ N7 D' c; h1 o, _" V6 r, Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* \& `8 Y1 p& O: j' T" I4 |1 B
  temp = readl(IO_ADDRESS(SPCR_ADDR));8 A9 b" Q) ~) M/ d4 a
  printk("temp=%x\n",temp);
: l, z; L% s; k! V1 w
" c9 S; C8 W. u% Y+ v3 e8 u   //PCR Register
* a( f( @$ Q" \6 M( J* Z1 w+ q8 ?   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 r! `( m4 n  K$ h0 C0 [) x
  // temp = 0x00000F0F;
1 Q2 ^* H1 L% ?& [9 B" [0 j  temp = 0x00000B0F;3 ], i0 w) h8 F% }$ {* t4 m
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 2 B$ F& D; _4 F; D! ?& X
  temp = readl(IO_ADDRESS(PCR_ADDR));
& `6 T9 m; ^" M( S: f& ^  printk("temp=%x\n",temp);    M0 H  Q' _1 x2 Z, H
   //SRGR Register; f/ |, P1 d* P' }* h' W- B6 k
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( [! S+ B5 y/ S2 M //temp = 0x301F000B;
4 f; D! c( o- P/ k$ a+ m& c* r   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) ?4 A: ~  ^' z) K
  temp = readl(IO_ADDRESS(SRGR_ADDR));: Y+ i% \2 K. a$ {/ H
  printk("temp=%x\n",temp);
& Z3 j- s" X1 x$ q5 Q   //RCR
" Z! _! V; R/ U: @+ ~8 C+ q/ M8 o   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& ]: d) _# R. X
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! j; g9 n8 B# E
   temp = 0x00440040;
. ^5 U) |- {/ R) ^: M+ A   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) m% c6 ~3 _  V' h) ]5 |/ q% M+ m
   temp = readl(IO_ADDRESS(RCR_ADDR));
' }4 u6 A( c) t2 C- Q+ {   printk("temp=%x\n",temp);
5 i8 _0 B( R# _) E$ {   //XCR" w1 `% _/ z  f2 I  X$ l
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" ?/ S2 ]% R2 ^1 s. y1 c: _
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-04 {* @* z! ~. r5 O: s+ {/ k
   temp = 0x00440040;
0 F% k& t1 G( V/ S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   7 J. G! k- C0 ~% A* i; v6 v% y+ W. J& L
   temp = readl(IO_ADDRESS(XCR_ADDR));( B8 i- W' T+ S. V4 C$ _
   printk("temp=%x\n",temp);3 o5 z+ Y/ l+ B4 |3 e& a
  udelay(100);! @/ P7 x0 \% [, p! Z
  //SPCR Register
2 P) {* V$ l# _' a0 e/ s- \  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ |& u- F4 T+ `9 }8 [1 `# Z% c  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. J% b  a1 A7 O8 h
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled2 o  Y( L: _7 ?9 b5 q6 r9 c! A$ b& W# S
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( N4 o* S) k6 E: ?  printk("temp=%x\n",temp);
& @% M7 w$ N$ }8 P  udelay(100);9 v- a, y7 Z3 w* l5 ~  p# f
0 y9 H. S) r/ d/ S
  //set GPIO direction
/ g" G7 o. k! [: P( s% `% [# f5 ~3 b   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 d6 q, o7 Q3 c8 \2 b9 N   temp = temp | 0x00000100;//EPR----input
# K8 G- I8 }. F, ]* e   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ V9 F4 k/ B7 M) r% e; T   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
% R3 r, I4 ]5 H! h0 x! B* }  B3 w # D- F& Y( i' e/ C+ \( B
   return 0;
0 V, p% m, F/ }! D: J- \}# H5 j# l" y/ S+ p# P, w
static void __exit MCBSP_exit(void); _9 u& i" ?6 L1 K7 O# C/ Y9 b
{6 W+ V% D) b9 e' n! _
   printk("mcbsp chrdev exit!\n");
9 D5 W1 [" O  }: t3 s5 {   cdev_del(mcbsp_cdev);* B6 O' n& Q7 F6 W8 t+ W8 F
   unregister_chrdev_region(mcbsp_dev,count);- A! I- P/ @6 c" z- P, `
   device_destroy(mcbsp_class,mcbsp_dev);5 T7 x8 N5 O6 g6 [' ?& M. L
   class_destroy(mcbsp_class);
' e" D2 e8 V7 ?7 F8 i6 N}. p$ [2 @- M+ U1 U. q( h
module_init(MCBSP_init);' a9 R. a6 h7 ]7 ~; u  ~: D7 C
module_exit(MCBSP_exit);
! R5 R* g& s( n3 E9 E3 a" z. g" l) f# K
! t& ?5 Q; p3 O6 `. R* a# yMODULE_LICENSE("GPL");
3 O0 D8 }! M4 V! g; q
* l' b' o  N8 G  z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 f$ @9 S4 ~2 I  s2 Z: ]我的应用层的测试程序如下2 S5 q9 M, S* O, y+ t
#include <stdio.h>
( V) s, Q6 Q1 Q- P; x#include <string.h>; F7 V, r6 c& C2 y) [- J* y( [
#include <fcntl.h>+ L: T$ v- x, h
#include <unistd.h>9 ]9 O% |6 z; S6 W
#include <signal.h>
% `  Z) f" K8 ~#include <pthread.h>       //线程9 D9 q* a, C# J: q
#include <stdlib.h>
" s' t+ A2 s- K+ A- L7 T#include <pcap.h>          //捕获网口数据# T1 K4 l4 B5 d: u. ^- h4 Z- R
#include <semaphore.h>     //信号
* {4 e; e* W. U  [. i- ]4 {#include <sys/types.h>     //消息对列7 L& @* B: ?5 |9 }, E: d
#include <sys/ipc.h>       //消息队列
6 l* p; _( g! n#include <sys/msg.h>       //消息队列
$ @' G- p+ s9 o5 P2 }2 U% c  R#include <sys/select.h>  W5 s4 l- ]6 f% f4 |( k
#include <sys/syscall.h>( w1 C' j8 v, K6 A5 K% g- e) {2 C
#include <sys/stat.h>$ |5 A3 w$ G0 ^  }" L
#include <sys/mman.h>% C6 ?* T0 j/ |% ]% e5 y  a% D
#define msleep(x) usleep(1000*x)  h9 B( V: w- K; @* x# Y

6 P# c/ A! H% M& Jint main()2 p+ F! P+ }, S* B& Y! x1 w
{ % V" [4 }3 ^. k+ c3 r/ N
    //MCBSP,ARM与AMBE2000交互设备4 [* V1 M: S) J1 m7 P# S, h
int fd;
9 |  b8 u1 V9 G8 @ unsigned short data_write = 0x5555;
" ~6 t+ R% Z. f1 U5 P unsigned short data_read = 0x00;5 e" ]: U" y7 q( F! r6 Y
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 K: k, ^) ~2 ~) }, F# p+ \
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# A! O9 o9 B0 O: I' ]. ^( k1 t    : w7 b! v8 A- l
  if(fd < 0)! i: U$ l" m0 y! t" N9 }
  {" M- C3 L% ~& b4 h9 S6 i
     perror("open failed\n");
0 k1 [7 C" j; {9 J     return -1;
  j# q3 V$ ?: ~) r/ {  }8 O: E' G8 I. i: T- u1 Y9 t" q) O0 z
    R. p0 u4 Y' M- n5 H2 q  c; ^6 A- K1 N
  while(1)
! `& [& I- y7 i  {
+ L$ ?; a- F4 T/ M   : e0 @0 E1 u, i. T
   //AMBE2000每次读写是24个字为一帧3 r0 f$ R- ~/ K  ~
   //写数据时将数据在底层存储起来,等到中断的时候再发送
  Z" u7 X4 g6 Z  Q4 X   //AMBE2000输入数据是以0x13EC开头的" A5 X- C6 _7 c6 M1 E
   write(fd,&data_write,sizeof(unsigned short));( w& {) d6 ]6 B$ h% M" X1 t
   
4 U$ k9 n: \4 P4 m   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  " r& [; {5 k1 ~# M. }: B8 Y& }
   read(fd,&data_read,sizeof(unsigned short));! k# I; P& L8 e; U. t
   ; ^/ Q7 o" z9 [' M" ~- G
   if(data_read == 0x13Ec)
* H% R- f% t4 j9 f. d   {( q6 k2 Q- v( y; o) B
   
# j' {. w1 G8 C+ N5 J1 B8 M! g    printf("data_read = %x\n",data_read);+ f& j) d  t6 L. m" |8 N+ I
   }
8 A) r' `+ `. s# t0 L, G* X  i   2 q/ I" J3 a+ M  p9 S: J
   msleep(10);$ U  I3 j. e$ k; j
  $ d, F1 }0 T, D, @3 s( P4 \
  /*4 p1 a1 q7 ]' R) l
   ioctl(fd,1);   * h) }2 v: s4 o4 P' h
sleep(1);* Q, e! P, y5 c3 m  z
ioctl(fd,0);
/ m2 R8 ^: ~3 }- T7 X* s; u" z8 H sleep(1);
$ u. \2 H, ~+ O$ B( S */
9 f4 E; E+ N' t  }   ! h( ~" r% Y, q( d* [* `4 v& y9 V
return 0;! u. e+ ?. J8 J

7 C$ E3 [1 D9 C& E}
# Z& }# m3 k6 Z, j7 d% u
7 C' r7 Z0 A7 w. u0 _3 j# x多谢各位指教,谢谢! 急# G: E* L/ m, \4 T* k

9 @# o! M. a& M7 e4 y  j. O6 F' V6 x' I, [! x

4 @  ~. V: H: \. G4 D7 n
' `$ [" Z" B0 L" K. V" r
+ w$ r7 b" t. q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 07:30 , Processed in 0.061268 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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