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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
9 I5 E, y) r/ Z. j/*2 i4 l6 t4 ^8 `$ g6 L$ S
* Copyright (C) 2009 Texas Instruments Inc' S* i! h5 i+ N- [1 z
*9 T3 m* @- N/ x& Z$ T
* This program is free software; you can redistribute it and/or modify
$ w! `( V7 k8 U * it under the terms of the GNU General Public License as published by
% _+ v9 C) J8 D1 i! f- T. ]/ C' c * the Free Software Foundation; either version 2 of the License, or
6 A2 @+ L6 I2 S% Z* w, J  C * (at your option)any later version.! |/ Z+ c; C6 i5 ]" z, N: O4 S6 U9 C
*6 R5 z% S0 f& w1 a3 f. q
* This program is distributed in the hope that it will be useful,
- m# b9 |5 M- }9 W1 S& t * but WITHOUT ANY WARRANTY; without even the implied warranty of) Y! R3 C& j4 c5 ?( s. `
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
, h, D3 y% P% v' A6 g* h" u- s * GNU General Public License for more details.7 E, x# }4 j: r( n2 S+ T, h- i3 u* C
*
, N5 C- }0 f$ {" \3 f: T) s( V * You should have received a copy of the GNU General Public License- n3 s0 B) @0 C- e8 B! J
* along with this program; if not, write to the Free Software" g" Z9 s1 {( O- }* S$ C% q8 v- B7 O
* Foundati
1 w; }1 J' K# m' o5 n; s/ p*/* g  \" M% l4 U1 ^6 P3 U
#include <linux/module.h>% _6 `9 I, X: l7 z/ Y3 i% X
#include <linux/init.h>9 p7 u" w: r) `
#include <linux/errno.h>$ E" a: J0 O/ p. z- I2 V% ]
#include <linux/types.h>! D# N- x/ W% j5 h5 }7 g
#include <linux/interrupt.h>
3 Q, Q: u& r( _, r/ C$ x#include <linux/io.h>! Y# B/ c" q8 }* N- O
#include <linux/sysctl.h>
$ d" ~# ], X: G$ j) S8 d9 Z#include <linux/mm.h>2 E; r6 `" m! E5 ?4 l; p. `) e4 n
#include <linux/delay.h>
- Z; v8 i; N' w% R) U#include<linux/kernel.h>+ H+ t0 T9 I% }4 N; C8 C- u( }' `2 O2 P
#include<linux/fs.h>
& S2 A  O8 D. J( F; A! |! t, |3 M#include<linux/ioctl.h>
+ P' t1 d5 W" }! n% A/ T#include<linux/cdev.h>
. ]( H' r. j: X* Y) j5 }#include<linux/kdev_t.h>0 q0 T% k3 }! s4 I9 ^. H- I
#include<linux/gpio.h>
; ^0 v! d6 N' c( V4 |) u#include <mach/hardware.h>
9 F( [7 |: l6 l#include <mach/irqs.h>
0 o3 ~* u" s0 s# \; P
, U) P8 b1 {- t" S( `3 A+ M  m#include <asm/mach-types.h>
; D" U/ K$ P& j. r#include <asm/mach/arch.h>5 s! \- ]1 S- n. D
#include <mach/da8xx.h>
- y) U2 t* c  G& C% Z* K+ S+ i8 r/ f#define  SYSCFG_BASE   0x01c140007 T: Q1 W" V" O+ d
#define  PINMUX1_OFFSET   0x124
! j1 Q& h. [, c( b& t0 P7 Q8 m+ h#define  PINMUX18_OFFSET  0x168
4 L* f3 t" `' M6 ^/ T) R#define  PINMUX19_OFFSET  0x16c$ M# P! K: d- m
#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
; B; {& A: H# h9 J( V$ [#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR6 ]3 F* y" z& z) Y+ E" S! C
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
" l2 Q9 ^( B. Y$ [8 C& |$ q9 w#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR6 B1 m; W1 R" b* G$ i
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR1 i/ e& E8 O) ?8 m' I
                           
5 t0 o0 r; A1 D& [#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
, ~8 p; P2 j4 N4 z#define DRR_ADDR      0x01D11000  //MCBSP1_DRR- c& }3 K, H6 s
//PSC. Z  m4 d6 e/ {( r
#define  PTCMD_ADDR   0x01E27120  8 y% z; A2 Z  g) P- g! a% X$ D0 Y
#define  MDCTL15_ADDR 0x01E27A3C
3 n8 D. F4 W0 l5 l#define  PDCTL1_ADDR  0x01E27304, F* N& b3 p3 i- _6 U
//GPIO8 direction
: z3 L  c7 y' w. C7 h1 ?#define GPIO8_DIRECT  0x01E260B0" V; Y4 d% f! h, ~7 P
#define GPIO8_OUT     0x01E260B4# j5 Q6 C! n7 @; s' w6 z
#define GPIO8_IN     0x01E260C0
* S1 j8 G% V; p) D5 U- \
  {9 E! y$ c4 ]+ p5 B+ U//#define MCBSP1_RINT    99              9 l( ~: O- K% a4 X9 \$ G3 I+ I
//#define MCBSP1_XINT    100  
$ D* U+ v) R  @: e; Z: W. s" I( Zstatic int MCBSP_MAJOR=239;
$ Q8 q1 m3 }. }* b9 pstatic int MCBSP_MINOR=0;/ w4 y" }2 U( T' `
static int count =1;& O" T. j6 s( h2 [
- M; ?" y+ k# V% {; x
#define MCBSP_NAME  "MCBSP-device"
- c$ j6 }! }3 e( y5 H6 ?' R9 Z& `
static struct cdev *mcbsp_cdev;+ I1 u1 g3 x$ L: v; I
static struct class *mcbsp_class;
, {$ `% A  I; L# e* Cstatic dev_t mcbsp_dev;- B+ I* b' d5 M5 s8 [( C* {) g# k
unsigned int DRR_data;
! `! }5 t$ p& n1 ?8 C% {- eunsigned int DXR_data;
# \) }% Q6 K7 E, q4 \: V8 jstatic int mcbsp_open(struct inode *inode,struct file *file)" c6 a( n7 ?: ]0 t6 u" p
{
- b' d' B& }& X   
( |' k" X$ L7 e$ a: H2 ~: l1 x   //interrupt enable,initialized* [+ C+ u6 z3 G) c. p; y
   unsigned int temp;4 f5 _) D9 e4 g- q* X' K
   //SLEEP_EN(GPIO8[10])---0
$ L5 |8 a6 c/ O+ _   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 F5 G5 U# y0 P/ j8 D% s   temp=temp&(~0x00000400);( Y' t# A* y' V1 n/ L
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
  R& j* f  Y, ]4 r7 P' |  //RESETn(GPIO8[8])----0----16 d% T* u' @8 ~
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' s. U7 Y& ~9 m7 z0 \: h9 n+ i
   temp=temp&(~0x00000100);
3 t& ]. ~4 M8 P: @2 ^" [) u8 F& ?   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' b) a. c4 E# r* H" T5 K
   udelay(100);6 v2 @: M0 A2 u% d7 N  z' q  s
   temp=temp| 0x00000100;- J' G( ]+ u2 r* I
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, V5 s% Z  y, g   udelay(100);
) [* u7 I( s! S6 _4 C& ]   printk("open success!\n");
! E6 M7 ?3 ~$ I& g4 v   return 0;. h$ F' N1 Q$ O/ a2 V
}
3 B, S8 H# G4 q  b% G1 L+ u
' ]9 d. V8 @; X' k2 i- ?1 v3 estatic int mcbsp_release(struct inode *inode,struct file *file)
4 N# j" I* O8 T3 r5 N{, T8 _' j6 g! y
   printk("release success!\n");6 i% X- W1 H; _8 \
   return 0;
