GPIO 驱动程序支持概述

从 Windows 8 开始,GPIO 框架扩展 (GpioClx) 简化了为 GPIO 控制器设备编写驱动程序的任务。 另外,GpioClx 还为连接到 GPIO 引脚的外围设备提供驱动程序支持。 GpioClx 是系统提供的针对内核模式驱动程序框架 (KMDF) 的扩展,其执行的处理任务对于 GPIO 设备类的成员来说很常见。

本概述讨论以下主题:

GPIO 控制器驱动程序

硬件供应商提供驱动程序来控制其 GPIO 控制器。 GPIO 控制器驱动程序是一种 KMDF 驱动程序,用于管理 GPIO 控制器的所有特定于硬件的操作。 GPIO 控制器驱动程序与 GpioClx 协作处理配置为数据输入和数据输出的 GPIO 引脚组的 I/O 请求。 此外,此驱动程序与 GpioClx 合作处理来自配置为中断输入的 GPIO 引脚的中断请求。

GPIO 控制器设备具有一定数量的 GPIO 引脚。 这些引脚可以物理连接到外围设备。 GPIO 引脚可配置为数据输入、数据输出或中断请求输入。 通常,GPIO 引脚专用于外围设备,而不是由两个或更多设备共享。 GPIO 引脚和外围设备之间的连接是固定的,用户 (无法更改,例如,通过移除外围设备并将其替换为另一个设备) 。 因此,可以在平台固件中描述 GPIO 引脚分配给外围设备的方式。

下图显示了 GPIO 控制器驱动程序和 GpioClx。

gpio 组件的框图。

GPIO 控制器驱动程序和 GpioClx 通过 GpioClx 设备驱动程序接口 (DDI) 相互通信。 GPIO 控制器驱动程序调用由 GpioClx 实现的 驱动程序支持方法 。 GpioClx 调用由 GPIO 控制器驱动程序实现 的事件回调函数

GPIO 控制器驱动程序直接访问 GPIO 控制器设备的硬件寄存器。

GpioClx 处理来自物理连接到 GPIO 引脚的外围设备的驱动程序的 I/O 请求。 GpioClx 将这些 I/O 请求转换为简单的硬件操作,通过调用由 GPIO 控制器驱动程序实现的事件回调函数来执行这些操作。 例如,若要从一组 GPIO 引脚读取数据或将数据写入一组,GpioClx 会调用事件回调函数 ,例如CLIENT_ReadGpioPinsCLIENT_WriteGpioPins。 GpioClx 管理 GPIO 控制器的 I/O 队列,从而解除此任务的 GPIO 控制器驱动程序。

此外,GpioClx 处理来自 GPIO 控制器设备的主要中断,并将这些中断映射到辅助中断,这些中断由外围设备驱动程序处理。 主要中断是由硬件设备生成的中断。 辅助中断由操作系统生成,以响应某些主要中断。 主要中断和辅助中断均由全局系统中断 (GSIs) 标识。 硬件平台的 ACPI 固件将 GSI 分配给主要中断,在运行时,操作系统将 GSIS 分配给次要中断。

例如,固件将 GSI 分配给来自 GPIO 控制器的硬件中断,操作系统将 GSI 分配给配置为中断输入的 GPIO 引脚。

GpioClx 实现一个 ISR,用于处理来自 GPIO 控制器设备的硬件生成的主要中断。 当外围设备断言 GPIO 引脚上的中断,并启用并取消屏蔽此引脚上的中断时,GPIO 控制器会中断处理器。 作为响应,内核陷阱处理程序计划运行 GpioClx ISR。 为了识别导致中断的 GPIO 引脚,GpioClx ISR 调用由 GPIO 控制器驱动程序实现 的 CLIENT_QueryActiveInterrupts 事件回调函数。 然后,GpioClx ISR 查找分配给此引脚的 GSI,并将此 GSI 传递到硬件抽象层 (HAL) 。 HAL 通过调用为此 GSI 注册的 ISR 生成辅助中断。 此 ISR 属于最初断言中断的外围设备的驱动程序。

有关主要中断和辅助中断的详细信息,请参阅 GPIO 中断

使用 GPIO 引脚的外围设备的驱动程序

启动时,即插即用 (PnP) 管理器枚举 PnP 设备和非 PnP 设备。 对于与 GPIO 引脚建立固定连接的非 PnP 设备,PnP 管理器会查询平台固件,以确定哪些 GPIO 引脚作为系统管理的硬件资源分配给这些设备。

外围设备的 KMDF 驱动程序在 EvtDevicePrepareHardware 回调期间接收其分配的硬件资源。 这些资源可能包括配置为数据输出、数据输入或中断请求输入的 GPIO 引脚。

GPIO I/O 资源是 Windows 8 中的新 Windows 资源类型。 此资源包含一组一个或多个 GPIO 引脚,可用作数据输入或数据输出。 如果外围设备驱动程序打开 GPIO I/O 资源进行读取,则驱动程序会将资源中的所有引脚用作数据输入。 如果驱动程序打开 GPIO I/O 资源进行写入,则驱动程序将使用资源中的所有引脚作为数据输出。 有关显示外围设备驱动程序如何打开与一组 GPIO I/O 引脚的逻辑连接的代码示例,请参阅以下主题:

将 KMDF 驱动程序连接到 GPIO I/O 管脚

配置为中断输入的 GPIO 引脚作为普通 Windows 中断资源分配给驱动程序。 中断资源抽象隐藏了这样一个事实,即中断可能由 GPIO 引脚而不是可编程中断控制器(例如)实现。 因此,驱动程序可以像对待任何其他中断资源一样处理基于 GPIO 的中断资源。

若要访问 GPIO I/O 资源中的 GPIO 引脚,外围设备驱动程序必须打开与引脚的逻辑连接。 KMDF 驱动程序调用 WdfIoTargetOpen 方法以打开连接。 通过此连接,驱动程序可以将 I/O 请求发送到 GPIO 引脚。 驱动程序发送 IOCTL_GPIO_READ_PINS 请求,以从这些引脚读取数据, (如果他们是输入引脚) 或 IOCTL_GPIO_WRITE_PINS 请求将数据写入它们 (输出引脚) 。

若要从中断资源中的 GPIO 引脚接收中断,外围设备驱动程序必须注册其中断服务例程 (ISR) ,以便从此引脚实现的中断资源接收中断。 KMDF 驱动程序调用 WdfInterruptCreate 方法将 ISR 连接到中断。