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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! o( u& y6 p- \: {: p9 e/*: \# d" y: ^$ X5 Z
* Copyright (C) 2009 Texas Instruments Inc
* U1 g6 k/ s  b2 ^ *
" Y/ d! }0 a  h3 d$ M * This program is free software; you can redistribute it and/or modify$ I+ O+ F* |- t( y4 }2 P
* it under the terms of the GNU General Public License as published by
3 M7 |: P* t0 ]7 w * the Free Software Foundation; either version 2 of the License, or  O1 r2 C# `3 s# n4 P
* (at your option)any later version.
8 ]9 I- X  k0 H) f% Q( T */ I! Q% I  s  t. E, R
* This program is distributed in the hope that it will be useful,. `9 r3 ~  E2 {0 N. X# T: i
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 l9 P& D4 w9 X% |' X1 G& X; g* q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ O& s: ?+ o. N. i
* GNU General Public License for more details.
& E" Z# H) ]: S1 L& b* Q" G. W* i/ M *
! x' S$ U+ e& E- q* S' G * You should have received a copy of the GNU General Public License
) |6 T' l  u2 }: [& h2 I$ z * along with this program; if not, write to the Free Software. j8 ~9 [# W! j9 M9 p5 L9 W
* Foundati
) k- T, y0 F4 D9 Y8 Y, \9 n; c*/0 e7 Q% p$ w, N4 v6 N
#include <linux/module.h>) ^$ l3 F/ C9 R. K' i8 s
#include <linux/init.h>7 `5 _: S* c4 C
#include <linux/errno.h>% ?* E0 m! y% U$ g! q* w% X
#include <linux/types.h># o% W3 M* d* a& g5 m' G4 P# y
#include <linux/interrupt.h>4 j" [: Q" |  b" r
#include <linux/io.h>) p" {' t0 t5 N/ b
#include <linux/sysctl.h>" b* ]. C  f( s! f9 l3 ^
#include <linux/mm.h>; m& M# a$ Y/ r  I; O8 U* O  y
#include <linux/delay.h>
+ J- {& b; h: K. f#include<linux/kernel.h>4 D, q0 @) l0 X9 r# C5 f& R7 x
#include<linux/fs.h>
& ?9 r8 D0 r. V2 t#include<linux/ioctl.h>
1 N* W7 v; ~' q1 f6 W#include<linux/cdev.h>1 F$ C; X! U( N- Z& Y; }# v
#include<linux/kdev_t.h>2 {& W! u6 [+ L: \+ R
#include<linux/gpio.h>
/ m% S3 H9 W+ T) X0 o2 Q#include <mach/hardware.h>
9 w% m4 U# e) |( ^9 D#include <mach/irqs.h>
6 T. {# `7 K* \  a# T' @$ u5 s0 ]2 I: |: z2 ^
#include <asm/mach-types.h>+ A, n8 J" K) b% i1 s
#include <asm/mach/arch.h>8 Z! g! f" K$ u% B
#include <mach/da8xx.h>9 L$ v) `6 E* h# E& @5 J
#define  SYSCFG_BASE   0x01c140005 k3 c5 s* F: W2 U+ N: o9 `9 t
#define  PINMUX1_OFFSET   0x124
& }# `9 }  R& r7 v0 b#define  PINMUX18_OFFSET  0x168 1 n4 X" o0 V1 _' O
#define  PINMUX19_OFFSET  0x16c
' W6 d! C( F3 }( p: z& x3 U7 g* x#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR9 `+ m+ i* p& O
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
3 _. z: b! I, x7 C& I! K2 n#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR# B" m# l0 c4 v5 R; ~; W9 C5 A! F
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR
9 ?5 r4 s: `" i* [. L#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
6 o4 e  e6 q3 ^# U                           
6 h* x+ p' u9 h! _( k, L/ Z) J#define DXR_ADDR      0x01D11004  //MCBSP1_DXR( o% C1 Q2 X; x( d9 D2 n
#define DRR_ADDR      0x01D11000  //MCBSP1_DRR2 I9 q8 ]5 R; [* s; H% y
//PSC
, B4 Z; W) C4 N- X#define  PTCMD_ADDR   0x01E27120  9 R7 ?+ ~) F- \# U9 {3 }
#define  MDCTL15_ADDR 0x01E27A3C
9 r8 ]0 n% J9 Z, t& U/ J) [! ~#define  PDCTL1_ADDR  0x01E27304
4 T. o" z1 Z" m. Z//GPIO8 direction2 ?( P  n) `( {0 _# ?; s
#define GPIO8_DIRECT  0x01E260B0
  G% {; N; d7 x& c) E1 ?( O#define GPIO8_OUT     0x01E260B4
3 ]8 ?% l3 t' R9 e5 Z#define GPIO8_IN     0x01E260C0
( c  y0 w$ k2 d7 o
1 M3 k* ^2 P; c! Y- e//#define MCBSP1_RINT    99              ' J8 d+ o/ X1 M8 t0 P
//#define MCBSP1_XINT    100  * T5 _& _" W2 y2 y
static int MCBSP_MAJOR=239;
! X( b8 d- ^, ]: L4 C1 J# gstatic int MCBSP_MINOR=0;
# D& Q  G% f( p- H' |static int count =1;8 d' b) F/ G* l+ ]- Y
1 K# i6 ~6 h- k! ^' H
#define MCBSP_NAME  "MCBSP-device"4 J) |% [  p2 `& v6 a% g
5 V2 G+ S- m, U$ n- Q. W
static struct cdev *mcbsp_cdev;$ f: j1 n. z# p; V% y! p
static struct class *mcbsp_class;" c; Y& R' Q( L8 ~- a3 d% J' i
static dev_t mcbsp_dev;
, l0 ~. U+ |  Z' I4 U) tunsigned int DRR_data;
; S5 x$ j+ z0 p) n# P9 ]unsigned int DXR_data;
7 O5 k: K) y4 ^" _% \/ R( r' bstatic int mcbsp_open(struct inode *inode,struct file *file)" \# N0 j: v  Y4 _0 F
{* K3 D8 n' m$ M. ]0 C- r2 A
   
5 ~3 k9 G! N( y+ u; l& }   //interrupt enable,initialized3 ]0 R* Q  J+ v  P2 [; p! J
   unsigned int temp;
+ s1 I& E8 ?/ c9 A) b( b& J# C   //SLEEP_EN(GPIO8[10])---0
3 c( i- n1 c/ Y( j( Q2 Q* S   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 L& A, Y& l; V8 x   temp=temp&(~0x00000400);6 ]' Q# J& G' |$ @8 t
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ P6 K' v8 V! T! l  //RESETn(GPIO8[8])----0----1
4 w# A% ^9 G- ?! d" u5 @   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ a8 x: v* z. r- Z7 u3 G1 c& K   temp=temp&(~0x00000100);
/ F" F: k$ p/ |" C: M/ G; I! y   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. V6 r0 j8 d7 i! C0 k* q   udelay(100);
$ ]* I* o4 m. s4 W   temp=temp| 0x00000100;8 L2 `/ q: L: S" i: y
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& G7 r6 T1 B2 Z3 y+ ]7 U/ y6 v* V) ]% G   udelay(100);5 F6 G+ Y& X9 }2 l; w
   printk("open success!\n");
* D+ h& X4 A- t  S& {5 x) R   return 0;
8 X- |) k/ X  T+ u! W- f- G& u) v2 `}5 C  ^& x" i+ X) L

0 q/ G  I0 K' W( G0 G% Y, zstatic int mcbsp_release(struct inode *inode,struct file *file)* }2 K% q% z" n3 k7 J+ P
{
3 s2 t7 S  U7 _" i% ]   printk("release success!\n");
) G* ~0 m2 ?& l; R   return 0;  r- i3 s+ k1 o' G% a$ U
}" V, o2 Q8 Z) V. x
) m2 k$ w% _" f# k* r* [/ W2 _
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 ~* L$ ~9 t1 i- s4 R8 B
{
! b) H- I# |' i: x    copy_from_user(&DXR_data,buf,len);
8 C$ R( G: f) n- g2 @' @3 E4 {% M4 |% d    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       % x8 A# Y8 w% X  J9 V+ Z
    return 0;/ I; ~/ Q. }, D; L; O/ y

, n4 W* J5 E8 g}1 L/ ?+ R2 T, {9 _: ^
) V7 `. G" r' R# @2 [6 z  G
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 l5 g; j& |- }* S' T
{
1 t# h0 [0 _8 y/ V" }   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));6 O3 J% j% d. j) J8 G0 J- i0 [
   copy_to_user(buf,&DRR_data,len); ) Y3 C2 {* x% ]6 Z: X1 o
   return 0;
# M) C0 X( T( Q, e0 l9 i! S. Y5 \}+ S  y+ H3 K: ]. w

1 Y, M7 D$ u8 N9 D. e; s* l0 d
- T* X3 G. @0 o/ i8 istatic struct  file_operations mcbsp_fops=
. i+ l9 `+ |3 K* K0 c* r0 h{
& ~- b! V( y8 m3 J5 R- u6 Y- H   .owner=THIS_MODULE,
/ C1 n; I( @3 g, V. e" f% D! `   .open=mcbsp_open,: v5 N3 s" o2 \* C9 o5 S
   .release=mcbsp_release,% a& z" o9 P, D
   .write=mcbsp_write,
3 y$ C6 O6 R" _1 ?9 E   .read=mcbsp_read,
3 d& ]" M2 z1 V+ j2 O5 ~};
0 {7 @, ^  [% {! S- ]7 n8 xstatic int __init MCBSP_init(void)
+ @. o7 _( l/ k3 w{
2 ?1 k; a- J- W9 ^) i   int ret;
3 i! T  O2 F( X5 l( w" U) |   unsigned  int   PINMUX1_REG_old;2 g. g4 `; U, O- e6 l. F
   unsigned  int   PINMUX18_REG_old;
0 d+ I- B4 [9 V% |9 B( q   unsigned  int   PINMUX19_REG_old;
: C8 F- ~. {9 B* C* B) p   unsigned  int   temp;  
) {& I# q8 f$ p  B# k! Q( W   if(MCBSP_MAJOR)  t* K! _! [, X7 N9 O* k# P( j
   {( b1 R5 Q: Y5 {& b5 O4 y' t
      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 n4 Q9 g- T6 Q7 t
      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- r: r1 h' l0 A! t& J) H
   }! Q# K' D2 h+ I$ ?3 d+ \( [, \
   else: Q1 d( B: s/ N3 }; F. O
   {
) Q% C5 Z  k9 H. ^( `2 n/ i      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- X" M$ |# l/ ]
      MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ T) {3 Q; Y8 I" h0 s2 f; C& Z   }
/ I! ~. G% g+ `5 s' c   
6 u( n; K3 Y7 J1 \7 s, c1 f  C5 y! W1 l   if(ret<0)  J/ O# a3 N7 Z4 W& N& c8 V" _+ H
   {( X$ h+ k9 L+ ^$ e5 ?
      printk(KERN_ERR "register chrdev fail!");
# h- ]: [" q1 u  E8 E6 F      return -1;
3 ], o+ ]' k, P* w& d: V   }
$ L% X4 |) m: `% h6 i3 b& Z     Q- ?3 l" e0 _+ l
   mcbsp_cdev=cdev_alloc();
- y$ I$ P. J% s# @6 ~1 z   % J4 a5 d! }* u
   if(mcbsp_cdev!=NULL)4 ^# p2 _) |) d8 f" ^5 r8 y
   {  X  Q* j3 M: x/ M
      cdev_init(mcbsp_cdev,&mcbsp_fops);
. V  E3 l! ]9 J9 s5 P) D1 @      mcbsp_cdev->ops=&mcbsp_fops;  ?/ v  F8 k8 y
      mcbsp_cdev->owner=THIS_MODULE;" m$ [1 ]( `& h0 `7 t$ q1 e  g
      : n) w& D* [4 n# ]8 h
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 c! D! ]9 J6 ]. _
          printk(KERN_ERR "register cdev fail!");
  I4 s& R9 J1 E! i  g3 `      else
8 Y3 B4 O3 U: H" B4 m0 G7 l( q5 O          printk(KERN_ERR "register success!\n");5 @0 @1 A4 u! }
   }3 y/ e! D: H0 J6 `
   else. Y4 V1 G! ?8 R+ N2 w' K% k" S& S
   {
2 }" L2 o9 t& I- a$ }) ^6 k      printk(KERN_ERR "register cdev err!");
# A  y. M5 @  ^. }+ s: E      return -1;
- s# c* r' Q! ~$ A! r   }
( Z; \2 U+ @$ r0 t" s5 M   / `4 _! I# [( a
  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 [2 m3 ]0 c3 ^8 w' o   if(IS_ERR(mcbsp_class)). R( v+ d1 P5 k1 V2 i9 b
   {
+ E# c6 h- `2 r# U/ _: j9 T! ^- M4 Q( l      printk(KERN_ERR "register class err!");
3 `* C+ K2 ?' K9 w: \& x) G1 R. p   return -1;5 _9 F6 b  Q  P& u
   }5 Z* V$ k# y- y! j, m& z; w3 @- K
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ d) ~3 e/ u8 L  g, d: n2 t5 h. M- e
   //PSC0 L( v( ^% y! u1 |
   //add Enable MCBSP& C! O7 x) v/ c( j, V5 F& w
   //test
, x8 K7 g. y9 M) C4 M   temp = 0x80000003;8 t% m" l5 y# O" T: p. U% p# Q' Z
   writel(temp, IO_ADDRESS(MDCTL15_ADDR));  r" m5 d% N* j- I! a! L
   temp = 0x00000003;
" x, F' U% G+ l4 E. M* o   writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 @; F+ e& N8 Z: E$ y  {+ l8 N& e : C# U, h# W6 E( q
   temp = 0x001FF201;! t' I+ n; E, \1 B, j! W/ A
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));
  c8 G; E8 y9 p% O$ h. N! S& c6 Z   ' e4 C& M# l9 A* g# S
   //PINMUX  
# U/ |$ L0 E  }  i   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 d( D) v- a0 P   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  1 M. a7 E+ H- o7 m
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   
8 G8 L$ W$ x) W1 r   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 L. p* p) {! b  k6 r. z. X
   6 x, \, n9 i( R# k3 }* G2 p" c
   //SLEEP_EN,EPR,L138_SHK1,L138_RC6 {3 `" E) W+ V, N6 ^# S
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  ! }! {- Y4 B8 W4 H" p
   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
7 h3 E9 x" }5 u" z. _   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. c. J1 _' Q7 D2 \* Z- x# `0 E 9 j5 l4 c; z$ F0 u' X) l" s4 L
   //RESETn,L138_SHK2; f/ q2 L# x6 A
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  # N) L- J9 R1 I8 Z
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
* X4 y5 }8 o8 b* J* Z' `   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ y2 z& F% r. i6 b* O 6 g8 z$ ^$ Q7 C4 X7 T9 H* i2 S) y
9 [6 ?; K& D& p& k9 L6 V
  //SPCR Register
+ X0 s; J0 g  r: T  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 `$ [; j3 L9 ^) b  r  temp = 0x03000000;//(DLB=0)) f) b9 @0 e8 y4 X* ^$ h
// temp = 0x03008000;//(DLB=1)
  @3 ^! \3 O7 a2 |3 E  @  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
! `+ h2 e/ r/ [6 p; U- w  temp = readl(IO_ADDRESS(SPCR_ADDR));
+ S" H9 |4 d4 _  printk("temp=%x\n",temp);# W2 t' e1 e5 X3 G. F

0 ?, q& ]3 ]9 R- o- Y5 ?( _, ]   //PCR Register
8 I5 c& A7 k! U. X, u: R  ?   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- @2 R9 K9 n# V2 v9 ?  // temp = 0x00000F0F;
1 L5 M- O! T0 P8 A, d3 s4 X) ~  temp = 0x00000B0F;
: e4 P' @' {6 G" I2 n' g7 p  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized 8 D% h) d# ^# T; b, C
  temp = readl(IO_ADDRESS(PCR_ADDR));
' l$ y: N# k; d2 }/ G: W( @  printk("temp=%x\n",temp);  2 f2 u4 {1 R- j) S9 r& c+ ?, c
   //SRGR Register
% i$ K6 C+ i) Y" U5 E  Q/ W' b+ I. `6 G   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 Z* R; ]' s  |
//temp = 0x301F000B;
; p4 X, O( x5 Z( ^1 z. W* t2 c# y   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized ) w5 Z) P8 V* D3 H$ O
  temp = readl(IO_ADDRESS(SRGR_ADDR));
% h( n5 i/ D/ G, k4 r" G  printk("temp=%x\n",temp);$ ~, X$ n+ J8 _6 l1 c
   //RCR
" f- h4 T9 j; E   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 Z0 w/ ~/ y: `* S% t   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
8 H. N6 g: i) v+ j. d4 s5 T   temp = 0x00440040;
/ B/ L% X' X1 J8 V   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   # v8 w/ d# V' p: Y
   temp = readl(IO_ADDRESS(RCR_ADDR));3 l3 P2 q8 d: `; H
   printk("temp=%x\n",temp);
$ R% K7 k& O: l) f0 g9 i  ?2 |4 r% Y   //XCR  R7 `; X/ d* s: f. x" [
   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 G+ E5 x4 O- I5 `% A
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- f  n, y" s* c4 U5 V
   temp = 0x00440040;
/ N# i4 c" T# q2 T/ v9 X% C( U  N; \   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   
+ D: {7 @/ H, M8 h( C9 g: ?" o+ k: Q   temp = readl(IO_ADDRESS(XCR_ADDR));
2 u) x! p) O& ~) b9 x+ K   printk("temp=%x\n",temp);  b9 _" M& W6 H, S/ I* u6 C
  udelay(100);& O& g# ]2 l4 t9 n; Z
  //SPCR Register
4 g+ {( V3 R; ~; ^5 Y# j' I8 i0 m; L  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, |6 G1 s: K7 q" \/ J
  temp = 0x03C10001;   //DLB = 0 VS DLB = 13 H/ c- a# \1 s: l8 F5 N+ A3 t
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled9 j9 g$ y: h* }: ~, g
  temp = readl(IO_ADDRESS(SPCR_ADDR));
& w2 \0 X" E5 c: F) F+ v! e) L  printk("temp=%x\n",temp);3 P* S3 }/ Y$ x2 R& R
  udelay(100);/ C' _- R) N- k0 l4 K, m; N% G8 O

: N% u+ b% b9 J8 E4 h' K  //set GPIO direction
/ Z& K3 b' c) f: d2 ?   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! @! K' t. ~% Z+ e" P: P) F2 n   temp = temp | 0x00000100;//EPR----input( t9 ?. o; I$ E  A/ f# |
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 D2 S+ I* |2 s& ^, h" J
   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 q; x- j* v8 Z" |& j" `* ]; l 2 f: R9 U( ]: R, N$ i
   return 0;8 ~9 C' q- r% o. I2 H$ y! I
}, q, X* l2 a( ?7 k2 N8 u& A+ j) D
static void __exit MCBSP_exit(void)- c5 s0 H; l1 m+ b0 B& J
{
3 n1 }( X, Q4 s   printk("mcbsp chrdev exit!\n");
" Z# ~8 m$ J3 W# y/ J3 T& V   cdev_del(mcbsp_cdev);9 K3 Z6 G' f" y8 ?1 [3 }
   unregister_chrdev_region(mcbsp_dev,count);
/ }% i1 Q# z6 L  D   device_destroy(mcbsp_class,mcbsp_dev);
! h. h. m8 J6 C" g1 `) @" f   class_destroy(mcbsp_class);
8 z) {! \& F! n+ M7 x( @}
5 C8 c0 z- a* k0 B8 m4 D; gmodule_init(MCBSP_init);: J8 N- `: ^7 o# C9 k0 |
module_exit(MCBSP_exit);, J0 {; Z+ e$ z2 _

8 F' i, |( L; ?8 L5 o1 {MODULE_LICENSE("GPL");
' n+ p) w* ]& _1 b/ Z. M
8 z" G0 @* b3 y3 r0 u! Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) E( A6 s2 D' z7 s; Y, G4 h我的应用层的测试程序如下, V  }7 ?+ Z8 M! Z9 T% t0 G2 x" W
#include <stdio.h>
! Y9 |& m" D' C# B( g' D& c0 V#include <string.h>$ t2 R% |: q% y' `8 j. y1 C
#include <fcntl.h>
3 Q) N/ P0 S3 }# w5 V8 z7 x" w#include <unistd.h>
- y5 {3 d+ g# T5 p2 _#include <signal.h>
- d" N) B) S( \2 c# j$ C; g#include <pthread.h>       //线程; Y* o6 _$ D; t* U5 f' H
#include <stdlib.h>6 ]2 l0 T# r, X
#include <pcap.h>          //捕获网口数据9 P) K& \; T, v8 C
#include <semaphore.h>     //信号% H4 H+ j; i4 _
#include <sys/types.h>     //消息对列. t; }8 I8 N2 t7 {( H, B& H
#include <sys/ipc.h>       //消息队列$ E  L( d. ]! R0 p* j
#include <sys/msg.h>       //消息队列
' j, K: u( ]3 [& a& }5 ?#include <sys/select.h>
9 {2 t6 a3 m8 g; D( d. a#include <sys/syscall.h>
# D" _$ Q+ r# i: k; ^+ H#include <sys/stat.h>
% F5 |2 H5 g5 X" L5 t#include <sys/mman.h>
. E, L8 W: a1 }" M2 l& i/ v. B4 A#define msleep(x) usleep(1000*x)
. B( o3 C+ o% |- A
" C' T2 S6 C! b4 A; Mint main()6 n( I/ [1 ], H: j9 Y9 J
{ % r2 u" v0 `' ^7 r8 V" B3 ~
    //MCBSP,ARM与AMBE2000交互设备
( m- ?8 `7 s! W2 K" p int fd;
& c' n; W2 M: I0 f unsigned short data_write = 0x5555;
6 z4 q9 m) I0 [6 t( ? unsigned short data_read = 0x00;
6 ?% V0 x0 x; k) T/ W  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! i/ {' a  [5 X  {1 z
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 m* S8 u4 W8 x) c: |
   
7 h. Z0 c4 v- N8 b/ b2 t& V  if(fd < 0)
! G% z: `5 g$ P! H. ~  {
' U* w, |5 z5 l     perror("open failed\n");
; J* @( O! e% y$ \7 h2 Q     return -1;. u2 v! ~% {( a" x- I0 B! {: C
  }6 D9 h( O" ^' }
  7 k" h) ~8 C6 H1 X" ^
  while(1)
$ d( b2 O, M7 c: ~1 }  {8 p! \+ J1 g% {1 i- Z
   
% v4 v- N7 U  i" P   //AMBE2000每次读写是24个字为一帧3 F# |! J( B6 _* Y/ @1 E7 E
   //写数据时将数据在底层存储起来,等到中断的时候再发送2 s5 ^7 b  l1 T3 r. W
   //AMBE2000输入数据是以0x13EC开头的
4 N4 M9 {) U. Q$ W   write(fd,&data_write,sizeof(unsigned short));& a* t6 k: K4 Z
   3 I+ {  U$ P) H
   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  + h. X5 W% Y0 l* p0 w# u
   read(fd,&data_read,sizeof(unsigned short));
: c, x, F& V& [- A( `0 M   
8 I# X$ c% r8 i7 h   if(data_read == 0x13Ec)
. i; |' ^  o4 ^- o+ r( H7 z   {' Y5 d5 i& \+ z$ E1 S9 p/ t
   
9 W' {2 V1 |  J2 }; B3 Y    printf("data_read = %x\n",data_read);; o( L: e* k) u+ ^1 P# |
   }
$ P* |: S8 E: X$ q   ) l2 {7 ~) T  Q
   msleep(10);" E9 W7 n" [/ d$ I
  0 W* t! e( q/ k' @4 H" |
  /*
0 j- K# {/ c$ i7 l. D+ Q: u9 c   ioctl(fd,1);   5 b2 \+ W8 X2 ]% b, Z% d
sleep(1);
3 a9 S: j5 ?* [/ ]& U0 n% N ioctl(fd,0);6 X4 x& ~% _, d7 E: Q" e" s; E
sleep(1);
$ A* W* V8 q  x* I% k% n */ 2 l# N# a4 w5 i4 H/ ^- `
  }   3 M" i" Y6 w& [' |% C% W! ]
return 0;
& t$ i9 q4 Q& D& l
. q" |: f8 L8 M}" s  K. i" [& ~, k; @) E; f) @

& V  a; P/ C0 @& C, z- c2 y' J4 }多谢各位指教,谢谢! 急% O* v/ k' Y- j+ N5 l! P3 a

6 L+ z( d% j: u; n! I2 z9 g% i
) A  F* X- H  Z% X1 u: X9 c9 N. C0 U& `4 z9 g; Z. U4 @

) ]$ h' s/ X: }1 r3 d: P: C
$ c+ I* q5 h2 `1 x% q1 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 17:28 , Processed in 0.049012 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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