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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 G0 c/ q$ h: V$ @$ w6 y
/*) v0 {4 [) |! g* ^% R4 w: f" ]  y
* Copyright (C) 2009 Texas Instruments Inc' I2 Y% K2 ^' B( ^5 s
*
5 u. X& c* l2 G * This program is free software; you can redistribute it and/or modify
8 I5 e  L: Z2 P$ I3 A * it under the terms of the GNU General Public License as published by
2 s- a1 q% A9 F1 @3 Q6 D  W# t1 e * the Free Software Foundation; either version 2 of the License, or! ]+ k/ O% f1 \$ ]0 ^1 w( o
* (at your option)any later version.
4 A# l' N, [" a3 q: S5 j *
. \0 `/ @$ m, n1 N9 T' R * This program is distributed in the hope that it will be useful,$ @% q% X6 B+ M% X/ g* k
* but WITHOUT ANY WARRANTY; without even the implied warranty of# y4 e8 U" L6 Z9 t; n: i/ i3 @
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 m4 x9 O( U2 S) r9 s! C
* GNU General Public License for more details.
* l) L- ~$ x3 F *
0 ]0 `+ w  J" K' y7 E* X1 l * You should have received a copy of the GNU General Public License) V  c" |1 A% P
* along with this program; if not, write to the Free Software, @$ |. }4 Y* n0 r* ~8 K  n
* Foundati
* ~3 d. r9 [. O8 l*/
3 o3 {) i; E7 s2 E: ~! t$ ?" ]#include <linux/module.h>
$ F6 H9 s  L' O) c4 O#include <linux/init.h>; G# X8 b: z' T
#include <linux/errno.h>& s# p7 k3 c' `  O9 L
#include <linux/types.h>6 ]2 j! v; u, s9 l7 i; F% X
#include <linux/interrupt.h>
3 w! o; @2 u2 }#include <linux/io.h>/ ^: d4 F$ r  P: G9 t7 ^
#include <linux/sysctl.h>
( u" I2 g+ ?  t, v& I$ x8 X#include <linux/mm.h>) w" c. K- G, j# |6 \5 N
#include <linux/delay.h>1 e, }, I; Y  a/ v5 k$ j
#include<linux/kernel.h>. Y8 e( u: n3 p
#include<linux/fs.h>3 m9 T9 k# a0 [/ u3 d2 @
#include<linux/ioctl.h>
1 v+ X) I0 q/ A1 u; @3 I0 \3 i! f#include<linux/cdev.h>3 h) Z- H7 |" Q3 b7 u! K1 G3 T5 _
#include<linux/kdev_t.h>9 Q3 S2 p' m* m  _2 g: h! }
#include<linux/gpio.h>- O4 D# h8 y/ u( S& Z4 F) @
#include <mach/hardware.h>
8 \; c( i  N9 T. q6 d) r6 U#include <mach/irqs.h>) \5 m$ N8 }6 g! w( |
, R8 o! a9 K* W1 K8 {. h' a: M
#include <asm/mach-types.h>
0 x( _% l) K8 X% k( K#include <asm/mach/arch.h>: Z) m. u+ O6 E0 A& z
#include <mach/da8xx.h>/ A2 [3 d5 a$ k8 B
#define  SYSCFG_BASE   0x01c14000
3 h, T  l5 N' K; u#define  PINMUX1_OFFSET   0x124 + V) b& t6 L  f, M2 y& M
#define  PINMUX18_OFFSET  0x168
  Z" Y% u3 ]* S/ J4 A# J: r5 W4 J) I$ R#define  PINMUX19_OFFSET  0x16c
. \- f+ ^6 x& H- Z: j#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR. `6 J# B3 o8 x* ?3 \. R( m
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR" H" k! c0 }' i# ~5 {
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
3 b" j# S$ L0 B8 M3 s8 b8 Z4 M6 C#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR% |1 A" J2 {! J/ X0 E( O
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
/ _. V+ V) M% ]$ Z: Q, ]4 m% \) k                            - S# H, [* q# u0 a
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR  K8 P) ~  \+ y% k
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR: `5 D$ ^* N4 a
//PSC
+ l4 r, {5 P+ @) w0 W6 U# j% H#define  PTCMD_ADDR   0x01E27120  * Z, z2 ^" g$ ]* m! w! {# Z+ A; p
#define  MDCTL15_ADDR 0x01E27A3C0 r- Z7 k2 }) u2 A
#define  PDCTL1_ADDR  0x01E27304
0 O( j# ~$ e. X) m//GPIO8 direction4 v' m7 r$ @0 h5 A% F* o# b
#define GPIO8_DIRECT  0x01E260B0& K$ r% c2 F6 f/ u0 u. Q1 V
#define GPIO8_OUT     0x01E260B4  A# @2 X0 M9 p$ p& k* S5 Y
#define GPIO8_IN     0x01E260C06 c. _1 ~. E: A6 ~1 E9 h

: x% U( g+ y  E8 K, ^: |; g//#define MCBSP1_RINT    99              ' J6 M" c* S, {3 A6 ?' c3 l
//#define MCBSP1_XINT    100  
' }' {1 G: F7 _9 Zstatic int MCBSP_MAJOR=239;
1 w  D" y$ w1 d. M/ S; M4 [* i9 ustatic int MCBSP_MINOR=0;; B+ a( g) C% N3 i" C7 d
static int count =1;" f) e3 l' D( J% y1 M3 b; V

# ]: I- |: ]9 E5 X) q#define MCBSP_NAME  "MCBSP-device"  c$ y& v$ C" a; e* B
: I, e  {2 w) k& K8 e
static struct cdev *mcbsp_cdev;
: r9 D; K0 p2 E5 \& }& bstatic struct class *mcbsp_class;$ A5 C2 B, i3 i' _7 Q; s. i
static dev_t mcbsp_dev;* p% g1 [, w: n7 ^/ b4 m
unsigned int DRR_data;
/ r' v1 F2 L+ _& dunsigned int DXR_data;  _  g- K" J5 N. d2 G5 U1 J& M9 G
static int mcbsp_open(struct inode *inode,struct file *file)
) k" |  X9 P  ]3 h1 g- Y# w5 h{- i. q: \% b1 u5 c5 D$ }
   9 t+ G" B" b+ T+ M, e" H8 U
   //interrupt enable,initialized0 k2 a3 ?* r& W% y! c: u
   unsigned int temp;
0 l/ f: H( a# h+ y   //SLEEP_EN(GPIO8[10])---0
) t, `) f7 \; i  M   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* T" {$ f6 `# O3 v   temp=temp&(~0x00000400);4 }$ n& y; G1 E. ^/ d( G
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 {! V+ Y) L9 x6 i
  //RESETn(GPIO8[8])----0----1
