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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 u* R! @( e# S& q# y6 Z. Z
/*, j" ^, z$ ?& I9 ?8 O) w9 K# i/ @
* Copyright (C) 2009 Texas Instruments Inc, w1 Z. t9 u, y1 D# x
*/ @( a* C+ n* v  n  R! l
* This program is free software; you can redistribute it and/or modify+ z9 H( i( X: T, C4 {1 j3 J/ _3 U
* it under the terms of the GNU General Public License as published by8 U. Q) z0 f4 {7 R
* the Free Software Foundation; either version 2 of the License, or* G: B: S: o5 n1 ^8 a8 @9 @+ R1 W
* (at your option)any later version.) e( l) U) V" s- k! q# O0 o* s. C
*
$ n# p0 e5 o3 v. K% X, G* I * This program is distributed in the hope that it will be useful,5 `. O" D' B1 @" D) }4 w( k
* but WITHOUT ANY WARRANTY; without even the implied warranty of) m+ N; g0 i' E) k1 I" u
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; T9 A0 M: y8 d' N1 b) m * GNU General Public License for more details.4 p, q9 _' n/ Q" Q) M! I* e
*4 g6 O6 G9 g# k* B" ^9 z) O- G
* You should have received a copy of the GNU General Public License
% Y2 c! N. f; j# l2 U * along with this program; if not, write to the Free Software
* [3 ]  w( C# h# L! ]8 X8 P * Foundati+ y/ v7 j4 l7 D! G% L+ b) ?' Q
*/
4 m9 v! S: q, G  T! H5 I8 e#include <linux/module.h>
/ e: i1 a) F* L+ n9 ~#include <linux/init.h>/ V  {* S, i9 T3 y: K7 w
#include <linux/errno.h>
0 @' _. W5 L) ^* y1 j& w. Z#include <linux/types.h># a. t) H) f" H. c' @
#include <linux/interrupt.h>
1 G! S; j0 ]% g4 E  P#include <linux/io.h>
1 {1 K+ }# I0 M7 {3 X3 A# @#include <linux/sysctl.h>: J% W: [- q5 _' D: `
#include <linux/mm.h>
/ m+ i# I4 A  i2 o# X+ y#include <linux/delay.h>
$ @, Q' U4 D4 r1 U$ B#include<linux/kernel.h>
  B: A0 w5 I3 D- T, X#include<linux/fs.h>  Q2 F0 u) }5 Z* o
#include<linux/ioctl.h>
7 G* H7 k& R# }0 Y1 g- }#include<linux/cdev.h>
0 C7 ~7 K' |8 m5 B8 X#include<linux/kdev_t.h>6 ~* Y" u) Z" q2 ?) W0 c
#include<linux/gpio.h>
* a# K3 F. ?9 K" r: y& O- H#include <mach/hardware.h>( k4 z6 U; E  l; K+ d3 ]
#include <mach/irqs.h>
2 X1 ^. v9 ^- U- ?0 W) G' O$ [* D/ a# k' j' Q  W
#include <asm/mach-types.h>- P& j+ i( j6 y9 W4 k+ `; ?
#include <asm/mach/arch.h>( ^. R  {; }" |  V+ Y% v
#include <mach/da8xx.h>' ^+ c+ I% D9 _8 C" N7 s$ @
#define  SYSCFG_BASE   0x01c14000
9 X" O! M1 \( g#define  PINMUX1_OFFSET   0x124
2 I  g6 j. H9 t  _" ]2 G#define  PINMUX18_OFFSET  0x168
4 \; U! D" g  `) D4 W3 p" _#define  PINMUX19_OFFSET  0x16c; \0 E8 ?' S$ Q' |3 A4 Q/ K( e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
, \4 W' A/ R3 T" p1 ~" |#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: u( P% z+ c0 w% V#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 g: ]# ?3 I0 b1 z
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR5 @$ h2 O: ~1 C6 a6 F3 y
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
2 ~* p$ O$ \5 c/ M) h                            : G! }3 r! i6 P7 m5 c
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
; A2 z& L+ H1 u; ]5 I#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
+ D5 R5 e* f. G& [; V//PSC. r) ^% m: n! L
#define  PTCMD_ADDR   0x01E27120  & ]+ \* K( O. x4 y" w2 c5 q* A
#define  MDCTL15_ADDR 0x01E27A3C# }5 ~0 [( a& a9 `) j
#define  PDCTL1_ADDR  0x01E27304
1 c  G1 h' ^( O% @//GPIO8 direction
- d+ }, l) K# P, R  k1 J( v#define GPIO8_DIRECT  0x01E260B0, Q# b. Z1 n2 x5 ~+ L, f
#define GPIO8_OUT     0x01E260B4
& y/ \: {# r3 @) \#define GPIO8_IN     0x01E260C0
. @, Z  {/ H& S: o$ l; F3 k9 l3 b4 f- \
//#define MCBSP1_RINT    99              
; ?! a9 p2 o+ a* H- t* i7 Z//#define MCBSP1_XINT    100  
5 S, j( E* A! j2 c4 dstatic int MCBSP_MAJOR=239;7 D( I5 {& A  j' N- z
static int MCBSP_MINOR=0;
% j6 a+ W, i, }. D* g6 e6 `& astatic int count =1;
. |2 a  J  ~" M
2 l* ^+ j# W. X  A; n( L* d#define MCBSP_NAME  "MCBSP-device"
8 r* D9 L1 {5 \: Y4 j4 e9 x
5 J2 Y+ B' F9 j" ^static struct cdev *mcbsp_cdev;
# J+ X" M! B$ a% g. Z, jstatic struct class *mcbsp_class;
9 z% l3 k! X6 g: H5 E7 astatic dev_t mcbsp_dev;& L" q4 a& v. Q2 `& G9 [6 n
unsigned int DRR_data;& e' U5 G; _4 n- [% z
unsigned int DXR_data;
- }1 h. Y8 T" @5 {# z" W; P7 G( L' Ystatic int mcbsp_open(struct inode *inode,struct file *file)
) \3 r$ S" q7 t{
- {- O- ]" Q. W5 j4 {' K6 A0 S   
/ k" g9 O" y9 ~" J0 Q4 h/ ~1 p7 p* r   //interrupt enable,initialized! N) J3 r* x. U# K1 L
   unsigned int temp;' W9 C, E' Q- W* Z* C; B/ T
   //SLEEP_EN(GPIO8[10])---0+ a+ J7 D/ J: V9 b' h* k" ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
  }* _. t6 O+ U9 A   temp=temp&(~0x00000400);& F, U# i  M$ I8 G4 |0 Y( J* `' k
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- G5 p# h; V! b( g- b2 Q) W  //RESETn(GPIO8[8])----0----1- W* M" J8 @) ?6 U8 q& ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, i9 I) ~2 p  K2 ~$ s7 m   temp=temp&(~0x00000100);
/ e5 H! u- q$ ]4 E   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- Y2 o2 v) d7 s
   udelay(100);
% y/ S3 `) Y* N9 t- G( o   temp=temp| 0x00000100;, k9 c$ R; b7 b0 C8 H0 U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 V7 k  Y4 K1 ^5 Q0 h
   udelay(100);5 b* `% `8 L4 l7 `
   printk("open success!\n");" C: l8 \& h" X
   return 0;
' m' ]) f" D2 s/ Q5 b' x" ?}
/ s) u/ O' o$ B4 B+ r
' a" b! T& _' S6 E* A8 n/ \static int mcbsp_release(struct inode *inode,struct file *file)
6 d7 b5 S; L/ ?; I" @* J! y: [; I7 }{
/ U( W% \4 V+ x2 D3 G7 g  [; i3 }; ?/ E   printk("release success!\n");
* U* l$ \9 ], h0 z5 G   return 0;3 o1 w! z9 Q! ?; t
}
" g: z0 X0 C' s, Y$ ^0 K4 ]4 O
( O- z" i4 J$ f5 l4 L- Sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ Q9 D! y3 c9 S2 W
{
& Q1 ?) J$ i& ]# I1 z- `2 Z    copy_from_user(&DXR_data,buf,len);4 o$ e6 {2 B- e- F6 O
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
0 O2 ?4 p) \7 `+ C( H    return 0;. k; o& Q  L3 U: E1 B

. p+ h, @9 G; {: g  A}, r3 K: l+ ?/ R
: c* l) i/ ~. Q7 i2 H$ [
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' b  W* j: m2 \- D9 }{
+ z6 ^: i- L) |   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- z$ \4 P" w, g# F
   copy_to_user(buf,&DRR_data,len); * f; E" d; P+ ^5 R
   return 0;4 j: b0 {  A6 l1 b4 P: G7 l
}
3 Y9 ]8 J$ q6 b9 `7 R
$ _# K% N5 e5 G8 t; t: P
1 D, e! u3 k9 ~+ bstatic struct  file_operations mcbsp_fops=, y0 N+ U$ y1 Y& W
{
* q# x4 e5 v/ a- y   .owner=THIS_MODULE,
- H. A0 S; ]% L% X- q) D7 E   .open=mcbsp_open,
. P! O" a' x3 @3 {* F+ v   .release=mcbsp_release,7 U$ V; Q8 ^6 |; A
   .write=mcbsp_write,( y1 b) h# O+ r4 _7 O
   .read=mcbsp_read,
