McBSP时钟、同步、数据线不正常 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 }) ~2 `% w0 K  ~( K: E
/*3 ?+ ^" f; q8 |8 X  }
* Copyright (C) 2009 Texas Instruments Inc
4 Z& I/ g3 C' Q% B *8 C- T1 C5 T1 ~; l0 y/ g9 e
* This program is free software; you can redistribute it and/or modify3 F; [3 K) l! L- K, V# q: e) D. w* r
* it under the terms of the GNU General Public License as published by. S' w4 j, H# [$ R3 W9 I
* the Free Software Foundation; either version 2 of the License, or4 z$ C7 a! |- K, I5 C
* (at your option)any later version.
5 X7 ~$ B8 R  e9 A *
" W# @' ?! k2 n# G- o * This program is distributed in the hope that it will be useful,' A3 I: m/ x% l2 l' D- \
* but WITHOUT ANY WARRANTY; without even the implied warranty of9 Y1 G* O0 H& ?. x+ X4 C$ b
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 Y3 k. }3 m5 j, ~8 [0 B% T% g
* GNU General Public License for more details.6 x2 d7 [" c' I" _% N0 {
*
# Z9 @, Y+ d) m; a0 F8 F. [ * You should have received a copy of the GNU General Public License
6 S! G# ]) _3 t+ Y# @2 b * along with this program; if not, write to the Free Software
( v0 F; K- ?! W: c * Foundati  Y! R1 U6 \; o" a; ]
*/
2 A; X7 T; d/ y: ^#include <linux/module.h>
+ ?2 \5 s3 D. ~, p9 {& O#include <linux/init.h>
0 U7 l1 V8 E+ K2 ?( ?#include <linux/errno.h>
( V: N' X+ J" Y9 q, T; {#include <linux/types.h>6 t5 C- G4 Z4 }6 j
#include <linux/interrupt.h>
$ `$ e/ D; J5 E: A) P#include <linux/io.h>; R2 H2 x2 ~  N" b$ J, D/ u$ A
#include <linux/sysctl.h>: [/ l( m- {: ^5 Z: {
#include <linux/mm.h>
# w2 d7 N; w. m. k" I#include <linux/delay.h>
! |: ^) C  s! Z/ m( e8 M#include<linux/kernel.h>
+ W' u( g$ s2 r- I: ^0 e# p#include<linux/fs.h>
# ~, F& u. W& i8 w#include<linux/ioctl.h>
! c8 u9 i: t5 ~#include<linux/cdev.h>' t8 Y1 _1 w) I8 y
#include<linux/kdev_t.h>
0 w. a, |- |- P  B3 C  v- p6 B: U#include<linux/gpio.h>
# q  e9 I+ C( @, C( d#include <mach/hardware.h>0 \/ |# a; o2 q) Y- v( d  Q. r
#include <mach/irqs.h>
+ Q& Z# ~+ V" n% q/ k7 G, o- i' Z: y8 Q" Y; q, y/ E: J4 }- s6 e7 s1 A
#include <asm/mach-types.h>1 c% v# Y! S3 ~1 X3 H
#include <asm/mach/arch.h>
! q1 Q% Q8 k' d; N$ n* H# a: j#include <mach/da8xx.h>5 _% n, ]; n6 o2 D7 ~0 Z
#define  SYSCFG_BASE   0x01c14000, J" Q" |7 ~9 _
#define  PINMUX1_OFFSET   0x124
. m% P1 o! Z: D3 _#define  PINMUX18_OFFSET  0x168 % w6 ~) L0 `  S* `. L; }$ c
#define  PINMUX19_OFFSET  0x16c' E* B; V2 J7 l. T- T; e
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
2 p! V" w# s- S0 X+ k#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
1 [3 o1 p7 R* ^2 n: X2 ^#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR$ W& X" O" ]+ L2 H1 O* y$ `3 h
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR. Z; f9 `# _! S5 I- Q- ]
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
. L! [/ Q  `! w/ W5 K  [+ R                            2 k: i* n  w# n
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR% B/ c/ v- K/ Z7 G5 q' z
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR6 R7 x6 v& V3 O" L9 D# O" W& p$ o
//PSC$ Y4 t3 [; b0 k  H
#define  PTCMD_ADDR   0x01E27120  
& _! u9 _: Z7 m: j#define  MDCTL15_ADDR 0x01E27A3C
- b; T/ `  t* G, w& R2 g#define  PDCTL1_ADDR  0x01E27304% r- p# a9 X% M
//GPIO8 direction
5 S5 l8 a  W) a8 c) o9 H# G! [& C#define GPIO8_DIRECT  0x01E260B0" r$ Z& I+ k! @: `  y  n4 Z
#define GPIO8_OUT     0x01E260B41 Y/ h/ I8 V* P+ Y1 Y
#define GPIO8_IN     0x01E260C0: F# u8 h9 }2 I% R) Y

; O7 e. ?" x6 S  a( Z9 G% k* O6 }//#define MCBSP1_RINT    99                f/ L/ o/ g1 X
//#define MCBSP1_XINT    100  ) @3 _7 _( N  A6 h8 p* M  w
static int MCBSP_MAJOR=239;
+ Q, I% \5 M- L. O$ J8 k! h5 F" Rstatic int MCBSP_MINOR=0;
) y. h9 F5 X) q1 _5 Zstatic int count =1;2 D' a! N/ ]- X% W8 X5 `
+ M' L9 K0 N7 {2 j: O1 P- v, }6 R4 K
#define MCBSP_NAME  "MCBSP-device"1 b) o* D$ r( ]# s2 U! T& i
; W$ Z4 p3 m  m3 B
static struct cdev *mcbsp_cdev;2 {) k# L' \3 }, b" M4 ~% R9 I
static struct class *mcbsp_class;
+ G/ s! z* ?7 `static dev_t mcbsp_dev;
4 a# H+ _+ p, _0 Xunsigned int DRR_data;- M2 t* [7 O1 s8 y" z. B7 |
unsigned int DXR_data;
/ H( `/ b8 T0 c& G. f0 P# Fstatic int mcbsp_open(struct inode *inode,struct file *file)
7 N6 g0 S1 o% _3 `8 h5 z{
  Z% C( M/ M- e2 ?! a4 e! L  N   : n+ Z$ l+ `, d4 J' ^
   //interrupt enable,initialized
, Q4 s, j' E* @3 i+ f; Y$ {. a' c   unsigned int temp;
) N; `) i+ t, u  d# x2 F9 a8 [   //SLEEP_EN(GPIO8[10])---0, H% N, i' W2 u$ s, j8 s1 d
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 E: b' `8 S2 b; r% l   temp=temp&(~0x00000400);
; C. G6 W; {! U" B* }3 b   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
) i+ `9 h# z+ T2 |  //RESETn(GPIO8[8])----0----1
9 k( |, Z) q7 D. m! t   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- Y* {+ S: H! l0 V
   temp=temp&(~0x00000100);
1 w8 V1 o8 h% f7 U0 t* J   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 B4 ^% h0 G: `+ c: z* j4 s
   udelay(100);
