【发布时间】:2021-03-01 18:57:53
【问题描述】:
在linux kernel 3.3中,drivers/mmc/host/dw-mmc.c文件有这部分。
static int __init dw_mci_init(void)
{
return platform_driver_probe(&dw_mci_driver, dw_mci_probe);
}
static void __exit dw_mci_exit(void)
{
platform_driver_unregister(&dw_mci_driver);
}
module_init(dw_mci_init);
module_exit(dw_mci_exit);
在内核启动过程中的某个时刻(实际上是在 start_kernel() 中,在 init_call 循环中),dw_mci_init 被调用(因为它带有 __init 标签),并且探测函数探测设备并安装驱动程序。几年前我修改了这个驱动来实现我们自己的 SD 卡控制器驱动。
现在,当我查看 linux 内核 5.4.21 时,同一文件的上述部分已更改为:
static int __init dw_mci_init(void)
{
pr_info("Synopsys Designware Multimedia Card Interface Driver\n");
return 0;
}
static void __exit dw_mci_exit(void)
{
}
module_init(dw_mci_init);
module_exit(dw_mci_exit);
驱动程序初始化函数只做一个打印。发生了什么?我猜在内核初始化的某个地方,内核会解析“设备树”(扁平设备树,.dtb 文件),然后找到并调用匹配的平台驱动程序来初始化设备和驱动程序。它是否正确?如果有,在内核源码哪里可以找到设备树(flattend device tree)解析和设备驱动安装操作?
【问题讨论】:
标签: linux arm linux-device-driver device-driver