【问题标题】:GPIO is uncontrolled when setting device-tree node without pinctrl-names设置没有 pinctrl 名称的设备树节点时,GPIO 不受控制
【发布时间】:2021-01-29 09:32:16
【问题描述】:

我正在研究 imx8mm 并使用 Linux 内核 v4.14.98 测试 GPIO。

设备树节点为:

&iomuxc {
    pinctrl-names = "default";
    
    ...

    imx8mm-evk {    
        pinctrl_gpio_plural: gpiopluralgrp {
            fsl,pins = <
                MX8MM_IOMUXC_GPIO1_IO11_GPIO1_IO11      0x41
            >;
        };
    };
};

...

plural {
    compatible = "gpio-plural";
    /* pinctrl-names = "default"; */   
    pinctrl-0 = <&pinctrl_gpio_plural>;
    reset-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
};

我写了一个驱动来测试这个

static int gpio_plural_probe(struct platform_device *pdev)
{
    struct gpio_plural_data *drvdata;

    drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
    if (drvdata == NULL)
        return -ENOMEM;

    drvdata->reset = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_HIGH);
    if (IS_ERR(drvdata->reset)) {
        printk("Error: reset not found\n");
        return -EINVAL;
    }

    gpiod_set_value(drvdata->reset, 0);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 1);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 0);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 1);

    return 0;
}

但是,当我将 pinctrl-names 注释为上面显示的设备树时,我无法控制 GPIO 引脚。 GPIO 引脚始终保持高电平。

devicetree.c 中,statename 将被替换为propname 后缀,这里是“0”。但它只是一个常量名称,可以是任何字符串。所以我的问题是为什么我不能在不设置 pinctrl-names 的情况下控制 GPIO 引脚?

【问题讨论】:

  • 您指的是电源管理阶段引脚控制的所谓状态default 表示您定义了设备处于 D0 模式(启动并运行)时的状态。

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


【解决方案1】:

不能是任何名称,大部分节点都会有pinctrl-names = "default";,因为这会使pinctrl-0成为设备引脚的默认状态。

这实际上非常重要,因为设备核心会在探测设备之前使用它来检索和设置正确的状态,请参阅pinctrl_bind_pins。确实如此:

dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
                    PINCTRL_STATE_DEFAULT);

其中PINCTRL_STATE_DEFAULT"default"

然后,它选择状态:

ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);

如果您不想使用 default 名称,那么您必须在驱动程序中选择正确的状态。

其他通用状态名称有:

#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多