Поделиться через


Архитектура приложения для зарядки батареи UEFI, предоставляемого корпорацией Майкрософт

В этом разделе содержатся сведения о проектировании приложения для зарядки батареи UEFI, предоставляемого корпорацией Майкрософт для устройств под управлением Windows 10 Mobile. Изготовители оборудования могут использовать приложение для зарядки батареи от корпорации Майкрософт или реализовать собственное приложение для зарядки. Изготовители оборудования, реализующие собственное приложение для зарядки батареи UEFI, могут использовать сведения, приведенные в этом разделе, в качестве руководства по проектированию.

Приложение для зарядки батареи UEFI является одним из первых приложений корпорации Майкрософт, которое выполняется во время загрузки. Приложение для зарядки батареи UEFI несет следующие основные обязанности:

  • Убедитесь, что на устройстве достаточно энергии для загрузки.

  • Обеспечить поддержку зарядки выключения питания , если она включена изготовителем оборудования. Дополнительные сведения о выключении питания см. в разделе Зарядка батареи в загрузочной среде.

Приложение для зарядки батареи UEFI использует ключевые протоколы UEFI и реагирует на различные состояния, возвращаемые соответствующими драйверами.

Термин приложение для зарядки батареи UEFI в этом разделе относится к библиотеке зарядки батареи UEFI, загруженной mobilestartup.efi. Дополнительные сведения о mobilestartup.efi см. в разделе Загрузка и UEFI.

Протоколы UEFI, используемые приложением для зарядки батареи UEFI

Приложение UEFI для зарядки батареи (принадлежащее корпорации Майкрософт) использует протоколы (реализованные изготовителями оборудования), описанные в следующих разделах.

Протокол зарядки батареи UEFI (EFI_BATTERY_CHARGING_PROTOCOL)

Ниже описаны ключевые аспекты того, как приложение для зарядки батареи UEFI использует протокол зарядки батареи UEFI.

  1. Приложение для зарядки батареи UEFI опрашивает состояние батареи в режиме реального времени с помощью EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation (на устройствах, поддерживающих 0x00010002 версии EFI_BATTERY_CHARGING_PROTOCOL) или EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus (на устройствах, поддерживающих версию 0x00010001 EFI_BATTERY_CHARGING_PROTOCOL). Важно, чтобы эти функции по возможности возвращали точное значение заряда (SOC). SOC — это определяемое изготовителем оборудования сопоставление от количества заряда батареи на основе его состояния (включая емкость, напряжение и температуру) до значения от 0 до 100.

  2. Изготовители оборудования определяют пороговое значение загрузки в основной ОС (значение от 0 до 100). Это значение может отличаться для разных моделей устройств. Дополнительные сведения о пороге загрузки до основной ОС и других пороговых значениях см. в разделе Зарядка батареи в загрузочной среде.

  3. Приложение для зарядки батареи использует SOC от драйвера и сравнивает его с пороговым значением загрузки и основной ОС , чтобы определить, нужно ли заблокировать процесс загрузки, чтобы заряжаться в UEFI или продолжить загрузку. Он не получает никакой другой информации о состоянии расходов.

  4. Приложение для зарядки батареи UEFI вызывает EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery заряжает устройство и ожидает возврата события CompletionEvent с соответствующим EFI_BATTERY_CHARGING_STATUS .

Дополнительные сведения об этом протоколе см. в разделе Протокол зарядки батареи UEFI.

Протокол состояния питания для отображения UEFI (EFI_DISPLAY_POWER_PROTOCOL)

Во время процесса зарядки батареи UEFI приложение для зарядки батареи UEFI отображает чередующийся пользовательский интерфейс с низким энергопотреблением. Через 10 секунд без нажатия кнопки питания приложение вызывает EFI_DISPLAY_POWER_PROTOCOL. SetDisplayPowerState , чтобы отключить дисплей и подсветку. Это помогает устройству потреблять меньше энергии во время зарядки батареи UEFI, что помогает устройству заряжаться и быстрее переходить к основной ОС. Если пользователь нажимает кнопку питания во время отключения дисплея, приложение вызывает EFI_DISPLAY_POWER_PROTOCOL. SetDisplayPowerState еще раз, чтобы снова включить дисплей. Дополнительные сведения см. в разделе Взаимодействие с пользователем далее в этом разделе.

Дополнительные сведения об этом протоколе см. в разделе Протокол состояния питания для отображения UEFI.

