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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ T# E( x1 l3 h: \
/*( p6 [& L0 \! |/ U2 B2 w3 D9 h4 }8 M
* Copyright (C) 2009 Texas Instruments Inc
- K  S. Y, z' J4 { *- N' ~0 r( K4 b# V
* This program is free software; you can redistribute it and/or modify
6 |2 l0 D/ f# H5 ~- F# _' ~. D( x * it under the terms of the GNU General Public License as published by$ n; J! {9 j; N% ^& L) U# J
* the Free Software Foundation; either version 2 of the License, or+ E! u! b7 i9 N9 {" j6 x
* (at your option)any later version., H/ A+ {4 T* T  K0 z# k4 x4 M
*( a- ]3 z, C, x( M9 B# {5 R, s
* This program is distributed in the hope that it will be useful,
6 q* Y/ {* l7 A * but WITHOUT ANY WARRANTY; without even the implied warranty of, z3 b$ E- v! C* y5 h/ f5 z9 s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 ~- V' s: l+ s * GNU General Public License for more details.
3 x) A# C* A& ]; j! P *
" _% J" ^: C3 N" F * You should have received a copy of the GNU General Public License; i% n% e; l1 L: f/ R! n/ f' Y
* along with this program; if not, write to the Free Software
" V- H0 u, I. {4 p1 ? * Foundati
8 X  Z7 A( I0 H  g" \*/" n6 E! |) s; [' b3 ~
#include <linux/module.h>
* @; d3 d* M& W3 ?( ^  L9 C$ q#include <linux/init.h>( _% B/ N9 ]2 D* W+ R: l
#include <linux/errno.h>
- H+ h' t3 s. ?' r# H5 ~% |#include <linux/types.h>: d& n7 p: A* y; k: j
#include <linux/interrupt.h>: P7 e, q: b6 }
#include <linux/io.h>6 ~, X9 d' @6 d
#include <linux/sysctl.h>
) s, r4 ^3 H& N+ ^4 t# l#include <linux/mm.h>6 p6 n9 p0 M. W$ X7 Y
#include <linux/delay.h>
9 N3 Y) x& L" g4 |# G* T+ q#include<linux/kernel.h>
, r6 S, \$ Y* E% P, K& O#include<linux/fs.h>, Q" v0 e8 D% f1 t/ i* F. N
#include<linux/ioctl.h>
. s  i4 N  S: l& B#include<linux/cdev.h>! V: k0 K& Z- e$ t$ o4 q
#include<linux/kdev_t.h>
2 k4 B' ^1 O5 @% W4 U" N6 [#include<linux/gpio.h>
, N* t% W- z% w% Z8 E& F1 B#include <mach/hardware.h>, d- y% H9 y  p7 ~2 V7 {4 `
#include <mach/irqs.h>
$ \. ~9 Z( E0 t& J% _, m! P  {/ J1 k* S5 C( [& R( e2 P
#include <asm/mach-types.h>2 l8 B3 {; H/ V6 ~, K" K$ k
#include <asm/mach/arch.h>
8 E; m0 T" e% @2 ]#include <mach/da8xx.h>! T8 ^* F9 C3 K; w# `% n
#define  SYSCFG_BASE   0x01c140008 J& d& M- R5 s6 d2 d% z/ D
#define  PINMUX1_OFFSET   0x124 ; `6 F5 @4 F" \* V
#define  PINMUX18_OFFSET  0x168
) V8 g4 J- q: w#define  PINMUX19_OFFSET  0x16c  W2 F2 W' b6 A- p6 g# h2 g
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
5 C( r. d( z8 m! n# n' X#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR0 g+ L# K- a/ @
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR+ Z. s8 {3 T# {3 S  M( P% H5 C  [. G
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" a$ w' m" A" `: v
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR4 {; w) S+ m& Q3 N* v0 {# {* Z
                           
4 O) H$ ?4 y8 v2 h#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
, a2 f/ ~5 n$ `3 B7 i#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
: [* a) L+ Z/ ?5 X7 q//PSC
6 p5 j% E- Z0 n# x# K1 ~( |( i#define  PTCMD_ADDR   0x01E27120  / x  p! B  f. R6 m
#define  MDCTL15_ADDR 0x01E27A3C' W* K8 S: ^% r: ^  l8 a
#define  PDCTL1_ADDR  0x01E27304
5 a. d: s! E3 A+ M, |# t//GPIO8 direction9 F$ x# ~8 R/ T; t  K1 w& g
#define GPIO8_DIRECT  0x01E260B06 r) q" F; h. z* F
#define GPIO8_OUT     0x01E260B4  v  C! m4 x& M2 a- E# B$ r
#define GPIO8_IN     0x01E260C0
  @0 ?/ c2 c+ t  j$ S
, m8 L+ f& R! i! \  W  i' f//#define MCBSP1_RINT    99              2 ?# [. D) y6 D5 n
//#define MCBSP1_XINT    100  ; }* B: z0 D) D9 p
static int MCBSP_MAJOR=239;
4 b1 x( X* b1 `( t4 Z5 gstatic int MCBSP_MINOR=0;
1 O0 Z9 r& o% R+ A1 `3 ustatic int count =1;
6 R! O- o7 b: q) K- M/ T& e  N6 h( j7 ?; G1 Z
#define MCBSP_NAME  "MCBSP-device"
. Y* Z; S5 f+ i- k/ _
. |, g6 x: m5 u" m3 Tstatic struct cdev *mcbsp_cdev;
2 L  r' G- g- D) {6 Y1 Istatic struct class *mcbsp_class;
* P$ ^4 e' j. k  q: Q) R1 P  m, g( Tstatic dev_t mcbsp_dev;4 X, W$ a3 E  Q! d" \% |$ y
unsigned int DRR_data;
# U# o8 U9 Q7 j; f: hunsigned int DXR_data;6 V$ J" q1 V4 ~6 h
static int mcbsp_open(struct inode *inode,struct file *file)
* f: F' B* X3 ]! W{2 c' ?  b/ f5 h" F. Y
   
. ?& |* h7 Q% l; A. h1 x   //interrupt enable,initialized6 ]8 ^, U7 ]3 J: e+ a$ I( }$ k1 e
   unsigned int temp;5 V/ ]5 e" A) [1 q0 x
   //SLEEP_EN(GPIO8[10])---0
: d6 ], b. j( _* A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ p- m$ u& [* x0 K; w2 _. H% q   temp=temp&(~0x00000400);* P# C; ~+ n7 S$ V3 a8 f5 `
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]9 _1 d9 u, ]( g$ J4 o: n
  //RESETn(GPIO8[8])----0----10 {" P3 R3 u4 f8 q( |( t5 W% t
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 E: }) ^/ s$ B; T0 U
   temp=temp&(~0x00000100);: ^& W9 B# V+ b3 l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 s1 b1 m9 I: r2 {4 d3 f   udelay(100);; f- g3 V- n+ R# t2 [
   temp=temp| 0x00000100;) g" f/ z+ a0 K( P* f9 T1 p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# o0 [. r; h6 I3 |# F   udelay(100);
* V0 R5 _8 `7 L# M5 e  p; t   printk("open success!\n");" P* l+ G( k* Q1 k
   return 0;, I( r8 M8 ~. |$ C0 C. T( Y
}
: E5 ?( j0 ]& ^. y/ d& ]' t
% K" C$ c$ E) V6 K- u( T2 O9 tstatic int mcbsp_release(struct inode *inode,struct file *file)6 q5 v+ a  p4 p
{) W- t* h( _% r* M+ y% J& m4 C7 b+ f! K
   printk("release success!\n");% P9 Z9 n$ i- @' A& I' f. }
   return 0;
% o2 u5 a# G" P1 o# h) o}# W: w4 |6 D+ U5 Q" J, z6 N
* x1 E( d7 |+ }5 E2 k
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 U- e  c) R+ q, L5 ^: I
{4 b+ O+ d% l3 ]/ _8 z8 u5 u
    copy_from_user(&DXR_data,buf,len);  m& C5 |+ D& Q& t7 ~* ]3 j& q
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
8 c2 D8 C9 \" v2 x) l' o. O    return 0;, i  s, f+ t/ ~5 P  R' M! y, b/ z  M0 \1 N
, q- y2 s: I6 u: l
}
4 x, h% }* g' t! u. k0 A& h- {9 G+ ~5 m% l+ w. T6 o# l2 j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 p  C" ?, w  {# }{
7 P" E$ _2 k3 i   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* b  e4 ?. i. p4 r   copy_to_user(buf,&DRR_data,len);
$ b$ p) |+ e; I/ R   return 0;
: c$ A3 L+ j1 K$ q( H& W}
( R" d& h! X; U2 u
- U, i0 N9 ]" K0 h8 V1 A. h0 T; n5 @3 k8 O. H* n3 |
static struct  file_operations mcbsp_fops=. B& U" o5 s3 z* p) P& `
{
4 P2 g8 `2 X$ c1 ^0 m- Z/ Y; j   .owner=THIS_MODULE,
) m4 F8 C8 a9 H4 }! L   .open=mcbsp_open,8 e- |5 g/ h( r' H$ x2 c* ^( ?+ F5 `
   .release=mcbsp_release,
( L+ }: e7 k; k   .write=mcbsp_write,0 j9 c; t3 T* o# h9 Z
   .read=mcbsp_read,. b. Y) @8 \/ z) h4 U# _1 D
};8 a: u& ]9 r* r
static int __init MCBSP_init(void)  w& l. Q$ |9 {2 \+ c- s
{0 I9 ]; L: f, R8 E3 J) ^9 h
   int ret;& J: C6 k5 a7 X9 x4 N, X" t/ z( L8 o
   unsigned  int   PINMUX1_REG_old;2 A+ r" o6 Z, `7 z% T
   unsigned  int   PINMUX18_REG_old;) L0 l& D8 Z. j
   unsigned  int   PINMUX19_REG_old;
