McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 Q. s) r) o& d/ P! L/*+ I& P& |* V7 m6 M. G8 W/ i
* Copyright (C) 2009 Texas Instruments Inc
- M$ R2 G* O! O0 ?: O *
5 A( L0 Y' u/ q: d4 V * This program is free software; you can redistribute it and/or modify
; T% G; |+ U3 u+ u * it under the terms of the GNU General Public License as published by% n: V3 O+ I: q" }" z
* the Free Software Foundation; either version 2 of the License, or7 L, M' F/ q8 o
* (at your option)any later version.* P" J' L0 D7 {4 i$ U* S( k
*6 ]( p. R1 |2 d* u9 Q
* This program is distributed in the hope that it will be useful,* N7 Q+ _" J! J* ?9 W3 |' ~9 X" L
* but WITHOUT ANY WARRANTY; without even the implied warranty of# d  X7 v5 E$ R8 [$ T% m
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
& e2 R) B0 H" ~9 _* d * GNU General Public License for more details.
3 v3 X' N2 }3 H7 U *+ G% R* S& k0 \) E. [0 Z
* You should have received a copy of the GNU General Public License
. T5 f( g3 P: u- q2 R7 O- V  z* c4 e * along with this program; if not, write to the Free Software
# ~! ]5 Z% B% h3 U1 k * Foundati& e/ e- T- H+ P, j% _) Q% B& w
*/
: b( q9 [- H* ^#include <linux/module.h>: F% P5 i6 C" X
#include <linux/init.h>$ b/ S* @8 Z: N; M/ k3 w
#include <linux/errno.h>
) _$ c  K& ~; T! g#include <linux/types.h>% e4 w- `9 X( y0 R* {3 d! j6 D
#include <linux/interrupt.h>8 I! N# N$ n9 q
#include <linux/io.h>4 ?3 k) u9 r1 J% w
#include <linux/sysctl.h>/ _- a: X6 E# F" z3 L. k# V
#include <linux/mm.h>8 j$ `# q" q# C$ R3 T
#include <linux/delay.h>
6 w' g" u- }% T& q! z. Z#include<linux/kernel.h>
6 ]2 A5 b$ C) Z) n) [#include<linux/fs.h>
/ m- s& @8 N1 S- A, P9 w- _- P- u0 ^6 [2 r#include<linux/ioctl.h>8 M+ |$ h- o, |# l2 x) L; T
#include<linux/cdev.h>
. I) [+ q. l- q; L2 w#include<linux/kdev_t.h>+ I9 ~$ [9 X' v0 g( v! X+ E3 i
#include<linux/gpio.h>
4 }. p% W; P6 N#include <mach/hardware.h>
' n& ?8 e" m" z6 ?. _#include <mach/irqs.h>
& p! |" R$ v9 J: r6 h
1 v+ ^, Z9 C4 g5 {6 y# v- n1 \#include <asm/mach-types.h>
8 V8 D  A# Z2 _) J. x* ]#include <asm/mach/arch.h>
' l' a3 B7 h" l  v6 j1 W: T#include <mach/da8xx.h>
3 \! `1 d- L6 R5 m#define  SYSCFG_BASE   0x01c140006 I" n& s- i  H0 S/ Y
#define  PINMUX1_OFFSET   0x124
, F8 {$ Z' a5 ^/ h5 a#define  PINMUX18_OFFSET  0x168
# B$ A+ I5 F. x8 {, y#define  PINMUX19_OFFSET  0x16c
  t- r! F; w8 o9 \4 G#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* ]7 m. L9 s. \/ d$ q" f; n+ o
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR) y/ D$ d5 I* U' L7 S
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
5 r* _' Z( V  V- Q& I7 u2 Y+ J$ I#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR8 H8 _& z- x7 i1 F: B
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
) P5 v; U- R7 \. z                           
# Q9 T% C5 A9 ?9 @! t#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
! W5 Y( k& B6 k0 R( a#define DRR_ADDR      0x01D11000  //MCBSP1_DRR" ]3 O/ X3 I% _
//PSC: v5 Y1 _7 s: x+ ~* f3 T
#define  PTCMD_ADDR   0x01E27120  
- x3 K: z! q3 S: A  ]#define  MDCTL15_ADDR 0x01E27A3C7 f% d4 W* c4 J; ~
#define  PDCTL1_ADDR  0x01E27304
- [5 Q: g& f( [- y0 p//GPIO8 direction9 w5 Y3 E2 l- j# t& n8 V
#define GPIO8_DIRECT  0x01E260B0+ u. s5 ^' ?9 _* M) T# q
#define GPIO8_OUT     0x01E260B49 l' Z% }& `/ o" _% @) \- K# f9 k2 n
#define GPIO8_IN     0x01E260C04 Q/ ^3 ]6 i; D2 `" S; H% d

+ j, {) m  Y( p8 ^  c//#define MCBSP1_RINT    99              ( o2 y6 l1 y3 o
//#define MCBSP1_XINT    100  
0 N8 n" z2 R" k3 qstatic int MCBSP_MAJOR=239;
' }  o# D7 L) J8 h0 y: jstatic int MCBSP_MINOR=0;
" Q" N4 `9 j$ _) r+ I3 Dstatic int count =1;2 f; M' l6 ~. B# k5 k( t
8 k! n3 X, v, X+ v7 E. L
#define MCBSP_NAME  "MCBSP-device"3 j6 o+ k. R7 A8 x- O) @6 z5 q- y
  }* X8 C, T: [+ }$ j
static struct cdev *mcbsp_cdev;  U" O- R0 c7 o" c! z
static struct class *mcbsp_class;; z$ @( h3 A% v; _& _* F
static dev_t mcbsp_dev;" b3 D) ?! g# _) ^  s2 I# S8 _2 W7 d
unsigned int DRR_data;
& {) {5 ?- C* Z3 M5 M; X* Runsigned int DXR_data;
! [1 H! [- M* @- P3 _& L" sstatic int mcbsp_open(struct inode *inode,struct file *file)7 M2 o9 l& i9 R# b
{
/ p- T8 R' K/ v6 Y# L% \% {( s   
" @0 ^$ K* g' }" Z; y   //interrupt enable,initialized
- ]3 d7 a5 V' L& v$ y  S   unsigned int temp;  n  L' c  K( a7 s1 j& m
   //SLEEP_EN(GPIO8[10])---05 H/ M4 Q$ W4 w* k. b; e) c
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' Q* Z9 R7 |" Y
   temp=temp&(~0x00000400);5 [) K2 C* t* U# B. l/ l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]4 I9 _" `" c; j9 w7 c
  //RESETn(GPIO8[8])----0----1
. {# X. ~- ]8 j0 p5 {0 N0 B& ^/ d   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ n# L( L- N- n+ k# i+ t. T& x
   temp=temp&(~0x00000100);
5 K% m4 G5 K: A, Z" t   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0  j  {1 j, a3 O2 N4 X9 v
   udelay(100);4 i7 E7 q! l2 V: `7 Y
   temp=temp| 0x00000100;* P) v0 K3 ]" N
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. P& ^' B7 `7 `! a3 u% }   udelay(100);
& Y" ^. J6 S( M& v( C% O1 l   printk("open success!\n");
' U  {9 x- b& x( Z   return 0;3 K! J+ S$ p' ~: ?2 R' n
}" }# c+ Q/ h3 m6 U% b9 r. s$ u

2 N8 F+ f+ Z$ Tstatic int mcbsp_release(struct inode *inode,struct file *file)
1 M* k: h5 Z! v! l$ S" Y{
, D, j4 O6 R# ~- j   printk("release success!\n");4 s5 I' ?5 d1 A
   return 0;3 Y, F" _" W; h& v7 |2 T  c
}9 _% G) P" {: G8 `6 X0 n' a% M2 w
! U+ w, l5 o, [* }# i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; N: a& ~: @$ p7 I, X2 a{
- i" Z  r5 n4 p. Q1 d: m( F    copy_from_user(&DXR_data,buf,len);
5 S# Z7 e5 d8 u& R" {3 M# N, F    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
' N# e+ J: v9 Q1 j( g9 R+ e7 I; j    return 0;& a. w5 B- {# |- \

8 k+ u6 @5 `3 z/ u}$ W7 w$ V, `( ?2 ?3 A/ o$ ?

  p  U" M. j& L& z" X. v! Cstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" v; G( f# w2 I6 w8 L7 m5 }: M
{ * J0 _; Z  B6 M; D- ]6 }: U' k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 w4 ~( c( ]- S+ ~: W3 T0 w/ f   copy_to_user(buf,&DRR_data,len); + c! b; d. d8 F+ h. x
   return 0;  T* W6 l' l- ?" G; c
}$ J8 _) s- @& ]$ n" F- e

% L6 x5 {0 E) Q/ i7 F: x% t# V# G
& p  l1 v/ x# v% Mstatic struct  file_operations mcbsp_fops=
: D) z  Z, x7 F9 i% m{* Q. Y5 Z; {! h% ]4 U
   .owner=THIS_MODULE,
7 V) {5 H" F6 k. D5 j0 w   .open=mcbsp_open,
5 a* P( v3 k) H* B2 V7 ?   .release=mcbsp_release,
/ Q( v; M, n- p1 C- T) S7 H   .write=mcbsp_write,# T8 T" k; ]$ C# s6 \- [3 h4 N3 X
   .read=mcbsp_read,0 S$ o2 q( [% |7 `- Z5 \
};' X/ Z2 j% B) s7 R
static int __init MCBSP_init(void). O. G4 E6 r% h  a+ ^6 o' ^
{" Y2 g2 B; }1 `- `+ y8 ]: ?
   int ret;' {' z( ^! t7 F/ j7 w
   unsigned  int   PINMUX1_REG_old;. o! @8 O- v% [8 c7 `
   unsigned  int   PINMUX18_REG_old;4 d( y0 P- a9 k5 F" [' U1 [
   unsigned  int   PINMUX19_REG_old;
# M) E. n( q- A$ f$ C   unsigned  int   temp;  
$ t' b  m2 G9 P$ D5 x% y   if(MCBSP_MAJOR)
" ]- F+ w2 e* B# {- M1 P   {
) S' i& w& c! ^" K      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 w# m  L) n" Z; P! ?
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ v# y& O5 J" n! p: i   }) O- ], A" G7 M% Z" D- o
   else  ?" D- R; o& g
   {) H1 [+ k& P2 e0 f# H0 ^5 q0 g5 j
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, x, V" `( u, `) {& N
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
$ K/ y0 {+ B! c2 ^7 d   }$ c* O' a' `, \: b! l- ^
   
; i+ Q9 ]$ \/ }. v: ~   if(ret<0)
7 P3 z4 C- y- w9 Z* M   {
" H$ ~8 o" M# j      printk(KERN_ERR "register chrdev fail!");
) s9 w' R3 [# p) X8 w, a6 Y' @      return -1;
0 Y$ E6 w/ |" h+ s   }- h3 a1 f" N, I& @" @8 `! W; x
   
6 `( s) E6 s* [   mcbsp_cdev=cdev_alloc();& v" l* L  B3 J. I7 B1 s7 ]
   
6 J5 y  G4 J  l. |( i   if(mcbsp_cdev!=NULL)
1 A: U* Z6 }6 u& F0 C; _- c; i& i   {6 |3 {5 }. b' C' {
      cdev_init(mcbsp_cdev,&mcbsp_fops);' j1 m5 H( U8 W5 c1 u4 @
      mcbsp_cdev->ops=&mcbsp_fops;
5 @* [( H/ F7 I      mcbsp_cdev->owner=THIS_MODULE;2 I/ t* z, ?8 V
      
  W( x: ?% T' U  }2 [: L      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
# |7 D. P1 H, X: d1 T5 }          printk(KERN_ERR "register cdev fail!");4 T) [: |" ~' K$ l' F
      else5 N. M* u" E9 b( O0 t4 ]
          printk(KERN_ERR "register success!\n");
1 p) Y/ N6 [6 ~: w   }
# ?# D  V) y& W) f3 i# Q   else
. I/ v! K4 X3 Z' C& ?5 P3 I  g8 \. ~   {
2 Z* f: x# X6 ^      printk(KERN_ERR "register cdev err!");- [1 M7 p* K! m. {
      return -1;3 X; G7 X& Z5 w& @5 l$ I+ S
   }
  b% f* [- t" X, `; S8 i; s   4 O0 h8 o1 g- ^5 ^2 m) Y
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 k7 C) H- l( E9 m5 V1 P5 K
   if(IS_ERR(mcbsp_class))9 h2 u) ~! p, j
   {6 y# e+ b; l/ y. F, \
      printk(KERN_ERR "register class err!");. V9 c& }0 C9 O  l! Q, O, b5 r1 m
   return -1;& P' f6 g: v+ \8 L( C
   }# I- ^" {" [, u- J, R
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 O* M9 X, h, U9 C  q

! E" Q* M' d% ?   //PSC8 o- t/ T( K2 |& e+ F
   //add Enable MCBSP
; b& v' u0 B( ^1 u, F- D5 B& l   //test
7 p4 r3 r. t5 ~" k   temp = 0x80000003;5 ?1 }4 h  R, T$ q: {  e0 R
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; k' |, l% N2 k5 U   temp = 0x00000003;
4 e* u# U) E5 Y$ W; C   writel(temp, IO_ADDRESS(PTCMD_ADDR));+ W2 E; T: B  N

+ \+ Y) L5 \( @; T8 d3 C( D   temp = 0x001FF201;
0 C$ Y& V% A0 g3 _" i1 e   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 D$ j  U2 n7 R% a7 n$ F   
* j. @! k1 G  K9 A2 z4 R' Y* S   //PINMUX  
7 q& o  |( @' r- Z0 W( ~- b   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 G/ x. |/ R! a# @9 ^4 w, _
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  - M* K, J. Q7 e1 F' U, m
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : z9 b5 a& ?. B. e# A3 k) |, M
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 \3 u# _' f0 @$ _& I* Z   
" E, J8 ?$ t9 Z6 _  b% g# k2 G& D( c   //SLEEP_EN,EPR,L138_SHK1,L138_RC" N7 O' \3 t" Z& s9 p; m
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  9 o7 O$ y7 m# K1 }
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
9 |: |: ]! N1 G$ m   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 [! ]) \1 M2 r, o 3 Y3 Z5 J* c+ [5 T
   //RESETn,L138_SHK2
0 X" Q! G  g- T( p/ u; m- E   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  & o6 |2 V8 z, V! H9 Q& K1 ^8 N0 G( u
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
' q1 `/ R9 T; e) u/ Z   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' M) c9 U, e% h
) `$ d8 A: N3 W$ V! C7 W& Y- [# r5 O
" E: T- L6 A, T3 E0 @
  //SPCR Register
1 ?) \* C* @. t1 E3 {& P- N0 H  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. B2 ?" S' G1 B1 o6 J
  temp = 0x03000000;//(DLB=0)5 C1 z0 ^( s1 ~( ]! \
// temp = 0x03008000;//(DLB=1)" I- m8 |  r/ S& @: A5 y$ Q' C& |
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
5 m$ C; w3 i. P- }  temp = readl(IO_ADDRESS(SPCR_ADDR));
! H9 w; L/ @2 w, N8 ?: O- w  v  printk("temp=%x\n",temp);* z. m$ e- Y! J# p8 J

( C* W; T5 K$ f2 C5 b# [" k4 F   //PCR Register
4 q" Z6 S1 V6 w" P) v8 O- \5 }   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 x# S+ E4 J& H, ]+ e
  // temp = 0x00000F0F;
5 r/ I/ Z6 b. Q+ E8 X7 m* H( I2 U  temp = 0x00000B0F;
) y  {9 ], l+ G  k" V0 I2 i6 {1 Y9 N  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 _! S- h  I3 }  temp = readl(IO_ADDRESS(PCR_ADDR));
( X- F, N) V4 m/ z! P  _, l4 H3 S  printk("temp=%x\n",temp);  
+ d! W0 q; l: U, G6 X. m( y   //SRGR Register) a0 d5 @: ^/ d9 |( n+ t" S+ Q
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 \+ r; K% F9 d" A3 `
//temp = 0x301F000B;" @; h& }4 v1 p
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized - T; a2 C% N- |; U4 k! v
  temp = readl(IO_ADDRESS(SRGR_ADDR));
  j$ j  e: Z* e6 T) P  R  printk("temp=%x\n",temp);9 E: X# {5 H9 d7 W) A: ?. G
   //RCR
