OrangePi Zero2. Сравнение дерева устройств U-Boot и Base


Дерево устройств FDT, используемое в конкретном устройстве (в нашем случае - OrangePi Zero2), не является жестко фиксированным объектом, оно претерпевает некоторые изменения в процессе загрузки и работы операционной системы.

В образе прошивки Андроид (файл .img) двоичный FDT хранится в файле sunxi.fex размером 129536 байт. Одновременно в прошивке имеется файл boot-package.fex, представляющий собой упакованный набор файлов, который используется загрузчиком Boot0.

[370]Loading boot-pkg Succeed(index=0).
[374]Entry_name = u-boot
[383]Entry_name = monitor
[387]Entry_name = dtbo
[390]Entry_name = dtb
[393]Jump to second Boot.

После распаковки boot-package.fex образуются 4 файла, два из которых имееют прямое отношение к дереву устройств, это бинарные файлы: dtb и dtbo. При этом файл dtb является точной копией файла sunxi.fex, а файл dtbo (O - overlay) содержит дополнительные данные, используемые для наложения на основное дерево устройств.

После старта U-Boot используемое им дерево устройств можно восстановить в исходном формате командой fdtprint. Анализ структуры и содержимого этого дерева показывает, что оно совпадает с содержимым двоичного дерева sunxi.fex (а также dtb из boot-package.fex).

После полной загрузки системы используемое дерево устройств отображается в формате файловой системы (папки-файлы) по пути sys/firmware/devicetree/base, а также по пути: proc/device-tree.

Анализ папки Base, где входящие подпапки - это узлы дерева, а содержащиеся в них файлы - это свойства, показывает, что в процессе полной загрузки системы в дереве устройств произошли некоторые изменения в свойствах и их значениях, при этом структура узлов практически не изменилась.

Проведенный сравнительный анализ первичного дерева устройств (востановленного в U-Boot) и системного дерева (в папке Base), показан на странице: Изменения в дереве устройств .

Основные отличия заключаются в следующем:

1. Во все узлы добавлено свойство name, значением которого служит имя самого младшего подузла, в полном пути узла, усеченное до символа @ (если такой имеется), например:
в узел soc@03000000/pinctrl@0300b000/spdif@0 добавлено свойство name = spdif
Примечание. В списке изменений такие узлы не показаны для сокращения его объема.

2. В узле memory@40000000 изменено значение свойства reg:
0x00000000 0x40000000 0x00000000 0x20000000
заменено на
0x00000000 0x40000000 0x00000000 0x40000000
Таким образом, теперь это свойство показывает реальный размер памяти

1 Гбайт
0x40000000 = 1073741824 (1024 Mb)

3. В узле chosen свойство bootargs существенно расширено.
Было : earlyprintk=sunxi-uart,0x05000000 loglevel=8 initcall_debug=1 console=ttyS0 init=/init
Стало: earlyprintk=sunxi-uart,0x05000000
initcall_debug=0
console=ttyS0,115200
loglevel=2
root=/dev/mmcblk0p4 rootwait init=/init
partitions=

  • bootloader@mmcblk0p1:
  • env@mmcblk0p2:
  • boot@mmcblk0p3:
  • super@mmcblk0p4:
  • misc@mmcblk0p5:
  • recovery@mmcblk0p6:
  • cache@mmcblk0p7:
  • vbmeta@mmcblk0p8:
  • vbmeta_system@mmcblk0p9:
  • vbmeta_vendor@mmcblk0p10:
  • metadata@mmcblk0p11:
  • private@mmcblk0p12:
  • frp@mmcblk0p13:
  • empty@mmcblk0p14:
  • media_data@mmcblk0p15:
  • Reserve0@mmcblk0p16:
  • UDISK@mmcblk0p17 cma=64M
    snum=9c00141511d0481230e
    mac_addr=
    wifi_mac=a8:60:37:a1:ce:00 bt_mac=
    selinux=0
    specialstr=
    gpt=1
    androidboot.mode=normal
    androidboot.serialno=9c00141511d0481230e
    androidboot.hardware=sun50iw9p1
    boot_type=1
    androidboot.boot_type=1
    androidboot.secure_os_exist=0
    gpt=1
    uboot_message=2018.05(10/22/2020-17:24:26)
    disp_reserve=3686400,0x7bf2d880
    bootreason=unknow
    selinux=1
    androidboot.selinux=enforcing
    androidboot.dtbo_idx=0,1,2
    buildvariant=eng

    Примечание. Большинство добавленных значений взяты из переменных окружения (environment).

    Отметим, что в свойстве bootargs изменилось значение loglevel с 8 на 2, в результате которого существенно сокращается объем передаваемой в терминал отадочной информации.

    Кроме того, в этом узле
    Свойство linux,initrd-end=0x00000000 0x00000000 заменено на 0x00000000 0x430bc58e
    Свойство linux,initrd-start=0x00000000 0x00000000 заменено на 0x00000000 0x43000000