* V  K  Q. ~# o};; K# p! o) Z: D9 E: z. @) j9 a
static int __init MCBSP_init(void)
& I5 s$ ^( C7 r. ?: b( r& q/ ?( K{
7 m# c0 u7 |% F( ]) k   int ret;% _# M4 m' F0 ~2 |& p8 E6 k
   unsigned  int   PINMUX1_REG_old;7 O  G" U, y- _7 M* Q* k
   unsigned  int   PINMUX18_REG_old;" E; I+ |6 [& ~* T
   unsigned  int   PINMUX19_REG_old;
6 O$ x6 V1 S$ h% \' n+ J% [: A   unsigned  int   temp;  . B6 `% h* J- {+ ]
   if(MCBSP_MAJOR)
, @/ F& b  W' m   {1 E6 U- R4 T! t4 y
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. E, F/ f# }- G; C2 x" K8 U
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 e/ y8 M' h5 T4 N! I* b; ]   }' H2 q- S" L/ @' J! J( G) D
   else8 u' b; ~6 f/ y2 C0 p( M4 h
   {( O4 f$ E; j# _# C
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);; Q" U4 y$ o1 c2 j8 @$ v& }
      MCBSP_MAJOR=MAJOR(mcbsp_dev);& w& |& E! l) U2 z* C" N: j* l
   }) C. T. q" o3 t) f
   ) |" z! t! ?4 P; i' Q" ^* }# U8 W
   if(ret<0)
