Транзакции получения системы DMA SerCx2
Некоторые драйверы последовательных контроллеров реализуют поддержку транзакций получения, использующих системный контроллер DMA. Такая поддержка необязательна, но может повысить производительность, освободив процессор main необходимости использовать запрограммированные операции ввода-вывода (PIO) для длительной передачи данных. SerCx2 выполняет транзакцию получения системы DMA, настроив системный контроллер DMA и инициируя необходимые передачи DMA от имени драйвера последовательного контроллера.
Когда драйвер последовательного контроллера создает объект получения system-DMA, драйвер предоставляет параметры, которые SerCx2 будет использовать для настройки системного адаптера DMA для транзакций получения системы DMA.
Перед началом транзакции получения system-DMA драйвер последовательного контроллера может выполнить любую специальную настройку оборудования последовательного контроллера или адаптера DMA, которые могут потребоваться для транзакции. После завершения транзакции драйвер может при необходимости выполнить любую очистку аппаратного состояния последовательного контроллера, которая может потребоваться.
Создание объекта получения system-DMA
Прежде чем SerCx2 сможет вызвать любую из функций EvtSerCx2SystemDmaReceiveXxx** драйвера последовательного контроллера, драйвер должен вызвать метод SerCx2SystemDmaReceiveCreate , чтобы зарегистрировать эти функции в SerCx2. Этот метод принимает в качестве входного параметра указатель на структуру SERCX2_SYSTEM_DMA_RECEIVE_CONFIG , содержащую указатели на функции EvtSerCx2SystemDmaReceiveXxx** драйвера.
В качестве варианта драйвер может реализовать любые или все из следующих функций:
- EvtSerCx2SystemDmaReceiveInitializeTransaction
- EvtSerCx2SystemDmaReceiveCleanupTransaction
- EvtSerCx2SystemDmaReceiveConfigureDmaChannel
В качестве варианта драйвер может реализовать следующие две функции:
- EvtSerCx2SystemDmaReceiveEnableNewDataNotification
- EvtSerCx2SystemDmaReceiveCancelNewDataNotification
Драйвер, реализующий одну из двух функций из предыдущего списка, должен реализовывать обе функции.
Метод SerCx2SystemDmaReceiveCreate создает объект system-DMA-receive и предоставляет вызывающму драйверу дескриптор SERCX2SYSTEMDMARECEIVE для этого объекта. Функции EvtSerCx2SystemDmaReceiveXxx** драйвера принимают этот дескриптор в качестве первого параметра. Следующие методы SerCx2 принимают этот дескриптор в качестве первого параметра:
- SerCx2SystemDmaReceiveNewDataNotification
- SerCx2SystemDmaReceiveInitializeTransactionComplete
- SerCx2SystemDmaReceiveCleanupTransactionComplete
- SerCx2SystemDmaReceiveGetDmaEnabler
Инициализация и очистка оборудования
Некоторым драйверам последовательного контроллера может потребоваться инициализировать оборудование последовательного контроллера в начале транзакции приема системы DMA или очистить состояние оборудования последовательного контроллера в конце транзакции.
Если драйвер реализует функцию обратного вызова события EvtSerCx2SystemDmaReceiveInitializeTransaction , SerCx2 вызывает эту функцию для инициализации последовательного контроллера перед началом первой передачи DMA в транзакции. При реализации функция EvtSerCx2SystemDmaReceiveInitializeTransaction должна вызвать метод SerCx2SystemDmaReceiveInitializeTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит инициализацию последовательного контроллера.
Если драйвер реализует функцию обратного вызова события EvtSerCx2SystemDmaReceiveCleanupTransaction , SerCx2 вызывает эту функцию для очистки состояния оборудования после завершения окончательной передачи DMA в транзакции. При реализации функция EvtSerCx2SystemDmaReceiveInitializeTransaction должна вызвать метод SerCx2SystemDmaReceiveCleanupTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит очистку последовательного контроллера.
Драйвер последовательного контроллера, которому необходимо выполнить специальную настройку системного контроллера DMA в начале транзакции system-DMA-receive, должен реализовывать функцию обратного вызова события EvtSerCx2SystemDmaReceiveConfigureDmaChannel . Эта функция может вызвать метод SerCx2SystemDmaReceiveGetDmaEnabler , чтобы получить средство включения DMA для системного адаптера DMA, используемого для транзакции. SerCx2 вызывает эту функцию перед началом первой передачи DMA в транзакции. Дополнительные сведения о активировщиках DMA см. в разделе Включение транзакций DMA.
Уведомления о новых данных
Драйвер последовательного контроллера может реализовать функцию обратного вызова события EvtSerCx2SystemDmaReceiveEnableNewDataNotification . Если эта функция реализована, SerCx2 использует эту функцию для эффективного управления временем ожидания интервала во время обработки запросов на чтение, которые обрабатываются как транзакции получения system-DMA.
Время ожидания интервала возникает, если интервал между двумя последовательными байтами, получаемых последовательным контроллером, превышает максимальное время, указанное клиентом. Когда драйвер периферийного устройства отправляет запрос на чтение в SerCx2, интервал времени ожидания не может произойти до тех пор, пока не будет получен хотя бы один байт данных от последовательно подключенного периферийного устройства. Время между поступлением запроса на чтение и получением первого байта данных с периферийного устройства может быть значительно больше, чем время, необходимое для получения остальных данных запроса на чтение после получения первого байта. Дополнительные сведения см. в разделе SERIAL_TIMEOUTS.
SerCx2 вызывает функцию EvtSerCx2SystemDmaReceiveEnableNewDataNotification , если она реализована, чтобы включить уведомление о новых данных. Если это уведомление включено, а последовательный контроллер получает один или несколько байтов новых данных с периферийного устройства или уже содержит данные на его приеме FIFO, драйвер последовательного контроллера должен вызвать метод SerCx2SystemDmaReceiveNewDataNotification для уведомления SerCx2.
Чтобы определить возможное время ожидания интервала, SerCx2 периодически вызывает подпрограмму ReadDmaCounter системного адаптера DMA, чтобы проверка, были ли получены какие-либо данные в течение предыдущего интервала. То, как SerCx2 обнаруживает получение первого байта данных, зависит от того, реализует ли драйвер последовательного контроллера функцию EvtSerCx2SystemDmaReceiveEnableNewDataNotification . Если эта функция реализована, SerCx2 вызывает функцию для включения уведомления о новых данных и получает уведомление от драйвера при получении первого байта данных. В противном случае SerCx2 периодически вызывает ReadDmaCounter , чтобы обнаружить получение первого байта, и может потребоваться периодический пробуждение процессора для выполнения этих вызовов. Таким образом, драйвер, реализующий функцию EvtSerCx2SystemDmaReceiveEnableNewDataNotification , может снизить энергопотребление, не требуя, чтобы процессор запускался так часто.
Примечание SerCx2 использует подпрограмму ReadDmaCounter системного адаптера DMA для отслеживания времени ожидания во время транзакций получения системы DMA и транзакций передачи системы DMA. На аппаратном уровне абстракции (HAL) должна быть реализована полностью функциональная подпрограмма ReadDmaCounter для системного контроллера DMA, используемого для передачи данных в последовательный контроллер и из этого контроллера.
Драйвер последовательного контроллера, поддерживающий уведомления о новых данных для транзакций получения system-DMA, должен реализовать функцию обратного вызова события EvtSerCx2SystemDmaReceiveCancelNewDataNotification , чтобы SerCx2 мог отменить включенное уведомление new-data до его возникновения. Если уведомление о новых данных включено при отмене ожидающего запроса на чтение или при истечении общего времени ожидания, SerCx2 вызывает функцию EvtSerCx2SystemDmaReceiveCancelNewDataNotification , чтобы отменить уведомление. Если эта функция успешно отменяет ожидающее уведомление, она возвращает значение TRUE. Возвращаемое значение TRUE гарантирует, что драйвер последовательного контроллера не будет вызывать SerCx2SystemDmaReceiveNewDataNotification. Возвращаемое значение FALSE указывает, что драйвер вызвал или вскоре вызовет SerCx2SystemDmaReceiveNewDataNotification. Дополнительные сведения об общем тайм-ауте см. в разделе SERIAL_TIMEOUTS.