Jump to content
    

u-boot для xilinx US+, где у него вход?

Всем доброго дня.

До сих пор только fsbl использовал, а теперь надо стало uboot. Выкачал с гитхаба uboot-xlnx, куча файлов.

А с чего этот убут начинает выполняться, где у него точка входа? В примере есть hello world:


int hello_world(int argc, char *const argv[])
{
	int i;

	/* Print the ABI version */
	app_startup(argv);
	printf ("Example expects ABI version %d\n", XF_VERSION);
	printf ("Actual U-Boot ABI version %d\n", (int)get_version());

	printf ("Hello World\n");

	printf ("argc = %d\n", argc);

	for (i=0; i<=argc; ++i) {
		printf ("argv[%d] = \"%s\"\n",
			i,
			argv[i] ? argv[i] : "<NULL>");
	}

	printf ("Hit any key to exit ... ");
	while (!tstc())
		;
	/* consume input */
	(void) getc();

	printf ("\n\n");
	return (0);
}

Что это? Для чего он? Может кто направит на путь истинный? Какая вообще философия этого убута кратко?

Я думал там примерно как в FSBL, но продвинутее - просто загрузка образа с разных носителей в ddr. Но похоже все сложнее...

Share this post


Link to post
Share on other sites

2 часа назад, alexPec сказал:

А с чего этот убут начинает выполняться, где у него точка входа? В примере есть hello world:

Что это? Для чего он? Может кто направит на путь истинный? Какая вообще философия этого убута кратко?

hello_world - это пример программы, бинарник которой можно загрузить в консоль u-boot и запустить на выполнение

философия простая - произвести начальную конфигурацию контроллера памяти и остальной необходимой периферии (графика, накопители, интерфейсы), далее в случае сценария загрузки линукса через уже настроенный интерфейс загрузить в память ядро и необходимые бинарники и отдать управление ядру

у xilinx (я не особо следил за развитием) куча всяких мутаций, как железа так и софта (сейчас ксайлинксводы подтянутся и помогут)

попробуйте там поискать необходимую инфу https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842223/U-boot

Share this post


Link to post
Share on other sites

наивный вьюноша...

начинать надо с РАБОЧЕГО примера от xilinx/amd/....

uboot - это малое "зло" из всех зол для US+

Share this post


Link to post
Share on other sites

Я про это и спрашиваю, где б его взять, рабочий пример. Мне дальше убута не надо, нужен именно сам убут. А конкретно - инициализацию хоста USB хочу оттуда вытащить. Как мануал ни почитаешь - "качайте с гитхаба, собираете, получаете elf...". А как там внутри все работает, настраивается - хз, нигде толком ничего нет. Видел, что для конкретных плат есть device tree файлы, в которых прописана конфигурация, но я пока даже не понимаю, с какой функции в исходниках начинается работа убута. В fsbl все просто - main, там все видно, как по очереди проходит инициализация, с какого источника дальше пытается грузить. А вот в убуте я что-то зарылся... Пока не вижу откуда начинать его раскапывать...

1 час назад, Jury093 сказал:

бинарник которой можно загрузить в консоль u-boot и запустить на выполнение

Вот этого то я и не понимаю, что он будет делать, этот бинарник?

app_startup(argv);

Это главная строчка этого исходника? Тогда какие еще аргументы ему нужны? Или этот app_startup из консоли работает? Где-то есть описанные команды? Или тоже раскапывать? Пока одни вопросы...

 

 

Share this post


Link to post
Share on other sites

То есть “настоящая” первая инструкция для ARM64 U-Boot: _start в arch/arm/cpu/armv8/start.S. А ELF entry задается в arch/arm/cpu/armv8/u-boot.lds через ENTRY(_start).

Для 32-битного Zynq-7000 похоже, но _start лежит в таблице векторов: arch/arm/lib/vectors.S, оттуда переход в reset из arch/arm/cpu/armv7/start.S.

 

Share this post


Link to post
Share on other sites

4 часа назад, alexPec сказал:

Я про это и спрашиваю, где б его взять, рабочий пример. Мне дальше убута не надо, нужен именно сам убут. А конкретно - инициализацию хоста USB хочу оттуда вытащить. Как мануал ни почитаешь - "качайте с гитхаба, собираете, получаете elf...". А как там внутри все работает, настраивается - хз, нигде толком ничего нет. Видел, что для конкретных плат есть device tree файлы, в которых прописана конфигурация, но я пока даже не понимаю, с какой функции в исходниках начинается работа убута. В fsbl все просто - main, там все видно, как по очереди проходит инициализация, с какого источника дальше пытается грузить. А вот в убуте я что-то зарылся... Пока не вижу откуда начинать его раскапывать...