' o; A( |" N5 `- R8 E) Y# ^   {/ h! J* J% T* \% N+ A, U/ U
      printk(KERN_ERR "register chrdev fail!");0 E6 |& k  X! l6 ^+ A( G/ v
      return -1;
8 I/ M8 R6 k8 y* H! \) a, I   }
; T) y0 z. i; p7 Y7 w6 }; b5 B7 D   
4 O9 @7 d& |$ T/ U$ l   mcbsp_cdev=cdev_alloc();
+ r+ F1 F% }% ^+ |% B( u* Q   
: s) y: S) Q- t. U   if(mcbsp_cdev!=NULL)
. V7 g* l* V7 ?/ D6 u# ]: M   {$ N3 z3 Z2 t5 H2 q3 p
      cdev_init(mcbsp_cdev,&mcbsp_fops);- ?4 I9 o3 ~: W5 C9 @9 ~* V% ~
      mcbsp_cdev->ops=&mcbsp_fops;( e- ?7 C7 |! r: F' J7 r, e9 g
      mcbsp_cdev->owner=THIS_MODULE;+ D5 h1 m/ ^8 p( U1 G" N
      
4 A* p% t$ ~; @6 ~; f. Z5 d      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 d1 A$ e& \/ i- m. k# Q6 n
          printk(KERN_ERR "register cdev fail!");4 K: q. i0 g, {' H8 ]% y6 e" `3 F
      else
) \+ {# T/ |4 O" g% a8 I: M          printk(KERN_ERR "register success!\n");3 J* G0 B) O* _: [: d5 s
   }
3 ~' u4 l/ A0 p9 Y5 p   else/ [0 K0 n5 w4 }  u8 C+ D* E7 u  ^: w
   {. t/ F5 T8 r1 m4 R9 I
      printk(KERN_ERR "register cdev err!");* K) G% ^$ L6 f* y3 z
      return -1;  L: i/ s1 u  L& J' z$ d' q) m, M9 Y
   }
