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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:   q+ w' L) k! n7 J. y8 _2 Q
/*5 ?( Z8 P2 y6 ]- M* J* q
* Copyright (C) 2009 Texas Instruments Inc' _1 x7 t2 U/ i% _  V% U/ A% T: a. v
*  C/ C1 c" I7 E
* This program is free software; you can redistribute it and/or modify, H1 `& p! A; S4 D
* it under the terms of the GNU General Public License as published by
  [+ q8 [1 H9 x' Y/ G8 _ * the Free Software Foundation; either version 2 of the License, or
( I) I% c. a+ m" d * (at your option)any later version.7 T) {1 S% `# ]/ ^: N
*
, o; I/ V# q  m9 p2 h * This program is distributed in the hope that it will be useful,
5 O7 z5 q! {0 B3 j * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 E( H- t' f3 z( A% N5 i9 \1 C. S3 W * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# Y; S8 C9 I1 D2 C6 y
* GNU General Public License for more details.
% ^- v7 q# i3 h2 K2 T" N+ s) M. E *
$ n  l0 z6 C  q# C& g. {0 ^5 M* c * You should have received a copy of the GNU General Public License
8 S7 b$ Z2 x4 H3 J  _' n- L * along with this program; if not, write to the Free Software& E) c/ H9 V9 D2 u% S. f$ U( b
* Foundati
. x, _8 M9 w2 a8 h; T*/: a' I7 S- ?7 \
#include <linux/module.h>9 H$ b! O6 J* o/ c+ y) E5 P
#include <linux/init.h>
) r1 B) R* c' d- Q  X  D#include <linux/errno.h>
: k# i5 y" \+ }5 `- O#include <linux/types.h>6 R; o6 H  J1 H, Q% k! k
#include <linux/interrupt.h>8 X; J9 e8 V2 Y5 W' |( U& t9 ]
#include <linux/io.h>
# s" I, b) e3 Q, h2 D" U#include <linux/sysctl.h>% N; u& E# e9 S( d, ~
#include <linux/mm.h>! ?1 b; \' b# u1 }1 b9 |
#include <linux/delay.h>
. W& k* l9 E! A9 D) V: M* G# ]#include<linux/kernel.h>9 G" Z' I8 f( |8 u- ^/ t  ^  U0 d
#include<linux/fs.h>
0 ]& r: g$ S% J# s% [9 z#include<linux/ioctl.h>
+ V4 e2 P% X+ x+ ?#include<linux/cdev.h>
" C9 Q6 x. |$ W- m( E" t! r1 b3 d7 H#include<linux/kdev_t.h>  H+ r' b: u1 |
#include<linux/gpio.h>
. h6 f: w7 T4 r- H$ L. n5 C/ I4 S#include <mach/hardware.h>
1 z% W3 f; l# e- h7 ~& J1 \- A#include <mach/irqs.h>9 c; x. X& b, D1 M4 ?
1 W" |  ~9 B; e( N' \0 y! }
#include <asm/mach-types.h>/ H4 c$ Q2 S5 g! W9 c1 Q# `' b
#include <asm/mach/arch.h>
2 z7 t4 R4 J! ]3 w, P3 B/ \#include <mach/da8xx.h>
0 @/ k: O7 x  n, ?8 m#define  SYSCFG_BASE   0x01c14000
2 v" Q3 p7 `' s. ^2 U* e#define  PINMUX1_OFFSET   0x124
! c( m& ^# f. [& T* z#define  PINMUX18_OFFSET  0x168
/ I# k* I  r: i( v  V: s$ G: i2 ^#define  PINMUX19_OFFSET  0x16c
7 g- g. N* g+ d& g- k. Y0 g3 K#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' N3 R. h$ @9 j6 b#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
5 _9 r( i& K! ^' x#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR3 [3 e9 c7 G( a$ T; \2 }5 V
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR; t) q5 w( v/ ~
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
8 T- x( z" ~2 V- N$ a" L! U, `3 ^                           
3 S: N$ L3 ]* ^$ Q5 U! V* j#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ Z4 D- n( Q5 J
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR( d: C+ B. ?* H4 _" O/ ]
//PSC# B+ B4 @# w) S" N% a# w' _. W
#define  PTCMD_ADDR   0x01E27120  & W, {/ [5 i* `& ]6 K
#define  MDCTL15_ADDR 0x01E27A3C8 l" l7 }% P0 e6 W' a  b5 [% }
#define  PDCTL1_ADDR  0x01E27304: I4 O8 {! G- k9 w1 f
//GPIO8 direction
9 U/ P5 H) G2 R/ d& M( x#define GPIO8_DIRECT  0x01E260B09 g% {1 K9 B( A
#define GPIO8_OUT     0x01E260B4
! }, n* w7 a" @! L% U) O! o# x#define GPIO8_IN     0x01E260C07 S1 k1 q9 z* Z
  ^. v2 D9 c  D- s5 m
//#define MCBSP1_RINT    99              3 ^5 O9 e' e& M# t" \
//#define MCBSP1_XINT    100  6 w& ]$ i- _9 B$ H6 i4 I; @
static int MCBSP_MAJOR=239;
9 B& J, \( h1 ^8 @; E- w0 q* jstatic int MCBSP_MINOR=0;
6 e, G3 l7 H. C3 A+ _" i8 xstatic int count =1;# u: D) \7 r! i# d) H

8 h0 o8 j; Q' Z; i! E: R0 N#define MCBSP_NAME  "MCBSP-device"
2 z( X' _, |$ x' A2 C  O+ |
3 P! T% I% L: Ystatic struct cdev *mcbsp_cdev;+ J4 d9 |- h8 T0 F7 t8 k7 o
static struct class *mcbsp_class;( Z) D: M6 i# k) l1 f: P; ]
static dev_t mcbsp_dev;3 O2 {' S/ C5 o  s
unsigned int DRR_data;7 h: z4 v0 _7 {1 T3 z& v
unsigned int DXR_data;
$ W4 Y7 b) \$ _/ {" t# _static int mcbsp_open(struct inode *inode,struct file *file)% s$ h" c3 E! n& l( ]( d
{
% V' }2 n% {: Y! F7 y9 n   
$ e. H& z) r4 [, g2 s9 ]& q4 h/ F   //interrupt enable,initialized
1 S5 q) x5 ~6 r7 R) D8 q, \! i   unsigned int temp;
" b6 D$ Q6 j' \. @- v* y$ H   //SLEEP_EN(GPIO8[10])---0
  D# ]) o3 b1 u; ]5 _+ [% E+ z' g   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: ~, Z# j" ^. \  C" F
   temp=temp&(~0x00000400);1 M' O0 ~; E$ x4 ?
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. Y/ o6 u% J8 c# J5 k  //RESETn(GPIO8[8])----0----1
, V/ p; E. D! p  j6 P* X' I; n   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));2 p, y0 X2 Z9 X' U2 \# c0 L
   temp=temp&(~0x00000100);6 o) d4 E. O/ K  u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* N0 I# x! X8 y   udelay(100);* Z" a4 F$ Z- k* q8 I5 a. m" r& U/ r* b
   temp=temp| 0x00000100;
1 C" h; M/ u+ j. a+ N. n   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ {' l: Y& v) F' {8 h7 k9 v   udelay(100);
. Z6 V: b) F3 M& |  I/ Y   printk("open success!\n");
  ]0 s1 F4 u. n$ d8 m  L   return 0;3 X& P& Q# i% f2 K- n7 y9 C
}
0 X6 z2 D8 I2 G- B, l* m% K  A
2 ]0 I% \+ W! N* K2 a! N; v* o6 Pstatic int mcbsp_release(struct inode *inode,struct file *file). @3 s$ Q9 Z; B+ ?$ r
{9 k2 @3 z& W( }  }" @- h2 k. l" u1 n
   printk("release success!\n");
4 ^) _. r' a0 ]2 f0 f& Q& o   return 0;
9 j' Y- D! A  P9 W. Z) q. f}
' v! [1 {+ X# H; R
0 k% b; O+ @+ a& y' x9 t) tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); A9 n/ |, F" M8 J% t' ~; y
{3 G4 C$ w8 ?+ l9 w
    copy_from_user(&DXR_data,buf,len);
2 Q3 U9 W5 o  W5 Q- [* w  G    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
7 v9 M: @3 ^4 b    return 0;9 G: m  I$ M# H$ d" p5 _2 `
3 i  x/ A! J" A+ B
}8 `5 O. ~! b9 Y* A0 ?
5 D# a; r9 C3 [. ~3 a% k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 \) P- p% f6 Y" }2 m{ ' M" A2 E# I  i. X' B% s# p
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 [# |  y2 W1 K  H# d$ M* \   copy_to_user(buf,&DRR_data,len); , Z6 c4 G8 R. \6 a+ D* s
   return 0;
; H; y6 q" T0 P4 a4 {. C% x}
5 l% L* S& ~: j/ n( j2 c, Q: ^9 F& B7 U$ G. i) i
5 X; P7 @! I9 \2 E" I- I3 y- `/ J
static struct  file_operations mcbsp_fops=
: `" Q& j' B- A' n{: o9 J( f3 `/ Y! w9 W% c
   .owner=THIS_MODULE,
: g+ x7 U, c; K) j. }8 f" V0 F   .open=mcbsp_open,
$ B3 T( s8 L8 m, L5 G; Y; Z" y, [   .release=mcbsp_release,( D! @  _! p5 B: `8 W
   .write=mcbsp_write,
7 t6 m) v9 d8 H0 ]   .read=mcbsp_read,
- B+ ?5 T/ c# o" o- ]  p. K; n* F};
* f' ]' H5 B( r. @5 Cstatic int __init MCBSP_init(void)4 P( T* O6 m, b3 R& G
{( b' q" R$ Y7 L' V1 A" u
   int ret;
* d" S/ ]  b+ E. }1 c# p$ t   unsigned  int   PINMUX1_REG_old;
6 @: e  d; u% h8 ^   unsigned  int   PINMUX18_REG_old;3 z& X6 S! L6 H) m. s6 e  e
   unsigned  int   PINMUX19_REG_old;
! h3 e4 I  g  W2 G- Y% C0 u+ H   unsigned  int   temp;  
. n: ?! \* p3 q  O2 y/ m   if(MCBSP_MAJOR)
/ w9 G: f' [3 E0 n4 P   {
8 _! R# [1 J/ k  s5 D2 A$ l2 b      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
+ }+ `( x7 F9 p& C5 T7 K      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 ~( U$ z3 h( N$ q) V& h* B   }
" V- L  {- v. j% x   else
& e  w' b1 I* W+ h8 q2 M5 p   {
6 q2 q) M+ t4 O; c- `/ ~      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 L  m: T2 V" ~* Q0 C
      MCBSP_MAJOR=MAJOR(mcbsp_dev);( l* A- P7 `* B
   }' e( `5 |" F" ], Q, F
   5 e: q! z% C; h# @1 T; G( M' U' e3 I) M: e
   if(ret<0)* U3 L7 O# F& X2 T5 g
   {: j, f( _. \. ^0 N& q; L
      printk(KERN_ERR "register chrdev fail!");9 ~8 H- R; d) ]  P1 r/ f
      return -1;
4 a% X, i2 ]% Z' K/ B# [* L0 A   }; `- R" p, e/ Y$ A1 f3 }: d9 \
   
( o  F9 V& ?3 E  P; F! w' L- G   mcbsp_cdev=cdev_alloc();5 `$ f$ k/ k& l
   9 E6 S3 R" n( _& {! u+ m" g
   if(mcbsp_cdev!=NULL)
) {' w4 H. L3 ^0 f. Z$ m   {
' o; [+ u4 L2 M9 F      cdev_init(mcbsp_cdev,&mcbsp_fops);
& h8 M& n* B5 f! ]      mcbsp_cdev->ops=&mcbsp_fops;3 N, p  k) Q2 n" e8 S) l
      mcbsp_cdev->owner=THIS_MODULE;
0 n5 Q/ h3 X; b! ?      # K2 q5 l6 `* f" m) W* g6 b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 N* `7 W+ p3 j
          printk(KERN_ERR "register cdev fail!");5 J3 }' j4 d3 \; T. [5 E
      else6 f! ]7 T% t' x1 N$ [9 j
          printk(KERN_ERR "register success!\n");" y. }1 W* T, S8 f
   }1 x* d# z8 ?& G
   else0 J. z0 w: W) g6 [. d  F
   {" c$ F7 h/ g- C1 f8 Y
      printk(KERN_ERR "register cdev err!");3 G( |% f* J% n- D6 V
      return -1;
0 }/ y2 ]! r' W, q   }
, L! U& L9 ]' {$ u   2 c  X2 v" z$ i* `
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 P% M, C+ t; M; \+ M& c( h# ^6 L   if(IS_ERR(mcbsp_class))
5 Z5 e0 x6 S3 t# S+ }% b   {# n* @: k: L$ i" c
      printk(KERN_ERR "register class err!");% m: Z. n! j3 e7 _( m, Z
   return -1;; Y" @! ~! ]% d
   }. |8 N. h2 q) |! }8 b$ L
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 z$ g3 @6 `% s& V1 ~, I
2 j2 ^, i) @6 e: Y
   //PSC
0 ~0 s9 V4 T0 r4 T& e& c7 _   //add Enable MCBSP
$ z, b0 O2 V8 R. _  e5 b" ~   //test
! Q5 A6 ]9 w8 E9 j0 b# m1 p   temp = 0x80000003;
9 S  w3 u' P% n. Z5 E2 z   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
/ M7 q, ?' W7 r3 `. A- p- r   temp = 0x00000003;
2 O, d; g! c; M   writel(temp, IO_ADDRESS(PTCMD_ADDR));- k2 O- i3 P1 m* T2 b

8 y. Q* G" Y2 X9 F6 A   temp = 0x001FF201;
. c3 s! [. P6 p- F- j   writel(temp, IO_ADDRESS(PDCTL1_ADDR));  F7 l/ O; b8 H" F" i) p4 ~* V
   
9 Y, ^) {" X  Y0 f8 \! L   //PINMUX  * k9 @5 x/ B5 k" {' _
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,# g. i# {; H  b6 X
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
3 x$ @) P: y- n  u5 m" w  U7 i   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
: M7 P" e' `% K  M, ~; q   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! ^! Q( E# B$ ^; c7 d3 _$ p/ I( `% `
   % _; G5 e6 P: K0 u. \
   //SLEEP_EN,EPR,L138_SHK1,L138_RC# ^/ ~4 h5 Z, E( r& N8 n
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
) D: q+ S) w) e   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   9 U: x5 C; z; Y% Q7 N$ r
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! O7 y/ f* Q. G* T) M" e7 X

. H0 ?# e- w& R- i/ n7 m6 V   //RESETn,L138_SHK2
1 H" s4 Y4 l1 c   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
) @2 C: U) g. F2 N   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   - P* I4 |  C! x; b/ n# c2 I+ N
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);9 I8 G, m( ]% g3 s" \; W

  @0 |% A8 e  L4 u
' w8 z; S. |- P5 M9 `  //SPCR Register  k6 n' n4 W: Y1 O$ {3 z/ e8 W- E
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 o! V2 o. m3 I% O  temp = 0x03000000;//(DLB=0)4 |6 O2 B2 u) i+ t
// temp = 0x03008000;//(DLB=1)
9 f% A. o3 p. R  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
( h# Z; t+ _! ~6 _  N  temp = readl(IO_ADDRESS(SPCR_ADDR));
* f2 U4 k3 |+ g' ?  printk("temp=%x\n",temp);
8 S( O# V! H" g* A9 A% l9 r% }0 @+ E' i $ ^# }" o) y- o0 t: H2 T! c
   //PCR Register
$ l7 g, K+ l* G" E; w2 |   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* w6 x: Y( {2 O7 O- w$ n  // temp = 0x00000F0F;8 [! c# y% K; W1 b: ?* {
  temp = 0x00000B0F;
, O& ~- ]* z, R0 y6 J# Q/ G  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
% I. M  C8 @0 g/ Y5 z6 [  J) a. u  temp = readl(IO_ADDRESS(PCR_ADDR));/ [! ^+ J. g! o7 r' v
  printk("temp=%x\n",temp);  
0 d5 L/ [2 d. _   //SRGR Register
/ b9 |& _% o* }: O4 j   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; C$ g% m) A5 Z! O //temp = 0x301F000B;+ f) E8 m& p' P% S$ x9 g. w/ @4 x
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
$ f% ?' z9 S/ P0 t+ v. _# h  temp = readl(IO_ADDRESS(SRGR_ADDR));
3 q- c! `: |* I  c8 w1 J2 ?  printk("temp=%x\n",temp);6 W. g' K1 i6 M* N, d$ h* G
   //RCR
# [" C. F0 e: F3 Q   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" D0 S3 v  l7 ~  {   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 P# r4 |- Q* [- ^+ e3 L
   temp = 0x00440040;$ ?* l0 c  h% Z- w
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
( d9 M' N: F6 l2 D) h   temp = readl(IO_ADDRESS(RCR_ADDR));
+ Q/ t& x) `" o+ V. C8 S   printk("temp=%x\n",temp);- d6 q) ?# e) [$ j) k. B* ~
   //XCR
) f- i/ W7 ]0 y0 K# t* Z   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# R- C" @1 X4 X
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: l6 C' D7 R0 p# C7 b+ x! F* P$ ?   temp = 0x00440040;# T5 e& H* K: b8 Z4 z+ ]( v
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
) e. R1 V+ o, o& N   temp = readl(IO_ADDRESS(XCR_ADDR));/ I2 a* G' i/ K8 L; b
   printk("temp=%x\n",temp);