9 Y4 h; o' _& N2 Y6 a   unsigned  int   temp;  , @+ L4 B, {  j; L
   if(MCBSP_MAJOR)
! e7 K5 I% \0 R5 ~- r# w2 h0 X  ^   {% a. `( z/ W; R4 @5 D. g, ~4 T
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 {& z; H6 Z8 J4 }4 S; H
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 f; A8 f1 u6 ?8 P! _0 `9 m. F
   }! g+ c) p- a% g4 R& R8 O* Y
   else- @1 V. {/ s) T( G' w$ a
   {
8 U2 ]5 n) T) i2 o: A, s1 ?* Q      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 D( k. `# k$ b( q# ~& Q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ g# `5 L7 m! S' w   }4 Z1 h" J1 o& V% `- p$ q
   
" J! l8 u! w, V   if(ret<0)( W% n8 Z' u7 V! X2 d1 L' w( }
   {
+ T' X6 T& t# `      printk(KERN_ERR "register chrdev fail!");
5 u6 R, m+ s9 t* m4 D      return -1;
3 A; C7 `8 X5 B1 N( p   }
9 _0 v" N4 Y! e% O% M/ l! _   
* h, v# g% G5 D% q: U! H( q0 a   mcbsp_cdev=cdev_alloc();( ^7 Z* C( F" N' W
   
% v1 s) M3 j% |# s+ Y  e9 ~* y   if(mcbsp_cdev!=NULL)% L. E1 }/ M7 L- I8 k; k
   {; H8 \) |& H* b7 q$ v: k
      cdev_init(mcbsp_cdev,&mcbsp_fops);
. t0 ?9 C% x# V: v0 d, g      mcbsp_cdev->ops=&mcbsp_fops;+ x  f- G/ n2 Q+ g9 [& c! R
      mcbsp_cdev->owner=THIS_MODULE;
; X1 T! C1 P. v, [9 m      
" t0 r; ~/ B6 B+ j: x      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 e3 W' P' X( T0 B& E1 n/ \          printk(KERN_ERR "register cdev fail!");
! z% @7 U2 R" ?2 q$ V9 A      else  Q- b! k5 G' b
          printk(KERN_ERR "register success!\n");' N: T& C; v8 O- v% d% D6 O8 J
   }1 l+ x4 C8 m1 f
   else
$ R1 \/ [" P' u+ Z( H   {3 d6 Z, L8 j6 j5 _0 }/ b
      printk(KERN_ERR "register cdev err!");
: ?) Q! k# A: }! J" t      return -1;6 v1 U, N# Q1 D+ j
   }% B" c4 _7 @7 r) P
   ( }/ M: A; [  F+ k5 T
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ ?( m6 M- z/ H; {  x
   if(IS_ERR(mcbsp_class))
- S, p$ n1 i  x5 n, @. M   {
. X& N% Q' e9 ~% u& c: _( G: K0 V/ Y      printk(KERN_ERR "register class err!");0 n; O6 q+ j. ?" l- g: e1 r5 A
   return -1;
% n0 C$ W4 b: l2 E6 P   }
; ~) M* @- a# E6 F* f! f   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! P; b5 H3 X% ~0 V; f/ u$ Z- ]# {# ~. r& w. ~
   //PSC
5 s' h6 Z- f7 x+ S; d$ v% _, J   //add Enable MCBSP
0 W1 U( u; L  ?* @) ?   //test
" a! |0 q" f$ S8 e7 q/ x   temp = 0x80000003;1 }/ H3 O& g; e! U0 x3 r
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ v  Q8 }  D7 S6 V. G0 g   temp = 0x00000003;# @) J# m. t2 `$ I# p
   writel(temp, IO_ADDRESS(PTCMD_ADDR));* b8 c) y' ]; b( H- g2 A3 _
