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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ K" Q6 n* S; `# `0 F$ b/*
3 b" V. t$ c/ Z * Copyright (C) 2009 Texas Instruments Inc
: h& F  f* U; p0 j$ K; H; _6 C *
2 Z+ g# \) F( }3 F+ x$ C, J1 Z7 ] * This program is free software; you can redistribute it and/or modify
+ K% }4 c( N4 z0 L5 _ * it under the terms of the GNU General Public License as published by9 h5 A0 F3 ~- [
* the Free Software Foundation; either version 2 of the License, or% y8 O! r6 \( y# C
* (at your option)any later version.
9 Q% C5 h. u: G2 s *3 w. S9 s; T" R0 S5 E+ k
* This program is distributed in the hope that it will be useful,$ }1 {4 S# D+ x& |1 O9 s( L. y
* but WITHOUT ANY WARRANTY; without even the implied warranty of
0 o5 X( O  x- b0 p4 ^* l$ [  b * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 D% ?7 A1 I+ h4 D- ^ * GNU General Public License for more details.1 P1 l7 s! P! c* h1 ], W$ M4 m, C
*
. }% [: R4 P6 M * You should have received a copy of the GNU General Public License
' U* D% f' h% U. T. x* I0 w' n * along with this program; if not, write to the Free Software" p% J3 w7 c! E8 K7 U& ^" X
* Foundati
* i) \6 g! D+ U*/2 Z. {( ?; K+ l2 K: ~
#include <linux/module.h>! M# V+ O  U' U! d. y0 L' s8 ~
#include <linux/init.h>; j; `1 L5 C, Y# V
#include <linux/errno.h>! v1 t+ o' M* ]$ E! ?% _( ~
#include <linux/types.h>; J4 s! l( ^1 L9 Q
#include <linux/interrupt.h>
* ^/ s0 ]1 o7 G* d# N* H9 Q#include <linux/io.h>
3 F4 c* {9 j1 ~; `% v& ^9 S#include <linux/sysctl.h>
& l0 C' Y7 |# c#include <linux/mm.h>8 G- e4 b( V$ k0 C5 d( \" ?
#include <linux/delay.h>9 d3 i. M# B9 i0 n4 ]3 j
#include<linux/kernel.h>
! i9 r6 k) T: d3 N2 i#include<linux/fs.h>% C' i( h6 M8 M/ m/ L
#include<linux/ioctl.h>4 L5 Y6 f; l% B+ i
#include<linux/cdev.h>& z) c0 z" q! y4 X; q2 k7 w+ g
#include<linux/kdev_t.h>
6 L1 {0 _4 I3 i  Q#include<linux/gpio.h>
/ S0 T, H! z' ?7 c: n$ D#include <mach/hardware.h>
* [* U3 }4 K* j#include <mach/irqs.h>
# m; s- u1 o- @! a( [/ @  f, b* l+ |2 f, l: q  l& n. m: e5 D2 D) d
#include <asm/mach-types.h>' r) y+ W: F  `4 D; N8 ^$ Z
#include <asm/mach/arch.h>- [& R" D( B/ }/ `
#include <mach/da8xx.h>5 e) E- g3 `* y' L
#define  SYSCFG_BASE   0x01c14000
' F% S9 k; ^- }# m# w$ @#define  PINMUX1_OFFSET   0x124
) E/ j6 r+ k: g, ^3 A#define  PINMUX18_OFFSET  0x168
# o2 ~# A& b/ l! s' J+ h#define  PINMUX19_OFFSET  0x16c
2 A+ U# B( X! S6 j6 V/ ~#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR3 Q( {" H' N. D1 r. Y9 R
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR( W- a2 W3 Q6 B8 M7 j( P" k
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
8 m2 A4 z2 ^4 _0 r) S2 i; B+ W#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
# f- G" d, \9 z& L# t  V9 E3 @# A#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR& {7 R- _& B+ t4 {7 A! B7 i
                           
9 K% ^( X4 W4 _4 e& d) B  ~& M9 `+ X#define DXR_ADDR      0x01D11004  //MCBSP1_DXR" z1 `  ?- X2 a9 N# Z# p2 w* |3 I
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
2 A! O5 I" X1 U+ _4 c* t8 X" J//PSC" `! @! W) `! x0 x1 g$ [
#define  PTCMD_ADDR   0x01E27120  + _6 r: C3 Y9 n' G
#define  MDCTL15_ADDR 0x01E27A3C: U; R4 V, [: Y+ q
#define  PDCTL1_ADDR  0x01E27304
/ a4 U6 ~& [& A5 r& a9 \! Q//GPIO8 direction
3 Q5 r! C: A( C5 b/ J; C. f4 V#define GPIO8_DIRECT  0x01E260B0
+ D) I( i5 w: ?" l  g' |( i, A#define GPIO8_OUT     0x01E260B4
  Q( t' I7 \" Z: c  ]; k' I6 ^#define GPIO8_IN     0x01E260C0
4 p% y: e! U( N. h4 a
, L: T* i+ Q' [, M9 J: a3 z+ Z( p//#define MCBSP1_RINT    99              
# Z& v. Z1 x9 g//#define MCBSP1_XINT    100  . K* R, M4 k( Z5 }  Q
static int MCBSP_MAJOR=239;. W( q, D, s% J6 M4 J' U
static int MCBSP_MINOR=0;
+ k3 N; n! X5 Qstatic int count =1;: K  b- x7 |) v5 I# W7 t

; _$ w  l0 l0 ^" I4 h4 C# j( l  @#define MCBSP_NAME  "MCBSP-device"$ @& z  }5 o% E, @7 U8 [3 t! t
$ N( m; H8 j! K6 ^* s3 K
static struct cdev *mcbsp_cdev;: n( v6 a8 E: [2 @& F
static struct class *mcbsp_class;
; W% R2 M8 U" d$ ?/ p% z& C& @1 y* ystatic dev_t mcbsp_dev;1 S3 [, w6 @) p, M3 k+ k/ W
unsigned int DRR_data;* M* q3 O) y2 o( X" R9 E
unsigned int DXR_data;. g  D4 ]/ u/ U% x- O3 p4 g' T% ~
static int mcbsp_open(struct inode *inode,struct file *file)- t2 P8 x& ^0 L2 i, |
{
, w1 b  F9 @7 ~0 V   
7 C  X' h2 P2 [% w   //interrupt enable,initialized
+ o1 u( @; e1 G5 f4 B+ |" C* w$ x" _   unsigned int temp;1 L+ ^+ \5 G. d0 l- s
   //SLEEP_EN(GPIO8[10])---01 M8 o$ }- e* c8 W5 r2 C
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) O  E2 }- J1 F' X6 r
   temp=temp&(~0x00000400);
" H  [/ o' j9 C, T% n4 J   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ h7 b& S6 @3 ?/ x  b  //RESETn(GPIO8[8])----0----1
( q2 ?0 f, S+ V$ p! M' n+ g% r   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 X8 c* D9 I; ]2 T- ^5 m
   temp=temp&(~0x00000100);/ K) K- I, p8 I; Q- J# T" q/ h. T$ m
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
9 }  G; D; B9 ~) U+ l, C1 ~   udelay(100);
; r" v* E# V0 ?6 n" i  m! G2 |3 Y   temp=temp| 0x00000100;. W) @' D1 P0 P5 f4 X( \: O0 e* Q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% F& O5 I! G- U1 }
   udelay(100);
- i$ g3 L/ |9 t+ E   printk("open success!\n");4 k5 l- D. a0 B8 d6 U8 t0 ^
   return 0;. P# p+ m7 Q$ }- E6 H5 D
}
* n! D' b% _* v0 S/ i3 A# j7 M/ L& v  o# O6 }
static int mcbsp_release(struct inode *inode,struct file *file)
* S* p  d; D; c- {: q3 ^& Z{0 w3 X0 d; G3 S) B3 Z
   printk("release success!\n");6 x3 W8 F" c) @& V& ?1 `
   return 0;
7 ]+ C8 j5 T8 E9 X5 x# v4 q- b' f6 z}) k% O8 N# ~- _
, I- M2 K# O9 d/ f; S) }2 k
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- O( X) X5 Z8 P( {, G/ j) n
{
% B. ~6 J% \8 k2 u" E    copy_from_user(&DXR_data,buf,len);/ A' B/ ?* @9 j2 |. K
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
) {, e9 j* s. v4 [# h  m% q    return 0;
/ g, g. u0 }3 T! M# x 7 c* R) l* y  O4 d7 O
}  C/ D+ \/ L2 a2 P2 t3 g$ m7 {
* j# M  n1 s- E' j* Y$ y: e
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& Q0 [% ?: v& ^1 C0 c5 s/ H
{ 8 K5 m) a! ^9 L8 z; t' v
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' F, d% f* `" _# I9 r5 D   copy_to_user(buf,&DRR_data,len);
3 G/ d) l' ^$ l% e6 s   return 0;3 P1 w+ J' v$ M7 t
}
! ^, I& |; k+ `& u5 f% l2 x' x$ L" k5 s( A0 @0 C: {0 a; M

! g( j, _' w7 b" `! t: astatic struct  file_operations mcbsp_fops=
# J. v' N+ M4 t- L{; s$ g5 U. v3 j
   .owner=THIS_MODULE,9 X& N* d- X; L9 n( E
   .open=mcbsp_open,4 _4 \2 K; v( I& `* V9 f/ w
   .release=mcbsp_release,' g9 j# T4 R6 E0 L/ Y0 P/ ]
   .write=mcbsp_write,
# x! n2 D: @4 S, ?& C" m+ l   .read=mcbsp_read,
3 ]- E0 R0 x8 J};  M1 x9 P# o5 [
static int __init MCBSP_init(void)( x# j7 ~7 Z# T; H3 K2 c' e# o# h
{
# ]9 V7 z4 E% [8 t" U( ^  W   int ret;
# C" [. z8 k$ a8 T   unsigned  int   PINMUX1_REG_old;: U- w; c% U  m' y1 I
   unsigned  int   PINMUX18_REG_old;( b% ^+ O$ ^1 B! r6 r9 J+ T+ ^5 Q9 X
   unsigned  int   PINMUX19_REG_old;8 |5 e6 `, Q/ k$ _
   unsigned  int   temp;  , o1 I% q9 M9 i* I* n
   if(MCBSP_MAJOR)
; J+ w+ S" |8 b1 L" X+ m, F; N   {
3 ~! N6 i0 S" m% g6 p7 f1 z      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 Q* G4 ~. p5 X
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! a% |+ r' L! B  L) I+ z$ ?   }
8 ^4 {6 i8 Z' \3 P   else' B9 m- `) N8 l) u6 U$ a% s& c
   {
& ~/ F: z# H  }* z- O% s      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 F: \2 H6 k) E; X& i" ]
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ `3 V$ M! n# z   }& z5 Y! f9 P# m
   
" h0 N# T' E5 G6 y8 U! P   if(ret<0)
, ~$ v- ~: m0 k6 M   {) P. ~# `6 g8 X7 Y9 Z# U
      printk(KERN_ERR "register chrdev fail!");+ Q; N% |" m* z/ w
      return -1;
1 b$ B( i. f7 Y0 E! S* `1 s8 H   }2 E' E- k$ J3 r1 R7 ]  l1 u
   & d* a- R; l8 }0 {5 e8 s7 q  Y
   mcbsp_cdev=cdev_alloc();1 {* \3 K: W- D2 a3 t& A
   & D; ~2 \/ X, h% T! [( W
   if(mcbsp_cdev!=NULL)" N) o* V* r" J- v
   {6 b0 Y+ j1 v$ m0 s( D
      cdev_init(mcbsp_cdev,&mcbsp_fops);3 L4 C3 N2 X' _4 K' V: w) T
      mcbsp_cdev->ops=&mcbsp_fops;
3 y$ y; d9 u. Z# m. G. I      mcbsp_cdev->owner=THIS_MODULE;+ X$ D  V$ Z3 l5 J& r5 ~% T  ^1 P
      
5 ^. _2 H4 E6 Z" l' J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); m8 M$ h/ |. W3 T# q
          printk(KERN_ERR "register cdev fail!");' |6 {  O9 y6 I' c# x  x
      else: ]9 L! Q0 Q4 o& b
          printk(KERN_ERR "register success!\n");
$ c1 g, L1 `9 y! ~% I2 u   }( S' w+ @$ i7 k) h7 P7 T/ V
   else; v7 V+ D+ h# f) N9 u
   {
6 }- q8 ]; E% a( w- K) R( Q      printk(KERN_ERR "register cdev err!");
! K# F2 @7 X) T1 y: l: h      return -1;
, b8 M" b0 y6 T0 Y% K4 L- \   }
6 S6 y% X9 Q) x( @2 |+ o   / ^% P( G' ]# M% j
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 c0 }4 \0 A5 v( _4 w   if(IS_ERR(mcbsp_class))8 z1 k4 {0 ?: |( R7 y# @* L* x) M% s
   {
' i- D5 X5 t6 Y' d      printk(KERN_ERR "register class err!");7 l! q) G9 r* P1 Z
   return -1;' l1 i8 v  Y( ?2 d1 U9 i( o
   }
. q: ~3 {. d/ U! S% |   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, F: L* G8 D& c! a, f5 }' H# f
0 X& W6 ~$ _9 a   //PSC3 Z, ^; f1 g2 K9 |( |; }
   //add Enable MCBSP2 v9 z6 s% v7 _7 J
   //test
2 w. e0 A# W- |$ _1 f: m   temp = 0x80000003;
# M3 j2 M* o4 y2 }9 D/ F   writel(temp, IO_ADDRESS(MDCTL15_ADDR));; U# l% ^/ a( @$ b- R9 n( I
   temp = 0x00000003;
  a3 h% z8 K/ v! x& @4 P   writel(temp, IO_ADDRESS(PTCMD_ADDR));
; }7 t; x+ o. y: E " Y, n! {% P# S% s! P# S
   temp = 0x001FF201;* p* d6 ^, V9 _0 V/ i5 D* O* n0 ~
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));1 ]: P0 m: u3 O- G! d: j% Z
   
! ]+ [7 S  Q/ K- t" L$ C   //PINMUX  
" d2 L: }# W( G: ^/ a; O! z1 T   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,4 B2 q! P: E6 J1 M& f
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 d, T# K- e+ ~% R- G4 V2 m7 n5 w
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & A8 a9 n/ `8 O* S: F9 ^$ d
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 a" R' G( S( }   9 z) {, }, a% \/ u, [7 H# p5 N
   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 J0 [' s3 G6 ?4 m  h. v
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
5 Y" |$ y  _/ H& s% [- f& J   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; @0 `3 R# o7 J0 J# ^3 ?6 V
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
  |6 D3 `9 [: A7 G
% l' i9 |9 r- T0 J9 V- H   //RESETn,L138_SHK2
: J  Y9 j% S+ S* @" X- A# ~- W   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  . a& g6 Q0 k' j& `' b
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   + w4 U/ U6 g8 u0 ~( g! o, e
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 D- f1 f/ A$ G$ M0 s5 x) S) c4 t) u( I
5 F  n+ S+ N: s  U2 S7 V2 ~' N/ N# V 2 _+ p- |( Q; Q, @% L+ `( ^9 p
  //SPCR Register
4 L7 V9 H) _2 E  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 F: @! `7 Q9 Q7 B! t. s% h  temp = 0x03000000;//(DLB=0)4 {4 Z# y' K' V1 e
// temp = 0x03008000;//(DLB=1)5 o8 c( X$ Z2 R' H) ^8 a+ z1 Q! }5 h
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset/ f# F1 I3 ~: F
  temp = readl(IO_ADDRESS(SPCR_ADDR));
( P8 i3 Z8 c4 t  printk("temp=%x\n",temp);
* J6 r# }* u% g$ c, |4 {3 h+ U
' f: H5 O9 y1 L/ s5 ^+ D* ?1 R   //PCR Register
4 I2 G( @  L& ^' o   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
" _; F: \0 |) b" F/ Q+ o8 i9 O! T& `  // temp = 0x00000F0F;
) t2 H8 F; ]3 l6 i  temp = 0x00000B0F;4 P, @0 [. n* {  C, J1 D
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ E2 O; N  y) t' q
  temp = readl(IO_ADDRESS(PCR_ADDR));# N9 m/ x! M3 {% _$ b6 z/ R
  printk("temp=%x\n",temp);  
* C  a* {1 n- |  u7 `   //SRGR Register
! ], g2 O* H% k- I/ {) g   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* m2 i& i* j) z. w& b //temp = 0x301F000B;
5 J0 V4 K8 }! z4 |4 z, t   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
, v# H9 n$ U' ]" _  temp = readl(IO_ADDRESS(SRGR_ADDR));6 Z* P  a2 D, a3 L+ R# w! u9 d
  printk("temp=%x\n",temp);) C# o# z0 q1 T4 h, \4 ~
   //RCR
) }! Z$ t( V) H& W$ e$ T2 T   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' `! I3 J7 \* A6 R, r& A0 J) n
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 V) B- E, [* H" @* d4 w
   temp = 0x00440040;- @; I2 I& T' H! z
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
- ]4 s5 L: s0 U- e   temp = readl(IO_ADDRESS(RCR_ADDR));
2 Y' \4 X5 T0 ~4 E- @0 }4 y3 R: ?   printk("temp=%x\n",temp);! A) u" T+ Q: j( N$ w: {
   //XCR/ h1 x) c- r" ^! X- `' r5 X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ t# H3 R2 i+ f+ |  Q8 N   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0. t) f% D$ f; d) @! \6 {: |8 I
   temp = 0x00440040;( R7 L& q) j/ y* W
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 B1 X" U, V1 [3 g   temp = readl(IO_ADDRESS(XCR_ADDR));2 l" j3 f3 r5 f9 ^: m4 C
   printk("temp=%x\n",temp);; H) o! B: X  D
  udelay(100);
  }8 G0 A- y6 Y8 r+ t. @  //SPCR Register
: ^' w- _! Y6 m& T8 |0 X. q  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 d& h. {# h0 s5 Z9 e0 Q  temp = 0x03C10001;   //DLB = 0 VS DLB = 12 v6 D1 I. V1 u3 v: |
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 Y/ R  B5 i+ a; `4 W5 N6 ~3 x  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 D" |% z, L6 X1 K: V+ }  printk("temp=%x\n",temp);
! u- r+ j/ ?+ B% v  udelay(100);3 }, d: a- _* ]' o9 x0 s

4 y+ j" @, z% c" U  //set GPIO direction/ r' j. h+ ^$ N( ?2 X$ I- v8 `" P
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 u- ^7 e5 X4 I+ l+ o
   temp = temp | 0x00000100;//EPR----input9 ]; l: `0 Q, F. ~! c
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( f# N& A$ X- T/ ^! r! A  B3 a; q% ]
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# s8 f2 S6 r. j; Q , V( S! }- Q! B* R, ^" e2 |
   return 0;
$ M4 f6 x* i( l1 n, C  R}# f7 `6 U" X7 [
static void __exit MCBSP_exit(void)
! V1 u/ @6 f; o7 h7 D{
# M: l9 T  N% `   printk("mcbsp chrdev exit!\n");  Z' p" J; h/ o& `  \- A+ w
   cdev_del(mcbsp_cdev);9 _% R6 \6 E$ l
   unregister_chrdev_region(mcbsp_dev,count);- m3 F. X/ W9 z' g6 L
   device_destroy(mcbsp_class,mcbsp_dev);, Z5 t3 G; s% Y; u
   class_destroy(mcbsp_class);7 e6 A2 q2 u6 l1 w9 I  ?
}" a$ V% c" k* n
module_init(MCBSP_init);0 u% o+ l1 L/ t; g. c8 w
module_exit(MCBSP_exit);( y+ U+ `6 T4 e0 C" }6 I8 V

( A& C6 X: ~: y# }- N) BMODULE_LICENSE("GPL");
- L+ ^& I0 E6 w5 h- V- e1 v
; a, [. z" T) d2 V# N( v- k我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ \* ~! ~- ~& v
我的应用层的测试程序如下
& \8 B$ y3 F- D, d#include <stdio.h>' h% E: S( C' P" F2 K" o6 s
#include <string.h>2 f) `& f/ A* |# U
#include <fcntl.h>
: {3 ?% G" }+ g; N* U$ M#include <unistd.h>( q9 T9 h) A7 F2 X
#include <signal.h>
7 Z6 o* e- ^$ W: S#include <pthread.h>       //线程
5 o" W7 L7 ?& \' f( x#include <stdlib.h>
7 B' g  [) J! U6 G* h( ~1 o1 `#include <pcap.h>          //捕获网口数据1 m+ f. F  V! q+ {
#include <semaphore.h>     //信号
8 p; \) Z; n1 @0 b#include <sys/types.h>     //消息对列
8 @7 L: O+ q: d/ @#include <sys/ipc.h>       //消息队列3 l2 F. O, W4 O4 k; d" H3 r5 P8 ^
#include <sys/msg.h>       //消息队列- L$ j9 @+ O- a5 x
#include <sys/select.h>+ B+ ]/ G  P7 C: ]
#include <sys/syscall.h>, @, e9 O; |9 f+ \
#include <sys/stat.h>
6 }4 m. b" u3 j, Q* s& Q; W7 I#include <sys/mman.h>
2 b+ r* H0 f$ Q/ v( s#define msleep(x) usleep(1000*x)- [- m/ L  B# @8 n3 d; {0 b

1 O- Z0 r, w$ Z; k+ d+ lint main()5 v( N7 ^. Z) |0 ^3 I" V
{ : F5 i% E) P2 A
    //MCBSP,ARM与AMBE2000交互设备
+ H$ x: [8 t* Y  {6 S int fd;+ t0 K: K- t  j. S% |) w0 B
unsigned short data_write = 0x5555;+ E: v: M) s: g9 s* k& |/ t' _1 F
unsigned short data_read = 0x00;
7 @1 X/ H8 i: }, u  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 _# U) X7 a/ I3 u: S  R. p
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# P; ]# W) G# H+ J& e$ C' ~
   
: m) p# H% ~" f- b' `, s% j  if(fd < 0)1 Z9 }& G5 N* R: a2 w6 q9 d& C
  {
8 o. l, f9 h4 o3 P& ]     perror("open failed\n");
/ a. e8 B& }5 `  G) H     return -1;
" s$ F) O6 \9 V( u7 L  }' V7 O. \% m; `' X* p8 v0 W
  
% k5 z+ j* j5 q6 q  while(1)
. E- u8 P: w+ B5 b/ M# z5 i  {( e% y) g1 ?4 S- g* R
   
4 C* J) v; X0 P. u9 I5 F& Z' B   //AMBE2000每次读写是24个字为一帧
. T3 n) _: Q0 }4 |3 u0 ~$ s4 m& @; p   //写数据时将数据在底层存储起来,等到中断的时候再发送% G1 u" G" x; b( O4 D
   //AMBE2000输入数据是以0x13EC开头的5 O# v/ s8 x1 w
   write(fd,&data_write,sizeof(unsigned short));
+ [  a" w( ]7 Q) V- N3 \   ) H% q" ?2 n) C' y3 r) A8 C  N& i5 |
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
- f2 G% n$ e) @. h% w   read(fd,&data_read,sizeof(unsigned short));
/ M% q. F! o1 }3 c9 o, x: Y   4 f' j/ C' B  T$ ?9 @- Y$ ]; H
   if(data_read == 0x13Ec)