; S- r; ?# r/ p# a5 p}, ~  ^: ~  [- m# f( e$ @* C" C
, S' e! H, e) E( L0 L! ~* U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)& V0 w9 I9 j" j$ a8 \
{
9 d2 W- o% W* t  r& D9 O; i    copy_from_user(&DXR_data,buf,len);
, d, E; E; @" g    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));      
! N' ~% R+ u- x# E' `    return 0;
0 L, E) M$ E0 C
1 v" u* A, d! I2 C  i4 ]! [) a, H}( |6 }+ z( B+ {% N
7 i' p( V& u2 o8 w% F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 h0 Z6 v; z2 q0 F
{
4 h+ c; Y7 R) X% j! Z   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
& e, _8 L9 \. u) B   copy_to_user(buf,&DRR_data,len); 6 }: t) _4 B6 |3 g# u8 B$ A
   return 0;" {* M5 g" s' ^6 m8 I) F8 P- S$ \1 P: [
}  w& L3 ~7 N/ K: ^  e1 b7 H
1 W  B" k" b; A
$ @4 W; w+ t% c: V1 N
static struct  file_operations mcbsp_fops=0 |: ]- `+ ]8 Z6 y1 Q) b
{% {: ]% W5 |6 R9 J1 A0 h7 g
   .owner=THIS_MODULE,+ V, h( `1 ~, Z7 Z6 w
   .open=mcbsp_open,  D1 b0 t# [; F% V0 }+ G- V& w" [6 K7 a
   .release=mcbsp_release,1 I+ e6 t; |3 `3 @
   .write=mcbsp_write,% F5 D: S3 U6 `( d& k, e
   .read=mcbsp_read,; [0 H$ U; s2 I4 Y
};0 B/ G, m- ]+ L- C& m+ [6 ^* K" O
static int __init MCBSP_init(void)
% {% H- |! `3 a# x{- r' B  {0 q1 K2 w" o
   int ret;
+ v# m: j/ u9 q: O' `$ g9 k3 t6 q: @   unsigned  int   PINMUX1_REG_old;
5 x) j- Q! c$ @2 t$ c- `8 W   unsigned  int   PINMUX18_REG_old;, J: Z, u, \# J+ k" S
   unsigned  int   PINMUX19_REG_old;% R6 s0 R  q1 {5 n! F5 x
   unsigned  int   temp;  
; D( K/ d9 _0 d2 _: K: g# M$ \   if(MCBSP_MAJOR)
8 Q, r8 G5 m& H# M4 W0 h+ Z   {# J( w$ S* }, L3 }" C
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 Y- w8 E$ ]5 r- M
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& `% q  \. J4 J. k8 N   }
; E. W) }5 }3 B) v/ r   else3 @+ a, A1 F' Q* B7 L
   {7 H! ~7 e2 j) A: x
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 o1 m7 `. s' [/ }
      MCBSP_MAJOR=MAJOR(mcbsp_dev);. p5 ^3 G: W9 I7 ]$ X* b" v2 H
   }
; d5 O* q# y, I% Y+ `1 \1 W   1 K0 [" E1 s+ ~3 {
   if(ret<0)
& {* `- H& W9 G; s   {
$ ?0 f+ {! }! ?% y, M  k      printk(KERN_ERR "register chrdev fail!");
1 G# D5 P! X1 F2 N: X2 N; t      return -1;
) w, I- ]* y8 f& s9 Q0 E. k' I   }
; B8 w# f+ z3 I$ `5 b1 g  ?- D# g   ! I/ i- H- m3 E6 L) C, f
   mcbsp_cdev=cdev_alloc();" P. G& C7 W) q" N2 N* e% J
   4 D5 \1 b# Y' i3 H6 W
   if(mcbsp_cdev!=NULL); E5 L/ _; a( O1 V: m; F/ j
   {
6 f3 d$ w' W, f/ j8 z0 s      cdev_init(mcbsp_cdev,&mcbsp_fops);
% y  a+ y' w4 j      mcbsp_cdev->ops=&mcbsp_fops;/ m. l2 O9 A! d* `4 r
      mcbsp_cdev->owner=THIS_MODULE;
4 S' U: L2 w' t  R' `* t      * }- t& ~6 {9 y& o3 s
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 {$ }% i& y: z; A+ g          printk(KERN_ERR "register cdev fail!");6 @* P5 H! `( [6 n' Q
      else7 C, I" Y$ P8 i$ k' D( D
          printk(KERN_ERR "register success!\n");/ x+ d; b2 a: I/ j( \* A9 c
   }
1 S* v; ^. U  ]8 Y: T5 I9 L   else1 `) |0 W/ @' }. T6 G
   {
  h: V  d% Y* h& D      printk(KERN_ERR "register cdev err!");% @2 S  W4 A& v' x9 E+ P
      return -1;
+ t7 U  [: l7 F- b   }$ z9 @* e: u+ l2 `7 L
   - D+ v' x+ g  I
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 t0 f% q0 {6 [   if(IS_ERR(mcbsp_class))
( l/ K) [, f# s' L% L9 b( q; b   {
3 _8 b9 O* L9 `) @; |* z      printk(KERN_ERR "register class err!");2 {2 H3 l# [6 S5 U( i! F0 l9 @
   return -1;
3 T) z+ K& g5 s, [- ?1 J. k) V; @   }2 U  P; f$ R4 [
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);% n: }  V5 L1 H" K. y

% V( q* Z' }- E4 I   //PSC
5 P/ f+ R. W# F; F   //add Enable MCBSP
" p) F- _* A2 `   //test$ K/ V, {( ~9 q+ H
   temp = 0x80000003;4 N+ L2 N6 O& \/ r' T* |& J: u
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));( V7 x! l! C3 F" `+ g; v3 z1 S
   temp = 0x00000003;
( o6 |  f; R$ {. k. s* y) ]   writel(temp, IO_ADDRESS(PTCMD_ADDR));
& P" {) U# `2 U( j; C : F* x2 H: r; a* {8 G8 E7 p8 h
   temp = 0x001FF201;: ~2 q2 b' ]" U% X
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 ~( ~- R" V! s$ w" R& h5 C
   9 Q; P: ]9 S1 `
   //PINMUX  
8 h9 Y% ?2 f( N9 v+ X% @7 `  S4 E   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ Z+ Z! D: t: _) \* d) \7 E$ W* i
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  9 t" h' ?( I0 I( x
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
7 {/ g8 H& ?  [8 x9 n" n8 Y   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- \7 F4 {: t3 Z- u
   
8 Q7 R% g/ T9 K2 \( ~0 r8 {5 O   //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ C. J3 E/ e) F9 X7 @) V   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ; T( J/ h+ e5 D) ~/ t$ g, W
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   9 w. V- x6 m- v7 Q) ?
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" A, E/ o* |$ c; E  \. }! t5 a
! c' ?) p+ k3 n) D9 ^3 ?
   //RESETn,L138_SHK24 J$ @' R: ]  P
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  3 i1 L8 l& G) h8 \# s6 H1 \8 Q
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
: F% w* t" k  h1 W9 E; S   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: ~- E8 d- z# ~7 {* _8 K: e

6 W+ x2 a  I- @ : X* Z9 w" F9 }- T+ A
  //SPCR Register
9 e$ U' ]- A2 |8 J  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 v: x, F  Z9 ]. V$ K  temp = 0x03000000;//(DLB=0)
* @/ h5 o* s9 t# i // temp = 0x03008000;//(DLB=1)
% N) w6 \, e% i' I  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset0 z% w1 n7 I# r- h- K0 N2 t
  temp = readl(IO_ADDRESS(SPCR_ADDR));. o8 b" _' P  r6 \% B  {- v% j: ~
  printk("temp=%x\n",temp);  g, z$ d0 B8 P/ f

$ D; P2 m8 v! \0 b+ k1 n2 M: U   //PCR Register1 g* `$ r1 G: r0 R' C
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) S7 ^; N' \  y/ K( v4 A
  // temp = 0x00000F0F;
