亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pwrbtn_pcf.c

?? windows ce 50 drive program
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//

/* ++

    PCF50606 Power Supply Controller & Battery Management

    Notes:
    ======
    o) I2c client

-- */

#include <windows.h>
#include <nkintr.h>
#include <windev.h>
#include <winbase.h>

#include "oalintr.h"

#include "pwr.h"

static DWORD PWR_IST(LPVOID Context);

// Make sure the driver builds OK in tinykern configuration
HMODULE g_hMod = NULL;
typedef void (*PFN_GwesPowerOffSystem)(void);
PFN_GwesPowerOffSystem g_pfnGwesPowerOffSystem = NULL;

// 
// Write PCF50606 registers directly from our cache
//
DWORD
HW_WriteRegisters(
    PPWR_CONTEXT pPWR,
    PUCHAR pBuff,   // Optional buffer
    UCHAR StartReg, // start register
    DWORD nRegs     // number of registers
    )
{
    return 1;
}


/* ++

Setup the regulators/converters.
Currenly uses default settings.

TODO: determine if we can lower anything.

-- */
DWORD
HW_InitRegulators(
    PPWR_CONTEXT    pPWR
    )
{
    return 1;
}


#define ENABLE  TRUE
#define DISABLE FALSE

DWORD
HW_InitCharger(
    PPWR_CONTEXT    pPWR,
    UCHAR           ucMode,
    UCHAR           ucFlags,
    BOOL            bEnable
    )
{
    return 1;
}


DWORD
HW_InitRegisters(
    PPWR_CONTEXT pPWR
    )
{
    DWORD retry = 0;

	// EINT0, GPF0 Port Init
	IOPreg * v_pIOPregs;

	v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
	VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE);

	v_pIOPregs->rGPFCON  &= ~(0x3 << 0);		/* Set EINT0(GPF0) as EINT0							*/
	v_pIOPregs->rGPFCON  |=  (0x2 << 0);

    v_pIOPregs->rEXTINT0 &= ~(0x7 << 0);		/* Configure EINT0 as Falling Edge Mode				*/
    v_pIOPregs->rEXTINT0 |=  (0x4 << 0);

	VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
	// EINT0, GPF0 Port Init Done


    EnterCriticalSection(&pPWR->RegCS);

    // init DRV_GLOBAL
    pPWR->pDriverGlobals->power.State   = PCF50606_STATE_IDLE;
    pPWR->pDriverGlobals->power.Error   = ERROR_SUCCESS;

    pPWR->pDriverGlobals->power.ACLineStatus = 0;
	pPWR->pDriverGlobals->power.ACLineStatus |= AC_LINE_BACKUP_POWER;
	pPWR->pDriverGlobals->power.ACLineStatus |= AC_LINE_ONLINE;

    pPWR->pDriverGlobals->power.BatteryFlag  = 0;
	pPWR->pDriverGlobals->power.BatteryFlag |=  BATTERY_FLAG_CHARGING;
    
    pPWR->pDriverGlobals->power.bADCC1   = 0;
    pPWR->pDriverGlobals->power.bADCC2   = 0;
    pPWR->pDriverGlobals->power.bADCDAT1 = 0;
    pPWR->pDriverGlobals->power.bADCDAT2 = 0;
    pPWR->pDriverGlobals->power.bADCDAT3 = 0;


    LeaveCriticalSection(&pPWR->RegCS);
        
    return 0;
}


