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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % I; @! S& s+ S7 o0 ^
/*
0 i3 P' J: z3 m* [ * Copyright (C) 2009 Texas Instruments Inc* w% Y7 p6 ?& M# m* _! q1 P
*
; y. m5 ]: o/ a. _; U5 P * This program is free software; you can redistribute it and/or modify
% w. S( D$ Q8 P* @. l * it under the terms of the GNU General Public License as published by$ Z7 c. I, A' g8 U0 L1 ^
* the Free Software Foundation; either version 2 of the License, or2 v4 q1 j  Y6 K( a" |* e1 ^
* (at your option)any later version.6 f8 v) H* M* Q8 i1 c6 e4 l
** H5 b9 r2 s& k& N9 `9 r& i
* This program is distributed in the hope that it will be useful,5 ^9 J  @% N( P- p
* but WITHOUT ANY WARRANTY; without even the implied warranty of% T4 r% S4 V% h' L2 n8 q1 j+ _
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" o3 R, J  O2 y
* GNU General Public License for more details.  y( {: u" i( B& b6 X
*1 I$ o" ]9 {3 i* Z! m
* You should have received a copy of the GNU General Public License
' M, {6 X$ i( s: m4 _$ x) z; s) M# q * along with this program; if not, write to the Free Software
' Y, m5 q+ E2 T! Q2 v; J * Foundati
- h! K* x5 _8 x8 C9 T7 }2 `0 n, I* F*/
- b: z# F5 d8 m0 F1 n5 ^* T#include <linux/module.h>
# J6 I1 P: @3 ]7 V. T, P, s7 E$ ?#include <linux/init.h>
; ?! _, }$ S  e- j" D* U) |2 q6 r7 M#include <linux/errno.h>
! K. A9 [0 ~$ B3 J6 M#include <linux/types.h>
2 b3 p; M( k3 P( |% E0 C#include <linux/interrupt.h>) S- I3 U( p3 ^2 r) a
#include <linux/io.h>9 |- @  Z7 r% p4 _- F' ^
#include <linux/sysctl.h>
* Y; @2 p5 i& F# W#include <linux/mm.h>
0 W& m" ]. Z! n! i0 j5 c  d#include <linux/delay.h>
3 `3 _! y- Z1 u& {, e7 b# i#include<linux/kernel.h>
* r- g8 w9 @) l; t: s' s: k+ y4 J9 a#include<linux/fs.h>1 W- V. R2 U  j, R# H2 R' x
#include<linux/ioctl.h>
; a* M$ P3 Q0 ?& s# C#include<linux/cdev.h>
6 j9 Q/ {5 T6 d, @, D' h) h! T5 a! r7 K#include<linux/kdev_t.h>
0 P5 n# i$ U& L  Y! I( L. q6 _#include<linux/gpio.h>
+ d1 M, \- }/ N, n# _#include <mach/hardware.h>8 W1 l0 L3 F# e, O8 u
#include <mach/irqs.h>
2 G9 q+ z2 l1 q% w$ L
; V% _7 k( q: ~/ k/ t: v" ^#include <asm/mach-types.h>
% [" o0 ~- S- I#include <asm/mach/arch.h>- c9 Q3 B( G( u9 J
#include <mach/da8xx.h>
' r1 k8 H- ]8 b! p" P& _#define  SYSCFG_BASE   0x01c14000
/ c2 C! J. J% ^" \/ U8 O3 c8 W! H#define  PINMUX1_OFFSET   0x124 ) X" @/ \& G1 b3 r% ]
#define  PINMUX18_OFFSET  0x168 5 `4 O! G# F" p) N8 G% a4 C
#define  PINMUX19_OFFSET  0x16c- y# E' H$ h2 k9 O* i
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR% g  e! R2 Q7 Z' M8 y* Y' A
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 _  J% K. v7 x( ^2 c3 L
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
# ?) T* g7 L7 Q/ G; @$ w5 F#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ t0 L. U& Z" \$ S8 c
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
4 L9 o! s9 a) [; W% U( {4 ~                            ) Y& g/ A6 x9 j& ~
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR3 ~$ S5 y; I# @- j& K
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR$ q. V* V! `- Y/ ?
//PSC
9 m4 E7 B, n8 J) \#define  PTCMD_ADDR   0x01E27120  
( O, I7 h3 b: y- s+ L#define  MDCTL15_ADDR 0x01E27A3C+ @, L+ Z: u! }9 D" ~" \: l
#define  PDCTL1_ADDR  0x01E27304/ ]8 h+ Z8 G2 m0 e8 m! l
//GPIO8 direction- e6 Q$ b* Q: E3 v* k4 Z, p
#define GPIO8_DIRECT  0x01E260B0* F4 w1 F  A' E) d$ h: Y) a5 @9 o
#define GPIO8_OUT     0x01E260B4
( ?2 z9 i( ]0 H#define GPIO8_IN     0x01E260C0
) q+ `. M8 Q( y7 ^0 F
" p% z1 ~/ y+ G; p9 i//#define MCBSP1_RINT    99              - H9 O9 d6 h  t  L% A. D* X
//#define MCBSP1_XINT    100  & J2 [+ ?$ R; ?0 C" L
static int MCBSP_MAJOR=239;! H  r+ g; u5 y# X. c# I( t; c( n
static int MCBSP_MINOR=0;, ~. n$ g" E- e! d" L, W; ~
static int count =1;
& a/ x" n! q: r/ p) d1 |5 `9 k3 [, r! }/ g+ |) m) O% V
#define MCBSP_NAME  "MCBSP-device"; v4 ?+ A; G$ ^2 {3 v8 {! w
% @8 y$ D  x+ p/ k8 E- U) p  W
static struct cdev *mcbsp_cdev;
4 V. y( K8 F4 ]2 _- ^9 [static struct class *mcbsp_class;  A1 k4 t% w! ]( g; c9 r" g
static dev_t mcbsp_dev;
5 X: b. T$ e+ I! N- q6 r: l& Punsigned int DRR_data;4 X6 A, ^/ V, @; S) K  m: V
unsigned int DXR_data;
8 _1 E. t0 B$ u$ h0 r: R# D  \static int mcbsp_open(struct inode *inode,struct file *file)6 P$ V2 n5 F; d. |
{$ }' @: ^7 u5 O5 y5 D+ D
   
& {5 I- c0 x* a& ?, E   //interrupt enable,initialized4 T# \  g6 a% }7 b
   unsigned int temp;
0 y8 k. }; m* f   //SLEEP_EN(GPIO8[10])---0
# a" u& ?8 e" z7 f( X* S   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));1 A' ~& ]. ~! D# l: N2 G) }! ~
   temp=temp&(~0x00000400);
# x8 O4 P7 \  p% o. A5 R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! z& @- }2 t4 ~8 K9 U$ m, T0 Z
  //RESETn(GPIO8[8])----0----1
! d5 X+ i! Z/ [# s$ F   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, d& G, f! u. Q
   temp=temp&(~0x00000100);5 ^% k0 a7 C( J! L* j9 o  \# N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( U$ _+ G3 n1 q0 D: q+ @! n/ {) U( K7 U
   udelay(100);
" H5 A! k  w( ^1 U   temp=temp| 0x00000100;
+ b% d1 N- R, Q3 F' w- O   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---16 ]' ^8 g4 ~$ I" P
   udelay(100);: A& [! _5 R! m: W+ J- L5 A+ a
   printk("open success!\n");) C* s) X9 R3 u# m0 o7 X  o" ]6 w
   return 0;( @9 g8 A4 O( Q. l1 |
}; j0 o5 ?. b1 Z5 q# r9 i4 s

# ^8 Z! u" m: i6 Q3 Kstatic int mcbsp_release(struct inode *inode,struct file *file)* G, M7 o) a$ c" W- _& I
{0 D1 R5 T  N% {
   printk("release success!\n");# e1 P8 R2 e2 h: {# t- n8 |
   return 0;* R4 ~: p5 ~* E6 ~$ u& _! ]
}% V4 A) `  B3 T& d8 m

! |5 y: O0 ]4 k1 ]. {& ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 b' |9 F) D7 Q( n* ~' o& X{% E1 L0 h' n! A& ~
    copy_from_user(&DXR_data,buf,len);' b1 Z* s8 V9 x$ K2 Y. x( w% y
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 V1 x: L3 _  g' E; n* j" b$ f6 F+ r
    return 0;
9 B# I! Z4 a9 O" {3 y ( ^3 b5 B& V( D: |! q
}; T- x3 e/ w" u7 B. n" I, N

* X+ z! X& f6 J8 W) _" s- pstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! @1 _1 R; d/ q/ P
{
2 }8 @1 N0 R( U3 E8 V  y   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ v* Z1 o6 t& Y7 ]! v% \. O0 D; W
   copy_to_user(buf,&DRR_data,len); : ?" N# V3 q! Z+ S" i' H
   return 0;
, m8 _# l! G; H1 z7 {# B}+ w9 @( H6 S# G6 U1 j8 R* a: i9 N4 q

5 w3 M8 ?* S2 F7 f
8 r6 K! H- L  C2 q% c5 wstatic struct  file_operations mcbsp_fops=1 V4 Y: @' p2 }3 A! K8 ]$ R# p' Z
{( v+ N- I) S) t+ _- L
   .owner=THIS_MODULE,0 ?6 U6 K3 r2 M8 f; W  |9 R
   .open=mcbsp_open,' e3 W4 f# E4 k! l" O6 N
   .release=mcbsp_release,
  H' \$ o, b4 o9 ^   .write=mcbsp_write,/ Y8 U- W4 m" h
   .read=mcbsp_read,
1 t0 h" K; e" T6 R$ U+ w$ k$ e};
" @) h% y; k. m1 Jstatic int __init MCBSP_init(void)( x' a) g2 s$ i
{8 B+ o) J: x  a" s; W4 V* u
   int ret;1 |1 x8 L5 p. g0 f2 ~. D2 b6 D
   unsigned  int   PINMUX1_REG_old;  z; Y( g& C# O  t! C
   unsigned  int   PINMUX18_REG_old;
, G! \* l( {; A2 M   unsigned  int   PINMUX19_REG_old;7 c/ _2 y+ [% W0 m# J
   unsigned  int   temp;  4 X4 @% }4 g( A" e& g
   if(MCBSP_MAJOR)2 I9 ~% V' I" b+ `" ]$ a
   {& A" \2 j3 d+ E) z0 I8 N- d
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* ?. v7 X# s) i  ^, ~; e      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" f5 C* |7 E  Z" h7 e1 j   }' Y5 z7 k+ Z. i" }. K- W
   else
: M4 Z6 A, c+ V  j3 ?0 p   {/ z9 z5 Y" N1 j6 P' }7 O
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 h6 @. `" m9 v; c
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 ~- y, [& z0 W; ?/ A; b& F   }
" }& M9 N. u' m: X& s   
! v) Y1 A$ V' M   if(ret<0)
- |* R" p& I3 o' X. Y4 u   {
* V8 J& }+ ^" \/ ^8 M& ~      printk(KERN_ERR "register chrdev fail!");
& _  P) t! }! B( h: y2 @* i      return -1;5 s7 c: N8 z) e" o8 j5 O1 \
   }
  p8 f% c% d$ \) _( a  P   ( s$ F7 m" |! @! s/ ^% a+ d% G& s
   mcbsp_cdev=cdev_alloc();9 e  L. g& J2 c2 ^
   ( Y' U2 I0 u3 l- U# S$ F$ i$ r/ h
   if(mcbsp_cdev!=NULL)
  j- z9 A2 @+ L& e1 a   {3 [! s% d) W9 d* f
      cdev_init(mcbsp_cdev,&mcbsp_fops);$ R  @4 K0 m+ Z$ k+ T
      mcbsp_cdev->ops=&mcbsp_fops;
& X1 S3 E/ n( a( X0 X# F  M) {5 H      mcbsp_cdev->owner=THIS_MODULE;
3 ~3 r1 j, T: g& M: O- O6 y      1 T; a7 `1 h' y  Y, m/ q4 a. ^
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% n) t$ a) t. c+ c* Q" J; Z
          printk(KERN_ERR "register cdev fail!");
) m0 ]- E" o( H( ^2 D% A) _      else( w+ G% I% z: r% @
          printk(KERN_ERR "register success!\n");4 c5 l8 ^# G/ `2 Z& U" e
   }
: E7 X$ w& T8 B$ }2 l3 y. I   else
/ t& a/ _( F+ j2 Z. P% B5 F   {
6 n, C% S2 u8 I5 K5 [1 ?9 H5 l$ [+ b      printk(KERN_ERR "register cdev err!");" k: c$ C: m- ~' K+ C
      return -1;
5 _. V! _$ t$ t8 j  P   }- s. J7 k: c% U( f; J" H7 Q1 j
   8 {1 q1 p- J; j0 X3 u2 H9 J- `
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
3 x9 q" I- p% k+ @) y8 `   if(IS_ERR(mcbsp_class))- n6 S: ^: E  e: K: N/ G5 J: B
   {
8 z) j% f) S  a      printk(KERN_ERR "register class err!");
  e1 U& p( f0 ^! A2 Y/ \   return -1;( u# a( x1 E; H" U
   }8 ]% S6 d5 b+ R* Y
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 l- z3 w6 e/ v, t5 E6 h
. d' w$ s- q- l' _" u8 k
   //PSC3 E8 Y- u& B5 `1 M7 i
   //add Enable MCBSP
3 o# r. J- ~2 k* B   //test
: o6 I4 f  p  A- E2 q) l# u" _) s   temp = 0x80000003;6 P9 Q. \2 i$ |
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));  f  @' ?+ M) o9 P0 r7 E
   temp = 0x00000003;
. [1 \3 S. a% i  O  v   writel(temp, IO_ADDRESS(PTCMD_ADDR));: G4 X) i. Y2 ~9 s4 D

  ~4 b: ?/ N% u; d0 D  k/ `& U   temp = 0x001FF201;' h9 b$ T6 S5 z, {+ v+ w* F
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ w, p! L2 V7 b1 b9 P& c
   - C9 T5 D5 V2 m% f0 {1 i! S* T/ Q
   //PINMUX  7 o0 G9 p3 W' v
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* p  x' V0 B. `/ L' r' b' L, p2 X
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
2 F) ^/ c1 m4 g/ z# c$ l   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
0 k) Y6 y% b* j# q   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) i" t6 v# X. d  x3 I( q   * c0 N8 D+ a+ Z5 \6 ~! H7 p7 u' z
   //SLEEP_EN,EPR,L138_SHK1,L138_RC* y2 d* Z/ v+ N. C. V$ n
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
. E7 O, `( H: ?" f   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   & e5 y: E2 q2 R7 i, F  a# J
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 W! ?6 X+ v+ W% A/ _2 F

- ?, u' U! C1 I; |! X& J7 }$ v   //RESETn,L138_SHK2. k& P% g, J7 W* B# m
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
+ E+ G3 D* e# u1 t* R3 }   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
# s) [! k" O- V   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ \" @' @) Y& ?  w3 k5 j ( W+ Y6 X+ E! ^( W" p+ I
- i- E$ I5 h9 Y! g; F" X% ]
  //SPCR Register1 O) p, B4 w' ]! X& s! N9 P& |
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( G/ `: n! g% X9 r3 y2 X' Q  temp = 0x03000000;//(DLB=0)
# @: u) ], ~- s0 N6 c // temp = 0x03008000;//(DLB=1)
* R6 O% N" m/ m2 i4 h0 @  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset- j& T; q% h, A% g
  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ ~5 E( ~  c4 k! g, R; Z  printk("temp=%x\n",temp);
* Z) J& n2 }+ K  U3 L4 O
2 J% T, n  ?, E0 f   //PCR Register
- E  K5 u/ Q# s; E' U0 [   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) X) n4 u( ~7 Y, ~  e+ p3 ^( h  o
  // temp = 0x00000F0F;
