嵌入式开发者社区

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

作者: gaocaimary    时间: 2014-10-16 10:58
标题: McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
9 U. k$ @5 S; f5 P3 z0 O/*
9 E4 e$ C# p; k2 g7 A; R * Copyright (C) 2009 Texas Instruments Inc
" ~$ N8 ?9 _8 J4 I *" `; C' q* V" \! ^2 A: w
* This program is free software; you can redistribute it and/or modify$ F. Y1 }+ {! o7 P) p. z2 s- B& W
* it under the terms of the GNU General Public License as published by8 O& G: s- T& C- B' L" F# E
* the Free Software Foundation; either version 2 of the License, or( Q' d5 |/ h9 b" R) W$ G5 R
* (at your option)any later version.
3 `8 A- B, B& h$ |8 k7 D *+ t  a' `# }& o4 H4 F8 S( G4 P( D% r
* This program is distributed in the hope that it will be useful,
3 w) D5 m. x/ c3 a/ { * but WITHOUT ANY WARRANTY; without even the implied warranty of
0 R  F9 T9 B+ L" D0 F' \2 V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 D  l, ]2 {. \& @+ b! f
* GNU General Public License for more details.
! _$ u# I7 b9 G9 ~( [8 F6 C ** n9 X, q! X$ P) X; Q4 h
* You should have received a copy of the GNU General Public License
  r) s3 `! n+ b( [# }3 t1 G& B * along with this program; if not, write to the Free Software% K% O+ y: F9 C2 c& I
* Foundati# t, S) W- B6 b% A: |' z! T7 S
*/
; m! X- p( B7 {$ o; l' R$ B#include <linux/module.h>& k  [+ T3 V2 y7 ^
#include <linux/init.h>* ]& g" \) @8 T6 J
#include <linux/errno.h>, k% d8 Y8 x- u
#include <linux/types.h>
/ o5 E; I! P4 T* S- y; A5 M+ v2 X#include <linux/interrupt.h>* r* P6 ]$ _# {, f$ K
#include <linux/io.h>* O4 E6 o, q. B7 c: [! {4 r
#include <linux/sysctl.h>, l) g0 ?+ [6 E
#include <linux/mm.h>
0 y4 ~& r0 H  }$ w8 R3 F#include <linux/delay.h>
# ~7 T2 ?3 E% k! L" U# `#include<linux/kernel.h>
* o: O: a" o% A* C- Y#include<linux/fs.h>
( p7 ~5 Z5 v/ P#include<linux/ioctl.h>
* w7 s* t8 D* f" Y9 q#include<linux/cdev.h>% {# S7 m3 s, k& a. L" V+ y9 p, i
#include<linux/kdev_t.h>
5 g4 I+ N+ \" D: j: `7 c7 M( ~#include<linux/gpio.h>
8 Q( V2 E2 n# ?. |5 F#include <mach/hardware.h>9 i1 Y8 ?6 T2 ]3 Q) W
#include <mach/irqs.h>
6 o7 y# Z+ h6 O. w9 Q
: j6 t3 A1 w6 r! h# G) A* D4 }3 x* b#include <asm/mach-types.h># H, @8 c! K% u% b( D
#include <asm/mach/arch.h>
0 Q! d8 H- k, I8 p' G& F7 F#include <mach/da8xx.h>
3 b  f! {; g9 q9 `( c, j#define  SYSCFG_BASE   0x01c14000
% ]; p  L1 ]% z: P% j8 O- ~1 k3 r8 x#define  PINMUX1_OFFSET   0x124
, K7 T+ U, {8 k/ ~% s#define  PINMUX18_OFFSET  0x168
6 H6 ]6 s" k, y, u5 P+ y+ i; g#define  PINMUX19_OFFSET  0x16c
) ?  f. s* U4 S#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR, A$ p) c$ f9 @! \2 `/ b" i+ ]
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR1 g9 g( _/ g2 {  H3 x& C! Y
#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR
/ h* R, n+ k) Z#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
6 Z* _" N5 d3 h. s" X! r  t#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
; o8 }& K5 A4 ^+ q$ J9 ?" Y! S/ J                           
# q- U+ S  v0 C( e5 {2 L% a2 y#define DXR_ADDR      0x01D11004  //MCBSP1_DXR8 u8 m1 G  n- a7 w5 {  ]3 F
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR$ M' x, z( f3 ], q
//PSC
- g% g9 D) e) U9 g& F#define  PTCMD_ADDR   0x01E27120  % R, g9 L9 O+ K8 F; n
#define  MDCTL15_ADDR 0x01E27A3C: ~# s+ D" }6 q( T1 v0 C, g
#define  PDCTL1_ADDR  0x01E27304
6 e( X7 K; S# y! g//GPIO8 direction4 d- Q5 m6 x+ L7 O: Z
#define GPIO8_DIRECT  0x01E260B0
/ d+ S1 M! C4 l% Q#define GPIO8_OUT     0x01E260B4
: a1 H7 @# h8 W- C5 `0 }3 {+ X9 O#define GPIO8_IN     0x01E260C0
* ^1 q! E8 X1 o% \" B+ d9 R  f) x6 q* W2 K# ]6 X4 |) _5 _
//#define MCBSP1_RINT    99              
! {. q- L$ ]" e9 Q//#define MCBSP1_XINT    100  . g6 a$ D$ Z- x( L3 @
static int MCBSP_MAJOR=239;& B. Z$ h: o* V8 |( `
static int MCBSP_MINOR=0;9 X! i" M6 O8 ~6 g9 B
static int count =1;6 S3 D  S3 [% Z5 h0 m/ j2 o

. i! \* _7 i  Y* c' n# y1 f#define MCBSP_NAME  "MCBSP-device"
7 ]/ O' H9 B7 c: [7 M  V# M  y1 S# k: e& g' Y  @
static struct cdev *mcbsp_cdev;' H! J" M; r. }2 D5 C7 n
static struct class *mcbsp_class;
: ~+ t+ A/ k) g5 v! lstatic dev_t mcbsp_dev;, D3 I9 W6 K( T3 w. o6 y
unsigned int DRR_data;. E' o( ^: \+ l: m" S7 i
unsigned int DXR_data;6 f( H6 _8 \# b' ^2 W" W
static int mcbsp_open(struct inode *inode,struct file *file)) [4 S1 D  ~0 Y
{, N" G/ I6 a6 j5 f7 S$ c$ C3 v
   
" Y6 d3 ?# B$ ?; `: \7 |6 D   //interrupt enable,initialized
. N$ f4 p* D! J+ Y) L0 F0 T5 {   unsigned int temp;4 S0 p* g. B' C  \5 Q. U' k
   //SLEEP_EN(GPIO8[10])---0! w# a8 S# T' Q8 b
   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 O: }$ i1 q) `" q
   temp=temp&(~0x00000400);
6 g# _2 f) b6 B: S7 J) Y7 \   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 R0 G9 h6 G  y. E. ^* @$ v* x
  //RESETn(GPIO8[8])----0----1
6 W* {1 ]8 H3 h1 d# H   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 a( w" ]3 ?8 N& C- t1 r   temp=temp&(~0x00000100);
! q& I+ N. Z; P- W8 C* d- Z* Z5 z+ o   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* U: |( o% `: `) k   udelay(100);0 v9 P/ s0 {8 s: r' \
   temp=temp| 0x00000100;9 U: G/ H( z" \
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. ], Z$ t# C2 C& R& R- b   udelay(100);! C) t9 U: G2 }
   printk("open success!\n");
- R; m8 d. c3 j$ b1 ]/ k( t$ M# J5 `   return 0;) b; F2 I8 |9 y# @4 @) }( v
}. F* k; [, I( S& I

  A% P! ^+ b% ^# a+ K  m! a5 cstatic int mcbsp_release(struct inode *inode,struct file *file)
  M/ E& F9 i, R0 a{$ }9 ?  Q9 U2 M# {  P
   printk("release success!\n");/ c0 c/ R0 B1 T. k" i/ h' T
   return 0;9 l% r; c3 y5 K$ x5 B4 `
}6 h; w# T+ {; \+ ?" I+ P: l

, ^: M9 ^" Z) Lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% p. C4 h. L$ F1 J{
6 f$ l1 @6 n8 q' N0 @9 M6 v    copy_from_user(&DXR_data,buf,len);
6 b7 m3 B" ?6 y/ [: m1 o    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       ' i/ ~6 W4 U5 G4 P* w9 E0 e4 F  m, c+ F
    return 0;2 }% A, R* h  X5 T5 _( ?

: ]( j: }  T/ J}3 N. T, W5 p& {7 S
( R- ^' e& j( n; y' U, M. N
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, H# f1 R. r8 L0 ?7 h# \1 g' X* @{ $ L& t: q# T8 M8 j1 h8 A
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' d+ Q/ v/ c% z' ~) \8 _6 _   copy_to_user(buf,&DRR_data,len);
) w- i' ~: F; W; J/ `/ ?$ \2 w: ~   return 0;* {7 N6 ]9 A! C) c
}
( j6 A4 v+ }3 _1 b
2 J1 e3 v1 C" n# u( s  W+ b/ H" d; K6 G( _7 W! H6 _
static struct  file_operations mcbsp_fops=$ Y5 T* D. M, V8 e
{6 a3 c; M0 I; [2 U/ w; ]
   .owner=THIS_MODULE,( V& e% B' h/ x3 ^) {! V9 H
   .open=mcbsp_open,7 Y) Z7 \9 _4 v( _0 {- P
   .release=mcbsp_release,* o  s& t% J  _
   .write=mcbsp_write,
" Q$ e0 H" w1 ?- h   .read=mcbsp_read,
' E: }* ^. V- k* z7 @2 z};* D6 Z. j0 W+ Y% i3 a5 h
static int __init MCBSP_init(void)
. p! v- I- c, D$ H! z{* i& V- ]' N0 D2 p4 T3 W3 j
   int ret;6 ?1 w% z: j, `: X  n. B8 p
   unsigned  int   PINMUX1_REG_old;0 h5 m' l  z5 S' J- n
   unsigned  int   PINMUX18_REG_old;, C% P( C$ ?: c/ ^7 `' h6 m
   unsigned  int   PINMUX19_REG_old;
9 [, _! ~# B$ ?7 h# w: d+ j% [* k$ h   unsigned  int   temp;  & u* q8 J/ H) o& I  t
   if(MCBSP_MAJOR)
2 n  d  x5 a  I   {! U5 c9 w- C0 E6 x! |" p7 E! M
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 t! p# |) V+ ^
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- H6 K/ v; @+ P+ T( m
   }
8 S9 V7 O$ B+ y' |. b# _   else
! Q' R, F* M- I) e8 _6 k( E   {
* ^# y: Z$ v! W1 V, }      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 q: k7 X7 \. G4 `7 h% S9 g      MCBSP_MAJOR=MAJOR(mcbsp_dev);
; O, h6 |- B& \5 q9 @' a4 T   }
3 X. _. N- {2 Y: \% [: _   
6 R$ o4 z4 C: R9 g' h" d9 r- A2 Q- z) [   if(ret<0)
6 `. \+ \+ N5 @   {
$ m0 J/ |% l/ P& z) _      printk(KERN_ERR "register chrdev fail!");
3 n* \- `( C" C0 |. w- |      return -1;
2 p6 {/ n2 n* e  y. {( s   }' f. c) I! e, e" i# W5 x
   & V* d3 ^# j0 }7 W. g
   mcbsp_cdev=cdev_alloc();
0 v9 ~* J; s6 |7 N+ I0 S6 ?   
5 n1 \* w9 @6 R) C   if(mcbsp_cdev!=NULL)1 T! o* R% c1 {8 ?0 r$ H) S3 a
   {
5 I# ^3 b* P- h3 j" U8 s      cdev_init(mcbsp_cdev,&mcbsp_fops);! m0 N/ a7 @( d( a2 `( X5 n* R
      mcbsp_cdev->ops=&mcbsp_fops;
4 n+ `/ B* `0 V" q" J2 E      mcbsp_cdev->owner=THIS_MODULE;
3 z! V' Q9 a' f( G/ P' w  [' L      
$ ?/ \! b: D( E- {. Y9 i. V  z2 o      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) d4 A3 n. E! G* V1 F- ]1 w          printk(KERN_ERR "register cdev fail!");
3 M! y; ]- a+ Z      else( P1 I" x% G! R" I/ J! y' `
          printk(KERN_ERR "register success!\n");2 D. [$ V) [6 a; C9 @( \  n
   }2 I8 `' Q; D& h1 l+ J
   else
9 c6 L9 |$ e8 q. H! \   {, K: v7 D- M! _! l* E) L- K0 v
      printk(KERN_ERR "register cdev err!");- m! C2 a, T# A- X9 A7 D4 g
      return -1;
& m1 ]& J# M- q1 t" x6 C  Y   }
$ l% ?2 z, f/ E5 x, c3 m   8 y( j0 D9 [+ l- x
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- r$ y4 ]8 x; I. ^   if(IS_ERR(mcbsp_class)), G5 U2 k0 G( y( v
   {, U1 d/ ?0 ^/ t1 H+ n7 k( L/ z6 `
      printk(KERN_ERR "register class err!");
- M' d) C4 D8 B! O0 n0 X# I% _0 N   return -1;; }& g# g" V: i8 t# `' U
   }
) m: R9 Z' l( o4 h6 C/ f   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 z% S6 N( n  @' o  p, V0 C+ v6 e
5 ?" _) m& v1 ?$ }0 w5 e# _   //PSC
# L  d, Y8 |& o$ O/ v% V0 V   //add Enable MCBSP
: q+ S" B+ J$ |: R: _* x- U4 M   //test1 c' [/ r& l: X" D
   temp = 0x80000003;
8 Y  Q& @) L8 |) `6 Y$ Z! X   writel(temp, IO_ADDRESS(MDCTL15_ADDR));& A0 o0 y( z. x8 F* ?4 C
   temp = 0x00000003;
+ z2 g6 g+ I6 U) i   writel(temp, IO_ADDRESS(PTCMD_ADDR));; y, K3 p  R5 j6 w/ b( _8 @

' R" A; Y# o0 d- b$ |6 N   temp = 0x001FF201;- p* t  s' K/ D
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));6 ?7 k# e6 ^! L6 H4 I6 U! g
   
! T- V/ |/ t6 J. o4 |   //PINMUX  
" E# a6 }9 g+ q( g! K/ n   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* y0 m% ]; O- f$ g
   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  
$ j6 p' A! u$ G% z   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
9 U2 L, V3 [; {" m1 A$ ]8 e: N   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ @7 |8 r2 z& w6 I+ d0 G% x. T
   & [3 G* C! v( z4 @. [( b  P3 B
   //SLEEP_EN,EPR,L138_SHK1,L138_RC: }- D0 {( P. f/ j/ k3 N: i
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  . S# d: s6 D# ^. L
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   ; K; b$ V. O% j. X/ n: G/ k
   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 Y: }: f/ f& P2 Q- i

! ?4 b: \" E$ A0 k   //RESETn,L138_SHK2  I" G8 _- u  R6 [
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  " e6 S( D, p2 r/ T: R6 I9 @! {
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
( D4 ?8 `. j- ~5 w3 C   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ W. E6 t1 w4 J0 M3 }6 e. j
8 \; r4 K0 Z, R+ Y6 L6 G
4 n+ z& |  M/ k/ c+ W' \+ S8 V6 L+ R
  //SPCR Register
7 j' N4 l+ s$ ~% L  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 r' k1 T2 L$ K$ l, H  temp = 0x03000000;//(DLB=0)
# S" M7 N# k7 N! Z+ M1 K7 ?: v1 Y // temp = 0x03008000;//(DLB=1)0 v: F& N% c% \% o/ {& ?, I) U
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
& N" D8 @5 D. N6 Q* f) E& x  temp = readl(IO_ADDRESS(SPCR_ADDR));) _1 Y& O7 }/ i, H
  printk("temp=%x\n",temp);; Z: |% k: ^9 p  R) Y; Y

: p2 D. u& N5 ~" a: g   //PCR Register# z$ Y: R1 v! W4 S7 {: h2 V
   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# l6 a0 F; K3 V9 m$ N. z
  // temp = 0x00000F0F;( p/ Y& Y' R; k4 F/ }6 q
  temp = 0x00000B0F;8 u1 e: K, }& d# O) N. _( d
  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
( z1 b; V/ f, u, e  temp = readl(IO_ADDRESS(PCR_ADDR));6 \& W4 B+ M7 H- Y# F: a
  printk("temp=%x\n",temp);  
$ p. G& w! X' Q   //SRGR Register9 T& m9 s3 \5 ?# p' j9 M
   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" }4 O# c" H4 [% L0 [
//temp = 0x301F000B;
0 I8 i+ H: \4 v   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized 8 c* `# R8 r! s' C9 J' ]: b
  temp = readl(IO_ADDRESS(SRGR_ADDR));
8 [- L: ^0 s  C9 n4 \" N5 U/ c  printk("temp=%x\n",temp);
8 F. e3 e- q4 j8 G   //RCR, w; H# b, A7 g6 B( |) F+ |
   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 a+ ]/ G; B, R1 q4 Z! O! d- W: I) J/ v   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ \2 Q3 n* e' P5 D& S   temp = 0x00440040;
8 }) J# Y, m- ~   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   
5 d6 i7 O( h6 ~. a5 B) a$ a   temp = readl(IO_ADDRESS(RCR_ADDR));
, t) O. A  f1 H# k   printk("temp=%x\n",temp);+ B' o, ?  \% x1 E  R" h
   //XCR! S1 t. K$ @- F, I
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, a' _- `" N+ q! _+ ]  Y   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
  }; S1 f& Y+ Z: P- m" h   temp = 0x00440040;- O5 B4 R* l* W8 H9 g/ {! P
   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   " h$ W* J9 y0 i$ L2 W0 r
   temp = readl(IO_ADDRESS(XCR_ADDR));- M& M9 o2 \! N( T; h" i
   printk("temp=%x\n",temp);6 ]  ~/ f! p) ~7 B9 y1 M- }
  udelay(100);5 g* d: G2 V5 G: i1 @5 ~# Q1 h
  //SPCR Register+ \0 S6 w/ ~6 ^) X2 K* u
  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 V0 x' T& B5 G1 k0 h% g  temp = 0x03C10001;   //DLB = 0 VS DLB = 1& I' U. W$ S' G' ?; V- {2 H! f: D6 U) F
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled
  K" z1 h" T, r# L: M2 S% ^# O" r. Z  temp = readl(IO_ADDRESS(SPCR_ADDR));+ b; k3 ^3 \. g- h" R3 a
  printk("temp=%x\n",temp);1 I" c* G( p1 e: k! O  o9 |4 R
  udelay(100);
  y# y% I3 m" a: V2 p
6 K! f$ g1 S* {$ `! Z. S* U1 T  //set GPIO direction
  A8 I* M9 h& \' T3 n2 R   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ x5 A( C# E. ~& A6 h1 ]   temp = temp | 0x00000100;//EPR----input
& |% Q8 O- x; Z: K: m  A   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 e+ ~# G* ~3 x. o4 `( _
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ ]2 k& Q) w1 t# m8 J# m8 w
* t5 i: i8 i( B1 E   return 0;
5 j+ H$ Q* L% ~/ k0 D  B% K}
9 O0 U% t" P8 ^# I  Z) H$ }8 nstatic void __exit MCBSP_exit(void)% I( b9 G0 ?: e9 [
{1 |# V" b2 y: D, ~- p
   printk("mcbsp chrdev exit!\n");
) p" `! |' n0 l2 e4 ~! q6 M   cdev_del(mcbsp_cdev);$ \1 `- h7 [; e& p4 J) X; G5 i
   unregister_chrdev_region(mcbsp_dev,count);
0 r; f/ `; D  Q   device_destroy(mcbsp_class,mcbsp_dev);! M3 P* A$ V( E$ J- Y
   class_destroy(mcbsp_class);, g+ R, p5 s  u9 U
}2 A. e6 ]1 X, h1 z
module_init(MCBSP_init);. g+ I; x* E' s6 @' {  m; U
module_exit(MCBSP_exit);1 S6 I$ G8 l% @0 V5 `! w
$ n9 Z6 Q9 v- q8 W$ \4 z- G
MODULE_LICENSE("GPL");3 |$ T# Z" _9 Z/ Y( T, `' v' ^/ j

; u$ A) P* |! g( f4 f6 Y) r我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, F. W9 v1 F# C% G1 Q6 g我的应用层的测试程序如下
4 O. H' y  |( g  e#include <stdio.h>( E/ U) |4 G! m& a$ d4 t9 \7 N
#include <string.h>
7 m* K) i* u8 P9 K+ i% g# E#include <fcntl.h>8 N+ b$ m. T5 G0 R: }
#include <unistd.h>
$ z0 Z: x9 ?! q! l; I* J#include <signal.h>! E. L* d7 r$ L  C
#include <pthread.h>       //线程' k* ?2 ^% Y- ?* S: _1 r6 `
#include <stdlib.h>
/ ~9 s6 F$ u1 M4 ]+ `; m9 a2 Y/ M#include <pcap.h>          //捕获网口数据/ j- g! m0 U, i$ |/ O4 K5 z
#include <semaphore.h>     //信号
5 F$ X' U; m0 ^" `* C#include <sys/types.h>     //消息对列
5 w* Q! F/ _7 |$ o9 R8 H5 D5 k#include <sys/ipc.h>       //消息队列$ ]1 [+ W# a' H
#include <sys/msg.h>       //消息队列
6 t7 b$ B8 X0 z, F# H) G2 m#include <sys/select.h>  B2 D$ K; D0 l0 r5 I- O
#include <sys/syscall.h>
( m$ L, E8 N' \5 U# g' u#include <sys/stat.h>
! k5 o3 y4 o, @0 A' r$ P! N- s( p( [#include <sys/mman.h>
& Y  z# I5 h* ]. D#define msleep(x) usleep(1000*x)
" d6 G9 R0 c0 k+ V8 a; K
9 s: E$ K& W: Z0 f6 vint main(). d1 r1 @0 M8 W. A4 E8 y  U
{
) W2 q/ }, k" m5 o1 @    //MCBSP,ARM与AMBE2000交互设备
$ ^( E" J. ?) M& t4 p int fd;* R; Y) M# T9 r- U2 y0 |1 C% m
unsigned short data_write = 0x5555;
: U) e% c& s, t* u; b unsigned short data_read = 0x00;
4 ?0 P4 @. M# A7 k& ~0 h- i  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& Q8 f* N% `' `( c1 j* h$ h+ n
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* y& u1 O/ T' X   
5 J- F  }' H& r& j  if(fd < 0)
3 W+ D4 ]5 d1 u+ F6 s8 p  {6 |. W: g! P: F% A, E$ x$ K# V  a# T
     perror("open failed\n");! s$ ~5 S/ x$ `; i
     return -1;7 Y. c3 \, Y2 z; e: c( O
  }5 Z0 y! A( M, o! E5 a
  ; C- z+ q! ?4 _) p1 V
  while(1)
( F; O7 B+ J; N* T  {
* N2 a; E5 u. w  r$ D   2 x+ c& v: e- |8 z3 [. V) }8 o4 b
   //AMBE2000每次读写是24个字为一帧
$ L0 Q; j; s0 J& @/ R0 B# M: {   //写数据时将数据在底层存储起来,等到中断的时候再发送
( P. h4 \3 L6 s0 w   //AMBE2000输入数据是以0x13EC开头的" F6 s, y0 [3 K; ]& K! [
   write(fd,&data_write,sizeof(unsigned short));
( `! I  ?- s- d4 ]8 x   * T; b; x; [% L& H% }3 F
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
' w: ]! ?2 G0 V5 l   read(fd,&data_read,sizeof(unsigned short));
- T' S* P( h4 r7 D/ E5 p   
+ m; q; D. |3 u4 m0 V, `9 ?# @   if(data_read == 0x13Ec)/ T& J; a# u% N% W: [" j4 y
   {: h. m  w5 H' t& u
   
- L+ Q' R8 x' S" J  x    printf("data_read = %x\n",data_read);
" k/ m( E( x% B) b. M   }8 m/ F: }' F/ h" C
   . e( J2 Z! h1 K. E3 w. h4 X* E
   msleep(10);
7 Q* \( \: k' P: e  
* v- n* U4 v, H) \2 w  /** p% [2 j, i0 o! t5 m' |( w9 _
   ioctl(fd,1);   
( W/ Y2 g% A$ P9 j, t! L- @ sleep(1);
' W$ y, ~# o; O& t' C4 x ioctl(fd,0);$ m* }+ u5 T+ P' ?/ a/ Q; \& D
sleep(1);- j8 _' d; ~: X' r' |9 k% w
*/ . U! D7 ?; P- @$ m  |8 J" u
  }   
. z6 _7 C9 H2 G1 W: Q return 0;5 E- a8 D8 G& h$ g
$ r& E, {# T. i
}  V4 {4 ]4 j" j- {3 h  o

" E9 _- I* D/ F# Z$ F& p  G多谢各位指教,谢谢! 急$ l& m2 O$ q0 q1 D# R

) _% I/ j+ n! T% x; `) L
* l" o, t& [5 [
. w8 V- y& R3 K/ v2 }
' K/ _& p4 L% \* p* x3 Q: X
& \  X; |, U7 Y* y




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