如何在Linux内核驱动中通过设备名获取其他设备的struct device*?
通过设备名称获取struct device*的内核API方案
如果无法通过设备树访问目标设备,且仅知晓设备名称,你可以采用以下两种通用方法实现需求:
方法1:使用bus_find_device()全局查找
该函数可遍历指定总线的所有设备,通过自定义匹配函数筛选目标设备。若不清楚目标设备所属总线,传入NULL会遍历系统内所有总线的设备。
示例代码:
#include <linux/device.h> static int match_dev_name(struct device *dev, void *data) { const char *target_name = data; return strcmp(dev_name(dev), target_name) == 0; } struct device *get_dev_by_name(const char *name) { struct device *dev; dev = bus_find_device(NULL, NULL, (void *)name, match_dev_name); if (dev) { /* 必须增加引用计数,避免设备被内核提前释放 */ get_device(dev); } return dev; }
使用完获取到的struct device*后,务必调用put_device(dev)释放引用计数。
方法2:针对特定总线的定向查找(已知总线类型时优先使用)
若明确目标设备所属总线(比如platform总线),使用对应总线的专用查找函数效率更高:
- 针对platform设备:使用
platform_device_find()获取struct platform_device*,其dev成员即为目标struct device*#include <linux/platform_device.h> struct device *get_platform_dev_by_name(const char *name) { struct platform_device *pdev = platform_device_find(name, NULL); if (pdev) { get_device(&pdev->dev); return &pdev->dev; } return NULL; } - 针对字符设备类:可使用
class_find_device(),需先通过class_get()获取对应设备类指针
关键说明
- 全局遍历设备链表效率较低,若有额外信息(比如总线类型、设备类),优先使用针对性查找函数
- 必须严格管理设备引用计数:
get_device()增加引用,put_device()减少引用,防止设备在使用过程中被内核释放 driver_find_device_by_name()仅查找与指定驱动绑定的设备,因你缺少目标设备对应的struct device_driver*,该函数不适用当前场景
内容的提问来源于stack exchange,提问作者JohnnyFromBF
相关产品推荐
相关产品推荐

