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


Использование интерфейса запроса ввода-вывода spB

Начиная с Windows 8 расширение платформы SPB (SpbCx) — это системный компонент, поддерживающий интерфейс запроса ввода-вывода SPB. Драйверы периферийных устройств SPB используют этот интерфейс для отправки запросов ввода-вывода на устройства, подключенные к I²C, SPI и другим простым периферийным автобусам (SPBS). Благодаря стандартизированному интерфейсу запросов ввода-вывода, доступному в различных типах шин, SpbCx упрощает задачу обеспечения поддержки драйверов для семейства периферийных устройств на различных аппаратных платформах и контроллерах SPB от разных поставщиков оборудования.

Если выполнены следующие условия, поставщик оборудования для подключенного к SPB периферийного устройства может разработать один драйвер устройства, который может работать в нескольких типах шин:

  • Периферийное устройство должно быть совместимо с этими автобусами.
  • Драйвер может использовать одни и те же протоколы управления устройствами во всех этих типах шин.

Устраняя код для конкретной шины от периферийных драйверов, расширение платформы SPB сокращает время разработки для этих драйверов и обеспечивает более согласованное поведение в поддерживаемых типах шин.

Периферийные устройства, подключенные к SPB, не сопоставлены с памятью, и драйверы для этих устройств не могут напрямую получить доступ к регистрам оборудования этих устройств. Вместо этого драйвер периферийных устройств SPB должен полагаться на контроллер SPB для последовательной передачи данных на устройство и с него. Чтобы запросить такой перенос, драйвер должен отправить запрос ввода-вывода на устройство. Этот запрос ввода-вывода отправляется в очередь, управляемую spbCx.

SpbCx взаимодействует с драйвером контроллера SPB для обработки запросов ввода-вывода от драйверов. Поставщик оборудования для контроллера SPB предоставляет драйвер контроллера SPB для выполнения задач, относящихся к оборудованию контроллера.

Только драйверы могут отправлять запросы ввода-вывода в интерфейс запроса ввода-вывода контроллера SPB. Приложения не могут напрямую отправлять запросы ввода-вывода контроллеру SPB. Вместо этого приложение может отправлять запросы ввода-вывода драйверу для подключенного к spB периферийного устройства, а затем полагаться на драйвер для отправки контроллера spB любых запросов ввода-вывода, которые могут потребоваться для передачи данных на устройство или с устройства.

Прежде чем драйвер сможет отправлять запросы ввода-вывода на периферийное устройство, подключенное к spB, драйвер должен открыть логическое подключение к устройству. Чтобы открыть это подключение, драйвер использует идентификатор подключения, полученный в качестве аппаратного ресурса из диспетчера самонастраивающийся. Дополнительные сведения см. в Подключение идентификаторах для периферийных устройств SPB.

SpbCx и драйвер контроллера SPB совместно обрабатывают запросы на чтение и запись периферийных устройств, подключенных к SPB. В ответ на запрос IRP_MJ_READ контроллер SPB передает указанное количество байтов из периферийного устройства в предоставленный драйвером буфер. В ответ на запрос IRP_MJ_WRITE контроллер SPB передает указанное количество байтов из буфера, предоставленного драйвером, на периферийное устройство.

Для запроса IRP_MJ_READ или IRP_MJ_WRITE для передачи нулевых байтов SpbCx завершает запрос с кодом состояния STATUS_SUCCESS, но не выполняет никаких операций.

SpbCx и драйвер контроллера SPB также обрабатывают эти коды управления ввода-вывода для конкретного пакета обновления (IOCTLs):

Драйвер периферийных устройств SPB использует эти операции ввода-вывода для выполнения последовательностей передачи ввода-вывода. Последовательность передачи ввода-вывода — это упорядоченный набор операций передачи шин (операций чтения и записи), выполняемых как единая атомарная шина. Дополнительные сведения об этих ioCTLs см. в разделе "Последовательности передачи операций ввода-вывода".

Драйвер контроллера SPB для определенного контроллера SPB может поддерживать пользовательские ioCTLs, выполняющие аппаратные функции. Это ioCTLs, которые spbCx не обрабатывает и что поставщик оборудования для контроллера SPB поддерживает преимущества драйверов периферийных устройств SPB, которые должны выполнять аппаратные операции. Если драйвер периферийных устройств SPB отправляет IOCTL, который ни spbCx, ни драйвер контроллера SPB распознает, операция не выполняется, и запрос ввода-вывода завершается со значением состояния ошибки STATUS_NOT_SUPPORTED.

Драйвер для периферийных устройств, подключенных к SPB, обычно является драйвером среда выполнения платформы драйвера режима пользователя (UMDF) или драйвером платформы драйверов в режиме ядра (KMDF). Чтобы отправить запрос на чтение, запись или IOCTL на периферийное устройство, подключенное к SPB, драйвер UMDF вызывает метод, например IWDFIoRequest::Send. Драйвер KMDF вызывает метод, например WdfIoTargetSendReadSynchronously, WdfIoTargetSendWriteSynchronously или WdfIoTargetSendIoctlSynchronously.

Примеры кода, демонстрирующие отправку запросов ввода-вывода на периферийные устройства, подключенные к spB, см. в следующих разделах:

Аппаратные ресурсы для периферийных драйверов SPB в режиме пользователя

Аппаратные ресурсы для периферийных драйверов SPB в режиме ядра