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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: , M0 N0 b! v/ S' b
/*" |* q! G8 }7 z7 e# {  r( ?6 n
* Copyright (C) 2009 Texas Instruments Inc' C/ h, K9 ~4 E  C- e) {
*
0 k( s/ K! P8 L8 F+ c" { * This program is free software; you can redistribute it and/or modify% x9 Z" e7 ]; _
* it under the terms of the GNU General Public License as published by$ A* z" M- q6 ]% V4 V3 R) Z
* the Free Software Foundation; either version 2 of the License, or
# P4 I/ V: K  s8 a! X+ P * (at your option)any later version.
7 y6 E! f4 T1 _3 |8 Z, r *" i6 _+ U  @4 N2 N
* This program is distributed in the hope that it will be useful,8 N7 Y4 I- b8 h9 B2 r1 z3 e- a
* but WITHOUT ANY WARRANTY; without even the implied warranty of  L0 M4 U3 ~6 P4 c" U: L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! |- x+ }$ J* E8 x1 ^
* GNU General Public License for more details.+ w  x% C# A. c2 k0 W! W- L
*  a% n8 Q4 s, y2 s( H: f
* You should have received a copy of the GNU General Public License; ]' j% r  z4 u+ p4 r, I( M. j2 Q
* along with this program; if not, write to the Free Software; }6 P; ^# G8 w
* Foundati: \7 f( t0 g; N" t- H; I5 f( Y
*/
" d, S* F1 M& c. d4 H#include <linux/module.h>
5 M! ^) d/ R# a" [# H#include <linux/init.h>
: ^$ b$ T6 J- h" A% F: N* Q. ]1 o#include <linux/errno.h>
2 _. w# i$ Z/ X/ P#include <linux/types.h>
5 \# @+ Q; ^' d+ j4 @2 F#include <linux/interrupt.h>
  M, z; q7 M. [# i+ X* y0 X#include <linux/io.h>9 L0 Y5 w3 y& C
#include <linux/sysctl.h>
2 o: Z* }8 s: p4 J#include <linux/mm.h>
5 s% s2 Y% H2 W! s+ Q5 ^  j: |5 r#include <linux/delay.h>
4 G( x! _( @/ E) j4 I6 E#include<linux/kernel.h>' }# }* _  I( n& C! z
#include<linux/fs.h>: Y  T) t% I3 D! w- A7 Y: r. D
#include<linux/ioctl.h>2 w- m* w: o. F0 Y! @1 u, }1 Y
#include<linux/cdev.h>' l) ?; a4 ]' K" `5 C
#include<linux/kdev_t.h>* D3 l# d# X, T# ]  h( g; F4 w/ {
#include<linux/gpio.h>
2 e+ x) L; g& ~! h% z6 c& v#include <mach/hardware.h>) x/ `! [' q, z( E
#include <mach/irqs.h>4 c6 B4 d% Y& c3 W* V
6 F, x+ X2 g: N" w. G/ z
#include <asm/mach-types.h>
4 E' z/ J7 i# g$ w3 F4 d#include <asm/mach/arch.h>4 A& N8 [+ ]  E
#include <mach/da8xx.h>% X4 m/ Y& I8 x& ~
#define  SYSCFG_BASE   0x01c14000
2 W" S7 k, F: n  n# i#define  PINMUX1_OFFSET   0x124
3 n1 {2 o* t/ Z9 X#define  PINMUX18_OFFSET  0x168 % ]) j, Z# k3 T  _
#define  PINMUX19_OFFSET  0x16c# R0 G* K2 B8 @. E
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; E/ T, z  D8 Q5 Y
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 B/ s) ^1 W4 _! V" i9 Q5 B/ Y
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
' z1 q. |' `! u' @1 o#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
# q  n% U) d; U" d#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR% R, i. w; ~  o9 J) X- W
                            . V& w2 W! r, ?. P% F
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% J0 \3 P# o; R0 g
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
: t1 P2 r4 X& ]! e//PSC
1 y" b( e8 D# \& O- E#define  PTCMD_ADDR   0x01E27120  
/ ~  J2 i: X$ H#define  MDCTL15_ADDR 0x01E27A3C
& J$ N; J1 p6 \#define  PDCTL1_ADDR  0x01E27304
  y2 X2 o5 e, y6 c4 b( v//GPIO8 direction
1 o. V5 Y! g6 x/ D* Q- w2 T#define GPIO8_DIRECT  0x01E260B0% k$ ]' x) C' k: y9 N
#define GPIO8_OUT     0x01E260B4
( y, Q  E7 b# y* s3 u" f#define GPIO8_IN     0x01E260C0* j3 l* a1 B  l8 [4 r

# c. c+ O3 c' E9 i/ c2 w. g//#define MCBSP1_RINT    99              0 D! D! j2 N  X3 _: D- f; H( I
//#define MCBSP1_XINT    100  
" r  m# e$ @( W* E% Z9 M( f7 J5 fstatic int MCBSP_MAJOR=239;  m6 c- K+ V: S# M* |0 |
static int MCBSP_MINOR=0;  D+ _; \7 |1 w4 _
static int count =1;# o" [2 o* ^# ~# ~' O# ]7 Z; p9 R

/ ~! l$ ?. B- t% v  E1 h#define MCBSP_NAME  "MCBSP-device"
7 f6 M3 k  o$ @( S' r( C2 R3 S( i  d1 r1 g- U& }) g) p& \
static struct cdev *mcbsp_cdev;
4 i" {+ l" |6 r" B' Xstatic struct class *mcbsp_class;
, G& K5 F; m7 |1 Q: R6 ]" @8 [' Ostatic dev_t mcbsp_dev;* b  s) V/ Y7 L
unsigned int DRR_data;
$ u. _5 a% r) x/ Y+ y1 Qunsigned int DXR_data;' N8 T. }# l' S3 L0 D$ y$ ^
static int mcbsp_open(struct inode *inode,struct file *file)7 o, L( T" N8 a; ?' l: |6 L) @) w
{1 g' z; Z* T2 l! J9 U" O
   1 ?/ I3 P( p0 n$ q
   //interrupt enable,initialized
" j' Q7 X: G! k+ X   unsigned int temp;
5 D% Y" Q, }9 `" [! Y   //SLEEP_EN(GPIO8[10])---08 Y% @0 t: l2 ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& l5 R% c4 G& L# q; C5 C$ l   temp=temp&(~0x00000400);
8 Q! X. `; R+ [; w, ]: U   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! k8 p7 ?: e3 ^  //RESETn(GPIO8[8])----0----1
+ X) f( d9 J+ s$ J   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- C$ G" Z9 F: S" c  Z
   temp=temp&(~0x00000100);
' J& u2 j  Q0 m$ q. f: i4 p   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 m0 Y( [' l) |) C& M2 d7 ~. G6 b   udelay(100);9 N. E8 [3 B( l6 A* W9 c! D& T0 j& E
   temp=temp| 0x00000100;
# v' z0 W# K% Z9 o6 V+ F! E8 l   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 ]4 K% m, x2 u* r: R, i. g/ @
   udelay(100);# p5 l; N  R6 ^
   printk("open success!\n");9 Q8 T# q! C; b9 X
   return 0;. |9 h# O6 V5 Y/ Q
}
% t) x: b' Y- d6 U, L4 C6 G# H3 x' o% w' k& z
static int mcbsp_release(struct inode *inode,struct file *file)
( A7 O) e$ I0 Y  R6 ~" {( z# b{
3 F+ W8 s8 y7 w4 w+ G) ]9 ]   printk("release success!\n");8 p! C. N9 G" j8 ?
   return 0;
  Y1 B/ ?( s$ G, B0 a}
( p! ^8 e+ g) I+ A" ^' ~9 D  n4 F( v( a$ c% c
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 j  Q% G3 I# i# u2 Y& d+ @" x
{/ |8 m4 e3 b- u# r5 L8 ?0 A5 o
    copy_from_user(&DXR_data,buf,len);
, E  g6 d+ k2 i( n# O6 h0 A    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
5 g/ J  {( x- v. @) p" `( ^    return 0;
9 d2 i1 ?2 f5 I0 F! d! C9 Y
' d% v2 ?) p' n/ H6 q3 m}) B- i7 B  U) `% A

0 m" H: s- A8 Q# @+ z( Ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 U6 U& @9 D( C' l" h! k{
2 P. ?1 K. q; w. N) d: I/ d: L# \/ a   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 q# i2 V( h! m# Z9 m; x( u
   copy_to_user(buf,&DRR_data,len);
6 Z$ Z, d! {3 M2 Z2 A   return 0;
+ c9 i* i0 W& g8 o( s}
4 M  R' C  y( R6 |
4 N# B4 T# i9 M: H2 j
+ r5 ?0 m; v# Z, K( hstatic struct  file_operations mcbsp_fops=; _( T4 J+ ^: L/ h0 d
{
1 y4 I6 l" q5 U" w- h  C8 T   .owner=THIS_MODULE,
; d: D6 v" `8 [# M   .open=mcbsp_open,8 b! M- M( Z9 W7 B6 K4 b! F2 h
   .release=mcbsp_release,9 n! Z: u7 m" D$ l' @
   .write=mcbsp_write,1 ~, F4 ?+ B. K6 m
   .read=mcbsp_read,
( T! V' {& V9 ?) }: d& c! u};, O8 u. `  N3 v; O
static int __init MCBSP_init(void)
! t+ h# c8 m: ~# k7 P( _5 b{- r1 {0 b, p  v/ M
   int ret;
. D! K* T! o8 j) F   unsigned  int   PINMUX1_REG_old;1 k1 X0 u% D# k, X8 |$ k
   unsigned  int   PINMUX18_REG_old;* e5 ~1 x, {" H
   unsigned  int   PINMUX19_REG_old;3 ^& C6 y" I' V9 {1 d
   unsigned  int   temp;  9 Y" ?0 q+ q6 }9 i
   if(MCBSP_MAJOR)' w; `* M; k* ^$ h6 `9 R
   {6 L/ Y' m" z5 s" F
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
6 [/ N: u& P" |& U, L9 c      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! f* ]2 Q' o6 V
   }
1 P6 d  a! Q5 h6 Y6 {, J% v% `   else
# ?* f# S8 j5 d) R$ D   {2 b( @" r2 F+ q9 K0 a7 v* a
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ r; h2 x) c/ H- M4 g4 J) T
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
: ^" H0 E& H( @- x- T   }$ ]; A0 E) R3 a* d1 \$ Y. Y8 t' d( ]
   
1 T$ M9 t5 a& G  E5 t   if(ret<0)  t: T/ d0 @4 I) ^0 m' t* p; F. s
   {- u0 ]; S" {' U0 U" l( k
      printk(KERN_ERR "register chrdev fail!");( F6 I$ K4 p; G4 i+ |8 x% C9 R
      return -1;
$ U2 ^( X; @$ B( Q3 [/ j. l# l. M   }% G' M; U4 @* v' m- D) z6 M) v
   + c7 _( p6 u6 d
   mcbsp_cdev=cdev_alloc();
  W' P3 N5 M0 u  n/ M; v   
, ?' J4 Z! Q) B/ u+ j   if(mcbsp_cdev!=NULL)8 v, n; }* L; P  j. P2 h4 P! O$ N
   {# r9 T7 ~6 z* ?2 S
      cdev_init(mcbsp_cdev,&mcbsp_fops);7 T3 M0 U4 T# t( t' q7 N; P' y
      mcbsp_cdev->ops=&mcbsp_fops;
" [3 S' T/ R: I$ H5 c      mcbsp_cdev->owner=THIS_MODULE;4 B8 ^" P& S4 S' m1 H( I
      
- z2 r. [7 K0 g2 Z9 G1 g      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( L/ Q/ l$ d8 Z5 v
          printk(KERN_ERR "register cdev fail!");
# D  x) u2 d" X! m# n      else
6 H! ~, p' P/ w3 Y4 n9 j2 V  W          printk(KERN_ERR "register success!\n");
  {' B8 W7 e1 t   }
5 ]7 e/ T' f1 e$ n# z6 u   else; ~) A" O, T) ^. k1 ?; g" u. F9 E. y
   {
: @/ f6 v* W9 ?, p* `$ B8 J5 U      printk(KERN_ERR "register cdev err!");$ q4 ~6 m$ l+ A2 M1 Y" o
      return -1;
: t4 u  ~, A) \   }
3 [( l7 ]0 d( r) f$ [   * x: G8 E# w4 ?' o. n7 n) U5 F
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
" Z9 I: y: A3 c  y  I, r   if(IS_ERR(mcbsp_class))
( U; g% J4 v4 x, c1 F! ^6 y   {
3 s( b& y6 P7 }+ C" A$ S! L      printk(KERN_ERR "register class err!");
  F- o6 c; M. W% O   return -1;+ J% Y# c; G1 ?3 \
   }; O% N+ F% R: E" P/ ~
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ q1 C) i1 B: B: C; E
( I5 w( g( z, p( A   //PSC
8 A+ j. K5 P. F3 w   //add Enable MCBSP
2 o( q% ~' [7 o% z: U$ ]   //test
7 U$ L' Q$ Q# J/ n- `   temp = 0x80000003;  r' c$ s  B4 z% W# a6 X
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 P/ o$ j/ U3 }  [( u* [( T   temp = 0x00000003;
: w# A7 n* I, |5 S* M1 h% K   writel(temp, IO_ADDRESS(PTCMD_ADDR));4 |2 O4 X4 P, I6 d
. k6 V/ E7 b  L9 S. u8 O; i8 A
   temp = 0x001FF201;' y7 a9 j4 ]# i4 D* t
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));" ^* p  W0 I1 ^/ L% m
   " s  g) p9 J" F; l
   //PINMUX  $ T1 J- q$ [8 ^9 [- y% u5 b
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& }) I" z2 r0 `, ^4 Y) \7 L) k
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) \$ v# n- \$ P* q* R" a$ A) S+ ?
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   . _, K; B! Z1 @4 G. K  H/ c$ M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' c9 z) W) u# `; E   
6 l0 O3 N$ k# |; m0 O+ L   //SLEEP_EN,EPR,L138_SHK1,L138_RC) S9 Z1 T8 y( U0 W9 C
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 I$ d. D5 T# W' I6 R7 z
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   8 h& b0 @* v" T8 X) q
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) ]# N2 I7 V: A+ l) r
# v  x( B$ t9 @5 ?6 e/ X   //RESETn,L138_SHK2
2 v/ i/ o: c- B0 w( c7 m   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  1 v9 p" b. B! G3 |. q
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   3 s2 q' k# {' L9 P$ D; ~
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ z$ G* l$ Q4 I8 h! x, u- Q( U. o3 X: x
/ W' z/ {% W5 {0 P& Y! l+ N
* \* x5 A! q7 A; N2 I. j4 l* N
  //SPCR Register5 C3 \8 ~, ?, C. }9 C& d( H
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- U1 s/ s% m/ P) k8 V5 I  temp = 0x03000000;//(DLB=0)6 }* t" v9 y' J+ K/ I* A# F
// temp = 0x03008000;//(DLB=1)$ i- Q: @7 B+ Y- Q- x
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset( ]6 L4 D5 `% f3 ^: j
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 |5 n8 A& s" Z  printk("temp=%x\n",temp);
: H+ z  k# K+ P! {) T  z- f. l+ b
5 a, m+ N! p. o8 R  [% Z   //PCR Register
( G% H# c" V' N! I/ I8 O, D   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! k5 _$ M+ n! u' }5 |7 E! V
  // temp = 0x00000F0F;
; R! h: \* G7 `  M  temp = 0x00000B0F;
0 P, J0 x0 W& ]9 i  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
# T# c* |+ S7 {4 h  temp = readl(IO_ADDRESS(PCR_ADDR));3 i. q2 _) N8 {* m
  printk("temp=%x\n",temp);  
4 F8 w8 s  `' m+ c4 y   //SRGR Register
0 a6 X1 Y# Y+ J   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==119 b+ l9 w0 ]; p$ R
//temp = 0x301F000B;! V) u3 x: u9 n5 M& m6 }
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
3 s3 ^9 p# w1 E  temp = readl(IO_ADDRESS(SRGR_ADDR));8 o! K- w# F8 M3 d; B/ W
  printk("temp=%x\n",temp);' ~% V# J! b0 J" Z; u1 B4 s
   //RCR
" o0 m" i# U: O# U3 W  i  n/ h   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* g, n6 b8 k7 |- f$ Y# N   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ U' L, G3 Y( J7 Z# p9 R   temp = 0x00440040;5 J0 l8 v: K  l  h; y
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ) u+ c& T& D* z. T: y0 _; K; `
   temp = readl(IO_ADDRESS(RCR_ADDR));8 s# p# H8 T6 J2 h; `
   printk("temp=%x\n",temp);5 I0 k; X5 k6 _) Y( d& B2 c
   //XCR
+ E/ `% F) f3 i   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 N" M1 g7 `0 g3 Q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ [" d' }% F* G" ?6 }  ]   temp = 0x00440040;5 ^- A0 n: ]2 e! F" i6 L
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
0 D  K+ _* v  @4 }% n) j   temp = readl(IO_ADDRESS(XCR_ADDR));& t) M' O! q$ Q9 `. r" `6 T, i
   printk("temp=%x\n",temp);9 N6 P0 _- ^( D0 P
  udelay(100);
+ @6 `/ V3 i. x9 b  //SPCR Register
/ k2 |! ]! ~, ^, a1 S, s  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, B2 M9 @3 o3 x! G: W- Q: A  temp = 0x03C10001;   //DLB = 0 VS DLB = 14 T# X' z; {! W. Q
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
; @% U+ ^7 F% f8 r3 x$ M* ~3 ?0 e  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 h5 T# x* `1 w# b, v% o  printk("temp=%x\n",temp);/ z% M, d3 Q$ |& d1 F- c/ `: T3 h
  udelay(100);
8 }. O' b2 b0 e  {- F: j6 r
/ c! u7 a; k' d  //set GPIO direction( C& @) _0 n( e: T
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' c2 |. I, i1 C5 f/ ^3 D
   temp = temp | 0x00000100;//EPR----input0 D2 b" c5 `' d
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
  g: Y* g2 z4 d* ]. t" g   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( R" Y: d/ o1 _2 o$ i# z( e
$ \& V* M/ O" {: e   return 0;
4 g% C( a" t8 g. u. y) Q$ l}
6 r* i/ d, ^$ y- l$ n3 A# astatic void __exit MCBSP_exit(void)
* P" V, o- G+ D! v{
3 N* [( U, |$ J6 V" d0 o% G   printk("mcbsp chrdev exit!\n");: b# z9 E; F/ u0 t. W9 W' ^
   cdev_del(mcbsp_cdev);
' E$ \( q+ t0 l0 v   unregister_chrdev_region(mcbsp_dev,count);
6 ?4 p$ }# Z4 n: C4 H   device_destroy(mcbsp_class,mcbsp_dev);
2 J$ ^* [5 F4 {2 z% v; U, \5 E  c! O$ p   class_destroy(mcbsp_class);2 M8 m' `3 e! l* l8 U) ^7 p! Q$ K
}
( Q2 q, Q7 r: }# f9 @" lmodule_init(MCBSP_init);5 A2 v3 `; A- l* g) P; V
module_exit(MCBSP_exit);6 a3 r  [! A2 w8 R

; l' R) D) X4 _1 pMODULE_LICENSE("GPL");5 L  Y0 W( D- @; g' Q, ]# D% E
, W" l0 d" Y; q$ s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. M/ k4 l, z1 v- Q5 n/ h我的应用层的测试程序如下
3 k. H  M7 J6 V- i#include <stdio.h>
0 |" K/ A7 D  w#include <string.h>
7 Q! R/ a+ {& G4 ?" q" I#include <fcntl.h>3 }( E4 K( N  U2 N* ?
#include <unistd.h>( f, P- `, Z" [3 |" U0 n+ C5 M
#include <signal.h>
; U+ S! G; t4 ^#include <pthread.h>       //线程
0 i* ~- H2 X3 j4 V7 L6 X: H#include <stdlib.h>! E& [# X8 c2 v" F
#include <pcap.h>          //捕获网口数据
. |) t, o/ s* J3 y7 U- m$ M#include <semaphore.h>     //信号! h( b0 R" p3 F# y7 q
#include <sys/types.h>     //消息对列
: b  n5 g2 A4 B' @#include <sys/ipc.h>       //消息队列% V! c  @' O9 R- h! W+ X! w
#include <sys/msg.h>       //消息队列* s/ Y6 b: y! Q: {
#include <sys/select.h>
4 I. }; X; \$ E, v) R#include <sys/syscall.h>) S/ T4 W, t4 K
#include <sys/stat.h>
$ I, y& N) C* m/ }. g+ x#include <sys/mman.h>
- m4 Z" @& m9 P. g5 t8 p#define msleep(x) usleep(1000*x)% t. ]( R# Z& f

