📄 devicecontrol.cpp
字号:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* 忋婰挊嶌尃幰偼丆Free Software Foundation 偵傛偭偰岞昞偝傟偰偄傞
* GNU General Public License 偺 Version 2 偵婰弎偝傟偰偄傞忦審偐丆埲
* 壓偺(1)乣(4)偺忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃
* 傾傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪嵞棙梡壜擻側僶僀僫儕僐乕僪乮儕儘働乕僞僽儖僆僽
* 僕僃僋僩僼傽僀儖傗儔僀僽儔儕側偳乯偺宍偱棙梡偡傞応崌偵偼丆棙梡
* 偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆
* 偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪嵞棙梡晄壜擻側僶僀僫儕僐乕僪偺宍傑偨偼婡婍偵慻
* 傒崬傫偩宍偱棙梡偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙偲丏
* (a) 棙梡偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 棙梡偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆忋婰挊嶌尃幰偵曬崘偡傞
* 偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偼丆
* 杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕娷傔偰丆偄偐側傞曐徹傕峴傢
* 側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠偨偄
* 偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
* @(#) $Id: devicecontrol.cpp,v 1.2 2002/04/10 11:26:20 takayuki Exp $
*/
#include "stdafx.h"
#include "device.h"
#include "devicecontrol.h"
/////////////////////////////////////////////////////////////////////////////
// CDeviceControl
const CLSID CLSID_Device = {0xFEE2A68B,0x7F98,0x40E0,{0x98,0x53,0x18,0x3E,0xE6,0x8B,0xC7,0xF8}};
__declspec(naked) void * __fastcall MemoryCopy(void * dest, void * src, unsigned int size)
{
__asm mov eax, ecx
__asm mov edi, ecx
__asm mov esi, edx
__asm pop ebx
__asm pop ecx
__asm rep movsb
__asm jmp ebx
}
STDMETHODIMP CDeviceControl::Connect()
{
if(!FAILED(manager.CoCreateInstance(CLSID_Device)) && !FAILED(manager.Advise((_IDeviceEvents *)this,__uuidof(_IDeviceEvents),&cookie)))
return S_OK;
if(! !manager)
manager.Release();
return E_FAIL;
}
STDMETHODIMP CDeviceControl::Close()
{
if(!manager)
return E_FAIL;
AtlUnadvise(manager,__uuidof(_IDeviceEvents),cookie);
manager.Release();
cookie = 0;
return S_OK;
}
STDMETHODIMP CDeviceControl::get_Valid(BOOL *pVal)
{
*pVal = !manager ? FALSE : ~0;
return S_OK;
}
STDMETHODIMP CDeviceControl::RaiseInterrupt(long inhno)
{
if(!manager)
return E_FAIL;
return manager->RaiseInterrupt(inhno);
}
STDMETHODIMP CDeviceControl::Map(long address, long size)
{
if(!manager)
return E_FAIL;
return manager->Map(address, size);
}
STDMETHODIMP CDeviceControl::Unmap(long address)
{
if(!manager)
return E_FAIL;
return manager->Unmap(address);
}
STDMETHODIMP CDeviceControl::get_IsKernelStarted(BOOL *pVal)
{
*pVal = KernelStarted ? ~0 : 0;
return S_OK;
}
STDMETHODIMP CDeviceControl::get_Offset(long *pVal)
{
*pVal = Offset;
return S_OK;
}
STDMETHODIMP CDeviceControl::put_Offset(long newVal)
{
if(newVal >= Limitation)
return E_FAIL;
Offset = newVal;
return S_OK;
}
STDMETHODIMP CDeviceControl::get_AccessSize(short *pVal)
{
*pVal = AccessSize;
return S_OK;
}
STDMETHODIMP CDeviceControl::put_AccessSize(short newVal)
{
switch(newVal)
{
case 1: case 2: case 4:
break;
default:
return E_FAIL;
}
AccessSize = newVal;
return S_OK;
}
STDMETHODIMP CDeviceControl::get_Value(long *pVal)
{
if(DataPointer == 0)
return E_FAIL;
*pVal = 0;
MemoryCopy(pVal, DataPointer + Offset, AccessSize);
Offset += AccessSize;
if(Offset >= Limitation)
Offset = Limitation -1;
return S_OK;
}
STDMETHODIMP CDeviceControl::put_Value(long newVal)
{
if(DataPointer == 0)
return E_FAIL;
MemoryCopy(DataPointer + Offset, &newVal, AccessSize);
Offset += AccessSize;
if(Offset >= Limitation)
Offset = Limitation -1;
return S_OK;
}
STDMETHODIMP CDeviceControl::OnRead(long address,long sz,byte __RPC_FAR data[])
{
if(!KernelStarted)
this->OnKernelStart();
DataPointer = (unsigned char *)data;
Limitation = sz;
Offset = 0;
Fire_OnRead(address, sz);
DataPointer = 0;
return S_OK;
}
STDMETHODIMP CDeviceControl::OnWrite(long address,long sz,byte __RPC_FAR data[])
{
if(!KernelStarted)
this->OnKernelStart();
DataPointer = (unsigned char *)data;
Limitation = sz;
Offset = 0;
Fire_OnWrite(address,sz);
DataPointer = 0;
return S_OK;
}
STDMETHODIMP CDeviceControl::OnKernelStart()
{
KernelStarted = true;
Fire_OnKernelStart();
return S_OK;
}
STDMETHODIMP CDeviceControl::OnKernelExit()
{
KernelStarted = false;
Fire_OnKernelExit();
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -