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


Транзакции Custom-Transmit SerCx2

Некоторые устройства последовательного контроллера могут реализовать механизм передачи данных, отличный от PIO или системного DMA, для записи данных в последовательный контроллер. Драйвер последовательного контроллера может поддерживать пользовательские транзакции передачи, чтобы сделать этот механизм передачи данных доступным для использования SerCx2.

Чтобы запустить пользовательскую транзакцию передачи, SerCx2 вызывает функцию обратного вызова события EvtSerCx2CustomTransmitTransactionStart драйвера и предоставляет в качестве параметров запрос на запись (IRP_MJ_WRITE) и описание буфера записи для транзакции. В этом вызове функция инициирует транзакцию и возвращает . Затем драйвер отвечает за завершение транзакции и выполнение запроса на запись.

Создание пользовательского объекта передачи

Прежде чем SerCx2 сможет вызвать любую из функций EvtSerCx2CustomTransmitTransactionXxx** драйвера последовательного контроллера, драйвер должен вызвать метод SerCx2CustomTransmitTransactionCreate , чтобы зарегистрировать эти функции в SerCx2. Этот метод принимает в качестве входного параметра указатель на структуру SERCX2_CUSTOM_TRANSMIT_TRANSACTION_CONFIG , содержащую указатели на функции Драйвера EvtSerCx2CustomTransmitTransmitTransactionXxx**.

Драйвер должен реализовать следующую функцию:

В качестве варианта драйвер может реализовать одну или обе из следующих функций:

Метод SerCx2CustomTransmitTransactionCreate создает объект пользовательской передачи и предоставляет вызывающий драйвер дескриптор SERCX2CUSTOMTRANSMITTRANSACTION этому объекту. Функции EvtSerCx2CustomTransmitTransactionXxx** драйвера принимают этот дескриптор в качестве первого параметра. Следующие методы SerCx2 принимают этот дескриптор в качестве первого параметра:

Инициализация и очистка оборудования

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

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

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

Доступ к объекту запроса

Чтобы запустить пользовательскую транзакцию передачи, SerCx2 вызывает функцию EvtSerCx2CustomTransmitTransactionStart драйвера и передает соответствующий запрос на запись (инкапсулированный в дескриптор объекта WDFREQUEST) в эту функцию в качестве параметра. Драйвер отвечает за вызов метода , например WdfRequestComplete , для выполнения этого запроса по завершении транзакции. Если запрос не может быть выполнен немедленно до возврата функции EvtSerCx2CustomTransmitTransactionStart , драйвер должен вызвать метод , например WdfRequestMarkCancelableEx , чтобы пометить запрос как отменяемый.

Драйвер последовательного контроллера не должен использовать метод, например WdfRequestRetrieveInputBuffer , для доступа к буферу данных в запросе на запись. Вместо этого драйвер должен использовать значения параметров Mdl, Offset и Length , передаваемые функции EvtSerCx2CustomTransmitTransactionStart для доступа к этому буферу.

Во время пользовательской передачи транзакции драйверу может потребоваться хранить сведения о транзакции в контексте, присоединенном к объекту запроса. В этом случае функция обратного вызова события EvtDriverDeviceAdd драйвера может вызвать метод WdfDeviceInitSetRequestAttributes , чтобы задать атрибуты, используемые для объектов запроса. Эти атрибуты включают имя и размер выделения, используемые для контекстов запросов. Атрибуты запроса, указанные в этом вызове, должны соответствовать атрибутам запроса, указанным драйвером в вызове метода SerCx2InitializeDevice . Эти атрибуты указываются в элементе RequestAttributesструктуры SERCX2_CONFIG , которую драйвер передает в SerCx2InitializeDevice. Дополнительные сведения см. в разделе SERCX2_CONFIG.

Для запроса на запись, который драйвер последовательного контроллера получает в начале пользовательской транзакции передачи, контекст запроса, выделенный платформой драйвера, не инициализируется. Драйвер должен, как правило, вызвать подпрограмму RtlZeroMemory , чтобы инициализировать этот контекст запроса для всех нулей.