: j: [# |2 J9 Z4 xint main()
: R% L- F/ T8 X8 M5 n{ & k& ?7 f9 c6 j7 n! E
    //MCBSP,ARM与AMBE2000交互设备3 C- S9 {6 D$ y% M+ h( p* V
int fd;5 z; ~% P% Q# V/ @+ T
unsigned short data_write = 0x5555;7 e# n; i6 o; Q/ G0 d* X
unsigned short data_read = 0x00;, `9 K0 H& Q1 b
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 U" y+ U* x& |
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 `+ E3 c% q& o; S   
' U. ^: w. \; L  if(fd < 0)
& \  m! `3 E# T" ^; _/ ?  {1 e- Q% a" V2 B/ ?' k
     perror("open failed\n");
- O4 w3 T: n+ O. ?# @% |6 j, u5 r     return -1;/ g5 K  ^2 S+ |0 e% L) y; M
  }. m" G3 ]8 T. q. }2 |
  
+ f. j( w1 M; m% a  while(1); r# b$ c3 d* u# P: q1 s' u
  {" g. }, H5 p" P" A
   8 Y/ [- c$ Q5 q2 S$ y  W5 x
   //AMBE2000每次读写是24个字为一帧5 Q3 ?* o+ l2 v% P8 H7 b2 A
   //写数据时将数据在底层存储起来,等到中断的时候再发送
( H  e8 W- ?, E% `9 D/ x$ s$ c/ B- z2 j   //AMBE2000输入数据是以0x13EC开头的
& ?4 E, r. a6 ^; r$ a   write(fd,&data_write,sizeof(unsigned short));3 f8 Q! g) s6 b# j
   
' m1 Y  _. V( o2 L$ r. q4 a   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
' [) W' H1 r  ]! I. ~   read(fd,&data_read,sizeof(unsigned short));0 E. `. a9 @7 ^) X( u$ I8 W) {
   
, }5 O" F& K! X. C   if(data_read == 0x13Ec)3 Q9 U7 A1 X& J, N4 y  r! @
   {1 l7 \% ~8 T! |  T) T, G0 C/ ~0 ]
   3 F# \+ m. I  y5 {  M6 a9 r
    printf("data_read = %x\n",data_read);
9 A$ e/ E- D6 q# x0 [. }   }
+ q9 s3 d  o8 b2 l6 a) a7 `   ( h! x8 T( ?/ ?$ I/ \% S
   msleep(10);% X5 w% r4 i- z& P( t) t" e- ^
  
# f+ d2 U$ z5 ]7 t/ h  /*
8 j" B7 `: z( A( c/ |   ioctl(fd,1);   5 m% y! Q: n) u) l8 j; \) i3 R
sleep(1);
, r% G# q( e2 r6 c ioctl(fd,0);
3 S0 Y8 a5 {& Y( z0 ~! T sleep(1);8 \8 l+ n( k' I4 m+ e
*/ & O- t% _% r) |& p
  }   2 e+ h- @2 e7 l0 s
return 0;5 S; q, e5 `+ x5 c6 t

. |* W" c  G4 O0 F4 P2 ^, y}! n; q3 l) W6 O( d. V; v  M  l

5 Q5 ?5 t3 e+ {+ T4 e* q多谢各位指教,谢谢! 急! }8 {+ ^) d$ R( d8 B
1 ~  E2 k" ?& a: W1 n

' c4 S3 a, x+ `5 I8 ]1 ^% [9 x3 d) X# {

/ F4 N" B3 _; K+ U$ {( `" s7 L/ W  n" \( }5 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 14:14 , Processed in 0.048955 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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