Автор Тема: Devicetree  (Прочитано 198 раз)

Оффлайн Olej

Devicetree
« : Июнь 07, 2018, 09:29:04 am »
Эта тема "переползла" сюда вот отсюда: как добавить новое ядро в uboot  (Прочитано 841 раз) - с разговоров относительно сборки ядра и компиляции Devicetree, что нужно при сборке ядра.

Devicetree - это относительно новая технология описания устройств, до 2009 г. её вообще не было (это какой версии ядра соответствует?), а широко применяется она при сборке ядра и модулей ядра в 2013г. (я могу слегка ошибаться в датах, но где-то так).

Любой модуль ядра можно написать (код) либо с использованием файла .dts (текстовое описание фрагмента DT, Devicetree для такого устройства), либо вовсе без него - это на вкус написателя кода.
Некоторые процессорные архитектуры (Intel x86) не используют (почти) технику DT, некоторые архитектуры (ARM) используют технику DT повсеместно, некоторые (MIPS, PPC) - кое-где используют (для некоторых устройств), а в остальных нет.

Чтобы понимать использование Devicetree, все эти .dts и .dtb, нужно, хотя бы документацию и стандарты про Devicetree ... а это вещи новые и не всегда легко найти. Эту тему я и создаю как справочник по документации Devicetree.

Оффлайн Olej

Re: Devicetree
« Ответ #1 : Июнь 07, 2018, 09:37:20 am »
справочник по документации Devicetree.

Стандарт: The Devicetree Specification
Цитировать
Current Release
DeviceTree Specification Release v0.2 - Released 20 December 2017

Past Releases
DeviceTree Specification Release v0.1 - Released 18 December 2017

Эту же спецификацию можно скачать в PDF, чтобы не сидеть в online при разборках.

Ну и из документации исходников ядра Linux: Device Tree Compiler Manual
« Последнее редактирование: Июнь 07, 2018, 11:04:04 am от Olej »

Оффлайн Olej

Re: Devicetree
« Ответ #2 : Июнь 07, 2018, 10:07:20 am »
Любой модуль ядра можно написать (код) либо с использованием файла .dts (текстовое описание фрагмента DT, Devicetree для такого устройства), либо вовсе без него - это на вкус написателя кода.
Некоторые процессорные архитектуры (Intel x86) не используют (почти) технику DT, некоторые архитектуры (ARM) используют технику DT повсеместно, некоторые (MIPS, PPC) - кое-где используют (для некоторых устройств), а в остальных нет.
Это интересно ;) ... смотрим по дереву исходников ванильного ядра:
- ARM:
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/arm/boot $ pwd
/home/olej/2018_WORKS/Triol/linux-4.9.90/arch/arm/boot
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/arm/boot $ ls -lR | grep ".dts" | wc -l
1449

olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/arm64/boot $ pwd
/home/olej/2018_WORKS/Triol/linux-4.9.90/arch/arm64/boot
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/arm64/boot $ ls -lR | grep ".dts" | wc -l
179
- MIPS:
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/mips/boot $ pwd
/home/olej/2018_WORKS/Triol/linux-4.9.90/arch/mips/boot
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/mips/boot $ ls -lR | grep ".dts" | wc -l
86
- PPC:
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/powerpc/boot $ pwd
/home/olej/2018_WORKS/Triol/linux-4.9.90/arch/powerpc/boot
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/powerpc/boot $ ls -lR | grep ".dts" | wc -l
404
- и, наконец, Intel x86:
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/x86/boot $ pwd
/home/olej/2018_WORKS/Triol/linux-4.9.90/arch/x86/boot
olej@Cobalt ~/2018_WORKS/Triol/linux-4.9.90/arch/x86/boot $ ls -lR | grep ".dts" | wc -l
0

P.S. Это у меня, для примера, дерево ядра 4.9.90, которое использовалось для сборки realtime Xenomai ядра, и под рукой оказалось, чтобы долго не искать ... но и в 4.14 или 4.16 у вас будет похожая история.

