spi驱动执行的大致流程为:
内核解析设备树
将设备树dtb文件解析成device_node格式
将device_node格式解析成platform_device格式
最终会在/sys/bus/platform/devices下显示
节点要满足什么要求才会被转换成platform_device?
节点中包含compatible属性
节点中compatible属性包含arm,primecell之一的节点会被转换成amba设备,不会被转换成platform_device。
节点中compatible属性包含simple-bus,simple-mfd,isa之一的节点下包含compatible属性的子节点
驱动和设备通过bus总线match函数规则进行匹配,匹配成功后执行驱动中的probe函数。
第一步:比较platform_driver驱动的of_match_table结构体变量的成员变量compatible是否与设备树中描述的设备compatible匹配。
platform_driver.driver.of_match_table.compatible ?= 设备树中设备的compatible属性
第二步:ACPI匹配方式。
第三步:platform_driver结构体id_table属性进行匹配。
platform_driver.id_table.name ?= 设备树中设备的name属性
第四步:驱动与设备树设备名称匹配(通过name字段)
platform_driver.driver.name ?= 设备树中设备的name属性
probe函数将platform_device指针传递给我们定义的结构体。
struct bus_type spi_bus_type;
struct bus_type spi_bus_type = {
.name = "spi",
.dev_groups = spi_dev_groups,
.match = spi_match_device, //设备和驱动匹配函数
.uevent = spi_uevent, //设备插拔和状态变化
};
EXPORT_SYMBOL_GPL(spi_bus_type);