143 lines
4.1 KiB
C
143 lines
4.1 KiB
C
/****************************************************************************
|
|
*
|
|
* SciTech OS Portability Manager Library
|
|
*
|
|
* ========================================================================
|
|
*
|
|
* The contents of this file are subject to the SciTech MGL Public
|
|
* License Version 1.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.scitechsoft.com/mgl-license.txt
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
|
|
*
|
|
* The Initial Developer of the Original Code is SciTech Software, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* ========================================================================
|
|
*
|
|
* Language: ANSI C
|
|
* Environment: 32-bit Windows NT device drivers.
|
|
*
|
|
* Description: Implementation for the NT driver IRQ management functions
|
|
* for the PM library.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "pmapi.h"
|
|
#include "pmint.h"
|
|
#include "drvlib/os/os.h"
|
|
#include "sdd/sddhelp.h"
|
|
#include "mtrr.h"
|
|
#include "oshdr.h"
|
|
|
|
/*--------------------------- Global variables ----------------------------*/
|
|
|
|
static int globalDataStart;
|
|
static uchar _PM_oldCMOSRegA;
|
|
static uchar _PM_oldCMOSRegB;
|
|
static uchar _PM_oldRTCPIC2;
|
|
static ulong RTC_idtEntry;
|
|
PM_intHandler _PM_rtcHandler = NULL;
|
|
PMFARPTR _VARAPI _PM_prevRTC = PMNULL;
|
|
|
|
/*----------------------------- Implementation ----------------------------*/
|
|
|
|
/* Functions to read and write CMOS registers */
|
|
|
|
uchar _ASMAPI _PM_readCMOS(int index);
|
|
void _ASMAPI _PM_writeCMOS(int index,uchar value);
|
|
void _ASMAPI _PM_rtcISR(void);
|
|
void _ASMAPI _PM_getISR(int irq,PMFARPTR *handler);
|
|
void _ASMAPI _PM_setISR(int irq,void *handler);
|
|
void _ASMAPI _PM_restoreISR(int irq,PMFARPTR *handler);
|
|
void _ASMAPI _PM_irqCodeStart(void);
|
|
void _ASMAPI _PM_irqCodeEnd(void);
|
|
|
|
/****************************************************************************
|
|
REMARKS:
|
|
Set the real time clock frequency (for stereo modes).
|
|
****************************************************************************/
|
|
void PMAPI PM_setRealTimeClockFrequency(
|
|
int frequency)
|
|
{
|
|
static short convert[] = {
|
|
8192,
|
|
4096,
|
|
2048,
|
|
1024,
|
|
512,
|
|
256,
|
|
128,
|
|
64,
|
|
32,
|
|
16,
|
|
8,
|
|
4,
|
|
2,
|
|
-1,
|
|
};
|
|
int i;
|
|
|
|
/* First clear any pending RTC timeout if not cleared */
|
|
_PM_readCMOS(0x0C);
|
|
if (frequency == 0) {
|
|
/* Disable RTC timout */
|
|
_PM_writeCMOS(0x0A,(uchar)_PM_oldCMOSRegA);
|
|
_PM_writeCMOS(0x0B,(uchar)(_PM_oldCMOSRegB & 0x0F));
|
|
}
|
|
else {
|
|
/* Convert frequency value to RTC clock indexes */
|
|
for (i = 0; convert[i] != -1; i++) {
|
|
if (convert[i] == frequency)
|
|
break;
|
|
}
|
|
|
|
/* Set RTC timout value and enable timeout */
|
|
_PM_writeCMOS(0x0A,(uchar)(0x20 | (i+3)));
|
|
_PM_writeCMOS(0x0B,(uchar)((_PM_oldCMOSRegB & 0x0F) | 0x40));
|
|
}
|
|
}
|
|
|
|
ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler th,int frequency)
|
|
{
|
|
static ibool locked = false;
|
|
|
|
/* Save the old CMOS real time clock values */
|
|
_PM_oldCMOSRegA = _PM_readCMOS(0x0A);
|
|
_PM_oldCMOSRegB = _PM_readCMOS(0x0B);
|
|
|
|
/* Install the interrupt handler */
|
|
RTC_idtEntry = 0x38;
|
|
_PM_getISR(RTC_idtEntry, &_PM_prevRTC);
|
|
_PM_rtcHandler = th;
|
|
_PM_setISR(RTC_idtEntry, _PM_rtcISR);
|
|
|
|
/* Program the real time clock default frequency */
|
|
PM_setRealTimeClockFrequency(frequency);
|
|
|
|
/* Unmask IRQ8 in the PIC2 */
|
|
_PM_oldRTCPIC2 = PM_inpb(0xA1);
|
|
PM_outpb(0xA1,(uchar)(_PM_oldRTCPIC2 & 0xFE));
|
|
return true;
|
|
}
|
|
|
|
void PMAPI PM_restoreRealTimeClockHandler(void)
|
|
{
|
|
if (_PM_rtcHandler) {
|
|
/* Restore CMOS registers and mask RTC clock */
|
|
_PM_writeCMOS(0x0A,_PM_oldCMOSRegA);
|
|
_PM_writeCMOS(0x0B,_PM_oldCMOSRegB);
|
|
PM_outpb(0xA1,(uchar)((PM_inpb(0xA1) & 0xFE) | (_PM_oldRTCPIC2 & ~0xFE)));
|
|
|
|
/* Restore the interrupt vector */
|
|
_PM_restoreISR(RTC_idtEntry, &_PM_prevRTC);
|
|
_PM_rtcHandler = NULL;
|
|
}
|
|
}
|