Общие сведения о транзакциях ввода-вывода SerCx2
SerCx2 обрабатывает запрос на чтение или запись от клиента путем выдачи одной или нескольких транзакций ввода-вывода драйверу последовательного контроллера. Этот драйвер обрабатывает каждую транзакцию как автономную операцию ввода-вывода, которая передает данные между последовательным контроллером и буфером данных в запросе.
Система на кристалле (SoC) часто включает последовательные контроллеры (или UARTs) для обеспечения высокоскоростной последовательной связи с другими интегральными схемами, которые припаяны на той же печатной плате. Процессоры этих СОК могут использовать программируемый ввод-вывод (PIO) для непосредственной передачи данных в регистры данных, сопоставленные с памятью, или из них в этих последовательных контроллерах. Кроме того, эти soCs обычно предоставляют расширенное оборудование DMA для перемещения данных между последовательными контроллерами и памятью.
Использование PIO может быть достаточно для короткой передачи данных, но при более длительных передачах данных на высоких скоростях передачи это накладывает слишком большую нагрузку на процессор. DMA требуется для разгрузки таких передач данных от процессора.
Типы транзакций ввода-вывода
SerCx2 определяет следующие три общих типа транзакций ввода-вывода:
- PIO
- Система DMA
- Обычай
Все драйверы последовательного контроллера должны поддерживать транзакции ввода-вывода, использующие ПИО для передачи данных. Драйвер последовательного контроллера также может поддерживать транзакции ввода-вывода, использующие системную DMA или настраиваемый механизм передачи данных в зависимости от возможностей последовательного контроллера и связанного оборудования. Драйвер может поддерживать либо системные транзакции DMA, либо пользовательские транзакции, но не оба.
Для каждого типа транзакции ввода-вывода, поддерживаемой оборудованием последовательного контроллера, драйвер последовательного контроллера регистрирует пакет поддержки в SerCx2. Этот пакет описывает соответствующие аппаратные возможности и включает в себя набор функций обратного вызова событий, реализованных драйвером, которые SerCx2 вызывает для запуска и управления этим типом транзакции ввода-вывода.
Если последовательный контроллер может использовать системный контроллер DMA, который может использоваться другими устройствами, драйвер последовательного контроллера может поддерживать системные транзакции DMA. Для этих транзакций SerCx2 настраивает системный контроллер DMA и инициирует передачу DMA. Драйвер последовательного контроллера относительно мало работает во время транзакций DMA системы.
Если последовательный контроллер имеет некоторый пользовательский механизм аппаратного обеспечения для передачи данных, драйвер последовательного контроллера может поддерживать пользовательские транзакции, использующие этот механизм. Например, если оборудование последовательного контроллера имеет встроенную возможность шины-мастера DMA, драйвер последовательного контроллера может поддерживать пользовательские транзакции, чтобы сделать эту возможность доступной для SerCx2.
Пользовательские транзакции являются гибкими с точки зрения типов механизмов передачи данных, которые они могут поддерживать. Однако эти транзакции сложнее реализовать, чем транзакции PIO или системные транзакции DMA. Для поддержки пользовательских транзакций драйвер последовательного контроллера должен обычно настраивать и инициализировать оборудование, используемое для передачи данных. Кроме того, если ожидающий запрос на чтение или запись отменен до завершения связанной пользовательской транзакции приема или передачи, драйвер должен завершить транзакцию и закрыть запрос.
Каждая транзакция ввода-вывода является относительно простой операцией. Транзакция ввода-вывода либо считывает данные из последовательного контроллера, либо записывает данные в контроллер, и никогда не смешает операции чтения и записи. Транзакция ввода-вывода использует один режим передачи — PIO, системный DMA или настраиваемый— и никогда не смешивает режимы передачи.
SerCx2 может интеллектуально решить, следует ли использовать PIO или DMA для удовлетворения запроса на чтение или запись. Например, SerCx2 может предоставить очень короткий запрос на чтение или запись в драйвер последовательного контроллера в качестве транзакции PIO. Кроме того, SerCx2 может представлять более длительный запрос на чтение или запись в последовательный контроллер в виде транзакции DMA.
Разбиение запроса на чтение или запись на несколько транзакций
Некоторые системные контроллеры DMA могут иметь ограничения, требующие от SerCx2 разделения длительного запроса на чтение или запись на две или более транзакции ввода-вывода. Например, если системный контроллер DMA требует, чтобы передачи DMA начинались и заканчивались на чётных границах байтов в памяти, но буфер данных в запросе на чтение начинается и заканчивается на нечётных границах байтов, SerCx2 может использовать PIO для передачи первого и последнего байта в буфер и использовать системный DMA для передачи всей последовательности данных между первым и последним байтом. В этом примере SerCx2 выдает следующие три транзакции ввода-вывода драйверу последовательного контроллера в указанном порядке:
- Транзакция приема PIO для первого байта.
- Транзакция приема системы передачи данных DMA для межбайтовых данных.
- Транзакция приемки PIO для последнего байта.
Аналогичным образом, если настраиваемый механизм передачи данных может запустить и завершить пользовательскую транзакцию передачи на произвольной границе байтов в памяти, но размер буфера в запросе на запись превышает максимальную длину передачи транзакции пользовательской передачи, SerCx2 секционирует запрос на запись в две (или более) пользовательских транзакций передачи, каждый из которых не превышает максимальную длину передачи.
Если SerCx2 должен разделить запрос на чтение или запись на два или более транзакций ввода-вывода, драйвер последовательного контроллера может безопасно игнорировать связь этих транзакций друг с другом и запросом. SerCx2 сериализует транзакции, чтобы гарантировать, что данные получены или передаются в правильном порядке.
Когда драйвер последовательного контроллера регистрирует набор функций обратного вызова для поддержки транзакций системы DMA или пользовательских транзакций, драйвер предоставляет значения параметров, описывающие возможности оборудования, которое будет выполнять эти транзакции. Например, для транзакций system-DMA параметры включают требования к выравниванию, а также минимальную и максимальную длину передачи, которую поддерживает контроллер DMA системы. SerCx2 использует эти параметры, чтобы решить, следует ли обрабатывать запрос на чтение или запись в виде транзакции PIO или транзакции dMA системы, а также разделить запрос на два или более транзакций ввода-вывода.
Однако последовательный контроллер может иметь специальные аппаратные возможности, которые не могут быть должным образом описаны параметрами, которые драйвер последовательного контроллера предоставляет SerCx2. Таким образом, драйвер может иметь доступ к данным, зависящим от оборудования, что позволяет драйверу принимать лучшие решения, чем SerCx2 о том, как секционировать запрос на чтение или запись в одну или несколько транзакций ввода-вывода. В качестве опции, такой драйвер может реализовать функции обратного вызова событий EvtSerCx2SelectNextReceiveTransactionType и EvtSerCx2SelectNextTransmitTransactionType. SerCx2 вызывает эти функции, если они реализованы, чтобы разрешить драйверу решить, какие транзакции ввода-вывода следует использовать для удовлетворения запроса на чтение или запись.