在没有 pinctrl 名称的情况下设置设备树节点时 GPIO 不受控制
GPIO is uncontrolled when setting device-tree node without pinctrl-names
我正在研究 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 引脚?
不能是任何名称,大多数节点将具有 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"
。
然后,select状态为:
ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
如果您不想使用 default
名称,那么,您必须 select 驱动程序中的正确状态。
其他通用状态名称是:
#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"
我正在研究 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 引脚?
不能是任何名称,大多数节点将具有 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"
。
然后,select状态为:
ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
如果您不想使用 default
名称,那么,您必须 select 驱动程序中的正确状态。
其他通用状态名称是:
#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"