+ X% @7 p) V/ O6 |0 s6 b- s' d   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, ]' }5 A# W- z: j6 [; l4 a! [
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 B5 m8 z2 N5 e   temp = 0x00440040;8 u# a/ T$ c+ r  m8 d
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
* z" ?4 v3 N( h+ ~5 V* Z' h   temp = readl(IO_ADDRESS(RCR_ADDR));3 p* g, T* q& V" q
   printk("temp=%x\n",temp);
( M( x4 l% F+ v6 B   //XCR
5 I2 W6 B! t: r  f+ X" n  ?   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
9 L$ d4 E4 {. D# I6 [6 R   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# h* o% R" U7 M" }
   temp = 0x00440040;" C9 d; g+ R( _! X! M9 g
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & {* z4 G% ?; h8 @
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ d% P2 ^; R4 \7 G: o( W   printk("temp=%x\n",temp);" _( L( |0 C$ A& L
  udelay(100);
+ r& C2 J! J' z) g' |4 J' I. y  //SPCR Register! U. h% P! T& D* t" E
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. u/ s7 ?: `& X' n2 b: Z6 \# `; ]  temp = 0x03C10001;   //DLB = 0 VS DLB = 1) ^1 |5 F3 y0 J& N. k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled5 m) F9 Q6 W7 ~, V7 |, B6 [* D- X
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% k- R8 B3 S+ k$ N  printk("temp=%x\n",temp);+ d* q! H9 ]' D# S1 @
  udelay(100);! K) F) L+ E% Y. b: f- l
0 O( n5 q. C6 m; c
  //set GPIO direction
6 G5 x; u6 h, O# I5 r   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 ^. `8 v7 Q' u2 ]' S
   temp = temp | 0x00000100;//EPR----input
0 {1 t3 B# r* w   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 |. P+ u4 `/ L   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( M4 o) j& I; z# V7 v
/ M% L- @, Y& L+ e( f
   return 0;( g$ g+ C) P0 ^/ q0 \8 N1 ]
}
" A& k7 F, b2 d3 ^! w2 |+ Zstatic void __exit MCBSP_exit(void)) S# ~% a: ~( t# p3 p( t
{5 d$ g4 j: k) |# Q: a7 ~- s4 b
   printk("mcbsp chrdev exit!\n");
$ e3 o" s5 ^4 ?- q  t   cdev_del(mcbsp_cdev);' q0 w! i1 f2 X, ~7 q2 Q* Y6 I0 q. B9 ?
   unregister_chrdev_region(mcbsp_dev,count);
) r) r; Y9 I; O) |3 y   device_destroy(mcbsp_class,mcbsp_dev);2 i# @' d- e  O$ q9 E* B2 U7 g
   class_destroy(mcbsp_class);
