一、到底是platform_device 先注册呢?还是platform_driver先注册?
platform_device 和 platform_driver的注册顺序是相对的。
我们遇到的绝大多数情况都是 platform_device 先注册,然后是platform_driver 后注册,比如usb驱动。
但是也有例外的,比如U盘。
USB: usb 设备插进去电脑,开始运行usb 驱动程序,安装 usb 驱动时候就会开始“遍历”usb 总线上的所有设备,然后与之(驱动)绑定或匹配。(设备先注册,后驱动注册)
U盘:驱动程序安装 ok,每次 u 盘设备插电脑,这个时候就是驱动先注册,设备去找驱动与之绑定。
二、分析平台驱动的注册过程
2.1 platform_driver_register()是什么时候被调用的?
boot加载linux kernel
|
|--start_kernel() //启动内核
|
|--rest_init();
|
|--kernel_thread(kernel_init, NULL, CLONE_FS); //创建kernel_init线程
|
|--static int __ref kernel_init(void *unused)
|
|--kernel_init_freeable();
|
|--do_basic_setup(); //做一些初始化动作
|
|--driver_init();
|
|--do_initcalls(); //加载 module_init()声明的驱动,然后驱动中的platform_driver_register() 被加载
2.2 platform_driver_register() 驱动注册过程分析
以 kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c 为例子进行说明。
2.2.1 重要结构体
1) device_driver
//platform_driver.driver
struct device_driver {
const char *name; //驱动的名字
struct bus_type *bus; //驱动所属的总线类型
struct module *owner;
const char *mod_name; /* used for built-in modules */
bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
const struct of_device_id *of_match_table;
const struct acpi_device_id *acpi_match_table;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown) (struct device *dev);
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
const struct dev_pm_ops *pm;
struct driver_private *p; //驱动的私有数据
};
struct driver_private {
struct kobject kobj;
struct klist klist_devices;
stru