McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& @) s0 n. b9 e0 q/*
0 y2 o, ?5 J! x * Copyright (C) 2009 Texas Instruments Inc
% q* z2 p8 M! z *
% v$ \3 g! G/ e9 J, t * This program is free software; you can redistribute it and/or modify
! V% ~! {( q( f2 q  e( I; a4 h9 C4 L * it under the terms of the GNU General Public License as published by& {9 }  f4 R% |( I1 d
* the Free Software Foundation; either version 2 of the License, or! k1 ~: v2 }8 B/ W% Z' A& i
* (at your option)any later version.* u' j: Y! y. I, S/ m  ^
*
, B5 w' {  D! C; z& }/ y) W6 f+ {  p * This program is distributed in the hope that it will be useful,
  d5 R( {* M6 k2 o+ o# q * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ d& [& G% ]/ o# s# _+ j * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 `. r0 b) |9 h+ u+ x8 P * GNU General Public License for more details.3 a$ W' M, ]# n. |
*% \1 }% g% m  P' G* }
* You should have received a copy of the GNU General Public License# w1 `5 ?+ _# D; c* o* V. n
* along with this program; if not, write to the Free Software
+ s* r* Q" H4 O/ m1 p * Foundati1 O5 N1 |; T* X, Y9 ~
*/
7 f/ Z  n( L; h2 x7 o! L! H+ n: w#include <linux/module.h>1 O  B5 A7 t2 x% u7 Z8 z' a
#include <linux/init.h>
& |) ~" b/ b/ A2 W. Y8 C#include <linux/errno.h>
: b% Z$ p) F- |  D  \( H#include <linux/types.h>: x: B$ x2 B6 q* t* H' i
#include <linux/interrupt.h>
# d+ n$ O2 K# ~! W#include <linux/io.h>8 ]1 P* F4 w3 G) M0 C( m
#include <linux/sysctl.h>' p5 m4 b: ?+ p% ~
#include <linux/mm.h>5 a, f( c; E% ?
#include <linux/delay.h>1 U+ G/ U% A& C1 W& A
#include<linux/kernel.h>" o8 B- P7 s1 Y
#include<linux/fs.h>7 h5 B8 l8 G1 o, C  T! E
#include<linux/ioctl.h>
2 d, V5 e/ S8 n2 Z& d* W: w#include<linux/cdev.h>
+ H) }* u! z; N" ~$ s% p7 ?#include<linux/kdev_t.h>, q; f7 K: V6 B: ]4 K4 J
#include<linux/gpio.h>
$ q+ i' a# Z" x5 C#include <mach/hardware.h>
/ B1 E  m+ N5 ?- M- V# Q1 s) M' a#include <mach/irqs.h>7 y8 G9 R/ p# }
/ k3 e/ a9 ]' W  t; y' u9 [
#include <asm/mach-types.h>/ [2 C% n% G# R* s/ P$ G" U
#include <asm/mach/arch.h>
) {/ [& t) ]" p! w#include <mach/da8xx.h>; w& O" j! K1 ^3 Y, l
#define  SYSCFG_BASE   0x01c14000% v  Z7 h  S3 O& J2 {
#define  PINMUX1_OFFSET   0x124
# y6 _7 `5 a, k8 C* z# ]#define  PINMUX18_OFFSET  0x168 6 W5 O. ^1 u0 M
#define  PINMUX19_OFFSET  0x16c2 V* D: N9 \: N: }& r
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR5 j+ D" k# \8 ]9 ~; h" U
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 b6 i4 p( c6 B1 H& [" a
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
6 f" C. T+ H# p5 O#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
1 F. y1 x- ^# p9 X, j6 q; q8 h#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR5 u, ?; |: K. [1 A0 p7 N' U0 ^
                            9 c: Y) c, Z8 Y8 P" P3 _; C7 J
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
: t% w, B* U: e2 F$ q, y% f" A+ |3 i#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# _1 B2 K( ]1 e' E/ K
//PSC& \$ ^/ f2 S+ N9 S5 M
#define  PTCMD_ADDR   0x01E27120  
/ C1 H+ \! z. ?) n  j  w% q% ^#define  MDCTL15_ADDR 0x01E27A3C
$ |. ?* t; t; S) ~# Y#define  PDCTL1_ADDR  0x01E27304
4 N- D9 z5 d3 m" ^* N$ G0 C//GPIO8 direction
" _2 C9 }$ [+ F  p; Z; Q4 h( i#define GPIO8_DIRECT  0x01E260B0
, o, d. ]( z) b! \0 o9 _9 @+ ?#define GPIO8_OUT     0x01E260B4
8 I; D- B) X# S+ H" M7 C9 N#define GPIO8_IN     0x01E260C0
! _# y) U; D" a9 k2 ^( o& ^
9 t' m# L! s+ T1 {9 ^//#define MCBSP1_RINT    99              # C' o+ b% E' ?3 Y) O* m2 y
//#define MCBSP1_XINT    100  
% W9 U7 _) z% q" vstatic int MCBSP_MAJOR=239;% K, Z( s" w' ^* D: A: d
static int MCBSP_MINOR=0;+ T  t( t9 Y9 j9 n
static int count =1;
; d  w, z& K8 @& ~" B: m2 f& E' o
2 p: ]% w2 H! J7 ^$ \$ T#define MCBSP_NAME  "MCBSP-device"/ q1 Q) V8 z  N3 l( M1 V' b- D
6 a, ]/ ~+ B, G
static struct cdev *mcbsp_cdev;
8 a2 X. x# f$ F5 R, ^' l0 l; qstatic struct class *mcbsp_class;) S" G- S  Z9 ^. t
static dev_t mcbsp_dev;
8 u6 R9 V2 Q) @* y! Q! v1 Cunsigned int DRR_data;1 ~! F: [) c% z6 I, F
unsigned int DXR_data;
( X( b9 {) m4 m- Q2 Wstatic int mcbsp_open(struct inode *inode,struct file *file)$ O# C8 v( c5 p$ G7 k1 J+ o
{5 X! M1 @& y* m& P- t
   & k  c8 Y; W- g1 z4 b. ~7 E+ g" v
   //interrupt enable,initialized5 Z' q2 I* G7 Y* L, U( g( }
   unsigned int temp;
& ^' d0 b, y+ _6 |& \0 b% W. m   //SLEEP_EN(GPIO8[10])---08 j! I  ^3 I: u
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 a: q+ m1 R: N& y* D# T3 |" ?+ w   temp=temp&(~0x00000400);
: O; O# P( j9 `- _   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 S/ n5 |* X/ U; T9 \  //RESETn(GPIO8[8])----0----1
' F2 k4 @% w  v2 ^* D9 R7 B) x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& F  A. Q3 z8 P8 Z& e$ R9 ^. a
   temp=temp&(~0x00000100);
' x( E( \5 Q( L# C9 l+ f: q: K   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0% ]8 B0 H7 v6 @0 u% S& B' e
   udelay(100);
% u2 O' s: O& j6 m6 p9 N   temp=temp| 0x00000100;4 e/ f! d  }- D5 i
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  G5 i4 p6 |% v# j   udelay(100);
, G0 T0 }1 p7 W$ r6 Y$ p. J4 W9 g   printk("open success!\n");
4 {; R4 j& s% p* q  N1 C* M   return 0;
  P7 q. |5 o4 V1 D  y; ^6 ?}
  H0 U! u/ Y  R* x" K  U
7 A6 b% e# U, W& F. i" ~" [static int mcbsp_release(struct inode *inode,struct file *file)
% p6 k- Q" L7 F{
) z$ `# ]4 l( s2 A( x4 n$ c   printk("release success!\n");7 q' j4 x$ b' n6 S! _6 @; j* I
   return 0;
) \* v* o" ~" s1 Q# w6 B}
( J" }% S2 y* d
+ T$ L9 Q' c% _: Z3 }0 l2 H; nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  Z% ?% G7 J8 f' w! F
{
5 I$ a0 k8 _- T) X/ J; y2 b' N8 H    copy_from_user(&DXR_data,buf,len);  |, x  F: P4 L4 M/ b8 e
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 g  C7 a/ v; I* ?0 `" Q    return 0;: J6 u6 U; F1 }( o4 R9 f' Z2 \8 b% D

) w- D. U' ]. w, B$ p6 |}  ~7 ^# n  m5 D0 I+ B) t
7 F! c/ K/ G0 a" c# v1 E- t2 C
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ H1 h4 K- n1 k% L) a{ 0 u; j; s2 y7 b- L' y: A% R
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 K& n8 Y3 J) n5 z
   copy_to_user(buf,&DRR_data,len); 6 J7 ?1 s. @" q+ A" E9 j
   return 0;6 o& A( G% G+ \$ k
}' v0 H3 r5 _3 I( i

