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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 B; C: J5 s3 g# h6 E4 n" G
/*+ o4 `" b2 V# f1 j
* Copyright (C) 2009 Texas Instruments Inc
  x" b0 K' _5 ^; { *
& v1 W$ u4 a; U# B * This program is free software; you can redistribute it and/or modify$ u4 E  }' v3 G1 A
* it under the terms of the GNU General Public License as published by
1 C+ D0 {8 Q# r. o- H2 Z7 [( K: u * the Free Software Foundation; either version 2 of the License, or
; ]" J4 ^8 [2 l, R% X. n' ? * (at your option)any later version.: o0 Q6 [/ B4 p2 _0 w
*
* h( Z  C7 D9 D * This program is distributed in the hope that it will be useful,
& ^  u3 W8 y1 z" ^ * but WITHOUT ANY WARRANTY; without even the implied warranty of
$ J2 X+ X/ u$ t% Z4 _7 j0 O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) u0 u! j" J, w+ q$ u. M1 C * GNU General Public License for more details.7 q( Y2 l& h  s( W4 t
*6 ~: I5 t! }8 r/ E
* You should have received a copy of the GNU General Public License. ^0 {$ e6 ]# M; F3 E% F' c3 N8 `
* along with this program; if not, write to the Free Software
0 {6 e+ J, g2 o$ v( q  `* i" F$ [ * Foundati( W, \1 O! H3 n
*/  n, J  \& t5 W3 l5 t' a. t; a
#include <linux/module.h>
4 _# [9 W! I8 Q* m( {# A1 l#include <linux/init.h>8 h) |* y% l' r8 K' ^' Q1 `1 l
#include <linux/errno.h>
8 U2 [7 i0 m$ }! J#include <linux/types.h>& t- F+ C; {) Y% @% c* `- q, H6 @
#include <linux/interrupt.h>3 `6 I9 A$ o5 R+ U8 ]
#include <linux/io.h>/ K( h" R2 ?/ T# d- h) s0 ^- O
#include <linux/sysctl.h>
. W8 p# ]. y4 M4 ~* W4 R#include <linux/mm.h>. H7 }" [8 m8 ~  \8 M) @1 S# C
#include <linux/delay.h># p6 }  x0 M+ g' n
#include<linux/kernel.h>7 F5 ^0 I$ Q8 j) _; d8 x
#include<linux/fs.h>
+ U; M. d0 u- @- U2 d+ n#include<linux/ioctl.h>
' {9 R2 G2 F' G#include<linux/cdev.h>
* B2 o: t( _& q3 t# h#include<linux/kdev_t.h>( k5 b4 O6 }) d" u+ [
#include<linux/gpio.h>
- x! N( R- V3 z4 Y9 {0 P#include <mach/hardware.h>
, p2 p, E/ ^' c- p" I* J+ S#include <mach/irqs.h>( g2 d: d! o! P$ U' k4 r* J! g

1 A, w$ A8 I6 ?; ?5 O. K#include <asm/mach-types.h>
, u/ A; J# w' @! K3 m/ S#include <asm/mach/arch.h>* U: {; W1 V9 w
#include <mach/da8xx.h>) N/ P; [+ j2 o
#define  SYSCFG_BASE   0x01c14000
# x* i, h  T# X, R7 b#define  PINMUX1_OFFSET   0x124 + ^5 n  P, p; |
#define  PINMUX18_OFFSET  0x168 # B. n% w# n6 ], C  G% I- S
#define  PINMUX19_OFFSET  0x16c
# O4 M5 v) V) J& J  {$ [. H$ v5 c  f#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
' K0 c/ O' T$ S7 g4 Z  B* y#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR$ v: W( w+ w3 z# E% A, Z
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR3 c! E' C; Y* e( Z
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR1 I4 B8 b* v+ j5 C& v" f
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
, p! D$ r5 p7 [1 u% s                            / G  r4 ~4 E1 u$ }$ F- }9 @- P( m
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR6 g8 V" \0 x- P' q# [, i% {8 t/ j5 M
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
2 m- |3 k6 b0 {' A) P  C//PSC' `& S+ n% b$ ?
#define  PTCMD_ADDR   0x01E27120  
( I. s! W" s1 S' C#define  MDCTL15_ADDR 0x01E27A3C: O, ?. w. N, {  ~
#define  PDCTL1_ADDR  0x01E27304' W$ S7 ^& \% T1 w$ m
//GPIO8 direction; p' q3 t0 U- w* j, N3 |
#define GPIO8_DIRECT  0x01E260B0
$ n# p: _- S7 |+ x#define GPIO8_OUT     0x01E260B4
5 L& i* f- o5 C  ^8 b#define GPIO8_IN     0x01E260C0
0 E, a6 D$ l3 B$ y; A) `' O- r3 m; i6 |+ u, d
//#define MCBSP1_RINT    99              7 F0 Z# h8 ^5 H' I9 p( ]) H
//#define MCBSP1_XINT    100  
% F7 W) }, K$ f9 Ustatic int MCBSP_MAJOR=239;( [+ r0 }# Y3 ~+ f+ k4 J; h& B
static int MCBSP_MINOR=0;
# x' @/ B+ |$ T  b: j8 m$ ?4 \static int count =1;
1 i% f6 Z8 Y$ r$ G" z( B' t1 N3 E: Q( R0 R9 i- i
#define MCBSP_NAME  "MCBSP-device"; p9 h) n  E9 s; ^  Q
& e. a- y5 f3 ^7 Z. E- l8 O  h9 T
static struct cdev *mcbsp_cdev;
! z' }  k+ c1 [static struct class *mcbsp_class;( P' Z2 N3 P' z7 v$ g
static dev_t mcbsp_dev;0 o7 }% D! G7 i1 [& `, D
unsigned int DRR_data;9 |1 \. B  e, H
unsigned int DXR_data;
$ ~: Q7 L# i" t' S5 p! vstatic int mcbsp_open(struct inode *inode,struct file *file)
: ^3 L2 ^; W' k! Q{2 l  [) T0 T" C" \% V4 _, {
   
/ j. U5 o5 V' i  ^2 i" K   //interrupt enable,initialized
5 E$ H* k  V" W5 q   unsigned int temp;2 Z; O* \7 o% }) d7 Y3 J
   //SLEEP_EN(GPIO8[10])---0
6 C3 L) K; y/ Z% A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 L9 R5 a# J, A4 q" D' K2 K- d
   temp=temp&(~0x00000400);
9 h8 }; [* t8 \  ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ c& R' O4 ^3 ?6 g* Q  //RESETn(GPIO8[8])----0----1, m5 ?' U7 u0 e& V5 B8 ?
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ V3 L2 C9 ?# g% R: N   temp=temp&(~0x00000100);
2 B. g4 O& l' b. @- o   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
" o3 B6 i7 Y+ |  u: B) V   udelay(100);) `+ Z3 D. c8 S. t
   temp=temp| 0x00000100;# e, ~/ e# }: b! u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---19 p. L  u4 H: m$ `" Y& f
   udelay(100);
) G5 s  I: m2 ~1 \9 L   printk("open success!\n");
5 x8 Z* O% H7 k! V% E   return 0;
  c9 r  U  H' u, d! D: v}0 i0 j, s! p# n: p0 v
6 G4 _! T! V% |5 u- x1 y' Y
static int mcbsp_release(struct inode *inode,struct file *file)1 Z  K  D) ]* J+ C9 }# v
{( X( g: Q8 }# R. V
   printk("release success!\n");& O* v9 n& @" Y+ R
   return 0;  C; K. g: ]- _. v
}6 l$ |$ w; ]; n+ G7 ^6 {5 [

& w7 ~5 j+ i# c* l+ {2 g. F9 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 C! X, w( d) @- p{
  b2 ^. C+ N6 U  k    copy_from_user(&DXR_data,buf,len);
5 C( |+ Z* Z% ]4 d, ]! K1 D) L    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
- }. A( m1 y. q( o/ w    return 0;. O+ t! L* e5 g

' ^; T7 ?: C/ A* @5 p6 p" u- J5 z}  I6 v/ F$ N% `, F$ Z4 u
, b/ l6 H7 W3 R! w
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 T; M: m* }) ]. j) e" m
{
. V2 a% d0 {# z, p; X   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 q0 {  F. F3 L, S   copy_to_user(buf,&DRR_data,len);
  x" f2 F/ {, e' L9 P8 t' W   return 0;- v" I/ A2 u% {
}
; g7 w, C/ R. N5 r0 @
- ?0 ~: v. |* G- t" Y
8 d' [- \  ?% X  X$ d, `& Cstatic struct  file_operations mcbsp_fops=
# [, E+ A& [/ ]2 W# w  g1 \, F8 g: q{2 d2 l7 o% s! S! K0 Z/ b
   .owner=THIS_MODULE,
$ Y& |/ u' @4 t0 A, n4 v: b. u   .open=mcbsp_open,2 ^; {4 T4 D+ ]
   .release=mcbsp_release,
1 }$ w5 D: h4 E$ N& J. h  g8 [   .write=mcbsp_write,* Q/ Y* `3 x9 ^2 |. L1 {, q
   .read=mcbsp_read,
, f1 I/ G; s7 e, w) O};! e9 i* W. t; t
static int __init MCBSP_init(void)! W1 u" X6 i% J, m3 a
{
/ B: ^, F. B5 t" f   int ret;6 q4 y) W$ _" a* P( `  b; p
   unsigned  int   PINMUX1_REG_old;$ x( [" p; r( Q! ^1 Y
   unsigned  int   PINMUX18_REG_old;
$ I) f4 f- G8 s2 L3 _   unsigned  int   PINMUX19_REG_old;
4 ], t+ X* }: o% K$ L  q4 f: H   unsigned  int   temp;  
3 x" V: O. p; e9 X% B& ~; w$ g   if(MCBSP_MAJOR)
& n4 z- ~+ m' u1 H/ x, Y0 _   {0 V: k* U( R$ V. ~' q3 Z; L! |
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
) ^! d( e& |1 }; R      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);. {8 p" w! @2 t2 x" X; o) v0 ?
   }
7 h' L* {( Z4 e& e. [& v   else+ O2 g* f$ ?- T/ h) m. n1 L
   {" d0 J+ p. ^  K
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
* x) P) r) x" H. S: D$ v      MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 }+ g+ N- L2 G4 {+ t1 U   }
! P9 K' u- s+ M$ ?+ Y1 w$ u     v- x! @: c" r0 J5 k
   if(ret<0)* w/ f6 K' h5 @) N& p% ?
   {
- f1 t/ ?. i& c7 d$ p$ E- o5 O      printk(KERN_ERR "register chrdev fail!");( ~0 G7 e/ ~) f2 ~$ p9 B
      return -1;6 F' [3 A4 O8 D% Q
   }
* ^+ a0 J( k* m5 ]+ |' `   
" h0 `1 x1 F2 f" z4 m- n   mcbsp_cdev=cdev_alloc();
  M+ C: s! Y9 L   5 G9 Y) X  v4 |3 c
   if(mcbsp_cdev!=NULL)1 }, ^6 z$ e* z3 Z( P
   {; {, c! N) s( n$ n/ O6 p& z0 L6 M
      cdev_init(mcbsp_cdev,&mcbsp_fops);+ B; X* ]- z9 y; B3 E  s
      mcbsp_cdev->ops=&mcbsp_fops;
6 C* `0 R# {) r) u& k      mcbsp_cdev->owner=THIS_MODULE;. N! I( P' n) h% K$ p$ L" T$ M/ {
      
, j' z5 A; c  b% L3 \) v      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
. }7 K$ U6 r# x( ?          printk(KERN_ERR "register cdev fail!");
, I+ b9 p; x7 |' U      else
2 O2 Y! `: q2 p/ @; I) e  N0 f          printk(KERN_ERR "register success!\n");1 \4 m/ i4 G/ _
   }$ C: ^: k) ]( v# k, m5 i
   else9 O8 }& T/ p( c2 ?
   {
. }1 `8 t1 c. x0 R$ K% \. v& }      printk(KERN_ERR "register cdev err!");
9 ?, R! @/ ]& u      return -1;* U4 M, l$ b5 |4 I, `) X
   }
3 |/ b. Q9 L- r- Q6 J( y( c   7 S) `. S% g, ~, k! \  D& D4 S  f
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) ^/ }) ?/ d1 g6 R
   if(IS_ERR(mcbsp_class))
# c9 [! J# ]+ g) h' O2 B9 M: n6 ?   {- [& Z: ?5 J, [1 {' r5 [
      printk(KERN_ERR "register class err!");/ w- U5 H- v! Z3 w8 x
   return -1;1 o: s, ^7 t, ?0 E: n$ `0 ]3 b
   }
1 Q  m) [- I0 u   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. M( _  A* B' E1 ?. ~6 v8 F
1 C/ \; _' Z" k3 ~) V8 ^% j
   //PSC
4 M- e% i/ z; b   //add Enable MCBSP
" w2 O8 S& `+ N0 M   //test- [* K, q/ [1 |2 X9 X
   temp = 0x80000003;5 M0 T5 a0 ]- M7 n6 b" g
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
  Q" m  _4 d' x- Y$ i+ H. ^% w  B6 n   temp = 0x00000003;
4 `/ ]# m3 Y# r" q$ ?; T/ b1 x   writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ }; H) C# M% W- F* I; x4 v2 Y
4 M, c) k" D) C' T: H   temp = 0x001FF201;+ _1 b. S. o: S0 D- Z$ p4 j
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));# h3 G1 z! D6 r  Y4 e
   
& u9 h; S0 I" E- U   //PINMUX  / I: X& W  x# k5 y( \5 m
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' Q0 `  h6 ~: ?) R   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
$ E2 p: R! D. S  P  p1 `   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   7 r1 x& M+ R% r2 g4 s6 m# P1 E
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. y$ c6 f! Z  ?2 b. B: k  s1 V
   # L) z0 l# A$ S$ t4 |( v+ K
   //SLEEP_EN,EPR,L138_SHK1,L138_RC4 B# z" L. C9 y+ g+ o6 q
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
. p: J5 s7 n' d7 a   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
' c: _- f) j+ C! ]- t& A   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ j- B) t/ y# ?- G4 V  U+ \
7 M/ X* Q, W+ J& k, r& Z5 R% K
   //RESETn,L138_SHK2; q$ `* @3 D( z+ k$ s2 Q* h0 s
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 a( m, Q7 n) [9 k) w   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  Q4 O$ w) N* e/ @( T: K   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ X) s+ R3 p5 H% p" q, x 6 E! K3 Q4 Z6 _! Q( b" h; ^1 ]

