DM模型probe的调用时机

版本:uboot2019
平台:arm926

背景:最近调试gpio驱动发现一直没有进入.probe(),已经确认compatible匹配ok,driver和device已经关联上。但是很艰难才找到调用.probe()的位置。

在此记录gpio驱动调用.probed()的流程:

gpio_request->
gpio_to_device->
uclass_first_device->
uclass_get_device_tail->
device_probe->
uclass_get_device_by_seq->
uclass_get_device_tail->
device_probe->
xxxx_gpio_probe

可以推断很多模块的probe都是在确认系统被使用的时候才会调用.probe()。
由于原系统没有调用gpio_request()所以不会调用gpio.probe(),因此豁然开朗。

<think>好的,我现在需要帮助用户了解如何激活U-Boot中的probe函数。用户之前已经询问过probe和ofdata_to_platdata函数的区别及调用时机,现在他们想知道如何具体激活probe函数。 首先,我得回忆一下之前的回答。之前提到过probe函数是在设备激活时被调用的,通常在board_init阶段调用路径是device_probe() -> drv->probe()。用户现在可能是在实际开发中遇到了probe没有被执行的情况,需要知道如何触发它的执行。 接下来,我需要详细解释激活probe的条件和步骤。可能的要点包括设备与驱动的正确绑定、设备树节点的正确配置、U-Boot的初始化流程,以及手动触发的方法。 用户可能对设备树的配置不太清楚,比如compatible属性是否正确匹配驱动中的of_match。这时候需要举例说明设备树节点的写法,确保compatible字符串与驱动中的一致。同时,要提到检查U-Boot是否启用了设备树(OF_CONTROL)和对应的驱动是否被编译进去。 另外,U-Boot的初始化流程中,dm_init_and_scan会在relocation之后扫描设备树并绑定驱动,这时候会触发ofdata_to_platdata,之后在设备探测阶段调用probe。用户可能需要知道这些阶段是如何衔接的,或者是否有必要在特定阶段手动调用device_probe()。 还有,用户可能遇到设备状态的问题,比如设备没有被正确标记为激活状态,或者依赖的其他驱动没有先初始化。这时候需要说明检查设备状态的方法,比如使用dm命令查看设备状态,或者确保依赖关系正确。 手动触发的情况,比如在命令行通过dm命令调用probe,或者在代码中主动调用device_probe(dev),这也是一个可能的解决方案,适用于调试或者特定需求。 需要考虑用户的潜在问题,比如设备树配置错误、驱动未正确注册、编译选项未开启等。因此,在回答中需要涵盖这些检查点,并提供示例代码或命令帮助用户验证。 最后,总结激活probe的关键步骤,确保用户能按顺序排查问题,从设备树配置到驱动匹配,再到初始化流程和手动触发方法,逐步解决问题。</think>在U-Boot驱动框架中,`probe`函数的激活需要满足**设备驱动绑定成功**和**设备初始化触发条件**。以下是具体步骤和原理: --- ### 一、激活`probe`函数的核心条件 1. **驱动与设备绑定成功** - 设备树(DeviceTree)中存在与驱动`of_match`兼容的节点(即`compatible`属性匹配)。 - 驱动通过`U_BOOT_DRIVER`宏正确注册到U-Boot驱动模型(Driver Model, DM)。 2. **设备初始化流程触发** - U-Boot启动时自动激活(默认流程)。 - 手动调用设备探测接口(调试或特殊场景)。 --- ### 二、自动激活流程(默认场景) #### 1. **U-Boot初始化阶段** - **触发时机**:在`board_init()`或`board_init_r()`阶段,通过以下流程激活: ```text board_init() → dm_init_and_scan() → dm_extended_scan_fdt() → device_probe() ``` - **关键步骤**: 1. **设备树扫描**:解析设备树,匹配驱动与设备节点(通过`compatible`属性)。 2. **设备绑定驱动**:调用`device_bind_driver()`绑定驱动,触发`ofdata_to_platdata`。 3. **设备激活**:最终调用`device_probe()`执行`probe`函数。 #### 2. **依赖的编译配置** - 确保驱动代码被编译进U-Boot镜像(检查Kconfig或Makefile)。 - 启用设备树支持(`CONFIG_OF_CONTROL=y`)。 - 驱动声明了正确的`U_BOOT_DRIVER`结构(包含`.probe`函数指针)。 --- ### 三、手动激活方法(调试或特殊需求) #### 1. **命令行触发(U-Boot Shell)** - 使用`dm`命令手动探测设备: ```bash # 查看所有设备状态 dm tree # 手动触发指定设备的probe dm probe <device-name> ``` - 示例:激活名为`mmc@12345678`的设备: ```bash dm probe mmc@12345678 ``` #### 2. **代码中主动调用** - 在自定义初始化代码中调用`device_probe()`: ```c struct udevice *dev; int ret = uclass_get_device_by_name(UCLASS_MMC, "mmc@12345678", &dev); if (!ret) ret = device_probe(dev); // 手动触发probe ``` --- ### 四、常见问题排查 如果`probe`未执行,需检查以下内容: 1. **设备树配置** - 设备节点的`compatible`属性是否与驱动`of_match`完全匹配。 - 示例:驱动定义: ```c static const struct udevice_id my_driver_ids[] = { { .compatible = "vendor,my-device" }, // 必须与设备树一致 { } }; ``` - 设备树节点需包含: ```dts my_device: my-device@0 { compatible = "vendor,my-device"; // 字符串匹配 reg = <0x0 0x1000>; }; ``` 2. **驱动注册状态** - 检查驱动是否通过`U_BOOT_DRIVER`宏注册,且未被条件编译排除。 - 确认`.probe`函数指针已赋值(例如:`.probe = my_probe`)。 3. **设备状态检查** - 使用`dm tree`命令查看设备是否处于`active`状态。 - 若设备状态为`inactive`,可能是依赖的父设备未初始化。 --- ### 五、流程图解 ```text 启动U-Boot → 解析设备树 → 绑定驱动(ofdata_to_platdata) → 设备激活(probe) ↑ ↑ | | 手动调用dm probe或device_probe()—————┘ ``` --- ### 六、总结 - **自动激活**:依赖U-Boot标准初始化流程,需确保设备树和驱动配置正确。 - **手动激活**:通过命令行或代码主动触发,适用于调试或复杂初始化场景。 - **关键检查点**:设备树兼容性、驱动注册状态、设备依赖关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值