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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 R) `" V  R& h! Z# M! G/*
$ S" X/ i# @) ^" T" J5 ^ * Copyright (C) 2009 Texas Instruments Inc) D* N  z+ a  d! Z' t: t  G
*
" ], u2 _) e0 d" g+ N3 J * This program is free software; you can redistribute it and/or modify0 v/ _3 w" M. f( H! ^2 Q
* it under the terms of the GNU General Public License as published by
+ M& f" W& G: u  n) i * the Free Software Foundation; either version 2 of the License, or
; q/ O  ^$ r( O2 S  x8 @ * (at your option)any later version.
( }1 x5 x' C6 _2 K! K, n *; Z7 t- }; w( N2 N  q
* This program is distributed in the hope that it will be useful,
* o! e; w+ Q" E- X% p8 t * but WITHOUT ANY WARRANTY; without even the implied warranty of) s8 d  R8 E1 d+ ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  X* N- {9 k1 b" V* @
* GNU General Public License for more details.
6 I$ l/ z; L0 e5 y) z( P" H *
" }% e, J6 u5 z9 [ * You should have received a copy of the GNU General Public License
" l" m! a- W% n$ M * along with this program; if not, write to the Free Software
% ?. k# b- S7 o * Foundati
3 Z" f( v5 N4 g2 }*/
+ d1 S# W6 N+ H7 f#include <linux/module.h>
5 g9 w# w6 m- R- n: ^- f# L#include <linux/init.h>
. D) ?4 L/ _& n& J#include <linux/errno.h>
0 W+ a7 _) f! x- c#include <linux/types.h>* M/ R, }: u% J
#include <linux/interrupt.h>! r/ ^0 z% z+ m$ V8 V( B* J" o3 n5 h
#include <linux/io.h>9 J) B6 u  R( z; {) U9 Z
#include <linux/sysctl.h>
& I* u' w1 z' a0 V- q$ X0 b#include <linux/mm.h>
: D4 b1 b: n! V% m0 S#include <linux/delay.h>) n* y! b% L6 A! w# n! w. @$ `* c
#include<linux/kernel.h>; o9 z& b# M( |  m& E! a" B
#include<linux/fs.h>. v. J2 x  D0 ^
#include<linux/ioctl.h>
6 O, Y' u- K' e2 ~4 f2 O#include<linux/cdev.h>8 t7 `  C) D/ ~, J" U% Z6 t' o
#include<linux/kdev_t.h>
8 s- H+ O' Z" @#include<linux/gpio.h>7 p1 Q) u' n6 k: X0 g$ x' H
#include <mach/hardware.h># o- G- P  \! o6 c4 [# v4 z, W
#include <mach/irqs.h>
# a9 ?$ G" F9 U- l& m/ T( H5 e+ L% N# t6 ]! U2 |- s* G1 ~
#include <asm/mach-types.h>( G$ z+ N, [4 [+ `- |) s
#include <asm/mach/arch.h>
; b+ H1 ]% s: B4 L* @6 A) `#include <mach/da8xx.h>% e1 ]) ]' w- d7 [% E; I% z2 F
#define  SYSCFG_BASE   0x01c14000
! D. s" v8 s' G# r' l( v; \1 T#define  PINMUX1_OFFSET   0x124
% F1 B/ Y( m5 p' F4 ^: C+ S) @8 G#define  PINMUX18_OFFSET  0x168 ! C, R# f7 R# c5 F3 g" L
#define  PINMUX19_OFFSET  0x16c
, b& b' S5 m! F% Q; C#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
/ @8 T. P' p5 g7 }#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
( t: L$ x2 B' w, a#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
" `' q: E6 k* n4 J7 e#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
" C- Q/ ~2 R  @#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
  l& J" A3 W: R  g. ^* w, {* N, w3 }                           
