Загрузчик для SPI NOR Flash одноплатного ПК OrangePi Zero2


  Intro     SPL     Shell     Env       FDT       USB     Net     SPI  

Дерево устройств

Для редактирования дерева устройств (Flattened Device Tree) в оболочке U-Boot используется команда fdt с соответствующими параметрами:


=> help fdt

fdt - flattened device tree utility commands

Usage:

  • fdt addr [-c] [-q] <addr> [<size>] - Set the [control] fdt location to <addr>

  • fdt apply <addr> - Apply overlay to the DT

  • fdt boardsetup - Do board-specific set up

  • fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active

  • fdt resize [<extrasize>] - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed

  • fdt print <path> [<prop>] - Recursive print starting at <path>

  • fdt list <path> [<prop>] - Print one level starting at <path>

  • fdt get value <var> <path> <prop> [<index>] - Get <property> and store in <var>
    In case of stringlist property, use optional <index> to select string within the stringlist. Default is 0.

  • fdt get name <var> <path> <index> - Get name of node <index> and store in <var>

  • fdt get addr <var> <path> <prop> - Get start address of <property> and store in <var>

  • fdt get size <var> <path> [<prop>] - Get size of [<property>] or num nodes and store in <var>

  • fdt set <path> <prop> [<val>] - Set <property> [to <val>]

  • fdt mknode <path> <node> - Create a new node after <path>

  • fdt rm <path> [<prop>] - Delete the node or <property>

  • fdt header [get <var> <member>] - Display header info
    get - get header member <member> and store it in <var>

  • fdt bootcpu <id> - Set boot cpuid

  • fdt memory <addr> <size> - Add/Update memory node

  • fdt rsvmem print - Show current mem reserves

  • fdt rsvmem add <addr> <size> - Add a mem reserve

  • fdt rsvmem delete <index> - Delete a mem reserves

  • fdt chosen [<start> <size>] - Add/update the /chosen branch in the tree

    <start>/<size> - initrd start addr/size

  • NOTE: Dereference aliases by omitting the leading '/', e.g. fdt print ethernet0.

    =>



  • ВНИМАНИЕ ! После старта загрузчика из SPI Flash дерево устройств (блоб DTB), которое хранится в в его теле, автоматически в память не загружается, поэтому требуется его ручная загрузка с помощью команд U-Boot.


    В этом легко убедиться, попытавшись выполнить любую команду FDT, например:



    => fdt print
    No FDT memory address configured. Please configure
    the FDT address via "fdt addr
    " command.
    Aborting!
    =>

    Читаем значение переменной fdt_addr_r:



    => env print fdt_addr_r
    fdt_addr_r=0x4FA00000
    =>

    И пытаемся передать значение этой переменной в FDT



    => fdt addr 0x4FA00000
    libfdt fdt_check_header(): FDT_ERR_BADMAGIC

    Читаем область памяти с этого адреса и убеждаемся, что она чистая, т.е. блоба дерева устройств в памяти нет



    => md 0x4FA00000
    4fa00000: ffffffff ffffffff ffffffff ffffffff ................
    4fa00010: ffffffff ffffffff ffffffff ffffffff ................
    4fa00020: ffffffff ffffffff ffffffff ffffffff ................
    4fa00030: ffffffff ffffffff ffffffff ffffffff ................
    4fa00040: ffffffff ffffffff ffffffff ffffffff ................
    4fa00050: ffffffff ffffffff ffffffff ffffffff ................
    4fa00060: ffffffff ffffffff ffffffff ffffffff ................
    4fa00070: ffffffff ffffffff ffffffff ffffffff ................

    Поэтому копируем блоб дерева устройств из SPI Flash в RAM:
    ( здесь 0xb2c08 - начало блоба FDT в SPI, а 0x56a5 - размер блоба FDT)



    => sf probe
    => sf read 0xb2c08 0x56a5

    Теперь блоб FDT загружен в оперативную память и можно пользоваться командами FDT, например, выполнив команду fdt print и сохранив терминальный вывод в лог-файл, получаем полный текст дерева устройств: Текст дерева устройств




      Intro     SPL     Shell     Env       FDT       USB     Net     SPI