Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер последовательной шины загружается на основе PDO, созданного ACPI, и может запрашивать и получать доступ к системным ресурсам, таким как контроллеры GPIO и I2C для выполнения управления сигналами.
Пример механизма управления питанием
Bluetooth по USB имеет встроенный механизм для передачи сигналов в полосе для поддержки сна и пробуждения. Однако на платформе SoC механизм поддержки управления питанием может быть более гибким (и настраиваемым) с помощью различных контроллеров.
Ниже приведен пример реализации для поэтапного рассмотрения сигналов в режиме ожидания и сигнала пробуждения.
- Прерывание по линии GPIO HOST_WAKE — сигнал от контроллера Bluetooth, когда необходимо разбудить хост для обработки запроса от удаленного устройства (например, удаленного подключения).
- Сигнальная линия GPIO BT_ENABLE - устанавливается драйвером шины и активируется, когда радио активно (стек ядра в D0), или деактивируется, когда стек ядра Bluetooth обнаруживает бездействие (переходит в D2).
Эти две линии GPIO в качестве системных ресурсов передаются драйверу последовательной шины при загрузке драйвера в качестве регулярного прерывания и нового сигнала GPIO. Его свойства взаимодействия определяются в таблице ACPI системным интегратором и поставщиком наборов микросхем Bluetooth (IHV). Драйвер последовательной шины может запрашивать и кэшировать идентификаторы подключения зависимых контроллеров, чтобы открыть и получить доступ к ресурсам.
Запуск для включения простоя
Драйвер последовательной шины требуется для выполнения следующих задач для поддержки простоя в состоянии питания системы S0:
- Отчеты о возможностях управления питанием и PnP; как встроенное устройство, его съемный флаг для дочернего PDO должен иметь значение WdfFalse.
- Сообщите, что она может обеспечивать поддержку режима простоя своему драйверу функций (Bluetooth ядра).
- Обработайте руку и разоружите для пробуждения и сигнала пробуждения.
- Получение уведомления о состоянии питания устройства и синхронизация завершения ввода-вывода с текущим состоянием питания устройства.
Возможности управления питанием
Дочерний PDO, созданный драйвером шины, задает возможности питания для включения поддержки состояния простоя. Дочерний PDO управляется Диспетчером питания, включая настройки, указывающие:
- Способность поддерживать состояние устройства D2.
- Его способность переходить в режим ожидания и выходить из него в состоянии D2.
- Его задача - сопоставление состояния системы с состояниями устройства и поддержание синхронизации с основным драйвером Bluetooth.
WDF_DEVICE_POWER_CAPABILITIES_INIT(&PowerCaps);
…
PowerCaps.DeviceD1 = WdfFalse;
PowerCaps.DeviceD2 = WdfTrue;
…
PowerCaps.DeviceWake = PowerDeviceD2;
PowerCaps.DeviceState[PowerSystemWorking] = PowerDeviceD0;
PowerCaps.DeviceState[PowerSystemSleeping1] = PowerDeviceD2;
PowerCaps.DeviceState[PowerSystemSleeping2] = PowerDeviceD2;
PowerCaps.DeviceState[PowerSystemSleeping3] = PowerDeviceD2;
PowerCaps.DeviceState[PowerSystemHibernate] = PowerDeviceD2;
PowerCaps.DeviceState[PowerSystemShutdown] = PowerDeviceD3;
..
WdfDeviceSetPowerCapabilities(ChildDevice, &PowerCaps);
Дочерний PDO создает очередь WDF для получения запросов IOCTL (управление вводом-выводом) от основного драйвера Bluetooth. Такие запросы запрашивают версию интерфейса и статические характеристики до запуска устройства, поэтому эта очередь не должна находиться под управлением энергоснабжения.
QueueConfig.PowerManaged = WdfFalse;
QueueConfig.EvtIoDeviceControl = PdoIoQuDeviceControl;
Status = WdfIoQueueCreate(ChildDevice,
&QueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&Queue);
Конкретный запрос на транспорт Bluetooth для возможности простоя
Помимо сообщения о возможностях управления питанием (как указано в предыдущем разделе), дочерний PDO также отвечает на запрос драйвера ядра Bluetooth о возможности перехода в состояние простоя. Для поддержки простоя в S0 этот флаг устанавливается:
FdoExtension->BthXCaps.IsDeviceIdleCapable = TRUE;
Включение и отключение для пробуждения системы
Требованием для поддержки простоя является возможность получения запроса на пробуждение с удаленного устройства Bluetooth. Настройка для такого запроса пробуждения включает в себя подготовку системы к пробуждению. PDO для функции Bluetooth может регистрироваться для получения обратных вызовов для выполнения действий по активации/деактивации функций.
WDF_PDO_EVENT_CALLBACKS_INIT(&Callbacks);
// Receive this callback to arming the device for wake
Callbacks.EvtDeviceEnableWakeAtBus = PdoDevEnableWakeAtBus;
// Receive this callback to disarming the device for wake
Callbacks.EvtDeviceDisableWakeAtBus = PdoDevDisableWakeAtBus;
WdfPdoInitSetEventCallbacks(DeviceInit, &Callbacks);
С помощью приведенных выше механизмов драйвер ядра Bluetooth может включить поддержку простоя и пробуждения.
Уведомление о состоянии питания устройства
Дочерние PDO регистрируются для получения обратного вызова, чтобы войти в состояние D0 и выйти из него, таким образом получая уведомления о переходе состояния питания устройства. Текущее состояние питания устройства используется для синхронизации завершения ввода-вывода, то есть обычное завершение ввода-вывода должно быть завершено только в D0.
//
// Register to receive device power state change notification
//
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&PnpPowerCallbacks);
PnpPowerCallbacks.EvtDeviceD0Entry = PdoDevD0Entry;
PnpPowerCallbacks.EvtDeviceD0Exit = PdoDevD0Exit;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit,
&PnpPowerCallbacks);
Активировать для пробуждения
Перед вводом бездействия драйвер последовательной шины получает обратный вызов EvtDeviceEnableWakeAtBus для подготовки к пробуждению.
Механизм активации режима пробуждения зависит от поставщика для платформ SoC и поэтому выходит за рамки этого раздела. Однако Windows ожидает, что контроллер шины будет готов принять сигнал пробуждения и будет функция обратного вызова (например, ISR) для обработки такого сигнала.
Переход в режим бездействия
Основной драйвер Bluetooth включает механизм обнаружения бездействия на основе времени. При удовлетворении требований простоя основной драйвер начинает инициировать стек для перехода в состояние простоя. Он вызывает PoRequestPowerIrp , чтобы задать мощность для перехода в D2 вместе с функцией завершения. После того как водитель шины завершит выполнение IRP, вызывается эта функция завершения. В настоящее время переход на D2 завершается.
При переходе в состояние простоя драйвер Bluetooth ядра отменяет все ожидающие запросы на чтение, а затем перезапускает их при возвращении к активному состоянию. Пустая очередь с энергосбережением необходима, чтобы сам драйвер последовательной шины перешел в режим ожидания.
Помимо времени ожидания простоя, основной драйвер Bluetooth учитывает множество различных ситуаций перед вводом в состояние простоя, например:
- Дождитесь завершения команды HCI, которую она выполнила. Примечание: драйвер Bluetooth не перейдет в режим ожидания до завершения его работы.
- Все подключенные устройства находятся в режиме сниффинга.
В этом состоянии простоя контроллер многофункционального режима может уменьшить мощность функции Bluetooth, но он должен продолжать предоставлять питание для поддержания его переменных параметров и конфигурации. Затем он может полагаться на свой механизм пробуждения, чтобы пробудить стек обратно в активное состояние (D0), после чего взаимодействие ввода-вывода может возобновиться.
Пробуждение от сна
Хотя функция Bluetooth сопряжена с одним или несколькими устройствами и находится в состоянии сна, её радио периодически сканирует запросы от сопряжённых устройств. Когда сопряженное устройство инициирует запрос и радио Bluetooth получает его, начинается процесс восстановления активного состояния. После возобновления работы стека устройств (D0) драйверы могут начать обслуживание этого удаленного запроса.
Этот удаленный запрос обрабатывается функцией обработки сигналов пробуждения в драйвере шины, как описано в последнем разделе. Эта функция обработки сигналов пробуждения должна убедиться, что состояние устройства PDO действительно находится в состоянии D2, а затем вызвать WdfDeviceIndicateWakeStatus (PDO, успешный статус), чтобы уведомить KMDF завершить IRP W/W (ожидание пробуждения). В это время функция завершения этого W/W IRP может быть вызвана и обработана его инициатором - базовым драйвером Bluetooth и владельцем политики энергопотребления.
Завершение W/W IRP заставляет основной драйвер Bluetooth инициировать переход в D0. Он запрашивает PoRequestPowerIrp с функцией завершения, чтобы установить состояние питания устройства на D0.
Перед возобновлением работы с активным состоянием D0 драйвер последовательной шины может получить уведомление EvtDeviceDisableWakeAtBus , чтобы отключить пробуждение. Это завершает процесс, чтобы отменить то, что EvtDeviceEnableWakeAtBus сделал ранее.
После возобновления работы стека драйверов Bluetooth до D0 драйвер последовательной шины может завершить запрос удаленного устройства.
Некоторые события необходимо синхронизировать в драйвере последовательной шины, например:
- При вводе D2 уже должно быть ожидающий W/W Irp. Во время подготовки к пробуждению для получения сигнала пробуждения, вместо получения W/W Irp. Сигнал пробуждения доступен только в режиме D2.
- Если данные поступают (для формирования пакета) при переходе в D2, и в очереди нет ожидающего запроса на чтение, драйвер шины может кэшировать входящие данные и перейти в D2. Затем он может успешно завершить W/W Irp, чтобы вернуть систему в состояние D0 для повторной отправки и завершения запроса на чтение.
- Bthport отменяет все запросы на чтение, находящиеся в ожидании, и ожидает их завершения перед вводом D2. В то же время драйвер последовательной шины, возможно, получил полный пакет HCI и извлёк запрос на чтение, чтобы вернуть этот пакет HCI. Драйвер последовательной шины должен завершить этот запрос, а затем перейдёт в состояние D2.
Действие, инициированное Bluetooth-приложением на стороне хоста, также может вывести стек из состояния простоя. В этом случае требуется только переход состояния питания устройства, и это действие инициируется основным драйвером Bluetooth.
Чтобы сократить время включения, функции обратного вызова (например, EnterD0 и wake) в драйвере последовательной шины не должны быть помечены как страничные.
Блок-схема для отображения состояний простоя и пробуждения, включения/выключения и переходов состояний питания устройства
Ниже приведена упрощенная блок-схема для иллюстрации типичной последовательности и логики для поддержки простоя и пробуждения. Эта логика охватывает множество драйверов и потоков, и есть исключения, а также крайние случаи, которые не описаны (например, приложение на стороне хоста также может пробудить стек из состояния простоя).
Управление собственным питанием шины
Драйвер последовательной шины — это драйвер функции (FD) и владелец политики питания (PPO) его слоя. Таким образом, ему необходимо самостоятельно управлять питанием. После того как все его дочерние элементы вошли в более низкие состояния питания устройства, он может затем войти в более низкое состояние энергопотребления. Когда он готов ввести это состояние меньшей мощности, он может отменить все ожидающие запросы ввода-вывода к драйверу контроллера UART. Это позволяет драйверу UART также ввести более низкое состояние питания. Однако драйвер UART должен сохранять и восстанавливать параметры устройства (включая частоту baud), когда его состояние питания позже возобновляется до активного.