?? speridll.cpp
字號:
// SPeriDLL.cpp : Defines the initialization routines for the DLL.
// Sample Peripheral DLL: A/D Converter for ADuC812
#include "stdafx.h"
#include "Agsi.h"
#include "SPeriDLL.h"
#include "PeriDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Note!
//
// If this DLL is dynamically linked against the MFC
// DLLs, any functions exported from this DLL which
// call into MFC must have the AFX_MANAGE_STATE macro
// added at the very beginning of the function.
//
// For example:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // normal function body here
// }
//
// It is very important that this macro appear in each
// function, prior to any calls into MFC. This means that
// it must appear as the first statement within the
// function, even before any object variable declarations
// as their constructors may generate calls into the MFC
// DLL.
//
// Please see MFC Technical Notes 33 and 58 for additional
// details.
//
/////////////////////////////////////////////////////////////////////////////
// CSPeriDLLApp
BEGIN_MESSAGE_MAP(CSPeriDLLApp, CWinApp)
//{{AFX_MSG_MAP(CSPeriDLLApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static AGSICONFIG AgsiConfig;
struct AGSIFUNCS Agsi;
DWORD GetFunctionPointers(void) { // get all function pointers
Agsi.DefineSFR = (tAgsiDefineSFR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineSFR");
Agsi.DefineVTR = (tAgsiDefineVTR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineVTR");
Agsi.DeclareInterrupt = (tAgsiDeclareInterrupt) GetProcAddress(AgsiConfig.m_hInstance, "AgsiDeclareInterrupt");
Agsi.SetWatchOnSFR = (tAgsiSetWatchOnSFR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnSFR");
Agsi.SetWatchOnVTR = (tAgsiSetWatchOnVTR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnVTR");
Agsi.SetWatchOnMemory = (tAgsiSetWatchOnMemory) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnMemory");
Agsi.CreateTimer = (tAgsiCreateTimer) GetProcAddress(AgsiConfig.m_hInstance, "AgsiCreateTimer");
Agsi.DefineMenuItem = (tAgsiDefineMenuItem) GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineMenuItem");
Agsi.WriteSFR = (tAgsiWriteSFR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteSFR");
Agsi.ReadSFR = (tAgsiReadSFR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadSFR");
Agsi.WriteVTR = (tAgsiWriteVTR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteVTR");
Agsi.ReadVTR = (tAgsiReadVTR) GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadVTR");
Agsi.SetSFRReadValue = (tAgsiSetSFRReadValue) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetSFRReadValue");
Agsi.ReadMemory = (tAgsiReadMemory) GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadMemory");
Agsi.WriteMemory = (tAgsiWriteMemory) GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteMemory");
Agsi.GetLastMemoryAddress = (tAgsiGetLastMemoryAddress) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetLastMemoryAddress");
Agsi.IsSimulatorAccess = (tAgsiIsSimulatorAccess) GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsSimulatorAccess");
Agsi.SetTimer = (tAgsiSetTimer) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetTimer");
Agsi.GetClock = (tAgsiGetClock) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetClock");
// Agsi.GetLogicalClockFactor= (tAgsiGetLogicalClockFactor) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetLogicalClockFactor");
// Agsi.GetPhysicalClockRate = (tAgsiGetPhysicalClockRate) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetPhysicalClockRate");
// Agsi.SetPhysicalClockRate = (tAgsiSetPhysicalClockRate) GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetPhysicalClockRate");
Agsi.GetProgramCounter = (tAgsiGetProgramCounter) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetProgramCounter");
Agsi.IsInInterrupt = (tAgsiIsInInterrupt) GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsInInterrupt");
Agsi.IsSleeping = (tAgsiIsSleeping) GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsSleeping");
// Agsi.WakeUp = (tAgsiWakeUp) GetProcAddress(AgsiConfig.m_hInstance, "AgsiWakeUp");
Agsi.StopSimulator = (tAgsiStopSimulator) GetProcAddress(AgsiConfig.m_hInstance, "AgsiStopSimulator");
Agsi.TriggerReset = (tAgsiTriggerReset) GetProcAddress(AgsiConfig.m_hInstance, "AgsiTriggerReset");
Agsi.UpdateWindows = (tAgsiUpdateWindows) GetProcAddress(AgsiConfig.m_hInstance, "AgsiUpdateWindows");
Agsi.HandleFocus = (tAgsiHandleFocus) GetProcAddress(AgsiConfig.m_hInstance, "AgsiHandleFocus");
if ((Agsi.DefineSFR == NULL) || (Agsi.DefineSFR == NULL) ||
(Agsi.DefineVTR == NULL) || (Agsi.SetWatchOnSFR == NULL) ||
(Agsi.SetWatchOnVTR == NULL) || (Agsi.SetWatchOnMemory == NULL) ||
(Agsi.CreateTimer == NULL) || (Agsi.DefineMenuItem == NULL) ||
(Agsi.WriteSFR == NULL) || (Agsi.ReadSFR == NULL) ||
(Agsi.WriteVTR == NULL) || (Agsi.ReadVTR == NULL) ||
(Agsi.SetSFRReadValue == NULL) || (Agsi.ReadMemory == NULL) ||
(Agsi.WriteMemory == NULL) || (Agsi.GetLastMemoryAddress == NULL) ||
(Agsi.IsSimulatorAccess == NULL) || (Agsi.SetTimer == NULL) ||
(Agsi.GetClock == NULL) || /* (Agsi.GetLogicalClockFactor== NULL) || */
// (Agsi.GetPhysicalClockRate == NULL) || (Agsi.SetPhysicalClockRate == NULL) ||
(Agsi.GetProgramCounter == NULL) || (Agsi.DeclareInterrupt == NULL) ||
(Agsi.IsInInterrupt == NULL) || (Agsi.IsSleeping == NULL) ||
/* (Agsi.WakeUp == NULL)||*/(Agsi.StopSimulator == NULL) ||
(Agsi.TriggerReset == NULL) || (Agsi.UpdateWindows == NULL) ||
(Agsi.HandleFocus == NULL)) {
return(FALSE);
}
return(1);
}
DWORD DefineAllSFR(void) { // declare all special function registers and their bits
BOOL ret = TRUE;
ret &= Agsi.DefineSFR("ADCCON1", ADCCON1, AGSIBYTE, 0); // If more SFR's are defined, do it in a table
ret &= Agsi.DefineSFR("ADCCON2", ADCCON2, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("ADCCON3", ADCCON3, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("ADCDATAL", ADCDATAL, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("ADCDATAH", ADCDATAH, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("DMAL", DMAL, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("DMAH", DMAH, AGSIBYTE, 0);
ret &= Agsi.DefineSFR("DMAP", DMAP, AGSIBYTE, 0);
// It is only allowed to define bits which are bitaddressable.
ret &= Agsi.DefineSFR("CS0", ADCCON2, AGSIBIT, 0);
ret &= Agsi.DefineSFR("CS1", ADCCON2, AGSIBIT, 1);
ret &= Agsi.DefineSFR("CS2", ADCCON2, AGSIBIT, 2);
ret &= Agsi.DefineSFR("CS3", ADCCON2, AGSIBIT, 3);
ret &= Agsi.DefineSFR("SCONV", ADCCON2, AGSIBIT, 4);
ret &= Agsi.DefineSFR("CCNOV", ADCCON2, AGSIBIT, 5);
ret &= Agsi.DefineSFR("DMA", ADCCON2, AGSIBIT, 6);
ret &= Agsi.DefineSFR("ADCI", ADCCON2, AGSIBIT, 7);
return(ret);
}
struct vtrlist VTREG[] = { // VTR's definition: keep this table consistent with defines in SPeriDLL.h
{ "AIN0", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN1", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN2", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN3", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN4", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN5", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN6", AGSIVTRFLOAT, 0x00000000, NULL },
{ "AIN7", AGSIVTRFLOAT, 0x00000000, NULL },
{ "TEMP", AGSIVTRFLOAT, 0x41C80000, NULL }, // 25 癈
{ "VREF", AGSIVTRFLOAT, 0x40200000, NULL }, // 2.5 V
{ "XTAL", AGSIVTRLONG, 0x00A8C000, NULL }, // 11.0592MHz oscillator frequency
{ "CONVST", AGSIVTRCHAR, 0x00000001, NULL },
};
DWORD DefineAllVTREG(void) { // declare all virtual registers
BOOL ret = TRUE;
int i;
for (i = 0; i <= 11; i++) {
VTREG[i].hVTR = Agsi.DefineVTR(VTREG[i].pName, VTREG[i].Type, VTREG[i].Value);
if (!VTREG[i].hVTR) ret = FALSE;
}
return(ret);
}
AGSIINTERRUPT Interrupt = { // Table of all Interrupts of this module
// vec *mess msfr mmask *mname rsfr rmask *rname esfr emask *ename p0sfr p0mask *pname p1sfr p1mask pwl auto_reset
0x33, "A/D Converter", 0, 0, "", ADCCON2, 0x80, "ADCI", IE, 0x40, "EADC", IP, 0x40, "Pri", 0, 0x00, 7, 1 // ADCI
};
DWORD DefineAllInterrupts(void) { // declare all interrupts
if (!Agsi.DeclareInterrupt(&Interrupt)) return(FALSE);
return(TRUE);
}
AGSITIMER Timer;
DWORD DefineAllWatches(void) { // define all Watches
BOOL ret = TRUE;
ret &= Agsi.SetWatchOnSFR(ADCCON1, AdcConv, AGSIWRITE);
ret &= Agsi.SetWatchOnSFR(ADCCON2, AdcConv, AGSIWRITE);
ret &= Agsi.SetWatchOnSFR(ADCCON3, AdcConv, AGSIWRITE);
ret &= Agsi.SetWatchOnVTR(CONVST, AdcConv, AGSIWRITE);
Timer = Agsi.CreateTimer(AdcCompleted);
if (!Timer) return(FALSE);
return(ret);
}
DWORD DefineAllMenuEntries(void) { // declare all peripheral-menu entries and dialogs
if (!Agsi.DefineMenuItem(&PeriMenu)) return(FALSE);
return(TRUE);
}
DWORD ResetPeripheral(void) { // reset all SFR's of this peripheral
BOOL ret = TRUE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -