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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: D) h# P% ~9 r, P, p# M1 Y/*0 q8 d2 I* d# {3 K; ~" R
* Copyright (C) 2009 Texas Instruments Inc
4 }) T3 Q( h% i0 {, ^' P *
2 G, k6 u# F- y& U * This program is free software; you can redistribute it and/or modify0 b* H3 Z' c1 |: Y" ~
* it under the terms of the GNU General Public License as published by% k0 b' N7 L9 S. `% G$ `: \2 D/ Y! o
* the Free Software Foundation; either version 2 of the License, or
( p6 o* X( r0 [ * (at your option)any later version.
; S% @( W- g& d. ~* q( b *
- T, v1 D! }9 e- h1 F: f * This program is distributed in the hope that it will be useful,% C* n  q! ?3 c4 y; a
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 S9 M8 J0 }1 S
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, h' s6 w5 a3 h1 j" n
* GNU General Public License for more details.9 D! n2 m9 d) b" X' ]! L; g
*; W( t4 D% |; {6 ]+ F
* You should have received a copy of the GNU General Public License
, J- l& R# A6 S/ ~8 f* o5 s1 m/ E * along with this program; if not, write to the Free Software" ?$ n2 s$ k" a6 \; R
* Foundati" o: ?7 p! f$ H4 Y8 @/ E6 A
*/# c4 m3 y  h5 t6 L3 P
#include <linux/module.h>! _8 o' U- O& ?3 D  f/ u9 h$ Y
#include <linux/init.h>2 }& W7 Y2 ]' c3 w( O
#include <linux/errno.h>0 J# p0 `# h+ d( i; \* m8 w- n
#include <linux/types.h>$ ?; @  L; n7 ^& @5 u: b
#include <linux/interrupt.h>- M2 t6 k' Z- q, z! K4 t- c# Y
#include <linux/io.h>
, u$ a+ P* a9 T8 ]#include <linux/sysctl.h>/ l1 ~2 G- ?- @: b
#include <linux/mm.h>; y; K9 S+ V' k1 N: N! ~
#include <linux/delay.h>/ ^; W) B7 b" y# D) k" {
#include<linux/kernel.h>
6 L) d" g" A# l+ l$ a#include<linux/fs.h>4 E; M8 k5 z' M4 Y' W* `
#include<linux/ioctl.h>
4 ]' P+ j+ G& S#include<linux/cdev.h>
2 H5 I- }1 c' I1 }. Z#include<linux/kdev_t.h># T. h9 s# g& v7 P
#include<linux/gpio.h>
2 U) B8 ^2 X$ g% y  K2 o0 z#include <mach/hardware.h>
: b7 g6 \% N6 [: t3 j4 K#include <mach/irqs.h>
8 N# E" q) [5 F7 f) u! i7 r, ~0 `1 L; h1 r
#include <asm/mach-types.h>9 j7 m3 M( r3 y. g3 U2 [9 @% k- j4 G
#include <asm/mach/arch.h>' `) _4 e  V" {( D$ n
#include <mach/da8xx.h>
- N- l2 s6 x; `0 D% D#define  SYSCFG_BASE   0x01c14000" `5 w  @) o! o: @5 g
#define  PINMUX1_OFFSET   0x124
0 l* x$ ]* T2 K#define  PINMUX18_OFFSET  0x168
$ C$ V8 q0 a- H: J1 s, w3 ~#define  PINMUX19_OFFSET  0x16c
+ u. {+ ]# W. U  ]4 F* ^#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
9 K6 O! t- @' x# j* h9 t8 m#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
& i( R4 i4 {$ R, F* @# m/ @#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR, ?# M, w# W9 r: S* n
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
: t0 f, G) U' G$ j% b+ L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ W# b, D0 `- c
                           
+ r( q0 P, E, a" C; S/ G#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
$ D' [0 `- o% V0 g: y1 n. x- }#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
( ~, |* {) @. o5 k; B//PSC9 u5 d* l3 E+ ]6 u
#define  PTCMD_ADDR   0x01E27120  0 h, b( u$ X& J4 {2 R6 e6 d  ]  h
#define  MDCTL15_ADDR 0x01E27A3C
# g! F; a4 N: M8 r2 U1 D2 d! S" r#define  PDCTL1_ADDR  0x01E27304/ R4 ^1 K0 a: q3 @
//GPIO8 direction5 a$ G$ A1 G- w" E5 z( }3 s' h
#define GPIO8_DIRECT  0x01E260B0, f$ W' j: |( G$ E( f: s* k
#define GPIO8_OUT     0x01E260B42 U' C% G+ a( G# [. \: l
#define GPIO8_IN     0x01E260C0
2 B* @$ |/ L; W3 l# Y) h% U+ G/ y: C, E
//#define MCBSP1_RINT    99              * j( Y- W9 V1 }( Y! p
//#define MCBSP1_XINT    100  2 q5 L6 C5 F: \3 B4 Z9 x
static int MCBSP_MAJOR=239;
! d: h- j" Y0 }, [; Astatic int MCBSP_MINOR=0;9 f( r0 {* `: [, o
static int count =1;! |3 W4 I; E& c
( p) J& u0 a! @, G0 V# c3 E8 D
#define MCBSP_NAME  "MCBSP-device"
- M3 b' s2 J+ ^: _6 c+ ]4 M- B- r( `  I# {3 l
static struct cdev *mcbsp_cdev;8 B/ D; l6 B5 h5 x+ Z1 E! I
static struct class *mcbsp_class;( p. y, q8 Q& z7 ^6 R
static dev_t mcbsp_dev;
  I6 v) e6 r; f3 f) I8 Cunsigned int DRR_data;- X3 B" h3 a9 j1 P
unsigned int DXR_data;  P4 ?' R9 p' Y; q) O# c8 U
static int mcbsp_open(struct inode *inode,struct file *file)8 E; F* z# J* ?4 g' m5 w; ~  k; c
{8 [  ?. K, j. `% J  p
   
) w9 \- F" X% t- {* S& r' o( ~   //interrupt enable,initialized
. M6 |( m4 e, F3 @! z5 M/ S: s   unsigned int temp;
: ~- N* ^) V0 o% L   //SLEEP_EN(GPIO8[10])---0
, O% y1 N9 m& `- H   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 A# D7 H; z) D4 X& C+ D   temp=temp&(~0x00000400);
' o3 N4 {$ G% T# s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' q$ {3 z$ ?* @  //RESETn(GPIO8[8])----0----1
" B) R8 |$ x3 S' y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 W; z, A; p2 D/ A0 w   temp=temp&(~0x00000100);- Z# I* p5 X/ ?& o
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 t$ Z# H8 H6 m, m; l# \9 n9 ]! }& C
   udelay(100);
+ X! K7 S4 Z4 y   temp=temp| 0x00000100;. f5 M- W3 E4 W' s' a+ ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; ]* D  l/ X2 J/ i' E& C
   udelay(100);
0 M% b: ?' i. j5 X  T1 @1 L7 K   printk("open success!\n");
* X+ x$ N. Z6 [- k% S" J& }   return 0;
! H2 G2 j2 f- H3 A# J2 }; C}
# F3 ]# y( i. j& n" f
; q  B, ^5 N; A  T' Fstatic int mcbsp_release(struct inode *inode,struct file *file)
2 w2 x  T5 y8 U* T  r{
$ M9 G6 e" W7 b( }   printk("release success!\n");
. f9 S: y8 Y- e4 w- D   return 0;
! G4 B2 d, K6 \0 H. M, ]: O- x}
( J: l1 ^* T1 V( H: ]3 W; s
2 O5 T3 r( L  Q( P' ?" g0 L- z' d# Ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)% r; {+ O0 C& u( x6 V
{' ], z" |* U$ T: l! L8 N
    copy_from_user(&DXR_data,buf,len);
* u( P: h9 i: s' ?1 K: T/ i    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
& l1 n4 b& ], p4 q! X    return 0;
9 s* d! O0 X  O9 q+ o
' o) r, J( H& J1 o}# q2 c1 `9 q4 h9 Z

9 @8 R% k' J- r; X- ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% A! @. l/ W+ b5 F$ V{
8 W, I7 v" C4 Z$ L, p* X  j" J7 S   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, U3 S! m: n0 f+ I
   copy_to_user(buf,&DRR_data,len); $ [3 ~8 n- @. C' l7 P
   return 0;1 f4 K6 n- r9 H
}/ v  F  l0 u) J) a# _( c

- b7 f# d$ T, ~7 f, X+ _& R& k: o2 \# k1 |# M6 Y0 i1 ]
static struct  file_operations mcbsp_fops=
+ R8 g3 \/ Y) ~9 {/ L* {! ~{: [$ Y1 Z' B- E( W1 \; l: g! Y7 e8 L
   .owner=THIS_MODULE,
9 V& Y& K7 S1 d5 V   .open=mcbsp_open,
" \6 I, G, O. b" W6 o   .release=mcbsp_release,4 g3 O% ]9 f9 Y; v$ P1 ]
   .write=mcbsp_write,
) l5 G+ z: L% N' b9 z   .read=mcbsp_read,1 M- V; e' c1 ]& X
};
9 U+ t: n7 E+ y" R: Q/ _( ?static int __init MCBSP_init(void)6 F0 u* j6 @# k2 @. R& h
{
3 o2 ?) e  m6 m+ O# H7 l   int ret;7 K$ S* O+ v# R: U/ y
   unsigned  int   PINMUX1_REG_old;* K* M5 ]8 q6 P* \+ C9 _9 p9 G
   unsigned  int   PINMUX18_REG_old;0 c6 u* ]) Q: k3 m
   unsigned  int   PINMUX19_REG_old;: U/ }3 f* z- ]# Y2 j' `$ {6 {
   unsigned  int   temp;  
0 h7 o  Y, d$ h, H/ }+ W   if(MCBSP_MAJOR)2 ~6 h3 t4 N' J; [* d0 M9 q
   {
/ m2 g; I/ h; s; C; }1 B      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 K; ]: e# v/ v" p, e$ [
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, F/ i5 }0 f+ a& o2 j4 @+ s8 G
   }4 B* T, V0 I# m( ]  p0 E
   else8 T5 s  H; V; g5 i
   {
# F. g& d: n" B( k6 C6 l3 L& I      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( r- h/ F( s. j8 C$ g! h- P
      MCBSP_MAJOR=MAJOR(mcbsp_dev);) h# A- a* W6 i6 v' c9 v9 P
   }  @( o9 q; p+ \* J; P) A2 r. l
   
  b+ c) A3 L3 I3 ~5 p' G' x2 s   if(ret<0)0 [2 p7 X) u3 S- s2 Z. v; Y; K
   {
4 T3 g! d* V0 N- z( Q      printk(KERN_ERR "register chrdev fail!");. q: c- d$ v8 E& a7 Y
      return -1;* [' Q. x: ~$ E; r+ U1 B0 [* l
   }
& m+ W* e; Z* ~% p' [; h   + V$ S! M. ?. e9 J' \
   mcbsp_cdev=cdev_alloc();. L8 f7 F0 F! j2 G; Z6 c' Q
   
7 p( L6 K+ A6 [( F4 L4 E2 u   if(mcbsp_cdev!=NULL)* }$ z9 g9 @" m
   {" {2 h* i: ]" l4 k4 v
      cdev_init(mcbsp_cdev,&mcbsp_fops);0 y9 S  z4 r0 i* g  _
      mcbsp_cdev->ops=&mcbsp_fops;9 d" R, V, O3 B% ?; B/ y( Q* i
      mcbsp_cdev->owner=THIS_MODULE;
/ B) g- J/ F. H0 F" g5 c      
# g; O/ |+ l. Y; Q9 y2 V      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; d: M; W" U, L! b; W  h          printk(KERN_ERR "register cdev fail!");
+ C) k4 C( a- ^% a5 V      else
- X. a: j  L4 J; Z( o% o          printk(KERN_ERR "register success!\n");& E  l3 N' s9 u7 j
   }( g) c6 _. \5 [) [: O
   else
  U7 t6 G) B9 i1 P0 Z   {
8 I  T' q* f- d! G      printk(KERN_ERR "register cdev err!");
+ `! A' z: X, l      return -1;6 j) u. p/ A0 l6 N
   }6 r9 D" o, A$ }
   % I, w$ F* \6 t: k
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 [3 v3 q' J- V8 l# z/ h6 A3 K! l
   if(IS_ERR(mcbsp_class))
4 I. H) C& }5 w% Q   {
' }! p5 v$ f! v! \& ~      printk(KERN_ERR "register class err!");
. b( {4 }5 W% ~3 w   return -1;
, P1 P9 l, ^5 u8 i) [   }- G" s& M, B* X: X8 G+ k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);& N& Y* V6 i. E" I0 H. ], |$ W1 C
, {) ~. e* x( H$ L4 m0 Q7 h4 `
   //PSC
9 `; H$ W1 f& |   //add Enable MCBSP. ^% k$ g7 n. c2 T- H
   //test
; J4 `7 P6 F6 P$ s6 N   temp = 0x80000003;1 B( ~0 M) a/ p' D! ?; v
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 [  Q5 O$ v; p) j   temp = 0x00000003;5 R" d. ]3 H0 u" F
   writel(temp, IO_ADDRESS(PTCMD_ADDR));; j( ^, R8 N  _( U
* x+ k( v' w9 G9 V5 E! M
   temp = 0x001FF201;4 l- m+ d/ B9 T9 h
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));, S1 v5 c$ f) Z. x$ l% P( q! ~7 r
   0 s0 G! f( H2 ^' j- }' y2 b
   //PINMUX  
4 D. A* l% F4 v3 N   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! i. Q' v6 r8 L/ y7 r! @) E3 K+ ^7 r, g   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
# i* ?/ @, C( c: C* o3 B   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   0 Y  Y6 b! G. E, `  H2 k$ _
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. c- D( c+ v9 L# _5 [* N   
' C( w+ P: ^9 E; G8 \8 }8 s1 R   //SLEEP_EN,EPR,L138_SHK1,L138_RC
. i& ?3 L- L# V4 d   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
& S0 k+ M; \5 F0 B   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
) n* b# Y( \7 P  R) m$ l   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ f% X4 z& V7 U$ I7 o$ Y# x
7 ]7 ]0 V. U0 g   //RESETn,L138_SHK2
- x- `. Q8 t: B   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 P& h( X8 g* ?3 W0 ^+ d   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
. C! o% [: w$ r  X& ]8 ?1 a/ \6 T   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 Z+ ^; {) N/ @) e- w9 @# C' D

! ~$ Z4 b6 f, p+ z  j. F
" D& P' N6 t6 {  //SPCR Register
) d" X& `# `: N4 G* k  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ ]2 b+ ~3 c8 }) o) b' a
  temp = 0x03000000;//(DLB=0)
' B. X; Q- k/ q2 s4 _" K& r6 D // temp = 0x03008000;//(DLB=1)
# {4 B  m0 H. f8 C" f- r! d: e  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset4 j' h+ j% N  q; ?
  temp = readl(IO_ADDRESS(SPCR_ADDR));
4 k+ g6 `7 n" s* r0 N, |  printk("temp=%x\n",temp);
! A- i4 \( _: G9 i/ y" D
/ r* Q# I  }. L3 ]   //PCR Register! [: K: d2 w- W+ q8 ~
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  E7 g6 t. _! e* \, v; N* Y  // temp = 0x00000F0F;
/ ]1 ?: U' N9 j, v% |$ b" v8 }  temp = 0x00000B0F;) A6 P2 [2 K- [, O
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 V6 Y' p. |: i7 q+ x
  temp = readl(IO_ADDRESS(PCR_ADDR));" @# ^$ Y- t( z2 S  D6 u8 w
  printk("temp=%x\n",temp);  
3 B7 d  K8 ]- y4 g- P1 g  U- {3 @   //SRGR Register, C* }2 B0 n0 D" ^
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- K6 p2 V/ z0 G9 R5 D //temp = 0x301F000B;
' I3 k( U# m0 P4 S. Y   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
' t& B( N5 c1 z  temp = readl(IO_ADDRESS(SRGR_ADDR));
9 g( u, A" A  Q  printk("temp=%x\n",temp);1 x9 T# F9 p% D" S7 }
   //RCR& e& l/ v$ `0 h8 d1 D# v. F
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
- e  X! F/ u$ f' I0 d   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ Q! ^/ K( R/ U: W# ~- q/ |: J- z0 S   temp = 0x00440040;$ V9 X* C& D0 p
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ( v. W( D# b, F! f1 B  B
   temp = readl(IO_ADDRESS(RCR_ADDR));% Z# r/ Z# R9 q
   printk("temp=%x\n",temp);
. E9 T6 }" Q; A+ A" L   //XCR: Y# N% p7 A# f2 A5 x9 U4 f5 a
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 y; O+ _! J, [) r9 x: [
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) \/ R! ~5 d' w
   temp = 0x00440040;
2 T, n, \0 b, u; R9 W' m* F2 q   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 \0 @' E  @" F) t1 h; X' r* s
   temp = readl(IO_ADDRESS(XCR_ADDR));
( b' [8 L( W* A1 |   printk("temp=%x\n",temp);7 Z+ A* y: k/ t; v7 Y# ]/ @* e$ ]
  udelay(100);
% e0 F% h& e  d/ T0 C/ i  //SPCR Register
- T9 \: ~# L. U& K  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) X2 }7 z; e2 l9 P8 t2 a% D# K6 Y: S  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
* I6 A0 [2 z/ y0 [; @. j5 z! x5 @0 s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
; U7 R& _  i, j, C! _8 ~  temp = readl(IO_ADDRESS(SPCR_ADDR));
7 r5 F9 N# M0 J  printk("temp=%x\n",temp);4 [, A5 {8 Y7 k7 Q* p5 ?3 p
  udelay(100);4 H$ T* y+ \; t4 P) b' F6 V7 K
# l/ [1 h# q% I5 p/ ~
  //set GPIO direction  H3 o6 D, y9 l$ ^2 A
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));  Z. g6 ^; N: j0 x
   temp = temp | 0x00000100;//EPR----input8 Z2 u, W/ U7 t9 d
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ F9 }; Y3 s8 e   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 S2 K# p" L; N

& H8 u  G& q; n& O* K4 A2 G, V# G   return 0;* b# d9 P. w- m6 b
}
0 O. O# f3 s8 ]0 s$ _static void __exit MCBSP_exit(void)
* E0 {5 R! A  `# {+ N) v{
  z6 k# R$ I5 l: U& W; \! Y   printk("mcbsp chrdev exit!\n");
- y$ R* _& d/ V8 T4 S1 y; J+ K$ @! M   cdev_del(mcbsp_cdev);
& U4 {2 W0 F1 Z( L   unregister_chrdev_region(mcbsp_dev,count);
% @* F& T& S+ s* B8 p$ U   device_destroy(mcbsp_class,mcbsp_dev);
: V2 h! r# _2 h   class_destroy(mcbsp_class);
( g4 @) v, s( }$ R+ m}
- `9 W' E) I2 ~+ @- _1 k/ Mmodule_init(MCBSP_init);
# V+ o# u- [- kmodule_exit(MCBSP_exit);
2 Q5 m6 T) [* L' x; W, k+ F5 I: `" g2 d! Y" s. j$ }8 G* b9 @
MODULE_LICENSE("GPL");
$ n  l6 J0 U# ^3 J8 m8 G2 w) e
# F) ]6 t7 {" j8 H% K5 J7 |8 Y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& F5 u0 Y( y" Y/ n
我的应用层的测试程序如下! Q) E2 H) H3 @
#include <stdio.h>
0 ~: x+ b+ _3 {( x, A$ [6 T) A: Y#include <string.h>2 b: b' {' X! l
#include <fcntl.h>
; C5 e1 M( _$ y) z: ?#include <unistd.h>
" o+ c( j7 F# R/ D7 C#include <signal.h>
) P1 x) c5 N6 Y) F#include <pthread.h>       //线程: L; i; q+ }' z
#include <stdlib.h>
3 k7 K8 j6 o- c! C7 {#include <pcap.h>          //捕获网口数据1 F4 E' |  u- @- e7 r- @9 t% w4 C
#include <semaphore.h>     //信号
5 X8 J8 p1 B8 [, v6 I' [#include <sys/types.h>     //消息对列
" `6 N. O( |/ P  o3 E#include <sys/ipc.h>       //消息队列
- D' U4 ]2 h8 g+ I#include <sys/msg.h>       //消息队列
! ~* ^0 u- N1 C6 C+ t#include <sys/select.h>4 `1 J2 l7 r' i/ B
#include <sys/syscall.h>3 Z4 W: b! \$ l' g2 i
#include <sys/stat.h>
3 y8 B9 K6 H8 k9 |. E; y8 w; n#include <sys/mman.h>
4 V0 B" x5 c- Q8 `#define msleep(x) usleep(1000*x)
; ^, g) i$ S( A) h  s6 Z% V7 J5 g1 }( G+ F3 @
int main()
' F- p' I$ W- |8 s# F/ p& S2 A{
7 P6 }" _! L) {4 r7 L    //MCBSP,ARM与AMBE2000交互设备; R6 y8 O+ \1 P* k* V) k9 C4 H
int fd;
/ ~6 }! N) Y/ T unsigned short data_write = 0x5555;
. E' ?- Z) M: \2 S8 N unsigned short data_read = 0x00;" U( D3 n1 M( r: z" a$ [9 e
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);9 }  D' j. V, h4 M+ l7 m
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 i; s7 d# J7 v3 z+ l/ U8 G    & {* [# N7 L( O1 G. o5 }
  if(fd < 0)/ q7 e: x0 M# p; x9 f* Z
  {
. a, a0 {. _$ _: I" ~$ m     perror("open failed\n");. q* O0 n5 _2 U: L: g
     return -1;7 w! U, ]1 p5 _* B: X- ~
  }7 c$ N% W7 ]7 J4 k+ b
  
# l) L5 M  _0 W  while(1)$ P5 l4 T3 o* P; K$ O/ c% R& X
  {0 ^" H8 l7 z! c6 x$ u. X* \6 B
   
( t5 z  s- G) m4 b, W* d9 L   //AMBE2000每次读写是24个字为一帧! K+ X5 ], Q0 y9 q: h
   //写数据时将数据在底层存储起来,等到中断的时候再发送/ ?! w0 E# ], ]
   //AMBE2000输入数据是以0x13EC开头的
& O5 N0 M2 Q# ]  K   write(fd,&data_write,sizeof(unsigned short));- y3 u& f0 Z2 s$ L+ p" K
   ' v3 z7 k% J2 q7 R
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
$ n! ]( a( Z: W9 h/ g   read(fd,&data_read,sizeof(unsigned short));% |% a, L+ [/ t) J8 V5 J
   
* I. @. ~4 N4 x0 ?+ b2 }* s   if(data_read == 0x13Ec)/ M( Q# ^! a+ A$ e; O' w, h
   {6 }- C* }8 G9 \0 A) K
   3 T+ t6 W# v5 O- s9 h$ \3 e7 ^; j  D
    printf("data_read = %x\n",data_read);- M8 Y" Z* s# N& U8 x- c3 S
   }' y& Y; P. E9 u: g4 u6 u* D2 n
   8 P% V6 w& Q2 x; p* D
   msleep(10);. Q2 x# s9 }" ]
  
5 r( J' E. E4 D8 t6 E  /*8 a, d6 G' |! K. a  g
   ioctl(fd,1);   " h9 p: V+ V1 t% {# l# Z$ `) P
sleep(1);, N5 x, G8 Q1 n
ioctl(fd,0);
  k9 N5 @9 }7 ] sleep(1);
- l3 O7 I' _2 s" r */
6 b# l* }& ?; v+ d' {8 \2 C  }   5 o4 n, U  T/ G! F' X8 D
return 0;
. a# s$ P1 U" w- Z; z! ?1 z 6 }% i- m% H7 ~0 p+ Y  f8 M! a( P
}
# n$ a) S8 F  D4 `0 K5 E! P$ K2 O0 c+ M
. U* b* z, l6 X; g2 h6 a多谢各位指教,谢谢! 急
+ n# O- c8 W2 Y& d4 U
" T/ f  ]0 ~% E* f3 L) k* L
; p: d" P- }( e9 }' S+ x1 Q4 I) l$ \' u0 p* {+ h# n5 @

! t/ D2 [! \+ i" I( f' D- {3 I
8 k; Q; y: ~2 V: [. H0 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 19:13 , Processed in 0.055133 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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