/ \+ ~7 c; l9 t) ^* e: U1 l( L   
, e4 W( @! ]7 O  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);3 l% C. O+ y4 [) c) |. f9 h0 d6 v
   if(IS_ERR(mcbsp_class))
) l1 ^( K: N8 K- I; `9 D+ x; g$ }   {
1 u1 r' n  L/ F; @4 O      printk(KERN_ERR "register class err!");
) W/ h2 R, j( l0 _   return -1;' I0 Y8 q5 u3 ?8 r$ N! D) C
   }
6 \2 _& W# O: C5 ?' u& v   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 B# u& _( a- z( l3 a

& b9 o* m& l- \2 m) E# I9 m+ o7 \   //PSC
" P2 u0 }6 T5 o8 Y# f   //add Enable MCBSP( r+ V* h# u  F7 ~' F
   //test
. t5 x* `, E  A2 j" a& d   temp = 0x80000003;6 J$ c- b  s7 b4 M+ a
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
" M) K! D% g) T# h4 X: F   temp = 0x00000003;! t0 F# I7 f  F! r
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ B2 D8 P% F8 P' p8 `& W4 ]! `
, o" y, a$ \$ Y' P8 P   temp = 0x001FF201;
9 p/ Q* f  m- P, j0 l* h" [   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
" `& o6 d' Z+ r& O   
# j, y3 Q7 i9 p+ ]! s   //PINMUX  
" k4 G4 B1 i  e$ F1 w+ L' ^   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
. N- ]  A' H% C- x& U   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  " u, S& f6 s0 X+ Q
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
( _- R% B; U, v" B9 N! l: s: \+ E9 ?   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. {' `8 u9 P0 ?: L( D* }
   
4 W! e) Z2 }7 |' A1 W( k   //SLEEP_EN,EPR,L138_SHK1,L138_RC
. p) `9 s$ d* F/ U% |* @   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ) P' g2 ]# j/ |. ^; L; J/ U
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
) T* J9 _7 w- W! s8 I   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 }5 E& [- D7 X9 Z# ^ # z" k0 A4 B2 E0 Q' ^
   //RESETn,L138_SHK2
1 l  u! ~* |3 U1 U6 B" B* [   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
. T% b' x( a1 J( l- E! M7 c5 |9 F1 d- T   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ; f- M  A1 ?9 O0 N/ T7 G6 E" \) |  M
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' M8 y" U8 g4 g2 q8 B

8 s7 d  o3 X* X6 H2 j; i 8 n/ p% V8 L! o& l6 z# z. V6 R
  //SPCR Register
5 t3 g" F7 |" r* N5 T) @7 a  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 m) }' j& d5 y0 M  temp = 0x03000000;//(DLB=0): T9 X0 R! t( u
// temp = 0x03008000;//(DLB=1). Z, H, _0 I: u2 U" J  R
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
. d1 O3 j" y5 p4 u1 C  temp = readl(IO_ADDRESS(SPCR_ADDR));
/ t- w) S) c& ~3 H- ?4 M' v  printk("temp=%x\n",temp);8 n4 E) a& z% f

# o7 j" k; \$ F# n8 [+ z   //PCR Register) q+ A  l, J' m7 \" n
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  o+ a+ o" u4 W: b' j
  // temp = 0x00000F0F;
* O0 i7 [: @) \# E- d3 V( j5 s  temp = 0x00000B0F;
2 a( L5 E( Z( i9 [% `' |  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
) m/ y' u0 X. T/ `( l9 |$ P: ~  temp = readl(IO_ADDRESS(PCR_ADDR));4 Y, n& u& i7 V6 V& s7 M6 J
  printk("temp=%x\n",temp);  " D! y8 z! k2 Y% r# Z+ T9 h- d
   //SRGR Register
' M4 o8 E. E9 _( x* ?- j1 F4 x, D   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# h4 n& [" ?; Q0 A1 R0 T9 N
//temp = 0x301F000B;
7 X/ w' Z( j4 z   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
9 m) ~+ j' @/ v0 R  temp = readl(IO_ADDRESS(SRGR_ADDR));" C8 y5 G  H) ]3 i. @
  printk("temp=%x\n",temp);" K) F4 }# e' E' e# X8 R* t2 c/ q: }
   //RCR
