這個問題在實作時曾考慮到,釋出版本的日志裡也加了說明,如果啟用了調試序列槽,那麼在燒錄或者更新系統前,須禁用調試序列槽。說實在的,确實有點麻煩,不小心就忘了做這個工作。而問題的根源是實作機制不太合理。調試序列槽的配置被分散在兩處,一處是存儲在NAND Flash的特定區域,另一處是系統資料庫中。系統啟動時,OAL根據Flash中儲存的狀态,确定是否啟用調試序列槽,而驅動加載時又根據系統資料庫的狀态,确定是否加載調試序列槽的驅動。兩處儲存的狀态不同步時,問題就出現了。問題分析清楚了,解決方法自然就有了,保證兩處的狀态一緻即可。
調試序列槽的配置由存儲在NAND Flash中的參數決定,系統啟動時根據該值,動态修改調試序列槽對應的系統資料庫配置,確定在啟用調試序列槽時,不再加載它所對應的驅動,也就不會産生沖突,導緻系統無法正常啟動了。
在驅動系統資料庫中,Flags是用于控制流驅動的加載行為的。其中DEVFLAGS_NOLOAD即表示不要加載該驅動。是以,在合适的地方添加如下代碼,即可控制調試序列槽驅動的加載。
1 void DisableDebugSerial(BOOL bDisable)
2 {
3 HKEY Key;
4 DWORD Status;
5 DWORD Disposition;
6 DWORD Value;
7 DWORD Flags;
8
9 Status = RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"Drivers\\BuiltIn\\Serial3", 0, NULL, 0, 0, NULL, &Key, &Disposition);
10
11 if (Status == ERROR_SUCCESS)
12 {
13 Value = bDisable ? DEVFLAGS_NONE : DEVFLAGS_NOLOAD;
14 RegSetValueEx(Key, DEVLOAD_FLAGS_VALNAME, 0, DEVLOAD_FLAGS_VALTYPE, (PBYTE)&Value, sizeof(Value));
15 RegCloseKey(Key);
16 }
17 }
如果禁用了調試序列槽,則将Flag是設定為DEVFLAGS_NONE,裝置管理器将正常加載驅動。如果沒有禁用調試序列槽,則将Flags設定為DEVFLAGS_NOLOAD,裝置管理器就不會加載該驅動。
通過以上方法的改進,調試序列槽的動态複用就更友善了。