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


Дескрипторы объектов SpbCx

В этом разделе описываются дескрипторы объектов, определенные для библиотеки расширения платформы SPB (SpbCx).

Кроме того, DDI SerCx2 использует два универсальных типа дескрипторов объектов WDFDEVICE и WDFREQUEST, которые определены платформой Kernel-Mode Driver Framework (KMDF). Дополнительные сведения о типах дескрипторов платформы см. в разделе Сводка по объектам платформы.

В этом разделе описываются следующие дескрипторы объектов:

Заголовок: Spbcx.h

Дескриптор объекта SPBREQUEST

Дескриптор объекта SPBREQUEST представляет запрос ввода-вывода, выданный целевому устройству в шине.

DECLARE_HANDLE(SPBREQUEST)

Класс объектов SPBREQUEST является производным от класса объектов WDFREQUEST , который представляет запрос ввода-вывода, отправляемый диспетчером ввода-вывода. Таким образом, методы WdfRequestXxx, которые принимают значения дескрипторов WDFREQUEST в качестве параметров, принимают значения дескрипторов SPBREQUEST в качестве допустимых значений параметров. Дополнительные сведения об этих методах см. в разделе Объекты запросов платформы.

Однако некоторые методы SpbCx и функции обратного вызова требуют дескрипторов SPBREQUEST в качестве параметров. Для такого параметра замена дескриптора WDFREQUEST , который также не является дескриптором SPBREQUEST , является ошибкой.

Например, метод SpbRequestGetTransferParameters принимает дескриптор SPBREQUEST в качестве параметра. Для этого параметра дескриптор WDFREQUEST , который также не является дескриптором SPBREQUEST , является ошибкой. Это требование связано с тем, что объект SPBREQUEST должен хранить дополнительные сведения о состоянии, относящиеся к SPB, для поддержки последовательностей передачи операций ввода-вывода. Базовый класс объектов WDFREQUEST не обеспечивает эту поддержку.

Во время инициализации устройства драйвер контроллера SPB может назначать контекст для каждого запроса дескриптору SPBREQUEST , вызывая метод SpbControllerSetRequestAttributes .

Дескриптор объекта SPBTARGET

Дескриптор объекта SPBTARGET идентифицирует логическое подключение клиента (драйвера периферийных устройств) к адресуемому порту или периферийным устройствам в шине.

DECLARE_HANDLE(SPBTARGET)

Для шины I2C дескриптор SPBTARGET соответствует определенному адресу устройства.
Для шины SPI дескриптор SPBTARGET соответствует строке выбора устройства.

Как правило, объект SPBTARGET существует от начала обратного вызова события EvtSpbTargetConnect до конца соответствующего обратного вызова события EvtSpbTargetDisconnect . Однако время существования объекта SPBTARGET может выйти за пределы второго обратного вызова, если драйвер контроллера SPB принимает дополнительную ссылку на объект SPBTARGET , чтобы предотвратить неожиданное исчезновение объекта во время обработки запроса ввода-вывода для целевого объекта.

Драйвер контроллера SPB выполняет все аппаратные операции для устройства контроллера SPB. Когда клиент отправляет IRP_MJ_CREATE запрос на открытие подключения к целевому объекту в шине, расширение платформы SPB (SpbCx), которое управляет очередью ввода-вывода для драйвера контроллера, передает этот запрос драйверу контроллера SPB, вызывая функцию обратного вызова EvtSpbTargetConnect этого драйвера. Этот параметр Target этой функции является дескриптором SPBTARGET . Функция может использовать этот дескриптор для получения сведений о ресурсе подключения (например, адрес устройства) из диспетчера PnP. Когда клиент отправляет IRP_MJ_CLOSE запрос на закрытие подключения, SpbCx передает этот запрос функции обратного вызова EvtSpbTargetDisconnect драйвера контроллера SPB, которая освобождает эти ресурсы.

Доступ Exclusive-Mode

Клиенты имеют монопольный режим для доступа к целевым устройствам. Только один клиент может иметь подключение к определенному целевому устройству одновременно. SpbCx гарантирует, что для адреса целевого устройства в шине существует только один дескриптор SPBTARGET . Это ограничение необходимо, так как SpbCx не поддерживает чередование запросов ввода-вывода, отправляемых двумя или более клиентами на целевое устройство. Если целевое устройство должно иметь возможность получать запросы от нескольких клиентов, для этого устройства требуется драйвер MUX отдельно от драйвера контроллера, который может правильно чередовать запрошенные операции.

Взаимодействие с KMDF

Методы поддержки драйвера SerCx2 и функции обратного вызова событий SpbCx, определенные SpbCx, используют дескрипторы SPBTARGET для представления открытых подключений к целевым устройствам в шине. Однако драйвер контроллера обычно должен вызывать методы KMDF, которым требуются дескрипторы WDFFILEOBJECT вместо дескрипторов SPBTARGET для назначения целевых устройств.

Объект SPBTARGET аналогичен объекту WDFFILEOBJECT. Однако объект SPBTARGET содержит дополнительные сведения, относящиеся к SPB. Например, во время обработки запроса IOCTL_SPB_EXECUTE_SEQUENCE управления вводом-выводом объект SPBTARGET для целевого устройства отслеживает состояние передачи в последовательности передачи ввода-вывода.

Чтобы получить дескриптор WDFFILEOBJECT для целевого объекта, драйвер контроллера SPB вызывает метод SpbTargetGetFileObject . Этот метод принимает в качестве входного параметра дескриптор SPBTARGET на открытое целевое устройство и возвращает соответствующий дескриптор WDFFILEOBJECT этому целевому объекту.

В соответствии с соглашениями KMDF драйвер контроллера SPB может присоединять собственный контекст к объекту SPBTARGET для целевого устройства, и этот контекст может включать связанные функции обратного вызова EvtCleanupCallback и EvtDesphereCallback . Драйвер контроллера SPB использует этот контекст для отслеживания сведений, относящихся к драйверу контроллера и целевому устройству. Кроме того, этот драйвер может создавать дочерние объекты объекта SPBTARGET , такие как таймеры, DPC или при необходимости запросы ввода-вывода и очереди ввода-вывода.