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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" b: J$ ^, \2 `: V$ ?6 K; Q/*
( W3 ?" |, h0 R* D * Copyright (C) 2009 Texas Instruments Inc& {8 f& |/ T* U
*" Z6 s) V: y( ?$ J3 m! i0 @0 D. N
* This program is free software; you can redistribute it and/or modify
$ s3 N8 J5 T4 T% A4 q+ K * it under the terms of the GNU General Public License as published by* B$ G6 E8 b! a: P+ f' s( \
* the Free Software Foundation; either version 2 of the License, or# ], m3 W! g4 v0 _  [  }3 G
* (at your option)any later version.
$ D1 P0 ~5 L  Y0 N, | *
6 D' W3 p9 @6 w" R) Z- g- [% K( o! B8 ? * This program is distributed in the hope that it will be useful,: S9 h$ v, ~$ U# W$ w
* but WITHOUT ANY WARRANTY; without even the implied warranty of
# u; }& A1 l; J1 Z7 K0 c$ Z$ u- j * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 K8 w8 D! `# U7 O3 I& d * GNU General Public License for more details.
. p9 J6 S6 l- I: t *
& ^" h1 [; E$ m/ {& E$ G; e' t% d * You should have received a copy of the GNU General Public License
  Y' ~8 M( `; z& _) T# m+ W; N * along with this program; if not, write to the Free Software
( |' m$ ~0 A0 i! B1 I$ s* A; e * Foundati
; q: T, ^3 P% v$ O*/# Y0 Z1 D9 K+ O
#include <linux/module.h>
1 b/ D% v+ F. l#include <linux/init.h>
8 g: A6 \9 M' w- R/ P& t+ r% S#include <linux/errno.h>
; q7 Q2 K3 ^+ E# i* W#include <linux/types.h>
  K0 r) Y/ a7 ^& ^, g; W# J# u" v#include <linux/interrupt.h>  u$ }, m( b3 d* j
#include <linux/io.h>
- f; d; ~" |2 t#include <linux/sysctl.h>8 H" o/ ^; q7 e
#include <linux/mm.h>2 l  q2 b  a! n; Z3 K1 y
#include <linux/delay.h>
) O' \- Q, a3 q  |6 H, Y#include<linux/kernel.h>2 p3 B  n9 Y, w6 _  \, Y
#include<linux/fs.h>5 r0 p4 C9 U0 ]7 h; S3 t' w- V# ?
#include<linux/ioctl.h>7 a$ B) I" v- ], {2 L
#include<linux/cdev.h>
5 u3 L& b6 D7 U9 i; ?" `4 f7 ~#include<linux/kdev_t.h>7 S) X0 f9 V9 O+ C+ p! r
#include<linux/gpio.h>! O) b6 S; N/ Z- `+ z6 T$ j
#include <mach/hardware.h>
- @; {7 L* q& o6 G) o: D4 v: y2 a#include <mach/irqs.h>* z! ~, ]+ P8 V; Z. a$ ~' z! |
2 y. K0 z% ^4 B, a9 U) ^" i
#include <asm/mach-types.h>
% m& [% L* q7 w* L#include <asm/mach/arch.h>
0 Z" N, W2 K7 d( s1 v& p) D#include <mach/da8xx.h>
5 c; E) B) h7 ?( b# n3 s. E" e#define  SYSCFG_BASE   0x01c14000
3 X7 u7 z" g. O  F#define  PINMUX1_OFFSET   0x124 # E" y. m% [3 J" A# m, B8 r- h
#define  PINMUX18_OFFSET  0x168 " {2 J5 r9 E: U& o4 [
#define  PINMUX19_OFFSET  0x16c
) p% d$ b) m9 @4 m' f1 z* m#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: S: N4 |  d$ L
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR- z( Y6 ]8 }0 ~* _  K
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 H$ r  h2 L8 v* I- y
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 O  U* P$ o% g- G, M2 @3 y) [#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
3 o, l' {. \) J* a" j( {                            0 N% A+ k. k6 g& j. y, t
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* g/ u) }9 B6 _9 g#define DRR_ADDR      0x01D11000  //MCBSP1_DRR/ D! U9 h7 w6 s  _
//PSC
' @* z! N. s5 n* {6 Y3 `% Y#define  PTCMD_ADDR   0x01E27120  % [5 K& B3 y8 ~9 C9 K" z6 _% ]4 }
#define  MDCTL15_ADDR 0x01E27A3C" h7 i/ C6 X2 k6 ?
#define  PDCTL1_ADDR  0x01E27304% ?; `  F9 T# c8 o' ~; H
//GPIO8 direction
  v8 D) |4 }1 i% b# P4 }#define GPIO8_DIRECT  0x01E260B0/ O( a4 X! C( ^" C
