事象
ThinkPad x13 gen6を数分〜10分程度放置しておく。
その後、動かそうとするとカーソルが約2秒位間固まった状態になる。
2秒位経つと、その後問題なく動き出す。
原因
Windowsの省電力機能(セレクティブサスペンドやDirected Power Management)が動作し、放置時間によってマウス、タッチパッド、またはその親となるI2CホストコントローラーやBluetoothアダプターの電源供給が遮断(スリープ)されるためっぽい。
次にデバイスを動かした際、デバイスおよびバスが省電力状態(D3)から通常稼働状態(D0)へ復帰・再起動する処理が走るため、約2秒のタイムラグ(フリーズ)が生じている模様。
対応方法
Windowsの設定またはデバイスマネージャーから、該当するデバイスの省電力機能をオフにすることで解決する。
I2Cホストコントローラーの省電力設定(Directed Power Management)の無効化
タッチパッドやトラックポイントの親となるコントローラーのスリープをオフにする。
- デバイス マネージャーを開く。
- 「システム デバイス」**を展開する。
- 「Intel(R) Serial IO I2C Host Controller」**をダブルクリックしてプロパティを開く。
- 「電源の管理」**タブを選択する。
- 「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」**のチェックを外す。
※メーカーやドライバーのバージョンによってはプロパティに「電源の管理」タブが表示されない場合がある。その場合は後述のレジストリ(PowerShell)での変更が必要。
タッチパッド(I2C HID デバイス)の省電力設定の無効化
- デバイス マネージャーを開く。
- 「ヒューマン インターフェイス デバイス」**を展開する。
- 「I2C HID デバイス」**のプロパティを開く。
- 「電源の管理」**タブを選択する。
- 「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」**のチェックを外す。
※こちらも「電源の管理」タブが表示されない場合がある。
USBのセレクティブサスペンドの無効化(USBマウスの場合)
- 「コントロール パネル」 > 「ハードウェアとサウンド」 > 「電源オプション」 を開く。
- 使用している電源プランの 「プラン設定の変更」 > 「詳細な電源設定の変更」 をクリックする。
- 「USB 設定」 > 「USB のセレクティブ サスペンドの設定」 を展開し、設定を 「無効」 に変更する。
Bluetoothの省電力設定の無効化(Bluetoothマウスの場合)
- デバイス マネージャーを開く。
- 「Bluetooth」**を展開する。
- 「インテル(R) ワイヤレス Bluetooth(R)」**などのBluetoothアダプターのプロパティを開く。
- 「電源の管理」タブを選択し、「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」のチェックを外す。
参考情報:PowerShellスクリプトによる一括設定変更
管理者権限で実行することで一括設定するPowerShellスクリプト
(Antigravityに作成してもらった)
インスタンスIDやパスが合わないため、これをそのままは使えない
あくまでも参考情報程度に記載
# 管理者としてPowerShellを実行して適用すること
# USB Selective Suspendの無効化
powercfg /SETACVALUEINDEX SCHEME_CURRENT 9a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e999 0
powercfg /SETDCVALUEINDEX SCHEME_CURRENT 9a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e999 0
powercfg /SETACTIVE SCHEME_CURRENT
# タッチパッド(I2C HIDデバイス)の省電力設定の無効化
$paths = @("HKLM:\System\CurrentControlSet\Enum\ACPI", "HKLM:\System\CurrentControlSet\Enum\HID")
foreach ($root in $paths) {
if (Test-Path $root) {
$subkeys = Get-ChildItem $root -ErrorAction SilentlyContinue
foreach ($key in $subkeys) {
$instances = Get-ChildItem $key.PSPath -ErrorAction SilentlyContinue
foreach ($inst in $instances) {
$devParamPath = Join-Path $inst.PSPath "Device Parameters"
if (Test-Path $devParamPath) {
$val = Get-ItemProperty -Path $devParamPath -Name "EnhancedPowerManagementEnabled" -ErrorAction SilentlyContinue
if ($val -ne $null -and $val.EnhancedPowerManagementEnabled -eq 1) {
Set-ItemProperty -Path $devParamPath -Name "EnhancedPowerManagementEnabled" -Value 0
}
}
}
}
}
}
# I2C Host ControllerのDirected Power Management(DFx)の無効化
$pciRoot = "HKLM:\System\CurrentControlSet\Enum\PCI"
if (Test-Path $pciRoot) {
$subkeys = Get-ChildItem $pciRoot -ErrorAction SilentlyContinue
foreach ($key in $subkeys) {
$instances = Get-ChildItem $key.PSPath -ErrorAction SilentlyContinue
foreach ($inst in $instances) {
$wdfPath = Join-Path $inst.PSPath "Device Parameters\WDF"
if (Test-Path $wdfPath) {
$val = Get-ItemProperty -Path $wdfPath -Name "WdfDirectedPowerTransitionEnable" -ErrorAction SilentlyContinue
if ($val -ne $null -and $val.WdfDirectedPowerTransitionEnable -eq 1) {
$friendlyName = (Get-ItemProperty -Path $inst.PSPath -Name "FriendlyName" -ErrorAction SilentlyContinue).FriendlyName
$deviceDesc = (Get-ItemProperty -Path $inst.PSPath -Name "DeviceDesc" -ErrorAction SilentlyContinue).DeviceDesc
$desc = if (![string]::IsNullOrEmpty($friendlyName)) { $friendlyName } else { $deviceDesc }
if ($desc -like "*I2C*") {
Set-ItemProperty -Path $wdfPath -Name "WdfDirectedPowerTransitionEnable" -Value 0
}
}
}
}
}
}