2012年6月19日 星期二

專案終止 ~~~~~

經過漫長的奮鬥 , 我們還是需要等 RTC only sleep mode 的 BSP .......
並且....可能要到 2012/09/xx 才會收到 !!!
我們還需要花時間從標準 BSP 移植到 我們的 source 中 ....又是一段漫長時間 !!

經過上級指示 .... 先放棄這個 Project , 更換 CPU ....... !!
我終於可以不用當 "白老鼠" 了 ~~~~~ , 也不用 衝 " 世界第一 " ...... !!

So.... 這個 Blog 也跟著這個專案一起終止 ....... !!!

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 .....

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




.......


}