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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
  F# _  B! a# G% q/*
4 w1 Y6 X9 x" H4 F, \2 s * Copyright (C) 2009 Texas Instruments Inc
! y, F) x, o& H+ K/ X  W$ u *
& h5 x3 [4 ?( r * This program is free software; you can redistribute it and/or modify
0 Z4 M- n' I+ u, ?& q. G * it under the terms of the GNU General Public License as published by
% C6 K  a' G  S7 P * the Free Software Foundation; either version 2 of the License, or. E1 ^1 ?6 n+ h# i
* (at your option)any later version.; h. Q, I. K8 X$ ]* p$ Z' |6 E
*
  w- ~. s3 b# X0 y9 i * This program is distributed in the hope that it will be useful,/ e3 y/ d. h9 }6 Y
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8 J; M) `( @; l  J; x' ^; D% _& O" R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 E" B' u& T* k* k * GNU General Public License for more details.4 `/ C# x2 o5 m
*
9 S7 K8 J5 I. Q; K4 r * You should have received a copy of the GNU General Public License
% }& E/ o; U8 ^2 @) ]" } * along with this program; if not, write to the Free Software
$ v4 g3 Z& C& Y$ O+ p- K  \3 y/ e" t * Foundati  n# @+ l0 \1 a& L
*/! L! z' H6 p& n: \
#include <linux/module.h>
, s- t- w9 U, V7 f2 L#include <linux/init.h>2 Q6 U! g+ h) n" ~* s5 ?6 R
#include <linux/errno.h>
9 {5 r; M( D9 g5 v#include <linux/types.h>. _( c, ?1 f$ C. }/ A
#include <linux/interrupt.h>
0 n6 ~/ O/ r8 I* I1 Z#include <linux/io.h>
$ a6 C: ^8 x- I$ J#include <linux/sysctl.h>
9 `8 F4 K6 c/ P* ?: r#include <linux/mm.h>+ P7 g6 e0 u/ S$ N6 O0 B3 l  P: m4 r
#include <linux/delay.h>8 e7 K3 t' W% x  E7 c* P4 N
#include<linux/kernel.h>
3 ^& q1 `- D  l) s3 r#include<linux/fs.h>
" R7 ]3 q. @) `$ S8 q#include<linux/ioctl.h>
; p! ~& D/ W% z- [" l3 P0 A#include<linux/cdev.h>3 ~' C1 _: Y/ v$ q
#include<linux/kdev_t.h>( W3 `, Z% S- X5 R" X. f
#include<linux/gpio.h>4 P$ y1 V& x# w& [2 V0 W
#include <mach/hardware.h>% Y4 A& b  ]2 l% }  ]! S1 u
#include <mach/irqs.h>" I4 x: _! k  a3 Z0 x3 G

# Y7 p* j  R! z. c#include <asm/mach-types.h>7 Q) G! B0 }: N, H& s
#include <asm/mach/arch.h>
! V' l9 R. ~/ p4 ]; }#include <mach/da8xx.h>2 {" A  F9 ^. l6 H% p
#define  SYSCFG_BASE   0x01c14000
7 M8 y' e, t6 }  c9 p+ v) H#define  PINMUX1_OFFSET   0x124 4 R7 {( x0 N; R' h5 E( j
#define  PINMUX18_OFFSET  0x168 ! Z8 s6 O3 |- R0 _- h7 s
#define  PINMUX19_OFFSET  0x16c8 W% l2 a7 ~( j  }' g, N0 G7 r
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 r) M6 x, Q6 x6 W; [
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" ~" x4 Q. R9 L& b9 K- O
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
  Y% ]* F* H3 C: c: g9 K( s#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR8 W- I- k$ w6 @- \) T! o- D( N
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
3 h$ J" ~; Z4 y0 q                            / }) \7 J* D7 {, ~
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR$ I$ ?" U" C: @5 P. f
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
2 r2 N* {% g* a0 s( L//PSC1 s' F# y# E  J# ^5 L
#define  PTCMD_ADDR   0x01E27120  
6 u3 _0 _( _7 g1 r4 H8 ~# `#define  MDCTL15_ADDR 0x01E27A3C
- x2 ?6 r% y6 F" Z- w; f#define  PDCTL1_ADDR  0x01E27304
+ C( g* B2 ]7 {- s7 @+ C1 e//GPIO8 direction, ^; [- }9 _) a7 B0 z/ }/ D% S* x
#define GPIO8_DIRECT  0x01E260B0! h1 F2 }0 b, n
#define GPIO8_OUT     0x01E260B4
! H5 S& g6 R  n& A# `' p6 K7 y1 V#define GPIO8_IN     0x01E260C0
# f$ W6 M5 \. V8 h8 N9 |8 t7 B- c/ Y, ?2 F  m+ k, k: \
//#define MCBSP1_RINT    99              
; ^, W7 }# K+ E/ R8 U//#define MCBSP1_XINT    100  $ t2 y6 L% ^; k5 {
static int MCBSP_MAJOR=239;
" ?$ k4 ?6 Q9 l7 J+ n: Wstatic int MCBSP_MINOR=0;
' p. S& ^3 `5 q; Tstatic int count =1;: F! W2 p2 W. m% X
$ `3 t0 P. _5 J' c5 e
#define MCBSP_NAME  "MCBSP-device"2 J* V# ^" j/ _0 E" ]7 }
/ c' D" r' S1 X5 J5 B1 s
static struct cdev *mcbsp_cdev;
9 ^2 q: s! r8 x5 j# a+ a6 @& J1 Nstatic struct class *mcbsp_class;* v  [7 ?( z4 Q3 M" N- }
static dev_t mcbsp_dev;8 a: C( r1 t7 s- f3 N% y% |
unsigned int DRR_data;
9 S" p. m" O5 I& _& x+ Xunsigned int DXR_data;
  {- b7 R3 l' }! I2 t2 Kstatic int mcbsp_open(struct inode *inode,struct file *file)
$ a, `! e3 C6 u6 O$ m( _{
1 P, p6 `, ^( {2 P0 a$ N1 B- B5 T   7 ?, K% @2 U2 p& W: x
   //interrupt enable,initialized
8 h* q7 a  D4 d( _4 E- j   unsigned int temp;$ A; T3 U7 X- t* w" s9 A) z. T
   //SLEEP_EN(GPIO8[10])---0
2 Y/ c$ D& U2 Q, Q- X/ t   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# O9 t9 h& h& n2 V# C: D   temp=temp&(~0x00000400);7 q+ K$ P) }: e+ G5 Q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" J, G, m9 ^; d( D7 `0 @, w  //RESETn(GPIO8[8])----0----14 ?: T/ r$ d2 v; A) d6 d+ h* w9 s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 Q1 {6 D; E" e* L4 y   temp=temp&(~0x00000100);, b2 h* M' N% O% e: S+ x3 H
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. @) N+ m' K( X+ P   udelay(100);' n7 s* z$ Q, Y$ ~3 P' v. K( o
   temp=temp| 0x00000100;
2 d- N; i& r4 v, b1 B& Z5 `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) y( }  q  q1 k5 \" `
   udelay(100);4 f8 W  v  W. R) v1 ~
   printk("open success!\n");
( x: B6 ^, {' M/ ^   return 0;
% o% k8 h- {+ o$ A! H) d1 ?}
) s) g* |) Q/ x  d* T5 q
" O- p% e6 D$ estatic int mcbsp_release(struct inode *inode,struct file *file)& [& ?8 j/ Q: C. {( I
{
/ V8 x% N  y; c; J% K9 i   printk("release success!\n");
  \+ C2 j5 w. A9 Q9 n) L; B   return 0;8 H5 S" r0 l( z6 J8 E/ I
}1 @+ I% y; H3 L" I3 n/ i4 w% ]
; y- s# b3 N% d, d6 `8 ^8 `: A
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; c0 e) D& ]( w5 Z2 B8 C{% ]/ G6 X; n4 G/ K: [
    copy_from_user(&DXR_data,buf,len);+ y; `5 b( E# f" s2 j7 R" S& B, R
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
4 }: ]% b) z, P: t# Z+ |    return 0;. ]% n) n6 K1 e$ Y; K5 V

3 R9 h5 }8 R: d% C5 W; B. N}  D' J5 o$ ~; u$ E5 G1 I" ?
5 X2 `, f5 @! u* J& G# z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 M2 u+ n5 e! z. M4 b0 U2 @{ - N' t- @# ]6 d
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));1 G% s3 R4 }# u) A
   copy_to_user(buf,&DRR_data,len); # Z* w: c& t7 p
   return 0;* {  m/ S8 h) l$ D9 _
}+ i. U$ `: [" u* X+ F
8 S, {  y  a9 a+ y7 i% t" j
# g2 T( C" d9 v4 X) j# F* s5 `. D
static struct  file_operations mcbsp_fops=
& [. L5 v& b9 M$ b4 e2 j{5 x1 b  v  |) J
   .owner=THIS_MODULE,
0 U& o! E) X. A   .open=mcbsp_open,
. ]* @4 I7 a+ Z/ B9 |& v8 I* \   .release=mcbsp_release,
, Y2 l0 K0 Q; c# B& j# X   .write=mcbsp_write,
& g" n" b$ [. [3 M   .read=mcbsp_read,  O; H2 K* P$ v$ ^# H
};
2 G6 b6 C- D" a8 {" }static int __init MCBSP_init(void)8 B  R# a" y: q9 w) e6 K) V3 U7 D: ~
{; O# n  c$ S0 ?* e7 L% n" V
   int ret;- q% ]! I- I: V) v$ D
   unsigned  int   PINMUX1_REG_old;