! @2 V1 t; S2 Y" g& i4 P, O$ |+ z8 Q7 s$ d4 s# F7 `' [$ C
static struct  file_operations mcbsp_fops=9 w( E6 K% m3 P' p
{0 K* |/ S8 s6 n" `5 H
   .owner=THIS_MODULE,
- w9 }# e3 y; z0 ?6 `) x, h: i   .open=mcbsp_open,
( d$ K' P4 U: k8 M7 D   .release=mcbsp_release,) g( g# O7 [8 \: f; u$ h
   .write=mcbsp_write,
8 c, @  T/ y, @- r   .read=mcbsp_read,* j5 C) {* _& G. M" ?
};
3 g* G, _- z1 ?, V! u6 _static int __init MCBSP_init(void)
; C- |8 c- y- l  G{) Z: e3 I8 o- l" ~2 L! U, k
   int ret;
( a; }: O7 b% o9 ?! a  R- t   unsigned  int   PINMUX1_REG_old;
$ o+ a- p+ z  z! e& W   unsigned  int   PINMUX18_REG_old;
" R; \/ e1 z  k# ^2 p( v   unsigned  int   PINMUX19_REG_old;$ l6 Z; |. S; J- |# ?3 u
   unsigned  int   temp;  
: F4 \$ s$ K; U   if(MCBSP_MAJOR)% z9 k' I9 S+ T- g2 [# _
   {
/ n8 _3 T1 L+ o# m      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. N( y0 Q9 Z+ C% @* l4 {
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);; T2 Y# g- H$ ^- ~
   }8 k0 A0 x5 n& K7 [' ]  g/ v
   else
5 e  ~7 ]$ t8 {( y  }0 V   {  ]) r, G2 d* ^6 k$ u. P
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  \7 M" h( Y( c% [
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ M+ h5 @0 |5 ]   }9 a& g) n4 G9 M' E
   : r# W  G: @: t
   if(ret<0)- o) [, X: ^8 L! R# R  {( y
   {6 e! o4 @7 ~; U3 |- A+ J6 N6 J- ?! @
      printk(KERN_ERR "register chrdev fail!");! m5 u# p  W3 I* F: q7 N
      return -1;
, H" p5 |9 e" F# B   }
9 X- l! p* C" g, Q   + Y2 C2 m+ Q& P, a1 w
   mcbsp_cdev=cdev_alloc();
' e; U' u+ W  Z3 Y, }   3 A3 ~- \# q7 B) c4 e( \) @0 O
   if(mcbsp_cdev!=NULL)2 ?% j# p6 Y0 d/ V0 w; }1 L
   {$ p* O3 ~" x  J
      cdev_init(mcbsp_cdev,&mcbsp_fops);
, m9 B- {: X% m! @! o& q& E      mcbsp_cdev->ops=&mcbsp_fops;+ J" s7 ^& ]7 v$ ?
      mcbsp_cdev->owner=THIS_MODULE;
% U$ g* Z. c) T8 e6 H* [, U      * p' M3 s* R* H6 w0 T% H( e! G& K
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) ~0 S% S" i4 R+ z8 r4 y0 H          printk(KERN_ERR "register cdev fail!");$ _* T/ T' m" K8 E' o8 ?
      else
7 j4 v) g4 k5 @0 ~+ Z2 v/ N          printk(KERN_ERR "register success!\n");. e4 C# ?9 n. j1 m% e9 ?& c
   }% b3 A7 N5 a. H* X- r) e
   else
