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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 t3 p% s; }- e; ^( k0 u
/*
( Y7 A( [/ o6 U  U+ g4 k! @. j  V; ^ * Copyright (C) 2009 Texas Instruments Inc
* \/ g; g9 m9 r1 k' J *
8 H, ^) x8 W9 A  W2 X) u" |1 N * This program is free software; you can redistribute it and/or modify
6 w, |- i- X2 s * it under the terms of the GNU General Public License as published by  B9 |9 r7 |  t; \( o& D4 C: r, z
* the Free Software Foundation; either version 2 of the License, or
5 z, E* [( p; k: a4 }0 i * (at your option)any later version.  E! i! Q1 N: h+ ?! N6 c. a
*3 v, [9 G' Z) p+ m/ ?6 X# O
* This program is distributed in the hope that it will be useful,$ N" O, v# [0 a) |; t9 K0 b
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ N# J% W. G8 Y& N" a8 H0 K4 @; A* e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 q0 F; _* c" x1 w * GNU General Public License for more details.! p: w! Q3 Y1 X- X4 G6 R9 f
*, O( ?% J1 Y9 @
* You should have received a copy of the GNU General Public License' c, E; B  U/ J  w8 J% B
* along with this program; if not, write to the Free Software3 V3 H, z! d8 x8 v4 R
* Foundati
  b$ }* p; N" A9 Y) u*/
5 c$ p* ^0 g- I) s' o, a0 t#include <linux/module.h>
/ i% n, L+ i' Y" f( E: o% Z#include <linux/init.h>
+ e" X5 F6 G" P( X#include <linux/errno.h># {7 F/ T) T) _0 R
#include <linux/types.h>
; O' O) V) @) y" F* E! _( B) G#include <linux/interrupt.h>
$ S! w* `1 u. _; t+ H! g1 }" d% C6 F#include <linux/io.h>
' m+ a3 N( }1 b#include <linux/sysctl.h>% f* w' @1 q  R8 N6 A
#include <linux/mm.h>
  K9 _1 D2 M3 _+ W#include <linux/delay.h>
2 ]4 |  a) T' @5 _7 ~, n5 ^#include<linux/kernel.h>4 H6 S8 i+ u  z2 l% V0 n/ m. w) q$ w
#include<linux/fs.h>. f, m4 }6 I" h4 @" b
#include<linux/ioctl.h>
8 D+ a% o& e) [) M  p+ }  k#include<linux/cdev.h>3 J- `% o% O+ p4 s# I; d/ ?
#include<linux/kdev_t.h>
% @+ R: S+ B) U5 I#include<linux/gpio.h>0 o1 K6 f/ X, E* J- X
#include <mach/hardware.h>
% @2 I! G: h4 [/ b#include <mach/irqs.h>* e/ _9 [( x8 W% X4 x( J* M+ ]
6 T. Q3 |' n( q  P
#include <asm/mach-types.h>
5 j- B: l- I3 [6 L6 \, @#include <asm/mach/arch.h>
/ Z6 t" O8 e& h6 ]( H7 ^#include <mach/da8xx.h>
+ E9 g" d1 F- q$ d/ p7 ^#define  SYSCFG_BASE   0x01c14000
0 f9 e3 n) c, y4 t#define  PINMUX1_OFFSET   0x124 0 [5 B4 F8 o' v, |: \3 {5 M; _) c& C' Z0 Y
#define  PINMUX18_OFFSET  0x168 ( B: U8 K. s  ?1 F- A+ B
#define  PINMUX19_OFFSET  0x16c2 ?4 l6 @  @5 q0 w7 a; A. x/ x
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 l. s# ~6 D) L5 Q#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR; c$ v. h3 h5 W- `# f
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
. v5 b. K# c+ x, ~+ p* F2 N#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
' V" P* _7 R/ V# }  P% i: k4 Z( Q1 k; G#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
# n, r8 e) W  f% H/ g                           
5 }0 G; [4 u1 x' H0 f4 f#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 k5 B* y! V4 A- a#define DRR_ADDR      0x01D11000  //MCBSP1_DRR& \* W! G# H$ ]2 y' ]7 h& z: q
//PSC. b! [5 Y( |8 u5 G) f, a. L
#define  PTCMD_ADDR   0x01E27120  ! ^/ ]& @7 z* X3 Q+ H
#define  MDCTL15_ADDR 0x01E27A3C8 J+ r  F4 I* d6 h9 J4 E
#define  PDCTL1_ADDR  0x01E273048 X; g8 ^& O# b" K5 W7 M- B
//GPIO8 direction
' l" t7 G5 l; N4 n- q1 V#define GPIO8_DIRECT  0x01E260B05 t: d6 I2 Z5 l
#define GPIO8_OUT     0x01E260B44 O4 ~- T# n' v
#define GPIO8_IN     0x01E260C0& [9 S% R! q/ t7 y9 y

