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

如何在I2C驱动中从设备树读取并使用GPIO?

问题

我编写了一个I2C驱动,希望将驱动所使用的GPIO通过设备树进行配置。当前的设备树条目如下:

&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";
    ...
    myi2c: myi2c@43 {
        compatible = "fsl,myi2c";
        reg = <0x43>;
    };
}

我想要在myi2c节点中添加如下配置项:

myi2c-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;

我了解到在platform驱动中可以通过devm_gpiod_get()结合struct platform_device的dev成员实现GPIO控制,但在I2C驱动的i2c_probe()函数中,只能拿到struct i2c_client指针,无法直接访问struct platform_device,请问如何在I2C驱动中从设备树读取myi2c-gpios的值并使用?

解决方案
  • 第一步:修改设备树
    先将GPIO配置项添加到myi2c节点中,完整的节点如下:

    &i2c1 {
        clock-frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c1>;
        status = "okay";
        ...
        myi2c: myi2c@43 {
            compatible = "fsl,myi2c";
            reg = <0x43>;
            myi2c-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
        };
    }
    
  • 第二步:在I2C驱动的probe函数中读取GPIO
    struct i2c_client结构体包含一个struct device类型的成员dev,可以直接用这个设备指针调用GPIO相关的内核函数。推荐使用带devm_前缀的函数(自动管理资源,无需手动释放),示例代码如下:

    #include <linux/gpio/consumer.h>
    
    static int myi2c_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
    {
        struct gpio_desc *my_gpio;
        int ret;
    
        // 从设备树获取GPIO,第二个参数"myi2c"对应设备树中的"myi2c-gpios"属性
        // 最后一个参数指定GPIO初始状态,这里设为输出低电平
        my_gpio = devm_gpiod_get(&i2c->dev, "myi2c", GPIOD_OUT_LOW);
        if (IS_ERR(my_gpio)) {
            ret = PTR_ERR(my_gpio);
            dev_err(&i2c->dev, "获取myi2c GPIO失败: %d\n", ret);
            return ret;
        }
    
        // 示例:将GPIO设置为高电平
        gpiod_set_value(my_gpio, 1);
    
        // 后续可以根据业务需求使用my_gpio进行GPIO控制
        return 0;
    }
    
  • 关键说明

    1. 属性名对应规则:设备树中属性名为<name>-gpios,则devm_gpiod_get()的第二个参数填<name>(即这里的myi2c对应myi2c-gpios)
    2. 方向参数:可以根据需求选择GPIOD_OUT_LOW/GPIOD_OUT_HIGH(输出模式)或GPIOD_IN(输入模式)
    3. 错误处理:必须检查devm_gpiod_get()的返回值,避免空指针或无效GPIO导致的驱动异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:04