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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& Y4 a8 `- ^) X: {' y/*
" T9 M. |2 H; b2 j * Copyright (C) 2009 Texas Instruments Inc, \5 D' R- P/ ?7 F4 h
*4 I( t3 O9 x/ i' j+ ?, F
* This program is free software; you can redistribute it and/or modify! j' s  J9 [+ Z* \5 c3 ?9 m
* it under the terms of the GNU General Public License as published by
6 B  w6 X. n: S$ H7 D2 { * the Free Software Foundation; either version 2 of the License, or# ^$ h) M( I1 e
* (at your option)any later version.
. ?: y/ S" M% Z. @# w( J& s0 f) | *
; H) c1 _9 ~# ~5 ^ * This program is distributed in the hope that it will be useful,2 y5 q# O+ @4 `/ e0 [+ x
* but WITHOUT ANY WARRANTY; without even the implied warranty of  V0 r+ y) |' i- |3 ]
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; h& _7 |# e. r0 r" {3 f* G * GNU General Public License for more details.8 X9 g) v$ E- n; c7 M# K' _5 n
*
! o4 `! I8 V' u2 T! F! P  b * You should have received a copy of the GNU General Public License+ a5 G& x: A( I) F; |1 V) n
* along with this program; if not, write to the Free Software
  s7 p% c4 w' ~0 M * Foundati
* [) x$ T: K- A9 ?*/
3 z' d# }1 u# A4 F#include <linux/module.h>
" `, O/ e2 ?5 x6 w; c/ ~#include <linux/init.h>4 G2 C9 e5 W4 O/ v
#include <linux/errno.h>4 ?1 y4 d  J7 ]4 `& z0 U3 M
#include <linux/types.h>
/ L+ I/ Z3 j4 o( R- L- f- H* J7 A! H; {#include <linux/interrupt.h>2 {: ?5 p  A, Q" ^  W
#include <linux/io.h>
% p4 W( b8 h$ ]0 S% n#include <linux/sysctl.h>
9 ~6 `1 W# V- o#include <linux/mm.h>
; P- s* j6 `, _1 Q! k#include <linux/delay.h>9 S) ?2 Q* y* u* ?
#include<linux/kernel.h>4 d3 X. T9 P4 {* V
#include<linux/fs.h>& m4 M% |! B' X% _1 X8 L* k( [
#include<linux/ioctl.h>
" @/ y9 l3 B& a2 N& s7 b; c#include<linux/cdev.h>3 f6 F7 [0 i* O5 A8 K9 F
#include<linux/kdev_t.h>
$ d7 |6 l6 R" ?0 d/ u#include<linux/gpio.h>* t2 j" M' ^# B6 ]! \; R5 i/ w
#include <mach/hardware.h>3 [8 ^$ p  U) O& [
#include <mach/irqs.h>! ]' Y9 c) v* A

  l0 y% w) q" V; q; P#include <asm/mach-types.h>
9 e2 Q  Z) E$ |/ W( Z8 o#include <asm/mach/arch.h>& e$ q& E; A' f1 }2 n
#include <mach/da8xx.h>
( E8 N6 K+ Z* V1 w  k3 u1 |#define  SYSCFG_BASE   0x01c14000
0 L0 i- o* ?, ^5 z) J#define  PINMUX1_OFFSET   0x124
1 e' a- ^5 S5 @6 b5 ^  c( y#define  PINMUX18_OFFSET  0x168
' M. W- j/ v: T' {) v* X8 G#define  PINMUX19_OFFSET  0x16c! u# q, e) j6 v2 f2 ?3 `; P8 F
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
% G' l$ t7 Q/ X  d#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR/ e+ N; B/ P4 h
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
& e& z$ M6 |/ }- E: `7 S7 w#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 v/ x  R5 ~: g& D- `3 _% V- I#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 w/ [. t- V  A: x                           
& _- k! x9 }+ I. t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
" X) [9 K* ]" z" j# d, S#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 B4 L7 T, ~  N' I1 g
//PSC
9 x' U* _$ ~9 g- G, W#define  PTCMD_ADDR   0x01E27120    r0 N, f+ d! b8 J/ ?
#define  MDCTL15_ADDR 0x01E27A3C
9 |: f) d. U- h! J4 L+ ^#define  PDCTL1_ADDR  0x01E27304
2 B/ R4 K7 l) [+ R$ X+ u//GPIO8 direction0 _& {3 Z7 Z& N9 P7 i% U% j
#define GPIO8_DIRECT  0x01E260B05 E; s- _) h6 t4 ?3 {8 S
#define GPIO8_OUT     0x01E260B4
3 a( F; h. M, J& s#define GPIO8_IN     0x01E260C0) l; @0 I: r* s

' E9 m& n. b2 U& b" }, _; z//#define MCBSP1_RINT    99              
+ @8 c* F- o6 |% f7 f) i! p: p//#define MCBSP1_XINT    100  
  s, A8 Z# J8 D/ n. f. P8 ystatic int MCBSP_MAJOR=239;5 @' j7 E! u2 P
static int MCBSP_MINOR=0;
. Z1 g' Y6 b, a3 E7 Y4 Z2 X9 ~static int count =1;5 D8 @5 ]- p+ @7 N! n+ F" G& }6 Y' U" t

1 Y, z* h' E% A( r1 j, K+ V7 f; r0 t#define MCBSP_NAME  "MCBSP-device", ]$ t8 r/ l- C# @9 C# u3 E8 l! ]
9 H/ m2 v2 F4 w, O1 _
static struct cdev *mcbsp_cdev;8 M  ?0 r7 I9 l
static struct class *mcbsp_class;; a; c3 b% M7 S' ]$ o# T- G" {
static dev_t mcbsp_dev;
3 C$ f' K; |- Zunsigned int DRR_data;9 E8 ]) O4 n* }# P; q
unsigned int DXR_data;
" G2 z& N/ k/ L9 v0 y$ Vstatic int mcbsp_open(struct inode *inode,struct file *file)2 v2 D( P+ f+ l# F; ~
{) x7 B" J- j! t7 X2 f  B% G" Z
   $ r* J' Q# I2 L; \; z. p6 K
   //interrupt enable,initialized
5 E0 A4 ]& w2 b* w9 O0 [7 V   unsigned int temp;
8 }8 Q2 w& z% l( E   //SLEEP_EN(GPIO8[10])---05 O9 Q8 r5 R; L/ Q  a4 z% G+ i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 U8 M! v* `2 q' A/ t   temp=temp&(~0x00000400);% e1 \- d; k* b; X8 }# M& \
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. S2 T) T+ ?. w9 L! n  //RESETn(GPIO8[8])----0----1$ q2 P, g, J2 g. N. |- ~' j0 W6 g
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 p+ J: Q+ ~; i& ]   temp=temp&(~0x00000100);8 o! @* r. s* F0 a
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 X5 i0 h' q4 W# `   udelay(100);/ c0 G7 E0 m+ t0 B  b
   temp=temp| 0x00000100;
