PMExt_Init 在哪里調(diào)用 ?
????? TI針對(windows mobile 6.5)wince5.0、wince6.0平臺的BSP電源管理部分,重新實(shí)現(xiàn)了一套管理機(jī)制,驅(qū)動(dòng)名稱叫做pmext.dll,估計(jì)是為了和系統(tǒng)自帶的pm.dll做區(qū)別,最終的作用就是在系統(tǒng)電源狀態(tài)發(fā)生變化的時(shí)候,調(diào)用自身MPU的電源管理寄存器(CORE,MPU,PER模塊等),進(jìn)行功耗降低。網(wǎng)上介紹這部分的內(nèi)容應(yīng)該是沒有的。
?????? 部分注冊表文件內(nèi)容如下:
;-- Power Management Extension -------------------------------------------------
; @CESYSGEN IF CE_MODULES_PM
; @CESYSGEN IF GWES_MGBASE
; @XIPREGION IF PACKAGE_OEMXIPKERNEL
; HIVE BOOT SECTION
IF BSP_NOPMEXT !
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerExtensionOmap]
??? "Dll"="pmext.dll"
??? "ConstraintRoot"="\OMAPPMX\Constraints"
??? "PowerPolicyRoot"="\OMAPPMX\Policies"
????? 如果你跟蹤代碼,發(fā)現(xiàn)跟蹤到如下系列的函數(shù)時(shí)候,就跟蹤不下去了,因?yàn)槟悴恢浪谀睦锉徽{(diào)用。
HANDLE PWRDOM_InitConstraint(_TCHAR const *szContext)
HANDLE PWRDOM_CreateConstraint(HANDLE hConstraintAdapter)
BOOL PWRDOM_UpdateConstraint(HANDLE hConstraintContext, DWORD msg, void *pParam, UINT? size)
????? 到底在哪里被調(diào)用?原來他既不是像普通的流驅(qū)動(dòng)那樣被device.exe加載調(diào)用,也不是像普通的函數(shù)那樣回調(diào),而是采用了一種類似進(jìn)程注入的方式來調(diào)用,具體在Constraintadapter.cpp的PostInitialize()函數(shù)中,通過類似下面的方式,獲取上面那些函數(shù)的API,注冊成為回調(diào)函數(shù):
????? m_fns.UpdateConstraint = reinterpret_cast
????? 這個(gè)驅(qū)動(dòng)Pmext.dll的實(shí)現(xiàn)文件就在cspomappmconstraintroot目錄下的Pmext.cpp中,但是它被調(diào)用的位置是在Omap3xxxbus.cpp,xxx代表和平臺相關(guān)的文件,比如Omap3430bus.cpp,Omap3530bus.cpp,等等。
?????? 也是用和上面差不多的方式來調(diào)用的,部分代碼如下:
#define?PME_INIT_NAME????????????????????(L"PMExt_Init") typedef?DWORD?(*fnInit)(HKEY?hKey,?LPCTSTR?lpRegistryPath); static?fnInit?pme_init; HANLDE?s_hModule?=?::LoadLibrary(s_szDll);?//s_szDll就是dll的名字 pme_init?=?reinterpret_cast(::GetProcAddress(s_hModule,?PME_INIT_NAME)); (*pme_init)(HKEY_LOCAL_MACHINE,?s_szPmExtPath);