一、compatible匹配
1、dts 中写法
compatible = “aaa,bbb”
当一个驱动支持多个设备的时候,在每个设备的dts中,都会配置各自的compatible,当与driver中的compatible匹配后,会取各自的data。在 __of_match_node中有match++。
2、example
static const struct of_device_id plat_drv_match[] = {
{
.compatible = "aaa,bbb", .data = &bbb_hw_data},
{
.compatible = "aaa,ccc", .data = &ccc_hw_data},
{
}
};
data = of_device_get_match_data(dev);
在bbb.dts中,匹配到第1条,data就用第1条
在ccc.dts中,匹配到第2条,data就用第2条
3、源码
以下函数位于 //kernel4.14/drivers/of/device.c
const void *of_device_get_match_data(const struct device *dev)
{
const struct of_device_id *match;
match = of_match_device(dev->driver->of_match_table, dev);
if (!match)
return NULL;
return match->data;
}
EXPORT_SYMBOL(of_device_get_match_data);
判断dts中的compatible属性是否包含driver中指定的compatible,
实际上返回的是dev->driver->of_match_table->data。
data是void *类型,自己如果想取到data里的值,就可以自己定义类型,里面可以放一些自己需要的参数。
二、根据dts中的reg-names得到dts中配置的reg
1、dts 中写法
reg的参数:第一个是地址,第二个是映射长度。
如果是32位,reg = <0x80000000 0x1000>;
如果是64位,reg = <0 0x80000000 0 0x1000>;
reg-names = “bbb”;
2、example
resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bbb");
addr = resource->start; //为reg中的起始地址
size = resource_size(resource); //为reg中的内存大小
virt_addr = devm_ioremap_nocache(&pdev->dev, addr, size); //物理地址和虚拟地址的映射
3、源码
以下函数位于 //kernel4.14/drivers/base/platform.c
/**
* platform_get_resource_byname - get a resource for a device by name
* @dev: platform device
* @type: resource type
* @name: resource name
*/
struct resource *platform_get_resource_byname(struct platform_device *dev,
unsigned int type,
const char *name)
{
u32 i