Как узнать, какой блоб дерева устройств (файл dtb) я использую?

9

Я работаю с TS-4900, встроенным модулем «Компьютер на модуле», подключенным к базовой плате, под управлением Yocto Linux. Он использует U-Boot для запуска, и, предположительно, основываясь на модели базовой платы, он выбирает правильный файл DTB для запуска и, возможно, если ему не удается найти правильный файл, он возвращается к «универсальному» для моего модуля.

Но как / где это определяет правильный? Как я могу сказать, какой .dtb был использован, или установить, какой из них следует использовать?

Ниже приведены загрузочные сообщения U-Boot.

U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)

CPU:   Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
       Watchdog enabled
I2C:   ready
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   using phy at 7
FEC [PRIME]
Press Ctrl+C to abort autoboot in 1 second(s)
(Re)start USB...
USB0:   Port not available.
USB1:   USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
No storage devices, perhaps not 'usb start'ed..?
Booting from the eMMC ...
** File not found /boot/boot.ub **
** File not found /boot/imx6dl-ts4900-13.dtb **
Booting default device tree
42507 bytes read in 196 ms (210.9 KiB/s)
118642 bytes read in 172 ms (672.9 KiB/s)
ICE40 FPGA reloaded successfully
4609784 bytes read in 337 ms (13 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
   Image Name:   Linux-3.10.17-1.0.0-technologic+
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4609720 Bytes = 4.4 MiB
   Load Address: 10008000
   Entry Point:  10008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 18000000
   Booting using the fdt blob at 0x18000000
EHCI failed to shut down host controller.
   Loading Kernel Image ... OK
   Using Device Tree in place at 18000000, end 1800d60a

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0

(Kernel startup commences...)
Научная фантастика
источник

Ответы:

7

Я опаздываю на этом, но я реализовал этот сценарий, и я рассмотрю его для всех, кто находит это с помощью поисковой системы в Интернете.

Этот компьютер на модуле может быть установлен практически на любой готовой плате TS или на специальной плате, и мы хотели, чтобы он автоматически работал без необходимости настраивать используемое дерево устройств. У нас есть сдвиговый регистр с 8 входами на любой данной плате несущей с уникальным идентификатором для базовой платы. На TS-8550 это 0x13. http://wiki.embeddedarm.com/wiki/TS-4900#Baseboard_ID

Поэтому в U-Boot bbdetectдобавленная нами команда считывает GPIO, связанный с этим регистром сдвига, и устанавливает переменную среды $ baseboardid. U-Boot сначала попытается загрузить дерево устройств для конкретной платы на /boot/imx6${cpu}-ts4900-${baseboardid}.dtb. Если он не может его найти, он будет использовать резервное дерево устройств по адресу /boot/imx6${cpu}-ts4900.dtb. Этот последний файл имеет нормальные значения по умолчанию, которые будут работать на любой плате оператора. TS-8550 не нуждается в специальной плате несущей платы, поэтому он возвращается к стандартному дереву устройств и продолжает загружаться.

Чтобы ответить на ваш оригинальный вопрос,

cat /proc/device-tree/model

Все наши деревья устройств будут иметь немного другую модель в дереве устройств.
Например, безопасный запасной вариант:

  • «Технологические системы i.MX6 Quad TS-4900 (дерево устройств по умолчанию)»

Или несущая плата TS-TPC-8390 с определенным деревом устройств:

  • «Технологические системы i.MX6 Quad TS-4900 (TS-TPC-8390)»
Марк Фезерстон
источник
8

Когда U-Boot выполняет команду загрузки, он предоставляет адрес памяти для ядра и адрес памяти для блоба дерева устройств. Поэтому перед этой командой он должен загрузить эти файлы в память. На основании предоставленных вами сообщений мы видим, что не удалось загрузить два файла с карты eMMC / SD:

/boot/boot.ub
/boot/imx6dl-ts4900-13.dtb

Вполне возможно, что либо эти файлы просто отсутствуют, либо неправильный путь к ним, либо неверное устройство: раздел был передан команде загрузки U-Boot. В любом случае команда не выполняется. В этот момент кажется, что загрузчик пытается загрузить дерево устройств «по умолчанию» - возможно, сохраненное на том же носителе, что и сам загрузчик.

Чтобы точно узнать, что происходит, вам нужно остановить процесс загрузки в загрузчике и получить доступ к командной строке U-Boot. Отсюда вы можете ввести:

printenv

Это распечатает переменные среды U-boot. Многие из этих переменных ссылаются на другие переменные. Некоторые из этих переменных часто выполняются как сценарии, поэтому вы можете увидеть загрузочные сценарии, сценарии загрузки ядра и fdt и т. Д. Чтобы выяснить последовательность загрузки, найдите переменную с именем bootcmd (или что-то подобное). Обычно это то, что в конечном итоге запускается во время загрузки. Вам нужно будет проследить последовательность загрузки с этой точки через несколько переменных, но вы должны увидеть, где команды загрузки используются для загрузки FDT в память. Если вы хотите опубликовать вывод printenv , мы можем определить точную логику, использованную здесь.

Шибли
источник
1
Спасибо. bootcmd - это единственная переменная env, которая содержит начальный скрипт запуска, и это то, что мне было нужно.
SF.