Вот этого то я и не понимаю, что он будет делать, этот бинарник?

бинарник будет делать то, что прописано в программе. это просто пример написания standalone, где реализован тривиальный алгоритм вывода в консоль версии софта, анализа возможных аргументов, отклик на консольный ввод

где-то в доке на u-boot расписано, как его компилить, куда грузить и как сделать потом "go адрес-куда-загрузили"

надеюсь, что железка (если она у вас есть) достаточно стандартная, с документацией и что будет отлично электросхемой. тогда ищете сайт производителя и там как правило есть все необходимое для стартового запуска и развития

хуже, если у вас кастомная схема, тогда можно сильно забуксовать даже на этапе разборок с инитом памяти для процессора. в этом случае подбирается максимально похожая конфигурация из u-boot и допиливается под свое железо

если всё пока в начале проекта железа, то там тоже коряг хватает

напопробовать: если же железка все есть, то берете вытащенный u-boot, копаетесь в содержимом configs на предмет подходящей конфигурации, потом добываете кросскомпилятор под свою версию u-boot, компиляете конечный бинарник под свою архитектуру, далее согласно описанию на свой US+ заливаете бинарник на носитель на вашей плате или через jtag (как надо читать форумы и доки) и пробуете подать питание.

если звезды сойдутся, то u-boot оповестит вас через консоль. если нет, то будет тернистый путь по поискам места ошибки (выбран не тот накопитель, настроена не та консоль, архитектура бинарника не та, неправильно настроена память и еще сотня-другая неочевидных ошибок.

тогда здравствуй доки, осцилл, форумы..

PS вот там в конце скриншот как запускают Hello World https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/147882060/Executing+application+from+u-boot+on+ZCU102

Share this post


Link to post
Share on other sites

Спасибо Jury093Теперь примерно понятно - uboot это самостоятельное консольное приложение, которое обладает собственным набором команд. 

Собрал uboot, он даже запустился (правда ему надо загрузить еще bl31 непонятно пока зачем, но главное - что-то уже работает). Вот выход:

U-Boot 2023.01 (May 04 2026 - 10:25:42 +0400)

CPU:   ZynqMP
Silicon: v3
Chip:  zu7ev
Model: ZCU104
Board: Xilinx ZynqMP
DRAM:  1023 MiB
PMUFW:  v1.1
PMUFW:  No permission to change config object
EL Level:       EL2
Secure Boot:    not authenticated, not encrypted
Core:  32 devices, 18 uclasses, devicetree: board
NAND:  0 MiB
MMC:   mmc@ff170000: 0
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: JTAG_MODE
Reset reason:   DEBUG
Net:   No ethernet found.
scanning bus for devices...
starting USB...
No working controllers found
Hit any key to stop autoboot:  0
ZynqMP>
ZynqMP> usb start
starting USB...
No working controllers found

Меня интересует запуск хоста USB. В конце пытаюсь запустить USB - конечно не получается. В device tree нет USB. Device tree такой:

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2023.2
 * Today is: Tue Dec 16 00:06:47 2025
 */


/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"

/ {
	model = "ZCU104";
	compatible = "xlnx,zynqmp";
	
	aliases {
		serial0 = &uart0;
		spi0 = &qspi;
		mmc0 = &sdhci1;
	};
	
	chosen {
		bootargs = "earlycon";
		stdout-path = "serial0:115200n8";
	};
	
	memory@0 {
		device_type = "memory";
		reg = <0x0 0x0 0x0 0x3ff00000>;
	};
};

&sdhci1 {
	clock-frequency = <187481262>;
	status = "okay";
	xlnx,mio-bank = <0x1>;
	disable-wp;
	no-1-8-v;
	u-boot,dm-pre-reloc;
};

&qspi {
	is-dual = <1>;
	num-cs = <2>;
	spi-rx-bus-width = <4>;
	spi-tx-bus-width = <4>;
	status = "okay";
};

&uart0 {
	cts-override ;
	device_type = "serial";
	port-number = <0>;
	status = "okay";
	u-boot,dm-pre-reloc ;
};

Пробовал добавить в этот файл фрагменты, касающиеся USB - взял из файла zynqmp-zcu104-revA.dts, получился такой .dts:

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2023.2
 * Today is: Tue Dec 16 00:06:47 2025
 */


/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"

/ {
	model = "ZCU104";
	compatible = "xlnx,zynqmp";
	
	aliases {
		serial0 = &uart0;
		spi0 = &qspi;
		mmc0 = &sdhci1;
	};
	
	chosen {
		bootargs = "earlycon";
		stdout-path = "serial0:115200n8";
	};
	
	memory@0 {
		device_type = "memory";
		reg = <0x0 0x0 0x0 0x3ff00000>;
	};
};

&pinctrl0 {
	status = "okay";

	pinctrl_usb0_default: usb0-default {
		mux {
			groups = "usb0_0_grp";
			function = "usb0";
		};

		conf {
			groups = "usb0_0_grp";
			power-source = <IO_STANDARD_LVCMOS18>;
		};

		conf-rx {
			pins = "MIO52", "MIO53", "MIO55";
			bias-high-impedance;
			drive-strength = <12>;
			slew-rate = <SLEW_RATE_FAST>;
		};

		conf-tx {
			pins = "MIO54", "MIO56", "MIO57", "MIO58", "MIO59",
			       "MIO60", "MIO61", "MIO62", "MIO63";
			bias-disable;
			drive-strength = <4>;
			slew-rate = <SLEW_RATE_SLOW>;
		};
	};
};

	/* ULPI SMSC USB3320 */
&usb0 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_usb0_default>;
	phy-names = "usb3-phy";
	phys = <&psgtr 2 PHY_TYPE_USB3 0 2>;
};

