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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
6 C  Y  H4 F% T$ D2 D/*5 O0 l9 J: ?8 A: x
* Copyright (C) 2009 Texas Instruments Inc
2 n1 K( X# ~6 L4 W$ |) Q *. M  T+ k! ], X4 R! j
* This program is free software; you can redistribute it and/or modify5 O  W4 d: z- T" ?
* it under the terms of the GNU General Public License as published by2 ~( c* K, J( y. w* L# d
* the Free Software Foundation; either version 2 of the License, or6 G0 G* R1 u, i9 \
* (at your option)any later version.
' v9 q0 m) s; D( Q$ H) V9 x *
3 z$ e6 C% ^+ k6 ^ * This program is distributed in the hope that it will be useful,' ~1 N4 V$ C/ t; b7 b& n# a% f
* but WITHOUT ANY WARRANTY; without even the implied warranty of5 V1 M) J8 C& E! {+ D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( |& x8 J- ?- U, z# j7 Q; x$ r * GNU General Public License for more details.
/ E& m, U  t4 t) W+ x! I1 [9 `6 ^8 i *
2 Y6 I: k8 Z+ D* z0 h& Q * You should have received a copy of the GNU General Public License
/ Z. ~9 ]. v" `9 b6 a * along with this program; if not, write to the Free Software
$ b! a( f! O) w( b, K6 C0 ^ * Foundati
( e  X; t+ h# w" C1 Y*/
/ c4 B7 {0 N3 V0 k#include <linux/module.h>
2 F: i1 ^+ v+ C#include <linux/init.h>- ~2 O" b: {* q$ Z$ @5 B1 {
#include <linux/errno.h>. s. D/ d- W' y, _; Z; w. P' A
#include <linux/types.h>7 U+ Y+ \$ L$ U, O" a8 U2 _. Y
#include <linux/interrupt.h>
% ]0 O: o7 [2 P/ a# B#include <linux/io.h>. \5 I2 I* z( N; g* J/ ^: B  [
#include <linux/sysctl.h>
: r8 V: Y0 P% l9 s) j! E5 v#include <linux/mm.h>* x! O! c' d9 y6 G' o  s/ K) b
#include <linux/delay.h>
4 J$ X& I/ a* v#include<linux/kernel.h># c$ _  n5 I4 ?$ ?9 a- M
#include<linux/fs.h>
' K# ^- u4 d& `& e/ K#include<linux/ioctl.h>
" Q! k5 g  O" a% T1 }! g0 N5 v: Q" g#include<linux/cdev.h>8 {! r' j1 u6 s) g2 s
#include<linux/kdev_t.h>7 j9 z4 b1 m. G2 S; i9 h
#include<linux/gpio.h>
6 A* h2 o  e( x) W$ |4 [8 m#include <mach/hardware.h>
9 P: `( D: V; |$ d; E0 ~#include <mach/irqs.h>  q, D7 j6 t5 U$ J& s

+ c, t. c+ v* p" j+ F1 J2 u# V#include <asm/mach-types.h>
+ \# O" [3 e7 d& V9 u$ e#include <asm/mach/arch.h>
3 ~2 V8 L, f7 {" K! t0 {3 j#include <mach/da8xx.h>! R) B6 H6 [3 e
#define  SYSCFG_BASE   0x01c14000; A' y- y# C  _8 M" u
#define  PINMUX1_OFFSET   0x124
+ h' Q0 o6 a* V* f% K' k6 O: T#define  PINMUX18_OFFSET  0x168
7 g0 k$ L+ W8 F/ ?6 {) @#define  PINMUX19_OFFSET  0x16c7 K5 [  w6 l% E% ?5 `8 Y; F
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR5 @" x  t  ], `2 P% k
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR+ l# T" e2 e& d3 m) r5 K
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR& b4 Y; _' j3 s9 O
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
4 d4 q7 ~+ N, ~( t$ e#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, T8 j7 w: P8 s. c                            ( |! W5 L3 X" J: I7 S$ G, O' i
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR, U8 \& v+ w4 l4 K& e& g- C4 m
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR% e0 Y6 P7 s# B" Q
//PSC
! U/ w4 `9 E) i. K  I3 c. G#define  PTCMD_ADDR   0x01E27120  
9 I7 i7 H: u' K#define  MDCTL15_ADDR 0x01E27A3C
* P8 H# B$ E7 a& a9 ?' T#define  PDCTL1_ADDR  0x01E27304
3 |, T0 B; p5 v! |3 C7 I$ ~//GPIO8 direction6 u- D- ?" m1 Y! v+ s
#define GPIO8_DIRECT  0x01E260B0" N3 h6 w% G7 Y* M
#define GPIO8_OUT     0x01E260B49 E! z/ N7 N. k+ z$ ~
#define GPIO8_IN     0x01E260C0
+ m- O0 K. ~& X+ N! Q3 n7 ~9 V7 t6 C% M% m$ f& j
//#define MCBSP1_RINT    99              , L5 S  N  g% B; u* ~
//#define MCBSP1_XINT    100  
5 v" m1 Z! z+ i: g/ M' R, Qstatic int MCBSP_MAJOR=239;4 J: R+ [% x5 n. B/ H; F; G% y
static int MCBSP_MINOR=0;
) a4 L2 @, w7 Z1 {& `& p  s0 _static int count =1;
- X) {6 m" c! }5 n& k9 q* e8 `) W* r3 X, ?  V) N4 g8 z3 J
#define MCBSP_NAME  "MCBSP-device"
7 H) U9 l( x1 E$ J$ y0 c, ^+ x; O; M
static struct cdev *mcbsp_cdev;
; l5 D! t* e9 ^. t* S( S$ z3 u/ kstatic struct class *mcbsp_class;7 \, ?! b5 S" J& ?7 }( n7 {
static dev_t mcbsp_dev;
4 l% ]) m  ^) v/ C. s: E7 @unsigned int DRR_data;
" _3 L0 s8 ^" V0 n; Wunsigned int DXR_data;
" t9 a% g+ {( T" w1 b6 Astatic int mcbsp_open(struct inode *inode,struct file *file)
& `3 P3 t5 T4 K8 c% C{
. b0 L$ r, w6 x7 ^   
# u+ ]: ?9 L; D; x6 X* f   //interrupt enable,initialized
7 _# M' P; N! K   unsigned int temp;, u" U, t) g& W% }  ?" ?7 L6 j- k+ q( P
   //SLEEP_EN(GPIO8[10])---0
1 Y$ G' c) E$ K   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 |# f5 y) N6 P1 j% x  {( ~   temp=temp&(~0x00000400);& F# {% ]! b/ H. t4 n* A; [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]. _! O$ c% y, R
  //RESETn(GPIO8[8])----0----1
' b! G% O: [, I8 z& N, ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 D* ^1 B9 z0 B3 B
   temp=temp&(~0x00000100);
- `, G# w% N5 _) Q1 A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# h; Z1 N5 N, q8 j; C& q   udelay(100);
" Z- M) Q- i! Y& w, S   temp=temp| 0x00000100;( a9 b; K2 H; H1 s
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( X6 s; i" D9 y( f  B) a   udelay(100);$ C4 e9 i  F. I* G
   printk("open success!\n");
1 D4 d1 g, R# Z+ y! @   return 0;
6 K. a6 i/ Z, D# o0 {5 u( q/ n}
2 N1 J9 K  @: B' \- r% v+ S6 f' ~& Z# l- t
static int mcbsp_release(struct inode *inode,struct file *file)
; j1 |3 z( j; B" D# b! l5 I{
: j: N, X2 L1 e# I   printk("release success!\n");
% s' s$ p! @9 F' p$ g: J   return 0;2 {' p" A$ H0 n4 S
}( K% d+ p9 F/ D" U, x# U8 k* E

, [) M$ I: V. S! k* b& M( \static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( z, J0 Z' \4 B, J5 K& V{
' M1 [) _5 t/ R# l/ o3 \; \    copy_from_user(&DXR_data,buf,len);7 F" O' g6 V9 C, K4 b: b  J" f
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 v) Z# E. `: o) C
    return 0;
: [' z# w9 y5 e, M - K9 T' i7 H4 Q! |
}! C; n; g$ E* O1 `8 z. L. ]

6 O) Z1 i4 Q6 {" ~( K2 ~, zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 p5 r" i7 D6 \! @
{ & `" M* U* D* E
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 B" ^7 n1 [! s" z3 H, M   copy_to_user(buf,&DRR_data,len); 8 m5 W6 Q$ L8 f1 r
   return 0;
: l# K8 _2 b" G}
4 Q  V& q% m: G( e
! k, H" X% Y3 k0 B. z
- @/ v$ G! p0 C3 o5 L/ nstatic struct  file_operations mcbsp_fops=
/ a& [9 I: c4 @7 O0 w{
6 ^6 i2 _+ y& Q, T' j, I& a; ^   .owner=THIS_MODULE,5 A0 M7 I$ z+ t" S/ k' Q
   .open=mcbsp_open,
( @2 f0 ]! g) ]2 b, L( t   .release=mcbsp_release,4 I; F6 J% ^% n& x
   .write=mcbsp_write,, o9 F& e1 R4 o
   .read=mcbsp_read,
. i$ \; M% g% K' O0 ^! J8 N' _};. p4 ?; L. V. `: t8 T* t) y
static int __init MCBSP_init(void)6 z$ v7 U% P" o+ r
{: Y8 R8 O( T% b3 h
   int ret;
0 m( x9 T. e' `* O% \   unsigned  int   PINMUX1_REG_old;8 S- X3 b" z3 X( @; p. i% P: g3 z
   unsigned  int   PINMUX18_REG_old;
: ], ~% l( ?. A/ {. j   unsigned  int   PINMUX19_REG_old;# j$ _7 C1 o/ q! O0 [1 k" _: L
   unsigned  int   temp;  " W4 h, n+ r- I1 i% \& R! C
   if(MCBSP_MAJOR)
  S2 u% O8 M* s: d3 t, c* y: j   {1 s  d+ b0 \' t. t
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);  ]# V) C! Z- Y+ Q: i
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* |! n. n5 C3 S, \4 s
   }4 b: f3 z" u5 d1 o
   else
9 K' [4 Y' e3 h" f% W   {9 z8 X& S$ L# o% i8 N  g
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 ~  l1 c( [& n+ E      MCBSP_MAJOR=MAJOR(mcbsp_dev);
& \2 k3 y& `! _2 E9 Q# o( Q/ w: H/ ^   }
& S- @& k6 S" [* i4 Q8 N( H8 A2 W8 w/ N   . \7 i$ N) v, {8 m
   if(ret<0)
( E( H. ~0 s6 ~6 [6 B- ?   {4 U3 ]* O1 L9 t7 h
      printk(KERN_ERR "register chrdev fail!");
. `7 {. L& E  r& A; f      return -1;
- {1 W5 N  V+ P8 ^3 b' _( d6 B/ F: n* V   }/ r8 x) i# E+ C/ p# T) J9 x
   " C- C& f' K- Z( R
   mcbsp_cdev=cdev_alloc();
5 m3 C2 U5 ]. ?0 W- T7 ^9 D5 c% U   
8 h" L# E) ]+ [1 n   if(mcbsp_cdev!=NULL)
- ]. [: Z# p0 I9 Q7 z   {
4 v& _5 O1 {9 D! D+ W- g      cdev_init(mcbsp_cdev,&mcbsp_fops);  g: }0 @1 T- c2 R3 P0 `+ M
      mcbsp_cdev->ops=&mcbsp_fops;
# L' m6 G6 |3 J$ @* O) F& z$ b8 L      mcbsp_cdev->owner=THIS_MODULE;
1 ~4 {4 R" f, t: v+ M      - Z. D* e6 E) h! F- D
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
/ E- i2 i7 D( _. O. l) [5 k          printk(KERN_ERR "register cdev fail!");4 e5 x: m- V" K9 t
      else* N; m3 B/ b) m/ Q! ~/ O" f
          printk(KERN_ERR "register success!\n");& t8 B! i9 x; q! z7 n' ~- w' ?
   }# d2 v4 ~: N, D2 W1 ]
   else4 d8 G5 \! G6 D- N6 C7 r1 f; d' z
   {- g9 m/ |7 y# f- M/ l3 e9 N7 a
      printk(KERN_ERR "register cdev err!");5 s& c! d0 g# ]0 x9 h
      return -1;7 E: _) S7 C' s9 L% g
   }
7 m4 A" m- i7 j  _0 \" E   4 |/ U' I. q) E3 k; m' x% n4 Z
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 R& k4 [& d( W$ j0 `( B$ w# g' O   if(IS_ERR(mcbsp_class))
( }* p9 k- a. U; O# [; D   {0 L6 p, E* b8 r0 k2 c
      printk(KERN_ERR "register class err!");/ o6 h9 M% z+ S/ W
   return -1;
; d6 K4 v8 M& h) E$ J$ l   }
9 n5 c+ t* ^$ L( s   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
9 o5 D* A! P" x% a1 W! @4 e& F9 \$ @5 L1 S( q/ T
   //PSC
( K# m. L& R# K0 R/ ]$ N   //add Enable MCBSP! C& A/ D3 g- q+ l& ^6 C' ^% C
   //test
/ ]0 R9 d/ f. V9 i$ Z   temp = 0x80000003;
! }! `: I. h5 t3 p% T/ ~   writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 a$ g5 M* u& r& L4 b6 M$ m  o  y
   temp = 0x00000003;
" B9 _7 s5 ~! S7 g6 {; F9 F  r   writel(temp, IO_ADDRESS(PTCMD_ADDR));
- w3 P4 Y6 ]- }# N+ v" L " B. N. I7 z& `% ^/ C6 u# ]% X: v
   temp = 0x001FF201;+ i+ z1 J  c1 H0 n( F: N& D
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( }5 L- u2 T) }5 e  t" g   ' _' D' ]2 w$ ]/ ~# J5 @
   //PINMUX  ) h4 T0 a  |7 i- k0 |
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( O) }9 n6 P: c8 ?6 B9 O* ^1 ?
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  $ P- c9 i# b/ A
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 D" v8 U, E0 n+ [   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! ~# ~7 K4 u6 O6 [- k+ q# j- I   
# |! U1 h0 C7 M( T5 E( v2 ~   //SLEEP_EN,EPR,L138_SHK1,L138_RC
' |  J  }4 D) E, \5 b   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
8 M9 K: ?$ o8 Q2 \9 m   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   # D, b' H+ i/ n2 p6 T4 P
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ }; t0 l# m. E$ n

! G( L! e4 G5 R2 f3 k   //RESETn,L138_SHK2
; T: e; h0 A! t3 E   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 N; ]: A  P4 W' s* o; e1 T   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
% j" T$ L5 W9 M, a- k   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 D/ A" N) j8 U- G9 B 2 l# V0 T% o7 Z: ?$ _+ [  I
/ |2 _: G2 z! ]* N" Z5 Z
  //SPCR Register' w* y2 g7 e  Z( f5 w7 x+ T$ V
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- ^& F% p  I; f' @( P- O
  temp = 0x03000000;//(DLB=0)
. ^, H9 |6 Z4 t4 n  f' J1 B // temp = 0x03008000;//(DLB=1)
) R  F& ^2 n9 c0 ]" n- Q2 {3 K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- n7 ?# w% L4 U9 }& ^! g" h* b+ B+ ?  temp = readl(IO_ADDRESS(SPCR_ADDR));0 t9 G1 F8 g0 t( K4 F" [# H
  printk("temp=%x\n",temp);! Z- L4 V( i" S
; O2 ^! a  g/ H0 B% \  L  F! l
   //PCR Register
0 f7 [' B3 G/ |+ S9 x, j0 K   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 L  \1 Z  u2 Y" |- g& C+ Y
  // temp = 0x00000F0F;
2 x9 \7 z5 E+ k: k& G) ^1 U6 R  temp = 0x00000B0F;' a6 I$ f8 w. a. S, X7 C
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
" _+ o: P6 [. G2 X5 I/ o) p  temp = readl(IO_ADDRESS(PCR_ADDR));1 H, l: D! d3 [/ }0 v
  printk("temp=%x\n",temp);  6 `, M' j6 @7 Z" d  U0 N& D
   //SRGR Register- G3 h+ i$ f5 }! Q9 f: }4 m
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 T+ d: O8 D4 Q& v
//temp = 0x301F000B;# J( C5 B/ U3 f! o6 M6 S
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized , D: s' ^, ]! f; E  y9 u6 Z6 F
  temp = readl(IO_ADDRESS(SRGR_ADDR));
2 L3 ]7 R, R2 G( p# `  n; A8 F4 \* `  printk("temp=%x\n",temp);! N9 L  N. p8 T  ]8 I, R: l5 K( E
   //RCR
6 T! J' F; D' V" ~* m8 W  p   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, L7 n3 v0 O  c/ b! J2 l   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, c% m+ i+ ~# ^' R* L1 r2 Q
   temp = 0x00440040;5 F6 l  V- }2 B) x
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
/ Y/ q- i) ^$ W' h3 Q   temp = readl(IO_ADDRESS(RCR_ADDR));
9 w& c6 j# p2 _   printk("temp=%x\n",temp);6 z5 C0 {" o% x0 L+ |1 y9 S- f# `
   //XCR  f! B4 U4 a  ^+ @! ?
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
  \% y; ~0 J& g" p. a   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-05 u: t. a$ N8 ]; y9 w
   temp = 0x00440040;; `1 M( n# a6 t7 q6 H
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
9 h  z3 i! z2 |5 I- _   temp = readl(IO_ADDRESS(XCR_ADDR));8 c, q7 a+ T* [' M/ o8 a% h% L
   printk("temp=%x\n",temp);7 h) Y" m' [( Q' i9 d/ m
  udelay(100);
* f  U. l' E: b$ v  //SPCR Register
5 f8 [( m! a9 W( {) s  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1* ]* e; b+ i) N5 b" |7 C
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1' |7 I& Y, Z7 `& H5 x0 S1 K: X4 W  B5 J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled3 D' Z* i8 r3 V3 g, b4 U9 G
  temp = readl(IO_ADDRESS(SPCR_ADDR));' m% z' d. \! w& P% n6 z# u
  printk("temp=%x\n",temp);
3 v/ `9 D) k. J( \& p  udelay(100);
1 ?8 u  {) c# s: W9 G, r* R0 _# D4 H' a2 n$ }3 d
  //set GPIO direction
0 Z6 W, c$ h, H$ I5 \3 w   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
2 {2 D9 p) C1 N; m) S/ q1 ~9 o   temp = temp | 0x00000100;//EPR----input" B5 r/ \4 L% Q3 D
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) R5 \6 S- t# m4 Y
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 B  S9 U2 b& J2 b8 l ; ]2 j0 n: n) ^! _! z; e
   return 0;
, Z7 a$ z2 g- d; V}
( \+ p5 W( w; Sstatic void __exit MCBSP_exit(void)
- F1 Y' w, O1 a3 v& b{
  \1 L. F5 Q3 e* c- a+ [1 `   printk("mcbsp chrdev exit!\n");
* b$ x+ n$ J/ n   cdev_del(mcbsp_cdev);  X! L1 [+ j6 _* K1 U" h
   unregister_chrdev_region(mcbsp_dev,count);
6 q4 k  G& c+ A4 z8 j- J* D   device_destroy(mcbsp_class,mcbsp_dev);% D% W3 c6 K7 S3 Q9 u
   class_destroy(mcbsp_class);4 b" H. c. n! Q& v4 R$ M# d0 N, Y
}" b$ q- E2 @( f7 m
module_init(MCBSP_init);
7 D$ P7 o9 ~4 Z$ i" O  h; M6 \module_exit(MCBSP_exit);
% @# o% t5 Q; [  O
+ c: d8 y, I: c; H: g3 F; p: ~MODULE_LICENSE("GPL");
, J" j9 ~9 R' K( A% i& Y8 p0 K; Y1 s
5 [6 r" \; [8 b7 d; w我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) w) p8 |7 `2 a2 O3 f5 I6 b我的应用层的测试程序如下
1 |  f6 \/ _+ O4 e: E8 i7 N#include <stdio.h>1 g3 F# T  g- A) }" I9 Z1 W0 J/ p
#include <string.h>
. T/ `7 ?" f! V/ L* i3 {#include <fcntl.h>
( S' I3 k7 r; H4 t#include <unistd.h>
6 K' E0 ]0 m4 N+ m#include <signal.h>
- y7 N) ~  ?9 \( O, ]/ S, b#include <pthread.h>       //线程$ }& T1 j! Y/ D* I
#include <stdlib.h>
9 T. s  ?$ z4 |2 p. |#include <pcap.h>          //捕获网口数据
3 L" C6 f/ u3 k#include <semaphore.h>     //信号: q2 W6 d5 n, T2 O
#include <sys/types.h>     //消息对列8 L8 C; M( V9 _- p1 \" ]" G+ l
#include <sys/ipc.h>       //消息队列
, C  P& W% v. x/ v" b5 a: g#include <sys/msg.h>       //消息队列
: m8 I) [, W* v: p0 a#include <sys/select.h>5 O2 {; y7 f+ i$ o
#include <sys/syscall.h>6 P6 o: ^$ \$ `+ t- R
#include <sys/stat.h>8 h# h- Y! K. {1 L# i% p& m9 q5 |. g
#include <sys/mman.h>
+ X' A- U' g, W* j  H6 [#define msleep(x) usleep(1000*x)2 K$ V' s; |8 H. t6 x  B

) Q8 B. z) q  @5 d+ M4 ^int main()
8 k' |3 j. W. S( m0 ~{
( n8 |5 l/ x0 o( w4 ^* Z: \    //MCBSP,ARM与AMBE2000交互设备: c, @3 F, {  t$ t% r7 v: }
int fd;
+ m/ F5 P. C9 C# _% W0 F unsigned short data_write = 0x5555;) d  B' I6 i& g9 q9 f- i1 N
unsigned short data_read = 0x00;
. M- x6 x: j/ y5 [; n) ]% m3 G  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ `% M# }; \; V( `2 c- V //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ b1 x7 e. H+ N6 ?" c4 x    6 \+ @6 W( o1 |- c" f6 ~5 ?
  if(fd < 0)
! Y5 }7 i1 m4 X9 p  {0 t; @6 m! {5 d2 C' o
     perror("open failed\n");" \4 l6 t  o$ t9 h; [7 E
     return -1;
! L, I2 U$ _, a/ J2 b+ i  }
+ |# b3 }3 N" k5 X5 ]  
( ?! ~) b' A" h5 {! Y  while(1)
& R% _+ t5 F  @0 U* V3 V* D% w4 ?0 `  {* ^! b( Q- t% D8 i& [9 Z, u
   2 }4 g- b% B; w" U4 w$ Q
   //AMBE2000每次读写是24个字为一帧$ q. v5 a; P' m
   //写数据时将数据在底层存储起来,等到中断的时候再发送
- l) Q3 T7 D- V6 T   //AMBE2000输入数据是以0x13EC开头的/ b% A4 U# u7 K6 s8 e
   write(fd,&data_write,sizeof(unsigned short));
, q9 l  g8 B" ^9 E4 e) M. _   $ m; M" P# \3 l1 |, a: L9 T8 [
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ; H* @/ H+ p4 G/ E
   read(fd,&data_read,sizeof(unsigned short));
0 P1 }- N# u0 d- P   
: `: a4 k) n# i3 M2 `* Y1 y   if(data_read == 0x13Ec)
0 D$ y) r6 T+ `3 Y* @  _   {! @0 h4 Q1 V! x
   
5 y( }% D6 d0 G    printf("data_read = %x\n",data_read);9 E2 j5 {6 c! |. e4 s  f
   }
. f8 [8 c) _) w7 i/ \$ c   
7 c2 O/ L9 \3 t. u' Y* p6 S   msleep(10);5 n  B: a1 W3 ]! |0 i& c' ]
  
) a; B! f( D. i  /*) P* F; V' o% K( E" o) y
   ioctl(fd,1);   
7 x. K! v( V8 B5 }  z8 | sleep(1);
( L7 l+ j. |1 J4 v! j ioctl(fd,0);1 {/ q* M# R0 u! E) J6 y
sleep(1);. Z6 ]# z# A- j5 e; D% W. u
*/ * K7 U& [& n/ Z' Y
  }   
  P, w8 I% f. a" H/ J4 x7 Q0 G: ? return 0;
; |+ B: g6 w! C$ h! _7 X: p+ a
# y1 T7 m, y) N" j2 n}
( ^* i) x! @9 h, k+ c6 I: u9 |4 }: \' O! R# S$ l- z
多谢各位指教,谢谢! 急
1 ?4 Q. W  k, |. }
8 R) H' {) X/ c1 _+ ^/ g' |8 V; ]; Y$ f, q

3 p* N9 _) S) d5 X5 [
0 O+ I3 L$ t8 u+ p/ U7 ^5 z! ~, ?: X' A) s- }- z' [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 09:40 , Processed in 0.049500 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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