You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过设备树或接口指定Linux平台设备ID获取GPIO模拟I2C适配器

GPIO模拟I2C适配器编号问题及解决方法

问题背景

尝试使用i2c-gpio驱动(路径:drivers/i2c/busses/i2c-gpio.c)通过GPIO模拟I2C适配器时,无法通过i2c_get_adapter()获取该适配器。原因是适配器编号由platform device的ID决定,而其默认值为-1,因此需要找到指定platform device ID的方法来设置合适的适配器编号,同时询问是否存在对应的设备树参数或内核API。

相关驱动代码片段

static int i2c_gpio_probe(struct platform_device *pdev)
{
    ...
    adap->nr = pdev->id;
    ret = i2c_bit_add_numbered_bus(adap);
    ...
}

问题解决

后续验证发现无需手动设置platform device ID即可获取适配器编号:在调用链i2c_bit_add_numbered_bus -> __i2c_bit_add_bus -> i2c_add_numbered_adapter -> i2c_add_adapter中,若当前已存在的适配器编号为N,GPIO模拟的适配器编号会自动分配为N+1。

设备树节点示例

i2c4: i2c_gpio {
     compatible = "i2c-gpio";
     sda-gpios = <&gpio 49 4>;
     scl-gpios = <&gpio 48 4>;
     i2c-gpio,delay-us = <2>;        /* ~100 kHz */
     #address-cells = <1>;
     #size-cells = <0>;
 };

platform_device结构体定义

struct platform_device {
     const char  *name;
     int     id;
     bool        id_auto;
     struct device   dev;
     u64     platform_dma_mask;
     struct device_dma_parameters dma_parms;
     u32     num_resources;
     struct resource *resource;

     const struct platform_device_id *id_entry;
     char *driver_override; /* Driver name to force a match */

     /* MFD cell pointer */
     struct mfd_cell *mfd_cell;

     /* arch specific additions */
     struct pdev_archdata    archdata;
 };

内容的提问来源于stack exchange,提问作者watermelon_shooter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:46