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