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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 n1 E9 Q$ E& c- R8 Z6 z2 a' d
/*2 K# V3 I+ A. \3 Q2 \9 Z1 Q& T3 M
* Copyright (C) 2009 Texas Instruments Inc8 Q5 {# B2 L+ F" {8 `% k
*1 i/ r4 ~+ X$ {. s& g4 u  U
* This program is free software; you can redistribute it and/or modify6 \* f' `! H- g( o! Q7 t
* it under the terms of the GNU General Public License as published by
! |" a* g8 g- R6 t" e * the Free Software Foundation; either version 2 of the License, or
1 Y# K. c' J4 ]2 n7 L+ c * (at your option)any later version.. k6 O& j3 m7 Q( C, c# K& @
*
1 Z( {0 ~. `$ t* Y+ G% L4 o * This program is distributed in the hope that it will be useful,5 x5 g+ `: V2 B0 Z6 P, b7 Y5 M
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- N. H- }" H) X# Z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# M8 n9 I0 f  ?' \8 y * GNU General Public License for more details.
7 O" o9 t( C% s. c4 [, C *
5 `0 n. U% q* \. }- ?8 ]4 v5 S: | * You should have received a copy of the GNU General Public License
$ r* S# t& S( u5 D, k, M * along with this program; if not, write to the Free Software1 F1 {' }2 u9 W2 u; J. V. S3 w
* Foundati1 F; z+ k8 p" a
*/
1 N4 [" P3 f, u1 t' j" x) _5 T#include <linux/module.h>
$ D5 O1 x$ G$ d4 h6 P: G5 A#include <linux/init.h>2 R% ]; G- {4 o' H8 n- w
#include <linux/errno.h>, Z' D) Y8 Z( F- ?  j4 V
#include <linux/types.h>+ L! C6 \5 F9 A6 U
#include <linux/interrupt.h>
+ s6 m! z2 ~$ p#include <linux/io.h>
1 ?; t) n. {, c1 w1 h#include <linux/sysctl.h>
3 F, G3 e8 _  y/ l6 C#include <linux/mm.h>
$ V/ o: o( _* `, H5 {( {#include <linux/delay.h>( c- G3 q  l, j  J) r# c
#include<linux/kernel.h>
" t3 e1 }. f7 z, y" U#include<linux/fs.h>
: @& m# M# k& {9 q# n#include<linux/ioctl.h>1 ?3 Z; O5 i0 s4 k
#include<linux/cdev.h>8 {# m, u8 W! X! |. q: n5 \0 D
#include<linux/kdev_t.h>; K2 @) j8 I* U1 S% L9 S! W6 F
#include<linux/gpio.h>
  ~2 N7 s  v. Z5 W7 M#include <mach/hardware.h>) a9 Q+ i0 C: `% E7 t8 Z. j& \9 J
#include <mach/irqs.h>
5 ]& y1 G+ l0 w9 E, v2 J3 T4 G/ L* I; O3 o& l  D! [3 W
#include <asm/mach-types.h>
5 y  Q+ A2 I; e! ~" `# L9 y. Y#include <asm/mach/arch.h>+ f7 \& A5 [; v+ B' h8 M
#include <mach/da8xx.h>
1 N8 f) ]3 }7 ~6 @1 d#define  SYSCFG_BASE   0x01c140006 ]5 Y$ l0 U$ ?2 V+ W# K0 g; \
#define  PINMUX1_OFFSET   0x124
. K  ~( J. l) m0 g/ t& D0 }6 |& A#define  PINMUX18_OFFSET  0x168
8 S$ h, u* z: g6 `: m2 k" E#define  PINMUX19_OFFSET  0x16c
5 [% [# G$ D8 H% _0 g#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
. \/ N1 u6 k2 ]) D1 q  h8 [1 c: z#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
1 f$ y5 |: f- d  u- u1 u6 C#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR4 f+ i! G3 [9 M* @. V) c  F
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR* q5 i* U  j0 x3 |, b
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR) U/ {: A, ^) n. H" i: H
                           
0 n  _+ l; j& ]; K: W& R#define DXR_ADDR      0x01D11004  //MCBSP1_DXR9 @! i+ n0 L7 }0 I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR+ |1 G8 \/ I0 F( ]/ S
//PSC: N- e: H: y1 `4 v
#define  PTCMD_ADDR   0x01E27120  
5 Q. y( R$ }) B$ _) X$ H#define  MDCTL15_ADDR 0x01E27A3C
( Z) l: h: o! Y/ j#define  PDCTL1_ADDR  0x01E27304
7 ^+ Z  ]$ A2 m* R. S, j//GPIO8 direction3 D; v! q; l, \; @( L
#define GPIO8_DIRECT  0x01E260B08 D0 y& b1 V+ |( T" e
#define GPIO8_OUT     0x01E260B4+ w3 f8 @& K( k, u7 t! c
#define GPIO8_IN     0x01E260C0
+ p) t) ?& D  @# @6 s
$ x$ `& N  w* h5 L+ _//#define MCBSP1_RINT    99              
1 \6 ~) N" [. E- n//#define MCBSP1_XINT    100  
+ s$ a$ N- ^6 S# A, u/ c9 w1 Fstatic int MCBSP_MAJOR=239;
/ [& B6 X9 \% Fstatic int MCBSP_MINOR=0;( x/ m2 {& @8 Q7 \, W) y
static int count =1;. T. p* W5 E+ M7 E5 O
1 ~) S1 O4 {0 U) c
#define MCBSP_NAME  "MCBSP-device". g( E2 a7 Z  U/ K7 b% E+ ]9 }
9 S) t' R! Y4 K% ~
static struct cdev *mcbsp_cdev;3 C: L& A( W8 ~7 q& G
static struct class *mcbsp_class;% u( [1 K1 u4 h3 k+ C
static dev_t mcbsp_dev;
. \: c* Z' k3 u( Sunsigned int DRR_data;
: \7 Y8 \" q* c" U3 junsigned int DXR_data;% W+ r( a% v5 Z/ S
static int mcbsp_open(struct inode *inode,struct file *file)3 i  C7 |- p7 X+ s
{( ?7 Y% w& N# L4 X- A: o8 d- M
   
: H2 v5 k/ y" ]4 Q   //interrupt enable,initialized
5 O4 \0 V4 x- D' D/ X1 ]1 l   unsigned int temp;
+ ]. G* B; }$ u; J& c   //SLEEP_EN(GPIO8[10])---04 i; [7 }* \, l1 n3 P6 j/ d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) k6 `& l3 X8 P+ z8 Y$ O9 \   temp=temp&(~0x00000400);
$ J: D9 u& g7 f9 `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* c( L( e, c# @3 y3 j  //RESETn(GPIO8[8])----0----15 }6 W" Y  N: l- i  V
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 R+ t# S* }; d( X6 H" R+ l  J0 ]& F   temp=temp&(~0x00000100);7 A# Z) A# X5 K) |; k$ v- S
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ a8 L, i9 r  X. [5 w, P% W, _
   udelay(100);3 V4 [2 H( o" u; T$ d, ^& N: k
   temp=temp| 0x00000100;
+ S! d( u5 Q8 V+ z$ @% m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1# T6 I; L) A! a* C: h
   udelay(100);' e* G' b9 U$ Z' d& V- |' L6 g
   printk("open success!\n");
$ H  G) ]7 K- S" z( D3 `+ |   return 0;7 ]/ @' x' P7 W' c1 L8 d
}# @/ P8 u/ ~) W
" O4 W6 h: q' L. ^
static int mcbsp_release(struct inode *inode,struct file *file). t9 o; g# ], ~1 Y! [
{! J! S, }+ H# `8 ?* C' r
   printk("release success!\n");