# X- A+ s8 \- k+ _   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
- |" x6 {; a; Y5 H1 x   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; z/ q0 u) f5 i4 `+ q6 ?/ h2 t* g   temp = 0x00440040;
# x2 w( L) O% _1 W   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   + F0 U6 _. y9 i) ^7 @: }
   temp = readl(IO_ADDRESS(RCR_ADDR));8 d- X. l) q6 w. \( S! D" {
   printk("temp=%x\n",temp);
0 B# [2 t& u: C* e" g   //XCR4 v: [2 o* X% J" `, s
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; s0 F/ G& H! `* Q; p! y' N
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 H' y: D4 U2 W   temp = 0x00440040;2 l# U  v9 `0 J; c3 q
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   9 {, u; X/ s7 n9 x0 A+ r
   temp = readl(IO_ADDRESS(XCR_ADDR));8 f5 u* P, P. {" B3 X* B
   printk("temp=%x\n",temp);
: `5 ~' U2 k; P. ]0 o  udelay(100);
/ x* D2 b/ }3 A8 x. C  //SPCR Register4 r, s6 F" A. \$ N1 X9 E+ ?
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1/ F/ C" k8 {5 z+ U
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1  d4 v) g' M6 N2 [, q0 H
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
- x1 s- E% D7 @  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 l9 t! q4 Q( U- }" g  printk("temp=%x\n",temp);/ X5 M' i+ |( r: x6 z
  udelay(100);
) Q. f, ]1 X; _# R
' C( [; ~- E& w0 T1 m; p3 t3 g: x  //set GPIO direction
3 V# H" g' `6 b2 x1 e   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));! C$ l8 f7 v- [% C
   temp = temp | 0x00000100;//EPR----input
( C" Y4 E  x/ u; e4 D" d5 ?4 w   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
4 K# q: @5 X6 @9 @   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 u# Z" d7 ?0 {4 B; P , D$ i1 D7 e8 c8 Q# X
   return 0;! p0 v3 m  Z  ]/ p; {* b
}5 G0 `! Y- e5 ?/ o
static void __exit MCBSP_exit(void)
3 T6 e6 o! |9 ~9 q# O) c{
' J) A5 S5 }2 z: r& G   printk("mcbsp chrdev exit!\n");. {' a6 j+ Z: N; K
   cdev_del(mcbsp_cdev);+ t$ D0 d& j: c9 l' N3 e* ]
   unregister_chrdev_region(mcbsp_dev,count);: W7 v" Q3 B  S3 m3 e
   device_destroy(mcbsp_class,mcbsp_dev);
' F9 d; g1 E# b7 Z3 ^   class_destroy(mcbsp_class);
  x9 R6 `, C9 E}
& I% B6 l5 J6 W) w4 _2 lmodule_init(MCBSP_init);1 Q# i% V  a! m
module_exit(MCBSP_exit);1 @6 l+ S  x$ k9 {/ {1 c

% i& f8 o" c3 w% ^- w6 wMODULE_LICENSE("GPL");
* g& Z) f6 H7 }7 l
: U0 L" @7 C/ G% h我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ W( E7 w8 D; R% W我的应用层的测试程序如下
) a; A$ |, a# V/ }#include <stdio.h>6 P+ N4 |: g1 V+ j& _" a$ ~8 v
#include <string.h>
: G5 A# c; A- i1 u* A, }#include <fcntl.h>
. q# e* B7 G( ]: v+ Y#include <unistd.h>6 \) @% P4 N- Z3 g
#include <signal.h>
0 I7 H2 Q! @' D4 x#include <pthread.h>       //线程
5 a. m7 B% o9 U/ v- D" e7 c#include <stdlib.h>; d2 s: w  X3 g2 m
#include <pcap.h>          //捕获网口数据& W5 `( v4 r; K1 s2 d$ z0 A5 ^
#include <semaphore.h>     //信号
4 f: h9 ^3 |8 M8 a, F7 y3 s- R#include <sys/types.h>     //消息对列+ p# i$ C/ s) }! O: m4 J! T5 C
#include <sys/ipc.h>       //消息队列  ]: a% u9 ]3 e3 r8 _3 ~) o5 l4 L1 Q
#include <sys/msg.h>       //消息队列6 A2 Q5 g6 J$ z; s6 S3 C. y
#include <sys/select.h>
  D. E* I) m/ D9 m3 R6 v  l4 M#include <sys/syscall.h>
