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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

6

主题

7

帖子

58

积分

注册会员

Rank: 2

积分
58
跳转到指定楼层
楼主
发表于 2014-10-16 10:58:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . o% L) I$ k+ K
/*- R+ }# f( W( h5 J  u3 _  z5 f
* Copyright (C) 2009 Texas Instruments Inc
1 H+ ~$ N& d* p$ E *
' ~# R& S3 @3 q2 u* {; V$ w# ]4 O * This program is free software; you can redistribute it and/or modify+ k% a7 E- S+ {: e1 g; `3 y
* it under the terms of the GNU General Public License as published by' s8 C3 `2 K6 A: B3 ?
* the Free Software Foundation; either version 2 of the License, or" C( n: ]5 ]% H3 J" f* x
* (at your option)any later version.8 v9 n, i, M1 v/ I* P
*8 p% e! D) @6 x! M5 V* \; D8 H2 a
* This program is distributed in the hope that it will be useful,; C0 D) b! W! g) ~* d4 l% a! d
* but WITHOUT ANY WARRANTY; without even the implied warranty of" c7 w; J5 m5 K; f. ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: u8 N; J$ m3 m! _. z
* GNU General Public License for more details.
3 Z7 ]1 {+ J% w# r4 b7 g5 N *
, _8 g' R% A0 V. ~  z* n * You should have received a copy of the GNU General Public License
. @- E5 s$ E4 D! m * along with this program; if not, write to the Free Software
/ p- e) ^2 Z6 H8 x9 V4 i3 s * Foundati
3 q# [6 @& u" c% h8 b3 q*/
5 g+ @# j( w# C) O/ @) U  H#include <linux/module.h>
- c2 b) ^$ |7 X: U& W: n# ^#include <linux/init.h>3 V" J) D. n/ B; s  v, V7 a- o
#include <linux/errno.h>1 V6 c' h5 W, u7 Q+ j" z
#include <linux/types.h>
- I3 B5 S. U3 T% j7 r* b: t* L#include <linux/interrupt.h>
( j  E' t  T- k3 g#include <linux/io.h>6 l4 v& i, B6 K: @
#include <linux/sysctl.h>& B" T, o3 h+ E2 `" O
#include <linux/mm.h>
; v4 `' X. R: H7 ^: w$ D8 G#include <linux/delay.h>
! L$ c7 i( _& B# W6 i#include<linux/kernel.h>
2 {2 l2 I- K& c# d9 R#include<linux/fs.h>
( V7 V( L8 ]8 G: D  U#include<linux/ioctl.h>+ R& O  a, h* I6 `
#include<linux/cdev.h>
: r, y. b7 `8 Y3 y( D" c#include<linux/kdev_t.h>
2 o0 u1 d4 O2 u$ e; G6 \$ C#include<linux/gpio.h>! g* w6 K: X  J6 H. x
#include <mach/hardware.h>
3 l) ^$ A$ r! [- p: r#include <mach/irqs.h>
( L( e/ L3 `) C% j4 W0 K$ F( ]6 O
#include <asm/mach-types.h>8 C: d& A- t  @" `# v
#include <asm/mach/arch.h>) Z* W  Q' b2 b! d, S/ z
#include <mach/da8xx.h>9 f2 F% b( _$ a; F! ?
#define  SYSCFG_BASE   0x01c140002 H1 w0 _9 P( t& c( B; d
#define  PINMUX1_OFFSET   0x124
, u3 p% P% ^! C( u- P* z# |#define  PINMUX18_OFFSET  0x168 " I! p8 }& j  c- h) M/ |, n& {
#define  PINMUX19_OFFSET  0x16c
3 S& f6 U( H2 u6 o* y& U#define  SPCR_ADDR    0x01D11008  //MCBSP1_SPCR6 z' ?( w6 e* }' W/ h
#define  RCR_ADDR     0x01D1100C  //MCBSP1_RCR
) ~5 G" x  N$ f( Q#define  XCR_ADDR     0x01D11010  //MCBSP1_XCR8 p) v& l3 S: }
#define  SRGR_ADDR    0x01D11014  //MCBSP1_SRGR. k, _/ X' B- O, M7 k/ b% [
#define  PCR_ADDR     0x01D11024  //MCBSP1_PCR
" s# N( V/ b& u9 u3 K8 c                           
0 L3 y. N6 b* S% t$ k#define DXR_ADDR      0x01D11004  //MCBSP1_DXR
( N# x/ d: G9 U2 L7 s& K& \#define DRR_ADDR      0x01D11000  //MCBSP1_DRR
1 f+ L0 A, O& D  x9 ^//PSC
: O/ j) [" a2 u5 B5 }6 z. G8 o# g#define  PTCMD_ADDR   0x01E27120  
0 T! q, t7 g6 E" d2 x/ m& q$ J#define  MDCTL15_ADDR 0x01E27A3C. B/ Y2 ~% L! Y, M
#define  PDCTL1_ADDR  0x01E27304' y. ]4 h5 K6 ~+ x# {
//GPIO8 direction: J& ]$ i2 v0 B+ o4 [; k
#define GPIO8_DIRECT  0x01E260B0
/ l3 B$ T# ], u. ]1 X, m8 ~#define GPIO8_OUT     0x01E260B4
' A( P6 v  ^) Y" M#define GPIO8_IN     0x01E260C03 T, G$ Q1 _- x( R$ y
1 s9 E2 o/ m! w1 C& d
//#define MCBSP1_RINT    99              
7 i' e% s9 ]! g3 e//#define MCBSP1_XINT    100  
1 w8 H9 i! \- w7 Mstatic int MCBSP_MAJOR=239;
6 U1 K$ ?( y6 O  ?/ _% U  g* g/ wstatic int MCBSP_MINOR=0;( k0 G8 r; g) t' }/ V' R1 H
static int count =1;
: Y9 B$ P& _9 N9 a) ?5 m# o9 V& O+ r: Y+ ?+ w3 @% e+ z+ d
#define MCBSP_NAME  "MCBSP-device". Y: Z1 ^2 Y- C+ k

+ N9 O' C" k: n( Pstatic struct cdev *mcbsp_cdev;: ~# M$ n" {: H) O# {
static struct class *mcbsp_class;2 g; m& B: z2 C: E( a  S
static dev_t mcbsp_dev;5 a+ }8 X. I/ C; }
unsigned int DRR_data;
$ o- U: v6 ~3 w$ v9 K( b- Z5 dunsigned int DXR_data;
6 j2 x& i4 a7 A& P5 O2 v) Wstatic int mcbsp_open(struct inode *inode,struct file *file)
1 j* s# P6 W. h: [  e2 `4 ^{
- P6 d# c2 \" T8 e1 w   
/ ]7 p/ F2 z5 b6 \1 w- b# g- V   //interrupt enable,initialized8 a) u7 k2 g/ v
   unsigned int temp;& I  _7 ]5 _* @. x' S! Y
   //SLEEP_EN(GPIO8[10])---0
