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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 _) l+ `: X. K' ^/ v' I
/*
# r0 l) {0 F9 r" S( n! L * Copyright (C) 2009 Texas Instruments Inc
6 M9 r  t# x: n7 O8 N, G# p0 v *  T* D( X" w3 T
* This program is free software; you can redistribute it and/or modify
/ Z" ~  c$ C$ a- g * it under the terms of the GNU General Public License as published by
# O) R  c0 L; c% g6 |4 e. k * the Free Software Foundation; either version 2 of the License, or6 y' I4 N6 ~' q: r& w' i& `+ r
* (at your option)any later version.
; D; R: O2 ~( r, P *! Q" T7 v1 C9 O' {8 d) W$ N" ^0 V
* This program is distributed in the hope that it will be useful,
# L  z- `, ?; H" H, D * but WITHOUT ANY WARRANTY; without even the implied warranty of
! b7 m4 B; v# m1 |) ` * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ l- h$ M/ J$ Y+ x * GNU General Public License for more details.
0 r0 [+ w, C$ D2 \7 W# p6 i( p *' |+ ~: f0 K/ `) w4 h' U8 Q
* You should have received a copy of the GNU General Public License
3 `* L- w$ J* c& G5 p+ k * along with this program; if not, write to the Free Software
, e% f1 s6 F- S0 w9 R* g) ^8 C * Foundati4 n+ i2 e5 }# \2 q; Y
*/- [8 l0 ]. B% p7 _* Q% O5 E/ e$ ?9 {
#include <linux/module.h>4 w! J/ A( g: p2 [" {
#include <linux/init.h>
, r0 ?8 N4 @5 j) d' ]#include <linux/errno.h>
3 o: y0 K* F. z! H0 m. ]2 G#include <linux/types.h>; |" Z3 @. T# z4 X
#include <linux/interrupt.h>
2 |% }: u4 y; v$ M" k# N# g; R#include <linux/io.h>
+ O) D( k  h" J8 S: y, w! L#include <linux/sysctl.h>
" T6 l) k: J+ U1 S  W#include <linux/mm.h>
$ h( H* `+ F% n/ {. P#include <linux/delay.h>
/ A) \9 S; l" _6 {0 m3 {# \5 T#include<linux/kernel.h>5 y+ V$ N; i" X, d. T2 B. F
#include<linux/fs.h>! G0 e7 i; `6 p3 u7 s) Y- |
#include<linux/ioctl.h># [7 L& A- j  ?0 ]) f2 y
#include<linux/cdev.h>3 r+ ~* w: F+ V/ g1 j; q/ m" x
#include<linux/kdev_t.h>
. d1 X. l. N: ?* U0 w, S" j& {#include<linux/gpio.h>
2 S9 \8 b( y) |! `( }$ ?#include <mach/hardware.h>
0 ^4 q& d& `8 M. v#include <mach/irqs.h>* A7 Y# c4 F. I/ X9 ^+ F

/ |5 z0 e. }# ^3 A# g4 o#include <asm/mach-types.h>
: T3 a$ {  M  U. N4 _9 ^#include <asm/mach/arch.h>
. d5 [- r" _* B6 d( w# V#include <mach/da8xx.h># k$ G0 y3 a. n0 ?6 ]
#define  SYSCFG_BASE   0x01c140001 ?3 O3 U) }) i/ O8 n4 O" D
#define  PINMUX1_OFFSET   0x124 , M4 ~4 n/ O' O: b* P) L1 a6 e
#define  PINMUX18_OFFSET  0x168 ' J( b' I" V8 t
#define  PINMUX19_OFFSET  0x16c) b0 k9 G9 u" N6 @" f
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 W0 e6 D/ ^* K# S  f#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR; D* Y' c2 L( m# ]
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
: q7 D: x4 j' G8 k. v#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; @. ]* L9 n( k/ A- ?: c
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ W! z% Z6 S0 f4 z
                            " {, O4 W8 u; m5 q( r
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR9 s- b4 T3 T$ a- g
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
% f1 p/ ]5 R& t6 ?" H. i) ?8 H0 T//PSC+ N4 S6 ^, T5 R8 i( U+ |4 g, d
#define  PTCMD_ADDR   0x01E27120  
9 M* K  R# [& b6 k: A#define  MDCTL15_ADDR 0x01E27A3C
+ Q$ q( R, I% \# p- u( t#define  PDCTL1_ADDR  0x01E27304, l6 Q1 ~& F9 d& i; v
//GPIO8 direction+ y7 X! p( G; S
#define GPIO8_DIRECT  0x01E260B0; n# }) A5 R$ T. H* z# _! ]9 n& l4 u
#define GPIO8_OUT     0x01E260B4
- ^# b) N8 I! s6 J  t6 X- G1 N8 Z#define GPIO8_IN     0x01E260C0/ Z9 ?1 Y& Y' q; G/ Y: y' e  c" Z

4 c6 O$ V0 n7 |7 r' E//#define MCBSP1_RINT    99              
* U8 ]" @" @5 X& L//#define MCBSP1_XINT    100  
: I( O+ E  S3 W) [6 K! K, Ustatic int MCBSP_MAJOR=239;
, h. T' [+ K% W+ j2 X3 g8 bstatic int MCBSP_MINOR=0;
3 f2 c: |: f- G; |' y, U0 E! Gstatic int count =1;
( Q. C) \7 J4 Q) v5 t. H2 b. ?7 S- v% T: `6 s. e1 P0 G5 d: ?
#define MCBSP_NAME  "MCBSP-device", l# H8 W' a; _! C( @' Y

* J2 T+ ]9 U% S: W1 b& s+ ]) zstatic struct cdev *mcbsp_cdev;
1 V" O( b, z# N# Astatic struct class *mcbsp_class;, d7 U' i5 d1 m" t8 _+ Y% x
static dev_t mcbsp_dev;( s8 F/ b% Y7 T* p+ O% [
unsigned int DRR_data;
9 c$ H! H$ f2 Y  ^$ s' ^; wunsigned int DXR_data;0 @9 W2 ]/ Z: D) x; F
static int mcbsp_open(struct inode *inode,struct file *file)6 b1 G8 P# m* K" N' n/ h  q( H
{( L- A+ H4 ]" S/ F
   + w( M  b8 ?/ _6 O5 \8 |
   //interrupt enable,initialized+ C+ N; Z% g, q* @4 ?% D* Q$ N
   unsigned int temp;
5 f! `8 u/ O3 b& z/ _   //SLEEP_EN(GPIO8[10])---09 Q( s) A0 P# n  m
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 \$ D! d4 a8 k$ d
   temp=temp&(~0x00000400);. J) z: ]2 N8 c/ u. L% @, ~: x, _
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]0 c6 q0 I$ ~) O$ b# |
  //RESETn(GPIO8[8])----0----1
