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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 K* G1 l7 P+ ~, W: X7 F/*/ U4 }0 a( n0 z2 P# C! {
* Copyright (C) 2009 Texas Instruments Inc$ F  T; T( R* t( M( ]
*
/ k6 j0 M, [# ?* L! X7 x& j4 R/ A2 J * This program is free software; you can redistribute it and/or modify
' X5 z" R; y; `9 m2 S. u * it under the terms of the GNU General Public License as published by
& s* l6 N9 k- T* T' H& j * the Free Software Foundation; either version 2 of the License, or
0 R" I) Z/ Q$ N( u% j * (at your option)any later version.
2 {0 ^. V' f) o) x# g( N *
3 m$ l6 [1 f5 n8 N * This program is distributed in the hope that it will be useful,, T: y; G; Z  n/ v4 m/ G. c5 g" B
* but WITHOUT ANY WARRANTY; without even the implied warranty of
: J& k& W3 i: ^ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! ]+ O) a5 L) H& g& u * GNU General Public License for more details.
, n9 g5 d. B7 `0 L; i5 U *1 Z/ T; Y8 Y3 n1 @6 q) D
* You should have received a copy of the GNU General Public License) S% ?6 m+ s" t$ H9 ?
* along with this program; if not, write to the Free Software
) e  w9 ?/ C1 I: I( g+ p; Q! } * Foundati+ x1 Y9 o" H, k. Z* N3 O! m) A
*/
& ~0 h+ v, _: l$ G* x#include <linux/module.h>7 G# @( I6 J9 ?" f9 x
#include <linux/init.h>; `; z( d! ~& z1 F/ ?# \7 h3 r& B2 e
#include <linux/errno.h>  K% m( l$ M+ \
#include <linux/types.h>
6 T3 z0 v4 c1 s/ ]; N# l#include <linux/interrupt.h>
7 D. M9 ~5 P: ?2 L9 P$ |2 R#include <linux/io.h>" E5 K, D! B4 {7 K
#include <linux/sysctl.h>! a6 d6 M8 O" ^' o) A& U% [! [
#include <linux/mm.h>6 S& W, M* C5 c! z4 s, y, n' h* I
#include <linux/delay.h>1 k3 _8 B* t# q9 J! d. ^
#include<linux/kernel.h>
. z- l$ K2 n8 P- y! r#include<linux/fs.h>
# W1 ~" B4 y0 ]  x% z4 d5 k#include<linux/ioctl.h>5 L, V% B* A8 k0 j1 ?- @/ `
#include<linux/cdev.h>! m) m) a3 O' l! \* W5 n8 O
#include<linux/kdev_t.h>
0 ^- |+ O+ p% o9 V1 ]#include<linux/gpio.h>5 P) ~0 x( z4 R* ^( D  K0 l
#include <mach/hardware.h>
# H+ i2 p7 }! t: l#include <mach/irqs.h>7 r0 m( K# m2 d$ |1 n( l
7 y5 o; n  b. K8 e: A* B7 M1 C  Z
#include <asm/mach-types.h>$ }$ F3 _6 {, ~* ~( l" g2 M6 Z
#include <asm/mach/arch.h>
7 W" ~+ {+ M8 J#include <mach/da8xx.h>
2 P0 e) ~" o1 S( b#define  SYSCFG_BASE   0x01c140006 g0 M* C' E: j3 d: W* w% S
#define  PINMUX1_OFFSET   0x124
. F- K  ^4 s! |( \. v#define  PINMUX18_OFFSET  0x168 5 @- R5 A  S* F# I
#define  PINMUX19_OFFSET  0x16c
* t* @, B# E* Q3 x5 L#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR/ N# }! U* q- ~" _( S, w  ^/ t
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR+ @; l( [+ n, o0 A
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
+ }6 `( Q- i+ J2 S2 t: f#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
2 R0 ]# |  f/ B  P7 D! U# L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
+ D* g! \9 e9 R  O: ]& e9 P$ _( M                            2 e- G1 w! {; q' b: x
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  R* p( x# R" G3 ~5 `6 M, S#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
; u& ^+ A( f, m) K. _' ]0 M//PSC
. \7 `. _- \; L+ q#define  PTCMD_ADDR   0x01E27120  
  b; b- Z& s9 _: d( T+ Z; [  C) u#define  MDCTL15_ADDR 0x01E27A3C. F: M3 V( b  G4 e! K
#define  PDCTL1_ADDR  0x01E27304
6 V" e' J  b3 Y% z1 u5 T//GPIO8 direction
& T7 G7 c( D& Y, C#define GPIO8_DIRECT  0x01E260B0( X1 K& w5 B2 ~# |8 J4 G' X. c0 ?9 |
#define GPIO8_OUT     0x01E260B4& Q! H2 Q% Q2 ^2 Q8 [$ D
#define GPIO8_IN     0x01E260C04 z6 n4 q; p6 E, p! h

7 r, Y* K! A# y3 C# W//#define MCBSP1_RINT    99              
0 o  a1 x1 _5 ~1 \- ]/ u. H//#define MCBSP1_XINT    100  / e" S, ?% ~+ k0 }% A, C( `
static int MCBSP_MAJOR=239;
. D* g, n' ^/ ]: Cstatic int MCBSP_MINOR=0;
% ~  n' _2 S! }! R( E2 Nstatic int count =1;$ r; O" B8 ]8 c6 `! r4 t

; A" s/ X- X  ?3 `#define MCBSP_NAME  "MCBSP-device"3 G, M7 R2 F1 t$ ^: Z. k$ o

" w' ?8 N  g) U' ~& _4 `static struct cdev *mcbsp_cdev;
, u8 I7 p# N3 S7 v1 A; I+ Fstatic struct class *mcbsp_class;) E  [+ Y4 a6 T
static dev_t mcbsp_dev;
, [7 U4 Q+ u& Z+ hunsigned int DRR_data;- y3 z  l' l- s5 T0 O) D( r
unsigned int DXR_data;+ i5 ~4 L; `, d3 g
static int mcbsp_open(struct inode *inode,struct file *file)
' {6 ^1 U7 O! T& H% _' X1 h{4 R; ~- H% I  w) a( i; _. M5 G
   7 n" s6 b0 c$ U( a7 J  Y; H
   //interrupt enable,initialized- }2 c8 T0 X. x
   unsigned int temp;/ H* M% J3 x8 q' T- R
   //SLEEP_EN(GPIO8[10])---0
+ q7 \% g# w2 R( S+ x   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ N# j* X  ~, r, k4 _. _
   temp=temp&(~0x00000400);
; q! T: Z+ A8 V6 p, [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 Z+ |8 Y6 j1 h9 ^" j  //RESETn(GPIO8[8])----0----1
0 m) W/ S9 l2 g' u: P6 {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- U. t4 p8 h; f
   temp=temp&(~0x00000100);
4 [1 R/ z: p# }+ m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ ^) K8 {9 c2 p9 U% {
   udelay(100);5 W% ]- v: p! c( j
   temp=temp| 0x00000100;$ @5 K! ^7 W) V) |& k' T/ e& P
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" i4 ?% ]1 F. \! y+ y
   udelay(100);1 b- m8 D& f6 y: f  h7 G' o0 u
   printk("open success!\n");% D0 u$ g3 N+ n5 L
   return 0;
" t1 y( [1 G4 K$ d}
$ q, m# t# L- H1 k& V: p- z! l# Y& l: ?  X
static int mcbsp_release(struct inode *inode,struct file *file)( |' h0 y8 _$ x
{
8 i# M! G7 n; N   printk("release success!\n");& g8 ?& L# V" y6 A9 W$ b  `
   return 0;. }6 V: Z. E: D0 D6 B; x
}# g$ n& ^- b$ p. m; O8 f
8 W9 \( r, Z. L' d: C( Y$ g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)% j* i  `, P' J/ b2 {5 p
{
0 [: v0 q9 k2 c' I/ S0 i% f' P. C1 `$ }    copy_from_user(&DXR_data,buf,len);
' u- x. g3 w% U: a: t0 q) z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
9 K/ ?! `# s' w; B8 P3 l. H. C    return 0;
' \* G* P! {7 C, g" j
. X- z" [& D+ t& D% c}
8 C5 G6 X' A5 R* s0 |
$ x8 \$ f" I$ `. S/ Wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). q+ f- A4 N9 H8 u5 M( m6 Z
{ . [9 Y7 R$ h$ g( v/ {# |( l) c
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 B! h5 ]; {& _9 _4 K   copy_to_user(buf,&DRR_data,len); / p/ P# G( w1 B" o* Y' p
   return 0;/ v; c% ]1 ]  E2 v% v
}' U( K# P. }, _$ M" U% G; w
& `2 `. b& w7 p. n9 k0 V) F+ T

7 h9 i* g, J. qstatic struct  file_operations mcbsp_fops=
  I2 H: z; k: ]# B{, y2 i) ?8 r, x6 a7 x4 |# r
   .owner=THIS_MODULE,
" |: a  s* r/ S9 [6 L& b   .open=mcbsp_open,2 d- e- A% x4 E1 a  p
   .release=mcbsp_release,& m& l" [8 {3 h  j  M0 u; p
   .write=mcbsp_write,
$ Y1 k% |5 B9 h/ [& d+ ~   .read=mcbsp_read,
6 u& D" s/ e8 W' p8 Z};
9 o+ z0 G) n5 N( \- g# N6 z4 a; Nstatic int __init MCBSP_init(void)
7 ?% Y+ q4 G9 Q% Z& B8 F{! _4 }8 b7 K, V/ \/ U
   int ret;
% s6 N0 e! G; a) t: B   unsigned  int   PINMUX1_REG_old;! ]1 u( X, v3 Q5 _9 y
   unsigned  int   PINMUX18_REG_old;
. x  V+ j' Z% r$ |( m   unsigned  int   PINMUX19_REG_old;
) d7 W& B. ^. y; W  D0 t   unsigned  int   temp;  4 Z/ `) W/ C" W( e7 P
   if(MCBSP_MAJOR), X$ B% K1 [7 |* k" v% r
   {
+ ?4 e( V) `" g% \' g) k2 B; c      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 G' _4 P1 T1 v+ s      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 B5 t4 C& [4 y) I5 H" s2 B
   }7 S' W) }8 [2 P2 I0 k9 x
   else
5 E  k. R. O. K  k$ y/ v- D   {2 ~! J+ g7 ]# c3 I/ o3 t
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
* K% r) ^. N& b5 u& V+ q2 b      MCBSP_MAJOR=MAJOR(mcbsp_dev);$ v1 T# r* b' o/ T: W
   }6 k3 I3 q& X3 i
   4 q' \- }. B9 O0 ^/ T! m
   if(ret<0)
