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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:   l2 ?' M$ M' k4 y% X; ]
/*
4 j8 U) X) _% H. h * Copyright (C) 2009 Texas Instruments Inc( q# I7 E: h# P1 U$ q) G
*6 V1 ^/ k2 j0 \7 K3 @8 G
* This program is free software; you can redistribute it and/or modify
! @% Z7 N/ q4 n* o% E& T * it under the terms of the GNU General Public License as published by
) `% G  M/ e: I1 Z. D( |8 z * the Free Software Foundation; either version 2 of the License, or5 t7 Y6 _" }" l' }! q' m* q+ I
* (at your option)any later version.6 \7 M$ e5 x/ X% A$ A6 o
*2 E5 l3 O% a7 N
* This program is distributed in the hope that it will be useful,5 ^5 u* P3 G& }; I. o/ O1 {
* but WITHOUT ANY WARRANTY; without even the implied warranty of, l' k! ]* Z8 J9 k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 t7 f8 {2 k$ z9 M' @
* GNU General Public License for more details.
. \4 l* Q# m! O5 a# x/ w; | */ C" c+ o9 q6 U; X- |9 B
* You should have received a copy of the GNU General Public License6 y) I# H" T) H% @. W; M! h8 Z
* along with this program; if not, write to the Free Software
" t5 |& O2 c$ m8 O) a( ] * Foundati
6 i! }; b9 x, }& t*/
- b+ d. B! ?- V6 B( P4 ?#include <linux/module.h>
& _6 v. q% w( D0 k#include <linux/init.h>8 ~/ X+ D0 o! g% U% h
#include <linux/errno.h>
: |8 T. A% Q5 b; o#include <linux/types.h>% j+ `' V8 B7 ]9 N9 g# n! e
#include <linux/interrupt.h>
0 [" W8 `% o( W#include <linux/io.h>5 B2 y" Y4 K7 V+ x# N3 m" M
#include <linux/sysctl.h>% H( g; _+ G" Q
#include <linux/mm.h>( w, K  J$ ?1 p* K- k: t* R! L
#include <linux/delay.h>
  ^- N$ h# {1 V#include<linux/kernel.h>
. ~+ I+ g% o% Z# w3 z#include<linux/fs.h>
/ b7 I" ~5 R4 _; c, ~0 i#include<linux/ioctl.h>
& N7 X$ u& E/ Z( T#include<linux/cdev.h>1 y2 l) R& H. r
#include<linux/kdev_t.h>0 ?+ `9 o( k$ S# v: C
#include<linux/gpio.h>
2 j0 U- X  P# y, s' d+ p#include <mach/hardware.h>
; r+ H9 W3 D# [4 N#include <mach/irqs.h>4 l, w$ B2 P( W! A

) L% l- h* L4 a& T1 a* r#include <asm/mach-types.h>  Q3 T! \5 N- L0 ^9 _
#include <asm/mach/arch.h>, u$ y7 z3 V4 J6 K. x) S
#include <mach/da8xx.h>: d9 o' \. t* a3 m9 b0 a: G( r
#define  SYSCFG_BASE   0x01c14000
: {6 b& H$ V1 s#define  PINMUX1_OFFSET   0x124
" ?2 s1 A- u- u* x: E#define  PINMUX18_OFFSET  0x168
$ h& P5 b6 b  l! m% b1 ]6 [, @#define  PINMUX19_OFFSET  0x16c
6 |6 u; e0 P0 S' Z) E/ N+ m7 N#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 g( J, [8 j; W! {
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
1 M, R) @) z6 y- H% S7 M#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
. x% }0 h! H1 ~! g0 C* i* r#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
: U: c. C! z% U1 |) S8 e9 K* h$ V#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR" e& I1 O2 w' o5 F. L2 v
                           