6 X2 k( Y; t4 K/ K   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* G$ t) ~" P4 N" C1 ]( ]   temp=temp&(~0x00000400);
& x" U  n  V+ b8 M- |' X2 g& N   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]8 F8 D* p# o# ]% \6 [
  //RESETn(GPIO8[8])----0----1
7 z) |4 M4 G" ^, k0 q   temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 T* X$ H# w+ N
   temp=temp&(~0x00000100);
  q, X$ `& Z, y$ J; A   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
9 _3 j- y) O# |- L   udelay(100);
7 ]+ j) o9 L4 R! a" d   temp=temp| 0x00000100;7 `. L+ J: `( t. F  a7 l+ I- C
   __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
  l2 L* p8 v2 Y0 m( k   udelay(100);) l" x# m9 {  D$ x; J& G, I* Q6 Z
   printk("open success!\n");
- c  [& U$ W$ a   return 0;/ E0 L7 Q0 u+ c) c4 G9 D. |
}4 b5 h: Y( I, M3 x6 y

; x5 N( p0 `* y& z3 Vstatic int mcbsp_release(struct inode *inode,struct file *file)% z! l  `  X" }; }) B+ o
{. ]9 C- Y; a# o; b0 z
   printk("release success!\n");
; L; o2 M# z$ j. @+ w. C$ }6 s. ~   return 0;
# C6 A" M' |0 n# U}& `1 m  u( N/ x" V) V; i
) v( C% o. X) i. }$ T/ D
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% ^$ B' W9 B+ a{% s8 ~( N, ]- @- \- P
    copy_from_user(&DXR_data,buf,len);
2 C. T2 l# w6 d4 Z, J/ q) K    iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));       0 w  V/ L$ x3 ~  I1 [
    return 0;