0 I5 {9 w9 T0 r% g5 g& n( @0 R, f  temp = 0x00000B0F;" c# I6 B( f  D5 B3 w7 ?3 t
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
1 N  Z) q3 q% g) d& j  O' B! I1 T2 z  temp = readl(IO_ADDRESS(PCR_ADDR));
. F8 B1 }; |  [+ d0 A2 t' k5 G$ u0 z  printk("temp=%x\n",temp);  
7 s! s5 b& ~, N) N7 Q; u   //SRGR Register
# C* N, d$ N4 m  _   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11$ R6 b. e% t1 {6 x5 x
//temp = 0x301F000B;
/ Z) T3 j1 F' u8 e5 ~1 U   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
4 N; P( B3 g- O+ B$ `, c  temp = readl(IO_ADDRESS(SRGR_ADDR));. R- ]4 q% B; I9 M; ~0 G" I9 q
  printk("temp=%x\n",temp);) f0 W" {: o. c7 N0 d$ W
   //RCR+ E, Y2 }( e2 r7 l! R
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( h+ F  B" p9 {
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ S* t, A5 W  B7 E   temp = 0x00440040;  d' c8 x3 }( \* X. S
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   3 f. x' o5 s4 K! V- Q
   temp = readl(IO_ADDRESS(RCR_ADDR));7 P) N. R+ \) ?
   printk("temp=%x\n",temp);
& d* C, H, f  ]: Q8 ^: S5 b5 A   //XCR
% s' M6 x/ r3 J- Q; Z- T   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
6 B+ y) R7 V6 w; n$ q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-00 E- D0 j3 \# A7 W) ]
   temp = 0x00440040;' w1 {0 G. o- Z7 R- l% j9 B" d
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   # R- S2 F6 c1 W9 g  N/ l
   temp = readl(IO_ADDRESS(XCR_ADDR));) Y# O+ |5 Y9 S, `& r
   printk("temp=%x\n",temp);
9 b- d% w6 s9 o6 G' F- G3 d  udelay(100);
9 H; S% ~& Y% q1 A6 Z  //SPCR Register* n9 l3 f0 q( q
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 k8 J0 U  i; N- V" p1 O. j
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1. x6 v' u4 C! J
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
/ ]6 i/ U) |# s8 f: R  temp = readl(IO_ADDRESS(SPCR_ADDR));
! @4 K7 ~, V0 u% `# o  printk("temp=%x\n",temp);/ `( R8 }5 n* ~) v( Q8 U  t
  udelay(100);2 w7 U3 E; g+ f) R
! T0 o* J  b  f  s8 ~; W6 s2 [1 R
  //set GPIO direction
. p4 J) l% |' ~: \, I& P   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; H0 e  n( P0 F( ^' T4 n# F   temp = temp | 0x00000100;//EPR----input
, o8 X, H# i6 \+ k- V   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" E) T; C1 G. v; L
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 z, E, E- }" h0 f3 ` 2 F5 w4 @4 [. q2 S' ^3 d; C
   return 0;0 F$ N  y1 U5 [, P
}- c# p3 [) s- z$ k3 P' I/ {6 D
static void __exit MCBSP_exit(void)$ u+ x! t" y7 J  f- l
{
) h  k3 w2 u" j   printk("mcbsp chrdev exit!\n");' j8 r! J, a, k+ F
   cdev_del(mcbsp_cdev);/ r  l7 ^9 T4 @" E
   unregister_chrdev_region(mcbsp_dev,count);
4 g! Y8 R- Q! ~1 F$ ?   device_destroy(mcbsp_class,mcbsp_dev);
2 b# [: k4 |$ F! p3 Y7 a( M  Q   class_destroy(mcbsp_class);7 H# v" d) F- c
}! o. e* \7 H+ a  B& Z2 L' b+ y
module_init(MCBSP_init);) S% y6 z* j# Z* X+ k
module_exit(MCBSP_exit);: u2 C2 I) g0 t" [2 x
8 f, @+ R5 \% A
MODULE_LICENSE("GPL");3 w$ O6 X( Z+ J
9 |7 ~; q+ }: j/ j9 b
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。/ b: j2 Y/ E. P9 q
我的应用层的测试程序如下
( c: ]( _* E0 _3 Y; [5 L. u#include <stdio.h>% q# E2 O, s- e8 p1 m
#include <string.h>
1 p2 T) |" ~+ U( F; {7 n9 O#include <fcntl.h>3 G) F3 Z# G  z5 x8 [- r5 [- W
#include <unistd.h>
% x7 z; N) Z8 ^* ~# v#include <signal.h>
( J; V, X1 c6 q1 t2 R: v( d#include <pthread.h>       //线程
" t# O7 q$ g% Q. Q#include <stdlib.h>
! y0 l' F9 A) L7 F#include <pcap.h>          //捕获网口数据
' L) b$ i4 ~4 ~1 Z6 E6 \+ j6 t#include <semaphore.h>     //信号8 @1 b$ Q2 H2 W- z$ P8 B
#include <sys/types.h>     //消息对列
. o2 Z" Q' ~3 I8 o#include <sys/ipc.h>       //消息队列4 E' B% r3 n, o4 V0 U- ]
#include <sys/msg.h>       //消息队列& g0 m! O* `5 b/ L
#include <sys/select.h>
0 j' a, K3 E3 l5 u' y#include <sys/syscall.h>. K4 h" q6 E& W$ q$ J
#include <sys/stat.h>1 Z! m) V- M7 T7 y; q- ?) t1 c
#include <sys/mman.h>
4 o  k( q! Z/ R0 x$ Y1 R, t3 [#define msleep(x) usleep(1000*x)" ?- T, L# ^8 A, t8 Y' E% z& a) I1 f
2 q+ i* a* r2 Q& Z
int main()
; K' o/ v) J) d' S( y7 Z$ ?{ ) z& n3 U  q" C8 \- R! g5 p
    //MCBSP,ARM与AMBE2000交互设备% f; m8 B7 o- x  ]# w) z& [4 P
int fd;) E& D7 ~# [0 U( s# Z% l$ r
unsigned short data_write = 0x5555;
/ P3 p+ U% Y: C9 \ unsigned short data_read = 0x00;6 s/ R7 `5 e' K* F, c
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 O) |5 F: k7 Y' j1 ~6 [ //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# a# G6 J, r' z; U- @# t
    5 H% [  {- g0 L( Q5 o. O4 Q
  if(fd < 0)0 H6 M, J) z- ^* X* G; F1 l/ ^
  {
- i5 P( ]4 x) F4 X     perror("open failed\n");
. _: A1 j6 k' ], }! U     return -1;% u7 Z& x- I- n& i# W' Q$ [2 @
  }& X& R# T6 N$ i" Y6 {: L* z$ n/ P
  
4 k8 r) b6 ^. _  while(1)
% u1 }' r5 j' V9 I0 k/ H  {
4 |, {# D$ l$ ?9 Y   
. B% w7 L5 T; A; ]# ^+ [! a3 A   //AMBE2000每次读写是24个字为一帧
. Z) v4 x7 T: G3 I# B% r6 T   //写数据时将数据在底层存储起来,等到中断的时候再发送# ]4 H3 z7 ^7 `+ c# K! `0 G
   //AMBE2000输入数据是以0x13EC开头的
4 [* a' g0 r' c   write(fd,&data_write,sizeof(unsigned short));6 W; [( M4 o& f0 d
   
2 z6 D, \* R- ~; Q* R   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
5 G7 l% P; f6 ]) w  J   read(fd,&data_read,sizeof(unsigned short));
. j# U2 A* }+ _6 O+ @+ n" z   
$ @4 T+ ?% }. _5 ^' p5 N: j   if(data_read == 0x13Ec): i1 u0 z# D! i% L4 e
   {, q, b, B, a6 d9 c' S+ f3 X* c
   
( \# i7 e9 _" V: m! Z% {3 j2 |% S' S    printf("data_read = %x\n",data_read);
" E& h6 F( M8 V3 f$ O. g   }) G7 h4 }% u$ {" V- K4 X' _9 C
   ; o  X! T1 ?5 m+ P% f
   msleep(10);1 w/ n0 w3 d3 g5 X, U+ |8 K
  
2 r& |$ L5 O1 Y( Z. f* d% A% B- q  /*
% d( q. e" _. C* k5 t   ioctl(fd,1);   
. u' q5 j! A& N" c+ ^7 v sleep(1);, g, T" q2 |2 x( E* {$ B
ioctl(fd,0);
# O3 d0 @! N6 x1 V7 K1 S5 T; A sleep(1);
/ ]$ M9 i: _3 |% Q */
5 w  J' `/ x8 Z$ I1 r5 U  }   : i7 U& L( o5 ~) l
return 0;$ h! ?% \3 [$ C, G* h* f0 W- [

8 Z  M/ ?! M5 o/ ^( A}# |4 k7 x- z* |; v% E5 I0 N1 y0 j6 M

4 b0 G* A3 X) a; I4 ~多谢各位指教,谢谢! 急
  Z7 J7 c5 s" W4 u
. G! o# m3 E9 e
% w  g# l* T* C& {  n8 B8 y
2 M8 `  i% y2 g9 |  {3 w. j
7 S+ ^0 }; ?' ]
: }. H& x; V9 l/ n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 22:26 , Processed in 0.048359 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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