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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# }, `# r& o7 c* a7 C/*
% ?/ ~* C9 i- U1 l# l0 O$ n# K * Copyright (C) 2009 Texas Instruments Inc
# ?8 H- h' r0 ~; h; t* p* e  g *6 V& _- n9 E2 p2 f4 X  C9 s+ e: v
* This program is free software; you can redistribute it and/or modify
" U0 j6 ]7 A9 n/ @& T * it under the terms of the GNU General Public License as published by
+ u; F! {, z  O" H0 M) ] * the Free Software Foundation; either version 2 of the License, or
  X* [) o  ^7 w3 m8 ] * (at your option)any later version.
4 Y: S! n! q+ r# l/ U3 ?* S" w' s  o */ X2 V7 H9 q- a+ o, F1 B$ x6 ?! }
* This program is distributed in the hope that it will be useful,
; E2 O1 ?0 c3 r * but WITHOUT ANY WARRANTY; without even the implied warranty of
" w$ d" s. f) ]9 i- p2 C * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 l9 X1 \/ n( r3 C  J- h  `& v' H4 u- P
* GNU General Public License for more details.# d" p1 p1 w0 I, b. |
*
- ]/ ~; ^% z$ T9 U. ~8 {+ p * You should have received a copy of the GNU General Public License  w& y; a( o, r% \  I# D, k/ E
* along with this program; if not, write to the Free Software9 R, o' c' ~* M. [& K9 O
* Foundati
5 S' o. ]: s* r% X) o( B*/
2 g# O5 Q- P% q5 g. j+ P, d7 I#include <linux/module.h>
( h% V0 `( M" N1 b8 d9 I" W& N#include <linux/init.h>! w8 g8 M. b! @5 {' v
#include <linux/errno.h>
7 L$ j3 @  r3 [+ d  T& _#include <linux/types.h>
; J! q. \( J6 I7 F: c( e' E0 Q/ @/ I#include <linux/interrupt.h>
: e* _/ t$ W1 V* z( E#include <linux/io.h>" E. c& Z4 ]: Q  W* D% d1 Q
#include <linux/sysctl.h>0 u* @1 N% x8 b; H( a5 B" `
#include <linux/mm.h>
2 a' O1 Q# ^& `3 K$ k#include <linux/delay.h>
) m  Q! K. W9 f" f#include<linux/kernel.h>
! ?. [% y4 j9 z7 F#include<linux/fs.h>
, z2 f) A! q2 C9 f#include<linux/ioctl.h>
: b! h$ ~* W2 j! p* y' F/ p$ Q8 c#include<linux/cdev.h>4 y4 U* e8 p) `: O1 ]
#include<linux/kdev_t.h>
4 n  c& f) v' B  Q: ]: J% S6 o) ^* e#include<linux/gpio.h>
% S& i1 x+ Y# ]; C' b$ _7 F" F#include <mach/hardware.h>
) u  [& ~& d0 a#include <mach/irqs.h>! [9 F1 {) t2 B+ }+ @
5 }* K4 B9 C$ u. |" C+ S/ J6 Y
#include <asm/mach-types.h>
( h  h* y8 v6 F% t% R: {: G  B$ I$ e#include <asm/mach/arch.h>" ~3 Z9 `+ |$ H+ u, H
#include <mach/da8xx.h>; d5 x3 d4 d6 {; T6 N7 V) m7 O
#define  SYSCFG_BASE   0x01c14000: @* {* T+ o7 B/ V7 U! o
#define  PINMUX1_OFFSET   0x124 ; p4 h) u  W% r; q
#define  PINMUX18_OFFSET  0x168 ( m. X8 Z1 m% w3 {) T
#define  PINMUX19_OFFSET  0x16c
$ N5 X9 @9 V# a' n#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
# ?% K: l3 m( \" r5 K#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" T8 k3 B; J) b
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' J: G4 i' L7 J9 g#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR& F: V. W" Q; Y4 E" |
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
( `8 V. N4 U6 T" Z* s                           
9 o4 V+ ?1 A- ?1 g#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
. T+ d. p+ @, N- [0 x& e#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  N' P9 R7 C7 s$ {  n3 a% d0 ^
//PSC
* j; P; f8 w# d#define  PTCMD_ADDR   0x01E27120  ( D3 w1 I" M7 p. U; a5 H; @/ w4 [6 ^
#define  MDCTL15_ADDR 0x01E27A3C
6 D% `- Z1 a) r#define  PDCTL1_ADDR  0x01E27304) e& @& L4 n  J8 _& F
//GPIO8 direction
) L, S! O2 \, ^; |* ]4 m3 r#define GPIO8_DIRECT  0x01E260B0
4 ~4 t7 T/ o# `6 \7 L#define GPIO8_OUT     0x01E260B4
# T: L, a) a7 t$ B7 z+ f#define GPIO8_IN     0x01E260C0
* V* L) y6 r8 W: g. q- @( p: Q/ d- O
//#define MCBSP1_RINT    99              . d8 C+ y' @2 B* g8 E) N
//#define MCBSP1_XINT    100  
3 x# {/ l& n; S  |+ zstatic int MCBSP_MAJOR=239;
9 K, Y; P! D2 X$ ^  Gstatic int MCBSP_MINOR=0;; \# @7 k! _$ y9 K5 ?/ @
static int count =1;
$ f! ~# Q- p& t. g( v9 |& |5 Q: B5 P, Y5 m2 o  F' E
#define MCBSP_NAME  "MCBSP-device"
1 a, v, K8 B. y% g# f' \) F# R1 C7 q; F9 a8 X% J$ J/ B
static struct cdev *mcbsp_cdev;  ]" X$ _( h4 w8 ~8 l* f% l
static struct class *mcbsp_class;% L3 ]8 g7 A7 Y" X9 V: q
static dev_t mcbsp_dev;- b, j6 b$ }- p8 r& j. s" `3 m0 j
unsigned int DRR_data;
9 j. O. Y. m; a0 n' a- r" X" tunsigned int DXR_data;8 R7 U: w7 m; o+ w
static int mcbsp_open(struct inode *inode,struct file *file)+ g& W/ @! [" O1 p
{. s  A( H- G( O2 U& Y
   
6 _8 x3 j+ i0 F( f4 q. U: v   //interrupt enable,initialized
' h7 v1 Z, g: D  P# U2 C3 W  @   unsigned int temp;
5 }+ M" h% i" ~7 p) _3 ~& a   //SLEEP_EN(GPIO8[10])---0$ S0 H8 u4 U) x. v7 P
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( [* Z) R7 n+ o# |
   temp=temp&(~0x00000400);
! A$ s9 q7 |8 }% I   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( Y: N- ]1 [+ z, f1 ^0 `  {
  //RESETn(GPIO8[8])----0----1
9 x4 m& b& F' E; C   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* ?+ N  _0 y- J   temp=temp&(~0x00000100);3 w9 H9 e- D) d6 T7 N: q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 O# `  a' g+ w7 g
   udelay(100);
7 a7 l* p2 e' o; F0 ?# O% j   temp=temp| 0x00000100;/ O% F( M; M0 o; C3 }
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 j' w8 T; v* f' w6 {9 Y+ U   udelay(100);
; l, f5 T' r- q* x   printk("open success!\n");2 h- B7 m6 U5 Z( D, b! ]7 y9 t4 X
   return 0;
4 \' H2 H8 j( x5 e1 f! H& h4 Q  u}" j. {1 O0 J8 b3 F1 [7 X7 ]4 m
4 H& P6 i- v6 h" M( @
static int mcbsp_release(struct inode *inode,struct file *file)2 o" L5 {! x- T* B: r
{) g% J2 D+ M! }  g) e& ^* _* k" H# J
   printk("release success!\n");4 `( a6 Z" [# f# s+ ]
   return 0;
4 h$ G, I; Y4 ^# a7 l}; I5 Q: ?- n' _

0 m0 k; @/ L, A/ D6 H6 b. G' Z+ L" L5 gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
* M  f0 m0 R4 v2 ?{0 F. l- |1 m+ l1 K8 L
    copy_from_user(&DXR_data,buf,len);
/ ~& I! a) Z  J. i8 `& r- b    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       & ~  I' a2 |( h% l5 M/ |6 ]
    return 0;
: @, R$ o" c9 X2 g$ N
4 t+ {7 M9 D: p' A}
9 `* b" L- X$ l
0 `& e' V" G. b- h( p- R. V: Mstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 `  c% E+ p7 d( ^* n% C  p{ ' L8 o5 J* J- N, V2 b4 n
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));  v/ x$ D) z- F% y, \
   copy_to_user(buf,&DRR_data,len); ! t1 Y5 `/ m: O
   return 0;% d- n2 N3 p4 B1 J" ~& j' p
}# H3 `. n1 Q6 O1 A5 M) n
: Y* U- d) t1 r- C# \
4 ]! j& x- m3 Q5 @5 U6 B2 f
static struct  file_operations mcbsp_fops=
7 T/ W8 K& W) H* x{/ g3 B' ^# g5 E
   .owner=THIS_MODULE,
. K: o, [2 q' P* `, j   .open=mcbsp_open,' N, H$ S. G) n0 q
   .release=mcbsp_release,) B5 l: H8 y! _' D( Z7 z/ a, L
   .write=mcbsp_write,
# k6 `0 w9 I, G8 Z$ ^5 _   .read=mcbsp_read,6 V3 Y1 D8 V. _6 p0 v+ a. h  W
};9 H8 ?. K+ O. s, b9 S) u6 a
static int __init MCBSP_init(void)- u# S9 O' b4 j- n3 G
{
) I, O) }* M, @. K/ H1 s   int ret;$ ~) t. A3 p2 `, r
   unsigned  int   PINMUX1_REG_old;
& K, o+ Q! [3 P9 O2 y   unsigned  int   PINMUX18_REG_old;4 Z0 p5 E. o# c* P/ Z) {/ ^) o& O+ \
   unsigned  int   PINMUX19_REG_old;
0 e/ J" L1 P7 o6 N/ l. r   unsigned  int   temp;  
( {' K$ {! S; D( \0 H. _   if(MCBSP_MAJOR)
0 L, }$ ?& u+ u3 x9 n; s   {
( _! g% Z1 z9 j; j. h1 I# g      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
: k) C5 P( x) _. B      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& D+ C5 v; Z  M6 h4 L. w  Q
   }
9 Q  N; I) T  T9 R. H6 G1 @   else
& v; B+ b5 i  X  Y   {
4 U! V, P1 \3 b8 V4 t5 o      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 E9 P4 q7 F3 W* r! t      MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 I9 L! K+ K/ f0 h" \# J   }2 f4 Z" C" M2 T, x# C
   
. [  _3 A# ]# P. G- d$ I# u4 E, O8 y   if(ret<0); F$ i$ @2 k% k( d( r  Z
   {
0 M, p* c/ V8 t+ D( l3 Z      printk(KERN_ERR "register chrdev fail!");' ?$ X0 z0 h5 @7 l7 O
      return -1;
1 z) \* @! n' S6 N   }
1 M, P0 Z* g  z, X   
1 G6 x+ ?8 g' d. i% Z4 [8 p  u   mcbsp_cdev=cdev_alloc();
$ a, ^4 ]/ D$ F9 D9 y5 j) m   . N" g6 I2 C6 v' U, q( s0 m7 D8 W
   if(mcbsp_cdev!=NULL)/ B4 {! Y5 P' W, U8 J
   {8 |: a! U" U/ @& h: X' R
      cdev_init(mcbsp_cdev,&mcbsp_fops);
1 o9 l  J! ?2 B) M; ?& G3 e      mcbsp_cdev->ops=&mcbsp_fops;' `' I% Y' F! l  l, [- z
      mcbsp_cdev->owner=THIS_MODULE;; S8 i7 y! p  `2 J0 q* y; A
      3 I5 k) X2 |1 [, B3 P/ Q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))- i  X+ K- j( i+ g! P) C6 H% o
          printk(KERN_ERR "register cdev fail!");9 V4 X, X4 g# }; n7 J& @) N- j+ v
      else+ j( z& Y  ?1 J4 C0 y# Q# J4 f) \
          printk(KERN_ERR "register success!\n");
! [5 _, r7 S  F$ F% S1 V, m   }# M+ b. A2 H3 j! E1 M0 p& g
   else, b4 |2 H! T5 m7 Q$ R" F
   {
  B, f1 O4 w+ L0 v      printk(KERN_ERR "register cdev err!");
' E. m) O' l( j      return -1;
" H/ L  u2 ^5 k- I   }
- W5 Q! P  p% O: z   
0 h) ~) |$ P( K" Z) x  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);7 x1 t: M# l/ Z/ d- ~
   if(IS_ERR(mcbsp_class))$ r* Q/ m7 N, V7 K
   {5 s2 ]+ t5 ?  {' r/ H: b0 r; F
      printk(KERN_ERR "register class err!");
0 X) t$ B2 }' e6 f+ c- @   return -1;
7 k) o9 E! r& j7 F/ {   }8 R9 `9 K' G7 M! ]' y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ u- a8 H2 `, J0 _4 f/ k( ^) W* ^" [4 y
   //PSC% P9 y0 i, K* T+ J" f; I" r) T
   //add Enable MCBSP/ N# d) M6 v8 N; D
   //test% u" x+ A% ?; Y9 a2 M
   temp = 0x80000003;8 E$ M0 M1 p) Y+ A
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
" {0 z* m) z8 V0 b   temp = 0x00000003;
/ N7 [' b7 k/ E# A2 N% w! F) _+ }   writel(temp, IO_ADDRESS(PTCMD_ADDR));
' |. ]* ^5 H7 D* K : I/ @, L6 _- L; _  w, v
   temp = 0x001FF201;2 C6 W; _, z/ \) E6 x( E
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));; Y5 |, n- K4 J2 C4 r8 X$ _
   
1 g" T- m6 P. C" V. [9 q! T3 C   //PINMUX  ; d4 Y% I) D: ]
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. S* w1 x% @2 S0 D5 V4 c8 x
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  & H5 E# |' I9 H$ j* J, D
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
- H+ w( c2 H3 N0 Z6 Q! {; y   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);5 M+ L3 t1 x% Y# m0 @% M
   
9 ?. j8 f: ]: V) f4 M0 d   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 j3 [% J: ^; _; P: t8 J
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; X" r" q+ l8 U8 B5 V   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
- x4 j6 N1 H7 i8 [; i* B, B6 H* S   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ e3 Z4 l: Q2 z6 U8 }0 ~& f& C  X 0 v0 T" x  G3 z8 T9 _! q
   //RESETn,L138_SHK2: F; G( G+ e1 i$ @* _* i: }! _
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
' o) K5 X6 v- h; n. X% {   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 Q- H  |! f* `/ Z   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ G5 Q# h* K: F# ^  @- t6 V5 ^# c

: d9 b8 m3 j. o4 [4 A . L9 k9 z: s* s3 U7 I( n' ~
  //SPCR Register
, m# [% f* A2 v4 ^  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- G. ~9 ]3 k$ N# p% k  temp = 0x03000000;//(DLB=0)
. j% c3 X5 K/ ?/ X! p3 i // temp = 0x03008000;//(DLB=1); R+ m1 c- f* y: E: z
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
7 V6 S9 `: R) ^1 n  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ F6 U& m4 K/ \2 t. n9 L- S, d, p  printk("temp=%x\n",temp);
' E' V; B" C% l5 T5 H( q. V
0 C$ b( E; L# _- }1 T   //PCR Register+ X2 r8 s/ T5 J2 m% O( ]4 b" R) e
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  a5 h" [. [% S. {0 q) R; a7 m  // temp = 0x00000F0F;' `7 T5 `5 {& l' i
  temp = 0x00000B0F;
7 _8 \8 c6 l8 r  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + w9 m  ~# L" n: x1 N7 [
  temp = readl(IO_ADDRESS(PCR_ADDR));  J* r, Q# Q! [4 p& W. F
  printk("temp=%x\n",temp);  
( l/ [1 ^" w$ M   //SRGR Register
! ~! J7 C* }4 Q   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11, b& |9 N+ |/ l0 p+ L) U  e
//temp = 0x301F000B;
) s" V% i( A3 [0 K9 o   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
7 N; _, R0 m, J0 ^! m( c3 z  temp = readl(IO_ADDRESS(SRGR_ADDR));
. B1 T, ]) q& A* k; ^6 k  I  printk("temp=%x\n",temp);
- G9 ?8 \0 p4 M: H   //RCR1 @  j) E. Z% ]$ B/ g" x
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 ^! S1 ?& r% c   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 Q1 |$ S1 w. _( m1 L; I. B
   temp = 0x00440040;' t+ s/ E6 _0 b! l9 I. j) K4 ^5 _
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
9 [( H  g- P$ b2 }8 O- n% F# g0 J   temp = readl(IO_ADDRESS(RCR_ADDR));
% j/ r8 a: G. F   printk("temp=%x\n",temp);1 Z1 Y) i) d+ h% _3 ]  }
   //XCR
9 [; `! [2 {  w, g' ]( Z/ d, b: `   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- ^; S/ o  `$ L; {  e   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
4 t+ m# i" b5 Z   temp = 0x00440040;) z! y- j: J) h0 l& S0 a
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + Z# m2 ?2 i3 Z0 h6 N7 d
   temp = readl(IO_ADDRESS(XCR_ADDR));
0 e  t0 g; z; @' z   printk("temp=%x\n",temp);
# K! Q8 u0 k, n% t: M+ x  udelay(100);. L& {# w1 ?% f+ q' h/ Y
  //SPCR Register8 F0 J2 u3 ^  ?0 V+ P
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" h" x9 Q9 o- U: v; Y  temp = 0x03C10001;   //DLB = 0 VS DLB = 1) o9 y( p: p' J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
% b9 G4 ]( f: F$ u1 N  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ \0 s2 w( V& V( R- Q" W/ G  printk("temp=%x\n",temp);
+ g+ }& r5 h7 B3 ?: U  udelay(100);, @/ s7 O- e! a2 B0 S' a1 W

. y' M' ?; Q9 a9 v  @  //set GPIO direction7 E* v7 J- K3 k$ f
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
) p+ D$ W- T- ]   temp = temp | 0x00000100;//EPR----input
2 ]3 h3 @* o' ^9 K   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 O( V4 |7 E% X6 q  m0 {6 o   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ' J8 |9 R! B- M( {) D1 a
5 K) ?6 M- G& @; d
   return 0;4 D1 N) b9 A- ~
}& V! r5 q0 }; Y' w+ X
static void __exit MCBSP_exit(void)) p6 h7 X9 H& D$ r: x; h3 m" A
{5 Y- l" |8 ?0 T) A
   printk("mcbsp chrdev exit!\n");. ^* F8 g# ]) g: E; @
   cdev_del(mcbsp_cdev);
7 T! ]2 j7 t* N; ?  K/ t   unregister_chrdev_region(mcbsp_dev,count);$ x# ~$ W  z) `' u
   device_destroy(mcbsp_class,mcbsp_dev);
