Я задал этот вопрос на Unix Stackexchange, но, похоже, это было неподходящее место для такого рода проблем. Объявления:
Я создаю драйвер ядра для дисплея, управляемого SPI, который предназначен для работы с Raspberry PI. Помимо трех линий SPI, дисплей имеет 3 дополнительные линии управления: BUSY, RST и DC. Для того, чтобы иметь возможность управлять этими линиями, мой DTS должен включать дополнительный фрагмент для GPIO.
fragment@0 {
target = <&spi0>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
spidev@0 {
status = "disabled";
};
epd0: epd@0 {
compatible = "waveshare,epd";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&epd_pins>;
spi-max-frequency = <1000000>;
width = <128>;
height = <296>;
dc-gpios = <&gpio 16 0>;
reset-gpios = <&gpio 20 0>;
busy-gpios = <&gpio 21 0>;
status = "okay";
};
};
};
fragment@1 {
target = <&gpio>;
__overlay__ {
epd_pins: epd_pins {
brcm,pins = <16 20 21>; /* DC RST BUSY */
brcm,function = <1 1 0>; /* out out in */
};
};
};
Этот DTS работает отлично, и я не ожидал никаких проблем. Но есть одна вещь, в которой я не уверен:
pinctrl-names = "default";
pinctrl-0 = <&epd_pins>;
Подобные свойства я встречал и у других ДТ с gpio
фрагментами, но не всегда; иногда они есть, иногда нет. Если я закомментирую эти две строчки, то вроде ничего не изменится, а мой драйвер все так же работает как надо.
У меня есть два вопроса:
- Какова цель этих
pinctrl
строк? Я знаю о подсистеме контактного контроллера, но спрашиваю строго в контексте моего DT. - Зачем мне объявлять оверлей
gpio
? В любом случае я устанавливаю функцию IN или OUT непосредственно из кода моего драйвера, и мои номера gpio определены в оверлееspi
(dc-gpios
,reset-gpios
,busy-gpios
).