Linux设备驱动和设备匹配过程

本文详细探讨了Linux设备驱动与设备匹配的过程,从platform_driver_register等注册函数开始,追踪内核如何通过struct platform_device_id、of_match_table等进行匹配,并最终调用probe函数。匹配流程包括:基于device树的compatible属性匹配、id_table中的name匹配以及driver和device的name匹配。
摘要由CSDN通过智能技术生成

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)
	
----------------------------------------------</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值