SerCx2 托管串行端口上的设备的外设驱动程序

通常,由 SerCx2 管理的串行端口永久连接到外围设备。 此设备由将 I/O 请求发送到串行端口的外围驱动程序控制。 这些请求向/从设备传输数据,并配置串行端口的状态。 外围驱动程序发送的 I/O 请求由 SerCx2 和关联的串行控制器驱动程序共同处理。

串行控制器通常包含在芯片上的系统 (SoC) 集成电路中。 可能连接到 SoC 芯片上串行控制器的串行端口的外围设备示例包括 GPS、无线 LAN、相机和蓝牙设备。

串行连接的外围设备的外围驱动程序通常是内核 模式驱动程序框架 (KMDF) 或 用户模式驱动程序框架 (UMDF) 驱动程序。 若要与此设备通信,外围驱动程序必须首先打开与串行控制器的逻辑连接,并接收驱动程序可以向其发送 I/O 请求的文件句柄。 有关详细信息,请参阅 打开 SerCx2-Managed 串行端口

本页内容

串行驱动程序体系结构

下面的框图显示了构成外围设备 (关系图底部通信路径的软件和硬件层) ,此设备的外围驱动程序 (关系图) 顶部。 在此示例中,外围设备连接到串行控制器上的端口和 GPIO 控制器上的中断引脚。

显示 SerCx2 托管串行端口上外围设备的软件和硬件层的关系图。

此示例中的外围驱动程序是向外围设备发送 I/O 请求的 UMDF 驱动程序。 这些请求在关系图左侧显示的通信路径中移动。 请求由 SerCx2 和串行控制器驱动程序处理。 外围驱动程序可以请求 I/O 操作,这些操作设置串行端口的硬件配置 (例如更改波特率) ,以及通过串行端口向外围设备传输数据以及从外围设备传输数据。 有关详细信息,请参阅 I/O 请求路径

来自外围设备的中断通过上图右侧的通信路径向上移动。 如图右下角所示,外围设备的中断引脚连接到常规用途 I/O (GPIO) 控制器上的引脚。 此 GPIO 引脚配置为接收来自外围设备的中断信号。 在基于 SoC 的硬件平台中,GPIO 控制器经常充当可编程中断控制器。 有关详细信息,请参阅 中断路径

关系图中以灰色显示的两个块是系统提供的模块。 GPIO 框架扩展 (GpioClx) 从 Windows 8 开始提供。 与 SerCx2 一样,GpioClx 是 KMDF 的扩展。 GpioClx 执行各种 GPIO 控制器通用的功能。 GpioClx 与 GPIO 控制器驱动程序配合使用,该驱动程序管理 GPIO 控制器中的所有特定于硬件的操作。 有关详细信息,请参阅 GPIO 驱动程序支持概述

I O 请求路径

若要将数据传输到外围设备,外围驱动程序会将写入 (IRP_MJ_WRITE) 请求发送到串行控制器。 为了从外围设备接收数据,外围驱动程序会将读取 (IRP_MJ_READ) 请求发送到串行控制器。

此外,Windows 定义了一组设备 I/O 控制请求, (IOCTL) 外围设备驱动程序可以使用这些请求来执行特定于串行控制器的各种 I/O 控制操作。 下面是外围驱动程序可以请求的 I/O 控制操作的示例:

  • 设置串行端口传输和接收数据的波特率。
  • 设置读取和写入请求的超时间隔。
  • 在外设驱动程序接收通知的串行端口上指定一组硬件事件。

SerCx2 支持许多与收件箱串行驱动程序、Serial.sys 和 SerCx) 的串行框架扩展 (版本 1 相同的串行 IOCTL。 更多相关信息:

  • 请参阅 串行 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 控制器消耗的电量非常小,通常在大多数其他设备进入低功耗状态后保持活动状态。