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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 D6 j: d5 l- x& x, D9 ?5 x, S/*
1 S/ z: p$ o. ~3 x& g * Copyright (C) 2009 Texas Instruments Inc1 [' |/ N3 Z8 K% u
*
, p! X) C' V. N; ~ * This program is free software; you can redistribute it and/or modify6 N/ V- }% C' S9 l7 ?
* it under the terms of the GNU General Public License as published by
) ^: y: Y$ v: A * the Free Software Foundation; either version 2 of the License, or
6 k$ `" r3 m1 i/ k * (at your option)any later version.
7 b# @& g/ r5 d *  ^8 b6 l/ ^7 Y3 G  W$ L! O
* This program is distributed in the hope that it will be useful,& ^" U- _6 T. T
* but WITHOUT ANY WARRANTY; without even the implied warranty of
$ ~# y$ V- c1 L/ k# u1 u * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 P7 d4 u$ y. ?0 q6 \ * GNU General Public License for more details.1 b1 C( `7 s( f8 I. v" T
*0 r5 I7 a0 ~2 |+ l- F$ c
* You should have received a copy of the GNU General Public License
* q( A: n, F* g5 C4 F * along with this program; if not, write to the Free Software
- O/ C! b* [! m1 \! _; q# ]+ X * Foundati" t: p. I0 Z' I  p% k( g- l
*/( A0 g7 x! X; _; c3 n$ {
#include <linux/module.h>* ~9 d2 l( r1 h' w" O& o. `
#include <linux/init.h>. n2 d* s+ I7 V: Y% J* J7 ?
#include <linux/errno.h>
- h. s# w6 Y$ p#include <linux/types.h>9 f9 S' o; f5 m9 m5 Y  T
#include <linux/interrupt.h>
6 `! n3 w7 t6 i#include <linux/io.h>8 w* ?$ _3 U5 i
#include <linux/sysctl.h>, [; T4 k4 ~/ l# v1 c9 O
#include <linux/mm.h>
( i& `. b# |+ y$ r* x& B#include <linux/delay.h>
/ ?( x4 A9 Q0 K$ m$ @4 k#include<linux/kernel.h>4 M/ ?' c) y1 k! Y2 X% \9 _
#include<linux/fs.h>' I8 Y: R8 j( H. m" I7 r! A2 a0 L
#include<linux/ioctl.h>6 M* M5 H" G3 ?# v& k
#include<linux/cdev.h>  j6 i0 D6 }# j4 C2 m+ R- m
#include<linux/kdev_t.h>
6 a8 B  u* `, U# x# n& k#include<linux/gpio.h>
$ w) c/ z& }$ n! C# k#include <mach/hardware.h>
4 Y8 b$ n6 I3 k+ C# c  K* Y$ D) ~#include <mach/irqs.h>
1 v$ r2 X0 u) @/ z7 G8 E3 U6 q- }* T+ X! @* E1 w, R
#include <asm/mach-types.h>1 ~5 O! i8 j+ }, p9 u' t
#include <asm/mach/arch.h>
/ x0 W" X' i) D" z#include <mach/da8xx.h>
3 s3 n  R8 u; c& b/ h6 o" e" R#define  SYSCFG_BASE   0x01c14000
! ]. s* K# U. \5 P) I#define  PINMUX1_OFFSET   0x124
, Y- A  s  I3 q+ O" ^! a$ j1 Z#define  PINMUX18_OFFSET  0x168 # Y+ y* P* t5 ?+ m
#define  PINMUX19_OFFSET  0x16c
  v) f5 p- Z  j% z7 }) o- q4 X#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR; U: D* H! w; p3 ?) h/ ]' }" C0 I; z, d
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR: b1 j' f3 B# p( w" B
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR' i. \* Q% q2 U( e3 K3 M
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
: ^- \4 R2 i9 `/ W3 j& q3 t0 M7 z8 T#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
+ I8 T3 c% D9 ]6 n' H, @                            ' E( O5 ]% A$ ^5 ^3 r
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
  ^' s0 @& U; H& u#define DRR_ADDR      0x01D11000  //MCBSP1_DRR3 E4 ]' [  ^6 p; o1 h: L$ t( d
//PSC8 L/ I3 N, J( k" |9 O- c
#define  PTCMD_ADDR   0x01E27120  
" x5 U0 R4 c3 w0 J/ M3 y& U( V1 K#define  MDCTL15_ADDR 0x01E27A3C
% u! _6 ?4 I' }7 q6 T5 |" u  j#define  PDCTL1_ADDR  0x01E27304! N7 v! ?# K1 t
//GPIO8 direction
1 M; S# B0 L' h2 K9 ~% k#define GPIO8_DIRECT  0x01E260B0
8 y9 n2 e. [# q' V) x#define GPIO8_OUT     0x01E260B4; Z- d. X5 \) h: y  ]/ n, M* H% w& v# r
#define GPIO8_IN     0x01E260C0
/ n2 ?! p) d9 C# {2 j9 u7 j: d7 G- x; J. [) x6 I  {# t
//#define MCBSP1_RINT    99              
% u! N9 u+ ?- V* ~5 \! U6 b. B//#define MCBSP1_XINT    100  
& A* H. \5 U* m4 gstatic int MCBSP_MAJOR=239;# u& ]' l5 f# t1 ]8 X& g9 H. p) D
static int MCBSP_MINOR=0;6 A$ i% s( g$ P+ u' W
static int count =1;" e  J2 R# |5 ~- t

' h2 f9 J+ @0 P1 P% O4 E& [. C  _#define MCBSP_NAME  "MCBSP-device"
. \! N3 i! d, P
' t7 R& f. @4 C( `% O( z2 Estatic struct cdev *mcbsp_cdev;9 F3 `6 g$ p% e1 A% O$ T' i
static struct class *mcbsp_class;3 ^3 W" T. u* p6 I" [
static dev_t mcbsp_dev;
0 n& l9 o+ T+ hunsigned int DRR_data;+ l! n1 S0 ~, [2 h& L
unsigned int DXR_data;. Z- M+ a" y/ s* m
static int mcbsp_open(struct inode *inode,struct file *file)6 `; g3 G% V- h3 V
{
9 o# @" {" ]3 r" H   
6 m5 z! c$ b4 @5 }- ~   //interrupt enable,initialized3 K/ h8 m/ ?' g9 j: U8 O8 n
   unsigned int temp;1 g4 I/ w0 s+ L/ x) o# o5 n6 w( ]+ I% e
   //SLEEP_EN(GPIO8[10])---0% F/ U' M3 ~/ K- n
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ o) P* T7 M5 h5 ^% g3 g9 q6 o   temp=temp&(~0x00000400);
# l" j. r0 v& e* R% x8 z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]* _6 x* ]7 U$ l: @1 t- |3 G
  //RESETn(GPIO8[8])----0----13 n+ o& @, u$ Q; E7 s, }' T) A. x
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( s4 k+ e3 N/ `5 s' o8 B& ?$ Q) [
   temp=temp&(~0x00000100);
! Y. M& ^( x9 e8 A' ~   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. E9 W3 `! H# l. o
   udelay(100);
! [( ]7 E, `6 b, t+ Q   temp=temp| 0x00000100;0 j, e/ g& Z' O: t/ A$ X% p, c
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 W. S) X1 T# |) d6 U' o& B: Q
   udelay(100);
! H6 M! M$ K8 F( s/ V   printk("open success!\n");
- A9 u; ?% W) K0 L$ f8 o2 S   return 0;
& T, }5 ]6 C: X8 |& ^$ L3 k+ i6 ]}7 R' M0 F4 [. g

. Z/ z3 z' O+ ?0 D* ^static int mcbsp_release(struct inode *inode,struct file *file)0 n  g& r8 E3 k5 K
{7 i; d: E0 s8 u( i' Y9 l, R
   printk("release success!\n");
* k; e# G+ ]+ }8 o7 c! S9 E; R# ]   return 0;
7 ]7 X0 W3 @  D1 S) k}4 X6 m$ n) [! E. O

  d2 N4 M1 }% p' j4 u1 t( Hstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)7 R  j- L, G3 h% h6 _& [0 [8 B0 A
{
4 Q, c" h  I3 P, W    copy_from_user(&DXR_data,buf,len);4 V( ?- ]+ l1 ^8 }
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' D  V5 T+ c9 |- D9 O. J
    return 0;
. M" S: n! o) }4 e" n, t( V : c6 z8 d" w% v/ r
}
* Y! ]1 i& g- q1 Y8 V! S1 g' L0 U
% h2 Q3 i% u, p; T6 `/ gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, m& r6 u7 q5 I$ ~{ / Q: l( N5 a. l0 x' Y' e
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" s$ B% C& l0 m5 K% {, U
   copy_to_user(buf,&DRR_data,len);
! Y0 e% h/ }- f4 r( G3 }   return 0;
. p" Q& T5 D3 X5 G}
7 P) Y* R6 x3 S8 Y, X
. p% h& x! I4 U
! E- H0 E  H4 Vstatic struct  file_operations mcbsp_fops=6 g& }1 B5 f. p
{) I6 b* p/ q+ y
   .owner=THIS_MODULE,6 M4 C* I) E, r, M" S9 q8 X& f  E- B
   .open=mcbsp_open,, B2 s, g5 T: E5 u  k/ t, J& A
   .release=mcbsp_release,- b' y/ Z% _/ ~
   .write=mcbsp_write,
& `0 w7 N4 j- C( T5 x5 A0 {   .read=mcbsp_read,
1 w3 t& u' p" D; T% e};2 }& L. @$ B5 T6 N5 {
static int __init MCBSP_init(void)0 P, m2 @; V( u; @4 |
{' a) r2 ^" V" |3 \: `) Z+ D% ?' R
   int ret;
6 I$ \: b, ^: U; ?: H# x2 z8 v   unsigned  int   PINMUX1_REG_old;' l& D- o3 a  o. I6 w; }. @
   unsigned  int   PINMUX18_REG_old;' Z$ R" x1 o* `7 b2 d8 ?" A0 ?
   unsigned  int   PINMUX19_REG_old;& ]3 ?8 x9 F7 J0 S1 S$ `1 l8 [
   unsigned  int   temp;  0 S' B4 P' {; f/ m; o& Y3 d" F
   if(MCBSP_MAJOR)
) _- q' {' P& G9 z; |( [   {
5 h0 C9 D! X& r, N  L      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 B! P( D8 ~& d% o      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);3 P& c( ]8 W3 V% J
   }& N( w% u. D/ S$ d- u& o
   else0 ~- K; B; S- a* Q% n$ }' O
   {
* p9 ^2 z- I! Z4 f& H( ~7 r# u      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 Q: K+ d0 U8 l/ H/ L# Z0 C      MCBSP_MAJOR=MAJOR(mcbsp_dev);6 t  l5 S% X1 ~4 E3 l* w
   }
, h, y2 W- k7 ^( b  k& q+ v   
5 ?! ~+ C2 B0 B2 `9 u+ n% V   if(ret<0)
  n! G' F* j" z1 _$ V" C4 c) g   {
/ V3 v" b: B0 @+ m      printk(KERN_ERR "register chrdev fail!");
7 W9 D9 V2 s5 h: U! s( W1 v      return -1;
* R4 o- q! o& A3 S) N   }
  U( g0 H! _6 \5 I& z- l. Y. M1 H   
; }8 f: z1 _- C7 n) o: c   mcbsp_cdev=cdev_alloc();" `, G0 O6 G. J6 N) o; v. a* m
   
- X* J" K5 t" |- N( g' I1 ]   if(mcbsp_cdev!=NULL)2 D; k( J2 ~$ x8 B5 J
   {' m# t, D5 k2 u5 N  e% z
      cdev_init(mcbsp_cdev,&mcbsp_fops);& }3 g3 I1 ?7 `( I6 Z. k5 l
      mcbsp_cdev->ops=&mcbsp_fops;
  `7 O- u/ P2 z4 d; ]      mcbsp_cdev->owner=THIS_MODULE;( E% `" V5 H# j' C
      8 q- A! J  W7 i, ?' f, q
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- C9 X: f5 C+ B/ @          printk(KERN_ERR "register cdev fail!");/ x% \/ \- i& _2 p! m& z
      else4 j9 A& \! q+ F" _, Z* K' K
          printk(KERN_ERR "register success!\n");. `$ t5 ]0 `3 {/ s0 W4 ?: w( W3 |
   }
2 u/ ?7 P* {; V" x   else# {! H& d' _$ L, I9 S* D1 T; b: _. W
   {5 Y1 \0 ~' c5 w- ]8 Y' ]/ F
      printk(KERN_ERR "register cdev err!");
( F) `' _! v: D/ g. F      return -1;
: F5 R* `! V5 Y$ H) B   }% x" F+ H2 q! z' B
   6 h0 F2 ^' K1 k. }" V7 z
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 v( D& H' P9 ]8 x$ a  }. f: ]
   if(IS_ERR(mcbsp_class))
2 a+ b8 A" Y6 R6 A. c   {  Z7 O, {1 |/ @1 A
      printk(KERN_ERR "register class err!");
4 F7 d' k1 c7 J  K% C   return -1;$ w$ |, e+ B& B" ?' ]
   }( N, P7 u5 M# t
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 S8 S6 n. D1 k
, D: Y9 x$ M" }, e
   //PSC
- ~8 I* B. ^( S/ T2 O: s; ~6 n1 r3 F. W   //add Enable MCBSP
( {& W" i) ~+ Z0 C   //test' B& U" r4 A$ }; Q, ?
   temp = 0x80000003;
5 a9 F0 c5 |* O! X   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- r% U$ @: R3 e
   temp = 0x00000003;
) V0 D4 z) ?, w! g6 x9 c# i4 M   writel(temp, IO_ADDRESS(PTCMD_ADDR));- s/ \+ X' E6 d7 t! N! `
- a0 ~( q# h) x; G7 o4 [# B6 s
   temp = 0x001FF201;  _6 \8 m& F, j
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
* i6 j0 `# H. Y- @; m   
2 L" l( y  n1 C: K   //PINMUX  
' i0 Q2 \; T) K% L. N   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) f9 ]# [2 W5 H   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
/ z; ?4 I( ]; S" v  s4 F8 }, h) B# M7 u   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   ( C$ g' }$ m$ _3 ]. ?
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);; R! \  ~# O2 A
   
1 X; G7 _, O9 k/ c$ @: z   //SLEEP_EN,EPR,L138_SHK1,L138_RC" a0 D1 ~9 q8 A0 G. l8 t7 H0 J
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  % N, Y4 O; F" b+ Q5 i) f
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ( y/ H8 o7 Z: |# f( w* z: f- g
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 d& ^* O; k2 d% `& W, v3 H. p
1 p5 X  I, ^1 w- ~   //RESETn,L138_SHK2
) K7 V6 h$ X9 `, S/ d1 r   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 X- i5 N' ?7 z5 n& w0 n" ?: m
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
- y% E9 ^# z2 f   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);0 c" l& O% _) T
1 z8 V# L7 L3 x
# D- T# @, U/ D* n" G
  //SPCR Register
+ n- X1 h, t" ^  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
  K8 t# I) D0 A  temp = 0x03000000;//(DLB=0), D; M! Z! O# O; Q
// temp = 0x03008000;//(DLB=1)
1 t- i# t7 e+ p' g! x4 O3 s  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset/ z, E3 `( ^- I4 ?3 U
  temp = readl(IO_ADDRESS(SPCR_ADDR));- e; d0 K" i6 f* u: Z: |
  printk("temp=%x\n",temp);
! a2 o  k; T3 K & l0 t! A2 e' D1 c2 l- d+ i
   //PCR Register8 V0 z$ q; E/ X* c9 O
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
9 ~* X& }, ?% n+ n7 Z  // temp = 0x00000F0F;
- l4 O- d% k& N- F  temp = 0x00000B0F;; y" h5 M) @! X- f' t
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized   m5 a: i- |5 T" t* x' b/ x
  temp = readl(IO_ADDRESS(PCR_ADDR));
) U7 }4 e0 q" m, z  printk("temp=%x\n",temp);  
) H) w% F4 |# S" ]- H) d2 ?! V4 m   //SRGR Register/ d6 c. O9 f& a- c+ _; v
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 f0 }6 {! R5 q  E) `, T# D9 r# b //temp = 0x301F000B;
$ f% y7 F' n  p   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
* T, ~" C8 L$ u, _  temp = readl(IO_ADDRESS(SRGR_ADDR));
4 @' o, V1 i$ H$ {* e! V, a  printk("temp=%x\n",temp);
% Q( g( B& Z2 w7 w   //RCR
6 I% |. J! Y  W$ i0 k" R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 V* L5 c" O0 e   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 F3 L' s( N, ]- N2 c" j
   temp = 0x00440040;
( D& O5 K$ F# U8 M   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   6 _( m7 k/ @  h4 s$ r8 \& U. j2 k
   temp = readl(IO_ADDRESS(RCR_ADDR));
: Z6 Z+ ]3 \" m+ \& H( }' [   printk("temp=%x\n",temp);& I! L: E8 j9 D' j+ p
   //XCR  i, y% c& }( L- Y0 f; R3 `; e
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( F* E- u4 q* M4 `' M
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% j. d- E# T( `; Z3 w' ~7 E   temp = 0x00440040;' R  g; [% `5 s8 p1 ~
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
  K& ~$ l# H7 b* o   temp = readl(IO_ADDRESS(XCR_ADDR));- r7 L' C( U; p& H3 g/ ]) Q
   printk("temp=%x\n",temp);
* m" R  z  S: D4 A  udelay(100);$ j1 L: u; e9 h4 y; U4 G
  //SPCR Register
0 C( X6 e* b. }) {* _  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 o% t+ {5 u4 y5 x$ o  temp = 0x03C10001;   //DLB = 0 VS DLB = 1) D1 y1 B- b9 `3 _, c! p
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
3 Y: P! f; n# \; r+ U  temp = readl(IO_ADDRESS(SPCR_ADDR));
' _# v" B( B( G# X! }# ^  printk("temp=%x\n",temp);2 ?$ [$ w  k( [- \4 B9 \: Q
  udelay(100);
4 F) C1 T* P* n0 T; J' O; `$ q% S4 @
  //set GPIO direction
4 D9 i- |; \5 Y& u   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));: A( g' b$ l' S
   temp = temp | 0x00000100;//EPR----input
9 ], O# v4 Z" n7 R, m) X3 I! q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! y6 q& P- Q6 w9 C0 Z
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( Z( H8 v+ y  |% `* Z! p ! m1 ]) l( D. K7 O6 q
   return 0;
' q# w! G0 S4 j# `) N8 J0 z) ]}- h3 y& u; e( q: F: {( O. X9 A8 r
static void __exit MCBSP_exit(void)) y5 O) |  x$ O
{
- e" D" Y) E  u* s# H/ X   printk("mcbsp chrdev exit!\n");  Q) q" ?4 w+ T7 _0 n. l4 h
   cdev_del(mcbsp_cdev);
7 q& |9 U" J4 l% Y5 n9 D6 @# R   unregister_chrdev_region(mcbsp_dev,count);. P( J7 M* P) h6 q; ]/ E: S5 A/ |
   device_destroy(mcbsp_class,mcbsp_dev);
2 ~, h* N6 j( U/ a2 L   class_destroy(mcbsp_class);
' v9 T: ]" U( H; {" T}
" X. d- [4 |7 p: b8 c( Mmodule_init(MCBSP_init);7 Q+ w! ~) X+ c( |3 j
module_exit(MCBSP_exit);
1 N+ j* z+ i# N* f" J" k* {9 F6 `% K* t5 t* Z
MODULE_LICENSE("GPL");
- c. `6 n2 ]- _$ m6 H6 `. }4 _5 b. e0 a- Y+ H7 Y0 x/ n1 ]
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, y0 a+ k( [5 Y2 a* L5 I6 T9 t我的应用层的测试程序如下
9 e7 |6 ]0 T5 N3 P#include <stdio.h>
& V' \: p+ d* c- m0 r#include <string.h>
7 g+ L5 }" o* A% Q: z6 p/ W3 c#include <fcntl.h>( c$ O( J, {1 |& {0 F0 B+ J
#include <unistd.h>
7 C! d: \2 z5 F7 a! l. z& ~! e#include <signal.h>0 n7 C, H$ y2 M2 h# R
#include <pthread.h>       //线程
6 y4 g1 j! y' a' }9 c; d9 f#include <stdlib.h>
1 X$ L6 e! O3 i& i, F#include <pcap.h>          //捕获网口数据* ]$ b1 ?: B' F/ H# X
#include <semaphore.h>     //信号" s0 a) g+ @4 `- i
#include <sys/types.h>     //消息对列
2 T3 v* }$ Z# D2 W#include <sys/ipc.h>       //消息队列8 r  M, W; w  }* V' j1 N
#include <sys/msg.h>       //消息队列6 e* C0 s; U& a+ `9 t  f
#include <sys/select.h>
! k) `$ W" j  m9 g  g#include <sys/syscall.h>
7 M2 m8 q; D- g  E! i2 S#include <sys/stat.h>
8 u/ U1 m/ m. e! s0 X9 j#include <sys/mman.h>
* w9 P' O" o  y" x#define msleep(x) usleep(1000*x)
! P! \+ ]$ |$ w" K- o+ X5 |- }% S, n1 N& r
int main()# |( C  j4 a  \  s% @  W0 ^
{ 5 t" g$ v9 c, i6 i' q; N# v
    //MCBSP,ARM与AMBE2000交互设备: a" p" Q0 p, T) X0 f
int fd;) @0 r0 z( n4 P; k/ r! [1 {( b0 R
unsigned short data_write = 0x5555;+ B8 S  x# e/ n3 @  u& _% X, R8 d
unsigned short data_read = 0x00;
8 \( L, b. k4 S) F( \. z& {  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 K$ W# D! o. @; x: J1 i/ f //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 u) Z& s6 m) b& H! E% O    7 `! w! X, R3 i% E1 E6 U; |+ C, P0 _. R+ S
  if(fd < 0)
