编写设备驱动程序

热插拔 USB 设备

USB 设备支持热插拔。可以随时插入或移除 USB 设备。客户机驱动程序必须处理打开的设备的移除和重新插入。使用热插拔回调可处理打开的设备。关闭的设备的插入和移除由 attach(9E)detach(9E) 入口点处理。

热插拔回调

USBA 2.0 框架支持以下事件通知:

客户机驱动程序必须在其 attach(9E) 例程中调用 usb_register_hotplug_cbs(9F),以便注册事件回调。在中断之前,驱动程序必须在其 detach(9E) 例程中调用 usb_unregister_hotplug_cbs(9F)

热插入

USB 设备的热插入的事件顺序如下:

  1. 集线器驱动程序 hubd(7D) 等待端口连接状态发生变化。

  2. hubd 驱动程序检测到端口连接。

  3. hubd 驱动程序枚举设备,创建子设备节点,然后连接客户机驱动程序。有关兼容名称的定义,请参阅绑定客户机驱动程序

  4. 客户机驱动程序管理设备。驱动程序处于 ONLINE 状态。

热移除

USB 设备的热移除的事件顺序如下:

  1. 集线器驱动程序 hubd(7D) 等待端口连接状态发生变化。

  2. hubd 驱动程序检测到端口断开连接。

  3. hubd 驱动程序将断开连接事件发送到子客户机驱动程序。如果子客户机驱动程序是 hubd 驱动程序或 usb_mid(7D) 多接口驱动程序,则子客户机驱动程序将该事件传播到其子级。

  4. 客户机驱动程序在内核线程上下文中接收断开连接事件通知。内核线程上下文使驱动程序的断开连接处理程序进入阻塞状态。

  5. 客户机驱动程序将转为 DISCONNECTED 状态。未完成的 I/O 传输将失败,完成原因为 device not responding。所有新 I/O 传输以及打开设备节点的尝试也将失败。要关闭管道,不需要客户机驱动程序。而要保存设备以及重新连接设备时需要恢复的驱动程序上下文,需要客户机驱动程序。

  6. hubd 驱动程序试图按照从下到上的顺序使 OS 设备节点及其子节点脱机。

如果在 hubd 驱动程序试图使设备节点脱机时,未打开该设备节点,则会发生以下事件:

  1. 将调用客户机驱动程序的 detach(9E) 入口点。

  2. 销毁设备节点。

  3. 新设备可以使用相应端口。

  4. 重新开始热插拔事件序列。hubd 驱动程序等待端口连接状态发生变化。

如果在 hubd 驱动程序试图使设备节点脱机时已打开该设备节点,则会发生以下事件:

  1. hubd 驱动程序将脱机请求放入定期脱机重试队列。

  2. 新设备仍然不可使用相应端口。

如果在 hubd 驱动程序试图使设备节点脱机时,已打开该设备节点,但用户稍后关闭了该设备节点,则 hubd 驱动程序定期使该设备节点脱机将成功,且会发生以下事件:

  1. 将调用客户机驱动程序的 detach(9E) 入口点。

  2. 销毁设备节点。

  3. 新设备可以使用相应端口。

  4. 重新开始热插拔事件序列。hubd 驱动程序等待端口连接状态发生变化。

如果用户关闭使用该设备的所有应用程序,则端口将重新变为可用。如果应用程序未终止或未关闭该设备,则端口仍然不可用。

热重新插入

如果将先前移除的设备重新插入同一端口,同时该设备的设备节点仍处于打开状态,则会发生以下事件:

  1. 集线器驱动程序 hubd(7D) 检测到端口连接。

  2. hubd 驱动程序恢复总线地址和设备配置。

  3. hubd 驱动程序取消脱机重试请求。

  4. hubd 驱动程序将连接事件发送到客户机驱动程序。

  5. 客户机驱动程序收到连接事件。

  6. 客户机驱动程序确定新设备是否与先前连接的设备相同。客户机驱动程序首先通过比较设备描述符来进行此项确定。客户机驱动程序也可以比较序列号和配置描述符群。

如果客户机驱动程序确定当前设备与先前连接的设备不同,则可能会发生以下事件:

  1. 客户机驱动程序可能向控制台发出警告消息。

  2. 用户可能再次移除该设备。如果用户再次移除该设备,则将重新开始热移除事件序列。hubd 驱动程序检测到端口断开连接。如果用户没有再次移除该设备,则会发生以下事件:

    1. 客户机驱动程序仍然保持 DISCONNECTED 状态,所有请求和打开操作将失败。

    2. 端口仍然不可用。用户必须关闭设备并断开其连接以释放端口。

    3. 释放端口时,将重新开始热插拔事件序列。hubd 驱动程序等待端口连接状态发生变化。

如果客户机驱动程序确定当前设备与先前连接的设备相同,则可能会发生以下事件:

  1. 客户机驱动程序可能恢复其状态,并继续正常操作。此策略由客户机驱动程序负责。音频扬声器就是客户机驱动程序可继续操作的典型示例。

  2. 如果使用重新连接的设备继续操作是安全的,则将重新开始热插拔事件序列。hubd 驱动程序等待端口连接状态发生变化。设备再次可用。