/ c9 t% {! m" P5 M( Q& y  udelay(100);
5 `" b( ^! D+ ]6 H" q; W+ ^: `  //SPCR Register
/ r# B; @- g& C$ G8 [& l5 P# i9 `  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) c& q. M% P# i9 C+ K
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" v7 b7 T$ d" ]/ i4 N0 P  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
3 R8 N/ P/ a( D  temp = readl(IO_ADDRESS(SPCR_ADDR));
& s( a7 _" e  X8 s9 D" ^  printk("temp=%x\n",temp);
" L8 ]& i" }* z2 Z3 f- a  udelay(100);
. }. g( ^; v8 j6 \2 S* T( O3 c4 ?  g* m2 ]% A- _
  //set GPIO direction
: c* U% M0 ~  V9 W. E   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: `+ w% K0 @5 i   temp = temp | 0x00000100;//EPR----input% a3 K' L; a( E8 W% F* r
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 g- s9 i5 s/ d% b' |* z9 s
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 e5 T* w" b4 I9 s1 D

/ g. x! G" ~. q; |( O7 `   return 0;% T0 M' u# E* G3 U% `' }& `2 v
}
4 i( s- g% G! T8 gstatic void __exit MCBSP_exit(void)4 U! o8 N6 P0 k, z( }- ~( a+ ]' E  p
{6 z- q6 Y* W+ i& t
   printk("mcbsp chrdev exit!\n");4 ]- p! x( c9 }/ @/ Y2 M2 p. O5 ]4 \
   cdev_del(mcbsp_cdev);
& ?8 n2 a, G# y   unregister_chrdev_region(mcbsp_dev,count);
, I& p: ]& m8 R   device_destroy(mcbsp_class,mcbsp_dev);% e9 [9 f+ p2 P; G$ N4 _: ]3 N
   class_destroy(mcbsp_class);  D$ ^+ l6 ]7 w+ R7 {4 t' k, W
}
. I/ W$ s. a$ x; H% o# \module_init(MCBSP_init);, K$ g4 N" {! f! h
module_exit(MCBSP_exit);
' J6 a# t+ U8 U( U1 N/ P6 `& q/ @/ R( M
MODULE_LICENSE("GPL");
" d4 m' j" i9 k& r6 r3 U; P/ [5 Z* ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" O! l/ V, }7 T我的应用层的测试程序如下
' |( o- r5 p  ~" U# `; B: ]#include <stdio.h>
( e% o. |3 |  ~* p$ J' _#include <string.h>
% T( Z# }1 ?3 Y#include <fcntl.h>0 p" W% K6 L5 C* O( J
#include <unistd.h>* Z4 Q5 c. Z: V( u! ~
#include <signal.h>
% |6 u' D3 I" F4 m#include <pthread.h>       //线程
  Z  q+ n* j" p7 G! ]) M#include <stdlib.h>
% q+ C" G- C1 N6 @#include <pcap.h>          //捕获网口数据
5 S. E% V1 Y$ c) q#include <semaphore.h>     //信号
+ I1 M5 V5 j- O3 Z( E: W9 `#include <sys/types.h>     //消息对列
2 G9 O$ }* p* V$ H8 K: M#include <sys/ipc.h>       //消息队列
6 z8 ~- F' V- S5 e& w. @+ K#include <sys/msg.h>       //消息队列
3 B$ X  L# `+ t$ j( Z#include <sys/select.h>
' G5 \+ q$ N* K" R* r3 q#include <sys/syscall.h>
) e+ P4 U/ b0 X+ O5 i4 E- O  C: ^#include <sys/stat.h>% F: p. O: Z! h, ?/ v
#include <sys/mman.h>
" Y# U: Z: `, N" \% k#define msleep(x) usleep(1000*x)3 X! h  U) w) m' g. t. D

$ A. n0 `+ U6 a% Eint main()
) J; R, P' w5 g2 e  l  x4 T& T5 a{ + F  ]# D  Y$ N, A
    //MCBSP,ARM与AMBE2000交互设备3 @' @5 ~5 p9 I/ y7 o
int fd;
* Q) t& j* y2 `$ e' F unsigned short data_write = 0x5555;
, r! P. R5 \+ q& D4 l unsigned short data_read = 0x00;
% ~# Y% M7 G! e1 h6 s  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 n: h1 O# l  H1 F+ j
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" I+ r& M" w8 J9 Y0 V$ z   
6 n" Z1 I  w, T; R3 b# b7 w  if(fd < 0)
, Y! \% ?" Z8 Z/ Z  {
2 |1 I- V- a1 Z  V     perror("open failed\n");- W+ r; s1 L% }* e
     return -1;
0 w0 ^: X4 K0 e  }
. G6 f# d* n. m7 f) d6 \  0 I- u! l  {  j! @
  while(1)* p3 L, z$ Q& _
  {
7 G: l: g& Y' V5 n   1 q" q( t+ V2 Z8 \) ?4 {+ w; R$ ?+ L7 S
   //AMBE2000每次读写是24个字为一帧$ v3 x9 j5 M9 L
   //写数据时将数据在底层存储起来,等到中断的时候再发送
6 S% m9 v+ g) L+ x" O( A   //AMBE2000输入数据是以0x13EC开头的% j! s9 R$ X6 U' d
   write(fd,&data_write,sizeof(unsigned short));# M- p3 M- z% i( ~  X
   
! ]) e3 q4 S/ d. k; |& |   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ! q' `1 }9 ?9 y% ?
   read(fd,&data_read,sizeof(unsigned short));3 M: v* V) X  }/ r8 q, f
   ! @; b0 v5 ]# E/ U) V- E8 n: U
   if(data_read == 0x13Ec)