' l. D* O4 W0 _4 k( ~, d- @   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ p2 H+ ?3 d3 }4 T8 _; E" u   udelay(100);
8 r& F- d. D, f9 Y3 K8 Q, ^/ T   printk("open success!\n");  e5 G4 j+ C: `  l# @" ^' E
   return 0;
5 l3 U8 |- x6 Z' S}4 E0 ~  l( i$ ?$ T* Y
' {! N# ~; V" K3 j
static int mcbsp_release(struct inode *inode,struct file *file)
2 c) _! [% z8 `) b{
6 F% H  u& g/ Z. v   printk("release success!\n");9 f( K& y/ E0 a: d
   return 0;7 k7 r. u. [, s  ]; p
}1 @1 R$ ~1 P$ a6 J  D/ D

: X: n) h8 v& s5 x$ w% f( rstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ T# X8 \, n3 {4 x. P3 y: c
{
5 u: F8 V  c. w    copy_from_user(&DXR_data,buf,len);' A6 B8 ]3 K% H2 ?$ U
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       8 Z1 i! X5 ]1 D6 V  w/ O7 V3 y
    return 0;: G% l, n# f2 s1 Q/ a6 `; `) |4 d
1 g+ @0 w- E" I
}
+ U0 d' P  @* k+ @; E5 B1 R. H+ R: ^4 q. s1 C
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
7 s2 h. X1 \% L: N{   h/ W" {  E; W; S
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( U; ^0 N% E$ u9 [# b
   copy_to_user(buf,&DRR_data,len);
2 a$ B0 o6 g5 c  `   return 0;" r5 T  G* B( o( E$ y* F: h/ r/ ^$ T
}
- P+ X; T* ~+ I& u: u
. L# M1 f0 [, r2 N4 [
$ V" d: Q2 p5 j4 sstatic struct  file_operations mcbsp_fops=' p* ?. a/ s  P8 C6 a
{4 `7 `2 H& O6 k
   .owner=THIS_MODULE,. x- y! {+ h: v* N: F: k5 E0 S1 G$ h
   .open=mcbsp_open,' n0 W( O& k6 Q0 t6 ]
   .release=mcbsp_release,( E: n3 N  P0 V! ^. p! N. a+ ]8 N
   .write=mcbsp_write,
- Q. V6 i1 G+ A* w8 m. {) D8 g$ F   .read=mcbsp_read,- d3 I+ q3 ^" p. u9 S
};; }' C* @, n' C
static int __init MCBSP_init(void)" e! ]/ W& ?. ?% C/ O9 ]
{
3 ~' T: L3 {& P, ?) f4 ~   int ret;
, b# R4 l# `7 A. i# k   unsigned  int   PINMUX1_REG_old;" ?" {/ H  k* n2 P: u) ?8 D5 {- X
   unsigned  int   PINMUX18_REG_old;
& ~1 ]; g9 K% j7 u   unsigned  int   PINMUX19_REG_old;: A( v) ]/ Y) E! ~! \- N  M( q
   unsigned  int   temp;  
: P/ F' c/ }1 f! {# h   if(MCBSP_MAJOR)! K2 X  A* B  A5 ]8 c1 s
   {6 B! [2 t+ y8 b8 O$ p
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. i/ `8 v% K3 F- t9 Z8 p      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 A. g; a; A$ T; `4 }' _! K7 b   }
9 }5 n* n9 e; K  \5 W   else
# o: {( {! n' V1 k% g# h   {9 u0 S8 K6 B2 K$ i4 B# J
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 ~6 M: z) i3 ]+ Q( G      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 k& I; X# T/ [" @% J2 Y" V. g   }# j: H5 s! \8 ]
   
% r6 R5 t8 H5 D& j+ c   if(ret<0)* A0 q" Y! j; b9 r: V8 @: k
   {9 s" Q2 h8 A. @4 z  i4 U0 d, Z
      printk(KERN_ERR "register chrdev fail!");  |6 Z" [' y' j3 d6 ]
      return -1;. v$ J! b  |+ I
   }
( F) w/ k# e1 h6 y( P   + f  y3 g# \4 e. e+ v
   mcbsp_cdev=cdev_alloc();
/ M) H4 z; E% V" y' @" {; Q; U   
8 I3 y  T9 d  }( `! @   if(mcbsp_cdev!=NULL)
# i+ u  o" f0 ?+ o! f. n0 u; `   {" l" @( o9 c5 v+ M' R0 D/ W1 z
      cdev_init(mcbsp_cdev,&mcbsp_fops);
! o& f9 N* T; M  r; {5 g1 C9 @      mcbsp_cdev->ops=&mcbsp_fops;$ O& N/ X# m0 r. `! g% h
      mcbsp_cdev->owner=THIS_MODULE;& s/ Z" V; s# [" o) l  T! w
      
5 ]7 C: B& ?! t, }1 K2 t3 _      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))  D( I' n# R; |- _
          printk(KERN_ERR "register cdev fail!");, v* G; l* `  b- _+ H
      else
) r4 {% w0 v; ?$ L4 n: w          printk(KERN_ERR "register success!\n");
! ^! a6 o, Y  s1 l0 V, j   }
$ V5 D  [( j$ N  y/ I   else: N: c7 O* K/ }/ c7 Y' t7 L3 `4 ^# i" I
   {  z. }" z9 B* _# [2 g, e3 B/ m1 C
      printk(KERN_ERR "register cdev err!");
* A& o, m/ y! \6 q      return -1;, Q2 I+ u2 N# N9 {
   }