/ ]& |# D* @  v! W5 i   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- [  ?  M" X9 S2 p  w
   temp=temp&(~0x00000100);8 f  E- N6 i( f8 G* q
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 r% o, U" p: U' q- {0 m
   udelay(100);
0 k- z, X" @' F   temp=temp| 0x00000100;* p: M4 B4 d: E' p
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 X& D" L% U. {5 c   udelay(100);
5 c% g* i  P' W' J   printk("open success!\n");) H" c& X1 ^; P0 w& t  v  S
   return 0;
: v! [. ]# b1 c: W8 @8 c4 |}% @, h& y3 P6 A
# g; B5 W8 Y' Q6 V- n8 G# P
static int mcbsp_release(struct inode *inode,struct file *file)
$ n( o  F* e. ?) c{
/ Y! n  M9 q4 n   printk("release success!\n");1 k/ `/ x7 y5 Q$ R2 j
   return 0;- f) Q( g0 Q2 k+ U9 Z
}3 t7 B+ ^+ \2 P+ M! d* l9 t

# J# |( c+ F/ v) qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
+ `$ |2 u: b5 h{
6 Z; T9 M: ?, K6 n  t# J    copy_from_user(&DXR_data,buf,len);2 d# E" F3 E5 ^, s& k
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
/ n$ q  i$ O# G, [    return 0;- Y: j: X" j# F: ^

2 u) D# O) Z  L! _, I* }}
5 {) D1 L: x$ Z& m  w- {# \; d& E+ A# L" G3 d
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 o) r8 I" u! p: C0 i  D% N& \/ k{ 3 o, B# Z5 y3 g2 s2 S2 E
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 c% \+ P. [& B7 D: K5 \
   copy_to_user(buf,&DRR_data,len);
3 c  J; v% P9 l3 z+ w. y$ B   return 0;
% N4 J' }* [4 s. C& }% J# g* ~}$ t& I! V  N" r8 \" {" }& l
2 p* x# Q3 O" i; c

5 c+ g) i+ u) _, i2 D& T, F# |static struct  file_operations mcbsp_fops=3 [+ {. }: @' m: N- d- `5 V
{
; a" d2 J  f# N8 S$ g( Q0 X/ |   .owner=THIS_MODULE,
8 E9 {( ]; Z4 U$ F2 r! L# f   .open=mcbsp_open,
6 o- C: r: h! E. b4 F. J. s   .release=mcbsp_release,1 `' |. C+ j( h( O2 u
   .write=mcbsp_write,
) r3 i3 c% V% v   .read=mcbsp_read,
# }2 R9 G& ^4 n9 T3 V; y) q};
; A9 L6 {) y! G, L! P6 zstatic int __init MCBSP_init(void)
( F6 S- {) t; h3 v2 X! K0 b" j{" o# I* j* d1 w+ ^5 O) Y
   int ret;6 E! |" Y# }. R" g- z/ R
   unsigned  int   PINMUX1_REG_old;5 A! f9 o0 f: _* h& W1 r
   unsigned  int   PINMUX18_REG_old;+ s6 t$ S1 ]2 o( F5 \
   unsigned  int   PINMUX19_REG_old;
2 k7 G* n& p. E4 c- @/ v   unsigned  int   temp;  
  C0 b: i( `; B6 c   if(MCBSP_MAJOR)
0 L# z  m7 m" j6 I0 q. h# T/ k   {$ p, I2 v) F; `' Y& C
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 T) d/ j( q4 d( B, s: M5 ~8 a# n( {7 d
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, s- q# f+ L7 |- P+ K8 A
   }; o  c8 J1 L1 k& v' k9 R
   else3 C0 Q9 Q& `5 \; ]4 r0 O& c
   {8 }; n# w5 S8 d$ A! |
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% N4 t5 O5 N3 |# l8 x      MCBSP_MAJOR=MAJOR(mcbsp_dev);: K- _) m0 ?/ D. J0 F5 c
   }
6 r: y6 N$ h. T( b) V" M   
  S1 [# w; p4 ~4 A) h& R' b* w3 Q4 q   if(ret<0)* Z9 ~# t  ~, q8 e3 H+ J, _4 s% y! N
   {
; {; y6 m9 w0 ^: M* ?7 g1 l; |/ F1 k      printk(KERN_ERR "register chrdev fail!");
$ X" ~; f3 j3 D4 ~      return -1;$ ~. f' x6 i. \$ k( _2 z! Q' M
   }
, m# A+ S: w3 [6 }2 Q5 D   
+ G( c$ ?# `. g" c; a  x   mcbsp_cdev=cdev_alloc();5 H% w4 A0 F6 V0 U4 j
   
! j# y- V* z: I! L   if(mcbsp_cdev!=NULL)
; s9 J! }5 [  e' d# l4 F& P. S   {
- Q% T4 P" Y7 M. s* R4 R      cdev_init(mcbsp_cdev,&mcbsp_fops);" }5 D9 [& Y. c0 U
      mcbsp_cdev->ops=&mcbsp_fops;
# M& b) }8 G9 I8 u, A  ~5 s      mcbsp_cdev->owner=THIS_MODULE;' R* t. `; |7 W1 R6 Z
      # b: E7 M, |! p2 O
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 l) N& O! K3 t7 Q. w( U# o
          printk(KERN_ERR "register cdev fail!");
$ h; A* B* G& Z* L( ~2 x      else+ a, O8 s8 [) A. z5 a% q
          printk(KERN_ERR "register success!\n");
' ?$ I% q$ ?) E& k6 o   }9 w& ~7 }/ t! V( L* I4 S
   else* t5 Z) l: y, }4 b
   {
' u  P! y# G3 _9 r. S      printk(KERN_ERR "register cdev err!");, a/ L. W$ e# a* e
      return -1;3 |1 L( ^: o: R, z3 q
   }0 n5 {7 z+ Y# ~( M: w
   $ ^# F, }! D7 }, r  _9 h" n) c, d6 t
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 d  w, B1 p) r2 `   if(IS_ERR(mcbsp_class)): x! k7 N8 r+ s4 B2 r/ b6 d+ m0 j) o: ?
   {. A0 z# L( i* r: Q# @5 H
      printk(KERN_ERR "register class err!");
4 x, i+ ^$ f3 ]* S+ n5 X* v   return -1;7 [# D( }( H$ ?3 G
   }
+ u6 b+ x( w: M6 c. g   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' Z8 |2 e$ d8 C2 b# F: F& Q- G! Z
# s) |7 T$ X! ^5 s: P   //PSC
# h% s( g1 T8 g   //add Enable MCBSP1 W8 B( M) B" L8 x/ a" l8 {  g# y: R. j
   //test
4 q3 S. k$ L/ \5 H! J   temp = 0x80000003;# e9 k, ?( T2 O
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));& Q9 S$ i4 p8 g' W; L% C1 F
   temp = 0x00000003;
) T3 l. x: A0 w! A1 x6 c   writel(temp, IO_ADDRESS(PTCMD_ADDR));' V3 ]3 D) P. r7 i4 T+ Z

* K, ?& ~6 D2 q   temp = 0x001FF201;, F3 {2 E7 i" N
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 M- }& y' [: [- W
   2 J7 O- g8 l$ z" y2 G! t% N
   //PINMUX  
8 |/ }4 e# p# @+ O. J& W   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; z0 F- J" i. `1 H
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  2 ~( v5 x- w9 D6 ]2 N
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   9 E% d/ [2 m" ^' t
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* D1 m+ n8 `3 k* v5 E* }* `8 j
   3 ]; ^. Y( h% e
   //SLEEP_EN,EPR,L138_SHK1,L138_RC  O: L% t: J. p* `
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
" S) I8 o2 ~, j$ O. V: R1 r   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   1 j. l; ?; q  N8 h- T, ^5 G
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);* i  [+ M- _, [7 o% [8 P" N# r
9 Q0 o! P. Z. K, W: f) y6 c
   //RESETn,L138_SHK2
3 M* {. m$ h8 I0 Z   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
9 z; f+ U  {( T0 y  Z   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
( u, f- @0 F- _4 c4 ~& n   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" X/ I3 m3 D2 S) h; b7 o5 F
+ S( G5 t' b* ], p

  r! v; F/ q3 u* w- W7 c  //SPCR Register6 B1 G+ Q" K% Y; H/ P: S- g% W& ~
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! G# K5 m$ L( A6 S
  temp = 0x03000000;//(DLB=0)$ S. o( j1 D* }# s6 i. ?* I
// temp = 0x03008000;//(DLB=1)
" r' M% E# u1 g0 L* r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# n/ j4 n9 F2 l
  temp = readl(IO_ADDRESS(SPCR_ADDR));
; b5 S; a  m, F2 s) L5 \% w6 T  printk("temp=%x\n",temp);
. e- [$ ?4 I. @5 Y1 X9 D % h% C: r; B6 R6 q
   //PCR Register1 c  p: p1 M+ x) {! ]: ^% B* F- X
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
9 L+ ^$ _( T: W4 y( h& Y! S  // temp = 0x00000F0F;9 }& m/ y, O. ~) A) i
  temp = 0x00000B0F;
$ P4 X& W7 F, t  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized # f  e) v# i' \4 p( U
  temp = readl(IO_ADDRESS(PCR_ADDR));8 _) S  p7 Q& k5 o( B2 L
  printk("temp=%x\n",temp);  
9 ^! b# C, p9 j" ]. V   //SRGR Register
; Z- K( w8 X% s$ [1 x6 N   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- I- H1 B5 [( [) Z6 D2 @/ _ //temp = 0x301F000B;
$ f# _5 k/ ^9 Q; Q5 \5 e   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 4 n. I$ `' m0 z6 E1 _8 i
  temp = readl(IO_ADDRESS(SRGR_ADDR));
( H2 A4 ^* P9 y- a; G  @1 W; N  printk("temp=%x\n",temp);
+ F2 b8 E9 Q' U0 O5 G, w   //RCR
1 J4 D) U) f+ x7 K$ }   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 n0 l5 a- x/ r6 A
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
4 g6 N& z  m4 e0 o  W   temp = 0x00440040;
/ A& _( [4 I2 a1 ?, c. ~$ o' i   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
7 B5 {5 ]! Q" f- a2 Y' n   temp = readl(IO_ADDRESS(RCR_ADDR));
. _) R  F  f' g7 H8 [   printk("temp=%x\n",temp);1 G, ^4 ]& D2 y# W* d
   //XCR" H/ I7 V- z8 f; l1 t& |+ I  `
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- E9 I8 g, }) P( m. n3 b   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' g0 G; k$ X- k- c9 T   temp = 0x00440040;
! o# `. V, u) A' @, k   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   4 |/ L4 ^7 [4 H5 J: f& t9 ?2 K
   temp = readl(IO_ADDRESS(XCR_ADDR));
; I2 T  C% a. M7 l  p# D, y2 e   printk("temp=%x\n",temp);* \+ D7 ]7 s. ]% l7 n; `
  udelay(100);% R% T  c& R& E& x/ r
  //SPCR Register$ Y  N/ \( q$ l! o/ Q
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 K3 A9 \. [, W8 [  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ d+ x( q; [" w1 o) n* N2 ?
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
2 B- J1 B( o% n3 L/ w5 t2 @" r7 A  temp = readl(IO_ADDRESS(SPCR_ADDR));
# ~* s7 z3 q( D  printk("temp=%x\n",temp);
# `' z+ \8 z, w) b5 z1 q  udelay(100);) l. v8 i0 v, `/ G( R0 Z$ {* t2 }4 n
$ E0 M+ M/ G/ L! t
  //set GPIO direction3 c7 }! y" f6 }0 V  p( p+ V
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" o. }" L' A( w% K; r4 {   temp = temp | 0x00000100;//EPR----input( e, V6 e+ e9 t- B. u5 T, R; ^
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output1 n& Z. |5 R: j: c4 l7 V5 W* m
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % z% n/ |9 _& o" i* L1 N6 O# y
# l- h& k' u8 d) ]9 _( N0 w
   return 0;9 C9 p% ~  @+ x5 f
}$ i$ ~, O9 n% T, ~
static void __exit MCBSP_exit(void)
7 [% @+ S# V7 S# d$ E{
; u. W# ]4 a6 i( u/ t   printk("mcbsp chrdev exit!\n");
( n6 @0 n1 B/ ?, t4 [; o   cdev_del(mcbsp_cdev);& b/ w' t) A' V. u6 w
   unregister_chrdev_region(mcbsp_dev,count);2 X8 [* S. S# l& i# b2 W: M
   device_destroy(mcbsp_class,mcbsp_dev);; y3 \/ a$ U6 G
   class_destroy(mcbsp_class);) v) D9 V- F# Q3 `6 n4 m5 y, W+ o
}: F5 U4 q' y, H9 x
module_init(MCBSP_init);/ e! O( Z$ B1 y" {
module_exit(MCBSP_exit);
% {# |( A+ M% T/ ^7 S1 P3 B- d, Q4 R6 p- c2 ^/ l
MODULE_LICENSE("GPL");
3 n& Z' S5 f! v/ m0 H: F6 x) F
8 g; G3 T* ]. a2 ~. }6 e我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) |' U8 ^9 R. e9 U$ e我的应用层的测试程序如下
: w8 o- k/ I) \- [* X: O# t& G# a2 u+ g#include <stdio.h>
2 p) O* d! y: k4 a#include <string.h>
6 D! `+ r5 K- G( ?3 p#include <fcntl.h>- |2 _5 _7 ~5 K9 q6 R
#include <unistd.h># F1 V* k6 v$ z9 B- C- K8 D
#include <signal.h># r, I" n8 D, b1 j
#include <pthread.h>       //线程+ [* d& O; w# ]% V
#include <stdlib.h>
8 c+ V5 k8 `/ J+ D1 b#include <pcap.h>          //捕获网口数据
' u) L5 X, k# \7 T+ Z2 i' v#include <semaphore.h>     //信号
7 S4 _# ]! G0 e+ m, H8 ^- ^#include <sys/types.h>     //消息对列
7 }# M, {3 w2 `6 s* o! r2 Q#include <sys/ipc.h>       //消息队列$ ?: ~/ t* ^( @; j8 j1 c- g  S5 Q
#include <sys/msg.h>       //消息队列8 V7 E$ Q$ _$ R0 `  B/ c
#include <sys/select.h>! m- }6 E4 G/ Z
#include <sys/syscall.h>
. `9 L* X) [' i/ w' Q- ]#include <sys/stat.h>( V, r, B6 q! k7 a# K/ W; \
#include <sys/mman.h>$ u  O8 L( J) p' m+ _6 o
#define msleep(x) usleep(1000*x)" d" \: o* z  W" ?+ r& c  Y9 m- c) q
& e! z. B" D  N& u
int main()! |! {: M/ o4 ~6 O
{
4 m& J, |% H. ~8 X    //MCBSP,ARM与AMBE2000交互设备- c+ P$ G/ K$ Z, m7 x. `
int fd;& Z  i6 W/ A) V$ _
unsigned short data_write = 0x5555;
4 i7 x9 @# [. [# A) f0 W unsigned short data_read = 0x00;
  v0 ]; Z, s# @: c" M5 d  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 Z) }5 N' A* ]' h# _/ U //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# @: A4 w/ a8 G% [/ T! s0 ^0 _   
. L6 F- K& e: ?5 R  {6 d: T  if(fd < 0)
8 J1 Y& T" n! Y0 o/ C$ b5 V  {' q+ ^9 X' z5 x
     perror("open failed\n");# Q0 g1 R4 A' {& x
     return -1;
2 R5 k$ ?9 m( ~# f9 ^  }$ M' \! T1 a/ Y$ Y
  
4 o0 C* S* N* h9 V/ p  while(1)# u! N6 y, Q" r4 n4 v. Y$ n9 F
  {
. q$ @/ x; z! f: u1 C   . V7 [4 [! v7 {: t8 m- ]
   //AMBE2000每次读写是24个字为一帧! w2 K! l( i% U  A9 m1 G
   //写数据时将数据在底层存储起来,等到中断的时候再发送
+ L* B4 f+ G2 q  u# G   //AMBE2000输入数据是以0x13EC开头的# ]1 K) F& U: g# E- w
   write(fd,&data_write,sizeof(unsigned short));" U1 x. d" J- m3 W- a
   
! a( F: J! m; G* X# N/ Z   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  7 [# b" G* U) x8 n1 u
   read(fd,&data_read,sizeof(unsigned short));
- N# f, o" q! Z  C   
% _7 Q3 K. X" Y5 X- p   if(data_read == 0x13Ec)
, ^: F5 ?; ]% @! y! n( x6 Y! M   {3 H0 _% ], [5 c, y/ h
   9 [4 f' g4 ?$ l$ j6 R
    printf("data_read = %x\n",data_read);! t/ c6 w7 N% s! z
   }
1 v- I- @( q6 F/ X" V" {   
! [: s# m# H- ?+ R+ ]8 Y& X* h   msleep(10);
( K" T5 Y2 _' T+ o  & l, `2 {1 s& u% P7 k8 Q
  /*6 ?8 M. ^4 n' H) h, H
   ioctl(fd,1);   
/ L- }$ a3 T+ w, @( m sleep(1);
' h; X  u, Z8 r( a ioctl(fd,0);
0 V$ S0 b! _# Q( e! T sleep(1);
: P; r6 I$ A) C; g2 u, R+ g+ b */
& n" y: q8 V$ B; c  C  }   
! \' y) T9 B! Z6 z! e2 I return 0;
8 s5 m8 v, c9 T / f7 u* A/ b: J2 E$ s; N9 o& {
}
3 G* R6 T% h8 Y7 A  U$ z9 n$ _4 V& f$ R
多谢各位指教,谢谢! 急
" ?$ f6 D9 f# e, s3 n/ b" q2 j7 }& J( u1 J2 ]- K6 Z
) }4 S( J% i" Z) f. R/ k0 o

/ o4 s3 f( Z5 e1 d. n
- {5 X7 Z4 ?* f4 C3 ~8 B) }) M. }
" [. L' {" \5 l% k. S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 16:26 , Processed in 0.048552 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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