" R" O6 b/ N9 V& c" J/ M# Y. d* o  temp = 0x00000B0F;# B! J) p4 v& X0 |$ ]: Y& K
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized " Q- K2 u3 P# X4 E! G+ ]
  temp = readl(IO_ADDRESS(PCR_ADDR));
! j- R. Y+ ?2 x- z: d6 E- n" X  printk("temp=%x\n",temp);  ! z7 N* h' T; _$ ~" b
   //SRGR Register" W- G3 C" ~* P: Z
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 d" x: z6 @  [
//temp = 0x301F000B;0 b% Q2 n" O3 O
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ' Y; B& B( |% ?$ S, I
  temp = readl(IO_ADDRESS(SRGR_ADDR));
  j: ^0 w9 d- j0 u) [) l9 \# ~  printk("temp=%x\n",temp);
- ]% _& q! \5 R9 `! {   //RCR
2 S& \0 l- X- Z8 @! O% z* X/ h   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! W8 Y, l" Q( l4 }) ^0 v1 k
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; y! n8 ]6 O5 h! H# N  S4 b
   temp = 0x00440040;
5 |3 X& m: S: C7 b2 \1 u" u   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
' p! |4 H* H  m/ s  u! k   temp = readl(IO_ADDRESS(RCR_ADDR));& m/ ^- P2 {7 \, \2 O7 [
   printk("temp=%x\n",temp);
6 v3 P* J, v( `4 _; Y   //XCR
4 R% F. @1 o7 M6 l( n   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-15 |$ n9 k# u4 B7 K# t: \
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-00 @  D1 h2 b4 M7 S4 }0 ]' z9 f+ c
   temp = 0x00440040;% [5 p: T8 g* _. H) U) T+ K
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
$ K# s9 A/ q0 S6 v- G+ C' U  r   temp = readl(IO_ADDRESS(XCR_ADDR));" U: {# f  U3 n! N; g
   printk("temp=%x\n",temp);
# L/ ?; m% D/ M6 E& j  udelay(100);- T4 j+ Z' V$ |
  //SPCR Register
8 h  S. m$ J: b, o6 T  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 W* L. b9 \$ h4 Z& [
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
- ?  b  u6 j4 B# e  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled9 i' F. H: d0 j0 o8 U- |
  temp = readl(IO_ADDRESS(SPCR_ADDR));
1 h8 |5 Z7 Q) p% s! j  printk("temp=%x\n",temp);2 `1 J: b* Z! ^1 f- v, n
  udelay(100);
# I5 I/ ]; I2 f! V; S6 S+ B* h6 E) s* x6 J0 \. Z& q  G/ k8 t
  //set GPIO direction. U; a2 H) T) h" s
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; t9 Y. B# T$ b1 R1 p1 A0 o+ ~. i
   temp = temp | 0x00000100;//EPR----input
! n$ ?+ ]. ~  M* f1 K+ _   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! y5 A. F  i4 q% x
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( D! w8 N: ^) @7 H. H+ l
$ g( j8 P" F# ]6 \1 c% P   return 0;
' k4 x3 u$ F* y: ?6 z4 D}
4 r: I2 M& l1 l0 g9 T/ H4 b7 gstatic void __exit MCBSP_exit(void)4 t" K5 ]6 f' Z( f3 U
{
' o+ I' y6 I# v" q- o* Y   printk("mcbsp chrdev exit!\n");3 M+ ?0 M* ?* g- a- @
   cdev_del(mcbsp_cdev);% A, V; @. P1 h2 G; ~$ X3 b3 r
   unregister_chrdev_region(mcbsp_dev,count);! R! }# _9 {! B& y) Z
   device_destroy(mcbsp_class,mcbsp_dev);) ?+ o6 [1 ]* P( A' ?% [. f, i
   class_destroy(mcbsp_class);7 H# ^4 t* N& X5 _8 n4 [
}
6 L0 v, K8 U( r8 u7 W# G% p6 O- _module_init(MCBSP_init);
# h' `! d+ \; y- J+ d! omodule_exit(MCBSP_exit);+ d; h6 j8 }9 f& x% E2 i! z% m4 K' H
! P9 w& u+ Z; A2 v* i3 {$ [
MODULE_LICENSE("GPL");
! X! u, R& d# w* h' l4 u
3 j2 H! f' y% S* b) _9 }0 Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 h' k+ J$ q) t5 A" s1 o( {我的应用层的测试程序如下+ O& c7 A4 A# {& k) c
#include <stdio.h>
& P, ]7 R6 E$ d, g: u% n0 O- E. H9 r#include <string.h>
- ^, R0 H' |8 y, Y#include <fcntl.h>* r! _3 ~7 I' X+ a
#include <unistd.h>) T, E6 B# g' `/ _+ N, B
#include <signal.h>+ D+ m9 q1 [8 Z" Z& `" J
#include <pthread.h>       //线程( k" l0 D4 I& Q) G6 U9 h
#include <stdlib.h>
$ _% o7 R+ y2 J! n1 C#include <pcap.h>          //捕获网口数据
( s& J+ ?6 w) o: Y#include <semaphore.h>     //信号
0 [& J6 c; T& g3 K) A3 |#include <sys/types.h>     //消息对列0 R0 Y/ S1 S( j  `5 C2 e! j6 R
#include <sys/ipc.h>       //消息队列( R" b" v1 D) R+ J$ K  n- M) N$ t- I4 i! k
#include <sys/msg.h>       //消息队列) `0 Y1 a! _/ v2 F$ E
#include <sys/select.h>0 d7 z+ |" F, E. K/ @* ]
#include <sys/syscall.h>
* `6 v  @; A$ [#include <sys/stat.h>
7 {. a, l/ S3 G' `; Q( P' y5 A8 z3 M#include <sys/mman.h>
2 C) z! b: {: Y2 s#define msleep(x) usleep(1000*x); w5 S( _3 j7 O0 }: s- q! p% {

' Z# j5 I( h/ o4 Cint main()4 i# m; w- i; V
{
) @- z$ X3 U2 N( e$ i: W    //MCBSP,ARM与AMBE2000交互设备( _5 _0 o9 n: _, S# M+ ~# [) E
int fd;5 n, p7 W# u* q% \5 c2 o+ N9 D8 Z' C
unsigned short data_write = 0x5555;6 B+ a) [) X- Q2 L
unsigned short data_read = 0x00;0 J; N, {4 l! H' y8 U' x$ Y
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% \# R. b- |" H: y7 L
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% X5 b  q" C" s
   
2 \; W7 V8 B" O; D9 t  if(fd < 0)
* j, \1 i) g/ X, W/ [0 \  {5 N2 [3 z0 U" D# M# f- X! ?
     perror("open failed\n");0 Y/ b7 H! G7 p% f
     return -1;5 a. D2 {( q. J5 Z4 n
  }
& g, ?+ T$ t2 `8 i7 S  * ?- B% g; `0 I  g2 H# @4 K4 ^
  while(1)
3 m9 g! }9 i8 A" _  {
! G& G. w: x3 e& h* O7 u0 c   
3 q4 q# ?1 F: w1 J" Q9 z0 B; n   //AMBE2000每次读写是24个字为一帧; m; ^, P, I  O# i4 E8 q3 A$ O
   //写数据时将数据在底层存储起来,等到中断的时候再发送
9 J$ j, I8 Y( g1 A& g0 `" [/ E   //AMBE2000输入数据是以0x13EC开头的/ Q* ~4 V' y# a4 a/ k* w/ v: s3 @
   write(fd,&data_write,sizeof(unsigned short));
' w: D% V& ]- V1 e   
4 ~2 e8 j: }' g' p. o   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
, D, q& H! V. q& n( i3 o2 `   read(fd,&data_read,sizeof(unsigned short));9 w8 y1 e& z6 |
   
9 g5 v+ `+ P+ q   if(data_read == 0x13Ec)( ]( d/ _: V$ g9 K( G0 L
   {+ c8 e6 {3 V7 m! G2 _
   7 s+ \' J+ j  M- ]4 ~# C  o/ G
    printf("data_read = %x\n",data_read);  t0 @1 n7 y1 |" {% U, ~) p
   }
; K. @) O! `, @3 Z   & f/ }" ~; N  Y3 g
   msleep(10);% ?9 B3 r: Y4 H! g5 V/ p/ d4 q
  
9 O) ~8 C% D: a. Y' m1 ?, Z7 i3 H  /*
, W" \7 Q$ \+ s   ioctl(fd,1);   4 I& l0 E4 B: A) a: I, j% p
sleep(1);! Q; F6 K0 [6 a  M
ioctl(fd,0);
* B* M2 l+ n( h9 z) q9 t sleep(1);
; S; r& }( \. s9 I */
6 U' ~0 y7 y8 @( y( {* V6 Q2 q1 ~  }   + o: R# c% k9 j
return 0;1 \* _& h' s1 H2 @

7 n# v6 n7 q& k4 c& U0 V}
: v# Q2 o2 e( U; {4 m* |' s/ t% V3 R4 V& G9 O; n8 I+ W
多谢各位指教,谢谢! 急
# q' [4 [; A: o+ m- H( e: V; a1 h& y8 y9 H% f8 ]$ k" s$ A
8 R- w2 \8 i4 E6 N  C$ j* D3 B

( p4 y" q8 c3 d4 t) Y6 b( D3 u8 k: s4 _8 `* t- P( G$ C: W% ]5 a; S

& \, _' f' W2 O: X5 a. `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-24 20:51 , Processed in 0.054097 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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