嵌入式开发者社区
标题:
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, or
3 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 of
6 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 0x01E27304
5 F! u j( A) ]
//GPIO8 direction
8 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 0x01E260B4
7 ?, Z, X" ]: J( H& G
#define GPIO8_IN 0x01E260C0
4 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) M
static int MCBSP_MINOR=0;
5 X* T4 l2 _1 O' V3 f$ E
static 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* a
unsigned 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 }. C
static 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* g
static 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* B
static 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! j
static 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
//test
3 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)); //reset
2 }% {" 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 Register
8 {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-0
6 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-1
5 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 J
static 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/ k
module_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 G
4 _. @# 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 q
int 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; T
6 Z1 Z( Q4 ^3 x7 D1 ]
) ~! f! t0 w8 a# @% ~9 Y) J& N, r4 ^
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4