Оффлайн ua3nbw

Re: Devicetree
« Ответ #3 : Июнь 07, 2018, 10:44:03 am »
текущее состояние ДУ можно посмотреть так:

sudo apt-get install device-tree-compiler

dtc -I fs -O dtb -o My.dtb /proc/device-tree
dtc -I dtb -O dts -o My.dts ./My.dtb


Это может быть полезно, если вам нужно увидеть эффект от слияния оверлеев в одно базовое дерево,
файл My.dts и есть  ДУ

Оффлайн Olej

Re: Devicetree
« Ответ #4 : Июнь 07, 2018, 11:05:58 am »
текущее состояние ДУ можно посмотреть так:
Уточните: "текущее" - это в работающей системе? (если /proc/...)

Оффлайн ua3nbw

Re: Devicetree
« Ответ #5 : Июнь 07, 2018, 11:47:36 am »
текущее состояние ДУ можно посмотреть так:
Уточните: "текущее" - это в работающей системе? (если /proc/...)
Да.на arm.

Оффлайн Olej

Re: Devicetree
« Ответ #6 : Июнь 07, 2018, 11:49:23 am »
текущее состояние ДУ можно посмотреть так:
Уточните: "текущее" - это в работающей системе? (если /proc/...)
Да.на arm.
Да, естественно, на ARM. Спасибо.

Оффлайн Olej

Re: Devicetree
« Ответ #7 : Июнь 07, 2018, 01:03:53 pm »
Как посмотреть DT в конкретном образе .img ? Конкретного .dtb (т.е. скомпилированного) в состав образа...
Утилита fdtdump.
Есть в стандартном
Вот как выглядит DT Orange Pi One, в символьном виде, восстановленном из образа Armbian_5.38_Orangepione_Debian_stretch_next_4.14.14.img (редактор форума не позволяет показать полностью вывод, даже под спойлером, там очень много ... чтобы представлять как это выглядит, но вы можете выполнить это на своём компьютере легко):
[olej@dell dtb-4.14.14-sunxi]$ fdtdump sun8i-h3-orangepi-one.dtb 
/dts-v1/;
// magic: 0xd00dfeed
// totalsize: 0x7d02 (32002)
// off_dt_struct: 0x38
// off_dt_strings: 0x734c
// off_mem_rsvmap: 0x28
// version: 17
// last_comp_version: 16
// boot_cpuid_phys: 0x0
// size_dt_strings: 0x9b6
// size_dt_struct: 0x7314

