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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: w' G% r/ g5 D  @) V/*5 Y0 Z2 a3 y. B0 I
* Copyright (C) 2009 Texas Instruments Inc
! P/ u- [) h( u5 J2 o7 a' t *
" s5 r& S8 M7 U+ u/ e * This program is free software; you can redistribute it and/or modify' N2 |3 ^. K" D4 Q
* it under the terms of the GNU General Public License as published by
( H. _5 K- R, `2 Y * the Free Software Foundation; either version 2 of the License, or
2 _5 R: M9 ^0 h' A- x* C * (at your option)any later version.$ }/ Z2 ]0 `$ M% U
*0 n# U8 H6 t8 x2 `! o' {
* This program is distributed in the hope that it will be useful,5 p5 U) H0 F; F+ _" i9 C
* but WITHOUT ANY WARRANTY; without even the implied warranty of; @7 ]( E5 o; L) m8 j* h) s+ {  O- a5 ~
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 V, w1 }& x! k4 v  u+ L' B& ~& U * GNU General Public License for more details.
2 T0 V: C% f- g( D" m *% M5 q( @9 l+ S& @0 @1 T- |: P
* You should have received a copy of the GNU General Public License/ [$ F/ t6 n7 P2 T' \, B+ o
* along with this program; if not, write to the Free Software
9 D! C& X/ X" X" Q * Foundati, E& G$ Y9 N# n4 E; W8 z
*/
! j# `! ^9 K  g) C0 y#include <linux/module.h>2 h7 _0 ]4 ?1 W
#include <linux/init.h>3 B; G) D8 r8 d& J, b4 [8 _
#include <linux/errno.h>
$ @& ^& X. d4 Q1 S' N  K#include <linux/types.h>2 I" ~; @' y, F/ [4 C
#include <linux/interrupt.h>
+ Z9 R/ |" e1 k. y/ x$ x#include <linux/io.h>
" Q; o+ {5 p* y4 j" T2 Y8 f/ Z#include <linux/sysctl.h>6 F0 f/ R4 M* f( v1 m3 \0 }3 n7 B; [
#include <linux/mm.h>
- A8 }0 C. L; G. c#include <linux/delay.h>
( k" j/ }' g  M0 f, N#include<linux/kernel.h>
0 U& b( c$ [0 P* q2 Z#include<linux/fs.h>
: B* \9 [# w8 j" ]#include<linux/ioctl.h>
1 T: F8 @& j8 I8 U% G  U4 d9 D#include<linux/cdev.h>/ p; I8 S- {$ }* \% L/ {2 |9 g* p
#include<linux/kdev_t.h>
& _5 ]* {  B0 Y0 I% T0 m: E3 k#include<linux/gpio.h>$ j+ \" W3 `6 B* d) |
#include <mach/hardware.h>
+ |5 o4 {, ^1 _6 N% T5 r* S' Z+ ~  l) l#include <mach/irqs.h>
/ X# O$ E7 ]+ F/ z5 f% h
) M) j& r$ S0 |$ R! j, x#include <asm/mach-types.h>
* }* D3 p/ f8 P#include <asm/mach/arch.h>
3 ?8 P  h5 k9 L6 H1 \#include <mach/da8xx.h>, b, [; @7 `$ `- N
#define  SYSCFG_BASE   0x01c140007 R- M. f% `# j" t) n2 I
#define  PINMUX1_OFFSET   0x124 , i' }% b# A1 W9 D
#define  PINMUX18_OFFSET  0x168
8 q! I. i" z3 r2 |7 x4 v3 t#define  PINMUX19_OFFSET  0x16c# s) B; c8 `  t7 D' I, b$ U" g4 B
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR. D4 S+ y3 c9 M/ b
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 ]8 @4 I& F) l% e4 j#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 l" z2 g* ]' N- j" A1 E2 |2 r! g
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR1 u" s  ^9 k; x* n
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR$ G; X* f, F2 r( e
                           
) _5 E" ~( Q; O# M# n# J#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
8 [0 v# y8 Y: ?" ~7 W4 W$ l( H) T#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
6 t, i2 }9 q: _8 ]# d; Y3 y* Z//PSC
5 G  j+ g9 a  e2 J$ I#define  PTCMD_ADDR   0x01E27120  
  m& _: X* D7 V7 L/ a#define  MDCTL15_ADDR 0x01E27A3C! J! R7 h- L9 R/ s; c' A4 b0 f
#define  PDCTL1_ADDR  0x01E273045 N7 n" @& S, H, T6 U# X
//GPIO8 direction
9 T& R; G( \/ v1 ^. J$ I#define GPIO8_DIRECT  0x01E260B07 W+ K' l3 B. v2 {
#define GPIO8_OUT     0x01E260B49 ?; T0 \: b: s% n& u
#define GPIO8_IN     0x01E260C0
% B4 j2 `5 o$ d+ r+ ?  w1 E# Z
//#define MCBSP1_RINT    99              ! }- ]% l$ b7 @9 y/ T& K; t  y* _, W
//#define MCBSP1_XINT    100  
8 D; e$ i  ^- V0 S* ^/ Fstatic int MCBSP_MAJOR=239;, M1 I) W$ q2 B. o7 s  B& j  t! O$ ?
static int MCBSP_MINOR=0;
: }. H1 Y) e  Q: i6 Q6 P  {2 [; Fstatic int count =1;# a# z/ h! @1 C& u" {

$ y* D, s2 t7 n, B5 o8 G7 J8 v#define MCBSP_NAME  "MCBSP-device"7 z. u8 O4 t2 ?8 A. |; v' f

/ e: X$ a% ~. F. G8 ystatic struct cdev *mcbsp_cdev;
6 U( K  E- r( r+ c; }static struct class *mcbsp_class;
* m( i+ y' ^( l( u) b8 Y& x* lstatic dev_t mcbsp_dev;
: r# ?2 p4 `# c/ l' t" L( [/ r4 Yunsigned int DRR_data;6 S9 x6 J3 |" G) z
unsigned int DXR_data;( v' b& N8 H# ^, @3 H- m2 v
static int mcbsp_open(struct inode *inode,struct file *file)
1 r2 `4 s' {. C1 O- ]{
2 ]5 n+ s' L9 Z2 W1 y! f5 Z   ; R6 y% h0 P8 o& H* D2 F+ j9 D- `* W
   //interrupt enable,initialized
% T. X! F' x. U$ E   unsigned int temp;# Z8 w4 q0 \/ p3 n
   //SLEEP_EN(GPIO8[10])---0$ b& X7 @5 x$ A2 ]
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ f, a8 {. L9 I: k, S8 O7 M
   temp=temp&(~0x00000400);* t! W3 `$ ?. U3 W# O8 u# {. t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: `7 g, N$ Q( a" j+ t9 j  //RESETn(GPIO8[8])----0----1
) D: D8 e, R5 `! N/ {   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 l8 P: o3 P2 ?- L& R5 V   temp=temp&(~0x00000100);! Q6 l4 I# Y: g) p4 R' ~
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 S$ \6 D3 c4 }( G, }   udelay(100);
# h" K3 b9 [3 D0 a( @   temp=temp| 0x00000100;
6 n+ A% x! o( ?# O: ^3 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& m, G5 R6 m$ ]: y$ g1 T* w
   udelay(100);6 y$ q6 x4 `  K: U$ [
   printk("open success!\n");, B6 x* H8 T! U# r( z9 q
   return 0;
- ]3 W- M" Z" [1 R0 r& o}- ~# F0 o- N3 }! [$ e) W
- Z$ R' P' m' l6 ~2 V
static int mcbsp_release(struct inode *inode,struct file *file)
5 t5 P' n  R& g0 a{
! {1 M' _( M4 y/ k& a   printk("release success!\n");
. N4 G4 V' U1 P   return 0;* |( D2 S7 S  h5 F7 _: f* \
}
  r; A" m. U6 |& c  L( x! _; z$ R+ b( @' n0 J. x( q! j
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! V9 _5 o- L1 Y0 ]/ ?
{
8 \- K: U! i( J: u    copy_from_user(&DXR_data,buf,len);! i; |+ b* \+ A) X: C, N0 w
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ( \+ p/ {, }" I9 i/ k
    return 0;
2 f" F4 M2 c$ A/ i, Z- R1 @ ( F  x, O/ U' \# V) W
}
7 A* D8 k( }" g3 |: ^% T2 C
! w  d- B# g9 M6 G4 X* }! |static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 D: \2 s1 C$ k* u
{
8 m# u& g  y- c  p/ h   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 `  b- V" Z% v9 Z   copy_to_user(buf,&DRR_data,len); * p3 _4 N% w: q  d; t
   return 0;/ {: h& ?  S/ U# M1 a
}
1 I9 k  s2 b: |4 s8 C* X- Q
3 O3 X2 ?3 S* c# a% w
; l2 t. v$ n1 f! P! Kstatic struct  file_operations mcbsp_fops=
* V2 o3 p9 J; y$ r% `( }0 G& z2 X{
: q0 O& W2 s7 X* w6 }: ?" @. g   .owner=THIS_MODULE,) F. n1 C/ A# b8 Z) }. q
   .open=mcbsp_open,
9 E& L7 g* O4 e  U$ ]4 M3 v   .release=mcbsp_release,
+ \/ W, E0 k8 q9 [$ I   .write=mcbsp_write,& B$ B6 v+ g  i6 s
   .read=mcbsp_read,5 g5 v! w0 e+ L; h( N- `
};
% z/ p" F3 w* g* Rstatic int __init MCBSP_init(void)4 c( H( t9 D( C9 k2 [# a( y2 Y" ?
{9 f5 ~, |: g- z8 z; W  Y( G
   int ret;
6 x; p/ W0 E$ t, C' U( s7 A   unsigned  int   PINMUX1_REG_old;/ w! t6 _/ f. W  G' u  V/ I
   unsigned  int   PINMUX18_REG_old;. V+ [5 }& l" ]
   unsigned  int   PINMUX19_REG_old;
2 e; \  H2 ]7 m8 F' P8 J5 p" o   unsigned  int   temp;  
# u/ ^7 t4 ^3 d; E0 S% X   if(MCBSP_MAJOR)6 m) \- v1 V8 O. A) `  o
   {
, ]: F) w6 x/ O8 G  V+ P      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& l! E9 Q5 n9 C" Y
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 f1 m6 q3 e3 P0 ~! j   }
5 B& H5 k3 p" |" V1 e9 L$ m   else# H& x+ l/ u1 y7 Q4 U  B3 l- O* x
   {* M$ D% ~) J% Y! r
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);  @& h+ \0 }5 [9 j# }
      MCBSP_MAJOR=MAJOR(mcbsp_dev);( x& r9 N- S+ {& N4 d
   }$ t( i# Y0 r# E8 b4 N
   : }: a! W( c1 ]' ]) i
   if(ret<0)! p9 U5 l6 Z- [' W: H
   {% p4 R- a$ `' v( R" d9 v
      printk(KERN_ERR "register chrdev fail!");
" v9 l& M( J6 K) q      return -1;, ?& P. L) N3 e2 @+ F+ I
   }4 B0 Z) Z% H& c
   ! M. ]0 S" F; H& l" b( e
   mcbsp_cdev=cdev_alloc();
5 {4 A& d! E- m+ X   
$ A2 C6 _! @: t) ?   if(mcbsp_cdev!=NULL)! i0 Z6 s7 f4 T
   {
2 d; Q+ q7 M6 e      cdev_init(mcbsp_cdev,&mcbsp_fops);
# Z7 r- V* B$ i8 Y) G, c. @      mcbsp_cdev->ops=&mcbsp_fops;
- H3 q% X- @7 P; `  O+ S      mcbsp_cdev->owner=THIS_MODULE;
% h3 R/ [5 Y; O6 H4 O' I      
0 o5 ^0 V8 T: Y  d, L$ ?$ [      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' W, u5 v. i  I% |! z3 O3 _/ P
          printk(KERN_ERR "register cdev fail!");
6 p2 i' U) p0 l+ @3 K      else
; B3 \1 ~% ]5 o4 w/ i) w          printk(KERN_ERR "register success!\n");
& p+ B% q! r; T4 O% e" p   }
- |/ y% D, X' Z4 g8 s4 C   else
' b/ \; R: \  U! {! Z   {0 b7 K6 m, W/ p
      printk(KERN_ERR "register cdev err!");
6 V2 [# n) z' k4 s- R) P" Z, W! Y      return -1;: }" x- L; E3 S0 ]+ W& S
   }! E7 {. D' C" _7 Q/ {
   
1 X( y% `* d* S  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 d) X+ p) y! R' u% u% ^   if(IS_ERR(mcbsp_class))( J  b4 s( t0 F% p% `1 V: i
   {
" z; @; A3 e( Y% M& J      printk(KERN_ERR "register class err!");( M& w1 e% [0 }
   return -1;
. F$ {* S4 Q0 B7 |+ g0 ^0 L* U   }$ @( M: C# S5 H9 F* G* _4 j/ e7 e
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ j% S: X7 G7 N# ~. W+ K4 r+ W/ }
, D; y0 l/ u! m" h
   //PSC" x: s+ ^$ ]# J& u0 j
   //add Enable MCBSP" _7 Q% B& y5 j
   //test( I5 e+ z+ E9 b) ]7 e4 O# n
   temp = 0x80000003;
0 T" X# C# z6 m0 b* u; o7 x, P+ b   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# Z; ^. }2 Q$ v   temp = 0x00000003;
7 @* `! X  Y/ g' ^% r2 h. }4 h   writel(temp, IO_ADDRESS(PTCMD_ADDR));# Y- s6 V% d" C
4 ]" B8 W7 ]2 ]. r# T
   temp = 0x001FF201;' N" h, v2 Q7 e7 P
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));: h! I- l" ~( G; F# J  E2 Y2 Y& Y
   
4 Q3 r7 {$ P0 `# D" h   //PINMUX  . h8 n" V+ G- d* _+ O0 h/ \. I
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 \: M+ o6 f" c- j, s+ H- L   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
; b  p# x3 u; Z; @! h; X   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   3 v' ^" q* n( t* u0 b+ w
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: \2 d! l# d1 O( @& Y6 g8 ?
   + Y2 E( \1 T. L6 b/ w
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
! z9 U8 \+ X( w6 ]   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  & Z$ a" |7 W8 M1 x" K
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
: O4 O' o8 g1 f% [" X3 T   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 Z' v: v& Y" l, N
9 P6 @% S( c* l9 c6 n( `   //RESETn,L138_SHK2/ ~% ^: R  t# s/ ~. p& ?
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
/ G* b' `' `! ^1 W' U( f   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
2 F- t8 A7 Q: |! _8 z3 i# U0 i) t0 a   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);2 A- N& u+ t' K+ J
4 r  M6 @5 f+ M) R  l( e

6 B  M5 b; {2 L& P  //SPCR Register
. n0 v2 B+ U7 |8 ~9 N$ J  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* Y& @0 O0 n5 R* t. ~0 y4 q; m  temp = 0x03000000;//(DLB=0)
( b* r+ f# S. S& j* T // temp = 0x03008000;//(DLB=1)
7 w/ }" H2 o& n- G' r; A% _4 F  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
% `( O# ^9 M  W# \% Y  temp = readl(IO_ADDRESS(SPCR_ADDR));
: e' ]! m. _. O% {8 V+ ]5 i  printk("temp=%x\n",temp);
- A# B9 t2 }8 O
# c% m: c( h: f- X   //PCR Register
& C7 v% Z8 D3 H- @4 f   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 i" N5 Q# E' h6 x; ]  // temp = 0x00000F0F;
8 d7 H# V! D0 G$ a+ L* J1 L  temp = 0x00000B0F;* F) r/ P- Z& H1 K- F
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
4 v2 h' E$ S+ u( c7 W3 M/ R/ ?  temp = readl(IO_ADDRESS(PCR_ADDR));7 w- L9 h9 u  n1 L- {) T" _
  printk("temp=%x\n",temp);  " P9 |4 D9 u& j0 F* t
   //SRGR Register6 _5 i* |$ u7 h' M
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 ^- y6 e. `: `9 E: b( x //temp = 0x301F000B;
* ?7 j+ C3 \* @   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
2 j* d) n' n2 {. j- T% t6 I6 O  temp = readl(IO_ADDRESS(SRGR_ADDR));3 S/ A& t: u& b" V
  printk("temp=%x\n",temp);
! H0 Y2 d; E* K8 ]# M! F   //RCR
+ ?/ h/ G  f; M( K3 h   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,8 s! j3 V; [* W0 v. h) m  a
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( ?# j5 A, C8 ^   temp = 0x00440040;! F* f, q  A5 I" X4 M# E
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
5 z  u2 j+ Z  z* s   temp = readl(IO_ADDRESS(RCR_ADDR));5 I- N; t0 K+ j, M; _
   printk("temp=%x\n",temp);! q% q# ^# r6 ]3 ]  M- P
   //XCR
5 o$ \8 r4 ~# k5 L1 D   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ g( m( l  p& b1 d, I( ^! U4 I  r3 ?   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 z7 @  K/ R( F; x8 b8 O6 j   temp = 0x00440040;
. z! C3 l; d) c* C- }5 Q6 h0 y   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   3 R$ ^  K1 i. D/ n* k
   temp = readl(IO_ADDRESS(XCR_ADDR));
; z2 `, \, F* S& I' j   printk("temp=%x\n",temp);
- c$ N" ^1 y; N" }! D) r  udelay(100);) P+ [2 V, T6 }+ R6 Q7 d
  //SPCR Register
; ?( j6 d; L& _0 c  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 ]8 X4 {; ^0 V! b- a& J' x# t  temp = 0x03C10001;   //DLB = 0 VS DLB = 1$ f- x: }7 H9 O* t- P3 |
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled1 \( l+ q8 Z% D- l
  temp = readl(IO_ADDRESS(SPCR_ADDR));2 z7 A  K! n$ v) M, s' ]
  printk("temp=%x\n",temp);" H7 O! p" R7 _
  udelay(100);
0 ~0 r- P% f% I1 l3 f6 `
1 C4 H+ e7 [! X3 t  //set GPIO direction1 J! X9 A+ g: U0 a4 ~) W1 I
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ U4 Y1 m$ u4 H/ w# l  o$ G
   temp = temp | 0x00000100;//EPR----input
: R% z; a) j6 ?! q   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 f/ ?2 s, g& h/ d+ v8 o. I
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) X; P4 G6 Y( d5 D- [8 {1 r $ y3 S/ Y! {/ o  k3 e& j% I. j
   return 0;( b4 u' |% p7 U" N9 }) i! n
}8 Y& `! {- h6 v
static void __exit MCBSP_exit(void)
% ?2 K5 F9 \1 p: K; h{
* o$ H) K6 E. z9 U   printk("mcbsp chrdev exit!\n");
5 q6 y  i% [7 n; H; g( D   cdev_del(mcbsp_cdev);
) A+ s  @) I3 Y* H9 u   unregister_chrdev_region(mcbsp_dev,count);
" u) H4 l, X( j+ n" w   device_destroy(mcbsp_class,mcbsp_dev);7 I7 X; p; ^8 O% T
   class_destroy(mcbsp_class);& G8 Y- B7 c% H1 W3 a5 H
}8 @3 f2 |$ U- Z( z1 D, H/ f
module_init(MCBSP_init);3 f) J' a, @& j$ e
module_exit(MCBSP_exit);" K: Q' C: M; l1 z2 _, V) _
* w$ d" I1 C9 O3 k. H9 P6 V  H
MODULE_LICENSE("GPL");
- H+ N: I$ v9 ^! r) b) m
# ?; {# {. X  F; t' H$ e7 \0 Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 G  i) Q3 H7 `7 G4 {1 h我的应用层的测试程序如下
; q/ M7 f/ V; x3 ?8 Y8 f#include <stdio.h>
" _+ ~3 [7 V( ^. s' f& k' t2 j! v! Z#include <string.h>5 F( F. S8 e* o' J
#include <fcntl.h>
2 g+ ^5 f5 I9 d# a: E#include <unistd.h>/ N7 U5 q. Q+ I' m6 c. g" `. G
#include <signal.h>9 @* E# H6 I9 t6 p! P
#include <pthread.h>       //线程% E# d; A. G" `' o" v
#include <stdlib.h>
/ Q6 f2 q% l2 W. v" ^. f+ g* s#include <pcap.h>          //捕获网口数据
! D6 p+ O# {5 ]- P/ r#include <semaphore.h>     //信号
2 `) z+ x6 b3 F- \#include <sys/types.h>     //消息对列! E, s4 m5 O4 O0 K* d. u4 @5 S
#include <sys/ipc.h>       //消息队列! @% V# K: B% H; {2 s
#include <sys/msg.h>       //消息队列
( e# Q! f  ]- G( d#include <sys/select.h>- y7 Z: Q% w5 _- S7 O: A
#include <sys/syscall.h>
4 X  J& b8 E) _$ `0 Z4 h$ k#include <sys/stat.h>( c7 r2 Q; |; {, Q6 p. B1 X4 [
#include <sys/mman.h>/ f! t3 s# G$ [8 p5 ?
#define msleep(x) usleep(1000*x)
( M5 S1 Q' M+ F5 X$ \' `- n" D3 n- J# y5 Q2 m5 T
int main()9 \, V" J8 t/ f4 h* n1 ~* Z
{
* `1 ]1 j5 r' q    //MCBSP,ARM与AMBE2000交互设备
/ t. }. E( Q$ i% p( |9 X( X int fd;2 a/ m2 n3 n! f5 k9 E2 d
unsigned short data_write = 0x5555;! u9 y& H# @+ l" |# L6 Q
unsigned short data_read = 0x00;
" [3 b5 E2 r9 a9 d' E  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* w! U* e" W; f9 H/ f5 S: ]* q( E
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; ]# G0 C- ]( D3 N% Q( v5 Z$ F
    . Y5 r+ P! W4 b) M  I
  if(fd < 0). }+ o* y5 g5 x5 B4 L7 {2 m
  {
! e. @% l' u4 v" }     perror("open failed\n");- P  d! y7 O: m, I% n
     return -1;- g& ^; Z$ P% j! _: t1 l; G
  }
* L  B! I  S6 `* H2 N) u. s: A  
$ G4 Z. i* T, F, ^& D  while(1)
: ?0 c7 _! b. [7 g# E% ]% p+ x# F  {7 |$ x' T0 ~. q% A
   $ N- q- Y. M, H- ~' D  x7 [5 v. w
   //AMBE2000每次读写是24个字为一帧1 d3 _9 v8 Q9 T
   //写数据时将数据在底层存储起来,等到中断的时候再发送' q( E7 S) i8 L  J% y) w
   //AMBE2000输入数据是以0x13EC开头的
4 E9 h' A5 }' m6 _" {  p   write(fd,&data_write,sizeof(unsigned short));! v- }/ X/ ?6 Q. H! Z
   
  M& ?; ~' M" Z$ j! S   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  $ F) \! ~; ]! |/ j/ W% h; W
   read(fd,&data_read,sizeof(unsigned short));
5 `3 v7 \6 L5 J. M+ T   
7 B1 f) E9 Q4 V( z+ D   if(data_read == 0x13Ec)* U7 T2 j0 R% o
   {1 ?) L/ B' D  E: T# G1 {
   
1 h+ Y- {9 J! m4 R& E: h" h! r3 S    printf("data_read = %x\n",data_read);1 d, t6 i) b" Q! Y2 O3 i
   }
7 R3 e* N6 w0 h" E   6 W6 L$ `0 U  j6 S# ~9 `& D( V) `
   msleep(10);3 g( N7 C+ h# ]- ~$ `0 b0 N6 M1 t
  3 W$ W* o. \' l2 Q
  /*: b7 a& K/ a# \8 L+ M( l
   ioctl(fd,1);   1 G; R) R2 ]# [4 X% i
sleep(1);
- k" H5 t; y$ Z1 u) N ioctl(fd,0);8 l+ m: m% u: k  R  }9 R
sleep(1);, c. w6 [2 b* r+ _% B' [3 R
*/
) W8 O; L# _( @; i$ i  }   6 U6 o  A- K: \7 D
return 0;: k% {) O  C! ^, W! d' f( q9 a
  E% h8 z; v! P& u+ b+ P! y
}
( P) q8 }( `1 v% ]8 F8 ]
# Q. Q4 E7 `% ?$ W8 B* Y多谢各位指教,谢谢! 急7 M" k, x: u5 R  E0 x* v. M2 t! R
: W1 u( i$ j6 N3 A* ~
' o  V! b5 |- r4 O- e* `; n

- V* E7 W; ^3 N( @+ A7 _1 {& n6 W- [* o& f" B3 ?

- O& x% F2 i: {1 Z# V& H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 02:10 , Processed in 0.050353 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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