wince掛起和喚醒_relayon

不管任何方式的系統掛起,最終都會調用OEMPowerOff()函數來實 現.OEMPowerOff()函數由OEM來完成,這個函數也許會位於 power.c或者off.c的文件中.OEMPowerOff()是OEM來實現的,代碼和流程也許不同,但基本按照下面的方法來完成.

掛起的過程:

1.先進行平臺相關的動作,比如清屏,設置AD,usb等.

2.保存芯片所有的寄存器值到一個靜態數組(就是堆棧中)

3.設置io,關閉kitl等

4.呼叫OALCPUPowerOff()進行掛起.

OALCPUPowerOff()是一個位於startup.s中的彙編函數,它按照下面的流程實現掛起功能

5.保存通用寄存器r4-r12,lr到堆棧

6. 保存wakeup後的地址,MMU寄存器,進入各模式將sp和lr寄存器保存到內存RAM的某一個位置,這個位置是由config.bib指定保留的.爲 什麼不象之前一樣保存到堆棧呢?因爲系統喚醒後跳轉到reset開始執行,這時候堆棧還沒有初始化.這也是poweroff過程複雜的原因.

7.計算剛纔保存的數據塊的檢驗和並保存到GSTATUS3寄存器.(GSTATUS3和GSTATUS4是狀態寄存器,掛起直到喚醒過程都會保存裏面的值)

8.禁止中斷.

9.清cache

10.使能喚醒中斷,能喚醒可以是外部中斷0,1,2,或者RTC中斷

11.設置sdram進入自刷新模式,最終cpu進入power off狀態

喚醒的過程:

cpu 的power off模式和其他睡眠模式不同,其他的睡眠模式喚醒後會從睡眠處繼續運行,而power off模式喚醒後是從reset處執行.reset有3種可能情況,1.正常的上電冷啓動,包括reset信號線有效造成的reset.2.看門狗失效造 成的reset.3.power off之後被外部中斷或者rtc中斷喚醒的reset.在reset之後可以根據GSTATUS2寄存器來判斷是否從power off喚醒.還有一個問題,不論何種方式reset,都是先執行bootloader的代碼,所以喚醒過程需要bootloader的參與配合.具體流 程:

1.外部中斷或者rtc中斷喚醒cpu進入bootloader

2.bootloader 中停止sdram的自刷新模式,然後跳到內核開始地址.有些bootloader會做的更多,因爲前面我們把數據都保存到了ram中的某處,事實上只要知 道這個ram地址就可以取得數據進入喚醒過程.所以有些bootloader會直接去喚醒.我認爲這並不好,增加了bootloader的依賴性,層次間 的耦合性也高了.

3.檢查checksum,因爲之前設置sdram處於自刷新狀態,在poweroff期間sdram裏面的數據會保持,增加checksum是有必要的安全措施.

4.從RAM取得之前保存的參數,其中包含了喚醒後應該跳轉的地址,和MMU的配置數據以及各個模式的sp和lr.

5.啓動mmu

6.跳到喚醒後的新地址.

7.進入各個模式恢復sp和lr.

8.恢復r4-r12,lr

9.跳轉到lr,即相當於OALCPUPowerOff()返回,返回到OEMPowerOff()中.

10.打開kitl,恢復所有寄存器,恢復平臺之前狀態.

喚醒過程實際是一個掛起的逆過程.如此,系統成功喚醒,所有運行的應用程序不知道自己被系統掛起過而繼續運行.

轉載自:wince掛起和喚醒_relayon

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章