|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; |# K4 a( D0 u1 t
/*
$ U; W# r' s% ~ * Copyright (C) 2009 Texas Instruments Inc4 t4 l+ V. k% F; h5 `, x
*
; d7 f; {$ q- u: W0 D1 k * This program is free software; you can redistribute it and/or modify$ _. ^6 d; o* }
* it under the terms of the GNU General Public License as published by2 d% e* J- t7 \; B$ H4 Y
* the Free Software Foundation; either version 2 of the License, or* b( ?2 l- \) H
* (at your option)any later version.) l/ v; B5 C/ ~
*
( c6 M% V: m k; [3 r- t1 ?; W I * This program is distributed in the hope that it will be useful,
. m/ r3 g8 M/ o% M( }% p3 z6 ? * but WITHOUT ANY WARRANTY; without even the implied warranty of9 e2 d+ G/ A4 H& z' f$ q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; i" Y9 r4 }) c3 c6 i * GNU General Public License for more details.# L3 \- n1 f5 z4 C7 N g8 L
*. v. h, ~# m4 Y
* You should have received a copy of the GNU General Public License" _& w# Z( S( z
* along with this program; if not, write to the Free Software
$ l* q% m! O/ P( p) z * Foundati
. w% A. D* ^+ W- `$ C- U( i9 u*/
6 r& A; R- G: A0 H6 k#include <linux/module.h>$ z4 \8 m _( F
#include <linux/init.h>) t( w4 _1 H, C( k/ m0 Z
#include <linux/errno.h>' S3 u( Y! M2 P, Y* |- L0 Y# P
#include <linux/types.h>
* S+ h# R1 r: f8 R' ?#include <linux/interrupt.h>. j* L# ~# R# A" A+ @
#include <linux/io.h>7 `' q3 C a; v) a
#include <linux/sysctl.h>
5 m3 d3 I2 B$ J0 i) D: S+ S#include <linux/mm.h>
, j2 } H; J4 s6 k#include <linux/delay.h>
% l" w0 `' r8 V1 ?#include<linux/kernel.h># b8 j6 b4 J3 O' g; i6 |3 B
#include<linux/fs.h>; N F# C7 C" b* {% p7 o# x
#include<linux/ioctl.h>
! c$ i: ~4 S+ ?) D" B, m# u7 P#include<linux/cdev.h>- T$ C5 J J4 e# @0 u* L& S, [% X
#include<linux/kdev_t.h>
E" k" D) R( T& @) D/ `7 c#include<linux/gpio.h>. V7 o' C5 k2 z( I
#include <mach/hardware.h>
$ X+ }; B# o k3 l' a8 p! u0 k#include <mach/irqs.h>
) L# b' f( g. A
4 u4 ?) j' Y2 O' f% o#include <asm/mach-types.h>7 T' Z% F& V" W3 z' w
#include <asm/mach/arch.h>
" T" T$ u D0 t* u#include <mach/da8xx.h>
, a: X& e. i7 _( B3 b* e#define SYSCFG_BASE 0x01c140000 u3 R$ K* m! I* d
#define PINMUX1_OFFSET 0x124 7 s$ U, B+ H8 t. l, ]7 a0 ~3 Y' L
#define PINMUX18_OFFSET 0x168
8 o4 I( ^* ]( q& k0 {/ O( l#define PINMUX19_OFFSET 0x16c; \" o- i: `5 `+ i4 {
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
- ]# V+ }) A! T7 M#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
: \9 `3 b, B' H* p0 i( T#define XCR_ADDR 0x01D11010 //MCBSP1_XCR5 G# P; W& r! t; o& S' ]
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 C% n2 C2 ]5 p- `: b#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 t" W9 s7 W: Z2 k+ o, v
+ r! G, @, [( f( A1 E% a4 S# h w#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
- }& l$ i8 J9 B#define DRR_ADDR 0x01D11000 //MCBSP1_DRR& U( D8 y5 A0 W( M3 B ^
//PSC3 i7 I$ X1 J) E* J
#define PTCMD_ADDR 0x01E27120
" Z6 m% z" e1 K3 L+ R' V8 `#define MDCTL15_ADDR 0x01E27A3C4 |7 m7 x! N3 E% {5 @/ n
#define PDCTL1_ADDR 0x01E27304
2 x$ e# T; o Y//GPIO8 direction! [% Z8 f% d4 [# d6 T8 G
#define GPIO8_DIRECT 0x01E260B08 c/ b- X6 C# h+ ?: x' h
#define GPIO8_OUT 0x01E260B4; C$ d9 r8 p1 z9 R. |. a
#define GPIO8_IN 0x01E260C0
% ]& d" v* R- r4 I" A x5 \; A; ]
6 Z' _9 g. p9 x* n( J; V6 A& ?, E! P//#define MCBSP1_RINT 99 B! H! i( b4 `/ x3 c
//#define MCBSP1_XINT 100 : n- y5 n( A" t0 h2 D% N
static int MCBSP_MAJOR=239;
2 a& Z% o# B1 F( d/ ~, V5 F Q/ E1 Zstatic int MCBSP_MINOR=0;
' ^4 b9 q/ T' Qstatic int count =1;
( L# S, K( j; u2 y+ p* T; N; W
( {2 `0 m8 N' Y% I! Y) @7 i#define MCBSP_NAME "MCBSP-device"
: @' V9 N8 i+ C% j$ d, Q6 i; T+ m; A, y0 R9 Q, \
static struct cdev *mcbsp_cdev;
! q0 b6 D- Q8 \ W2 ]; j7 mstatic struct class *mcbsp_class;
2 ?0 W% I0 A' G6 ]2 g3 A vstatic dev_t mcbsp_dev;0 N8 [& j, T z9 I2 A# i9 \
unsigned int DRR_data;
& i3 t4 l$ V; o' B* R$ y9 S! Qunsigned int DXR_data;# c) l8 b, I# D4 z$ T ^) U
static int mcbsp_open(struct inode *inode,struct file *file)+ F8 S: T7 R! s p8 q$ W
{
( x+ w+ R) o6 s! a . V" Q: J. B8 \+ u: z5 \- d: _
//interrupt enable,initialized# Y# o' C E5 U2 v5 G
unsigned int temp;2 Z' j' v) V! [ {
//SLEEP_EN(GPIO8[10])---0
% Q" x# W+ c+ A# [: W$ U- A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 u1 J* W/ M4 x1 L) H4 o
temp=temp&(~0x00000400);
1 w& S/ G9 K: \( n. F u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' \1 H$ n( p4 Z8 T1 { //RESETn(GPIO8[8])----0----1; x0 o! a4 H; y8 M2 b! K5 O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ ^7 _) n p$ v' i {0 ^
temp=temp&(~0x00000100);
! Z* @, V- a' e2 K$ i6 P __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
1 T$ {" i7 P+ ]# ? udelay(100);
0 w2 V$ d& Y5 B6 @0 ~6 F& N temp=temp| 0x00000100;
5 x1 a8 o: |! p; j __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ _5 ]* W8 T6 g. @5 \9 L. }$ I udelay(100);
" l2 S. W# z. X4 H( K printk("open success!\n");& a8 w2 w( j4 J9 h% M7 [
return 0;/ n Z' r- m" o b
}9 I4 Z* u( k v
2 Z1 l: S x5 f' |9 S: I; m
static int mcbsp_release(struct inode *inode,struct file *file)
$ A5 _) Z1 y" o/ ]6 ?4 W: A{
1 q# V3 H8 L; o1 y6 J printk("release success!\n"); T9 t% \1 \0 `) Z# b0 M
return 0;; f( ?. n9 l! `) Q7 `+ @% |
}
; K' a# E. h6 T6 t
! {2 C0 l* H: q$ U" u$ o5 u4 j( qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* P( n8 n/ o- G1 l2 H* ~( Y
{4 A% t8 z$ V+ |( d# o; H
copy_from_user(&DXR_data,buf,len);
9 D$ `6 ^6 f8 v2 J iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); & D. R* g t7 d% ]
return 0;, T/ y0 E6 p" ]
; [( L# n" T3 q1 r; z
}3 k8 W7 }' a- I" |
4 t+ l2 F1 R6 [; I* Q" }
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( e* w# h! {: k. q; }7 G% H{
) i" b6 v/ i( r1 R. v& B DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 E! `, `; P$ q) v" r0 @
copy_to_user(buf,&DRR_data,len);
$ Y6 z3 _# N& z$ c return 0;
6 s, a$ V2 }( `6 D. D8 ~}8 s$ J+ V" R( E
) H, |! h: l4 v6 R3 r
& N Q# C! j" wstatic struct file_operations mcbsp_fops=1 x3 K' f& J: e9 O. {
{4 H+ p, e2 I, b" {& P0 I$ T+ E
.owner=THIS_MODULE,. B6 |) B$ C( F6 S: M0 }
.open=mcbsp_open,3 q, D% ^1 ?, M p+ l% H
.release=mcbsp_release,
1 D. k z3 P& Q* z .write=mcbsp_write,
, ^% M) N* O6 S5 K5 o0 L .read=mcbsp_read,2 \ x( i& T3 ^' s( M l
};
; y9 x; h6 F* A" y) kstatic int __init MCBSP_init(void)/ W4 a0 G; c7 ?) `9 d* U& y$ t, M
{
& U$ r2 h# R$ C" R6 e f int ret;
- r1 j8 D" N( Y" W& e5 a/ l# @( A unsigned int PINMUX1_REG_old;' X; n+ C) U1 e0 t1 w- P b, S+ O
unsigned int PINMUX18_REG_old;: W) u! R: P. e& n
unsigned int PINMUX19_REG_old;
( m) p6 c! Q' [/ z( T unsigned int temp;
; g4 z# {+ W3 v! n if(MCBSP_MAJOR)
' ]; Q7 q# R) f3 F% q: _ {! |, Z# r9 {, S
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 P. r3 P' b1 C' G- u# i
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ N7 Z5 G- L) u; Q6 U* u
}
& j/ `9 d3 ^+ A) l% _ J, H" Z/ R else; l. f6 s( C9 v( ], n
{1 J' x( G- v0 I, k- p8 ~7 W6 ]
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 C2 W! U; M5 M J+ D7 A; q MCBSP_MAJOR=MAJOR(mcbsp_dev);
. Y) W, k9 E' e( m* G. O& X" f+ A }4 H5 {$ Q1 N% O
' m0 n; U2 f4 w q4 U2 }3 v2 v
if(ret<0)/ r* {& W( u) O7 T e3 S7 n
{4 h9 Y8 N! F* K. c
printk(KERN_ERR "register chrdev fail!");6 A+ T! q! ?4 ^, v$ N G
return -1;
$ G+ B3 ]2 ^+ `7 O; q% D1 B# K5 J }+ y- ^% ~+ t# ~/ ^" a% C
# I/ R% M U* i5 h }
mcbsp_cdev=cdev_alloc();
* F8 {8 F7 X, v5 |1 x" q4 i 1 K4 w2 Y: e7 T B( Q% O5 @# Y
if(mcbsp_cdev!=NULL)) [, W+ Y& {4 x% k# N2 `
{
& G. G9 [5 U1 V5 t% n6 h, T4 T9 S cdev_init(mcbsp_cdev,&mcbsp_fops);
5 e: Z( z8 {; `, Z2 N* @ mcbsp_cdev->ops=&mcbsp_fops;/ a @( y6 ?; A6 E7 c5 E/ u
mcbsp_cdev->owner=THIS_MODULE;
. R& o6 e! u) S) M' B/ I" h, @
) `8 D$ m% [8 y; i" K) ` e if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), `' U7 E7 Z: g7 ^: t
printk(KERN_ERR "register cdev fail!");
7 W4 _( j- A. B+ G else
5 h* S# V9 S1 q5 e2 D F7 F printk(KERN_ERR "register success!\n");$ M/ L8 X3 {9 T! z/ s+ d
}
g; o/ ^0 k* ~6 k/ M# `5 _ else/ \& Z: b/ x# E1 h
{
% L+ V' f. r3 |7 I printk(KERN_ERR "register cdev err!");! p9 I) @7 {, I6 N% Z* X5 C# Y
return -1;
2 g: W9 ]- q& F1 S7 C( G3 N }
& `3 q3 L6 U& w" S' u. f u) K# l z) |6 s# T7 W3 Z9 |, [+ B& m
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: |( T$ }: w- v- Z* E. [$ Z4 ^/ v if(IS_ERR(mcbsp_class)); ~% O+ i @7 u7 \
{
! Q" E9 l, R" V3 I! a1 q( ?3 d% x+ z" Q printk(KERN_ERR "register class err!");
P2 r+ u8 W' Z: R3 @' |$ \ return -1;8 |" {: ]( \0 o! y+ x3 L
}
3 ?% [! q0 f6 [8 J* M device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);7 V7 ?/ Y0 u8 t" L# J
4 _/ `6 \5 P% K* K //PSC
* V, ^; n" t! ~/ _0 j: `# A //add Enable MCBSP
3 M5 |+ X4 T) }# ?( G, G$ i8 J% g; i //test. a; d. i. X0 E& S8 Y- U
temp = 0x80000003;1 t4 `5 e: {' k9 p5 E$ Z7 j* p/ d, i
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 n3 z7 L4 ^( S temp = 0x00000003;
! f0 U& e" W% {4 Z2 p writel(temp, IO_ADDRESS(PTCMD_ADDR));2 S* k9 p9 }3 Z- Q+ g+ ^. m n
, h' z9 l1 ~ f3 \% X" }
temp = 0x001FF201;/ H% _9 |; d) [& T; r
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 e9 O" c7 Y( c1 {! [/ R1 B9 ?
0 M" A8 g* t0 v& T //PINMUX
$ E# m7 q; J/ I/ D% f# j: l( s //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 Q( i/ Y- I4 x, X) F) k PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 3 E9 i9 ?6 j3 w. u0 j2 S X2 t
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
' T; w4 x0 B3 S# S( ~! h4 C3 x writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% y" H& N, R8 S0 O4 M% ~5 L
+ [) c& e: Z! J, i //SLEEP_EN,EPR,L138_SHK1,L138_RC2 p. C' @/ w9 m4 r
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# b. d1 i' o! j4 W6 K PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; o2 |6 O4 ^5 N2 M9 Z
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' h$ z* Z7 k5 ^$ m! P8 q
2 D: L% ?4 U# V) ? //RESETn,L138_SHK2' W2 p: }3 N( J0 S
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . C% y' O. i$ X4 O5 s% x' ]* s
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 0 e5 a. q/ n$ s9 i$ M- S
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. t7 A! {% p* Y4 b6 |% t ! m1 [. s' {/ ]: `$ i, E
: Z0 L4 U$ `! t //SPCR Register
8 R6 H4 ~4 E" u3 h //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. i; }. b Y9 T4 c* d* g, w/ T temp = 0x03000000;//(DLB=0)5 c4 f5 w1 \- y# V* M
// temp = 0x03008000;//(DLB=1)% [* j$ |# L% ^4 \% \. `) v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% j2 R2 E$ M \# f+ j$ Z temp = readl(IO_ADDRESS(SPCR_ADDR));
4 {: T. G. u4 F0 R% K printk("temp=%x\n",temp);) d0 U2 M5 }" q# n- |' J
7 ]9 z# r0 v* W& ~9 y0 L //PCR Register6 G! r, o/ O# ?" s [
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0, ^, O& @, G0 m- H1 {
// temp = 0x00000F0F;. q1 p1 A- _' m0 u
temp = 0x00000B0F;
, E* U& R- H; P, K0 { writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! `4 P7 T ~9 p temp = readl(IO_ADDRESS(PCR_ADDR));
$ v% @% b, J; j+ x* d& K- f% e+ x! l printk("temp=%x\n",temp); " T0 }2 ~' K1 q1 c- E
//SRGR Register) e; W; j* W, R) w( s0 A3 l
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 K- I. B8 H! C5 @2 f& `, T //temp = 0x301F000B;
! u* B& H9 r" `; _" J4 l writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
- D$ t8 J+ z. c! \# a' I temp = readl(IO_ADDRESS(SRGR_ADDR));
2 Z. x1 {0 @2 m$ b8 E printk("temp=%x\n",temp);+ Z! J3 B3 t' t O6 E# G$ I& O. b
//RCR
! h2 o6 D; x7 C7 L9 G5 E //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," ]! z0 [) [+ h: j6 k6 x0 d
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! [! N. K* v. E
temp = 0x00440040;: M. j6 |& `$ a+ _) d( P- a
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
, g; Q/ N, `+ G+ E' V& ^ temp = readl(IO_ADDRESS(RCR_ADDR));0 h5 V& u1 ^6 J# C( c% I7 U
printk("temp=%x\n",temp);
2 Q" U: |/ U" G //XCR
" Q/ A) _1 H! @8 `, c. V& U //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; _$ V, h# ]5 _$ R3 O: O6 t //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 r0 m8 _% B) R) ~. T0 |& K" h, i
temp = 0x00440040;
& G- t5 j8 T) ] writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
2 G" d+ i. Z0 G" u s temp = readl(IO_ADDRESS(XCR_ADDR));
5 c' o; ?9 u1 m2 a2 S3 p7 { printk("temp=%x\n",temp);2 X; X" Z; `6 o% f; g- {$ {
udelay(100);
: x P0 R$ D { //SPCR Register
: a. ?) {1 d8 }3 S8 u+ O! V6 ] //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 ? T f. n3 {2 a temp = 0x03C10001; //DLB = 0 VS DLB = 1
. N) L) G9 b& T. L6 X writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled+ T5 T/ l5 l/ H$ E0 `
temp = readl(IO_ADDRESS(SPCR_ADDR));
1 b; C1 g7 u8 O printk("temp=%x\n",temp);
( a3 `2 I/ E7 O; ~, e udelay(100);
7 ?9 G: T4 M% S$ o- [4 O5 g/ u
+ ?, H% i4 I% J8 d //set GPIO direction0 Z( N* ^$ |2 Y2 N
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' W2 D0 N2 ?: a: q! F8 l temp = temp | 0x00000100;//EPR----input
5 [3 y3 l: u9 x, a( ]2 v; s* @ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 H- ?" U* `2 u( _- U2 S; M) g
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
! q' N3 i# l6 ~' a% d6 Y. e" w! N* ]% i
( R+ X' N5 }1 ~ return 0;
4 j$ x- ~' `/ U}# O2 A/ Y& i# J7 U8 }' z& ], D! X! V
static void __exit MCBSP_exit(void)
2 k' T# R, ]- A1 C) j2 c{- c# v0 m/ b) P G' k
printk("mcbsp chrdev exit!\n");
7 G) e8 Y Q ~+ E$ P; G o cdev_del(mcbsp_cdev);
8 p3 {' }. k( V1 W( f7 \ _ unregister_chrdev_region(mcbsp_dev,count);
5 a9 a$ N4 D ^3 c) Z device_destroy(mcbsp_class,mcbsp_dev);
1 M) I4 V: T/ ~, q2 q class_destroy(mcbsp_class);
* Z+ u5 x1 Z$ L9 t- T}
* T: [6 S9 b+ J$ Amodule_init(MCBSP_init);4 j4 K2 ^% A/ g6 n( k3 \' a
module_exit(MCBSP_exit);
* c$ v4 B: K$ }/ J2 s2 l% y ]! }5 h; l' e* u5 V3 h3 e' A
MODULE_LICENSE("GPL");
3 [# _9 ]" F% H1 g1 T+ u+ z* R5 w1 Y6 G# g
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 |- }" v+ A& {+ i我的应用层的测试程序如下2 h5 l" t1 c( z- ~5 e( J1 B
#include <stdio.h>
5 q) ^4 U5 q4 R( J8 Z" ~* Y+ D#include <string.h>
+ [* u- z% X" Q" W6 S#include <fcntl.h>! K( M* B& \/ D% U5 x6 A
#include <unistd.h>, h7 ^; [$ I: h2 m
#include <signal.h>
3 \& T, y: J) X( R/ S#include <pthread.h> //线程
E% i% M0 U" K' x5 {, q" l#include <stdlib.h>
2 v5 ], b* W, G- K5 c ^#include <pcap.h> //捕获网口数据
! ^; E. K" [& n, K u! A#include <semaphore.h> //信号5 E. N6 h& h4 r/ X; O/ l
#include <sys/types.h> //消息对列
% u9 v6 K C7 w$ ^# i( P: V4 B6 f#include <sys/ipc.h> //消息队列
9 n# B, u5 |( v' R#include <sys/msg.h> //消息队列- x& u+ L6 Z5 Z* B) ~- ?
#include <sys/select.h>$ s2 _: X i( d2 ]3 a) V
#include <sys/syscall.h>
% o; H& s9 A+ S- g6 J9 i( I" ]#include <sys/stat.h>
' O# u4 G/ P% Q5 _: [#include <sys/mman.h>
4 e- e5 r$ v h* K! P- M#define msleep(x) usleep(1000*x)' B6 t, \+ j) j. F: m
) i, v# a8 G. v$ y: z; `$ wint main()4 C: K6 F+ c' E
{
/ y+ Y# t# N5 m( s0 u //MCBSP,ARM与AMBE2000交互设备+ B% P3 L" t/ n+ }, M* M* c, u
int fd;( A ]$ a* P r5 A/ }7 q
unsigned short data_write = 0x5555;
; Z( V2 E2 [7 O1 ]. Z& ]: o$ p0 f# f unsigned short data_read = 0x00;7 w! K- K6 U+ h, K& h8 M$ ]$ q
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
, t5 w% g' i6 E4 @# [$ w' A // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 B5 W* v/ {' J: q, x
0 ^/ D6 ]& f4 a
if(fd < 0); _4 J" k8 b2 F% D3 }" _- M& N
{
! z4 y, @5 G" O perror("open failed\n");( f9 f$ v5 J, {7 Z
return -1;3 y* o; [& R! s
}
7 D. ^7 T/ F% V& C 0 B* E# e$ `5 ^& C* P
while(1)% i( l) O4 K1 J6 r& j# _6 n+ P
{- V2 I# r* C* ^' Q
' M3 o/ q% C' ^
//AMBE2000每次读写是24个字为一帧& |- S: W9 o$ c0 w% G5 \, ]
//写数据时将数据在底层存储起来,等到中断的时候再发送3 r) V2 E* J: S1 u& B! H8 e; I$ k
//AMBE2000输入数据是以0x13EC开头的% H0 L O5 f/ h$ f5 H0 Q% d
write(fd,&data_write,sizeof(unsigned short));
1 K% S1 u; g7 f0 c! u4 y : a( l6 l" R6 J, `' r
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
9 |# {' X8 M4 q7 Q( `' q read(fd,&data_read,sizeof(unsigned short));9 |/ Y+ B3 n3 ^7 s' [0 F4 H
# P! ~' j+ g8 k3 Z* s, Y if(data_read == 0x13Ec)
; L3 J! o: l3 j+ |0 m& v: s {: a4 ]- L: B; r; [9 N( s
e6 i- J8 p! h* s. J
printf("data_read = %x\n",data_read);& Y2 a! z* H6 O0 D: E) x) Y1 P( S
}
% p1 q+ n2 ?+ U4 H8 H! X : ^ o H0 |* s( s* n
msleep(10);
3 Z2 c) Y' [9 A& ?
9 m# _( S9 c' ~: J8 n5 v4 c. a" v /*
( w1 F# i- J# b# M q5 f ioctl(fd,1); + t* t- m2 o4 k+ K0 K6 w
sleep(1);) d0 p# q. w$ d) a& ]6 r
ioctl(fd,0);# \3 f3 D( j4 S
sleep(1);
" H4 U, [# k/ H; _4 @9 f8 O3 U */
6 Y5 F) h, A. y- V9 x$ K } 6 c1 Q$ [- g4 \/ w/ Y7 s2 R2 l! o
return 0;/ o1 x1 J! T( T5 j( \+ ^+ P
3 o; b& W8 J( Q}
6 f1 |) u+ K4 ]$ g
7 g5 U D4 W, W* z* w0 ]多谢各位指教,谢谢! 急$ k: v: _% |+ F/ ~) \
?& [' F; a# x" z1 M! [+ o) I" I4 d5 q9 o' r- [
4 U" r. N* e5 \0 {1 j( ~
6 s* W8 g% B+ y
7 T5 h; ]7 [0 n3 o4 n |
|