Devicetree

встраиваемые модели

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 15:52

Devicetree - это относительно новая технология описания устройств, до 2009 г. её вообще не было (это какой версии ядра соответствует?), а широко применяется она при сборке ядра и модулей ядра в 2013 г. (я могу слегка ошибаться в датах, но где-то так)... а в последние годы ещё и появляется техника оверлеев Devicetree, файлы .dtso / .dtbo, которая при сборке образов для Rapsberry Pi (Rapsbian etc.) ... "то ли применяют, то ли не применяют, то ли применяют наполовину и кое-где" :lol:

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

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 15:54

Olej писал(а):как справочник по документации 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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 15:55

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

- 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 у вас будет похожая история.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 16:32

Для компиляции текстового описания дерева устройств (файл .dts) в бинарные (файл .dtb), используемые ядром Linux (или модулями?) используется Device Tree Compiler (программа dtc).

Смотрим Orange Pi:

Код: Выделить всё

olej@orangepione:~$ uname -a
Linux orangepione 4.14.48-sunxi #1 SMP Wed Jun 6 19:14:27 EEST 2018 armv7l GNU/Linux

olej@orangepione:~$ aptitude search device-tree
i   device-tree-compiler                                - Device Tree Compiler for Flat Device Trees                    

olej@orangepione:~$ aptitude show device-tree-compiler
Package: device-tree-compiler            
Version: 1.4.2-1
State: installed
Automatically installed: no
Multi-Arch: foreign
Priority: extra
Section: devel
Maintainer: Héctor Orón Martínez <zumbi@debian.org>
Architecture: armhf
Uncompressed Size: 449 k
Depends: libc6 (>= 2.7)
Description: Device Tree Compiler for Flat Device Trees
 Device Tree Compiler, dtc, takes as input a device-tree in a given format and outputs a device-tree in another format
 for booting kernels on embedded systems. 
 
 Typically, the input format is "dts", a human readable source format, and creates a "dtb", or binary format as output.
Homepage: https://git.kernel.org/cgit/utils/dtc/dtc.git
Tags: admin::boot, implemented-in::c, role::program

Код: Выделить всё

olej@orangepione:~$ dtc -v
Version: DTC 1.4.2
Смотрим в совершенно другой архитектуре - десктоп x86 Fedora 27:

Код: Выделить всё

[olej@xenix buildroot-master]$ uname -a
Linux xenix.localdomain 4.16.13-200.fc27.x86_64 #1 SMP Wed May 30 15:03:53 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[olej@xenix buildroot-master]$ dnf list dtc
Последняя проверка окончания срока действия метаданных: 26 days, 22:13:06 назад, Пт 01 июн 2018 18:04:24.
Установленные пакеты
dtc.x86_64                                                                1.4.6-1.fc27                                                                @updates

[olej@xenix buildroot-master]$ which dtc
/usr/bin/dtc

[olej@xenix buildroot-master]$ dtc -v
Version: DTC 1.4.6

Код: Выделить всё

[olej@xenix buildroot-master]$ dtc --help
Usage: dtc [options] <input file>

Options: -[qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@Ahv]
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 16:39

Особо интересно в работающей системе восстановить дерево устройств, которое используется системой:

Код: Выделить всё

olej@orangepione:~$ dtc -I fs -O dtb -o own.dtb /proc/device-tree
Warning (unit_address_vs_reg): Node /opp_table/opp@480000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@648000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@240000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1296000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@912000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@816000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1200000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1104000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1008000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@960000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/uart0@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc1@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc0@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/led_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc0_cd_pin@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/spdif@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/ir@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/led_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/key_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /memory has a reg or ranges property, but no unit name
Так мы из /proc восстанавливаем файл .dtb
(в x86 нет такого имени /proc/device-tree ! - это показано в ARM архитектуре)

Теперь из .dtb нужно сделать .dts :

Код: Выделить всё

olej@orangepione:~$ dtc -I dtb -O dts -o own.dts own.dtb
Warning (unit_address_vs_reg): Node /opp_table/opp@480000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@648000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@240000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1296000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@912000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@816000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1200000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1104000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@1008000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table/opp@960000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/uart0@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc1@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc0@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/led_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc0_cd_pin@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/spdif@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/ir@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/led_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /soc/pinctrl@01f02c00/key_pins@0 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /memory has a reg or ranges property, but no unit name

Код: Выделить всё