/ v. ?5 N$ Q! Q( j1 q$ d ; S1 F7 [. ^/ L3 v8 g4 R
}
7 `7 N. |" b3 f- l4 u2 p
' y" x! D/ {6 y) I  P0 M4 Qstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 ~1 H+ w- {! t) a/ W{ / k$ G7 a- I/ T- [  t! ]4 `
   DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- ^# f! J8 b3 \% K- o8 b
   copy_to_user(buf,&DRR_data,len); 5 U: Z% I- m5 {) w
   return 0;9 p' p' o0 L0 m, r3 {
}2 {& f% M4 O) G6 u; t

( @; ~$ B- a+ x9 Q: E- ^  l. i$ a* ?$ Y& q
static struct  file_operations mcbsp_fops=1 U, a6 B/ Y; g6 ^3 t  q6 r) n$ k
{
) x+ y* z( G1 z  G& D7 W  v, K1 S" c   .owner=THIS_MODULE,
; A1 a+ p. P! q   .open=mcbsp_open,
- t9 N  @3 A' Q  w& ~1 g! _% s   .release=mcbsp_release,
. w& V3 r5 |$ c9 |   .write=mcbsp_write,, B: l0 M9 t+ D6 x+ ~& I
   .read=mcbsp_read,6 t, g1 r& ^) f# i+ S% P% ?
};. z8 u5 D, C2 `1 x' d' d! A5 y2 j
static int __init MCBSP_init(void)
, v% k' _+ ~$ @  c+ J6 _{
1 G; w3 H5 r5 l   int ret;" @! Z1 [$ c" d; ~- Q; \6 b2 \
   unsigned  int   PINMUX1_REG_old;0 [% K/ f) ?4 [% h& [
   unsigned  int   PINMUX18_REG_old;" U  ~  v4 O  i$ F9 V7 c, s: o- h
   unsigned  int   PINMUX19_REG_old;$ y6 T5 P5 K7 {
   unsigned  int   temp;  
, w! _5 ~# ?* l+ e& E   if(MCBSP_MAJOR)7 \2 p, ]0 D+ \6 r  x' i
   {
8 s' R5 E2 o. B" ]' C; b. x      mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
4 X) r$ B& \3 z- `      ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% g1 p/ P% c6 O" C
   }
+ D# Y" @) H% Y+ X* o. r: U* S   else/ x' g' |: W% T1 P" K) C' g* k
   {+ d# @* |, |! n. L  k9 \5 \4 |
      ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( ^, L& S: A; {) g) s3 r/ H      MCBSP_MAJOR=MAJOR(mcbsp_dev);
* M: i" E/ x$ S5 d; ~   }
% o& c: ?, z3 C! ?* q& u6 j: D/ k   
: ]- H* e$ H/ {4 y2 ?   if(ret<0)
: L# l" m+ _; X8 V( j. d   {; r8 V2 O- ]; U6 e. K
      printk(KERN_ERR "register chrdev fail!");
" v. Y! p0 X' f: ]' N% `6 w  O' g      return -1;
+ w1 l. `' v+ ?8 H   }* o$ @# I: Y; |- n( q9 p4 e( x
   
7 x4 M2 E! M% x; e2 U0 _9 U3 @: A: t   mcbsp_cdev=cdev_alloc();! E+ O8 N- D7 W* U3 q0 q2 y! ]
   
/ t/ a# F. P- V" L5 V   if(mcbsp_cdev!=NULL), d% ?+ p: S; C' u4 ^. I. I7 F
   {
; N% q1 _3 J: u9 A! H      cdev_init(mcbsp_cdev,&mcbsp_fops);+ Q: W# g, _% V2 I: y4 q0 B; Y
      mcbsp_cdev->ops=&mcbsp_fops;
4 t' U1 g- o8 A      mcbsp_cdev->owner=THIS_MODULE;
: ~3 R  g6 D+ j# ]3 v" i  U      4 s5 V$ O0 O( g8 f& O
      if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 |' P, h8 V4 Z+ b" Q8 i
          printk(KERN_ERR "register cdev fail!");
8 d  ~. m# O) J- R" |      else
1 o( q& [! M3 B9 q/ o. y          printk(KERN_ERR "register success!\n");
" _0 S) c; b5 ]2 I   }+ w$ B/ I- Q5 T' K  \
   else9 r, S8 a9 O* q* B
   {! I' p  Y2 K5 S3 Q; {
      printk(KERN_ERR "register cdev err!");* ]6 ~( \/ p5 E' ?  X
      return -1;
0 T/ M3 T& A8 L4 Q! i- J  o2 q   }9 u, M6 s2 B0 W& E, {$ t
   
9 _8 }3 Z1 N+ ~/ w; o6 C2 ^4 J  mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ D7 F& E0 S& O/ o5 z- W7 c
   if(IS_ERR(mcbsp_class))  k& z5 I, Q* O- w- O) L
   {) \, A) {% \6 m" m
      printk(KERN_ERR "register class err!");
7 p4 l; e! t  ~3 L( P2 Q   return -1;5 g2 y/ Y& j) i. O  [
   }! y" T4 c, B( v3 p! H
   device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ x1 ^4 Q8 b% l: p
3 |+ s) w. Z% M6 }; |5 M2 O   //PSC7 w' T! j1 o5 L
   //add Enable MCBSP
. E1 l, z" a9 s; R4 y: {   //test6 k7 j& `! b3 K7 H/ S+ L
   temp = 0x80000003;
- l; U  ~  S" ?/ h7 o   writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( P* n4 e4 y" d! H   temp = 0x00000003;( p" ~* p2 W' k
   writel(temp, IO_ADDRESS(PTCMD_ADDR));! W1 D- W/ e% Y8 p& Z
3 x9 F7 v1 w) n5 r; y6 f2 V
   temp = 0x001FF201;0 W4 z1 [/ w9 b, Q, j
   writel(temp, IO_ADDRESS(PDCTL1_ADDR));) P/ R* k3 c% S$ d: `, A: J
   
3 n* Z7 L& T1 `6 s* I3 B) T0 z, V   //PINMUX  
; }, [" O- i5 o( j: a   //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
5 q, X( B: k# p# k- l$ t   PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);  0 D, m, }+ b5 j. d+ G. d6 g
   PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;   & P! h% j" R- X5 J: L* _
   writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
  ^* }- t& F9 ^) n   
