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


Драйверы периферийных устройств на SerCx2-Managed последовательных портах

Как правило, последовательный порт, управляемый SerCx2, постоянно подключается к периферийным устройствам. Это устройство управляется периферийным драйвером, который отправляет запросы ввода-вывода на последовательный порт. Эти запросы передают данные на устройство и с устройства, а также настраивают состояние последовательного порта. Запросы ввода-вывода, отправленные драйвером периферийного устройства, совместно обрабатываются SerCx2 и связанным драйвером последовательного контроллера.

Часто последовательные контроллеры содержатся в интегральных каналах Системы на микросхеме (SoC). Примеры периферийных устройств, которые могут быть подключены к последовательному порту последовательного контроллера на микросхеме SoC, включают GPS, беспроводную локальную сеть, камеру и устройства Bluetooth.

Драйвер периферийного устройства для последовательно подключенного периферийного устройства обычно является драйвером платформы драйвера в режиме ядра (KMDF) или среда выполнения платформы драйвера режима пользователя (UMDF). Для взаимодействия с этим устройством драйвер периферийного устройства должен сначала открыть логическое подключение к последовательному контроллеру и получить дескриптор файла, на который драйвер может отправлять запросы ввода-вывода. Дополнительные сведения см. в разделе Открытие последовательного порта SerCx2-Managed.

На этой странице

Архитектура последовательного драйвера

На следующей блок-схеме показаны уровни программного обеспечения и оборудования, образующие пути связи между периферийным устройством (в нижней части схемы) и периферийным драйвером этого устройства (в верхней части схемы). В этом примере периферийное устройство подключается к порту последовательного контроллера и к контакту прерывания на контроллере GPIO.

Схема: уровни программного и аппаратного обеспечения для периферийного устройства на последовательном порту, управляемом SerCx2.

Драйвер периферийного устройства в этом примере — это драйвер UMDF, который отправляет запросы ввода-вывода на периферийное устройство. Эти запросы перемещаются по пути связи, показанного в левой части схемы. Запросы обрабатываются SerCx2 и драйвером последовательного контроллера. Драйвер периферийного устройства может запрашивать операции ввода-вывода, которые задают конфигурацию оборудования последовательного порта (например, изменение скорости передачи данных) и передают данные на периферийное устройство через последовательный порт. Дополнительные сведения см. в разделе Путь запроса ввода-вывода.

Прерывания периферийного устройства перемещают вверх по пути связи справа от предыдущей схемы. Как показано в правом нижнем углу этой схемы, контакт прерывания с периферийного устройства подключен к контакту на контроллере ввода-вывода общего назначения (GPIO). Этот контакт GPIO настроен для получения сигналов прерывания от периферийного устройства. На аппаратной платформе на основе SoC контроллер GPIO часто играет роль программируемого контроллера прерываний. Дополнительные сведения см. в разделе Путь прерывания.

Два блока, показанные серым цветом на схеме, являются системными модулями. Расширение платформы GPIO (GpioClx) доступно начиная с Windows 8. Как и SerCx2, GpioClx является расширением KMDF. GpioClx выполняет функции, общие для различных контроллеров GPIO. GpioClx работает с драйвером контроллера GPIO, который управляет всеми аппаратными операциями в контроллере GPIO. Дополнительные сведения см. в статье Общие сведения о поддержке драйверов GPIO.

Путь запроса ввода-вывода

Для передачи данных на периферийное устройство драйвер периферийного устройства отправляет запрос на запись (IRP_MJ_WRITE) на последовательный контроллер. Чтобы получить данные с периферийного устройства, драйвер периферийного устройства отправляет запрос на чтение (IRP_MJ_READ) последовательному контроллеру.

Кроме того, Windows определяет набор запросов управления вводом-выводом устройства (IOCTL), которые периферийный драйвер может использовать для выполнения различных операций управления вводом-выводом, относящихся к последовательным контроллерам. Ниже приведены примеры операций управления вводом-выводом, которые может запрашивать драйвер периферийного устройства.

  • Установите скорость передачи и приема данных последовательным портом.
  • Задайте интервалы времени ожидания для запросов на чтение и запись.
  • Укажите набор событий оборудования на последовательном порту, для которого драйвер периферийного устройства получает уведомления.

SerCx2 поддерживает многие из этих же последовательных ioCTL, что и последовательный драйвер для папки "Входящие", Serial.sys и версию 1 расширения последовательной платформы (SerCx). Дополнительные сведения

Путь прерывания

Как показано на схеме архитектуры последовательного драйвера , периферийное устройство использует пин-код GPIO для отправки прерываний устройства в драйвер периферийного устройства. В ответ на сигнал прерывания от периферийного устройства контроллер GPIO передает процессору аппаратное прерывание (называемое основным прерыванием). Операционная система направляет это прерывание в ISR GpioClx. Затем GpioClx определяет, какой пин-код GPIO вызвал прерывание, и ищет идентификатор глобального системного прерывания (GSI) виртуального прерывания (называемого вторичным прерыванием) с периферийного устройства. GpioClx передает GSI в HAL, а HAL вызывает ISR драйвера периферийного устройства. Для обработки прерывания драйвер периферийного устройства обычно отправляет один или несколько запросов ввода-вывода на периферийное устройство с помощью SerCx2 и драйвера последовательного контроллера. Дополнительные сведения о первичных и вторичных прерываниях см. в разделе Прерывания GPIO.

Прерывания GPIO — это только один из способов получения драйвером периферийных устройств уведомлений о событиях оборудования на периферийном устройстве. Другой способ заключается в том, чтобы драйвер периферийного устройства запрашивал уведомления от SerCx2 и драйвера последовательного контроллера при возникновении определенных типов событий оборудования на последовательном порту. Например, драйвер периферийного устройства может запрашивать уведомление, когда последовательный контроллер получает последовательные данные от периферийного устройства. Чтобы запросить эти уведомления, периферийный драйвер отправляет IOCTL_SERIAL_SET_WAIT_MASK запрос на периферийное устройство, чтобы указать набор отслеживаемых событий, а затем отправляет IOCTL_SERIAL_WAIT_ON_MASK запрос на начало прослушивания этих событий. Эти запросы обрабатываются SerCx2 с помощью драйвера последовательного контроллера. Дополнительные сведения о типах событий, которые может отслеживать драйвер периферийных устройств, см. в разделе SERIAL_EV_XXX, которые описаны в IOCTL_SERIAL_SET_WAIT_MASK.

Однако последовательный контроллер может обнаруживать аппаратные события только в том случае, если он находится в состоянии питания устройства D0. Если последовательный контроллер находится в маломощном состоянии, драйвер периферийного устройства не может полагаться на уведомления от последовательного контроллера, чтобы узнать, когда, например, на периферийном устройстве есть новые данные для чтения драйвером. В этом случае периферийное устройство должно отправлять сигнал прерывания (или, возможно, сигнал пробуждения) через контакт GPIO. Контроллер GPIO потребляет очень мало энергии и обычно остается активным после того, как большинство других устройств перейдет в состояние низкого энергопотребления.