Linux设备驱动和设备匹配过程
在写驱动时我们都会用到一些注册函数比如:platform_driver_register,spi_register_driver、i2c_add_driver,接下来我们就一路追踪看看内核是怎样将我们的驱动和设备匹配起来并且调用我们写的prob函数,在此我们用platform_driver为例子。
struct platform_driver {
**int (*probe)(struct platform_device *);** //驱动和设备匹配成功之后调用
int (*remove)(struct platform_device *); //卸载驱动时调用
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
**struct device_driver driver;**
**const struct platform_device_id *id_table;**
bool prevent_deferred_probe;
};
struct device_driver {
const char *name; //与设备匹配时会用到的驱动名,一样就匹配成
struct bus_type *bus; 在注册函数platform_driver_register中指定
struct module *owner;
const char *mod_name; /* used for built-in modules */
bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
enum probe_type probe_type;
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;
};
1,简单来说,我们在编写驱动时指定的 struct platform_device_id *id_table、const char *name、const struct of_device_id *of_match_table 将是判断我们的驱动和设备是否能匹配的依据
匹配过程
#define platform_driver_register(drv) \
__platform_driver_register(drv, THIS_MODULE)
----------------------------------------------</