9 U! p0 J0 _& e# P! T) F4 y//#define MCBSP1_RINT    99              4 |" m$ z3 `# j* r% l+ t! s4 \3 u
//#define MCBSP1_XINT    100  
" @# i: Q. Z8 k& @, f$ @4 qstatic int MCBSP_MAJOR=239;9 N- G$ R: ^$ I# U( }5 e% k
static int MCBSP_MINOR=0;
" z3 y# H" ]) @3 C/ g3 Q7 istatic int count =1;. K1 v$ I4 I# }4 y. T" ]8 l% [& a5 u

( f% f* [  d! ]+ \#define MCBSP_NAME  "MCBSP-device"8 A  ?1 K0 G& e' l; b# v/ j
$ a; t1 `/ ~% E7 s( w9 P
static struct cdev *mcbsp_cdev;
+ w5 n5 S' l- e' i+ i" X; xstatic struct class *mcbsp_class;
1 y' l8 y  I% D" K7 Lstatic dev_t mcbsp_dev;
4 y. K& b) Z' I' W1 L  Q) c; r- gunsigned int DRR_data;
8 a* F. P! A4 w. N2 H& z2 V. C$ Ounsigned int DXR_data;1 `5 A) Y5 C3 I5 s  S/ a3 v1 W
static int mcbsp_open(struct inode *inode,struct file *file)/ B4 `4 M) o! d: v3 }8 |. Z
{  \8 h/ E/ ~6 `! {% o9 ]* `
   ) s) t5 m6 ~7 Y# J/ _  U0 ^
   //interrupt enable,initialized
. h8 p8 \1 e* M/ [1 G   unsigned int temp;
/ u1 W/ j" f9 u$ M* ]5 z5 B3 e   //SLEEP_EN(GPIO8[10])---05 ~( Q3 \4 H& w8 H6 H( q( I
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( F2 m+ I6 ^0 D$ @' x
   temp=temp&(~0x00000400);
  d! F: ?2 g! N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" T! L: O  l! S
  //RESETn(GPIO8[8])----0----1, N( |9 p5 @/ [" T6 T" n2 M8 z# M- i
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ |9 J* z4 y3 w+ u
   temp=temp&(~0x00000100);/ O3 s  |9 r' s0 t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 u, D5 x0 u2 X6 ]4 _8 _
   udelay(100);
/ f0 d! e" P% V! o' q) x, j   temp=temp| 0x00000100;3 E; m( g. X# J: z! S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" o. K+ M2 G8 p6 O   udelay(100);
/ r( w+ H3 J4 t   printk("open success!\n");8 V9 I% R8 K, f4 {! t) \
   return 0;
$ k: v$ C' V# c; q# i+ o# w}; _4 p+ X3 s2 S# b! F
3 v# j( [: L8 g3 O( Q
static int mcbsp_release(struct inode *inode,struct file *file)
2 y- {+ @; j' G2 f{$ R# U7 e4 M8 X8 u4 J! N* H
   printk("release success!\n");5 @7 n, G: C% O" V! @  R; T
   return 0;
, O2 a; n' q+ Z4 y( f}
2 a/ t: w. p4 \* V% J/ w  w
. B! o/ X7 c1 a0 O& Y- cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 ^. n1 a8 d6 n& h0 A$ D
{
0 f5 _4 P- o' Y* `    copy_from_user(&DXR_data,buf,len);
6 m5 `' c/ `* p: F/ H2 F6 [% C    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
2 p/ u. B. x+ S* x& l# e( \    return 0;
4 U3 s6 s0 e0 v  s
: Z. O) _8 Z" O}# ?3 S% E* l4 a- {# H
% k. k! E; \+ j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 e  ~4 M4 Y1 z/ }
{
) _1 b' k0 R. G   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( @, t; ]- h  [8 t& P% [
   copy_to_user(buf,&DRR_data,len);
