Обзор транзакций ввода-вывода SerCx2
SerCx2 обрабатывает запрос на чтение или запись от клиента путем выдачи одной или нескольких транзакций ввода-вывода драйверу последовательного контроллера. Этот драйвер рассматривает каждую транзакцию как автономную операцию ввода-вывода, которая передает данные между последовательным контроллером и буфером данных в запросе.
Система на микросхеме (SoC) часто включает последовательные контроллеры (или UART), чтобы обеспечить высокоскоростную последовательную связь с другими интегральными каналами, которые припаяны к той же печатной плате. Процессоры на этих soC могут использовать запрограммированные операции ввода-вывода (PIO) для прямой передачи данных в регистры данных, сопоставленных в памяти, или из них в этих последовательных контроллерах. Кроме того, эти soC обычно предоставляют расширенное оборудование DMA для перемещения данных между последовательными контроллерами и памятью.
ЛИЧНЫХ сведений может быть достаточно для короткой передачи данных, но использование PIO для более длительной передачи данных с высокой скоростью создает слишком большую нагрузку на процессор. DMA требуется для разгрузки таких передач от процессора.
Типы транзакций ввода-вывода
SerCx2 определяет следующие три основных типа транзакций ввода-вывода:
- PIO
- Системное DMA
- Особые настройки
Все драйверы последовательных контроллеров должны поддерживать транзакции ввода-вывода, использующие piO для передачи данных. Драйвер последовательного контроллера также может поддерживать транзакции ввода-вывода, использующие системное DMA или настраиваемый механизм передачи данных в зависимости от возможностей последовательного контроллера и связанного оборудования. Драйвер может поддерживать как системные транзакции DMA, так и пользовательские транзакции, но не оба.
Для каждого типа транзакций ввода-вывода, поддерживаемых оборудованием последовательного контроллера, драйвер последовательного контроллера регистрирует пакет поддержки в SerCx2. Этот пакет описывает соответствующие аппаратные возможности и включает в себя набор функций обратного вызова событий, реализованных драйвером, которые SerCx2 вызывает для инициации и управления этим типом транзакции ввода-вывода.
Если последовательный контроллер может использовать системный контроллер DMA, который может использоваться совместно с другими устройствами, драйвер последовательного контроллера может поддерживать системные транзакции DMA. Для этих транзакций SerCx2 настраивает системный контроллер DMA и инициирует передачу DMA. Драйвер последовательного контроллера выполняет относительно небольшую работу во время системных транзакций DMA.
Если последовательный контроллер имеет пользовательский аппаратный механизм для передачи данных, драйвер последовательного контроллера может поддерживать пользовательские транзакции, использующие этот механизм. Например, если оборудование последовательного контроллера имеет встроенную master шины возможность DMA, драйвер последовательного контроллера может поддерживать пользовательские транзакции, чтобы сделать эту возможность доступной для SerCx2.
Пользовательские транзакции являются гибкими с точки зрения типов механизмов передачи данных, которые они могут поддерживать. Однако эти транзакции сложнее реализовать, чем транзакции pio или системные транзакции DMA. Для поддержки пользовательских транзакций драйвер последовательного контроллера обычно должен настроить и инициализировать оборудование, используемое для передачи данных. Кроме того, если ожидающий запрос на чтение или запись отменен до завершения связанной транзакции custom-receive или custom-transmit, драйвер должен завершить транзакцию и завершить запрос.
Каждая транзакция ввода-вывода является относительно простой операцией. Транзакция ввода-вывода считывает данные из последовательного контроллера или записывает данные на контроллер и никогда не смешивает операции чтения и записи. Транзакция ввода-вывода использует один режим передачи — pio, системный DMA или пользовательский — и никогда не смешивает режимы передачи.
SerCx2 может интеллектуально решить, следует ли использовать piO или DMA для удовлетворения запроса на чтение или запись. Например, SerCx2 может представить очень короткий запрос на чтение или запись в драйвер последовательного контроллера в качестве транзакции piO. Кроме того, SerCx2 может представлять более длинный запрос на чтение или запись к последовательному контроллеру в виде транзакции DMA.
Разбиение запроса на чтение или запись на несколько транзакций
Некоторые системные контроллеры DMA могут иметь ограничения, которые требуют, чтобы SerCx2 разорвать более длинный запрос на чтение или запись на две или более транзакций ввода-вывода. Например, если системный контроллер DMA требует передачи DMA для запуска и окончания четных границ в памяти, но буфер данных в запросе на чтение начинается и заканчивается нечетными границами байтов, SerCx2 может использовать piO для передачи первого и последнего байтов в буфер, а также использовать системный DMA для передачи всех данных между первым и последним байтами. В этом примере SerCx2 выдает следующие три транзакции ввода-вывода драйверу последовательного контроллера в указанном порядке:
- Транзакция получения личных сведений для первого байта.
- Транзакция получения system-DMA для между байтами.
- Транзакция получения личных сведений для последнего байта.
Аналогичным образом, если пользовательский механизм передачи данных может запускать и завершать транзакцию настраиваемой передачи на произвольной границе байтов в памяти, но размер буфера в запросе на запись превышает максимальную длину транзакции пользовательской передачи, SerCx2 разделяет запрос на запись на две (или более) пользовательские транзакции передачи, каждая из которых не превышает максимальную длину передачи.
Если SerCx2 необходимо разделить запрос на чтение или запись на две или более транзакций ввода-вывода, драйвер последовательного контроллера может спокойно игнорировать связь этих транзакций друг с другом и с запросом. SerCx2 сериализует транзакции, чтобы гарантировать получение или передачу данных в правильном порядке.
Когда драйвер последовательного контроллера регистрирует набор функций обратного вызова для поддержки транзакций system-DMA или пользовательских транзакций, драйвер предоставляет значения параметров, описывающие возможности оборудования, которое будет выполнять эти транзакции. Например, для транзакций system-DMA параметры включают требования к выравниванию, а также минимальную и максимальную длину передачи, которую поддерживает системный контроллер DMA. SerCx2 использует эти параметры, чтобы решить, следует ли обрабатывать запрос на чтение или запись как транзакцию piO или транзакцию system-DMA, а также следует ли разделить запрос на две или более транзакций ввода-вывода.
Однако последовательный контроллер может иметь специальные аппаратные возможности, которые не могут быть должным образом описаны параметрами, которые драйвер последовательного контроллера предоставляет SerCx2. Таким образом, драйвер может иметь доступ к информации, зависящей от оборудования, которая позволяет драйверу принимать более обоснованные решения о секционирования запроса на чтение или запись в одну или несколько транзакций ввода-вывода, чем SerCx2. В качестве варианта такой драйвер может реализовать функции обратного вызова событий EvtSerCx2SelectNextReceiveTransactionType и EvtSerCx2SelectNextTransmitTransactionType . SerCx2 вызывает эти функции, если они реализованы, чтобы позволить драйверу решить, какие транзакции ввода-вывода следует использовать для выполнения запроса на чтение или запись.