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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 h6 k) N( {- t' l5 p: V/*1 Z% d  ]3 P: _; X/ g( Y6 _
* Copyright (C) 2009 Texas Instruments Inc
  Z& R6 R; L) O *
# i( m2 v) K. s5 l * This program is free software; you can redistribute it and/or modify
) R& o4 ]  `8 V/ k& V. |* O * it under the terms of the GNU General Public License as published by$ J$ a9 p" w9 G# K9 q
* the Free Software Foundation; either version 2 of the License, or9 i/ _0 o5 t1 ?% e* k, L" q5 ~6 y4 B
* (at your option)any later version.' r. ~, g  R8 q( s
*
  ]. F3 ^3 f, S+ _4 c * This program is distributed in the hope that it will be useful,
2 {4 ^! d% r; X# S) m0 b6 } * but WITHOUT ANY WARRANTY; without even the implied warranty of
' F: L+ w6 m$ O* r3 w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, D$ Y* A, Y  N( F/ F" `! j
* GNU General Public License for more details.7 K5 G) l7 Z' J2 A3 Q7 C
*
; X/ C; \3 c9 F+ }1 u7 R5 [0 S/ h * You should have received a copy of the GNU General Public License
+ B3 D$ l' ?% {. l7 K+ f7 v3 \ * along with this program; if not, write to the Free Software8 \. C: d6 x& d/ O4 P
* Foundati$ f5 [2 g, n2 D  C
*/
! i$ `3 H) I+ q- f#include <linux/module.h>
- L" ^- z% F8 i0 L8 _; F, [& c, x- F#include <linux/init.h>
6 Z, `+ u5 m5 [' _#include <linux/errno.h>* X/ Q; p9 M% t9 C; N- b, ~
#include <linux/types.h>; U$ \8 F7 `% A0 `: z- B  G
#include <linux/interrupt.h>" b/ D  {" X- l7 t3 L. _
#include <linux/io.h>
4 p5 R5 n. `: B! \8 f#include <linux/sysctl.h>7 ]) U, ]9 v7 `1 w4 C8 w
#include <linux/mm.h>0 `! V: f# x3 X  n4 z& y
#include <linux/delay.h>" n! ^' n, N& C" B/ K* M
#include<linux/kernel.h>
. ~2 B3 e& l9 U7 |2 `/ N3 H( `( V#include<linux/fs.h>
: p% J4 T$ @* R; v+ k#include<linux/ioctl.h>
  j8 O( Z1 ?/ A- f8 J#include<linux/cdev.h>6 `4 |* ^! o- d; V- T
#include<linux/kdev_t.h>' h4 h9 Z' \  }; S
#include<linux/gpio.h>/ M/ ~; ~  T" k) W3 T. O" M* |& ~
#include <mach/hardware.h>
! n, ]$ G! }. N1 Y* Z#include <mach/irqs.h>7 R) K9 P  o0 X% l. K
" b- Q! F& U; i) r1 @; F- m
#include <asm/mach-types.h>8 j- R. E+ t' g; W
#include <asm/mach/arch.h>
6 v' J- U, D- c0 m  l2 Y/ K; D#include <mach/da8xx.h>/ X( d. _& W6 a8 D& Z
#define  SYSCFG_BASE   0x01c14000/ Y4 C# K9 s* G' L# X$ ]% ?
#define  PINMUX1_OFFSET   0x124
1 o, ]% }6 u6 s  l#define  PINMUX18_OFFSET  0x168
+ T5 `/ H5 Y5 p#define  PINMUX19_OFFSET  0x16c+ l% P( w/ n# C; y- v+ Q# S
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR: s& G* K' e! E6 O
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
+ m5 W' I: B: u! ?#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
3 ~7 ?; j: Y9 _6 X: ~#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
$ Y, r; w& ?, C. i, n; a#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR  c7 D. i: o0 R) |6 @. H3 l* ]
                           
  d, P  H% w3 Z& Q5 J/ v! N, U#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
4 u1 N: J* [/ N3 _6 N; p#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
4 Y: w( s# R( r" N9 {) c' u+ `//PSC( j% y) x" R8 d
#define  PTCMD_ADDR   0x01E27120  
$ ~2 z1 C+ J' h0 U#define  MDCTL15_ADDR 0x01E27A3C& c" H5 ?3 D) E6 [+ e! j1 S
#define  PDCTL1_ADDR  0x01E27304
3 s" L7 `* E3 c+ v& r//GPIO8 direction
: }5 p$ ^- V% `/ q" n& p6 H, @. o# c#define GPIO8_DIRECT  0x01E260B0
; O" ~- z6 d/ Z$ z0 ~3 s% i4 V#define GPIO8_OUT     0x01E260B4
! d* I5 b8 h0 M6 q5 d/ W7 p#define GPIO8_IN     0x01E260C0
) _  P& V* f# D) L+ v! X' V% T4 f4 Z. Z. V
//#define MCBSP1_RINT    99              . V+ _' D  _: v$ ^( s
//#define MCBSP1_XINT    100  5 k1 @7 r: O1 ?5 u+ k! c5 N
static int MCBSP_MAJOR=239;) W/ ^$ S/ Y7 }$ i7 E+ d
static int MCBSP_MINOR=0;0 M% k  M) U" n! ^; u  k
static int count =1;$ U1 m4 w- e4 v) N7 G

# \0 G7 O, d0 ]! M  U& A+ R- O#define MCBSP_NAME  "MCBSP-device"* B2 F9 t& l; t; j) o4 ^

1 l* Q; L6 }' u0 zstatic struct cdev *mcbsp_cdev;
% }; F5 D1 S& _2 M7 ?static struct class *mcbsp_class;0 V/ c, X/ A% }- T9 X
static dev_t mcbsp_dev;& V* }; A' q" b& @' i3 G7 H
unsigned int DRR_data;# d' [  Y" W; h% q$ s
unsigned int DXR_data;
0 ^' U8 H3 C8 i  r5 E# ]' U2 u; gstatic int mcbsp_open(struct inode *inode,struct file *file)
7 N+ t1 a8 Y* K( g$ _- A{
9 U: m2 O2 T9 D) |   
& D. U4 m6 s- I   //interrupt enable,initialized3 Z( ^7 e- q$ ?9 y
   unsigned int temp;
# q! V$ \, @; E& W   //SLEEP_EN(GPIO8[10])---0+ Y  ^$ r, X: m
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' U7 j6 h0 B1 `9 p   temp=temp&(~0x00000400);$ N- A0 \3 R2 I/ L2 G% F) l
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& W9 p* @8 B6 R( G6 B2 w! p( a
  //RESETn(GPIO8[8])----0----1  ?9 p7 j6 p: Z. {1 u
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# w8 q% y8 z0 v5 q  s
   temp=temp&(~0x00000100);3 n6 B8 {( i0 O" E- _3 Q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. F/ W' [8 g/ @# \' A0 I* f. [   udelay(100);
. m2 x; r6 a) x6 Y6 O! d   temp=temp| 0x00000100;
# u0 E2 m4 g! e% r; Q: m' Q# u   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, ^+ q/ i9 G( K) v% W   udelay(100);
; v9 f: T! ^0 P5 P5 y' V   printk("open success!\n");& D1 w' @$ x5 q5 O$ W' C' h# F7 \
   return 0;
/ w9 ~8 S  ?4 A# g" D7 b}
$ q, Z$ k) w, R
& i( T. X" N" U0 q) z; V: v! zstatic int mcbsp_release(struct inode *inode,struct file *file)( c6 m! |2 {4 w& C3 L
{8 d# h- W' I9 n. A
   printk("release success!\n");
$ Q" d; ~' ]/ M' e- f   return 0;$ w8 ~; t0 T8 Z7 T  a
}. y1 s* G3 ]' k
# F. R9 s. d$ y' y7 }) ?! L
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; l& l8 l" ?0 p2 I: n{7 {/ O# ~) h! f3 l- ?
    copy_from_user(&DXR_data,buf,len);: u% x0 W  e, w2 Q$ |( }8 ?
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       7 f$ b) r# I0 H4 {- Q
    return 0;+ B! e& Y  I+ U) ~3 x; _6 \

" w- `, e  R: s& K}
& D$ z9 _5 d9 R
, `# z  U. e( T; L$ a2 C! Zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; R# m& G: ?; k* N; v" a{
$ I- ]6 F( M' H   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, Y+ R% Y8 T$ _1 H0 {5 V( b
   copy_to_user(buf,&DRR_data,len); ' {8 M2 G( Q( v: c8 G# {
   return 0;
, c6 }# m  C6 E  Y% l: d  s}' f7 x3 \3 w, ^/ i" o4 q& `1 u

) c+ U+ G, Z0 s3 N8 `! A5 b* W/ i
static struct  file_operations mcbsp_fops=5 r9 t0 G7 q; W- K- R' z
{/ z5 _: J6 f' y3 s3 v# S% E
   .owner=THIS_MODULE,2 n( w& X4 ?. ^, B6 J
   .open=mcbsp_open,
) T6 W! V/ m3 X# P, |( V4 i  a   .release=mcbsp_release,
* w7 V( w! T) a; M; a$ w   .write=mcbsp_write,
/ D* i6 K$ T/ d6 }, n+ M! M  w# V   .read=mcbsp_read,
1 o6 x+ O: Y- y2 o8 O/ e};  L8 ]( a+ t$ w5 i9 x1 Y2 C6 Y
static int __init MCBSP_init(void)3 {2 l" w$ B! v$ k+ L
{+ K5 F3 g  x; ]
   int ret;  _, k4 h9 O; Q1 x7 d$ v
   unsigned  int   PINMUX1_REG_old;
  e9 G0 t0 e, Q  c9 v  n   unsigned  int   PINMUX18_REG_old;
, A+ s  f0 R( J* H   unsigned  int   PINMUX19_REG_old;
+ K3 D! H5 [9 h/ t' I   unsigned  int   temp;  / p+ q  b5 B; U9 J( ]
   if(MCBSP_MAJOR)6 B! E% v! a$ n3 R/ C) ~* n
   {
* Q% k* l( G7 G& W. X/ E% G& I% z  V      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* {: Z# o. M1 O& ]# _0 O+ Y5 t& D
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 U( I8 K" x; @8 V
   }
/ `5 L! a3 X5 b4 }& C   else/ y# n; L( R& j, A8 A0 s
   {& Z6 b1 J4 q3 {# ]- z
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 ]5 n) u, V6 M! Q
      MCBSP_MAJOR=MAJOR(mcbsp_dev);% H- g) c9 H. _# P9 T. k9 L. r: `
   }1 c' ?2 c2 S0 d9 G# k& G) ~
   " p% G& W9 I0 {+ b+ g$ t7 Z
   if(ret<0)# V4 V9 S. m$ g6 }: m0 S
   {; Q; R( y- Y$ w# J: }! P/ R+ D
      printk(KERN_ERR "register chrdev fail!");
8 R" ^8 Q3 [' f/ N; ^. P4 a" i3 R. }      return -1;3 B* x$ F5 a" P0 w/ e" t
   }3 X: j# @2 ~" R% I" O$ _: t! }3 Y6 a
   