" ]! ]& \" c8 N$ U7 P   //SLEEP_EN,EPR,L138_SHK1,L138_RC# P5 R1 @2 F7 t$ d, c: M0 c
   PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);  
+ n" x! v% y3 r   PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;   
4 H* R* r0 b" b* L   writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 p9 G! M- L/ j# d+ d 8 u% \7 v& {5 w: m3 t+ v
   //RESETn,L138_SHK26 I& h1 D- k! F
   PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);  2 p2 K& T0 k- ~/ G" E
   PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;   
' S. \0 L- j  Z& m6 \( Z" J   writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);' P+ u2 {) ]9 q5 W/ T

: S' h$ n6 Y* y) q
* |3 ]9 R6 I, [& n  //SPCR Register
9 _, [, R% |/ j: h% H  //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 E! D( I3 f2 e/ s
  temp = 0x03000000;//(DLB=0)  c4 @8 _$ `- |9 p' X
// temp = 0x03008000;//(DLB=1)/ z# ^6 D! P6 {6 Z; \
  writel(temp,IO_ADDRESS(SPCR_ADDR));  //reset
$ h1 ]! u" k; k/ y4 ^% U$ ]  temp = readl(IO_ADDRESS(SPCR_ADDR));
& I+ C. K3 I) d- f* {, p" v5 \# b  printk("temp=%x\n",temp);$ ^) C5 a( N( M/ |: N$ b
6 c4 R/ T0 u, K1 |) G1 h1 b7 N
   //PCR Register
# |; c2 y8 A8 a1 F& @   //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
  U" e7 V1 S! \9 M! p3 D/ p4 ^7 s2 Z  // temp = 0x00000F0F;
4 e, [& Z) x) c3 R; u1 ~) C  temp = 0x00000B0F;
4 {6 ^* k$ @$ w- P& n: o. r  writel(temp,IO_ADDRESS(PCR_ADDR));  //initialized
6 b, z! |+ t) A3 S  temp = readl(IO_ADDRESS(PCR_ADDR));
# d2 j- `/ v3 f+ a; E0 M  printk("temp=%x\n",temp);  $ x6 c2 G0 F( b2 u. H3 T+ M) @
   //SRGR Register
5 u; F2 A# W$ z4 U  H   //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
# S& f. `. s& q# V' ]6 B //temp = 0x301F000B;: j2 a' U5 b9 O: S5 ?0 X0 O
   writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR));  //initialized
