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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 M8 P- T+ J2 E+ Z
/*
' r/ R, }5 g" n9 ~ * Copyright (C) 2009 Texas Instruments Inc
0 K+ o8 H, U2 j *( }3 Y- U* `! i
* This program is free software; you can redistribute it and/or modify
8 K9 i: E) P" C$ ^% s  {. L * it under the terms of the GNU General Public License as published by' C5 g4 M, _- v" O: c5 U/ T/ Q! e; c
* the Free Software Foundation; either version 2 of the License, or
7 q/ E) y9 @  D4 P. l( l" a% Z4 o * (at your option)any later version.5 N5 K& T' O- W, x  I  `9 [
*
: c) {6 G; ]# h) g2 n( n& j * This program is distributed in the hope that it will be useful,
* a6 v! Q' @& E* g, U% J! V * but WITHOUT ANY WARRANTY; without even the implied warranty of) ?8 B: t6 r: V: F7 F4 m7 v
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the) A# b* P+ e8 l+ Q  \4 ~
* GNU General Public License for more details.
, X8 k8 T5 G- c7 r3 l8 ~5 T# C ** U! x8 @6 ~! L! H5 t- ]2 I7 {6 R
* You should have received a copy of the GNU General Public License
+ k6 A/ U7 w2 J4 g5 _* k" |- {- {4 H * along with this program; if not, write to the Free Software
$ u* E6 Z5 u$ k% _7 x * Foundati
3 r$ W: n/ d; b7 z*/
& N2 \, w1 d+ i# i#include <linux/module.h>
( U, q$ d9 D* i3 ?4 d9 D, `#include <linux/init.h>6 V; ?3 f4 N' ]/ K5 W2 f4 r. W4 _4 o
#include <linux/errno.h>- h3 v/ E5 z+ R
#include <linux/types.h>' d9 C1 l* c# S8 f4 d8 _! w
#include <linux/interrupt.h>
: M9 q; Y* ~( l/ c#include <linux/io.h>
& n; x0 V5 U" E" U0 s8 \' d7 R#include <linux/sysctl.h>
% A- E/ j; l( W#include <linux/mm.h>
# m0 j8 Q/ g9 }& I/ y( R/ A#include <linux/delay.h>
' |8 Z5 b3 ^4 W# B#include<linux/kernel.h>
" H  G+ I3 Z! _+ K& @- [# H5 V' ~#include<linux/fs.h>
6 v$ f4 l2 p% @$ V; R#include<linux/ioctl.h># J1 c7 b( {. l" C, C9 v
#include<linux/cdev.h>+ D2 {' Z3 T- J, o. d
#include<linux/kdev_t.h>
8 b6 u* B5 ~% x$ A& e#include<linux/gpio.h>
3 b. y' ?% P" y* ?7 i- d1 N0 T#include <mach/hardware.h>
% C( F' d3 @7 X: Y#include <mach/irqs.h>
# b0 z5 I+ H! u$ V
( i, X) R5 B, V; S: k3 t+ R# O, }#include <asm/mach-types.h>4 L$ {  {* `- r- t
#include <asm/mach/arch.h>; X' o2 [1 G" U9 J! v
#include <mach/da8xx.h>! a! _1 ~. ~. ^/ B) `( y7 U
#define  SYSCFG_BASE   0x01c14000
: M* K, `  x  ~#define  PINMUX1_OFFSET   0x124
% |# _1 v% j5 z5 o5 J( p  E#define  PINMUX18_OFFSET  0x168 % I+ q5 s# S1 P9 G0 d; n+ Z5 U6 ]
#define  PINMUX19_OFFSET  0x16c0 H5 \$ v6 g; R5 r' m
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
% X+ H* Q- V, J( p9 [#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
: J$ {/ Z* _- H% s9 V#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR' a% B+ n9 u0 e4 K8 d2 }6 r. D
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR! J& g7 d9 W9 F! `1 P, m
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR0 v9 m7 o; H  t1 b- D0 ~
                            % B, ]. w  R) L% |  M
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
. z& F6 p7 @5 J- ^$ v% y  {#define DRR_ADDR      0x01D11000  //MCBSP1_DRR  H. j! U  k. }! N+ Q0 q' v) |
//PSC
. `% w1 a, q# C' D3 f5 l: `#define  PTCMD_ADDR   0x01E27120  # L) J) k9 e& @) U& E6 q# ~
#define  MDCTL15_ADDR 0x01E27A3C
5 b: o: U$ ~5 Y" W$ U, k% d#define  PDCTL1_ADDR  0x01E27304# T& u" c2 q! E% q2 \+ _; R1 o
//GPIO8 direction
3 U6 @% n& T4 z#define GPIO8_DIRECT  0x01E260B0$ _' [; \& Q& _% X6 G! c
#define GPIO8_OUT     0x01E260B4
7 i4 P" l/ R9 p: v#define GPIO8_IN     0x01E260C0
  ?& E5 T" h  d: C* ]3 L% |0 }1 d2 Y6 Q+ T
//#define MCBSP1_RINT    99              
5 G) _) z: H2 \" w, ~1 l7 V//#define MCBSP1_XINT    100  
0 Q6 _2 U6 ]* t" dstatic int MCBSP_MAJOR=239;' k1 F' a- ^# e
static int MCBSP_MINOR=0;
" E! V1 c7 |/ O& p5 V" h1 M! V: @7 `static int count =1;* @6 a" ?3 j6 e: I  T4 T

9 V* u9 ~$ Y( S# j* Q/ z#define MCBSP_NAME  "MCBSP-device"
1 t# x9 N& F/ i( n; M: o% n
: T  a& w( R, u" K: T' ]- S7 Zstatic struct cdev *mcbsp_cdev;) ]0 w: Q  Z( A9 v* X" P" o
static struct class *mcbsp_class;
/ \; ^. p2 ?( G* i# }! Z  Ystatic dev_t mcbsp_dev;
) n6 k- l$ \- M& k7 wunsigned int DRR_data;% e8 H5 G0 ^# h$ n
unsigned int DXR_data;% F0 O7 S# {3 j& w/ C% Q* q# q
static int mcbsp_open(struct inode *inode,struct file *file)- }6 a7 X  C9 P. J. b# W- m
{
2 K! r$ C  q  w; x) R9 Y5 S% q   
$ A( |$ r$ \7 q  e$ i1 ?% W   //interrupt enable,initialized+ `7 z6 N, ^& J5 k8 m& r: D7 ~0 X
   unsigned int temp;
# _8 F7 y0 k# v8 A   //SLEEP_EN(GPIO8[10])---0
) c; L% S  x2 K& |  ^   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 X8 g- d7 u; O9 T' n   temp=temp&(~0x00000400);
  c, J; r+ n! a! [- |/ j% o* x   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 M) ?. [" p8 j: {0 B  //RESETn(GPIO8[8])----0----11 {' Q- J' b5 n' B9 q$ p
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 y  h' u# f/ W* i: m2 y
   temp=temp&(~0x00000100);
- j3 w  ]; @( q  I# S   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# r" V! K+ Q% G( k  R. Q   udelay(100);
: h  I$ E: u, G9 ~0 T, N   temp=temp| 0x00000100;
# ]  J( g" r+ H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; |1 @* n8 o& W! ?- R& L   udelay(100);3 j& a' e9 `/ ~" f. H& c) m; s1 z
   printk("open success!\n");
; ^0 A7 B) r, @+ D3 U! R* P   return 0;& ?8 Y, n8 E# G& s, y; u% O
}
1 |. G: h9 @+ h' d. y2 u1 ^1 A! V. r
static int mcbsp_release(struct inode *inode,struct file *file)( C: L+ l3 l: E/ [4 e( C
{
9 {3 F" V* y* Z   printk("release success!\n");
& {6 B8 s, c7 U* v* H" y& ?3 q9 a   return 0;* T' L* X: Y7 p4 \
}
+ }7 w0 s# V/ |/ y7 z8 M
7 C. j! |" x  b7 Pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! a* I5 p, m* @, @2 `
{% z) U, Q2 I* P
    copy_from_user(&DXR_data,buf,len);
* R* o$ X0 q+ ~0 N: E  f    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
# T/ {  v0 H1 T" ^/ a    return 0;
+ P. r5 B- P  j# ]4 l$ ?- E+ x4 c 7 u+ |8 m+ w0 Y8 k& G( X8 w1 g
}! a0 y1 F( [1 m& v$ R0 ?" f
9 S) V& i4 H- _& ?5 h( ^( p- F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ x7 V3 l! ~* w( n" e{
4 J) o$ `! ~+ I4 T: \! n: O. y2 Q   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));* f3 s( E, m% v4 L7 u" l6 z
   copy_to_user(buf,&DRR_data,len);
2 l! s! e8 P" D% |   return 0;
  l4 a1 d, N/ l2 g9 r" A& e# E}
( e9 W: ~' C' j+ n& r/ @+ ^+ r) o5 _0 ?$ s

5 I' C3 X- o" O0 {6 {static struct  file_operations mcbsp_fops=% J, _/ Y/ D& s0 ?/ t& h
{% N! G# {& E4 ?) c- S
   .owner=THIS_MODULE,
' v, K9 _5 A; o2 w% A   .open=mcbsp_open,5 h5 c' O3 ], p6 P
   .release=mcbsp_release,
/ }$ d6 n9 N  K. X9 ^   .write=mcbsp_write,5 q2 M9 b6 O) ^4 L
   .read=mcbsp_read,( }8 x0 v1 m; h( Z! B9 P
};
$ i( A' l2 B( T; ~static int __init MCBSP_init(void)0 z3 s1 B; X  v7 o4 s! \2 v* i
{
4 l; K+ b# x0 B2 b# `1 q5 z   int ret;
5 {* k" k/ v1 \. n/ m% |/ m   unsigned  int   PINMUX1_REG_old;
' `3 ], b8 f8 X- h) w. n: R5 O   unsigned  int   PINMUX18_REG_old;
3 j, `$ a6 n+ b) c! q   unsigned  int   PINMUX19_REG_old;
% w$ N7 |. H/ z+ a- P   unsigned  int   temp;  % S' Q* ]# _- R9 j: N# V
   if(MCBSP_MAJOR)* ?9 v  b4 S* p! u
   {
& C) D5 F* o7 |1 a      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' ~$ j# R/ ^/ ?7 M: V      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" b6 n" |$ A) @" ~: \  S9 }' v; ]4 x   }' r  a) K: m7 ~6 W
   else. \  K0 Y4 [3 z7 Q9 _
   {
, K! w3 R" o  w! u2 H' e      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" _  ~2 ~  u" Q3 E6 h6 b2 x6 ~      MCBSP_MAJOR=MAJOR(mcbsp_dev);. L: s7 K0 u/ a5 `7 }
   }$ ~) F; l7 Y2 c
   
- I- z4 N  ~6 U   if(ret<0); U* p) |7 a8 u9 A! y
   {  H* D+ I. c2 a6 D" E* @( Z
      printk(KERN_ERR "register chrdev fail!");6 V" x- F  m3 d, |! K8 R8 V: \
      return -1;" |! ]$ |+ x# S4 j! Q7 d  X
   }
4 x/ m% i  T: Q! i6 v2 A   
# |. t6 _& L. ?5 R/ y   mcbsp_cdev=cdev_alloc();, P# o1 q# i5 {/ H2 B0 X( ]6 H
   & ~5 _7 k" j3 n5 [& Q6 F
   if(mcbsp_cdev!=NULL)5 B  K7 ?& C: q6 M4 Z9 E
   {
5 @4 F* ?* c9 G: W  y; B      cdev_init(mcbsp_cdev,&mcbsp_fops);" I. E1 V3 f( O- H, g1 y
      mcbsp_cdev->ops=&mcbsp_fops;
. g" f- L* S& J. f3 g$ e. v      mcbsp_cdev->owner=THIS_MODULE;
: t: d7 ^! S1 H, P4 U2 [: I      6 g9 `6 I4 P" h: I  p
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ S6 g, S3 D- N1 D, P- V9 N8 a5 N) O
          printk(KERN_ERR "register cdev fail!");3 {: R3 j# J6 b' T+ Z# f7 T
      else6 t8 V" G/ w( n  }+ M2 F5 Q9 E
          printk(KERN_ERR "register success!\n");
5 w. g9 x# H# \- |  k" t& [# O   }! }. K, \# _" h6 y6 b. j( @
   else% ]( W! ~' X% J( a6 a' O
   {
0 m1 U7 G  c5 ]. B      printk(KERN_ERR "register cdev err!");
8 `" Y3 ^- R& b# M  m8 d; j& E      return -1;
4 S7 P: h: I0 R( l# ~) I   }9 h8 ?. |! F% V. o, B6 ~7 J0 @; Z
   & I/ O+ N$ N4 r% p: X1 H6 L
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 n6 ~* {8 j( O* x+ M: c
   if(IS_ERR(mcbsp_class))
3 B6 M. P2 A0 b   {# T/ X9 h' l1 e. a
      printk(KERN_ERR "register class err!");
/ y/ Y( g; b( g! @" n) }6 I0 N9 D, q& ^( j   return -1;
% N/ D5 h! q. K. n$ P   }
5 l; U; Y; l4 G3 R: c$ F* y, \% N   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 O8 `+ I; O0 E" o2 d* d+ j2 w

: i5 J* `, N/ ^3 n( v1 l, G! |   //PSC
: Q9 G6 B& s5 p1 I   //add Enable MCBSP
, O( t3 X) d" O$ h1 y  r( V   //test
- \) t3 E- o# K- C( q8 D; V   temp = 0x80000003;3 s3 F& h/ C; k6 w6 w. Q) Y$ v8 s; R
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 ]% K2 o  ^9 N: w+ v0 s" z   temp = 0x00000003;7 S$ z: L# I$ v4 C9 T! `& }
   writel(temp, IO_ADDRESS(PTCMD_ADDR));2 q3 O" b! z+ r
% M8 r, F2 a4 r9 t/ M  `
   temp = 0x001FF201;
/ g5 v7 L' u: \7 }, B" e6 P- p7 r   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 B, Q/ X  j' ^# i3 m- ^; n   
1 M& K7 N6 l9 T3 @   //PINMUX  ( z/ X7 |# `# I
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: T8 i! S, c( B* I: j
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
6 n8 u  G6 l2 Z8 {8 _$ v$ C   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
1 B" k1 I5 A( w% a; X- V) F2 l) S   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);; N2 H9 T* Y& c
   1 s5 N- D0 s0 Y0 ]
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
. b' O9 Q9 Y- M2 C! U9 E) ^   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
  T9 I) d  h# ?, K& t   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   . u+ i2 s9 q+ O( B- F% p
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% s5 [6 \9 T3 p$ @ % x0 v5 q+ @, D8 s
   //RESETn,L138_SHK2
9 `0 c7 e4 m1 {6 D  ~   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 `0 r% ?! @$ K8 b; @% X8 C  Y3 O8 n
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;     `: P; Q* n. Z" t% \  a& j& C
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ @, Z0 T) u& c& [
0 d; c/ K1 ~$ _" m

7 A6 b' c4 {7 ?  z& ^  //SPCR Register
: f# U7 E1 Q0 m' {" l1 V" j2 V. O  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 t6 M- b. C2 k  f. q1 W( M* f- K  temp = 0x03000000;//(DLB=0)0 j1 l; r5 T1 S1 R1 {' a$ r
// temp = 0x03008000;//(DLB=1)2 W) ^1 R) Y- y" @
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
" a7 R" K* |0 q9 z  t; ]7 M  temp = readl(IO_ADDRESS(SPCR_ADDR));
6 t; @$ V6 W4 \: E: ^% o, K  printk("temp=%x\n",temp);% W8 u# Y; I& n4 f! n8 W- c0 @$ G( i

# f' W8 F5 H6 j" f; n   //PCR Register
  n! Z$ b7 W: `# p5 @! j   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' ~% D" N6 U  M; h3 p# Y- t
  // temp = 0x00000F0F;
& z, T; |: B, \, N9 M' _- A  temp = 0x00000B0F;
! a- K2 K/ f; Z, P' t7 G6 L8 ^% Z: a  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 2 `# l' n) j8 R
  temp = readl(IO_ADDRESS(PCR_ADDR));
. ]) f+ p7 Y: }' m# [! O  printk("temp=%x\n",temp);  
# o( ?1 N2 o/ B0 a, B7 b6 v   //SRGR Register1 i2 v. g4 c9 P
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 h" \# o) h9 {! G5 h5 _' ? //temp = 0x301F000B;# d& q. X, J" i4 _( v4 Y
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
, b" c8 `7 Y, E* {* _2 Q+ g+ X7 U  temp = readl(IO_ADDRESS(SRGR_ADDR));- l, q; E' N% K" ]3 X  e# q
  printk("temp=%x\n",temp);) |, n( t/ L/ r
   //RCR
% V$ i, M% S1 m, p+ y   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ E  s" _- ~+ m4 b- i
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; e+ ?0 g# w. Q6 M# O: K* g" ~7 z   temp = 0x00440040;( y( f9 ~/ i& q7 D7 L, q
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
; @6 b4 O4 I: S3 v' Z2 P   temp = readl(IO_ADDRESS(RCR_ADDR));* G+ V3 Q3 F4 z
   printk("temp=%x\n",temp);
- p+ j. B7 d/ g7 B4 D2 N   //XCR
* F# O- W. B  j9 M) R0 a5 U   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 e: {2 d  L' ]$ x9 _/ F2 t3 v& h$ t* `# g   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ b5 [; P# s5 ^% D5 n3 w   temp = 0x00440040;
* j6 p. _  g" p   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
( a. k( @$ j7 R' m- ]3 Q   temp = readl(IO_ADDRESS(XCR_ADDR));' n1 {& ]% J  N  h) T
   printk("temp=%x\n",temp);. U% ]+ j8 w8 r
  udelay(100);
" @7 Y+ a$ V' P0 Y. g; m/ z- s' r0 N  //SPCR Register/ Q" W& P3 w3 R/ w  l* u7 X
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
! K# Y6 Z9 m$ v# T9 P  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; r2 G3 i) B& _# C  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
% ]  S# h8 R( T$ M8 R& j% B$ p4 o  temp = readl(IO_ADDRESS(SPCR_ADDR));5 e" S; M' C. S$ m' N. O  `- Q
  printk("temp=%x\n",temp);+ l' h+ o$ s; e2 o6 M* K6 ^
  udelay(100);$ l. [0 ^0 x1 L' B$ }
* C) d" ]. I9 P: T  ], s6 s
  //set GPIO direction
# Z+ z* Q$ Z3 T, r' I8 l   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ K# t4 N. |+ y( B
   temp = temp | 0x00000100;//EPR----input
. o4 I, J" ^5 [   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 w: z& c* E) h) y   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * G# Z; Q) A( i
5 ~( N; `  R. Z) ?8 a
   return 0;
. A8 i, c! M& k4 k6 C}
' ^- b3 F" F! g; K, {static void __exit MCBSP_exit(void)
5 O, I! Q' r. Q$ N! w# o{+ N; H- P7 t) {4 T0 b5 b& a
   printk("mcbsp chrdev exit!\n");4 W0 ~& f9 `' \/ R8 Y; \
   cdev_del(mcbsp_cdev);  |9 |; A, w* |& u. i1 \
   unregister_chrdev_region(mcbsp_dev,count);# K+ l0 z& [8 w' N- R. N
   device_destroy(mcbsp_class,mcbsp_dev);4 t& c' j; j9 `$ V" v
   class_destroy(mcbsp_class);
& u5 |# @: N) ]* h# O: ^5 X. I7 O3 t}8 o6 @0 p. T8 g9 j1 c1 v/ L
module_init(MCBSP_init);
9 k- \& X; \. V" @- q0 v; r" Zmodule_exit(MCBSP_exit);
7 i# q1 }+ E! z# c9 p# D$ O% J$ n" {8 E2 J1 p/ n! T
MODULE_LICENSE("GPL");
- q6 P6 t  a7 K8 e* \% W! {( d' \( Q* W  M" k8 v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* f7 s2 T6 S3 X( [& b5 Y
我的应用层的测试程序如下( W: P6 z7 m/ r8 c8 C8 t+ O$ O" U
#include <stdio.h>3 V% t+ @! c/ j  g& i: U' u" {# A, o) I
#include <string.h>/ e; c9 ?7 q$ b
#include <fcntl.h>6 y8 f4 T4 u/ u0 b( K
#include <unistd.h>
1 X) j  N: p7 ?8 y6 V, H#include <signal.h>3 v# n, }! r: B9 h& y: }
#include <pthread.h>       //线程4 g; P$ {2 \4 b$ G
#include <stdlib.h>- [( i$ s3 E1 l5 J9 c6 |1 H, S
#include <pcap.h>          //捕获网口数据
- Z! e3 u$ F5 o5 T9 g#include <semaphore.h>     //信号
8 g( l/ `  C6 {. N4 b/ m, o$ r5 P7 `#include <sys/types.h>     //消息对列
% K8 s& R  e  ^/ }3 X4 F$ r#include <sys/ipc.h>       //消息队列( O- T$ N% ~2 b. ]
#include <sys/msg.h>       //消息队列# [" Y* ^5 A* e& E8 E% \
#include <sys/select.h>
, m: R4 \& n; O1 J6 y. T2 d" L& o#include <sys/syscall.h>
  g) A! T, Q  Q. x" z8 Z#include <sys/stat.h>; `: X& ?$ ?& D
#include <sys/mman.h>. a4 Q. n+ f: ~: j3 U- d! ~: o
#define msleep(x) usleep(1000*x)
; F: ?2 {& n9 \" ]1 t
! G7 n7 A- I9 i+ Z! r4 s( Z& yint main()% H# A$ U/ O6 S* H/ n
{ $ [5 }: |* `3 C& X. K' o
    //MCBSP,ARM与AMBE2000交互设备% T0 A# r) `2 e$ |7 w$ ^
int fd;* {# z7 Z* p3 g  o" @9 T
unsigned short data_write = 0x5555;
: `* V8 A& @) W: Y) X unsigned short data_read = 0x00;
. }" A3 J+ q6 H% B; s  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. P) N" U6 ^& @  S
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 R# s7 B, f3 |5 N9 P
   
/ h* W6 I& [. h  if(fd < 0); G- t# q1 }; I: x1 r2 ^
  {
4 j& B# [' j, B6 |     perror("open failed\n");8 ~' C1 w' o. f7 v0 [: I
     return -1;$ g- ]3 m; L8 p4 @
  }, _9 Q* s' b  ~5 n5 M% I1 u$ X
  5 l$ {4 O+ w" r, _
  while(1)5 j7 X( c1 O4 ?  Z: k
  {
* ]5 W* _% Q4 ^7 w$ n   & I0 |. f% c; d: `& q5 |
   //AMBE2000每次读写是24个字为一帧
- |& U( c# I8 J5 x   //写数据时将数据在底层存储起来,等到中断的时候再发送
; d9 ^3 \: q! a9 J6 o2 |3 R   //AMBE2000输入数据是以0x13EC开头的' z/ P! v) `- |3 [- Q
   write(fd,&data_write,sizeof(unsigned short));
1 l  ]+ p% _+ N7 p6 \   
* f; |, O, l5 q6 W% b! r   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
3 I! i) h: w, T4 d   read(fd,&data_read,sizeof(unsigned short));6 J$ D3 Z1 a& S
   
9 ?# b0 Y; S8 m8 O   if(data_read == 0x13Ec)
. f( }! X% u4 e7 J: ~   {
6 X+ I6 F& Q3 }1 B0 a$ _! [1 D   2 N0 Y6 v# |! ]5 g) L! }. s! H
    printf("data_read = %x\n",data_read);6 l( |. x% h& W: q1 Y+ n0 s% Y
   }" V  @$ F- w8 ]
   
% r) N, J3 |+ f, h' m6 g% ?. Y  Q0 E   msleep(10);
% j9 v5 R4 W" N3 L8 A( P' U5 a1 K  
9 k: P: c, _  [  /*4 }' H: l* \) V; e
   ioctl(fd,1);   , q7 b1 S0 B* Q( }0 M" A5 L; h) ?7 E
sleep(1);
$ ]5 q1 I, z, c7 d4 M2 `% p ioctl(fd,0);9 r+ D' K- y  n$ E/ Q0 u: `
sleep(1);
5 n  ~: M6 [( h, V6 i5 z1 {3 G0 i0 @ */ % }, f- `7 p0 L5 z) t9 t; ?
  }   
2 h9 {; q' G  _8 r return 0;( y0 [8 T$ a/ P6 b

. k# |, d# z& n5 S* R2 c' ]}
/ m' L0 Q3 K% q' B" K
  B& g5 v8 C1 ~5 q' q1 I多谢各位指教,谢谢! 急
7 [% w5 {/ D/ W: Y& D# k. y# X
$ @2 _6 K+ B. h$ g0 [
  f- \: s/ |" i
) Q$ o, m8 [2 i8 C) h, [
" m5 E  t4 s1 |& F% V0 ?# J9 z; F1 J5 l9 n' D! h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 06:12 , Processed in 0.049359 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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