/ ~9 K" u  X' }+ j6 S" V   class_destroy(mcbsp_class);1 ]( v6 u2 N5 C; V2 n5 y1 U
}
6 {3 H0 i+ H  T& Tmodule_init(MCBSP_init);$ a% R5 O/ f4 K  @
module_exit(MCBSP_exit);" @0 t8 K6 t6 s9 j9 y1 ]

3 T# F, h# X& C; YMODULE_LICENSE("GPL");
/ J; |; N7 h0 D/ A  }" h5 ~; z
# J3 u" l% i- i) W: n我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 L1 e6 @. ]1 b8 |9 X! E/ w9 F1 @我的应用层的测试程序如下3 x# c, }4 B: Z& L2 e3 H
#include <stdio.h>3 {  c6 z; V6 p  Z& Z7 [( s1 ?5 l
#include <string.h>
0 h+ V) u+ \# j( n  f6 P#include <fcntl.h>
/ N1 n; d2 I. C% h) J#include <unistd.h>  [6 @9 _+ X% x, H* R
#include <signal.h>
1 k8 U; G; e! {' B#include <pthread.h>       //线程
2 P( v" I% L5 _% V#include <stdlib.h>% P' P# x( U% y; V( H& D
#include <pcap.h>          //捕获网口数据
6 ]' g. Y7 Y8 j) o0 ?) m  g4 q#include <semaphore.h>     //信号2 E6 A% i2 n8 e; K) T: P6 w9 q6 a
#include <sys/types.h>     //消息对列
( R3 ~' _8 c  v#include <sys/ipc.h>       //消息队列5 K! I3 f/ g9 ]9 U8 |
#include <sys/msg.h>       //消息队列' j3 y# f5 _' f1 H. Z
#include <sys/select.h>5 P1 B+ l9 n* v; }6 }8 x
#include <sys/syscall.h>
6 E- ~% ?1 V8 Q& g#include <sys/stat.h>. k6 z* u' b# R4 s/ @5 ?
#include <sys/mman.h>/ ^5 r. i/ E: I: }
#define msleep(x) usleep(1000*x)! b# j3 f9 w. C) M% M/ d* A

3 I9 p& d8 H1 J7 h0 J6 m: Cint main()# |8 s$ [, i2 o/ T
{
# ]  y/ T1 o! o' @# e6 o) F    //MCBSP,ARM与AMBE2000交互设备- R* ]/ {# y% W9 {
int fd;
5 @$ H! h3 b4 ~. n3 `2 _% r unsigned short data_write = 0x5555;$ y: ^! @) Q5 ~4 ^; Y, r; h. B
unsigned short data_read = 0x00;" l7 Y$ b6 {( @& G- A3 ?7 C
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 k9 q5 L2 E( L" r& u //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 ]4 \  J* C& `    0 Q5 m& S% U9 H" s0 M- {
  if(fd < 0)% X- h1 R& P* t( ^  @3 V  Q
  {
4 B* J2 K/ N. T     perror("open failed\n");8 x7 e( o) Z- T# N0 ^3 b& M
     return -1;
3 y) w, u1 |2 J  }
* w0 ^: G7 s1 Y: T0 R, ]  
/ x4 |$ x: t' o, e) z  while(1)
' N5 b9 q; [( g) X; B! d  {
: \# h( H& P; c   
& @; E$ p9 _4 K+ I; C   //AMBE2000每次读写是24个字为一帧4 \" M  D' _( j# n& C& M
   //写数据时将数据在底层存储起来,等到中断的时候再发送2 m1 d$ R  Q. \
   //AMBE2000输入数据是以0x13EC开头的  Q, {5 ]; o$ W, C: V4 x$ `
   write(fd,&data_write,sizeof(unsigned short));7 N, }& W  b9 u5 r  j
   
$ h4 H, g' K& f4 [5 Q   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- O) l2 A" Z! j6 Q; I) S2 q3 s   read(fd,&data_read,sizeof(unsigned short));- D7 o! H6 B) N2 j, _9 L
   
% f: X% t' J" [: |/ _+ y   if(data_read == 0x13Ec)8 y/ T, d2 x4 g
   {
3 ^' ^7 h+ C+ |* r9 a0 W   
5 G) I( I1 P1 ^$ w+ @( b4 G    printf("data_read = %x\n",data_read);3 x: A# l; _! ]1 j  I: J% g$ ~5 F
   }1 j5 z: u: o! W1 m' B$ @7 ?
   
# P: i& q9 U1 h. W, Z   msleep(10);
& T; e4 g; K. p' Z  
  C& y  e: w0 W) W  /*6 I8 r, ?  Z; P9 S: t/ s. E
   ioctl(fd,1);   
5 M9 O( j& S5 A9 U sleep(1);, \8 |" t+ A0 V# E* Z( @
ioctl(fd,0);$ ], ]+ }& D" f5 t- m0 Y$ E$ x
sleep(1);
1 j' w" f, X4 k1 i */ , B6 ]" N# y/ M# b  Q
  }   
% d; s/ x9 L  Y. ^ return 0;0 J  P% z% k* s' o! G/ U

- U" k4 a- `+ U5 L$ f5 l8 n5 S9 L! \, V}
( t* C) G4 w; j: Y. t2 d
6 F0 f; E' u2 S1 \多谢各位指教,谢谢! 急" `0 Z, s5 ?6 K: R
" O9 B# A& b  K. ?; B7 [  d) H9 [
! @! n8 e. g/ F) ~

9 H0 O# c4 f) {- n
0 ^7 i# Z$ ?9 l$ s3 H
$ t9 W) n& `( K: w- _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 17:03 , Processed in 0.070536 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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