/* ++

    The reset value of the PCF50606 INTxM registers is 0: Interrupt enabled.
    Once we enable the interrupt they start firing unless we mask them _before_
    enabeling the interrupt(s).
    
-- */
DWORD
HW_Init(
    PPWR_CONTEXT pPWR
    )
{
    DWORD dwErr = ERROR_SUCCESS;
    BOOL    Ret;

	pPWR->pDriverGlobals = NULL;

	RETAILMSG(1, (TEXT("HW_Init : GetProcAddress \r\n"), dwErr));
    //  Load GwesPowerOffSystem from coredll
    g_hMod = LoadLibraryEx(L"coredll.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
    if(g_hMod) {
        g_pfnGwesPowerOffSystem = (PFN_GwesPowerOffSystem) GetProcAddress(g_hMod, L"GwesPowerOffSystem");
        if(!g_pfnGwesPowerOffSystem) {
            FreeLibrary(g_hMod);
            g_hMod = NULL;
        }
    }
    
	RETAILMSG(1, (TEXT("HW_Init : ERROR_INVALID_PARAMETER \r\n")));
    if ( !pPWR )
        return ERROR_INVALID_PARAMETER;
        
	RETAILMSG(1, (TEXT("HW_Init : InitializeCriticalSection \r\n")));
    InitializeCriticalSection(&pPWR->RegCS);

	RETAILMSG(1, (TEXT("HW_Init : VirtualAlloc \r\n")));
    // map in DRV_GLOB
    if ( pPWR->pDriverGlobals == NULL )
    {
        pPWR->pDriverGlobals =
            (PDRIVER_GLOBALS)
                  VirtualAlloc( 0,
                                DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
                                MEM_RESERVE,
                                PAGE_NOACCESS
                              );
        if ( pPWR->pDriverGlobals == NULL )
        {
            RETAILMSG( 1, (TEXT( "pPWR->pDriverGlobals: VirtualAlloc failed!\r\n")) );
	        goto _error_exit;
        }

        Ret = VirtualCopy( (LPVOID)pPWR->pDriverGlobals,
                           (LPVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START,
                           DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
                           PAGE_READWRITE | PAGE_NOCACHE
                           );

        if ( Ret == FALSE )
        {
            RETAILMSG( 1, (TEXT( "pPWR->pDriverGlobals: VirtualCopy failed!\r\n")) );
	        goto _error_exit;
        }
    }

	RETAILMSG(1, (TEXT("HW_Init : pPWR->State \r\n")));

    // Init H/W
    pPWR->State = INITIALIZE;
    
    RETAILMSG(1, (TEXT("HW_Init : HW_InitRegisters \r\n"), dwErr));
	dwErr = HW_InitRegisters(pPWR);
    if ( dwErr ) {
	    RETAILMSG(1, (TEXT("HW_Init : HW_InitRegisters  Error \r\n"), dwErr));
        goto _error_exit;
    }

    //
    // create PWR_IST
    //
    RETAILMSG(1, (TEXT("HW_Init : CreateEvent \r\n"), dwErr));
    if ( (pPWR->ISTEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
        dwErr = GetLastError();
        RETAILMSG(1,(TEXT("PCF50606 ERROR: Unable to create IST event: %u \r\n"), dwErr));
        goto _error_exit;
    }

    RETAILMSG(1, (TEXT("HW_Init : InterruptInitialize \r\n"), dwErr));
    if( !InterruptInitialize(SYSINTR_POWER, pPWR->ISTEvent, NULL, 0) ) {
        dwErr = GetLastError();
        RETAILMSG(1,(TEXT("PCF50606 ERROR: Unable to initialize interrupt: %u\r\n"), dwErr));
        goto _error_exit;
    }

    RETAILMSG(1, (TEXT("HW_Init : CreateThread \r\n"), dwErr));
    if ( (pPWR->IST = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PWR_IST, pPWR, 0, NULL)) == NULL) {
        dwErr = GetLastError();
        RETAILMSG(1,(TEXT("PCF50606 ERROR: Unable to create IST: %u\r\n"), dwErr));
        goto _error_exit;
    }
    
    RETAILMSG(1, (TEXT("HW_Init : CeSetThreadPriority \r\n"), dwErr));
    // TODO: registry override
    if ( !CeSetThreadPriority(pPWR->IST, POWER_THREAD_PRIORITY)) {
        dwErr = GetLastError();
        RETAILMSG(1, (TEXT("PCF50606 ERROR: CeSetThreadPriority ERROR:%d \r\n"), dwErr));
        goto _error_exit;
    }

    pPWR->State = RUN;

    // Finally, after we are initialized dispatch any unmasked interrupts 
    // we may have missed during system start up. We do this because the INTx
    // registers are cleared on read.
    if ( !dwErr ) 
    {
        RETAILMSG(1,(TEXT("HW_Init OOCS: 0x%.2x\r\n"), pPWR->ResetReg[0] ));
        RETAILMSG(1,(TEXT("HW_Init INT1: 0x%.2x\r\n"), pPWR->ResetReg[1]));
        RETAILMSG(1,(TEXT("HW_Init INT2: 0x%.2x\r\n"), pPWR->ResetReg[2]));
        RETAILMSG(1,(TEXT("HW_Init INT3: 0x%.2x\r\n"), pPWR->ResetReg[3]));
//        pPWR->ResetRegReady = TRUE;
//        SetEvent(pPWR->ISTEvent);
    }

    RETAILMSG(1, (TEXT("HW_Init : Donw \r\n"), dwErr));

_error_exit:
    return dwErr;
}


DWORD
HW_Deinit(
    PPWR_CONTEXT pPWR
    )
{
    if ( !pPWR )
        return ERROR_INVALID_PARAMETER;
    
    RETAILMSG(1,(TEXT("+PWR_Deinit \r\n")));

    pPWR->State = UNINITIALIZED;

    if (pPWR->hADC && CloseHandle(pPWR->hADC))
        pPWR->hADC = NULL;

    if (pPWR->hTSCPRES && CloseHandle(pPWR->hTSCPRES))
        pPWR->hTSCPRES = NULL;

    if (pPWR->hI2C && pPWR->hI2C != INVALID_HANDLE_VALUE && CloseHandle(pPWR->hI2C))
        pPWR->hI2C = INVALID_HANDLE_VALUE;
    
    InterruptDisable(SYSINTR_POWER);

    if (pPWR->ISTEvent && CloseHandle(pPWR->ISTEvent))
        pPWR->ISTEvent = NULL;
    
    if (pPWR->IST && CloseHandle(pPWR->IST))
        pPWR->IST = NULL;  

    if (pPWR->pDriverGlobals) {
        VirtualFree( pPWR->pDriverGlobals,
                     DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE ,
                     MEM_RELEASE
                    );
        pPWR->pDriverGlobals = NULL;
    }        

    //  Free the coredll instance if we have allocated one
    if(g_hMod) {
        FreeLibrary(g_hMod);
        g_hMod = NULL;
    }

    DeleteCriticalSection(&pPWR->RegCS);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品乱码一区二区三区软件 | 精品国产电影一区二区| 成人黄色小视频| 丝袜a∨在线一区二区三区不卡| www久久久久| 欧美福利一区二区| 91麻豆国产自产在线观看| 狂野欧美性猛交blacked| 亚洲狼人国产精品| 日本一区二区电影| 精品少妇一区二区三区在线播放| 欧美亚洲国产一区在线观看网站| 国产精品 欧美精品| 久久99在线观看| 日本伊人精品一区二区三区观看方式| 国产精品女同一区二区三区| 日韩美女主播在线视频一区二区三区 | 五月婷婷另类国产| 亚洲国产sm捆绑调教视频| 亚洲欧美色一区| 国产精品第五页| 国产精品初高中害羞小美女文| 久久女同互慰一区二区三区| 久久综合丝袜日本网| 欧美zozo另类异族| 久久精品亚洲乱码伦伦中文| 久久综合九色综合欧美就去吻| 日韩精品一区二区三区在线播放| 6080午夜不卡| 久久奇米777| 国产精品视频第一区| 亚洲欧美另类小说| 亚洲免费色视频| 日韩成人精品在线| 韩国一区二区在线观看| 风间由美一区二区av101| www.99精品| 欧美日本在线视频| 精品久久久影院| 亚洲日穴在线视频| 视频一区中文字幕国产| 国产在线播放一区三区四| 99久久99久久免费精品蜜臀| 欧美午夜精品久久久久久孕妇| 日韩一区二区不卡| 国产米奇在线777精品观看| 婷婷激情综合网| 欧美区视频在线观看| 中文字幕在线视频一区| 欧美精品aⅴ在线视频| 亚洲伦在线观看| 91国偷自产一区二区三区观看| 国产精品久久久久天堂| 91同城在线观看| 一区二区三区在线观看国产| 在线观看一区二区精品视频| 亚洲一区二区三区四区在线观看 | 91国在线观看| 亚洲最新视频在线观看| 欧美日韩国产一区| 亚洲精品你懂的| 欧美精选午夜久久久乱码6080| 日韩黄色片在线观看| 精品美女在线观看| 成人久久18免费网站麻豆 | 成人免费毛片片v| 亚洲激情在线播放| 欧美一级片在线看| 国产成人精品免费在线| 亚洲在线成人精品| 精品日韩99亚洲| 国产成人午夜99999| 欧美韩国一区二区| 欧美日韩久久久| 成人在线综合网| 婷婷丁香激情综合| 国产精品九色蝌蚪自拍| 日韩欧美一卡二卡| 不卡一区二区三区四区| 日韩国产欧美视频| 亚洲乱码中文字幕综合| 精品少妇一区二区三区在线视频| 色8久久人人97超碰香蕉987| 色偷偷久久人人79超碰人人澡| 国模大尺度一区二区三区| 亚洲一区二区精品3399| 国产欧美精品区一区二区三区| 欧美伦理电影网| 91麻豆国产在线观看| 激情成人午夜视频| 亚洲免费毛片网站| 久久婷婷国产综合国色天香 | 欧美亚男人的天堂| 久久99国产精品久久99果冻传媒| 国产精品久久久久久久午夜片 | 久久精品在线免费观看| 欧美精品一二三| 色综合久久综合中文综合网| 另类的小说在线视频另类成人小视频在线 | 亚洲欧美中日韩| 欧美v日韩v国产v| 在线影院国内精品| 国产成人啪免费观看软件| 五月天一区二区| 亚洲成人资源网| 曰韩精品一区二区| 一区二区三区在线免费视频 | 国产日产精品一区| 日韩一卡二卡三卡| 欧美一卡2卡三卡4卡5免费| 欧美一级黄色录像| 日韩亚洲欧美在线观看| 日韩一区二区三区精品视频| 91精品国产高清一区二区三区蜜臀| 色噜噜狠狠色综合中国| 欧美视频一区二区三区四区 | 亚洲制服欧美中文字幕中文字幕| 欧美国产精品一区二区三区| 精品美女一区二区三区| www激情久久| 亚洲精品在线免费观看视频| 精品国产乱码久久久久久浪潮| 日韩欧美亚洲另类制服综合在线| 欧美一级xxx| 国产日韩影视精品| 亚洲色图第一区| 首页国产丝袜综合| 久久99这里只有精品| 国产91色综合久久免费分享| 成人午夜视频在线| 91天堂素人约啪| 欧美日韩国产精品成人| 亚洲精品一区二区三区福利| 国产精品久久一级| 奇米四色…亚洲| 一本一道波多野结衣一区二区| 欧美羞羞免费网站| 久久久精品tv| 日本女人一区二区三区| 国产超碰在线一区| 日韩你懂的在线播放| 亚洲无人区一区| 欧美亚洲精品一区| 亚洲一区二区中文在线| 色狠狠色噜噜噜综合网| 亚洲人xxxx| 91久久免费观看| 亚洲一区二区三区中文字幕| 91片在线免费观看| 国产天堂亚洲国产碰碰| 蜜臀av一区二区| 在线精品视频一区二区三四| 国产精品青草久久| 国产毛片精品国产一区二区三区| 欧美视频在线观看一区二区| 国产精品美女久久久久久久久久久 | 亚洲成人av福利| 99精品国产热久久91蜜凸| 久久久久久久久久久久久久久99| 亚洲成人一区二区在线观看| 成人午夜电影小说| 久久久777精品电影网影网| 精品一区二区三区免费毛片爱| 欧美一区二区三区在线看| 偷拍与自拍一区| 久久69国产一区二区蜜臀| 久久精品国产77777蜜臀| 久久先锋影音av鲁色资源| 99这里只有久久精品视频| 亚洲卡通欧美制服中文| 欧美日韩在线播放一区| 欧美一区二区免费观在线| 久热成人在线视频| 丝袜亚洲另类丝袜在线| 欧美精品一区二区三区四区| 波波电影院一区二区三区| 亚洲成人你懂的| 久久久不卡网国产精品二区| 99久久精品国产毛片| 视频在线观看一区二区三区| 日本一区二区动态图| 在线成人av网站| 91猫先生在线| 国产剧情一区在线| 婷婷国产v国产偷v亚洲高清| 国产精品狼人久久影院观看方式| 欧美久久久久久久久| 亚洲欧美二区三区| 99久久精品一区二区| 欧美一区二区女人| 一区二区三区成人在线视频| 激情小说亚洲一区| 欧美另类高清zo欧美| 亚洲18影院在线观看| 国产91综合网| 国产精品动漫网站| av男人天堂一区| 亚洲欧洲另类国产综合| 国产精品你懂的在线| 中文字幕成人av|