; a+ m- {! p" Z8 i   {
* ]( G6 r; O1 o$ G   * T: m+ Y& m$ I, x
    printf("data_read = %x\n",data_read);
1 f' ~5 C( y( |, I0 Y   }
* }1 h" b; }5 s   
9 h# S# N! o; e  F, j   msleep(10);7 U  |( U9 }9 s
  # N# p# R, D6 ^/ e3 J1 d
  /*
2 o% ^# C* ~8 a" M   ioctl(fd,1);   1 ]. J! h* z) Z+ a
sleep(1);8 E) |3 Q- Q/ J: y9 N
ioctl(fd,0);# Y( u" n5 ?* K3 n* M
sleep(1);
  _# ~6 ]5 W: ]4 L$ f; H" ` */ 6 |% w5 a; q4 T9 S3 G# x% q
  }   - i9 p  ?$ G4 o- _% t
return 0;! \& Q9 i. I  s7 \1 i( h/ K
1 I& G% V; H' `+ Z0 |/ a
}
0 A; ~" B8 l7 R0 v3 p4 k" \) C# |/ T0 O0 R) ^
多谢各位指教,谢谢! 急
3 @4 j! |5 q$ r: n. _$ o  K" J: c8 l8 D4 d) Y

0 @/ _% S! K! c5 G( H
) ^+ J0 e; F/ a
" \% Y0 k" z+ V) r/ Y! k4 y
. n/ j: D1 v& `9 k* T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 22:19 , Processed in 0.051366 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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