如何通过设备树或接口指定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
相关产品推荐
相关产品推荐

