# Вопросы и проверки на железе > **Живой журнал.** Начинался как список того, что проверить на TM2424 до написания кода > (2026-07-08); теперь здесь итог по каждому вопросу «можно ли driver-free» — с тем, как > проверяли. Закрытый вопрос не удаляется: он объясняет, почему фичи нет, и не даёт ходить по > кругу. Короткий статус — также в [ROADMAP.md](../ROADMAP.md) «Открытые / Закрытые вопросы». > > Урок двух переоткрытий (температуры, порог заряда): прежде чем закрывать как «невозможно», > проверь все WMI-провайдеры и понаблюдай за OEM-софтом. ## Сводка | № | Вопрос | Итог | Где ответ | |---|---|---|---| | 1 | Нужен ли SYSTEM для SET | ✅ нет — хватает admin; служба не нужна | [ниже](#вопрос-1-права-нужен-ли-system-для-set-) | | 2 | Порог заряда | ✅ уровни 40/50/60/70/80/100 % (TM2424); не у всех моделей | [12](12-charge-levels.md) | | 3 | События из user-сессии | ✅ ловятся, служба не нужна | [01](01-wmi-protocol.md) §4, [07](07-keymap.md) | | 4 | Режимы производительности | ✅ набор по модели; Eco найден позже | [01](01-wmi-protocol.md) §3 | | 5 | Телеметрия | ✅ через MIFS — только SOH и ватты адаптера; остальное — мимо MIFS | [09](09-power-monitoring.md) | | 6 | Безопасность перебора | правила | [ниже](#вопрос-6-правила-безопасного-перебора) | | 7 | TDP в ваттах | ❌ невозможно driver-free | [ниже](#вопрос-7-tdp--power-limit-pl1pl2--можно-ли-задать-ватты--закрыт-нельзя) | | 8 | Подавить нажатие в мёртвой зоне тачпада | ❌ невозможно; вибрация и усилие — сделаны | [ниже](#вопрос-8-мёртвая-зона-тачпада-можно-ли-подавить-в-ней-нажатие--закрыт-нельзя) | | 9 | Значок батареи на уровнях ≠ 80 % | ❌ невозможно — поведение прошивки | [ниже](#вопрос-9-значок-батареи-windows-на-уровнях--80-можно-ли-его-синхронизировать--закрыт-нельзя) | Закрыты отдельными документами: удалённое включение ПК — [11](11-iot-remote-wake.md); NFC — модуль есть, но в Windows как устройство не выведен (проба `reference/probe-nfc.ps1`, 2026-07-13), см. ROADMAP «Не берём». Остаётся открытым: набор уровней порога и кодов клавиш на других моделях — ждём отчётов тестеров (`tools/diagnostics/xicontrol-diag.ps1`). --- ## 0. Хелпер для вызова метода Пробы — в PowerShell от администратора на целевом ноутбуке. `operation=0xFA` (GET) только читает и безопасен; `0xFB` (SET) меняет состояние. Сигнатура метода: ```powershell (Get-CimClass -Namespace root/wmi -ClassName MiCommonInterface).CimClassMethods (Get-CimClass -Namespace root/wmi -ClassName MiCommonInterface).CimClassMethods['MiInterface'].Parameters ``` Покажет точные имена параметров (`InData`/`OutData`) и их типы. --- ## Вопрос 1. Права: нужен ли SYSTEM для SET? 🔑 - [x] **Даже GET требует администратора** (без elevation `Get-CimInstance` → «нет доступа к CIM»). Отсюда `requireAdministrator` в манифесте. - [x] SET из обычного admin-процесса **работает** (включение защиты `0x02`→1 прошло). - [x] Режимы производительности переключаются по-настоящему: SET → `0x80` и readback держится; Eco заметно гасит подсветку и яркость ([01](01-wmi-protocol.md) §3). **Итог: служба ради привилегий не нужна** (план А, [03](03-architecture.md)). ## Вопрос 2. Заряд: точный порог и «слетание» 🔑 - [x] Статус читается: `GET 0x10 sub=0x02` → `OUT[6]`. - [x] WMI-заряд подтверждён: `0x02`=1 → стоп ≈80 %, `0x02`=0 → заряд до 100 % (доказано переключением, повторяемо). Держит прошивка, не Windows. - [x] ⚠️ **Переоткрыто 2026-07-29:** порог **не фиксирован** — `0x02` многоуровневый, прошивка держит **40/50/60/70/80/100 %** (коды `8/7/6/5/1(или 4)/0`, `% = 120 − код·10` для granular) и сама валидирует набор. Прежний вывод «фиксирован 80 %, бинарно» неверен → [12](12-charge-levels.md). - [x] ⚠️ **Уточнено 2026-09-22: группы `0x10` есть не у всех моделей.** На TM2113 команда отвергается ([issue #51](https://github.com/Oksion/XiControl/issues/51)) — «порог доступен driver-free» верно для TM2424, но не универсально. Приложение запоминает отказ и предлагает там программный порог (предупреждение, а не лимит) — XIC-74. - [x] EC сбрасывает защиту на переходах питания → `ChargeGuard` переармирует после сна/смены питания **и перед** уходом в сон/выключение ([01](01-wmi-protocol.md) §3). Держит надёжно. ## Вопрос 3. События: ловятся ли из user-сессии? 🔑 - [x] Подписка на `HID_EVENT20` из admin-сессии работает: ```powershell Register-CimIndicationEvent -Namespace root/wmi -Query "SELECT * FROM HID_EVENT20" -SourceIdentifier mifs # нажать Fn-клавишу, затем: Get-Event -SourceIdentifier mifs | ForEach-Object { $_.SourceEventArgs.NewEvent.EventDetail } ``` - [x] Формат `[0]=01` тип, `[1]` = код, `[2]` = значение. Все коды TM2424 опознаны → [07](07-keymap.md); полный OEM-диспетчер `0x01–0x26` → [14](14-xiaomi-hotkey-osd.md). **Итог: служба ради событий не нужна.** ## Вопрос 4. Режимы производительности на этой модели - [x] Модель: SKU `TM2424-77079` → префикс **`TM24`** → режим Auto (`0x09`) доступен. - [x] Текущий режим читается: GET `0x08` → `OUT[4]`. - [x] Приняты **Quiet `0x02` / Turbo `0x03` / Full-speed `0x04` / Auto `0x09`**; Balance `0x01` отклонён. - [x] Позже (v0.3) найден пятый — **Eco `0x0A`**, скрытый: гасит подсветку клавиатуры, снижает яркость. В UI — 5 режимов. - [x] На TM2113 набор почти зеркальный — только Balance и Quiet. **Список режимов — по модели**: отвергнутый у обоих источников питания режим убирается сам (XIC-44). - [ ] (опц.) Full-speed на USB-C против DC-разъёма — не проверялось, на реализацию не влияет. ## Вопрос 5. Телеметрия и доп-функции Через MIFS на TM2424 — полный GET-свип `0x01..0x30` с суб-функциями `0x00–0x08`: - [x] `0x0D` обороты вентиляторов — `0xE0`. - [x] `0x13` тип блока питания — `0xE0`. - [x] `0x12` подсветка клавиатуры — `0xE0`; уровень приходит только **событием** `0x05` → OSD. - [x] `0x09` режим GPU — `0xE0`. - [x] `0x16` температура CPU — `0xE0`. - [x] Работают только сенсоры группы заряда: `0x10/01` — здоровье батареи (SOH, %), `0x10/06` — мощность PD-адаптера (Вт). **Вывод «телеметрии нет» верен только про MIFS.** Позже нашлись driver-free источники мимо него: Intel DPTF (температуры, `root\wmi\EsifDeviceInformation`, в бенче до ~90 °C синхронно с нагрузкой), Intel IGCL (загрузка/ватты/частота iGPU), Battery API (мощность), PDH (NPU) — всё в «Мониторе», см. [09](09-power-monitoring.md). ## Вопрос 6. Правила безопасного перебора - Неизвестные `cmd` перебирать **только GET** (`0xFA`). - SET на неизвестные функции **не слать вслепую** — можно записать в прошивку нежелательное. Исключение — конкретный `cmd`+`arg`, подсмотренный у OEM-софта (так нашлись уровни заряда и `0x0C/0x03`). - Журнал проб (`cmd`, буфер, `OutData`) — в локальном `reference/`, в репозиторий не входит. --- ## Вопрос 7. TDP / Power Limit (PL1/PL2) — можно ли задать ватты? ✅ ЗАКРЫТ (нельзя) **Итог (2026-07-13): driver-free ползунок TDP в ваттах на TM2424 невозможен.** Три схождения: 1. `probe-cpu-power.ps1` → `0xE0` на всех `0x16–0x18`, поверх полного свипа `0x01..0x30`: **команды мощности в MIFS нет.** 2. Официальный Xiaomi PC Manager работает только на китайской Windows — протрейсить его вживую негде. Linux-драйвер: слот «CPU power» — для игровой линейки Tongfang, на нашей тонкой Bitland = `0xE0`. 3. Реальные PL на платформе держит **Intel DTT (ACPI/DPTF)** — драйвер Intel, не наш WMI-канал; user-mode API для произвольных ватт нет. Единственный доступ — запись RAPL MSR = kernel-драйвер (WinRing0/XTU) = **против принципа проекта**. Замена: 5 дискретных режимов (`0x08`) — это и есть driver-free пресеты мощности прошивки. Если нужна гранулярность тоньше — `powercfg` «максимум CPU %» (процент частоты, **не ватты**, с оговорками на гибридных Intel). Повторная сверка со сторонним проектом miPC (2026-10-11): driver-free границы не сдвинулись, ватт-лимит у них тоже за kernel-драйвером.
Исходный разбор вопроса (до закрытия) Контекст: запрос на ползунок «конкретный TDP CPU+iGPU» (ресерч 2026-07-13). **Две принципиально разные развилки:** - **MSR/RAPL** (`MSR 0x610`, PL1/PL2) — путь «драйвера Intel» / XTU / ThrottleStop. Запись требует Ring 0 → **kernel-драйвер → против принципа проекта** (см. [03](03-architecture.md)). Не рассматриваем. - **Через прошивку (ACPI/WMI)** — единственный driver-free путь: попросить firmware выставить PL, как g-helper делает у ASUS (эндпоинты SPL/sPPT/fPPT ≈ PL1/PL2, одна ACPI-запись). Работает, **только если MIFS экспонирует такую команду.** iGPU на Intel питается из **общего пакетного бюджета** мощности вместе с CPU — отдельного «ползунка ватт для iGPU» в user-mode не существует; пакетный PL режет CPU+iGPU вместе. **Уже известное (частично отрицательное):** - [x] Полный GET-свип `0x01..0x30` на TM2424 ([01](01-wmi-protocol.md) §2): **`0x17` (23 = «CPU power» в игровой таблице Tongfang) отвечает `0xE0`.** Также `0x14/0x15` (MAX_FAN) = `0xE0`. - ⇒ предварительный вывод: ватт-лимит через MIFS на TM2424 **скорее всего недоступен**, но свип был GET-only по sub `0x00–0x08` — не исчерпывающий. **Что планировали проверить:** - [x] Пере-снять GET `0x16..0x18` с полным дампом `OutData` по нескольким `arg` → `reference/probe-cpu-power.ps1` (GET-only). Результат: `0xE0` везде. - [ ] ~~Трейс официального софта (WMI-Activity / ETW) во время смены режимов~~ — невыполнимо: PC Manager не ставится на некитайскую Windows. - [ ] ~~Что делает Intel DTT на сменах профиля~~ — не наш канал, на вывод не влияет. - **SET неизвестных `cmd` — не слать вслепую** (Вопрос 6). **Развилка результата:** - Трейс нашёл MIFS-команду PL → делаем driver-free ползунок / пресеты по ваттам. - PL живёт только в Intel DTT/ACPI, не в MIFS → оставляем дискретные пресеты (`0x08`), опц. `powercfg` «максимум CPU %». > Как закрылось (2026-07-13): проба дала `0xE0`; официалку протрейсить нельзя. Реализовалась > вторая ветка развилки.
--- ## Вопрос 8. Мёртвая зона тачпада: можно ли подавить в ней НАЖАТИЕ? ✅ ЗАКРЫТ (нельзя) **Итог (2026-08-01, XIC-24): зонально подавить нажатие driver-free невозможно.** Само подавление касания — можно и сделано (`SuperCurtainBottom`, см. [ROADMAP](../ROADMAP.md) → Сделано), а вот кнопка: 1. **В PTP нет ни одного зонального параметра для кнопки.** Полный список тюнинга — `Curtain*`/`SuperCurtain*`/`SpaceBarOffset`/`HorizontalOffset`/`AAPNonCurtain*`/`AAPDisabled`/ `RightClickZone*`. Документация Microsoft описывает curtain-зоны как подавляющие «taps and mouse moves»; состояние кнопки туда не входит. Эксперимент на TM2424 совпал: в зоне не начинается касание, но продавливание проходит. 2. **Единственная штатная ручка про клик — глобальная.** `ClickForceSensitivity` (HKCU, Win11 26027+) = HID feature «Button Press Threshold» (`0x0D/0xB0`), то есть сила нажатия целиком по панели, без понятия зон. 3. **И её наше железо не поддерживает.** Опрос дескриптора (`HidP_GetValueCaps`, только чтение): у PTP-коллекции `COL02` feature-репорты — `0x0D/0x59` (Pad Type), `0x0D/0x55` (Contact Count Max) и вендорский `0xFF00/0xC5` (report 6). Ни `0x0D/0xB0`, ни коллекции Haptics (`0x0E`) нет вовсе: пэд **не haptic** в понимании Windows, а лежащие в HKCU `FeedbackEnabled`/`FeedbackIntensity`/ `ClickForceSensitivity` до железа не доходят. **Дополнение (2026-09-24, XIC-77): вендорский канал разобран.** Коллекция `COL05` (`0xFF01`, Report ID `0x0D`, 33 байта in/out) — канал Xiaomi PC Manager к прошивке тачпада. Протокол восстановлен из кода `SvrCModule.dll` (PC Manager 5.8.0.74, `sc::TouchSettingManager`), а не угадан, и проверен на TM2424: версия прошивки из ответа (v44.25.11.0) совпала с логом PC Manager. Формат кадров — в `src/SystemIntegration/TouchpadHapticsProtocol.cs`. PC Manager знает ровно четыре команды, и все — глобальные настройки: версия прошивки `0x10`, сила вибрации `0x5D`, порог нажатия `0x5B` (второе значение прошивка пересчитывает сама), «сильное нажатие» `0x59`. Вибрация и порог сделаны (Настройки → Тачпад → «Тактильный отклик»). **Вывод этого вопроса не меняется:** зонального параметра для кнопки нет и там. `COL04` (`0xFF00`, Report ID `0x0E`) — другой канал, не трогаем. **Импульс «вибрировать сейчас» нашёлся отдельно (XIC-73).** Он не в `SvrCModule.dll`, а в плагине краевых жестов `Plugins\PluginGesture.dll` (`XiaomiPcHost.exe`, отдельный архив в установщике): команда `0x02` с данными `[0x32, 0xCE]` одним кадром (`0D 09 FD 01 00 03 00 00 02 32 CE`), PC Manager шлёт её на каждом шаге яркости/громкости. Сила — команда `0x58` («передача скольжения», 1 short; PC Manager держит 80, на TM2424 так и стоит). Проверено на железе и сделано: щелчок на шаге наших краевых ползунков. **Сильное нажатие (XIC-78)** вендорского канала не требует вовсе: PC Manager распознаёт его по Tip Pressure (`0x0D/0x30`) в обычном PTP-вводе — давление контакта с Confidence больше 500. Замер на TM2424: касание 35–55, клик 125–150, сильное 900–1200, и давление приходит всегда, при любом `0x59`. Сам `0x59` (`[01|02, 00]`) — только второй щелчок прошивки в момент продавливания. Сделано назначаемым действием. Источники: [Precision touchpad tuning](https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-tuning-guidelines), [Input Device Haptics Implementation Guide](https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/input-haptics-implementation-guide). --- ## Вопрос 9. Значок батареи Windows на уровнях ≠ 80%: можно ли его синхронизировать? ✅ ЗАКРЫТ (нельзя) **Итог (2026-08-02): driver-free неисправимо — это поведение прошивки, а не настройка Windows.** **Симптом.** При лимите 40–70% Windows показывает верный процент и даже подпись «полностью заряжено с помощью функции оптимизированная зарядка», но значок остаётся **батареей с молнией**. На 80% он переключается на **батарею с вилкой** («заряжено, работа от сети»). **Причина.** Значок рисуется по флагу «полностью заряжена» (`Win32_Battery.BatteryStatus = 3`, источник — ACPI `_BST` от EC). Прошивка выставляет этот флаг **только на 80%** — историческом фиксированном уровне защиты; на остальных уровнях она просто перекрывает ток, ничего не объявляя. Многоуровневый порог (см. [12](12-charge-levels.md)) появился позже, а репорт в ACPI под него не обновили. **Что намерено на TM2424** (данные системы при этом верные — синхронизировать нечего): | Источник | Значение при лимите 60%, заряд 60% | |---|---| | `GetSystemPowerStatus` | `ACLineStatus=1`, `BatteryFlag=0` (бит «заряжается» снят), `BatteryLifePercent=60` | | `Win32_Battery.BatteryStatus` | `2` («от сети, не заряжается»), а не `3` | | `root\wmi BatteryStatus` | `Charging=False`, `ChargeRate=0`, `PowerOnline=True` | **Две пробы, обе отрицательные:** 1. Лимит 50% при заряде 60% (уровень уже превышен) → статус остался `2`. 2. Полный цикл зарядки 60→70% с лимитом 70% (то есть штатный переход «заряжаю → достиг») → статус остался `2`, значок не сменился. Это и отсекло версию «флаг ставится в момент завершения цикла». **Почему нельзя починить.** Флаг идёт снизу — из EC через ACPI в драйвер батареи; user-space в него не пишет. В реестре ключей нет вовсе (проверены `HKLM\SYSTEM\CurrentControlSet\Control\Power` и `...\CurrentVersion\Battery`) — значок не конфигурируется в принципе. Единственная подмена — свой battery-драйвер (WDK SimBatt) с тестовой подписью: против философии проекта, и настоящую батарею он всё равно не переопределит, а добавит вторую. Команды «считай текущий уровень полным» в MIFS не встречалось. **Косметический обход, если понадобится:** рисовать состояние в СВОЁМ значке трея — это в нашей власти, в отличие от системного. --- ## Как ответы определили архитектуру | Ответ | Решение | |-------|---------| | В1 admin хватает + В3 события из сессии ловятся | **План А** — только трей-резидент, без службы | | В2 защита слетает на переходах питания | Обязателен **ChargeGuard** | | В4 набор режимов зависит от модели | Режимы — по модели, учатся на отказах прошивки | | В2 группы заряда нет на части моделей | Программный порог как запасной вариант (XIC-74) |