[[bc10-router]]

#contents

**Suspend/Resume [#cdaee1cd]
OMAP3530 は Suspend/Resume に対応しています。~
無通信時など動作の必要のないときスリープ状態にはいることで~
消費電力の抑制・低減を期待できます。~
~
Suspend に入るには、以下のように操作します。
 # echo mem > /sys/power/state
以下のようなメッセージをシリアルコンソールに出力してスリープ状態にはいります。
 [  132.186309] PM: Syncing filesystems ... done.
 [  132.400665] Freezing user space processes ... (elapsed 0.01 seconds) done.
 [  132.424591] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
 [  132.455871] Suspending console(s) (use no_console_suspend to debug)
シリアルコンソールからのキー入力、あるいは~
その他の設定しておいた wakeup sources (キーパッドやタッチスクリーンなど)~
からの入力で Resume します。~
 [  132.464385] phy0 -> rt2x00lib_suspend: Notice - Going to sleep.
 [  132.648376] PM: suspend of devices complete after 185.180 msecs
 [  132.649017] PM: late suspend of devices complete after 0.610 msecs
 [  132.649902] PM: noirq suspend of devices complete after 0.854 msecs
 [  132.650177] Successfully put all powerdomains to target state
 [  132.651367] PM: noirq resume of devices complete after 0.915 msecs
 [  132.651916] PM: early resume of devices complete after 0.396 msecs
 [  133.305328] PM: resume of devices complete after 653.289 msecs
 [  133.357299] Restarting tasks ... [  133.361206] usb 1-2: USB disconnect, device number 2
 [  133.366424] usb 1-2.2: USB disconnect, device number 3
 done.
 [  133.386016] usb 1-2.3: USB disconnect, device number 4
 [  133.391784] asix 1-2.3:1.0 eth0: unregister 'asix' usb-ehci-omap.0-2.3, ASIX AX88772 USB 2.0 Ethernet
Resume 後に表示されるメッセージですが、"Successfully put.." の5行目までは ~
Suspend にはいる際の情報で、~
"resume" という語の含まれる6行目以降が Resume 時のメッセージです。~
~
USB接続 Wi-Fi モジュールの driver rt2x00 も正常にスリープしているのですが、~
bc10 では Resume の再通電時に USB が切断状態になってしまうため、 ~
Resume 後 USB 接続の機器は使用できなくなってしまいます。

***no_console_suspend [#o82e9940]
上記の設定で Suspend にはいる際のメッセージに~
 Suspending console(s) (use no_console_suspend to debug)
とあるように、Suspend/Resume 自体のデバッグをしたい場合には~
kernel の起動オプションとして no_console_suspend を渡すことで~
コンソールがスリープ状態に入らないよう設定することができます。~
~
ここでは以下のような uEnv.txt を~
起動用SDカードのFATパーティションに置いて起動することで設定しています。
 console=ttyO2,115200n8
 mpurate=auto
 buddy=none
 vram=12M
 dvimode=640x480MR-16@60
 defaultdisplay=dvi
 loadaddr=0x80200000
 mmcroot=/dev/mmcblk0p2 rw
 mmcrootfstype=ext3 rootwait
 mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype} no_console_suspend
 mmcboot=echo Booting from mmc (uEnv.txt configuration) ...; run mmcargs; bootm ${loadaddr}
 loaduimagefat=fatload mmc ${mmcdev} ${loadaddr} uImage
 uenvcmd=run loaduimagefat; run mmcboot

mmcargs の最後に no_console_suspend を追加しています。~
この状態で起動した環境でスリープ状態に入ると、
 # echo mem > /sys/power/state
 [  119.239715] PM: Syncing filesystems ... done.
 [  119.283752] Freezing user space processes ... (elapsed 0.02 seconds) done.
 [  119.314239] Freezing remaining freezable tasks ... (elapsed 0.02 seconds) done.
 [  119.347229] phy0 -> rt2x00lib_suspend: Notice - Going to sleep.
 [  119.537750] PM: suspend of devices complete after 191.711 msecs
 [  119.544555] PM: late suspend of devices complete after 0.610 msecs
 [  119.552093] PM: noirq suspend of devices complete after 0.854 msecs

コンソールはスリープしないため、no_console_suspend を設定していなかったときは~
復帰後に表示されていたスリープ状態への移行時のメッセージが~
復帰後でなく状態移行時にリアルタイムに表示されています。~
コンソールからのキー入力で Resume させると以下のメッセージを表示します。~
 [  119.559051] Powerdomain (per_pwrdm) didn't enter target state 1
 [  119.559051] Powerdomain (core_pwrdm) didn't enter target state 1
 [  119.559051] Could not enter target state in pm_suspend
 [  119.560211] PM: noirq resume of devices complete after 0.854 msecs
 [  119.567443] PM: early resume of devices complete after 0.427 msecs
 
 [  120.226074] PM: resume of devices complete after 651.977 msecs
 [  120.233032] Restarting tasks ... [  120.236968] usb 1-2: USB disconnect, device number 2
 [  120.242340] usb 1-2.2: USB disconnect, device number 3
 done.
 [  120.271697] usb 1-2.3: USB disconnect, device number 4
 [  120.277496] asix 1-2.3:1.0 eth0: unregister 'asix' usb-ehci-omap.0-2.3, ASIX AX88772 USB 2.0 Ethernet

no_console_suspend が設定されていると per_pwrdm、core_pwrdm はスリープ状態にははいらず、~
kernel からの debug 出力などはシリアルコンソールに出力され続けます。


**debugfs [#m116f7fe]
OMAP3530 のパワーマネージメントに関する情報は debugfs から得られます。~
まず debugfs を mount します。~
以下の例では予め作成しておいた /debug ディレクトリに mount しています。
 # mount -t debugfs debugfs /debug
パワーマネージメントに関係する情報は pm_debug/ 以下に表示されます。~
 # cat /debug/pm_debug/
 /debug/pm_debug/cam_pwrdm/       /debug/pm_debug/mpu_pwrdm/
 /debug/pm_debug/core_pwrdm/      /debug/pm_debug/neon_pwrdm/
 /debug/pm_debug/count            /debug/pm_debug/per_pwrdm/
 /debug/pm_debug/dss_pwrdm/       /debug/pm_debug/sgx_pwrdm/
 /debug/pm_debug/emu_pwrdm/       /debug/pm_debug/time
 /debug/pm_debug/enable_off_mode  /debug/pm_debug/usbhost_pwrdm/
 /debug/pm_debug/iva2_pwrdm/      /debug/pm_debug/wkup_pwrdm/

末尾が _pwrdm になっているディレクトリはパワードメインごとの設定・情報です。~
OMAP3530 は SoC の機能ごとに電源管理ができるよう複数のパワードメインに分割されており、~
必要のない機能の電源だけを OFF にすることができるようになっています。~
~
count はパワードメイン毎のモードの遷移回数を表示します。~
()内が現在のモードです。
 # cat /debug/pm_debug/count
 usbhost_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 core_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
 per_pwrdm (ON),OFF:0,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 dss_pwrdm (ON),OFF:0,RET:130993,INA:0,ON:130994,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 cam_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 neon_pwrdm (ON),OFF:0,RET:149943,INA:3926,ON:153870,RET-LOGIC-OFF:0
 mpu_pwrdm (ON),OFF:0,RET:149943,INA:3926,ON:153870,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 iva2_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
 usbhost_clkdm->usbhost_pwrdm (3)
 sgx_clkdm->sgx_pwrdm (0)
 per_clkdm->per_pwrdm (20)
 cam_clkdm->cam_pwrdm (0)
 dss_clkdm->dss_pwrdm (1)
 core_l4_clkdm->core_pwrdm (25)
 core_l3_clkdm->core_pwrdm (5)
 d2d_clkdm->core_pwrdm (0)
 iva2_clkdm->iva2_pwrdm (0)
 neon_clkdm->neon_pwrdm (0)
 mpu_clkdm->mpu_pwrdm (0)
 prm_clkdm->wkup_pwrdm (0)
 cm_clkdm->core_pwrdm (0)

time はパワードメインのモード毎の滞在時間を表示します。
 # cat /debug/pm_debug/time
 usbhost_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305603026
 sgx_pwrdm (OFF),OFF:3055783935546,RET:0,INA:0,ON:3521697998
 core_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305633544
 per_pwrdm (ON),OFF:0,RET:0,INA:0,ON:3059305541992
 dss_pwrdm (ON),OFF:0,RET:2148355531323,INA:0,ON:910950041186
 cam_pwrdm (RET),OFF:0,RET:3055757873534,INA:0,ON:3547698975
 neon_pwrdm (ON),OFF:0,RET:3033790375457,INA:481475839,ON:25033721213
 mpu_pwrdm (ON),OFF:0,RET:3033876709697,INA:482116696,ON:24946746116
 iva2_pwrdm (RET),OFF:0,RET:3055783935546,INA:0,ON:3521606445

enable_off_mode は OFF モードの設定です。~
デフォルトでは 0 になっており、Suspend 時スリープ状態を保持しようとします。~
 # echo 1 > enable_off_mode
で OFF モードを有効にすると Suspend 時にはより深いスリープ状態になり、より電力消費を抑えます。~
この違いは Resume 後の /debug/pm_debug/count で確認できます。

-enable_off_mode 0 の時~
起動時から使用していないビデオ機能のSGXパワードメイン以外は一度も OFF にならず RET に移行しただけです。
 # cat /debug/pm_debug/count
 usbhost_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 core_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
 per_pwrdm (ON),OFF:0,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 dss_pwrdm (ON),OFF:0,RET:5,INA:0,ON:6,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 cam_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 neon_pwrdm (ON),OFF:0,RET:8263,INA:538,ON:8802,RET-LOGIC-OFF:0
 mpu_pwrdm (ON),OFF:0,RET:8263,INA:538,ON:8802,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 iva2_pwrdm (RET),OFF:0,RET:1,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
 usbhost_clkdm->usbhost_pwrdm (3)
 sgx_clkdm->sgx_pwrdm (0)
 per_clkdm->per_pwrdm (17)
 cam_clkdm->cam_pwrdm (0)
 dss_clkdm->dss_pwrdm (2)
 d2d_clkdm->core_pwrdm (0)
 iva2_clkdm->iva2_pwrdm (0)
 mpu_clkdm->mpu_pwrdm (0)
 core_l4_clkdm->core_pwrdm (25)
 core_l3_clkdm->core_pwrdm (4)
 neon_clkdm->neon_pwrdm (0)
-enable_off_mode 1 の時~
Suspend 時には OFF に移行したことがわかります。
 # cat /debug/pm_debug/count
 usbhost_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 sgx_pwrdm (OFF),OFF:1,RET:0,INA:0,ON:1,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 core_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0
 per_pwrdm (ON),OFF:1,RET:0,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 dss_pwrdm (ON),OFF:497,RET:157983,INA:0,ON:158481,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 cam_pwrdm (OFF),OFF:1,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 neon_pwrdm (ON),OFF:527,RET:178339,INA:2174,ON:181041,RET-LOGIC-OFF:0
 mpu_pwrdm (ON),OFF:527,RET:178339,INA:2174,ON:181041,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0
 iva2_pwrdm (OFF),OFF:1,RET:1,INA:0,ON:2,RET-LOGIC-OFF:0,RET-MEMBANK1-OFF:0,RET-MEMBANK2-OFF:0,RET-MEMBANK3-OFF:0,RET-MEMBANK4-OFF:0
 usbhost_clkdm->usbhost_pwrdm (3)
 sgx_clkdm->sgx_pwrdm (0)
 per_clkdm->per_pwrdm (17)
 cam_clkdm->cam_pwrdm (0)
 dss_clkdm->dss_pwrdm (2)
 d2d_clkdm->core_pwrdm (0)
 iva2_clkdm->iva2_pwrdm (0)
 mpu_clkdm->mpu_pwrdm (0)
 core_l4_clkdm->core_pwrdm (25)
 core_l3_clkdm->core_pwrdm (4)
 neon_clkdm->neon_pwrdm (0)

**wakeup_timer [#f2602a9a]
linux-omap ブランチ 2.6系のパワーマネージメントには、~
スリープ状態に入り設定した時間が経過したら元の状態に復帰する wakeup_timer の機能がありました。~
~
sysfs インタフェース経由で以下のように wakeup time を設定したあと Suspend させると
 # echo 5 > /sys/kernel/debug/pm_debug/wakeup_timer_seconds
 # echo -n “mem” > /sys/power/state
指定した時間(上記例では 5秒)後に Resume するというものです。~
~
この機能はパワーマネージメントのコードの debug のため一時的に削除され、~
timer 関連コードの整理後同様の機能が再度追加される予定でしたが~
現在も追加されないままになっています。~
~
omap2+: Remove gptimer_wakeup for now~
https://patchwork.kernel.org/patch/896572/~
~
Bringing back gptimer_wakeup~
http://www.spinics.net/lists/linux-omap/msg72142.html~
からの一連のスレッド


BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS