嵌入式开发者社区

标题: McBSP时钟、同步、数据线不正常 [打印本页]

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 l: `1 _) ?& q6 A( h( }) W: ^
/*) J: E6 @- j' @
* Copyright (C) 2009 Texas Instruments Inc& l3 F) y1 j: @! y. c& m
*
9 [- `6 U# J% l& F! d/ | * This program is free software; you can redistribute it and/or modify. P  e0 q  T, ]8 `, B, I; p8 S# ?6 s
* it under the terms of the GNU General Public License as published by
: N# \6 W6 s9 s6 c * the Free Software Foundation; either version 2 of the License, or3 s* {/ j0 _5 `- H& ]1 [/ ?. D
* (at your option)any later version.
' M) C0 ?$ r" w" k *
1 a7 u$ k' ?: V# N* g9 E, D% _& J" \ * This program is distributed in the hope that it will be useful,
# l5 z; }! Z# }1 M0 }% q9 I * but WITHOUT ANY WARRANTY; without even the implied warranty of6 O9 s3 X! s$ j9 [, q! y* ^- M
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# w' _! G- |6 E5 G6 o) l. z
* GNU General Public License for more details.
: M" u" z7 E) J) A; O *
5 V6 p: Y7 d" S/ d( ^ * You should have received a copy of the GNU General Public License; \; F+ u: \* f/ _* Y* L9 ~
* along with this program; if not, write to the Free Software
+ r+ T7 e% i( L6 r* [ * Foundati
; X/ I" h' b* {: E% X8 E1 ^( l*/  r1 F* g( s: }* V
#include <linux/module.h>, n4 D+ p) L4 B5 }# k" U- T
#include <linux/init.h>* z& m( r( {% c
#include <linux/errno.h>
" A* X8 o# P3 Y1 z#include <linux/types.h>
  l- g2 X! |: V) [* n  N% ^! B#include <linux/interrupt.h>% M; a; Z% W$ F5 w  R/ n
#include <linux/io.h>
- n0 N8 Y: a( b) d) X$ o" q#include <linux/sysctl.h>" E2 k: y% W9 {, y* W
#include <linux/mm.h>( o7 e2 K8 L7 |2 Y, F- M: h+ }
#include <linux/delay.h>
$ R: s5 l; ]  a#include<linux/kernel.h>, Q. g9 x$ E5 }3 k
#include<linux/fs.h>
" Y  l8 ~& |# `: b0 y  [#include<linux/ioctl.h>
+ _* G; B7 ^6 b- h5 j0 s#include<linux/cdev.h>
7 |( O+ n4 f/ h( y& H. D0 g#include<linux/kdev_t.h>2 P; G# d/ N7 l4 ]2 P; u: Z
#include<linux/gpio.h>
( ?* ?) Y: f- H  x! v( q7 O9 [#include <mach/hardware.h>
$ ~8 p7 w2 b4 z' V2 {  c; J#include <mach/irqs.h>
3 x  @* F) y4 ]
6 |1 q! U9 X. M% k* Y. W#include <asm/mach-types.h>
; q/ c" v. w! G( B5 C6 ?8 K$ l& _#include <asm/mach/arch.h>
( ^2 I( J. t0 v/ E#include <mach/da8xx.h>0 Q) V0 y  Q( w$ A. i1 l
#define  SYSCFG_BASE   0x01c14000* \5 _+ @, k, e/ f" n
#define  PINMUX1_OFFSET   0x124 % A" W* N4 l  L  S" u0 ?
#define  PINMUX18_OFFSET  0x168 + B) n2 [. Z+ ^: J/ N8 {! |# W
#define  PINMUX19_OFFSET  0x16c
+ E- _+ k( |0 [) u#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR
, F5 e- Z8 j0 ^" N#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
, V8 _1 t3 q6 w; B5 G#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
" W2 i0 F3 |% R/ {/ X- S0 j6 ]3 G3 ~#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR: X/ }# I! v& z) {" o2 p: s) C- n, H2 n
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
) h- Y0 M9 b0 h" J( z                           
' E) p, x0 A# @4 c' e* T#define DXR_ADDR      0x01D11004  //MCBSP1_DXR+ l' f, L% @5 j- [
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
9 P  C2 E1 r, H; C4 c7 ?//PSC( ]! R5 v8 d- O9 v/ f, P+ z
#define  PTCMD_ADDR   0x01E27120  
1 [6 J# ~( a& Q! q& v2 D. a#define  MDCTL15_ADDR 0x01E27A3C; N+ P, ~# S  E0 Z
#define  PDCTL1_ADDR  0x01E273045 F! u  j( A) ]
//GPIO8 direction8 F; M6 E3 F- F  w" X: |; J
#define GPIO8_DIRECT  0x01E260B0' r. O( `3 Q5 v  [7 O- g( |" ^; ?, e+ m+ s
#define GPIO8_OUT     0x01E260B47 ?, Z, X" ]: J( H& G
#define GPIO8_IN     0x01E260C04 O+ Y2 }, g+ ?% w. S. V* v
3 p8 W4 V# b& l; ]* Z0 W7 V( f
//#define MCBSP1_RINT    99              
1 ^* `; K. ?+ `7 Q: c' M6 z' \1 K; D//#define MCBSP1_XINT    100  & T4 @' {& z; |: ?9 L) d4 o- R
static int MCBSP_MAJOR=239;
* n+ l. T- E: }8 O4 y  |0 w& q) Mstatic int MCBSP_MINOR=0;
5 X* T4 l2 _1 O' V3 f$ Estatic int count =1;
( s. ], l% y$ X0 |( P% G
1 x# v! F: |5 Q6 m: M+ U# ~2 U( a#define MCBSP_NAME  "MCBSP-device"- O8 a( N7 x6 H
: j6 i0 o! R/ b/ M+ m1 F2 L! H
static struct cdev *mcbsp_cdev;& \: q) a. n- [- v9 f
static struct class *mcbsp_class;) J' m2 B- E9 W, m# p3 A0 u- J! D$ B
static dev_t mcbsp_dev;4 _  i# O# ^4 u( O1 ^
unsigned int DRR_data;
1 K# Q6 r6 u! Z. @0 T0 q* aunsigned int DXR_data;$ t; L6 v4 |8 w% K+ Q, S
static int mcbsp_open(struct inode *inode,struct file *file)
+ K3 U% j5 T  x- P9 E{
$ s2 M) J: ]& k. X4 S! k   
# X; P" i9 s2 V$ I/ B   //interrupt enable,initialized
% ?, d" H: L: n8 P; {" q7 m+ N$ t   unsigned int temp;
. Y# s! q$ b2 |" i! P: T2 A   //SLEEP_EN(GPIO8[10])---0( H2 O6 Z% q8 [$ m0 Y" ?( C
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 p) i4 w0 C4 ^- v, q   temp=temp&(~0x00000400);
/ O' V3 h( F! j' |   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 s; ?, N5 f; N. f" ], m9 ~
  //RESETn(GPIO8[8])----0----1  Z% F$ C) F& C4 b4 j0 n
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% n. j/ @' U  s( U& @: M* ^   temp=temp&(~0x00000100);
0 ]4 F$ z4 m& [$ d* [6 P   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 E1 u9 ^0 m5 e/ r% A5 \   udelay(100);2 u, X& l( y% n5 u1 G% ]3 T0 K& ?* S
   temp=temp| 0x00000100;
+ C" |3 K& I7 }9 H   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 ^7 W4 V3 K" W+ k; i6 Y   udelay(100);+ H7 B- h' ^  U
   printk("open success!\n");/ i6 u# G1 u+ \  l
   return 0;
7 R6 U  r( }; E( Z. I0 B}
# ^8 o! V# Z3 D1 j
+ Y' Q7 W* `$ z* h0 ?4 }. Cstatic int mcbsp_release(struct inode *inode,struct file *file)
' N8 `4 }4 ]. d& F6 s" n$ J{& |2 r* C0 Y3 j1 f- B! V. u
   printk("release success!\n");( K( l* A& P% A8 M" `
   return 0;$ x% m: A* @/ H  ?
}
. y. n( t8 L% L' |1 \6 |4 D) m% }6 r* S7 p5 O" h! f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, h/ w7 z3 V" f% b7 V1 s{
$ y. a: v. A% U; B1 E    copy_from_user(&DXR_data,buf,len);
  `3 q0 l% G, ~/ l2 J! U    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' S9 a8 N( {+ X
    return 0;  h$ r8 Z) {3 E! G

  S# Y- U% W% ]3 N  v}
! b$ v4 H9 P; Z# o2 J& T
0 c- U( P1 p! h* gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' Y& J" c6 x) ]5 u, G) o
{
/ F2 [) f5 A: d- l( K/ ~   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 ^! g4 w) F' q$ _0 z" O   copy_to_user(buf,&DRR_data,len);
8 H4 Y, |9 C2 A, J. `   return 0;; Z! B) Y! r+ q/ O; T  E" E9 C
}
  t5 H; o7 B4 }& {' z! B: [; i' x# ?% t' O# p) k

# N7 b$ o4 ]4 e* Bstatic struct  file_operations mcbsp_fops=
  R, W' P0 v# i0 S1 v; H7 H) l{
* [- U: K( i5 X   .owner=THIS_MODULE,
9 M2 p8 C' _. Q0 w3 u& Y4 x   .open=mcbsp_open,
& c" Y# g- ~* e$ @" f! `9 [) a0 c/ D   .release=mcbsp_release,6 J! c# ~" r# [/ i+ `8 X
   .write=mcbsp_write," y: o! x" r( V0 _' |2 r
   .read=mcbsp_read,$ H+ a& Z. @+ f% X
};
; C$ I4 }  N  `5 z# S. [" y! jstatic int __init MCBSP_init(void)
3 M& r2 V$ n% ^{* q) x- t+ t1 L& d# t% v% {* x$ r
   int ret;) l+ @: W3 I% |% X# g4 ?. j# \( l0 C
   unsigned  int   PINMUX1_REG_old;
0 l8 t- ]0 i, K# X; @8 G2 P1 u   unsigned  int   PINMUX18_REG_old;
' t" ^. _4 c/ ]# q( C$ O1 c   unsigned  int   PINMUX19_REG_old;2 S9 z, s) V5 c8 o2 i
   unsigned  int   temp;  
, Z& z% y% {1 j# v( S% }& I   if(MCBSP_MAJOR)8 [6 H( i. F4 h: f4 s
   {
" s( x* S3 o) @      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( C+ f5 A+ r$ U7 `% Z* @  ]6 [
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
5 \% \. `' W" I. r, w: c; ], D   }. E2 q6 U; p$ y; m* X: d
   else) C+ X9 w) A2 C* P" g. f0 E& s5 r: ?/ A/ v
   {
9 ~0 ]* ]0 M' T      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);% v5 @- q; B% i3 N  a* p9 F& ]
      MCBSP_MAJOR=MAJOR(mcbsp_dev);# e# _* n# s1 V8 w( g
   }, g' y9 s( ?5 E7 d' |) z
   
0 o; a2 ]; Q6 z& G# F8 H5 n6 c* ^   if(ret<0)5 }' k5 `5 p# }: Q1 }
   {
5 s8 W! t8 F8 B- ?0 p( ]3 w7 {0 O      printk(KERN_ERR "register chrdev fail!");
! W" j2 H  y. p      return -1;; H$ b, y6 e0 a9 A9 n2 B
   }  }! y7 i( ]0 d$ f' y
   6 K* H" X6 Y- Y' t% C3 B
   mcbsp_cdev=cdev_alloc();
( y% l" y1 M7 G/ u1 }: b   3 E& i) y% N/ E/ T+ d2 K  }' Q
   if(mcbsp_cdev!=NULL)
! j; ^! y$ d2 L: |. B! P* [+ M   {" ?* |1 L$ k: R7 @, i- S) o  E
      cdev_init(mcbsp_cdev,&mcbsp_fops);8 b3 `: ~3 g4 w: R  q
      mcbsp_cdev->ops=&mcbsp_fops;
4 ~  o, S6 [- R' f8 Y$ V4 n8 `7 x      mcbsp_cdev->owner=THIS_MODULE;
0 @8 _3 W8 }9 N1 `2 c/ P. e8 g- p      
0 p3 {; F6 W( [      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% M9 N" w+ S8 W! r* O$ v: F1 Z          printk(KERN_ERR "register cdev fail!");
7 \" v5 a9 o" N$ X+ K/ V. A9 M2 M      else
! ~: e1 u0 N! P& s4 }          printk(KERN_ERR "register success!\n");0 b' A  `2 U- Y" {4 y3 R$ K
   }- O; X" r5 A1 c4 Q# x  L2 v
   else
( b0 U/ q' K' i: M2 V1 [   {1 c( f# H( {' V& |, a
      printk(KERN_ERR "register cdev err!");
6 {: V9 b* B, b% g! N3 C      return -1;! |& p7 m9 [7 B. Q7 q& C. K* H
   }
! A+ k8 c; k- C   0 P! Q& B* X6 |' `3 H: N2 \
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);# K  {- J1 x9 f- G! _
   if(IS_ERR(mcbsp_class))' d' Z/ o7 F, D2 K
   {$ J! B7 L! P3 V
      printk(KERN_ERR "register class err!");' {; p: P2 n) Q  D9 g* [4 t1 `
   return -1;
. `8 M; H" ?- O6 f( P& q5 n$ l   }
: T5 l9 @) H2 ?: b# s   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);5 j' \- g4 B3 A  h8 I/ a6 `
6 D5 }6 x7 K/ ]
   //PSC
8 g9 W5 x  Y6 K' {( X   //add Enable MCBSP& Y# a0 ]) b& g' t/ K
   //test3 K2 E) G  S6 B8 h& {$ ?8 h
   temp = 0x80000003;
3 G: q# G7 l' ^0 }6 g6 _) |# }   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! q% p4 K- Y- m: k   temp = 0x00000003;
- [  h( j* J4 J% `: }3 ?6 g: n   writel(temp, IO_ADDRESS(PTCMD_ADDR));
" \7 h' U6 I% y; Q! t 9 \' d$ C" [; d  }
   temp = 0x001FF201;
! h# l4 }" |# j5 U5 J$ K   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: `4 X$ F1 C# p$ W/ c3 ^0 K   
7 I, {0 h) y- n/ ~! Q& N- ~2 X* x' o: I   //PINMUX  
; [$ e% n( e0 @# T6 T   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" n0 n2 |+ P+ [" F   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
* d  t2 p7 m% k1 `4 F0 o   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
% _' z: x) N; q* x8 x* t   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 F- h  H, C& V/ b0 ]   
$ g7 C! \( E, S3 |4 `6 U   //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ ^* z" k+ v0 r5 {3 b1 s+ a, D   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  1 |" f$ X5 p4 K) ^
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; s" J2 l; T0 k
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 c3 @9 i! t( [0 s5 U( B" ^

! N  B7 L% S- b4 R0 S. D5 l   //RESETn,L138_SHK2, T( c' p' A2 Y' k
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  
# t- Y+ r' p8 O& d( @, C   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   7 H6 j1 z! m+ P( n2 D7 N3 z6 s5 }( g3 Y
   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' Z" u6 K( X" l5 M
' \9 C$ p( P1 m4 A3 v% K6 T

; f8 u6 X# E0 s  //SPCR Register
4 G4 S1 E# Q; N$ c4 V  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! T6 ?5 g  V) ?9 l; K) {/ {1 n9 U
  temp = 0x03000000;//(DLB=0)9 I1 `! q  C1 c8 k& b  K& U5 J$ I. O2 ?' O
// temp = 0x03008000;//(DLB=1)- u, Y. l3 V  W# n% k
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset2 }% {" k* x* x
  temp = readl(IO_ADDRESS(SPCR_ADDR));4 T) W6 n* S/ s1 w& P3 I( |$ J
  printk("temp=%x\n",temp);' Z+ M/ O: J1 N
8 H9 P  [+ b( ]+ [2 N" k5 M' n% F
   //PCR Register
, j1 h, \1 {" R! O" }4 a; o. H! u   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! e6 h+ B+ X7 w- h6 ?6 |; j' r7 X
  // temp = 0x00000F0F;+ m0 ~8 w' M5 B4 T  p- o# n& ~
  temp = 0x00000B0F;
" ^3 F& b, t6 x. U$ X  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized & N; i' R4 U  l( Y7 p
  temp = readl(IO_ADDRESS(PCR_ADDR));
2 e' ]2 d6 ]0 ]% f1 S, Q. n  printk("temp=%x\n",temp);  . [) B  p0 d- O8 y
   //SRGR Register8 {8 H% O. I- c4 x: S% D
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( \* E0 ~9 d3 P- M2 Z. o6 _
//temp = 0x301F000B;' m! B* U2 W3 V* U4 T: q
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: g1 V+ v1 Y7 `# g* n- s1 `* e0 n  temp = readl(IO_ADDRESS(SRGR_ADDR));
" o5 |3 a1 P/ A2 ^. |  printk("temp=%x\n",temp);
5 t& ]; z) o; z- a5 G2 {7 t   //RCR
$ L% L2 U5 i2 X7 Z% ^0 Q% P   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, j% \2 a% J# g& g/ a1 W8 i   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 O* g; K( \5 X# u/ X+ u) c
   temp = 0x00440040;
3 S3 ?- e. ^. I, G" f   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
. c& D' b/ i, @) p/ d  \+ P   temp = readl(IO_ADDRESS(RCR_ADDR));$ u, J+ q" z" u/ i# x' I
   printk("temp=%x\n",temp);" n" c  Y' s  G4 C
   //XCR
& S* f7 D/ H' r( `' K   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1. W" k/ j! q% M  [$ ^+ B
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  n3 ?, H1 o) c1 K# ]( m   temp = 0x00440040;
9 C; C; u3 O& M- ]   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   1 E( b1 L& y2 w0 J
   temp = readl(IO_ADDRESS(XCR_ADDR));" y5 E# {1 h1 Y$ G, X& J
   printk("temp=%x\n",temp);" v- e; ]1 s1 c* }' P% X
  udelay(100);
& u8 r7 [0 v: Q! {+ y" X, y; `2 t  //SPCR Register% F3 Z3 Y( t3 A+ E* `& A) ~
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-15 P: y# H& \$ I" V0 n% Y/ C3 p
  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
1 w0 k1 E5 R2 N7 P9 s+ Z+ A: {# z  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled& e2 C6 i+ Y6 @& q" M  \0 u
  temp = readl(IO_ADDRESS(SPCR_ADDR));
9 o; k2 {% b- a# v- c+ i/ c  printk("temp=%x\n",temp);
1 k- w4 g' B! q8 [  |/ S3 a  udelay(100);2 `7 j0 F6 j) l! E+ L1 Q

* P' }* p( ~* A; v4 `& l! y7 }6 _  //set GPIO direction% T2 _% _7 F1 C: V( O' s4 D/ Z
   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# N( z# `' }, l1 Q9 A% y2 ~# ~   temp = temp | 0x00000100;//EPR----input; }8 e$ _6 K8 g
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( r, a/ j8 E1 K% q4 W   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
( F6 k. B$ H, N1 F7 y; z- P5 H" P 1 [% \9 E" U: J
   return 0;' e3 p! i* o8 _! {. u
}
7 x: \& u8 J% I2 @4 r. p2 Jstatic void __exit MCBSP_exit(void)
( B6 e1 m' i& E3 c9 N) b- O8 c{* {  g9 B  H5 V8 ], t" E4 P
   printk("mcbsp chrdev exit!\n");" A' @  L* A6 j8 H. h3 z0 Q4 [
   cdev_del(mcbsp_cdev);8 W% C( d) g1 X" {* Y) b
   unregister_chrdev_region(mcbsp_dev,count);
/ P  [* X5 c! T" X- n: h   device_destroy(mcbsp_class,mcbsp_dev);
1 I- B- x9 A, P   class_destroy(mcbsp_class);
# {. M+ S6 m  B}' F. {2 W) b* t1 k: F0 [6 L
module_init(MCBSP_init);
1 U* t3 x$ m2 F8 s/ kmodule_exit(MCBSP_exit);
0 K9 c" A" S( j5 f( k% c- T7 J% _* j5 p0 Q
MODULE_LICENSE("GPL");
/ c# u0 r4 Q9 K1 x2 B9 G4 _. @# w$ p/ H3 x1 x
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& G$ }. d5 P6 j  e9 _+ O& ^% t
我的应用层的测试程序如下, k" x' W$ }. `
#include <stdio.h>
7 j  }+ Z+ \7 G& X! m; J#include <string.h>3 G  t6 ~6 F8 W* k
#include <fcntl.h>
( ?6 l# c0 J) Q: o#include <unistd.h>9 J  J- u) h' k& N' F; B
#include <signal.h>' {" n% f7 V; |# t! s, l( t3 T% u7 }
#include <pthread.h>       //线程2 r  w1 K- b) s: o7 D
#include <stdlib.h>
" C7 j2 H+ I+ W2 v0 z& m0 p& l/ C3 V#include <pcap.h>          //捕获网口数据
- n3 Y9 C* {. E% s7 n1 S. R; W3 S#include <semaphore.h>     //信号; a( I5 j* [0 O( k, ?, {( o) m6 ?
#include <sys/types.h>     //消息对列
& u9 i+ O. N. A- d7 R1 d. z4 g#include <sys/ipc.h>       //消息队列
* t5 Z7 S2 A3 m+ j#include <sys/msg.h>       //消息队列- o" @1 V- M8 u  n* u$ G7 \
#include <sys/select.h>. O  K1 C( Z' d) w  K) g# G
#include <sys/syscall.h>
, J, Q$ G+ n) Z! }  X#include <sys/stat.h>1 I, C) e; l  j6 q" a  O9 ^
#include <sys/mman.h>& B$ n; F1 P/ l
#define msleep(x) usleep(1000*x)
1 n% A! v0 E, \; E
+ [% g1 ^% U( S" n. x2 A6 qint main()
2 ^$ j0 \- ]& a{ 4 J* |0 ]- S( y+ u2 f3 g
    //MCBSP,ARM与AMBE2000交互设备% _' W0 Y4 f8 W% O  g
int fd;
. J# G+ P( C( A% C) N3 a unsigned short data_write = 0x5555;
4 i7 w! K: I9 R- ? unsigned short data_read = 0x00;+ \; b& G% ?: U+ j4 c  i
  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 D# i% D( y- K' s3 ] //  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);2 {+ I/ Z# W8 X5 A0 E( X7 h' W
    ! e8 e  W( X" y
  if(fd < 0)
. A$ A/ ?' e( s' Y5 J) E  {
% B5 `8 @' z( {% Y8 }     perror("open failed\n");2 R5 R  o! X3 z8 C
     return -1;" ^2 @2 f7 v0 E% D+ v9 `4 G
  }
( ~) w9 {- @' }. r& b  
  [, |' z* n$ q& \; h  while(1)3 z  b7 Y( W. Q6 t" d
  {
# ?  b% j6 {8 F; m/ E- {' l. O   
/ ^' {  t6 |4 u   //AMBE2000每次读写是24个字为一帧6 R" \6 E" C- n
   //写数据时将数据在底层存储起来,等到中断的时候再发送7 j6 v; F+ M% Y+ f: Y; }8 N
   //AMBE2000输入数据是以0x13EC开头的
5 V% P+ f3 W- z6 [" M   write(fd,&data_write,sizeof(unsigned short));
' G1 w; \1 I% t  H. B) O     m* A! e' P! o. K' Z, h0 y
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  ( X9 S: C- _% a8 i0 a/ W8 F
   read(fd,&data_read,sizeof(unsigned short));
8 Y& a6 T1 r- [, @7 ]+ q  z   
5 T+ c' y0 m# Y1 V, a   if(data_read == 0x13Ec)0 n( w/ u$ e! ~, V, K" q
   {' f% a6 O  \3 M" A) P0 [% [' r
   
% w3 H' F% ^$ V    printf("data_read = %x\n",data_read);
% R2 i1 Y# i& {   }
) E) m- f) Z: b. o   4 P! Q* p: g7 X) W8 @
   msleep(10);( |+ n- S! r! ~  M% a
  
9 l5 Y8 e! q* L0 }+ f7 L" t' o  /*. v; q, F, E% P7 E2 ]
   ioctl(fd,1);   0 H9 I- m7 p# x7 s$ e3 F6 ~
sleep(1);
0 n9 l& r# ?) M+ e- a ioctl(fd,0);* U: _0 T( @3 A7 o, V, R
sleep(1);
9 Q6 z* U' g( S( O/ k0 Q+ _' d7 ? */ 7 U7 d. ]2 v% v$ l  @+ R
  }   
# L- o( Y; L( ~4 Z return 0;
* d2 Q& ?0 O: ^  _" S6 o ' u+ g4 v9 F! @: l3 l/ u7 c
}
9 `3 n* X; d1 i, N, ^, F* _
7 [7 W* X% ~3 f. G7 t9 P& w; a) ]多谢各位指教,谢谢! 急
3 a8 J7 f$ d. j4 u; m! P
0 Z% N. _% F( U! w& [6 y& `
8 \  y) `; m  U
# S5 i0 V( u! k9 P, z( K% P; T6 Z1 Z( Q4 ^3 x7 D1 ]

) ~! f! t0 w8 a# @% ~9 Y) J& N, r4 ^




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4