📄 halsci.c
字号:
#include <windows.h>
#include <oal.h>
#include <bootarg.h>
#include <sci.h>
#ifdef DEBUG
//
// Debug zones
//
#define ZONE_ERROR DEBUGZONE(0)
//#define ZONE_WARNING DEBUGZONE(1)
#define ZONE_FUNCTION DEBUGZONE(2)
//#define ZONE_INIT DEBUGZONE(3)
#define ZONE_PCMCIA DEBUGZONE(4)
#define ZONE_IO DEBUGZONE(5)
#define ZONE_MISC DEBUGZONE(6)
#endif // DEBUG
#define NOT_SUPPORT 0
#define VT686 1
#define VT8231 2
#define VT8233 3
#define VT8235 4
#define VT8237 5
#define POWERBUTTON 0x01
#define EXTSMI 0x02
#define GPIO4 0x03
#define THERM 0x04
#define NOTHING 0x00
#define PWR_NORMAL 0
#define PWR_SUSPEND 1
typedef VOID (WINAPI *PPWMFUNC)(DWORD);
typedef struct SCI_REG{
DWORD dwAutoSave;
DWORD dwPowerButton;
DWORD dwRegistrySave;
DWORD dwGPIOACK;
DWORD dwSLPBTN;
DWORD dwSMICFG;
DWORD dwACLossAutoRestart;
DWORD dwSuspendTo;
DWORD dwLoadPWM;
DWORD dwAutoConfig;
DWORD dwIRQSetting;
TCHAR szFileName[80];
WCHAR IsrDll[64];
WCHAR IsrHandler[64];
TCHAR VendorFile[80];
BOOL bVendorRequest;
BOOL bRegistryPath;
} SCIREG, *PSCIREG;
PSCIREG gpSCIReg;
typedef struct GENPUR_STATUS{
WORD FixEV_Sts;
WORD GenPurEV_Sts;
} GENPURSTATUS, *PGENPURSTATUS;
BOOL SetSCIREG(PSCIREG pInBuf);
void FanOff(void);
void FanOn(void);
BOOL HiveRegSave();
BOOL RegCopyHD( );
void SCIPWMFunc( PVOID pStatus );
void ScreenOff(void);
void ScreenOn(void);
void SusToDisk(DWORD);
void SusToRAM(DWORD);
void ThrottleOff(void);
void ThrottleOn(void);
BOOL CALLBACK Shutdown_Proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
BOOL GetIOBaseIRQ(DWORD,DWORD);
BOOL InstallIRQShare(DWORD Irq, PVOID PhysAddr, DWORD configid, DWORD *dwSysIntr);
BOOL RequestSysIntr(DWORD Irq, DWORD *dwSysIntr);
void DllPowerUp(DWORD);
void DllGPIO(DWORD);
void GenPurStatus(PGENPURSTATUS pGenPurStatus);
void ACPowerLoss(DWORD);
void PWRNormal();
void PWRSuspend();
void ClearStatusBit(DWORD);
void SetACPowerLossInit(DWORD);
extern BOOL OEMIoControl(DWORD ,LPVOID,DWORD,LPVOID ,DWORD ,LPDWORD);
DWORD ChipSetID,dwGPIOACK,PowerBtnAct;
BOOL bRegistryPath ;
BYTE Power_Sts=PWR_NORMAL;
HANDLE hPowerNotifyEvent;
DWORD dwIrqId, dwIOBase, PWM_Config, SB686A_configid=0;
DWORD dwConfigId;
WORD dwGPIOSTS,dwSusTo;
TCHAR szFileName[80];
TCHAR VendorFile[80];
WCHAR IsrDll[64]; // IRQ sharing driver (.dll)
WCHAR IsrHandler[64]; // The ISR function of IRQ sharing in driver
DWORD RegCopyEnable, PowerBtnAct, AutoConfig=1, IrqSetting, dwVIALOGO, dwGPIOACK, dwSLPBTN, dwALAR;
DWORD dwAutoSaving, dwRegistrySave;
DWORD dwSMICFG;
DWORD F0CFGID = 0,F4CFGID = 0,CHIP = NOT_SUPPORT;
BOOL bVendorFunc = FALSE;
BOOL bVendorRequest = FALSE;
extern void SC_Sleep(DWORD);
//------------------------------------------------------------------------------
//
// Function: OALIoCtlSCIPWM
//
BOOL OALIoCtlSCIPWM(
UINT32 dwIoControlCode,
PBYTE lpInBuf,
UINT32 nInBufSize,
PBYTE lpOutBuf,
UINT32 nOutBufSize,
UINT32* lpBytesReturned
)
{
BOOL bResult;
// DWORD dwGetIOBase, dwGetIrqId;
// DWORD dwIOBase,dwIRQ;
// DEBUGMSG(0, (TEXT("+OALIoCtlSCIPWM %X\r\n"), dwIoControlCode));
// RETAILMSG(1, (TEXT("+OALIoCtlSCIPWM %X\r\n"), dwIoControlCode));
switch (dwIoControlCode) {
case IOCTL_HAL_POWEROFF:
bResult=GetIOBaseIRQ(dwIOBase, dwIrqId);
SusToDisk(dwIOBase);
return TRUE;
case IOCTL_HAL_SCREENOFF:
GetIOBaseIRQ( dwIOBase , dwIrqId);
if ( (ChipSetID == 0x82351106) || (ChipSetID == 0x30571106) || (ChipSetID == 0x30741106) || (ChipSetID == 0x31471106) || (ChipSetID == 0x31771106)|| (ChipSetID == 0x32271106) )
{
ScreenOff();
//ThrottleOn();
}
else
SusToDisk(dwIOBase);
return TRUE;
case IOCTL_HAL_SCREENON:
GetIOBaseIRQ(dwIOBase ,dwIrqId);
if ( (ChipSetID == 0x82351106) || (ChipSetID == 0x30571106) || (ChipSetID == 0x30741106) || (ChipSetID == 0x31471106) || (ChipSetID == 0x31771106) || (ChipSetID == 0x32271106))
{
ScreenOn();
//ThrottleOff();
}
else
SusToDisk(dwIOBase);
return TRUE;
case SCI_IOCTL_SETSCIREG:
SetSCIREG((PSCIREG) lpInBuf);
return TRUE;
case SCI_IOCTL_ACPOWERINIT:
SetACPowerLossInit((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_GETCHIPSETID:
GetIOBaseIRQ(dwIOBase, dwIrqId);
*((DWORD*)lpOutBuf)=ChipSetID;
return TRUE;
case SCI_IOCTL_DLLPOWERUP:
DllPowerUp((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_DLLGPIO:
DllGPIO((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_GENPURSTATUS:
GenPurStatus((PGENPURSTATUS)lpOutBuf);
return TRUE;
case SCI_IOCTL_ACPOWERLOSS:
ACPowerLoss((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_FANOFF:
FanOff();
return TRUE;
case SCI_IOCTL_CLEARSTATUSBIT:
ClearStatusBit((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_SUSTORAM:
SusToRAM((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_SUSTODISK:
SusToDisk((DWORD)lpOutBuf);
return TRUE;
case SCI_IOCTL_SCREENON:
ScreenOn();
return TRUE;
case SCI_IOCTL_SCREENOFF:
ScreenOff();
return TRUE;
case SCI_IOCTL_THROTTLEON:
ThrottleOn();
return TRUE;
case SCI_IOCTL_THROTTLEOFF:
ThrottleOff();
return TRUE;
case SCI_IOCTL_GETIOBASE:
GetIOBaseIRQ(dwIOBase, dwIrqId);
*((DWORD*)lpOutBuf) = dwIOBase;
return TRUE;
case SCI_IOCTL_GETIRQ:
GetIOBaseIRQ(dwIOBase, dwIrqId);
*((DWORD*)lpOutBuf) = dwIrqId;
return TRUE;
case SCI_IOCTL_GETCONFIGID:
GetIOBaseIRQ(dwIOBase, dwIrqId);
*((DWORD*)lpOutBuf) = dwConfigId;
return TRUE;
}
//RETAILMSG(1, (TEXT("-OALIoCtlSCIPWM %X\r\n")));
return 0;
}
//------------------------------------------------------------------------------
BOOL SetSCIREG(PSCIREG pInBuf)
{
dwAutoSaving=(pInBuf->dwAutoSave);
dwRegistrySave=(pInBuf->dwRegistrySave);
PowerBtnAct=(pInBuf->dwPowerButton);
dwGPIOACK=(pInBuf->dwGPIOACK);
dwSLPBTN=(pInBuf->dwSLPBTN);
dwSMICFG=(pInBuf->dwSMICFG);
dwGPIOSTS=(WORD)dwSMICFG;
dwALAR=(pInBuf->dwACLossAutoRestart);
bRegistryPath=(pInBuf->bRegistryPath);
dwSusTo=(WORD)(pInBuf->dwSuspendTo);
AutoConfig=(pInBuf->dwAutoConfig);
IrqSetting=(pInBuf->dwIRQSetting);
bVendorRequest=(pInBuf->bVendorRequest);
return TRUE;
}
void SetACPowerLossInit(DWORD dwALAR)
{
unsigned char cTestByte1, cTestByte2;
unsigned long lTestByte1, lTestByte2;
if(dwALAR == 2)
{
ACPowerLoss(dwALAR);
}
else
{
if(CHIP == VT686)
{
_asm
{
mov eax, F0CFGID
add eax, 074h
mov edx, 0cf8h
out dx, eax
mov edx, 0cfch
in eax, dx
mov lTestByte1, eax
and eax, 0fdffffffh
out dx, eax
in eax, dx
mov lTestByte2, eax
}
_asm
{
;disable CMOS 0D bit 7
mov al, 0dh
out 70h, al
in al, 71h
mov cTestByte1, al
or al, 82h
out 71h, al
in al, 71h
mov cTestByte2, al
}
//RETAILMSG( 1, (TEXT("Lock = 0x%08x to 0x%08x\r\n"), lTestByte1, lTestByte2));
//RETAILMSG( 1, (TEXT("CMOS 0D = 0x%0x to 0x%0x\r\n"), cTestByte1, cTestByte2));
}
if( CHIP == VT8231 ||CHIP == VT8233 || CHIP == VT8235|| CHIP == VT8237)
{
_asm
{
mov eax, F0CFGID
add eax, 058h
mov edx, 0cf8h
out dx, eax
mov edx, 0cfch
in eax, dx
mov lTestByte1, eax
and eax, 0fffffffdh
out dx, eax
in eax, dx
mov lTestByte2, eax
}
_asm
{
;disable CMOS 0D bit 7
mov al, 0dh
out 70h, al
in al, 71h
mov cTestByte1, al
or al, 82h
out 71h, al
in al, 71h
mov cTestByte2, al
}
}
}
}
void FanOn(void)
{
if (SB686A_configid)
{
DEBUGMSG( ZONE_IO, (TEXT("SCIPWM:Turn ON fan\r\n")));
_asm
{
;set rx75[2]=0,rx75[3]=0
mov eax, SB686A_configid
mov al,74h
mov edx, 0cf8h
out dx, eax
mov edx, 0cfch
in eax, dx
and ax,0f3ffh
out dx,eax
}
}
}
void FanOff(void) //For 686
{
if (SB686A_configid) {
DEBUGMSG( ZONE_IO, (TEXT("SCIPWM:Turn off fan\r\n")));
_asm
{
;set rx75[2]=1,rx75[3]=1
mov eax, SB686A_configid
mov al,74h
mov edx, 0cf8h
out dx, eax
mov edx, 0cfch
in eax, dx
or ax,0c00h
out dx,eax
mov edx, dwIOBase //SET GPO25=0
add edx, 4Fh
in al,dx
and al,0fdh
out dx,al
}
}
}
void ScreenOn(void)
{
DEBUGMSG( ZONE_IO, (TEXT("SCIPWM:turn on screen\r\n")));
RETAILMSG(1,(TEXT("SCIPWM:turn on screen\r\n")));
_asm {
mov dx,3c0h //reset flip-flop
in al,dx
mov al,20h
out dx,al //turn on screen
in al,dx
out dx,al
mov dx,3c4h //Enable CRTC R/W
mov al,01h
out dx,al
inc dx //port 3c5h
in al,dx
and al,0d7h
out dx,al
}
}
void ScreenOff(void)
{
DEBUGMSG( ZONE_IO, (TEXT("SCIPWM:turn off screen\r\n")));
RETAILMSG(1,(TEXT("SCIPWM:turn off screen\r\n")));
_asm {
mov dx,3c0h //reset flip-flop
in al,dx
xor al,al
out dx,al //turn off screen
in al,dx
out dx,al
mov dx,3c4h //disable CRTC R/W
mov al,01h
out dx,al
inc dx //port 3c5h
in al,dx
or al,28h
out dx,al
}
}
void ThrottleOn(void)
{
//CPU THROTTLING
DEBUGMSG( ZONE_IO, (TEXT("SCIPWM:Throttling+\r\n")));
_asm {
mov edx, dwIOBase //processor control
add edx, 10h
mov ax, 0211h //enable throttling & duty cycle <10%
out dx, ax
mov edx, dwIOBase //processor level 2
add edx, 14h
in al,dx
}
}
void ThrottleOff(void)
{
//CPU THROTTLING DISABLE
_asm {
mov edx, dwIOBase //processor control
add edx, 10h
mov al, 00h
out dx, al
}
}
void SusToDisk(DWORD dwIOBase)
{
int i;
DEBUGMSG(ZONE_IO, (TEXT("SCIPWM: STD\r\n")));
for ( i = 0; i < 5; i++)
{
_asm
{
;;------Disable Reg.-------
mov eax, 0
;; Power Management Enable (Offset 5-2)
mov edx, dwIOBase
add edx, 02h
out dx, eax
jmp short $+2 ;delay time
;; General Purpose Enable (Offset 25-22)
mov edx, dwIOBase
add edx, 22h
out dx, eax
jmp short $+2
;; Global Control Enable (Offset 2D-2A)
mov edx, dwIOBase
add edx, 02ah
out dx, eax
jmp short $+2
;; Primary Activity Detect Enable (Offset 37-34)
mov edx, dwIOBase
add edx, 034h
out dx, eax
jmp short $+2
;;------Enable Reg.-------
mov eax, 0ffffffffh;
;; Power Management Status (Offset 1-0)
mov edx, dwIOBase
out dx, ax
jmp short $+2
mov edx, dwIOBase
add edx, 020h
out dx, ax
jmp short $+2
;; General Status (Offset 28, 29)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -