McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / l/ t7 u; n- [% e. F/ a& g
/*: \7 b2 B+ t" r6 h
* Copyright (C) 2009 Texas Instruments Inc" u& M) e) J; _9 v
*
3 p- T( J3 U$ r9 m5 L9 ^ * This program is free software; you can redistribute it and/or modify5 K. w, c- O% f% ^
* it under the terms of the GNU General Public License as published by1 y# M8 R2 t  Y- Q& n' F
* the Free Software Foundation; either version 2 of the License, or
% j0 ^' P( T9 y' `6 u * (at your option)any later version.8 }+ U0 Z2 k& |
*
9 q1 f4 x- v! U* J * This program is distributed in the hope that it will be useful,& `  |/ R1 k3 O. }% g% s. O
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1 t: S6 ~* b' j) x  m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 D) E  X+ z9 S4 W+ y7 E * GNU General Public License for more details.
- C( N" r" P7 G7 R4 C *4 G4 A+ Z' g) p' W/ `; f
* You should have received a copy of the GNU General Public License
  S3 w" m: E" W) B$ v1 [& F * along with this program; if not, write to the Free Software
; Z8 k" O& G: w& a  A * Foundati6 W9 p* _. v- G
*/: d+ f" _  p9 z
#include <linux/module.h>9 v9 }4 g/ S7 n1 h$ @4 y6 R
#include <linux/init.h>
  N& F; N+ Q! E# p0 U0 y#include <linux/errno.h>6 t. I  o$ O; ^9 o$ O5 N2 d
#include <linux/types.h>
& B/ w4 z- `/ b; U/ s  H#include <linux/interrupt.h>7 ?9 U0 A6 t8 p3 a3 N
#include <linux/io.h># N  M4 W1 T9 l/ D5 h
#include <linux/sysctl.h>% h5 G! i. b( Z5 |6 p
#include <linux/mm.h>/ `# m8 `+ e# o8 ^) X% M9 Z
#include <linux/delay.h>; e) Y3 G" j+ F% M, ~, B
#include<linux/kernel.h>7 ^5 z' \3 N! K: H9 v; J* i
#include<linux/fs.h>) c: g  g% q, B2 q
#include<linux/ioctl.h>8 ?  Q5 [) T5 g2 P) l! v" E
#include<linux/cdev.h>
4 W. X  F" T/ ^: L#include<linux/kdev_t.h>
) Z; C+ d. j) K4 q#include<linux/gpio.h>
1 a" E9 f. v" K5 Y) q9 m' U#include <mach/hardware.h>- X& u0 j3 G. K( I  B4 _
#include <mach/irqs.h>9 N9 J+ H7 y9 Z$ p) i1 u9 `- U
. T/ s% S% t, {2 w) p% s- C" u+ W
#include <asm/mach-types.h>- B* D4 `# P& q) l0 E* B! y
#include <asm/mach/arch.h>
; y1 ]# S- E5 t#include <mach/da8xx.h>
# y3 S- G& V, M  ?) |. r- A#define  SYSCFG_BASE   0x01c14000
" L% h/ L4 l' B; J/ Z#define  PINMUX1_OFFSET   0x124
( w/ q2 M4 u" U, D3 b#define  PINMUX18_OFFSET  0x168
- f- U& R# g( S#define  PINMUX19_OFFSET  0x16c
  A( z* A9 q: K6 N* t#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' a( Y/ d) l+ u. \& v#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
2 S4 K; V  C+ x$ ?5 v( g5 p) l#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
) B; c- n/ O; k. W#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
7 @" F: F9 I% b$ o" _#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR! H0 T8 a- R0 Y' S; C4 s0 _
                           
! U- R1 `, F. H1 A9 L! f3 u3 b#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
, P, p+ S1 O& G: `4 p2 ^& r#define DRR_ADDR      0x01D11000  //MCBSP1_DRR7 y9 ]2 Z! |3 U- G# X2 E
//PSC% m6 F; V* v# q, l# E: Z
#define  PTCMD_ADDR   0x01E27120  
% F# g4 e) j6 y3 A#define  MDCTL15_ADDR 0x01E27A3C9 v7 H" U/ z( }! M
#define  PDCTL1_ADDR  0x01E27304& C, F1 E% B* [$ O, z; J
//GPIO8 direction9 `* Q6 {8 X8 b" {2 \
#define GPIO8_DIRECT  0x01E260B0  R. O$ w$ Q2 c# _
#define GPIO8_OUT     0x01E260B4) p7 p' I( j3 p. `0 [+ D
#define GPIO8_IN     0x01E260C0
6 G) Z/ @7 ~/ P, }# Z. w  L' g8 y) V5 X8 x* n) T0 Q+ f- E
//#define MCBSP1_RINT    99              - L; J) c; U8 t$ A9 Q1 M' Y4 t
//#define MCBSP1_XINT    100  
7 D6 a! T' l$ ?7 E; B2 |0 a. q$ Zstatic int MCBSP_MAJOR=239;- O  T; Q- |' A7 c0 M, J0 k
static int MCBSP_MINOR=0;
3 a4 |% |( E6 t0 tstatic int count =1;
) H  I$ {# v- Z% U, \- f! `
0 D9 d- y: k* P/ Y#define MCBSP_NAME  "MCBSP-device"
0 m* k: p) f" ]+ C# x/ h" T
0 v+ R: z  D8 \( f% M, L1 w( e0 v5 wstatic struct cdev *mcbsp_cdev;
' v! y+ {* w  j. `5 Pstatic struct class *mcbsp_class;
* H7 |9 W# X6 q/ [/ a; Lstatic dev_t mcbsp_dev;3 n9 S0 O% \9 r$ C" K0 H
unsigned int DRR_data;
- |) X1 b  ]0 gunsigned int DXR_data;
4 p' u: W3 [* P7 z# nstatic int mcbsp_open(struct inode *inode,struct file *file)% n2 |1 [5 a. G0 g9 ~2 n6 b, W
{3 g. X$ S& l: T+ C! ~* F/ m& t+ C9 `
   
7 I  @! a$ P7 U8 {- H! u& c2 w  l   //interrupt enable,initialized, }3 A* I" Y/ t1 }$ y) u7 f
   unsigned int temp;
$ V' \, u  b$ N+ q- X0 b2 Z! d/ ]   //SLEEP_EN(GPIO8[10])---0
) k- C+ c) F) Q5 q% r# q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 R1 w9 P2 @! D' V) m# }: u
   temp=temp&(~0x00000400);9 z8 L+ k  V# n* h# q. x9 N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- e1 U- |6 v6 _2 V' G* h  //RESETn(GPIO8[8])----0----1
0 }* @) b% [# G. J/ B0 N/ A9 z   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 L: a* S1 d  k- w' c6 z   temp=temp&(~0x00000100);
4 ?9 C& b6 Y/ @3 L. w   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 R, Z5 v; T+ L0 e& O. v4 C2 u   udelay(100);
  U4 x" A( {1 a) c9 A   temp=temp| 0x00000100;( D4 z! f  G) E# @+ P" K0 y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 g/ S( C& j+ E( V6 m* m
   udelay(100);( L0 N1 n) E; l$ a( n2 E
   printk("open success!\n");
5 U: ?, @5 J# I( J   return 0;
4 j" x1 i- }8 ~}9 C! {" ~9 E& M

2 W8 T: {# D3 c8 nstatic int mcbsp_release(struct inode *inode,struct file *file)( B/ `  I! u1 E, T; s2 t4 V% _
{
9 I- a, E. c# b9 f5 j/ G9 N  w   printk("release success!\n");$ F: q  M  `# W3 h: F: @% m
   return 0;
1 y( n' c# E4 c% N5 q}0 Y! y5 h7 \* |2 k" u5 n8 S

: ?# r4 Q; M7 Y# g9 e/ m' qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)( N3 {' M) n. p$ F' x/ v; r% z7 E
{7 I' ?: K6 M- M6 S, C
    copy_from_user(&DXR_data,buf,len);
& N& J' N5 L! s1 t3 [( _# K    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) z" p2 h$ W' g4 j2 |7 h    return 0;
) `& w5 r, w$ }& U7 U8 z 9 H3 W2 B9 ~- v) _
}7 ]# Q! T5 g) p# P) @2 b" `9 a! B
. W5 Z3 T8 e! l4 T
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 a7 M7 Q7 l+ Y* K
{
& t% y: L: K7 y   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
4 e9 Z( I) a  ]   copy_to_user(buf,&DRR_data,len);
* g1 o; G( z& X/ h4 P! {   return 0;0 Y" Y# m8 p* I* t
}4 u, _+ u- N$ p5 w+ e8 P
2 `- L9 A# N0 p( ^* v

0 E0 R+ e( d6 T5 _- tstatic struct  file_operations mcbsp_fops=6 u1 t1 c5 h/ b8 e
{7 A6 O8 C' V6 {4 l0 }) z
   .owner=THIS_MODULE,
& j6 d8 K9 c( A' [7 W( ~7 F% v   .open=mcbsp_open,
; Z: N3 f" j+ }- @/ V   .release=mcbsp_release,; h! b0 ^5 ]* M$ J' l
   .write=mcbsp_write,
' ]4 o0 b% ~/ S   .read=mcbsp_read,
$ e( v! d, E" }) l/ V, J4 X};3 j1 ?( f) y, e& s& d/ [4 {
static int __init MCBSP_init(void)9 j3 X, R* L/ C2 F6 [
{4 ^9 a) o! a& h, ^$ ?
   int ret;
# [# j  `4 H( N8 }& B   unsigned  int   PINMUX1_REG_old;* p! O0 K) @  }
   unsigned  int   PINMUX18_REG_old;
& I* n: g1 F, I! I) Q5 A4 s) }; x   unsigned  int   PINMUX19_REG_old;( t& ~: ^0 C1 ~$ b  P5 I
   unsigned  int   temp;  
/ M" G, K. R8 x% L   if(MCBSP_MAJOR)
# d, v: J, Y1 C8 X4 U2 |9 `   {; u2 A. _" j9 f' l* z3 F# @" B6 x
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
  n5 N) ~1 u9 J7 Q, A      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 B! ]& c7 F/ A! C$ H* v   }