2 z9 K& j7 h* _   unsigned  int   PINMUX18_REG_old;8 [- w, }) v6 X" `' ]
   unsigned  int   PINMUX19_REG_old;
! c* r$ j; {0 }3 f; s( v: X  X   unsigned  int   temp;  
$ W: ~+ F) r5 J  X   if(MCBSP_MAJOR)
, `; m- X! T1 F, p& B   {
4 C* W; c& l7 `7 X0 {1 J      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, A. z4 |' d3 |$ U+ P  g+ a2 X      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ q: b( x$ K7 ~# k% \. U
   }+ X# {; a6 W% s' G; E/ w
   else
! E& T0 T7 x) z. \/ }8 s( F* x   {
  H0 J1 w; H+ e$ ]9 |* T8 u8 ^& T      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! K% O  g9 s4 C" D- A      MCBSP_MAJOR=MAJOR(mcbsp_dev);
# r1 m/ f3 a* K# g! F! m: M3 o' `   }! }! _7 A6 c/ E
   
- ~) ^# o+ s$ p$ a   if(ret<0)! P5 E, O" [7 {! l3 M% o6 b3 w5 R
   {  a4 X8 G* I8 ~+ ~& V
      printk(KERN_ERR "register chrdev fail!");
6 m5 {8 [8 Q7 y, l: \, @+ N0 ?      return -1;
3 K% ~2 O9 f8 [' E) f. _   }" X# N: G, Z' @  F8 J- Z
   # C( p! I; V6 `( F/ \1 A
   mcbsp_cdev=cdev_alloc();
7 l8 C+ J% @3 {& i9 d$ P6 U1 }   
+ C% _! d. _$ A. O6 {% d   if(mcbsp_cdev!=NULL)
% N, F# E6 B. O: f   {
: U. |( x! p% |& T      cdev_init(mcbsp_cdev,&mcbsp_fops);
6 v9 b) e& e1 h8 g; Q7 i1 h% d- N0 n      mcbsp_cdev->ops=&mcbsp_fops;$ e4 c$ Y- g4 j! D$ B+ e
      mcbsp_cdev->owner=THIS_MODULE;
8 P# `' k$ [* Y! B) m      
8 `" r! J7 T. N! x$ }& m      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 D  z! x& F  [& _* Q" {
          printk(KERN_ERR "register cdev fail!");8 t9 o6 B( y- b
      else
1 c' I3 k7 G3 N8 r" Q# ?, J          printk(KERN_ERR "register success!\n");1 {/ R+ t5 S4 _. V& @# m- h
   }5 ^; A7 g* r) Y- v
   else4 f+ q  ~" J: v9 ^* H
   {9 o! |& t! q# @; r! j
      printk(KERN_ERR "register cdev err!");' V) p% H. s2 B; Q9 ^0 `
      return -1;& o* M0 X+ E: o/ N& i, u( h- V, s- {
   }# k; D/ G4 o/ r; d5 @( M, C8 y
   , {5 ?  B. K% h) t  }  L
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, |6 t; a/ D! n* Q+ b& W  H
   if(IS_ERR(mcbsp_class))6 }: e% Y) f  p+ [
   {
* I# j/ I& ?- N: ~' W/ j. }      printk(KERN_ERR "register class err!");
2 f2 C5 M. W' V   return -1;
1 W3 p1 _. ]% [5 q* a" e' V   }
% r& R( B: ?4 m+ s   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 L# |; F  {' U5 ^

" ^7 V+ D9 m8 Z8 Z   //PSC6 J" X) i0 z' x% \
   //add Enable MCBSP0 W) F$ ?/ h6 s; Y
   //test
! i* D+ J7 q6 b# _3 c5 q$ Y9 A   temp = 0x80000003;& p" N7 v0 A# A7 p- Q* U5 C
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ M( j% c) J* ~& Y( z( p   temp = 0x00000003;+ T4 W" k+ Y) e. y# B( X  i7 ~/ K
   writel(temp, IO_ADDRESS(PTCMD_ADDR));! x9 M/ B2 J) t7 b

* k  _. `. n4 |% z   temp = 0x001FF201;* @: Q2 o' W1 l( R
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));* C) a+ J; g6 t. B
   " F& R! K( h" G' B, {$ L& m
   //PINMUX  
) O* ]+ b- _: u' q' c, N2 |   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ }# |; [$ Q* _7 q# V
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
+ Y9 i1 r1 t. W( \   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
/ e0 }0 V4 \7 P3 \+ Z( w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' k& y/ T5 r$ A9 ~- i2 B
   
1 X, }! e) A1 S2 O# L, Q0 Z' \" x1 H0 i6 a   //SLEEP_EN,EPR,L138_SHK1,L138_RC
/ g% b: D" z; ~3 X! u' |. a* v   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 C3 s( L- j! x& E0 g0 c
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
9 n7 K9 e" D4 g- }' h   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# r* {& }7 w% u# C- r2 ~
2 {7 J) X1 m# A
   //RESETn,L138_SHK2
. z" U' m; E: R( L   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  , P$ X5 d/ U. G, {) U2 l; s
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: ]& y( C0 \( x$ J3 }   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 a8 x9 ]. T$ a+ E, }6 t' |7 `$ {8 q $ ?2 z$ \5 K0 ?
0 l8 [1 R0 M7 a' p8 j* g
  //SPCR Register
; |* ^/ S4 M' E6 c  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset% _& @& @* H. Q+ h$ u
  temp = 0x03000000;//(DLB=0). x4 ?1 V' \8 z' O
// temp = 0x03008000;//(DLB=1)6 A0 q# z3 J* z2 z8 y* y# q4 S; A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset$ y' t6 f" i% q  M% i1 G' N
  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ _- L$ i2 x- s3 C  printk("temp=%x\n",temp);# j& c& D( H. Z: P$ |
9 R$ q) _0 r& R
   //PCR Register4 C; L5 V& z  a2 F1 ^- r
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 O- R. R5 @8 a: X
  // temp = 0x00000F0F;
, G, e+ u9 Q/ u) t& U9 z; E  temp = 0x00000B0F;; `0 R: h8 S/ h
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 3 R# D$ W( J" E" }- a6 X
  temp = readl(IO_ADDRESS(PCR_ADDR));
" M$ S4 P% i& ~- B6 J  printk("temp=%x\n",temp);  
/ V- u3 _3 F$ M. w2 o8 {5 x   //SRGR Register
/ B. Q2 w3 ?/ [7 }0 O   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==111 l0 m# U2 t- a5 Y$ U# n) |
//temp = 0x301F000B;
. m9 q9 q$ H& A' f! x: V: S6 m   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: d8 v) r6 u- @& L& Y  temp = readl(IO_ADDRESS(SRGR_ADDR));; |8 H8 X% n! ~3 l0 N; n9 C; o
  printk("temp=%x\n",temp);
2 D' c- t' t8 E5 Y" w' s   //RCR" ?; W7 M8 c% r% M
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 k' |5 o- P% \3 |$ C   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, f+ c! d) D& I- |& `4 t8 o6 r8 @5 b
   temp = 0x00440040;
  a( G9 z# K# V& x( G' y% d   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
1 V9 C* |( L( l. k' @   temp = readl(IO_ADDRESS(RCR_ADDR));6 ]9 v0 m/ S# |8 V
   printk("temp=%x\n",temp);& f. T7 m+ ~4 J3 a- Z
   //XCR
6 ~& }  ]7 q- K  {& w. f   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, J; r8 R, g  L* b  ^4 j   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" S3 Z+ j# z8 n# t   temp = 0x00440040;( ~  o2 D3 g1 f& E; b3 q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
. c# U$ j. G) L, k' P8 x  ]! G   temp = readl(IO_ADDRESS(XCR_ADDR));7 ^; h1 E: \" ?3 K
   printk("temp=%x\n",temp);# k) [! p7 |& y! h' g* e  w9 o
  udelay(100);
: {$ b8 V# n2 k$ r  //SPCR Register6 r% i% E: s4 E, z1 T+ R3 r' Y
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-14 {% F9 u5 I5 p/ [% \# N+ z4 E
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
1 x% w8 n2 ^: ]; P% m- d  G) w" y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled# ?3 W' U5 e4 v; S& n
  temp = readl(IO_ADDRESS(SPCR_ADDR));& M! B) d3 o7 z8 z+ E* w
  printk("temp=%x\n",temp);; s( ]4 N5 `7 E: A$ L: y# H
  udelay(100);
3 W1 @0 l' A# u2 w# Y8 }1 r: R
% d$ T/ B# p/ b6 T8 O! p2 j! z4 g  //set GPIO direction
8 \' O/ Z/ n) D( w. j( i% T) m) s   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; \  s3 x: _1 N) ]9 d
   temp = temp | 0x00000100;//EPR----input+ Z% ^6 r( r, y
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) a. f/ l  H: D! E   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 b! o0 @: k# w' Y+ _4 k& q3 l
4 v4 X7 c2 _0 N/ R) y4 c, Q6 X, \
   return 0;' G7 H! W. R  }5 E1 f
}- w3 `  T6 s/ W' V* o+ F! G  y+ B9 r
static void __exit MCBSP_exit(void)6 J, N/ k; c7 [* _4 O3 P
{
! P7 I& u6 w' e8 P   printk("mcbsp chrdev exit!\n");
" ?1 U$ z: Y) ?' W  n   cdev_del(mcbsp_cdev);
- z, [0 f/ N6 ?9 h# R' h   unregister_chrdev_region(mcbsp_dev,count);
3 y& q( N! j& w! h   device_destroy(mcbsp_class,mcbsp_dev);" D6 p$ U  p1 S7 ^6 u6 h5 R
   class_destroy(mcbsp_class);4 o9 e# @  W. u; c4 P" y3 {  M) C8 p
}
7 e( v2 _* Q" k5 O3 s; H+ [1 Nmodule_init(MCBSP_init);8 F8 C" z; H" v# L# f/ S/ O6 K
module_exit(MCBSP_exit);  D  o! k$ c8 a$ u- x7 _" C

" J7 |" V/ x2 F0 H. r" gMODULE_LICENSE("GPL");- Y' }0 V% D: \& |( n4 |; i
1 u. m; w& _5 I+ I0 W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ \+ s: c! ^! |' F% k
我的应用层的测试程序如下3 [( ~1 X+ R, Y4 y/ m+ T
#include <stdio.h>* O  W1 p5 Q) t  L+ r
#include <string.h>7 T! C/ Z" N% p+ a& ^! N
#include <fcntl.h>/ M( M% t5 [6 M4 C0 v# t0 k
#include <unistd.h>
* F3 y% A4 M8 u8 \( W. p#include <signal.h>: s$ `* Z- z; ?- Q
#include <pthread.h>       //线程
" m5 K0 n+ }3 B7 h6 H#include <stdlib.h>
; F2 A* a9 E2 b, Z#include <pcap.h>          //捕获网口数据
" i' e6 k  g) \7 e, N$ M+ f#include <semaphore.h>     //信号
; {2 h' B" O4 e- [% E0 C2 u% c#include <sys/types.h>     //消息对列
( b8 h: C& Q$ G# r+ P  r- B#include <sys/ipc.h>       //消息队列
, ]# K  Q$ @4 k8 |; A) a3 A#include <sys/msg.h>       //消息队列, r! s0 h' l% Q* v$ I; W1 z4 z
#include <sys/select.h>5 b5 \  H* @. J; u" [2 J
#include <sys/syscall.h>
# {4 y5 K+ J1 U# E9 s' `#include <sys/stat.h>2 R5 K% j6 A) Q+ F1 V7 v8 P2 J
#include <sys/mman.h>
2 _  e7 J2 y. z1 ]! R8 a8 l#define msleep(x) usleep(1000*x). O) X( i+ {- e2 S* m0 Z6 q

$ _1 s; \" ]$ ^4 x3 W4 ?9 g$ uint main()9 q( O' C- f2 W
{
% ~2 P" p8 W- `/ _& }$ ?    //MCBSP,ARM与AMBE2000交互设备! q" H+ L" c. }% z
int fd;( ~* Y  s4 I, a- ^5 B
unsigned short data_write = 0x5555;$ L5 b# p: s! M; P3 D
unsigned short data_read = 0x00;
* {) e( F! N% l1 s  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" q! ?$ D- J( K //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& @' J( P' K, {: ~$ c
    , W1 H# o4 x9 \- R* l
  if(fd < 0)/ N/ r& l: K/ g$ I3 J
  {( c- t7 T; m2 Z  h3 h
     perror("open failed\n");
6 I4 w9 y4 H& b     return -1;
3 q+ j9 r6 w5 m- I% E6 O, o9 e  }4 i& N" D2 W% _& B
  0 K; ?/ s% Z9 K
  while(1)6 \# a; x, q. e! G3 K0 p
  {( m: m; ]9 s* H5 O) [$ i/ ?
   ) B% T# D  N) P2 t# D! _
   //AMBE2000每次读写是24个字为一帧, V# P! U7 o3 a* ^
   //写数据时将数据在底层存储起来,等到中断的时候再发送
, K& I0 {# l$ x( t: T$ M3 d   //AMBE2000输入数据是以0x13EC开头的" M7 z' ^9 r6 H! v! }9 O( C/ m
   write(fd,&data_write,sizeof(unsigned short));
8 z6 X( f) v4 Z4 P: Y, o7 k2 v% {   
7 M* ?! M& D9 ~# i% N2 H   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  4 j. @9 Y) q* l  i% N7 E8 i8 l
   read(fd,&data_read,sizeof(unsigned short));4 Y; _. g& d1 h$ p. |
   
# ^" [8 Z. E  u8 d: Q; L   if(data_read == 0x13Ec)" s: z7 L5 d. U0 T6 W
   {
* \2 q# C( ]# o   
7 C* \. W( f  l3 d: d# u    printf("data_read = %x\n",data_read);
: W$ C. H$ W( @4 E2 t6 o   }
0 b  [, {( H! ~5 x$ i( [9 W   ( k* J) K) D' m8 ?; f# Y: @6 U
   msleep(10);6 {9 O5 w: Z$ F
  " t+ \: T& z& K) ~2 M7 o9 {
  /*
1 h. o, ^3 v: B6 B* a! h   ioctl(fd,1);   
' }, [# B) a, C sleep(1);
/ d" N8 F; F( i5 p- j+ X  p/ K ioctl(fd,0);
5 g) @7 s9 \& n# a) o2 U2 F sleep(1);
2 H% d- r* ?' x */
) {5 W2 O- k2 e; L  }     W0 T5 w# Z" l) E
return 0;
$ o' a9 F3 ^( n& R6 g! U
6 x' X9 [4 W$ c! y7 e; H}5 h! c/ f% U/ U* {1 l0 X3 y

) a1 O' x/ h2 B7 m1 ~. e8 K# I) B多谢各位指教,谢谢! 急' Q1 ~4 v$ ^- B- K! R

) h4 ^+ N+ w! O  ?/ f9 d
/ p3 m/ }9 }. N4 e0 t8 g8 U, \. {) M0 _# X& C, x# m
+ q# ~6 z) I3 f( N1 i, _/ v. v
: [8 d& ^0 v' _8 q) O0 F1 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 11:07 , Processed in 0.077975 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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