' E3 R" C7 `4 `: P$ \7 }2 v#define DXR_ADDR      0x01D11004  //MCBSP1_DXR1 y" E; H, @7 X
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
0 p+ _8 G$ Q- O//PSC. J/ g2 z0 M$ F9 w' d1 @$ I
#define  PTCMD_ADDR   0x01E27120  
* K; A4 {  V* S6 {2 G+ i0 y' D' t1 j#define  MDCTL15_ADDR 0x01E27A3C+ @6 J7 e$ E( e$ x$ M( L
#define  PDCTL1_ADDR  0x01E27304' Y7 G/ x" e7 T( p% `1 z
//GPIO8 direction$ w: l4 z  c, G" c1 z& g- P( n1 }
#define GPIO8_DIRECT  0x01E260B03 s2 w" v& Z  `6 _7 {6 \1 P
#define GPIO8_OUT     0x01E260B4
! _/ j% I# A- u' @  k+ w6 U0 W1 N#define GPIO8_IN     0x01E260C0
# l) j# P# H6 M/ j( L4 L& Y, i, ~* E( o% N. j
//#define MCBSP1_RINT    99              
6 e  P* I: k/ m( S' w4 ^/ M//#define MCBSP1_XINT    100  
9 M4 `4 s+ |1 w  ?- ^6 K, f9 A; m* H; ustatic int MCBSP_MAJOR=239;
+ \: I* u9 g" S3 G  x8 \: T- B) istatic int MCBSP_MINOR=0;# T) `. }: q# X) @3 M
static int count =1;
; t3 S1 s" V0 F* w4 `! V6 h0 S, S# }) M6 Y: H7 p5 M6 n
#define MCBSP_NAME  "MCBSP-device"" `2 o3 i  z9 d5 h

  e! V! R7 o! D! I; b# F- Jstatic struct cdev *mcbsp_cdev;
8 u% Z; b1 J5 x; P$ D  Vstatic struct class *mcbsp_class;# M' j8 g# ^, z
static dev_t mcbsp_dev;6 |; C; g% }0 g" E3 y" Y& W) U( ^% r
unsigned int DRR_data;
& E8 K( ?/ I( D: }2 i7 g! y; ?' Zunsigned int DXR_data;. s1 [2 x+ X/ b7 I6 [6 `
static int mcbsp_open(struct inode *inode,struct file *file)% ]4 v- @3 _4 W5 o- z8 M0 U* k. V
{
  p: f5 f. I& V0 o, G. _0 a$ E   $ Q8 l+ F: E1 `
   //interrupt enable,initialized  B# {3 M/ g2 D- }8 M
   unsigned int temp;
/ L* M& X: |% K9 h* b; d" x4 P   //SLEEP_EN(GPIO8[10])---0
. c' y4 Y  M) Z' U" _0 _' w, X) g   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; ]- Q2 x) z* g. p/ J! s/ n# A   temp=temp&(~0x00000400);* b( y. ?/ ~: \* S- Y/ H" N' y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( u; ~5 ~7 o2 ~7 o1 Y
  //RESETn(GPIO8[8])----0----14 A+ P' z6 f9 s7 H# c
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' i/ J7 Z) ^' S. g
   temp=temp&(~0x00000100);
' R! f' a# Z5 P' S. T& J6 V   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 ~4 ]8 T, A8 Z2 j) Y
   udelay(100);. L1 ^4 d3 G# z6 C& U/ E
   temp=temp| 0x00000100;
: s# ^& ~, Y5 h! B   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ q# b8 c' y' T+ J: b% T5 H: H. V) v   udelay(100);' M" g' P* t( b5 @
   printk("open success!\n");2 w2 H. i$ B* }" h2 [; W6 e9 z* s
   return 0;
7 X$ |, y/ }7 w# b}4 |7 K( G5 ]$ E

+ E' Y% U& z3 R; q: W  i# zstatic int mcbsp_release(struct inode *inode,struct file *file)
% ]0 q3 O# A$ r; ~: ^* x{
' A6 i$ t% N$ u) P, r* y   printk("release success!\n");
# K+ b; X1 [& ~1 f   return 0;
; X3 h: }7 |. ^}3 m& }  U1 K* B) W5 A6 t

/ x& u& N1 X$ K$ H# y3 ]4 q) H* Tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 H& l$ p$ P8 a$ E. \
{
2 b4 {  {4 G4 O! S1 q: k    copy_from_user(&DXR_data,buf,len);
. k9 N. r0 i  I" N1 p    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       # z. A* c6 r. c8 H& x
    return 0;
+ W( W$ X2 ~) G  {
2 G. W; c  f' U6 s}
( v: s9 e" d) _0 E# {1 I8 u% N3 e9 [
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), Z; {( c5 a! x5 X8 h' e! Z8 ?
{ 2 o) y. Q+ p6 ?: g3 U+ M3 t3 r$ G
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( V) a5 @5 l2 P! ]
   copy_to_user(buf,&DRR_data,len);
( l" g) k$ g! A( P- i1 y% x  W   return 0;
2 V1 ^; {  g% ?8 t, R1 ]0 Z4 Y2 ?}
7 b% F. i8 N& H6 a2 V( h, @
5 J. L) x) h/ y7 o) L
+ `1 E8 n+ }8 N& ]1 B+ tstatic struct  file_operations mcbsp_fops=
" n3 d" W$ J! J3 j6 X6 e{
2 G1 v' g; ~4 e" o( |1 n9 x   .owner=THIS_MODULE,3 u4 M- n/ {) B6 y
   .open=mcbsp_open,
% w) t& G2 y; D   .release=mcbsp_release,
! a: `+ a  K% c& x" e- v0 G   .write=mcbsp_write,
" C1 R- g7 z& {0 U+ B* r   .read=mcbsp_read,+ ]1 R  T3 }' t; `
};
- P$ B7 |2 w* W' d  l/ fstatic int __init MCBSP_init(void)$ C4 O# v6 d  H2 ]; |4 |/ B
{8 u8 O# n5 i- x+ c. |
   int ret;( j0 w# x6 f: ~4 q' g& h7 P8 l
   unsigned  int   PINMUX1_REG_old;
+ L- F) i5 z' t   unsigned  int   PINMUX18_REG_old;
) ?* Q0 w6 n' d" `   unsigned  int   PINMUX19_REG_old;
- w3 b% t/ w( n: W( N7 z1 J   unsigned  int   temp;  
" S: [9 u) l0 r& e   if(MCBSP_MAJOR)
$ K4 R( V+ X% {# _9 r+ K1 {6 D; x   {
1 m- W# d+ n0 M      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
7 \7 N4 Z' ]( q      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( ?2 ^, {- N1 E4 D   }
; {  I2 `6 }0 L& D, A   else/ {% c! o) O( q6 h! l
   {0 U6 K" _5 h6 @0 a* a
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 R/ s7 d6 u2 l/ m
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# ^; U+ H9 O# d' L4 l7 g1 c
   }
- {3 H# N( I2 [, b& f" V   
! o( T$ Q, x, K* S. Y2 z+ U   if(ret<0)
4 R- h) N# C* M  B$ h' U   {
3 w- ~( K6 g3 t+ Y1 E      printk(KERN_ERR "register chrdev fail!");
7 Y9 d* g- [9 @8 ~( [* _. t4 U      return -1;
3 j, L3 W8 A0 y0 n' U   }. T0 U. T! E' S& w
   8 a, u, D( p% I' X$ I" N+ g# C
   mcbsp_cdev=cdev_alloc();/ y: _+ Q+ L5 g) H: L: j. x8 e, t) y
   - d5 f- J; v8 E; K9 O- y  q
   if(mcbsp_cdev!=NULL)
7 H" u' m, G3 a; ?% P5 t1 ?1 L   {
3 m7 s" o& r0 X7 h' z4 B      cdev_init(mcbsp_cdev,&mcbsp_fops);$ p! V# b8 B; I' n( _1 @8 Y5 l
      mcbsp_cdev->ops=&mcbsp_fops;' C6 g8 c0 b# W1 O5 D+ x- Y! n
      mcbsp_cdev->owner=THIS_MODULE;1 g* j2 \9 q& ]$ F: k, ^" h
      - h  x0 y1 i' E
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 N( E2 \9 U- k7 b) c  u0 s
          printk(KERN_ERR "register cdev fail!");
6 F6 S; V7 H/ c6 F% l' _9 i  R      else1 h% w  s  S9 h) u; X4 g
          printk(KERN_ERR "register success!\n");
5 a# W7 `% t- f8 m4 C   }
4 k1 D3 w. C5 t& ~% x" X   else& I) d, m4 |3 q4 x" F) c+ c$ s
   {
# t; u. _& T  \  [      printk(KERN_ERR "register cdev err!");0 }/ q7 H5 P1 U0 O
      return -1;5 B( a+ F7 p% n! c! N6 A: Q$ A
   }
5 q- T. d) R7 N9 {6 J  N0 i   
5 |! R5 r* ?, P- Z* B* Z  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 u9 u/ G. e, E5 f   if(IS_ERR(mcbsp_class))
* k$ x7 A! `9 Y  W/ A/ [   {
( N& v' \/ W! ^+ @, Z, e- @      printk(KERN_ERR "register class err!");! ]4 U; `4 v$ Q1 \0 q2 d
   return -1;
7 N, x& R/ ]  U8 e   }
: Z1 |) L  {- {% x) a9 W. j' ~) }( C   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ i( O7 B% Z3 ]# {+ T) z/ }5 d, L/ d  e! l& K7 J1 z: l
   //PSC* C% h5 t0 W# d( T1 o, X/ ]
   //add Enable MCBSP, m+ \: R$ L' v0 C. Q/ Y! d' h. E
   //test8 b* n* [& B3 o5 M1 u4 X% J) \
   temp = 0x80000003;: x" G& ^. t, }7 N1 ]( r+ a, i) r
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. s$ l/ U+ C1 [1 ~% Q   temp = 0x00000003;8 C. z3 m9 ]9 |' g& g% z. n
   writel(temp, IO_ADDRESS(PTCMD_ADDR));0 s, P  e  x3 t" d; q

5 Q" k0 N" s! R5 Q, D! p3 A   temp = 0x001FF201;
6 I& N$ r9 T+ f. v% `& R' Y5 k# r   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# ]% ?  [+ `, F: M8 N   : q$ b0 a& S' \
   //PINMUX  , \/ ^9 a+ I# _. T) _
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,  N3 R! v; R" {5 S7 v3 D2 _4 }
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 n6 v) C5 Q( f! N4 a4 V
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
# T' N' V! a: E1 w   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& [$ e, \6 ]! H, c
   3 Y' S' A# @* j8 G( \  O/ {- b
   //SLEEP_EN,EPR,L138_SHK1,L138_RC, v  X( P' t6 }; B
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
/ U2 x7 r- D4 _% |' I   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   3 j" T9 O9 H' L, L' j4 S& x
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) n5 W9 s6 _! d5 I; R: K

( P% e) R2 v# e% g+ K: }% q' V   //RESETn,L138_SHK2
) F! {5 {* `( k3 w   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
3 G3 ^3 O' r8 q7 u& p   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
6 g5 |1 _. w2 l8 Q0 m  t9 f   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- G3 B  `' I: l* V2 {1 b7 |$ E. @1 _
( u% B  @( T' {, Y, b# M3 k; \
# ~7 ]4 l' T& C% ~5 r+ A8 y# Q6 S
  //SPCR Register
+ J9 b3 N# g& b4 H, G  w) x  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! N" V* J2 r/ N9 b9 U& o4 F  temp = 0x03000000;//(DLB=0)
+ _/ I& _7 f% F% `0 i. {5 F // temp = 0x03008000;//(DLB=1)+ R( h# J8 ~' x. j
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
# G9 }, e6 Q0 T; N  temp = readl(IO_ADDRESS(SPCR_ADDR));
3 n1 P; C$ D& z& [; f6 i  printk("temp=%x\n",temp);
- X$ v2 m: B; D # q1 F1 D, R5 i
   //PCR Register1 A( m9 j+ [+ V* p9 Y) O7 }- Q/ f
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0  I' z# y: N, K0 j1 m6 \
  // temp = 0x00000F0F;
3 O8 _2 W5 g) |6 A  temp = 0x00000B0F;. \3 ]% Q/ W% t
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
$ C& y: l% |* ^. T4 y) w( C  temp = readl(IO_ADDRESS(PCR_ADDR));2 r4 u3 X4 ]: B2 R
  printk("temp=%x\n",temp);  ' I% t' `# j, o4 {
   //SRGR Register+ N( q- V4 b4 t" I. l; Q. P
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 f( c! a# c( V9 Q //temp = 0x301F000B;
7 _" k9 I, }' ~+ J( r0 ~   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized   w8 a6 p1 j& V$ w4 j4 F
  temp = readl(IO_ADDRESS(SRGR_ADDR));# a1 f: Q2 [( M: O
  printk("temp=%x\n",temp);
; M! y+ H- ?/ t& f2 n   //RCR
( \) `$ ]$ i: a% R   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 M, t1 A+ ~' m9 S( ]
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 s) ~3 q* n6 h9 j$ q. s% [% {
   temp = 0x00440040;( K) J; N8 A) b% @
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   1 \6 n5 ^/ O, ]1 K# l4 g# z6 \- ^
   temp = readl(IO_ADDRESS(RCR_ADDR));
: O* ~1 Z3 }1 K. x7 I  Y. \5 O. n   printk("temp=%x\n",temp);
, ?9 W/ o7 r  ]& J8 y9 M/ J4 a0 Q9 D0 C   //XCR) M! T3 l2 T6 Y  p, g2 O
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) j+ _: s6 [5 [2 A$ _. X
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 g0 m! \/ }$ l: j; D2 g* d2 b1 }) _1 a3 o
   temp = 0x00440040;. O' K/ x# c3 V4 I8 e* X# n; X4 T
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   + Q" D+ G0 n$ ~3 l  A! F+ F
   temp = readl(IO_ADDRESS(XCR_ADDR));- I3 e# R4 F; g! H5 X1 q
   printk("temp=%x\n",temp);
( I: C: x7 I! s! h! m5 A  udelay(100);. o: F" Y* X& Y7 H, c" T8 d( X# R
  //SPCR Register# e+ w  G1 X* u& ?% C2 w+ @
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 A- t" @6 b9 F! M2 E6 k% I6 F
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
9 U' [8 K5 B- D6 j- J. Q0 u  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
: f  Z3 B; C+ o4 C/ A; O% [; v$ C  temp = readl(IO_ADDRESS(SPCR_ADDR));
! t7 e/ m, V3 O, T  printk("temp=%x\n",temp);
% b' q3 k6 i4 b" ]  udelay(100);
1 t/ }# e1 m4 N' o" y$ f
) `$ }' \: y* r3 J4 k  //set GPIO direction. H( l5 H0 z& j; B6 Z' K" K4 z
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 T  W( K  J' c" n' q
   temp = temp | 0x00000100;//EPR----input; |% w; D- R7 r$ a( u7 W; W
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
, R. e. X1 W5 r$ T% P- u  I   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# J9 o6 f' s- l7 H: {, t
6 b) n0 P2 ?4 c: s% [- o8 }4 m   return 0;
0 y- v" x' V  D* @0 c}7 d# J3 Z' e$ p. F3 A: i
static void __exit MCBSP_exit(void)1 Z" j3 f) ?, C! L8 m
{" Y# E1 H' s) Z$ l. j+ T% O, M
   printk("mcbsp chrdev exit!\n");
$ V1 O# V/ f) w2 z   cdev_del(mcbsp_cdev);
# V+ u3 I- J, c   unregister_chrdev_region(mcbsp_dev,count);+ t2 y3 C3 X, _9 l% K' Q
   device_destroy(mcbsp_class,mcbsp_dev);; B4 w9 o- q+ M8 B. s+ X* {/ |
   class_destroy(mcbsp_class);( u. Y$ Z# T5 W9 V' u  j
}2 U8 F# O" k6 q3 f, f" k. e
module_init(MCBSP_init);
$ l8 x; Q( D. p' w- U' h+ p& C7 [8 pmodule_exit(MCBSP_exit);, \  V$ [# O2 |  b4 H! M3 g( b
2 b9 b: L) D+ A7 ~2 S; Q1 K
MODULE_LICENSE("GPL");
4 q; r' L+ M0 ?% B! M& Z; X3 i+ B# _& b
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 c7 r- i* n: u. T# a我的应用层的测试程序如下
- d2 ]' W$ R* U, T5 i" u#include <stdio.h>
) q# q7 ~+ L; ?; y0 M. x& i#include <string.h>$ I9 Z1 `7 k( j. P1 d2 p" o
#include <fcntl.h>. U( {- L6 `9 `4 o
#include <unistd.h>
, E- U% i$ _  I% `; y# a+ E: L' j#include <signal.h>
$ |/ t5 x$ u5 n7 @/ A#include <pthread.h>       //线程: L' J2 L1 N- z4 ~/ J
#include <stdlib.h>5 H. a$ [7 l% G8 k
#include <pcap.h>          //捕获网口数据, ], c2 d; q& ?. d- h
#include <semaphore.h>     //信号7 G* ?/ w' D4 a7 i7 |8 S
#include <sys/types.h>     //消息对列
% ?: [6 P& g1 {! v7 C8 Q#include <sys/ipc.h>       //消息队列5 A, f- p% g* O  M0 Y$ L' B4 M' K
#include <sys/msg.h>       //消息队列2 l! H: P1 i5 u2 z
#include <sys/select.h>
% q5 W6 |* H2 U5 o$ z5 W8 `  A  V#include <sys/syscall.h>' y# `! f* x9 v3 J
#include <sys/stat.h>
9 Y3 ~+ y1 t; V! x#include <sys/mman.h>/ ^7 E1 q% h+ f7 T+ b5 J
#define msleep(x) usleep(1000*x)/ N. L3 `) ?1 q0 v% ^  ^

2 J3 l1 x3 j. Q/ A% p) ?" Wint main()
' w  \7 t5 ^4 L3 S  q* R{
( K% D3 l* A# I    //MCBSP,ARM与AMBE2000交互设备
0 r0 g7 a9 }7 _4 z1 c8 p int fd;
+ n) l0 E% j0 R9 T& ]- N# z unsigned short data_write = 0x5555;
  y  ~& h5 ]* H  B unsigned short data_read = 0x00;
4 V, Q" L# M6 D  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ k! j) j# C+ O  J5 D# Z% r
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
! {5 {1 A# a/ |3 s+ Y      E0 x& X- G6 v% ^+ n
  if(fd < 0)2 d7 [& O% A7 B; N; V# c+ r; x
  {! _2 K9 R( l! d, y5 Z
     perror("open failed\n");; H. ?+ E3 ]' f
     return -1;
: b/ X; b$ i/ g2 k' z; g  }
0 |2 j3 u6 [" N( i, v, F. F  
, x/ p7 o9 Y8 W2 X  while(1)$ S; w  z' c/ s0 |+ U0 B
  {
" r- p( ?) f) W7 a# N& \6 U( l& Q4 Y   
* f7 a: F. C4 u   //AMBE2000每次读写是24个字为一帧
" g! J6 f/ E! Y6 t, q' t   //写数据时将数据在底层存储起来,等到中断的时候再发送% {% f3 b  ]) ?$ m( @6 N5 T
   //AMBE2000输入数据是以0x13EC开头的
7 S0 P# h  y" O9 \6 z+ F# p   write(fd,&data_write,sizeof(unsigned short));
* w/ r" h, p% ]" Y   
' g% W, l0 h3 `9 Z4 O, X   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
. b0 }  h1 j2 L! o/ P' ]   read(fd,&data_read,sizeof(unsigned short));
7 V% [6 U2 e" }6 A   + {9 x# R0 z; o  ]+ U+ J4 l
   if(data_read == 0x13Ec)
, ~0 `* |4 J! x, G- z: U+ G) p   {' ?, \: }  `' ?# f% h0 F
   
4 S# U& V- s9 i6 f    printf("data_read = %x\n",data_read);
- F' g; f( _  M1 N( j& ^6 I   }$ `. z6 C. H( l" [, T- N, w
   
4 ~4 u; i& X* \3 X3 A$ f   msleep(10);
7 h9 }( ^4 R! A* B5 n  
. Q% V% Q1 F+ I/ [4 L7 p" M) _2 f  /*: }3 i0 F9 N6 |! f
   ioctl(fd,1);   
8 }4 z7 T7 g6 T" q! J8 O" P5 u2 [, N sleep(1);
! ]1 a' J  c8 V5 j) B ioctl(fd,0);
+ ~9 g7 g2 g5 |( V sleep(1);
5 o8 m/ ~7 t! }8 U */
7 D3 B1 T! N! j0 M" ^( ~6 L  }   ! H/ e1 C- @4 O7 W' Z( i
return 0;
7 `( i1 f- h0 c. |/ ?+ [ * \5 ^3 U& D! }5 ~5 O4 q5 J, }7 x
}
, d% M  N  B  h" f4 p( W( r3 i
2 p: O9 V* {# |4 ]' R% `/ v1 n5 t多谢各位指教,谢谢! 急
( S- o  i2 n( w/ b; R& j; z0 e% o2 U1 a" l) x& {

" b2 [0 e9 a1 ?) V# h, I" f* |- S; }9 R/ m: g; m

" f8 \' q7 Y3 f7 m5 Z- g# f
7 d4 Y- r9 n5 j6 k+ M, R# R) j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 04:18 , Processed in 0.049247 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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