4 J0 |/ g* T. w' {9 t   
4 n) u, ?8 \* `' S9 B2 f" Z  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, v+ f! _4 L. \2 D. d* d
   if(IS_ERR(mcbsp_class))2 x- v) a) H; C) v  f/ F8 s
   {
. T% \' u% z* L* c5 x      printk(KERN_ERR "register class err!");
7 N  C5 k$ R. E  R! t+ B   return -1;8 Q- [2 }1 t( h. N( t1 [2 a
   }. {7 A0 @, w# H+ g9 f, }& a
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# _% C- v1 n" u; f2 T  ~! e
' P3 N1 P4 C! N% y3 B; n
   //PSC3 V2 R( k$ L; ~9 y
   //add Enable MCBSP
8 o/ o( E" v* w' L9 F/ X/ X   //test
$ }2 M' }8 E/ N  ?5 U; {   temp = 0x80000003;
& g1 Y( e0 P7 U5 p4 t: e* z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; l3 t5 O+ P9 L& }: [
   temp = 0x00000003;
0 y0 w' l! V/ q4 i   writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 {+ b4 O& u" @* p+ b5 k
) ]# r$ H/ Q2 N% k& ~) H9 `7 p   temp = 0x001FF201;
2 j+ h% R# c8 Q   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' o- j/ P, r) m  A7 x+ Z0 E   
0 n. C" E  z( \% s. d! \! M   //PINMUX  ( x1 \0 k( f+ `
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; ^$ x+ P/ S( Z& M* `5 H0 x
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ' r( g; Z7 ?$ z1 R
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - `  h7 h' M: d+ c) a3 p
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. x3 r( |$ o3 w3 |   
8 f' T5 i7 j% k6 C  U/ D' U   //SLEEP_EN,EPR,L138_SHK1,L138_RC* Y. Z4 D! \. p/ A: j# I0 }
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
2 d3 _+ _  w: o$ }& @   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   " a3 ^8 l8 \* Q
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ ~+ y7 g' a' j& x

  |; d( U$ D. ^+ v  D$ {1 \3 O   //RESETn,L138_SHK2. f% y6 F8 ^1 \3 N/ X7 M# w2 m
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
0 f5 Y9 M9 D. t* R2 p   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
7 w4 N# l# K& M  q/ o+ b   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 s& D' ~" C  ^4 h/ M 6 Y: B3 k1 N) |& |# ^+ W$ z

: r8 ]+ [+ d) z0 x1 L+ |( d4 R  //SPCR Register
; p. V# ^& x8 u" o5 y( c  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! v; B1 l. Y* t0 I) ~+ d' U
  temp = 0x03000000;//(DLB=0)- N: L9 G$ g" f  @& R1 D
// temp = 0x03008000;//(DLB=1)$ A8 X1 i& m" ?* \. e9 a- H" Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
4 f, r6 x9 ]% S3 \/ m% `1 G  temp = readl(IO_ADDRESS(SPCR_ADDR));8 ]1 l+ s8 e. P
  printk("temp=%x\n",temp);3 W' B2 T: f) s. {: Z  N

$ b3 p3 \. B; w& S  g6 Z3 a) P1 R3 o   //PCR Register( T* u& R, h* e" g# T
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 |  Y0 l! S! ?  // temp = 0x00000F0F;
3 ~" g; g3 Q0 W6 ~  x9 b  temp = 0x00000B0F;
+ [" A: o" u. B( E& a  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 c, T8 ]0 A" ]+ E
  temp = readl(IO_ADDRESS(PCR_ADDR));: ^8 M" q0 C. V8 g0 C5 y
  printk("temp=%x\n",temp);  
0 m7 T" d  `9 a" p% A6 ^  b   //SRGR Register
5 l* L0 m: ?; G3 p' s" Y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: L" Q5 {' n+ W# J
//temp = 0x301F000B;
  |' E, s3 l- z: [   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
' i+ h" N$ t. A  temp = readl(IO_ADDRESS(SRGR_ADDR));
/ w* Q% c: ]3 v- O" d, z  printk("temp=%x\n",temp);: S+ }5 a/ p( r8 k  g$ q. A
   //RCR
! E) i$ b1 d0 E9 K- C. L   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 E4 l" [4 g/ j0 H
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
  V& ?4 i  d( f$ H9 @( y+ Z( w) @   temp = 0x00440040;3 p& a* V8 |9 Z3 {8 a! N
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
2 w7 C+ f* F$ g7 n: [" e   temp = readl(IO_ADDRESS(RCR_ADDR));
. O& [4 n, C7 u$ A   printk("temp=%x\n",temp);
5 V: D# x8 L1 [" ]! R5 Z% x   //XCR
) r2 F1 F( P/ D5 n   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1! v" W5 O$ O8 l1 }
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
( O& c' \7 U5 e/ M( ]   temp = 0x00440040;
! ]# a, d! b1 S4 O, v7 V   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & Y' ]. Q, }9 G  o# B0 X
   temp = readl(IO_ADDRESS(XCR_ADDR));
( Z  ]& ]- `+ V" ?7 ?9 Q0 l, Y- `   printk("temp=%x\n",temp);
/ @) |9 ?* S) M( }& W- x, q5 E9 x  udelay(100);
- \& T$ k9 }: e* V+ |; a8 w  //SPCR Register  i/ ?  y1 W  d
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; Z. ]3 g' l4 i" ^  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
. W' @& k' @7 O; v  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled7 Y: c% K8 |. z: ]$ Z8 \" o
  temp = readl(IO_ADDRESS(SPCR_ADDR));1 ^2 a& L9 m( h+ q1 W. l# A
  printk("temp=%x\n",temp);
; h" B1 d, j* K) o5 b  udelay(100);
6 T, b# g8 W0 `+ ~" F& C, q( K+ A0 }: Z' S0 i0 H; N( s
  //set GPIO direction
. p9 F8 [7 n* w( _   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% P. h, i+ S4 Z5 [% U& t
   temp = temp | 0x00000100;//EPR----input$ m* U7 Z, o8 V1 C
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output2 c$ K, C0 Z9 ~& K
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 K  H  ?# d: k. U

' V3 T4 O: ^7 g( z: R- Z   return 0;
9 a" T# @5 B: s1 b0 V}
" g& a, V& j& q# O( B) Z: c# _static void __exit MCBSP_exit(void)
1 P- [" P( f  o; S% S* x- C" s{' D6 e6 ~  R2 s4 m+ N
   printk("mcbsp chrdev exit!\n");
0 `6 m7 }# S- h8 q( ^, V, d1 E   cdev_del(mcbsp_cdev);
% w7 S+ \5 d3 M   unregister_chrdev_region(mcbsp_dev,count);
% }5 C0 K+ H. K  i6 H1 l   device_destroy(mcbsp_class,mcbsp_dev);& p2 z1 G. M! v# X! b; }
   class_destroy(mcbsp_class);
* U: F- g8 W9 E/ q' U' q}
# E+ M% V. F# g! T3 [module_init(MCBSP_init);
: Y) f0 C6 ~5 nmodule_exit(MCBSP_exit);/ \& D# Q' b6 ^4 \+ N& v2 E

7 g2 R7 M3 h* _% Z! {MODULE_LICENSE("GPL");
) k+ r* b: W( Y& D/ R( l& z! O, w4 N+ Y. h' h4 y: O) Y
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 [  w/ f. I5 P- E: Q/ c
我的应用层的测试程序如下
& O3 O  ?; D3 s  d# l9 Q1 K% D#include <stdio.h>
2 g, T( i) O+ ~* \6 y; q& ^6 r#include <string.h>6 l/ H9 v1 N+ V/ B3 r* K1 }
#include <fcntl.h>
1 U' Y! c* Y' w" \4 r# N4 g5 ~#include <unistd.h>2 i7 }5 g- f0 C& W$ z. T3 H. E6 P
#include <signal.h>& H. v6 o1 M' {' K* ?4 A
#include <pthread.h>       //线程! X" E8 z5 l4 }# r: \" t/ }
#include <stdlib.h>9 b  e: a0 a( s, Y" ?$ q& U# A
#include <pcap.h>          //捕获网口数据
" n7 h' F& T* Z: y#include <semaphore.h>     //信号# N" c4 [1 h  b6 U7 U
#include <sys/types.h>     //消息对列
4 P( K+ w$ B0 c* @6 s% I9 S#include <sys/ipc.h>       //消息队列8 p1 f% R/ |. @$ V0 K
#include <sys/msg.h>       //消息队列' w- ~7 w" M! j* {- A4 J
#include <sys/select.h>
) M  P5 N& f& ?6 H: l" b( `- Z+ X#include <sys/syscall.h>
( l: x3 v" f& `7 @3 n& `3 d#include <sys/stat.h>
' {/ E& }" u* O#include <sys/mman.h>& {: b' M. e- {! _5 f6 d- s
#define msleep(x) usleep(1000*x)
- N' T: F$ a! m2 v% g+ y
8 p! |' M2 M/ s5 c" h% w9 N7 iint main()+ A$ ]$ U! d/ E: s1 u1 t' [
{
, w8 \3 _4 g1 `    //MCBSP,ARM与AMBE2000交互设备
  v7 m7 w6 S; j* X int fd;
/ P/ R* M3 H9 U, F unsigned short data_write = 0x5555;
- |% T* {& Q4 e; X. Q. r unsigned short data_read = 0x00;) u9 F/ v6 g/ P2 H$ {* A4 x$ e
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 u9 \; g7 P) P+ V# z! @4 d
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);* ?- `( f2 {" m- M" u' ^! D' M
   
- o2 C. P  G- r9 e% o  if(fd < 0)
) c+ J/ D0 K& o  {; c( s; L  ?, N7 @5 ^
     perror("open failed\n");
4 g  Z  r  n- A4 o  w     return -1;
( T3 s6 O; V9 ^( ]  }
( ?5 b3 R( Q1 M$ y  - ^( o$ }) `  |- S
  while(1)" M' u' ]  t) Q
  {7 i  S5 b6 \: u% s9 G) P8 t! T; T
   
) [0 m( R  u/ b* d7 \/ j   //AMBE2000每次读写是24个字为一帧9 U9 c4 N* r0 E/ U( T
   //写数据时将数据在底层存储起来,等到中断的时候再发送# ]' c3 j$ u% L) c
   //AMBE2000输入数据是以0x13EC开头的
+ \! U3 s( s5 R" H0 n5 I% x8 Y6 _   write(fd,&data_write,sizeof(unsigned short));
0 _) O- P# r( k( ]2 x3 r   
( t/ N# I) L8 q& _   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
: u+ {+ [. U9 O- W, F, I6 |; c   read(fd,&data_read,sizeof(unsigned short));$ _6 l; |1 j0 W+ W
   ) o2 }/ X" w2 M" N+ U& C; m
   if(data_read == 0x13Ec)
% d" n7 b. u- Z% l  M1 P" |% z; y   {2 Y9 R3 t/ K( ~2 J- \5 K( u
   0 }, a% y( i8 n9 e
    printf("data_read = %x\n",data_read);
9 s& m# l. }+ n6 G) C/ v! e   }
. [' S1 [3 s: h# e   0 O" {' L/ n$ J  `4 |+ t% F
   msleep(10);
/ [0 [/ g; S, P0 F# j9 h; _  
$ H9 t* u3 }! y  /*, g3 E/ i" X$ K  E
   ioctl(fd,1);   ' g0 r; K+ ~4 I. }$ n. C
sleep(1);) T1 l# ^1 x( O6 W1 j: k
ioctl(fd,0);+ K. x# Z3 L5 N5 _& X6 v- K* ^6 }
sleep(1);5 }# F6 c/ V1 W  Q- N+ D% r4 |
*/ + C% U$ N9 p0 K5 Q
  }   
# I+ q1 [' H) K) G  M& V return 0;8 ~* D) o" X% n. x" F' P

* J( c7 u# K. B& P# W. k# F! Y}8 L7 ~& z- p- Y4 X" {  A! M
) [, F5 r8 z7 o* t, T
多谢各位指教,谢谢! 急4 z; I  G" p0 O9 `0 P" h! z8 P
. Y3 O" G0 F; i5 J
4 T0 t/ I. K8 _8 W7 k/ n* _
. d$ l! K' _4 ^; `6 F+ s# M1 _3 C
/ g* x/ N1 w  E/ d- u6 v. O& K
/ h2 w: {% u# F8 s1 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 08:12 , Processed in 0.053053 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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