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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ N  _/ c8 ^/ L% ^. T& d' @, X/*  f& \) r0 J8 c2 l3 {2 L
* Copyright (C) 2009 Texas Instruments Inc
0 _- R8 Z7 q3 M) s0 \ *% o  O( o' Z5 H: f! f9 n
* This program is free software; you can redistribute it and/or modify6 |4 p' l9 S; a" ]' u1 _
* it under the terms of the GNU General Public License as published by
. e7 p6 v; M/ f2 z * the Free Software Foundation; either version 2 of the License, or- y! }- U5 L  ]' e
* (at your option)any later version.- u% P5 p/ H  F& [
*
& v. U5 M3 W9 b1 _! u) X( e * This program is distributed in the hope that it will be useful,% f6 u" s/ I! ~0 `" e8 v( g
* but WITHOUT ANY WARRANTY; without even the implied warranty of
, M) ^' a& {3 s. [1 p * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% P3 s8 T. W& [8 `7 F
* GNU General Public License for more details.) [  O) r2 E: t. f, Z% {
*- U, b$ k6 O9 l9 h5 G. G
* You should have received a copy of the GNU General Public License
* u! d- D/ k0 }+ V4 E# x2 m6 G * along with this program; if not, write to the Free Software
! m( \3 x# X2 p * Foundati4 U5 q/ S6 y$ S% n% D
*/
7 ?: [% l. z1 C( }#include <linux/module.h>
0 L% `- \- m" k& |% E, c7 H#include <linux/init.h>
! Y+ C6 [+ K; k1 M" W#include <linux/errno.h>
4 F2 \- R7 Q" {9 G" H8 f) n- L' z#include <linux/types.h>
! u3 ^, D- z' M% J7 [#include <linux/interrupt.h>
9 e4 K: v/ _9 P% f* M* A) Y#include <linux/io.h>
# R) n9 H2 P3 A9 z* [  T#include <linux/sysctl.h>7 [- }8 _2 G9 k' K: G; [, Q
#include <linux/mm.h>  w; n9 n, Y7 W/ \% t
#include <linux/delay.h>/ ]. T% t+ b+ t  i$ `  m
#include<linux/kernel.h>( y' \2 U7 c  u
#include<linux/fs.h>* e5 Y5 d* S4 _4 ~/ Z9 F+ Y
#include<linux/ioctl.h># k8 f% ]2 f9 C
#include<linux/cdev.h>; ?4 }4 ^  p' I- P* p. I; a
#include<linux/kdev_t.h>
  t% b) R. ]! x4 ^" w' n! w8 A" o#include<linux/gpio.h>
) W, F6 b8 N7 L: E8 y#include <mach/hardware.h>+ g8 z7 e0 k) W
#include <mach/irqs.h>
8 c! @: C1 s" ~( g/ m% g2 v0 j" r2 ^: j4 N4 [# C1 W" ~9 }. N
#include <asm/mach-types.h>
/ K4 `" Y2 e# T/ k! ~/ G( |#include <asm/mach/arch.h>, r  A* [4 R  P" k4 T
#include <mach/da8xx.h># C# @" B4 E/ n) }5 z! ~6 a
#define  SYSCFG_BASE   0x01c140008 g) }7 k; k3 X5 `9 J
#define  PINMUX1_OFFSET   0x124
( M( Y5 d9 O! J$ @#define  PINMUX18_OFFSET  0x168 , ?$ u2 \3 A) w" b
#define  PINMUX19_OFFSET  0x16c/ H5 Q5 ]# Q# S' {: v" k
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ Q/ R) J6 r+ B#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR, u2 g! B& U. {* h8 E
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
; ?5 [& ]* |% R" S#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR$ L! I" C- P% n5 I! N* G; U
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR' l1 y& [7 \1 p. o  x, g
                           
+ K# @' ~6 V! O1 U8 s#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
* o9 l" j" c6 {/ N# ?; P#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
; a- h0 ~6 ~1 X: [% O6 ~//PSC
% B1 O5 C7 ?- O& l#define  PTCMD_ADDR   0x01E27120  
1 L7 Y/ y1 N2 _' _  |#define  MDCTL15_ADDR 0x01E27A3C
: h) i0 v* d. u0 T#define  PDCTL1_ADDR  0x01E27304
7 U2 x- R* ]. f" `//GPIO8 direction. c6 `5 k& y  x8 f. o! L
#define GPIO8_DIRECT  0x01E260B0$ J: r0 G9 B8 \1 _
#define GPIO8_OUT     0x01E260B4
$ n1 A2 q; x/ z. h% T% f, [#define GPIO8_IN     0x01E260C0
# C; G5 i' U% K8 W6 O
, A' E8 B; _9 t3 x//#define MCBSP1_RINT    99              
3 [, O- A; W9 V//#define MCBSP1_XINT    100  
/ \* J$ ^' x9 v2 D, l6 M+ C" [+ ostatic int MCBSP_MAJOR=239;) C/ W) k) e# ~2 z) t, Z; H
static int MCBSP_MINOR=0;
4 ?* B! h; u( A3 v  q7 G* [static int count =1;
* e4 k6 q, e) |6 q5 X7 N, s- [) d' M) k; H4 M4 x
#define MCBSP_NAME  "MCBSP-device"* a/ p+ W3 j2 a/ M3 k
2 j, z9 h$ {9 p
static struct cdev *mcbsp_cdev;& H, T+ ^0 W! V$ p1 \
static struct class *mcbsp_class;
  j8 U  c) q2 A" p+ ^; {- m" e+ z8 Mstatic dev_t mcbsp_dev;9 Q3 z. h( d: Z, |. ^$ c
unsigned int DRR_data;
  b4 A' |  }0 Sunsigned int DXR_data;" m( _$ F8 M- [- Z. x4 R* H
static int mcbsp_open(struct inode *inode,struct file *file)
/ q6 b" k! w4 d: @3 B1 p1 K7 U7 H& A) }{
# q* @* F' P1 N0 O8 g4 T) N   
7 v% f3 @* X  A9 _) H8 h   //interrupt enable,initialized2 }" E" h  ^" p) q0 m( J& G& {
   unsigned int temp;
) p7 y1 `0 c$ [( h" o! E   //SLEEP_EN(GPIO8[10])---0
1 @* c! K3 A# |6 v9 K# E   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# _( R9 }- o6 C$ t( M$ Q) P   temp=temp&(~0x00000400);
1 L8 e* b' `  b6 N+ k. Y1 j+ `   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 q, S$ |3 m* t7 R! T- |- K0 E
  //RESETn(GPIO8[8])----0----1: A: k  ]" ^/ M# v4 S
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 I2 Q1 h4 h: S: i" ^; j6 |
   temp=temp&(~0x00000100);
" ], Y1 D! u5 U3 ^   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- o7 h5 u  t# d   udelay(100);
" F$ p; q4 G! g* F   temp=temp| 0x00000100;
" e  E6 z; `6 N. M5 X- \/ D% p   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 @. K; x8 G& |! {  D
   udelay(100);! s  X1 g( I+ f' j  b( `( y" q
   printk("open success!\n");4 D+ h2 z. B% K9 P& J: r- [
   return 0;. I. G% J: h0 D; Y
}% E: b+ c4 q( ~7 c/ C$ l) A
1 Z( E9 g7 R9 {
static int mcbsp_release(struct inode *inode,struct file *file)( F8 R0 D' ]0 h1 U! V2 k7 Q* V
{
1 H1 j, H( i# B* W% G  \   printk("release success!\n");
% L  B$ b. M7 e. @- N/ h& y4 b   return 0;, v1 M* q) T4 R2 Z1 N2 A
}: q' _# l5 d  ?5 G

, F  j9 B/ P( K1 W2 ~0 G! Zstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
9 V* B2 r6 a" j% i. X1 J- o{
, Z/ n" ]1 }6 j9 V) b    copy_from_user(&DXR_data,buf,len);# u+ T. S# e, k* {
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # k7 K% u; b; j/ k' y4 f4 B! y
    return 0;8 m! f& U$ X- M7 q

, ~/ s* O" K& T& W6 N}. d$ d& \& ^, Y9 N: d; L
- @# {$ k0 N3 T4 U1 S4 A# j6 D
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)3 n3 c1 [4 `) I
{
' Q+ k8 t9 g4 Z& G5 M   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- [' O5 \! ?& t1 d' @" v4 V7 K   copy_to_user(buf,&DRR_data,len); 2 H& N- A  Y8 C0 C( ?, I
   return 0;
" O0 v9 Q6 R( z4 k' F1 v}) q3 q0 L' q6 f, T2 V$ {' C
" P  z5 h( P+ {0 ~+ C7 P
$ K& \. J# s" f" M1 a, b0 l
static struct  file_operations mcbsp_fops=
& z1 }0 y( R7 `. [2 C6 m{
# R: {* g) Z. f  x! B8 T% p   .owner=THIS_MODULE,
5 v$ f' `5 W8 b5 M   .open=mcbsp_open,, q  ^9 [0 M4 B& ~7 G
   .release=mcbsp_release,; |: I8 _8 ~, Y0 p) d
   .write=mcbsp_write,' s! D' h4 u3 ?6 Q* K: J
   .read=mcbsp_read,
5 v% d- ^8 K" f4 w: z, H4 W};" V& c  Y- Q1 l$ o, H( l
static int __init MCBSP_init(void)
9 c. n* X5 Q7 U$ R{
4 V1 @- Q5 l6 @2 P" q   int ret;7 f) Y  W. b; n' X2 \
   unsigned  int   PINMUX1_REG_old;
. [: g! q; r& ^3 W8 [1 Y   unsigned  int   PINMUX18_REG_old;
/ M: W& c! z3 f& A   unsigned  int   PINMUX19_REG_old;
1 f9 ?7 w9 K9 I$ `   unsigned  int   temp;  
5 b/ W& _9 i0 ^. ]. u/ {& f6 S3 r/ C+ P& w   if(MCBSP_MAJOR)
7 N  t7 D) u8 k: ]$ r' u   {
4 v7 \' W# C. N# g1 y0 n* m3 [      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 s1 u9 ?+ k9 y# j5 a/ Z
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& w+ [; \& [. j9 O9 T
   }
7 w. ~* D  `6 |   else/ H5 h$ f/ F/ ~9 L! x
   {! r/ a6 y9 \7 I' o
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  z6 [, ]; _3 H! c) P* U0 F
      MCBSP_MAJOR=MAJOR(mcbsp_dev);; k6 F6 x, [5 x1 W# E
   }
, i8 x6 E4 a, R0 w   ' C3 f2 O7 @$ }7 w( k4 q0 V
   if(ret<0); m4 p3 J' J: M: y1 [
   {
* b" P4 y/ P! W9 o( H      printk(KERN_ERR "register chrdev fail!");
. R, b; w* ~9 J" \* Q5 z/ k      return -1;, m5 @; e/ y& j5 L& I
   }2 P- s/ b( `5 a
   
  |5 A) C( ~1 v. M( W/ |: I3 Z   mcbsp_cdev=cdev_alloc();3 ?! h3 R- g9 i- s7 |% {9 z
   ) V: Z# p# Y* _9 V- |4 T# C) o
   if(mcbsp_cdev!=NULL)) a! h5 n2 x8 w' `. Y
   {% _- v$ \) q$ M! N7 A3 z3 |$ s2 l' g
      cdev_init(mcbsp_cdev,&mcbsp_fops);3 \( l. e. n& y* ?9 g
      mcbsp_cdev->ops=&mcbsp_fops;) J6 X" e+ T, u, i9 @8 J/ S( [9 s
      mcbsp_cdev->owner=THIS_MODULE;
: c7 I3 m/ r- ]5 j/ D3 T      : m1 d" s9 }, `9 r$ a) f# a* \
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( ^  |% t5 j; K) E          printk(KERN_ERR "register cdev fail!");
8 u0 ]8 s) `% O% ]      else+ P. S: j0 k+ \% c4 @
          printk(KERN_ERR "register success!\n");- ], ^5 R$ }9 Q9 |/ @) o; Y; O: T
   }& s3 Q3 k! W. @% d  U7 L
   else
. ^$ b/ `7 w/ F, `% _   {, @. r) c: ?" a8 L
      printk(KERN_ERR "register cdev err!");: U, c- h2 X" f2 O- v
      return -1;/ ?! g, p: `4 u* H! x- K
   }
. M' j  `6 l# \. T7 _1 j( ]/ C/ X( m   : }) t. i) U7 ]1 Y) d; b% Z, @! e' i$ s6 G
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. J) _  L! H) w  t: Q  e6 P+ z   if(IS_ERR(mcbsp_class))
6 ~- V" K9 z6 N   {, L: ?8 o6 [) e# c
      printk(KERN_ERR "register class err!");9 [5 ^8 u- k, Y# t# e1 X2 U7 e
   return -1;8 v/ ~3 o' g8 h/ n
   }
4 b5 e( J8 M/ D% C% Q, k9 e9 b   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
  V! T' {8 g% }9 ]  \. }
, \! l  N' a+ n2 D- o& W- U   //PSC5 H+ Z6 v1 A5 }9 x4 d
   //add Enable MCBSP
) [) Z( o; Z; |- ~   //test1 T0 R5 |% @- F' F7 _6 n2 ]. T
   temp = 0x80000003;
8 |6 t" ?3 e5 g6 H( k/ ?0 |   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& c8 q* X' H5 d4 n: q   temp = 0x00000003;) l# m2 L3 R# P7 j: q4 g+ j
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
' C/ R3 z$ }! i2 `$ R # y- t$ G' J8 G" G8 W) z8 S
   temp = 0x001FF201;$ v  {% t  m5 M3 x# r
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
! X; K4 W: S( X   0 c& ]: S) o2 Y, K
   //PINMUX  
* K) J, W1 m& q- {4 o" u( f   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 e: W6 M4 A' S7 r3 O1 q/ M/ V+ j   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ) \. q' Z" d& f# T( y# _- m$ v
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   # x+ Q/ u1 Y8 n: F! ~3 ^/ M# E  ?
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 C. R& Y) f* f/ O   ' A* f5 G  j6 r& u" l! B  C- F
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
, H2 r5 B, w/ |   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  0 m, p3 Y6 C  T8 t
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
1 A; N$ i5 ~. i. G5 k2 y6 V: d   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ A( a- N' i6 }& n+ E$ o% o% e
) G8 l  S/ z4 {/ V
   //RESETn,L138_SHK2! E( H# t2 d. U
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  9 |" ]& _1 F" A4 ^6 Y
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   # H% _$ }9 P% \7 ^: q- B6 O) F0 r& x
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; D, M7 @  Y5 J! g; {, Q
( a& S$ o1 q0 g# ?3 J( P* R* ]
( }% ?- y# K# R7 Y. W6 F
  //SPCR Register  }  j- w; V0 `
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: R2 z* J9 n$ J9 h9 q  temp = 0x03000000;//(DLB=0), w3 l, `, f# a0 z3 Z  U/ b
// temp = 0x03008000;//(DLB=1)$ R% X- |0 s2 L7 {# D3 o& b
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  N3 u% F+ z! q. t7 H  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 d  I7 n4 J- j/ e% ~# l  printk("temp=%x\n",temp);
: e2 Y2 ?" _( q" A+ b; C
- t2 M/ W2 v# M8 H9 ]/ Z; X   //PCR Register! T; P2 t0 ^! M; {% r
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 a7 i0 |3 v+ l% Q9 y( r  // temp = 0x00000F0F;
5 F( d( m' ^& J$ t, x  temp = 0x00000B0F;
5 s6 @! }9 S! w! B% V  U  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized : _9 I+ [: [( J% v
  temp = readl(IO_ADDRESS(PCR_ADDR));
" r4 o1 \* c4 b* m$ \+ ^1 O  printk("temp=%x\n",temp);  * O: w8 F$ W3 q6 x$ S
   //SRGR Register; E( i' L) f2 j2 X0 f# k, y
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11! }1 ]2 U" A# B$ K
//temp = 0x301F000B;
( J$ n9 V: x8 M: v6 e  ]   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
' A5 E7 S) A5 V+ f5 B  temp = readl(IO_ADDRESS(SRGR_ADDR));+ G1 i- `  f" ]1 g$ q! `" I
  printk("temp=%x\n",temp);/ t  y. v5 I/ S. M9 N8 N) G! E
   //RCR% E* l7 W6 }6 f3 l0 ]# B2 [; Z
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
" J; g1 m4 C- X! b  m1 A7 g- W   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; F7 P4 r  U9 y8 `" k# @* R$ o   temp = 0x00440040;6 m7 t/ p; @5 d4 n
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 k! \' N+ N1 W0 `  d4 V   temp = readl(IO_ADDRESS(RCR_ADDR));
% t) w& O$ y0 x) L4 J3 H- Y: b   printk("temp=%x\n",temp);8 y- q# D+ @* S1 J
   //XCR- O% i( u2 {+ ]1 u( c8 X
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! X6 K6 A$ h! m8 d0 o# N+ Q   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: O% i2 y. A# q( @9 a" l4 K. G   temp = 0x00440040;3 T7 R  p. X1 O6 q, {/ U
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
: Q7 n+ }' i4 f9 F2 W2 n; W5 P0 C   temp = readl(IO_ADDRESS(XCR_ADDR));
; i6 q3 B- [$ Y   printk("temp=%x\n",temp);; |! ~- Y; `4 P% a+ a1 E1 ]6 V- z6 f1 w
  udelay(100);1 t( g  C& U# D5 _- h' |
  //SPCR Register. P0 n7 K: w6 C4 |+ b
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 `# ^5 _( D9 g( f( Q. {  temp = 0x03C10001;   //DLB = 0 VS DLB = 1! j' W, H3 S* \9 J# A
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled. p' [' G. u6 m7 `5 N
  temp = readl(IO_ADDRESS(SPCR_ADDR));' k* I5 T+ D  x% @5 K6 O7 ^
  printk("temp=%x\n",temp);% U+ o8 u  g. Q: s/ q; b
  udelay(100);
( o' r2 Y+ R+ t3 y# a/ F# w8 M% K- O4 t# D
  //set GPIO direction
2 |! z- \, p, W/ U, O   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' R6 ^7 p, \: C! B: k/ H; r   temp = temp | 0x00000100;//EPR----input9 {. ~7 u$ g: v& k
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
  \2 M1 J5 c8 D" Z7 Q4 G% X   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
4 ~( i1 o: {. J% z( g5 e
( l  k! Y! `7 k6 r8 R. v   return 0;
2 V' R6 n( [# g! [9 s5 u}- o7 c2 j3 u6 m" v/ g. O# }; I0 j
static void __exit MCBSP_exit(void)
+ V) L  u7 c, x+ L% n) I7 {6 J' O) m# l{. I# G3 k+ Y7 d
   printk("mcbsp chrdev exit!\n");
" J" p# ?( x0 Y# l+ Y   cdev_del(mcbsp_cdev);
' X+ }$ g  z5 L# g   unregister_chrdev_region(mcbsp_dev,count);
; s* L0 x& d5 Q9 [/ t   device_destroy(mcbsp_class,mcbsp_dev);1 N6 A- F% @6 g9 N) K1 s
   class_destroy(mcbsp_class);
; X9 {4 C0 J  A7 F}+ T+ l8 f8 P' e! \
module_init(MCBSP_init);6 R, k* o/ V3 K3 [: p0 C. d- c
module_exit(MCBSP_exit);* L. `% [+ V1 o. e0 l1 `

# Y6 y8 n$ d( c' R0 \MODULE_LICENSE("GPL");1 }& w+ v6 r7 m

# }0 u% g, n+ Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! g1 f, R0 j3 S* G
我的应用层的测试程序如下
7 h8 `6 h( }# ?- ~, e) h$ f, w#include <stdio.h>3 d" |$ _9 b5 p# \9 J. \, {5 e( b
#include <string.h>
/ r6 n% P9 h* s" G% y#include <fcntl.h>
5 c: l4 l$ p6 W0 r8 d* J3 ^6 L#include <unistd.h>8 Y3 j# i3 m# C' W
#include <signal.h>7 G$ I# u5 _: G; u9 S) Z
#include <pthread.h>       //线程! w) G& s, i8 m6 a$ Q+ z; s$ I$ P
#include <stdlib.h>3 d9 d, j5 O9 h! `
#include <pcap.h>          //捕获网口数据9 O' G6 U' `% T( r" \% W2 d
#include <semaphore.h>     //信号
9 B7 r6 F( ~+ v4 h#include <sys/types.h>     //消息对列
, f8 i8 s8 M2 Z/ G* M#include <sys/ipc.h>       //消息队列
. {; e2 R3 i" p3 z+ \#include <sys/msg.h>       //消息队列# b; u" z) n; z1 F/ ~7 ?$ D
#include <sys/select.h>7 ~. c) q' Y0 J* C
#include <sys/syscall.h>
* g1 d. l3 \" n0 x3 `/ y( E#include <sys/stat.h>
6 z5 b9 \/ A" l2 C  a& \#include <sys/mman.h>
2 h( m) \* A) t#define msleep(x) usleep(1000*x)5 j- }/ K7 Y  ]

2 E( b- B  Z0 W! V( o% [int main()
# b+ l5 }& ]. Q0 g) i5 ?{ - e8 P" r: X2 D* Y9 F
    //MCBSP,ARM与AMBE2000交互设备
+ N7 M. E  p# W4 T int fd;
) q5 }9 g+ S3 R& Y6 k$ D unsigned short data_write = 0x5555;2 w6 r& u, J* o% X  G% \+ h
unsigned short data_read = 0x00;
/ }2 N* v# U. C8 u6 g  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 `/ w" |# y* m" B9 d4 ~& i6 ]6 U //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 l8 U" E* G. F/ H/ y/ j   
9 m6 G2 a- C! p- D( {; _  if(fd < 0). W9 Y( `  ^: r, H' S$ @& Q
  {+ d- j! v" {4 S( r% C8 M7 g
     perror("open failed\n");) O) S' K! u% e! M
     return -1;
. d) Y& S* b7 M1 V9 P/ {% p  }. {+ H& ?  f7 J; X' Z0 u
  
6 Q' A! e: l% X! b/ T  while(1)
, w, C9 D/ a3 d& v+ x- G  {
- X8 u$ J7 l9 ]9 g   
! B' F6 K, Y3 Y' P   //AMBE2000每次读写是24个字为一帧4 A* q# _+ o; N) V1 o+ B
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 b% m. K: V( W4 G6 @
   //AMBE2000输入数据是以0x13EC开头的' i; i' U* _+ C2 R
   write(fd,&data_write,sizeof(unsigned short));
1 U9 [  o: {2 i9 l   
9 b3 u% S* N1 r   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
: C# l6 o/ T* b. X! w   read(fd,&data_read,sizeof(unsigned short));+ q; D4 t" c( O) r- _
   # I/ H8 |/ y) I1 X
   if(data_read == 0x13Ec)
" s2 N. `* v) G. H8 I5 G1 o4 J   {
: L" l, w5 e$ l2 q0 I4 l+ P   
) a: P2 V; S( A# l* m    printf("data_read = %x\n",data_read);/ B9 ^9 M/ V  j2 N3 G1 l" g1 W( l$ b1 F
   }# n$ |  l0 u5 ~) \  x+ M- C" b
   
0 b( e$ U' @. L   msleep(10);
5 |$ e. u& S* v( M: c2 H  2 [4 Z/ {8 s! {. D/ m
  /*- L; q6 K' ^( t$ g3 ~
   ioctl(fd,1);   0 @+ s+ \- I* B! p8 y; }/ ]" ~/ |
sleep(1);
$ u$ Y# W2 {5 `! {& }" r/ z1 ^. V ioctl(fd,0);# K& u  U! m0 p$ G' H+ J
sleep(1);
/ |9 L2 r0 f8 W */ 3 \' P8 X& F- M6 C
  }   8 O4 Y$ d( k" c3 Q4 K/ r9 O
return 0;
# k: s* S1 `! g. f* ?
& C- _' P$ Z7 j. f}( ~& W* n# t, P2 c
4 e" {) a3 M4 |- Y- D5 g' X
多谢各位指教,谢谢! 急
2 |1 b3 l) I. L& U1 x, |# k3 `
! d( q" [2 H6 K4 ]0 n( [  `
% g9 t( e6 Z; _2 k- [; O
' r0 J" @# M$ L  Y1 P6 i
: a* x8 Y* }* l' n! i1 n  F+ h1 ^! O) z; a1 |# e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-20 21:04 , Processed in 0.042409 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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