% l- C% O. |- W8 [/ e   {
# j) a; j/ h' q: W4 [      printk(KERN_ERR "register chrdev fail!");
8 @; ~! }2 f6 |6 Z* h8 i; N9 W8 t  e      return -1;
! U8 h6 J% D9 o5 `3 Y' \2 k$ j   }
& A2 U/ D! v, J- P# ~- X& U* w0 r   
# C9 Q0 d9 I; P, G   mcbsp_cdev=cdev_alloc();
# ^, K- i; `( a4 J, j% J   % F2 D6 u% K. D4 S% G( Y
   if(mcbsp_cdev!=NULL)! Z& M, y$ F$ Z5 |" G4 ]  x
   {& _2 e2 ^/ ?5 g( r3 ?' O
      cdev_init(mcbsp_cdev,&mcbsp_fops);
. W" p8 f: a' V  n! d" A7 \0 X' K      mcbsp_cdev->ops=&mcbsp_fops;
3 n, X8 I3 x2 J      mcbsp_cdev->owner=THIS_MODULE;
7 m" q! c" u; u' k; e) B8 Y  D, w      - Y( j! ?; |2 q7 h3 B
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): h; k$ h1 S* B) Q
          printk(KERN_ERR "register cdev fail!");
; j8 _3 j% ~+ C6 q5 P9 o      else
+ Y5 Q$ q- B( J* I) j; R( v          printk(KERN_ERR "register success!\n");% D+ W5 o9 {& T
   }
3 }& ?. P3 r  U3 c1 F+ z/ i. X9 D! D   else) p) [' G7 @1 D% K! \
   {- c" E0 ]  T) V( ^+ T: R5 M
      printk(KERN_ERR "register cdev err!");
) E3 f$ f& X8 V5 U" m. O7 ]      return -1;
: @" [3 b5 A6 ], l   }
1 E7 t1 ?# m  G( Y   & B3 Z1 V& x, |) ~7 \+ q
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);4 _" N( b4 C0 m' T
   if(IS_ERR(mcbsp_class))