: H6 ~, w5 x) ?& m0 p  temp = readl(IO_ADDRESS(SRGR_ADDR));) o3 O. Y1 v( i, E+ V
  printk("temp=%x\n",temp);
5 A* J) B5 r# T( q( }9 _5 j- l   //RCR
5 n- u5 {; c4 j* r9 p  ~   //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," [6 P7 L7 X. ?" N. l) u
   //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 n/ d0 [9 M" ~' }$ h% G& E0 U
   temp = 0x00440040;) F8 A" y& e) ~9 D$ R- k4 |( D
   writel(temp,IO_ADDRESS(RCR_ADDR));  //initialized   ! I1 H5 d" p4 H8 h9 Y4 ^
   temp = readl(IO_ADDRESS(RCR_ADDR));
: M( d2 y5 _/ l8 ~9 \$ y. v% [   printk("temp=%x\n",temp);
! P" ?, A4 T8 Y5 w/ E* g   //XCR
5 L8 d, s* z8 `4 w; y   //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1& R- E* s  W4 d& a( o$ ?
   //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% M0 m& E# M9 _2 ^/ i0 f! I
   temp = 0x00440040;
0 X' U: o& a2 w" o   writel(temp,IO_ADDRESS(XCR_ADDR));  //initialized   : ~, a& n' G+ V, [' r+ }
   temp = readl(IO_ADDRESS(XCR_ADDR));
: z3 j; V- Z: W+ ^$ q   printk("temp=%x\n",temp);: b# `; n. N  l3 ]  S
  udelay(100);' G1 N" J! i% a0 V' _
  //SPCR Register
7 P: ?7 Q3 E# z6 K5 H' S  //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- X2 h/ y0 s9 U  D- u: c  temp = 0x03C10001;   //DLB = 0 VS DLB = 1
; s! O, p; \7 J2 q: X3 Q" ?  writel(temp,IO_ADDRESS(SPCR_ADDR));  //enabled+ B7 B: D* n: {1 ?* @$ r- m; _
  temp = readl(IO_ADDRESS(SPCR_ADDR));# V/ v! {. Y0 v5 w
  printk("temp=%x\n",temp);
0 ]% J( X* o; H# Y9 n  udelay(100);7 _7 ?$ O* ~( d7 n) _! y6 [

+ {9 z' O4 H$ H) A2 S5 _  //set GPIO direction
  M  v9 _$ U, P1 u" c0 ^   temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- q" q6 N) K+ ~+ p0 e   temp = temp | 0x00000100;//EPR----input: R7 r( t6 q5 m4 v8 s; N
   temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 b4 w5 M4 u/ Y- k7 b- h% a   __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; ~6 V! g- U5 k
, k7 e# L' [% R. g2 Q  @/ P   return 0;
1 [; ^9 Z5 b7 l) J, ]}
* a1 ]: C" ~) A7 t6 zstatic void __exit MCBSP_exit(void)* ~& I1 J3 M, _# @* h' o$ U; E  L2 g
{
0 o$ W3 L$ G) S' X8 p( u   printk("mcbsp chrdev exit!\n");' ]2 J; m' G9 Q3 O: h, n. e
   cdev_del(mcbsp_cdev);
