ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年9月19日 星期一

swsusp for imx51 : worklog

software_resume ( ) 進行 image check, image restore 後,就做 hiberate_restore( ),然後就不會回來了 (?) ...
/** * hibernation_restore - quiesce devices and restore the hibernation * snapshot image. If successful, control returns in hibernation_snaphot() * @platform_mode - if set, use the platform driver, if available, to * prepare the platform firmware for the transition. * * Must be called with pm_mutex held */ int hibernation_restore(int platform_mode) { int error; gfp_t saved_mask; pm_prepare_console(); suspend_console(); saved_mask = clear_gfp_allowed_mask(GFP_IOFS); error = dpm_suspend_start(PMSG_QUIESCE); if (!error) { error = resume_target_kernel(platform_mode); dpm_resume_end(PMSG_RECOVER); } set_gfp_allowed_mask(saved_mask); resume_console(); pm_restore_console(); return error; } 根據 comment, run 完會回到 hibernate_snapshot( ) , 猜是 stack 變更,所以這個 function return 回去會到 hibnation_snapshot( ).



卡在 kernel_imx/driver/base/power/main.c 的 dpm_resume( ) 的: while (!list_empty(&dpm_list)) { dev = to_device(dpm_list.next); get_device(dev); if (dev->power.status >= DPM_OFF && !is_async(dev)) { int error; mutex_unlock(&dpm_list_mtx); error = device_resume(dev, state, false); mutex_lock(&dpm_list_mtx); if (error) pm_dev_err(dev, state, "", error); } else if (dev->power.status == DPM_SUSPENDING) { /* Allow new children of the device to be registered */ dev->power.status = DPM_RESUMING; } if (!list_empty(&dev->power.entry)) list_move_tail(&dev->power.entry, &list); put_device(dev); } 中間有 mmc0: error -110 during reumse (card was remved?) 的 error.
==> 拿掉 mmc0 的 driver ,雖然 error 不再發生了,但是還是一樣卡住...約 48 sec 後才完成這個section。

拿掉 使用 dma 的 uart 後,經過 48 sec 的 resume後,沒有 core dump 了, kernel msg 可以正常的輸出,但是 console input 還是沒回應。
==> 將所有uart 的 DMA 都關掉後,雖然還是要 48 sec,但是 resume 後已經沒有 core dump 了 .... console 依然不回應 ..

在 get_device( )後印出 device 的 init_name,還有 dev->driver->name。發現好像是 pmic_adc 和 pmic_leds 卡住。

拿掉 pmic_led, pmic_backlight (從 menuconfig 拿掉).
==> 剩下 pmic_adc 需要 10 幾秒的 resume 時間,而且是卡在 pmic_adc_resume( ) 中..

拿掉 pmic_adc_resume( ) 中 對 register 的 read/write code 後,就沒有卡住了。
==> 但是 console 還是沒反應..

拿到 uboot 的 resume=? 參數,等開機進入 kernel 後,再用手動 echo 179:4 > /sys/power/resume
==> console 有反應.....所以原因是? .. root 是 ramdisk ?.. console not setup correctly ?

因為 android dev 在 mmcblk 加入一層 block,和kernel 不一樣。
所以,在kernel boot phase,要用以前的 /dev/mmcblk0p4,而不是開機完後的,/dev/block/mmcblk0p4

沒有留言:

標籤

網誌存檔