TV бокс Tanix TX68


  Обзор     Корпус     Элементы     Порты       ENV       FDT  

Переменные окружения (Environment)

Для хранения переменных окружения ENV в Android 12, использующем систему A и B слотов, предназначены два раздела env_A и env_B. В исходном состоянии стоковой прошивки в раздел env_A записан файл env.fex из imagewty-образа прошивки, а раздел env_B оставлен пустым.

После OTA-обновления в обоих разделах env_A и env_B записана одинаковая информация, представляющая собой слегка модифицированный исходный блоб ENV.

Для получения списка переменных в читабельном виде есть несколько способов:
1) скопировать раздел env_a в файл и конвертировать его в обычный текст
2) сделать дамп переменных env в оболочке U-Boot командой printenv и сохранить терминальный вывод в файл.


Внимание ! Нужно учитывать, что printenv показывает состояние переменных в оперативной памяти, где они могут отличаться от переменных, хранящихся в разделе ENV, если подвергаются модификации в поцессе загрузки. Поэтому списки переменных в текстовом виде, полученные бекапом из раздела и из дампа, будут отличаться. Об отличиях подробнее - в конце.


Приведенный ниже текст (список переменных ENV) представляет собой переформатированный для наглядности дамп выполнения команды printenv U-Boot. То есть это переменные в оперативной памяти после загрузки в U-Boot. Имена переменных выделены жирно и для удобства условно пронумерованы. Зеленым курсивом помечены команды U-Boot, использованные в переменных.


Список переменных ENV

  1. ab_partition_list =
    bootloader,
    env,
    boot,
    vendor_boot,
    dtbo,
    vbmeta,
    vbmeta_system,
    vbmeta_vendor

  2. boot_fastboot = fastboot

  3. boot_normal =
    sunxi_flash read 45000000 boot;bootm 45000000

  4. boot_recovery =
    sunxi_flash read 45000000 recovery;bootm 45000000

  5. bootcmd = run setargs_mmc boot_normal

  6. bootdelay = 5

  7. bootreason = unknow

  8. cma = 8M

  9. console =
    ttyAS0,
    115200

  10. earlycon =
    uart8250,
    mmio32,
    0x05000000

  11. fdtcontroladdr = bbe83e58

  12. fileaddr = bc2aa040

  13. filesize = 2a3038

  14. force_normal_boot = 1

  15. init = /init

  16. initcall_debug = 0

  17. keybox_list =
    widevine,
    ec_key,
    ec_cert1,
    ec_cert2,
    ec_cert3,
    rsa_key,
    rsa_cert1,
    rsa_cert2,
    rsa_cert3

  18. loglevel = 2

  19. mmc_root = /dev/mmcblk0p4

  20. nand_root = /dev/nand0p4

  21. partitions =
    bootloader_a@mmcblk0p1:
    bootloader_b@mmcblk0p2:
    env_a@mmcblk0p3:
    env_b@mmcblk0p4:
    boot_a@mmcblk0p5:
    boot_b@mmcblk0p6:
    vendor_boot_a@mmcblk0p7:
    vendor_boot_b@mmcblk0p8:
    super@mmcblk0p9:
    misc@mmcblk0p10:
    vbmeta_a@mmcblk0p11:
    vbmeta_b@mmcblk0p12:
    vbmeta_system_a@mmcblk0p13:
    vbmeta_system_b@mmcblk0p14:
    vbmeta_vendor_a@mmcblk0p15:
    vbmeta_vendor_b@mmcblk0p16:
    frp@mmcblk0p17:
    empty@mmcblk0p18:
    metadata@mmcblk0p19:
    private@mmcblk0p20:
    dtbo_a@mmcblk0p21:
    dtbo_b@mmcblk0p22:
    media_data@mmcblk0p23:
    Reserve0@mmcblk0p24:
    userdata@mmcblk0p25

  22. rotpk_status = 0

  23. setargs_mmc = setenv bootargs
    earlycon=${earlycon}
    clk_ignore_unused initcall_debug=${initcall_debug}
    console=${console}
    loglevel=${loglevel}
    root=${mmc_root}
    init=${init}
    cma=${cma}
    snum=${snum}
    mac_addr=${mac}
    wifi_mac=${wifi_mac}
    bt_mac=${bt_mac}
    specialstr=${specialstr}
    gpt=1
    androidboot.force_normal_boot=${force_normal_boot}
    androidboot.slot_suffix=${slot_suffix}

  24. setargs_nand = setenv bootargs
    earlycon=${earlycon}
    clk_ignore_unused initcall_debug=${initcall_debug}
    console=${console}
    loglevel=${loglevel}
    root=${nand_root}
    init=${init}
    cma=${cma}
    snum=${snum}
    mac_addr=${mac}
    wifi_mac=${wifi_mac}
    bt_mac=${bt_mac}
    specialstr=${specialstr}
    gpt=1
    androidboot.force_normal_boot=${force_normal_boot}
    androidboot.slot_suffix=${slot_suffix}

  25. slot_suffix = _a

  26. snum = 1c00145857034801d90

  27. trace_buf_size = 64M

  28. trace_enable = 0

  29. trace_event =
    sched_wakeup,
    sched_switch,
    sched_blocked_reason,
    sched_cpu_hotplug,
    block,
    ext4


Комментарии и пояснения
Две переменных, которые желательно модифицировать руками:

  • bootdelay = 5 - время (в секундах) ожидания нажатия кнопки на клавиатуре UART-терминала для прерывания процесса загрузки и входа в оболочку U-Boot, в стоковых прошивках = 0 (запрет прерывания)
  • loglevel = 2 - уровень важности отображаемых в логе сообщений (max 8), в стоковой версии это значение равно 4, из-за чего лишние сообщения мешают нормально пользоваться консолью.


  • ab_partition_list - это список разделов, образующих слоты A и B ( т.е. имеющие суффиксы _A и _B), видимо, используется при обновлениях

  • partitions - список всех разделов (в соответствии с таблицей GPT) с их системными именами, которые указаны справа от '@' mmc_root - активный раздел с переменными (/dev/mmcblk0p4 соответствует env_b) slot_suffix = _b - указание загрузчику о том, что активным является слот B, поэтому нужно работать с разделами, имеющими в имени суффикс '_B'

  • rotpk_status = 0,
    ROTPK (root of trust public key register - регистре корневого открытого ключа доверия) 0 - означает, видимо, что доверенная загрузка не используется snum = 1c00145857034801d90 - уникальный серийный номер, который хранится в памяти SoC и используется для формирования MAC-адреса

  • trace_enable - включить трассировку событий (=0 - выключена)
  • trace_buf_size - размер буфера трассировки (= 64M)
  • trace_event - список событий (event) для трассировки, если она разрешена
    sched_wakeup
    sched_switch
    sched_blocked_reason
    sched_cpu_hotplug
    block
    ext4


    Команды и переменные для загрузки системы

  • bootcmd - эта переменная представляет собой команду run, которая запускается при продолжении загрузки (без входа в оболочку U-Boot) или при вводе в оболочке команды boot содержит два аргумента: setargs_mmc и boot_normal

  • setargs_mmc - это тоже сложная переменная, сама являющаяся командой setenv bootargs, которая инициализирует массив bootargs целой группой переменных, записывая в него значения уже установленных одиночных переменных (earlycon,console и т.д.)

    Примечание. Знак $ означает значение переменной, которая следует за ним в фигурных скобках.

  • boot_normal - это вторая часть, выполняемая bootcmd, и она также состоит из двух команд U-Boot: sunxi_flash read 45000000 boot и bootm 45000000
    Здесь sunxi_flash читает содержимое раздела boot и записывает его в память по адресу 0x45000000, после чего команда bootm запускает на выполнение программу, лежащую с адреса 0x45000000.

  • boot_recovery - эта переменная должна иметь аналогичный смысл и механизм функционирования, но с загрузкой не ядра boot, а recovery. Но раздел recovery в таблице GPT отсутствует, поэтому команда run boot_recovery не выполняется и, скорее всего присутствие этой переменной - атавизм, доставшийся в наследство от однослотовых систем.

  • boot_fastboot = fastboot Это команда перевода устройства в режим fastboot, например, из оболочки:
     => run boot_fastboot
    sunxi_fastboot_init
    recv addr 0x41000000
    send addr 0xbbf02568
    start to display fastbootlogo.bmp
    54 bytes read in 1 ms (52.7 KiB/s)
    [36.412]bmp_name=fastbootlogo.bmp size 190236
    190236 bytes read in 9 ms (20.2 MiB/s)
    delay time 0
    weak:otg_phy_config
    usb init ok
    sunxi_usb_fastboot_status=0
    exit usb
    sunxi_fastboot_exit
    next work 0
    SUNXI_UPDATE_NEXT_ACTION_NULL
    

    Что происходит при сохранении переменных

    Если исправить какую-либо переменную командой ENV SET (это происходит в памяти), а затем сохранить командой ENV SAVE, то переменные из памяти записываются в раздел ENV_B.

    При этом происходят следующие изменения:

  • 1) список переменных становится отсортированным по имени переменной
  • 2) пустые переменные (с пустым значением), например, 'mac= ' удаляются
  • 3) удаляется переменная ab_partition_list
  • 4) изменяется значение переменной bootcmd
    run setargs_nand boot_normal --> run setargs_mmc boot_normal
  • 5) добавляются переменные: bootreason=unknow fdtcontroladdr=bbe83e58 fileaddr=bc2a9040 filesize=2a307a rotpk_status=0 snum=хххх

    Ниже показано сравнение списков переменных, условные обозначения:
    + - добавлены, * - удалены, # - измененны

    Левый столбец - раздел ENV_A, правый столбец - раздел ENV_B

    Внимание. Бекап раздела B сделан после сохранения переменных из памяти, поэтому изменения в переменных внесены в момент загрузки системы.

        Раздел A        Раздел B
    * ab_partition_list  -
      boot_fastboot      boot_fastboot
      boot_normal        boot_normal
      boot_recovery      boot_recovery
    # bootcmd          # bootcmd
      bootdelay          bootdelay
    * bt_mac             -
      -                + bootreason
      cma=8M             cma=8M
      console            console
      earlycon           earlycon
    + fdtcontroladdr     -
    + fileaddr           -
    + filesize           -
      force_normal_boot  force_normal_boot
      init               init
      initcall_debug     initcall_debug
      keybox_list        keybox_list
      loglevel           loglevel
    * mac                -
      mmc_root           mmc_root
      nand_root          nand_root
      -                + partitions
      -                + rotpk_status
      setargs_mmc        setargs_mmc
      setargs_nand       setargs_nand
      slot_suffix        slot_suffix
    * specialstr         -
      -                + snum
      trace_buf_size     trace_buf_size
      trace_enable       trace_enable
      trace_event        trace_event
    * wifi_mac           -
     



  •   Обзор     Корпус     Элементы     Порты       ENV       FDT