6 ]- A% y7 V% c% g   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 h# l: Z6 I2 B7 A. W   temp=temp&(~0x00000100);1 I2 {2 |3 U. v- g
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' s* i# a& I& [7 [# P0 W8 w
   udelay(100);
' u6 ~9 ?4 X! \# D   temp=temp| 0x00000100;- q) u, a/ h" J
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 F" _9 `6 }. r' s$ c, {$ F
   udelay(100);4 m5 }- U6 Y% v3 D! U  q
   printk("open success!\n");
2 Q. J, }$ b6 a9 ~% T9 k   return 0;
' q/ y/ Z# H6 P' l) h) f3 p}
& J/ W8 s! y$ U) H5 }1 k. Z4 r
5 q' u( L. \; Q/ ?- l0 c1 rstatic int mcbsp_release(struct inode *inode,struct file *file)0 ?; c4 G8 y3 e1 A2 i  P
{4 @" c# u* f" X, M' x
   printk("release success!\n");
$ }6 y0 `5 `/ V   return 0;
- {; A: _4 O' d$ w& r3 N! I. I}
" U  F9 B9 X$ Y" `- y$ R  u- i& w# t; b2 T4 P7 ]+ [; X' J" v, \) ^5 A
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)  k+ o& M1 \' H# u3 H
{
* J3 S5 D( C- a9 f; M$ ^    copy_from_user(&DXR_data,buf,len);
$ f9 \4 @2 l9 K( |# S    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
6 |8 h. Y( I! I0 v    return 0;
7 T9 d3 k' B3 J2 x ) X% Y  u+ X0 n* J$ A" l/ `" \
}
7 {$ Y8 v2 E6 c: ^$ X% J! t; _. k0 c( R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) [: y+ r2 t5 h$ }: X5 B  q6 [, j{
* U& E% W0 p4 J   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* s  ]) y/ o2 j0 L# Z   copy_to_user(buf,&DRR_data,len); 6 J3 h4 s! q& z, g, x3 _
   return 0;, D- W6 B  F; V& h) t1 d
}8 f! K. z8 C' T- j5 ~4 Z
; b/ N* v) V; F
$ e! N- n" B# W
static struct  file_operations mcbsp_fops=9 r5 l  V! @+ v$ ]/ T
{, g' Q1 ?& y$ p8 r3 Z
   .owner=THIS_MODULE,
' p) W3 h1 P: G. s3 D9 p# @   .open=mcbsp_open,, o! P$ @8 W) e, P
   .release=mcbsp_release,+ N4 X) ^/ C+ `" b: i; L
   .write=mcbsp_write,2 g% s3 z# z; W- {! P# H& N
   .read=mcbsp_read,. R1 o, w" z% ^( Y# i2 i
};* e4 b, X  r" m! T/ m; Z* b! V& \6 k- }
static int __init MCBSP_init(void)5 S+ N  k$ |2 r9 M6 J
{( f0 R& y$ W& E' V  f& k
   int ret;" s% Y' `) u2 S: f- v6 R  E, h
   unsigned  int   PINMUX1_REG_old;
) c& y# R; B0 |  k   unsigned  int   PINMUX18_REG_old;1 n% m! K; c9 g
   unsigned  int   PINMUX19_REG_old;
5 y5 _) x  H( `2 O% S   unsigned  int   temp;  , B! N! E/ ]. d; C0 D* b' i$ p, n# l
   if(MCBSP_MAJOR)+ M1 T* Y! T1 b+ N) t: S
   {
8 X# B) L( p  r, f- ~* C      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ i% L, ?0 a; g4 z7 g  O$ x
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);9 H0 Z, X6 K% {' l
   }
2 p6 t! h; B% T( W   else
; k) |1 D* e, C% I   {! O2 b+ w0 a2 |) j1 M4 E/ J
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 K$ [( ?3 r* w" e) R4 q3 b      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 v, I/ v9 T* n5 B   }
' p/ q- h! n5 y% A1 j$ ~   & d! I% z. f6 r% s8 i4 e2 q
   if(ret<0)5 m3 S: u6 D& l5 Q5 f- G" b2 }
   {$ V; E5 j# o7 e6 a2 y
      printk(KERN_ERR "register chrdev fail!");0 u# J1 x8 t( K4 |$ m0 w6 P8 e$ i
      return -1;
. k0 M1 \/ h5 S   }; A3 ?( d  s/ r3 B2 O
   7 R2 p; W; h2 x( S# O
   mcbsp_cdev=cdev_alloc();
& o7 b+ W6 n+ ^/ M! H4 [/ I   
9 i5 @% ?+ v- u   if(mcbsp_cdev!=NULL)7 z& k; r4 f$ C" l) F
   {
) g# H2 t% k* r2 w      cdev_init(mcbsp_cdev,&mcbsp_fops);: ?4 ^6 H5 p! j1 I% \2 Q' @
      mcbsp_cdev->ops=&mcbsp_fops;
- k; I7 @/ N- F' H  E3 E      mcbsp_cdev->owner=THIS_MODULE;
4 g! ]: X  f, j  `4 Y( @      
# v' E% ~, z2 S: V% L      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) j4 C3 @! v0 i! n9 f$ _; n          printk(KERN_ERR "register cdev fail!");- b, Z; f6 ~& a
      else& I3 D  N* ?1 v2 a
          printk(KERN_ERR "register success!\n");
6 ]" q5 m, ^" m! q( M0 k   }4 j4 ^. D2 U$ o. G1 m! M
   else
& M0 H( Z- A, p1 q" O% J! O8 ^   {
/ G5 B& c7 Q# }2 H$ E: B* G$ ^      printk(KERN_ERR "register cdev err!");
$ Y: e7 u8 J+ a' _9 Z% u      return -1;. P  H! I2 K6 A! G7 U: x- v
   }% X5 N' t8 i* g. F
   6 S( A7 ?. t$ S5 I- Q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) U5 K8 \# d* B, P0 b$ l7 U   if(IS_ERR(mcbsp_class))3 R. ]" N7 K; R' m% G4 T
   {2 z9 ]* m' Z/ p: N% q
      printk(KERN_ERR "register class err!");
' w' \7 W) ], j8 X+ s6 c2 I   return -1;
7 `. e) H1 |" y2 E   }
- M$ u! ^1 l  a2 A* m0 y# J! s# G: `2 P( [   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" h% R) @8 R6 O& h5 t5 C

8 h  \9 J  n+ O2 R) \: @( ^9 V   //PSC( T% X& l- N$ `4 L
   //add Enable MCBSP" o, ~9 V* \* O+ K$ ~0 x) U
   //test
- q% S3 N0 ?  P9 T8 n6 v   temp = 0x80000003;5 Q9 y% M6 m! Q8 {
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));! ~& u3 G6 x; f+ R* Q
   temp = 0x00000003;
% D) E/ g" `9 D   writel(temp, IO_ADDRESS(PTCMD_ADDR));' ^- T4 V7 X: k4 w+ z, d! q. }5 A
! y+ H5 k5 M( N
   temp = 0x001FF201;: l; J+ S2 V4 ~2 E" d0 W5 h0 a
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& |0 ]$ e6 u( w2 _   2 G# R6 Y9 F2 q" E( ]5 |
   //PINMUX  
: F6 b- f: \* @4 L, V   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 Y$ L, j8 m2 I6 V; j. Q& f! ]' Z7 r
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
# S. _- Z2 {+ ]" [   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   " F/ z$ Y  m3 C4 C# T& g
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% |/ D0 P9 E9 A- M* x; Z   , |% S+ b5 }2 d8 |* T, T, Y. p
   //SLEEP_EN,EPR,L138_SHK1,L138_RC( y) d/ `) C- \7 I! [( W
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
8 _# s: |2 T- S2 j& q' z   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: |4 _4 k& ?1 n; H' y   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( Y3 g6 Z* Y& O. K
: q3 y+ }% E' g+ k% h; `   //RESETn,L138_SHK2
  `" u+ t) m: T! f   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  0 m* n: P$ O3 O' t& m5 D$ e! M$ P
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   % X# C$ `! ]! C/ j& j5 n9 C: _  d' C
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 d, r, q. y( Y; |! R( p# a. V0 A
) [- Z9 {' N8 y! u   |, z, u4 E7 P) c) O3 ~- p: z) D
  //SPCR Register  ~8 n% f4 b; p" M3 B6 y' ~
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 \: ^- i) r$ N' S+ F4 {4 v- v  temp = 0x03000000;//(DLB=0)
" `8 w' i/ D2 i( M( k // temp = 0x03008000;//(DLB=1)
# K5 M2 R' U8 T2 v" U6 A  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset& L' Q$ k8 m& b2 D
  temp = readl(IO_ADDRESS(SPCR_ADDR));
" G, {$ I# I% V$ U  printk("temp=%x\n",temp);6 U4 `. T$ W4 {+ d# [
  t  @' G7 z# y" Y6 G
   //PCR Register  r+ z1 m. P0 x" `5 X& W5 S
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 G  K+ ^% N8 ?: l6 l: z' d' v
  // temp = 0x00000F0F;+ L+ s& ~% W0 f: \) k; o6 P
  temp = 0x00000B0F;
: A7 q2 \  ]2 Y0 |" H( C4 k! V$ k  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized & D+ ^) `' s, N5 \
  temp = readl(IO_ADDRESS(PCR_ADDR));
0 `& [8 Q# _% s  printk("temp=%x\n",temp);  
& A0 g+ g0 C4 ~8 K6 J: G2 a   //SRGR Register5 D3 N& {" F+ d1 l) e3 P  E: x
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' s* Q4 I0 G& D( Q' Z: M. J //temp = 0x301F000B;
  L* {% m4 I8 i) c! i" i1 I( N   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized + s) J8 u, a' Y8 ^" ]/ D6 ?. O
  temp = readl(IO_ADDRESS(SRGR_ADDR));
/ F5 A5 Y2 s' S  _. l  printk("temp=%x\n",temp);
* t4 R1 w- o! t! s   //RCR
. b3 [$ h6 r( o; B7 ?( O   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 A& b5 X( s9 @; B   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 X/ C' G5 x6 I) b
   temp = 0x00440040;2 f  Y" W$ g% J; J3 z
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & Y9 S5 r* T0 T
   temp = readl(IO_ADDRESS(RCR_ADDR));9 M  G' i! Q5 y, c' s7 u
   printk("temp=%x\n",temp);/ k* }4 P/ P) j
   //XCR
6 R0 B8 n5 E, \) f   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1. N# X. U/ f6 e& d2 m# b
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 \8 F5 P6 c. M! R' W2 W, g+ d+ ~2 I6 S
   temp = 0x00440040;
) X# B7 Q2 ~: ^. D   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   ( d2 k2 n6 |! U0 r
   temp = readl(IO_ADDRESS(XCR_ADDR));
- D- T, O8 h) O" |' p2 s   printk("temp=%x\n",temp);; c" {5 k6 h5 ]5 q  I$ p& p, D
  udelay(100);* H' n5 W' l$ T
  //SPCR Register% ^+ D% c( m5 s6 a) D
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" s" G' @% @. ^6 j# c3 g: r" w, T  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
' ^! |# d! Q3 {% o+ J  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled" \& A2 Z$ B* `; `0 N
  temp = readl(IO_ADDRESS(SPCR_ADDR));
" l; Y3 u7 ~% c9 C0 z  printk("temp=%x\n",temp);
2 E& `6 d4 T9 c* z* V  udelay(100);
: B. V- e) D/ n
, s* k: R2 J5 d2 W. a  //set GPIO direction
% }; @4 W: T8 Z& t   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 c! }/ @$ O7 N1 e   temp = temp | 0x00000100;//EPR----input- X2 P2 z0 A$ h, c
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 Y" I; j4 a+ f6 u# \2 x! Q0 M
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : I' q& h) l- |$ v0 Q

