經過漫長的奮鬥 , 我們還是需要等 RTC only sleep mode 的 BSP .......
並且....可能要到 2012/09/xx 才會收到 !!!
我們還需要花時間從標準 BSP 移植到 我們的 source 中 ....又是一段漫長時間 !!
經過上級指示 .... 先放棄這個 Project , 更換 CPU ....... !!
我終於可以不用當 "白老鼠" 了 ~~~~~ , 也不用 衝 " 世界第一 " ...... !!
So.... 這個 Blog 也跟著這個專案一起終止 ....... !!!
2012年6月19日 星期二
2012年6月15日 星期五
tps65910 RTC Function....
我們可以進入 Deep sleep mode 後 , 希望可以由 Power key 和 RTC Alarm 來wakeup CPU .
很不幸的 , AM335x 的 BSP 中沒有辦法由 RTC Alarm wakeup CPU .
經過TI 證實... RTC Alarm wakeup CPU 有 Bug , 所以目前還不會 working.
Deep Sleep mode 並不是我們最終想要的 mode , 我們要的是 RTC only mode .
好像....RTC only mode 有同樣的 bug ......... !!
再次說明..... 我們是白老鼠...... @@ !!
經過討論 , 想利用 外部RTC 透過 GPIO 方式來叫醒 CPU .... !!
So.... 只好利用tps65910 的 RTC + INT 功能來實現了 !!
BSP 又少 TSP65910 RTC 的 Driver ......... @@ !!
好吧 , 接著來進行 TPS65910 RTC 的Driver .....
很不幸的 , AM335x 的 BSP 中沒有辦法由 RTC Alarm wakeup CPU .
經過TI 證實... RTC Alarm wakeup CPU 有 Bug , 所以目前還不會 working.
Deep Sleep mode 並不是我們最終想要的 mode , 我們要的是 RTC only mode .
好像....RTC only mode 有同樣的 bug ......... !!
再次說明..... 我們是白老鼠...... @@ !!
經過討論 , 想利用 外部RTC 透過 GPIO 方式來叫醒 CPU .... !!
So.... 只好利用tps65910 的 RTC + INT 功能來實現了 !!
BSP 又少 TSP65910 RTC 的 Driver ......... @@ !!
好吧 , 接著來進行 TPS65910 RTC 的Driver .....
2012年6月14日 星期四
mDDR Suspend function Porting......
弄完CODEC 後,接下來要開始難度較高的Kernel Suspend 了。
聽說AM33x + LPDDR(mDDR) 我們是台灣第一家始用.......
2012/06 /07 :
這幾天稍微修正 BSP 後 ,順利可以suspend , 並且可以順利 Resume ..........
其中有些錯誤 ,
A :Sleep33xx.S 中有ㄧ個暫存器 248是錯誤的, 應該是252。
B: At same file , bl data_macro_cm 確沒有完整得 return , 所以 0xa4 沒有設定。
C: pm33xx.c 中的M3 ipc resume address 是固定的位置 , 應該用計算方式比較好。
另外 , pm33x.h 內要填寫mDDR 的參數 , 在 Resume 時要填回。
這樣就可以 suspend resume 了。
假日在補上 和CODEC 一樣的 Function list 。
:./kernel/power/main.c
state_store()
{
enter_state();
}
:./kernel/power/suspend.c
enter_state()
{
valid_state(); ==> suspend_valid_only_mem();
sys_sync();
suspend_prepare();
pm_restrict_gfp_mask();
suspend_devices_and_enter();
// wakeup Process......
pm_restore_gfp_mask();
suspend_finish();
}
suspend_prepare()
{
pm_prepare_console();
pm_notifier_call_chain();
usermodehelper_disable();
suspend_freeze_processes();
suspend_thaw_processes();
usermodehelper_enable();
}
suspend_devices_and_enter()
{
trace_machine_suspend();
suspend_ops->begin() ==> am33xx_pm_begin();
suspend_console();
suspend_test_start();
dpm_suspend_start();
suspend_test_finish();
suspend_test();
suspend_enter(); // System sleeping..... !
// Resume process......
suspend_test_start();
dpm_resume_end();
suspend_test_finish();
resume_console();
suspend_ops->end ==> am33xx_pm_end();
trace_machine_suspend();
}
suspend_enter()
{
suspend_ops->prepare ==> am33xx_pm_prepare_late();
dpm_suspend_noirq();
suspend_ops->prepare_late ==> xxx
disable_nonboot_cpus();
arch_suspend_disable_irqs();
syscore_suspend();
suspend_ops->enter ==> am33xx_pm_enter(); --> am33xx_pm_suspend();
// Resume Process ....
arch_suspend_enable_irqs();
enable_nonboot_cpus();
suspend_ops->wake ==> xxx
dpm_resume_noirq();
suspend_ops->finish ==> am33xx_pm_finish();
}
am33xx_do_sram_idle()
{
ENTRY(am33xx_do_wfi)
## EMIF config for low power mode .
## Disable EMIF.
## Weak pull down for DQ, DM.
## Disable VTP.
## IO to work in mDDR mode. ==> not ste it
## Enable SRAM LDO ret mode.
## Put the PLLs in bypass mode.
## ==================================
## Relock the PLLs.
## Disable SRAM LDO ret mode.
## IO to work in DDR mode.
## Restore the pull for DQ, DM.
## Enable VTP.
## Enable EMIF.
## Disable EMIF self-refresh.
## ==================================
## Take the PLLs out of LP_BYPASS.
## Disable SRAM LDO ret mode.
## Restore the pull for DQ, DM
## Take out IO of mDDR mode
## Enable VTP
## Restore DDR Setting .
## Enable EMIF
## Disable EMIF self-refresh
.......
}
聽說AM33x + LPDDR(mDDR) 我們是台灣第一家始用.......
2012/06 /07 :
這幾天稍微修正 BSP 後 ,順利可以suspend , 並且可以順利 Resume ..........
其中有些錯誤 ,
A :Sleep33xx.S 中有ㄧ個暫存器 248是錯誤的, 應該是252。
B: At same file , bl data_macro_cm 確沒有完整得 return , 所以 0xa4 沒有設定。
C: pm33xx.c 中的M3 ipc resume address 是固定的位置 , 應該用計算方式比較好。
另外 , pm33x.h 內要填寫mDDR 的參數 , 在 Resume 時要填回。
這樣就可以 suspend resume 了。
假日在補上 和CODEC 一樣的 Function list 。
:./kernel/power/main.c
state_store()
{
enter_state();
}
:./kernel/power/suspend.c
enter_state()
{
valid_state(); ==> suspend_valid_only_mem();
sys_sync();
suspend_prepare();
pm_restrict_gfp_mask();
suspend_devices_and_enter();
// wakeup Process......
pm_restore_gfp_mask();
suspend_finish();
}
suspend_prepare()
{
pm_prepare_console();
pm_notifier_call_chain();
usermodehelper_disable();
suspend_freeze_processes();
suspend_thaw_processes();
usermodehelper_enable();
}
suspend_devices_and_enter()
{
trace_machine_suspend();
suspend_ops->begin() ==> am33xx_pm_begin();
suspend_console();
suspend_test_start();
dpm_suspend_start();
suspend_test_finish();
suspend_test();
suspend_enter(); // System sleeping..... !
// Resume process......
suspend_test_start();
dpm_resume_end();
suspend_test_finish();
resume_console();
suspend_ops->end ==> am33xx_pm_end();
trace_machine_suspend();
}
suspend_enter()
{
suspend_ops->prepare ==> am33xx_pm_prepare_late();
dpm_suspend_noirq();
suspend_ops->prepare_late ==> xxx
disable_nonboot_cpus();
arch_suspend_disable_irqs();
syscore_suspend();
suspend_ops->enter ==> am33xx_pm_enter(); --> am33xx_pm_suspend();
// Resume Process ....
arch_suspend_enable_irqs();
enable_nonboot_cpus();
suspend_ops->wake ==> xxx
dpm_resume_noirq();
suspend_ops->finish ==> am33xx_pm_finish();
}
am33xx_do_sram_idle()
{
ENTRY(am33xx_do_wfi)
## EMIF config for low power mode .
## Disable EMIF.
## Weak pull down for DQ, DM.
## Disable VTP.
## IO to work in mDDR mode. ==> not ste it
## Enable SRAM LDO ret mode.
## Put the PLLs in bypass mode.
## ==================================
## Relock the PLLs.
## Disable SRAM LDO ret mode.
## IO to work in DDR mode.
## Restore the pull for DQ, DM.
## Enable VTP.
## Enable EMIF.
## Disable EMIF self-refresh.
## ==================================
## Take the PLLs out of LP_BYPASS.
## Disable SRAM LDO ret mode.
## Restore the pull for DQ, DM
## Take out IO of mDDR mode
## Enable VTP
## Restore DDR Setting .
## Enable EMIF
## Disable EMIF self-refresh
.......
}
訂閱:
文章 (Atom)