& n! K2 I) p) r7 S1 D: J#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
9 G/ [- ~7 F/ N0 _5 z# B#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
- ~1 y' W. I& R9 V0 G//PSC
, K# q2 L  D' Y#define  PTCMD_ADDR   0x01E27120  
- ^% m3 u$ {3 s#define  MDCTL15_ADDR 0x01E27A3C
* u6 ^  m9 H2 C# F2 U; A% f  u#define  PDCTL1_ADDR  0x01E27304
+ q9 N; Q( {* Z6 ?: b: a9 `//GPIO8 direction3 U% Y2 A% P9 b& y9 K
#define GPIO8_DIRECT  0x01E260B0
! T- b- C/ \! f0 {% q6 L#define GPIO8_OUT     0x01E260B43 [' J6 D. j! v4 ?7 a2 v0 V
#define GPIO8_IN     0x01E260C0
, o0 K, o0 e3 ^1 n
. y" s/ u8 |1 Q3 D- A1 |6 `$ f0 h9 Z//#define MCBSP1_RINT    99                q1 P% C6 y9 G* Y
//#define MCBSP1_XINT    100  
5 I0 w8 J/ \# B" `static int MCBSP_MAJOR=239;
( j2 `( Q/ D; X8 J5 O/ `; h# \, Istatic int MCBSP_MINOR=0;6 E9 q8 k+ K! y5 h2 e* A2 y
static int count =1;
5 ^$ W0 o7 \& G* Q8 F/ m. q7 |# ~" J
6 ^5 P) b) r7 c  \; K4 K( U#define MCBSP_NAME  "MCBSP-device"* |8 c, W5 P! @, Q

! _& {% x0 R5 R& \" qstatic struct cdev *mcbsp_cdev;
' f9 ^' R  s4 P1 Astatic struct class *mcbsp_class;2 e& I$ u5 A" e' E+ _
static dev_t mcbsp_dev;
4 }9 L: ~: t5 I8 Y2 O3 D: b7 Eunsigned int DRR_data;
$ b& D! a( X/ `7 ^unsigned int DXR_data;
5 I! e. p* i0 _  X$ Cstatic int mcbsp_open(struct inode *inode,struct file *file)) G; Y* D. J0 |( Y3 y. ^* k
{2 f& g3 P$ N, f5 u
   - x1 v5 [& S( ]0 {( |
   //interrupt enable,initialized+ J2 {6 P6 ^& E5 ^6 {  p- @
   unsigned int temp;6 k4 U0 y- j! Q
   //SLEEP_EN(GPIO8[10])---08 f& A6 J( H! N5 j6 h
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' s% b% ]! [! k; J( g4 T# e% ~' g   temp=temp&(~0x00000400);+ y' K; g0 `) e, W& Y/ P  W; d$ S" \
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' [0 S" w" [- R9 j6 j. o
  //RESETn(GPIO8[8])----0----1
1 @7 R& K7 }2 g- ]2 ]   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; x/ }  j* E" C, M* R) p   temp=temp&(~0x00000100);+ T3 b  {& x3 o; j9 z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0% h3 R, u/ \1 T
   udelay(100);! |5 r; r! `: {) J4 q. [
   temp=temp| 0x00000100;
" e/ R! Z3 s$ D5 H  _9 A9 A2 I2 t) L   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 b7 H2 b6 k1 ~% J' u& C0 H" M) q   udelay(100);8 f. g; E) v' x5 L8 v4 h% G7 i
   printk("open success!\n");
9 A/ h; e' t! M4 y  v   return 0;
8 c) [7 I+ C% v6 I2 U}" o( y, n1 E6 P1 t

0 [) H" A( ]' Z) F: c0 `/ tstatic int mcbsp_release(struct inode *inode,struct file *file)
. N% J" Z" R, E, V/ k8 C{
$ S  c0 `9 D# r/ L   printk("release success!\n");
$ x1 L) _1 d" N# S0 X0 d) G   return 0;8 @/ q. V5 ]4 F: s
}# y$ ^- H( M1 p" g

- D$ T) j# d: T8 t5 |# j1 ystatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: G4 N9 Z9 K3 Z- Q{
0 k. x8 ~7 `" L* d. N5 V8 r0 ^    copy_from_user(&DXR_data,buf,len);4 M+ F0 M" \$ p* G6 Y0 u6 {+ u
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       1 j6 ?& q% t; x7 A8 {
    return 0;
4 X# ?1 K. {$ H$ g% n. t! e
( G9 _9 Q7 S# L1 v6 f  u}2 A' ^4 \: a) J: E

2 U- O. K# D$ h8 ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 V, Y: @, C( s6 Z0 @{ , A: e2 c$ V" A; U
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 B7 Q  Y6 d( y3 C" ?+ B& R2 Q   copy_to_user(buf,&DRR_data,len); 1 K3 J% w0 h* \& E1 K5 T& n
   return 0;* q' |' F5 X1 i5 ?5 g' Y6 Q1 Y+ X
}; Q$ O3 ~. J" W
5 A9 a" q2 l6 B$ f7 m( _3 g
: g7 _% d- D% o: H8 X! L: F
static struct  file_operations mcbsp_fops=6 t! U" N* C9 q4 z* Z% K1 c: ~
{( B& L: C0 k! x; }' t1 T8 D0 f
   .owner=THIS_MODULE,! R8 ~6 ?; N! S$ P9 m4 e
   .open=mcbsp_open,
# l6 n. ^" ?9 O: H" L   .release=mcbsp_release,: r/ v& L' f& L+ \0 I  X- M
   .write=mcbsp_write,& P5 ^8 j5 Z( w; H# u8 l
   .read=mcbsp_read,4 g( }+ J+ H8 f) o! ~
};0 ]8 t( d# y; B5 P7 L* O. U
static int __init MCBSP_init(void); d/ X% @6 i, p7 f
{0 O: d: {5 _# p1 T0 ]- |" {
   int ret;
6 F* T9 k( N7 g* ~   unsigned  int   PINMUX1_REG_old;6 v, w4 F$ N/ D( `
   unsigned  int   PINMUX18_REG_old;
7 b( f" K, }* h: \   unsigned  int   PINMUX19_REG_old;& B/ |6 t8 l* z( i* R3 h3 S
   unsigned  int   temp;  ) d! j* p8 i# q- [
   if(MCBSP_MAJOR)3 W# `3 D* M& G+ a* J& D* s/ l: D- Y
   {
& }; |4 ?' h: B4 `' s2 {1 E# `      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 v' @, H) ~+ X" c      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 ?/ z7 X8 |8 z/ ^' c1 ]" S2 Z9 O
   }
) z* c6 `( e7 \0 i* E% v% x   else" N5 g! w; O: g* Q0 |- e6 X4 h
   {" v6 b* h7 }) T/ \3 R+ K& @
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- W! r# m+ l  |. ~3 D# F) K; }4 B5 w3 \
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
) r4 `& K- x) D   }
2 o6 _" Q, `1 O8 Q4 w   ' O3 x' B4 T1 o4 v
   if(ret<0)7 N% m' w! ~9 E/ c9 }8 G
   {
' M! s8 _  S; [      printk(KERN_ERR "register chrdev fail!");
  Z' ^6 M6 I* G$ l- Q2 c* U      return -1;  h; c: @% r' a" z) b8 |
   }
/ @2 U; e8 `3 C0 x   3 O0 o5 {! n; U& J+ c& T
   mcbsp_cdev=cdev_alloc();
2 q( d2 N1 v; |% k   
& N$ k* @1 V  j7 A   if(mcbsp_cdev!=NULL)
  p2 V5 M7 u) j9 h   {. g  ?" I3 u# a- @& F7 g8 S) G
      cdev_init(mcbsp_cdev,&mcbsp_fops);
3 ~# c' C+ |$ h' T      mcbsp_cdev->ops=&mcbsp_fops;$ N3 u- {3 s: H; Y* e7 b9 u: u% R
      mcbsp_cdev->owner=THIS_MODULE;
! Q" S' v+ e# R6 Q7 Y1 ]      1 C, ~/ x/ Y4 k" U+ ^* @9 x- ]2 H
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 _, v- b/ J6 O0 t- I+ O* ^* E; s
          printk(KERN_ERR "register cdev fail!");
. J2 n5 V9 c4 F0 Y: v      else: g; K9 @5 n! z/ L0 p7 y
          printk(KERN_ERR "register success!\n");* X1 V& s' ]4 F) i( V
   }
% [. `, L* D3 D4 N, J3 s) g   else
7 \0 O+ b) q# F. X. @3 q   {
3 D# E( G* D5 {4 O3 @) H      printk(KERN_ERR "register cdev err!");4 o$ O+ v6 }( \3 q* l
      return -1;3 q# F8 _8 E: i. R; W3 W
   }# x! m; Q' e" Q
   
! I2 c" K) |, M! N- {9 T0 J  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
  @6 d* A5 [- l- v) h6 F4 d   if(IS_ERR(mcbsp_class))
9 u9 ^* L! ]+ I5 E# d& L. t   {2 o7 n! {" s9 N/ N
      printk(KERN_ERR "register class err!");
- z, J& U$ O; B0 ^# Y* h# p! \7 t   return -1;5 m, G1 D; _2 E' h5 H  s* {! Z
   }0 w/ h: f9 [3 D7 V: L2 p
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);7 L1 k# B( W9 L& c; r- i# {5 k" I1 t
1 f; Y5 _& B1 p- F# R
   //PSC& {3 P0 T  v2 r$ q4 q
   //add Enable MCBSP2 j0 e- C7 h- `) R, N
   //test
