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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( G, Y9 `$ @, |2 U
/*0 A; R/ B+ ~6 P' k+ Z
* Copyright (C) 2009 Texas Instruments Inc
' d& E; F# @0 }: y, o *
& c- t1 v0 ^! r * This program is free software; you can redistribute it and/or modify7 e+ ]/ X0 U" {. _: p5 u, e# T  H4 `
* it under the terms of the GNU General Public License as published by+ H4 \4 r1 n+ d% A  p
* the Free Software Foundation; either version 2 of the License, or
' Z* X' e% H  y# E' g3 R * (at your option)any later version.. ?2 f: F! C4 V2 d' J. B
*
; g/ }% F/ @6 e. C+ P* G  p * This program is distributed in the hope that it will be useful,
! d" W9 K0 G( T5 F! P5 Z * but WITHOUT ANY WARRANTY; without even the implied warranty of+ B1 J* R3 q9 i9 o/ H
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; `8 ]/ [! w$ T * GNU General Public License for more details.; T: K! U# l1 z; V9 N+ ~
*
6 j& ?. W) ]! y7 ?% j * You should have received a copy of the GNU General Public License( f$ S! W9 q8 q* A* I: V4 G' N
* along with this program; if not, write to the Free Software
2 @2 {( E: g! a2 f3 t$ y * Foundati
; }  ]) k6 d* Z( ]* N. e! Z*/
% e$ u. Z8 d" d& V#include <linux/module.h>
! C4 @& s; l6 ~& |2 |7 X4 i#include <linux/init.h>
7 E# u% N2 \9 c#include <linux/errno.h>( y' A+ T- A/ ~) q
#include <linux/types.h>
( a$ P) }8 D6 d- L0 l% h3 X#include <linux/interrupt.h>2 r# j2 \/ N2 f* e
#include <linux/io.h>- n! I/ m" h1 x1 ?, f
#include <linux/sysctl.h>; K4 x- ^# U  ?, M6 L
#include <linux/mm.h>
9 Y  w" N0 I; O$ x7 O#include <linux/delay.h>) c: n* f3 B# \6 o! j' C% x! D
#include<linux/kernel.h>( \3 H5 v0 C  ?4 `! h+ w
#include<linux/fs.h>
% a, }& a# H8 f* i, @* O" g#include<linux/ioctl.h>0 j. Y$ e" ~. E/ p2 k7 `) j
#include<linux/cdev.h>
9 F6 L/ Q8 c) ~' t4 g5 \#include<linux/kdev_t.h>
# l. B3 M5 b' b* T. z#include<linux/gpio.h>
3 v  `8 C+ _$ p#include <mach/hardware.h>  `- K  V8 A5 W1 s0 D
#include <mach/irqs.h>
. a6 {; c. f4 n- q7 r
& O2 v% J1 l) d2 K0 w' T3 c! x, ^#include <asm/mach-types.h>
& p3 T4 x# f  @) H* m8 m* `#include <asm/mach/arch.h>
* b* ^* d% @3 p' X" m$ G0 E+ A8 F#include <mach/da8xx.h>
2 n3 v7 D8 z6 y$ F8 _) i#define  SYSCFG_BASE   0x01c14000
" J( C9 G/ a2 h' t/ {7 n8 t#define  PINMUX1_OFFSET   0x124
2 G) d9 D! A: Y# M* p#define  PINMUX18_OFFSET  0x168
- m  j* r$ P% m* F% z0 e% `#define  PINMUX19_OFFSET  0x16c
' R4 T9 X% D5 |" Y- c. h! Q. S#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR# @" c! `6 H+ O- g
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
* e( R, z; C5 F' n0 F#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR3 O/ x; A, {' a8 M+ ]9 A. [
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
4 u1 l1 D) ]$ _5 N& c5 Z#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR  H+ S* k; |$ |/ h
                            0 |; O  R3 f% K2 [$ ^
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% j& d% s6 [$ q
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 \& I( I7 K" [$ V//PSC4 G9 V  ^5 g. @* f
#define  PTCMD_ADDR   0x01E27120  " G4 j5 T2 v; }3 [
#define  MDCTL15_ADDR 0x01E27A3C
4 L+ t! v3 G8 `% G2 q* G#define  PDCTL1_ADDR  0x01E27304
4 O+ F" H! G( x, D5 m5 }5 @//GPIO8 direction/ L" S, U# U+ K, q* D. J# i
#define GPIO8_DIRECT  0x01E260B0# V8 m; a5 S' `+ O8 \+ u4 x
#define GPIO8_OUT     0x01E260B4
5 t5 P3 j& H, }7 R#define GPIO8_IN     0x01E260C0/ m$ T9 _+ U* q3 w

$ J# m+ s0 \' A8 A  r7 `6 r% u6 z//#define MCBSP1_RINT    99              
' R/ h+ a. m4 ?  K0 T( m% Q//#define MCBSP1_XINT    100  " r/ m1 k. m+ l/ {" V7 A$ A/ a% t
static int MCBSP_MAJOR=239;+ a; R9 o. R/ ?3 x
static int MCBSP_MINOR=0;& V/ w4 P, n2 |$ E
static int count =1;
, B; K  J% A' M5 _$ }- D  r6 d% m1 Q! u# v- ]  C
#define MCBSP_NAME  "MCBSP-device"
+ U$ z- ~, n% L: J' O4 B! B, [8 t
static struct cdev *mcbsp_cdev;
, U4 C8 _' a9 k6 ?" m. @2 W( rstatic struct class *mcbsp_class;& a' `  D/ ]* G% ]3 u2 H
static dev_t mcbsp_dev;% l7 Z% q- {% A7 w) c* }
unsigned int DRR_data;! i! v* _, i! m
unsigned int DXR_data;9 v- X. d& ]+ J8 M" y9 {1 i
static int mcbsp_open(struct inode *inode,struct file *file)
9 i+ V- R' f& b& i! D. e5 ^  S{- f( W) V+ S% \, g+ R- Q1 g6 k
   
  E. X/ \9 p! \) U6 p- r   //interrupt enable,initialized
# F: y4 C* L& }; I9 E   unsigned int temp;
, h% L0 P( R: w& A- h5 O1 d5 o   //SLEEP_EN(GPIO8[10])---0# c1 U- p1 p7 d1 `  q% R
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ k# q0 }* q" {' U6 W1 c1 r8 E3 j8 i
   temp=temp&(~0x00000400);- ~1 ~6 \# o; G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
% y! P7 D* ]2 V  //RESETn(GPIO8[8])----0----1
* O& }8 z' u! _( c   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 N6 i% T( y' j   temp=temp&(~0x00000100);  B! E$ X4 G, [- a1 n" y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! l5 R* B' M7 g
   udelay(100);  V1 {  N5 ^6 U: y! T8 c" I$ D
   temp=temp| 0x00000100;
9 N3 [: [& |* Z# y" l. h3 }( u) E   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& P+ \9 u& z) B& R7 j( w   udelay(100);% |  l/ M. J0 h
   printk("open success!\n");
& i* o, U7 F) ~   return 0;4 |/ W( a7 b$ D$ j5 {- V
}8 b1 k4 ~! ~& `: L( v# m5 t) B
& \: r+ F- M) G& [5 m9 l2 I0 _
static int mcbsp_release(struct inode *inode,struct file *file)
( [$ G9 k6 C; h) H{  I! T0 Y: A2 }& g* L+ n6 v7 K
   printk("release success!\n");
2 ]. L& y* X) l8 g   return 0;
' i+ b1 P1 }- d4 ?}
0 ^' w3 |2 H: r. Z  w3 n3 s9 p8 v+ X, d( y7 u5 p
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 P+ j9 i9 P, P{5 D; b, C, U4 p: F, p  x) O
    copy_from_user(&DXR_data,buf,len);2 |+ `, S/ l8 F- x
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ( k0 I% e- |2 E8 [& i: ?" O
    return 0;
& V/ V. A- L4 O# e2 y , a% i  d8 s, d7 z5 @
}
- s" e9 L6 B& r0 J% m8 W. x5 M
3 ?. k$ N5 V7 Qstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 D7 M! M& v3 {5 O! u0 R) E3 T3 k/ r
{ % r, B) U/ ~; I3 ~
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. S  F  U- ~- L+ F   copy_to_user(buf,&DRR_data,len);
2 A, ?7 b! s! Z& L- O4 U& @! T   return 0;
( H* a# b+ Z/ H4 s- y0 R( i% i}
5 R7 C5 u9 z/ \. \5 }- D( B, y1 T( e! b7 h( H. E1 S% O8 S
4 l8 N) ~& a9 f3 v  t$ K
static struct  file_operations mcbsp_fops=7 N* |+ @' @2 W( m9 F- i7 {
{
+ R& r0 m; G: U9 U- {   .owner=THIS_MODULE,3 p( ?4 }" w) L$ l3 V) c! N  b8 k
   .open=mcbsp_open,
/ f& F- ^: k! i( ~/ F, `* @   .release=mcbsp_release,  G/ p% u  Y/ ]/ y  b$ L' f' U
   .write=mcbsp_write,
: R, R3 u/ d, Y: J" k% p1 X  i   .read=mcbsp_read,6 L# ?  R( q( p
};. H" s. H0 v: l$ G* X
static int __init MCBSP_init(void)
2 M. |. d/ i# \: s( ^3 |{/ H* J$ O9 _& p, n, ~) l! p& h
   int ret;7 Q# v+ H0 i0 v& X& T1 z
   unsigned  int   PINMUX1_REG_old;; ~8 n" [0 Z: J1 P
   unsigned  int   PINMUX18_REG_old;
& ^+ M: g5 _# ~   unsigned  int   PINMUX19_REG_old;" R, `- `4 d, `5 t+ T( k; W% P; c
   unsigned  int   temp;  / g) I/ r- l) b3 y
   if(MCBSP_MAJOR)
! ?- U, B2 G/ R6 R7 M8 r9 ?   {
5 R' T; a6 C$ B$ J5 q      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ w% e/ F8 D* s$ @3 c' Z+ t4 }( n      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
. }- F% m2 P: `   }; O! c7 B# \: g, I" \7 Y8 S
   else  R9 a9 K1 B; d* G) U$ w) u# V. K
   {
0 f4 I* Q, s. _1 N      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) R) ]' C4 o/ ?4 l% i9 K1 V- V
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; P# d6 [" U7 p+ m   }/ v( }' }$ A% H7 _  L) ^  O% [
   
7 f1 |0 T  H6 a4 t   if(ret<0)
' J1 ], o0 W& a   {, \! Q" n6 h4 y' V0 y+ ^# p
      printk(KERN_ERR "register chrdev fail!");/ U! X4 b- b6 E
      return -1;2 x9 g) d+ N+ X* n6 M
   }" m5 T' k+ E& I5 M
   5 j( P& k% o& P: u
   mcbsp_cdev=cdev_alloc();
. ~+ ?$ A5 G5 n: j8 n: E; _   
' f% K  F# v/ \5 Z; l" {  m% T" t   if(mcbsp_cdev!=NULL): F2 ~$ p$ Y, s9 ]: m6 O; s7 ^, z2 f
   {1 @9 t6 b4 a9 ~( t
      cdev_init(mcbsp_cdev,&mcbsp_fops);
& B3 K5 b4 W. _- y$ I2 ~; l, U8 ?2 M& j      mcbsp_cdev->ops=&mcbsp_fops;) W+ {4 a& P) [2 k2 Q* N$ |
      mcbsp_cdev->owner=THIS_MODULE;, {  }5 H$ A9 H1 C, ]
      0 H: o% _6 }' Y8 r. E( C. c% `! @
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): l% |4 p0 ]) h7 A" i; E
          printk(KERN_ERR "register cdev fail!");. ^: h- v, F: l) v$ H
      else" A8 r4 f8 s9 V" _0 }6 Y) ^
          printk(KERN_ERR "register success!\n");% r+ C% O$ v: f% {
   }5 ^# E* o/ K# t9 h1 i
   else7 P# `- b+ T6 Y2 t2 \. j2 l
   {
. O8 _0 [9 }, F+ \0 X7 e: {      printk(KERN_ERR "register cdev err!");
' }. F6 j: S# ?0 V      return -1;
" v% a6 f, J: ^4 s* u- s% A' p/ A   }
; s9 o3 r0 D5 W3 `8 k( I, W   
" x. W3 I+ ^! f/ U" E7 `- F  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);7 o& Z! t0 f5 l0 A# l# p5 ?; Q% V
   if(IS_ERR(mcbsp_class)): m% K- R9 ~, G8 `
   {7 j! t% c$ N$ m" H6 V4 g$ \/ e
      printk(KERN_ERR "register class err!");
* }& e* B5 s7 l$ _* ?5 K   return -1;% i" M2 E1 U& J, I% J
   }
5 u1 ]7 {9 q7 K9 ~- c   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# O8 i  r# l0 X- L0 |# A
0 [3 l2 G& o5 t! g# g
   //PSC( d6 w( }7 L1 r8 |7 m# v' O4 B
   //add Enable MCBSP4 ^' l: t# J2 c6 o: N" I$ m2 B/ j& Y
   //test
+ z+ b* ]: ]: T4 Y; w) e0 X   temp = 0x80000003;
* e( a  f4 u  _- \5 L& k) ^   writel(temp, IO_ADDRESS(MDCTL15_ADDR));5 Z: \& M1 I( f
   temp = 0x00000003;$ o9 i- }: C& S7 @" O7 Z9 f/ P
   writel(temp, IO_ADDRESS(PTCMD_ADDR));! ]( i7 Z0 a' u1 a  _

; S4 B4 B) ~) ^4 ]$ R   temp = 0x001FF201;
0 j8 }. e! B/ d8 g- i# Q   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: u1 g$ p) @! Q2 B: z) X/ t
   
' d3 g2 E) S# W& c   //PINMUX  9 ~+ H  o6 b9 b' v& ^2 B
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
4 Z4 r3 z0 n/ j5 B/ P$ M   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ; B! t* f: _3 E0 ?
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ! Y( I) y. \5 W# |
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: {  |8 N' w' e& R" B1 {; y7 {
   , |. d+ P. [( r3 g% r7 c
   //SLEEP_EN,EPR,L138_SHK1,L138_RC- E; ?% O1 k- x% S
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
; Q# n5 f7 M% H* E6 \& m. Q# c7 g   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   5 f, T3 h" l' d" e. Z& R
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! s+ s. y. x9 p9 @2 P* r

4 X; p& o5 |0 n8 k% v   //RESETn,L138_SHK2* J8 C1 C8 o6 E  Q8 ?5 G
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; m+ K) \5 `* d) O1 M+ T. J& _
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
8 h# G) T; f; l   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 y! v& @6 E1 n$ b- g : w  d) `- T5 y0 P' A

, b/ b0 k: W+ J7 y  //SPCR Register5 _+ a8 A. W% T8 p7 H
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 u% |% T0 Y* l4 e/ g' j9 d  temp = 0x03000000;//(DLB=0)* N. y" |0 f6 h. _! P
// temp = 0x03008000;//(DLB=1); o( G: d1 v) Z5 I" F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset6 c# G: b% Q- w2 @. E7 L
  temp = readl(IO_ADDRESS(SPCR_ADDR));$ d/ I9 i' W0 X5 W; A
  printk("temp=%x\n",temp);
. I: `' t: b7 A! h( l% i( P
! z2 M7 s; R: s' c5 X   //PCR Register2 |2 \5 D5 b9 v- q
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
; w8 b- n! e* a. {/ \  // temp = 0x00000F0F;
7 p! X* H4 f  E# J  temp = 0x00000B0F;; Z# W7 X9 w1 [* x0 ^3 w6 _
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
' \) Q0 O3 _. S( ?9 @  temp = readl(IO_ADDRESS(PCR_ADDR));
2 Y5 u* g3 z; a& y7 w2 M4 F' X- w  printk("temp=%x\n",temp);  
8 P4 g4 m) q4 }   //SRGR Register0 F9 o' [5 B( }8 m
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' t/ v+ ?! T& ]$ ~: U) x8 z- I //temp = 0x301F000B;8 z1 o" U( d3 `2 ^2 A" V! D
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 0 V+ m$ {7 m$ D0 G& n7 L, N- P
  temp = readl(IO_ADDRESS(SRGR_ADDR));1 C* F1 ^3 W7 X( e1 H1 y- n, J& e
  printk("temp=%x\n",temp);
, I# j' D7 \: K  g' B* v) I# z   //RCR" N$ Y$ r7 n: L) ~; ?5 N& ~
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 O" \4 i) o$ w0 t4 {
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 H+ w; b7 I2 h5 v- R   temp = 0x00440040;
- \0 z8 p" X5 G   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
6 u0 x" O, t( p; C   temp = readl(IO_ADDRESS(RCR_ADDR));
/ j5 C( m+ D( `1 T9 P$ Y) }; F) y   printk("temp=%x\n",temp);
* |2 g9 f0 s) M6 F# H   //XCR. @7 Q2 O# n7 A3 x
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. \& i5 d4 n$ g4 @   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' \2 e' [& Q, a: n" Z. c$ ~- L   temp = 0x00440040;/ Z% p1 y* z& c
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
8 i) k" Y0 e, p4 S! g   temp = readl(IO_ADDRESS(XCR_ADDR));. J: u8 v" _5 W/ E
   printk("temp=%x\n",temp);
. L' }! y# {. e6 o' N7 T% [5 ]: ]2 v4 K9 [  udelay(100);2 ~5 V5 ~* `/ p. q
  //SPCR Register% e2 ^. Z7 q* d9 E. Q8 f: z9 p: k
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 [( Z  o7 H, `; ]7 C( r( P  temp = 0x03C10001;   //DLB = 0 VS DLB = 1" a' J$ B, O/ q" I/ ?1 t
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 B( p+ m$ w# Y  temp = readl(IO_ADDRESS(SPCR_ADDR));  y' p" f. \- g6 T8 [
  printk("temp=%x\n",temp);5 w* i. y+ k; C; A& y
  udelay(100);
0 N4 t/ k: i& `; C6 ^& \' f
# H9 n8 ~5 f, G1 X$ Z7 `8 q  //set GPIO direction
6 n! O1 |% u& k   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ H1 i4 K( p- X6 L
   temp = temp | 0x00000100;//EPR----input& b, C+ M# T! K0 ~+ i
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( B" O5 O- }7 N1 G   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; [; \8 d$ I  r& y3 G5 a1 x" f
6 t1 R2 x0 o. g" `# {2 B
   return 0;
& W/ o4 t% i0 q( Y5 ]) v) @7 l}
  G6 t7 B. c# a( O6 z1 q: o3 estatic void __exit MCBSP_exit(void)
: W% O3 b) P# t7 m1 X# }0 Z7 w" T{% T; U* s' X& n' t7 k
   printk("mcbsp chrdev exit!\n");
* S: M) }: m3 k   cdev_del(mcbsp_cdev);
% d  e( [- r. M3 S2 j8 q" M   unregister_chrdev_region(mcbsp_dev,count);
% g& Z/ M( e: }  A4 ^' J: i   device_destroy(mcbsp_class,mcbsp_dev);/ L9 m" V( s/ t2 R3 B: T& \# b
   class_destroy(mcbsp_class);0 \7 }5 x7 M. e+ h3 M' a6 t3 d
}; X' E- Y$ B5 D* A0 N  [
module_init(MCBSP_init);3 y. o7 U0 _1 M. C# J$ W4 Q1 |- w
module_exit(MCBSP_exit);$ K3 E6 `4 ^, W

( I. _' k. C& q! ^' aMODULE_LICENSE("GPL");
! V, i$ i9 I2 `6 e/ B: R) j3 y- Q; @' M( M1 r
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ `& F6 g5 f* k; n% q( O: k
我的应用层的测试程序如下# @2 t( s6 A% O+ `8 I
#include <stdio.h>
3 X. d) w4 q8 Y" v! G#include <string.h>
) F* D' F* t7 e2 [- k' s- ^0 d#include <fcntl.h>
* D8 [: I  _" r4 R! J5 y/ [#include <unistd.h>
% ^6 d0 @% Z  e$ W; c) Q0 g#include <signal.h>
( z* R5 M9 ^: j' e& |" o- s#include <pthread.h>       //线程( V0 Z) z1 Y3 V; B
#include <stdlib.h>
* N$ k5 L. d: q6 s: H# b. {* \#include <pcap.h>          //捕获网口数据( q- y- d. X( T$ i2 ?  R# \: W* f
#include <semaphore.h>     //信号
; D4 t! d+ Y- p" s3 }1 Y#include <sys/types.h>     //消息对列. P5 n5 h: h- ]7 ?0 D
#include <sys/ipc.h>       //消息队列
3 [7 e4 S: \. h' C$ P/ ^  H#include <sys/msg.h>       //消息队列
" R: Y* Z; V- a3 I9 d#include <sys/select.h>* Z7 j$ f" ~5 q7 G7 `+ _
#include <sys/syscall.h>
3 N* y% B. @, U4 R, w#include <sys/stat.h>3 A  v4 v) f- z# \2 `
#include <sys/mman.h>
+ M2 f# ?! p8 ?' b: U* r& v4 y#define msleep(x) usleep(1000*x)
" |& M' E8 O4 n- g. W. Z5 s
* W5 T! J' W8 R" {9 d8 N2 Q. mint main()
0 u# c" i8 K  m. d; ~{ $ g' v( M7 |! K  h; E8 o
    //MCBSP,ARM与AMBE2000交互设备4 ?# k0 U6 F* {# f; N, ]
int fd;
6 T: W: U2 A1 g& R) O3 o unsigned short data_write = 0x5555;
) k+ \* ?+ N$ r$ E unsigned short data_read = 0x00;
: d  l  _, {" m  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 {3 s* d' _) Z
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 v, Q" J' f+ K- Q) A8 v; e. c    # \. `9 P0 }6 X, R& ?" s+ N' T$ d
  if(fd < 0)# H* b" F, z7 B9 _8 `( G6 T( j' [+ V
  {9 T0 }- r+ b5 R. w' K0 C
     perror("open failed\n");
9 \+ h' e" a* c+ J" p+ \     return -1;7 D" q. j6 L4 X0 t! u6 `( W
  }
0 M; m1 @+ e+ V  I8 t5 \6 J, e  
3 l" O" e/ h2 L- q( ^) [  while(1)
% e( b4 f5 |+ l" |, [6 J. r2 F  {6 O# Z" D- V4 h+ k, z& ~3 I0 z
   8 q4 O' N3 B. V$ b! E; w
   //AMBE2000每次读写是24个字为一帧% u) X2 o7 g4 H: X
   //写数据时将数据在底层存储起来,等到中断的时候再发送' @# w3 s" _! D8 n" i! ?1 L8 e1 ^
   //AMBE2000输入数据是以0x13EC开头的0 a6 B  l& S! X  Y. Q6 i
   write(fd,&data_write,sizeof(unsigned short));. i; u5 e+ j" O
   - R3 y7 R/ f- c4 q
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
& I  z6 M' K5 |3 H9 ?8 T% W   read(fd,&data_read,sizeof(unsigned short));/ |& s, Q) H* H. n
   
9 @& j4 h5 f- Q4 t6 w1 O   if(data_read == 0x13Ec)
$ ]; V4 U5 [0 G6 n7 F5 c   {1 r: G0 ?$ C2 O% j7 C
   & ?: q$ L$ _$ e" ?* V
    printf("data_read = %x\n",data_read);
* y& b0 y0 p  c9 c! V1 {   }7 f  T* ?/ C# X7 O
   " s7 i  t" w6 ~5 I/ Q- F
   msleep(10);
* [. [, h' Q' F9 t2 L  
9 k% k, l2 N4 {! I  S5 [  /*7 N) d# G+ w7 y& l; D" c7 O9 i
   ioctl(fd,1);   ( Y: K, I/ G8 o2 h+ c! j: {
sleep(1);% S: A, G$ \$ e# i7 f( P2 \
ioctl(fd,0);
; ~* t% X! C' k% E& G" \ sleep(1);' y+ f1 v# V+ K  u1 a7 ]0 G. B1 p
*/ ! ~5 u( ]# ~# ]: J: i9 H& a
  }   5 v' V4 N# F3 v" G' [. L
return 0;
# g% F# _( u2 q+ B
4 h6 {# x* X7 k}
7 q2 `' V1 M+ x2 j& I% ?9 o- c& \: i' @. T
多谢各位指教,谢谢! 急3 M! t- p4 q7 r( ~0 o0 T

8 ]% o) _) C# |8 k9 K$ e" Z
) Z9 g& @+ a( D5 i, G- Z, I( Y. ^3 ?4 n4 [! x& N( i. {7 Q( X

# p3 F- l# F: M
" b1 R/ }: J# I: K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-13 10:22 , Processed in 0.047948 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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