Итак, продолжаем работу с жедезкой FriendlyARM NanoPI к которой я прикручиваю всякие весёлости. На данный момент у нас очень хорошо работает ядро, графика через фреймбуфер о ней мы сейчас и поговорим. Как это связано с древом устройств поймёте практически сразу :)
Есть экранчик, он подключён через SPI интерфейс в системе определяется как фреймбуфер - с ним можно развлекаться. НО! Экран в ландшафтном режиме. А нам надо в портретном. Попытки загрузить через параметры ядра он же /proc/cmdline и даже через modprode абсолютно не помогали настроить поворот экрана.
Пришлось делать страшное - лезть в исходники драйвера. После недолгой гуглёжки вместе с поиском выяснилось - драйвер, конкретно этот, читает свои параметры ТОЛЬКО из древа устройства...
Итак древо устройства это файл, в котором описывается древовидная структура подустройств девайса. Сложно? Ненужно? В действительности просто необходимая штука. Во многих встраиваемых устройствах загрузчик может читать например только FAT разделы или, что часто встречается, первые 128Кб флешки это вот всё что мы можем прочесть загрузчиком - дальше образ линукса и так далее и тому подобное, НО! Возникают трудности в предварительной настройки устройств, таких как таймеры различные, прерывания NAND памяти и куча куча куча других параметров. Кстати, в последнее время, в device tree начали описывать разделы NAND памяти, мол с 1 по 10 мегабайт это у нас будет boot раздел с 10 по 1000 это системный раздел, а флешка сама представляет сплошной массив данных.
Специалист сейчас очень сильно захочет меня пнуть, но я сознательно тут многое упрощаю, чтобы дать понимание устройства.
Что из себя представляет device tree?
Конкретно тот с которым работал я можно глянуть
тут. Очень напоминает JSON файл...но не суть. Итак мы видим структуры...с какими то странными именами. Возьмём например ту, которая была нужна мне:
Код JSON:spi@01c68000 {
compatible = "allwinner,sun8i-h3-spi";
reg = <0x1c68000 0x1000>;
interrupts = <0x0 0x41 0x4>;
clocks = <0x6 0x1e 0x6 0x52>;
clock-names = "ahb", "mod";
dmas = <0x10 0x17 0x10 0x17>;
dma-names = "rx", "tx";
pinctrl-names = "default";
pinctrl-0 = <0x11 0x12>;
resets = <0x6 0xf>;
status = "okay";
#address-cells = <0x1>;
#size-cells = <0x0>;
cs-gpios = <0xb 0x2 0x3 0x0 0xb 0x0 0x6 0x0>;
spi@0 {
compatible = "nanopi,spidev";
reg = <0x0>;
status = "disabled";
spi-max-frequency = <0x989680>;
};
spiflash@0 {
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "mxicy,mx25l1606e";
reg = <0x0>;
status = "disabled";
spi-max-frequency = <0x2faf080>;
mode = <0x0>;
partition@0 {
reg = <0x0 0x200000>;
label = "spi-flash";
};
};
pitft@0 {
compatible = "sitronix,st7789v";
reg = <0x0>;
status = "okay";
spi-max-frequency = <0x2faf080>;
rotate = <0x0>;
fps = <0x21>;
buswidth = <0x8>;
dc-gpios = <0xb 0x0 0x1 0x0>;
reset-gpios = <0xb 0x6 0xb 0x0>;
debug = <0x0>;
};
pitft-ts@1 {
compatible = "ti,ads7846";
reg = <0x1>;
status = "okay";
spi-max-frequency = <0x1e8480>;
interrupt-parent = <0xb>;
interrupts = <0x6 0x9 0x2>;
pendown-gpio = <0xb 0x6 0x9 0x1>;
ti,swap-xy;
ti,vref-delay-usecs = <0x3e8>;
ti,x-min = [00 64];
ti,x-max = [0f ff];
ti,y-min = [00 64];
ti,y-max = [0f ff];
ti,vref-mv = <0xce4>;
ti,x-plate-ohms = [01 00];
ti,penirq-recheck-delay-usecs = <0xa>;
ti,settle-delay-usec = [00 64];
ti,keep-vref-on = <0x1>;
ti,pressure-max = [0f ff];
ti,debounce-max = <0xa>;
ti,debounce-tol = <0x1e>;
ti,debounce-rep = <0x1>;
};
};
Итак, мы видим что это SPI устройство с адресом 01c68000. В нём несколько подустройств. Нам нужен pitft (Это экранчики совместимые с RPi тип стандарт) и в нём мы видим различные параметры, которые и передаются тут их и надо править.
Скоро мне придётся добавлять пару своих устройств, как всё пройдёт, следите в следующих частях сериала.
Ну и где доказательства про 18 запусков у маска в 2018 году? Или ты предпочтешь и тут...