module_platform_driver 什么时候调用
时间: 2023-12-09 15:02:20 浏览: 43
module_platform_driver 函数是针对平台设备的驱动程序模块的入口函数,可以在模块初始化时调用。当模块被加载时,内核将自动调用该函数,初始化平台驱动程序并将其注册到内核平台设备框架中。在注册完成后,内核可以通过 platform_device_register() 函数向平台设备框架中添加新的平台设备。当平台设备被添加时,内核将自动调用平台驱动程序的 probe() 函数进行设备初始化。因此,module_platform_driver 函数通常在模块的初始化函数中被调用。
相关问题
驱动程序什么时候初始化?实在注册platform_driver的时候吗
驱动程序的初始化是在内核加载驱动程序时进行的。当内核检测到有新的硬件设备插入或者需要加载特定的驱动程序时,它会调用对应的驱动程序的初始化函数来初始化该驱动程序。
对于Platform设备,驱动程序的初始化通常在注册`platform_driver`时进行。`platform_driver`是注册Platform设备驱动程序的数据结构,它包含了驱动程序的一些属性信息,如驱动程序的名称、设备ID、与设备匹配的`of_device_id`表等。在注册`platform_driver`时,内核会自动调用驱动程序的初始化函数来完成驱动程序的初始化。
以下是一个Platform设备驱动程序的示例:
```c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
static int my_platform_probe(struct platform_device *pdev)
{
// 驱动程序的初始化代码
return 0;
}
static int my_platform_remove(struct platform_device *pdev)
{
// 驱动程序的卸载代码
return 0;
}
static struct platform_driver my_platform_driver = {
.probe = my_platform_probe,
.remove = my_platform_remove,
.driver = {
.name = "my-platform-driver",
.owner = THIS_MODULE,
},
};
static int __init my_platform_init(void)
{
return platform_driver_register(&my_platform_driver);
}
static void __exit my_platform_exit(void)
{
platform_driver_unregister(&my_platform_driver);
}
module_init(my_platform_init);
module_exit(my_platform_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("My Platform Driver");
```
在该示例中,`my_platform_probe()`和`my_platform_remove()`函数分别为驱动程序的初始化和卸载函数。在`my_platform_driver`结构体中,使用`.probe`和`.remove`字段分别指定了驱动程序的初始化和卸载函数。在`my_platform_init()`函数中,使用`platform_driver_register()`函数来注册驱动程序。在`my_platform_exit()`函数中,使用`platform_driver_unregister()`函数来卸载驱动程序。
当内核检测到需要加载该驱动程序时,就会调用`my_platform_probe()`函数来初始化驱动程序。当需要卸载该驱动程序时,就会调用`my_platform_remove()`函数来卸载驱动程序。
驱动里面有如下代码: static struct platformm_driver smb5_drriver={ .driver={ .name = "qcom,qpnp-smb5", .of_match_table = mtch_tablee, } .probe = smb5_probe, .remove = smb5_remove, .shutdown = smb5_shutdown, }; module_platform__driver(smb5_driiver); 其中,外部或者说binder是如何调用shutdown 方法的?
在Linux内核中,`struct platform_driver`结构体中的`.shutdown`函数是在系统关闭时被调用的。当用户请求关机或重启操作时,内核会向所有注册了`.shutdown`函数的驱动程序发送信号,通知它们关闭硬件设备或释放资源等操作。
在你提供的驱动程序中,`smb5_shutdown`函数被指定为`.shutdown`函数,因此当系统关闭时,内核会自动调用`smb5_shutdown`函数。该函数用于释放`smb5`驱动程序占用的资源,例如释放已经分配的内存、关闭硬件设备等。
至于外部或者说binder是如何调用`smb5_shutdown`函数的,实际上并没有外部或者binder直接调用`smb5_shutdown`函数的过程。`smb5_shutdown`函数是在Linux内核中被调用的,而binder是用户空间与内核空间之间的通信接口,不会直接调用内核中的函数。当用户空间应用程序向内核空间发起请求时,内核会根据请求的类型调用相应的函数,其中就包括了驱动程序中的`.probe`、`.remove`和`.shutdown`等函数。