Протокол функции USB UEFI (EFI_USBFN_IO_PROTOCOL)

Приложение для зарядки батареи UEFI зависит исключительно от EFI_USBFN_IO_PROTOCOL. DetectPort для определения типа подключенного порта. В зависимости от типа порта приложение вызывает EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery с 1500 мА или 500 мА.

Дополнительные сведения об этом протоколе см. в разделе Протокол функции UEFI USB.

Логика приложения

На следующей схеме описана логическая процедура приложения для зарядки батареи UEFI.

Логика зарядки батареи uefi.

В следующих примечаниях описываются некоторые ключевые разделы логики.

  • Перед вызовом EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery, приложение вызывает EFI_USBFN_IO_PROTOCOL. DetectPort , чтобы определить максимальный ток, который может обеспечить зарядное устройство USB:

    • При наличии порта приложение использует 1500 мА для выделенного настенного зарядного устройства или 500 мА для других портов.

    • Если нет порта, приложение использует 500 мА. Ожидается, что беспроводное зарядное устройство игнорирует это значение.

    • Если зарядное устройство отсутствует, приложение использует 500 мА. Однако приложение ожидает EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery возвращает EFI_BATTERY_CHARGING_COMPLETION_TOKEN с состоянием EfiBatteryChargingSourceNotDetected.

  • Во всех случаях изготовитель оборудования должен убедиться, что устройство и зарядное устройство находятся в безопасных рабочих регионах.

  • Если на устройстве нет батареи, но есть подключенный источник питания, при вызове EFI_BATTERY_CHARGING_PROTOCOL приложением. ChargeBattery для зарядки батареи драйвер UEFI должен возвращать EfiBatteryChargingStatusBatteryNotDetected. Приложение обрабатывает эту ошибку, отображая пользовательский интерфейс ошибки и завершая работу устройства.

  • Значения EFI_BATTERY_CHARGING_STATUS одинаково интерпретируются в режимах зарядки с пороговым значением и выключения питания , за исключением EfiBatteryChargingStatusSuccess. Дополнительные сведения об этих режимах зарядки см. в разделе Зарядка батареи в загрузочной среде.

  • Если устройство находится в режиме зарядки, отключение источника питания, как ожидается, приведет к тому, что встроенное ПО сигнализирует приложению с помощью EfiBatteryChargingSourceNotDetected, в результате чего приложение завершит работу устройства.

  • Если встроенное ПО сообщает приложению о состоянии EfiBatteryChargingStatusOverheat или EfiBatteryChargingStatusTimeout, устройство приостанавливает зарядку на 5 минут (но приложение по-прежнему вызывает EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation или EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus с интервалом примерно в 1 секунду). Через 5 минут устройство возобновляет зарядку, вызывая EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery. В течение этих 5 минут встроенное ПО по-прежнему должно сигнализировать о событии, предоставленном приложением, соответствующим значением EFI_BATTERY_CHARGING_STATUS (например, отключение источника должно сигнализировать об EfiBatteryChargingSourceNotDetected).

  • В обоих режимах зарядки соответствующий анимированный пользовательский интерфейс будет отображаться в поле "Оставаться в приложении " на предыдущей схеме.

  • В режиме выключения питания , если встроенное ПО сигнализирует о событии и предоставляет состояние EfiBatteryChargingStatusSuccess, приложение для зарядки батареи UEFI не загружается в основной ОС, пока пользователь не удерживает кнопку питания в течение 3 секунд. Однако если приложение обнаружит, что USB-кабель был отключен в данный момент, устройство будет выключено. Приложение для зарядки батареи UEFI ожидает, что драйвер полностью поддерживает аккумулятор в режиме выключения питания.

  • В режиме выключения питания, если встроенное ПО не сигнализирует об ошибке или событии успешного выполнения, приложение для зарядки батареи UEFI не выключает устройство.

Обработка ошибок

Каждый раз EFI_BATTERY_CHARGING_PROTOCOL. Вызывается ChargeBattery , указывается EFI_BATTERY_CHARGING_COMPLETION_TOKEN . Если драйвер сталкивается с ошибкой, событие в маркере сигнализируется с помощью EFI_BATTERY_CHARGING_STATUS. В следующей таблице показано, как приложение для зарядки батареи UEFI реагирует на различные значения состояния в разных ситуациях.

