Транзакции Передачи Системы DMA-SerCx2
Некоторые драйверы последовательных контроллеров реализуют поддержку транзакций передачи, использующих системный контроллер DMA. Такая поддержка необязательна, но может повысить производительность, освободив процессор main необходимости использовать запрограммированные операции ввода-вывода (PIO) для длительной передачи данных. SerCx2 выполняет транзакцию system-DMA-передачи, настраивая системный контроллер DMA и инициируя необходимые передачи DMA от имени драйвера последовательного контроллера.
Когда драйвер последовательного контроллера создает объект передачи system-DMA, драйвер предоставляет параметры, которые SerCx2 будет использовать для настройки системного адаптера DMA для транзакций передачи system-DMA.
Перед началом транзакции драйвер последовательного контроллера может выполнить любую специальную настройку оборудования последовательного контроллера или адаптера DMA, которые могут потребоваться для транзакции. После завершения транзакции драйвер имеет возможность истощить передачу FIFO и при необходимости очистить состояние оборудования последовательного контроллера.
Создание объекта system-DMA-transmit
Прежде чем SerCx2 сможет вызвать любую из функций EvtSerCx2SystemDmaTransmitXxx** драйвера последовательного контроллера, драйвер должен вызвать метод SerCx2SystemDmaTransmitCreate , чтобы зарегистрировать эти функции в SerCx2. Этот метод принимает в качестве входного параметра указатель на структуру SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG , содержащую указатели на функции EvtSerCx2SystemDmaTransmitXxx** драйвера.
В качестве варианта драйвер может реализовать любые или все из следующих функций:
- EvtSerCx2SystemDmaTransmitInitializeTransaction
- EvtSerCx2SystemDmaTransmitCleanupTransaction
- EvtSerCx2SystemDmaTransmitConfigureDmaChannel
В качестве варианта драйвер может реализовать следующие функции:
- EvtSerCx2SystemDmaTransmitDrainFifo
- EvtSerCx2SystemDmaTransmitCancelDrainFifo
- EvtSerCx2SystemDmaTransmitPurgeFifo
Драйвер, реализующий любую из функций из предыдущего списка, должен реализовывать все три.
Метод SerCx2SystemDmaTransmitCreate создает объект system-DMA-transfer и предоставляет вызывающму драйверу дескриптор SERCX2SYSTEMDMATRANSMIT этому объекту. Функции EvtSerCx2SystemDmaTransmitXxx** драйвера принимают этот дескриптор в качестве первого параметра. Следующие методы SerCx2 принимают этот дескриптор в качестве первого параметра:
- SerCx2SystemDmaTransmitDrainFifoComplete
- SerCx2SystemDmaTransmitPurgeFifoComplete
- SerCx2SystemDmaTransmitInitializeTransactionComplete
- SerCx2SystemDmaTransmitCleanupTransactionComplete
- SerCx2SystemDmaTransmitGetDmaEnabler
Инициализация и очистка оборудования
Некоторым драйверам последовательных контроллеров может потребоваться инициализировать оборудование последовательного контроллера в начале транзакции system-DMA-transmit или очистить аппаратное состояние последовательного контроллера в конце транзакции.
Если драйвер реализует функцию обратного вызова события EvtSerCx2SystemDmaTransmitInitializeTransaction , SerCx2 вызывает эту функцию для инициализации последовательного контроллера перед началом первой передачи DMA в транзакции. При реализации функция EvtSerCx2SystemDmaTransmitInitializeTransaction должна вызвать метод SerCx2SystemDmaTransmitInitializeTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит инициализацию последовательного контроллера.
Если драйвер реализует функцию обратного вызова события EvtSerCx2SystemDmaTransmitCleanupTransaction , SerCx2 вызывает эту функцию для очистки состояния оборудования после завершения окончательной передачи DMA в транзакции. При реализации функция EvtSerCx2SystemDmaTransmitInitializeTransaction должна вызвать метод SerCx2SystemDmaTransmitCleanupTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит очистку последовательного контроллера.
Драйвер последовательного контроллера, который должен выполнять любую специальную настройку контроллера DMA системы в начале транзакции system-DMA-transfer, должен реализовывать функцию обратного вызова события EvtSerCx2SystemDmaTransmitConfigureDmaChannel . Эта функция может вызвать метод SerCx2SystemDmaTransmitGetDmaEnabler , чтобы получить средство включения DMA для системного адаптера DMA, используемого для транзакции. SerCx2 вызывает эту функцию перед началом первой передачи DMA в транзакции. Дополнительные сведения о активировщиках DMA см. в разделе Включение транзакций DMA.
Очистка и очистка передачи FIFO
Драйвер последовательного контроллера, поддерживающий транзакции передачи system-DMA, должен реализовывать функцию обратного вызова события EvtSerCx2SystemDmaTransmitDrainFifo , если драйвер может определить, когда передача FIFO очищается. При реализации SerCx2 вызывает эту функцию после записи последнего байта данных в транзакции system-DMA-transmit в fiFO передачи. Во время этого вызова функция EvtSerCx2SystemDmaTransmitDrainFifo обычно включает прерывание, которое активируется при очистке fiFO передачи, а затем возвращается без ожидания прерывания. Когда FIFO очищается, драйвер вызывает метод SerCx2SystemDmaTransmitDrainFifoComplete для уведомления SerCx2. Только после получения этого уведомления SerCx2 завершает ожидающий запрос записи (IRP_MJ_WRITE), связанный с транзакцией system-DMA-transmit.
Если драйвер последовательного контроллера не реализует функцию EvtSerCx2SystemDmaTransmitDrainFifo , SerCx2 должен завершить ожидающий запрос на запись без предварительной проверки очистки fiFO передачи. Нет никакой гарантии, что данные, записанные в FIFO, будут передаваться без значительной задержки. Все данные, остающиеся в FIFO после выполнения запроса на запись, могут быть потеряны перед передачей. Эта непредвиденная потеря данных в успешно завершенном запросе на запись может создать проблемы с надежностью для периферийного драйвера, отправляющего запрос.
Драйвер, реализующий функцию EvtSerCx2SystemDmaTransmitDrainFifo , также должен реализовывать функции обратного вызова событий EvtSerCx2SystemDmaTransmitCancelDrainFifo и EvtSerCx2SystemDmaTransmitPurgeFifo .
Функция EvtSerCx2SystemDmaTransmitCancelDrainFifo позволяет SerCx2 отменить текущую операцию стока FIFO до ее завершения. SerCx2 может отменить эту операцию, если запрос на запись отменен или если последовательный контроллер выходит из состояния питания устройства D0, чтобы перейти в состояние с низким энергопотреблением. Если функция EvtSerCx2SystemDmaTransmitCancelDrainFifo успешно отменяет операцию fifo-стока, эта функция возвращает значение TRUE. Возвращаемое значение TRUE гарантирует, что функция EvtSerCx2SystemDmaTransmitDrainFifo возвращается без предварительного вызова SerCx2SystemDmaTransmitDrainFifoComplete. Возвращаемое значение FALSE указывает, что функция EvtSerCx2SystemDmaTransmitDrainFifo вызвала или вызовет SerCx2SystemDmaTransmitDrainFifoComplete.
Если запрос на запись, связанный с транзакцией system-DMA-transfer, отменен или истекает до его завершения, SerCx2 вызывает функцию EvtSerCx2SystemDmaTransmitPurgeFifo , если она реализована, чтобы отменить все неотправленные данные, которые могут остаться при передаче FIFO. При очистке FIFO функция EvtSerCx2SystemDmaTransmitPurgeFifo вызывает метод SerCx2SystemDmaTransmitPurgeFifoComplete для уведомления SerCx2. Только после получения этого уведомления SerCx2 запускает новую транзакцию ввода-вывода.