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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; _* x8 v6 L7 y- L1 B  x
/*
  a; M& ?; k( w( K" j% @ * Copyright (C) 2009 Texas Instruments Inc2 A/ G9 E, g, F+ p% F' P+ D
*7 k5 }, u9 {2 }
* This program is free software; you can redistribute it and/or modify6 u) b8 x* z% G7 e3 }
* it under the terms of the GNU General Public License as published by' q5 G" s- z. z& u) D
* the Free Software Foundation; either version 2 of the License, or% i- f( C5 \# A1 k' @
* (at your option)any later version.
$ c0 c. w: f5 M *8 l% D. d; `1 E0 u
* This program is distributed in the hope that it will be useful,8 i8 u6 p, e5 I7 c
* but WITHOUT ANY WARRANTY; without even the implied warranty of8 K3 K( W' J5 t# w; d
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, r9 [6 O7 I4 g( D0 _2 A* K" p
* GNU General Public License for more details.
" y7 P' j' b+ t) [ *
2 ~' H, T# @2 h9 ^; n * You should have received a copy of the GNU General Public License
# y' Q7 ^' @6 s% }3 b6 v * along with this program; if not, write to the Free Software; N3 |1 ]! g$ d0 Z0 X- P# k9 J
* Foundati, _7 t: j! \/ @) v2 S
*/
1 W5 P2 U6 b+ Q/ f5 i; D# r; F#include <linux/module.h>
0 r9 O2 A! B4 Y1 {#include <linux/init.h>
0 b* T* k5 ]( t* ^( n  k0 e1 u" }#include <linux/errno.h>4 z: o4 w4 ^, ~5 Y& ^4 b
#include <linux/types.h>
  D& \8 i# `/ a* S' E( d#include <linux/interrupt.h>$ R+ M$ W# x) c' z( Q8 [- w
#include <linux/io.h>
0 ]% N; P8 V, k7 R/ R#include <linux/sysctl.h>
0 D" ^; h' ]5 J( X! H#include <linux/mm.h>; E! e0 s' c* s7 T: L+ H
#include <linux/delay.h>
- I' s( n5 ^5 c5 H1 b$ b#include<linux/kernel.h>
) ?& k- e: Y5 S1 E' n! H0 m8 Y#include<linux/fs.h>
/ e2 l) }' V0 O& p#include<linux/ioctl.h>1 P7 z! K/ N7 m& h' d8 t) s
#include<linux/cdev.h>4 G+ P1 W/ k9 E( \9 z. G
#include<linux/kdev_t.h>5 Q8 D1 `- b& l  p7 W
#include<linux/gpio.h>
, o0 g& O: W, b' J* Z5 t% u3 u#include <mach/hardware.h>
7 g/ [% A. |' `: g3 e#include <mach/irqs.h># h+ D. f" q2 C( _  A$ a' M

2 y, W/ d6 ]1 N" r#include <asm/mach-types.h>
% h6 P5 F9 D' U. E; o#include <asm/mach/arch.h>
. ?: T* s7 k. @3 @#include <mach/da8xx.h>
7 T+ T  ^6 K% H8 U4 b% ^8 B; Q! N#define  SYSCFG_BASE   0x01c14000
8 ]4 Q' n& p  O% u" n2 X7 _#define  PINMUX1_OFFSET   0x124
( t7 ^$ ^/ ^5 \6 X  h% B#define  PINMUX18_OFFSET  0x168 , x1 M6 w1 v1 V$ s% q4 B2 g
#define  PINMUX19_OFFSET  0x16c
5 q3 H- o7 k# b9 b#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR9 B4 D& X% [4 S; L' p* A
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ M/ F! I4 d3 M2 `. M6 c#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR# w- w( F  i' z9 `$ |
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% ]( y; A, M! u7 w
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR. ]& I3 Q6 s- `9 i
                            3 U; @2 @( A/ ]7 m3 R, w6 m+ T
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR$ Y! `6 |* H! a
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
; E9 p0 o7 h0 t% d9 P1 O//PSC
3 R5 |! ?4 y5 K3 n6 d6 a, i% P2 N#define  PTCMD_ADDR   0x01E27120  
+ n3 e# c* W* W. H" ?" O! A#define  MDCTL15_ADDR 0x01E27A3C# j& u! L; ~3 e0 F: ?- X- s7 F
#define  PDCTL1_ADDR  0x01E27304% V+ `8 x* ?+ W* o; \' k5 F. f
//GPIO8 direction: z0 k( W! N0 U. H2 R5 \+ o
#define GPIO8_DIRECT  0x01E260B0
( q# ~+ @  h  {#define GPIO8_OUT     0x01E260B4
! |. L! f. v8 D# C$ I# }#define GPIO8_IN     0x01E260C0" r2 ?3 n! ~3 Y" Z' a
! V7 ]2 u# E4 F. j
//#define MCBSP1_RINT    99              
" T5 j" q, A. B& E; `8 S//#define MCBSP1_XINT    100  2 ]4 A6 G. A0 o( h' ]4 ]( o4 i' A
static int MCBSP_MAJOR=239;8 x# l' d4 P! G" t! b  o
static int MCBSP_MINOR=0;
' Y! ~9 v0 C3 _static int count =1;7 J. p$ [4 w) a

0 H5 E- b1 S- j. R  L6 o$ K9 V#define MCBSP_NAME  "MCBSP-device"
2 Z5 a; `' B7 Z# o
9 P) g/ E; p! f$ k  G# tstatic struct cdev *mcbsp_cdev;
+ C5 I& I9 b7 A- Y' {8 Xstatic struct class *mcbsp_class;
0 R, I' W' C0 Y% t  u# [static dev_t mcbsp_dev;; q- i& m. p7 r1 [/ |9 n: s
unsigned int DRR_data;- n7 s' t! ^0 I( t
unsigned int DXR_data;* @& |: a% }2 u3 s, e
static int mcbsp_open(struct inode *inode,struct file *file)4 y9 Y0 @! B6 R" y
{' R' [* V2 e: `& T2 d' C2 `
   
# O- H; K" H8 }9 p   //interrupt enable,initialized
: T7 f4 r1 ?% \" D- P0 L   unsigned int temp;2 k7 d3 S; R2 z5 w3 r; T" ]1 s- \
   //SLEEP_EN(GPIO8[10])---0
; E' t1 |0 g/ e6 E   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ P2 b. f: x! W. l; f0 g1 w   temp=temp&(~0x00000400);
# ?7 X3 q6 b) ^; t9 s   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 h- P5 P8 u0 T$ n  //RESETn(GPIO8[8])----0----1
' ~: o& Y6 k0 X# z6 A   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
! E3 @  {) {/ w# i   temp=temp&(~0x00000100);
' G- b# m7 C6 V7 N+ ?: ^   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
  C$ Q' k' Z! a1 x, z   udelay(100);. c  ~- T# p" {% }+ X3 B  B
   temp=temp| 0x00000100;
: t# X6 |; u- W. O. S+ ^$ m   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& M# q2 Q4 I$ ~0 J+ G0 k   udelay(100);
6 Y3 S- g$ O* Y  j7 }/ ~  h   printk("open success!\n");+ ]# U# @. M2 Y9 Z3 r$ M
   return 0;