3 m8 R4 V, h) g! p   return 0;
3 A$ Y/ W4 w: }}
! g  s+ Z7 y6 b$ I) v& p" b4 B& b  `" e" L$ }
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
$ L8 ^/ m9 D9 U- K( k, c# p) _{
8 Y* g$ w$ ?. u( H1 _4 d: g    copy_from_user(&DXR_data,buf,len);
+ m* ]% C7 }$ m. B5 \6 @$ T    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) d/ H( K' d+ B/ U5 v5 C7 v    return 0;; k6 r% ^2 R# H6 T) C$ U
& W- O5 L+ K- \( E0 z& _
}# y$ ~$ x* m3 |' C8 \: w0 k
2 ]3 A  v  r9 J+ ~+ a
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
& z1 m8 e! ~; T5 ^# Y8 l/ k; X% M{   Q! ^! X2 U0 p8 J( K
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));) Z, w+ m- t) x) F: @
   copy_to_user(buf,&DRR_data,len); ! `; w" e) G( B* Q, j% _- ?
   return 0;
1 c( J/ p* N8 R6 X, s1 J8 x0 S}1 D( ]: V' b0 T6 s9 d
; ]. t+ D0 g, m; d# w0 y6 n
; j% Y# v! ~& c% x, s/ `/ n% z
static struct  file_operations mcbsp_fops=
$ U. ~# l" m, x/ [3 I{
0 q9 t+ ^4 d5 M   .owner=THIS_MODULE,& R! k8 ~: b5 c4 [* `1 ]
   .open=mcbsp_open,
; O, S* ]  w$ i$ `   .release=mcbsp_release,4 E" z3 a0 D2 P/ B: j& g, N
   .write=mcbsp_write,, F2 E) {7 p6 L
   .read=mcbsp_read,
6 }) h* w3 O9 K3 s3 P2 H' X};
9 b5 F' `9 e  k: b4 ^. S3 h' ?static int __init MCBSP_init(void)' p; O! D$ {2 N# \, N- ?/ A7 K" g+ B$ v
{
) r1 [7 F- z  o* N! P( R5 p: F   int ret;
( K, N% B2 q$ a   unsigned  int   PINMUX1_REG_old;
. u4 K' B, Y6 \9 u   unsigned  int   PINMUX18_REG_old;! U+ T" Q1 V6 S& s9 \
   unsigned  int   PINMUX19_REG_old;
( W( \" \  j; o3 q% W   unsigned  int   temp;  
# s, F1 A& y, f5 d/ D   if(MCBSP_MAJOR)5 u& k! r+ V7 Q. u) M5 z& X/ S
   {
" `0 Z7 u7 j% Y$ j+ A, W* J+ L$ k/ d      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
, G0 X+ j" v3 p      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);0 J3 R5 O. q( E. B2 T$ K; o/ P
   }( ]* A! t) v  J# Y8 h5 g  ]
   else
( p8 y9 z( E1 `* u$ |5 e$ d   {
1 f/ Y) M3 T/ F( m4 E3 R% M, u      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. n5 n0 P: g! [  q9 }8 g' ]      MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 P( x6 X# e( Z6 V/ p. _   }- m* e" n9 K; `! y6 H: y
   . [9 _1 d# v; p
   if(ret<0). |: Q! ?) |& r3 w" J
   {
+ H0 c1 g) n" n% J) a9 O      printk(KERN_ERR "register chrdev fail!");
+ h3 f6 f9 }: J& V- f* f8 X      return -1;
; W0 K  K- Y$ ^9 x4 E2 t, G3 J& N   }) k, ?' k. ~& N% m7 i$ \& h( Z
   
) f' D# P+ i* n   mcbsp_cdev=cdev_alloc();: I2 a# H; {; \7 q( j
   
2 o' q: m- Y) f9 `6 r   if(mcbsp_cdev!=NULL)
2 `( M8 q9 G% z/ r7 x   {
+ Y1 p9 g) q, g9 z8 E      cdev_init(mcbsp_cdev,&mcbsp_fops);
. p3 h0 F7 [5 D5 ?0 d5 s& D& G      mcbsp_cdev->ops=&mcbsp_fops;+ X5 J( y- ~7 v3 r& O
      mcbsp_cdev->owner=THIS_MODULE;+ v! G) \  q% u/ e) f" {
      & i( \$ h$ W' }+ w0 {/ Z
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); A+ h5 i, U% s7 \2 w; S
          printk(KERN_ERR "register cdev fail!");
7 a) ]3 @0 U# e- t/ e  u      else0 ~6 h. N2 P5 `( E" ^# Q& ?, O8 D
          printk(KERN_ERR "register success!\n");3 @6 Q; @+ j9 |4 ?
   }
$ ^: }# g9 G% a% d6 e   else3 ~/ L8 y9 b) z# z8 K7 i. e
   {; G  m$ P. \0 ?% y% g# P% ^/ E% u
      printk(KERN_ERR "register cdev err!");
4 Y0 }% C7 g! y! o4 Q1 y6 z7 r      return -1;
! Z$ X$ t0 x* z" D; `2 j# ^/ B   }+ I: k- g* L2 J$ h
   
+ ~, G2 i2 t4 m5 |  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! q; O( V1 H4 |" J5 q$ f
   if(IS_ERR(mcbsp_class))
8 U2 t9 M; |; ~, p/ r   {
0 v- A8 w3 l) D* k      printk(KERN_ERR "register class err!");
. ?/ T# @- G& P1 n- c   return -1;9 o. X" G( c- f' `: {" Z
   }
! o* z. i5 _# i   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 n) \& E) L% f( O' b9 L
0 |  m6 [7 k6 l) b. Q, U- f
   //PSC, F/ z" y6 E( U$ ~) M& g( v' m
   //add Enable MCBSP
1 o9 E- v% ?  s* n  c   //test3 k4 x: H( T& \8 c( J  ~/ O+ ~
   temp = 0x80000003;
9 q0 [: L9 G. b# d( L- K) l   writel(temp, IO_ADDRESS(MDCTL15_ADDR));* o4 ~: O3 n& z2 G5 j2 H
   temp = 0x00000003;$ J% X/ q$ q& T6 B4 ^: C
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ t" c4 `6 G1 a" \% m& e
* j- H; T% n. U  x2 E   temp = 0x001FF201;
' Z. y  G& L5 ?& @3 d% I   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 X6 f4 g. n$ o' Z; t2 F0 [$ U   
+ o* e2 i8 D3 I  q! v   //PINMUX  " e) f& t* n* @% T6 l  R( K& Z
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% f% k7 K0 B, q2 p1 i0 p   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
) {& I; l4 \5 Q: f& G9 R/ \   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
/ K& w" ?/ }$ I, c/ B; U9 V   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% M3 w) R4 p" I   7 j, P6 J, ]2 Y9 I6 q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
* u2 e" I% t" L6 k$ \# s/ r  W   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % D% `! n3 B* a
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   9 [- t% ?( j% l8 ], G
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ T) a" n4 Q$ L( _& P

+ x8 z6 Z/ T' V, ~$ t   //RESETn,L138_SHK2
4 ^( H! ]0 S  _+ P& H) R   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . C7 `' o; o4 a# ~. i+ m
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
) E7 L- S; l+ f- D0 n* d8 }   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; A- n) z6 o9 h2 }6 L" ^. ]" u; m   g4 M% N/ E& K: }' g3 r

' Z9 g" I! R' z; [  //SPCR Register" M: ^; S4 B6 R" D* q% J
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 j0 e. z1 _8 ^! D3 D- B% k7 w7 T% [  temp = 0x03000000;//(DLB=0)
! Y7 A0 U) C  G) f& s // temp = 0x03008000;//(DLB=1)$ {- S- w' N; w8 H6 S; e$ d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
4 D* ^# f& p/ ?4 o% |  temp = readl(IO_ADDRESS(SPCR_ADDR));$ M4 Q4 z* P% B% y  ]
  printk("temp=%x\n",temp);+ b7 ]9 s: b4 y# t5 e5 U0 `% S6 k' ]

# Z- s9 R( v5 L8 Z# a   //PCR Register
& c- z+ y& u2 F4 t' d% W  y" \$ v   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 s8 |+ x# s( N$ ~4 g4 d1 W3 J! A  // temp = 0x00000F0F;
, n* Q% S/ q/ V7 y1 A  temp = 0x00000B0F;
$ |1 y6 M) E" O4 S* N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 9 F- w% O# e& d" W9 y
  temp = readl(IO_ADDRESS(PCR_ADDR));$ K4 {; L9 u0 Z2 Q  `2 a7 p5 |
  printk("temp=%x\n",temp);  
6 v% u5 J1 [* Z  ~0 H   //SRGR Register
* ]" b0 d! a0 C9 y   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 i" v  e; l. {
//temp = 0x301F000B;" `: y8 D* G  A9 J' X
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
1 o  M1 P  x2 Y  temp = readl(IO_ADDRESS(SRGR_ADDR));$ Y: X' A* K2 f3 `. G1 x" t. ^
  printk("temp=%x\n",temp);4 p" i0 x) t1 w) Z
   //RCR; E0 r8 D5 ^; B$ _* A
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& Z$ G1 b. t( c   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
  o% B4 U' x% w2 s; x4 }* U$ @6 H& u   temp = 0x00440040;
& o2 d. G7 s3 U, _, k. l   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   0 F8 [- \  f* o9 Z, x( N
   temp = readl(IO_ADDRESS(RCR_ADDR));3 M8 S7 R) V/ A4 I) p
   printk("temp=%x\n",temp);
& U* Q0 M, I9 ?$ u* B3 f2 |' Z+ H   //XCR
) d& _! m. ^- K+ _* U2 x   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* e- U7 F) d% E- M' C/ V
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
- Z) _) Z9 x0 _+ Y* d: l   temp = 0x00440040;% I2 U" X! h; O1 S" x- }4 \0 S! P  I
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   $ J- l9 n" T5 i* V; A4 v
   temp = readl(IO_ADDRESS(XCR_ADDR));0 A% q9 a: A+ C) g* d5 h% n
   printk("temp=%x\n",temp);
) R% q. l! a( E& G) m4 {% U  udelay(100);
- ^3 U2 n4 M5 u1 y. H: I/ P  //SPCR Register
& Z" _- @+ [. O. K( u! s& \: `& c$ B) x  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 o. H6 V8 k1 g* D1 Y2 `9 k0 z6 ^  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
" s, `; m* q% O& ?" G  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
! N* _5 U5 L( ]7 E( M) q  temp = readl(IO_ADDRESS(SPCR_ADDR));1 L, t5 d7 @1 S8 i
  printk("temp=%x\n",temp);
# r( V0 o" l9 C* n0 T8 b5 G  udelay(100);1 R- d- Q4 o- O7 n
; J4 \. Z- t! L! O* o7 x( s  F
  //set GPIO direction
- I" p6 C) w5 R, B/ T  a. e# n2 T5 |   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
  \- z6 v" j& R& z   temp = temp | 0x00000100;//EPR----input* ]) i0 M+ I7 v2 p
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 k0 D/ R4 }/ t/ f; l   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 X! q. [$ b/ T; i& h. M
8 |' ^& _8 j% h. u, B; e% O   return 0;
$ `$ @- s! c% u3 {, `7 r}
& n7 \  ~6 {; C4 i; r/ s; T7 Lstatic void __exit MCBSP_exit(void), `; y: r0 H4 R8 R# }: q
{
9 l; E/ R' Q# b* [. }/ O   printk("mcbsp chrdev exit!\n");+ n& u. k* R8 ]9 A5 c$ u
   cdev_del(mcbsp_cdev);
1 R* Q) d" |# C- y   unregister_chrdev_region(mcbsp_dev,count);
9 Q: _3 n. Y, L   device_destroy(mcbsp_class,mcbsp_dev);
0 h, l: Z! W) }+ ~  v   class_destroy(mcbsp_class);
2 r2 _  M/ |' u! e1 @; T) h& j}
3 b3 g# f1 I/ {module_init(MCBSP_init);* G! t% A1 F# n# z" @
module_exit(MCBSP_exit);1 o$ e8 c: q4 r% c' G

, y6 U. |; S3 }0 J/ Z$ ZMODULE_LICENSE("GPL");
; i5 I5 l: U! b9 ~3 M
1 l/ q. p" N- p! u3 ]* [/ s( @我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' E' C; [, X, E, _
我的应用层的测试程序如下
" @, F! [* T+ w8 P6 V% {#include <stdio.h>
# `4 v' |( }# P9 r+ o% L  \#include <string.h>
5 f  R1 J2 k% k0 b9 ?* f( l5 e#include <fcntl.h>: b# P, B0 ]4 v0 U) I8 o0 K% d
#include <unistd.h>
, ?# |% N9 }) p9 a6 O1 \7 P" q#include <signal.h>
6 @6 l8 S0 Q0 U- T0 q- @- R2 P! z#include <pthread.h>       //线程, |  n* K- C# B( D0 l& m2 L+ K
#include <stdlib.h>
. |1 {7 `5 G% l: H# G#include <pcap.h>          //捕获网口数据
% B) P( X4 ]) k6 i0 @; c  x$ t#include <semaphore.h>     //信号
9 K3 p1 v0 T+ G! q$ W$ i  U& p4 X' p, U#include <sys/types.h>     //消息对列
+ i! C2 q* M# H2 c' G% L#include <sys/ipc.h>       //消息队列
' D  J+ Q! l: s& K7 k" e#include <sys/msg.h>       //消息队列' D2 J; p! K* r- ]$ P  F" K
#include <sys/select.h>
  {( Z5 a8 A1 m/ k6 E9 y$ }#include <sys/syscall.h>
/ E. n' p% T: [#include <sys/stat.h>3 E) e# O5 o# P0 H. |6 F
#include <sys/mman.h>
* h( S9 w& `5 o. b2 T' W#define msleep(x) usleep(1000*x)
$ _) @2 V; R% Q3 A& W
# A$ c6 h  E( c" e7 D$ q' ?int main()
, N- ^8 y" ?. z: _2 v4 r) U! k{ 4 x. F3 ?" [# L3 R2 P) X6 p) T
    //MCBSP,ARM与AMBE2000交互设备/ p9 E, x: a7 b
int fd;! X3 i3 W- A; \, }
unsigned short data_write = 0x5555;0 Z1 p% w! |1 W6 S) H3 a& H! b2 d
unsigned short data_read = 0x00;2 D* L3 I+ |3 Y# b: @9 O
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" H8 w% C$ e# q6 f8 ^) r //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 W* {- I3 V0 i, B8 E; O; Q   
4 U- P9 r5 ?/ S3 s- a8 ~/ g& `9 s  if(fd < 0)
4 _( N! O# U6 B  {2 t1 B  f/ o& O9 G8 j
     perror("open failed\n");
9 `8 x& Y( x! P$ e" J     return -1;# f2 c8 a  }, r0 O! e; P
  }% n! |( ], c( t
  & G. x! e6 W, B3 F, o
  while(1)& i3 @) l) M7 k) S- p! [
  {
) D# F' t. j: V$ i% c& K# J, F9 \- K   3 w6 \; ^- K, G5 ?" x
   //AMBE2000每次读写是24个字为一帧3 z; D8 f6 c$ k0 N2 P
   //写数据时将数据在底层存储起来,等到中断的时候再发送
# J. r0 P8 u- D2 O0 z0 S& y   //AMBE2000输入数据是以0x13EC开头的4 [6 K9 q! T& x5 N9 o
   write(fd,&data_write,sizeof(unsigned short));
9 }' A, U* n" {6 s: t* r: S   
; L8 w: @% S! [: j. h1 }   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
+ U! R) Q8 h- T( @; n" U   read(fd,&data_read,sizeof(unsigned short));3 q, F( m$ N) j' H9 Z% o1 u7 h
   ; D. b  C# U1 g5 x3 p
   if(data_read == 0x13Ec)
: A, \0 R9 d5 P1 A: m6 h   {  A! D- J8 t4 y% I4 @
   
) z! ~. ~0 ]& k+ k+ W: K4 W    printf("data_read = %x\n",data_read);% Q7 O+ W; l: Q0 G  b" I
   }1 L- x( g2 f5 O  _7 H8 i
   
! D. T7 E3 S7 R   msleep(10);
% g4 }4 w% F, I+ p4 m: ^  
, l. K0 Q7 @3 }: E2 B3 z( l  /*' k5 ]0 O9 W$ F1 `- {# t
   ioctl(fd,1);   - w3 }- O& H0 }1 _& m5 N: u4 T
sleep(1);
5 W; s' M, d4 U3 J' l0 w ioctl(fd,0);+ Q: e' E8 k! o. Q
sleep(1);
0 s8 M, ]) x* w2 y3 i  L. y- _ */ % ^8 A$ F9 n: E& S8 `% a
  }     ?/ c4 R2 G) s5 i  f3 V
return 0;0 i  M0 C9 Q5 ~* H

" ?( Z9 V9 ]; D5 o0 i}
  V* N4 ^" m4 B8 ?/ W4 n6 R# B
8 M: _/ c7 m; }  e' L多谢各位指教,谢谢! 急
8 N1 D+ h3 }, q7 Y) M
7 X0 k- ^0 I( t; B7 J7 T# r7 X
/ T9 k* T# y; l& d" x% R
8 \; L: Z5 W% U- h1 G( V, C. J' W! `1 u7 e+ X4 m7 d& H6 j4 V' W

: L: S- l' M& R4 B# h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 09:11 , Processed in 0.057473 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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