linux驱动开发——设备树节点转化为platform_device节点并与驱动匹配

一、设备树节点转化为platform_device的过程
1、dts文件转化过程

dts文件编译成为dtb文件之后供给内核解析,设备树中的每个节点都会转化为device_node节点,其中满足某些条件的节点将会被转化为platform_device节点
在这里插入图片描述

2、dts中的节点转化为platform_device节点的条件

只需包含下面的任意一个条件就能转化为platform_device节点
(1)根节点下的含有compatible属性的子节点,compatible属性是用于匹配驱动
如:节点key1和节点led将会被转回为platform_device节点
在这里插入图片描述
(2)如果节点中的compatible属性包含了"simple-bus"或者"simple-mdf"或者"isa"或者"arm,amba-bus",并且该节点的子节点包含compatible属性,那么该子节点就能转化为platform_device节点(IIC、SPI节点下的子节点即使满足条件也不应被转化为platform_device节点,应该交由对应的总线驱动程序去处理,而不是platform总线)
在这里插入图片描述

二、设备树节点转化为platform_device后匹配驱动的过程
1、转化之后节点信息的保存

设备树节点在转化为platform_device 节点之后
信息保存在 patform_device -> dev -> of_note节点中
在这里插入图片描述
of_node是一个device_node结构体,里面存放着节点的name、type和properties(属性链表)
在这里插入图片描述

2、匹配驱动

在platform_driver->driver中,有一个of_match_table成员,是一个of_device_id的结构体数组,每一个数组元素都存放着name、type和compatible用于匹配设备树节点生成的platform_device
在这里插入图片描述
匹配时:
(1)匹配patform_device -> dev -> of_note->properties(属性)->compatible属性的值 与platform_driver->driver->of_match_table中每一个节点->compatible成员的值 ,成功则关联
(2)匹配patform_device -> dev -> of_note->type 与platform_driver->driver->of_match_table中每一个节点->type成员的值 ,成功则关联
(3)匹配patform_device -> dev -> of_note->name 与 platform_driver->driver->of_match_table中每一个节点->name成员的值 ,成功则关联

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`of_device_id`结构体中的`data`字段是一个指向与设备相关的数据的指针,通常用于在驱动程序中访问设备树节点属性。在设备树中,每个节点都有一个属性列表,驱动程序可以使用`of_device`结构体中的`dev.of_node`成员指针来获取该节点的属性,然后进行相应的操作。 例如,假设我们有一个名为`my-device`的设备节点,其属性列表中包含一个名为`my-property`的属性,我们可以先在`of_device_id`结构体中定义一个与之对应的数据结构: ```c struct my_device_data { int my_property; }; ``` 然后,在驱动程序初始化时,我们可以将这个数据结构指定为`of_device_id`结构体的`data`字段: ```c static const struct of_device_id my_driver_of_match[] = { { .compatible = "my-device", .data = &my_device_data }, { /* end of list */ }, }; ``` 接着,在驱动程序的`probe()`函数中,我们可以通过`of_device`结构体中的`dev.of_node`成员指针获取设备节点的属性,并将其保存到之前定义的数据结构中: ```c static int my_driver_probe(struct platform_device *pdev) { struct my_device_data *data; struct device_node *np = pdev->dev.of_node; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; of_property_read_u32(np, "my-property", &data->my_property); /* do something with my-property value */ return 0; } ``` 在上面的例子中,`of_property_read_u32()`函数用于从设备节点的属性列表中读取`my-property`属性,并将其保存到`my_device_data`结构体中的`my_property`字段中。这样,我们就可以在驱动程序中访问设备树中的节点属性,并按需进行相应的操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值