#define GPIO8_OUT     0x01E260B4
2 V" @$ o; t/ }#define GPIO8_IN     0x01E260C02 n! L- K: H7 D5 f" q, p+ Y
) X' f. k+ ], ~5 N
//#define MCBSP1_RINT    99              
9 `' W) N: p8 r( ?, x1 O2 u; P//#define MCBSP1_XINT    100  * d# O  S$ v: C% e8 w6 k
static int MCBSP_MAJOR=239;
" I8 C9 U, w% y" Ustatic int MCBSP_MINOR=0;
" }% @0 V) x5 i# l1 ~* \8 ^static int count =1;
1 x9 J2 f8 E  s; `4 {& F- p7 x1 S" g' q1 w! O2 X
#define MCBSP_NAME  "MCBSP-device"
  J7 W# S: O8 e; v9 Z5 m* U8 O
) J/ B5 t! H0 g2 M( ]) tstatic struct cdev *mcbsp_cdev;: q* L: V. Y+ Z* r2 m) e& V; X
static struct class *mcbsp_class;$ }9 m; n( c/ @( c' ?# b; ~; r
static dev_t mcbsp_dev;9 A. A# R( e( k5 f5 [7 G
unsigned int DRR_data;& g- c; i; _4 x# V- i& n- i) w/ N# \: h4 s8 C
unsigned int DXR_data;4 G1 \, u& |- r1 u
static int mcbsp_open(struct inode *inode,struct file *file)
( z! J( H3 S" ?! `; v: \4 w{' g) y& j' F) [, ]
   : ]2 z9 p; l: R
   //interrupt enable,initialized
4 [) {# e0 t( e1 {& P! t   unsigned int temp;
4 E. v" }1 ~. P: J% O" D! u   //SLEEP_EN(GPIO8[10])---0% i+ w8 w5 u# L+ ]7 r
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 n1 L  ?* V% n" A- f7 F
   temp=temp&(~0x00000400);
( O" A/ Z" c- L8 X   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, u% t. p0 q4 W3 k" `  //RESETn(GPIO8[8])----0----1
* \* M$ x5 `6 L) C6 k   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: j( [5 n- W+ A: s1 ~! W   temp=temp&(~0x00000100);
, u2 ~7 M& i1 w+ {/ X   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 q2 W* N# h) @7 {) t/ f  U   udelay(100);" [) N9 ]9 A: g, Y3 G
   temp=temp| 0x00000100;
! m% x/ L8 M, o/ _  E! ]7 Q   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 b! A3 d' \- T   udelay(100);
2 _$ l& l! e: Z. P+ X! W* q. T( x   printk("open success!\n");! e2 d5 y$ @3 V) g
   return 0;
$ o3 S) c' |- }* R2 @, j2 T6 ]( H4 T- h}
9 r3 ^) I# G% P2 X, h# z5 ?4 B
* ^6 y. s; {0 _: tstatic int mcbsp_release(struct inode *inode,struct file *file)- [1 y0 C* y+ M, N6 d$ o( J( i1 I
{
( B; i! q: }' y1 v$ B6 w) Y. H9 L   printk("release success!\n");
' {5 E2 ]: `* q. u; F2 C" [" k& |. ~8 s   return 0;
! }5 m' g6 U  P  f}0 Y& u- u0 j# b" O

  L$ b' E0 t. m$ N9 ^( wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' K: _7 D$ Y# M' U1 _; a
{4 k6 ]. ~& m: S# G0 i, V
    copy_from_user(&DXR_data,buf,len);
/ X' K& W  p. D9 m. M7 a9 r    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 g# Q9 V2 Y4 t' o" T* p" y    return 0;( X, B, R8 v" ^* J& L

$ p- a# @: w5 `8 U8 T' c4 T}  N4 w# K- I$ r4 z7 Q! d* ^8 I

' v/ B9 I6 G) I# x+ Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' i) P) X6 F: E# B7 e{
5 B2 C" \, @3 w1 ]1 ~- U4 n   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% i  f+ ^# M( T) J0 }; J& p   copy_to_user(buf,&DRR_data,len); 3 ~- M0 G. a; r  g6 A
   return 0;; p  D4 b7 O4 `% o
}
* d2 ]+ C+ ~" U7 P4 l  e
" K" z! h' R  B" n; Q/ Y; Y
/ G( S9 p5 ^* `% T( _% w. V" _static struct  file_operations mcbsp_fops=
' j& p6 \5 i$ g& I/ @) l{
. f5 o1 a* B! }1 d% p9 {* K3 Q9 x   .owner=THIS_MODULE,
0 G+ X: K* I8 X0 e" c   .open=mcbsp_open,3 {+ }6 g7 U+ [8 Y7 o8 n
   .release=mcbsp_release,5 n3 O1 ?" L" T  e, t
   .write=mcbsp_write,
# v3 @* y- T* f* K  W   .read=mcbsp_read,5 H3 Z8 |. \7 G' Z8 z" m! w2 }9 I
};
4 _) V) p% y1 A* n/ W% pstatic int __init MCBSP_init(void)/ U0 I/ `3 c7 a" g/ H
{
: x3 j- L, W9 N1 C# N! L7 v4 s0 k) G+ {   int ret;
! {0 M1 ^/ ^2 O9 j$ N9 [0 Q; i   unsigned  int   PINMUX1_REG_old;
5 j: S  p; X2 n+ t% d% K$ l   unsigned  int   PINMUX18_REG_old;% @7 K4 w% y! p) N
   unsigned  int   PINMUX19_REG_old;# g# o& U" E5 d8 w4 ^- t
   unsigned  int   temp;  
' p- q  w, C* S" O8 Q   if(MCBSP_MAJOR)1 f4 W, o: g3 t' E: G
   {
, k% P, t7 N( x$ O) z+ f8 O6 m      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- X- _+ [* W5 d* @& r3 K
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: |7 Y% L4 g. j$ P1 k4 O& V
   }
1 ^: W: S9 J# d* j' _   else
/ r+ T4 Y. k/ c, p' M   {8 Y3 w5 u; t/ P, Q- ?9 R  A& S' o. q
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 a- r% s% z: h5 W- W4 C; M      MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 N$ N4 Q9 E# x, M) ~   }
4 a& z/ ]( l$ z8 h7 |& `& f3 p   ( C4 O! w$ \6 u+ P% |! v
   if(ret<0)
2 M4 B9 G& S  C1 h+ J& V, m   {
7 ]& ~: a3 I! r; _' u      printk(KERN_ERR "register chrdev fail!");- R: s/ [$ y( D( b1 W
      return -1;( P' w% @2 V& V) l
   }
/ B; Y+ f$ r  I3 s  y+ Y8 j. A( g   
; |$ K$ _0 Y. t2 F- }$ [   mcbsp_cdev=cdev_alloc();7 K4 p. c2 f8 X& l
   3 Q. u/ u9 P2 [5 t9 D  q8 E9 v
   if(mcbsp_cdev!=NULL)
6 g8 s# K# i; P2 T) X4 @   {
! e, @1 |$ S) G' W, |      cdev_init(mcbsp_cdev,&mcbsp_fops);% B0 @1 f5 b* H- k& x2 w5 N
      mcbsp_cdev->ops=&mcbsp_fops;
2 s3 e7 f3 r) Z0 E- Y      mcbsp_cdev->owner=THIS_MODULE;- j9 \3 G; N3 N! y$ w3 X
      $ U3 l1 S. x* J
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
9 L+ X: K: ]' N! ^          printk(KERN_ERR "register cdev fail!");" A6 A/ e; e4 \8 T" c6 v# E9 h% ?
      else% R- K9 R+ m! s# D- N
          printk(KERN_ERR "register success!\n");
1 L. b, B' ]2 g9 ]) U   }
/ N  {) k0 v* u8 x6 Z   else
' Q7 z: C& K( R0 c) U5 ~; P   {5 T6 i6 A( G9 \  u; \- G0 i3 R5 m: L
      printk(KERN_ERR "register cdev err!");
" d3 Y6 c8 Y4 y! W$ k! c2 y      return -1;. V" p( d7 t) g. A$ N0 ]
   }, h4 [+ b# Y' G
     O8 X3 F7 G7 L( ^5 d2 ^: F
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. @4 y5 q3 U1 F4 X
   if(IS_ERR(mcbsp_class))# n: E8 \- Z& L/ n9 |+ L
   {
+ L; Y: c! l8 G: v  h; R, V      printk(KERN_ERR "register class err!");
5 K, }; g6 Z6 M) c- \& h( `   return -1;0 I3 K: C% ?* H3 d$ `
   }
0 ?$ [$ t7 |( }& s, N+ P; Q   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ d! h; J$ n7 Z6 a1 {! L  h# }/ |+ I' e. T; B6 I' b1 a
   //PSC
. L% J4 z" t( Y3 t   //add Enable MCBSP
8 U; z" \) Y" a+ A9 o   //test& @, ]7 J0 A# y+ g. T0 ^: R3 T6 o( G
   temp = 0x80000003;
0 C1 z4 J9 J- @% l9 C5 _   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 l& b1 b- R' O4 I- X2 }   temp = 0x00000003;
$ }* @( B7 B+ I   writel(temp, IO_ADDRESS(PTCMD_ADDR));3 ?0 r% a% N8 W
  W" v3 A) V. S+ L' n+ V( ?8 [9 X
   temp = 0x001FF201;$ k$ G9 j) {9 l: G% ^
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));( k* G) V( s7 f5 u  C
   
3 ]1 L% v# k5 f4 z0 ?" i   //PINMUX  " s5 k  P* R5 s  `! p, m0 B4 t
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" k; t# m' D) L. S   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; h& X% T! F9 Z7 [/ p   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
5 z) K- G* S% T! E7 f- V   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 B! z5 P$ H- U
   
