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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 F/ p! f3 u, Z3 o& k0 Q5 U
/*  O% _; w% x  d( D4 n
* Copyright (C) 2009 Texas Instruments Inc
- U& C2 M0 u$ x) o6 c *
9 a$ A) z$ D3 E7 S3 U * This program is free software; you can redistribute it and/or modify
& `- R$ P% n7 W) d+ E& p: a * it under the terms of the GNU General Public License as published by
5 `* w0 h; H6 X/ |% L * the Free Software Foundation; either version 2 of the License, or
* H& S* E% \( w# Y) _; H * (at your option)any later version.% e) c9 R# f% V5 j
*- }1 V( s! z" s  ~
* This program is distributed in the hope that it will be useful,
9 a! z7 f0 B  U; ^% P5 D * but WITHOUT ANY WARRANTY; without even the implied warranty of
; k# I' b7 n8 m/ O/ s * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the( V- z8 D# U( ?! Q0 b4 s$ A
* GNU General Public License for more details.
& o% w. ?3 L9 w! y' V *
6 N3 v# m1 |$ B: f6 l9 _ * You should have received a copy of the GNU General Public License4 w: L7 j7 V; A, D( w4 z: }- Z+ ?
* along with this program; if not, write to the Free Software
/ I7 G* N0 v( u9 Z3 J * Foundati- e4 i1 U% \- F, q  Y; p1 R" M0 @
*/1 |% e& i7 s& T/ ?% \) ?3 A* B
#include <linux/module.h>5 P. J" _* e# x
#include <linux/init.h>" t2 ]7 R) ^1 k, g& ]
#include <linux/errno.h>) E1 k* _" c# K2 R9 `7 A3 v! y
#include <linux/types.h>& ]+ O  y4 S0 }5 s& K1 k* ?4 ?
#include <linux/interrupt.h>
3 P. K4 F6 d# ?#include <linux/io.h>( P( v) Q: ]+ w' I9 V5 P
#include <linux/sysctl.h>, R( C( U, i9 Y" o: N2 U# Y
#include <linux/mm.h>
6 j/ S3 Y6 I8 Z3 x#include <linux/delay.h>
. h) A8 E- c) @( l#include<linux/kernel.h>
+ K: _/ V, x  w6 F8 I& S: ^#include<linux/fs.h>- x2 L4 Q6 ?. l+ d+ ]
#include<linux/ioctl.h>
6 x4 Z. i) f* \4 ?" [0 h#include<linux/cdev.h>/ R* I$ c( H2 j! {
#include<linux/kdev_t.h>- W' H! D7 X( a  u0 |% H' B
#include<linux/gpio.h>
: ~" k0 L* B, x+ E4 D0 {9 k#include <mach/hardware.h>
7 ]8 `& Y) i6 k$ P% @9 t#include <mach/irqs.h>0 j2 z8 u8 x* x/ A! U) f6 i2 c

$ X) k6 K/ o" N#include <asm/mach-types.h>2 a) D! T) L" o2 ]
#include <asm/mach/arch.h>! t& x7 g3 I5 u
#include <mach/da8xx.h>
5 g9 s8 V* z& t* p6 X# V#define  SYSCFG_BASE   0x01c14000' u6 x3 |# T' F" V
#define  PINMUX1_OFFSET   0x124 2 L9 Y' b) M2 M. K7 S4 W* J
#define  PINMUX18_OFFSET  0x168
! }" y7 o7 }8 e#define  PINMUX19_OFFSET  0x16c
3 W! P) G$ D4 X7 u( W. N#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; I$ T) D% h/ Z) ^1 o1 t  F+ J& Q4 u
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
  D+ s- ]9 R$ z/ q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR7 h! V0 h- p9 k) z
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 j& |2 |/ r% J7 F" F1 K5 h#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
8 Q$ j- b9 l) j- l* p                           
! A% F( p. e9 c! S  A; Q6 i# T#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 C& t; k: a% V0 N0 ~% f' T, |#define DRR_ADDR      0x01D11000  //MCBSP1_DRR7 e' H- E7 b/ q' z
//PSC
* S/ K$ T9 K  ?1 {: l3 H#define  PTCMD_ADDR   0x01E27120  
0 J: k- \% L7 H5 @4 X7 d  N$ I5 h0 p#define  MDCTL15_ADDR 0x01E27A3C: V* Z; T# G$ J5 C) _2 W
#define  PDCTL1_ADDR  0x01E273040 [" o8 P, S9 Z' c6 N
//GPIO8 direction
5 D2 s- H9 L; j3 g  R#define GPIO8_DIRECT  0x01E260B0
" t3 J1 b* j+ V7 j  I( N#define GPIO8_OUT     0x01E260B47 h8 a0 S" d2 _3 B, |
#define GPIO8_IN     0x01E260C0  p# M5 M3 A3 f* E
4 y2 x. _$ z: [6 N8 ?
//#define MCBSP1_RINT    99              
0 G$ K* W, ]1 Z  f//#define MCBSP1_XINT    100  
) C! t+ H7 y0 D9 l3 h& t' W8 Lstatic int MCBSP_MAJOR=239;
- k' r. [1 Q! e" h) Istatic int MCBSP_MINOR=0;+ C7 [% `: C! O; h
static int count =1;
/ X8 ~+ @% L, \; s  I1 s( n0 F. @. O* r0 c) G# |
#define MCBSP_NAME  "MCBSP-device"
0 r" c7 M2 N; [/ d4 \6 }9 M2 H. M: }1 O
+ Y; \/ u5 K9 L3 bstatic struct cdev *mcbsp_cdev;
( L) F8 U* e* |3 gstatic struct class *mcbsp_class;
9 o# A+ i/ J" O, a) @static dev_t mcbsp_dev;
. v8 ]" S$ f, g2 _# R& d! eunsigned int DRR_data;6 z9 R& {, k" v0 V8 C8 g; z
unsigned int DXR_data;
+ p1 K: v# n4 Bstatic int mcbsp_open(struct inode *inode,struct file *file)" U7 s$ T1 d: J+ N+ e  Q
{
; S2 ^4 r+ W, _: H' j, W* L0 x! v   . `2 G3 m4 N0 o' F& K3 p
   //interrupt enable,initialized8 c% v, m0 b# v3 X& h+ o0 i1 e
   unsigned int temp;
; \& E4 K" j9 Z: o   //SLEEP_EN(GPIO8[10])---0
3 u: w' B' t4 x3 I  `4 N1 n( f4 w   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ e' ]9 I7 s0 F: J   temp=temp&(~0x00000400);, d+ w# Z9 Q! }- l% {0 B- {
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' B7 _& l+ T; A0 U: G+ \. q: w; ?8 ^; J
  //RESETn(GPIO8[8])----0----1
+ M( t2 }, n0 w- D* o   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 m* ]6 L2 N6 A8 l   temp=temp&(~0x00000100);$ H3 v* s; m; y3 n9 m! J' A+ x2 `9 g: W
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ p6 E. H  A! P5 {" }3 `( d   udelay(100);
+ U# ]" P2 @2 C7 F5 }) y   temp=temp| 0x00000100;- z& j+ |8 r, W/ B0 U8 r# u
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 m6 s8 ?" N6 S, O# h( {, T, F  k   udelay(100);7 N) v' d/ `1 v1 x$ y) q4 J
   printk("open success!\n");
* q% z4 S& Y* x- Z* \   return 0;
; O( E" i. k$ E/ U4 N3 ^- _}) u) l, @: z6 B6 ]+ x* ?( G2 ~2 X

2 h. _* w' g3 g- d6 `static int mcbsp_release(struct inode *inode,struct file *file)9 r# `8 F/ B1 p: m: U7 j. X
{
- K+ g3 v- S7 t  [+ R6 X   printk("release success!\n");! z9 X# W! n# [4 c$ g" ^" v
   return 0;
0 M) P; a: D& B1 ]5 S}
; W" p( x- A, M6 X0 M  V2 K" r+ n* U' O: L# x
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# H$ @2 S5 ?( F+ e4 V# }{& T7 @8 ?1 m8 ?* g: Z) s! ^9 o' K. E
    copy_from_user(&DXR_data,buf,len);( W* c7 N+ f* w2 ]$ \, h
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 \# f1 [3 t$ h9 }! A' ?! T
    return 0;
6 }4 @# ~5 h' D1 r% _9 T/ Z8 M) c 7 C9 ?/ E$ E0 i% K5 y! W1 D" B9 L
}
/ o4 U' H) e) \% B
0 P: v8 ~: u5 J1 o9 E. M* E3 Jstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: p" x4 R5 |: c! {{
( G9 L+ @9 S( Z! A6 z/ r6 b6 Y% l   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 c. D7 x! L; n/ q
   copy_to_user(buf,&DRR_data,len); ; ^3 F5 l" }) `9 I; H+ H4 p
   return 0;! A3 S; L4 v# _5 t6 y
}
% r1 y* _* L- P6 v8 K$ D$ m
6 t  p, N# ^  e3 A! `0 L$ D! M/ |0 ^0 ]- T! v7 Y
static struct  file_operations mcbsp_fops=
/ x/ h4 p; _# Q; D8 Y( h" T{1 [: @  }, a' n
   .owner=THIS_MODULE,
& C: @3 M& h% h6 I2 e   .open=mcbsp_open,% k- O, A3 g9 D6 w# \8 i
   .release=mcbsp_release,
. N% E  @3 o' B( k* I! ^5 i   .write=mcbsp_write,
/ Y& |; J3 m1 N" R+ c( {0 `   .read=mcbsp_read,$ d  l- i! `2 D% ]! T5 _
};* O5 s- M4 s& F& q( p
static int __init MCBSP_init(void). A7 X9 N1 j  q6 _
{
5 J. f& S! c5 k0 j   int ret;
3 l3 Q2 N( _: N1 E& @3 F6 K   unsigned  int   PINMUX1_REG_old;( L- I' n" ]1 S9 ~# F' c
   unsigned  int   PINMUX18_REG_old;
, m5 R6 Z5 E; y0 t   unsigned  int   PINMUX19_REG_old;
4 d0 T; }/ I6 U: h5 ?   unsigned  int   temp;  
$ w8 c, l5 g0 C   if(MCBSP_MAJOR)
3 C" s( T/ W$ y: n8 I   {
9 c: @; b( C# {8 v+ O      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);, F* U0 P/ F1 {! k8 ~! K
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 h$ V; H% }6 E   }
0 C5 x, X; D' P, m' l   else! D. T+ p" {, }, B: s9 `, P
   {
% c4 S, T. |/ Z1 k: p# N6 V      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 [. v' n) X2 m' G" _! Y
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
  H* G% @# J$ U4 z: {   }8 W1 e* r/ c: B$ n* I
   
6 f9 _8 N% a6 l3 _- }6 \) {9 }# v3 @! h   if(ret<0)  v; p/ Y9 {1 s+ N" Q
   {8 g& A: J$ x! B' G/ [1 Z: P; D  N& F# U
      printk(KERN_ERR "register chrdev fail!");
9 O, n; @9 \( @1 k      return -1;8 i6 k6 G) o: t- W  W/ h
   }
5 G* {5 r% F" O+ _% G9 e4 x& K" {   3 W& }! [, o* h8 H$ T: B
   mcbsp_cdev=cdev_alloc();
+ X$ B4 c/ P, }   / g% P, g' t; t
   if(mcbsp_cdev!=NULL)
2 U( \) h$ A) p" x9 e) K2 W   {
  U) d* z3 n+ o; Y- V% G2 V. a0 }& w      cdev_init(mcbsp_cdev,&mcbsp_fops);
