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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & ^2 _  ]- l3 ^
/*7 w3 [$ {+ m0 }' B8 d
* Copyright (C) 2009 Texas Instruments Inc
5 H* T5 [' _0 R, X, ^ *
, }3 z3 X1 Z& f. u# i- ^2 m * This program is free software; you can redistribute it and/or modify
4 ]. ~. B. W* f9 ^ * it under the terms of the GNU General Public License as published by  E6 b8 z/ p4 X+ W! a' M) O0 ^
* the Free Software Foundation; either version 2 of the License, or
' j; M& W6 R0 M" ^' x3 D' K * (at your option)any later version.
9 l& y5 p, a  g3 e* v0 i9 h$ w9 n *
$ {" y. p" d1 b( h& Q * This program is distributed in the hope that it will be useful,
  z, I5 s" S8 d! X * but WITHOUT ANY WARRANTY; without even the implied warranty of
: W# x) h4 a1 a& E * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 V" ^2 |* j% ~5 J0 w * GNU General Public License for more details.
. `; z' r7 a5 y( D1 g *
1 T9 i) b" s) f$ l) L! `, W6 S * You should have received a copy of the GNU General Public License+ t- r- P* f$ ^
* along with this program; if not, write to the Free Software. E7 C7 ^" s. T
* Foundati  y$ U& @/ r# v3 E' ~7 D$ u  i
*/
0 y/ b0 c  p  W% _+ l" s#include <linux/module.h>
( W+ Y8 n' z1 T/ {' E' F# C#include <linux/init.h>
0 {  B3 L8 `$ z- Z% z1 v) _#include <linux/errno.h>& }3 |" C8 i- y2 |
#include <linux/types.h>: c0 `5 c) `: M! D5 A% D
#include <linux/interrupt.h>
3 \2 F: e$ S5 _#include <linux/io.h>
- _9 y  L2 d+ ^; W: F0 ?3 s#include <linux/sysctl.h>
+ c" D* @2 c) i8 C#include <linux/mm.h>
6 r- O0 p/ G( |/ F5 m. j# k( o#include <linux/delay.h>, U! [5 ^# N9 w% D' ]
#include<linux/kernel.h>
3 N1 m) |. e. W#include<linux/fs.h>
: m( t" g8 p8 B+ W#include<linux/ioctl.h>
5 o& L# K1 _+ ~  w8 E8 R: y* H( Q#include<linux/cdev.h>
9 m% v& i0 ]' @6 e) `' w#include<linux/kdev_t.h>7 t9 _& q2 i* h  M0 ^: U* Y
#include<linux/gpio.h>
* y: G$ Y1 D; x/ |$ ]#include <mach/hardware.h>
; @4 L* B0 i4 k+ p; k! E- Z2 l#include <mach/irqs.h>
3 Z( C3 x( U% U) n( l% Z/ ]# X
8 t# h/ s) P+ x! ~2 D#include <asm/mach-types.h>
7 P# z7 X; k5 d6 ^, Z$ p- W#include <asm/mach/arch.h>
! T1 D5 I, u& P& P/ j$ H4 _8 @#include <mach/da8xx.h>
2 U+ o- h/ b3 f% l) m#define  SYSCFG_BASE   0x01c140006 i/ b2 w4 j/ R
#define  PINMUX1_OFFSET   0x124
! @* u$ V4 E6 \( z6 ?#define  PINMUX18_OFFSET  0x168 : J, C* o8 q: L9 S6 C  t5 b% h7 N' O
#define  PINMUX19_OFFSET  0x16c
/ d* u3 \- j/ r1 B! h#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR* |1 H/ [" T4 Z' q8 i% Z
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR2 p+ y4 B5 S+ C7 i4 o7 c
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
* w( Z" Q0 x6 u0 n7 D' q#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
+ ^$ Z  K0 ]! o( F4 r. s- {#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
  b- k" A' V  j                           
! z) f0 N7 a. z#define DXR_ADDR      0x01D11004  //MCBSP1_DXR' K. E) o1 b; g' b. i& k
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR9 K7 X: K* e5 r
//PSC
1 h" [& _6 K% w- g1 x. D# `) |- C#define  PTCMD_ADDR   0x01E27120  % ?6 p8 L& u8 c8 h; c: q2 M" o
#define  MDCTL15_ADDR 0x01E27A3C
% F+ D+ i0 _; c+ R, x  D#define  PDCTL1_ADDR  0x01E27304* u: |2 L: G3 y# `
//GPIO8 direction
0 U/ q" G* V2 T5 ]3 y1 H9 W# P#define GPIO8_DIRECT  0x01E260B0. W- p* f, x2 ^6 t( z" z
#define GPIO8_OUT     0x01E260B4
. b: W+ Q2 Z( S#define GPIO8_IN     0x01E260C05 H2 ~) G9 C4 Y8 V, [- f9 W

& h# t# A) d6 |5 [  _7 ?" T//#define MCBSP1_RINT    99              8 Q* n% B: W: F
//#define MCBSP1_XINT    100  
( l8 G! H: p- x9 U; Pstatic int MCBSP_MAJOR=239;+ x1 S; H% n9 c$ n0 P/ k6 n4 `
static int MCBSP_MINOR=0;
! u6 Y# r- [9 k8 k4 S& X+ {static int count =1;
7 z2 w' j# Y8 m8 e- Q& e/ B+ \, _; o, i5 _% G, b6 t3 N
#define MCBSP_NAME  "MCBSP-device"
: W7 [* ^& |5 p$ c, g) M  D, A( h$ \! R  K7 Q" S
static struct cdev *mcbsp_cdev;
  L, i; U) S5 _2 N- p! xstatic struct class *mcbsp_class;
% w/ u. Z$ g6 y4 ]7 Qstatic dev_t mcbsp_dev;
2 s  [5 s7 A& n, u0 Y$ H1 Hunsigned int DRR_data;
! B: O. R3 i/ k: ^3 Qunsigned int DXR_data;! o9 ]$ v$ k2 u' F
static int mcbsp_open(struct inode *inode,struct file *file)3 b0 x+ h- v' i0 N8 n
{
4 b7 W) v* @$ x- C8 V. V1 I   1 u( g3 l. n% @+ i/ G! o
   //interrupt enable,initialized& Q) O$ W( s: v4 L3 c
   unsigned int temp;
" e) l4 u& |6 p& p: e+ ]* C1 W   //SLEEP_EN(GPIO8[10])---0
. l6 E3 {: o7 c4 m1 F, [   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 O0 Z! L/ ?. S! Y- H5 p" h) [
   temp=temp&(~0x00000400);6 _% B1 c  L: [
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 e0 L6 t# t  ]7 |  //RESETn(GPIO8[8])----0----1
+ N3 x$ `6 F$ [! U   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 @+ l. p7 k( f   temp=temp&(~0x00000100);
2 ~! C# H& H4 r. R3 h# N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---07 \, [$ w  ?4 n' w
   udelay(100);) q8 }: M* T- b; K2 t
   temp=temp| 0x00000100;0 w* s" T3 D+ }7 e& M, |5 h
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ M! Q& o! D" o$ L5 Q0 l
   udelay(100);
8 v7 P' N3 Y% S5 ^: I   printk("open success!\n");
" ^* q* w4 t' u. m9 _$ f   return 0;+ k6 L  l; w- j
}
! h; Y* M& ]) x
5 d1 u8 B: E) \) s7 dstatic int mcbsp_release(struct inode *inode,struct file *file)
  V: O* k$ ^$ h( _2 N# t{
4 w( [6 N" Y+ u$ \' @* R% }3 b   printk("release success!\n");
+ h. A) `* }4 a6 F5 k7 \- S+ R   return 0;5 L8 k0 T; b8 p' K0 ]8 T) S% Z% H: G. |
}- Q9 o( v! L+ v' w2 P% s

3 }% U. Q3 w6 ~" fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: J4 t9 a' y5 f0 }8 `- R{
7 g* _) f) C0 V# O" M+ Y+ }    copy_from_user(&DXR_data,buf,len);
# Y. D7 j+ Z9 _+ [8 t/ C$ `: X    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       + s) b: g% F0 N/ u
    return 0;* S5 q7 R' [( Y& u, {

0 M; I6 E" T# L8 f7 S. _}
4 e1 A/ a9 }7 s' ]2 \2 K( E. f* @+ v, F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; X  k  T1 {+ _5 W4 x& M5 I' J4 U{
8 Y7 @9 u9 m+ @' e+ L" g+ S0 a7 f   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));6 q3 z/ b8 d* V9 q$ P
   copy_to_user(buf,&DRR_data,len);
1 H, H# d" C) B9 A/ ~5 p   return 0;
8 D2 D% m5 ?5 j7 Y% T}; v$ W! v4 Q/ a4 I8 p
2 C4 n$ ?% C. p4 A

7 b/ S; ~) b4 \. b: k8 p* tstatic struct  file_operations mcbsp_fops=
; j. D+ N+ ]$ v0 u0 ]4 A8 n3 v{
; g' K9 q8 h0 K& b7 b5 b2 s( t( W   .owner=THIS_MODULE,2 R& e, g5 k$ [
   .open=mcbsp_open,, t/ ^6 w" i# ~+ v' G- H
   .release=mcbsp_release,
8 \  U6 c# B7 I   .write=mcbsp_write,
. M4 v# X- ]6 J" r* e   .read=mcbsp_read,; ~- e" k$ v- ]# V
};
. u( B: U. L- v$ G% X: W% Sstatic int __init MCBSP_init(void)
, R& Y4 d7 z6 c# \$ w- J{" r- Q! k- r+ ^/ a9 E' T% N
   int ret;
  ?5 w6 {4 d7 w   unsigned  int   PINMUX1_REG_old;3 i, L; j( C9 g) U9 j
   unsigned  int   PINMUX18_REG_old;, [8 L! y( ]3 g4 l1 }6 Q+ x
   unsigned  int   PINMUX19_REG_old;7 d7 h# I! O( w/ R, G
   unsigned  int   temp;  ' J" E& P& ]* f9 k: A
   if(MCBSP_MAJOR). J" {& u4 U) Q$ G  j- }! |5 G" r) r
   {
- e' B9 k8 D" B8 l: ^      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);; h7 S. {. |- d# a/ |& Z
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
) N: u$ N8 B7 h9 s% k# }' u   }- o; m3 y) I. p  x. k8 @
   else
5 u/ j8 a( U. Q0 B   {
8 B0 ^9 Z, K/ g. u$ F8 M# o      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
4 h$ E9 C) K1 X4 X& b( \      MCBSP_MAJOR=MAJOR(mcbsp_dev);
9 ?, {3 a8 `- l1 k5 F+ `   }# ?% E5 v, n( Q5 |# y
   
+ O. O9 |5 k. ?   if(ret<0)
! n, y0 ~1 \8 o" `. a# G$ j   {
0 m  z% n- F" C5 _$ a      printk(KERN_ERR "register chrdev fail!");
9 X) f( y+ J( ^. D3 t      return -1;% L% P; s  P$ t, U
   }
0 x! q- f4 i3 v% S   6 t0 H1 i! I" {0 N+ i  {
   mcbsp_cdev=cdev_alloc();
! V9 y' p* J/ D* ~   0 D" T1 B2 M) C. ?
   if(mcbsp_cdev!=NULL)
5 i- U8 z4 I1 V5 l2 E   {& d7 \; ^9 g! d  P
      cdev_init(mcbsp_cdev,&mcbsp_fops);/ |) f% K% K  u/ v
      mcbsp_cdev->ops=&mcbsp_fops;2 L( F( q  d7 i9 a
      mcbsp_cdev->owner=THIS_MODULE;
) c1 r- U" }2 }9 L8 i0 s      , V! A; T2 f) Y. b
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). G; E; z, D1 a6 ~
          printk(KERN_ERR "register cdev fail!");' d! ~# y3 V7 p8 b2 G9 p
      else
' j- s. G$ V# M# c9 [" H          printk(KERN_ERR "register success!\n");
' U* p: J; K9 I2 C5 K   }" Q1 S( I' q  ~3 q$ j
   else: p  j/ e6 z. F+ r" f- E6 `9 B; Y
   {
6 X/ k+ [2 {0 ?% y; i# {      printk(KERN_ERR "register cdev err!");6 I- z4 \+ {, v" X1 ~  ^8 i
      return -1;" L: ?# S5 o# Z/ G& i
   }3 A4 w% Q9 o5 y" z) U/ l$ }% }8 U+ m
   
! m, s/ \: Y# ?  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);, @& A7 C* P! `
   if(IS_ERR(mcbsp_class))
/ T- z' n% E7 K7 A2 t% \+ i   {  P- {) V* Y( Z$ z- ?
      printk(KERN_ERR "register class err!");7 r2 @6 W7 \3 r, p# n- S
   return -1;
( J, i1 x9 M$ H, O" P   }7 A2 H2 R, X2 N7 }9 r& Y4 l  z
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
% o1 j2 o0 U" P2 i) G9 I1 K1 }& @2 k) k* ^2 N5 x: D/ c+ a) v
   //PSC( e7 t6 ?1 Z" g2 G/ E" h* I- s
   //add Enable MCBSP* r3 `3 {; {" R3 z
   //test" g# {/ E3 [7 I
   temp = 0x80000003;
- v$ m/ v+ q) B& u& B$ |   writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ x4 ^7 |! L( o& s8 C
   temp = 0x00000003;
! M* c! ?+ Z& r4 u! e/ l; ~   writel(temp, IO_ADDRESS(PTCMD_ADDR));' G0 [: a$ s. P& ~; \
3 L/ V. G% b1 V( g4 m8 D) W
   temp = 0x001FF201;4 z. [5 `6 v5 L
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( I  Z. N4 b: t1 N1 `" U   
$ ^; A) j" X6 b; @& t" r* Z   //PINMUX  
+ N$ X' w1 D6 F! H) V  K   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 }7 Z' J9 \4 i9 p; f$ O3 `  a
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  3 G7 t9 }- B2 I2 @5 D2 R
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
6 b" t8 \# d" m: R8 M! }: @   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ o! \7 b# B! q5 ]/ i+ m   ) h* Y8 u' b% r
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ e) B5 d8 L" R+ b7 ^" j   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
8 P4 I& G. q( q9 P6 Q1 D$ s( A   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
8 ~- U& A  w; P7 w3 u) y   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);, X" T4 M/ u2 }8 F1 o# p& O9 Q

+ M0 K/ X# e$ r0 l) _7 ~8 b5 J9 z   //RESETn,L138_SHK2
! o$ x  T6 t9 ~' u   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  3 m" M& i1 U/ `2 j/ `0 ^
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
  l6 j/ B- U$ D- n3 v: ]1 i   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 S- M! W  C- N- l9 P
  n4 ]% _% p  f7 d
2 D% @. ?" U" r* s7 Z; ^) U  //SPCR Register
$ U" h( a6 E" v( ]. w  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 ]! f! Z" Y: A/ m' V! D
  temp = 0x03000000;//(DLB=0)
/ }2 c7 M* d# E5 p# W1 W2 ]+ O6 U // temp = 0x03008000;//(DLB=1)
$ |4 W, I( c# p  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset* R8 v4 E& ]! ?5 x! u  P
  temp = readl(IO_ADDRESS(SPCR_ADDR));' }0 l/ O% y7 \' ~
  printk("temp=%x\n",temp);/ s' [/ X  U- ^

, M& \+ @" Z( B   //PCR Register6 s6 [" M6 I) B% h# t2 ?
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 r3 r8 l7 C; b# l  S# p; q
  // temp = 0x00000F0F;
% |- A% A. S8 k0 {5 r: L6 o  temp = 0x00000B0F;
7 @/ m9 Z) X" F  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
. l: l. A" I  f5 a7 e  temp = readl(IO_ADDRESS(PCR_ADDR));' n! b+ f, l9 B% r% {3 z6 l* h
  printk("temp=%x\n",temp);  . I8 l6 S9 E( i/ c& x- W
   //SRGR Register
) p" P) O) c# F   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ q4 Y: n0 W" N5 u
//temp = 0x301F000B;0 V% b# s! Z4 j& q! [
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized , @% f, M3 h6 B. T
  temp = readl(IO_ADDRESS(SRGR_ADDR));" {1 n6 @7 T  x* E6 ^1 r7 w8 Z) ]
  printk("temp=%x\n",temp);9 Y& }& Y' d, ^% F8 W( Q, Z8 K
   //RCR
  X5 \" T) [4 n" l' ^   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 K, S: \; H0 h+ O& S4 ~$ R   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- N' y$ d% A$ S5 z8 ~/ t* D% C   temp = 0x00440040;
+ @% o! T1 m& ]! p   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
  x7 F6 _& j  g+ q% k: J0 m   temp = readl(IO_ADDRESS(RCR_ADDR));5 k; D; V* t" r- V. }, f* H
   printk("temp=%x\n",temp);
8 K6 P$ ?& d7 x3 u   //XCR# b9 C$ T8 ^9 @" y& ]5 j# b, y
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
7 t8 y$ A/ l5 h9 j2 Z( ?$ [   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 C, i& i6 B7 ]* B* v
   temp = 0x00440040;- t: x% q% Z5 ^8 m
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   & r* K4 Q' @$ u6 i5 V$ H
   temp = readl(IO_ADDRESS(XCR_ADDR));
- s, B  G/ {; n( ]4 N   printk("temp=%x\n",temp);
( [" E/ z7 t" e; I' V6 z, }5 i  udelay(100);
6 j9 W5 Q; H. W( f' n; h, g) W  //SPCR Register
* B% b; n6 {9 {$ k9 `. m; u- U  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 Q. g' x! S" \9 a
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
3 J& R7 s, x* J- Y  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled; s9 l7 j! q6 @" T
  temp = readl(IO_ADDRESS(SPCR_ADDR));
% U! K2 {/ F, u- K- D; O8 ]) q  printk("temp=%x\n",temp);
" f0 {( u0 K# [) x7 Z3 I  udelay(100);4 c' {2 l- ~2 }  Y
. v9 l. S1 \: i" A8 c
  //set GPIO direction) v3 Z* T3 K* ^! Z2 O0 l( q
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 T( e" Y+ r. w) S1 |
   temp = temp | 0x00000100;//EPR----input
, O7 m+ U" g( L' I4 b$ B, c   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 \5 Y$ W- A9 o8 }/ z
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# Z9 H+ M& F% w. Z9 e1 Z  `9 \' Q
8 O$ l0 r' J  ^" `" E   return 0;
% V7 C. Y( P4 p5 ^( Q}
0 |6 s/ |5 b1 q3 H6 {8 I. _7 qstatic void __exit MCBSP_exit(void)
! e! h. |) y' G/ x2 u6 O. p  v6 @{( s. E5 f9 |$ n& V6 L
   printk("mcbsp chrdev exit!\n");
/ u% f+ ?7 F! Z* W   cdev_del(mcbsp_cdev);
' F3 S+ ^0 S+ s' M2 ^   unregister_chrdev_region(mcbsp_dev,count);
2 h$ j" O/ G, I1 h% V* ?; L0 s2 z   device_destroy(mcbsp_class,mcbsp_dev);
' y6 U8 s! f) ^1 h: l5 M& H7 o   class_destroy(mcbsp_class);- v6 B( e, k; \, M* f
}
8 X8 B, B$ ^! O" U  ]module_init(MCBSP_init);+ p2 x9 s4 K5 f
module_exit(MCBSP_exit);# R# _& Q( I. y2 O  [# H7 _3 v
% S( }! j% p$ c' G
MODULE_LICENSE("GPL");
0 Y% |, d" d) J; C& K% x' g  j  ~
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 `# G; s* t8 y( N( c2 c. @我的应用层的测试程序如下
: _% Y& i4 `2 [9 H! U#include <stdio.h>
* E- g5 E- C7 h9 V1 j#include <string.h>
4 A2 t0 U+ S" h4 s, g1 q#include <fcntl.h>4 J/ q  d. q6 }) e$ x
#include <unistd.h>3 I" B, ~! h8 [- Y
#include <signal.h>! d9 V$ Z8 f$ H4 d* x
#include <pthread.h>       //线程. j& U$ b) `& K) D( a" _' a  p
#include <stdlib.h>
6 Q7 x" m7 f. M! @0 p% e6 O  A#include <pcap.h>          //捕获网口数据
) @) ]; `' V. n; ^' Z, c5 r#include <semaphore.h>     //信号
" l4 C( e1 @$ N#include <sys/types.h>     //消息对列
& g3 x. z+ T9 n; L#include <sys/ipc.h>       //消息队列: C. `) g0 _$ k" |
#include <sys/msg.h>       //消息队列
! Q) r. ^6 o/ [6 O9 y5 F* b! |#include <sys/select.h>
$ r. w9 Z( U3 q! _6 h$ c/ H7 X9 a#include <sys/syscall.h>9 ?: t4 v" Y) `0 N
#include <sys/stat.h>: n( i3 i: Z' D. Y
#include <sys/mman.h>
+ @7 X- R. s, _+ ?) S#define msleep(x) usleep(1000*x)
* C- Y' H/ O' I  I# S4 A: @1 Q; ?' O. {$ I$ C5 Z* r( n! v& D
int main()
  r; L( `" ?) I8 r" n1 t{
; ?" a+ O+ a  q* [6 R    //MCBSP,ARM与AMBE2000交互设备
# ~! k, \. ]# P( a' K3 ^8 H7 E" c- j int fd;3 x! {- W: m4 i8 b2 B; E8 S
unsigned short data_write = 0x5555;. y7 P' G4 r8 O+ [( |
unsigned short data_read = 0x00;
6 G+ I/ Y1 Q, `0 q7 [! y  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" e2 |% F# ^6 h3 M' [' F //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ `, [0 O: \. I+ k    + y5 x6 j) a) c) ]
  if(fd < 0)
0 |# p) i3 Y! z. K  K  {
. D. G. F* C0 j' n2 O; C     perror("open failed\n");
# w! \' ?# a0 `, k5 {     return -1;
3 N4 z+ ~7 p  Y" N; V9 A  }# n* H* R+ b9 n! A! Z7 t4 \
  
' Y+ O+ b7 x3 T7 v" U  J  while(1), i# a% s. p1 B, ]; N6 ]
  {7 u6 ?4 O( ^# b0 `( j0 e
   7 i8 K* `' n0 |0 R
   //AMBE2000每次读写是24个字为一帧+ N4 T: ^: L# [& M% Q/ ~# h% ]
   //写数据时将数据在底层存储起来,等到中断的时候再发送
9 V$ y* j& r; b7 ]/ @* _2 z$ I8 }9 e   //AMBE2000输入数据是以0x13EC开头的
8 b& D2 c6 {9 C9 }2 v: l  J3 P   write(fd,&data_write,sizeof(unsigned short));. [" w0 p  ]9 J9 W9 N, @! E
   
: c$ N4 g2 C$ R% I0 Z# H   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & \/ e, b. H" u2 Q- t( }. I7 m
   read(fd,&data_read,sizeof(unsigned short));/ T; `7 q  g/ ~. N9 v
   # p$ M4 [' W- ^0 @( Q: n) f' U$ M
   if(data_read == 0x13Ec)" d4 [9 l5 {# ]3 [! A7 B/ f
   {
4 t, }' V8 W, C  o! q   
- T! e0 ^: T' p# y    printf("data_read = %x\n",data_read);
* a. L; z3 F+ ?0 |8 W   }- B8 a( S. y) V+ b+ c# r: u
   & B: Z' _4 l8 U' ^* G
   msleep(10);
; H+ L, `' I# s9 I7 d  - n, ^  q8 I+ E% {
  /*+ d2 Y1 @0 ?* W1 c* T1 Q6 @
   ioctl(fd,1);   0 U' S% c0 i' T
sleep(1);
: R& i* m, P0 B ioctl(fd,0);; G1 [0 T8 W' s* v
sleep(1);) ?8 K# H8 W/ g" `# K
*/
: f' c9 R6 U' A7 a+ r  }   3 p! L" {0 T% @0 J& X; [# s
return 0;
4 U- W& s, u: p0 x3 T; ? * J7 P$ U' C( g
}
1 I6 `! O: Z1 l8 q
, x* m4 n. P! T; ^' \多谢各位指教,谢谢! 急- e+ q% W6 |. [9 s
& B8 m: e' i& y. ?# f9 a: T

3 P6 L0 a' q# C  @! _2 [( }$ @1 I9 n! a- y

, I1 Z8 x7 y4 N3 J0 t& g: {# P7 I. s8 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 02:40 , Processed in 0.048599 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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