通常,GPIO 控制器的客户端是连接到 GPIO 引脚的外围设备的驱动程序。 这些驱动程序使用 GPIO 引脚作为低带宽数据通道、设备选择输出和中断请求输入。 外围设备驱动程序打开与配置为数据输入或输出的 GPIO 引脚的逻辑连接。 通过这些连接发送 I/O 请求到这些引脚。 此外,外围设备驱动程序可以在逻辑上将其中断服务例程连接到配置为中断请求输入的 GPIO 引脚。
GPIO 引脚是系统管理的硬件资源。 在外围设备驱动程序启动其设备之前,即插即用(PnP)管理器会为此驱动程序分配硬件资源列表。 此硬件资源列表可能包括:
- GPIO I/O 资源。 此资源是一组配置为数据输入或数据输出的一个或多个 GPIO 引脚。 GPIO I/O 资源是一种新的 Windows 资源类型,从 Windows 8 开始。
- 中断。 此中断资源可以实现为配置为中断输入的 GPIO 引脚,但可以通过可编程中断控制器或处理器包上的专用中断引脚来实现此中断资源。 硬件抽象层 (HAL) 中断抽象隐藏这些实现详细信息,客户端驱动程序可以安全地忽略这些细节。
在外围设备驱动程序可以使用一组 GPIO 引脚作为数据输入或输出之前,驱动程序必须打开与这些引脚的逻辑连接。 例如, 内核模式驱动程序接口(KMDF)驱动程序获取 WDFIOTARGET 句柄以标识连接。 驱动程序使用此句柄将 I/O 请求发送到引脚。 具体而言,客户端驱动程序发送 IOCTL_GPIO_WRITE_PINS 和 IOCTL_GPIO_READ_PINS I/O 控制请求,以将数据写入输出引脚并从输入引脚读取数据。 有关演示如何连接到一组 GPIO I/O 引脚的代码示例,请参阅以下主题:
若要使用中断资源来接收中断,外围设备驱动程序必须以逻辑方式将中断服务例程(ISR)连接到中断。 例如,内核模式驱动程序可以通过调用 WdfInterruptCreate 方法或 IoConnectInterruptEx 例程来建立此连接。 连接后,当外围设备向 GPIO 引脚或中断控制器输入发出中断请求时,驱动程序的 ISR 将运行。 有关中断的详细信息,请参阅 创建中断对象。
GPIO 框架扩展(GpioClx)管理作为其客户端的外围设备驱动程序的 I/O 连接和中断连接。 PnP 管理器可以将 GPIO 控制器设备上的不同 GPIO 引脚组分配给不同的客户端驱动程序。 其中一些引脚配置为数据输入或输出,有些引脚配置为中断请求输入。
当客户端驱动程序收到中断请求或将 I/O 请求发送到 GPIO 引脚时,GpioClx 将调用 GPIO 控制器驱动程序实现的事件回调函数。 这些回调访问 GPIO 控制器设备中的硬件寄存器。 通过这些函数调用,GpioClx 读取数据输入、写入数据输出以及管理中断请求(通过查询、启用、屏蔽、清除等方式,将 GPIO 引脚配置为中断输入)。
GpioClx 执行管理 I/O 和中断客户端打开的连接所需的所有处理。 GPIO 控制器驱动程序将这些连接的管理委托给 GpioClx,仅负责访问 GPIO 控制器设备中硬件寄存器这一相对简单的任务。 GPIO 控制器驱动程序不需要知道为其进行特定访问的客户端驱动程序。