4 j4 \5 U; O: p   temp = 0x80000003;
, H4 b8 b# A* L# H/ r6 @- M) e   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& e/ w, S" ~. o4 f3 f/ a( Y   temp = 0x00000003;
+ N& i$ O& A5 e; [/ F% J- H2 U   writel(temp, IO_ADDRESS(PTCMD_ADDR));6 U) B* L* B5 i4 c  X7 q% B* z8 @% E

) [3 T+ z) ^8 [# P" t1 Z9 m3 ^8 K   temp = 0x001FF201;
8 S* T; e4 F' n/ g/ |   writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ h+ z1 J( z, q, B- L) X- ]
   
! j1 m: b' i3 F. E; o6 W   //PINMUX  
9 c& k. w8 D1 N7 o& Q0 c   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ E* ~1 ]0 S1 I2 k! [8 \: h- c
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);    }) j1 x% z) q
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   8 p& ~% o6 Z& x$ n6 }$ I
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- f( S+ v: v; z" @4 G/ _! T   ; S& ?4 i1 u0 z7 |1 l
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ ]: v8 ]; L) z. j$ Y4 [   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  8 `: z. T( c0 r  X4 o
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
" i+ \) h6 V' U" K5 E( p   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% ^" L% F( e  N
% l" p. s; z5 p( e& d   //RESETn,L138_SHK2
; @7 s& D* U9 Q8 o3 o. q   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
1 a9 J# I- ?0 A& f. x' U2 X' ?   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   4 y* R0 e& J, v: h0 d1 B
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 ^2 v/ M' B9 F* Z
2 h3 M/ W5 r8 S. I , E- d$ z& x3 H$ Z' e
  //SPCR Register8 L8 c8 J( n7 P5 C& c) T
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 N0 U# {9 m7 U# B, A- F  temp = 0x03000000;//(DLB=0)
0 C$ _( {, H; }  X$ v/ d // temp = 0x03008000;//(DLB=1)- E; n$ ]7 d3 ?6 H! a- s6 D) k- i( Z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset  ~5 @1 M2 J. S4 S& y3 a9 y* O# _- d3 R5 Y
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 w7 ^7 K4 ]! o& p6 M- D  printk("temp=%x\n",temp);
' Q/ _7 T6 K' R . \6 x1 O: O4 r' m( O) W( ]  `
   //PCR Register# [- j- X" R. n1 N9 Z0 I
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, K6 {6 z) ?. m1 l3 }4 D3 o  // temp = 0x00000F0F;# w: a% C' V" ]: R9 f2 Z
  temp = 0x00000B0F;
) d! E( Z& J/ ]% a7 f& M; [  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
: g3 G- ?( }- o, v; t: g4 T  temp = readl(IO_ADDRESS(PCR_ADDR));
/ u+ Y( i+ G  e4 y  printk("temp=%x\n",temp);  ' d7 X: c5 a; q' ~' n" \; W1 G9 q
   //SRGR Register4 h2 ^4 Y% a. X
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& E, k% V1 J/ l7 V- i, ^3 k: O //temp = 0x301F000B;
) G* V5 b8 S& x+ ]; H8 C, E: w   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
3 A5 [& x/ h# @' Y  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 `# n7 l! i) v* Y  printk("temp=%x\n",temp);( W+ F1 Y$ F. j9 E( C1 \
   //RCR3 `' J+ m4 p+ B0 M/ y
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 z9 @; Y" C" E8 _' P) v" x7 @. w   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 w! s) W' u( j0 Z# Q
   temp = 0x00440040;0 Q0 t! e! E3 D# _  f% E* x
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & V- k# f( q3 e1 ~+ T+ w' ^/ e
   temp = readl(IO_ADDRESS(RCR_ADDR));
4 F9 v! h# r4 e* w   printk("temp=%x\n",temp);
. U$ K" F# v2 S" b$ @   //XCR
' U5 m; S9 E% {   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1  X" U% o  D* n  `/ o- G0 w6 R+ G, }
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
6 ?) {4 x" l$ @( k   temp = 0x00440040;9 _5 a1 v5 G9 Y: p  }
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ' K+ C" ]" ]7 t  r# X( ~
   temp = readl(IO_ADDRESS(XCR_ADDR));& t. L: b) ], O% p5 }; Y
   printk("temp=%x\n",temp);