1 f' h- M! n; D( l}! O- S2 w1 y; o; u3 i$ V( |( S$ I

- w9 L8 W3 x  K/ L- }static int mcbsp_release(struct inode *inode,struct file *file)
# m7 h( N( M$ s) X{
" y0 }- i: Y. x   printk("release success!\n");, J! j- H' D) U' ~4 d) L6 I
   return 0;; @+ |* I* `( R: g0 ~
}1 H( t* m( n! B5 t6 @+ k( o6 X1 C

- w: l4 ^  \$ I( R. H0 @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* v- ^9 [& a. f- h5 G' N  F
{
+ F4 i6 C% p1 i+ `    copy_from_user(&DXR_data,buf,len);! \- D( B7 [" |6 v
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       / @! m% Y) E% q
    return 0;6 B" P' X. P! ?5 z0 E  }
1 N2 u. T( Z2 X$ p
}
+ I6 ?+ X+ H, N* P# z; q/ K( a: I/ L1 r5 g# v& G: I% X
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" H, y4 f, S' v9 C4 M% ?' B# g{ ' I) ^  Z( s) h  F9 ^3 @" Z
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 x* Z) x3 l8 d- r% a; d   copy_to_user(buf,&DRR_data,len); & G4 {, |0 H# S  _) L& k: z6 v) O
   return 0;
  I/ O6 u3 |- O/ ~}; M1 p" `- G! L0 [