: @' H2 d: [* Y$ P0 R
   temp = 0x001FF201;
) ?$ J8 J6 c- U, z- q4 S) W* Q$ W   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) t- o, O8 V; r0 ^+ l' I: @
   
; e5 p: w9 L. H; f) H) j0 M$ ^$ b   //PINMUX  4 X8 `% Y& V; X( C. Z/ G
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ }8 V2 N& c' r! H0 _) y, w
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  - {! _, N' ]; l, ?$ Z2 j
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & ~7 y$ {' Z3 Q
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! G; T  z9 A0 F   
" Q) R. [; A, L" s# x7 |( ~   //SLEEP_EN,EPR,L138_SHK1,L138_RC" P0 Q) t6 J& a
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  $ @; U$ m$ q8 F1 C, Z0 {8 d
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   + Z  n' U# _, L& j
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) J- s. g1 k9 l5 z

4 y- c# j0 S0 Z   //RESETn,L138_SHK24 K/ n# ]0 I7 U2 W# i
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
  E" c$ r% l- c  A8 K# Z   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   + H4 `# d6 I4 C* q8 d+ d+ ^0 g
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# M4 K! ^5 Z  ?
" T. m" s9 F' ?( P: J# y( k
  g1 t8 O; }4 {0 g6 Q; W7 d! V* M4 f
  //SPCR Register
# D6 M- v" V) j; a5 m0 h# ?  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 O0 h+ I1 e8 [" N
  temp = 0x03000000;//(DLB=0)* F2 f- t8 b; `" A) V) }
// temp = 0x03008000;//(DLB=1): V/ X1 N; H. F" S
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset+ j  Y/ {, j6 G+ U
  temp = readl(IO_ADDRESS(SPCR_ADDR));
, S( J) {. s! p; w+ i  printk("temp=%x\n",temp);
; }# E0 O" F) B, i$ l1 [3 g/ }+ C$ b
0 I% Y2 g+ F% n  ?6 `" K8 A0 G. H   //PCR Register: f) \' O. p- {; t5 z
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& y7 |1 @7 Q. q  // temp = 0x00000F0F;
( t& ^: J* K6 L  temp = 0x00000B0F;' J" T, ]) b* O0 Z& a8 z! X
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 b7 o% n+ W3 o" O/ L& ^
  temp = readl(IO_ADDRESS(PCR_ADDR));8 H* f% `; }- G( y
  printk("temp=%x\n",temp);  * |2 g$ c) q1 `
   //SRGR Register6 ?, [" ~0 v3 e8 E" g
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' X7 {  z% B: R* r. b/ V& ?3 j
//temp = 0x301F000B;
& ~0 b9 V4 C% g  l8 m# v& B  b   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
6 m+ G9 F2 @8 E, F+ d  temp = readl(IO_ADDRESS(SRGR_ADDR));
' @5 `: ^) H* X  printk("temp=%x\n",temp);- @+ p8 b) f9 G
   //RCR  G/ W. t" s5 C7 ^6 T# u4 h) v
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," b- J. g3 s8 @. k5 b3 C" U* m
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 I8 o' d+ g0 K   temp = 0x00440040;
# M' K# X/ X. ]0 J# b8 x! E   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   1 ?- q: {  O8 A/ l! t* g
   temp = readl(IO_ADDRESS(RCR_ADDR));
