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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( G8 k& X, i5 H3 e/ {. \
/*
# \, S' l' y& ]" b6 F * Copyright (C) 2009 Texas Instruments Inc
1 w- d, Q8 a. d- N6 u+ \  z, A6 h+ }0 u *
) y: B! \) x0 D# t2 F: @1 g' _) M * This program is free software; you can redistribute it and/or modify5 y" `* M; N8 R: J) ?$ O4 K
* it under the terms of the GNU General Public License as published by
: f! ]/ B5 P" `2 j+ G+ S" d: ^; ^ * the Free Software Foundation; either version 2 of the License, or$ `5 |% N9 T4 R/ x; ?) u
* (at your option)any later version.
8 L) a. L3 |% S" W *; z! L$ Y) g/ }  B; P! V" z
* This program is distributed in the hope that it will be useful,; b  A" N$ s4 R; l
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 c4 i2 [  X. O; f! F0 ]% ~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: ?/ C/ r1 I' m% q2 q0 l2 ~2 ~
* GNU General Public License for more details.; }. [# a0 c9 q3 K
*1 Y- Z6 F7 w8 G+ b: O8 ?
* You should have received a copy of the GNU General Public License
( t  M) x( q2 X * along with this program; if not, write to the Free Software' y- s% b( q6 U( J/ r0 c
* Foundati7 f5 `# w: M- u) |9 Y1 C7 G
*/
: |! B, S8 [3 D4 `; ^. q. Q#include <linux/module.h>
1 t' t; S- R$ [7 ?, V, F! T8 [#include <linux/init.h>) I6 r6 A+ `3 H# A7 Q
#include <linux/errno.h>9 |$ r7 j7 p0 ?  g3 R! V3 t
#include <linux/types.h>. g7 v6 |* t1 ^1 \
#include <linux/interrupt.h>6 H# c) E$ F7 {# G4 m1 }2 r; k
#include <linux/io.h>
0 q: @% ], W/ }3 Y! j#include <linux/sysctl.h>' W  `- L8 K: P* q: ]. c% h  H
#include <linux/mm.h>
' y6 P3 z) Y/ ]" q4 r#include <linux/delay.h>
3 ?3 U& y+ B7 f% [! i#include<linux/kernel.h>* }: Y1 \  q: a6 j4 [% e
#include<linux/fs.h>
' F6 u0 k+ Z1 \: ]% d. Q0 L' f#include<linux/ioctl.h>
  a2 p- G2 c5 g4 L0 P2 k  A1 i#include<linux/cdev.h>
# ]6 l1 k" f! e' v% \! P# t#include<linux/kdev_t.h>
5 Z# ^6 U$ L8 E( A* T# e  O' W#include<linux/gpio.h>" T: I$ t$ ]: p! s' r9 w9 C  k1 D
#include <mach/hardware.h>0 o3 y, a& }7 n; j+ q
#include <mach/irqs.h>& B  M$ w1 s" B6 u; S1 y, q; J

/ b( D( l! o' |#include <asm/mach-types.h>/ Z- p' p1 s- j
#include <asm/mach/arch.h>
. O+ @* N! I7 T#include <mach/da8xx.h>" y  a9 }# W0 S
#define  SYSCFG_BASE   0x01c14000
' W. c( v* e4 g- a5 v#define  PINMUX1_OFFSET   0x124
0 i$ Q5 r/ G; ~5 ?6 f9 K#define  PINMUX18_OFFSET  0x168
5 k! k0 o$ h- S" J#define  PINMUX19_OFFSET  0x16c
5 x+ a6 D! ^+ `, Y, K5 M#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
+ t6 D1 p( E$ [  E( S#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
7 h" A: V& f; R7 U#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
0 |6 R% g3 ^$ B' K7 O' e- Q' C#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ }0 N' J5 w. ^
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; Y/ l! E( G  ?  R1 g& c# _- F: ~                            5 X' X( b1 T8 |" E( D
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 g6 Q+ l* `. Z- U- P' K
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR8 U' r0 a: P6 O9 v' @( u( s
//PSC1 G1 t- y7 T& H0 {7 v+ t* w3 X
#define  PTCMD_ADDR   0x01E27120  9 m# B7 i% [% y. `* S! a
#define  MDCTL15_ADDR 0x01E27A3C
) s1 ~8 J( v- u: D1 j+ p3 z#define  PDCTL1_ADDR  0x01E27304
* Y4 i1 x7 N8 r1 c7 _; I  L//GPIO8 direction
2 z3 d! H/ m* G: O#define GPIO8_DIRECT  0x01E260B0
2 y) l( I# n1 t/ B- s7 b5 ^& C#define GPIO8_OUT     0x01E260B48 C9 b$ Z# A' C, w/ t
#define GPIO8_IN     0x01E260C0
  J7 F. f# v5 E1 ~( W. u# C6 C; ^4 J) e  t
//#define MCBSP1_RINT    99              
0 }$ q( V) S/ ]; `+ ]//#define MCBSP1_XINT    100  
/ u. A( h! a: |static int MCBSP_MAJOR=239;
  z3 x: F0 Q% C! Jstatic int MCBSP_MINOR=0;; ~" G5 h4 |0 G# k" g, F0 g& P
static int count =1;
' l# N8 P" i  v. {4 {- _
, _7 ^& ~* T6 U( n2 y: h2 ?  [& T#define MCBSP_NAME  "MCBSP-device"- {4 W: m0 }4 j3 E1 R2 w$ l7 ~1 q; K
' ~+ P) U4 m" f
static struct cdev *mcbsp_cdev;* U) V# d! B! R1 i( s
static struct class *mcbsp_class;' N& `* L# O$ {3 p% R9 s
static dev_t mcbsp_dev;* U3 g, H9 B' K4 B5 V( e+ b" |9 E# |/ V
unsigned int DRR_data;
; @, Z; i: y2 X6 M) Z, x' u. junsigned int DXR_data;/ p# z, I: m1 ]- p0 Q6 r# r% t, g
static int mcbsp_open(struct inode *inode,struct file *file)3 p% K7 d0 n1 W( B7 n# o# M* y; s
{
: y% j3 O1 Y+ w! ]* e" m" ?3 _   
. s$ Y4 k2 X; ?" W* ?; F   //interrupt enable,initialized! n  G0 P! |8 I
   unsigned int temp;4 m/ S9 O1 v9 b. K# u  G
   //SLEEP_EN(GPIO8[10])---0, a' f# [4 [- c% z
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 Z7 T* R' w( Y  l: o+ A1 d! P' |
   temp=temp&(~0x00000400);$ M0 _/ L  R# s5 {$ R! U& L4 }
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], Q1 v0 `0 \% Z- Q+ W% W
  //RESETn(GPIO8[8])----0----1
/ m5 T& V2 z, w( r6 l- N# i6 _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- p- @$ p: R, i% v, R
   temp=temp&(~0x00000100);
3 D& M+ _9 ~4 A, Y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 x$ u1 ]4 A5 s3 u# ~" g
   udelay(100);* Q9 s  f7 j9 C1 [0 a
   temp=temp| 0x00000100;& f; Z/ w! v5 g! J6 H8 a2 ^4 s
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 @9 L# O0 s& O5 w5 |* w   udelay(100);/ g6 d! W" z  i' z: q9 o
   printk("open success!\n");
1 J7 S& u0 n) N7 @" q% i2 o( {   return 0;: U% @, v5 U9 F! v8 j
}9 \/ u% `! s# B! f

& K6 \5 P% Y1 U, Ystatic int mcbsp_release(struct inode *inode,struct file *file)
1 X' {* y% Z4 w/ l/ F5 ~{
& j; s0 |2 j1 x2 J: X; N1 S" \8 r   printk("release success!\n");8 W. y, R2 U! _! R
   return 0;
) |0 L" h& r7 L% n) D% N}3 z/ i: Q% I; n
! V- Y' @% ^1 N) K
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* N8 ^4 a( ?/ s# e( Y8 m5 z6 w
{4 _% w) p4 e5 n( g
    copy_from_user(&DXR_data,buf,len);
# `2 o! \2 W  T! z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
$ [7 T* I4 ~5 [- j6 B: N    return 0;
$ T/ z) k" d9 X4 |+ i4 f& U - T9 Y6 b; }* Q% x
}) m1 h) W& V% B" u5 [1 S
. j/ x( ?1 b+ Z) U# T
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off); ~, n% F' m1 P- j4 h
{
& R* ]' ?: a! R# k9 ]& c+ e" X   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 [( c% M0 J; r; Q0 Z6 G( F   copy_to_user(buf,&DRR_data,len); ' D% _0 Z1 ?; g2 h. Z# R) [
   return 0;
: C' N5 |  b" I$ Q0 H" k}
* a; l4 E0 V7 q- v! ^" F9 {! i' v  F; u4 ~$ e4 s  A" L# U: Y" [9 h

% X& l2 s9 b) C* L5 z; Y+ d9 \2 C6 Istatic struct  file_operations mcbsp_fops=
, L. m/ y5 p: ]{6 p2 L) u+ d* o( `; U" N7 a+ x
   .owner=THIS_MODULE,7 G4 A. K4 {1 ^, Q" d
   .open=mcbsp_open,) I# e) E/ ]; ~/ t" o) A0 [$ b! R9 D
   .release=mcbsp_release,
( l' W: d( |$ q   .write=mcbsp_write,2 Q4 T. Q; x: A5 o
   .read=mcbsp_read,4 z( P+ A9 Y4 g* t, r3 b, v& }1 l- X
};
9 Q+ N! k0 A  w# Fstatic int __init MCBSP_init(void)
/ o6 a# A( V3 J{
+ r- G1 _# R1 k" w   int ret;2 `3 x# n# N1 o) t
   unsigned  int   PINMUX1_REG_old;
: f9 F+ h7 [4 m9 O( F9 f   unsigned  int   PINMUX18_REG_old;
( K8 n2 h- L  F' @0 ?( s" J: v  W! k   unsigned  int   PINMUX19_REG_old;. X' m- {8 ^  t
   unsigned  int   temp;  
9 f/ ]( E: s* I   if(MCBSP_MAJOR)+ v1 N0 ~# @; w5 S: D$ A
   {5 l  Y! w3 I; H% o/ g9 @' f
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ z- t. w6 ~+ c- ?, `  i* m
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% [$ p: }& W0 v6 q  f   }4 y9 R2 p' A) E0 C0 c) {5 G
   else# I/ |0 t; d& b  T" g& I  H% O
   {
! }) E+ X6 L: q) y      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 T% |4 n! j  k; H) ~
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
# |  s# H( P4 S! m7 L   }
- }7 X" t2 O; `" s5 y. z9 ^   0 K, d% S7 w( _# e
   if(ret<0)
8 X5 d. K$ u9 F8 X   {" [& Q0 y( |/ P' x
      printk(KERN_ERR "register chrdev fail!");
8 S7 m' }5 l' ^9 T: O8 Y      return -1;
8 v2 F+ _# K8 |, ^9 F! @   }  y& D/ g6 [: e( w5 @
   
% D6 c1 H- \! z   mcbsp_cdev=cdev_alloc();4 e8 e- I5 Y  ?  U9 p) W( L
   
; T5 P" ?7 F4 ]   if(mcbsp_cdev!=NULL)3 O' c& z* x2 p/ K4 X( a% ?
   {; _8 s( T' w4 }3 g  T) t# K
      cdev_init(mcbsp_cdev,&mcbsp_fops);/ n. t5 _0 G. [1 Q# z4 j
      mcbsp_cdev->ops=&mcbsp_fops;
' i6 k( I5 v" b! p; w      mcbsp_cdev->owner=THIS_MODULE;: F; V4 w) d( u' t" c5 _
      7 m  V9 k4 V3 ]& ^
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 l3 \/ E; w& r5 ~/ b          printk(KERN_ERR "register cdev fail!");; X& C- B. P6 Z/ |6 ?, N; e5 s
      else
  ?  j1 e" w9 m0 J/ S5 g' }$ o4 Z          printk(KERN_ERR "register success!\n");* I5 B8 _$ z4 q3 ^. B8 {$ F
   }
  q: F" {% P- Y2 v   else
! N- g8 s. L- l: l* q4 o6 ]8 W3 }   {
1 E5 b, l9 ?0 P+ k      printk(KERN_ERR "register cdev err!");7 _* v4 O# k6 F/ x8 s- `
      return -1;
2 e7 i7 u& b" g% S! g4 w( g! @% Z   }% ?; }4 e9 f, J( R/ G- y# ^
   
) q. ?: ~) U: ?, P, M  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% Q2 C6 E1 u4 B1 c6 P- z/ B  m1 ]
   if(IS_ERR(mcbsp_class))+ B+ ?, j9 ~  e% {
   {
- F, w6 @7 H. h6 G( U. Q      printk(KERN_ERR "register class err!");) H6 x! }" D1 R9 J& _
   return -1;
: S" [' l7 k- Y4 k8 P0 w% Y   }
  L3 ?+ ]3 i4 S* b! E. K   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( Y# J, g$ r3 N2 d6 c/ v* ]6 {
9 u* }* L: P9 H$ [& X$ Z
   //PSC
) g7 i; O1 l% t$ _) p, r   //add Enable MCBSP, E" X5 t+ B6 v) ?" B
   //test
( w" Y& m- `8 o% o* u3 ^   temp = 0x80000003;
5 B2 H  }  ^: W) k   writel(temp, IO_ADDRESS(MDCTL15_ADDR));) K& n% \; C: s/ p1 V0 R
   temp = 0x00000003;
* t0 g% T" {1 N  u' x% Q' Z7 Y8 p   writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 s/ E/ z8 V* X0 P+ Z, N ( {) e. e  J. ]* z) t
   temp = 0x001FF201;
5 u& `8 W; v+ O   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: e. ~+ `; b- a$ @   & `, e; t. j  {" a" b" E
   //PINMUX  % ?. X2 N6 F1 n+ `0 L9 R" i
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 M: V, P4 P& Y  {6 [; C/ ^   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  # V( L/ s# }5 {% r9 `* Y2 A
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
; j  H3 ^/ Z$ ]& |9 A8 I& m0 L   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 H' S" l7 S& |. `5 |6 Y/ E   
: `- ?# w( Y+ F5 ]2 g   //SLEEP_EN,EPR,L138_SHK1,L138_RC0 J5 ?' a! r0 S& e- N8 r0 k
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
, O: n; k8 j1 M4 m% N8 C   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
! W( }# Q6 Z: q6 E7 z, q( c   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: p& s: X5 d" s" h4 {# f7 P3 e+ O 1 V1 |0 z- \/ s8 X' [
   //RESETn,L138_SHK2
" X9 v9 t$ s4 u   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
( Z$ r+ s* m' M& S   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ! ?; Q& M1 h+ y
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: h. j4 L0 `# p6 J5 i) R( {: g8 Z
7 b) }1 }$ y; m0 y  [
" n: N7 @+ @4 B+ b: I4 h  //SPCR Register6 m9 e8 h1 X+ J
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset6 h; W5 z( L; R% x' G/ P/ g
  temp = 0x03000000;//(DLB=0)
2 G" |) T- s+ L. e // temp = 0x03008000;//(DLB=1)- H2 s! s* p9 ^  c: l/ Q3 _
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
* q# U) _  {; o  temp = readl(IO_ADDRESS(SPCR_ADDR));" z! l, J* w5 [8 d4 H
  printk("temp=%x\n",temp);" T" r' m4 k' @2 M0 f6 w
, [% u$ ~8 O6 h# Q( f0 _5 P! g
   //PCR Register  ~: `8 [5 |  ?# Q
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ R7 J. L+ q, n
  // temp = 0x00000F0F;6 W2 n$ V. i5 `
  temp = 0x00000B0F;
- y) A1 h! D+ f" j! \1 ]9 L  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized + `* N* B! R; L- D$ v
  temp = readl(IO_ADDRESS(PCR_ADDR));( J* `- G* i0 d+ N- y
  printk("temp=%x\n",temp);  
& d3 ?7 _3 _8 `$ S   //SRGR Register
. l; W6 b4 ^& L' H  u& t2 g   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* A7 K' j' B! \- `! k
//temp = 0x301F000B;) r: c9 q# T) \8 Y1 r
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized " \2 u" i4 u- p# M* e7 m6 k5 w
  temp = readl(IO_ADDRESS(SRGR_ADDR));
  w& F! J, D- N) p- Q  printk("temp=%x\n",temp);4 d3 ]' D3 D5 H9 P) M
   //RCR$ B: H6 h0 I) `/ A2 `  e3 X
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, {* G* j) q3 j$ c$ _# }7 I: o   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) `( H) V' t; A% f9 A+ [   temp = 0x00440040;2 z9 f3 _( j! F6 v
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
, |- s9 s( X; Z2 \   temp = readl(IO_ADDRESS(RCR_ADDR));
6 q6 p! D/ @# D- _7 ]   printk("temp=%x\n",temp);
; h* @( t8 Z& ?# G$ y( i  s' Z   //XCR
+ g1 t9 U/ M$ x1 N' H   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 S2 B7 A- H1 `* ?! Y) R   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: E& z/ E+ l1 Y4 S$ d# a" A9 q( v   temp = 0x00440040;
9 |# A- y5 j7 u7 D& A) d+ K+ J5 o   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   - E9 p, y2 e" u" W7 b/ N
   temp = readl(IO_ADDRESS(XCR_ADDR));
/ Z/ |9 X, T, l+ `   printk("temp=%x\n",temp);) `9 V' O- [3 d) F
  udelay(100);2 \6 M: z  v: I% S3 ~* E7 U
  //SPCR Register
# c* i- O) c( V- J! W8 b) S  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' l" D' T; [- N# I
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  s8 O1 q! L/ v. ^, V6 n8 F$ O+ M  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled/ k; ]( i3 v1 `, _" k8 n7 i1 F
  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 g9 K2 N5 U) C# N8 E/ W  printk("temp=%x\n",temp);8 }5 X! `( t- ^( Y+ @
  udelay(100);
3 ^. I3 X$ _/ |7 b# G
# M1 n( _. ]7 _  //set GPIO direction
+ W' R; i7 b# d' n" b   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 b) t0 S( e1 ^. C4 c
   temp = temp | 0x00000100;//EPR----input
+ G) I4 a1 j  u% n/ @; u1 Y   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* L; h  p  z( Z. a8 t( s4 K$ D   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 K4 G9 O, [1 j

: R0 h1 h6 e& }' o   return 0;
( z3 n8 ]6 d& c2 Q. @}
7 H" d% C% q2 e  f; N& F5 O( nstatic void __exit MCBSP_exit(void)/ |: j$ _+ S; x% P0 k$ g: q. F
{
) ]5 O: _3 g0 R$ t+ B   printk("mcbsp chrdev exit!\n");6 Q" V. n( [6 M3 L" m8 l! A' x& ~
   cdev_del(mcbsp_cdev);
# ~, w& u# k: r& i7 \' B. Q9 c   unregister_chrdev_region(mcbsp_dev,count);
* [. M$ Q! J+ c* D   device_destroy(mcbsp_class,mcbsp_dev);! A5 G; R6 N7 R$ U4 i% h
   class_destroy(mcbsp_class);! o( A1 [8 y% I  {; l* @& i- F
}2 I; G4 s- F4 ]1 C
module_init(MCBSP_init);
  ]( O( s5 I' e  pmodule_exit(MCBSP_exit);+ R3 A  C/ E/ n# ~5 e& q

0 H4 [+ I% {: A9 R1 l- M6 K2 SMODULE_LICENSE("GPL");
2 c0 [  H9 j0 F+ o) L5 P
8 K9 b: O! f" w) T我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ J) n' D) D& O) p. q我的应用层的测试程序如下7 i" q; \3 R0 _# X% K- ?% t
#include <stdio.h>& k% i- y# M9 c" J7 Y7 S
#include <string.h>" x7 [& m$ K& a- `. ]* w
#include <fcntl.h>
$ e. C8 {& M4 G! V3 t#include <unistd.h># v1 H" l2 \5 l& v( E
#include <signal.h>
4 ~. y% k/ d+ g3 O5 @#include <pthread.h>       //线程
; H7 S. h" v0 K1 _7 ?#include <stdlib.h>; U* K) k. w0 n; B$ O2 ^6 n1 z
#include <pcap.h>          //捕获网口数据
  v3 ?+ B, x/ b, a- W# O#include <semaphore.h>     //信号
8 u! e! V% O5 H3 ^, e3 Q6 J#include <sys/types.h>     //消息对列7 O6 [. M' j: J. |. v& @
#include <sys/ipc.h>       //消息队列, h+ J2 Z+ v2 d9 k! P) V5 F/ i
#include <sys/msg.h>       //消息队列
5 X9 j4 Y; G: C+ z' Z* r3 T#include <sys/select.h>
; w* r" b5 R; F& n#include <sys/syscall.h>
7 Z4 R" l- C2 g#include <sys/stat.h>7 g2 b6 P7 X, b  A) y; @, R7 V" V4 B
#include <sys/mman.h>
1 J( K* v6 o0 k#define msleep(x) usleep(1000*x)
5 U9 J3 X! D$ p2 C# v
0 s  i+ |; Z7 P* a+ L) lint main()
7 a+ ]) E* @% r1 B{ ( N" @6 R: r0 L; u
    //MCBSP,ARM与AMBE2000交互设备- S) }/ Y. ^5 R( k
int fd;4 `& X# @# k* Y7 I
unsigned short data_write = 0x5555;
2 j' G1 \( ?) q# ~6 P' L. b* K unsigned short data_read = 0x00;% z5 R. }2 k& l6 H
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. }3 G4 n4 e5 h. Y9 s //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 M. g4 z; T! n2 g0 \   
6 a) M, a9 g1 ~& X  if(fd < 0)
/ T& U# m1 y) K- z% Q) L  {" t) X5 r/ e1 F: R3 ^# c
     perror("open failed\n");
0 b5 c5 v3 P+ d, L% _. E* z/ s" P9 V     return -1;3 |0 y6 ~- w4 s  M1 S1 B, T
  }
& F" k$ M0 O+ p9 b' ~7 Y- `  4 B4 t& G- P! y+ P' d
  while(1)8 T* k8 h+ M" _$ A) l5 w3 f
  {
' a! _# W' ~5 X& ^0 t7 _; `0 C   
+ X3 d5 F% V7 g4 P$ h0 @- }! |   //AMBE2000每次读写是24个字为一帧
2 V  S% N7 m6 E' x# {/ H4 z5 E: d   //写数据时将数据在底层存储起来,等到中断的时候再发送( {% y. H. D( W; ^! j
   //AMBE2000输入数据是以0x13EC开头的* u8 d) l! K% c4 _: G. s
   write(fd,&data_write,sizeof(unsigned short));
2 Z3 ]% ~% t1 q5 Y5 c   2 J* j; F2 r& {8 p2 ~
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  6 {, @; _( W: I
   read(fd,&data_read,sizeof(unsigned short));
1 A% T: O! Q; r4 {8 P   
2 R1 R3 }- C4 i: ~/ h   if(data_read == 0x13Ec)
; }6 e0 X8 G0 M; _9 h7 q/ W' ]- f   {
! i5 M) L) c; ^' D" V   
0 a. h* A$ e2 g( v7 ?8 w: I4 o  r6 J: p    printf("data_read = %x\n",data_read);
7 m- t. d+ u9 y   }
: c( _' O5 `! s5 T& `' s7 T   9 q/ v" ^1 E! a5 y
   msleep(10);
% S, o9 _4 k$ L" @. _. \  
) D) o- S) N' B9 o' I  /*
! w) X9 J6 _1 O/ `+ C' Y   ioctl(fd,1);   # @) C* r( W& r5 E, |
sleep(1);
1 A$ @" M- G, ~  N% ^4 l( w) q ioctl(fd,0);8 T" U! D' F' K" A
sleep(1);/ x1 k# ~# C5 P6 ?8 G
*/
( \* d& H" a; Z" I  }   & O* O; d3 E- m0 t+ R
return 0;
2 x1 `: j, O! Z% T / _9 O" a- `! [3 [* b8 K
}0 z( d3 o$ H* N: T4 ]9 c' {

% B) N- _* o4 A; b多谢各位指教,谢谢! 急' y3 ?& K7 Z' U% h( t1 R

; b& _2 P3 i' _# B' `( E
7 X3 a- }6 T( S, h3 E' _7 B* Y/ K5 F9 e" I+ p
& o% ^3 [$ {& D/ V

( N/ e1 W' v- O( a6 v5 D0 E) o2 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 17:17 , Processed in 0.042799 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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