' Q& \2 e" {" F* {7 C1 Z   //SLEEP_EN,EPR,L138_SHK1,L138_RC
) f0 {9 V) @+ [5 R4 F8 H5 s   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 C) L4 x7 v' e5 }: ]
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & W, a2 V& K* y% X. `8 P- z
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 @; ]3 e+ Q/ J2 I3 Y& [
0 ^* E. j' [' i: m% o   //RESETn,L138_SHK2
+ W+ U( O* p' I" R   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 X3 v  A3 ?5 [$ S& S   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
% h% g6 p7 L! \' w3 q   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& B5 j; _8 V: C( d- w

# p; k# V' Y4 d3 K - D) h+ \6 A, v/ n6 g
  //SPCR Register
5 `0 t6 [  O0 z; `* I" f9 t  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset3 q' y* {* |8 T8 j
  temp = 0x03000000;//(DLB=0)8 M4 l+ @! j+ J4 Y; i
// temp = 0x03008000;//(DLB=1). c. p$ L; \" I$ {) E5 L4 c
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
, i9 L- S) n  x  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ A. g- r: z; M  printk("temp=%x\n",temp);
/ T( _, Z9 U! w' x2 M. D( E' ? 0 n3 z: ?) h2 {
   //PCR Register
0 L' x4 I7 ^& a! B   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0( r: ]+ c% B) v; ?
  // temp = 0x00000F0F;
  Y* ?5 I. X' |: ~' \" a  S  temp = 0x00000B0F;
  R/ {/ R# h- l! o+ O  V) y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
% Y5 ?" ]& \% M# [6 Q+ f1 [  temp = readl(IO_ADDRESS(PCR_ADDR));
( A/ s0 w+ v3 ~/ }1 ~; W6 S0 o  printk("temp=%x\n",temp);  8 m$ N+ w, m( b, g. x' s+ N3 r
   //SRGR Register; G7 }3 U; n# \( T
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 V2 |9 O4 z5 R; z) F
//temp = 0x301F000B;8 y2 u% M9 `+ ]5 k) Y
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized * L' H$ g+ y, @& {0 a- r) |
  temp = readl(IO_ADDRESS(SRGR_ADDR));1 F& C! k) n4 ~3 O3 @( }, C
  printk("temp=%x\n",temp);
