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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; K8 z" q& J- h; [
/*  U/ p  ]' A) @
* Copyright (C) 2009 Texas Instruments Inc  _# n4 H: ~! ^
*
& D7 J: {9 |4 r7 ~ * This program is free software; you can redistribute it and/or modify
$ @4 f& Z. I# y0 t2 |- p * it under the terms of the GNU General Public License as published by
5 L" D3 g# z+ X * the Free Software Foundation; either version 2 of the License, or
+ Z* @5 Q$ k; z, f * (at your option)any later version." i1 G5 D; b: G$ n3 t
*
/ k" h* p* f6 q  n& \1 a8 D/ c * This program is distributed in the hope that it will be useful,
$ n/ m2 T3 b, ~' X/ J * but WITHOUT ANY WARRANTY; without even the implied warranty of
* h/ v& a. S4 U7 e * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; m" ~! H% Y! w * GNU General Public License for more details.; f: {- w' i- |7 D
*
2 n. v; G; w9 [/ c * You should have received a copy of the GNU General Public License
; \+ l+ C2 c. z * along with this program; if not, write to the Free Software
/ E, W  \" \; Y) Y! d/ n; i * Foundati7 c3 Y0 C) o8 Q* F$ k' w, i
*/
3 _- Y% D+ E8 p5 D#include <linux/module.h>
9 P- q( p) ]- V* K! H#include <linux/init.h>
5 a! g& [, Q' l% r% s! M) t#include <linux/errno.h>
- d( u7 M/ |6 o* f#include <linux/types.h>- C8 T# r. z$ Z. w3 m) f
#include <linux/interrupt.h>+ ]% @  x6 F0 ^3 a. k1 T: w1 b  B
#include <linux/io.h>, c1 U" R  W$ T2 n2 G! x' P
#include <linux/sysctl.h>) X7 a: e5 q! e
#include <linux/mm.h>: J+ o6 p/ _" S! l% f3 n
#include <linux/delay.h>
: M3 {# z8 G8 |#include<linux/kernel.h>
" t) E8 X1 f) m% p0 c#include<linux/fs.h>6 z, H; V% Z. z
#include<linux/ioctl.h>
+ T( ^& @" Q$ M3 \#include<linux/cdev.h>$ t7 J+ b% h& a" F
#include<linux/kdev_t.h>% |/ N" A% i# ?- W' i% }* b
#include<linux/gpio.h>0 f0 r% f# S9 q. Y6 G9 b# ~
#include <mach/hardware.h>
' b$ P6 l  y* f2 S' t$ {2 G7 v8 c& `#include <mach/irqs.h>
3 {" u* c9 h5 }% V6 U7 w5 B' j8 z% z& o' D
#include <asm/mach-types.h>, g5 t2 U5 b" E& e3 Y, W& i) c" [
#include <asm/mach/arch.h>
! ]5 ?  w$ p& V3 D9 l, h4 P' M#include <mach/da8xx.h>
$ M) Q7 u3 a! a. Z- Q#define  SYSCFG_BASE   0x01c140004 x3 k& j1 o, A5 X8 X
#define  PINMUX1_OFFSET   0x124 8 m# ?$ y$ c% o) F
#define  PINMUX18_OFFSET  0x168 " g  X+ ]( z, e& [$ I  b5 t
#define  PINMUX19_OFFSET  0x16c# `& m' P2 W2 a2 M
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR  [+ A' f" F. e: _5 _9 w
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
" X' z) }# Y# l9 s% w* V#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR, F& Y) a: o+ d# E5 T8 g* c
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
( l$ f  Q' K8 u* |# O' w# L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR4 H! J0 ^2 K; B6 ]
                           
2 e4 {8 _7 J, I/ \: J$ A#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 H; x( ~1 m. k& m# t#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
, I4 T5 m/ V+ b. u//PSC* B3 n; f( ?9 B' j
#define  PTCMD_ADDR   0x01E27120  
. ^0 W2 N6 G4 s( i$ u1 E; z5 K#define  MDCTL15_ADDR 0x01E27A3C; {4 @7 |) R+ z  x. X7 w
#define  PDCTL1_ADDR  0x01E273045 I- w; I, q3 e" g
//GPIO8 direction3 T0 [& U2 j% @) M0 `0 e
#define GPIO8_DIRECT  0x01E260B0% m" j6 n5 O$ v% W: h+ H( B
#define GPIO8_OUT     0x01E260B4
& @! g: g% h# M; R( Z9 \#define GPIO8_IN     0x01E260C07 K* ]1 B5 l9 Z

, q' T4 w0 q5 c3 |8 s3 _2 y//#define MCBSP1_RINT    99              
/ z3 }* X* J# i# f//#define MCBSP1_XINT    100  : g* x. |- l8 A/ o. D  o
static int MCBSP_MAJOR=239;( Q+ J/ J5 W" X) l3 O
static int MCBSP_MINOR=0;
( {3 a8 z5 c/ F  b7 istatic int count =1;' u% S( v. ]/ V; x
( P  n2 U) |& B& _  H3 T4 {
#define MCBSP_NAME  "MCBSP-device"9 c; f& f+ G8 ^  U) @& x- A, _

! V" v" V2 J; Z+ r. dstatic struct cdev *mcbsp_cdev;. i$ f5 ^: v' C% C
static struct class *mcbsp_class;
' H: Z5 H: z4 l" O# P; F/ Ostatic dev_t mcbsp_dev;' @- x! y" T) Y5 G2 Y' c
unsigned int DRR_data;
& G1 P7 Z) s2 O( j3 hunsigned int DXR_data;
4 @5 c0 t0 O* |! n# ^static int mcbsp_open(struct inode *inode,struct file *file)5 m; m' R( [* k; o5 C
{
4 j) Z9 }; H( P' g& K1 p/ n# T$ P   
2 f9 \) H8 b9 ~9 F   //interrupt enable,initialized- q) z3 e2 r4 J0 z
   unsigned int temp;/ T' D  I# c( X+ [# p9 k" W
   //SLEEP_EN(GPIO8[10])---0. l# U# C" w5 [) D3 ?
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. Y$ c4 B2 T! |9 ?- c
   temp=temp&(~0x00000400);
2 y4 y: V! b% K$ ^   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 L# i7 u1 L4 e1 _$ p  //RESETn(GPIO8[8])----0----14 C* ]) m7 r( q
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 [; T0 ]# v* U7 `* V6 Y; D* j8 a1 o
   temp=temp&(~0x00000100);$ E  t  n; @" z$ Y# N( v# U
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 K3 C  F, P5 F# Q' k6 H
   udelay(100);
, I' l7 y- `$ d7 S   temp=temp| 0x00000100;0 Z  R( z* l5 ~3 _- p6 w
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 F1 ^; n' H; Q5 i7 _4 C$ M
   udelay(100);0 b" j+ A/ z% F
   printk("open success!\n");
1 b7 J* S* u; _$ B' r+ U  j8 i   return 0;4 {1 E% ?) f; a: A! ^5 z# y
}
6 y! `6 X! Q( ]6 \4 P4 l
* D9 G9 B; ?. s! x" L' [static int mcbsp_release(struct inode *inode,struct file *file)/ V5 I3 U, M4 [0 t; \
{
+ w/ p5 a( y$ r! J9 h& u9 ~2 A   printk("release success!\n");
; w7 v8 X+ P  c5 i   return 0;9 Q4 k0 a0 x. O+ r) T
}
- p7 n9 v4 D9 j. \9 z1 E" Q' V# D$ M4 r, q* O, J' G# `
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 G: \7 Z4 c. D! @$ H5 _{
  v% ?! r& z9 Z) K7 v    copy_from_user(&DXR_data,buf,len);
7 P0 W+ b- n0 F' v" _0 ^: C+ y    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - C8 h# f% \% _5 l
    return 0;
$ n1 \; Z' V/ c1 x( d* i, w* B( ^
6 c5 Y( W  ]- {7 g}+ C5 W  t4 `0 `0 w' z9 X

$ l) z+ {$ [& q7 j1 u' {, {static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 C& o  {4 g  c# }, L4 h
{ # ~$ V! W$ _, r/ P5 F0 m, ?
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- |5 C9 a  M4 n& X+ p   copy_to_user(buf,&DRR_data,len);
/ x) t0 Q1 L# H3 B   return 0;
3 h  j1 Z% H! \/ G# f8 i& }}& j, X9 j, B5 W' s9 A' \. p4 `$ U

$ T$ i2 p4 ^4 b* b( o
7 L( q" i( \, z1 P9 k  P" mstatic struct  file_operations mcbsp_fops=6 k, n9 B) C! r% u. T
{4 ~- _/ _6 H0 k
   .owner=THIS_MODULE,1 I4 E8 c. f) p: O+ _+ b, S
   .open=mcbsp_open,
( F3 _, ^) t$ l( P! |   .release=mcbsp_release,
4 @6 I8 v$ u( Y3 P! s   .write=mcbsp_write,
' V' F, f/ A% }3 B1 s   .read=mcbsp_read,
8 p2 j: n$ i& a4 D- j, i6 M  z};6 x0 p3 m3 h! |8 \* \4 W
static int __init MCBSP_init(void)
/ Q, s7 |/ N9 h9 E- ~5 `/ I" {{. T6 e& N2 v5 O( t) P  P; q- G5 j
   int ret;
/ T# {( u$ t: }. k2 h   unsigned  int   PINMUX1_REG_old;8 x; C- _( ^' D& I4 F' z5 E
   unsigned  int   PINMUX18_REG_old;
8 i$ M) c7 x4 f. x- g   unsigned  int   PINMUX19_REG_old;
& D+ R! O* }1 i# L. W   unsigned  int   temp;  & H: S; G  J- K' M* t5 X
   if(MCBSP_MAJOR)0 G0 @$ y' s, d! y" C
   {
3 [. b  P. m0 L' i. o      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" {1 j, a4 @- C' E6 K& o      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  w) p* `+ H- d0 j& j! l! z) I
   }
1 ~( B8 l5 u7 q! ^( H/ e2 w   else
4 J2 I2 X/ G) y' N" {" `8 N   {+ \2 T6 j; s1 G3 H/ M" P, b
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  z2 ]- w) P' G( O
      MCBSP_MAJOR=MAJOR(mcbsp_dev);/ ]$ @, P7 I- a: d  D0 [
   }$ u5 p9 B3 q4 N8 D# Z
   
. K% [- |1 v6 X+ }* l) ]   if(ret<0)1 h' F+ r/ ]! @, E2 l' s% B
   {% z* f/ s( P8 |; z6 U# n
      printk(KERN_ERR "register chrdev fail!");
0 e+ X9 c$ B) w; @% O2 N      return -1;
0 A' f" ^% Y- I   }) s, h5 {  h  i0 ~/ }5 ?/ E' C4 K! l
   * Z) u- G6 [$ ]$ ~8 }' g) v8 m% c
   mcbsp_cdev=cdev_alloc();4 ~) x* G' z% X8 f0 e* S! s
   , [: w9 O6 k6 s0 h, ]& \8 r% t
   if(mcbsp_cdev!=NULL)" l, Q5 z# o& i9 L% _! h& {2 L
   {
) d  u, E; M) M) y; J. w$ \      cdev_init(mcbsp_cdev,&mcbsp_fops);
) Z; ?2 u6 d3 c8 }/ B- x) B      mcbsp_cdev->ops=&mcbsp_fops;
7 X5 e; a* Z# E- B: ^. M      mcbsp_cdev->owner=THIS_MODULE;
9 U6 Z6 W: k' x" a- ^) b) N      
. M, R2 X1 e* E) I& P8 o; v& x      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 e4 P/ j; y- M! Q0 N# @5 d
          printk(KERN_ERR "register cdev fail!");