+ Q& w# E8 x2 R% H   printk("temp=%x\n",temp);
9 R" y6 P. F0 _8 G! U( [- a  |  T   //XCR
+ @' @2 H$ F; f% H/ s/ ?5 ]   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* ~& A: u) @; G4 ^0 C4 C* g* P
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ b( f/ ^5 u5 H8 O6 ^
   temp = 0x00440040;
& p7 D- L- W! L$ D" Z7 }5 q3 y( h4 [   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : l2 p' B( [" B) P, c& H+ h
   temp = readl(IO_ADDRESS(XCR_ADDR));
3 U' ~$ [" @' l% I1 p0 }. |: A   printk("temp=%x\n",temp);" [% {! h9 l& ~( v$ J' [
  udelay(100);6 C, `. g/ W: Y0 Q$ `) U; h
  //SPCR Register
+ \2 {( t3 L3 Q  w' e  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ i7 y5 ?6 V. S6 Z, c! @  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
4 n  f$ b* w% B# z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: a2 f+ `& z4 W7 Q( B  temp = readl(IO_ADDRESS(SPCR_ADDR));
" x7 g/ I; k9 Z& _7 a: e( J  printk("temp=%x\n",temp);& t4 k" I0 t8 x' l& r
  udelay(100);
9 p, e! b- d1 w6 t( M" {' j/ L+ |; S7 O+ ]# N) c
  //set GPIO direction! K0 A0 R# _! h/ \' f/ r
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));) z6 f9 K; d4 d; j, r7 l. ^: v
   temp = temp | 0x00000100;//EPR----input8 w2 F! ?5 s$ O: V$ e2 b
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ p% o" U4 d0 K" w8 n5 I   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 W8 X0 V5 {9 g5 p

+ A! W  a4 f% D. H# q8 C6 Z3 o. }' K   return 0;1 Q  F) \7 {6 y) `/ B4 g/ e% n
}
/ \0 A& l  D6 r- l1 X1 `static void __exit MCBSP_exit(void): ?4 G* n4 t/ f
{' T  m# Q) Z; A1 i
   printk("mcbsp chrdev exit!\n");* J% [( H. b4 r$ W" _
   cdev_del(mcbsp_cdev);# f- d( N  f- E  J- f. t
   unregister_chrdev_region(mcbsp_dev,count);8 L, v* K6 Q% e) x! I: x
   device_destroy(mcbsp_class,mcbsp_dev);* ^# \( ?6 b/ P( ]
   class_destroy(mcbsp_class);# @6 A; {: w# G* Q6 ?) O
}- ]5 L' J9 }  p0 H* N
module_init(MCBSP_init);! l& P2 Z: J  ~0 B. c( n
module_exit(MCBSP_exit);
( X: p. l7 O1 l5 q3 u
# s8 ^$ ?* v( NMODULE_LICENSE("GPL");
+ e' H$ S8 z$ i6 j
% B2 v; X& J- U* N4 ]* Q# {8 _) J我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 x) A; H0 V& @. [+ }
我的应用层的测试程序如下5 _6 b2 i. S% j
#include <stdio.h>
' R( I  s9 b4 e' v0 f" v- k#include <string.h>
1 G6 O/ q+ _( Q+ w#include <fcntl.h>
6 ^; K! n0 |$ p+ @# t#include <unistd.h>* ?- H7 }8 E4 W
#include <signal.h>' h) x2 @  \: w4 R$ @# K* u
#include <pthread.h>       //线程
6 \6 m! i# u9 M% S: F5 {- t+ ^. Z) E' q#include <stdlib.h>
- K: K! N' E6 g) H+ w* N#include <pcap.h>          //捕获网口数据2 w0 d$ K1 V9 e0 ?( G! Z
#include <semaphore.h>     //信号+ ]8 I; o* g) _# s+ H
#include <sys/types.h>     //消息对列6 `6 y5 n+ _2 {2 F. T
#include <sys/ipc.h>       //消息队列
3 A1 W, [, `3 R! K2 \  D% L4 @#include <sys/msg.h>       //消息队列
6 C8 A6 J6 W6 F1 p- ?% C! F#include <sys/select.h>
; n9 E" i! w* M) b  e8 x#include <sys/syscall.h>  E9 \! N6 }4 n, @
#include <sys/stat.h>
3 [4 P* f+ U' g) m4 f2 B; J8 ?#include <sys/mman.h>* B. k, K0 D! r- `
#define msleep(x) usleep(1000*x)5 u! T# C6 Z3 \2 W

, @9 c( d" S2 X/ {" H4 O& d5 L- uint main()
  t: B0 C; S; N7 w7 [{
' g" n- q9 S8 z    //MCBSP,ARM与AMBE2000交互设备
7 g9 o6 u, g3 J! K1 u8 ~ int fd;% a6 _' f! M3 G0 Z9 Y
unsigned short data_write = 0x5555;
9 O0 L) j) O6 q/ [9 f' K unsigned short data_read = 0x00;2 P7 {- i9 q  U: J9 v
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);5 H4 @* [! z. n$ j2 {0 y( S" c
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 Z7 p: u; k+ a. Y- L, ]& L& a
   
) Y* Q7 V+ x& {. [' u  if(fd < 0)
: [: l; x  Q7 X* L9 W+ |8 v% `  {
5 g1 w+ N" F$ y0 y) e9 w     perror("open failed\n");
# f& K$ b% f6 J- d3 o     return -1;  I/ H# S  y# Z# b6 _
  }3 A  I& u/ w  E4 s
  0 q- x. t% d% k$ r, N3 Z, L5 J9 z
  while(1)
6 |8 T8 t6 u1 n( q! @  {" B" Y" y/ r7 O  ~1 j
   
% |. M: T8 V4 t* g+ y' r   //AMBE2000每次读写是24个字为一帧: Y5 m& B$ ^) B( Q; R; k& \  Y
   //写数据时将数据在底层存储起来,等到中断的时候再发送
' _- }6 I$ H& o# L5 r+ L   //AMBE2000输入数据是以0x13EC开头的5 R$ }# s8 M7 @( Y3 v0 K
   write(fd,&data_write,sizeof(unsigned short));
. z; N- u; z( F$ p5 \7 t' t) b. i   
- `' Q& I" Z% M. r- f% w   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
( r5 X  ^- A/ w! T% j  Z+ C% T   read(fd,&data_read,sizeof(unsigned short));! |5 \6 v6 ]# T& j" A, x5 T
   " q* `/ ]3 v! O: f( a0 v" s5 e
   if(data_read == 0x13Ec)
  E! ^' t# p- y, t+ }3 H   {( h0 Y$ V3 V1 o3 A. X1 ]/ @
   
: h" {$ I- D& X" d& g2 A" g    printf("data_read = %x\n",data_read);
# x+ J8 }- D( T% e   }
3 m7 _0 z9 p% h. U0 O$ u   
# Q6 u; Y1 V& z/ w) B+ ~' O$ M   msleep(10);
: ?: Z0 @. \/ H. ~! `  " o7 C( L( l* h3 d( T1 ^. M
  /*4 d/ Z- J- q5 S' p
   ioctl(fd,1);   
7 }) C3 b& X& l2 i0 y! n1 B sleep(1);
3 E  y6 L! {, ?# C! r ioctl(fd,0);2 F* w2 h. M. A3 a+ j; \8 W' r9 t
sleep(1);
" w; G& w+ J5 u% U */
0 M/ T+ V6 z$ N, u) b  }   
" I4 A; h) {8 q5 u, A6 ?3 L return 0;
( y4 Z) t9 ]) f3 j" k7 Y 6 ~" z1 M2 j1 U, ~
}! E. {9 O* e  Y; {0 I! D* u

+ r6 J. v7 l0 [" y4 v多谢各位指教,谢谢! 急
! k  ^% l2 v4 J# i
5 A, r1 t' _/ _4 J3 D$ V' w# A. `7 f$ a& L/ i* y
7 p' m2 v% e; z' y
; F+ C8 k4 z( X# R) q' g$ [
* T$ o7 l, o/ W9 f" m; Y; I  |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 23:50 , Processed in 0.047462 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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