4 h: K7 R& @' Y6 d! {/ [  //SPCR Register
0 }. l7 [4 Y- j  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ Q4 \* W, @) l+ k
  temp = 0x03000000;//(DLB=0)) D: P+ ~6 M* n+ k  C
// temp = 0x03008000;//(DLB=1)
- x! c: N3 R, Y, {7 G$ K  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset  s! W: w- ^' y- w2 l$ w* P
  temp = readl(IO_ADDRESS(SPCR_ADDR));
* K. x9 X' \: j) `  printk("temp=%x\n",temp);
/ p+ y! z& n6 R3 n! d7 Q$ T( I  B5 F 2 u+ s) d9 a$ h7 ~- W
   //PCR Register" l& F/ d5 n7 w, ^. x# \& r
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 B7 X" r3 v& m& @& ~
  // temp = 0x00000F0F;8 j2 C  _" }! K5 f
  temp = 0x00000B0F;, E4 T  Z* g* u9 B0 ?& O6 x3 n$ ]5 a
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
# `$ z+ x" i' ^$ y& T# a  temp = readl(IO_ADDRESS(PCR_ADDR));
& ^' f6 {+ o+ R1 u; Z8 j$ Q  printk("temp=%x\n",temp);  7 f4 C) W: ]3 p; M0 a
   //SRGR Register
: s' k7 B& ~/ a2 G   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11& N  |* _  @7 l" q& i% R% M
//temp = 0x301F000B;
) F9 e; }- j8 x; |" q6 i: x   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 k& G9 w& `0 Y+ p$ r  temp = readl(IO_ADDRESS(SRGR_ADDR));4 y6 D& j' }6 m6 b# T
  printk("temp=%x\n",temp);
