Linux USB架构解析:从总线到设备

需积分: 9 7 下载量 49 浏览量 更新于2024-09-20 收藏 553KB PDF 举报
"这篇博客由guolele撰写,主要探讨了Linux系统下的USB架构,讲述了USB主控制器与ROOT HUB之间的交互关系,并简单介绍了USB设备的注册和匹配过程。" 在Linux操作系统中,USB(Universal Serial Bus)架构是一个复杂但至关重要的部分,它负责管理和驱动各种USB设备。guolele的文章首先提到了USB主控制器(Host Controller)与ROOT HUB的关系,这两个组件是USB设备在Linux系统中的核心元素。主控制器负责管理USB总线,而ROOT HUB则充当设备连接的中心点,允许多个设备通过菊花链方式连接。 文章接着描述了USB设备在Linux内核中的初始化和注册流程。当一个新的USB设备插入时,系统会调用`uhci_hcd_init`开始处理,接着通过`usb_add_hcd`将控制器添加到总线。`usb_hcd_poll_rh_status`和`register_root_hub`用于监控ROOT HUB的状态并注册它。在设备识别过程中,`usb_get_device_descriptor`用于获取设备描述符,这包含了设备的基本信息。 在设备注册阶段,`usb_new_device`被调用来创建一个新的设备实例。`device_add`后,系统会调用`usb_bus_type->match`进行设备匹配,这里使用了`usb_device_match`函数。如果设备类型匹配,它将寻找对应的`usb_generic_driver`,该驱动在`usb_init`时通过`usb_register_device_driver`注册。之后,`generic_probe`函数被调用,执行如`usb_choose_configuration`和`usb_set_configuration`等配置步骤,以确定设备的工作模式。 在`usb_set_configuration`中,接口设备类型被设置为`usb_if_device_type`,然后调用`device_add(&intf->dev)`添加接口设备。`create_intf_ep_devs(intf)`创建端点(Endpoint)结构体,这些端点代表了设备可以进行数据传输的不同通道。最后,由于设备类型已更改为`usb_if_device_type`,系统再次进行设备匹配,这次调用`else`分支的代码,继续完成设备的初始化和配置。 通过这篇文章,我们可以了解到Linux USB架构的概貌以及设备注册、匹配和初始化的关键步骤。虽然没有深入讨论错误处理和某些细节,但它为理解Linux如何管理USB设备提供了一个基础的框架。对于想要深入研究Linux USB编程的人来说,这是一个很好的起点,可以结合《linux那些事儿系列从书》进一步学习。