Linux kernel 从设备树获取gpio号的正确方法

Linux kernel 从设备树获取gpio号的正确方法,linux-kernel,linux-device-driver,device-tree,Linux Kernel,Linux Device Driver,Device Tree,这是吗 _get_name_gpio的(子项,“gpio name”,0); 获取GPIO号的正确方法?其中,对应的设备树如下所示: gpio-name = <&gpio0 21 0>; gpio name=; 我得到这个错误: 对的探测失败,错误为-2 错误代码-2代表什么?这是设备树解析错误吗?此代码快照显示了如何获取/设置特定GPIO。这是一个经过测试的代码。 struct device_node *np = client->dev.of_node

这是吗

_get_name_gpio的
(子项,“gpio name”,0);
获取GPIO号的正确方法?其中,对应的设备树如下所示:

gpio-name = <&gpio0 21 0>;
gpio name=;
我得到这个错误:

对的探测失败,错误为-2


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

此代码快照显示了如何获取/设置特定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.
struct device\u node*np=client->dev.of\u node;
int gpio;
u8 buf[最大I2C数据长度];
int-ret,trys=0;
if(!np)
return-ENODEV;
gpio=of_get_named_gpio(np,“**dts文件中使用的gpio名称**”,0);
如果(!gpio_是有效的(gpio))
return-ENODEV;
ret=gpio_请求(gpio,“egalax_irq”);
如果(ret<0){
开发错误(&C)客户端->开发,
“请求gpio失败,无法唤醒控制器:%d\n”,ret);
返回ret;
}   
gpio_方向_输出(gpio,1);
ret=gpio_获取_值(gpio);
“ret”将具有gpio值。

是否检查了dmesg输出?您的
of\u get\u named\u gpio()
调用应该有一些相关消息,这将解释实际错误是什么。
-enoint
表示没有此类gpio。DT以及其他提供的资源(ACPI,内置设备属性)有一个特定的gpio模式,即
-GPIOs
,其中您使用
作为调用
的参数,调用
。无论如何,我强烈建议不要使用这种API,而是直接使用它的API获取GPIO。@AndyShevchenko但是这种类型的API已经在内核中的现有驱动程序中使用过了。看到这个:,你指的是什么API,你能把它贴出来吗<代码>gpiod_*()调用类型。自从新的API不断出现以来,使用什么并不重要。