+ }  Q! P- c; F   return 0;+ P+ b2 p8 K# q" o/ I
}/ f7 C  J( r. k* G$ g5 ?2 `

# ?% e7 k: z. Q2 w* W4 Z0 t* E. T/ A. H- t  a; L2 w
static struct  file_operations mcbsp_fops=3 ?# e8 N, |; o) ]/ u
{  }7 C* N& U! R; r' U
   .owner=THIS_MODULE,/ M( U7 Z. g2 U0 o/ d, l6 A' d! m
   .open=mcbsp_open,
" H' I: I1 t( W   .release=mcbsp_release,
- D2 W) ?3 ~' s   .write=mcbsp_write," Z+ }* M/ f. P) N" F
   .read=mcbsp_read,
# D; j$ l) H$ ]3 S4 i: c};: U) K) h6 v% ^) `5 D( ~3 l
static int __init MCBSP_init(void)1 ?0 O" F% J6 }. q7 g  j; r
{
5 T- |( h+ C5 _1 C$ R   int ret;
; ]- G' x- k9 T  y( C; \5 H" b   unsigned  int   PINMUX1_REG_old;
: ?4 M9 [* N4 @2 y) v  Q: g   unsigned  int   PINMUX18_REG_old;' |. v0 I4 i  R. U2 f( m
   unsigned  int   PINMUX19_REG_old;
% N& Y+ ?- c3 K6 L, e   unsigned  int   temp;  
: M0 R% g6 N/ s: l   if(MCBSP_MAJOR)5 |8 T: i+ t5 _! X, j( g/ L
   {
& S% J+ ?2 d& q* a  [7 y      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ e0 P6 G  g5 c6 V" L* [+ [
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' ^+ z" E' z  h
   }
- s9 p% W& Y/ T# S7 |% E% E/ f   else. @$ k/ g3 D7 O& O/ A3 u/ J
   {! V6 Z* ]/ ?3 r1 x. A- S
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, G2 \/ T& }' E6 \* w
      MCBSP_MAJOR=MAJOR(mcbsp_dev);6 F  v; W  c$ D; \" h
   }
4 o9 s7 h. F  f6 K+ W   , s* x& r& B* o$ T
   if(ret<0)+ D4 {3 u- k7 u9 c
   {
) X9 N! J6 J0 R0 Z4 I  L      printk(KERN_ERR "register chrdev fail!");
! U& n0 G* @5 v/ N      return -1;
8 x) A. n( h" p% J   }
" S- R. O: V% Z8 E  Z   
  F# L5 l( _) K  ^; Z& z+ `2 W   mcbsp_cdev=cdev_alloc();
- j& A' l2 [' j" A   8 @9 [3 t2 O" L* k, Z+ s- d* E
   if(mcbsp_cdev!=NULL)2 b7 h3 B; \* T1 K6 E
   {9 q) ~. m4 x" h; W7 u% Z
      cdev_init(mcbsp_cdev,&mcbsp_fops);7 x1 \; u6 ?# }) Q* L1 k- e
      mcbsp_cdev->ops=&mcbsp_fops;
% d9 b( M4 ]9 @# C+ f      mcbsp_cdev->owner=THIS_MODULE;4 B) i8 |0 z; V( z9 x
      
- Q' o' _) ]+ d1 r      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 q: b8 ]' e2 G, |, F& I% r
          printk(KERN_ERR "register cdev fail!");% D6 D7 r2 p$ d/ r+ i
      else
- I; I' s$ t4 r* b          printk(KERN_ERR "register success!\n");
$ k2 o$ s9 v; P- @  H   }: f. [0 J4 l' `$ R  {
   else1 b& U0 P  a# n0 d+ p  y7 }+ }
   {
4 H8 a  \& E0 m5 x) }      printk(KERN_ERR "register cdev err!");6 c# u; J6 T- W& ?
      return -1;2 w1 U: ^2 ?/ x8 R0 A8 o- T6 ~! D& k
   }+ L: e& H9 u! S
   
( b1 L- w% U; K# ^' ?  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& g( |; E9 `* u* q( I  P! V) T
   if(IS_ERR(mcbsp_class))
; |, _: f! l2 |4 y   {
* q3 E' N# \7 A5 l      printk(KERN_ERR "register class err!");
5 m2 b! ]. Z8 L3 N5 |   return -1;  Z1 Q) p" O+ V2 t! D; v
   }/ \" d  S0 X0 y3 \2 A
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! n  u. o% L3 c* A. i8 z6 n1 S" E# T/ ?, E9 u2 F  |6 z& @
   //PSC
8 W$ w; ~: ^/ Z   //add Enable MCBSP
2 C9 m* C4 h( B, G$ e3 G! n5 L# J8 S   //test
* C* x' g/ i% \% t3 m   temp = 0x80000003;. p4 [# k; _  y/ d
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 P1 m" t3 p1 g. B) a   temp = 0x00000003;
& _: [  V+ p6 a   writel(temp, IO_ADDRESS(PTCMD_ADDR));" S" n. m$ {/ Z/ v0 a# C
0 ]. n  M& m4 H4 D( W. y
   temp = 0x001FF201;
* V  r/ B( j. \: I5 n( w# @   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ Y+ [4 n7 U/ X- ?   ) g+ v4 C- B! i5 g' n! C- X: i' ^
   //PINMUX  0 m4 e! @: g9 U( s3 C
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 E% ^: ?; t4 G( ~; v" ^, x
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
7 p% W( P0 R7 h2 P3 i- s   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
" ?( ^& e9 r# h( t+ _   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 T+ b7 _% z3 b4 [; D
   
. B8 {& o1 ], y3 ]! y1 {   //SLEEP_EN,EPR,L138_SHK1,L138_RC
' \& ^. h$ |$ \8 m6 ^" M+ e2 O   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
* z; l; M* a4 _( V% k6 E   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   # z, @/ Y8 I3 y) J! I
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  r( `& E& _. i; j0 Z, ]% `$ |
" f# |% t8 `. w1 k
   //RESETn,L138_SHK2; v8 s4 p; S, p/ d
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
2 P- b7 ?; i0 G   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , L/ C+ {  J- X1 G
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 u! U1 T- }3 ]7 D7 v! D. P
0 w% A7 I" T% D1 L; P$ c) n% _
4 c! z( C. K0 F% V. F
  //SPCR Register
; H4 a: Y  U$ z/ d! ~) m) \0 i  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ l5 B5 S. r$ b1 T- D5 r5 f  temp = 0x03000000;//(DLB=0)
) J7 u  b7 Q( k3 H. }# w // temp = 0x03008000;//(DLB=1)
9 E, ?: h. Q5 Z& F) n2 j& [$ q, y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
/ W& w8 P! f% r, c  temp = readl(IO_ADDRESS(SPCR_ADDR));/ u  P# h. A/ ?! z
  printk("temp=%x\n",temp);
# \8 V! m, M) u; e- w* G 7 x, i2 L  D' ~" ]% v0 g
   //PCR Register
7 Q6 q; g0 q# V1 i   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! x1 H1 {& c& g$ H% ]
  // temp = 0x00000F0F;! \. @& p3 ?4 s4 W: b- y
  temp = 0x00000B0F;4 y6 I; ~; L+ Z- k& w; w
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ' }+ @& M% s0 J. ?: u
  temp = readl(IO_ADDRESS(PCR_ADDR));
5 O  N4 L; n$ Q( H# s4 v  printk("temp=%x\n",temp);  
5 Y( G. W2 W' q: U   //SRGR Register5 |3 p7 A" l7 n: m! a
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( B  U% {/ D, `+ }* `+ z
//temp = 0x301F000B;
  c8 V' X. ]/ m. ^   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 2 s! I: _) l* m/ W  p
  temp = readl(IO_ADDRESS(SRGR_ADDR));# @* s6 p+ V; Q4 x" Q3 m
  printk("temp=%x\n",temp);
+ R7 ^5 C( [: T( j4 Z# Z4 I* k   //RCR
1 x4 ~8 K% X6 Z  Z1 {8 [) _   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
$ ~/ t: e8 W3 R, b, j   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
7 L1 g1 u" V- a* n) T   temp = 0x00440040;. x) l0 A$ M* x4 B& P
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
; p' M" e, t. a5 Q: v   temp = readl(IO_ADDRESS(RCR_ADDR));9 w4 [3 m8 O; v+ ?- u
   printk("temp=%x\n",temp);
' r' J- ~' X5 K9 n4 B& C   //XCR6 o! j% _; k* e. p% {
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- q3 \. F# Q- ]- l
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* |; S$ B( b1 [0 v! S. N; q4 B
   temp = 0x00440040;1 ~7 i4 A, C, \3 M* o
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   * E+ e- |; M. w4 M% U
   temp = readl(IO_ADDRESS(XCR_ADDR));
8 B$ @: g) K, }) R9 r* ~% @6 c/ ^, g   printk("temp=%x\n",temp);
6 s3 {2 x1 p' x4 \) u2 l5 C" M' `  udelay(100);
. V" k" l3 m) [& _  //SPCR Register; U" \& P& o& G' H' H5 p1 A
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( b1 G6 k1 x& H8 B: d8 @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" R3 R, L+ S" M" s) \  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled1 ?' `, F3 f$ H9 t) ^$ `1 o
  temp = readl(IO_ADDRESS(SPCR_ADDR));
* D5 p7 O# X6 b, R# h" x  n/ H  printk("temp=%x\n",temp);& V! ~2 G4 Y) {+ a
  udelay(100);* d. }2 V! ]1 ?- v

- q7 I* ~' m+ |' o  //set GPIO direction
5 |  b0 l1 o" y$ F( ?. L   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 q0 \6 v/ X: z6 R) ~" g7 p   temp = temp | 0x00000100;//EPR----input
) I* k+ T# }; R   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 P! H% D  J/ H8 t  A. `8 {9 h8 U   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " s& O6 F; y8 S" u+ o  ]% k
& t, h' v2 a/ g% w9 U8 A, c# H" `
   return 0;
0 [# Y( a3 @9 m}$ o3 ^7 R9 X$ q) ~+ B) h8 m
static void __exit MCBSP_exit(void)9 J; I% N; c. R7 B, R
{
* ?. C0 ~5 M$ r& U& w& R' `) H   printk("mcbsp chrdev exit!\n");0 F. _2 z$ f( A5 l3 |4 b/ U
   cdev_del(mcbsp_cdev);
# r' I9 k( ^$ z7 z( H   unregister_chrdev_region(mcbsp_dev,count);
1 j0 L% u0 a* f- \& k7 B& O   device_destroy(mcbsp_class,mcbsp_dev);5 J, i4 d+ W. q
   class_destroy(mcbsp_class);  v" |% q+ ?& j: M
}
! h0 J9 b4 i' o5 x, D1 Nmodule_init(MCBSP_init);
! W0 ]( W2 ~$ P- ]0 j& R8 G: ~module_exit(MCBSP_exit);& j! S  |9 X( ~/ }; O9 g1 o
+ t9 y5 }" ]& \  {/ J9 d
MODULE_LICENSE("GPL");
& _" |* ]: X" ]! b) C1 w
3 }& s4 X# f/ {9 ]% Z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! P+ ~/ \) X# o) x$ ~
我的应用层的测试程序如下
$ ^4 E+ l3 _1 u#include <stdio.h>
7 Y) y- [2 {1 z  c% s1 C7 w( X#include <string.h>; u3 ^" U2 O3 j+ s' @. ]
#include <fcntl.h>
; r3 O$ b6 w& U) s% ]" u" ~#include <unistd.h>9 e0 _1 c( t& c- G2 D* i9 t
#include <signal.h>
& E* R3 k$ S3 q: P! E. t1 U#include <pthread.h>       //线程
1 ~2 s# V" ?: l1 N: P1 }#include <stdlib.h>  z( T8 s( p, G
#include <pcap.h>          //捕获网口数据
  `2 P3 x9 t) u# u#include <semaphore.h>     //信号. r) @; a. N' X" W9 N5 m; h
#include <sys/types.h>     //消息对列$ Q/ ~2 @4 P  x* _% G9 t, S
#include <sys/ipc.h>       //消息队列
9 R* @1 }' R) p5 F0 M( J. N#include <sys/msg.h>       //消息队列8 [+ |7 {$ b' Z& P
#include <sys/select.h>+ e8 a4 q% \, y. ^% [
#include <sys/syscall.h>! G3 `4 d% ]( F' }9 R* _* w  `
#include <sys/stat.h>
" P; _: Y: i9 s. s1 d1 l- v9 C#include <sys/mman.h>
  i; c; s0 Q. b4 ?/ X3 ^/ \#define msleep(x) usleep(1000*x)
  L- N+ Z5 ~4 v# s' F3 K
* U7 c7 n- e( o  [6 ~4 f7 p3 G3 Kint main()9 \5 s* s1 D2 J
{
+ }! G% O. Q1 L1 K' c) L& Y    //MCBSP,ARM与AMBE2000交互设备
7 {# n$ m4 e# G$ G int fd;. e; c) F! m8 ^2 y; j
unsigned short data_write = 0x5555;
9 Q  Z- j9 N' [7 ~" {& K1 ^ unsigned short data_read = 0x00;
+ s5 W; U8 a9 O6 h8 S& @  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 \. Z/ y' I; `6 l- q2 m
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% {6 n% v8 A/ s
   
* ?/ J( @  e2 f  if(fd < 0)
4 |% q0 s8 f3 C7 N: {! E+ s9 c  {
; C' T) R$ \/ U. J     perror("open failed\n");
) ^5 i/ c' I5 O# H     return -1;
9 N9 b  l1 b. ~  }9 |: m% B3 T9 `2 }' O) c, j9 p
  * R1 O& J! S1 A* U
  while(1)3 V7 a7 b, n0 W. ^
  {9 n+ j' Q6 v, o, \. K
   6 T6 @5 Z! m! i# x
   //AMBE2000每次读写是24个字为一帧: W. I$ V7 S' S' N( z
   //写数据时将数据在底层存储起来,等到中断的时候再发送
) t2 ^3 U' d  u) a   //AMBE2000输入数据是以0x13EC开头的
3 J. X5 s0 B4 o" n. O4 ~# `1 }   write(fd,&data_write,sizeof(unsigned short));/ _9 q* r* d8 e
   
4 Y0 c6 C5 O( x  I   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 M7 l2 }7 u, A7 `+ H# Z" g" x
   read(fd,&data_read,sizeof(unsigned short));
! G$ D7 l# z, o* p     M" T) p2 F/ v3 ?" x5 T& W9 n
   if(data_read == 0x13Ec)
& V, |7 B& I& s! X# D   {- k% m1 o- a/ Q; t5 W3 w
   
% R7 u3 x3 R% u9 _& m- G    printf("data_read = %x\n",data_read);0 S( ^+ E1 b  K! y! p4 J
   }; a. T0 k9 w; U/ ]
   ( \/ q5 y8 y. K1 U
   msleep(10);# G& O0 M/ ?8 k5 z" H! W9 c
  / c% P) n4 s& q7 X
  /*
- s0 S& c3 m9 J/ o   ioctl(fd,1);   6 U0 a- q7 N7 N! Y
sleep(1);
( t- G' v& m- k; y) @ ioctl(fd,0);: k) `* k% c" M7 c# X; }, S
sleep(1);) H$ U3 ^. a$ T- |. N; R
*/ 5 G9 B/ P% b) Z* |! A1 B0 X
  }   
1 e) ^9 m9 C: {9 O1 B# ~/ R5 } return 0;
3 L9 M; X+ U$ [7 R / L% X5 S3 o& H$ S
}
/ H3 Q% r! C8 q1 K
0 D# |$ o% r8 k9 ]+ n) W. @' b多谢各位指教,谢谢! 急
1 q5 q& Y7 z% a0 W3 M) U( C3 C
) V. }: C1 G8 b; |# r! a

" [( @! ?& ?5 k5 v$ a( R% m
! T  J9 Z- s4 R0 Z
1 `0 `9 ^: k. z0 X) Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 03:06 , Processed in 0.050504 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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