/ {
    interrupt-parent = <0x00000001>;
    #address-cells = <0x00000001>;
    #size-cells = <0x00000001>;
    model = "Xunlong Orange Pi One";
    compatible = "xunlong,orangepi-one", "allwinner,sun8i-h3";
    sound {
        compatible = "simple-audio-card";
        simple-audio-card,format = "i2s";
        simple-audio-card,name = "allwinner,hdmi";
        simple-audio-card,mclk-fs = <0x00000100>;
        status = "okay";
        linux,phandle = <0x0000003a>;
        phandle = <0x0000003a>;
        simple-audio-card,codec {
            sound-dai = <0x00000002>;
        };
        simple-audio-card,cpu {
            sound-dai = <0x00000003>;
        };
    };
    clocks {
        #address-cells = <0x00000001>;
        #size-cells = <0x00000001>;
        ranges;
        osc24M_clk {
            #clock-cells = <0x00000000>;
            compatible = "fixed-clock";
            clock-frequency = <0x016e3600>;
            clock-output-names = "osc24M";
            linux,phandle = <0x00000019>;
            phandle = <0x00000019>;
        };
...
};
Утилита есть практически в любом десктоп дистрибутиве Linux (x86 и др.), возможно нужно дополнительно установить пакет Device Tree Compiler, вот как это выглядит даже в редком для ARM-среды дистрибутиве Fedora 27:
[olej@dell ACCOUNTS]$ which fdtdump
/usr/bin/fdtdump

[olej@dell ACCOUNTS]$ dnf provides '/*/fdtdump'
Последняя проверка окончания срока действия метаданных: 25 days, 1:10:45 назад, Sun May 13 11:46:20 2018.
dtc-1.4.2-1.fc25.x86_64 : Device Tree Compiler
Источник: @System

dtc-1.4.2-1.fc25.x86_64 : Device Tree Compiler
Источник: fedora

Оффлайн Olej

Re: Devicetree
« Ответ #8 : Июнь 07, 2018, 01:25:10 pm »
Вот как выглядит DT Orange Pi One, в символьном виде, восстановленном из образа Armbian_5.38_Orangepione_Debian_stretch_next_4.14.14.img (редактор форума не позволяет показать полностью вывод, даже под спойлером, там очень много ... чтобы представлять как это выглядит, но вы можете выполнить это на своём компьютере легко):
Естественно, образ файла .img для записи SD-карточки нужно предварительно смонтировать так, чтобы можно было влезть в него "внутрь", и оперировать вплоть до уровня составляющих файлов (файл sun8i-h3-orangepi-one.dtb в примере выше).
Делается это примерно так (в любом десктопе Linux, или нативно в ARM-системе), напоминаю:
[root@dell Armbian_5.38]# kpartx -a -v Armbian_5.38_Orangepione_Debian_stretch_next_4.14.14.img
add map loop0p1 (253:1): 0 2719744 linear /dev/loop0 8192

[root@dell Armbian_5.38]# ls -l /dev/mapper
итого 0
crw------- 1 root root 10, 236 июн  2 16:21 control
lrwxrwxrwx 1 root root       7 июн  2 16:21 cryptswap1 -> ../dm-0
lrwxrwxrwx 1 root root       7 июн  4 17:15 loop0p1 -> ../dm-1
Здесь (довольно странно) в конкретном образе .img содержится только 1 раздел loop0p1 ... тогда как в большинстве попадающихся образом присутствуют 2 раздела: небольшой FAT (/boot) + EXT4 (/root) ... и даже кой-где пишут, что наличие FAT-раздела это правило. Как видно ниже, там один раздел EXT4...
[root@dell Armbian_5.38]# mount /dev/mapper/loop0p1 /mnt/root

[root@dell Armbian_5.38]# ls /mnt/root
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

[olej@dell ~]$ mount | grep mnt/root
/dev/mapper/loop0p1 on /mnt/root type ext4 (rw,relatime)
Естественно, что каталог монтирования /mnt/root (с произвольным именем), точку монтирования - вы должны когда-то 1 раз создать ... как-то так:
[root@dell Armbian_5.38]# mkdir /mnt/root

(если в образе .img 2 или больше разделов, я видел и до 5-ти, то вам естественно нужно создать больше точек монтирования, и делать команду mount соответствующее число раз)
Смотрим:
[root@dell boot]# ls /mnt/root/boot/
armbianEnv.txt                  boot-desktop.png      dtb-4.14.14-sunxi         uInitrd
armbian_first_run.txt.template  boot.scr              initrd.img-4.14.14-sunxi  uInitrd-4.14.14-sunxi
boot.bmp                        config-4.14.14-sunxi  overlay-user              vmlinuz-4.14.14-sunxi
boot.cmd                        dtb                   System.map-4.14.14-sunxi  zImage
Вот там вот каталог dtb, где вы и найдёте свои компилированные .dtb файлы.
Хотя структура /boot в разных сборках очень сильно различаются.

Оффлайн Olej

Re: Devicetree
« Ответ #9 : Июнь 07, 2018, 01:34:34 pm »
Любой модуль ядра можно написать (код) либо с использованием файла .dts (текстовое описание фрагмента DT, Devicetree для такого устройства), либо вовсе без него - это на вкус написателя кода.
Некоторые процессорные архитектуры (Intel x86) не используют (почти) технику DT, некоторые архитектуры (ARM) используют технику DT повсеместно, некоторые (MIPS, PPC) - кое-где используют (для некоторых устройств), а в остальных нет.
Вообще то, как я понимаю (?), любой модуль ядра (драйвер) может быть написан при использовании:
1. без какого либо использования DT (так пишутся драйверы для x86 десктопов);
2. с использованием единого DT;
3. с использованием оверлеев DT (собираемого из "кусков");

Вот этот 3-й метод - это вообще совершенно новая, экспериментальная техника, об этом см. на сайте Armbian: Device Tree overlays
Цитировать
Armbian specific notes
DT overlays are a Work-in-Progress (WIP) feature, present only in fresh images starting with 5.30, nightly and user made images
For older images (even upgraded to 5.30 or later) manual update of the u-boot and the boot script is required

Оффлайн Olej

Re: Devicetree
« Ответ #10 : Июнь 15, 2018, 05:23:31 pm »
текущее состояние ДУ можно посмотреть так:

sudo apt-get install device-tree-compiler

dtc -I fs -O dtb -o My.dtb /proc/device-tree
dtc -I dtb -O dts -o My.dts ./My.dtb
Вот это - спасибо! ;)
Тоже самое возможно и на других ARM архитектурах, не только Orange Pi.

