Pin Muxing in linux kernel

Posted

技术标签:

【中文标题】Pin Muxing in linux kernel【英文标题】: 【发布时间】:2016-05-23 11:57:49 【问题描述】:

我想做以下引脚复用。 即 USART Tx -> 到 GPIO -> 出于某种目的回到 Linux 内核中的 USART Tx 引脚。

我尝试使用 gpio_request 和 gpio_direction_output 将 PIN 设为 GPIO,因此我可以将该引脚设为 GPIO。但是因为我想从 GPIO 切换回 USART Tx 引脚,它不起作用,我尝试按照 at91_set_A_periph 到该引脚,仍然没有运气。

在内核上工作:3.18 和 at91 atmel 板。

【问题讨论】:

那里有许多供应商内核,所以如果您能准确指出您正在使用的什么内核会更好。此外,您应该粘贴您尝试过但没有工作的代码。这将使您更轻松地为您提供帮助。 【参考方案1】:

您可以查看i2c-imx driver。它正是这样做的。

您需要使用pinctrl_lookup_state 来检索不同的 pinctrl 状态(其中一个是 USART Tx,另一个是 GPIO)。然后你可以用pinctrl_select_state在两者之间切换。

总而言之,你的 uart 节点中有类似的东西:

    usart3: serial@fc00c000 
        pinctrl-names = "default","gpio";
        pinctrl-0 = <&pinctrl_usart3>;
        pinctrl-1 = <&pinctrl_usart3_gpio>;
        tx-gpio = <&pioE 4 GPIO_ACTIVE_LOW>;
        status = "okay";
    ;

在驱动代码中:

pinctrl_pins_default = pinctrl_lookup_state(pinctrl, PINCTRL_STATE_DEFAULT);
pinctrl_pins_gpio = pinctrl_lookup_state(pinctrl, "gpio");
tx_gpio = of_get_named_gpio(pdev->dev.of_node, "tx-gpio", 0);

然后,您可以使用pinctrl_select_statepinctrl_pins_defaultpinctrl_pins_gpio 之间来回切换。 tx_gpio 是你的 gpio。

【讨论】:

以上是关于Pin Muxing in linux kernel的主要内容,如果未能解决你的问题,请参考以下文章

系统篇: Linux 下 kernel 的打印等级

Cursor: Pin S Wait On X In The Top 5 Wait Events

英特尔 PIN 例程地址检索:Linux 与 Windows

如何使用 Intel PIN 获取内存操作值?

Linux命令行如何接受没有pin的蓝牙设备配对

linux设备树-pin控制器驱动