LINUX.ORG.RU

Как использовать внешний dts одновременно ядром и загрузчиком Uboot?

 , ,


1

2

Здравствуйте.

Занимаюсь сборкой embedded linux с помощью Buildroot и столкнулся со следующей проблемой. Создал dts-файл, основанный на /arch/arm/boot/dts/imx28-evk.dts и хочу его использовать как внешний единый файл описания устройств, не меняя исходники ядра и Uboot. В конфиге buildroot’а задаю переменные:

BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="/home/.../br2-ext-tree/board/my-board/imx28-custom.dts"

Всё нормально собирается. В папке сборки images появляются нужные мне файлы для записи на SD-карту: sdcard.img, imx28-custom.dtb, … Но при загрузке с карты получаю на экране терминала «Started kernel» и всё!

Если успеть войти в командную оболочку Uboot и набрать printenv, то оказывается, что Uboot ищет стандартный файл imx28-evk.dtb, т.к. в конфиге Uboot была выбрана плата mx28evk. Т.е. у Uboot-а есть свой набор dts файлов, а мой внешний dts попросту игнорируется Uboot-ом, хотя он записывается на boot-раздел SD-карты (под именем imx28-custom.dtb), причем никаких других dtb (от Uboot-а) на SD-карте нету!

Вопрос знающим людям: зачем тогда есть возможность задать свой кастомный dts-файл, если Uboot его игнорирует? Можно ли как-то использовать этот мой кастомный dts-файл и для ядра linux-а и для Uboot-а?

скорее всего uboot его записывает, чтобы ядро его подхватило, сам он пользуется другим dts файлом, который, скорее всего, зашит в образе uboot

IvanR ★★★
()

Вот есть у нас buildroot - как «удобная» оболочка для сборки ядра, загрузчика, пакетов и т.д. В файле конфигурации buildroot-а есть переменная для задания своего дерева устройств - BR2_LINUX_KERNEL_CUSTOM_DTS_PATH. И даже правильно собирается бинарник дерева устройств - файл imx28-custom.dtb. Но он почему-то не находится загрузчиком! В чём дело? Неужели надо еще лезть куда-то в настройки Uboot-а или еще куда-то? Как правильно использовать переменную BR2_LINUX_KERNEL_CUSTOM_DTS_PATH?

juggler
() автор топика
Ответ на: комментарий от IvanR

Вопрос в том, что если задана переменная BR2_LINUX_KERNEL_CUSTOM_DTS_PATH, указывающая на моё дерево устройств, то почему это дерево не используется при загрузке? Бинарник моего дерева устройств imx28-custom.dtb просто лежит мёртвым грузом на загрузочном разделе sd-карты.

juggler
() автор топика

напиши в юбуте setenv fdtfile твой-файл.dtb и saveenv

ну или не fdtfile а как там переменная называется

sergej ★★★★★
()
Ответ на: комментарий от sergej

Да, спасибо, про такой вариант я читал. Там еще что-то было про uEnv.txt, где можно прописать путь к dtb-шнику. Но удивляет меня то, что я не могу добиться нужного поведения, используя параметр buildroot’а BR2_LINUX_KERNEL_CUSTOM_DTS_PATH. Зачем тогда он нужен? Если использовать dts-файлы из состава linux и uboot, а именно сконфигурировать linux и uboot на использование файлов imx28-evk.dts, то linux загружается нормально. На загрузочном разделе лежит imx28-evk.dtb, который, видимо, собран из linux-ового dts-файла. Его берёт uboot и передаёт ядру. А вот если для linux использовать мой внешний dts (imx28-custom.dts), а для uboot оставить прежний (использовать плату mx28evk, которая берёт imx28-evk.dts из uboot-овских конфигов), то будет сгенерирован imx28-custom.dtb и после прошивки sd-карты именно он будет лежать в разделе boot. При этом linux не загружается, выдаётся ошибка «Started kernel». Вывод printenv говорит о том, что fdt_file=imx28-evk.dtb. Т.е. мой dtb-шник не используется. Это баг buildroot’а? Или я что-то делаю не так?

juggler
() автор топика
Ответ на: комментарий от IvanR

Это не пакеты. buildroot - это оболочка для сборки всего остального. И, наверное, он должен передавать нужные параметры собираемым программам. Однако, я должен ещё лезть в настройки uboot’а, а ещё, наверное, создавать конфиги и заголовочные файлы для своей платы. Как всё криво выглядит. Надеюсь, что ошибаюсь и есть нормальный способ всё это сделать.

juggler
() автор топика
Ответ на: комментарий от juggler

Я build-root никогда не тыкал (если не считать openwrt, которая вроде на нем основана), но дефолтные переменные для юбута должны генерироваться где-то в build-root. Можно пошариться по его мейкфайлам и найти как он это делает и как на него можно повлиять.

sergej ★★★★★
()
Ответ на: комментарий от juggler

Это не пакеты

Именно пакеты, так они в билдруте называется в официальной документации

Использование официальной терминологии, залог отсутствия непониманий

IvanR ★★★
()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от IvanR

Не суть, конечно. Но ссылочку можно на то, что назывется пакетами в официальной документации? Я считал, что это только то, что в конфиге buildroot’а находится в переменных с названиями BR2_PACKAGE_… И UBoot к ним не относится.

juggler
() автор топика
Ответ на: комментарий от IvanR

В общем, я был прав: ни linux ни uboot не являются пакетами.

Использование официальной терминологии, залог отсутствия непониманий.

Правда, легче от этого не стало, продолжаю грызть мануалы…

juggler
() автор топика
Ответ на: комментарий от juggler

ладно, пусть по вашему, проверять не охота, не так уж это и важно, в uboot свой набор dts файлов, в ядре свой, так что думаю, что их объединить не получится

IvanR ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.