* g" @4 P) g5 H. r3 w8 _% {  udelay(100);
6 L9 [7 J: [" A! p  //SPCR Register
! G: P/ Z; q& n, g, P0 _1 x  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 L; \, y! `. d4 O: ]9 x/ T
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
$ W2 l6 A( H8 R* t5 r  z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
. }  W- G; T5 ?1 T( Q# a  y  temp = readl(IO_ADDRESS(SPCR_ADDR));0 a; w) [; C5 `( t) J
  printk("temp=%x\n",temp);  s2 A5 P8 y; `
  udelay(100);: y- E+ C% t# R( A" U7 U
6 w  s! b4 j7 l; T2 V: O; ?
  //set GPIO direction5 y0 s8 g6 w9 Z  m$ n9 w
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 B% E! T9 U+ ~# W3 ~, B, l5 X4 N   temp = temp | 0x00000100;//EPR----input7 h+ w9 P: e, M# {) U$ p4 H! Q  }+ N! c
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 x3 Y( w$ ?' o% K* \7 M: r) a
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; [) ?% H  r& I1 O2 T) Z
0 t! v8 Z$ z) j, X5 `! Z) E0 c) f
   return 0;
7 g  Q0 K9 ^6 l9 w" t}/ e/ B9 S3 @- I% W- u; d
static void __exit MCBSP_exit(void)
& E$ A( O6 e" M( I+ S$ m{9 T! H) A2 J! z! p, S. T5 x/ E4 \
   printk("mcbsp chrdev exit!\n");
6 @; m& l! U2 F- `6 o" p* N& D   cdev_del(mcbsp_cdev);. d2 P5 f1 v; e, Z" L. l* [9 V* J
   unregister_chrdev_region(mcbsp_dev,count);
: O: k5 W  }0 B. o( q% [   device_destroy(mcbsp_class,mcbsp_dev);
- @9 n% D2 d* r& Y   class_destroy(mcbsp_class);
  Y. Z/ t8 [# w* D$ c3 K}
) B% O! m& j& R8 E) p1 S0 X0 r* Vmodule_init(MCBSP_init);
+ x1 c, F" t6 a5 V. W3 z. qmodule_exit(MCBSP_exit);
( I: `" b" v" `
- P$ n# t0 S  L$ bMODULE_LICENSE("GPL");* ^: O( k0 g" W+ p; F" R# K

7 T8 C. A1 V) s8 X9 s- `% v  M我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; ~, h" f) d- l& E) O* `我的应用层的测试程序如下, k4 d+ g+ a7 N6 F$ N' ?( e
#include <stdio.h>. w2 [* B" Y) E! p9 X8 _
#include <string.h>
; A# x% p! }# t; `#include <fcntl.h>
; M' c8 O- N3 C8 [6 B# }0 Q#include <unistd.h>
6 g6 b" z- o! y) k+ E* P0 j, f#include <signal.h>( o: l( Q# k, }- O2 X) z) n
#include <pthread.h>       //线程7 P( _% d4 l  D" ?: r  l
#include <stdlib.h>" m  X# E9 N! m
#include <pcap.h>          //捕获网口数据3 A0 I- L0 T1 R, j: {8 x
#include <semaphore.h>     //信号
1 R  p5 f, L6 Z2 E6 X0 y  w) K- I#include <sys/types.h>     //消息对列
' O+ ?* i8 x/ x. h$ x7 K#include <sys/ipc.h>       //消息队列
7 g, |7 |; ~2 ~" c#include <sys/msg.h>       //消息队列
+ J; f" p' X0 N2 e9 {" c( c0 O- A9 G" K#include <sys/select.h>( y' H# y0 a: D$ B
#include <sys/syscall.h>
: H* |% c6 `7 H# j( {#include <sys/stat.h>: g; \1 C% H& Y/ M$ c- {, I+ a- _
#include <sys/mman.h>
1 y) j* E& ^6 |7 b5 D& i* \/ U#define msleep(x) usleep(1000*x)
8 `- H8 _- S. G) A1 t
$ z, S- W7 k/ C' C9 d' N$ Pint main()& M8 l' ~/ M* Y" C1 C  G% ]
{ . b  l6 s7 {! P5 y
    //MCBSP,ARM与AMBE2000交互设备) }& @6 \* Q) A- n  v% |+ P7 L
int fd;
0 D( {9 O& c3 B7 ?+ g' U* p- ? unsigned short data_write = 0x5555;$ N9 {0 R3 o% v7 X) ?3 ?6 V
unsigned short data_read = 0x00;
2 k. g9 A* d& L4 q" k8 Q8 w  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& G) _6 v" A* G) `( y% q9 J  O
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' _1 @6 m0 {( N1 {
    - v% J& y+ p- ^. G8 L$ h  n) T
  if(fd < 0)
) @9 N/ C# l% k  v/ j& |! t  {
. s4 U7 b% n' {6 o     perror("open failed\n");) M9 o2 C/ Z. Q4 u* ~5 r
     return -1;* L$ @+ Q0 I$ z1 [. w- ]( `7 k
  }
+ G6 Z8 @; `" T  & Z" [7 O6 c- l8 K2 E* N
  while(1): i$ ?+ O, H# N/ b
  {# P0 e- ^5 D, o  ^9 t. H8 u
   % c& S0 ?. r) S$ M
   //AMBE2000每次读写是24个字为一帧" s  I+ N) G4 _$ [: C4 g
   //写数据时将数据在底层存储起来,等到中断的时候再发送3 _1 j$ ?9 I6 ?& Z9 a0 x; w7 p
   //AMBE2000输入数据是以0x13EC开头的
3 [3 g# q* y- S7 U   write(fd,&data_write,sizeof(unsigned short));
( i. i0 o  f' F+ x1 ]3 R0 `, m) s   
  y3 d% N3 S. l   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
# r2 L- L; N0 N   read(fd,&data_read,sizeof(unsigned short));' ~- I3 i6 C3 ]
   . E3 ?$ ]( }" t4 ?
   if(data_read == 0x13Ec)$ b% [( `4 a! C# |5 Z  C! K
   {; G% z' ^/ i- b% i, F& u
   ! n" o6 H0 {# m4 }
    printf("data_read = %x\n",data_read);
, ]' z" x" I' e" R# k- U% C+ M   }
! G5 @( K  \% b1 @   
* ^7 F) @1 c. G9 K) d/ s2 f   msleep(10);
/ c3 D2 ?, d% Z( |  4 p) \5 k( @- ]6 @$ [& L1 x2 I; R2 p7 i
  /*: @& E0 s1 G' x6 u# K0 T+ S# V
   ioctl(fd,1);   5 g  j9 b& \- R
sleep(1);
7 T' U( W# v+ M ioctl(fd,0);
: L' ]1 v% k% X7 q sleep(1);5 l* {: p' R* j6 c. z! U6 j
*/ ' K/ {- J" s7 I6 b  f5 N0 t$ v
  }   3 ~' |# ?1 T& z  b) m) j8 N
return 0;
: O" Z) u2 V: X
: f' I: r) o4 H- e9 C8 y/ \9 f% d: E}
5 o. N; o$ V2 I% [0 T0 ], z; A  r9 @) X$ Y0 R( l
多谢各位指教,谢谢! 急
3 d- I& f+ ]6 `" [8 X* k
4 f5 {! S! \) |& Q, F
# n# ?: M! y/ I# d
' S4 I0 F/ x8 l6 c' Q0 {' T% P1 h
' l) i& k% v/ T+ c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 00:16 , Processed in 0.046409 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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