linux 驱动-匹配1 (platform_bus_type)

server/2024/12/22 20:56:42/

目录

匹配入口

匹配顺序(platform_match )

方式1:

方式2(重点)

方式3

方式4 (重点)


匹配入口

driver_match_device 实际调用platform_match

driver_match_device(drv, dev);static inline int driver_match_device(struct device_driver *drv,struct device *dev)
{return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}

匹配顺序(platform_match )

static struct platform_driver bcm2835_rng_driver = {
    .driver = {
        .name = "bcm2835-rng",              方式1 /方式5
        .of_match_table = bcm2835_rng_of_match, 方式2 /方式3()
    },
    .probe        = bcm2835_rng_probe,
    .id_table    = bcm2835_rng_devtype,  方式4
};

static int platform_match(struct device *dev, struct device_driver *drv)
{struct platform_device *pdev = to_platform_device(dev);struct platform_driver *pdrv = to_platform_driver(drv);/* When driver_override is set, only bind to the matching driver */if (pdev->driver_override)    	//方式1: 根据device_driver 的namereturn !strcmp(pdev->driver_override, drv->name);/* Attempt an OF style match first */if (of_driver_match_device(dev, drv))  //方式2: 根据device_driver的of_match_tablereturn 1;                              去匹配device_node的compatibale/type/name/* Then try ACPI style match */if (acpi_driver_match_device(dev, drv))//方式3: 根据 device_driver的drv->acpi_match_table, drv->of_match_tablereturn 1;/* Then try to match against the id table */if (pdrv->id_table)			 //方式4:根据platform_driver驱动的id_table(id->name 与pdev->name)return platform_match_id(pdrv->id_table, pdev) != NULL;/* fall-back to driver name match */return (strcmp(pdev->name, drv->name) == 0);//方式5: 根据device_driver的name
}

方式1:

        说明:driver_override 主要用于调试驱动,强制指定一个驱动来绑定到这个设备
        操作: 用户空间通过特定的接口(如 sysfs)来设置这个值
        实例: echo "my_driver" > /sys/bus/platform/devices/my_device/driver_override

方式2(重点)

  根据of_device_id 的 compatible, type, name顺序去匹配device_node的compatible, type, name

方式3

        acpi 方式,暂略

方式4 (重点)

        static struct platform_device_id bcm2835_rng_devtype[] = {
                { .name = "bcm2835-rng" },
                { .name = "bcm63xx-rng" },
                { /* sentinel */ }
        };

struct platform_device_id {
        char name[PLATFORM_NAME_SIZE];
        kernel_ulong_t driver_data;
};
static const struct platform_device_id *platform_match_id(
const struct platform_device_id *id,  struct platform_device *pdev)
{
        while (id->name[0]) {
                if (strcmp(pdev->name, id->name) == 0) {
                        pdev->id_entry = id; 填充platform_device 的id_entry
                        return id;
                }
                id++;
        }
        return NULL;
}

方式5:

         strcmp(pdev->name, drv->name) == 0

        


http://www.ppmy.cn/server/10298.html

相关文章

代码随想录算法训练营day1 | 704. 二分查找、27. 移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,需要移动其他元素的地址。 那么二维数组在内存的空间地址是连续的么?不同编程语言的内存管理是不…

Centos7虚拟机与真机乎ping以及虚拟机ping不通的原因

虚拟机网络完全正常的标准 物理机可以ping通虚拟机的IP虚拟机可以ping通物理机的IP虚拟机可以ping通baidu.com等网站 使用工具版本:Centos7 前提: 虚拟机必须开机才可以连接访问 克隆出来的虚拟机一定要手动修改IP,IP冲突的情况下不能联网 …

Linux i2c-tool工具基础使用

一.i2cdetect i2cdetect 是一个用户空间程序,用于扫描 I2C 总线上的设备。它输出一个表格,其中包含指定总线上检测到的设备列表。以下是 i2cdetect 的使用方法: 运行扫描: 要执行 I2C 扫描,请使用以下命令&#xff1…

[C++][算法基础]求组合数(I)

给定 𝑛 组询问,每组询问给定两个整数 𝑎,𝑏,请你输出 的值。 输入格式 第一行包含整数 𝑛。 接下来 𝑛 行,每行包含一组 𝑎 和 𝑏。 输出格…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标:1、实现串口定长收发数据通信;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA(Direct Memory …

3D模型格式转换工具HOOPS Exchange:3D CAD数据的快速导入与导出

在当今的工程设计领域中,快速且可靠地处理3D CAD数据是至关重要的。HOOPS Exchange SDK通过提供一组C软件库,为开发团队提供了实现这一目标的有效工具。 什么是HOOPS Exchange? HOOPS Exchange是一组C软件库,旨在为开发团队提供…

开发了一个在线客服系统

开发了一个在线客服系统 作为一名程序员,我最近完成了一个激动人心的项目:一个功能全面的在线客服系统。在这个项目中,我使用了Golang作为后端开发语言,MySQL作为数据库,前端则是通过Vue2和ElementUI框架搭建的。 技…