特に節電に関して。
レジュームに関してはLinux kernelの動作に関して記述。
#サスペンドとレジューム
##サスペンド
- ホストはデータのやり取りがある間、1ms間隔でSOFパケットを送出している
- ホストは一定期間データのやり取りがないと判断すると、自身がサスペンド状態に入り、バス上にSOFパケットを送出するのをやめる
- Full/High Speedのデバイスの場合、SOFが3ms以上の間来ないことを検出すると、自身をサスペンド状態にする
- 3ms以上来なかったことは割り込みとして通知されてくることが多い
- Low Speedデバイスの場合は、3msの間キープアライブ信号を受け取らないと自身をサスペンド状態にする
- ホストはハブの個々のポートごとにサスペンドのリクエストを出すことが可能
##レジューム
- ホスト起点でのレジューム状態への移行とデバイス起点でのレジューム状態への移行の2種類ある
####ホスト起点でのレジューム
- ホストは少なくとも20ms(TDRSMDN)の間、バスをレジューム状態にする
- 実際のLinuxのHubのコントローラの実装では40msの遅延を入れているようだ
- これは多少の規格外なデバイスにも対応するためのものでもある
- drivers/usb/core/hub.c のusb_port_resume()関数内で遅延を入れている
- 実際のLinuxのHubのコントローラの実装では40msの遅延を入れているようだ
- デバイスはバスがK状態になったことを検知して自信をレジュームさせる
- また、ホストコントローラとしてはデバイスのレジューム復帰に少なくとも10msは許容しなければならない(下記コード内TRSMRCYという時間のこと)
int usb_port_resume(struct usb_device *udev, pm_message_t msg)
{
・・・中略・・・
/* drive resume for USB_RESUME_TIMEOUT msec */
dev_dbg(&udev->dev, "usb %sresume\n",
(PMSG_IS_AUTO(msg) ? "auto-" : ""));
msleep(USB_RESUME_TIMEOUT);
/* Virtual root hubs can trigger on GET_PORT_STATUS to
* stop resume signaling. Then finish the resume
* sequence.
*/
status = hub_port_status(hub, port1, &portstatus, &portchange);
/* TRSMRCY = 10 msec */
msleep(10);
・・・中略・・・
}
- USB_RESUME_TIMEOUTの定義はinclude/linux/usb.hにある
/*
* USB Resume Timer: Every Host controller driver should drive the resume
* signalling on the bus for the amount of time defined by this macro.
*
* That way we will have a 'stable' behavior among all HCDs supported by Linux.
*
* Note that the USB Specification states we should drive resume for *at least*
* 20 ms, but it doesn't give an upper bound. This creates two possible
* situations which we want to avoid:
*
* (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes
* us to fail USB Electrical Tests, thus failing Certification
*
* (b) Some (many) devices actually need more than 20 ms of resume signalling,
* and while we can argue that's against the USB Specification, we don't have
* control over which devices a certification laboratory will be using for
* certification. If CertLab uses a device which was tested against Windows and
* that happens to have relaxed resume signalling rules, we might fall into
* situations where we fail interoperability and electrical tests.
*
* In order to avoid both conditions, we're using a 40 ms resume timeout, which
* should cope with both LPJ calibration errors and devices not following every
* detail of the USB Specification.
*/
#define USB_RESUME_TIMEOUT 40 /* ms */
- デバイスはバスが1-15ms(TDRSMUP)の間レジューム状態になったときに自身もレジューム状態になる
####デバイス起点でのレジューム(リモートウェークアップ)
- デバイスからResume信号をバス上に出力する
- 上位のハブのダウンストリームポートがそのResume信号を検知し、バス上をK状態にする
- この時、ハブがルートハブでない場合は、ハブのアップストリームポートポートに対してResume信号を出力する
- デバイスは一定時間(TDRSMUP)後にResume信号を停止する
- TDRSMUPは1-15ms
- その後、上位ハブが20ms(TDRSMDN)後にResume信号を停止する
自分の理解は上記ですが間違っていたらもろもろとご指摘ください・・・