3 `) }# }: J2 ]& ?' E9 o% M* x      mcbsp_cdev->ops=&mcbsp_fops;$ {" ^( _, c0 S  o8 Z$ ?
      mcbsp_cdev->owner=THIS_MODULE;! T  C2 k% w  j  ~6 d
      
0 G1 M# |1 z9 J$ b; S5 _      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# n  A  E( G! B8 y' K% y
          printk(KERN_ERR "register cdev fail!");# B1 Q* t0 _4 @1 @) o! l+ O
      else
1 B0 t6 @6 b  N/ a. M* Z2 M$ h5 ^          printk(KERN_ERR "register success!\n");
# k9 H0 X5 y$ v9 z8 u7 x   }
! {% _! s& T* H% \, ~0 b7 u+ ~   else
' _7 j1 x8 `+ S* W   {4 @" F+ P  ^( `
      printk(KERN_ERR "register cdev err!");) ^9 a+ w6 F. M" _+ Z9 j. V! G
      return -1;; u+ f0 ]1 z( f
   }/ u, v) t1 z2 i8 R5 S
   ) G  D: |8 E+ [% z  L3 c
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( f- A$ W6 J5 i% S* S3 `) v
   if(IS_ERR(mcbsp_class))* g* M) P, \$ d0 ^
   {
4 O& c' L* S- D, |+ C4 \" _( C% a      printk(KERN_ERR "register class err!");
7 K  V& [: i# F   return -1;
# c  U0 ~' I" v& [5 Y6 F2 ~' j   }  _  H; k9 C' p* ~9 W6 O
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- Z+ a, M7 R! `) }2 |4 N" S5 `, L, \4 L0 X2 j: d' g
   //PSC% T% l6 d4 W  a8 p* W: @" z" ~
   //add Enable MCBSP
* _! S9 w1 L& _6 ~' t5 |   //test5 ?- Y1 g- B9 ]; @
   temp = 0x80000003;
$ w; A& H3 T" }* m$ F, a8 g   writel(temp, IO_ADDRESS(MDCTL15_ADDR));) i/ s$ w& C% G! B1 a. W% k$ ?" _
   temp = 0x00000003;1 Q1 O! z( ~' r6 V! Y* G
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
6 L4 k5 s( v% w, J: U
  U* S! D4 q" M4 J- h9 I# ^   temp = 0x001FF201;
0 s* N5 C# [" e$ H3 @   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ w  {) I: \( y- T& w1 H   
+ _! `* a/ O9 g0 {( \6 y" i  U   //PINMUX  3 d1 {; D' L) l* |7 C9 k% q
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: l: ]. w) R, _& y- l3 k6 |
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  - f: i2 f' b" w. w3 Z4 C: o8 a
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
$ y1 y0 B  M& p2 D2 D6 X2 E( L   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  P9 U. Q! f$ M) s! I' E' u5 i5 @
   ) z) l% H' _9 w, n# j" b
   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 W9 ?1 _: _/ f4 b
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  / a7 g4 V5 F5 p) G
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
$ Q* ^4 l1 W; T& N, o" n   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 E1 d/ h2 u3 c" |2 J3 w6 p* O ( _. k% h2 i4 z; K0 z
   //RESETn,L138_SHK23 B6 G% X9 z2 ^2 i/ T
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
5 \* f/ V) A- s! c; y0 I   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;     N+ ]9 b( j: _3 {. ?& p! M! N
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);, F- ?, I! ^) A

/ J' S& o8 Z$ @. G8 j1 ]! k4 M$ Y; S) h
/ v" r/ Y" C1 t5 p  //SPCR Register
+ A) R' p1 s3 j/ o/ S  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) G. ]3 ?4 o7 H. k; y: ^  temp = 0x03000000;//(DLB=0)) p* \; w% L# X3 L$ a5 X
// temp = 0x03008000;//(DLB=1)
7 i' o) W7 K- l. W, F; J  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
0 _  e4 `* Q, ]7 Y: ]0 Y& l- u  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 j/ E6 i5 s+ V$ W# _0 f* O" s  printk("temp=%x\n",temp);
6 Y% A2 ^4 j3 Q5 n* T$ P1 K( y + P4 `( X) o* |; ?9 F
   //PCR Register+ a  C6 H2 D: D! a# v
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) ]$ r# K, b  }/ u- f9 Y4 \  E  // temp = 0x00000F0F;
- ]! D1 u, T$ b( D! Q0 Y# b, T  temp = 0x00000B0F;6 e; p  f1 j5 S" m
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 4 h: I2 b3 u& X8 Z# E
  temp = readl(IO_ADDRESS(PCR_ADDR));
0 b6 O7 l) _" L; R- Y" J# w  printk("temp=%x\n",temp);  ) @$ C& N' ^5 B/ |% z) \! |5 L
   //SRGR Register
6 C0 {: b0 T0 n9 }* ^' D7 @% m   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- E  }- V6 o8 i; b% n
//temp = 0x301F000B;
$ m" a; p) V3 s6 M% i, L8 J   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   V2 w. L" P: V
  temp = readl(IO_ADDRESS(SRGR_ADDR));
* X3 A9 q$ W0 m  printk("temp=%x\n",temp);' O9 n. h1 \* t7 G4 j" O
   //RCR
( e3 H* X  \; [% q6 ]   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, j2 b2 P% f3 C+ K
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0% X5 r/ H2 E; q# W4 t; c! y- |2 w
   temp = 0x00440040;
4 G% }( I# ~5 S' I   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
% Z( [0 c( \7 K! C2 z* n+ G/ R. n   temp = readl(IO_ADDRESS(RCR_ADDR));5 n! Y- G" E  P7 w! O- L9 d# R+ f8 @
   printk("temp=%x\n",temp);
8 y$ Y# z; m, v! [5 p" u( ~   //XCR- W/ M6 O5 i8 T
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 A$ S0 O& L) _+ p( g0 {7 D; k& L* _
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ ~7 m# _6 @4 |) V  \  i
   temp = 0x00440040;$ f* F# K5 c. P" x" `: K
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
- [, U- O. a, a& ?7 U, k! B   temp = readl(IO_ADDRESS(XCR_ADDR));
- U( k; x  N, W! j2 F2 X   printk("temp=%x\n",temp);
( b9 f4 O' f2 {; ?3 @  udelay(100);/ X1 ^$ x# y) E# h
  //SPCR Register. h# R/ o. r/ Q9 u9 C) w
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 e' z3 {" O) S9 B( U2 f5 h/ d+ K  temp = 0x03C10001;   //DLB = 0 VS DLB = 1( n( |4 ^% a7 N  Y$ U5 g
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled7 f( _1 q) k/ l  d) A
  temp = readl(IO_ADDRESS(SPCR_ADDR));
5 C& [  y9 N8 C' y8 [$ `  printk("temp=%x\n",temp);$ a7 A5 f$ K# ?; i* x1 s+ L
  udelay(100);+ Z9 X! U2 i" R/ w/ ~; T
( q0 w/ D( ^! n; ], a" `, x5 O
  //set GPIO direction+ w2 u( D* r" O4 r8 ^
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" r/ ]/ g4 a4 b   temp = temp | 0x00000100;//EPR----input
1 i" g5 \  r8 U2 D! N0 C' {1 `( l3 ^   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! m5 S1 P( U2 Y1 x" S) r   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 Z' [1 m# b$ u1 a/ ?$ x) e
9 B4 o' \! X8 {; d+ \# P4 L
   return 0;5 j; C. Z1 t) b, ~) s1 V
}; f% @% q( X/ `
static void __exit MCBSP_exit(void)6 `/ D. O- P, ]6 x1 w( X, K
{6 T) K  T3 b# j- z* ?& Q% _: E
   printk("mcbsp chrdev exit!\n");, ?+ h3 M3 t* \: f9 Z
   cdev_del(mcbsp_cdev);  l& b: f3 z4 @0 D2 E! J4 f0 b5 a7 p- N
   unregister_chrdev_region(mcbsp_dev,count);
) c7 }5 J2 _9 w( ?# M   device_destroy(mcbsp_class,mcbsp_dev);/ ?" S6 M: A" C) d2 t: G
   class_destroy(mcbsp_class);! Z: F5 _8 p2 O) s
}" e% @1 X0 x% L* b$ a# B/ l0 U
module_init(MCBSP_init);- ?$ ^0 M$ ]4 [) k$ G
module_exit(MCBSP_exit);
5 }0 \6 U8 \4 c# L2 X- B
. h7 W1 B9 `/ O8 r4 l5 LMODULE_LICENSE("GPL");
* ~; P7 O9 {  `9 M- @8 A
/ s2 S. A/ |" h- N$ r" k+ b. T- }我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 j7 J# p7 {$ P6 |+ f% Q$ {9 j3 g
我的应用层的测试程序如下3 X: l/ \5 r9 {$ E- Y) d
#include <stdio.h>9 m) C1 v6 h( s1 a6 B
#include <string.h>9 \$ M6 L: h$ U/ I
#include <fcntl.h>
' R$ d$ k6 @! G  }7 N. K9 v#include <unistd.h>
% N3 e- U% ?1 w- ?( i#include <signal.h>' q# F4 i9 b5 T! p( s6 }7 O
#include <pthread.h>       //线程
; x2 I( K$ [5 {9 `#include <stdlib.h>2 Q( R% |; y6 G' }! u9 M) _
#include <pcap.h>          //捕获网口数据
0 ^, q* q$ P  v$ _#include <semaphore.h>     //信号+ _6 [$ ^0 f9 f6 A' M, Z& L
#include <sys/types.h>     //消息对列0 t4 D& |8 s$ R( Q3 F/ {% T% J
#include <sys/ipc.h>       //消息队列8 {8 K  {- a: ~/ s- K
#include <sys/msg.h>       //消息队列+ w- d- h0 Z) @
#include <sys/select.h>! E& j7 }% w+ v
#include <sys/syscall.h>. I& p' u/ x9 q& d, u
#include <sys/stat.h>
- j) f, I$ t! ^$ l3 L  t  e#include <sys/mman.h>
  t! @# u8 ^6 z$ b$ w$ G/ {#define msleep(x) usleep(1000*x)
& I" N4 y+ e0 r3 y/ f. i6 }! q8 l" T  }3 m, Z
int main(). J7 y5 S  {  |+ F* e
{
' U$ i% A& d  u6 Q1 t5 `( R    //MCBSP,ARM与AMBE2000交互设备
' c, M! y+ ^0 w' { int fd;
% X$ B; X/ s# q7 f$ E2 C unsigned short data_write = 0x5555;; p) r3 L& N' b; R
unsigned short data_read = 0x00;( @& _" e0 }% V4 b/ V
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( n3 H, O- r0 M' y+ }
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ ?( P; T& O, U3 l    2 l" E/ D" I6 N, o
  if(fd < 0)& x+ i. R  z+ C! s* ]/ X
  {! B) c, O' a' z8 J% z4 u" O
     perror("open failed\n");/ |1 x8 E$ q4 C& f% H/ y8 S
     return -1;9 I9 l- D) X" s: k/ m5 ?$ B7 M( q
  }
$ ?6 `3 P( t  e# Y* ^/ m  * O0 z5 s8 V! b3 J( F
  while(1)# x( q+ u/ ], L; j7 x/ ^  C
  {/ w. \1 w+ O8 Q9 W6 i6 ?1 K- ?
   + _/ R. }$ [% O' @/ X
   //AMBE2000每次读写是24个字为一帧% Q+ N5 y  ^  J3 Y  a9 G
   //写数据时将数据在底层存储起来,等到中断的时候再发送- A, G; _7 v" g3 J
   //AMBE2000输入数据是以0x13EC开头的% x. Q" K! z5 a: `
   write(fd,&data_write,sizeof(unsigned short));- \$ }+ J. ?3 ]8 N; X
   ; X# c- m, f6 R* @( a( G1 c
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
2 p  L: q6 Z; w   read(fd,&data_read,sizeof(unsigned short));/ b( r2 _* N4 v% c/ e! X
   2 }6 \- ~4 Z; o, q" G
   if(data_read == 0x13Ec)* ~2 U" Z- R& c* d+ Z' K
   {
5 e& ^/ C; ^/ h. C3 _" C   4 Z$ u4 X3 t" J
    printf("data_read = %x\n",data_read);
" C- z' [7 }8 h/ v$ y   }8 [* e  s  f8 H. O9 F8 N9 ]- o( G3 L
   
" X/ }9 ^' V4 ?6 O$ a& T( q   msleep(10);
9 d! S, a% [1 P) |% i! X) q  8 ?8 Y+ L( n4 l' S5 z% D2 S- K
  /*6 ?  {  Q. Y2 Y9 p% N1 o: k( t
   ioctl(fd,1);   6 E( ^7 X% r5 Y7 Z* ?- s* w
sleep(1);( S# @$ ~& N: H- {- b: @$ g
ioctl(fd,0);
% L& S* c2 W6 A& y! n. P' x sleep(1);
: G6 P4 ~" Q% h: q+ Z" ? */ + k5 G" P( j) ~* b) S
  }   
, q( i  e/ m& I" [% i% Q return 0;) {4 I$ I+ U' F' A
3 S  a; i3 ^! r, @  u- {% o. T
}- n/ A; c3 V+ A5 i) U- g: Q5 u; Z  s

" l3 S! _/ ~. |) Z多谢各位指教,谢谢! 急9 @0 Q) v( o2 _4 i. [4 J
5 K! }4 {7 d: w
  K) z$ k$ v- N1 o4 H# a4 C

9 I( X3 B0 \2 w- u- c* Z- x' P0 X
6 }/ O) g% c% Y
7 P1 ~+ N, w) p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 04:48 , Processed in 0.052532 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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