Linux驱动开发 - i2c驱动的编号如何自定义

问题

有些时候,产品定义的i2c编号和芯片的编号不一致,如下。

产品侧芯片侧驱动设备名
i2c0i2c4/dev/i2c-2
i2c1i2c2/dev/i2c-0
i2c2i2c3/dev/i2c-1

芯片侧,设备驱动名是是按照芯片侧的顺序来分配的,即芯片侧i2c2对应/dev/i2c-0,

i2c3对应/dev/i2c-1,i2c4对应/dev/i2c-2

但我们期望的顺序如下,按照产品侧的顺序来分配:

产品侧芯片侧驱动设备名
i2c0i2c4/dev/i2c-0
i2c1i2c2/dev/i2c-1
i2c2i2c3/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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值