| /**************************************************************************** |
| * |
| * 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; |
| } |
| } |