alexPec 6 April 28 Posted April 28 · Report post Всем доброго дня. До сих пор только 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. Но похоже все сложнее... Quote Share this post Link to post Share on other sites More sharing options...
Jury093 3 April 28 Posted April 28 · Report post 2 часа назад, alexPec сказал: А с чего этот убут начинает выполняться, где у него точка входа? В примере есть hello world: Что это? Для чего он? Может кто направит на путь истинный? Какая вообще философия этого убута кратко? hello_world - это пример программы, бинарник которой можно загрузить в консоль u-boot и запустить на выполнение философия простая - произвести начальную конфигурацию контроллера памяти и остальной необходимой периферии (графика, накопители, интерфейсы), далее в случае сценария загрузки линукса через уже настроенный интерфейс загрузить в память ядро и необходимые бинарники и отдать управление ядру у xilinx (я не особо следил за развитием) куча всяких мутаций, как железа так и софта (сейчас ксайлинксводы подтянутся и помогут) попробуйте там поискать необходимую инфу https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842223/U-boot Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 April 28 Posted April 28 · Report post наивный вьюноша... начинать надо с РАБОЧЕГО примера от xilinx/amd/.... uboot - это малое "зло" из всех зол для US+ Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 April 28 Posted April 28 · Report post Я про это и спрашиваю, где б его взять, рабочий пример. Мне дальше убута не надо, нужен именно сам убут. А конкретно - инициализацию хоста USB хочу оттуда вытащить. Как мануал ни почитаешь - "качайте с гитхаба, собираете, получаете elf...". А как там внутри все работает, настраивается - хз, нигде толком ничего нет. Видел, что для конкретных плат есть device tree файлы, в которых прописана конфигурация, но я пока даже не понимаю, с какой функции в исходниках начинается работа убута. В fsbl все просто - main, там все видно, как по очереди проходит инициализация, с какого источника дальше пытается грузить. А вот в убуте я что-то зарылся... Пока не вижу откуда начинать его раскапывать... 1 час назад, Jury093 сказал: бинарник которой можно загрузить в консоль u-boot и запустить на выполнение Вот этого то я и не понимаю, что он будет делать, этот бинарник? app_startup(argv); Это главная строчка этого исходника? Тогда какие еще аргументы ему нужны? Или этот app_startup из консоли работает? Где-то есть описанные команды? Или тоже раскапывать? Пока одни вопросы... Quote Share this post Link to post Share on other sites More sharing options...
danusha 1 April 28 Posted April 28 · Report post То есть “настоящая” первая инструкция для 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. Quote Share this post Link to post Share on other sites More sharing options...
Jury093 3 April 28 Posted April 28 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 May 4 Posted May 4 · Report post Спасибо 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 ; }; Теперь при сборке получаю ошибку: Где что еще надо прописать, чтобы uboot понял что у него есть USB? Что ему не хватает сейчас? Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 May 4 Posted May 4 · Report post для начала: а в железе он есть ? аппаратно сконфигурён ? Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 May 4 Posted May 4 · Report post В железе он есть - это отладка ZCU104. А откуда uboot может знать, кроме dts, что USB не сконфигурирован в железе? Это же PS USB, он всегда есть, аппаратный. Ну и физика ULPI на ZCU104 всегда присутствует. Только регистры настроить. Хотя, справедливости ради, в блок-дизайне, в примере, под который изначально собирал uboot, галка в PS на USB не была поставлена. Это где-то кроме dts отражается для uboot? Я думал для uboot галки в блок-дизайне в PS processor system - это как раз описание соответствующих интерфейсов в dts А FSBL как-то принимает участие в настройке USB? Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 May 4 Posted May 4 · Report post первично - проект в виваде. там определяется что и на какие пины будет выведено. вторично описание - *.dtsi (если берётся стандартная плата и стандартный проект в виваде). смотрим внутрь *.dtsi - ищем нужное устройство. смотрим на значение полей. читаем азбуку про dts. редактируем под свои нужды *.dts чтобы uboot умел пользоваться *.dts - надо иметь скомпилированный вариант *.dtb. сиё делается либо ручками / либо петалинуксом /либо йоктой / либо буилдрутом / либо ....... пс: возьмите изначально РАБОЧИЙ проект и на нём экспериментируйте. гуглить что есть bl31, и вообще - до того как запустится uboot - есть куча других этапов загрузки. Quote Share this post Link to post Share on other sites More sharing options...
gridinp 11 May 4 Posted May 4 · Report post 10 часов назад, alexPec сказал: Теперь при сборке получаю ошибку: наверное не описана IO_STANDARD_LVCMOS18 Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 May 5 Posted May 5 · Report post 9 часов назад, gridinp сказал: наверное не описана IO_STANDARD_LVCMOS18 Точно, спасибо! Там еще были похожие баги, исправил, по крайней мере убут уже видит контроллер при старте Quote Share this post Link to post Share on other sites More sharing options...
fpga_dev 11 May 5 Posted May 5 · Report post 20 hours ago, alexPec said: А FSBL как-то принимает участие в настройке USB? Да конечно, те галки которые вы ставите в блок дизайне транслируются в значения которые FSBL прописывает в соответствующие регистры. Это все попадает в файл psu_init.c в FSBL если правильно помню. Поэтому без них работать не будет. Quote Share this post Link to post Share on other sites More sharing options...