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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( ?( ?2 v; P& m/*4 S" K6 E& j' x
* Copyright (C) 2009 Texas Instruments Inc8 n( m+ H7 K( a# J& f8 n
*" Q( G/ L, _2 R3 w
* This program is free software; you can redistribute it and/or modify
% X, U' I3 O/ w% \! x( u% S * it under the terms of the GNU General Public License as published by
2 d8 G$ X2 Q* C4 u * the Free Software Foundation; either version 2 of the License, or/ w, u  G0 l5 R) e& d: K
* (at your option)any later version.5 c$ i$ ]  u. o4 P* a+ N: ~5 b
*% @3 R" M! ?. `4 k7 l9 m$ ~' N
* This program is distributed in the hope that it will be useful,1 R# C1 I3 i, F" O+ E9 e4 e
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- k( C& D9 }5 q- v% O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% B+ g6 T, u$ t# N9 _
* GNU General Public License for more details.
; A3 N7 {/ h, R& z" R$ x *
2 ^$ R1 f$ n5 ?' k5 d5 ] * You should have received a copy of the GNU General Public License
' l# C4 t9 M3 d& d- _# G- h% x * along with this program; if not, write to the Free Software
' z0 @, e8 D2 l8 X( B * Foundati
- L8 d% R4 z% ~/ g. Z, R*/- }# h! S. E  ]( J/ ^0 |+ c' q
#include <linux/module.h>: e) [( E" s9 j/ R! O, n
#include <linux/init.h># z1 k1 D3 {# R( j# u
#include <linux/errno.h>1 P7 Z* u9 m% c. Q  V
#include <linux/types.h>
  J2 d9 a/ {% y; I* I) i# r#include <linux/interrupt.h>
. v$ n6 J9 o1 U4 b- m$ U2 a#include <linux/io.h>
1 _" }/ ~# M$ g9 k3 O* U#include <linux/sysctl.h>) `3 Q4 E/ _3 j5 C# o/ k
#include <linux/mm.h>6 h: c. S2 a' A. g/ j0 X' O8 j
#include <linux/delay.h>
7 o; s, P4 F$ e8 H! V#include<linux/kernel.h>
+ Q7 D& S) e0 H' f9 g3 K6 s#include<linux/fs.h>4 b4 r4 J4 l& Y% p
#include<linux/ioctl.h>
; e# A- l. L7 P. E9 h, B4 |& ?! d#include<linux/cdev.h>+ O' L" }* C2 A1 g
#include<linux/kdev_t.h>" ~% D0 {; k# i' R* C% J
#include<linux/gpio.h>
0 y( d& ^  H  q6 [% k5 B# B4 E#include <mach/hardware.h>
1 ]6 r1 g5 D6 \#include <mach/irqs.h>
$ ?5 M3 l/ j. [5 S" {  v3 x( Y
- Z- C2 B2 A0 m$ T0 x#include <asm/mach-types.h>0 |- c/ q* \! o/ r. l/ L2 h/ q
#include <asm/mach/arch.h>4 f# s* t5 y% P0 M7 c! D  J- Q
#include <mach/da8xx.h>
' a4 ~  y  V( j  S; x* H#define  SYSCFG_BASE   0x01c140001 C2 f6 c/ U* B3 c  v9 L0 s
#define  PINMUX1_OFFSET   0x124 3 Z! W* U* A; y6 v0 M  @# c! P9 N
#define  PINMUX18_OFFSET  0x168 ; z4 e5 @# J4 d3 U6 T! h7 ~
#define  PINMUX19_OFFSET  0x16c
1 `( \" d! r" p% n/ y5 @#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR! a# S' }& H3 q1 X
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
; T, w# o9 ~1 P#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR; ?3 f0 V. B3 q$ P( k! j: Q
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% J3 A! H# [! y* X
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR2 L( H8 e$ x3 y) Q( q
                            % U& s% B) T/ I% y7 `2 [; n
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR7 @7 W2 l. w1 B/ s% x7 S2 y
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR# ?, p2 p1 E2 Z9 Z
//PSC
. Q* x) R6 N  ^6 v' R#define  PTCMD_ADDR   0x01E27120  
5 |+ t* Q) O% |) d$ c#define  MDCTL15_ADDR 0x01E27A3C) t8 a' ^! V9 M( J
#define  PDCTL1_ADDR  0x01E27304
) y: Z  k+ }* x+ J# {. U//GPIO8 direction! P6 `  A; Q8 Q: ^5 h
#define GPIO8_DIRECT  0x01E260B0
6 z- O. Q6 n2 j" l- r/ f#define GPIO8_OUT     0x01E260B47 `7 R. ^0 f6 w
#define GPIO8_IN     0x01E260C0
% f+ \  [% k( B# P& T4 F: W
) U& ]( H* S9 j/ C, t, {//#define MCBSP1_RINT    99              : l3 n( T0 z1 S, j
//#define MCBSP1_XINT    100  
& ]/ \# u2 \' s  Z, sstatic int MCBSP_MAJOR=239;
2 _5 E3 r* d7 r( z7 Gstatic int MCBSP_MINOR=0;& ^6 r- |0 c$ ]
static int count =1;# v" T  k2 E/ c/ z) s3 n8 s
' F* \6 V1 p+ F) G9 g% E
#define MCBSP_NAME  "MCBSP-device"1 |  ^6 {: l; m: U% J8 J$ U; @# Y% D) g
& R' R+ a5 |, d0 B1 m' j/ q
static struct cdev *mcbsp_cdev;
( G3 X" Y: X( z- F4 h: a9 I- A* [static struct class *mcbsp_class;+ T* Q8 f/ V0 o- Z" H
static dev_t mcbsp_dev;7 O" m# R# {1 G8 e7 P( P
unsigned int DRR_data;, C" I4 L4 ^* \: Q% J
unsigned int DXR_data;
8 Q4 x; y2 a) _, W1 |$ Astatic int mcbsp_open(struct inode *inode,struct file *file)2 F6 g. }* u$ ]- \9 j3 h
{
% D* i7 n* @0 l0 @2 \5 J6 E" x' E4 I   
2 |: J1 T  q% @   //interrupt enable,initialized
( H* I4 Y3 c( B' O! [   unsigned int temp;$ r; n- n% H4 ]: ^  t* `) N, _& s
   //SLEEP_EN(GPIO8[10])---0& E# h9 r; l3 Y
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ u( W! R2 X! Y5 P' A; I3 W8 s
   temp=temp&(~0x00000400);
  E" O! t5 K0 h) B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 G+ X$ F  S! W% N9 p8 V  //RESETn(GPIO8[8])----0----1* l+ Z, q6 l0 w) `! v$ s
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 G  D+ h9 x, D* t3 B
   temp=temp&(~0x00000100);7 [0 ^. b" H6 b& S( x
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 D; D& j" x' M# |7 Q   udelay(100);
: S0 t9 M9 S+ L8 o   temp=temp| 0x00000100;8 I# l8 [6 N' Y6 ^
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 U+ q- j' h: {2 @3 t  y5 N
   udelay(100);
( [' C) q% F  s   printk("open success!\n");
9 c% t8 ?3 ]9 U/ W   return 0;# p- @3 Z& ^  Q! A/ j; B
}. |" U/ w. ]/ a/ n6 k: |

5 ]- {" _* q9 f. ?8 q$ B8 Jstatic int mcbsp_release(struct inode *inode,struct file *file), i' s% s1 ]6 B0 G& O
{0 t* ~$ S! e+ D) c) F1 J" V9 M
   printk("release success!\n");& b  A3 i! V  J* X) J/ d" W
   return 0;
5 C9 q( H" Y8 F/ ^0 T9 O6 p}
( H" |) Q9 D( D* c) l+ R* o9 q  m6 Q9 {. O& f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): o' k% [, L& Y5 \" F
{
" V% l9 f2 Q7 {7 t; o3 y    copy_from_user(&DXR_data,buf,len);
* m* b8 H5 ?( g$ g* F: I    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ( a; I" B  K: l7 r6 V6 d
    return 0;
. K6 t3 |+ J9 i3 x% T + a* b0 f3 F$ y- @  H7 ?
}
+ C; R8 v2 P+ n) }# y$ I9 p% I' W6 H
7 @" C* I$ I- e# H% R! }5 Wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) s* l4 e: G$ y5 G0 I& e3 t{ + ?4 |. {7 g" K+ k) J- L- C4 I8 J
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! `* i2 I" p1 g1 L. y% p   copy_to_user(buf,&DRR_data,len); 7 R6 |) l9 q1 I7 Q$ ?) h
   return 0;& Z, U3 Z7 A# Q1 n6 Q* I
}- M" ^0 N/ [4 [& c9 |, K+ U
+ v( g; s) {( p9 M; [) ?2 v$ o+ s$ s
5 H& X; s* T* h: j4 r" p/ ]
static struct  file_operations mcbsp_fops=& U, X8 }' [0 m
{! B# S0 \* t; h0 L, u
   .owner=THIS_MODULE,
  S9 R( i% M0 O% C& F; D  k   .open=mcbsp_open,
. d) ~: X% `* M. x/ @   .release=mcbsp_release,+ l, s9 j% p: J! u2 y2 \- C, h
   .write=mcbsp_write,+ S& W3 G7 {* B% ]+ [( b$ G
   .read=mcbsp_read,
$ D' R2 ^0 G2 A% G3 x% Q' [8 m, o};, L4 T0 ]! n/ ^4 @$ J
static int __init MCBSP_init(void)
5 }$ B  |& `$ R) J8 A$ @4 N{+ @: ~( O# }9 ]# a
   int ret;6 `: ~# H# z! g7 d# e
   unsigned  int   PINMUX1_REG_old;
+ t$ f9 ?; M3 T1 o$ b5 b0 e   unsigned  int   PINMUX18_REG_old;7 A) |2 j% \# a+ z- a# s! y
   unsigned  int   PINMUX19_REG_old;5 L3 t" h6 X( R" f1 }$ Q) F1 t+ u
   unsigned  int   temp;  
, L+ j& `9 H! f% Y( d: S   if(MCBSP_MAJOR)- ^9 a  W; M* R8 p
   {
; E% h* Y3 i- z      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 B9 g7 T: c. b- L
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);  J. h# F; D8 F2 E' d
   }; q4 B' p1 D2 S
   else
- V- `8 N: Q, U4 z' e0 N' M   {' Q/ ~% n2 _( |
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; `2 ]% l/ Q" r      MCBSP_MAJOR=MAJOR(mcbsp_dev);+ B9 F. a9 A& x& T0 z+ m
   }
; s; r; n, c' P1 {0 a/ ~   $ P/ q, U( F( h/ }( K" y5 ^
   if(ret<0)
6 i9 e" D- V8 T) S2 q9 u   {! D4 B7 ]8 C/ o4 Q* w5 b
      printk(KERN_ERR "register chrdev fail!");1 F4 \: E4 {5 L
      return -1;
* H# H* F+ {- B9 i+ d& Q   }
3 u5 o0 }* D) o: ~   2 |! Q( [2 S- N  w$ f$ e  ~% R
   mcbsp_cdev=cdev_alloc();
$ s- u' O, a, m9 p3 L. H! J   " B- {; ?6 ^1 N
   if(mcbsp_cdev!=NULL)" c3 ^0 d; Z1 W$ `
   {
+ q5 Y6 J2 @# `5 p; g7 v/ E# T, ~      cdev_init(mcbsp_cdev,&mcbsp_fops);& \. t. }) P$ v. z9 [
      mcbsp_cdev->ops=&mcbsp_fops;) L% y9 j! E& ^8 F" k4 j
      mcbsp_cdev->owner=THIS_MODULE;* t' Q5 Y+ {" O0 p* T! V  R4 d
      
7 a4 v+ u+ Y2 J      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# k- ^- Z+ v# s+ o0 Z1 l
          printk(KERN_ERR "register cdev fail!");
' y8 c' I3 B6 {+ t      else1 W: I$ S) S  d" R% H! x, H
          printk(KERN_ERR "register success!\n");. R! t6 R7 p- g. i8 b2 H
   }9 q3 ~( C3 ]0 W" r8 m1 b* E
   else( j& n/ O* X- g1 m& L& [
   {5 o9 s1 w4 U8 q4 z# f
      printk(KERN_ERR "register cdev err!");9 ^# j2 @3 a+ U2 U: W. v
      return -1;
1 x- `, r6 }( S   }
* a; ?: e4 i, v% U   
$ F; Q" v9 W7 m7 X3 U4 K3 ~9 B  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
9 ]% `( i! _0 d4 p9 W( Y! X' I   if(IS_ERR(mcbsp_class))" X# T, |* k( s2 G5 I7 D" ]
   {* L2 l; }- W- y7 G
      printk(KERN_ERR "register class err!");
8 c/ [4 P: R5 m   return -1;
* ?( T6 v+ b( l. d" z3 e' n6 G   }+ t# N3 w/ e! G) E& l+ n
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 x5 P/ K+ h" k  G8 A7 Q
, {! Z  w- ?% e2 {, z9 }! k   //PSC* [1 V# v) f* t
   //add Enable MCBSP4 @/ D$ ?' e5 ?7 j# @) u4 S
   //test+ R5 [: ?: h! A6 w
   temp = 0x80000003;. C  f; z* U+ {7 E  \4 z8 p: I
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));! O6 p  ~$ l) O: O+ X! u$ ?; \
   temp = 0x00000003;0 h2 w8 M" I& p% @
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 H; O) C& m# g% c6 G) q5 y1 l
0 b9 S; Z8 ?- u' I* ]   temp = 0x001FF201;* x, P* P1 l+ j$ P+ j
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));( T; l! |" n/ o- b8 U$ i
   * S/ I! ^( ~9 f: [" ~
   //PINMUX  
9 [. [! P7 a7 b7 q0 i   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, u( B4 K' A7 }   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ' r* R0 V  j& G" Z+ Y* P  b# G
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
* V4 k3 A% z' ^1 Y2 i( x/ K0 k   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 c# R/ i% G- k   1 U, M% a" A0 J4 b/ [- Q
   //SLEEP_EN,EPR,L138_SHK1,L138_RC$ x& m  \7 Y, e" A
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  # F* h9 r: U/ D7 c. [5 H* B& ]
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
6 E  C9 R) v1 [; o: p7 }! i   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( [, c8 b% R/ g: y

( f. r4 B6 ?5 [9 \   //RESETn,L138_SHK2
/ o2 H  R) z5 m* K/ D9 I) ]   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  3 ~& `5 Z8 [% e1 x& e( {/ o
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   . ^+ [6 L# R) X2 t
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  |6 p3 a; K  [2 j4 B, D
) @- r& f6 ?5 a8 A' C1 s! a
" O6 M& r* ~" H% N5 {7 \
  //SPCR Register) w: u0 J* O: k: [( y, F) h
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 Z, r/ F. x; j% o$ X! o0 N  temp = 0x03000000;//(DLB=0)
7 y( m. i% z, d# m. s // temp = 0x03008000;//(DLB=1)' r' ~. Y2 c3 y+ `9 D5 n
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
1 V& l% i* ^& d. _7 b! K+ D  temp = readl(IO_ADDRESS(SPCR_ADDR));& V1 H8 H7 M* \2 b4 `) Q. `
  printk("temp=%x\n",temp);1 t/ o' t: [' B7 }1 i0 b! P

9 n7 C0 O2 O+ \2 C   //PCR Register+ p# S6 n  Z% Z4 i: H, u
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 Z. i! ^" M( J1 J$ N. ^; Z
  // temp = 0x00000F0F;( |- Y* b2 ?- v- f5 F- |
  temp = 0x00000B0F;$ X" X) O; V  q  c. u
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
8 C, X" o2 Q. b2 F  temp = readl(IO_ADDRESS(PCR_ADDR));$ J, v6 X  E9 N1 G; S$ g! l+ C
  printk("temp=%x\n",temp);  
( l4 M+ A. h* t3 C5 P   //SRGR Register8 i% B3 B( G9 ]
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& P! {6 X/ T6 }& c' t* o* J. @ //temp = 0x301F000B;- ]! ?' T! |# z" F
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* M+ p& t9 M( N% _* f; o7 p7 `  temp = readl(IO_ADDRESS(SRGR_ADDR));
6 g; ~! [+ \+ J+ f$ w  printk("temp=%x\n",temp);
# x, S6 `8 Q6 C' T% |9 ~   //RCR
+ g' D  r7 C' m. `" b/ G   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ F, `0 e2 i$ ?* h$ ~
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; y/ s: `. [" k$ `
   temp = 0x00440040;6 I- j5 L" _% G1 {) H
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) T) q  {3 H# ~* b* G   temp = readl(IO_ADDRESS(RCR_ADDR));
7 X) g7 n0 d* i4 [* B' O2 i" f+ A   printk("temp=%x\n",temp);
. h: H; h. @- ?5 r   //XCR! T5 i. F& U& d8 s8 W- j( v% z
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
1 m* m) K- m- B   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ g$ m5 i+ K. S# H& x( d. b/ p. a
   temp = 0x00440040;
3 K0 P( _( R8 w. X   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   9 f, Z; ^7 F6 z* ?
   temp = readl(IO_ADDRESS(XCR_ADDR));
" Y/ e2 ]% Y) J6 x   printk("temp=%x\n",temp);
. R+ Z7 ~3 q# j- Y  udelay(100);, {, Q, B$ k7 I& {4 c6 m8 L
  //SPCR Register, J5 c- Q+ z9 V: r5 y% s; D
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 G7 F) A" l, r, g3 b" T  u
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1- G3 _* A1 `0 s$ k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled3 ?+ z2 b: V' P
  temp = readl(IO_ADDRESS(SPCR_ADDR));: K. s/ r$ }0 w) J0 T- L* |6 V
  printk("temp=%x\n",temp);
3 G; P; _: @( y  udelay(100);
, g- x$ @( }8 ~. c$ x
5 u5 y8 h8 i+ r/ P' G) v  //set GPIO direction) e2 U5 R0 {$ U8 m: v0 [8 q% X8 \
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 [- @& s. A; ^6 y! K   temp = temp | 0x00000100;//EPR----input
4 R9 l9 R" K' h0 m' d# s   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. z0 ~7 `+ T+ Z, ?/ H   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ x9 j0 H2 I- K+ w  t/ f# u
4 X9 _4 X6 @: ]1 k" D9 q! m- ]   return 0;
4 g+ o( x+ s4 b) s' ]) m}* `. Z0 ~: a0 A. v
static void __exit MCBSP_exit(void)
. `' ^. z( b* h! I* U+ b{
* Z: Z% @3 H/ Y6 t   printk("mcbsp chrdev exit!\n");
8 j" k0 _4 b- }/ h/ U! a& X* _   cdev_del(mcbsp_cdev);
2 K  t6 [. b; \: j  k   unregister_chrdev_region(mcbsp_dev,count);' [9 T& f# V! h1 M* d5 n0 K$ ]- m
   device_destroy(mcbsp_class,mcbsp_dev);9 I7 E& \: X) m9 N  o0 b# U
   class_destroy(mcbsp_class);1 S1 H1 o, L& K
}
* ~% Z/ R! A' h" m4 Ymodule_init(MCBSP_init);
+ J' u/ Y3 S& D4 P* ]* xmodule_exit(MCBSP_exit);
+ ~7 A# {3 X4 G& E' @5 H8 o& d- |% f9 U( E4 }' y
MODULE_LICENSE("GPL");
' L5 V5 O8 {! h6 P
, _- y5 X' s( a4 T, _) Z  L我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ }* z3 R* ?6 H8 T( ~* F( l. ?4 r3 ?我的应用层的测试程序如下" ~' o) l) @1 ?  F
#include <stdio.h>
. U+ J+ ?" m1 k( D5 o0 U* W6 s9 c#include <string.h>2 h/ H4 f; z: e" I! B7 m. e. L
#include <fcntl.h>- h- ]! F! m- H9 i* J) o
#include <unistd.h>9 B6 |9 |* y2 y
#include <signal.h>: f3 {& y) I: A+ i
#include <pthread.h>       //线程
: e% X3 v0 d4 d4 Y2 v#include <stdlib.h>
/ N2 O8 l& P2 w% x  M. t& n3 A! [$ P#include <pcap.h>          //捕获网口数据. A! |. d: L9 |
#include <semaphore.h>     //信号
7 [. L* p/ ^% d, P" \, v' |#include <sys/types.h>     //消息对列
/ D6 W- y0 T# p! x#include <sys/ipc.h>       //消息队列& L2 i+ |- D# S8 s) A
#include <sys/msg.h>       //消息队列: X+ a1 J8 g1 A
#include <sys/select.h>
- F3 T7 q. f1 z1 F#include <sys/syscall.h>
5 J! K, I5 y; Y2 r' q$ I#include <sys/stat.h>
0 r& R4 |& v: L; m6 p#include <sys/mman.h>
: |; ^  k. p! a2 G7 J2 j! b#define msleep(x) usleep(1000*x)
& d  o- R( z' s8 f; ]* A5 J3 ]9 Z$ j: x0 ?4 @# ~. \
int main()5 f  m* P/ C) z
{
& a" `& D- `. l4 D, t& y1 _    //MCBSP,ARM与AMBE2000交互设备. e' f& u" X0 g) \
int fd;; N4 k9 [9 n' n% j
unsigned short data_write = 0x5555;/ d3 n6 {4 }4 k3 A
unsigned short data_read = 0x00;
' X- W- J4 J' N  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# L$ t8 o7 _- a- | //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( _* `8 I0 U+ j. O8 Z   
1 E$ a& o! m$ {/ Z6 O; i  if(fd < 0)
1 }; K0 ?. Z" ?" G$ K, s0 ?$ P4 F  {6 O; e+ P2 B( a  }2 J
     perror("open failed\n");* a" |. S; O$ Z
     return -1;8 Y; U$ L, U5 b3 V; I) F
  }
6 c* M0 k/ M, w4 g- w  
4 F$ l+ c0 ^2 h! G1 \0 D  while(1)  p# I6 ~+ k# f( [
  {
6 j9 L4 s3 p4 o) F! O. c# k: p   $ b3 k  |8 ]; d
   //AMBE2000每次读写是24个字为一帧
2 v! Y4 g1 T2 V   //写数据时将数据在底层存储起来,等到中断的时候再发送
; A8 h( I! v( W0 |( y   //AMBE2000输入数据是以0x13EC开头的
6 x: {! t0 }, y* ]0 o6 z# w, h   write(fd,&data_write,sizeof(unsigned short));+ N6 A4 g8 {+ V$ S' X9 T* s6 z
   
2 \* ~/ y1 m7 d) H/ b   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
/ x; o3 f* r+ S7 b& g+ S   read(fd,&data_read,sizeof(unsigned short));
* q) V2 o$ G  z2 J! y' A, Z   
1 ~/ k+ j. C1 w' s) X7 O   if(data_read == 0x13Ec)7 @6 W1 @/ ?# B1 t1 I: A
   {
; ]) J# w. P/ M9 b( a   
7 _' @6 M3 x! _* \( I, O0 N    printf("data_read = %x\n",data_read);
9 p3 e6 S& F5 x3 g   }7 f" n  P- e, t" w( j' Y
   
. w8 |5 L# ?8 U* D) r7 V9 s   msleep(10);8 w+ P9 g) ~: @# M  B* h9 J
  % H/ K! R5 N# R* d0 X3 {
  /*( T$ ~* T+ R2 c) E3 t4 c+ \
   ioctl(fd,1);   + `, A  {) P+ V$ a5 m( H
sleep(1);: M5 a4 w; \3 k$ L) \0 g: x( w
ioctl(fd,0);
: {/ \- m, R' a2 y1 C, v8 S* u sleep(1);
* a7 D/ e1 s9 ^6 c4 P */ $ K  [3 {7 [3 o. N- w* v
  }   % Y% ~1 r, V9 X( Q
return 0;: {0 \+ u0 q7 Y  y
- q) g3 C8 n& Z% t
}
# D; u$ {3 M- e* Q3 k4 M5 _% I1 V: Z9 I6 K
多谢各位指教,谢谢! 急0 G4 k; }: b! m  `% g8 f
3 S1 F  o- B1 O

* U, h$ s: x9 b( q5 H, o( ]4 j5 C8 }) A- P1 P/ q) N. ~* E! U

. W- K* _6 {) a. h
0 g. G3 L8 s$ F- Y3 u8 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 02:02 , Processed in 0.097007 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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