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


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

SerCx2 требует, чтобы все драйверы последовательных контроллеров реализовали поддержку транзакций передачи, использующих запрограммированные операции ввода-вывода (PIO). Чтобы запустить транзакцию передачи PIO, SerCx2 вызывает функцию обратного вызова события EvtSerCx2PioTransmitWriteBuffer драйвера и предоставляет буфер записи в качестве параметра.

Во время этого вызова функция EvtSerCx2PioTransmitWriteBuffer передает данные из буфера записи в передающий FIFO на оборудовании последовательного контроллера. Эта передача данных продолжается до тех пор, пока буфер записи не пуст, или fiFO передачи не сможет немедленно принять дополнительные данные. После завершения передачи функция возвращает количество байтов, которые были успешно переданы из буфера записи в FIFO.

Создание объекта pio-передачи

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

Драйвер необходим для реализации всех трех следующих функций:

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

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

Если драйвер реализует какую-либо функцию из предыдущего списка, он должен реализовать все три.

Метод SerCx2PioTransmitCreate создает объект PIO-передачи и предоставляет вызывающму драйверу дескриптор SERCX2PIOTRANSMIT этому объекту. Функции EvtSerCx2PioTransmitXxx** драйвера принимают этот дескриптор в качестве первого параметра. Следующие методы SerCx2 принимают этот дескриптор в качестве первого параметра:

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

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

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

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

Очистка и очистка передачи FIFO

Драйвер последовательного контроллера должен реализовать функцию обратного вызова события EvtSerCx2PioTransmitDrainFifo , если драйвер может определить, когда fifo передачи очищается. Если эта функция реализована, SerCx2 вызывает эту функцию после записи последнего байта данных в транзакции PIO-передачи в fifo передачи. Во время этого вызова функция EvtSerCx2PioTransmitDrainFifo обычно активирует прерывание при очистке fiFO передачи, а затем возвращается без ожидания. Когда FIFO очищается, драйвер вызывает метод SerCx2PioTransmitDrainFifoComplete для уведомления SerCx2. Только после получения этого уведомления SerCx2 завершает ожидающий запрос на запись (IRP_MJ_WRITE), связанный с транзакцией передачи личных сведений.

Если драйвер последовательного контроллера не реализует функцию EvtSerCx2PioTransmitDrainFifo , SerCx2 должен завершить ожидающий запрос на запись без предварительной проверки очистки fiFO передачи. Нет никакой гарантии, что данные, записанные в FIFO, будут передаваться без значительной задержки. Все данные, остающиеся в FIFO после выполнения запроса на запись, могут быть потеряны перед передачей. Эта непредвиденная потеря данных в успешно завершенном запросе на запись может создать проблемы с надежностью для периферийного драйвера, отправляющего запрос.

Драйвер, реализующий функцию EvtSerCx2PioTransmitDrainFifo , также должен реализовывать функции обратного вызова событий EvtSerCx2PioTransmitCancelDrainFifo и EvtSerCx2PioTransmitPurgeFifo .

Функция EvtSerCx2PioTransmitCancelDrainFifo позволяет SerCx2 отменить текущую операцию стока FIFO до ее завершения. SerCx2 может отменить эту операцию, если время ожидания запроса на запись истекает или отменено. Если функция EvtSerCx2PioTransmitCancelDrainFifo успешно отменяет операцию fifo-стока, эта функция возвращает значение TRUE. Возвращаемое значение TRUE гарантирует, что драйвер последовательного контроллера не вызывал и не будет вызывать SerCx2PioTransmitDrainFifoComplete. Возвращаемое значение FALSE указывает, что функция EvtSerCx2PioTransmitDrainFifo вызвала или вскоре вызовет SerCx2PioTransmitDrainFifoComplete.

Если запрос на запись, связанный с транзакцией pio-transfer, отменяется или истекает до завершения, SerCx2 вызывает функцию EvtSerCx2PioTransmitPurgeFifo , если она реализована, чтобы отменить все неотправленные данные, которые могут остаться при передаче FIFO. SerCx2 использует сведения, полученные от этой функции, чтобы сообщить периферийной драйверу, сколько байтов данных были успешно переданы на периферийное устройство в запросе на запись.

Готовые уведомления

Когда вызов EvtSerCx2PioTransmitWriteBuffer завершается из-за того, что передача FIFO не может немедленно принять дополнительные данные, SerCx2 приходится ждать завершения транзакции получения PIO, пока позже FIFO не будет готов принять дополнительные данные. В этом случае SerCx2 вызывает функцию обратного вызова события EvtSerCx2PioTransmitEnableReadyNotification , чтобы разрешить драйверу последовательного контроллера отправлять готовое уведомление. Если это уведомление включено, драйвер последовательного контроллера вызывает метод SerCx2PioTransmitReady , чтобы уведомить SerCx2, когда драйвер обнаруживает, что FIFO передачи готов принять дополнительные данные. В ответ на это уведомление SerCx2 вызывает функцию EvtSerCx2PioTransmitWriteBuffer для записи дополнительных данных в FIFO.

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