' k  i: }, ~+ t. q; ~7 j3 C   else
2 R$ Q) _) T/ H   {
/ M, [* {- }) N! P4 ]+ a7 Y      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 X. R  t4 C, F' \# _) C- c0 k- T      MCBSP_MAJOR=MAJOR(mcbsp_dev);
, _9 Q; g- P, A8 O   }5 E$ ]: [, W4 Y8 X" o, W: ?1 t  X
   
8 X! ~  A! Y8 |# k. Q. Z) r- r4 D   if(ret<0)
! i* Z7 \8 f9 s/ g- v   {, P; D  i# L5 G: b- Y
      printk(KERN_ERR "register chrdev fail!");
* ]) q2 W/ C7 l& Q' D- \      return -1;# t3 `: b, L. f
   }
* s, U1 P/ b$ f* b, R% k# n   
- k) c5 ^( s+ s  A   mcbsp_cdev=cdev_alloc();4 k) O7 J# g" a* `
   + `- A2 C7 {. d! @
   if(mcbsp_cdev!=NULL)
- c2 N) q! Q7 a* ]" _) R# W7 W4 P   {
, H# Q  s+ ]5 P+ `' l( T6 S      cdev_init(mcbsp_cdev,&mcbsp_fops);
( u2 J5 x: b. T) @4 c; {      mcbsp_cdev->ops=&mcbsp_fops;+ ?# H! C8 K0 f0 j" l9 r
      mcbsp_cdev->owner=THIS_MODULE;
8 b1 v( m- ~+ f5 P# V  S      
2 m" e# x$ j3 C& G+ O      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! P9 G% q# N4 X4 S( Z7 T9 V: C: L* y4 T# {
          printk(KERN_ERR "register cdev fail!");5 t3 Z0 }( k$ H
      else
6 |/ w$ @3 R1 c1 ?0 O. H  R          printk(KERN_ERR "register success!\n");
# W. F; A* i: [/ T$ D, ?   }7 B) b: ]4 U5 D7 O+ Q$ Z
   else) i5 }- u- Z! e6 Q6 z* H
   {
+ c# N$ m; j& r+ w      printk(KERN_ERR "register cdev err!");/ b; v! V5 |9 H6 x
      return -1;
7 K5 E+ h; t  B2 L$ C3 ]   }. l+ V/ N) ^1 \& r: S. {3 m
   
8 I3 g  W5 m6 D5 d; X  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 i# E/ K! `% m8 H1 d. e   if(IS_ERR(mcbsp_class))5 d* q( y/ H4 x) X
   {
8 F6 O# u: ?- N9 O8 T3 E      printk(KERN_ERR "register class err!");
+ V: s# l4 s- f' _+ e   return -1;" t* w6 U: j% D/ W. R7 _9 x
   }
; `' B/ Q* @& k  v# g8 W( {# W   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! a! F4 c/ G  ]5 i1 C
2 A3 E. w+ y1 z   //PSC( ]% @& K" q$ D  W* G
   //add Enable MCBSP
: S/ R% }: v9 d   //test6 `4 m" U' o3 p  s
   temp = 0x80000003;
3 a) e5 ^& B5 ?9 U6 Y   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 J* ^2 [) b) h/ {   temp = 0x00000003;) }" m' u  u* D) P# h" E# z
   writel(temp, IO_ADDRESS(PTCMD_ADDR));5 T+ a* D+ i% `0 J* f- Q# h

) `+ n6 z! ~# F7 Y, Z. l   temp = 0x001FF201;4 x) |# n" \. S! R
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 j' Z9 V4 z* [  T* ^) P" v
   4 {: [& \9 p, v1 Q/ R. @- _$ z
   //PINMUX  
  ?$ e! I5 e9 u) I, K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. B* Y' n% c9 u, E5 D% L8 W   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; L: G2 l  f9 \2 s/ W   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   6 X. M! D' h1 {0 r5 w' t* E
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- ]0 W6 h) |5 t  D- R2 N   1 F, m# }; R5 Z! N0 d% b" p& E
   //SLEEP_EN,EPR,L138_SHK1,L138_RC, C+ d) m* ?; ]/ ?' @5 R. z
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  , {& Y  d- I- m/ a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   # F3 K, L# m9 C8 v
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) r1 a" a7 Z: L4 K$ z1 k/ j
! _, z, A3 y# R; D   //RESETn,L138_SHK2: {$ N! ^7 {9 E- H  H1 l+ }3 p* ~3 F9 x
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( g! y6 m2 n8 I   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
0 ]( c: f8 m* y" ]- f0 c7 |   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) B( W6 o( w8 [- V3 ]& |4 e

5 P5 z0 y4 D6 M- O: a9 v  y 3 B/ x$ Z2 i: u
  //SPCR Register
, T5 J3 m. k" c: N. a( h$ k  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset, x. Z1 U5 ]' {& g
  temp = 0x03000000;//(DLB=0)
  s" C% }) w1 A! V/ {+ {! t, T# l; v // temp = 0x03008000;//(DLB=1)3 R3 u/ e8 U# T
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset( F% @+ Q" Q; l2 o. |
  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ w6 m# f- d# w0 i6 @% k9 j  printk("temp=%x\n",temp);7 D" c" f# g8 @; V7 S

2 N2 P1 ]) s# l6 [  Q   //PCR Register
7 ^/ W9 y5 m, M; G' w   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- O4 U" H# @+ b, p
  // temp = 0x00000F0F;
