[Controlador de Linux]: utilice el subsistema pinctrl para realizar la conmutación dinámica de las funciones de los pines

Uno, configuración de 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>;
        };
    };
    ...
};

Nota:

La configuración de pines correspondiente de "predeterminado" es pinctrl-0;

La configuración de pines correspondiente de "gpio_state" es pinctrl-1;

Generalmente, es suficiente tener dos estados de clavija, uno es el estado de clavija en estado activo y el otro es el estado de clavija en estado inactivo.

Dos, maneja

El dispositivo está configurado, veamos el controlador.

2.1. Función pinctrl principal (core.c (drivers / pinctrl))

1. Obtenga un identificador pinctrl, el parámetro es dev es la estructura del dispositivo que contiene el pin, es decir, el dispositivo del dispositivo xxx

struct pinctrl * devm_pinctrl_get (struct dispositivo * dev);

2. Obtenga el pin correspondiente a pin_state, pin state

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

3. Establece el pin en un estado determinado.

int pinctrl_select_state (struct pinctrl * p, struct pinctrl_state * estado);

2.2, código específico

#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);
        }
    }

    ... ... 
}

Supongo que te gusta

Origin blog.csdn.net/u014674293/article/details/114230461
Recomendado
Clasificación