' @7 _* h# _. P

* a& _5 d; o1 y) G8 ustatic struct  file_operations mcbsp_fops=
. ~. S+ W1 ^0 G9 @$ t{
) K  H1 V( Y: b4 @( Z4 i; m   .owner=THIS_MODULE,
5 G& h3 u. a, S+ e   .open=mcbsp_open,; m8 k/ G& P3 b0 [% _
   .release=mcbsp_release,
2 I5 D+ U0 N9 u# q2 M   .write=mcbsp_write,) i; X- W7 {& D2 `9 A
   .read=mcbsp_read,
+ N4 D+ k# G  i$ j1 J, X- W};
. {8 n* }2 P/ g3 Z6 i3 D, S7 Xstatic int __init MCBSP_init(void)
$ a: K# h- [- t' B# ^$ e9 n- d. [{' R# O6 ]- [" E5 [; B6 h5 E# B
   int ret;
8 @! Y. ?2 h5 f+ {9 k0 q   unsigned  int   PINMUX1_REG_old;/ U' X+ g9 V3 g) h) u7 u; j+ t! o
   unsigned  int   PINMUX18_REG_old;" B" d; C5 a; |& [2 w5 }
   unsigned  int   PINMUX19_REG_old;* w3 `  }' R- i' l
   unsigned  int   temp;  
* c) E# D0 |0 D) A3 f* U   if(MCBSP_MAJOR)  n4 n* v! h, {. {" ?
   {7 S  Z8 m8 i2 {! t3 H
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ y0 j9 m' j6 ?5 R      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" E$ {( o# K- j   }( _8 Q1 d" L9 q; R/ h' J: I# F3 x
   else
" d5 V" g/ N5 T$ ]   {- t) E" \8 _+ [$ q
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 J$ @! F7 y) i8 ~# O
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# g, e2 p) ^4 S/ K( g: T3 i, p0 M$ r
   }* E2 N; o( Z% O  _
   + C+ d: {  a$ y) @
   if(ret<0)
; w- j; O; E: K5 e# h% a5 O- ?! n5 E   {
' P9 D/ P6 w( w" M, K      printk(KERN_ERR "register chrdev fail!");
5 }) V( Y2 @4 \+ F- S  `      return -1;. O) ?' O9 M/ l8 Q' W! r
   }, o9 {  H2 s2 Z, |2 T, \4 J
   " n2 o/ _  b4 W! k$ Q( N/ c( M
   mcbsp_cdev=cdev_alloc();) d& u7 a# J! Z4 C% l6 e6 ~
   
, X; x7 h) g  ?2 X- Z   if(mcbsp_cdev!=NULL)( x5 r1 H4 P" ]5 q
   {
: S+ ]5 o8 [- c! t4 b1 j0 M% N. s      cdev_init(mcbsp_cdev,&mcbsp_fops);
0 X( T) X$ }7 }! O! ?* P# m4 L% J( k      mcbsp_cdev->ops=&mcbsp_fops;
- c+ V; m+ Y4 S1 t  M      mcbsp_cdev->owner=THIS_MODULE;  ^9 F* ?. f/ Q1 s1 o
      6 ^7 l) U2 G6 i4 O
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
5 Y. b: S5 g. N# o          printk(KERN_ERR "register cdev fail!");
+ x0 y" \, K1 R      else! t/ b$ r/ k; c7 D* T% Y2 m$ J
          printk(KERN_ERR "register success!\n");( a4 N9 j% \# B, U
   }3 k5 `4 R" i, h$ S" [) x+ E
   else
& ^, w$ W3 V, _: ]   {6 C! u$ G* h. x8 q
      printk(KERN_ERR "register cdev err!");
# {5 Y3 U1 b6 p. }' d/ R$ l* s      return -1;0 D3 i2 H. o. M8 |* Y) Y5 F
   }
( m# Z) \3 V. M6 p: ~   
& m- f7 f7 N' r# P- L  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
$ d; s: e8 Y- r$ {   if(IS_ERR(mcbsp_class))& z# C( o+ K. y
   {9 Z; R/ h4 R& e9 i8 \
      printk(KERN_ERR "register class err!");
& P6 v' }" b; Q+ y1 U! O   return -1;1 D( s7 ]2 D- n/ k* O9 C# R
   }
) U* I6 I/ A# I6 @- ?5 P3 N   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 `4 c, W+ Y+ E, g2 H, j, L  ]

