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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & E0 I& B( e, O& B2 C
/*
2 A0 x( H$ c8 D * Copyright (C) 2009 Texas Instruments Inc
7 f  {2 ~* X: E2 b8 K *
$ n& n( m/ h" t/ L  R * This program is free software; you can redistribute it and/or modify) ~# F9 B! C( t* }# f
* it under the terms of the GNU General Public License as published by
% ]) F- L3 l' p% L& z * the Free Software Foundation; either version 2 of the License, or
- I! N# N# p9 w- }' ~5 L, Q * (at your option)any later version.
' u' z" A& \2 u+ }5 b *$ B# d% N, B7 A% f
* This program is distributed in the hope that it will be useful,
8 F' e! W, J* {% a( a3 O' h * but WITHOUT ANY WARRANTY; without even the implied warranty of3 w! Z, g0 D: l' n6 I: R
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 b8 \/ ^4 Q1 N: P * GNU General Public License for more details.
$ k' [8 h; l1 ?# W. D+ }  _+ U *+ P. z4 }, X" x6 P; J, ~$ ~
* You should have received a copy of the GNU General Public License
% u  P- K  G" { * along with this program; if not, write to the Free Software
9 c* u/ v- a, K* t% |3 W * Foundati
4 v& e& I6 L# S3 T*/1 |2 y0 L- W6 c( V( u* W
#include <linux/module.h>
  d" G7 `5 C& l# ]#include <linux/init.h># }  ]: [# G; Q7 T" Z* ]+ ^
#include <linux/errno.h>+ Y+ X' f2 O  Z% B0 U
#include <linux/types.h>
, ]1 s8 J9 O' F# g/ O' g# U  P#include <linux/interrupt.h>( c! N# {% f/ y2 l' ^
#include <linux/io.h>
* K8 Q0 p$ |/ H4 Y$ O& v#include <linux/sysctl.h>, n, s) W/ O) [/ q- K% H
#include <linux/mm.h>
2 v8 `7 J4 s7 R5 q0 \7 R#include <linux/delay.h>
+ y/ R4 N  B* _. k" n9 W#include<linux/kernel.h>: f8 a: V7 h0 `+ h
#include<linux/fs.h>
$ L7 S% g+ R+ x$ g% P$ K6 W#include<linux/ioctl.h>8 ~# k# [+ w# y! H9 w5 u
#include<linux/cdev.h>
; v1 u6 A% U, A( s' O5 E- ?3 v#include<linux/kdev_t.h>
3 ]; x2 y1 o" D$ w/ Q# D#include<linux/gpio.h>
7 l: B' V7 X) s$ N#include <mach/hardware.h>& G7 h' z- h9 [( K6 q
#include <mach/irqs.h>  `0 |& J/ v8 q( O" ]9 ?

# l5 O5 `, q( L% D$ v6 q& {#include <asm/mach-types.h>
" b( _2 {1 {5 X#include <asm/mach/arch.h>7 y  E" G* w2 Q5 {1 Q, p" D
#include <mach/da8xx.h>2 _3 t! E( \+ s$ B
#define  SYSCFG_BASE   0x01c14000
& S) j' z) j) s7 P! j#define  PINMUX1_OFFSET   0x124
2 t4 \8 \7 v, U  Q8 K#define  PINMUX18_OFFSET  0x168
- t" w) ?( z2 j# x* n4 L5 D+ \9 z8 l#define  PINMUX19_OFFSET  0x16c6 t0 U+ F. N' g2 i
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
1 U9 U" S3 `* s- V/ V#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
7 f- T- Q6 [8 ^6 F* [# }: B; O2 H#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR* Y. O; S7 ?+ m! v
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
5 q! j, x. b- n4 `3 c3 j#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; ]) j) b- a/ G' T! M- K. F                           
# |6 i. x% u$ B6 A#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
0 m. E/ I' i/ k#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 a  ~2 p- k$ V( V/ P//PSC7 D. }5 n/ y1 O; S
#define  PTCMD_ADDR   0x01E27120  
' T5 h$ q* N* v) e#define  MDCTL15_ADDR 0x01E27A3C
4 q/ D  p  `6 b: p1 H# B#define  PDCTL1_ADDR  0x01E27304
1 V# t7 L! p% G, t6 V$ S  w//GPIO8 direction
- h( ?' x* u' q4 i2 ~& g) b#define GPIO8_DIRECT  0x01E260B0
& \/ i* Y1 i  b# ~+ V0 [' Y#define GPIO8_OUT     0x01E260B4' L! z/ e- c9 {1 g
#define GPIO8_IN     0x01E260C0
% A0 A# y; `$ Q/ o3 C( p' T- w
$ \5 i. F  n/ t; V% e8 I//#define MCBSP1_RINT    99              7 ?! ?# ^: ?7 e/ d
//#define MCBSP1_XINT    100  . \3 Y9 E! I6 f
static int MCBSP_MAJOR=239;
9 ^" C0 m0 F* p* ustatic int MCBSP_MINOR=0;
0 ~4 d& \$ x( w( x& _static int count =1;" Z& w$ t$ J: ]& t

( h$ B, i3 l+ R2 C  g7 S#define MCBSP_NAME  "MCBSP-device"
/ v) n1 m/ P) |! f+ A! Y& {, }6 k9 E. M" ]# F2 O0 M& {. O
static struct cdev *mcbsp_cdev;
( s; x/ C2 ]9 d- J2 \& Hstatic struct class *mcbsp_class;
5 |  s- T0 E, G: fstatic dev_t mcbsp_dev;; Y; `8 J$ U7 a/ T6 u5 }$ W: i2 d
unsigned int DRR_data;- n3 F8 V) a0 o8 S0 x
unsigned int DXR_data;; e+ I4 m* {7 L) H! r* u
static int mcbsp_open(struct inode *inode,struct file *file)& {* q6 t  o0 ~! \0 T  l$ I
{
, {2 g. F# q$ k) C( M& K$ S  q   ( A5 `  D6 _0 p1 V+ N0 d! p
   //interrupt enable,initialized0 ^: g$ T6 y  g4 _- @' w
   unsigned int temp;
1 N2 \6 ?2 c( n$ O0 Q- D9 b   //SLEEP_EN(GPIO8[10])---0$ }' z. h* m4 `' ?: r
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 A, g4 \# ?5 }$ k  A3 l2 g   temp=temp&(~0x00000400);0 J+ \' A/ l% }0 c" l! E" d
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
+ {0 f. |! ]# N) g. y8 j  //RESETn(GPIO8[8])----0----1
6 Z- Z( P" y& F- C   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
# F' ~+ D; K7 G& |3 n: E   temp=temp&(~0x00000100);
* X* N" j# i% t, w0 [   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
) ~0 {3 c0 x$ D/ N0 A1 O. y   udelay(100);! M" k. z1 {$ P& j& o4 `, D4 H
   temp=temp| 0x00000100;
1 s4 l' M9 R& y3 q( V. F, J7 R   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1$ a$ F" n+ P. _, f& J
   udelay(100);
- X  O# C" b9 ~  i0 M4 d9 z   printk("open success!\n");' U' s4 C5 c  C. L0 w8 H- J( a. a( ~' j
   return 0;1 t, Y% G1 _& ?- Q" ?8 ]
}
3 q7 Y5 [7 m% H! x# n; G  c1 ~7 z+ B# K1 \0 y! u8 p% H' U
static int mcbsp_release(struct inode *inode,struct file *file)
, Y9 p5 r/ I# D) d8 H9 l{
7 U! I  C9 ~" p( w   printk("release success!\n");
6 O$ I) Q$ E7 I$ s   return 0;+ t3 P! G8 G4 _# ~
}4 |& k5 j/ Q0 z. l, c; G. L" t0 i/ t3 b
; T* |, ~4 i3 u  \
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! H* m/ p9 K# ~5 n2 D8 ]
{* E: l& ?  @# u0 \& v1 s6 X
    copy_from_user(&DXR_data,buf,len);
- E+ i3 I6 b4 |7 B9 _7 T4 Z    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
% W& l1 G! L/ H" _    return 0;
: H- \* s; b5 C# N' ^
/ k3 X6 \. s6 f' U; ?( B+ N}) T6 ^6 p$ {: ^. s) c, U

4 q& f. Z, y: V% [% k; G6 b& W4 Ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ t2 q* r1 C  c9 {+ R4 v
{
6 |7 a1 V( t- O+ s, f- p/ {4 c   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: Y$ n0 Y. r: A1 J
   copy_to_user(buf,&DRR_data,len); ( R$ }" s- I8 V- o
   return 0;2 d. p- M+ U5 |  i' Q
}) n. s2 I5 f0 D7 I8 C; o2 F7 z
+ B0 |. v) J; w. x- ~6 J

& E. A* r& z0 wstatic struct  file_operations mcbsp_fops=, N+ Q$ D2 X. s
{7 J( L' C. Y! h& y. Z- M5 L
   .owner=THIS_MODULE,
* a/ q( U; e/ i2 y# a( X# h   .open=mcbsp_open,) [# T4 b$ N/ @7 l6 J: J7 `
   .release=mcbsp_release,& w& k* k2 ~1 N# h, [( N: U
   .write=mcbsp_write," t' M- D; S  g7 `; |! N4 o7 z
   .read=mcbsp_read,- U* ?; e% u! Y( k! q- j
};
6 F; m5 E7 e6 ~+ f2 q' F8 l8 Tstatic int __init MCBSP_init(void)) R, k. s  |& ^  U
{' ?  U, k- x: [4 V3 z
   int ret;1 m7 `: i* I3 F1 r7 e1 u5 |  j
   unsigned  int   PINMUX1_REG_old;
8 e2 r0 ?9 a6 X! h# B   unsigned  int   PINMUX18_REG_old;% j+ A" |& }0 G, @
   unsigned  int   PINMUX19_REG_old;
) V/ ~& {0 c( I3 j   unsigned  int   temp;  
2 N1 {4 ^4 p% Y% _# a   if(MCBSP_MAJOR)$ t" Q* k# V" u) i3 q6 b+ ?( B
   {8 i: H( v/ M. ^* Q2 Y& p
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 ^+ B" [6 I& T  u7 _0 r
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( K+ p5 a2 F$ b   }
+ n) X; j' i0 Y% |2 X1 \   else
3 |$ [7 b7 K% M* t( c/ ]   {% k- @) x/ E$ ?$ p% s2 W' [
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( V$ z7 B+ o; N0 ?
      MCBSP_MAJOR=MAJOR(mcbsp_dev);! E1 h+ W4 ]" b
   }
6 Z3 @" S* L- {; F$ a% E   
2 ^+ m5 E8 z5 T7 P   if(ret<0)2 \1 P) ?; U3 R1 s* @# L
   {
$ M% j+ Z, J; q      printk(KERN_ERR "register chrdev fail!");3 ]. J0 j8 p" j9 J) G. f# G! ~2 A
      return -1;4 F4 C# ?7 r3 s, f, I3 [( g$ _; a
   }
+ d! s% H" r$ y' P) H: k8 g   1 _6 g) d( d) m# U
   mcbsp_cdev=cdev_alloc();. \6 r9 C- {& h. Y8 Q) A  ]8 C: A* |
   ) C6 z- b2 H2 k. P$ u& W8 E; F
   if(mcbsp_cdev!=NULL)9 J# q' ^4 O( {
   {# I3 W$ c% Z: w
      cdev_init(mcbsp_cdev,&mcbsp_fops);
4 c4 ]4 i5 r, b6 Q      mcbsp_cdev->ops=&mcbsp_fops;
, ?6 T8 E! ]2 r2 ~      mcbsp_cdev->owner=THIS_MODULE;2 [& E3 e, z- l) e3 S, u' b5 e
      
  O* Y. A6 ?- @8 y5 T$ j  ~$ |      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
9 X& k% o% H5 ?+ C2 r  y          printk(KERN_ERR "register cdev fail!");
/ s- O  C% h5 w4 X      else
; i  Z) a9 H/ q  Z: g1 A          printk(KERN_ERR "register success!\n");
7 R4 ~+ c1 t# z0 s7 J   }5 _$ O; G6 V+ z9 M3 _* R( b
   else, y1 a' [. i; a. z% j5 x
   {5 S1 E) y5 }& D- M% K- }5 n- h
      printk(KERN_ERR "register cdev err!");3 U' v* n/ m( e3 }9 U
      return -1;
' o! P* D  o3 m! D, Z   }
. |% n+ L4 C, D2 h   + i) \* b* V8 R! k1 O  V1 }
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);5 b: f, m: O$ r2 y. X2 l
   if(IS_ERR(mcbsp_class))
2 J- h' [7 `7 U/ B( n   {' z# Z2 v# L1 J+ c( l
      printk(KERN_ERR "register class err!");
  U3 s. L/ _! z# ^  k8 f" c   return -1;
) L" L, G7 h& e% r4 ?   }, Y  K; g" q5 Z1 Q& \" n
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ X& c) f% M: K; w0 [; ~; b
" e  B, ~' ]0 M+ S7 ~9 ?7 \: j; V
   //PSC2 I7 {" j; o; d. m3 o0 `4 w
   //add Enable MCBSP
% n9 Q& U7 E+ o   //test/ L, `5 i% |$ h: B8 m1 c
   temp = 0x80000003;
. {* g1 z# K& e8 [% X   writel(temp, IO_ADDRESS(MDCTL15_ADDR));  O3 o: t6 |9 n
   temp = 0x00000003;) w( j7 q& U& ]. W" B! p
   writel(temp, IO_ADDRESS(PTCMD_ADDR));9 K' u0 [2 d% [
" I5 z+ U9 _$ r) T: t0 [
   temp = 0x001FF201;
7 J  L  a2 V& ]2 E2 k   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 f, r6 b- I9 G( k. S( p* A/ u   9 x# M8 D6 x+ k3 {
   //PINMUX  $ S1 D3 d# o+ Y& i3 h9 H
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. P; O' S: \4 P! I8 l9 {6 t. H
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  % N: ~$ X) ~- p, e
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   3 i1 L' D! S! A$ x
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 ^  o5 i* a9 O2 [/ L8 A3 Y   ) N  b8 o+ E" i8 \
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
7 f# |6 o, ^2 c/ s* a9 s1 F   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  5 U6 f: J1 h3 K% s/ d
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ! c* D5 j9 `8 C( u3 L8 c
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 L! }) F& Y: J8 b  M/ q( V: j
' f1 C5 i* U" k/ h! c- n
   //RESETn,L138_SHK2
  P8 x  Q+ C: ~. D' T# {   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  % S5 X( A8 ]# v( v9 x4 P  m- n
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& w$ v2 G) z  D9 k4 m+ \   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; ^5 x) y! b8 a. R1 j

) v* Q4 B: }# k4 W+ A, l$ x2 }
& U* f2 R, M  d' t# t) w  //SPCR Register
/ Y% r) Q/ A4 n4 k  g  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 y2 L# S/ Z: k  T* A. B  temp = 0x03000000;//(DLB=0)' R; N2 c: E6 c9 @/ w9 [1 R
// temp = 0x03008000;//(DLB=1)
6 i4 j* ~+ d( t# b3 Z: P& |  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# m' X0 B& a3 @! j8 H" f. ~  K
  temp = readl(IO_ADDRESS(SPCR_ADDR));# n9 B7 Q$ e- o9 t8 X# e
  printk("temp=%x\n",temp);
) i3 h9 s. F6 [% j  b$ _ ! f1 E% g. P0 z9 c0 s
   //PCR Register
6 h( f, G5 B' D# `. P   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
$ X# I& L1 n* Q! a6 r* R! o  // temp = 0x00000F0F;9 ^- P, x5 h+ f4 Q
  temp = 0x00000B0F;
4 Y& i' F5 ~% h8 a5 r& F  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
- D7 K  M8 ~# ^1 z) J  temp = readl(IO_ADDRESS(PCR_ADDR));
: A( `6 p, [9 Y# b! ]0 h  printk("temp=%x\n",temp);  
6 a0 @9 a! D0 O+ Y) r% e" R   //SRGR Register8 e- b9 V$ w/ V$ }  t
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* I" K1 \6 w/ G: G/ v' U
//temp = 0x301F000B;
$ t4 u  d9 F" K. S" r! a6 k" {; j   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 V) {+ l5 U8 w7 M1 D8 u$ g  temp = readl(IO_ADDRESS(SRGR_ADDR));
$ R- b6 ^: R( [  printk("temp=%x\n",temp);
( @( v. P. Q- p  p; |! t+ c   //RCR7 c8 Y. w1 s0 M: a0 q6 O  N
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( ]8 z, R3 s- f; g3 V8 x% P
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
% K5 n: d7 T- u7 V+ J  S   temp = 0x00440040;2 K2 A( l* \8 ^- s- H* T: B1 o: L
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   1 K& T4 L- k2 J  {6 z
   temp = readl(IO_ADDRESS(RCR_ADDR));* W! V+ M  g' E9 k1 I6 I
   printk("temp=%x\n",temp);
! H7 Y0 N4 L& s( k   //XCR
. e' o  s1 C5 O6 ]6 q   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1( ~& j& }; P6 z+ x4 c4 l
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
0 V! z+ h5 W* G' I! B. L   temp = 0x00440040;3 C% F4 [( T: k- w" j* n1 }
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   6 `; z9 o. _) p$ W$ U6 s+ @
   temp = readl(IO_ADDRESS(XCR_ADDR));
$ R, ]% @% ?3 u   printk("temp=%x\n",temp);
/ M$ h$ C! N4 R3 }$ w! N  udelay(100);$ ^$ X/ r. X1 a8 b- b" D) c2 l% j
  //SPCR Register
* ?# F7 l& ~7 y7 \: g: u  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- e5 a6 N$ j/ g; g9 K: j  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
  v5 E3 S4 \7 ?3 k, e- Y' t3 H  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
6 o4 p3 |3 d' B. M: u  temp = readl(IO_ADDRESS(SPCR_ADDR));. D$ G2 c2 y, ?% [
  printk("temp=%x\n",temp);+ Q+ m: p8 p7 T; \4 N% N
  udelay(100);
, G# l4 V/ p3 y+ W$ \( ?' d' A1 [( e) [% I
  //set GPIO direction
* I+ I! ^) t4 C" B$ ~+ j! v4 |   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));1 _" _+ @8 _  Z
   temp = temp | 0x00000100;//EPR----input
6 f2 Y. z1 n4 |4 ]4 `' `& [: Q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ `- e0 C! z- X5 E! w5 u   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 j6 K" L# X6 d9 O1 }% j  l
7 y  N! B( U5 i( ?+ |  j% A# Q
   return 0;
, K/ D$ `% L( j& ?: l7 W* R}
! x  A5 L' L# w% H5 e/ sstatic void __exit MCBSP_exit(void): f- }1 E) F4 \" S7 B
{# {0 ?3 m$ m7 b2 u, R) j1 |. u0 w
   printk("mcbsp chrdev exit!\n");
) o+ w5 I' }* q: U  Q$ Z2 p   cdev_del(mcbsp_cdev);5 x) u" k" s4 @. _/ S
   unregister_chrdev_region(mcbsp_dev,count);
8 m6 E; }! C% Z) @2 ~0 P9 U0 r3 ?   device_destroy(mcbsp_class,mcbsp_dev);" q7 e6 l/ D# y
   class_destroy(mcbsp_class);
9 P( T6 X9 x5 }' V9 I}
( K% n: x( c5 V( Z7 `, M$ Z  `module_init(MCBSP_init);9 T: ?% @4 G, r) P5 A
module_exit(MCBSP_exit);5 x5 ]0 R! O; K6 U3 O
' N4 o# N* s! j! ?
MODULE_LICENSE("GPL");
( \, U' p) C5 ?! W1 @8 ?7 g8 S$ R' n! D. G' O6 G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ p9 {7 V1 [" x我的应用层的测试程序如下
' \( J. U/ V) d% V, S2 Z% ]#include <stdio.h>
& W& q, `" ?% k0 p. h; A' p: U#include <string.h>9 T' j: F; b& @% u
#include <fcntl.h>
7 G5 K& d8 i* Z" o, Q: K; S#include <unistd.h>
. \6 b/ C! G2 `$ g#include <signal.h>7 H9 T6 M+ N+ P; V' E- x2 D
#include <pthread.h>       //线程
7 d: r8 A! |% X2 p6 G4 ?* _9 Z3 |#include <stdlib.h>
1 ~9 F: z) Y% C! d1 s( P+ w#include <pcap.h>          //捕获网口数据# h" Q! B# S4 D; W7 D
#include <semaphore.h>     //信号: b; g# n2 j* [2 W3 A/ E9 L
#include <sys/types.h>     //消息对列
- V$ B/ |6 _1 b5 N: V( G#include <sys/ipc.h>       //消息队列. F* f+ p: t; @  ?2 Y  B$ P
#include <sys/msg.h>       //消息队列1 B+ O8 |$ z- D1 K0 x
#include <sys/select.h>
/ x7 z% \) ?- N5 N$ h( w#include <sys/syscall.h>
! g) |! N- M9 t; K- ~% J4 X#include <sys/stat.h>8 w$ J2 ?( \+ u; q
#include <sys/mman.h>
& J2 _9 ^, @, `: j/ ^#define msleep(x) usleep(1000*x)
1 `: N6 Q9 k# i, Z+ \# x' e. h5 E8 N
int main()( ^4 }$ n- H9 l/ X% X
{ ) Q# ^  A! S! K/ ?8 }
    //MCBSP,ARM与AMBE2000交互设备0 `: v, i! q" a
int fd;
! K" I7 V- E0 ?+ O& R( w4 G unsigned short data_write = 0x5555;
0 _" f1 C% P% k% y unsigned short data_read = 0x00;
1 C- Q7 n7 E1 y7 k  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 b2 r2 Q8 O- g" s# {1 _- L //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% i/ k) [/ {+ r4 S' k( t4 F
    + j. H; _. p" f% g" g$ h$ [9 N
  if(fd < 0)! J0 y$ R$ i6 z% B1 k# w
  {
, k, n2 Q% Q7 u9 U     perror("open failed\n");
7 K( _4 N. L, C% O3 `% [+ Z     return -1;
% g- x% I! l0 O* L  }0 F2 [+ x6 w  z( q
  ' f" d3 N0 ^9 f4 K" s; G6 G  k
  while(1)
+ P( A6 l! r7 D2 w3 ~  {
# q# ]7 V5 k. E; V2 ]! l1 d( U3 {   
1 Q! D* C" z9 d7 A; }/ B   //AMBE2000每次读写是24个字为一帧
5 q. n" C, C5 X1 w) x   //写数据时将数据在底层存储起来,等到中断的时候再发送* d5 k& Z) e% n5 }$ C& y
   //AMBE2000输入数据是以0x13EC开头的4 k' j. ^  G6 z- F% P+ r
   write(fd,&data_write,sizeof(unsigned short));5 t% ]% T" d3 w1 C' h9 x7 ^
   
' S9 T4 [5 c& n: p4 C, U   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ! {! I  L) u' Q6 [% N% A
   read(fd,&data_read,sizeof(unsigned short));% t$ U6 @0 }+ V5 z  |) H+ _2 V* G
   8 @7 f5 [: f1 v! i: \& _+ c
   if(data_read == 0x13Ec)
! j4 \6 A/ A/ x* h8 V( w6 t1 W   {
% s8 |6 u, a- K  t   ! O; o9 g# S0 t* x4 e
    printf("data_read = %x\n",data_read);
- ]- f' s) }2 h, _2 T/ z   }; f2 j+ k! |5 I+ a: _, @' M
   $ i6 n! K2 i; k. H0 b) G% ]
   msleep(10);
9 V. ~# s: b6 a" n2 k* Y  
! @- E; \0 ~' W! v2 Q9 H  /*
9 V5 g* J6 [% H% @   ioctl(fd,1);   
# m4 T: B  g) Q. l) f sleep(1);) n. z: n  _  y  o
ioctl(fd,0);
9 P  G3 d5 R0 j! ]/ y  |8 n% J sleep(1);0 c7 t0 S% c% k8 p1 l4 F& A
*/
5 p. Z$ M, O: H. d8 G  }   1 ]" h3 L) I' u. c- e
return 0;. w0 H  |+ k# ~6 U$ o
3 k& a) F" `9 A/ U: k. f
}, r  S4 v0 ~( E2 @; d2 \
1 f& _3 B! c3 t
多谢各位指教,谢谢! 急( d4 K& J8 K6 B8 F7 l
2 O, [5 M/ A4 \, k( }
% G: b+ a' s- b' h+ X
% V9 b- N. ~; l+ i, s( p" `

4 n% M. B( \0 P& u0 D6 b  L# w
; T$ j( i  l* z. q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 17:18 , Processed in 0.063401 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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