4 G* J9 \* J7 |2 Z3 S( n5 }      else
* y% L) V0 }% c! \5 u) B5 H. P          printk(KERN_ERR "register success!\n");
  D! Z. S' a0 @3 T6 j0 b   }
' M% q4 I/ ^7 Z6 U: Y+ V% A   else8 g/ [. R) Q% g6 l; E
   {6 ?# N' i$ E( E# Y1 C1 I/ ~0 m
      printk(KERN_ERR "register cdev err!");" y9 x! [. r  ~
      return -1;
6 m! u' {( _) G: k6 j- C# H  H* x7 u   }! s3 v) @: k& S7 [: W# n. C8 z
   5 J; Q$ E( \/ r$ ?) y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);6 d" J, Q- o) L& a  B
   if(IS_ERR(mcbsp_class))0 U1 x+ h. ]  w+ [7 o+ Q) p" d0 g% W" d
   {5 `& P: w1 A, E3 F5 M" B  H) h+ [
      printk(KERN_ERR "register class err!");
7 {  B6 E- ^6 A* B8 J- n   return -1;
+ J" I8 f1 _! A' U1 [5 {% ?   }6 i6 z7 ?9 w( J0 Y; }5 M
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 Q0 g- t  z2 k$ @. X& u, |

; B# r5 s2 I, x4 q$ j   //PSC) B! Z. n! U3 E( T$ S1 C7 P' y6 K6 K
   //add Enable MCBSP# ]  D( A% b( ^. a+ g3 g
   //test( M1 t! ?, A  s, {2 [5 m1 I
   temp = 0x80000003;: {- q+ d$ q, C0 _0 e. @4 G
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
: ~) P& f, c* f5 |7 n+ \   temp = 0x00000003;
0 g. F: @; `) r4 @" U( l. t$ w   writel(temp, IO_ADDRESS(PTCMD_ADDR));
, ?! Q2 l$ U$ Q9 |4 r, q9 X
; U" u! L1 e9 U& R7 m9 I/ Y   temp = 0x001FF201;. S4 E7 r& w" T& P9 I4 p  X
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));% e- D1 U7 ]% j( M
   
1 ~5 m+ A- ^. P   //PINMUX  . O' {& G0 e' H9 w2 I
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( z! Y& v0 H( i' `0 b) j
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
$ L3 O% n( o! a' F! h( v3 i   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   % |% y! \( L- n' L4 x; Y' Y
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);6 h3 o2 b" O/ b" X7 M& O/ l+ f
   
1 O3 y3 @& `$ r2 U. W   //SLEEP_EN,EPR,L138_SHK1,L138_RC
2 n' f1 p! G, @1 ~1 W' {   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
! m% @5 c" C5 T1 z' l   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   0 X5 r+ P6 U5 l. X
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- [0 H3 f" B) _
' V! f8 x( s3 B0 v   //RESETn,L138_SHK2* p. }/ [5 G' ^' O
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ) R- A# P/ [" A' s) P
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   - T3 j/ M4 `0 p' X3 r6 X( @' T% E
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 X0 `8 _7 K% l+ v2 t
. {+ O6 k% R9 M! o
, }. E- b$ q- Q0 b- i  f5 o  //SPCR Register
$ i2 l2 ]& |  O* j  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. b1 R8 ]. t# W. b  temp = 0x03000000;//(DLB=0): |/ m  c" L4 z$ x( B
// temp = 0x03008000;//(DLB=1)
9 C6 U% M8 h6 U' r/ _* G  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset4 {* y/ ], p5 V4 J
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% N' A; A/ n/ r( r! p& ]( P  printk("temp=%x\n",temp);
4 U$ ~8 g2 g7 J$ U) ?! K# Z 1 M, l4 V  r- _$ B5 t) w+ b! ?
   //PCR Register% p2 f+ r- X: F# b& @6 s2 S
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- U) w$ s+ O% D" Z  // temp = 0x00000F0F;
9 c4 Y% m2 C- h0 I4 }1 t  temp = 0x00000B0F;
1 s0 x5 M/ x/ s  H1 A- d" ]% f' Y  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 v# o  @' {8 }% Q3 k" j
  temp = readl(IO_ADDRESS(PCR_ADDR));% _+ z7 X* W( f7 B
  printk("temp=%x\n",temp);  
: r' T% j# H2 v! u   //SRGR Register
6 N2 j2 z- J, N( D7 @& H0 a   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. C' E. F' d2 k, K  _) _ //temp = 0x301F000B;- X1 Q+ d9 l0 r! o! W8 q
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
. ~* Q* X$ p* j! J6 t. f+ I  temp = readl(IO_ADDRESS(SRGR_ADDR));5 h3 W3 H2 \  W4 u- e
  printk("temp=%x\n",temp);
9 X/ b4 `2 D' C4 D4 v, d# [   //RCR2 c$ f; f: _" N$ L
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( G5 D: u* y( \" ^1 m
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 e; Y0 n/ K3 n/ {6 Q- Q
   temp = 0x00440040;9 Y: F4 h: M7 Z
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
8 \- P  M- z+ R2 m0 S# r% w0 F   temp = readl(IO_ADDRESS(RCR_ADDR));
' G: y0 `6 ^1 y$ ^0 {$ F   printk("temp=%x\n",temp);
- S1 u* {; V/ T- n, a& @- b   //XCR' N% Z8 m, V2 [/ k
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% Z/ G9 H) i6 Y# f+ K) p* k, ^
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 [+ s* \9 [. k3 o$ J! \   temp = 0x00440040;
' B  @$ r1 S: N, Q0 k   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   9 _/ p! s- V4 ~/ i9 j+ J) t3 j7 c
   temp = readl(IO_ADDRESS(XCR_ADDR));
" m/ W' q& y! u; w; z1 |: D) U   printk("temp=%x\n",temp);
% k/ c  h& s/ I$ L6 G. d* H  udelay(100);9 U2 x6 q1 k0 D4 y) n5 j3 Q
  //SPCR Register
3 h1 J. O% E0 h* K' C8 b0 E8 f  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) w0 f( u- [' |7 r; P) u! b4 p  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
& M' Y, y4 N+ }  Q4 K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled( M. P) S' n) |) i( Z' i2 M
  temp = readl(IO_ADDRESS(SPCR_ADDR));! Z) M+ _* @9 m" d$ j
  printk("temp=%x\n",temp);3 s2 O) n5 f6 `: c: m
  udelay(100);, b; V& V) b) W* l6 y; m
! G$ K5 }1 i: R1 a+ ]! c+ S3 \2 V
  //set GPIO direction9 m8 u1 p2 x" k1 {& }6 r8 l. I# j3 B; E
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 F, U3 ^3 U: \, H7 j   temp = temp | 0x00000100;//EPR----input- Q& Y  X0 w' _* ^1 {3 q
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: i; H. V% S* @0 a# O+ {: `& Y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 1 o$ c# r1 _) a8 p# C

3 ?9 z7 ]9 c- g9 d   return 0;3 v2 X8 G  C% w6 e; l
}
. O" H2 d2 {  x- v  A$ Nstatic void __exit MCBSP_exit(void)
. I( s7 U0 \2 }2 j/ M7 ?- U{- x7 e2 u2 X+ y3 L7 o
   printk("mcbsp chrdev exit!\n");5 E) t% @- {/ e
   cdev_del(mcbsp_cdev);
7 _2 M: [, X; x! F' U   unregister_chrdev_region(mcbsp_dev,count);( P* S# }$ B0 R$ C4 m/ z
   device_destroy(mcbsp_class,mcbsp_dev);
2 o8 }+ F- J: t+ d6 E   class_destroy(mcbsp_class);1 F+ V' M7 v# d7 j
}
+ C" K: M1 c1 Y" [3 y& Pmodule_init(MCBSP_init);4 O% w: V( r8 O( b( f, N: a) O% H4 c- b& V
module_exit(MCBSP_exit);1 {( m* l0 |* `

4 ]3 l7 g( ?& _+ @MODULE_LICENSE("GPL");
9 k! l* a6 Z; A9 v$ G! C- w
" {% G7 Q9 ]7 r; D( i. p" }我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. n; _7 Q5 z' X2 e& S- p  q+ I: N. ^我的应用层的测试程序如下) x& c/ Y; G) Y& b7 I
#include <stdio.h>
6 ?4 ?9 C! A! U: t#include <string.h>
- e1 `( u4 n/ x3 t#include <fcntl.h>) d+ I+ D+ ^- Z
#include <unistd.h>' J/ A6 D% n; T& ?& p: D
#include <signal.h>2 g, K% C" {: [  @' H
#include <pthread.h>       //线程" b3 I8 ]- b" \, [
#include <stdlib.h>
& U9 q4 B) M: i; B#include <pcap.h>          //捕获网口数据
4 d; q" m) J5 N0 H7 ]4 v#include <semaphore.h>     //信号
1 v8 F- O( O$ u) H3 @6 }% L; H#include <sys/types.h>     //消息对列
; W$ [: H) V; f#include <sys/ipc.h>       //消息队列
4 q0 C7 W& {6 D, T# h" ]. C6 K#include <sys/msg.h>       //消息队列* F! @" x- h' C5 k; a* e6 n
#include <sys/select.h>
; [1 y' T* I- ?. }#include <sys/syscall.h>
3 V- o6 i0 u5 i  E#include <sys/stat.h>
6 r6 ]. t* K; @( @5 y* q/ w#include <sys/mman.h>( K" E! l; V/ s9 k
#define msleep(x) usleep(1000*x)
8 w, k; q$ N: _, ?' y, t* \# z9 z! [
int main()+ d7 v. s8 p) A4 R+ C7 T
{
! I4 g$ s" j/ Z    //MCBSP,ARM与AMBE2000交互设备6 q6 S3 X$ _- G2 B
int fd;
7 X1 s1 ?, F. \4 ^- B0 _7 ?1 h) c  G unsigned short data_write = 0x5555;
* a" p: V2 p8 A& h2 {6 M9 u unsigned short data_read = 0x00;/ J# B( m4 |! r/ |  w
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ y  V0 N. e0 s: R7 \: v //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% q( Q+ k8 s# n* B
    & _! m2 e' b7 z% }! H
  if(fd < 0)! y2 C! c. q- n6 N- c
  {
) W- u& {: Z; f: ?     perror("open failed\n");
* q, I8 Z) H) z$ }* z     return -1;
2 r* u) M  Q4 T2 y  }/ y7 Q8 V3 }% n
  / P! u# |0 ?0 C
  while(1)
: S2 Y6 X( X' G3 X; r; e$ T/ R+ C# q  {/ ]5 C6 F5 A* b/ t* B, C! M# d4 b3 D8 `" S
   2 W3 J4 R# U6 M) ~
   //AMBE2000每次读写是24个字为一帧
' H7 P; j- V( O. q0 n3 X! J. x   //写数据时将数据在底层存储起来,等到中断的时候再发送6 u6 Q3 `5 Y2 D+ I! f/ v6 @- F
   //AMBE2000输入数据是以0x13EC开头的1 H. v/ t6 @, K+ [1 l) G7 {
   write(fd,&data_write,sizeof(unsigned short));
8 g9 N" L- E, N  Y3 f   & I% B* z: r4 b( M
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 t! Y0 X7 _! B' s   read(fd,&data_read,sizeof(unsigned short));
) }2 ?1 b; Q; r0 T   ! W7 I! I, O' @& o
   if(data_read == 0x13Ec)
