|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: l2 ?' M$ M' k4 y% X; ]
/*
4 j8 U) X) _% H. h * Copyright (C) 2009 Texas Instruments Inc( q# I7 E: h# P1 U$ q) G
*6 V1 ^/ k2 j0 \7 K3 @8 G
* This program is free software; you can redistribute it and/or modify
! @% Z7 N/ q4 n* o% E& T * it under the terms of the GNU General Public License as published by
) `% G M/ e: I1 Z. D( |8 z * the Free Software Foundation; either version 2 of the License, or5 t7 Y6 _" }" l' }! q' m* q+ I
* (at your option)any later version.6 \7 M$ e5 x/ X% A$ A6 o
*2 E5 l3 O% a7 N
* This program is distributed in the hope that it will be useful,5 ^5 u* P3 G& }; I. o/ O1 {
* but WITHOUT ANY WARRANTY; without even the implied warranty of, l' k! ]* Z8 J9 k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 t7 f8 {2 k$ z9 M' @
* GNU General Public License for more details.
. \4 l* Q# m! O5 a# x/ w; | */ C" c+ o9 q6 U; X- |9 B
* You should have received a copy of the GNU General Public License6 y) I# H" T) H% @. W; M! h8 Z
* along with this program; if not, write to the Free Software
" t5 |& O2 c$ m8 O) a( ] * Foundati
6 i! }; b9 x, }& t*/
- b+ d. B! ?- V6 B( P4 ?#include <linux/module.h>
& _6 v. q% w( D0 k#include <linux/init.h>8 ~/ X+ D0 o! g% U% h
#include <linux/errno.h>
: |8 T. A% Q5 b; o#include <linux/types.h>% j+ `' V8 B7 ]9 N9 g# n! e
#include <linux/interrupt.h>
0 [" W8 `% o( W#include <linux/io.h>5 B2 y" Y4 K7 V+ x# N3 m" M
#include <linux/sysctl.h>% H( g; _+ G" Q
#include <linux/mm.h>( w, K J$ ?1 p* K- k: t* R! L
#include <linux/delay.h>
^- N$ h# {1 V#include<linux/kernel.h>
. ~+ I+ g% o% Z# w3 z#include<linux/fs.h>
/ b7 I" ~5 R4 _; c, ~0 i#include<linux/ioctl.h>
& N7 X$ u& E/ Z( T#include<linux/cdev.h>1 y2 l) R& H. r
#include<linux/kdev_t.h>0 ?+ `9 o( k$ S# v: C
#include<linux/gpio.h>
2 j0 U- X P# y, s' d+ p#include <mach/hardware.h>
; r+ H9 W3 D# [4 N#include <mach/irqs.h>4 l, w$ B2 P( W! A
) L% l- h* L4 a& T1 a* r#include <asm/mach-types.h> Q3 T! \5 N- L0 ^9 _
#include <asm/mach/arch.h>, u$ y7 z3 V4 J6 K. x) S
#include <mach/da8xx.h>: d9 o' \. t* a3 m9 b0 a: G( r
#define SYSCFG_BASE 0x01c14000
: {6 b& H$ V1 s#define PINMUX1_OFFSET 0x124
" ?2 s1 A- u- u* x: E#define PINMUX18_OFFSET 0x168
$ h& P5 b6 b l! m% b1 ]6 [, @#define PINMUX19_OFFSET 0x16c
6 |6 u; e0 P0 S' Z) E/ N+ m7 N#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR3 g( J, [8 j; W! {
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
1 M, R) @) z6 y- H% S7 M#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
. x% }0 h! H1 ~! g0 C* i* r#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
: U: c. C! z% U1 |) S8 e9 K* h$ V#define PCR_ADDR 0x01D11024 //MCBSP1_PCR" e& I1 O2 w' o5 F. L2 v
& n! K2 I) p) r7 S1 D: J#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
9 G/ [- ~7 F/ N0 _5 z# B#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- ~1 y' W. I& R9 V0 G//PSC
, K# q2 L D' Y#define PTCMD_ADDR 0x01E27120
- ^% m3 u$ {3 s#define MDCTL15_ADDR 0x01E27A3C
* u6 ^ m9 H2 C# F2 U; A% f u#define PDCTL1_ADDR 0x01E27304
+ q9 N; Q( {* Z6 ?: b: a9 `//GPIO8 direction3 U% Y2 A% P9 b& y9 K
#define GPIO8_DIRECT 0x01E260B0
! T- b- C/ \! f0 {% q6 L#define GPIO8_OUT 0x01E260B43 [' J6 D. j! v4 ?7 a2 v0 V
#define GPIO8_IN 0x01E260C0
, o0 K, o0 e3 ^1 n
. y" s/ u8 |1 Q3 D- A1 |6 `$ f0 h9 Z//#define MCBSP1_RINT 99 q1 P% C6 y9 G* Y
//#define MCBSP1_XINT 100
5 I0 w8 J/ \# B" `static int MCBSP_MAJOR=239;
( j2 `( Q/ D; X8 J5 O/ `; h# \, Istatic int MCBSP_MINOR=0;6 E9 q8 k+ K! y5 h2 e* A2 y
static int count =1;
5 ^$ W0 o7 \& G* Q8 F/ m. q7 |# ~" J
6 ^5 P) b) r7 c \; K4 K( U#define MCBSP_NAME "MCBSP-device"* |8 c, W5 P! @, Q
! _& {% x0 R5 R& \" qstatic struct cdev *mcbsp_cdev;
' f9 ^' R s4 P1 Astatic struct class *mcbsp_class;2 e& I$ u5 A" e' E+ _
static dev_t mcbsp_dev;
4 }9 L: ~: t5 I8 Y2 O3 D: b7 Eunsigned int DRR_data;
$ b& D! a( X/ `7 ^unsigned int DXR_data;
5 I! e. p* i0 _ X$ Cstatic int mcbsp_open(struct inode *inode,struct file *file)) G; Y* D. J0 |( Y3 y. ^* k
{2 f& g3 P$ N, f5 u
- x1 v5 [& S( ]0 {( |
//interrupt enable,initialized+ J2 {6 P6 ^& E5 ^6 { p- @
unsigned int temp;6 k4 U0 y- j! Q
//SLEEP_EN(GPIO8[10])---08 f& A6 J( H! N5 j6 h
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' s% b% ]! [! k; J( g4 T# e% ~' g temp=temp&(~0x00000400);+ y' K; g0 `) e, W& Y/ P W; d$ S" \
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' [0 S" w" [- R9 j6 j. o
//RESETn(GPIO8[8])----0----1
1 @7 R& K7 }2 g- ]2 ] temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; x/ } j* E" C, M* R) p temp=temp&(~0x00000100);+ T3 b {& x3 o; j9 z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0% h3 R, u/ \1 T
udelay(100);! |5 r; r! `: {) J4 q. [
temp=temp| 0x00000100;
" e/ R! Z3 s$ D5 H _9 A9 A2 I2 t) L __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 b7 H2 b6 k1 ~% J' u& C0 H" M) q udelay(100);8 f. g; E) v' x5 L8 v4 h% G7 i
printk("open success!\n");
9 A/ h; e' t! M4 y v return 0;
8 c) [7 I+ C% v6 I2 U}" o( y, n1 E6 P1 t
0 [) H" A( ]' Z) F: c0 `/ tstatic int mcbsp_release(struct inode *inode,struct file *file)
. N% J" Z" R, E, V/ k8 C{
$ S c0 `9 D# r/ L printk("release success!\n");
$ x1 L) _1 d" N# S0 X0 d) G return 0;8 @/ q. V5 ]4 F: s
}# y$ ^- H( M1 p" g
- D$ T) j# d: T8 t5 |# j1 ystatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: G4 N9 Z9 K3 Z- Q{
0 k. x8 ~7 `" L* d. N5 V8 r0 ^ copy_from_user(&DXR_data,buf,len);4 M+ F0 M" \$ p* G6 Y0 u6 {+ u
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 1 j6 ?& q% t; x7 A8 {
return 0;
4 X# ?1 K. {$ H$ g% n. t! e
( G9 _9 Q7 S# L1 v6 f u}2 A' ^4 \: a) J: E
2 U- O. K# D$ h8 ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 V, Y: @, C( s6 Z0 @{ , A: e2 c$ V" A; U
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 B7 Q Y6 d( y3 C" ?+ B& R2 Q copy_to_user(buf,&DRR_data,len); 1 K3 J% w0 h* \& E1 K5 T& n
return 0;* q' |' F5 X1 i5 ?5 g' Y6 Q1 Y+ X
}; Q$ O3 ~. J" W
5 A9 a" q2 l6 B$ f7 m( _3 g
: g7 _% d- D% o: H8 X! L: F
static struct file_operations mcbsp_fops=6 t! U" N* C9 q4 z* Z% K1 c: ~
{( B& L: C0 k! x; }' t1 T8 D0 f
.owner=THIS_MODULE,! R8 ~6 ?; N! S$ P9 m4 e
.open=mcbsp_open,
# l6 n. ^" ?9 O: H" L .release=mcbsp_release,: r/ v& L' f& L+ \0 I X- M
.write=mcbsp_write,& P5 ^8 j5 Z( w; H# u8 l
.read=mcbsp_read,4 g( }+ J+ H8 f) o! ~
};0 ]8 t( d# y; B5 P7 L* O. U
static int __init MCBSP_init(void); d/ X% @6 i, p7 f
{0 O: d: {5 _# p1 T0 ]- |" {
int ret;
6 F* T9 k( N7 g* ~ unsigned int PINMUX1_REG_old;6 v, w4 F$ N/ D( `
unsigned int PINMUX18_REG_old;
7 b( f" K, }* h: \ unsigned int PINMUX19_REG_old;& B/ |6 t8 l* z( i* R3 h3 S
unsigned int temp; ) d! j* p8 i# q- [
if(MCBSP_MAJOR)3 W# `3 D* M& G+ a* J& D* s/ l: D- Y
{
& }; |4 ?' h: B4 `' s2 {1 E# ` mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 v' @, H) ~+ X" c ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 ?/ z7 X8 |8 z/ ^' c1 ]" S2 Z9 O
}
) z* c6 `( e7 \0 i* E% v% x else" N5 g! w; O: g* Q0 |- e6 X4 h
{" v6 b* h7 }) T/ \3 R+ K& @
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- W! r# m+ l |. ~3 D# F) K; }4 B5 w3 \
MCBSP_MAJOR=MAJOR(mcbsp_dev);
) r4 `& K- x) D }
2 o6 _" Q, `1 O8 Q4 w ' O3 x' B4 T1 o4 v
if(ret<0)7 N% m' w! ~9 E/ c9 }8 G
{
' M! s8 _ S; [ printk(KERN_ERR "register chrdev fail!");
Z' ^6 M6 I* G$ l- Q2 c* U return -1; h; c: @% r' a" z) b8 |
}
/ @2 U; e8 `3 C0 x 3 O0 o5 {! n; U& J+ c& T
mcbsp_cdev=cdev_alloc();
2 q( d2 N1 v; |% k
& N$ k* @1 V j7 A if(mcbsp_cdev!=NULL)
p2 V5 M7 u) j9 h {. g ?" I3 u# a- @& F7 g8 S) G
cdev_init(mcbsp_cdev,&mcbsp_fops);
3 ~# c' C+ |$ h' T mcbsp_cdev->ops=&mcbsp_fops;$ N3 u- {3 s: H; Y* e7 b9 u: u% R
mcbsp_cdev->owner=THIS_MODULE;
! Q" S' v+ e# R6 Q7 Y1 ] 1 C, ~/ x/ Y4 k" U+ ^* @9 x- ]2 H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 _, v- b/ J6 O0 t- I+ O* ^* E; s
printk(KERN_ERR "register cdev fail!");
. J2 n5 V9 c4 F0 Y: v else: g; K9 @5 n! z/ L0 p7 y
printk(KERN_ERR "register success!\n");* X1 V& s' ]4 F) i( V
}
% [. `, L* D3 D4 N, J3 s) g else
7 \0 O+ b) q# F. X. @3 q {
3 D# E( G* D5 {4 O3 @) H printk(KERN_ERR "register cdev err!");4 o$ O+ v6 }( \3 q* l
return -1;3 q# F8 _8 E: i. R; W3 W
}# x! m; Q' e" Q
! I2 c" K) |, M! N- {9 T0 J mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
@6 d* A5 [- l- v) h6 F4 d if(IS_ERR(mcbsp_class))
9 u9 ^* L! ]+ I5 E# d& L. t {2 o7 n! {" s9 N/ N
printk(KERN_ERR "register class err!");
- z, J& U$ O; B0 ^# Y* h# p! \7 t return -1;5 m, G1 D; _2 E' h5 H s* {! Z
}0 w/ h: f9 [3 D7 V: L2 p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);7 L1 k# B( W9 L& c; r- i# {5 k" I1 t
1 f; Y5 _& B1 p- F# R
//PSC& {3 P0 T v2 r$ q4 q
//add Enable MCBSP2 j0 e- C7 h- `) R, N
//test
4 j4 \5 U; O: p temp = 0x80000003;
, H4 b8 b# A* L# H/ r6 @- M) e writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& e/ w, S" ~. o4 f3 f/ a( Y temp = 0x00000003;
+ N& i$ O& A5 e; [/ F% J- H2 U writel(temp, IO_ADDRESS(PTCMD_ADDR));6 U) B* L* B5 i4 c X7 q% B* z8 @% E
) [3 T+ z) ^8 [# P" t1 Z9 m3 ^8 K temp = 0x001FF201;
8 S* T; e4 F' n/ g/ | writel(temp, IO_ADDRESS(PDCTL1_ADDR));+ h+ z1 J( z, q, B- L) X- ]
! j1 m: b' i3 F. E; o6 W //PINMUX
9 c& k. w8 D1 N7 o& Q0 c //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ E* ~1 ]0 S1 I2 k! [8 \: h- c
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); }) j1 x% z) q
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 8 p& ~% o6 Z& x$ n6 }$ I
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- f( S+ v: v; z" @4 G/ _! T ; S& ?4 i1 u0 z7 |1 l
//SLEEP_EN,EPR,L138_SHK1,L138_RC
/ ]: v8 ]; L) z. j$ Y4 [ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 8 `: z. T( c0 r X4 o
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
" i+ \) h6 V' U" K5 E( p writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% ^" L% F( e N
% l" p. s; z5 p( e& d //RESETn,L138_SHK2
; @7 s& D* U9 Q8 o3 o. q PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 a9 J# I- ?0 A& f. x' U2 X' ? PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 4 y* R0 e& J, v: h0 d1 B
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 ^2 v/ M' B9 F* Z
2 h3 M/ W5 r8 S. I , E- d$ z& x3 H$ Z' e
//SPCR Register8 L8 c8 J( n7 P5 C& c) T
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 N0 U# {9 m7 U# B, A- F temp = 0x03000000;//(DLB=0)
0 C$ _( {, H; } X$ v/ d // temp = 0x03008000;//(DLB=1)- E; n$ ]7 d3 ?6 H! a- s6 D) k- i( Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset ~5 @1 M2 J. S4 S& y3 a9 y* O# _- d3 R5 Y
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 w7 ^7 K4 ]! o& p6 M- D printk("temp=%x\n",temp);
' Q/ _7 T6 K' R . \6 x1 O: O4 r' m( O) W( ] `
//PCR Register# [- j- X" R. n1 N9 Z0 I
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, K6 {6 z) ?. m1 l3 }4 D3 o // temp = 0x00000F0F;# w: a% C' V" ]: R9 f2 Z
temp = 0x00000B0F;
) d! E( Z& J/ ]% a7 f& M; [ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
: g3 G- ?( }- o, v; t: g4 T temp = readl(IO_ADDRESS(PCR_ADDR));
/ u+ Y( i+ G e4 y printk("temp=%x\n",temp); ' d7 X: c5 a; q' ~' n" \; W1 G9 q
//SRGR Register4 h2 ^4 Y% a. X
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& E, k% V1 J/ l7 V- i, ^3 k: O //temp = 0x301F000B;
) G* V5 b8 S& x+ ]; H8 C, E: w writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
3 A5 [& x/ h# @' Y temp = readl(IO_ADDRESS(SRGR_ADDR));
8 `# n7 l! i) v* Y printk("temp=%x\n",temp);( W+ F1 Y$ F. j9 E( C1 \
//RCR3 `' J+ m4 p+ B0 M/ y
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
6 z9 @; Y" C" E8 _' P) v" x7 @. w //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 w! s) W' u( j0 Z# Q
temp = 0x00440040;0 Q0 t! e! E3 D# _ f% E* x
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized & V- k# f( q3 e1 ~+ T+ w' ^/ e
temp = readl(IO_ADDRESS(RCR_ADDR));
4 F9 v! h# r4 e* w printk("temp=%x\n",temp);
. U$ K" F# v2 S" b$ @ //XCR
' U5 m; S9 E% { //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1 X" U% o D* n `/ o- G0 w6 R+ G, }
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
6 ?) {4 x" l$ @( k temp = 0x00440040;9 _5 a1 v5 G9 Y: p }
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' K+ C" ]" ]7 t r# X( ~
temp = readl(IO_ADDRESS(XCR_ADDR));& t. L: b) ], O% p5 }; Y
printk("temp=%x\n",temp);
* g" @4 P) g5 H. r3 w8 _% { udelay(100);
6 L9 [7 J: [" A! p //SPCR Register
! G: P/ Z; q& n, g, P0 _1 x //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 L; \, y! `. d4 O: ]9 x/ T
temp = 0x03C10001; //DLB = 0 VS DLB = 1
$ W2 l6 A( H8 R* t5 r z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
. } W- G; T5 ?1 T( Q# a y temp = readl(IO_ADDRESS(SPCR_ADDR));0 a; w) [; C5 `( t) J
printk("temp=%x\n",temp); s2 A5 P8 y; `
udelay(100);: y- E+ C% t# R( A" U7 U
6 w s! b4 j7 l; T2 V: O; ?
//set GPIO direction5 y0 s8 g6 w9 Z m$ n9 w
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 B% E! T9 U+ ~# W3 ~, B, l5 X4 N temp = temp | 0x00000100;//EPR----input7 h+ w9 P: e, M# {) U$ p4 H! Q }+ N! c
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 x3 Y( w$ ?' o% K* \7 M: r) a
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; [) ?% H r& I1 O2 T) Z
0 t! v8 Z$ z) j, X5 `! Z) E0 c) f
return 0;
7 g Q0 K9 ^6 l9 w" t}/ e/ B9 S3 @- I% W- u; d
static void __exit MCBSP_exit(void)
& E$ A( O6 e" M( I+ S$ m{9 T! H) A2 J! z! p, S. T5 x/ E4 \
printk("mcbsp chrdev exit!\n");
6 @; m& l! U2 F- `6 o" p* N& D cdev_del(mcbsp_cdev);. d2 P5 f1 v; e, Z" L. l* [9 V* J
unregister_chrdev_region(mcbsp_dev,count);
: O: k5 W }0 B. o( q% [ device_destroy(mcbsp_class,mcbsp_dev);
- @9 n% D2 d* r& Y class_destroy(mcbsp_class);
Y. Z/ t8 [# w* D$ c3 K}
) B% O! m& j& R8 E) p1 S0 X0 r* Vmodule_init(MCBSP_init);
+ x1 c, F" t6 a5 V. W3 z. qmodule_exit(MCBSP_exit);
( I: `" b" v" `
- P$ n# t0 S L$ bMODULE_LICENSE("GPL");* ^: O( k0 g" W+ p; F" R# K
7 T8 C. A1 V) s8 X9 s- `% v M我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; ~, h" f) d- l& E) O* `我的应用层的测试程序如下, k4 d+ g+ a7 N6 F$ N' ?( e
#include <stdio.h>. w2 [* B" Y) E! p9 X8 _
#include <string.h>
; A# x% p! }# t; `#include <fcntl.h>
; M' c8 O- N3 C8 [6 B# }0 Q#include <unistd.h>
6 g6 b" z- o! y) k+ E* P0 j, f#include <signal.h>( o: l( Q# k, }- O2 X) z) n
#include <pthread.h> //线程7 P( _% d4 l D" ?: r l
#include <stdlib.h>" m X# E9 N! m
#include <pcap.h> //捕获网口数据3 A0 I- L0 T1 R, j: {8 x
#include <semaphore.h> //信号
1 R p5 f, L6 Z2 E6 X0 y w) K- I#include <sys/types.h> //消息对列
' O+ ?* i8 x/ x. h$ x7 K#include <sys/ipc.h> //消息队列
7 g, |7 |; ~2 ~" c#include <sys/msg.h> //消息队列
+ J; f" p' X0 N2 e9 {" c( c0 O- A9 G" K#include <sys/select.h>( y' H# y0 a: D$ B
#include <sys/syscall.h>
: H* |% c6 `7 H# j( {#include <sys/stat.h>: g; \1 C% H& Y/ M$ c- {, I+ a- _
#include <sys/mman.h>
1 y) j* E& ^6 |7 b5 D& i* \/ U#define msleep(x) usleep(1000*x)
8 `- H8 _- S. G) A1 t
$ z, S- W7 k/ C' C9 d' N$ Pint main()& M8 l' ~/ M* Y" C1 C G% ]
{ . b l6 s7 {! P5 y
//MCBSP,ARM与AMBE2000交互设备) }& @6 \* Q) A- n v% |+ P7 L
int fd;
0 D( {9 O& c3 B7 ?+ g' U* p- ? unsigned short data_write = 0x5555;$ N9 {0 R3 o% v7 X) ?3 ?6 V
unsigned short data_read = 0x00;
2 k. g9 A* d& L4 q" k8 Q8 w fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& G) _6 v" A* G) `( y% q9 J O
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' _1 @6 m0 {( N1 {
- v% J& y+ p- ^. G8 L$ h n) T
if(fd < 0)
) @9 N/ C# l% k v/ j& |! t {
. s4 U7 b% n' {6 o perror("open failed\n");) M9 o2 C/ Z. Q4 u* ~5 r
return -1;* L$ @+ Q0 I$ z1 [. w- ]( `7 k
}
+ G6 Z8 @; `" T & Z" [7 O6 c- l8 K2 E* N
while(1): i$ ?+ O, H# N/ b
{# P0 e- ^5 D, o ^9 t. H8 u
% c& S0 ?. r) S$ M
//AMBE2000每次读写是24个字为一帧" s I+ N) G4 _$ [: C4 g
//写数据时将数据在底层存储起来,等到中断的时候再发送3 _1 j$ ?9 I6 ?& Z9 a0 x; w7 p
//AMBE2000输入数据是以0x13EC开头的
3 [3 g# q* y- S7 U write(fd,&data_write,sizeof(unsigned short));
( i. i0 o f' F+ x1 ]3 R0 `, m) s
y3 d% N3 S. l //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
# r2 L- L; N0 N read(fd,&data_read,sizeof(unsigned short));' ~- I3 i6 C3 ]
. E3 ?$ ]( }" t4 ?
if(data_read == 0x13Ec)$ b% [( `4 a! C# |5 Z C! K
{; G% z' ^/ i- b% i, F& u
! n" o6 H0 {# m4 }
printf("data_read = %x\n",data_read);
, ]' z" x" I' e" R# k- U% C+ M }
! G5 @( K \% b1 @
* ^7 F) @1 c. G9 K) d/ s2 f msleep(10);
/ c3 D2 ?, d% Z( | 4 p) \5 k( @- ]6 @$ [& L1 x2 I; R2 p7 i
/*: @& E0 s1 G' x6 u# K0 T+ S# V
ioctl(fd,1); 5 g j9 b& \- R
sleep(1);
7 T' U( W# v+ M ioctl(fd,0);
: L' ]1 v% k% X7 q sleep(1);5 l* {: p' R* j6 c. z! U6 j
*/ ' K/ {- J" s7 I6 b f5 N0 t$ v
} 3 ~' |# ?1 T& z b) m) j8 N
return 0;
: O" Z) u2 V: X
: f' I: r) o4 H- e9 C8 y/ \9 f% d: E}
5 o. N; o$ V2 I% [0 T0 ], z; A r9 @) X$ Y0 R( l
多谢各位指教,谢谢! 急
3 d- I& f+ ]6 `" [8 X* k
4 f5 {! S! \) |& Q, F
# n# ?: M! y/ I# d
' S4 I0 F/ x8 l6 c' Q0 {' T% P1 h
' l) i& k% v/ T+ c
|
|