' Z& Y# x& v5 L2 k& e+ p, H#include <sys/stat.h>& g9 j& d: [! {% M# \! E
#include <sys/mman.h>
5 V% I; ?; i: ]8 r2 z$ e2 N6 P2 ^6 ]#define msleep(x) usleep(1000*x)
0 c5 q2 ], u5 t( \+ S$ d& y! Z0 V9 ~3 O
int main()
8 k  r) P3 Q0 k+ E{
8 o+ h! l2 y6 U/ B4 l: q! w. O    //MCBSP,ARM与AMBE2000交互设备8 g8 }& U5 ]3 d! X" h' B
int fd;
4 C) y9 h# }4 n- y unsigned short data_write = 0x5555;: w6 V7 d& y3 J6 \/ g( m, N
unsigned short data_read = 0x00;
  F9 v2 l% ~+ q. G' ^6 m2 k  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
  u. d+ _- I9 G6 p //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 J3 W/ j- p- F. k  p% u# T   
4 K; K$ C# a" M7 `& V  if(fd < 0)
" F! R6 i" P! b, |* Q+ _' G( s3 x  {
/ ?$ Q, p( E! E; w5 G     perror("open failed\n");) Q# p) e( V  \# W% ?
     return -1;/ u% G/ Z$ Y* a0 c; X
  }. D. E, Y, {  K3 l" b1 T% H9 \
  
2 O, Y/ M5 N9 }% C4 W# {2 h  while(1)
2 _/ X3 H( M# d  {7 k3 [& I, C1 y$ D8 @+ z" T7 _3 E
   3 u, S( {' b: ]: K! r/ r% O9 X
   //AMBE2000每次读写是24个字为一帧
1 Y9 o. r5 o; X: F6 U( u   //写数据时将数据在底层存储起来,等到中断的时候再发送
, c# \  o3 W4 n1 `1 a1 h3 q   //AMBE2000输入数据是以0x13EC开头的
. C- O1 Q* ]2 c7 V2 L# g   write(fd,&data_write,sizeof(unsigned short));7 I4 t9 q+ H: T2 I! M' Q% Z, H& K) R
   
! P- y4 n5 {; E( c2 ^   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
' D& e" `1 ~. Z" F   read(fd,&data_read,sizeof(unsigned short));1 z! T, x( @6 |/ {: u/ E5 p6 X% y
   
7 Q/ t: _5 g0 c9 m0 @" d; m3 U" K   if(data_read == 0x13Ec)
& [( F1 j4 p* J( }9 h4 v   {3 @9 i8 U8 w$ b3 k
   
& ?  I  w' F" K9 H+ w    printf("data_read = %x\n",data_read);
4 q6 x4 w: t' B9 ^5 f/ Q   }
! h* p4 q  y1 `& C7 W2 c   # u% `# o* e6 L4 U, m0 M/ {& c
   msleep(10);
3 o5 ~4 t% D8 |. B8 l  0 z. P. N/ q8 n" i: V
  /*
5 i. x5 B1 {+ L2 F8 P3 W   ioctl(fd,1);   * c% F# ^, |# }* A# ^  J
sleep(1);" G8 Y% L, D, D- Z# q: K9 \" c" V
ioctl(fd,0);
8 u/ N$ O' ]1 e0 ^4 [ sleep(1);
; _# H- a8 P, |2 `7 e# K' U, Z" h' P */ # M4 n4 a: V# z; b1 S0 h6 Q1 Z: O* P
  }   
6 T4 o+ \# j4 C8 l5 m4 b return 0;6 a3 j  p# k, a$ I0 `
6 p$ K3 Q6 g- t2 \
}6 K8 G" n  r, o; Z
. f7 M( ]* j. y9 t  S' i
多谢各位指教,谢谢! 急2 b" Z  ]; K0 j$ w1 D& A
( J5 d# R- q4 V$ N+ f
: V$ r- R+ f0 ^' y3 X4 x
) U/ z/ T) N9 ~9 I

* l5 k$ d( W# D# `& V9 n% l& p0 d' a+ a' _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-13 18:09 , Processed in 0.056626 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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