Деревья устройств линукса или как победить поворот экрана.

Итак, продолжаем работу с жедезкой FriendlyARM NanoPI к которой я прикручиваю всякие весёлости. На данный момент у нас очень хорошо работает ядро, графика через фреймбуфер о ней мы сейчас и поговорим. Как это связано с древом устройств поймёте практически сразу :)
Деревья устройств линукса или как победить поворот экрана.


Есть экранчик, он подключён через SPI интерфейс в системе определяется как фреймбуфер - с ним можно развлекаться. НО! Экран в ландшафтном режиме. А нам надо в портретном. Попытки загрузить через параметры ядра он же /proc/cmdline и даже через modprode абсолютно не помогали настроить поворот экрана.

Пришлось делать страшное - лезть в исходники драйвера. После недолгой гуглёжки вместе с поиском выяснилось - драйвер, конкретно этот, читает свои параметры ТОЛЬКО из древа устройства...

Итак древо устройства это файл, в котором описывается древовидная структура подустройств девайса. Сложно? Ненужно? В действительности просто необходимая штука. Во многих встраиваемых устройствах загрузчик может читать например только FAT разделы или, что часто встречается, первые 128Кб флешки это вот всё что мы можем прочесть загрузчиком - дальше образ линукса и так далее и тому подобное, НО! Возникают трудности в предварительной настройки устройств, таких как таймеры различные, прерывания NAND памяти и куча куча куча других параметров. Кстати, в последнее время, в device tree начали описывать разделы NAND памяти, мол с 1 по 10 мегабайт это у нас будет boot раздел с 10 по 1000 это системный раздел, а флешка сама представляет сплошной массив данных.
Специалист сейчас очень сильно захочет меня пнуть, но я сознательно тут многое упрощаю, чтобы дать понимание устройства.

Что из себя представляет device tree?
Конкретно тот с которым работал я можно глянуть тут. Очень напоминает JSON файл...но не суть. Итак мы видим структуры...с какими то странными именами. Возьмём например ту, которая была нужна мне:

Код JSON:
  1. spi@01c68000 {
  2. compatible = "allwinner,sun8i-h3-spi";
  3. reg = <0x1c68000 0x1000>;
  4. interrupts = <0x0 0x41 0x4>;
  5. clocks = <0x6 0x1e 0x6 0x52>;
  6. clock-names = "ahb", "mod";
  7. dmas = <0x10 0x17 0x10 0x17>;
  8. dma-names = "rx", "tx";
  9. pinctrl-names = "default";
  10. pinctrl-0 = <0x11 0x12>;
  11. resets = <0x6 0xf>;
  12. status = "okay";
  13. #address-cells = <0x1>;
  14. #size-cells = <0x0>;
  15. cs-gpios = <0xb 0x2 0x3 0x0 0xb 0x0 0x6 0x0>;
  16.  
  17. spi@0 {
  18. compatible = "nanopi,spidev";
  19. reg = <0x0>;
  20. status = "disabled";
  21. spi-max-frequency = <0x989680>;
  22. };
  23.  
  24. spiflash@0 {
  25. #address-cells = <0x1>;
  26. #size-cells = <0x1>;
  27. compatible = "mxicy,mx25l1606e";
  28. reg = <0x0>;
  29. status = "disabled";
  30. spi-max-frequency = <0x2faf080>;
  31. mode = <0x0>;
  32.  
  33. partition@0 {
  34. reg = <0x0 0x200000>;
  35. label = "spi-flash";
  36. };
  37. };
  38.  
  39. pitft@0 {
  40. compatible = "sitronix,st7789v";
  41. reg = <0x0>;
  42. status = "okay";
  43. spi-max-frequency = <0x2faf080>;
  44. rotate = <0x0>;
  45. fps = <0x21>;
  46. buswidth = <0x8>;
  47. dc-gpios = <0xb 0x0 0x1 0x0>;
  48. reset-gpios = <0xb 0x6 0xb 0x0>;
  49. debug = <0x0>;
  50. };
  51.  
  52. pitft-ts@1 {
  53. compatible = "ti,ads7846";
  54. reg = <0x1>;
  55. status = "okay";
  56. spi-max-frequency = <0x1e8480>;
  57. interrupt-parent = <0xb>;
  58. interrupts = <0x6 0x9 0x2>;
  59. pendown-gpio = <0xb 0x6 0x9 0x1>;
  60. ti,swap-xy;
  61. ti,vref-delay-usecs = <0x3e8>;
  62. ti,x-min = [00 64];
  63. ti,x-max = [0f ff];
  64. ti,y-min = [00 64];
  65. ti,y-max = [0f ff];
  66. ti,vref-mv = <0xce4>;
  67. ti,x-plate-ohms = [01 00];
  68. ti,penirq-recheck-delay-usecs = <0xa>;
  69. ti,settle-delay-usec = [00 64];
  70. ti,keep-vref-on = <0x1>;
  71. ti,pressure-max = [0f ff];
  72. ti,debounce-max = <0xa>;
  73. ti,debounce-tol = <0x1e>;
  74. ti,debounce-rep = <0x1>;
  75. };
  76. };
Итак, мы видим что это SPI устройство с адресом 01c68000. В нём несколько подустройств. Нам нужен pitft (Это экранчики совместимые с RPi тип стандарт) и в нём мы видим различные параметры, которые и передаются тут их и надо править.
Скоро мне придётся добавлять пару своих устройств, как всё пройдёт, следите в следующих частях сериала.
Комментарии (0)

Нет комментариев. Ваш будет первым!

Copyright 2016-2024 NeoChapay