8 N  ~/ }' ~5 w6 [( j8 Q& W1 L1 R+ }   //RCR. k8 W* M) J* ~" K2 U
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& a! F; B4 p2 e; G. m7 G
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
0 K9 Y0 ~- m: j   temp = 0x00440040;. v: t" E8 Z: ~* O
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   " e$ ]" k. W! @3 Y* N/ y* e7 t
   temp = readl(IO_ADDRESS(RCR_ADDR));) ]3 y3 x+ w/ v/ ~" j
   printk("temp=%x\n",temp);; `, j  n' c3 r: C
   //XCR& v2 `( D, v4 l& b2 m! J; S3 _, d6 e
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" {5 k' I6 k' ~+ i/ H3 _: X1 b   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& S3 i) M$ a# m- B, D" x   temp = 0x00440040;
' y4 [5 [2 e/ u. f   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
4 W' f8 `! X2 O& v4 {   temp = readl(IO_ADDRESS(XCR_ADDR));) q& m: j/ T! I2 _+ C  ~% K# x
   printk("temp=%x\n",temp);
! d% S$ D7 p/ s  udelay(100);
+ j- g/ \  C0 _" v' S  //SPCR Register
, R0 L. Q9 O9 A! O6 P  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ |+ y. W& G- F! K5 F  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" [% c3 v( o; z  `* o- s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" C# D+ j. r8 e: p( z5 [
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, \4 T; ?& _0 E7 b# ^3 L8 X/ U  printk("temp=%x\n",temp);' O! O4 L: h0 Y" m1 `) u
  udelay(100);. F/ ^' |4 b6 l1 ^2 O! x  j6 C
6 Z$ M* U5 E' @+ V0 X- U! f
  //set GPIO direction" a1 f, T8 j$ h) t$ C
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: y6 G' ]! Q' x$ F   temp = temp | 0x00000100;//EPR----input( q7 r8 v0 v- m* a
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. d6 i" z/ p' ^: _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . c$ q, ~" U7 a2 n. c/ `3 k

" \0 w5 o) p9 d. |/ v$ P2 Z   return 0;( }+ n6 Z/ L: Q, h! L1 F
}
- T" U; O* u, b! X# ostatic void __exit MCBSP_exit(void)7 D9 H, T( c  \0 a% |" s! y
{
" ^6 I1 l2 e. B3 S: n   printk("mcbsp chrdev exit!\n");2 O2 o# o3 {" v, F
   cdev_del(mcbsp_cdev);& _3 W+ j8 S3 a* O8 T$ v
   unregister_chrdev_region(mcbsp_dev,count);
1 ^+ M1 ?5 k+ W- g! N: _  X5 Y   device_destroy(mcbsp_class,mcbsp_dev);
/ X! D" v. o9 j, R( w   class_destroy(mcbsp_class);) v4 c4 F4 d; b- o- Z2 \
}. Z9 @( d* `8 J5 t, Y( E! G3 t7 R! P
module_init(MCBSP_init);
* P: b+ x2 W7 cmodule_exit(MCBSP_exit);. n3 S0 E3 R. H0 P' M) E
3 @) B- y' p! s+ e! V
MODULE_LICENSE("GPL");
8 D# L2 H( v! m9 ]) a7 ~
- q- n" f# P0 b/ j我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; Y0 }% z- g% A% E; C& i; A' k
我的应用层的测试程序如下
2 t! j8 k/ @1 V2 t$ n#include <stdio.h>
  M8 a; N+ B, `#include <string.h># G* I7 L: h  y2 v. ?% o
#include <fcntl.h>
0 y+ V  c9 ?1 M$ e: H#include <unistd.h>
' Y- S: b$ v# ]. r* ^# S#include <signal.h>
8 B7 e0 _- G- b. I9 {#include <pthread.h>       //线程
9 R3 l- t6 F. d9 r+ Q1 D/ D#include <stdlib.h>+ d9 q& p4 @6 ~9 K& e  L3 h+ l
#include <pcap.h>          //捕获网口数据2 m4 j& r4 f3 }  K1 J' j
#include <semaphore.h>     //信号
+ s! G. z  o# o; c: D/ }: D#include <sys/types.h>     //消息对列" S) R- A6 |: w# T9 v% y
#include <sys/ipc.h>       //消息队列
$ l* k$ E4 N; m) q9 H#include <sys/msg.h>       //消息队列
6 U- a& I1 E. n7 z8 H#include <sys/select.h>7 g* K, i9 Z; v. u3 J# a6 A  d
#include <sys/syscall.h>
9 P9 A: Z, f4 p4 B% R#include <sys/stat.h>
: M: _* \9 T: C  m7 @3 H#include <sys/mman.h>- a8 U9 e! f! M  j
#define msleep(x) usleep(1000*x)! Q9 I" c) f' ]* g3 u3 ~8 }+ ~
# ~' \  U5 L- @/ ^$ K" d! `
int main()
1 J& V9 V6 s6 o" c1 t# C  U  [{
* [  m8 P" Y- j  i) e; D7 E    //MCBSP,ARM与AMBE2000交互设备
, Z  Q, A. z' k. O% _7 V. c' R6 K+ G# j+ S int fd;+ W( t* c/ Q2 U0 `, Q4 @
unsigned short data_write = 0x5555;- z+ k7 z+ r" z! @6 m+ k2 G7 C
unsigned short data_read = 0x00;
/ J& A" h* \' I$ a; i4 L3 u' D  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* v& b6 Y! M! j* c" Z. W" J: q //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, ?5 w8 |7 N3 F4 Y* O5 L/ i/ x4 e+ Z
    ; u' m, D1 k! e9 f+ m% E, w
  if(fd < 0)+ F# X. C/ L7 h% \9 F0 B3 Z
  {. y+ g. f, a5 {
     perror("open failed\n");  p* ?; d0 p; O4 r
     return -1;
) A! T4 d/ s6 i7 |$ ~, g1 v  }) g* S  V( D' K* w9 Y0 I3 j4 K( v
  " M8 t9 A& [  n% I  u
  while(1): K7 K; _, R) A0 B
  {9 v# O7 A" e0 |9 E- v
   
  k8 v) B' W! c   //AMBE2000每次读写是24个字为一帧% t$ p2 v4 m& @4 J4 d/ r
   //写数据时将数据在底层存储起来,等到中断的时候再发送* K2 \0 ?  F! r7 F/ `1 A9 m5 u6 p
   //AMBE2000输入数据是以0x13EC开头的3 ~' r3 e+ W4 R4 y8 v7 L6 n3 a
   write(fd,&data_write,sizeof(unsigned short));
5 f- f9 j+ ]2 k5 h; A3 f   3 r7 o% @+ {3 g% W- D
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & c5 t2 S* S1 V/ y+ ]  K, _
   read(fd,&data_read,sizeof(unsigned short));