Состояние Режим зарядки с пороговым значением Режим зарядки выключения питания (до и после достижения порогового значения состояния заряда)
EfiBatteryChargingStatusNoneNone Не ожидается или недопустим Не ожидается или недопустим
EfiBatteryChargingStatusSuccess Загрузка в ОС До достижения порогового значения состояния оплаты: Продолжайте работу в режиме выключения питания. После достижения порогового значения состояния оплаты: Оставайтесь в режиме выключения питания до отключения USB.
EfiBatteryChargingStatusOverheat Приостановка зарядки на 5 минут, а затем возобновление зарядки Приостановка зарядки на 5 минут, а затем возобновление зарядки
EfiBatteryChargingStatusVoltageOutOfRange Загрузка в ОС Загрузка в ОС
EfiBatteryChargingStatusCurrentOutOfRange Загрузка в ОС Загрузка в ОС
EfiBatteryChargingStatusTimeout Приостановка зарядки на 5 минут, а затем возобновление зарядки Приостановка зарядки на 5 минут, а затем возобновление зарядки
EfiBatteryChargingStatusAborted Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingStatusDeviceError Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingStatusХоколд Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingStatusBatteryChargingNotSupported Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingStatusBatteryNotDetected Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingSourceNotDetected Завершение работы Завершение работы
EfiBatteryChargingSourceVoltageInvalid Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingSourceCurrentInvalid Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EfiBatteryChargingErrorRequestShutdown Завершение работы Завершение работы
EfiBatteryChargingErrorRequestReboot Перезагрузка Перезагрузка

В следующей таблице показано, как приложение для зарядки батареи UEFI реагирует на значения состояния, полученные от EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation или EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus.

Состояние Пороговый режим зарядки Режим зарядки выключения питания (до и после достижения порогового значения состояния заряда)
EFI_SUCCESS.
Это значение возвращается, если ошибки не обнаружены.
Неприменимо Неприменимо
EFI_INVALID_PARAMETER.
Это значение возвращается, если входной параметр указан неправильно. Теоретически это не должно быть возможным в рабочей среде.
Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы Отображение пользовательского интерфейса ошибки в течение 10 секунд, а затем завершение работы
EFI_DEVICE_ERROR или EFI_NOT_READY.
Эти условия ошибок обрабатываются таким же образом. Эти значения должны возвращаться EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryInformation или EFI_BATTERY_CHARGING_PROTOCOL. GetBatteryStatus в случаях, когда устройство не может загрузиться в основную ОС из-за ошибки устройства. В частности:

EfiBatteryChargingStatusAborted
EfiBatteryChargingStatusDeviceError
EfiBatteryChargingStatusCold
EfiBatteryChargingStatusBatteryChargingNotSupported
EfiBatteryChargingStatusBatteryNotDetected
EfiBatteryChargingSourceVoltageInvalid
EfiBatteryChargingSourceCurrentInvalid
EfiBatteryChargingErrorRequestShutdown
EfiBatteryChargingErrorRequestReboot.

Вызов EFI_DEVICE_ERROR или EFI_NOT_READY с последующим маркером завершения одной из перечисленных выше ошибок приведет к завершению работы устройства.
Возобновление и вызов EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery Возобновление и вызов EFI_BATTERY_CHARGING_PROTOCOL. ChargeBattery

Взаимодействие с пользователем

На следующей схеме показано, как приложение для зарядки батареи UEFI рисует пользовательский интерфейс на экране, если недостаточно заряда батареи или устройство находится в режиме выключения питания.

Пользовательский интерфейс для зарядки батареи.

Ниже описано, как приложение рисует пользовательский интерфейс на экране.

  • Приложение очищает экран, записывая цвет заливки фона в каждый пиксель кадра.

  • Приложение рисует чередующиеся растровые изображения пользовательского интерфейса с низким уровнем заряда батареи, копируя пиксели из буферов растровых изображений непосредственно на дисплей. Если 10 секунд проходит без нажатия кнопки питания, приложение вызывает EFI_DISPLAY_POWER_PROTOCOL. SetDisplayPowerState для отключения дисплея и подсветки. Если пользователь нажимает кнопку питания, EFI_DISPLAY_POWER_PROTOCOL. Метод SetDisplayPowerState вызывается, чтобы снова включить дисплей.

  • Когда приложение получает ошибки от драйвера, приложение очищает экран, записывая цвет заливки фона в каждый пиксель в буфере кадров, а затем приложение рисует экран ошибки батареи, копируя пиксели из соответствующего буфера растрового изображения непосредственно на дисплей.