嵌入式开发者社区
标题:
McBSP时钟、同步、数据线不正常
[打印本页]
作者:
gaocaimary
时间:
2014-10-16 10:58
标题:
McBSP时钟、同步、数据线不正常
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, N) N, J3 K# y# F6 O
/*
4 f$ ~) V- v8 R8 G6 Y% s
* Copyright (C) 2009 Texas Instruments Inc
3 e$ l5 { E3 R+ K# I, ]
*
( E3 [) V( }* D z0 N
* This program is free software; you can redistribute it and/or modify
4 J* c2 Y+ M5 J
* it under the terms of the GNU General Public License as published by
7 l; E) h- u0 N4 e; D# P" Z. a) ~
* the Free Software Foundation; either version 2 of the License, or
. g$ I* @* [1 r& Y8 P
* (at your option)any later version.
# k& G1 l6 `& `! u0 w
*
( C$ L% Q! {" i( S( N+ d C3 {
* This program is distributed in the hope that it will be useful,
% H2 i" N( z+ e
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8 X9 j8 S# L& A* a7 f \, [$ }
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 A* t4 E6 R& O8 W* R
* GNU General Public License for more details.
- k9 i. V1 L: `
*
- ~$ [! w- J& Y! h
* You should have received a copy of the GNU General Public License
7 X# @8 j: w) Q) y- o
* along with this program; if not, write to the Free Software
9 u# k+ h* p F$ K
* Foundati
! l$ h+ S# o; W9 C
*/
7 L+ u" Y4 C) v# _% `& Q, l
#include <linux/module.h>
8 M9 N! E0 W# Y6 ~9 Q
#include <linux/init.h>
5 `9 X+ ?) B& b4 t s
#include <linux/errno.h>
" {. r" P' t+ x* u' C4 _0 C( d
#include <linux/types.h>
; \& B4 T6 U" z5 `
#include <linux/interrupt.h>
Q5 {0 l' r( ?/ F, g. D$ y( `
#include <linux/io.h>
' Y! s& j2 ^1 n$ a/ t
#include <linux/sysctl.h>
+ U+ L: L% `. k* w8 d3 B ]! W
#include <linux/mm.h>
" `. V- I. T& q. d& L5 M
#include <linux/delay.h>
: B ^' [+ J$ X5 A
#include<linux/kernel.h>
& c/ B9 c( w1 ?
#include<linux/fs.h>
9 k0 {$ ~. w/ K1 Y; ]1 E
#include<linux/ioctl.h>
) W/ c9 p( \- y* l$ b
#include<linux/cdev.h>
3 b' k( F# |! i# K3 [3 h) p
#include<linux/kdev_t.h>
! ~2 |) s" V0 s. p
#include<linux/gpio.h>
' q& C8 K# t1 H
#include <mach/hardware.h>
1 Y! a, M6 w0 E: Y
#include <mach/irqs.h>
4 x6 ~! T j4 V% [ Y2 D7 A
1 q) c+ N, X+ Q' c. O9 Y' E
#include <asm/mach-types.h>
5 w% d$ U6 L9 H. W
#include <asm/mach/arch.h>
: ]* u& y$ S, P* {: [1 W
#include <mach/da8xx.h>
! G) {; C6 G- n6 s! D/ V
#define SYSCFG_BASE 0x01c14000
0 V3 a- n- v- b- K0 u' j
#define PINMUX1_OFFSET 0x124
1 \7 z$ Q8 u0 u3 S! h
#define PINMUX18_OFFSET 0x168
* W6 m6 I( g7 O2 G; o- n
#define PINMUX19_OFFSET 0x16c
) g2 E. t5 z; n6 X
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
& f8 X Y. E1 c' o \* x. @
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
- Q" ]1 C! Q+ U& L" B; b6 P
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 J* v* I: P3 y3 {, U
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
6 F6 [- p* R8 S$ L v- ]
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
, G) ^7 N7 g+ F! S3 l$ _
" n+ H f5 a. B% i7 N: N! U
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
* W1 k8 x2 g* E
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
: ~! |# q7 S6 v6 T+ T8 |
//PSC
# j4 U, P6 T! i" p
#define PTCMD_ADDR 0x01E27120
& L+ p9 u5 _6 J6 x/ F( A
#define MDCTL15_ADDR 0x01E27A3C
' P% W0 M6 `& \
#define PDCTL1_ADDR 0x01E27304
. ` V" Z+ u( K% ^, ~
//GPIO8 direction
4 b0 f8 M& m# }! z/ u/ z6 z
#define GPIO8_DIRECT 0x01E260B0
! b$ U3 I0 F+ O' K
#define GPIO8_OUT 0x01E260B4
" t4 C6 ~! @2 V1 k
#define GPIO8_IN 0x01E260C0
/ y% D; \) K7 C
1 v) i v( W: i
//#define MCBSP1_RINT 99
* f1 f' L4 P t
//#define MCBSP1_XINT 100
* H: K; w+ C) y$ E7 w. n
static int MCBSP_MAJOR=239;
0 \: k; y. x) Y5 M" ]7 G: a7 D
static int MCBSP_MINOR=0;
# d! n, @( H- K8 l# b D0 O
static int count =1;
- c3 d9 V& @6 T" N( J' Y
8 `( d! g% |- C8 d6 g5 |- i! b
#define MCBSP_NAME "MCBSP-device"
) _8 Y& R8 N* `4 v% j
! @, M' Z$ [) s. D4 {' V
static struct cdev *mcbsp_cdev;
/ C/ z& @" G5 i% k9 }
static struct class *mcbsp_class;
& U% b% a# g/ h# k) J9 o3 C
static dev_t mcbsp_dev;
1 `+ B2 [, R# [+ w$ Z! Y
unsigned int DRR_data;
' ^2 ~" S! E$ b4 [8 ^5 m
unsigned int DXR_data;
1 L% k. M) }6 d% |( _
static int mcbsp_open(struct inode *inode,struct file *file)
" C' ~. R) Q4 Z g+ l' w8 V
{
8 ?. S7 I a; h, _: t. N
8 a4 i# G' l$ k% o( P
//interrupt enable,initialized
; Y ^. D: H, b" A* ~
unsigned int temp;
. x9 g1 _5 \ y" S- c! e F7 u) u0 L
//SLEEP_EN(GPIO8[10])---0
5 s7 }6 G/ R, N0 J) x
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- A( d, r. F8 t2 A% u# q8 a
temp=temp&(~0x00000400);
6 x0 W% n T& w4 a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" M4 [# Q; x8 t: `; O
//RESETn(GPIO8[8])----0----1
; p. F* ^7 Z. \9 ^
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 o& b" e& \: |# f1 @7 o" S4 R8 p
temp=temp&(~0x00000100);
) e2 [5 P9 W- K1 a/ u" W+ i9 I! r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 z& i, L% p4 |/ |4 e" p
udelay(100);
4 y: c' b1 ~2 X9 S( ]( X
temp=temp| 0x00000100;
7 W. Y" i' l$ {3 q, b- Z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 A) b" @4 g* D3 j2 d v0 w9 q9 E
udelay(100);
/ x2 d. r5 Z/ S% n0 U0 i& |
printk("open success!\n");
+ ^% m( @* O; ~. ]$ e* H% d
return 0;
0 u" H/ G" G) u, _6 p a8 U! y [
}
" P7 X) W/ v) L4 T/ L( V1 ^ Q
" w8 ]0 j% J% `. b3 ~
static int mcbsp_release(struct inode *inode,struct file *file)
& B& Y& _/ { J* G& y
{
, K) B! E' b* J9 T' f; ~8 _+ P: l7 [
printk("release success!\n");
- W( |, |; y. n1 B
return 0;
$ `& t& a4 _$ W% X) c9 w! X
}
I% k( t4 m$ Q F% _2 u
, f$ ?$ O! ` e% _5 g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
* @6 p9 h7 `) h2 y7 |/ k2 N/ H
{
# u+ {) D' Z% `, H7 E1 N
copy_from_user(&DXR_data,buf,len);
) B/ O1 x: \9 | p
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. ]2 X. ?# f* P/ r- B
return 0;
* Z9 G" W' s) J3 ?% x4 G
5 J, T- s. w* _
}
9 o0 e) L1 Z5 t. |8 \3 C8 k, k
7 H: g; j4 m* `6 ^0 _- V* f
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
9 K) z, Y$ D4 d
{
2 _5 C1 M2 n9 Q1 W4 O3 C Z7 z3 J
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
6 B; h, N: V. L. }) D
copy_to_user(buf,&DRR_data,len);
" F9 q0 _0 f- x' z! E4 f+ B
return 0;
) o2 m% N6 P! s" e
}
( h p6 T# U! J
4 Y% U; W9 x" O' L+ y
Y" Z' X3 w2 c8 o: L
static struct file_operations mcbsp_fops=
" b4 u% a" M4 U$ Q" o+ n
{
) G" K% e0 L( p2 h* Z2 ~, w
.owner=THIS_MODULE,
; ~; ]0 O' a) j* }( o6 i
.open=mcbsp_open,
: ?& b; }# h0 B' X: D8 t. O
.release=mcbsp_release,
$ w- H7 Y7 x$ x
.write=mcbsp_write,
' Y+ x3 O% m1 @3 P" n/ c
.read=mcbsp_read,
! p/ @& ?! D$ f$ f$ Q8 y
};
* G% Q7 z5 I" m" l" n% o( |
static int __init MCBSP_init(void)
9 F% e; z. d0 R
{
; L" O; x$ \1 M) S( D3 V/ a
int ret;
" a" n2 I0 \; g9 w
unsigned int PINMUX1_REG_old;
) U$ ?. {/ Y+ Y/ Q$ E9 E9 ]4 {
unsigned int PINMUX18_REG_old;
' l, r" P4 N" ?: x: N7 g
unsigned int PINMUX19_REG_old;
- I1 Z) v2 @) g6 |* [6 ]# h
unsigned int temp;
; Q" I) v( c2 b! |) Y8 ^: I
if(MCBSP_MAJOR)
5 c3 H! [& [& i& s
{
* X; v/ \; N2 d1 F2 u" O
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' K4 F2 \, ~$ n9 h2 U, C6 |
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
& F. h7 \8 O0 i; @7 |
}
8 N8 H# y+ G6 F/ X
else
! x/ ]4 B& f* C' v2 V4 E/ h
{
0 Y5 Q' E/ S7 z. L
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 Z7 q1 e& J" l% D
MCBSP_MAJOR=MAJOR(mcbsp_dev);
& X8 I: F: W& D# o# J
}
$ }! Y- J. H) W/ @* Z Q( f1 e
: z! Y; ?7 }% a3 H$ N0 `% r
if(ret<0)
, o! d* {3 G9 H# E
{
& Z: U0 d. l9 V [8 p' P8 f- d& m# f
printk(KERN_ERR "register chrdev fail!");
: g+ Z* A) K& b0 N7 Q; B( u
return -1;
( z" o( H x+ X( X
}
! _& B1 w) E0 C$ N* V
% }: _2 M$ P2 Q( o/ s
mcbsp_cdev=cdev_alloc();
0 Q8 D$ E! i" y+ G' N. N9 r- E" z
& Z# |/ `9 e- d0 T" ~8 ^/ _. X
if(mcbsp_cdev!=NULL)
5 _9 n8 j7 I! l1 p; x
{
& F6 L4 j7 V% K% k' t! n
cdev_init(mcbsp_cdev,&mcbsp_fops);
+ R1 ?0 y% u0 v5 z7 D9 W
mcbsp_cdev->ops=&mcbsp_fops;
9 }9 W9 |8 M- x" \2 L& M
mcbsp_cdev->owner=THIS_MODULE;
. i* l7 t. U; L4 S$ \
% h) U K+ o7 F+ o; x1 t4 ? n
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 t! B1 |3 ~/ G: ?& Q
printk(KERN_ERR "register cdev fail!");
$ V: N! E$ p* g z8 ]
else
4 l) t0 T% S& g/ ?6 V3 h+ w
printk(KERN_ERR "register success!\n");
3 f {! I* e0 R8 u4 X/ W% g
}
: F' |# i8 x4 K! T% p7 ?
else
* O# r( R) a7 ]5 z$ S
{
2 Y5 p, x1 z. b2 L
printk(KERN_ERR "register cdev err!");
( v% x, m7 y, o$ E% o+ `
return -1;
1 N/ w; e; h# ^: m! w# n
}
/ l+ o+ U8 n1 r- x) {- _
6 k a1 h: k& l7 D d: |* d
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
/ F% k6 M4 n& u( u
if(IS_ERR(mcbsp_class))
6 p8 H. E! Y# t2 p5 c
{
5 f& k- e k6 {- ?0 m8 U
printk(KERN_ERR "register class err!");
' o# j' ^ w' Y& I3 D+ {& E2 r E; N
return -1;
- M( S) a& A: g, b4 Q7 C
}
. P# }: ~5 m y
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: b, a7 W F# q+ V* _0 p
3 J" H/ j8 `* X5 s
//PSC
- w2 c8 U" j4 v* _
//add Enable MCBSP
" A' K5 A$ o9 W
//test
% Z. `0 B# N( t3 x
temp = 0x80000003;
6 |! p8 f- B0 R+ y
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 D# ]# i' @6 _- w
temp = 0x00000003;
) Y3 p* Y( L# F2 y$ e9 l4 K( m4 }
writel(temp, IO_ADDRESS(PTCMD_ADDR));
# S" O3 h/ x& w& n: m% q2 N
4 p0 z+ s7 G1 x0 i: k& a( J) b( e
temp = 0x001FF201;
: L, b6 S8 b- C6 F9 F0 z
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ y2 t7 w0 U5 |, r: z
6 v/ M7 A- ~6 H
//PINMUX
' A9 h3 l* ]7 H' R p5 P- q
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
% @6 S% A; \7 h3 |
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 D) m) g+ p ~0 V3 E4 c
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 P7 y5 V1 M$ \" N, c
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) M w! x# f: ?2 @! w
; j1 J* M; E# @' N V2 q+ y9 s: b+ T
//SLEEP_EN,EPR,L138_SHK1,L138_RC
( @, ]! Z" J# m9 N+ {
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( @- s' l. |% F- n
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% [$ B; }3 R! C/ r( d0 ^7 d8 u- i' W
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: J: ~( O' {5 C0 s$ r* t& h& v
1 V7 b/ v$ n+ ]: b
//RESETn,L138_SHK2
( t- [( f1 r" i: p+ H5 L
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( e7 o/ x4 Z6 w3 [( H1 N# _
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
' y) g* j( ~$ a: W) h; U3 g& Z; ~
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ t! L2 M2 R7 i5 H1 u. J, i) X
3 d6 I6 a0 `$ b$ G0 u! Y$ ]/ k% k
/ f! S8 m, _0 c9 v* {& h) }
//SPCR Register
8 J: ?+ v1 S2 u T, k$ M
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 c* n- g7 B- R9 e
temp = 0x03000000;//(DLB=0)
- H6 Q) m+ v4 R8 d6 S
// temp = 0x03008000;//(DLB=1)
, u0 R0 i% X: Q. Q4 v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ ]& k: f; A- y) z( _3 g
temp = readl(IO_ADDRESS(SPCR_ADDR));
, y2 M8 m6 P4 V
printk("temp=%x\n",temp);
9 Q) |8 z, k3 K' P. x0 u
) j: Y: g" N0 B9 |' a
//PCR Register
- W. c7 `* }$ i7 n7 e* E
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* O" E/ J" y4 _0 ]
// temp = 0x00000F0F;
& u4 Q# I0 T. E( L: e7 s
temp = 0x00000B0F;
$ ]% N' e: s" I) |
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* y8 |- K2 }5 v/ \
temp = readl(IO_ADDRESS(PCR_ADDR));
" L2 H' w! T' k; Z, W
printk("temp=%x\n",temp);
5 r9 [/ s7 K6 r) e" r( [
//SRGR Register
% t% P; T. C6 w, Z3 l
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 b& X3 q( T. y/ Y! ]; ^) p& }
//temp = 0x301F000B;
{% ], j( ~+ k1 y
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
0 t7 K0 L4 j' a Z( n, `
temp = readl(IO_ADDRESS(SRGR_ADDR));
* H8 u# S/ J1 T& p
printk("temp=%x\n",temp);
8 ^ E; H; w6 ]% m) u5 V ^
//RCR
- Q3 R. T* ~' g* b A$ U2 f9 x( t
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 R" G# N% I" ~, D
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; D) a' w7 g6 O/ n6 t
temp = 0x00440040;
* T& l* h. h# g! H" L2 w" W" z
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 T* Q$ F& y* \' W$ ?
temp = readl(IO_ADDRESS(RCR_ADDR));
; h+ G o# V" A0 B/ \
printk("temp=%x\n",temp);
% Q$ ]7 ~3 w2 |
//XCR
) }; R2 z. M2 H( W4 {
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
) Q E* w# k* n- c5 @+ \$ t
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
* O' D9 V$ Y: a8 \ I
temp = 0x00440040;
% h; y& _8 Q q6 p4 x/ o
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 f8 U% w" ` k2 l6 n
temp = readl(IO_ADDRESS(XCR_ADDR));
' X! L' h3 g( n3 x+ C5 Q
printk("temp=%x\n",temp);
& r& b4 ]' a9 |9 E9 G9 R
udelay(100);
* X$ j. @! I( s$ m; P. P
//SPCR Register
6 ]- L9 Y5 a; V" d% W0 d2 |
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- y0 |# g6 D0 j1 q6 ^
temp = 0x03C10001; //DLB = 0 VS DLB = 1
( q% F. [5 x- A: ~: o
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
$ [# C$ y2 M1 b( f' v1 p# E& y$ k
temp = readl(IO_ADDRESS(SPCR_ADDR));
& O5 G/ U, F- s# p4 [1 ?) ]) b
printk("temp=%x\n",temp);
1 G- _0 M' x/ @% a) ]# f: r
udelay(100);
& z7 C8 j/ ]( C8 M3 t
7 o5 K: u" M% d. f j
//set GPIO direction
; c; ~( T4 N. H( q( h- W3 o4 v. ^/ N
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
c( i3 u8 A R- v# ]: r& t4 U
temp = temp | 0x00000100;//EPR----input
+ Z6 i, M8 s2 U3 C
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. X: u4 N, `7 d( \$ X1 ?3 C2 T z
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. x5 u- |- `3 C$ N* r1 D
8 g6 b9 V( e' _- a& j% i" K
return 0;
' @; I: w$ I6 h
}
$ I$ q- N# _# U9 c7 }* `( B
static void __exit MCBSP_exit(void)
8 i1 z6 K. _# Y, D8 \
{
0 z; v5 v& G6 x7 c9 l7 F
printk("mcbsp chrdev exit!\n");
2 j- Q. ~* |5 ? |
cdev_del(mcbsp_cdev);
, ~+ j4 ^8 ?! i! L6 y: T. j" R) B
unregister_chrdev_region(mcbsp_dev,count);
' K+ y1 l. R% D
device_destroy(mcbsp_class,mcbsp_dev);
' m$ O* n2 K h% z: L
class_destroy(mcbsp_class);
4 `0 V0 p( _2 Q7 p6 D2 x* N
}
0 G3 v/ J$ _! F/ K D
module_init(MCBSP_init);
. v/ X& G% f8 |# @
module_exit(MCBSP_exit);
. a; q" J/ |, c9 e, K. s' H2 @
& g" x: t$ L! B- M+ _# V; _5 c
MODULE_LICENSE("GPL");
' l# q3 s9 {! Z0 z5 b3 n
8 V% Q9 t8 ?. Q6 s* f) y0 K5 o
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 _$ v* {& G3 f
我的应用层的测试程序如下
5 X" b: q, f% J% F0 i, p' L$ ]
#include <stdio.h>
0 Q0 M+ s0 a/ y! @# r/ ~
#include <string.h>
) }7 e, ~5 h0 d6 u
#include <fcntl.h>
8 k; | ^$ j3 f$ e8 I$ N8 p
#include <unistd.h>
) ~! |* c2 y7 Z. O/ d( x( |9 Y
#include <signal.h>
( R0 h T n$ [- x% o
#include <pthread.h> //线程
( H5 P, D1 w+ o. I% z+ D' B0 }( `
#include <stdlib.h>
( q2 O1 @7 w* [: ^
#include <pcap.h> //捕获网口数据
% Z l D0 t' P. W0 ]) x
#include <semaphore.h> //信号
; b+ E9 U- A% }! n4 c: Y$ ` d) {
#include <sys/types.h> //消息对列
/ _, q) x. D8 Y
#include <sys/ipc.h> //消息队列
/ }+ c3 x/ i* `( V
#include <sys/msg.h> //消息队列
7 d+ R& `' J& F0 D# E* ?
#include <sys/select.h>
$ q7 U: u7 {4 ~( L
#include <sys/syscall.h>
7 S- C2 \: C1 A
#include <sys/stat.h>
1 F' W. b+ |0 ?6 u, C; p4 @3 p" z& f
#include <sys/mman.h>
/ n1 r* O' p1 L
#define msleep(x) usleep(1000*x)
8 y- \3 ]' ~, B: [# }
5 H& Y! |/ l$ R6 a' E0 K
int main()
$ I; t6 K F+ O C
{
" T7 ^5 u, [$ S0 `0 D
//MCBSP,ARM与AMBE2000交互设备
* C. e. C( n9 }1 x% g; H
int fd;
6 N# l6 R" J6 x3 w
unsigned short data_write = 0x5555;
) w2 d' f2 X; o V
unsigned short data_read = 0x00;
6 C: X$ f9 [% @' X! n
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 R, w- z+ B# x1 `
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- }2 v: B+ U0 C9 ?
" @& u' r r" f
if(fd < 0)
3 H V! U S; Q3 z0 _0 S9 i
{
* w7 H- P( e9 m! I: c6 q
perror("open failed\n");
4 h' L4 m, ]! E; ^
return -1;
% q. `5 K3 l/ h! C; c6 L
}
7 u( ~9 P+ L5 R. {2 j3 J2 f( l
) _ L2 ~. v8 I, {
while(1)
0 k B8 \2 Y4 i5 A
{
6 N4 j/ n1 P2 u1 a
2 Y0 l; F& V7 T
//AMBE2000每次读写是24个字为一帧
0 i' V) ]0 s$ X
//写数据时将数据在底层存储起来,等到中断的时候再发送
% d3 o/ G% k' m
//AMBE2000输入数据是以0x13EC开头的
* p3 s% n0 g' @. b
write(fd,&data_write,sizeof(unsigned short));
$ ]. i; P% R& e, t( h7 `' h" f3 J( C
" V7 @7 u m0 S6 x, X
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% a$ W# k* r6 ]" S; U& ^3 m
read(fd,&data_read,sizeof(unsigned short));
8 ]) m- q- ~/ e3 w8 P1 g# i( A1 Z
/ f. w* V+ P8 @) y& D- B2 L
if(data_read == 0x13Ec)
8 w: ~( s1 g1 ~
{
4 D$ ~4 B) \- C* }) P
8 p1 f0 ^4 U4 O3 P ^ N
printf("data_read = %x\n",data_read);
! B4 w8 K$ o2 u
}
~0 T2 i: a/ z: J) Y& ], H
5 X: e' s O7 @2 a Y
msleep(10);
" q/ e5 O) y E8 `9 m' O* @
& p' C, m7 _& x9 i# _( ?( J. N
/*
; R. G0 o! c- a! T
ioctl(fd,1);
$ I2 \0 L$ `3 P" s/ p0 s8 l7 j: M9 T; Y
sleep(1);
2 N- @% o- A3 G& Y$ D" b9 ~
ioctl(fd,0);
* M0 \0 G$ z- F. g2 M- X
sleep(1);
8 K1 W8 L( M& D+ h2 p8 M" ^( y6 n
*/
8 m* M4 u2 [# n* D$ Y1 ?
}
) r2 W3 b6 z1 W5 Q
return 0;
+ \- w2 N1 o4 h H2 H) T- |
- V' W, k2 z \
}
+ ]% b0 W$ }! f: ?
' E' G4 r9 `* h
多谢各位指教,谢谢! 急
6 ^0 h0 [( ]& b5 t9 C
6 q& K; V* }; H0 y
5 B4 k, i& k6 W! X- I
- |. p; O% H9 i$ u$ D3 i. E; a
! g, _! y- o4 O/ T' [" D5 h
3 H2 v; T/ i' v% F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4