4 X( `9 P' ?7 p' {   //RCR
/ O- g0 U- R+ }+ _* {/ @$ x" N   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 s( P% F/ y7 r! ^4 U: P, T) o   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 b( N! ]7 q+ o# ?5 v& Z" O   temp = 0x00440040;
, Y2 Z0 I3 B& [, i: B, Y& u  h   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ( {$ x: k! ^5 P: r
   temp = readl(IO_ADDRESS(RCR_ADDR));' Y- R& M! u+ B0 p2 v
   printk("temp=%x\n",temp);
/ |4 X/ c: B3 g" a7 N   //XCR, S! C& w* D' N
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1# E9 y% |3 G* Y" h5 k/ P
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. J! _8 e/ ^* Z/ \0 U& r0 B   temp = 0x00440040;
5 |- ^0 X- s" e$ p   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
1 f6 K/ z" y8 j8 Z9 D   temp = readl(IO_ADDRESS(XCR_ADDR));
& N  c! ?7 N! N, ]+ U$ [* s; O   printk("temp=%x\n",temp);
& Y( v5 @/ _. x) a6 _  udelay(100);
. s$ L) S; n. Q3 c/ i5 B0 u  //SPCR Register
  m& y3 x6 ]8 t! L8 T+ V  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 v# \, H: A4 k( `7 t! L1 z
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ S7 @5 b8 K' b* r2 S
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
+ I0 @; k& l5 @. i  temp = readl(IO_ADDRESS(SPCR_ADDR));: T% G9 f0 r; ?2 f/ H% H
  printk("temp=%x\n",temp);& G" z- i1 U' [! ~$ q8 I  y
  udelay(100);9 l5 u1 l' x& p, k) |' k
0 G# f( ?- J" A6 N0 b. p
  //set GPIO direction
  ?0 W" O# A8 e   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));7 I+ b# t0 H) G9 J/ h/ d4 I
   temp = temp | 0x00000100;//EPR----input
: B3 m7 T: d! e   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" x! G6 v$ {9 S9 g* Z7 Y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) Y1 H3 G* U6 P* h+ d$ [
/ ^! y0 H! p1 O! u* n* q
   return 0;
& Q$ F- I. M5 r& Q6 I% J, l5 R* r+ V}& K, J' O& o9 R( X7 D# G4 b
static void __exit MCBSP_exit(void)
) k2 F- U. b+ r! F3 z# \8 T; B+ e/ t{
" _( K* U3 i9 B  r   printk("mcbsp chrdev exit!\n");* Y+ U, p" g! S: X5 h
   cdev_del(mcbsp_cdev);0 ]; u! Z2 ^' k
   unregister_chrdev_region(mcbsp_dev,count);* d1 k+ Z& Y, K+ s* f6 f% j! y7 I- F% C
   device_destroy(mcbsp_class,mcbsp_dev);
