[[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~ からの一連のスレッド