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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' {2 f: L, T9 J
/*
9 X: E) k  \+ _. @- g * Copyright (C) 2009 Texas Instruments Inc4 ]+ F( P- `( _4 [
*
: p% o( s2 e1 H& w- h1 X * This program is free software; you can redistribute it and/or modify+ g; g: X2 k# E4 B) @$ M3 Y
* it under the terms of the GNU General Public License as published by
  L* M2 Q3 {! [+ e# L" o$ ^ * the Free Software Foundation; either version 2 of the License, or/ \$ |/ \' U3 I& p! E
* (at your option)any later version.+ c) w" @% q  \- g! Z
*
- X( l# L2 \; j. R * This program is distributed in the hope that it will be useful,$ M/ j$ ^) }: Z: F
* but WITHOUT ANY WARRANTY; without even the implied warranty of% S" T: k7 v7 h
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- g0 a* [/ ]3 z( R1 d* v5 j7 \7 W* ]
* GNU General Public License for more details.
, V+ b" R- |: h2 ~( s2 T4 \ *' {4 s/ F8 m/ b2 h' `6 S
* You should have received a copy of the GNU General Public License! u) ^- J& P) O0 x# y$ c1 l
* along with this program; if not, write to the Free Software% {6 F3 G/ J+ ?' j* ~- R, A
* Foundati
0 i9 ~! F6 V9 y! d*/' d: \: P6 p7 d0 \
#include <linux/module.h>9 O) ?! b$ V. m2 e2 w% J
#include <linux/init.h>. U& R$ |% ^* I  @$ P
#include <linux/errno.h>( ?- j5 T# w; g* E" b& f
#include <linux/types.h>* y* ]! H9 d, o' {' s) k6 e
#include <linux/interrupt.h># M; h$ L" L0 w1 q# @" |6 |3 Q7 s
#include <linux/io.h>
2 ]/ Y% s. ?' a! w1 k& h#include <linux/sysctl.h>  ~/ h% M# }/ H3 @. c
#include <linux/mm.h>
6 P; Z( ~; Q5 O, ?- n! X6 {2 x4 w, ?#include <linux/delay.h>1 w: U2 c$ B1 \) x8 r
#include<linux/kernel.h>/ ?4 h/ {- ?* S6 y1 l7 @) Y
#include<linux/fs.h>( V- N% |. `: U) ]. J7 U
#include<linux/ioctl.h>
6 E. p! ?5 A: \3 Q#include<linux/cdev.h>
, C1 Z- p. n8 u- c7 R8 T' M#include<linux/kdev_t.h>0 k' I: h/ x" H- `; t
#include<linux/gpio.h>( f0 n( w; q3 n
#include <mach/hardware.h>
8 l+ e! [* O: ~( g5 d0 h#include <mach/irqs.h>
; f8 ?4 X+ F, }! }2 \' d+ p+ u, [  E  G
#include <asm/mach-types.h>
( N+ S" |. S1 A) k0 z. _0 Y! M, O#include <asm/mach/arch.h>
+ a# S; k$ d0 L5 A, E#include <mach/da8xx.h>
. }: [% y, C, R( X#define  SYSCFG_BASE   0x01c14000
& a, ^. M" G9 C2 r0 D3 h#define  PINMUX1_OFFSET   0x124
: V9 ]+ A" P6 W3 d" g4 K4 `: ]8 W! Q#define  PINMUX18_OFFSET  0x168 " [. ^& j; _7 ~# a
#define  PINMUX19_OFFSET  0x16c
3 u3 T8 u' }$ C% @1 D3 ~7 i" ]#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR" o/ \' K! I: X5 J
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
0 d. Z+ |$ D% h#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' y$ x1 X  m3 S8 L#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR. u: a3 B# Z8 _2 ?1 w0 v
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
. s& v/ K* x4 |                           
, e# \: [( v9 _8 l2 e4 s: E" w#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
. D7 Z4 J. }' U6 D. W#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
! j, N' P5 g1 |" f# d! n//PSC
5 E2 N- [) U5 z% [#define  PTCMD_ADDR   0x01E27120  : n, ?9 k- y( ~9 Y
#define  MDCTL15_ADDR 0x01E27A3C$ h7 c& y7 ~- q
#define  PDCTL1_ADDR  0x01E27304. H6 B' i$ t: d) j; t$ C- B
//GPIO8 direction1 M% R1 d& r: h6 o
#define GPIO8_DIRECT  0x01E260B0
) C, S! x* r8 B: K7 @#define GPIO8_OUT     0x01E260B4' h8 A' g. ^" w; h" _! K
#define GPIO8_IN     0x01E260C0
! M( _% D# i+ K& v' \
& c* v  e. F! E/ J$ ?; s4 D, o//#define MCBSP1_RINT    99              ; N; c  h3 F/ p4 h- U8 g* s& Y
//#define MCBSP1_XINT    100  
# {& W. j$ H! `" C; V& kstatic int MCBSP_MAJOR=239;
! p  n" A7 }1 D) a4 mstatic int MCBSP_MINOR=0;
6 p$ }! N9 P+ j. vstatic int count =1;# _& Z& c4 L2 C9 v: F. L" p( d( M/ Y/ s% e

% }. m: {8 C$ I+ |# m  ~. `#define MCBSP_NAME  "MCBSP-device". d1 T( T4 Q# x  t

& D0 G) x, ^, m5 l: Jstatic struct cdev *mcbsp_cdev;* E* c* {, ~' G$ H
static struct class *mcbsp_class;
4 u- ^  y9 `6 A8 l/ e9 ^static dev_t mcbsp_dev;
% U, c; M  y  C% G" Z7 ^unsigned int DRR_data;
4 A3 {$ z% }) u! Lunsigned int DXR_data;! c6 ?$ N) y5 e$ E) L1 e7 N3 e1 X
static int mcbsp_open(struct inode *inode,struct file *file)& R  s3 q+ r+ \0 Y( z
{7 Q9 i7 A4 R% g0 L
   
4 @. L/ N3 R3 M. `+ ?   //interrupt enable,initialized; _) j( }8 @5 f. ?3 L% t
   unsigned int temp;
3 A' j9 c- F# w8 B0 L   //SLEEP_EN(GPIO8[10])---0/ G  n: D- {7 Z6 t. ~& M( v- `
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" p' @0 M* O# ~: [& Y$ c
   temp=temp&(~0x00000400);
" s% ^  c, q' E$ C: r& J) Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]  g1 B  r! n3 N& x- P
  //RESETn(GPIO8[8])----0----1
8 W# c) U" d3 i  M" P) A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  ]: O& ~5 n1 l2 Q8 m) T9 H   temp=temp&(~0x00000100);9 c$ g  I# g8 m5 k
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 |* p; f3 I" {+ ]  E/ h   udelay(100);- m; ^9 L- y! J" X+ }; \: ]
   temp=temp| 0x00000100;( a' V1 _, t, k1 `3 P( L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& Y( C9 i' Y+ Y9 `- O4 a; t   udelay(100);8 _, n! K4 |( r% S( S6 j
   printk("open success!\n");( M( \" d/ Q) d  d( Q
   return 0;; w6 b' g; r; S3 Z% ^6 M
}
5 R4 n& T! Y$ l& H. m0 G* |% o+ T) W0 s/ r, O. q: K; j  m
static int mcbsp_release(struct inode *inode,struct file *file)
- w% Y! g6 }! ?  Z/ e0 }{2 P+ C: C( U9 e. _3 _; Q
   printk("release success!\n");
6 V9 M% T) z0 q( e" _. i   return 0;
' r( ]1 Q* K9 x  T# L}7 Y/ `7 ~6 j" e+ f4 R$ ^
+ M# J/ e( O  d' y( W8 f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; S% b7 ]/ |. L3 \{7 M. ^  p! g0 a# \
    copy_from_user(&DXR_data,buf,len);
) s& e0 y/ F3 `6 _0 n    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       5 _- i9 X: O3 R1 s- }
    return 0;
' J2 U/ C. f' t) O0 K! p8 N' i8 J" O2 }2 ]
: C  J4 z- }* o2 Z& C. n( I3 m}
! k% U* p; p7 Y) {( c8 ]; V  _1 {/ r5 i' B; o3 y; ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' K8 M) d% G, F5 O" L6 B$ H$ `{
) l7 c4 C2 l4 G/ l' V# g   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, y8 J5 G( A$ ~' D6 Q, A% I   copy_to_user(buf,&DRR_data,len); , |1 u/ `$ G4 d3 s# N% L: ?- U# E, o( s
   return 0;
5 }- W9 ~' W8 Y) E}$ z7 V9 \  ^3 v6 g+ ?
! p/ e" B( [6 h3 \6 z
3 N8 J! _9 W0 f  m8 D8 X
static struct  file_operations mcbsp_fops=1 H' M0 e$ c* G  [6 O3 u
{
  U: F0 B5 ?) R2 @! N   .owner=THIS_MODULE,; b' @' A: M! H5 Q9 o
   .open=mcbsp_open,
$ {, C8 G$ V+ H7 n6 s6 E   .release=mcbsp_release,
( v, F1 Q9 D. ?- L: z   .write=mcbsp_write,) F5 T3 j& o5 g) o3 v! d$ l
   .read=mcbsp_read,
, L4 ^: ?$ L6 q; Q: A/ ^  i};7 G( W1 a* T& X/ a2 m
static int __init MCBSP_init(void)
1 d, n" }% B5 |) H: q8 f{  ~0 A, m* \, F" Q, {) D3 L  c8 C
   int ret;
& q- Q- ?& U9 Q2 @5 Z( B   unsigned  int   PINMUX1_REG_old;2 T/ k# h  E/ \  y% {2 n1 t
   unsigned  int   PINMUX18_REG_old;
- G9 c6 y9 M" \$ c5 M- x   unsigned  int   PINMUX19_REG_old;
4 }1 P9 S+ l; Z0 k' m   unsigned  int   temp;  ) T! k  A* \  z, {8 E1 C3 T
   if(MCBSP_MAJOR)' ?4 w: L0 W* K
   {
1 }. P% U5 h5 v" v      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 o1 Z! K( F# a5 I9 u8 d% ~
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 K2 w6 g/ Y- g+ S, q   }
$ C6 r: M& S7 R- X9 `   else
" }+ j! O) g- Y8 h: o   {' S/ I3 T6 m$ [. G$ H
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. ?/ ~2 N1 g- n7 v
      MCBSP_MAJOR=MAJOR(mcbsp_dev);' e/ O, j; \+ _8 I: l
   }% P* \" h* T3 b" Z! c; {
   
8 G4 `3 O' z4 O; W! B   if(ret<0)
- |+ c% Z! B5 y( ~6 |8 q   {
4 [6 E5 C2 Q+ {8 T" V: t      printk(KERN_ERR "register chrdev fail!");
! i" h8 N8 }# O: I      return -1;
( U2 n5 O, k5 T- _3 R) q/ Z" S8 _+ g   }
2 ^) U: k$ y6 j; M( L0 r) ~( i     t9 U& N+ h+ A; U3 u1 m
   mcbsp_cdev=cdev_alloc();
9 t8 G6 w1 F: J   ( U/ T  G( B0 ]0 K; q( d! E: S7 x" \
   if(mcbsp_cdev!=NULL)! l% ~! b4 x+ e
   {9 X  i5 Z( u- C: H. c: M
      cdev_init(mcbsp_cdev,&mcbsp_fops);
- `" L0 d4 d% y" O      mcbsp_cdev->ops=&mcbsp_fops;
5 c0 |/ }) I% @: [% l2 k" d      mcbsp_cdev->owner=THIS_MODULE;; H8 A% R6 }/ C: V1 O1 f* T. Z; K
      * e: E5 _; C% b5 P7 L: v  o' h
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
. R" P! P2 i( p5 I: Q; D* t2 n          printk(KERN_ERR "register cdev fail!");* T: x9 F) m- M* @) s" C
      else
, M  \1 E" G- a  Z' O2 Y( V          printk(KERN_ERR "register success!\n");  Q8 u  X& d" I* A+ u1 s
   }. V8 w0 C# F8 M# h& s- h: p( k
   else