, M; i, i% B( P" g! f   temp=temp| 0x00000100;4 t4 D8 u  p9 O5 Z) V6 E
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* }) a* M1 G% d( s2 |
   udelay(100);7 R7 i( r1 z) V# k: Y
   printk("open success!\n");8 l6 c6 M  k7 R2 X! L* d; q- s8 D! D. F
   return 0;  E3 k; X4 l" A' I+ w0 C
}
* ~) B8 a; k- c0 S- P  P6 o/ i( x! ]; I9 r9 e
static int mcbsp_release(struct inode *inode,struct file *file)# U7 G, |* g6 y& I# l" D9 B
{
9 K) i) o; d8 k# H. v! ^4 h* e   printk("release success!\n");! r: n7 p# Q  h! @+ y5 t7 v1 J( B; B
   return 0;
/ d0 v! i! A) R& a, C" z}( E' U# W% N7 s0 D

/ e1 m6 X9 s! I4 tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
' o+ D2 E9 f& b, M: v{; T2 {" B; A4 _6 {
    copy_from_user(&DXR_data,buf,len);
  G4 [9 J; m! g- n( O. S5 {4 ]    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));         D1 s# g) t5 Y$ V
    return 0;
4 C2 p5 M3 T# r
3 f; f8 z1 o0 v" }1 N}
* Z, W/ |( j. P$ X, W6 ]: x, E; J7 _( X/ H$ J
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' i+ C4 `5 k# I. K  q
{ : {- {7 X) y1 V1 L, \! k
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* q! z- L$ D7 I   copy_to_user(buf,&DRR_data,len); / X; T1 f# G' T- L/ \
   return 0;
4 `; f7 q7 g; E& I5 c}
" p8 h2 Y. C/ B. d8 y
& w6 Z, q9 ]5 ^
' v# T1 I" Y# a8 sstatic struct  file_operations mcbsp_fops=/ [8 |0 \' V8 k6 O$ Y- J' \
{! E/ q+ ~7 x7 w
   .owner=THIS_MODULE,$ O% T3 w( r7 G9 t8 i
   .open=mcbsp_open,, Y( x1 J" f1 q4 t( j# ]
   .release=mcbsp_release,
' T1 y1 D7 _, p1 n' U0 u: z   .write=mcbsp_write,
* u! X4 v! I; m' N5 r6 V" F4 K, ?   .read=mcbsp_read,9 W+ \. h2 B% M& ?5 d
};" g9 y7 M& N" I6 q# F+ m: G
static int __init MCBSP_init(void)
8 Y# D# i0 i& f8 e( A; `{; S' I. D& B% M$ M3 }! K  L
   int ret;7 N5 @$ [& Y" x6 F& m% e/ h0 r
   unsigned  int   PINMUX1_REG_old;
% l% e% H; o( ^3 z# d' d( F   unsigned  int   PINMUX18_REG_old;
8 c. w+ w; P- l; c5 d8 f   unsigned  int   PINMUX19_REG_old;
3 z5 @9 k  z  N* s$ C2 U" n) R' l6 L   unsigned  int   temp;    p5 _9 R- y& j
   if(MCBSP_MAJOR)$ _) x. h" A8 u; G& k% |
   {# ]9 ]7 x+ X0 ?* f$ \
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ P4 o, ]  R) e) ^  V* E: M
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
/ a$ A; U; ?5 \6 p   }& x" l! s1 A% M; ^  v% G" D6 n
   else
6 o( t+ z% |* r5 Q   {4 c0 M5 L7 b' \6 O. f
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 d; T' j6 j2 S5 ]& U
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; Z8 A+ {& I' d. |! }, b% D* P   }
. k1 P% J; Q* R; S" \: Y   
4 q% c# x4 A- a0 Q0 R0 @   if(ret<0)
6 a  @8 Q) Y$ `8 J   {
/ x6 w3 P4 c. d( B' G) z. |. E      printk(KERN_ERR "register chrdev fail!");
8 P1 A* |9 ^) f8 I2 X0 Z7 `/ F0 a5 o      return -1;; m6 s4 ^4 n0 ~
   }
" R& I7 E! t1 ~* e7 J4 l  r* v   
% l1 G) @# y3 g' c) Q   mcbsp_cdev=cdev_alloc();
+ S6 U5 u( v" z3 [   # V2 Y- n5 z  ]
   if(mcbsp_cdev!=NULL)! S7 ?8 f, i7 r# f6 d, Y
   {
. g9 j' z) t, c0 Z& k      cdev_init(mcbsp_cdev,&mcbsp_fops);" B! U9 {6 k1 a+ H" @0 P
      mcbsp_cdev->ops=&mcbsp_fops;2 w$ P! U# R0 h: L( }
      mcbsp_cdev->owner=THIS_MODULE;
/ Q7 n/ i3 Y5 V6 [. s3 [  w      . E9 M8 T( `; H( i
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 T0 T" ~  f4 T; ^$ O
          printk(KERN_ERR "register cdev fail!");
5 j- [* R) g4 V" b& P9 Y      else: m: s; L6 ]# ^$ X, k2 }
          printk(KERN_ERR "register success!\n");
" H3 ?6 }% C( i. i+ t   }
9 W- D4 v7 w( A. }   else
7 i! @; v& z. O3 h2 R3 w; W9 Z   {
: T# @; R/ M3 P* M+ l: p      printk(KERN_ERR "register cdev err!");
* E! `; `2 \2 x; g2 q! F8 c      return -1;
" C' Q" B/ Y  e( j  t8 Y) D- A1 ~   }, c# X# f* ]8 o3 ]6 d6 ^8 i& g
   $ X: K; l, V% T3 |! D
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 H& w4 q, w( |& N7 \   if(IS_ERR(mcbsp_class))
4 a' |5 C# g1 V: e$ X7 T% f   {
6 @+ v0 ~3 C0 q# R+ F; h+ I      printk(KERN_ERR "register class err!");4 V% Y$ z; u4 N! S# B7 G, |
   return -1;
5 C! H2 G& n1 z5 X) L; }+ \5 d! I   }5 K1 M" D; N5 c; u9 @; k
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
% k6 m$ w( S7 h  j) ^
. R% {8 T4 p! O/ b7 I   //PSC- V4 T6 P3 x6 u
   //add Enable MCBSP
, v8 {& Q/ G3 l! A+ V   //test5 j, z6 O1 F* M7 V% a& \
   temp = 0x80000003;! h5 J% X! |" i3 `
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- ~3 _; U+ K. s7 e2 L. a
   temp = 0x00000003;! ]' |6 M, [( W% y  _
   writel(temp, IO_ADDRESS(PTCMD_ADDR));
7 x$ }  f. V0 g: d3 G+ r, }1 P 9 l4 Q: C6 K  R9 g8 W& J
   temp = 0x001FF201;
6 G6 _6 b; V& _9 M% j   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ S1 U0 ?1 j0 G& e6 m$ M$ m   * s1 V8 c+ l2 B
   //PINMUX  , `+ y6 }; {, w$ y" ~" R+ U
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ U9 c2 T# E" V! h) e
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
" s# |! D# d: ?9 e: D& t   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   : K" s/ w) A$ s# J" h% q( ~
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ i5 X0 _$ r7 Y" B   ; E; N7 b1 k4 v/ ?, X
   //SLEEP_EN,EPR,L138_SHK1,L138_RC
- q* L% C% l4 j6 C; \. K! A   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ) F$ d. s4 h. q# G  c" k
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   9 i" S1 g: g' b: V) u5 e
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 E- ]0 O+ R1 x+ W9 h6 [7 N 9 E/ j' U$ q" ]# P
   //RESETn,L138_SHK2: R. y, c* A: m* ]* Y
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
. X' J# G' V+ `& K! w. s   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
& o' k* I$ D8 e% o" u   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# X- p6 K1 B- l; k3 A! T + M4 z& r, R( G
. b) N: Q: ^; u+ f, H
  //SPCR Register
4 M! z* |/ s' N. d; ~  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset  e" `5 K/ u, j2 N0 P7 e# o" ^
  temp = 0x03000000;//(DLB=0)
! j. _% L" I6 A! s) G4 C // temp = 0x03008000;//(DLB=1)
- z% N- f6 {3 T8 r3 t" h; [' r  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
- U: v6 L% U4 S3 O$ }4 @- K( W  temp = readl(IO_ADDRESS(SPCR_ADDR));
8 U7 D. h4 P7 m! _5 G& }2 ]  printk("temp=%x\n",temp);
( i. B- i, a: Q) c# m 7 }0 M1 d4 @  o  F& Y7 l
   //PCR Register
2 s1 N  X& X, a* n   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 z. |/ x2 ^" g  // temp = 0x00000F0F;) s7 R& f. N  U/ @0 R8 M( j; _
  temp = 0x00000B0F;: Q: R$ Q2 ?( S0 {/ ]- {# c8 g
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
* d. l' ?! v  |9 H. n6 q2 s) }% @, d" F  temp = readl(IO_ADDRESS(PCR_ADDR));
( f# B" k& X0 }  printk("temp=%x\n",temp);  
2 _7 Q5 W9 O" A5 G# Q5 R4 }   //SRGR Register
2 d+ g% f3 Z. r+ O$ h! r   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 U& K! Y  G: `' w4 d& |# ?- @" V //temp = 0x301F000B;, x/ ]4 L; `$ u) _0 Y
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
6 W! v7 j+ j1 `( O  temp = readl(IO_ADDRESS(SRGR_ADDR));
0 e6 T+ w9 T. c0 G- q  printk("temp=%x\n",temp);& i5 a/ g1 i9 a5 X
   //RCR* k! g/ }. P* E' b, ^
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 B  r& c& X( E4 P, r2 C: W   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 w+ Z: ?! e% R7 A  N7 x0 ^   temp = 0x00440040;. {7 F+ o, [3 f$ M% ~
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   2 ?3 u0 @4 `: d5 a
   temp = readl(IO_ADDRESS(RCR_ADDR));
& v9 v" `, A: e, _   printk("temp=%x\n",temp);
4 ^9 {( N( Y% s! Z2 T* g   //XCR
8 [# Q  v. s! V1 |7 P2 a4 L- v   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ z' i' _8 `- l8 H! |0 F7 }   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) |' }7 x; S) t4 G9 q, \  B) n
   temp = 0x00440040;& \1 J$ N" |8 V+ }% G
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   % @, C0 V- v3 |% u( {
   temp = readl(IO_ADDRESS(XCR_ADDR));8 j) B7 J0 g# ]5 A1 }2 D# X* Y
   printk("temp=%x\n",temp);# v9 j. ~* L7 l) v9 p
  udelay(100);8 y" B( B9 O9 s2 Y7 [9 s, M: L
  //SPCR Register
7 s; D% W3 {- k8 M& @, B) l  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
0 g; `" ^% e3 t/ L  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
, [0 ~& f# l6 i# d  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
. s5 A8 |" M2 K% b) Y; B+ q' e  temp = readl(IO_ADDRESS(SPCR_ADDR));
' ?' \! C5 i  H# ^  printk("temp=%x\n",temp);
! E; }( {1 _3 s. R- k  udelay(100);8 A+ T: D' Q5 v- ^8 d, w2 m
' C' X, D2 Y" G! S6 D( N6 `. w
  //set GPIO direction
  ]4 H" s8 D+ |; j' {   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 t" @$ Z2 t$ A
   temp = temp | 0x00000100;//EPR----input0 h/ v3 O  \0 p% j- x! ^" ?
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output+ I3 q4 n6 u( |! A- Y1 D
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 }: Y) f  j" s/ _
9 c7 S: K7 U* d& ?/ q1 Q) z$ Q   return 0;
' u& B) ~1 x, n6 X}
( Y5 Q6 f) l# q; ustatic void __exit MCBSP_exit(void)7 j/ r. j9 ^6 C% J0 t' [
{" i$ l) K9 L6 ]/ X. w. j
   printk("mcbsp chrdev exit!\n");  N6 ]. S) [9 \6 r7 `  h. @
   cdev_del(mcbsp_cdev);0 W! x. f6 n# x7 ?  W( N' B
   unregister_chrdev_region(mcbsp_dev,count);
- q. l5 Z* \# W. C9 }: M$ n   device_destroy(mcbsp_class,mcbsp_dev);- _3 ]; m+ m; l) M% q1 s
   class_destroy(mcbsp_class);1 m2 Y3 ?" j. I1 ?& n! z; K
}
0 v7 d) N: A2 A+ a% Ymodule_init(MCBSP_init);
9 K) G7 o+ Y$ H) w% h3 Mmodule_exit(MCBSP_exit);
* ?& K$ {4 H6 Y: x% W8 p) {% @$ x
+ v) o9 H7 B6 @6 f/ u( mMODULE_LICENSE("GPL");
' L- C' H$ Z8 ]: Z2 y) k: @
: T( s8 c; R8 q* j5 T' |我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 {4 l9 y/ A" l7 y9 _
我的应用层的测试程序如下
0 a3 m4 x% a3 X, d9 D* D+ n) B#include <stdio.h>
# _6 S7 U  E8 V) i* T2 }# G: B& L1 t#include <string.h>! W2 x$ [6 D& F
#include <fcntl.h>
/ b0 a1 [  }" y& C2 k5 S7 V#include <unistd.h>" F" D. J7 r9 q2 x0 u# ^
#include <signal.h>
: _3 i( P3 U/ @1 I5 T5 ]+ T5 M! f) L#include <pthread.h>       //线程; l+ \4 g1 k# y- ]
#include <stdlib.h>' j- M; h: \' h! m2 h
#include <pcap.h>          //捕获网口数据  ?; Q+ w$ Q! B
#include <semaphore.h>     //信号
0 I0 S% _1 j& m) c#include <sys/types.h>     //消息对列
2 G$ M) ]$ H  W5 {' D! }& l#include <sys/ipc.h>       //消息队列
" ?, t3 ?" f( j#include <sys/msg.h>       //消息队列& z' b- f4 J1 L. P8 }5 i* q% U
#include <sys/select.h>0 S. n8 _2 a1 C7 D9 d, K) q& w
#include <sys/syscall.h>
! u" U3 i7 k9 v* b) D! x#include <sys/stat.h>
4 D0 w+ f5 b$ g5 \) `9 c& R#include <sys/mman.h>: J. m5 D# G* Q6 M' C0 `! b1 x
#define msleep(x) usleep(1000*x)
- T: S0 h# z1 H
9 \4 t/ R) f3 p' o3 |3 k7 Iint main()3 ]+ r1 E+ j, G& k% S; f
{
; L4 x' e1 ?% C0 D" b! P- i: k    //MCBSP,ARM与AMBE2000交互设备6 K5 v# G6 r# u& y; e5 `
int fd;9 U1 F8 x( @$ J2 Y
unsigned short data_write = 0x5555;; c" j: \* D# \4 t' i. ^
unsigned short data_read = 0x00;
2 ?" D0 R- j" O  Y0 X6 f" I  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 l' d6 H# X# U. U) F //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ e; T) c: f. u% {8 r6 B+ m5 B    : r) r# s: ]5 _1 r* e, ^3 u7 C
  if(fd < 0)
& f6 n" m# D3 i" U8 y$ b, j  {& I5 L9 F7 A: S! `3 n- g$ Q% T5 S
     perror("open failed\n");
( B0 M# @) _. R8 ?/ {3 W# f- ^     return -1;
, G9 w1 v. \+ k) z/ h% `  }
$ n! M" b- A+ z5 ^# P) }7 |  # w/ \% b# i$ ^8 N) b( t0 M5 F
  while(1)9 l- X& M1 ?' w" P8 m/ ?# ~
  {& \% Y2 T/ l0 F% V0 h( y; C( l
   6 J0 Q( F$ R: c( [1 d
   //AMBE2000每次读写是24个字为一帧
, M+ J* S1 k$ f$ h  u+ r   //写数据时将数据在底层存储起来,等到中断的时候再发送& V8 f. h6 E/ y5 L+ P
   //AMBE2000输入数据是以0x13EC开头的: h9 g7 L2 v  R2 U0 u4 R
   write(fd,&data_write,sizeof(unsigned short));: x- f: H, o4 t5 V
   
( a1 A5 l, _$ }8 b6 j+ g4 d* |6 `   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  - w0 Z' U; F1 f: M" C$ F
   read(fd,&data_read,sizeof(unsigned short));
5 ?+ }; t% F: ]2 S# u5 |+ B   + \- J/ p; S- O0 d! a9 l2 }
   if(data_read == 0x13Ec). d6 {5 t+ w8 ?# j, y
   {( A7 }  D! }# Q- X1 ~* C, i6 w
   + c, [, k! S) E5 i6 o& O
    printf("data_read = %x\n",data_read);
" r- Y+ T, ?. o* v   }
) P4 s+ k  }8 }$ i3 L5 X   
5 D5 d2 K  j7 e   msleep(10);
& H4 v, A! d# }$ D3 o* W$ ]  5 `' i$ I: Y. G$ ~# I3 C
  /*9 u+ \) s7 b+ X7 F1 b' U  I! h  O
   ioctl(fd,1);   
+ H; T- V5 b2 h* L0 Z sleep(1);# p; x; j& s; \( I) J2 [
ioctl(fd,0);
) r) \0 H  G# Q3 ]; T! q sleep(1);
1 r: ]: j$ B  {6 o! U! f* D */   W  ?5 {9 [% ?- k7 X
  }   
: o4 P' u0 Q) j+ o. e return 0;! Z: R4 {# e) J7 n; A

: h$ C. F2 G. g" M8 G}: ~4 T, i- C  F6 x* `# z) E6 D
5 P: K* C) i: f+ X% ^1 N) K8 h
多谢各位指教,谢谢! 急* e/ ^- n, c& G/ x! E  x
  P8 `. X+ c  b/ \3 h4 a

" R+ z9 g) M% h  O$ v0 l# t2 u" V3 q( Q: Y% B8 @, D1 N
8 l0 \" d+ V% K" }" R
; `# p8 @( S% O5 k2 ?: T9 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 18:32 , Processed in 0.040479 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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