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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( Q5 H  h- P" K" g4 {- A- L/*3 w( g+ R% V' r
* Copyright (C) 2009 Texas Instruments Inc/ Y5 W% A) s. M' v4 W
*% ]( y$ o3 l% {- {; N. a
* This program is free software; you can redistribute it and/or modify
% z% k) e+ B; B) Z, @9 i * it under the terms of the GNU General Public License as published by0 L7 `3 O4 D( x0 H0 x7 o; }
* the Free Software Foundation; either version 2 of the License, or- T& M$ V* X  e9 x! c" Y
* (at your option)any later version.
8 r  W! s8 u) k* B- ?# @* } *. m& w( A& N) z0 l4 f8 C3 k
* This program is distributed in the hope that it will be useful,
% X. H  l( D7 U, S# Y * but WITHOUT ANY WARRANTY; without even the implied warranty of( r/ c1 \2 X0 N
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
: o* N9 a5 X" H4 K * GNU General Public License for more details.
8 c" F" S/ q' O% v& U */ d( _0 b3 E- M/ t7 f9 W) t
* You should have received a copy of the GNU General Public License
# M! A0 _3 f1 m) D& J8 ]% e * along with this program; if not, write to the Free Software
8 N3 a$ a/ H& t! z0 x% n4 \  ~ * Foundati
3 z4 A5 J' f; f3 a*/$ d1 k0 C- [$ ~, w9 @1 c
#include <linux/module.h>
8 }7 E3 X3 h3 q( {; m0 R' B#include <linux/init.h>8 N& G; |9 i8 y5 t) P; R; t5 Z- J, \/ `
#include <linux/errno.h>
! Y4 v. p1 @' l- H! V#include <linux/types.h>0 Q( j- e% Q8 E* h; Q/ W
#include <linux/interrupt.h>
6 T# I- r$ j2 ^9 G  v#include <linux/io.h>
) T, X( O4 r+ ^! p8 w7 L4 N#include <linux/sysctl.h>
5 Y. S) F5 y, [8 E% n1 \: S#include <linux/mm.h>$ M: G! y3 f4 e* `$ c
#include <linux/delay.h>8 b% O1 b# v2 e
#include<linux/kernel.h>" X" x0 s* {8 z% n2 q' }
#include<linux/fs.h>
- v6 P  O" Z$ ]: h0 N$ |! H* }#include<linux/ioctl.h>& C7 B  \$ H+ C- G5 ?$ F
#include<linux/cdev.h>& I/ D; r- P. |' B$ U0 a
#include<linux/kdev_t.h>5 z9 `9 ^0 F  l) Z% d
#include<linux/gpio.h>- O3 R9 k3 \& r0 S. O' r
#include <mach/hardware.h>( q: f3 \1 j- e" o  B5 z
#include <mach/irqs.h>+ c0 `$ x% _' \. t& w  X3 Y

) P' u. \( @: Y#include <asm/mach-types.h>, o2 f' O3 E% b0 M) |* M6 ~
#include <asm/mach/arch.h>. X! B: s7 U$ f7 {- e
#include <mach/da8xx.h>* y( z- L+ }1 m4 @1 b1 a" _& f% f2 A0 U; P
#define  SYSCFG_BASE   0x01c14000' W/ r0 X! i, H- f
#define  PINMUX1_OFFSET   0x124 * x# ]2 t5 J( E3 ^4 [1 I# h
#define  PINMUX18_OFFSET  0x168
, ?0 V3 m8 s. m8 v#define  PINMUX19_OFFSET  0x16c
# Z, c) P' v8 e. g& |; V#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
; h0 |' H, F8 R% o+ h& I/ k; z#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 K( Z, R& n  R( Q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR+ [: `) G% |/ S: O; `  W; ?
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
8 F5 K1 A1 g& \, E: S- L" }# |#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
' [$ M$ |, W% q                            . R4 W/ K- G6 ?8 T/ m
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
. y* X1 |7 s; [; @  p! ]) n- F#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 \; o) l# e/ W
//PSC( s4 D; G2 a8 h5 m2 B" q# x0 ~" R
#define  PTCMD_ADDR   0x01E27120  2 }* n. }2 A/ P
#define  MDCTL15_ADDR 0x01E27A3C
/ n2 a% I3 D2 Y#define  PDCTL1_ADDR  0x01E27304
7 t+ Z, N5 d- N# r//GPIO8 direction
. A; A+ r4 Z/ M3 X! _6 O: N7 F#define GPIO8_DIRECT  0x01E260B0
. A  o: ~) s( T4 D% @1 i, M#define GPIO8_OUT     0x01E260B4
0 a1 E$ g3 o' `' F( r/ `' ^  x#define GPIO8_IN     0x01E260C03 ?0 _; S& o- w9 O
1 u( |% |) O  ^6 G; z5 a% n, k
//#define MCBSP1_RINT    99              
* ?) A- @5 g8 C' F# p9 ?+ i( \//#define MCBSP1_XINT    100  
/ N) b- Z) e6 j7 L' `9 q" i, Tstatic int MCBSP_MAJOR=239;% J! d. B( g+ D1 t* _7 x1 x
static int MCBSP_MINOR=0;
6 i# A5 w7 V  M7 `  rstatic int count =1;+ s9 N" D4 V4 h! n6 i% B9 Q* \! a
; ?$ ^% v5 H( ?
#define MCBSP_NAME  "MCBSP-device"
$ g! |9 E) q% V9 h* V) e" G* D% P, s5 b: v7 V+ c  `
static struct cdev *mcbsp_cdev;1 ]% b$ [* M* X) \2 y+ ~" w
static struct class *mcbsp_class;' @! m4 l+ m! V
static dev_t mcbsp_dev;
: `8 V  Z2 g, g. C# x" _unsigned int DRR_data;
6 ~! t( \- r  |3 [! m0 |unsigned int DXR_data;& A; T, X! P" S+ I! ~# ?; e7 _
static int mcbsp_open(struct inode *inode,struct file *file)# M# G7 L- {  \5 r
{
( c5 I3 T. G% a; d( ]( k: y   - h- k# U# G7 s/ Z0 }& |& J& B
   //interrupt enable,initialized0 Y* G8 p7 F' ]4 b
   unsigned int temp;
; w6 T  D8 ]$ ~  f   //SLEEP_EN(GPIO8[10])---0
7 ~' m2 s4 E! x2 s   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 s% T# D7 u: E4 z/ g: i   temp=temp&(~0x00000400);: W2 j) {( N7 n& @' J$ C$ h8 e7 R
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* u" f5 I7 O" X6 `- e( }7 e  //RESETn(GPIO8[8])----0----1
' k7 t) U& g- A! \) x9 y   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, E9 a, J) V, h; Y   temp=temp&(~0x00000100);
( }5 E5 G# d$ [" |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 N$ m4 Q9 M& G- J
   udelay(100);
; g! x6 ?- Y* d3 o   temp=temp| 0x00000100;
% ]1 \/ n& p  V9 x4 k   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1$ S3 w. V1 |# |5 O! d3 r5 ]
   udelay(100);4 y( X4 `' s# c- t0 _5 Y. W
   printk("open success!\n");$ r; {5 \) Z) F  Z0 k! B$ W; K
   return 0;
+ D) o9 g6 v3 V5 b}3 N) S- L, B* J7 O; u# S3 ^
; C( ~7 W$ l; Y6 y
static int mcbsp_release(struct inode *inode,struct file *file)' v# r9 V8 U& u5 c  a$ g; @
{- I' [; j1 N. N4 g% \7 [% j* _
   printk("release success!\n");3 n0 X0 ~: z) `9 R- g5 }+ K7 \' p
   return 0;1 S1 C2 O  d' a+ `
}. [* Z2 M: \7 q, v# h

" H, J* V) u$ v9 j3 g: gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
5 D6 Y) J# w4 b# x0 V, B{+ n$ \* Y7 m2 R2 b' e
    copy_from_user(&DXR_data,buf,len);
6 K$ ~: H0 t; n, r8 ]) b: C$ W    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
* m, }, ?' H* u4 F! J, o    return 0;
/ c% e5 I. b* S. b8 T , [$ _9 I" P: S5 X! Q$ Z
}8 f: M3 i1 Z! B0 I  F7 F7 R: }% H+ c

- w6 h- y. ?  r0 x* ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 o  }+ y7 A, L/ z2 E4 Z6 G
{
  m* ^$ {6 }- {8 F( X   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( C2 l- ~& h8 P& \" k
   copy_to_user(buf,&DRR_data,len);   }* s+ q9 y$ i( m$ s7 Z* k
   return 0;
" H+ d, u5 Z" B  M8 x$ @' ^}
! o$ t& n; Y- C+ L& c  G/ H7 C$ ^8 G! }9 G/ u

# b1 F; j4 m/ `4 cstatic struct  file_operations mcbsp_fops=6 R0 }3 g& i/ j5 }+ _/ L9 @+ u. E
{
+ i7 R7 _  {6 G! a   .owner=THIS_MODULE,
% ?4 F  ^0 r/ w1 j# c! |   .open=mcbsp_open,
# I  G, O; T  X3 Y   .release=mcbsp_release,
" \/ c! K2 [& o- I3 L   .write=mcbsp_write,8 t4 Q, _$ D! F- D* E% K$ e. _1 y& ]
   .read=mcbsp_read,
9 R1 r8 O! ~# U6 q2 M7 b5 W};
4 ]) N3 g) N( r! o/ [static int __init MCBSP_init(void)+ N2 s; l& J) G9 W6 x0 C
{3 S+ Z" ~0 o: R
   int ret;7 a: B% V% Z! ]' p
   unsigned  int   PINMUX1_REG_old;2 v# G, C7 r! ?9 d' A
   unsigned  int   PINMUX18_REG_old;
; U$ \4 d1 ]" m2 m# ?   unsigned  int   PINMUX19_REG_old;1 a) Y1 @1 W: K" M- H1 ~
   unsigned  int   temp;  
' L1 e7 R2 c: U! Y. U0 X   if(MCBSP_MAJOR)6 M7 b0 x( S1 u1 C4 y$ w) N
   {( S0 v# [& F' _2 S
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
: X! d9 w+ y, d* j; [      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);2 i) x' e4 _! m" Z+ _$ ]3 b
   }
# N2 F$ ^; `7 [7 l7 `7 S# q   else
! D: i! V7 F5 `: X# L* S7 P9 V3 \   {/ T3 H& X% z/ `; x1 i) I' r
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ h" f0 X' b* Y- N" \7 j; D: t      MCBSP_MAJOR=MAJOR(mcbsp_dev);9 H+ Q8 X8 `( k" W" F
   }
' H# t& E# X4 @% U2 g   * \6 h2 l( y7 x2 p" w
   if(ret<0)" s1 O+ B( v9 U3 v' o
   {
4 c- R$ t5 |0 S      printk(KERN_ERR "register chrdev fail!");6 q% L1 B  e$ a1 c  G2 T
      return -1;% ]5 c. G4 O4 z; X! A! R
   }7 w" ~- T' z( ^1 @* X
   - Q% n$ T  s$ b
   mcbsp_cdev=cdev_alloc();* X; n, P8 M* x' n, m2 X+ y) L; ]- ]
   : c' G0 A1 J' z1 f: \4 l
   if(mcbsp_cdev!=NULL)' _; t2 K9 T# g/ F+ d
   {5 a( ?; u- g* y) C0 {, b8 o( n
      cdev_init(mcbsp_cdev,&mcbsp_fops);& A  f5 v; P' m/ N, N. @1 a1 n: X
      mcbsp_cdev->ops=&mcbsp_fops;: d- y* D, R5 b) U2 f( d
      mcbsp_cdev->owner=THIS_MODULE;7 M+ P; @2 r$ {6 d2 j: I! F
      3 K/ E1 p8 {+ V+ l- A1 u
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H, |+ H. }. O- d! r/ ?          printk(KERN_ERR "register cdev fail!");# V( T. ]. E+ }) f% Z* L- ]
      else
' \% U0 f; M( H& ?5 I' \9 j8 z          printk(KERN_ERR "register success!\n");/ d) Y0 L" X, Z! l& r0 S, k4 x
   }& I3 [% O1 g4 U7 d7 B4 n& A
   else+ t  D( n! d1 x# E
   {
7 P) m  p( B3 l" d      printk(KERN_ERR "register cdev err!");. U! w$ i" p  j$ o$ v
      return -1;3 y, v6 h. M9 c% T8 s
   }2 ~8 J, u) ]% C
     D  _; F4 [1 q) o9 b
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. U" C2 Y. W1 ^5 r& y$ @/ {: E
   if(IS_ERR(mcbsp_class))
0 O6 `, ?' R  F0 a! s   {
! E* v3 k' Y# [      printk(KERN_ERR "register class err!");
" {( q0 g. _* M/ y9 ~* ?. r7 r0 e   return -1;% c) m1 S' ]$ G$ S9 z6 l2 m
   }, E8 u+ p6 l5 l+ i7 A( v
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 E5 v( _" F' N- p* h
$ V  b1 \" ?& ?% ^; w/ z* K' F   //PSC5 N" O  k" s" Y# E+ e
   //add Enable MCBSP. |2 T8 [1 `/ g3 W$ {) |5 v
   //test
; L, D7 F# h9 ]1 ~) E0 O2 |  b7 P+ g   temp = 0x80000003;" T  M: |* i3 r
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; _7 C+ t% H0 ?   temp = 0x00000003;
1 D8 J0 ~2 u/ n  e. I4 R2 W% q   writel(temp, IO_ADDRESS(PTCMD_ADDR));& u* a, [& ^! D7 T1 a3 d

, d% y. p, E- Y   temp = 0x001FF201;
! F& L+ I9 @0 }3 {/ B# m   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 M. [1 w  U! O  l   , p0 \1 D- \# {  i& R, E+ M. a6 a+ |
   //PINMUX  " ?: K% s6 k; r' R) c' ^
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! V1 z5 e: W& {: H6 g. h3 [   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
& ^: R- E% T' h" l" `; ~   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   - B; F8 d+ o, l& b
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& L8 U! S: d4 O1 ?5 }1 U$ Z
   9 S* }9 O9 ~+ d9 N9 N" M
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
( l$ r5 T5 o' V   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  4 M$ k, {3 L. Q! {( T
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   - l/ l- O) H" F' u, E/ h/ T' @6 X
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 w4 i+ R7 p2 ]7 M

* g- U% s- y2 [   //RESETn,L138_SHK2
) o" ~2 ]6 B& W   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  ; L7 I% _1 c2 w, J1 i9 N
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   ; k: @6 `. b0 F: C0 Y
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" q5 T$ A! d1 j1 Q

, }( J1 u% M: i& `; ? / K$ e8 J4 G, r8 A6 R% k0 Y
  //SPCR Register7 A8 t2 U3 d- X' E' P1 t4 `' }
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 x2 j1 S7 O) I$ U
  temp = 0x03000000;//(DLB=0)
: E- {* ]2 I- G // temp = 0x03008000;//(DLB=1)
# R+ A  k4 \: E5 @  s, W( @  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
  L" L. n  Y; Z* _; r! k$ C  temp = readl(IO_ADDRESS(SPCR_ADDR));9 Q! l; a5 t6 e0 e4 @$ T
  printk("temp=%x\n",temp);
: }9 F! y9 [7 T: ~9 x2 O
/ {7 }% D! n* t8 z7 }* I   //PCR Register
+ @" F+ o. W/ M$ |# m2 d, x5 k   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 X# I3 @) r7 ^4 M! l5 r
  // temp = 0x00000F0F;
* K/ _; A; h' {  temp = 0x00000B0F;
# ?; {( u, G9 Y  O0 c- P) |  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized $ g" y4 c, E* R5 C* O! B6 M9 p( |
  temp = readl(IO_ADDRESS(PCR_ADDR));' b  T/ ^3 @  n/ |6 ^
  printk("temp=%x\n",temp);  5 c- \4 P) [- m; E& C
   //SRGR Register( k+ t+ r* _. k9 b' @
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ \8 s- y/ ?$ [
//temp = 0x301F000B;
5 b) |# ^/ l$ o. p   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) @4 Y0 F: t# L4 q2 Y3 Z% P
  temp = readl(IO_ADDRESS(SRGR_ADDR));) T' j& G1 J  E% Y: u: o- S% K) [
  printk("temp=%x\n",temp);
; Z- `( v0 V2 ]/ c   //RCR
2 v7 |' o0 W  h9 P, G; B; i/ J+ l7 L   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 P; W3 O$ ~, U* L3 p* }( u6 a   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) h8 u- N$ a4 p: @   temp = 0x00440040;; J7 k6 b" |7 p
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
) Y$ G' `: e6 S) o   temp = readl(IO_ADDRESS(RCR_ADDR));
- I$ d1 w% g! {( M8 Q( Y! d   printk("temp=%x\n",temp);4 q1 @# @: u+ w& u4 w  h9 R
   //XCR
- T4 x1 e( j) J   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' w0 g) V. }& b   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; Z$ o& Q$ b" e4 E: E4 ~8 v   temp = 0x00440040;
5 v  l" z, O$ m, S   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
. ^# J0 p4 k8 t$ ^) Z   temp = readl(IO_ADDRESS(XCR_ADDR));
3 {2 h/ l; \  y3 d$ t' v( ]! G   printk("temp=%x\n",temp);
" c4 ~2 l" a8 V6 ?2 @: |+ E  udelay(100);
6 x' p! ?; |: t) z0 R  //SPCR Register3 _& n! L3 a7 d$ x- D. K9 x
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
0 Z1 G' w5 T5 {5 m7 H' f4 [; x9 V+ s  temp = 0x03C10001;   //DLB = 0 VS DLB = 1+ v8 h1 T+ O. v: P! F8 t5 r
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
% e- T# R+ u) P0 B- s6 j  temp = readl(IO_ADDRESS(SPCR_ADDR));
* x1 ~* G" P- f% X  printk("temp=%x\n",temp);- d" F" G+ V& n6 n4 N+ g7 p
  udelay(100);+ S- G) ~8 y8 q) u
4 {( y. M" T" m- q
  //set GPIO direction
# G$ }) {3 g4 u  c2 E* x( `   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 l9 j- f2 ]. O1 a3 D, T8 t  @9 q   temp = temp | 0x00000100;//EPR----input9 C, v, |' j- O0 y+ x6 J8 N
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: x% c0 d6 C9 D5 l   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " `$ ^# M4 e: C) G1 E
, P1 ]" V" {, Q. d  d: P$ }
   return 0;6 h: T* m8 X) \. O% H. Z9 \0 ]
}
* o- q( b5 @/ H" F) `, @6 estatic void __exit MCBSP_exit(void)7 O" R1 h+ P  T. d$ R
{% G, u. j" D0 J6 M3 D
   printk("mcbsp chrdev exit!\n");
6 q6 P1 u/ ?7 \  G6 O   cdev_del(mcbsp_cdev);- C+ l9 b" V+ R
   unregister_chrdev_region(mcbsp_dev,count);
1 i9 `  U- Q& s9 H* G" L8 Q( ~1 j   device_destroy(mcbsp_class,mcbsp_dev);
$ [1 a5 e3 Q1 H% @9 P  M   class_destroy(mcbsp_class);
: x; p* q" J* E3 f3 F}+ n  F& |" l% X4 i: o
module_init(MCBSP_init);9 E3 `/ B6 W- P" h% K6 L
module_exit(MCBSP_exit);" K$ `- z& `9 i& N- v

. S4 f% s. ?: e" W7 A6 z! ~MODULE_LICENSE("GPL");7 W  ?; `" Y6 F- ~. ?8 |
0 z( c( w  k. D2 D" F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 o2 `+ b$ \0 [
我的应用层的测试程序如下
9 C) F7 Z* m  i#include <stdio.h>
9 j& z& Z9 \( r#include <string.h>
, t! G, J4 I' ]1 E) \7 J- s3 J#include <fcntl.h>
* }% f+ b0 B# N- C#include <unistd.h>
; U6 V) }2 d' x% j& M- O+ @' ]#include <signal.h>, U, h9 o; ^8 H9 E5 K
#include <pthread.h>       //线程9 \0 x* ^. M( b3 g
#include <stdlib.h># u! r' L, f5 Z& b$ v4 }  l& O) m
#include <pcap.h>          //捕获网口数据
9 i2 Z( Z6 s7 g3 J* W- b5 i#include <semaphore.h>     //信号
3 b* I2 P5 P% N#include <sys/types.h>     //消息对列& n; ]1 L; E9 l# R
#include <sys/ipc.h>       //消息队列  t/ I8 Y$ [5 a5 S7 ]+ ]' k
#include <sys/msg.h>       //消息队列5 W/ M6 K  ~. e5 M5 G  ^& S1 R
#include <sys/select.h>) p5 A9 [: L( @! {/ x7 L; i7 P  Y4 u
#include <sys/syscall.h>- D0 y- r# I7 O* _! y
#include <sys/stat.h>6 q2 S3 z* p( w' M
#include <sys/mman.h>
0 ~; M. R5 f9 C( N1 i#define msleep(x) usleep(1000*x)
' i& z& u1 R7 I- v% y- \4 N& D& T) e
  e9 W; p0 X) P/ h* l) F* u3 ?int main()
& T6 U! `7 o% q' [6 q{ 5 n0 f, `8 r: L( T1 I5 p) g' W$ A
    //MCBSP,ARM与AMBE2000交互设备
4 f9 s* ^9 N8 ^  r, t int fd;
# A5 S+ [' O) c* P7 Y) ]- s! G unsigned short data_write = 0x5555;
9 m* x0 I8 T2 U8 {/ { unsigned short data_read = 0x00;% E+ ?+ v0 P- I  l3 k
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, R$ A; s+ D% ]2 W  _/ T
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 u0 z* B5 T2 O$ ^7 c  u    * g, ?, D8 l5 |  ]7 |0 `/ Z! s" M  @
  if(fd < 0)0 Y* p3 ^! D  C* g
  {% C) U0 ]8 l: R' e$ t( X; u+ F1 Z4 M
     perror("open failed\n");
% g2 t$ u1 A) O+ x     return -1;
* ?; o# ?1 G: x) B! L) ]8 w: @  }
& n- m6 e8 V- e, X- c+ y  
$ x* C4 d* B( k! [  while(1)
( z1 X# C. _; b1 y. m  {
4 ^( E) O, Q' q- i0 r/ z' _   
$ P6 B; v1 A$ M) r0 R6 G1 a   //AMBE2000每次读写是24个字为一帧
5 {, w# t, G) D4 H   //写数据时将数据在底层存储起来,等到中断的时候再发送
# Y6 G" A; w- Z. B, V' A9 H, f   //AMBE2000输入数据是以0x13EC开头的
7 m0 I) h+ w6 v5 T* C+ H% Z: u   write(fd,&data_write,sizeof(unsigned short));5 L& ^' D: `4 [7 t6 X/ e3 ]$ e
   
1 }5 [7 L  ]. L& ~! A   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  2 n# M( Y; w" E! j7 w
   read(fd,&data_read,sizeof(unsigned short));) p: ?' e3 c% n0 u6 G6 t
   & `! q0 [  H+ s7 n$ F7 E: X
   if(data_read == 0x13Ec)
! G, b* M, [- y% t# x   {
1 a$ G; M. ~6 o: l* j   2 Q* R5 u7 \6 T0 P1 i
    printf("data_read = %x\n",data_read);
: b: p: d1 U; I6 q- Q   }
: Q% ~- l7 X. K4 a   ) [' ~' R) W- m& t
   msleep(10);
. F1 |; O" Q- `2 B  
+ D- X6 g$ s' N" ~" t- R1 S. K  /*
6 _0 N) j6 C% B% r! D8 B0 ~; t& t( B   ioctl(fd,1);   
* k9 E, P! D; m! h/ H8 |& J sleep(1);
& N, }  C6 q2 e. b" _' T* [# S' K ioctl(fd,0);; F1 }4 H9 e+ P
sleep(1);
% ~- w& u) r/ ?9 s6 o; x, v( {, G */
* O# o- D8 |9 m2 ?  ^. U; t9 a" H  }   
7 K& T, R% M$ ]. p' W return 0;5 ~9 Q8 L. C  ^. E* M! a, U4 d

) p1 v6 M% L% n- q" \' b2 o0 F! }}
" Z9 g0 U6 Q, v4 t1 b$ m/ p4 G& `3 ?4 u  C. b
多谢各位指教,谢谢! 急
% _9 w% u( b% n6 C! ^/ @5 d3 \$ q- m
% D! _, F2 W' g* n) p6 R3 s7 i) \) U# a/ V1 E1 b' m
" p4 `3 L* z  f: ~

  Q( H. O+ x  ^. _+ H5 H
( {' s/ Z' Y  V- ?* \9 ]+ C' N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-31 14:05 , Processed in 0.049041 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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