我需要在配置以太网控制器之前(即在以太网控制器驱动程序和设备绑定之前)使用 GPIO 向交换机发送重置信号。我已在设备树中的 GPIO 控制器驱动程序和 GPIO 控制器设备节点条目中添加了重置逻辑。运行良好。
我已将最终的 dtb 文件转换为 dts 并检查了设备节点顺序,以太网控制器设备节点位于 gpio 控制器设备节点之前。但在启动期间,GPIO 控制器驱动程序绑定发生在以太网控制器驱动程序绑定之前,因此它工作正常。我已重新启动多次,并观察到 GPIO 控制器始终先于以太网控制器出现。
设备树设备节点绑定顺序有没有更新的地方。我担心的是,如果以太网控制器驱动程序绑定发生在 GPIO 控制器之前,那么该功能将无法工作。
设备树设备节点绑定顺序是如何决定的?
但是在启动期间,GPIO 控制器驱动程序绑定发生在以太网控制器驱动程序绑定之前,
您可能指的是驱动程序初始化,而不是“绑定”。
Linux 内核 Documentation/driver-api/driver-model/binding.rst 将 driver binding 定义为“将设备与可以控制它的设备驱动程序关联起来的过程。”
(Linux 内核倾向于将驱动程序初始化与设备探测和绑定结合或混为一谈,尤其是在启动时。)
您的 gpio 控制器驱动程序可能使用 subsys_initcall() 宏声明其初始化例程。
而您的以太网(MAC?)驱动程序可能使用 module_init() 宏声明其初始化例程。
参见 初始化驱动程序时 module_init 和 subsys_initcall 有什么区别?
底线:使用 subsys_initcall() 的驱动程序意味着始终在使用 module_init() 的任何和所有驱动程序之前进行初始化。
有没有更新设备树设备节点绑定顺序的地方。
不,你正在做出没有根据的假设。
您未声明的前提是设备树中的节点顺序以某种方式决定了设备驱动程序和/或设备探测/绑定的初始化顺序,这是错误的。
设备树设备节点绑定顺序是如何决定的?
“绑定顺序”本质上是由驱动程序初始化例程的执行顺序决定的。
扁平化设备树中的节点顺序无法决定任何事情。
在正在运行的系统上,检查 /proc/device-tree/,并找到外围总线的子目录。无论节点在源 DT 中的排序顺序如何,这里都不会保留。
在 initcall 级别内,驱动程序例程的执行顺序在内核构建时确定。
这记录在内核源代码中 /include/linux/init.h:
initcalls are now grouped by functionality into separate subsections.
Ordering inside the subsections is determined by link order.
如果您的驱动程序碰巧使用相同的初始化级别,那么解决方案请参见 序列化驱动程序的 init 调用顺序,这些调用顺序在同一 init 级别注册