, Y3 a1 d7 i4 I2 d# J1 {   class_destroy(mcbsp_class);  ~% F$ @6 q* r3 n+ @1 I) F
}
& c9 w# R, _4 ^0 _( S# ?0 h* Wmodule_init(MCBSP_init);: Q7 G" [( q- }. h, R
module_exit(MCBSP_exit);
5 m; B/ E, S& J8 K. e: Y3 L* [& [3 c, k
MODULE_LICENSE("GPL");
/ Q  s6 m: Z9 R3 I( f$ o8 `( D; |, J, l
4 D$ c% v$ E- }) ?3 _我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
# q8 F# m% N* b5 d2 Q我的应用层的测试程序如下4 ^7 L: P+ [" O4 F+ F) z9 ]
#include <stdio.h>3 K9 N% K. ?) K
#include <string.h>
8 d$ k4 e8 X7 c+ Y0 W9 W/ Y#include <fcntl.h>
$ S5 q; M; e/ s: f' C: }, n#include <unistd.h>  u' V' C4 J! K( b" I, L9 S
#include <signal.h>0 F8 l5 z! X' E1 e/ L1 i+ d
#include <pthread.h>       //线程2 B3 }3 {6 n0 ]& C; \: l  F
#include <stdlib.h>
$ Q+ W% k% v/ K, ?, r#include <pcap.h>          //捕获网口数据3 [. M: \" k3 |( Z9 ?
#include <semaphore.h>     //信号
" g- q" v% a, G9 q5 S1 m- c#include <sys/types.h>     //消息对列! x3 E! r7 D- j
#include <sys/ipc.h>       //消息队列$ X3 M: f) _: e3 R$ \
#include <sys/msg.h>       //消息队列
6 B6 Y2 K  [* F( h! K/ T#include <sys/select.h>
( H3 G; P" N! |( v' b#include <sys/syscall.h>
" U* x( K+ h5 C2 D#include <sys/stat.h>8 [7 W  O; n) c" H
#include <sys/mman.h>
8 R+ C, N1 P5 ^3 J1 g. X4 A#define msleep(x) usleep(1000*x)
$ z1 ~( T, F$ @2 ^3 w2 h% Q3 K. ~: d# |' L0 a/ l8 X9 D/ J
int main()% E6 K3 d+ S8 W6 \) [% D
{ / S% |7 n/ |; T3 P, n) S
    //MCBSP,ARM与AMBE2000交互设备; V8 B  g% q* ?( |8 I; f
int fd;
% k; X. n0 P, A" G% l& P unsigned short data_write = 0x5555;- N( w3 x) H4 o, G
unsigned short data_read = 0x00;* z# W5 Q" U& N+ T/ w$ g
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 X8 E+ M6 Z: q1 Q
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: Q* R) e$ U/ y# G
   
7 F2 ~2 P  v2 Q  if(fd < 0)
9 p6 l' U- C+ @/ |' J' T  {) R2 q* K( E" i( O/ ^( a
     perror("open failed\n");& t9 t- A& J; W; j5 y
     return -1;
) A' r6 k, e) u3 Q  Z2 o  }, S7 d6 {: [- o3 b
  
% D6 ^* F. N& I! f2 n  while(1)
: [4 L! W0 _, I# S4 P  {
$ c5 M' H6 c% r" Z   
' O, X# C) C1 Z) ^5 ]& ?   //AMBE2000每次读写是24个字为一帧. i5 r$ x2 a9 `( s% C9 |
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 q$ C  D7 l# X* e3 K  |, S  N: O
   //AMBE2000输入数据是以0x13EC开头的# D- |  {/ C* \# S0 R- _
   write(fd,&data_write,sizeof(unsigned short));9 M8 }! W' f; k0 W7 I6 P: w; a9 L: x
   
9 J2 t. k7 J3 j   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  + e# ?+ L. T! ~6 ~6 {
   read(fd,&data_read,sizeof(unsigned short));! m  k5 N; `3 Q' \  F
   9 p; C: h$ n2 Z) ]0 M' B% f
   if(data_read == 0x13Ec)
# u/ _2 [5 P2 p' R" a9 `   {
( }& k- ^4 ^8 q5 R3 s' m   / i2 t! z: z7 C. P
    printf("data_read = %x\n",data_read);+ I! ^/ X4 b( m/ d
   }* i5 c  p) B. J! C, n
   
4 W9 b9 x/ A8 ]; I, H. M   msleep(10);+ d( a- c' m2 O4 ^, a6 I
  
3 e% {% B$ e- n4 p  /*  }7 Z) \' G. C- s4 A- i6 ]/ i' Y
   ioctl(fd,1);   5 p6 C) q, h- x
sleep(1);
3 ?4 M, t" K8 N& f ioctl(fd,0);) b- h8 ^# c7 C% t0 A" f" W
sleep(1);4 m  Z4 P7 F( ?; g! V9 G
*/
( s0 h, g5 i+ `  }   , l7 j3 ]; t& o! Q- R
return 0;
1 O5 c* D/ J% ?% @% {6 l* N4 f & c9 t* P, w' f5 u
}7 e3 i- r  U: p; B( x# v
$ d+ a5 d$ B% ]& _
多谢各位指教,谢谢! 急8 R& V4 W5 X- Q' N0 a

% g. c& Y, @8 K* d6 T/ Y6 A0 O; o  w" n/ f9 G0 }  a

! c( X* g6 }3 d; u& a7 H0 i4 ?
) O& O4 R. \0 d9 S- Y/ l3 t3 ^3 {! k3 _( Q8 T: H  T2 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 15:47 , Processed in 0.046277 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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