[Pilote Linux] - Utilisez le sous-système pinctrl pour réaliser la commutation dynamique des fonctions des broches

Un, paramètres 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>;
        };
    };
    ...
};

Remarque:

La configuration de broche correspondante de «par défaut» est pinctrl-0;

La configuration de broche correspondante de "gpio_state" est pinctrl-1;

Généralement, il suffit d'avoir deux états de broche, l'un est l'état de broche à l'état actif et l'autre est l'état de broche à l'état dormant.

Deux, conduis

Le périphérique est configuré, regardons le pilote.

2.1. Fonction principale pinctrl (core.c (drivers / pinctrl))

1. Obtenez un handle pinctrl, le paramètre est dev est la structure du périphérique qui contient la broche, c'est-à-dire le périphérique du périphérique xxx

struct pinctrl * devm_pinctrl_get (struct périphérique * dev);

2. Obtenez la broche correspondant à pin_state, état de la broche

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

3. Réglez la broche sur un certain état

int pinctrl_select_state (struct pinctrl * p, struct pinctrl_state * état);

2.2, code spécifique

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

    ... ... 
}

Je suppose que tu aimes

Origine blog.csdn.net/u014674293/article/details/114230461
conseillé
Classement