2015年10月16日 星期五

CE hive registry (續)

其實後來發現. windows CE hive registry 從 5.0 以來就沒什麼改變, 本文講的是 CE 7.0, hive registry 儲存界面為 SDmemory. 因為 SDbus 在一開機時並不會載入, 所以需要另外加進 boot.hv 中. 但因為這些內容是擺在 Microsoft Windows core registry 中, 基本上個人並不建議去更動 (事實上隨著 Microsoft 的 update 這個檔內容也會一直修一直改, 改動它, 難保哪天做 update 時又再被改回來, 也就是說改它等於做白工), 所以另外做一個 sd_hive.reg 檔, 內容就從 common.reg 裡抄出來. common.reg 檔案在 C:\WINCE700\public\common\oak\files 裡.

再說一次因為很重要, 請從自己的 common.reg 裡 copy/paste, 因為每一版 common.reg 並不會完全一樣, 硬貼上我的版本是有機會開不了機的...

sd_hive.reg 內容, 紅色為必加內容.

; @CESYSGEN IF CE_MODULES_SDBUS
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\Drivers\Builtin\SDBusDriver]
   "Order"=dword:15
   "Dll"="SDBus.dll"
   "Prefix"="SDC"
   "ThreadPriority"=dword:64     ; default thread priority for dispatch thread
   "RequestListDepth"=dword:30   ; pre-allocated requests
   "IClass"=multi_sz:"{20FA98A8-B298-4b32-8D72-C716AEE2FA84}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"
   "Flags"=dword:1000
   "BootPhase"=dword:0
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF CE_MODULES_SDBUS

; @CESYSGEN IF CE_MODULES_SDMEMORY
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory]
....中略....
[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\MMC_Class\High_Capacity]
....中略....
; END HIVE BOOT SECTION                     
; @CESYSGEN ENDIF CE_MODULES_SDMEMORY

以上 HIVE BOOT SECTION 與 END HIVE BOOT SECTION 為必加, 很重要.

再來的是 platform build 有一個環境設定的 .bat 檔裡加上

set PRJ_ENABLE_FSREGHIVE=1
set PRJ_ENABLE_REGFLUSH_THREAD=1
set PRJ_ENABLE_FSMOUNTASROOT=1

這幾個敘述, 但是 PRJ_ENABLE_FSREGHIVE 這個設定其實跟 PRJ_BOOTDEVICE_MSFLASH 和 PRJ_BOOTDEVICE_ATAPI 有關, 而這兩者都不設定時, 會被默認為 PRJ_BOOTDEVICE_ATAPI, 於是要再做一個 sd_plat.reg 註消在這裡面設定的內容.
sd_plat.reg 內容:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
    "MountAsBootable"=-
    "MountAsRoot"=-
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]
    "MountAsBootable"=-
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash\FATFS]
    "MountAsRoot"=-
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MMC]
"MountAsBootable"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory]
"MountAsBootable"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDHCMemory]
"MountAsBootable"=dword:1
;enable compress, unnecessary
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MMC\FATFS\Filters\CEFilt]
    "Dll"="cefilt.dll"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\FATFS\Filters\CEFilt]
    "Dll"="cefilt.dll"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDHCMemory\FATFS\Filters\CEFilt]
    "Dll"="cefilt.dll"

IF PRJ_ENABLE_FSREGHIVE
[HKEY_LOCAL_MACHINE\init\BootVars]
    "Flags"=dword:1

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\ObjectStore]
    "MountAsRoot"=dword:1
ENDIF
; END HIVE BOOT SECTION

一般來講 mountasbootable=dword:1 如果有多處, 你就要確定這些東西開機時只會有其中一樣有作用. mountasroot=dword:1 這個就要小心, 如果設定在 storage/FS 上就會看到所有的根目錄都變成那個 storage 圖示. 在這裡是走預設掛到 RAMdisk 去. 如果看到範例裡設定一大票地方都 mountasroot=dword:1, 那表示這個是亂槍打鳥打中的, 哪天也會出包, 要小心.
以上都是系統的, 再來才是 BSP 外加的 SD host driver 加在 boot.hv 中, 例如:
; HIVE BOOT SECTION
IF BSP_SDHC 
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDHC]
   "Prefix"="SHC"
   "Dll"="omap_sdhc.dll"
   "Flags"=dword:1000
ENDIF BSP_SDHC
; END HIVE BOOT SECTION

在這裡 "Flags"=dword:1000 這句很重要, 再來是前面講的 HIVE BOOT SECTION 一定要加上.

然後在 platform.reg 裡加上剛剛寫的 registry file:
#include "$(_TARGETPLATROOT)\sd_hive.reg"
#include "$(_TARGETPLATROOT)\sd_plat.reg"
這樣, 再 build platform.

build platform 蓋好後可以用 show built image 這個功能打開 nk.bin 看 boot.hv

看boot.hv是否如預期要求加上需要的 registry.

如果不如預期, 可以改剛剛做的那兩個 sd_plat.reg 與 sd_hive.reg 後做 mage run-time image, 就可以一直驗證到滿意為止.
相關筆記可以參考這裡的文章:
http://processors.wiki.ti.com/index.php/Persistent_Registry_in_ARM-A8_BSP
ps. 如果開不了機, 需要注意是不是其它的 driver 擋到開機流程....

下次有時間我再來驗證走 USB storage 的...



沒有留言: