[Linuxドライバー] -pinctrlサブシステムを使用してピン機能の動的切り替えを実現

1つ、dts設定

&uart6 {
    pinctrl-names = "default","gpio_state";
    pinctrl-1 = <&uart6_gpio>;
    gpio_tx = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
    gpio_rx = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
    status = "okay";
};

&pinctrl {
    ...
    uart6-gpio {
        uart6_gpio: uart6-gpio {
            rockchip,pins = <3 RK_PC5 0 &pcfg_pull_down>,
                            <3 RK_PC4 0 &pcfg_pull_down>;
        };
    };
    ...
};

注意:

「デフォルト」の対応するピン構成はpinctrl-0です。

「gpio_state」の対応するピン構成はpinctrl-1です。

一般に、2つのピン状態があれば十分です。1つはアクティブ状態のピン状態で、もう1つは休止状態のピン状態です。

二、ドライブ

デバイスが構成されているので、ドライバーを見てみましょう。

2.1。メインのpinctrl関数(core.c(drivers / pinctrl))

1. pinctrlハンドルを取得します。パラメーターはdevです。これは、ピンを含むデバイス構造、つまりデバイスxxxのデバイスです。

struct pinctrl * devm_pinctrl_get(struct device * dev);

2. pin_state、pinstateに対応するピンを取得します

struct pinctrl_state * pinctrl_lookup_state(struct pinctrl * p、const char * name);

3.ピンを特定の状態に設定します

int pinctrl_select_state(struct pinctrl * p、struct pinctrl_state * state);

2.2、特定のコード

#include <linux/gpio.h>
#include <linux/of_gpio.h>

static struct pinctrl *pinctrl;
static struct pinctrl_state *gpio_state_idle;
static struct pinctrl_state *gpio_state_default;

static int dw8250_suspend(struct device *dev)
{
    ... ...
    
    struct pinctrl_state *set_state;
    pinctrl = devm_pinctrl_get(dev);
    if(IS_ERR_OR_NULL(pinctrl)){
        printk("[KERNAL]: %s()-%d: Pinctrl not defined \r\n", __func__, __LINE__);
    }
    else {
        printk("[KERNAL]: %s()-%d: Using pinctrl\r\n", __func__, __LINE__);
        set_state = pinctrl_lookup_state(pinctrl, "gpio_state");
        if(IS_ERR_OR_NULL(set_state)) {
            printk("[KERNAL]: %s-%d: pinctrl lookup failed for idle state \r\n", __func__, __LINE__);
        }
        else {
            printk("[KERNAL]: %s-%d: pinctrl state idle \r\n", __func__, __LINE__);
            gpio_state_idle = set_state;
            pinctrl_select_state(pinctrl, gpio_state_idle);
        }
    }

    ... ... 
}

おすすめ

転載: blog.csdn.net/u014674293/article/details/114230461