5 t* r' e9 h0 ^8 E" O   
' S  M, m. L7 @& S; z; ~4 }   if(data_read == 0x13Ec)5 W' k( u$ f# ?9 l
   {' H, _) X3 U5 C8 G% d$ n
   / E. y/ l9 ~% M% |* ~, r
    printf("data_read = %x\n",data_read);! t0 [! Q+ w3 f2 v
   }
3 G" E# C0 n5 r" D; D   ( _" a2 a$ ?" u5 Q. }2 T' k  U
   msleep(10);
* e! W- w* z& w  
, r9 }5 b' \4 t  /*) t) Y" q4 j2 {$ c- U$ z! I% V- Y
   ioctl(fd,1);   
2 o% q- k6 f' r2 s' B) P sleep(1);
# [$ F9 H* U4 d- G5 s# A ioctl(fd,0);
) E5 O2 b, y7 I sleep(1);
5 K- e. N* i: I) ? */ 7 G0 `1 \2 h" c1 v/ C
  }   4 X8 o% V  i. m9 a  ~# W9 ^$ _
return 0;
* K8 ?1 P4 d* L* ^  {: ^: O6 V9 k4 r; _
8 N% j' w- m$ k' p0 `7 @}) r$ {  Z! X3 m. a& |

; L; }- I7 R6 F) x9 N$ ?! N" t多谢各位指教,谢谢! 急9 J  C1 ?. `$ h
  D9 }5 T8 K7 l6 A8 d+ Q
6 L  }) P* z. x( l' |8 W

  U% ?% B5 G/ s6 A2 E8 |
- p# j( _. n2 u; G6 W6 a& y$ ^  o* f) c1 g3 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 12:56 , Processed in 0.048987 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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