Вопрос - может знаете? - вот таким образом восстановленное дерево устройств .dtb или .dts - можно ли его использовать в дальнейшем для ручной сборки ядра/образа для той же платформы  (где оно было снято)?
Чтобы не разгребать детально hardware этой же платформы, и чтобы не выписывать для неё вручную .dts-ы ... да ещё и не особенно умея это делать. ;D

Оффлайн ua3nbw

Re: Devicetree
« Ответ #11 : Июнь 15, 2018, 07:27:53 pm »

Вопрос - может знаете? - вот таким образом восстановленное дерево устройств .dtb или .dts - можно ли его использовать в дальнейшем для ручной сборки ядра/образа для той же платформы  (где оно было снято)?
Чтобы не разгребать детально hardware этой же платформы, и чтобы не выписывать для неё вручную .dts-ы ... да ещё и не особенно умея это делать. ;D

насколько помню нет, когда писал оверлеи "кнопки на GPIO Mainline Linux OrangePi"  и "I2S Аудио на mainline ядре OrangePi", только так я мог видеть текущее состояние ДУ, без перезагрузки Opi, то есть  незаменимая вещь при отладке оверлеев на целевой платформе.

Оффлайн Olej

Re: Devicetree
« Ответ #12 : Июнь 15, 2018, 10:09:25 pm »
ребята, тему мучал с открытием файла img.   
ua3nbw отвечал уже: Образы и карточки ... и дальше там по теме - всё досконально разобрано с монтированием образов.
И не надо больше ничего мудрить!

P.S. Только всё это не имеет ни малейшего касательства к теме здесь: Devicetree ! :(
Чего ж гадить куда ни попадя?! >:(
« Последнее редактирование: Июнь 15, 2018, 10:13:25 pm от Olej »

pcmax

  • Гость
Re: Devicetree
« Ответ #13 : Июнь 15, 2018, 10:24:50 pm »
помогите с ключами dts разобраться
dtс-b   
dtc-I
надо указывать, когда будешь компилить dts в dtb

Оффлайн Olej

Re: Devicetree
« Ответ #14 : Июнь 16, 2018, 12:19:40 am »
помогите с ключами dts разобраться
надо указывать, когда будешь компилить dts в dtb
Мы в этой теме не рассматриваем компиляцию .dts - вы уже и так в 3-х других темах этим занимаетесь ... вот там и продолжайте ;D
Это тема: о том как строятся и записываются DT, вопросы подготовки DT, какие операции можно выполнять с DT ... и т.д.