7 e1 I+ R5 b( y/ i  {
5 A# I% S1 v0 m+ u" B! R     perror("open failed\n");. c* g# U( d7 U1 P0 |5 v* X
     return -1;
: U3 x+ x4 M/ Q: g, V$ ^  }: T: o4 t5 E* |3 o" p: }7 Z
  
" B3 g/ N  W& l; N! a' x- F* v2 `  while(1)* {) ?4 T  b& x6 i' p
  {
3 A% k+ T" J* w* _! I8 J! }% h   
4 z" J; F) ~0 J7 r   //AMBE2000每次读写是24个字为一帧
6 h9 Y2 s1 i8 K5 @8 j   //写数据时将数据在底层存储起来,等到中断的时候再发送
3 O2 _5 Q( v1 M/ O   //AMBE2000输入数据是以0x13EC开头的2 a. v) r3 w# P% I5 _, }3 e/ G
   write(fd,&data_write,sizeof(unsigned short));
0 `  A$ t7 D% ~' v   & g1 I. `, e0 K8 F
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
* v! _/ @; {( e( J% [9 \   read(fd,&data_read,sizeof(unsigned short));0 o/ y6 B! h( I$ t. s, q
   " `* o! M, g! H9 \3 J
   if(data_read == 0x13Ec)
4 V1 L$ }# R6 P7 I2 h1 U" Q   {8 i  c1 C; m  I: r8 M1 x
   ) Z; e+ X6 [* Z& M
    printf("data_read = %x\n",data_read);
* v1 a4 k: [! |   }* ~; q/ K& V1 W3 H
   
  z% O& T! Y- e  h. I1 f   msleep(10);: Q+ n( s' U, J- G+ u1 g) ^
  
+ C3 V- T; Q6 }2 d: M# H" q$ U  /*# h9 J+ f! P" h
   ioctl(fd,1);   . p/ ^- x6 y2 T7 E: A4 q8 k0 j9 w7 ~
sleep(1);
9 x( M" V. z. y* I% m ioctl(fd,0);
, i4 [1 s6 j" G# U: Q/ z, R sleep(1);  S- q0 T1 e3 Z( A; L! F
*/
2 G' O' B' i' c; d+ {$ n, ~  G  }   
5 y" A  _% W2 @9 |: Z! \ return 0;
$ T& h: Q9 q# o* u9 H3 z
- f" H2 j' r2 e2 [' o2 k}# z! H/ A# \  r; D# T

- z8 c2 q4 t4 y0 X3 @6 ?5 y( n多谢各位指教,谢谢! 急
8 s' }4 k" s* P  [9 C, @8 N6 x2 U: {

6 x% _% T. i9 ^3 ]) [1 V* V) h, F! n( ^2 @
5 E. j# @4 H4 K1 t% z0 p0 |0 `2 j
8 A! Q" v7 V  h+ G( q. j1 Y! k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 06:59 , Processed in 0.050235 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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