: W' X+ e* m1 o. K( Z* k. R  temp = 0x00000B0F;- i5 z. }1 z# D) [* O
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized ( F; g0 y/ O: ^% Y. o
  temp = readl(IO_ADDRESS(PCR_ADDR));* j9 D8 d  ^7 V
  printk("temp=%x\n",temp);  ( r! f3 x' |5 U
   //SRGR Register9 X1 q* z& h2 X9 [  l
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: a5 S' c/ ]2 ]/ s. [ //temp = 0x301F000B;
$ x) O. [+ S0 K# b6 G   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
+ V3 k' f9 R  B8 V8 _  temp = readl(IO_ADDRESS(SRGR_ADDR));+ O% g3 a! b! w0 o
  printk("temp=%x\n",temp);( }* m; z3 Y. }) o7 I6 d/ m
   //RCR
8 P) v- Y/ _$ z4 o7 G   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 Q; z6 `! Q; L: t) E0 f: y9 i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0* H  ^$ A! S" ]7 ~5 U
   temp = 0x00440040;
0 d& o4 q0 d0 s. Y4 Z   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   $ E: _0 D+ t0 e6 F+ x4 l, z9 L! R, C- w
   temp = readl(IO_ADDRESS(RCR_ADDR));5 a; O6 [6 S$ H
   printk("temp=%x\n",temp);
2 K2 C5 z1 Y  C6 o1 v, E$ s( {/ g4 m   //XCR
" O8 x* y( |/ p8 B   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 S3 x2 ?3 _/ v: l  I2 G* k
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* d5 e) ^/ n$ `+ W# j* [0 J4 K
   temp = 0x00440040;
) I3 P+ L$ w" T' c3 B% w) _   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   - ?# k% P3 ]7 ^/ y. W  W
   temp = readl(IO_ADDRESS(XCR_ADDR));$ e# {9 @0 L2 b
   printk("temp=%x\n",temp);- v! x; F% S) u5 ?% b$ D
  udelay(100);* p5 e  ~1 l: u
  //SPCR Register
( K. x( p7 D5 I# T  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
  W8 [" W' g1 a4 _! j2 A  I, H  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
: r5 ^0 [& {: c) l. x. h  X; Z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled0 \" t  B* E, X( M6 o
  temp = readl(IO_ADDRESS(SPCR_ADDR));- O/ L. ?0 v8 |" Y  k1 o6 C
  printk("temp=%x\n",temp);8 C6 T1 t3 E; ]! }0 n
  udelay(100);7 l9 }9 i" |3 F/ e# X+ w( u
# \, H9 E+ z1 Q6 x/ }5 {
  //set GPIO direction& H$ {' P: I) U5 p/ Q/ y
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 u2 H% ]. J: q% u   temp = temp | 0x00000100;//EPR----input
! s, S8 p2 v, K2 ?2 J1 X5 w( T   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output' A3 I; W- ^6 n: E: E' t8 _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - [6 P( L9 T. E- i+ A% R1 |9 w& |
8 J2 s8 w7 w1 K& \% Y& \$ r
   return 0;" n1 j: t) T& u7 \* c; ?
}
, |/ i! o( {0 G! vstatic void __exit MCBSP_exit(void)' [# E% N* J; C5 q" g2 w, ?
{6 d4 z0 S+ t0 H5 Q  x& u
   printk("mcbsp chrdev exit!\n");
! o# o" j. c0 X7 ?3 U$ A   cdev_del(mcbsp_cdev);/ N- |, e0 L7 C" H3 A$ Q  d; a
   unregister_chrdev_region(mcbsp_dev,count);
2 c8 I* ^9 E/ h' b1 S. I6 N2 }   device_destroy(mcbsp_class,mcbsp_dev);
3 T: P5 _# k. Y& Z6 h; F  n/ I   class_destroy(mcbsp_class);
& H# Y! a* I% a5 k}- i/ t  r3 Z/ {
module_init(MCBSP_init);
3 _1 C# D' s4 o8 X7 F  A5 N8 Ymodule_exit(MCBSP_exit);
6 N! V* N, x+ [- g6 F/ ^3 s' K: u
3 a; I5 d5 ]8 H- V( lMODULE_LICENSE("GPL");. l0 b; u9 I& N" K1 i
% \0 f# K) C, W( w2 P! u
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ ^8 a1 B& ?( x% z* C& Y我的应用层的测试程序如下
3 m+ B% J( H; i3 |  L#include <stdio.h>
8 t; Y7 M% s5 K* a& Z9 u) V#include <string.h>; D# |. A6 u" H" ?; c3 ^) ^$ w# V
#include <fcntl.h>7 I* E- G  h+ X
#include <unistd.h>
" `7 v: J6 n* |0 i6 P# o#include <signal.h>* x7 V: Z$ j' e  D
#include <pthread.h>       //线程4 L# I: z, n; A4 ?  |% v
#include <stdlib.h>6 B6 B- j6 P2 S% t7 Q4 M
#include <pcap.h>          //捕获网口数据( E5 ~; n- c$ ~% G* X
#include <semaphore.h>     //信号
" ^* j  F- w8 L! T' v#include <sys/types.h>     //消息对列
; ]* {( V8 u- r6 X  `9 ?/ A#include <sys/ipc.h>       //消息队列
1 n, `* F8 d+ }' c: W#include <sys/msg.h>       //消息队列5 V. i* L: A) G" e! g7 s! h
#include <sys/select.h>* ]' _8 J( |2 J  z) _/ Q/ S; Z  f
#include <sys/syscall.h>$ K8 `9 @. _# b7 r& o6 V9 q
#include <sys/stat.h>% X" q& x0 L7 B6 h/ D7 j) t
#include <sys/mman.h>
  o2 V% g& a8 u#define msleep(x) usleep(1000*x)+ U5 i; y0 |3 K3 j  Q% v2 l( f" c0 f

' ^, R. |' a  Y3 uint main()
* _$ T, I0 O8 Q; E# D9 M{ + ?; q- z! Q  Q* G
    //MCBSP,ARM与AMBE2000交互设备
" |% c9 o3 o5 P  `* O. X int fd;2 S! P3 K. f2 B: o9 E
unsigned short data_write = 0x5555;
) h* K2 l# M( W, |& i unsigned short data_read = 0x00;
3 b3 u1 ~/ D, ?! n! q  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* E7 @! A% ?6 G5 A3 A5 `" g //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 F3 a7 @3 L7 N0 t8 T7 u
    . w& b  D, j7 B. x  e
  if(fd < 0), v8 e2 j  Z, T" Z. Q# z
  {
& ]  B( s8 z, {, U8 d     perror("open failed\n");. l* T. `' f$ M! U* b
     return -1;
* h) H, o$ @0 x  }7 V# L1 [$ k  U; N8 v
  & ~! j6 q8 c" N3 E' v9 f: ^' f3 N3 {. d
  while(1)' u4 s& h+ b: I4 ~+ ~
  {) C) @9 f. C( {5 g* ~' u
   9 ]- r7 P- `+ V" Y) E9 U+ |5 R
   //AMBE2000每次读写是24个字为一帧- J% X# x# F/ S; B" D
   //写数据时将数据在底层存储起来,等到中断的时候再发送
: g# Y% R$ ^3 L/ O. X. R/ i   //AMBE2000输入数据是以0x13EC开头的
; M, z+ J9 s' [   write(fd,&data_write,sizeof(unsigned short));2 q  F. ]2 f: c( d
   
, Z% D6 ?; i) h' e5 S   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  " ?3 A4 x( E4 T; J, c0 ?7 a
   read(fd,&data_read,sizeof(unsigned short));
3 A$ Z0 [1 A7 v9 Z   " {: i! g, e* P5 i9 f5 E/ f
   if(data_read == 0x13Ec)
6 L1 I% x4 E" G/ ?   {" H9 o7 Q! @# U* q1 N
   * a7 O% e* r( Y- O7 @
    printf("data_read = %x\n",data_read);
  V' B5 X+ N2 P2 E& N   }3 j: ]% u0 X3 _" `7 g  A8 O5 n
   8 q6 W  T, e2 `: w
   msleep(10);
" ?/ G5 T* L: Z5 k6 l    x0 [7 B; J4 \4 W* u7 j# D2 P
  /*+ d7 H5 w  t. ]( N; C1 R" G8 a/ {) m
   ioctl(fd,1);   
. h3 ^5 w. y9 N( {: Y" H9 `  E sleep(1);
/ `: d+ X" q) k: v) F ioctl(fd,0);1 |( G& z* I: z4 P* g: u
sleep(1);
. i; F3 M* X5 k( T1 V6 v+ e2 y */ 3 n# p+ w" Z. h/ s, f# T6 m
  }   " |7 E+ G# Z! v3 d4 [2 ?6 d
return 0;
- z- C& v3 x6 F9 h8 C) ^& C   ?* F- n8 v3 H& W: Z
}$ ?, @: I  b! j+ R1 q* ?& R
* y* m9 [' J: R, a
多谢各位指教,谢谢! 急
+ `$ v7 d! k- F. L  P
1 P. [1 S2 }# U6 ]' L8 d2 A$ T+ X# V0 X' {  T

: {7 T( ^' u8 X4 u; z* _, |4 j3 Q

: b9 z! k8 S4 u6 Q# s* @% ^3 c2 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 00:38 , Processed in 0.044525 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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