& {) r8 }0 N8 f( O   {
! A2 E9 j4 o  w" A6 |4 Z! }      printk(KERN_ERR "register class err!");
" E+ t9 r" B- o8 b3 N   return -1;0 z* Q% S# \; z+ a, N
   }* Z$ ?, U/ m2 H0 g  }6 L
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' H/ A- @, j0 A0 R" `9 e
9 `0 M0 K8 y6 Z; i1 M: D$ ]+ h, X
   //PSC
2 r0 [$ C2 `6 O- t   //add Enable MCBSP7 h$ y; X+ m% ~
   //test) S) p) Y1 b. g; t
   temp = 0x80000003;8 \* t0 R, T! }/ y  Y
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 y8 C3 D& W) O7 m. L, ]# E* B   temp = 0x00000003;& w) \4 Z9 P: K/ H
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
; {! g; D7 j: N6 l$ o
+ {& M; h: U% E) Q* p   temp = 0x001FF201;
% h2 {$ j+ Y6 T   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: j; U+ }+ s# {# g7 U
   
' `+ ?; a* M8 W   //PINMUX  
. t5 S- k3 ]* A, }0 R   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,% X  Q* f  r' K( Q
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
2 d& u  M  O( c# w: Y" B' ^   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 J) e2 n" \  l) j" r   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);+ v7 [$ R& p2 O, d+ S5 e0 U
   " A- M  \8 \! x5 [* G9 M
   //SLEEP_EN,EPR,L138_SHK1,L138_RC! W% ], J! W5 B" M" @# p! M
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  9 {: j0 T6 r3 ?/ h! v7 Z/ K" N! @8 z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; D; N. b" W2 i7 C
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 F$ B" a! l8 }5 ]
/ R2 [5 G3 k5 c  s9 n6 F$ s
   //RESETn,L138_SHK2
0 K+ r6 A: ]& w! t   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
/ R$ A/ v2 H3 h, ?' ^   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   1 l9 g/ C7 _6 N7 \! W" s7 }! A6 e
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ f$ n  |$ l# p+ j& O% e$ v 4 Y& u' Y4 {8 c: b2 ^

2 A5 J+ m% p! T1 Q; l, a  //SPCR Register' \$ }2 Y1 r3 T' _; H; ~0 G, b
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* e+ p  R- ?' c& H3 Q$ i  temp = 0x03000000;//(DLB=0)5 p" o: F7 f* A# N" E3 |5 [
// temp = 0x03008000;//(DLB=1)
: I, a5 W6 B) Y( r8 C, Q  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset9 d" L2 [; ]# c4 M
  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 }; L3 a' l7 S% f  printk("temp=%x\n",temp);
! N2 G3 r+ B# ?% r5 r+ \$ }, u; H
9 R4 P0 T! `( F4 j' u   //PCR Register
; L- Q: i9 ]1 W2 z* y& a   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ ~6 V$ j. W  r" h* [
  // temp = 0x00000F0F;
/ ?+ ?+ j" c6 V2 v5 ]% [! |  temp = 0x00000B0F;
# @) B# V" ^+ Z% n# D% g8 l. h  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
& V  }  b( o* Z8 N9 n* e' v  temp = readl(IO_ADDRESS(PCR_ADDR));% e: S" F: |/ W' }7 W
  printk("temp=%x\n",temp);  / ?4 c2 P' l, q4 X, G9 r
   //SRGR Register
6 |2 `8 _$ b& k5 j1 H$ {   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 D* n& M* n3 C" F/ j+ x% d //temp = 0x301F000B;
2 k' @0 m7 m; Z& @   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   S) X/ P. e: S& q8 I# B' ^
  temp = readl(IO_ADDRESS(SRGR_ADDR));! W! ]" t3 A, _5 B7 d* x% j
  printk("temp=%x\n",temp);
8 Q5 F4 _$ `& y* g2 v1 x   //RCR( {4 ^1 G/ U) U, b2 E
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,; k/ w5 P0 y# @
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' [- `5 H* O  c- v6 `   temp = 0x00440040;: L  h) _: X& F  \; |  f
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   4 m+ R% J0 v5 P, I) t. C, b) h: A, Y" Q
   temp = readl(IO_ADDRESS(RCR_ADDR));
1 u$ d1 w6 ]9 c9 C6 x: v   printk("temp=%x\n",temp);
- k" Z* j4 d& I) u& J3 m& t   //XCR0 q; Q  I0 n0 u2 Q! C4 H) C
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' w4 t' J0 f) J% \' }6 A
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 n( O+ a+ v2 C
   temp = 0x00440040;  q( [+ T* D6 {) U2 K1 T" ]
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( X! B- _8 j( I/ Y. J( w   temp = readl(IO_ADDRESS(XCR_ADDR));
; U+ x& ~2 A3 S5 L# d+ W. `   printk("temp=%x\n",temp);1 p9 ^5 L8 c3 F: G: T# P8 A
  udelay(100);
& \7 h6 d& _. Y+ W$ F  //SPCR Register
( j* a. B0 {! ]# k: h/ f  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; h( g) Y0 A9 O# @+ p4 P) x2 X+ b- I8 E  temp = 0x03C10001;   //DLB = 0 VS DLB = 1: v1 |, N/ [  E  q$ i% A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled- d3 y7 V( s0 F- J" P# f4 S+ R
  temp = readl(IO_ADDRESS(SPCR_ADDR));
$ S3 l% S9 G$ A& m4 ]( e$ V* \  printk("temp=%x\n",temp);8 M: |. s1 {8 x. Z7 X; O
  udelay(100);
0 ?8 k$ S. W( s5 a% k
/ y9 N# E* i5 P4 o0 O6 D$ e  //set GPIO direction
& p- H7 q: B: M- l* G2 m7 `   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
2 Q9 a, D( y' L; U9 J4 g) T6 m   temp = temp | 0x00000100;//EPR----input+ d, `2 X* h7 \
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 \& E  s6 \( s; w" J4 R5 J4 E8 t* O7 @
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( B" ], s7 D& \$ @4 e( E
! D. U% j2 j' E
   return 0;
3 I' I$ z: A+ z, r" k! E' x& U}
1 R7 _# ?* X. H4 |- tstatic void __exit MCBSP_exit(void)
6 f2 `7 ?7 n, Z/ G, ?{/ j& ~3 p7 D1 B" q1 G" e
   printk("mcbsp chrdev exit!\n");
' L& F9 q4 L0 K- n9 R   cdev_del(mcbsp_cdev);
* Y0 d: [. v4 B) G' a   unregister_chrdev_region(mcbsp_dev,count);
1 P5 ^7 \4 F/ F  W+ o   device_destroy(mcbsp_class,mcbsp_dev);
6 [: g( M% F, Y5 N# u; z   class_destroy(mcbsp_class);# d* V6 [' D2 F6 ]5 L; y- O
}
1 m8 ~1 v# K2 Y! fmodule_init(MCBSP_init);. R* K+ f1 Y9 d* p' u1 L
module_exit(MCBSP_exit);
+ k. I% c5 @+ M7 b6 y3 b
0 [8 B1 [$ C+ EMODULE_LICENSE("GPL");
) m+ @" N" A4 s2 x1 a
) `% J: k. a$ l: g1 S. U我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 {1 _+ s( t- I; T/ o: B我的应用层的测试程序如下
( K$ n: O4 {3 X6 ]#include <stdio.h>
6 U. a- B8 N/ q8 K) ]: M#include <string.h>
% U% C" U7 T0 B  b/ `& ]* w#include <fcntl.h>
- ^( B- n  U  [8 D. u#include <unistd.h>) e- A: Y/ _8 k
#include <signal.h>
3 A+ q% q, M$ {- S2 b#include <pthread.h>       //线程
0 u' e/ W6 r+ B! f; A* x+ n5 u#include <stdlib.h>
5 Q# V6 x' D4 J#include <pcap.h>          //捕获网口数据$ ?: X6 u: t) h: v" U  R
#include <semaphore.h>     //信号
5 o1 p+ s$ }6 t% Q& ]7 a#include <sys/types.h>     //消息对列
+ r0 V' X5 J2 H2 a#include <sys/ipc.h>       //消息队列
  w- |8 S9 m, p$ E4 Q#include <sys/msg.h>       //消息队列9 S, L+ ?' H; W" |: A
#include <sys/select.h>
5 P$ B1 v6 ?% Q. L; e$ i#include <sys/syscall.h>) q& _- o* i, z6 E5 K' g
#include <sys/stat.h>- v2 Y) F# ~2 N
#include <sys/mman.h>4 u5 M# p- B  c  g4 T
#define msleep(x) usleep(1000*x)& ]. e7 C. G1 |' e3 c
7 m& j$ Z! Z' s, T  j
int main()
1 X8 ^; P. x3 Y* O{
  W7 N8 v. M6 r& t# H    //MCBSP,ARM与AMBE2000交互设备
1 t2 O- `6 I% I% _ int fd;: c( I7 I1 V) j7 [  H$ ^" N
unsigned short data_write = 0x5555;- t) G4 s- _+ `# F" u3 e6 z
unsigned short data_read = 0x00;2 k7 H$ G( a  f7 T# s
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 k( I5 y- W" q' m* C# Z/ R
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
: V& E5 k! T0 N" R* Q      {* U2 J. h2 P# l  Z3 ?" r
  if(fd < 0), X/ d$ ?3 d! m4 Q9 d
  {
3 N2 K2 I$ u0 H1 \) ?6 ^; {     perror("open failed\n");; I( t2 F" z+ e1 m# \
     return -1;
8 i# J. p7 X1 b4 C% ]+ U  }
! [/ `% t" s9 _8 N$ A  . t* C6 `9 R: I7 U7 m/ E6 Y" n
  while(1)
5 e0 d/ j4 Z9 R" U$ ?8 U3 s0 d+ G  {
8 [9 z1 X% b6 s   5 Z- @! f( i0 s# T
   //AMBE2000每次读写是24个字为一帧
+ s  _, a5 c: m8 M   //写数据时将数据在底层存储起来,等到中断的时候再发送0 {2 ?. _, ?: F) y0 |4 _# k
   //AMBE2000输入数据是以0x13EC开头的
- {2 b% ]7 H! x1 B9 ~% M   write(fd,&data_write,sizeof(unsigned short));' |3 y; K" a) G; h' z
   # ]$ i4 d, _3 P, P" X/ c
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( x: C3 c* z2 l) @5 ^4 _6 A& J- [- ~
   read(fd,&data_read,sizeof(unsigned short));; ]5 I  Y  S# o+ A8 U. Z3 V* ]8 T
   ! {' |/ s/ }- l& d/ d
   if(data_read == 0x13Ec)3 b  U' x& D6 k0 Y
   {* u' ~1 M( u$ {! o
   ) ]* L; z( p0 I! [' g8 ^
    printf("data_read = %x\n",data_read);
% ], o3 `) |# ]/ P( ~   }
  Q) w( ]2 ^% n( e& R- `   
, z4 J- R$ T+ E) q0 K4 e/ O   msleep(10);8 Q' g# U* {, A' G
  
6 Q- @6 T. p) c8 |  /*3 U: H* m3 K' h; t8 }
   ioctl(fd,1);   
6 p- d! s7 A: k" t5 g% t sleep(1);, y% Q, h) ^- J. @# w& `: t9 l4 f
ioctl(fd,0);
2 `6 A- b& a: V$ R2 ]; E4 b, J/ d. l" [ sleep(1);
- v7 @0 U+ i: I9 `- u  U9 p */ # o0 z  F7 z0 `3 Z5 e
  }   
9 U+ K5 S; K  o" b return 0;1 N( _4 @  g7 R' D" _4 {( \8 P1 h& ?
6 i! i! R) S( x0 ]( p% }  H
}
& v5 _) R' C) O  A1 b5 I8 k
* B& I# P* V4 l; e7 L多谢各位指教,谢谢! 急
1 b& h: Q9 A3 z; K5 [" F3 U# V2 F  x: N8 H+ n3 A5 U+ A& W7 e3 Y
9 a; f* ]; [6 H- B* b

2 k) X9 w8 p" D7 R- m
  j9 u8 K! O# O; f! }- u; S( V. p( l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 06:39 , Processed in 0.080432 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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