编写设备驱动程序

热移除

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 驱动程序等待端口连接状态发生变化。

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