Общие сведения о драйверах периферийных устройств SPB
Драйвер периферийных устройств SPB управляет периферийным устройством, подключенным к простой периферийной шине (SPB). Аппаратные регистры этого устройства доступны только через SPB. Чтобы считывать или записывать данные на устройство, драйвер должен отправлять запросы ввода-вывода контроллеру SPB. Только этот контроллер может инициировать передачу данных на устройство и с устройства через SPB.
Начиная с Windows 8, Windows обеспечивает поддержку драйверов для периферийных устройств на простых периферийных автобусах (SPBS). SpBs, такие как I2C и SPI, широко используются для подключения к устройствам с низкой скоростью датчика, таким как акселерометры, gps-устройства и мониторы уровня батареи. В этом обзоре описывается, как драйвер периферийных устройств SPB в сотрудничестве с другими системными компонентами управляет периферийным устройством, подключенным к SPB.
Драйвер периферийных устройств SPB можно создать для использования среда выполнения платформы драйвера режима пользователя (UMDF) или платформы драйверов в режиме ядра (KMDF). Дополнительные сведения о разработке драйвера UMDF см. в статье "Начало работы с UMDF". Дополнительные сведения о разработке драйвера KMDF см. в статье "Начало работы с платформой драйверов в режиме ядра".
Сведения о конфигурации устройства
Аппаратные регистры периферийных устройств, подключенных к SPB, не сопоставляются с памятью. К устройству можно получить доступ только через контроллер SPB, который последовательно передает данные на устройство и с устройства через SPB. Для выполнения операций ввода-вывода драйвер периферийных устройств SPB отправляет запросы ввода-вывода на устройство, а контроллер SPB выполняет передачу данных, необходимых для выполнения этих запросов. Дополнительные сведения о запросах ввода-вывода, которые можно отправлять на периферийные устройства в SPBS, см. в разделе "Использование интерфейса запроса ввода-вывода SPB".
На следующей схеме показан пример конфигурации оборудования, в которой spB (в данном случае шина I2C) подключает два периферийных устройства к модулю System on a Chip (SoC). Периферийные устройства являются внешними для модуля SoC и подключаются к четырем контактам на модуле. Модуль SoC содержит основной процессор (не показан), а такжеконтроллер I 2C и контроллер ввода-вывода общего назначения (GPIO). Процессор использует контроллер I2C для последовательной передачи данных на два периферийных устройства и из нее. Строки запросов прерывания с этих устройств подключены к двум пин-кодам GPIO, настроенным в качестве входных данных прерывания. Когда устройство сигнализирует запрос на прерывание, контроллер GPIO передает прерывание процессору.
Так как контроллер GPIO иконтроллер I 2C в этом примере интегрируются в модуль SoC, их аппаратные регистры сопоставляются с памятью и могут напрямую обращаться к процессору. Однако процессор может получить доступ к аппаратным регистрам двух периферийных устройств только косвенно через контроллер I2C.
SpB не является шиной самонастраивающийся (PnP), поэтому ее нельзя использовать для автоматического обнаружения и настройки новых устройств, подключенных к шине. Шина и прерывание подключений подключенного устройства SPB часто являются постоянными. Даже если устройство может быть отключено из слота, этот слот обычно выделен для устройства. Кроме того, spB не предоставляет аппаратный путь для ретрансляции запросов прерываний с периферийного устройства на шине на контроллер шины. Вместо этого аппаратный путь для прерываний отделен от контроллера шины.
Поставщик аппаратной платформы хранит сведения о конфигурации для подключенного к spB периферийного устройства в встроенном ПО ACPI платформы. Во время запуска системы драйвер ACPI перечисляет устройства в шине для диспетчера PnP. Для каждого перечисленного устройства ACPI предоставляет сведения о шине устройства и прерывании подключений. Диспетчер PnP сохраняет эти сведения в хранилище данных, называемом концентратором ресурсов.
При запуске устройства диспетчер PnP предоставляет драйвер устройства с набором аппаратных ресурсов , которые инкапсулируют сведения о конфигурации, которые концентратор ресурсов хранит для устройства. К этим ресурсам относятся идентификатор подключения и номер прерывания. Идентификатор подключения инкапсулирует сведения о подключении шины, такие как контроллер SPB, адрес шины и частота часов шины. Прежде чем отправлять запросы ввода-вывода на устройство, драйвер должен сначала использовать идентификатор подключения для открытия логического подключения к устройству. Номер прерывания — это ресурс прерывания Windows, к которому драйвер может подключить свою подпрограмму службы прерываний (ISR). Драйвер можно легко перенести из одной аппаратной платформы в другую, так как идентификатор подключения и номер прерывания являются высокоуровневые абстракции, которые скрывают сведения о физической шине и прерываниях.
Уровни программного обеспечения и оборудования
На следующей блок-схеме показаны уровни программного обеспечения и оборудования, которые подключают периферийное устройство на SPB к программе приложения, которая использует устройство. Драйвер периферийных устройств SPB в этом примере — драйвер UMDF. Периферийное устройство (в нижней части схемы) — это устройство датчика (например, акселерометр). Как и на предыдущей схеме, периферийное устройство подключено к шине I2C и передает запросы прерываний через закрепление на контроллере GPIO.
Три блока, показанные серым цветом, являются системными модулями. Начиная с Windows 7 расширение класса датчика доступно в качестве расширения для UMDF. Начиная с Windows 8 расширение платформы SPB (SpbCx) и расширение платформы GPIO (GpioClx) доступны в качестве расширений для KMDF, выполняющих функции, относящиеся к контроллерам SPB и контроллерам GPIO соответственно.
В верхней части предыдущей схемы приложение вызывает методы в API датчика или API расположения для взаимодействия с устройством датчика. С помощью этих вызовов приложение может отправлять запросы ввода-вывода на устройство и получать уведомления о событиях с устройства. Дополнительные сведения об этих API см. в разделе "Общие сведения о платформе датчика и расположения" в Windows.
Когда приложение вызывает метод, требующий взаимодействия с драйвером периферийных устройств SPB, API датчика или API расположения создает запрос ввода-вывода и отправляет его в драйвер периферийных устройств SPB. Модуль расширения класса датчика помогает драйверу обрабатывать эти запросы ввода-вывода. Когда драйвер получает новый запрос ввода-вывода, драйвер немедленно передает запрос расширению класса датчика, который очереди запроса до тех пор, пока драйвер не будет готов к его обработке. Если запрос ввода-вывода из приложения требует передачи данных на периферийное устройство или с периферийного устройства, драйвер периферийных устройств SPB создает запрос ввода-вывода для этой передачи и отправляет запрос контроллеру I2C. Такие запросы обрабатываются совместно с помощью spbCx и драйвера контроллера I2C.
SpbCx — это системный компонент, который управляет очередями запросов ввода-вывода для контроллера SPB, например контроллера I2C в этом примере. Драйвер контроллера I2C, предоставляемый поставщиком оборудования для контроллера, управляет всеми аппаратными операциями в контроллере I2C. Например, драйвер контроллера обращается к регистрам оборудования, сопоставленным с памятью, для запуска передачи данных на периферийное устройство через шину I2C и с нее.
Периферийное устройство сигнализирует запрос на прерывание при возникновении аппаратного события, требующего внимания от драйвера периферийных устройств SPB или приложения пользовательского режима. Строка прерывания с периферийного устройства подключена к пин-коду GPIO, настроенной для получения запросов на прерывание. Когда устройство сигнализирует прерывание пин-кода GPIO, контроллер GPIO сигнализирует об прерывании процессора. В ответ на это прерывание обработчик прерываний ядра вызывает ISR GpioClx. Этот isR запрашивает драйвер контроллера GPIO, который затем обращается к регистрам оборудования, сопоставленных с памятью контроллера GPIO, чтобы определить прерывание пин-кода GPIO. Чтобы замолчать прерывание, драйвер контроллера GPIO либо очищает (если прерывание активируется ребра) или маски (если активируются на уровне) запрос прерывания на пин-коде GPIO. Прерывание должно быть замолчено, чтобы предотвратить повторное выполнение того же прерывания при возвращении обработчика ловушки. Для прерывания, активируемого на уровне, ISR в драйвере периферийных устройств SPB должен получить доступ к аппаратным регистрам периферийных устройств, чтобы очистить прерывание, прежде чем пин-код GPIO может быть снят.
Перед возвратом обработчика перехвата прерываний ядра планируется, что ISR в драйвере периферийных устройств SPB выполняется в IRQL = PASSIVE_LEVEL. Начиная с Windows 8 драйвер UMDF может подключить его ISR к прерыванию, которое драйвер получает в качестве абстрактного ресурса прерывания Windows; Дополнительные сведения см. в разделе "Обработка прерываний". Чтобы определить, какой isR требуется вызвать, операционная система ищет виртуальные прерывания, назначенные пин-коду GPIO, и находит ISR, подключенный к прерыванию. Это виртуальное прерывание помечено как дополнительное прерывание на предыдущей схеме. В отличие от этого, аппаратное прерывание контроллера GPIO помечено как основное прерывание .
Так как isR в драйвере периферийных устройств SPB выполняется на пассивном уровне, ISR может использовать синхронные запросы ввода-вывода для доступа к регистрам оборудования на периферийном устройстве. ISR может блокироваться до завершения этих запросов. ISR, который выполняется в относительно высоком приоритете, должен вернуться как можно скорее и отложить всю фоновую обработку прерывания в рабочую подпрограмму, которая выполняется в более низком приоритете.
В ответ на дополнительное прерывание драйвер периферийных устройств SPB публикует событие в расширении класса датчика, которое уведомляет приложение пользовательского режима события через API датчика или API расположения.