olej@orangepione:~$ ls -l own.*
-rw-r--r-- 1 olej olej 32942 июн 28 16:34 own.dtb
-rw-r--r-- 1 olej olej 39319 июн 28 16:34 own.dts

Код: Выделить всё

olej@orangepione:~$ head own.dts
/dts-v1/;

/ {
	compatible = "xunlong,orangepi-one", "allwinner,sun8i-h3";
	serial-number = "02c000815fd5e717";
	model = "Xunlong Orange Pi One";
	interrupt-parent = <0x1>;
	#address-cells = <0x1>;
	#size-cells = <0x1>;



Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Devicetree

Непрочитанное сообщение Olej » 28 июн 2018, 16:49

Olej писал(а): Теперь из .dtb нужно сделать .dts :
...

Код: Выделить всё

olej@orangepione:~$ head own.dts
/dts-v1/;

/ {
	compatible = "xunlong,orangepi-one", "allwinner,sun8i-h3";
	serial-number = "02c000815fd5e717";
	model = "Xunlong Orange Pi One";
	interrupt-parent = <0x1>;
	#address-cells = <0x1>;
	#size-cells = <0x1>;
Ещё один способ того же самого - утилита fdtdump :

Код: Выделить всё

olej@orangepione:~$ fdtdump own.dtb > own2.dts

Код: Выделить всё

olej@orangepione:~$ head -n20 own2.dts 
/dts-v1/;
// magic:		0xd00dfeed
// totalsize:		0x80ae (32942)
// off_dt_struct:	0x38
// off_dt_strings:	0x766c
// off_mem_rsvmap:	0x28
// version:		17
// last_comp_version:	16
// boot_cpuid_phys:	0x3
// size_dt_strings:	0xa42
// size_dt_struct:	0x7634

/ {
    compatible = "xunlong,orangepi-one", "allwinner,sun8i-h3";
    serial-number = "02c000815fd5e717";
    model = "Xunlong Orange Pi One";
    interrupt-parent = <0x00000001>;
    #address-cells = <0x00000001>;
    #size-cells = <0x00000001>;
    reserved-memory {
Если сравнить - он тут комментариев накидал...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Devicetree

Непрочитанное сообщение Olej » 04 июл 2018, 00:12

Достаточно внятное описание деревьев устройств из проекта Rapsberry Pi (и самое главное, он достаточно свежий) - Raspberry Pi:Настройка/Деревья устройств, оверлеи и параметры.
Содержание
1 Деревья устройств, оверлеи и параметры
1.1 Часть 1. Деревья устройств
1.1.1 1.1 Базовый синтаксис DTS
1.1.2 1.2. О директиве /include/
1.1.3 1.3. Метки и отсылки
1.1.4 1.4. Семантика дерева устройств
1.2 Часть 2. Оверлеи дерева устройств
1.2.1 2.1. Фрагменты
1.2.2 2.2: Параметры дерева устройств
1.2.2.1 2.2.1: Строковые параметры
1.2.2.2 2.2.2: Целочисленные параметры
1.2.2.3 2.2.3: Булевы параметры
1.2.2.4 2.2.4: Примеры
1.2.2.5 2.2.5: Параметры с несколькими целями
1.2.2.6 2.2.6: Другие примеры оверлеев
1.3 Часть 3. Использование дерева устройств на Raspberry Pi
1.3.1 3.1: Оверлеи и config.txt
1.3.2 3.2: Параметры ДУ
1.3.3 3.3: Метки и параметры, специфичные для разных версий Raspberry Pi
1.3.4 3.4: HAT-платы и дерево устройств
1.3.5 3.5: Поддерживаемые директивы и параметры
1.4 Часть 4. Решение проблем и приемы для профи
1.4.1 4.1: Отладка
1.4.2 4.2: Принудительная загрузка специфического ДУ
1.4.3 4.3: Отключение использования ДУ
1.4.4 4.4: Сокращения и синтаксические вариации
2 См.также
3 Внешние ссылки

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2023, 19:25


Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2023, 19:28

PabloCastellano /extract-dtb
Tool to split a kernel image with appended dtbs into separated kernel and dtb files.
A Device Tree is a data structure for describing hardware. They are used in a lot of ARM devices (e.g. Android), otherwise these would not be able to boot.
This tool is similar to split-appended-dtb but it is written in Python and its code is simpler and almost 3x shorter. Moreover, it doesn't require any external Python library.
If you want to learn more about DTB you can have a look at the Device Tree Reference.
Example:

$ extract-dtb -n /tmp/postmarketOS-export/vmlinuz-motorola-titan
Found 9 appended dtbs

$ extract-dtb /tmp/postmarketOS-export/vmlinuz-motorola-titan -o /tmp/dtb
Dumped kernel, start=0 end=7534024
Dumped dtbdump_01_Motorola_QC-MSM8226_Titan.dtb, start=7534024 end=7728853
Dumped dtbdump_02_Motorola_QC-MSM8226_Titan.dtb, start=7728853 end=7923682
Dumped dtbdump_03_Motorola_QC-MSM8226_Titan.dtb, start=7923682 end=8118511
Dumped dtbdump_04_Motorola_QC-MSM8226_Titan.dtb, start=8118511 end=8313340
Dumped dtbdump_05_Motorola_QC-MSM8226_Titan.dtb, start=8313340 end=8508169
Dumped dtbdump_06_Motorola_QC-MSM8226_Thea.dtb, start=8508169 end=8700762
Dumped dtbdump_07_Motorola_QC-MSM8226_Thea.dtb, start=8700762 end=8894086
Dumped dtbdump_08_Motorola_QC-MSM8226_Thea.dtb, start=8894086 end=9087470
Dumped dtbdump_09_Motorola_QC-MSM8226_Thea.dtb, start=9087470 end=9280854
Extracted 9 appended dtbs + kernel to /tmp/dtb

$ ls -l /tmp/dtb/
total 9088
-rw-rw-r-- 1 pablo pablo 194829 Aug 21 01:48 dtbdump_01_Motorola_QC-MSM8226_Titan.dtb
-rw-rw-r-- 1 pablo pablo 194829 Aug 21 01:48 dtbdump_02_Motorola_QC-MSM8226_Titan.dtb
-rw-rw-r-- 1 pablo pablo 194829 Aug 21 01:48 dtbdump_03_Motorola_QC-MSM8226_Titan.dtb
-rw-rw-r-- 1 pablo pablo 194829 Aug 21 01:48 dtbdump_04_Motorola_QC-MSM8226_Titan.dtb
-rw-rw-r-- 1 pablo pablo 194829 Aug 21 01:48 dtbdump_05_Motorola_QC-MSM8226_Titan.dtb
-rw-rw-r-- 1 pablo pablo 192593 Aug 21 01:48 dtbdump_06_Motorola_QC-MSM8226_Thea.dtb
-rw-rw-r-- 1 pablo pablo 193324 Aug 21 01:48 dtbdump_07_Motorola_QC-MSM8226_Thea.dtb
-rw-rw-r-- 1 pablo pablo 193384 Aug 21 01:48 dtbdump_08_Motorola_QC-MSM8226_Thea.dtb
-rw-rw-r-- 1 pablo pablo 193384 Aug 21 01:48 dtbdump_09_Motorola_QC-MSM8226_Thea.dtb
-rw-rw-r-- 1 pablo pablo 7534024 Aug 21 01:48 kernel

This tool can also be run directly on boot.img images.
Изображение

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Devicetree

Непрочитанное сообщение Olej » 28 июн 2023, 19:43

vagrantc / device-tree-compiler
device-tree-compiler/Documentation/manual.txt

Код: Выделить всё

The Device Tree Compiler, dtc, takes as input a device-tree in
a given format and outputs a device-tree in another format.
Typically, the input format is "dts", a human readable source
format, and creates a "dtb", or binary format as output.

The currently supported Input Formats are:

    - "dtb": "blob" format.  A flattened device-tree block with
        header in one binary blob.

    - "dts": "source" format.  A text file containing a "source"
        for a device-tree.

    - "fs" format.  A representation equivalent to the output of
        /proc/device-tree  where nodes are directories and
	properties are files.

The currently supported Output Formats are:

     - "dtb": "blob" format

     - "dts": "source" format

     - "asm": assembly language file.  A file that can be sourced
        by gas to generate a device-tree "blob".  That file can
        then simply be added to your Makefile.  Additionally, the
        assembly file exports some symbols that can be used.

Код: Выделить всё

3) Command Line

The syntax of the dtc command line is:

    dtc [options] [<input_filename>]

Options:

    <input_filename>
	The name of the input source file.  If no <input_filename>
	or "-" is given, stdin is used.
,,,

    -I <input_format>
	The source input format, as listed above.

    -o <output_filename>
	The name of the generated output file.  Use "-" for stdout.

    -O <output_format>
	The generated output format, as listed above.
...

Ответить

Вернуться в «Одноплатные компьютеры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя