问题
有些时候,产品定义的i2c编号和芯片的编号不一致,如下。
产品侧 | 芯片侧 | 驱动设备名 |
i2c0 | i2c4 | /dev/i2c-2 |
i2c1 | i2c2 | /dev/i2c-0 |
i2c2 | i2c3 | /dev/i2c-1 |
芯片侧,设备驱动名是是按照芯片侧的顺序来分配的,即芯片侧i2c2对应/dev/i2c-0,
i2c3对应/dev/i2c-1,i2c4对应/dev/i2c-2
但我们期望的顺序如下,按照产品侧的顺序来分配:
产品侧 | 芯片侧 | 驱动设备名 |
i2c0 | i2c4 | /dev/i2c-0 |
i2c1 | i2c2 | /dev/i2c-1 |
i2c2 | i2c3 | /dev/i2c-2 |
实现方法
修改设备树,使用aliases给子节点取别名,如下
aliases {
i2c0 = &i2c4;
i2c1 = &i2c2;
i2c2 = &i2c3;
};
对应的代码路径为drivers/i2c/i2c-core-base.c,具体代码如下
int i2c_add_adapter(struct i2c_adapter *adapter)
{
struct device *dev = &adapter->dev;
int id;
if (dev->of_node) {
id = of_alias_get_id(dev->of_node, "i2c"); //获取别名的ID
if (id >= 0) {
adapter->nr = id;
return __i2c_add_numbered_adapter(adapter);
}
}
mutex_lock(&core_lock);
id = idr_alloc(&i2c_adapter_idr, adapter,
__i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
mutex_unlock(&core_lock);
if (WARN(id < 0, "couldn't get idr"))
return id;
adapter->nr = id;
return i2c_register_adapter(adapter);
}