【问题标题】:correct way to get the gpio number from the device tree从设备树中获取 gpio 编号的正确方法
【发布时间】:2018-03-09 17:23:05
【问题描述】:

这是

of_get_named_gpio(child, "gpio-name", 0);

获取 GPIO 编号的正确方法?其中对应的设备树如下:

gpio-name = <&gpio0 21 0>;

我收到此错误:

探测失败,错误 -2

错误代码-2 代表什么?这是设备树解析错误吗?

【问题讨论】:

  • 你检查过dmesg 的输出吗?您的of_get_named_gpio() 调用应该有一些相关消息,可以解释实际错误是什么。
  • -ENOENT 表示没有这样的 GPIO。 DT 以及其他资源提供(ACPI,内置设备属性)具有特定的 GPIO 模式,即&lt;NAME&gt;-gpios,您可以在其中使用&lt;NAME&gt; 作为调用of_get_named_gpio(child, "&lt;NAME&gt;") 的参数。无论如何,我强烈建议不要使用此类 API,而直接使用其 API 获取 GPIO。
  • @AndyShevchenko 但此类 API 已在内核中的现有驱动程序中使用。看到这个:lxr.free-electrons.com/source/drivers/leds/leds-ns2.c,你指的是什么API,可以发一下吗!
  • gpiod_*() 类型的电话。 使用什么并不重要,因为新的 API不断出现

标签: linux-kernel linux-device-driver device-tree


【解决方案1】:

此代码快照显示了如何获取/设置特定的 GPIO。这是经过测试的代码。

     struct device_node *np = client->dev.of_node;
     int gpio;
     u8 buf[MAX_I2C_DATA_LEN];   
     int ret, tries = 0;

     if (!np)
             return -ENODEV;            

     gpio = of_get_named_gpio(np, "**gpio-name-used-in-dts-file**", 0); 
     if (!gpio_is_valid(gpio))
             return -ENODEV;            

     ret = gpio_request(gpio, "egalax_irq");  
     if (ret < 0) {            
          dev_err(&client->dev,
         "request gpio failed, cannot wake up controller: %d\n",ret);
             return ret;
     }   

     gpio_direction_output(gpio, 1); 
     ret = gpio_get_value(gpio);

     ""ret"" Will have gpio value.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2013-02-09
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多