&dwc3_0 {
	status = "okay";
	dr_mode = "host";
	snps,usb3_lpm_capable;
	maximum-speed = "super-speed";
};


&sdhci1 {
	clock-frequency = <187481262>;
	status = "okay";
	xlnx,mio-bank = <0x1>;
	disable-wp;
	no-1-8-v;
	u-boot,dm-pre-reloc;
};

&qspi {
	is-dual = <1>;
	num-cs = <2>;
	spi-rx-bus-width = <4>;
	spi-tx-bus-width = <4>;
	status = "okay";
};

&uart0 {
	cts-override ;
	device_type = "serial";
	port-number = <0>;
	status = "okay";
	u-boot,dm-pre-reloc ;
};

Теперь при сборке получаю ошибку:

image.thumb.png.076046427f4d91c5528f6cdb171430fe.png

Где что еще надо прописать, чтобы uboot понял что у него есть USB? Что ему не хватает сейчас?

Share this post


Link to post
Share on other sites

для начала: а в железе он есть ? аппаратно сконфигурён ?

Share this post


Link to post
Share on other sites

В железе он есть - это отладка ZCU104. А откуда uboot может знать, кроме dts, что USB не сконфигурирован в железе? Это же PS USB, он всегда есть, аппаратный. Ну и физика ULPI на ZCU104 всегда присутствует. Только регистры настроить. Хотя, справедливости ради, в блок-дизайне, в примере, под который изначально собирал uboot, галка в PS на USB не была поставлена. Это где-то кроме dts отражается для uboot?

Я думал для uboot галки в блок-дизайне в PS processor system - это как раз описание соответствующих интерфейсов в dts

 

А FSBL как-то принимает участие в настройке USB?

Share this post


Link to post
Share on other sites

первично - проект в виваде. там определяется что и на какие пины будет выведено.

вторично описание - *.dtsi (если берётся стандартная плата и стандартный проект в виваде). смотрим внутрь *.dtsi - ищем нужное устройство. смотрим на значение полей. читаем азбуку про dts. редактируем под свои нужды *.dts

чтобы uboot умел пользоваться *.dts - надо иметь скомпилированный вариант *.dtb.  сиё делается либо ручками / либо петалинуксом /либо йоктой / либо буилдрутом / либо ....... 

пс: возьмите изначально РАБОЧИЙ проект и на нём экспериментируйте.

гуглить что есть bl31, и вообще - до того как запустится uboot - есть куча других этапов загрузки.

Share this post


Link to post
Share on other sites

10 часов назад, alexPec сказал:

Теперь при сборке получаю ошибку:

наверное не описана IO_STANDARD_LVCMOS18

Share this post


Link to post
Share on other sites

9 часов назад, gridinp сказал:

наверное не описана IO_STANDARD_LVCMOS18

Точно, спасибо! Там еще были похожие баги, исправил, по крайней мере убут уже видит контроллер при старте

Share this post


Link to post
Share on other sites

20 hours ago, alexPec said:

А FSBL как-то принимает участие в настройке USB?

Да конечно, те галки которые вы ставите в блок дизайне транслируются в значения которые FSBL прописывает в соответствующие регистры. Это все попадает в файл psu_init.c в FSBL если правильно помню. Поэтому без них работать не будет.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...