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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 o- F7 @% O. e/ J! B( X: }" p9 `/*7 V/ g; y; r) |1 }
* Copyright (C) 2009 Texas Instruments Inc
" t: ?, x2 D* E/ i *3 S* f2 `( B" ^( w
* This program is free software; you can redistribute it and/or modify
1 z6 x) g3 i- N * it under the terms of the GNU General Public License as published by1 ?, N3 x, k" F
* the Free Software Foundation; either version 2 of the License, or6 q9 @) _. `) G) A
* (at your option)any later version.2 \$ T2 X2 `. _' e5 D, }+ m
*% F7 ~) M) p& h& i5 a; v+ v: K- `
* This program is distributed in the hope that it will be useful,
7 ^1 f, \& T, B, Q * but WITHOUT ANY WARRANTY; without even the implied warranty of
, F1 ]4 t' Y: G1 E3 X' t9 W * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5 P) J* r+ R3 x! P% K6 y
* GNU General Public License for more details.( }9 k' U, m3 g% g
*% N; S! [& Y" G; c: v
* You should have received a copy of the GNU General Public License7 P8 x9 }! N4 m  A% C
* along with this program; if not, write to the Free Software2 v/ i* V- h. G0 S- J+ |2 ~
* Foundati
3 l2 u4 [* n+ i& T" d0 n: w*/
: o" q, T6 y" t+ E2 d" g3 c#include <linux/module.h>! h# |- Z8 m* x
#include <linux/init.h>6 [0 @$ ^7 I4 d0 i8 I7 g1 {4 L
#include <linux/errno.h>
5 |, A; K( Q0 @0 X& W1 y8 G; L. [& p#include <linux/types.h>, T1 r9 N7 Y2 U
#include <linux/interrupt.h># y* f, z! I( L0 y' I
#include <linux/io.h>
5 P5 z2 i: B: Q" w#include <linux/sysctl.h>/ m9 B7 g" _& g+ T4 E7 n4 [$ m
#include <linux/mm.h>
* ~% `0 l9 z7 |7 m* T  `0 u#include <linux/delay.h>" v: C2 a* j7 [2 Q9 x6 d
#include<linux/kernel.h>
, W5 j" i) s/ q#include<linux/fs.h># n8 Z4 A+ r- u7 _
#include<linux/ioctl.h>1 A- X5 q& I! D' ~- I
#include<linux/cdev.h>
5 Y0 s$ x: @& c& Z$ D( u7 U#include<linux/kdev_t.h>
2 D* Y+ ^5 N2 k) D#include<linux/gpio.h>
+ I: K/ @, q% s3 {2 @9 D#include <mach/hardware.h>% V4 `& H. V3 q3 T/ e
#include <mach/irqs.h>
3 g0 v- Z. z5 Q8 G* X- F
$ s- m# K0 U' {/ [: U5 ^2 _5 b' v#include <asm/mach-types.h>
+ Z  I+ ~8 U5 B; |) Z#include <asm/mach/arch.h>
; i1 l5 K! G) p3 V5 b* f#include <mach/da8xx.h>
* W, E- S7 U  U( L#define  SYSCFG_BASE   0x01c14000
, b. G) w1 i: B8 B0 @#define  PINMUX1_OFFSET   0x124 . H8 ~3 L) U1 g+ w
#define  PINMUX18_OFFSET  0x168
$ \9 @3 y7 C1 @" n* B#define  PINMUX19_OFFSET  0x16c
; J- M- b: |9 e9 n# O#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR9 T( S. s, B6 x% e( E# o6 V- q; S
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR3 q/ s- ^( ]  C
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
1 ^7 W* d  x  y#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR" _7 b+ v# L& G0 N
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR* [, ^- i3 v" h# Z
                            ( x7 |3 ]& p. N6 O
#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 \& }( u, I/ A5 v0 U
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR4 |4 Y( Z2 l$ m6 t1 K8 g! ]
//PSC
3 n* B+ i7 I+ O4 [#define  PTCMD_ADDR   0x01E27120  
, p- i# ~/ n1 d3 D, Z: o#define  MDCTL15_ADDR 0x01E27A3C' R: Y# ~, z" B9 T5 l5 k+ ?+ `, w
#define  PDCTL1_ADDR  0x01E27304
  i  Y! U' x# P" J0 w//GPIO8 direction
7 }  `7 Q: X$ Y& l  S- n% S0 Y#define GPIO8_DIRECT  0x01E260B0
8 [% e8 u% N9 h9 b0 P' t: W7 L#define GPIO8_OUT     0x01E260B4
" [: {* d$ X9 C" X: ~#define GPIO8_IN     0x01E260C0
7 a1 f5 G9 M, ^# v6 j
( |# g9 D; H  p+ y//#define MCBSP1_RINT    99              
$ e9 s; x: s! V) |//#define MCBSP1_XINT    100  
. E' ]. ?8 f1 I  f1 U) k7 o5 U8 ostatic int MCBSP_MAJOR=239;* n- J+ W) \5 m4 z3 a! E
static int MCBSP_MINOR=0;9 P( G& X& V1 h# s5 C$ b' `
static int count =1;9 ^( K9 ^9 ]- {0 W' l& E/ g$ G

1 `! B, T' {/ F0 g#define MCBSP_NAME  "MCBSP-device"
3 b. h! J6 Y5 w% ?. d' G3 s% _. R/ D. i- m- r  e! q3 x9 |
static struct cdev *mcbsp_cdev;% b& M* z( [$ b: X; L; S
static struct class *mcbsp_class;. J: B  z! x8 ?* T( V
static dev_t mcbsp_dev;9 J6 r9 Q" V. i; d( W6 d
unsigned int DRR_data;
# c- `8 i3 x8 B) vunsigned int DXR_data;5 x8 @- L& n2 {
static int mcbsp_open(struct inode *inode,struct file *file)9 ?6 e% T5 R  U. P% v. V) N# J
{0 k5 z! ^; s  l/ N7 _8 S
   . f$ ?% A( @/ t7 j) e+ [
   //interrupt enable,initialized2 ~) R$ ~* o' ]
   unsigned int temp;
  _! Y/ U& a2 c: [   //SLEEP_EN(GPIO8[10])---0& j/ {  `' R9 M' }' M( m
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 X8 }# |' B2 C6 }
   temp=temp&(~0x00000400);
) [0 ?: [1 v- k% _( K0 ?' Z   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
9 v# S, |# d, ?2 ?5 L0 n3 |  //RESETn(GPIO8[8])----0----1
. a- Y4 q/ I3 S1 G: {3 M   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ d: b/ i' s6 u6 f* R6 F/ Q- C   temp=temp&(~0x00000100);4 F# P0 C( e9 _, U# C, z
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! t/ X4 L* T! j; d# q   udelay(100);
% T7 S" ^! ^( S  _   temp=temp| 0x00000100;
+ y9 u% ^& K+ T8 u- a   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! ~* Y6 r: a9 s4 C5 r$ I
   udelay(100);
1 a; s& P8 v4 \1 }4 c6 M   printk("open success!\n");
( W: [/ a  u: l& ~8 I9 V% w   return 0;, y2 o! P& r, r/ E- O
}
4 g- m0 O! Z% r0 w8 b& H* t6 }7 w( x) ?! n7 U! C
static int mcbsp_release(struct inode *inode,struct file *file)
9 i+ {: q5 e: Y* W/ k* d# R+ ~{% ^! N( q, {0 u# J3 w+ B
   printk("release success!\n");- ^. _) o: R" m2 ?' Y' r3 ]: J
   return 0;# b- `' D$ K" Y! o7 s) W
}9 C, i! |0 D9 u- X8 m7 R6 j4 h

% o' @& I$ U  P% S, h# V0 Wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 q: R3 F" o* D1 a" t8 q
{8 t  v$ g' F8 b3 z
    copy_from_user(&DXR_data,buf,len);* V% b$ ^) l+ P4 w4 ^- x
    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       - Y9 d8 W6 a! k3 Y+ B' D  K
    return 0;
$ A! {( s: c4 O9 @
. C& b. a3 W: M}, t6 D, N/ u5 Q
" B+ s2 P8 [! Y0 A2 Y1 c3 n% q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 c* Y, l9 k! x& l/ [
{
2 N! u, r, T6 K; r5 x9 o   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));1 J6 o6 V2 j# |  Y# q
   copy_to_user(buf,&DRR_data,len);
# z7 X% n) r6 |$ c7 e( @   return 0;- k+ D- ]$ ?0 ?; ]/ o! L
}' B% ^% O2 Z3 _# L" v
% o& J% X& T2 E- T+ j7 ^# T* P) G

9 j, j2 ]0 p3 Y2 }( {; W* lstatic struct  file_operations mcbsp_fops=, R8 s; s/ l% c. M+ f+ o5 R
{
9 {- C5 L9 ]: b   .owner=THIS_MODULE,
% a: D3 K( B# ]) m1 h4 r   .open=mcbsp_open,  ]& k, h4 y( g) O$ U8 M1 b
   .release=mcbsp_release,) z7 D# h' t( W/ i/ h% N2 R
   .write=mcbsp_write,& S/ a; v+ N# y# F$ Y7 d
   .read=mcbsp_read,
1 Y. K3 b- M( f};
# @* b6 c7 J8 Dstatic int __init MCBSP_init(void)
, n. w  |% t; Z& c) @( n" a+ k{" ~4 U4 c1 n8 p& P
   int ret;
( _( {+ D3 p- L6 O0 W9 P- X$ z   unsigned  int   PINMUX1_REG_old;
0 @- }0 c+ W8 f0 \' q0 N   unsigned  int   PINMUX18_REG_old;
6 T2 b. d' B; l8 ?6 }: I  ]. d   unsigned  int   PINMUX19_REG_old;; _! s) O# Z; V4 f: P* {3 K) \
   unsigned  int   temp;  
; \8 D, R- n( `4 @   if(MCBSP_MAJOR)
7 d0 p+ N2 V( n: `  p; C! M8 R   {
8 P; l: q2 E% ?      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- L: M8 V! k4 N0 H0 v) G' {- j% U      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);8 v0 l! [* t9 w+ }2 F* x
   }
/ }) f+ p. B: \# @   else. ^4 Z9 e" O5 s% L- W
   {
1 b7 x3 m& D7 B3 r      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 m! V4 m! H7 z6 r5 X7 c
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 b0 F/ h2 _( {$ c7 ?+ n* |   }; C' }/ O7 u( r: z  b& P7 \; J
   ) p0 l: h, m: F$ @) a! i
   if(ret<0)
' S# k; J8 y3 |2 h5 r   {
6 j- N8 E3 ?  C$ z      printk(KERN_ERR "register chrdev fail!");
2 B% O0 e' K; s      return -1;
; S5 S" W4 G  |- C/ l9 |   }
* U" K' u( i: f6 j( H* A' a   , {1 k& d$ a) z
   mcbsp_cdev=cdev_alloc();( d; l* L6 j1 O5 P% {# F0 H
   % n  q8 r5 `' y3 d  f
   if(mcbsp_cdev!=NULL)
8 m7 ~9 U  `2 h2 W% f( I   {
2 n6 n+ n! v- `, b2 |* X      cdev_init(mcbsp_cdev,&mcbsp_fops);2 O; X0 _6 A( p5 p
      mcbsp_cdev->ops=&mcbsp_fops;# s3 ^  R+ k. E3 |- A. [
      mcbsp_cdev->owner=THIS_MODULE;1 Y/ E/ {( N2 ^1 B2 i* v- T
      
; _* O, Z. g7 \& r0 E. p3 R& X9 r0 a      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
5 i1 x6 q0 T- e4 O, i          printk(KERN_ERR "register cdev fail!");
# z: ^- @, F& X' o% q) [4 V! u      else
+ y9 m+ K& c2 Q- J$ c  ]- v5 C          printk(KERN_ERR "register success!\n");$ X$ Y" T0 [7 t1 @) ?1 C
   }; ]8 n! _5 m+ b- F1 B
   else* s  m9 i+ p/ G: _( [# \+ v# \
   {8 ?+ G( {2 W4 m; O4 H; w' v. n
      printk(KERN_ERR "register cdev err!");
3 c  A! H# n5 i% U! D2 A      return -1;
" T' M1 _% e/ k/ |$ F9 H% y! ^  |   }8 o* g' s# ], b, Y0 m
   
* }+ E  N2 a( [' I  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ f% b4 E8 W; L& X1 p! Y
   if(IS_ERR(mcbsp_class))
9 p: |" u$ n( g' w8 a7 N   {
8 a* i. \* B) F: x$ k7 u      printk(KERN_ERR "register class err!");8 v3 u' A$ }; ~2 q0 G! C
   return -1;
5 ?* }- k$ w& P+ G   }
3 T2 O( Y5 B1 b- a; i# ?   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
  F6 L9 Q, K4 a& |+ w) }' Q! S
/ u+ e! p3 L3 w) W   //PSC
8 u: o+ t. b& Q, G* f* p3 \- K   //add Enable MCBSP
5 y0 t. L9 k& |# u$ Q8 k7 }' N$ X   //test
4 K' }- E6 S) t, p% ?8 S; i   temp = 0x80000003;
2 m. G3 T0 z. l% H' b   writel(temp, IO_ADDRESS(MDCTL15_ADDR));- l3 ~4 a) F, Z6 S5 j5 q
   temp = 0x00000003;
3 Q8 n7 o# Z. r) B* u4 L& F   writel(temp, IO_ADDRESS(PTCMD_ADDR));3 U: M/ p3 Q+ Y) i" {/ ]
5 @& b- p( ?4 }
   temp = 0x001FF201;
; S: B0 ^6 T% L9 M# A9 v   writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ R' s, |3 Y1 s" V/ R
   ! N% _6 k! S( O+ g6 P9 [& _* X- K
   //PINMUX  3 z# b8 Z8 @* J' I  o' }
   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
4 w& f  s$ @+ Y   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  ( G' U/ e- j) M! _5 j" h; C
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
) H& X: j. P- i! k8 {' t   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 H' }5 ], i! Z7 M3 \# l1 S
   
2 o" n$ i3 z* y& H0 n+ C   //SLEEP_EN,EPR,L138_SHK1,L138_RC* ^4 K  t% ~7 u, H9 t
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
$ B: L5 y3 J$ d4 j# Q+ r/ o, q   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   8 i/ c- L1 n0 F" m" U- I
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 a2 }% p6 j& q: Q; _; e' Z 8 ^& K0 l7 {& p) A
   //RESETn,L138_SHK2
0 P+ g+ M/ Y" U8 n- b9 @1 l- O   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
0 ?6 n  g% |5 P4 W2 U   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   , y5 `7 k; ]% Z8 K9 C( L
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);% u9 \, B( Z7 Z

! n, @( ~9 V  A" X* r- I0 g: P' q& p
+ Y- F1 I0 x7 ~! R/ R8 g  //SPCR Register7 O! p' t- @8 _0 w; a/ k5 w& ~
  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 O" t; O, h% z) n# B/ O- L0 e$ d  temp = 0x03000000;//(DLB=0)' _: m, P& T+ @- W. o: I
// temp = 0x03008000;//(DLB=1)
' V" h0 h. h: C  `* \0 A, D4 b  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset# O# C8 |, j" L: j' B1 R
  temp = readl(IO_ADDRESS(SPCR_ADDR));
# X2 v0 G6 h0 ~+ T6 Q1 s3 ^  printk("temp=%x\n",temp);3 F" m! r3 z; c

8 x  C2 W2 U+ N* d' M( X; ]   //PCR Register
- ?- F- ^0 m! C# d' Z( q* C+ G   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( g) V, `. Y# R; M! M9 v9 d* R  // temp = 0x00000F0F;) }) Q& ]( A* G' f4 }: G* Y; U
  temp = 0x00000B0F;
; u( g) X5 Y% Y# C: \7 P  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
0 n* t9 @8 u- d! I5 b  temp = readl(IO_ADDRESS(PCR_ADDR));1 H! N/ f1 W# f. z
  printk("temp=%x\n",temp);  ) |. h1 Q* Q+ C2 n, E
   //SRGR Register# j$ t# e' q# `* I, V4 o
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- }8 y+ {% T2 t0 \5 l
//temp = 0x301F000B;
: X8 u+ C  E! B! w) {' L/ N   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized + E( }! ^, s, U5 @: a
  temp = readl(IO_ADDRESS(SRGR_ADDR));
9 g' h. p' w# K$ U) Q, |6 ~5 ?4 }1 p  printk("temp=%x\n",temp);
# ^7 P  Z) G" b$ `; T, j& L   //RCR
7 T  @+ _4 r. Q% Z; O$ v   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,  ]0 S$ c  O9 g! z7 Q0 q
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 J: e* B" }- j
   temp = 0x00440040;- o' d5 r, `- S
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   & k& z5 W' {7 s0 b7 x8 @  J7 a
   temp = readl(IO_ADDRESS(RCR_ADDR));/ N* X) v8 d& U
   printk("temp=%x\n",temp);
6 F1 q8 Q7 D9 E( ?) ^" J6 |' I   //XCR$ Z7 z! y) r& L1 w! a: o
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ k$ c/ R- v: F: F1 d6 \
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-05 n- K; C- B. O% s5 I
   temp = 0x00440040;
- A& K! s3 H0 u& {) u9 [: C   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
4 Q' e6 d( k5 \. k( @* \( j   temp = readl(IO_ADDRESS(XCR_ADDR));
, u1 k. K  a7 n   printk("temp=%x\n",temp);
( s& I: c; d* {+ j: M4 ^/ E  udelay(100);) F8 B6 F8 T& H
  //SPCR Register
- p% A1 h; p8 I3 \4 }3 Y2 w9 z; G  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1) E8 q: q& g' @
  temp = 0x03C10001;   //DLB = 0 VS DLB = 16 d+ i: d" I8 f0 ^3 B$ b- l! v
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled8 z+ g9 V. Z4 [' `
  temp = readl(IO_ADDRESS(SPCR_ADDR));- p0 |: J  g( L( A
  printk("temp=%x\n",temp);. \3 O( i2 ]4 k  n, b% k) w
  udelay(100);
5 y( p/ y+ H1 v4 T! K9 R3 X7 t
3 K( z7 b- H3 G: y2 i; V' O  //set GPIO direction& v' ^% d3 ^1 q0 \" T7 b$ X9 r3 U
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# n, f3 U6 w: C
   temp = temp | 0x00000100;//EPR----input' B- }/ \8 q& A/ `' h: q
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; }: l5 Q6 Q# z6 S. ~- H% U
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
/ k2 m0 `, ?) H6 I' A 9 `* o. T( @" e# s
   return 0;
  m$ e2 J. n! C) A4 B/ [( x}& z0 z" V/ B' Z" D1 f
static void __exit MCBSP_exit(void)' w: |" r2 s2 x: O7 p3 `
{$ C; N  N1 L$ ?
   printk("mcbsp chrdev exit!\n");
: L3 @4 h+ ^1 Y/ y: Y  z6 f7 R   cdev_del(mcbsp_cdev);
3 m$ U' O% e$ N: J/ K   unregister_chrdev_region(mcbsp_dev,count);
3 V$ h& B2 K& r; L/ w; y. |" N   device_destroy(mcbsp_class,mcbsp_dev);' @% i/ K' O  D7 U7 {1 n
   class_destroy(mcbsp_class);- d+ b( h0 F! t0 `7 _- P: t
}: P/ h# I/ K* D! L/ j, r- v
module_init(MCBSP_init);8 H2 ~0 c$ H, z* ^; B9 M
module_exit(MCBSP_exit);! n( [% y; M" K* o: d, x

# S* V9 B  u' nMODULE_LICENSE("GPL");$ l" {' r( @# s. K. L* p

5 ]( X9 E. h# K8 M2 r  Z我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ B# C$ E0 S9 s' q9 K! i
我的应用层的测试程序如下
: {. a) z. y% K1 V% }#include <stdio.h>8 K; k" Q1 ~- j) m% B& D
#include <string.h>
5 e2 ^, B7 u- N9 m2 J$ p+ e3 b; P#include <fcntl.h>
! E( E. \, W; J8 j6 x4 g  i#include <unistd.h>
  _# N1 K, n( j' a2 _#include <signal.h>3 X5 T3 c% z& v) N$ s- A
#include <pthread.h>       //线程
: \, D$ T" b) R#include <stdlib.h>
+ k7 M' Q# J+ ~$ U9 A1 {. E' S( G) J#include <pcap.h>          //捕获网口数据' E$ f8 x5 |2 y3 v2 k
#include <semaphore.h>     //信号
1 c0 X( l9 M2 G; Q5 H" W#include <sys/types.h>     //消息对列
! M9 A7 Z+ O4 d; c#include <sys/ipc.h>       //消息队列
* _9 {7 A# C  [$ s5 l' z7 t#include <sys/msg.h>       //消息队列. A/ L+ @6 u5 Z6 g) G4 X
#include <sys/select.h>; G8 D6 z" J2 B. a, a4 q
#include <sys/syscall.h>. t7 h7 m, m* O, Z
#include <sys/stat.h>
" H9 z. k8 ^( x% v1 {- u#include <sys/mman.h>
: F- g! @/ S5 Q& |/ z#define msleep(x) usleep(1000*x)2 Y" w( p* }/ f& |9 }

  U, K$ ^* V' d: [. j7 \9 fint main()- A% ~: ~+ m6 K& F% K
{
% Y2 `- P0 o4 N3 T1 P    //MCBSP,ARM与AMBE2000交互设备
, ~5 G3 Q' w9 B int fd;" u" B2 A/ D6 e! p9 O# n7 l: u4 D& f
unsigned short data_write = 0x5555;
9 Z' k$ u: r" M/ z8 f( B unsigned short data_read = 0x00;- N9 [5 G. ^3 c
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 I4 J, h* v# ^+ L
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);5 F5 Y9 V; Z# K3 A
   
# e" h5 Y/ y& i# I8 Z  if(fd < 0)3 f0 _( O* S9 e. {; j  u  Y. Q/ d
  {- p7 h* U% g5 i. q1 f' ]1 F
     perror("open failed\n");
6 P/ t$ |, S) Z- h1 b5 |     return -1;
! y3 W4 D7 b- t' }4 J0 i  }7 a" l& d6 x  g
  , \: C4 e# N/ a7 a6 H- z7 U
  while(1)
  @0 {* h; D/ G( c' B; v+ R  {
8 B' |- }  Y5 u2 t2 l   
. p1 o" }. x) }" Q# W3 Q   //AMBE2000每次读写是24个字为一帧
3 h! q/ }0 A4 i) j" ?1 n   //写数据时将数据在底层存储起来,等到中断的时候再发送
8 D9 _- n9 b3 c+ X   //AMBE2000输入数据是以0x13EC开头的
( w  U! o; Q# A& Q   write(fd,&data_write,sizeof(unsigned short));1 L" G6 q- K3 j3 O5 d
   3 O1 m8 \" c) a' x2 p
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  & C6 g2 [8 ~) B1 M( }" l* a6 a' x
   read(fd,&data_read,sizeof(unsigned short));
! K# s( c2 M/ `! d1 J5 S3 V5 @   
4 _1 V7 y3 K* c* I- P   if(data_read == 0x13Ec)
5 \: U! K; S0 A/ T4 h   {! Y! J5 M! V9 X5 }1 L2 c9 A
   " N0 D9 J  {, q9 W! P9 l9 O, [
    printf("data_read = %x\n",data_read);0 t9 R, N, x# ~4 Q  g
   }5 N; i% f: `$ C+ }$ G" F/ T$ n) q4 A
   3 i! A$ Y! J: ]" B0 o
   msleep(10);9 r* U! r3 o; Y* P, x
  
8 d1 d" i3 I2 M, z) X  /*  j7 o5 m: S' x  E/ }/ ^
   ioctl(fd,1);   
9 f" D7 `3 S9 n$ g9 c/ V! h  t sleep(1);8 k/ f, k' {1 {8 a/ {
ioctl(fd,0);3 c# g5 }7 X6 L" e4 L" e) g
sleep(1);
+ ?6 o# k  k8 a5 m) c; k4 G3 X% y' t- F */
2 \# `( J3 `$ O% U7 f, P4 e  }   7 V$ ^: v7 ?" u
return 0;$ y* v9 W% C3 q7 F
  t- R& X" [6 n" f* ~
}( e3 s- |( k# k: F+ x" D& r9 }
( l8 A1 r; J' f  o4 s, i
多谢各位指教,谢谢! 急! s+ f% l$ ~7 B; V% s
/ d  m! J' ~& l; ^5 I# ]
. Z" `5 }' w3 y1 U% ]  u  r  L
6 y7 G' }# h  u& L: J% B) {8 f& A

9 v. @: S1 J2 K% Y
$ `, F' ~" ~; Q& L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 03:27 , Processed in 0.048795 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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