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