software reset 發生問題...
因為是利用 watchdog reset 機制做出software reset 的動作。
以往沒問題的版本是用 jump 動作 (jump 到 start point)。
所以.. 修改 .. 改為software jump 。
本以為 software jump 要模擬 watchdog reset 的動作,在reset 前將所有 hardware power (GPIO )關閉,將 週邊register (LCD, USB, CLK...etc), reset。
結果導致 啟動後 LCD 沒畫面 (白畫面)。
但是從 boot prompt sound 判斷,似乎OS有boot 起來。
所以 ..,, 把所有"模擬watchdog reset 的code" 移除掉後..
就OK 了。
Software Jump 和 Watchdog reset 的差異:
- Watchdog reset : 啟動 watchdog reset,讓他timeout,發生 watchdog interrupt。watchdog reset 會reset program counter。讓 cpu 由 0x00 開始執行。
- Software Jump : 自己寫code,跳到 0x00 執行。
其實還有一項奇妙的東西...
0x00 開始的bootcode,會利用 週邊暫存器 來判斷是 hardrest (cold boot : register 會被清空) 還是 software teset (該register 不會被清空)。決定要 load image from nandflash (hard reset)再jump to ram 或是 直接jump to ram (software reset)。
hardware reset 的jump address 和 software reset 的 jump address 不一樣。
差距 0x1000。 (0x30200000 和 0x30201000)
但是看 0x30200000 該處的code ,就是一個 jump 到 0x30201000 的instruction。
所以jump 到哪裡都一樣呀。
但是 software reset 的jump 一定要jump 到 0x30201000,不然的話會boot 不起來.
Robert 說:唯一的可能就是 Software reset 後,代表0x30200000 該處的code 已經被修改了,不是 jump 到 0x30201000。
如果是這樣的話... CE kernel 真是博大精深呀,是 self modify code
2 則留言:
我想所有的bootloader或著該說是bootprep都是這樣做,判斷是hardware reset or software reset再決定要做什麼動作. 先前我在看vivi source code也trace到這段code. 可是NAND Flash和NOR Flash又不同, 我正再研究這一塊.
請問您是怎麼用watch dog模擬出software reset?用個interrupt等system穩定之後再做reset動作? Jump到start point也就是再recycle一次?
謝謝
用Samsung 的register 來作,每個cpu 都有一(幾)個register(GSTATUS2, INFORM1.1..) 的內容在watchdog reset後不會被clear 掉,所以利用這個register來存放data,boot 時就可以知道是hardware 還是software reset。
張貼留言