禁用引脚偏置是否不应用内部电阻或完全断开引脚?
Does disabling the pin bias not apply an internal resistor or disconnect the pins altogether?
我正在查看 I2C 线路的设备树配置。以前 bias-disable
用于无法正常工作的 I2C,我的自然倾向是使用 bias-pull-up
进行测试(但有外部 4k 上拉电阻)。我的问题是,bias-disable
到底是什么意思?
禁用引脚偏置是否不应用内部电阻或完全断开引脚?
https://www.kernel.org/doc/Documentation/devicetree/bindings/pinctrl/brcm,bcm11351-pinctrl.txt
TL;DR
正确答案似乎是:
disabling the pin bias not apply an internal resistor
详情如下。
调查
来自 pinctrl 绑定的文档 (Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
):
bias-pull-up
, -down
and -pin-default
take as optional argument on hardware supporting it the pull strength in Ohm. bias-disable
will disable the pull.
如果文档还不够,是时候查看代码了。
在drivers/pinctrl/pinconf-generic.c
中:
static const struct pinconf_generic_params dt_params[] = {
{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
在include/linux/pinctrl/pinconf-generic.h
中:
/**
* enum pin_config_param - possible pin configuration parameters
* @PIN_CONFIG_BIAS_DISABLE: disable any pin bias on the pin, a
* transition from say pull-up to pull-down implies that you disable
* pull-up in the process, this setting disables all biasing.
接下来你可以做的是查看这个 PIN_CONFIG_BIAS_DISABLE
在你的特定硬件的驱动程序中是如何处理的。在你的情况下,我相信驱动程序位于 drivers/pinctrl/bcm/pinctrl-bcm281xx.c
.
看here(bcm281xx_i2c_pin_update()
函数):
case PIN_CONFIG_BIAS_DISABLE:
bcm281xx_pin_update(val, mask, 0,
BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
break;
如您所见,bcm281xx_pin_update()
(即value
)的第三个参数为0。因此接下来的值将用于设置相应的寄存器:
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK 0x0070
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT 4
现在,有了 BCM281XX 的数据表或 TRM,您应该能够找出设置为 0 的确切寄存器,并且从该数据表中您可以找出将其设置为 0 时到底发生了什么. 不幸的是,我在互联网上找不到这个数据表,所以我只能假设这个 "bias-disable"
只是断开你 SoC 中的上拉和下拉内部电阻。不过还是要用SoC的文档来肯定的说。
此外,也许它会有用:这是添加此驱动程序的第一个提交:54b1aa5a5b16。
我正在查看 I2C 线路的设备树配置。以前 bias-disable
用于无法正常工作的 I2C,我的自然倾向是使用 bias-pull-up
进行测试(但有外部 4k 上拉电阻)。我的问题是,bias-disable
到底是什么意思?
禁用引脚偏置是否不应用内部电阻或完全断开引脚?
https://www.kernel.org/doc/Documentation/devicetree/bindings/pinctrl/brcm,bcm11351-pinctrl.txt
TL;DR
正确答案似乎是:
disabling the pin bias not apply an internal resistor
详情如下。
调查
来自 pinctrl 绑定的文档 (Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
):
bias-pull-up
,-down
and-pin-default
take as optional argument on hardware supporting it the pull strength in Ohm.bias-disable
will disable the pull.
如果文档还不够,是时候查看代码了。
在drivers/pinctrl/pinconf-generic.c
中:
static const struct pinconf_generic_params dt_params[] = {
{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
在include/linux/pinctrl/pinconf-generic.h
中:
/**
* enum pin_config_param - possible pin configuration parameters
* @PIN_CONFIG_BIAS_DISABLE: disable any pin bias on the pin, a
* transition from say pull-up to pull-down implies that you disable
* pull-up in the process, this setting disables all biasing.
接下来你可以做的是查看这个 PIN_CONFIG_BIAS_DISABLE
在你的特定硬件的驱动程序中是如何处理的。在你的情况下,我相信驱动程序位于 drivers/pinctrl/bcm/pinctrl-bcm281xx.c
.
看here(bcm281xx_i2c_pin_update()
函数):
case PIN_CONFIG_BIAS_DISABLE:
bcm281xx_pin_update(val, mask, 0,
BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
break;
如您所见,bcm281xx_pin_update()
(即value
)的第三个参数为0。因此接下来的值将用于设置相应的寄存器:
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK 0x0070
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT 4
现在,有了 BCM281XX 的数据表或 TRM,您应该能够找出设置为 0 的确切寄存器,并且从该数据表中您可以找出将其设置为 0 时到底发生了什么. 不幸的是,我在互联网上找不到这个数据表,所以我只能假设这个 "bias-disable"
只是断开你 SoC 中的上拉和下拉内部电阻。不过还是要用SoC的文档来肯定的说。
此外,也许它会有用:这是添加此驱动程序的第一个提交:54b1aa5a5b16。