$ m* G1 e. A% [( P, v7 N   mcbsp_cdev=cdev_alloc();3 S, T4 S5 a' ^+ ]) d
   
+ m6 J, i9 Y& _5 L0 h: }   if(mcbsp_cdev!=NULL), v, F# h. j5 ^. g" F: S3 A
   {4 I9 j+ e2 |! {. ~( |$ I% H
      cdev_init(mcbsp_cdev,&mcbsp_fops);
2 _% p8 k1 t! R& \) i! I7 l      mcbsp_cdev->ops=&mcbsp_fops;
# {# G  {0 J! q& p' J      mcbsp_cdev->owner=THIS_MODULE;: S5 w) X+ c1 ]' V) q) e. H
      
& ^5 S3 s& ]3 f( q7 D% q& e      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). [" p" B. H& s% A# ]/ _# e
          printk(KERN_ERR "register cdev fail!");* i* d5 ^4 E- k" S
      else7 \7 _9 [% J. s% o: n
          printk(KERN_ERR "register success!\n");$ ^' X7 O, \/ v, B3 N2 Q3 a
   }
- v) R5 T3 v8 h/ R9 Z* r9 m, a3 l   else3 N3 g  W. Y3 L3 N8 A0 x, H
   {3 Y3 |! H! _  F
      printk(KERN_ERR "register cdev err!");
/ N# H8 h) u( n7 D" T# u      return -1;
4 _; j$ Y1 h- e. ~) _   }8 u$ O+ A: u, O& q; T1 j  s, `
   3 f7 j( F) l' k' c  _: F7 P' s
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);5 V% n8 z3 ?1 w9 ^+ d( ?  e1 }0 }
   if(IS_ERR(mcbsp_class))
* R0 U. v+ ^* M$ B1 Z   {
6 P- V2 n; [% N      printk(KERN_ERR "register class err!");
8 S" I7 l5 o7 a: f9 ^+ ?! u! e0 n   return -1;
! }2 _6 h; ~. Q: E5 Z& C8 c   }
/ e: f/ u& x0 }* h2 L- j   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; S7 H  L7 {1 ~) r# @
  _: Q( N" U# e   //PSC% n/ e# z; {: i  L' ~* a! i
   //add Enable MCBSP) k% d+ E3 o  d
   //test. }: i1 i9 g$ k- i8 W2 {
   temp = 0x80000003;
; J5 _  s" |8 b& H6 U7 Y3 @   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ ~5 @5 D* \# K4 P' ]* P) y6 |   temp = 0x00000003;, j4 ?* U9 r  X: y3 N
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 A+ L$ w  ^  C: a ; i' t% p& O2 e  t/ s' T# z  v8 {
   temp = 0x001FF201;7 z. ?, q2 ^) ^4 ?! ]5 m9 s( ?
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 \$ S$ Z9 Y' U! ]   
' ^4 o$ y& Z3 M   //PINMUX  ! `! W8 i2 r0 J: l/ U# m
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; w& Q  U: @4 V* a+ ]8 u   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
/ H; R" A# U4 {: [1 W) x; ]2 f   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ) u$ b6 Y* f  C' S: u
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 F; V/ c. U. n) ~9 T. _   / h8 s3 P9 w) e
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
. G) B( `( I. b# A! z2 f   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);    v: @3 q4 g* F
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
# h: p- q) x: a  ?: z2 y   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# g7 s. P9 G3 c/ v; a3 Y- @

* f3 c( t) H. ]/ C$ _4 O/ R   //RESETn,L138_SHK2: m& k5 `  @2 f% M9 J8 k. `
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  6 m& T7 O+ m8 `. N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   : v/ s$ x5 x+ U" W
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- s$ c, a) A, Z7 M 1 u& ?( e6 L9 D3 m6 n* b

' C' h4 o2 U* n( w/ W' J/ E; j" b  //SPCR Register
) u; @9 D9 U$ A# |  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" e5 P- l1 @, K  temp = 0x03000000;//(DLB=0)
+ ^; R5 [; N7 {- O: D; ? // temp = 0x03008000;//(DLB=1)! N+ r7 \' B2 C+ t% d
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset, N& ]5 T! U8 r" ]6 j. J# ]
  temp = readl(IO_ADDRESS(SPCR_ADDR));9 L" z: B. o0 m) @+ w
  printk("temp=%x\n",temp);9 N3 I, q' U% F8 W) G/ R
& @9 o7 D! I. d, `- M2 B
   //PCR Register
7 o$ [0 N% [5 @9 E: n   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% T; x: H& U4 F0 X1 \( [
  // temp = 0x00000F0F;$ S" r: M" }& q8 d
  temp = 0x00000B0F;
* C& u2 C" j8 Y9 v0 p  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ I  F* B' Z/ b$ G6 Y' ^1 ^
  temp = readl(IO_ADDRESS(PCR_ADDR));
4 ?' d- _# l- \+ X2 ]* W( F9 M- i  printk("temp=%x\n",temp);  
4 \  l5 w/ _9 X' t* N+ R/ J8 W   //SRGR Register
6 X3 ^( j) y* Q3 e; A. a( K9 @7 M   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( D& r# M3 A8 i0 i& e+ {. i
//temp = 0x301F000B;( Z3 ]7 ~+ h6 K& H4 f$ ^4 v) z
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized " E# z9 q1 H8 U
  temp = readl(IO_ADDRESS(SRGR_ADDR));
# B0 `7 Y7 s# w4 A' B  printk("temp=%x\n",temp);
$ ?6 Y- u7 B2 R2 T+ x   //RCR% }. A7 v7 P, S) ~. D7 B
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 Y% N2 W  _$ f, D, B. g1 |
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 d9 g( Z5 j$ R, P
   temp = 0x00440040;& j$ F  B2 S6 \6 c
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   8 c  d& h9 ~: B9 h
   temp = readl(IO_ADDRESS(RCR_ADDR));
2 W# c  F+ m' ]2 P: g) S/ m% z   printk("temp=%x\n",temp);8 t7 {2 a- u1 _0 B" E1 s
   //XCR
7 N4 ^% ~: }1 {" C0 H& ?' x% x   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 B2 ]" W& L( M& L6 Q0 |
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 [) u% b! y5 {( v- ~* e- o
   temp = 0x00440040;
- Q( n  V* H: S1 _* n$ \   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
8 c7 K4 w3 h# u( r& ~  _& e   temp = readl(IO_ADDRESS(XCR_ADDR));
+ h% w- R! V( |. b2 c$ A9 H   printk("temp=%x\n",temp);
# W/ b* }" f4 {: m  udelay(100);
1 L! V; f) b( V9 u  //SPCR Register
% P4 `( y8 Y4 a' o  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 g9 }/ f1 I& \  temp = 0x03C10001;   //DLB = 0 VS DLB = 10 ~1 {  m' K+ b
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled4 s& }1 P2 q# D- E
  temp = readl(IO_ADDRESS(SPCR_ADDR));# Z; o+ U9 {  V1 ?
  printk("temp=%x\n",temp);5 R/ R- Y  T, y% J5 \/ H5 u. E4 h
  udelay(100);9 [' i+ q7 n: R

& M4 e  j' W( E8 [2 Z, n  //set GPIO direction6 s# q8 {8 s- o$ y5 _! f
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# d% T' ^$ T3 t
   temp = temp | 0x00000100;//EPR----input
: z9 w, I# I5 V   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, K: H% G9 V! V2 I. p* M. k
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # D: H* r3 \( b6 r6 g$ N4 g
/ F. v. W$ U; u& r0 q+ L! i
   return 0;
, l! ?' L; |8 U: Q1 l6 X8 n5 {}
( o+ f3 H: f  t  i! g1 Fstatic void __exit MCBSP_exit(void)
; R9 Z7 Z6 n8 s0 ?6 l+ X. h{6 Z" c5 w( G" t1 e0 g4 [) Y+ ]5 n
   printk("mcbsp chrdev exit!\n");* g* e% h# k5 y" p, g
   cdev_del(mcbsp_cdev);
# T9 x0 U0 s8 g& X* m   unregister_chrdev_region(mcbsp_dev,count);! a$ b& z! j9 V( }# @
   device_destroy(mcbsp_class,mcbsp_dev);. b( y+ [! d: G3 T) f, F" x
   class_destroy(mcbsp_class);) A7 Q0 U& i, W9 p$ \
}+ j& R6 V0 k( n. O  Q
module_init(MCBSP_init);5 `" X7 q7 p% T
module_exit(MCBSP_exit);
6 Y! Z, i+ ^2 k
* g7 v. E  j* K5 X0 V3 X2 @% bMODULE_LICENSE("GPL");0 T4 Z) a% R' i* K
5 J2 _9 h& C$ T$ M' D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
6 l- O3 ^* l$ k$ u0 E0 c2 C  I我的应用层的测试程序如下# D! l  ?/ D9 K* h" S' l
#include <stdio.h>; Y$ G. E2 ^7 n* x) S, U% i! B
#include <string.h># @* U1 d+ o2 h% y5 L
#include <fcntl.h>4 `) O1 N0 p( o: R) n# N5 o
#include <unistd.h>2 V1 Q" a1 _$ D8 U) a5 Y
#include <signal.h>7 I8 n/ `2 t4 ^2 @5 T7 ?8 g4 G+ ^
#include <pthread.h>       //线程, k- e& v% J! ?7 T2 q% r+ m8 i
#include <stdlib.h>3 b4 O. l% Q9 r
#include <pcap.h>          //捕获网口数据+ w8 ]3 x. |0 t" }8 q: ]
#include <semaphore.h>     //信号
) o. a! e  B# a  |#include <sys/types.h>     //消息对列" L( H1 ]  b- M0 N
#include <sys/ipc.h>       //消息队列
( Q* W4 W2 ~. S6 n# I3 a#include <sys/msg.h>       //消息队列7 l/ ~+ y2 c! ~2 K
#include <sys/select.h>2 J( I9 @: C; y  E8 D
#include <sys/syscall.h>% V% E2 d2 [" T0 l( P$ l) g
#include <sys/stat.h>
/ f4 I) [$ i! m1 u6 i; l#include <sys/mman.h>
& Q0 V  D; {1 k+ y# s4 x#define msleep(x) usleep(1000*x)  G4 k- E/ T* \- t% `' y
5 N0 L( P/ U( {- i( g6 V
int main()3 J5 O, j4 e" |9 C% ]
{
- Z9 J) F0 |+ Q( d) B  n    //MCBSP,ARM与AMBE2000交互设备) A3 w) i0 U% T  O. l
int fd;; v: q; F/ C0 [" l& W9 O5 ~# t
unsigned short data_write = 0x5555;
$ n6 K9 S7 F) Y unsigned short data_read = 0x00;
$ M4 L. h8 Y8 `* G' w  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 O( r% @) [* J' v& `% i
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, T; i, q5 \/ ^
   
0 Y% Q* ^) ~' M0 m) o: T' P1 ?  if(fd < 0)
( B" f9 }& p$ f2 E: l# F4 X' R  {! |9 v" Z/ I  R* y4 n9 B& m! c2 I
     perror("open failed\n");
! |7 G5 g; Y( i3 U     return -1;
: [. b. o4 A  @  }$ e9 s6 T. \- w
  
5 O( y$ t& X, i+ f9 j+ J  while(1)# o; P5 J) m" C" E" f# V/ \
  {
$ H$ _* F$ ]/ b" v   
' ~4 D0 G1 R/ q+ ~   //AMBE2000每次读写是24个字为一帧
) _3 L, r. K0 M" x) I: r1 u   //写数据时将数据在底层存储起来,等到中断的时候再发送$ ^" G0 S9 G. W1 w
   //AMBE2000输入数据是以0x13EC开头的
- v9 c+ m3 ?* z& a   write(fd,&data_write,sizeof(unsigned short));
- K& t7 N6 B# f$ s   
& l: I, t; U3 `; m/ H) r6 a* l   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
( o6 {  k. c: e: `* B   read(fd,&data_read,sizeof(unsigned short));
4 I6 H; B( S/ }% V6 r   9 @& s" ?2 {6 j3 h- L/ s9 H4 a  Y
   if(data_read == 0x13Ec)! o/ I) H; e* v# F/ u
   {1 D6 h- _$ B- w; r6 _* T- {8 R' a
   7 [; [" W5 ~* @
    printf("data_read = %x\n",data_read);
+ E. @& j: [  C1 y2 b  ~: ~. y0 ?! @   }) S+ z% ], E8 ?' H3 ?( m
   
, U  \9 c9 T: f8 z. s) f" G   msleep(10);$ `) P- M2 t' }% N; f% L
  7 i! b8 ], ^, t( g6 c' S8 O" |& L
  /*
9 x. V9 `2 O/ ^9 W. G) F   ioctl(fd,1);   
1 h1 J" f+ v& \! h9 T sleep(1);' _5 [6 [/ f4 C
ioctl(fd,0);! U7 W7 G: ?% j+ W4 E8 ]
sleep(1);
, _) R& s5 T) y) t */ ! K4 r* p  \; S6 U# Z
  }   
' j* _, [: u, D4 h' M# Y3 N- h% v1 s return 0;) k7 Q* E: n. a5 U' k# J7 ^$ h! Y
2 B! L5 o8 D. x9 e. h* V
}
7 ]) v+ r# q# S0 N) P+ j- s6 @4 K# Y& @' n) S* ^
多谢各位指教,谢谢! 急& L) b6 y1 n7 V2 K
/ m  E# k* D* Z: G7 B6 w

+ D; B1 W) p6 @# P1 ?
, Q6 |1 A+ I. P, v/ H8 t1 V; |0 ?4 W7 _8 ^  v
- [7 I! M! `6 q, E0 j$ O( B$ [  w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 01:15 , Processed in 0.049277 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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