Linux设备驱动probe过程(三)


前两周整理了Linux设备驱动probe的一些流程,文章链接如下:

  1. Linux设备驱动probe过程(一)
  2. Linux设备驱动probe过程(二)
  3. Linux设备驱动probe过程(四)

本周把剩下的坑填上,分析下热插拔设备驱动是如何probe的。典型的热插拔设备有PCI和USB。鉴于USB流传度和通用性更广,本文选用USB HOST HID作为分析示例。

本文的章节设计如下:

  1. USB设备驱动概述。整理了USB驱动架构有哪些基本构成,HID位于架构哪个位置,具体负责什么功能,为接下来HID probe流程的展开做铺垫。
  2. USB HID设备驱动。讲述以USB鼠标为例,从设备插入到正常工作的过程。
  3. 多设备驱动probe。介绍DRM架构如何实现多设备依次按顺序完成probe的方法。

1. USB设备驱动概述

本章作为铺垫层,只进行一些和后文有关的概念科普,模型比较单一,不考虑存在集线器情况。

USB设备属于热插拔设备,probe发生在USB设备硬件连接后,当USB设备插入后,会根据usb_device_id匹配,找到目标usb driver后,再触发usb设备创建和probe。

USB驱动架构分为Host和Device侧,Host侧作为主机,可以接入多个Device设备(比如键盘、鼠标、U盘),通过发送心跳包维持连接状态。按照USB协议规定,所有USB事务和数据传输都由Host发起,Device没有主动通知Host的能力。
Device设备一般负责单一功能,不过也有些设备(比如USB网卡),可以模拟出多个设备出来(网卡和串口)。

USB驱动结构图如下:
在这里插入图片描述
从主机侧的角度来看,需要编写的USB驱动程序包括:主机控制器驱动(USB HCD)和设备驱动(USB Devices Driver)两类,而USB Core作为公共代码和桥梁一般不需要进行额外开发。USB HCD驱动程序控制插入其中的USB设备,而USB Devices驱动程序控制该设备如何作为从设备与主机通信。

1.1 USB HCD主机控制器驱动

从USB Host侧看,处于最底层的是USB HCD(Host Controller Driver)主机控制器驱动,负责控制物理连接usb端口的通信、数据传输、设备插入拔出、电源管理,按协议可分为OHCI/EHCI/UHCI/xHCI:

  1. UHCI:Intel主导,通用主机控制接口,USB1.0/1.1;
  2. OHCI:开放主机控制接口,USB1.1;
  3. EHCI:Intel主导,增强主机控制接口,USB2.0;
  4. xHCI:可扩展主机控制器接口,最新USB3.0接口,可以兼容USB 1.x/2.0/3.x;

usb_hcd结构体描述USB主机控制器驱动,它包含USB控制器的"家务"信息、硬件资源、状态描述和用于操作主机控制器的hc_driver等。

1.1.1 dwc3示例(拓展阅读)

USB HCD集成在芯片SOC中,不属于热插拔范畴。USB HCD驱动probe位于kernel_init初始化阶段,dwc3公共代码(drivers/usb/dwc3/core.c)中并不涉及clock、reset pin和power的操作,很多方案会在dwc3外再封装一层driver,用于处理clock、reset pin、power的初始化,对应dwc3_xxx_probe函数。在完成外部初始化之后,通过of_platform_populate调用dwc3_probe,完成phy,irq和工作模式的初始化。驱动调用参考下图:
在这里插入图片描述
dwc3_probedwc3_host_init调用过程中涉及了1次进程切换,dwc3_host_init函数完成xhci注册,匹配xhci_plat_probe进行调用。
xhci_plat_probe初始化usb总线和phy,调用usb_add_hcd完成HCD结构体和USB bus/device的添加。
usb_register_bus注册USB bus,链接到对应usb core中,以便于后续进行bus list扫描和发现设备。
usb_new_device注册usb设备,并发起设备枚举。
hub_probe函数初始化root hub,初始化urb和events。

1.2 USB Core驱动

usb core驱动位于drivers/usb/core/usb.c,处于协议中间层,初始化函数usb_initsubsys_initcall声明,位于kernel init 4位置,位于在module_init之后。USB Core负责USB驱动管理和协议处理的主要工作,包括:

  1. 通过定义一些数据结构体、宏和功能函数,向上为设备驱动提供编程接口,向下为USB HCD提供编程接口;
  2. 维护整个系统的USB设备信息;
  3. 完成设备热插拔控制、总线数据传输控制等。

HCD提供硬件抽象,它只对USB Core一个负责,USB Core将设备驱动的请求映射到相关的HCD,设备驱动不能直接访问HCD,USB Core是HCD与USB设备的唯一桥梁。

USB Core注册了USB总线,USB文件系统,USB Hub以及USB generic设备驱动。

/*
 * Init
 */
static int __init usb_init(void)
{
   
	...
	retval = bus_register(&usb_bus_type);	// 注册USB总线驱动usb_bus_type,创建devices和drivers
	if (retval)
		goto bus_register_failed;
	retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);	// 创建usb bus通知回调usb_bus_nb
	if (retval)
		
### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值