! F6 ^: s' f6 a1 T3 V3 w  A& }   return 0;
9 s0 N6 i* _+ `' _! S; o8 F) L}4 H5 s; S9 l' ~/ U3 A- G6 v" x
static void __exit MCBSP_exit(void)0 i- t7 Q6 @" N) _
{$ D; M* }4 B5 e2 u# |* @
   printk("mcbsp chrdev exit!\n");
6 b5 d1 w3 h1 E$ `   cdev_del(mcbsp_cdev);
+ S' v& \- R9 p/ x   unregister_chrdev_region(mcbsp_dev,count);
" w$ b0 C" V9 V4 @   device_destroy(mcbsp_class,mcbsp_dev);
, m5 T& ^' B) n4 ^, P   class_destroy(mcbsp_class);! e9 {5 y8 |8 L  @5 \; G" r
}* A7 p! X3 W5 a7 f  D# A
module_init(MCBSP_init);
$ H$ ?; ~7 {3 C, x* xmodule_exit(MCBSP_exit);
3 u" f! k# ]( Q# H# M" Y4 a% R, R* T- P
MODULE_LICENSE("GPL");
; J% m3 w4 \/ R, H$ e) x& k, A# Y- b2 j  ]4 @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& P' O7 O- w' B4 p0 _' ^
我的应用层的测试程序如下
3 g+ a' T7 J1 a8 j, j#include <stdio.h>1 y4 Z: N( q9 }* z1 |9 R( E
#include <string.h>* ]0 e1 `' F7 @4 T
#include <fcntl.h>. ]! V+ W: b  a7 |4 R
#include <unistd.h>, W* h) r& V# [
#include <signal.h>. W& w* q4 k4 O) L: k* ]
#include <pthread.h>       //线程
. U/ M7 _2 @7 q# }#include <stdlib.h>
( z5 M+ z/ U$ p( ?4 u8 V  l( j$ S#include <pcap.h>          //捕获网口数据
7 d1 H, M; j5 Z2 P#include <semaphore.h>     //信号
9 R& S& M: n  R  a3 G" M+ p#include <sys/types.h>     //消息对列9 S6 ~5 C5 K. P" t' l! y
#include <sys/ipc.h>       //消息队列# Q' M1 G  i9 K. R# D
#include <sys/msg.h>       //消息队列
7 v* C0 T0 ]* {#include <sys/select.h>
: M/ R+ r/ s' s- f7 m& {/ X8 @#include <sys/syscall.h># z- H* `- r% W0 `
#include <sys/stat.h>
& E- r' x6 x8 l& m, {6 G#include <sys/mman.h>! {5 D: X8 N# U8 {
#define msleep(x) usleep(1000*x)
8 E/ C; ]+ c' d3 b) }% B* w1 V  U" c3 t# ?. l4 @! M
int main()& j( M0 z) _: n5 }
{
3 S" [6 J. P' Q; [- k6 t    //MCBSP,ARM与AMBE2000交互设备' J% H& a- f* [- P$ ^  M: e
int fd;, E$ L1 n8 p' V" q! `
unsigned short data_write = 0x5555;5 H- Y* ~# w6 @" K4 N
unsigned short data_read = 0x00;$ k" p: j/ \4 ]; R4 o# a% O
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. M/ r4 V' h: Y1 n( i  C
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' B, ^, v8 `- `* v% s/ E& G    6 Q$ Q6 C3 I. R- g5 L
  if(fd < 0). C$ ^7 z' r4 \
  {
2 g5 L) s: C! ~! Q/ l     perror("open failed\n");
7 M; Z2 k9 l( Q  ]     return -1;
! c; A7 Y" @" Q% t" y  }/ B( t2 l0 y9 R" H9 E7 u$ G
  
/ z7 h# _/ X& q2 [! P# s# W  while(1)7 a% h3 V: m9 Q. f. x/ I. M
  {% B5 J  Z# I* n8 |8 X; v0 e. a! J8 u
   , `1 w  U% E8 I0 n0 ~
   //AMBE2000每次读写是24个字为一帧. A- g4 y9 i* [8 k
   //写数据时将数据在底层存储起来,等到中断的时候再发送, H& d4 X/ W4 D4 l5 h/ n
   //AMBE2000输入数据是以0x13EC开头的
* `+ C1 X; m/ K- O% A   write(fd,&data_write,sizeof(unsigned short));; e0 [! F+ L7 k; Y% r8 `
   
8 Y$ u% b% e* c; G4 U   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
1 ?( ]( _) u. S+ Y2 r  R   read(fd,&data_read,sizeof(unsigned short));4 Z* ^# Z: x9 ?# L9 {% ~
   
; }6 i* a8 I+ G& p2 h" m   if(data_read == 0x13Ec)
) {! M7 q; O. ]! W$ A  o   {  P" G% t0 l! S4 x. ^# ]
   
0 a& d2 R4 ]8 o) W8 U7 W& W    printf("data_read = %x\n",data_read);+ S5 F/ D% A3 z
   }
9 n, R0 h. n, b/ B9 k$ h8 T   
4 e& S& F& _, \; |% U; E# j   msleep(10);6 p6 H8 l  C5 j/ u) T
  
& E( W. E$ }8 p$ `; H8 K$ G2 v& B  /*; r! \" L/ p3 T% z+ S( W9 H
   ioctl(fd,1);   ( o) c& K# X& ^
sleep(1);+ Z9 Y4 S4 M( h6 ]" l; R: o& N3 t
ioctl(fd,0);  ?2 Q* h/ \; {" s: b- n. M% k
sleep(1);: }7 ?* G. E* D" [5 T
*/
% t* y0 l; Y4 x! W, r: e  }     w3 n5 a  i8 U) \
return 0;6 Z- L, h, }: n" O0 W
: P) K' L9 h3 |3 z$ a0 M5 [! P
}8 R+ Z. G; g& x  _

: ~* i# x9 V! F* g, V# \5 S多谢各位指教,谢谢! 急
9 c6 w! O: d. ?! ^8 U( Z* {9 ?9 ]2 n

: l+ l6 i7 |' W& y0 c; r4 y7 g: p) p9 q3 ]

& A! b3 y8 X7 n7 {
. b9 B$ x! @4 o. M/ o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 10:44 , Processed in 0.053196 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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