: C3 K9 ]) R8 ^7 b7 J' w9 q   {
- [4 H6 ]& G/ \( S. D) G6 {   ' |9 @  x1 N7 k$ y0 J* A
    printf("data_read = %x\n",data_read);
2 J9 M. \% c: N% d! N! f   }( A$ n% N1 Z9 R7 Y+ h$ h6 ?
   
2 P# q* {" U  l8 j4 V9 z   msleep(10);2 V5 p' H0 k& k7 x8 q
  . x, t" i. e4 R. L/ B- e$ {
  /*
8 f: q6 @3 c) G& x' T   ioctl(fd,1);   
) r1 C  C- ~1 q. {: p9 ^) s sleep(1);2 i5 u! d0 y. V2 W' H
ioctl(fd,0);
8 d" Z: D% _" u* ?* R& f sleep(1);
: s* N! ~% v* h0 x */
) `# y% Z- l9 R# p& M  }   3 Z7 l# t( e0 k" ^* _2 ?
return 0;+ r% M8 A) n7 r* L6 i9 z

% b2 D" Y% }1 A6 |- h4 W, Z}. B: r! J+ r- G" z* E  r% w

. T! T& g9 {3 J9 q% c2 c多谢各位指教,谢谢! 急+ C) W- g3 O0 b) C' @

: b6 n2 j5 ?1 i5 }3 G( d* g* g1 G6 C4 @( S9 E; e  W
0 @% ^& Z5 G- Y% w* D8 U4 w

: ^+ C: z: N; M  |3 W
* F+ |( R5 u$ e+ c, W' \0 P( S" A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 07:45 , Processed in 0.047803 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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