5 f  r% }6 A# y4 O: z9 ~   {8 k0 [* A! J' P
      printk(KERN_ERR "register cdev err!");# w! |! z/ ]* w  I) P
      return -1;5 c* L7 B; J# Q7 n, i
   }  E6 f& U; H' N9 S. B" Q
   
5 m: ?  t4 w2 T3 D  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 v6 D' b2 N1 [& e6 _   if(IS_ERR(mcbsp_class))% C  V) S1 |" P- i2 t1 g
   {. i% q2 R  Z! ]3 H, m1 i" V( `
      printk(KERN_ERR "register class err!");  y; d( _! X* Q+ h8 d7 }+ K) t. |
   return -1;
: Z) B) [( A. }2 ~% ~   }
% R+ ]9 H2 V" H- p) M   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; @6 C0 X9 P: [, E: W4 A

! d/ ^3 u3 o5 I2 d; q/ E3 e   //PSC
, d5 g+ x& k: \& z   //add Enable MCBSP1 b0 j/ c# @( [4 c
   //test
( ~5 S0 g# y; ^0 a7 {   temp = 0x80000003;
* P* c0 W4 u: v/ o5 U% z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 ?9 {% V; `+ A, P1 P6 U
   temp = 0x00000003;
# s0 m' X# `: J& z. k   writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 J  {0 c' g  g( w  w& v, z 4 v4 `. p5 N, M5 P, A
   temp = 0x001FF201;
4 ]% G6 U  \# p, P: p+ f% H9 ]7 A6 W   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- J! w! a% G$ X1 F2 ~0 P# R   
6 M& H0 @9 A; P% A  E6 r5 Z   //PINMUX  
5 z. j9 B4 \9 V: b# t   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, q) s& r, q+ x  d: V6 r   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  , I- F6 ~# u7 p7 \$ K) a
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) w* G6 u4 {+ P
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ Y& i* d1 E/ y7 |* v" }& Y
   ( E! U: H* B5 ~  C$ O. s
   //SLEEP_EN,EPR,L138_SHK1,L138_RC2 y' G6 X+ [$ L" a: U
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  2 _+ ?0 B, ]: \& o# n
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; }* J0 S1 A& q3 t
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 `" j7 C( s" F8 X  u3 f3 _ 9 q$ n$ k/ h& j) L" ~8 u
   //RESETn,L138_SHK2
9 n0 p9 E* ^7 b: S( q/ a   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  - \. n8 z/ J$ j$ O' \% f0 N4 h* p
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ' g! G' N1 H: x& ?0 N  h
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) g! U7 h% @2 c! u+ I7 F/ z # t! ]! o( @4 w

5 p( L7 |* g; n+ W+ z  //SPCR Register
8 p$ r2 A0 J( j( b+ B* t7 h5 N4 c  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ C3 j; j* O- W+ S( m
  temp = 0x03000000;//(DLB=0)
. Q& R/ }% B0 [/ M  V) Q& b/ H+ V: F // temp = 0x03008000;//(DLB=1)
. [. n/ ?# g+ ]3 ]: [3 Q( ^8 F  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
) q# Y! V8 p; {, B" g4 c  temp = readl(IO_ADDRESS(SPCR_ADDR));
. @/ u4 T' _, |  printk("temp=%x\n",temp);3 U6 l( A( {7 i5 t; `: Q

; p( g  p, t5 }6 q   //PCR Register1 F' S$ J9 b9 B! u- ]
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
' @+ z7 t6 a$ `$ |  // temp = 0x00000F0F;
: _9 U/ i/ S# p- Y8 F! w3 V  temp = 0x00000B0F;& H, f( Y8 _/ N! V2 w& M
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
/ n  R! s6 e) {4 D$ \( ]2 S  temp = readl(IO_ADDRESS(PCR_ADDR));: y; q' }. @$ w7 s7 _+ x- d( P
  printk("temp=%x\n",temp);  
; r6 `8 O: [; D/ ^2 m$ A/ j# C   //SRGR Register% ]% z4 u* ^0 H' ?  z* J: @
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 S6 |# V7 ?: W- H //temp = 0x301F000B;
, d1 N0 \5 W8 B3 m! {   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
" V( `5 J% y/ l+ g  temp = readl(IO_ADDRESS(SRGR_ADDR));0 ?; j7 L0 n8 q4 Q$ z# z% ]
  printk("temp=%x\n",temp);9 ^) x3 }# Y% J$ D9 C/ E
   //RCR9 |& ?. A7 u: P
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( L2 B4 f8 l  [; Q$ L
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 w; K7 X, G+ H5 \8 [+ J: H
   temp = 0x00440040;6 Q# O0 u1 p/ p6 T3 ]
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized     P; [7 n9 H% K! y9 D
   temp = readl(IO_ADDRESS(RCR_ADDR));; `, }6 F9 ?/ i$ `7 v7 p
   printk("temp=%x\n",temp);$ i& ~& ?2 ~: j8 o3 H
   //XCR
/ p# m7 i" W- n, Z   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ _" U1 i" a% u$ ?% E& P2 x9 M# _) K. |
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-05 k2 l1 w  W, g" V; T$ z# H: G
   temp = 0x00440040;
6 ^; [3 @. o1 C4 w. b* t" Q  ^- M   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
; M/ n: m5 y9 g6 H   temp = readl(IO_ADDRESS(XCR_ADDR));
; o2 ^9 \! q6 W& c# H+ A   printk("temp=%x\n",temp);
, O; @7 n! {' f0 ?  udelay(100);: a) M% s; }. B! D
  //SPCR Register8 @2 m: V. F$ B) v4 f/ N$ K3 S/ t
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( O( J0 }8 d+ K2 e
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
9 q  v) T7 |3 @6 M: N$ O: f  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
) K; E6 }5 E4 L% Y  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 k% b4 s2 K2 M  printk("temp=%x\n",temp);
: h% e; f: K- L. V  udelay(100);
2 E$ p2 [% W* H0 p/ y% X  |2 C+ r3 A" e* L$ N( e- h5 M% m
  //set GPIO direction
- i( q3 @" X1 A6 s   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% P" G. E* O7 d- ^
   temp = temp | 0x00000100;//EPR----input
0 n: O1 g; k- k2 @0 M   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 I+ _8 b$ X4 `# t" q* P   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " |4 s: l- K; D& d3 G* d5 C

! [% |1 p2 O! J) P* d4 O& l   return 0;
( ?4 @+ Y- _& [  \8 M+ G}0 r3 ~+ d% C% z1 ?0 ~
static void __exit MCBSP_exit(void)
- l7 v; }' ~0 i* q3 u{/ ?; I' }7 V9 T( ^/ N; N, ~, C# b) j
   printk("mcbsp chrdev exit!\n");
& p% t3 ]/ S2 p' J/ @. z   cdev_del(mcbsp_cdev);# a# J7 X, r. H5 K# w
   unregister_chrdev_region(mcbsp_dev,count);+ M- {) p" w7 F4 R# g: M# w
   device_destroy(mcbsp_class,mcbsp_dev);% T) F# E+ `9 ^+ t% l. g) K
   class_destroy(mcbsp_class);+ ]' N& T) G0 V4 w$ L
}) ]: ?! q9 s# L0 l* `3 U( h# a1 c
module_init(MCBSP_init);
( ?( K- m' L  U+ O# t) omodule_exit(MCBSP_exit);# f( ~2 I( ?1 t1 x# s2 C: y
( S! I8 v8 d& ~, w  J0 X- D
MODULE_LICENSE("GPL");
9 i% v. N8 Y( j! f8 v
- G2 s1 ?; O! D0 ^# F# g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( e4 M* b/ w1 S6 Y( q8 K% w我的应用层的测试程序如下
6 o: M* t2 @/ |% L#include <stdio.h>) i' E/ e$ o" W$ V& f) [( E
#include <string.h>
/ J) G( b) S1 U4 Y4 `& A#include <fcntl.h>
: c* ]( K& i# ~1 i#include <unistd.h># y" l7 S% b! V6 J
#include <signal.h>
3 F4 R( L. h$ g# G" @: }#include <pthread.h>       //线程, C6 u+ I! R6 K. C  B
#include <stdlib.h>/ K' U# M1 l- K
#include <pcap.h>          //捕获网口数据3 E4 Q! q2 [: G! B# K
#include <semaphore.h>     //信号
* M; y) @! u* N6 ?#include <sys/types.h>     //消息对列) V, y# P, \1 i/ z* c$ Y, q
#include <sys/ipc.h>       //消息队列
) A# `2 B0 \: Q/ \% W#include <sys/msg.h>       //消息队列9 z& t# j  J" g$ A2 W1 }, o
#include <sys/select.h>! x! ~! {; p9 G: l8 O) l
#include <sys/syscall.h>0 p" z1 \8 \% Q9 ~. U1 z: ^3 Y
#include <sys/stat.h>: q3 ]" W- Q. M2 W/ e# M
#include <sys/mman.h>$ |% u/ y4 }$ {# Z) w. @
#define msleep(x) usleep(1000*x)
3 w$ K4 }" X6 j6 ^  H8 d& L7 ^
+ x3 W8 z. m0 @# Jint main(). g+ ^6 N: I% i( V
{   o+ o9 z! `1 z3 C* o, M7 f/ |3 R. Z
    //MCBSP,ARM与AMBE2000交互设备
. h. r8 \, m3 y' O( y" ~2 W int fd;
: R3 b. W, R; K" }% c; g' k% B unsigned short data_write = 0x5555;
% @% x1 R* D& L+ c. S% ^" l) h; B. z unsigned short data_read = 0x00;  y( {5 l- L, j' E. w6 G
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; M2 d/ Y7 |4 i+ w9 \
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 s/ N' B4 G6 O8 ^6 M
    : |  ?: j* s2 p  `3 M
  if(fd < 0)2 }% o2 q; z5 }
  {. m  G- b5 A0 p: a+ C/ A# S- j
     perror("open failed\n");
3 g) ~: {* ]4 v  h     return -1;
* m' L! N, b- N1 y3 Y) ~% T1 s  }
% }, q* k0 p+ v. I/ L  
' C& `; r( K, y4 p, I4 L  while(1)
4 {) h" v: G/ Q8 @8 m) H  {) R; B3 N/ E( d; B" e. i4 O
   
) ?* E( X: a7 B0 R* r- {# L   //AMBE2000每次读写是24个字为一帧
$ h' O- {; w6 |' B+ i8 z- y8 R   //写数据时将数据在底层存储起来,等到中断的时候再发送
( \' T9 F  I& d) m7 P% C% @   //AMBE2000输入数据是以0x13EC开头的
" z  p6 p6 |) f- W9 K9 V  o! g2 ^   write(fd,&data_write,sizeof(unsigned short));
$ n" ?9 O; X9 Z+ Y# i     R; T! E/ d& \: G
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  $ ]& K6 g! [' V1 c$ z0 C
   read(fd,&data_read,sizeof(unsigned short));8 K$ M9 h" \- j& m$ f+ X* C6 q; d
   ' Q" h% [* c" X9 s( K
   if(data_read == 0x13Ec)* b. i3 G. V1 Z! ]
   {6 D9 C% J; |$ n
   
% E9 n4 C/ A# H$ p# E8 z) Q3 e2 a$ h    printf("data_read = %x\n",data_read);
8 J3 R9 O6 u* ^   }
% s2 j$ ]4 Y# G$ Y$ g   
' R( U1 p% t9 ~   msleep(10);( L7 Y0 l2 j. }3 `/ k7 Z% ^9 {; H
  3 m$ i2 h( r& K4 n8 G
  /*
. C" N( I( \9 f% E   ioctl(fd,1);   
7 k0 K0 g: p2 Y. p9 x! i sleep(1);
( C* m" A4 Z5 q5 G ioctl(fd,0);
! v% F5 J! `) f! X$ h, ` sleep(1);
0 C( h$ [1 e. a# k( F; a1 |/ @# ~ */
) A3 [. @9 \) Q  }   
- c" y: V% H6 f" M' Y; X" k6 K* n return 0;# ]& @1 r7 ]- c1 ]# s# H/ t

% N9 M1 ]' m! e! r, g}
7 ~" j/ k3 e3 L: ]
5 K7 D1 t3 K, `7 S/ ?$ k7 @! `7 C多谢各位指教,谢谢! 急
5 t7 G. V, T' {6 l$ z6 l/ `; D1 H7 f8 o# w

% U, T* z% ^$ |) B; b
% t" s, V! N5 n/ a3 q
" j: J, ~/ R% A- a7 v+ C' Z- j$ |$ S& E$ i4 }9 j/ I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 17:37 , Processed in 0.046723 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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