1 [$ f4 i$ b3 n1 {+ Z# l   {
0 u' L0 x1 o  `5 [( \      printk(KERN_ERR "register cdev err!");1 O9 a4 w% d+ L; E6 ]$ ]( E
      return -1;9 s9 T7 M6 L2 h+ W' g# I' w
   }
5 y7 ?' K! {5 t7 Y: y1 m8 n   + o3 J: V4 [3 ?% U5 |
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% Q! j( g) I' I
   if(IS_ERR(mcbsp_class))
0 ~0 S. ^2 ~$ S  E4 F   {# C$ E- L. o. |
      printk(KERN_ERR "register class err!");3 H* D0 _2 _/ w' l( u- z
   return -1;0 d: P: z( t2 {! P. N# H
   }
: d( V8 r# _  I/ b& K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ I1 G- {3 ?/ D# i

" P& Q7 D. `. L' Q, _: n' ?0 m) ^* P   //PSC
3 F: W/ t4 [8 n5 g8 S   //add Enable MCBSP
( O  A( t% q% v1 a0 M   //test2 D, b1 ^' G7 b  Q: G* P/ K
   temp = 0x80000003;/ Q# p# ?$ w3 u; v6 f" A
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 I3 K: \+ `" v
   temp = 0x00000003;
6 M3 {- `5 R/ Z   writel(temp, IO_ADDRESS(PTCMD_ADDR));4 C! [  v9 m" }% L$ O/ X1 Q) ~
. q: X- }: T9 j1 S1 R$ S4 y( D
   temp = 0x001FF201;# q  t/ e  J9 }2 @1 \( @' ]% @  o
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. E( `0 i( d4 F: Z  ?0 Z* h5 w   
9 ?, |# ~9 J- Q# e; \/ h6 M   //PINMUX  6 F) J  H$ n# g; b) O# [
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" R  _4 I/ s, o0 x" F0 L1 o  p   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
+ ~+ L- Q# D! T2 E4 \9 A( U   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 w* E; A( v9 M# x; [& T  z   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" D# W& P' w. e: Y; ?5 D
   
: K% M, V5 w: M4 I1 d4 j   //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ O0 ^# G# M! m: j) _1 a( j   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);    M$ H3 k5 v! J6 v
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   9 e( L6 }6 x7 H# `7 l) T* @
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& R8 {( E3 p" d. R1 K / O6 w7 L% e4 Q% z: {0 B7 G
   //RESETn,L138_SHK2
/ g& r9 i, g3 @# U' J  s   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  7 ]& T, C' D. _. o: n5 t! Q, g- e
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
5 R/ e5 r. J  F# u/ [: u# h   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 q: y- {, f, I+ i6 q9 V& i- _5 M
3 m( p- v' K! r; N. d

: K) Y! L. i" _. h  //SPCR Register: C; I8 E0 d$ K( S3 j% o" b
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. {7 T1 B1 n- w5 ]
  temp = 0x03000000;//(DLB=0)1 X  p* w  j) i- @) J8 }  P* S% @8 Z
// temp = 0x03008000;//(DLB=1)& c% |6 \" P  X. |
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 E7 y% Y8 @: n( r
  temp = readl(IO_ADDRESS(SPCR_ADDR));9 v0 Q8 L% i- Z- o1 b$ X: M& [' L2 T
  printk("temp=%x\n",temp);9 Y  {9 C) p. M2 e2 T& D3 V

5 K0 U' I5 C: L. A" K   //PCR Register
" g/ J) B) L9 j+ M   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 k9 m+ a3 I8 s7 n
  // temp = 0x00000F0F;
0 b4 S6 |8 U' j4 u! _  temp = 0x00000B0F;* x# T4 _) @+ p6 m% k
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
5 k- |$ z% P. i5 W8 d2 C) y/ F  temp = readl(IO_ADDRESS(PCR_ADDR));
3 G8 e$ U$ T& f& F! ^4 |" s1 q  printk("temp=%x\n",temp);  
5 j6 K5 B) n1 Z9 A   //SRGR Register
3 \9 X1 u5 d: e+ d) z' `   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 s5 i; H, ?7 b; i1 ?0 I
//temp = 0x301F000B;9 E! Y5 M$ ?- H7 k- N
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
0 V: ~  g7 Z5 f! [, E% i; g7 c% W  temp = readl(IO_ADDRESS(SRGR_ADDR));& T* d: ~$ t) b0 e6 L9 W
  printk("temp=%x\n",temp);  W# a* V- v7 _+ z8 M4 R6 M
   //RCR
8 a# @* X  F3 F7 h" Y" b   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
. [1 d+ F& |3 @0 X! u6 \% p   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 Y8 x& \2 \3 m1 P   temp = 0x00440040;" Z8 ~$ T( L9 g% ?
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ! S, W2 g# R$ B3 S! `1 [9 ~
   temp = readl(IO_ADDRESS(RCR_ADDR));
' Z. V" ?0 t, p) Q( C/ N: v/ {   printk("temp=%x\n",temp);
$ ?8 _( u0 {: c. E& n  y9 h   //XCR
1 I; ]/ h+ I( c, J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 _+ V/ Z0 A) b- T2 t
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% C0 J8 P, \& V   temp = 0x00440040;
8 E! E; U: k6 v: @- m   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
& B2 u7 a) i2 A$ A) k+ e9 C# H; h   temp = readl(IO_ADDRESS(XCR_ADDR));
: }+ S. X/ a: n6 I   printk("temp=%x\n",temp);% c8 f( C$ [2 [# b
  udelay(100);5 N/ _+ _! p" M+ ?7 B* Z3 K) f
  //SPCR Register" n+ o' r$ N  E
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 C+ Q9 i, Q) s+ t% f+ E
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
) E; H" k8 |' l/ D9 b+ V  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled- s" @3 W; M) E
  temp = readl(IO_ADDRESS(SPCR_ADDR));
  u# \0 g- X1 _2 |! \! k  printk("temp=%x\n",temp);
, w7 o- a6 G$ F: X  udelay(100);
9 y9 Q. }! s' D1 V
9 \3 G2 L+ t$ O+ W0 u  //set GPIO direction
% T: L, A/ [7 E  D+ T4 z8 S1 ]* F/ `$ o, ^   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 F& Y6 j. p& o/ n) i0 t   temp = temp | 0x00000100;//EPR----input5 M, }6 q4 M, \
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 R" W8 L# }6 ^  s
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' |% _* w, K7 B" F
" s/ O; B+ _& _4 u6 T. M4 S4 h   return 0;8 C- [; U. q8 v+ B
}% ^% w% S: r8 q/ T; |
static void __exit MCBSP_exit(void): r) x; P) j& M% F, W
{
, q+ O' ?# P; ]4 f4 l4 e8 X, P- B   printk("mcbsp chrdev exit!\n");& k7 V! |3 b; o2 C
   cdev_del(mcbsp_cdev);3 Z  @3 k. m9 s. @7 Z
   unregister_chrdev_region(mcbsp_dev,count);1 r" Y2 D0 p# Q# u' N
   device_destroy(mcbsp_class,mcbsp_dev);- s) N& d8 a2 n0 N. X; }
   class_destroy(mcbsp_class);
3 L4 ~- Z; [: [4 W3 y}; G0 b$ h0 b. N8 U/ ?3 W8 |! N: o1 i5 x
module_init(MCBSP_init);1 e' p: U. Z1 A& W3 O
module_exit(MCBSP_exit);; a4 H. n9 c& r1 x/ f  k
: Z* y2 ?1 P7 `. |$ h2 C4 m
MODULE_LICENSE("GPL");
' X: k4 j& e7 x' P/ y' |6 }
  P0 f6 P; z7 m我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* k5 o5 F( A  X9 {
我的应用层的测试程序如下3 Q% \* `5 z: @- }& Z1 W4 W
#include <stdio.h>7 W# c4 ]0 e! [
#include <string.h>
1 v( ^+ d% d9 T$ \3 R#include <fcntl.h>
+ s7 \" o$ s1 U. Q) u$ O#include <unistd.h>8 C. m# X5 c9 x& S0 d+ C
#include <signal.h>
2 ~( y* h6 ^3 V; `7 Z: v#include <pthread.h>       //线程
' E% l4 ?. H6 @! _5 \#include <stdlib.h>
: ~6 u' [8 {- c7 f#include <pcap.h>          //捕获网口数据
) |& C! j/ a0 h" o#include <semaphore.h>     //信号  o. Z1 @8 O, Y4 ]. W! E/ q. }; W
#include <sys/types.h>     //消息对列
5 a. M5 y! ~/ L8 U  J! O& q  w7 c#include <sys/ipc.h>       //消息队列& W+ \4 E$ o/ i& i% {+ B1 E
#include <sys/msg.h>       //消息队列
7 V( V0 l/ E9 _& ~#include <sys/select.h>/ y: x0 w# e# C0 I: M. ^, U; l& J
#include <sys/syscall.h>
/ v9 Z! [9 p% X7 a6 D4 J: |# C3 M  D' l#include <sys/stat.h>- I3 i! M( a+ j0 T. g
#include <sys/mman.h>
4 k# j% \  h+ m1 U5 C) ~#define msleep(x) usleep(1000*x)
3 ]2 L1 s( T: Y8 p: t: S4 P; {+ F# ^1 N9 H. |/ Y5 {
int main()/ d2 y. b2 b& P0 m' H. ?4 K; p% s
{ & E9 o1 C2 W# V7 O+ `' e2 \" z: A" Z
    //MCBSP,ARM与AMBE2000交互设备
+ L$ X; D' T6 ?8 v0 M; Y int fd;1 B; r1 F- f7 M$ B4 D( f' Z3 T
unsigned short data_write = 0x5555;4 M# a8 i  f8 t7 s4 ~+ F: U
unsigned short data_read = 0x00;
1 n! ~- E8 o" Q  e  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* L3 _( P) ?; ~: E: |
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);  W' J" _% m8 h& |
   
; p  w- r/ {' W5 p9 K# u: P  if(fd < 0)
  l+ C: H/ n$ E7 v2 S+ {  {8 h2 V% Q8 l$ ~0 E4 s# M* H
     perror("open failed\n");  x/ N6 R6 x5 t
     return -1;
1 P- _1 ?7 Z. m" M( h2 o4 p( w) }  }  s9 K/ p* D$ `$ t; V) f7 J
  
0 x2 ^* b  x9 I8 |4 L& n' ~  while(1)
8 V: I3 l) l5 \% X  {8 m/ b, c' _% n/ H0 h  k
   
* }7 g6 A0 K. o  A' h* j   //AMBE2000每次读写是24个字为一帧
0 ^/ k. r& U* n5 P; e" I1 n- K7 q- v1 `   //写数据时将数据在底层存储起来,等到中断的时候再发送9 e7 k; n/ ~7 |* w8 n
   //AMBE2000输入数据是以0x13EC开头的
2 a6 h2 x; Q/ X# q  \   write(fd,&data_write,sizeof(unsigned short));2 l0 }7 j1 {9 y% o  z. c+ q/ u# Y
   " V( M1 y. U/ {1 C, w$ s6 C9 D
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ) G0 f9 j& h: Z6 D3 E, X3 c
   read(fd,&data_read,sizeof(unsigned short));
% J' S) t6 r  J% w   $ Q  z: T! L  R: N& Q! M
   if(data_read == 0x13Ec)# z( Y; F& o( G. L: V5 L3 ?
   {
2 X* ?% I/ A) P+ F. T5 u  \; C   + S7 O/ h% u  c! P4 A
    printf("data_read = %x\n",data_read);
# o) f- D& N9 @) F' C4 \   }
( v7 q: k: a  X; ]2 U% v$ i5 h" Q6 a   
* e5 f6 f1 {8 a* V! B   msleep(10);) Y6 G  ]; S; c% X2 _1 h
  
6 }/ D' G/ ~0 v8 W& `* o: ^  /*
* b4 ?- d, N5 i: P6 u5 j   ioctl(fd,1);   : q: A9 N, U; P8 q& {" ~$ ~
sleep(1);) r1 Z. D7 Y% W% c+ k8 q% m8 P
ioctl(fd,0);
4 J% K$ k  R' [+ }# m- f sleep(1);2 E# m6 K, B8 N: I, |! W
*/ 5 R. _5 _: ]7 N! ?# a
  }   ! k9 E& s, i) X- y  E
return 0;
$ ~2 g5 J* ~1 t
) P3 j' n/ R3 |2 `/ q}
/ u" Y# s2 L  g
9 W; X/ n4 _* ?4 S% l1 o多谢各位指教,谢谢! 急$ G/ d9 r  p; D3 M( \0 ~
# v( c% H5 q* w- n

+ H* \4 K+ O; T2 z. t# k  a+ F! n; ], \9 q" t2 ?

0 ^) {9 k) R1 X' \, u2 ^
& `. P/ Y  E8 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 07:40 , Processed in 0.049648 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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