⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halsci.c

📁 威盛 wince5.0 bsp 包 for x86 系统, 支持 VT8601 等北桥
💻 C
📖 第 1 页 / 共 3 页
字号:

#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 + -