7 A( v4 a% m& t/ d& P, z}. {% @- t/ ~' i/ u1 I2 c" N
module_init(MCBSP_init);$ E7 i- K1 k, v0 L7 x) ?( p
module_exit(MCBSP_exit);
4 |! r& y1 q4 m) F- ^6 Y. t  a0 j
- b& ?- q% k' c1 h( Y& X: qMODULE_LICENSE("GPL");2 O- E. S& N/ K0 Y. ^* c1 v; s" v
4 Z, q4 Z2 B8 O; p' l
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
7 w; c. F0 [/ o# s) X我的应用层的测试程序如下
; S0 v! |/ h+ o# T0 U0 p#include <stdio.h>7 i/ E. X7 R" T1 c9 V
#include <string.h>. }* E1 v2 o* k6 B1 Y& I/ s& G5 D
#include <fcntl.h>
* b- S" O& q, s; v#include <unistd.h>
) }; c7 |  h0 x( e#include <signal.h>2 }" {' c7 s' m, V
#include <pthread.h>       //线程
* K; {% X4 \# p& \3 R0 y) G#include <stdlib.h>
- W7 J$ w! T( A" C( f0 @* L#include <pcap.h>          //捕获网口数据/ @' a0 a1 t& I  x4 m$ }$ H
#include <semaphore.h>     //信号8 H$ W' l! i* _: W9 N- h! @) P; `0 s$ l
#include <sys/types.h>     //消息对列9 \- H; ~( g: ^( S! m4 ^, Q- P
#include <sys/ipc.h>       //消息队列3 Y. f$ N' `, L0 W3 v  I; Q6 r
#include <sys/msg.h>       //消息队列+ Z' F& T9 p/ V0 D. h8 J
#include <sys/select.h>- o6 V7 k4 t! g0 M, r7 u
#include <sys/syscall.h>
5 k% ^1 n. S, x( g#include <sys/stat.h>0 a) M& J8 m0 F- x( G
#include <sys/mman.h>0 D6 `& z' t; R( ^# B
#define msleep(x) usleep(1000*x)
- f0 a# u6 Z/ d2 X0 e2 ?4 z6 _$ n% l1 r9 N3 M9 b
int main()
' Y6 T4 @$ k0 }1 E9 W; W: G# A) ?{ 7 V: T- x1 }- k* E9 p% e
    //MCBSP,ARM与AMBE2000交互设备
: t3 n& H$ Z7 n/ X int fd;
" y( L" s* Q( N& c6 ]& \& |4 } unsigned short data_write = 0x5555;# _4 y1 K# N: Y5 C7 E# w# {
unsigned short data_read = 0x00;" a7 t. \$ Y8 p: @  k. z3 i
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);4 u3 e, p- _0 A' C( \
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) U+ X7 H- x( j1 P   
% u; b- t( C( F! j* [  if(fd < 0)! Q) A. w7 J  I+ `
  {
! ~- n1 S: V: T! D& R0 w) N     perror("open failed\n");: z8 E9 j9 M2 u) E/ W% a
     return -1;
7 F' `3 v2 \+ l# h: e) l! e* i  }2 s* G+ O* w4 s% i% O6 u0 X& ~
  # L6 C" P. l% y7 g2 J8 K' j% ]0 v
  while(1)$ K) `  y3 v* s; ]+ v) N
  {- K' w! F' E5 M8 S0 j
   
( r/ J- c" \5 b* `5 e5 I   //AMBE2000每次读写是24个字为一帧
+ V6 n- z0 p2 n   //写数据时将数据在底层存储起来,等到中断的时候再发送
9 {7 Y: n* b; N- p: E" `   //AMBE2000输入数据是以0x13EC开头的( O1 |" q, G7 f- R" c( u! l  E$ ]
   write(fd,&data_write,sizeof(unsigned short));% V8 f) ~% A( R. h! }1 z
   
0 [0 ]- _+ M2 j" t' y% _: _- X5 I   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
: [, ~5 P) `) U) O  D   read(fd,&data_read,sizeof(unsigned short));8 m1 f+ D( C8 y+ ^
   ( @" K6 z' l6 ^& `- c) S+ M
   if(data_read == 0x13Ec)- w7 M' ?3 K9 \4 @
   {
/ |8 }( f  y/ v7 b   
, p+ O$ B, ?/ t0 v) d* {1 N    printf("data_read = %x\n",data_read);
' m4 A2 S. v. [7 b/ {/ s. C" F% ^   }. \8 j3 }/ h) P7 K. I7 t  O
   
# v0 B( P1 K5 k* I   msleep(10);" T4 L" q( C- ]
  
1 r" X: A' d5 g/ S5 @- A1 j$ R( t& v  /*
) E. `& _" U  C1 W   ioctl(fd,1);   
. F3 m2 _" S5 f2 z sleep(1);
+ o! ?# `) j; c* M ioctl(fd,0);3 L1 x9 n1 j! W
sleep(1);6 n; U: Z/ R9 ^1 I! t) S. a
*/ 8 T$ d  K- c0 _8 `
  }   
1 x$ z. g) g- \9 l* R8 ?7 q4 t return 0;- J0 x; x8 q$ G0 ^4 K' T/ M

8 y" E/ ?; R# [/ `( s+ c}$ ]! u2 }9 x* K6 b1 x% M' U/ W$ P

; T# e" m0 p  I4 V+ @* t多谢各位指教,谢谢! 急
4 s, k' Y7 M2 s- C0 C: B3 F
# B) m$ r3 Y$ P8 g/ N
8 k$ k* Z+ J7 s! L2 H
5 J7 G% M7 d+ p$ y( R: X
) O2 s# f" o( U, H0 w. I( g/ Q% V# N, G8 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 22:39 , Processed in 0.043285 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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