📄 irq.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; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -