通常,由 SerCx2 管理的串行端口永久连接到外围设备。 此设备由将 I/O 请求发送到串行端口的外围驱动程序控制。 这些请求向/从设备传输数据,并配置串行端口的状态。 外围驱动程序发送的 I/O 请求由 SerCx2 和关联的串行控制器驱动程序共同处理。
通常,串行控制器包含在芯片(SoC)集成电路上的系统中。 可能连接到 SoC 芯片上串行控制器串行端口的外围设备的示例包括 GPS、无线 LAN、相机和蓝牙设备。
串行连接的外围设备的外围驱动程序通常是 Kernel-Mode 驱动程序框架 (KMDF)或 User-Mode 驱动程序框架 (UMDF)驱动程序。 若要与此设备通信,外围设备驱动程序必须首先打开与串行控制器的逻辑连接,并接收驱动程序可以向其发送 I/O 请求的文件句柄。 有关详细信息,请参阅 打开 SerCx2-Managed 串行端口。
本页内容
串行驱动程序体系结构
以下方块图显示了构成外围设备(关系图底部)与此设备的外围驱动程序(图顶部)之间的通信路径的软件和硬件层。 在此示例中,外围设备连接到串行控制器上的端口和 GPIO 控制器上的中断引脚。
此示例中的外围驱动程序是一个 UMDF 驱动程序,用于向外围设备发送 I/O 请求。 这些请求在关系图左侧显示的通信路径中移动。 请求由 SerCx2 和串行控制器驱动程序处理。 外围设备驱动程序可以请求 I/O 操作,这些操作设置串行端口的硬件配置(例如,更改波特率),并通过串行端口向外围设备传输数据和从外围设备接收数据。 有关详细信息,请参阅 I/O 请求路径。
外围设备的中断通过上图右侧的通信路径向上传输。 如图右下角所示,外围设备的中断引脚连接到通用 I/O(GPIO)控制器上的引脚。 此 GPIO 引脚配置为从外围设备接收中断信号。 在基于 SoC 的硬件平台中,GPIO 控制器经常扮演可编程中断控制器的作用。 有关详细信息,请参阅 中断路径。
图中以灰色显示的两个块是系统提供的模块。 从 Windows 8 开始,提供 GPIO 框架扩展 (GpioClx)。 与 SerCx2 一样,GpioClx 是 KMDF 的扩展。 GpioClx 执行各种 GPIO 控制器通用的函数。 GpioClx 与 GPIO 控制器的驱动程序配合使用,该驱动程序管理 GPIO 控制器中所有特定于硬件的操作。 有关详细信息,请参阅 GPIO 驱动程序支持概述。
I O 请求路径
若要将数据传输到外围设备,外围驱动程序会将写入(IRP_MJ_WRITE)请求发送到串行控制器。 若要从外围设备接收数据,外围设备驱动程序会将读取(IRP_MJ_READ)请求发送到串行控制器。
此外,Windows 还定义了一组设备 I/O 控制请求(IOCTLs),外围驱动程序可用于执行特定于串行控制器的各种 I/O 控制作。 下面是外围驱动程序可以请求的 I/O 控制操作的示例:
- 设置串行端口传输和接收数据的波特速率。
- 设置读取和写入请求的超时。
- 在外围驱动程序接收通知的串行端口上指定一组硬件事件。
SerCx2 支持与收件箱串行驱动程序、Serial.sys和串行框架扩展版本 1 相同的许多串行 IOCTL(SerCx)。 更多信息,请参阅:
- 请参阅 串行 I/O 请求接口 中的表,以确定 SerCx2 是否支持特定的串行 IOCTL。
- 有关由 Windows 串行 I/O 请求接口定义的所有串行 IOCTL 的详细说明,请参阅 串行设备控制请求。
- 有关 Serial.sys、SerCx 和 SerCx2 的简要介绍,请参阅 串行控制器驱动程序概述 。
中断路径
如 串行驱动程序体系结构 图中所示,外围设备使用 GPIO 引脚将设备中断发送到外围驱动程序。 为了响应外围设备的中断信号,GPIO 控制器向处理器发出硬件中断(称为 主 中断)信号。 操作系统将此中断定向到 GpioClx 的 ISR。 接下来,GpioClx 标识哪个 GPIO 引脚导致中断,并从外围设备查找虚拟中断(称为 辅助 中断)的全局系统中断(GSI)标识符。 GpioClx 向 HAL 提供 GSI,HAL 调用外围驱动程序的 ISR。 为了处理中断,外围驱动程序通常通过 SerCx2 和串行控制器驱动程序向外围设备发送一个或多个 I/O 请求。 有关主要中断和辅助中断的详细信息,请参阅 GPIO 中断。
GPIO 中断只是外围驱动程序接收外围设备中硬件事件的通知的一种方式。 另一种方法是,当特定类型的硬件事件发生在串行端口时,外围驱动程序可以从 SerCx2 和串行控制器驱动程序请求通知。 例如,当串行控制器从外围设备接收串行数据时,外围设备驱动程序可能会要求被通知。 若要请求这些通知,外围驱动程序会向外围设备发送 IOCTL_SERIAL_SET_WAIT_MASK 请求,以指定要监视的事件集,然后发送 IOCTL_SERIAL_WAIT_ON_MASK 请求以开始侦听这些事件。 这些请求由 SerCx2 处理,并得到串行控制器驱动程序的协助。 有关外围驱动程序可以监视的事件类型的详细信息,请参阅IOCTL_SERIAL_SET_WAIT_MASK中所述SERIAL_EV_XXX。
但是,仅当串行控制器处于 D0 设备电源状态时,串行控制器才能检测硬件事件。 如果串行控制器处于低功率状态,则外围驱动程序不能依赖串行控制器的通知来知道何时,例如,外围设备有新的数据供驱动程序读取。 在这种情况下,外围设备必须通过 GPIO 引脚发送中断信号(或者,也许是唤醒信号)。 GPIO 控制器消耗的功率很少,在大多数其他设备进入低功率状态后,通常保持活动状态。