. ?- N" ]' x* u0 \   {4 c1 D: T6 U! Y+ I8 i
   0 g1 j& o4 W4 X, V  w; Y
    printf("data_read = %x\n",data_read);8 o$ _. P* W0 T) w  E  J. f
   }
& O2 C/ n+ }) N   
  p# L$ u7 N, g- F0 G9 s1 L   msleep(10);- |& s# v$ V/ A0 j$ p4 X
  
& }& x( \2 Y  e& o$ Q) c! ?  /*
( h; }$ t9 c! ]: X. H4 ?   ioctl(fd,1);   
4 i8 s$ [, |: c sleep(1);
2 z/ q# y& g9 L0 S ioctl(fd,0);" X$ m; r6 R* c0 N8 H
sleep(1);+ Q+ \1 o4 O" u
*/
& H: n5 Y6 R5 D. `. @  }   7 N0 [! F' I1 a
return 0;
5 V% T, r( l0 X! M
% s8 s* ]$ p% Q* h9 L/ X}/ B( z2 Q! F6 V' C  S; p9 x) {
; v; F6 r" o" x% k% h- R1 z1 `
多谢各位指教,谢谢! 急% h* |0 w( \  o7 O

" c# B9 N: }* X) {9 k1 c$ f; m, j
8 e' h/ D+ q1 Y9 @& M: d6 z0 ~7 M
- @& i  o9 e) [) J/ B# Q; n( w' K! F
4 `: d/ r' F. V: {( \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 23:06 , Processed in 0.048823 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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