如何在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; }关键说明
- 属性名对应规则:设备树中属性名为
<name>-gpios,则devm_gpiod_get()的第二个参数填<name>(即这里的myi2c对应myi2c-gpios) - 方向参数:可以根据需求选择
GPIOD_OUT_LOW/GPIOD_OUT_HIGH(输出模式)或GPIOD_IN(输入模式) - 错误处理:必须检查
devm_gpiod_get()的返回值,避免空指针或无效GPIO导致的驱动异常
- 属性名对应规则:设备树中属性名为
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