5 x- @- f1 q+ x( T2 I% I   unregister_chrdev_region(mcbsp_dev,count);
/ p2 f3 b" [4 ]7 K   device_destroy(mcbsp_class,mcbsp_dev);
- B% F' S4 W% _7 n- q) T7 V   class_destroy(mcbsp_class);9 K6 d4 P; p! Q- G! A7 A% R
}2 w/ l3 a/ j+ r- d8 _, v) j
module_init(MCBSP_init);
' y4 i3 k6 k& g: K3 m4 s) Z( |$ Lmodule_exit(MCBSP_exit);
/ d4 u3 T% s, n5 i$ _& ^& ^# [3 b( B8 J, K
MODULE_LICENSE("GPL");
$ @/ x6 q; \. a, d
, b+ K* v: L( V3 l/ q, |+ c4 O* P我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
3 S. d& q1 P7 o4 ^' @我的应用层的测试程序如下; c4 H. e" z. X# t, j4 C# F
#include <stdio.h>
8 F& A$ Y$ P# k# }  Q+ x, m#include <string.h>
) q) d7 S2 o! B; o1 s# [#include <fcntl.h>. y! m5 ], a" r; a
#include <unistd.h>* N" Q* S5 \  N% r. X
#include <signal.h>
" G! [8 T; ?' u2 U+ \#include <pthread.h>       //线程
7 T$ X9 z( n1 m! P$ i% o' w#include <stdlib.h>
" E6 ^  S+ V" W#include <pcap.h>          //捕获网口数据
- B# U% p. @6 ?' C: f#include <semaphore.h>     //信号
! o% U) ]* o5 u# h; x/ ^#include <sys/types.h>     //消息对列" u& r. a: r. q% k
#include <sys/ipc.h>       //消息队列
; x# t7 f' S/ ~#include <sys/msg.h>       //消息队列
+ b/ Y6 u6 N9 \4 C+ q9 q( K#include <sys/select.h>, x  |- s$ n* j
#include <sys/syscall.h>/ f/ w4 L4 V& G
#include <sys/stat.h>1 w& W0 _+ [2 t( f' g$ D& T: i4 t
#include <sys/mman.h>
' `& y, C2 y  K+ A  u4 K! `#define msleep(x) usleep(1000*x), v8 X% D3 r: U- c# k
: i+ @3 D- E& z/ ?, x
int main()
8 c/ X" c/ a8 V. W* e{ " ^+ w! `3 f% k' a$ {
    //MCBSP,ARM与AMBE2000交互设备4 u1 _% J5 r7 B; O  S, P
int fd;% a: l) X5 D/ X) Y+ z
unsigned short data_write = 0x5555;  m& A/ m# o) [0 V2 _, p) C
unsigned short data_read = 0x00;
$ d" V3 N( s" C% a, q+ W' H* o. {  fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* _$ m$ f! D9 w! F
//  fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ B! x9 ]' Q/ R& v1 L- N' d
   
% n) E2 z0 E8 M! Z6 C6 U0 I. `  if(fd < 0)
; k: q) ?4 J& w" C- m  {
/ w9 v3 D+ I- |! w$ u/ i$ h     perror("open failed\n");( I+ x% Q( O+ y- s' Q6 ~: C
     return -1;: d' u; H" h5 V: E% v) R7 ^
  }2 H  ^) l: B1 }4 M8 k! o
  
! @/ g& o  u7 @+ K6 }" {9 x  while(1)' S/ p" ~9 j( V* G; D5 l/ g
  {
( s" E' K" v' y8 U( ]   
  U1 M. d  }1 B1 c   //AMBE2000每次读写是24个字为一帧
$ f# ]  r  M8 D& E   //写数据时将数据在底层存储起来,等到中断的时候再发送& s/ n" ^. \$ Y6 _2 |; Z) W; G+ Y, F
   //AMBE2000输入数据是以0x13EC开头的" l* F1 X: B9 `7 R$ Z7 s% {
   write(fd,&data_write,sizeof(unsigned short));/ r. E5 f' E* \
   
7 Z. f* e0 d5 U. P+ M# C   //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层  
% W# a' P3 K6 k2 c   read(fd,&data_read,sizeof(unsigned short));
. L0 m# X! X* `3 I2 w3 Y   
0 R2 z1 A1 ?  O1 T. y$ ]8 h2 H. |   if(data_read == 0x13Ec)
/ `& j7 Z) h% ^1 Z8 s" F: f4 R. G# f   {6 R; }! z9 N) y7 L/ D
   5 v! Z0 \2 x! ^6 j1 Z
    printf("data_read = %x\n",data_read);
4 P) k6 M: b  n) v8 {! k4 K   }2 w. I/ y$ l* Q4 P" _' y) R8 i
   
" j; b) |. t0 ?   msleep(10);8 \; s6 g1 z: ]. @; A( ]
  . n- W7 B- }3 R. h
  /*
6 [! X, A; ]5 i6 F   ioctl(fd,1);     I# g+ l  I+ b
sleep(1);, y; I- S( T0 \
ioctl(fd,0);
/ X& W/ P) l4 T) s sleep(1);1 S9 h+ E3 \* ~4 _; N
*/ ( G* a% C  Q) c) g
  }   
/ A9 E* S5 N' E/ c. h4 u  `4 {" ^ return 0;7 E: S: i, f- z2 \1 k

: ?) m' K3 N' d& j5 n% R}
$ X, Z. V  p* B8 L' a$ L9 z
6 T0 m1 K: b5 S多谢各位指教,谢谢! 急7 ?0 l! {8 K) e! u5 m
+ b' h2 M) X- g  }

3 o0 _7 e. e8 T$ c5 f8 `: @! o1 m9 r+ ]5 M" r5 K
9 d4 P9 S& |5 v( O9 Z  Y( n+ x
' q% y/ `' b% j5 \) @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 18:03 , Processed in 0.056468 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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