$ ]3 e2 ?4 P5 G   //PSC
3 p1 A5 V/ O$ {% C8 o0 y   //add Enable MCBSP& r9 k) [8 W# w% U& p6 H8 |
   //test) x& e% H. j0 s# D) d. Q  o9 v
   temp = 0x80000003;
4 |1 y* n" i# [. _* @% H, `   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& l8 W9 a6 A4 r6 j& k) _   temp = 0x00000003;& `  Y: {0 b4 K* c7 d, O5 k& O
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& P; u3 f% u4 G# c8 J; p   l! X5 `/ m! f; @
   temp = 0x001FF201;
& z+ p/ ]2 y6 ?1 O3 V   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% `5 L( K& s9 s$ B6 K   
7 i: A' l. V& k, G7 g! d* W8 e) _2 h   //PINMUX  8 }0 Y& c* Z. V6 ?/ c2 e
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- F0 {5 F; N4 g4 H7 V   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; S+ t8 K7 v3 J0 T
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
, [" t4 I" u" q% I" Y4 j" @   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; `; ]+ ]( [! k6 `. ]9 r7 }   
( |$ ]3 S4 j$ K/ O* G# k) c   //SLEEP_EN,EPR,L138_SHK1,L138_RC
  x5 r' \) E# M& I- M6 c   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ' u' {: j! E- [% k
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
( ~: V/ ]9 o9 e% P( R! f0 x   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ ~1 }4 i- O2 F6 h8 Z2 l

7 Z; y/ K! ?9 C( ^5 O( M7 q   //RESETn,L138_SHK2& u4 r* Y  }! {8 E1 w; E9 E
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & e- @. Q5 x; y; O/ `
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   % T8 ~; q/ `+ R( l
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! P8 N0 h; F+ K. p  @5 I   {* Q8 [, U. r, P' |4 l$ o. b
( r+ g  U2 R% M
  //SPCR Register
* ^- ]( I) O" X3 U/ k% }  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
, k0 Q: {% a5 p: x$ @; d3 ~  temp = 0x03000000;//(DLB=0)
7 B4 P$ J; k& |, d8 g# ] // temp = 0x03008000;//(DLB=1)
1 H+ M+ {* i  w5 I& H; I$ N  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset4 o" H1 q" r8 |( D# v; k
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% p2 Z' o. L1 q0 k0 _  printk("temp=%x\n",temp);
. Z5 X3 z" G  Y! T. q7 t/ w4 G" Y
0 a* P# e: ]: }' |# ^/ g1 b   //PCR Register
4 i* r& j, A) j3 V   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
8 s, x& z& h! {4 r, c  // temp = 0x00000F0F;& u* r4 Y( d1 @  F
  temp = 0x00000B0F;
# L& n) z" q2 g& v% ^* B  ^8 r  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ ?" c/ F; u/ f) k
  temp = readl(IO_ADDRESS(PCR_ADDR));
* \) V7 O2 A: z& P4 @( ?* L1 e  printk("temp=%x\n",temp);  
0 \, H, c; e/ O2 I* F: M9 {. }7 a   //SRGR Register
' l/ F4 [2 a7 o$ }; [   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; H4 W8 J6 J" N0 Y+ V, @0 s6 x
//temp = 0x301F000B;; E) R4 t/ z: ]! G5 n
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
8 ~7 H( O' i4 t  temp = readl(IO_ADDRESS(SRGR_ADDR));
. g  R! }/ b2 v! ~  printk("temp=%x\n",temp);
' w0 V" H) Z2 ^5 ?& ~5 ~$ E   //RCR3 O. [4 K- {% @! J' j
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
% f- B# N5 y0 H3 J4 b4 Z' v) c   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
0 m" `, C' @0 L1 C* d   temp = 0x00440040;
7 c0 G% H8 `0 h% w% Z# _* I   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   - M0 O. M  ^4 R- B. R* ]$ r
   temp = readl(IO_ADDRESS(RCR_ADDR));
* j# p5 k' n2 M' j- |/ ^; Z   printk("temp=%x\n",temp);' \% x( o3 [/ o
   //XCR
) C3 [& s2 m% i9 b2 ~  C   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' c$ \) B) ^: y! v3 Z" q4 R) H
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
$ P. d% B) [9 K& i8 y9 i$ t   temp = 0x00440040;3 n! Y8 O3 x+ F- g( X$ X7 E! c
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   5 C1 s0 _3 p, }$ u+ E
   temp = readl(IO_ADDRESS(XCR_ADDR));
2 u! H5 W1 f( P   printk("temp=%x\n",temp);
9 u- t3 P) y" [, s# }( |, s, c  udelay(100);
& O/ q9 M$ v1 i) b" O  //SPCR Register
% [5 W# v1 {0 X% B" |  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. ]; m/ s3 Y2 V8 A% l  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- M. g* \& s$ @# Z/ t$ Z0 W  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled  D4 R1 n+ l% P5 Q" _5 O- B* M
  temp = readl(IO_ADDRESS(SPCR_ADDR));7 b. z6 b+ p& o" G$ I; T
  printk("temp=%x\n",temp);
2 b8 w) G. V! z6 ?2 U  udelay(100);
2 O2 _- w) z2 t0 U  L9 t
1 m8 {8 I; C/ J, R( r! @  //set GPIO direction8 H. S, R5 T: T# R) ^' [
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* u4 S" z9 A* [- o9 x; \   temp = temp | 0x00000100;//EPR----input
% p2 K" b- g& z- P# c) \- R   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( S* L3 S6 ~& \' `! E! S& P   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 d8 v3 v4 m- t& O4 {4 m1 } : M8 F/ S$ G0 H: r
   return 0;
( Q- p  _" [4 d6 ?& G  O}
, G% v# p% e. jstatic void __exit MCBSP_exit(void)
9 ]2 O) U" P+ S: S{6 u! V: v" x; F, h3 s* c! ]( w
   printk("mcbsp chrdev exit!\n");; b! F4 }. [) A- C) A. \- W4 A- u* @
   cdev_del(mcbsp_cdev);
4 N& ]( Z: }( [0 j& b   unregister_chrdev_region(mcbsp_dev,count);( X# F" y/ K! N( S/ z6 @8 U$ X
   device_destroy(mcbsp_class,mcbsp_dev);" Q7 x% i% P) n3 v2 X! P
   class_destroy(mcbsp_class);" S* ~3 g5 Y, A# z/ g/ |" m4 B+ H
}
+ l8 o* w+ G/ g! Cmodule_init(MCBSP_init);
8 Y2 F1 B! p# z+ V; C! g, ~! C, wmodule_exit(MCBSP_exit);
4 ]3 G: ~0 p( S6 `3 S& m# t+ }+ X  j
MODULE_LICENSE("GPL");- h% k( C3 @/ Z, n' P* t5 J) a# ]
6 R7 ]9 X" Q" }, F% [1 g0 T
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* R6 j' Q3 @( h/ c
我的应用层的测试程序如下
+ G# W/ f& B/ g) U9 U#include <stdio.h>1 x" D; X* L# r$ H3 e
#include <string.h>6 p' ^; w& N$ o9 e) y
#include <fcntl.h>( `! G* \6 c+ r! z
#include <unistd.h>
6 l& }% O) Y4 p, E#include <signal.h>
3 X$ l4 _! E" ]' O- U; L* e#include <pthread.h>       //线程
% A1 p8 _* c  n; \  X/ U#include <stdlib.h>
: K! M( w% z3 F) W* t+ f0 e& g#include <pcap.h>          //捕获网口数据" j( E- g- H9 a0 R
#include <semaphore.h>     //信号
0 X: `' ~% n: c5 C4 m9 V/ H0 v#include <sys/types.h>     //消息对列
, I# ]* m7 b  x#include <sys/ipc.h>       //消息队列
4 K; I' I/ }8 l* W5 g#include <sys/msg.h>       //消息队列, o; P7 T2 O& i6 k2 k& p
#include <sys/select.h>' N7 S  `( K& ^& C# i/ L. {) ~8 a
#include <sys/syscall.h>. s8 r: _1 u" K2 L
#include <sys/stat.h>
+ b! F" G7 u: v. t% B( W#include <sys/mman.h># Y2 S# P# `8 }7 v3 d
#define msleep(x) usleep(1000*x)
6 t- y0 Y2 ?9 F! b- Y: @; `: b. c/ E# H" p7 E- ]) d
int main()
1 Z1 `: Y7 ~' B{
( D, O1 A$ r! t$ e3 q5 `$ z% B    //MCBSP,ARM与AMBE2000交互设备1 _& d/ c$ @/ a9 V
int fd;9 p4 J& P( s# B+ ~& \$ ^! e6 [
unsigned short data_write = 0x5555;
/ {% T% B* m" r3 J unsigned short data_read = 0x00;$ L/ e/ {- T2 v! G! {
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);0 ~4 ?' H0 u/ z, Y
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 E( }9 v9 r# R( X; r: u! u    # i! K  C/ ]8 C% Y; U" ?
  if(fd < 0). p7 ~$ @( p  u) S# y6 G
  {, R) X) W, U+ w1 A
     perror("open failed\n");9 F( z8 T- {2 Q" s  m
     return -1;  M/ ]% p; w9 b; ^( c/ d7 \' S+ r6 l
  }
3 y8 x+ c, p; z1 R  
) b/ C( b0 e$ Q8 W. u! K  A  while(1)6 j1 g: s1 ^  ~/ x3 i/ @
  {
  Z4 i+ x; t2 N   
) r7 s, u( n  T7 Y   //AMBE2000每次读写是24个字为一帧1 @1 f) F1 v' Q1 ~! d- y# a
   //写数据时将数据在底层存储起来,等到中断的时候再发送- S  E7 y$ T% _% {$ S6 m$ ~
   //AMBE2000输入数据是以0x13EC开头的" K7 D2 C& Q  k, d
   write(fd,&data_write,sizeof(unsigned short));- y2 R8 M+ E. x6 ]9 M6 Z8 b( }" k
   
* u$ R9 |/ I8 l8 g   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & ^- z  d) Z3 B
   read(fd,&data_read,sizeof(unsigned short));
- k5 X" ^$ H( `+ s* Q! p   
% n1 g5 T/ z& z+ y& o   if(data_read == 0x13Ec)
7 q% Q8 b0 x6 w! v8 \( C" k1 o, v   {
& e8 }( O  v' u; Z' ~   
2 G/ h: N, ?1 B2 _    printf("data_read = %x\n",data_read);
1 S: t, P% Z; U  ?   }) n# }) i) L/ ]3 W9 M) `, u
   
4 F* ^6 @$ d1 ^: N3 H% }   msleep(10);
5 v) y7 b% f: u" p" {+ }' c( A  ' p% `% m$ H" B' w) W$ J
  /*5 r. Z: e8 {  N( X: E, E( u
   ioctl(fd,1);   
0 O- G7 z8 `) Z! y+ r sleep(1);
) Z& g' |4 y9 k, n, _6 i ioctl(fd,0);0 Y1 ~! H" v8 m$ o  M/ W
sleep(1);) }! ~# G2 L- f: X2 r, S/ T
*/ - c% v0 t5 c" q: m! [1 R' c6 O& m
  }   $ u7 t7 N0 r# A1 W
return 0;
' H8 L" l) K9 P" k# T" G2 g# O
; X$ k* x1 u, S) S" ~}
1 }8 H1 W& F+ |* w8 c+ t( b& x5 H! M  \7 s8 Y
多谢各位指教,谢谢! 急/ O1 M7 h) w0 v: Y, D5 |! W8 u8 M

7 c; t+ o" P- L0 u" e+ u" \, P/ H6 M: q; m2 r* L
" u  a3 g& U9 ~8 |3 P

$ z7 `1 D+ A) I7 `$ Y- z0 J+ h( f. W9 V0 E- Z5 y" \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-18 06:00 , Processed in 0.048207 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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