Jump to content

    

doom13

Свой
  • Content Count

    1550
  • Joined

  • Last visited

Community Reputation

0 Обычный

About doom13

  • Rank
    Профессионал
  • Birthday 02/09/1982

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Минск, Беларусь

Recent Profile Visitors

6639 profile views
  1. LwIP link up/down

    Спасибо, с этим понятно. Думал так делать, но пока пытаюсь понять. есть ли стандартная опция/возможность. Если кабель дёргать то сообщения в stdout кидает (если не ошибаюсь), поэтому решил, что оно само мониторит состояние сети и возможно есть какая-то возможность привязаться к данному событию. //netif.h #if LWIP_NETIF_LINK_CALLBACK /** This function is called when the netif link is set to up or down */ netif_status_callback_fn link_callback; #endif /* LWIP_NETIF_LINK_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback); #endif /* LWIP_NETIF_LINK_CALLBACK */ Такое вот нахожу
  2. LwIP link up/down

    Приветствую. Есть ли какое-то событие/семафор/др. при срабатывании link up/down? Хочу сделать, чтобы задача спала, пока нет линка или засыпала, когда пропал.
  3. Что-то не могу повторить полученный ранее результат. Вопрос где хранится timestamp образа и как его туда поместить? Для формирования boot.bin используется bif-файл с содержимым: //arch = zynqmp; split = false; format = BIN the_ROM_image: { [pskfile]/home/user/workspace/xczu9eg/boot/psk0.pem [sskfile]/home/user/workspace/xczu9eg/boot/ssk0.pem [auth_params]spk_id = 0x00000000; ppk_select = 0 [fsbl_config]a53_x64, bh_auth_enable [bootloader, authentication = rsa]/home/user/workspace/xczu9eg/xczu9eg.sdk/fsbl/Debug/fsbl.elf [pmufw_image]/home/user/workspace/xczu9eg/xczu9eg.sdk/pmufw/Debug/pmufw.elf [authentication = rsa, destination_device = pl]/home/user/workspace/xczu9eg/xczu9eg.runs/impl_1/xczu9eg.bit [authentication = rsa, destination_cpu = a53-0, exception_level = el-3]/home/user/workspace/xczu9eg/xczu9eg.sdk/app_a53_0/Debug/app_a53_0.elf [authentication = rsa, destination_cpu = a53-1, exception_level = el-3]/home/user/workspace/xczu9eg/xczu9eg.sdk/app_a53_1/Debug/app_a53_1.elf }
  4. Уже нет убута и Linux. Нужно чтобы система позволяла безопасно обновить ПО в QSPI. Пока поддерживает перепрошивку QSPI, но если произошёл сбой в процессе перепрошивки QSPI, то система превращается в кирпич. Нашёл, что есть такая фишка, как MultiBoot (что успешно реализовано для платы с Kintex UltraScale+), но не совсем понимаю, как правильно реализовать его поддержку в случае ZynqMP. Пока протестил, что если положить две прошивки (первая golden image, которая никогда не перезаписывается, и вторая, которая будет обновляться), то будет стартовать более новую версию прошивки, которая и обновлялась. Но, если при перепрошивке рабочего ПО (второго образа) произошёл сбой, могу получить вариант с частично испорченной прошивкой. Система пытается её загрузить, сбрасывается, и так по кругу (или вариант, когда стартует битую прошивку и остаётся в нерабочем состоянии). Golden image никогда не запускается. Вот пытаюсь понять, что тут делаю неправильно и как заставить систему остаться в режиме golden image. Всю систему грузит только FSBL. Читал xilinx-wiki по реализации MultiBoot. Но так и не понял, что они тут советуют. Предлагается перезаписать мултибут регистр и делать сброс системы XFsbl_UpdateMultiBoot while (FsblStage<=XFSBL_STAGE_DEFAULT) { switch (FsblStage) { case XFSBL_STAGE1: { /** * Initialize the system */ FsblStatus = XFsbl_Initialize(&FsblInstance); if (XFSBL_SUCCESS != FsblStatus) { FsblStatus += XFSBL_ERROR_STAGE_1; FsblStage = XFSBL_STAGE_ERR; } else { /** * * Include the code for FSBL time measurements * Initialize the global timer and get the value */ FsblStage = XFSBL_STAGE2; } /** * 24.12.2019 * Edited by Andrei Hres * This code support MultiBoot option. * Application image (IMAGE1) is placed at address 0x04000000. * BootROM will try to find valid boot image at every 32kB offset. * Offset 2048 - start boot at 32768*2048 = 0x04000000 */ XFsbl_UpdateMultiBoot(2048); }break; static void XFsbl_UpdateMultiBoot(u32 MultiBootValue) { u32 RegValue; XFsbl_Out32(CSU_CSU_MULTI_BOOT, MultiBootValue); /** * Due to a bug in 1.0 Silicon, PS hangs after System Reset if RPLL is used. * Hence, just for 1.0 Silicon, bypass the RPLL clock before giving * System Reset. */ if (XGetPSVersion_Info() == (u32)XPS_VERSION_1) { RegValue = XFsbl_In32(CRL_APB_RPLL_CTRL) | CRL_APB_RPLL_CTRL_BYPASS_MASK; XFsbl_Out32(CRL_APB_RPLL_CTRL, RegValue); } /* make sure every thing completes */ dsb(); isb(); if(FsblInstance.ResetReason != XFSBL_APU_ONLY_RESET) { /* Soft reset the system */ XFsbl_Printf(DEBUG_GENERAL,"Performing System Soft Reset\n\r"); RegValue = XFsbl_In32(CRL_APB_RESET_CTRL); XFsbl_Out32(CRL_APB_RESET_CTRL, RegValue|CRL_APB_RESET_CTRL_SOFT_RESET_MASK); /* wait here until reset happens */ while(1) { ; } } else { for(;;){ /*We should not be here*/ } } return; } Попробовал, зациклил систему на старте FSBL и сбросе.
  5. Загрузка с QSPI. Смотрю, что умеет стартануть более свежую прошиву, которая лежит во flash. Если эту более свежую частично испортить, то можно получить нерабочую систему без возможности её восстановления. Вопрос, как сделать так, чтоб при сбое во время обновления конфигурационной QSPI система могла всегда быть восстановлена?
  6. Приветствую. Поделитесь опытом по реализации MultiBoot для ZynqMP. Интересует сам принцип механизма. Правильно ли понимаю, что тут нет возможности перебросить загрузчик на нужный адрес, будет искать валидный хедер через каждые 32кБ? Только так? Спасибо.
  7. Спасибо. Что скажете про передающую сторону (ссылка на пост выше)? Там всё норм?
  8. Прошу прокомментировать. Спасибо.
  9. Ну как бы интерфейс DDR. Или я не понял что вы хотели сказать? На 2 странице скрины с расчётом прохождения данных и клока. Вы видите там ошибку? Для анализа setup использует clock LAN_RXC fall edge (4.00) и clock LAN_RXC rise edge (8.00).
  10. Вот смотрю, какие false path тут можно добавить и не нахожу вариантов. У Альтера всё задаётся относительно двух клоков, один из которых виртуальный, тут такого нет, как для передающей части, так и для приёмной. Вроде как должно быть правильно. Можно проект скачать на 3-ей странице в самом низу, будет наглядней. Вопрос остался.
  11. Взято из template Xilinx, всё что есть
  12. Прошу прокомментировать, правильно ли определяю выходные задержки для RGMII. тут удалось выполнить все ограничения накрутив фазу клока для MMCM): set_property PACKAGE_PIN H16 [get_ports LAN_RX_CTL] set_property PACKAGE_PIN G17 [get_ports LAN_RXC] set_property PACKAGE_PIN G16 [get_ports {LAN_RXD[0]}] set_property PACKAGE_PIN D17 [get_ports {LAN_RXD[1]}] set_property PACKAGE_PIN E16 [get_ports {LAN_RXD[2]}] set_property PACKAGE_PIN F17 [get_ports {LAN_RXD[3]}] set_property PACKAGE_PIN E17 [get_ports LAN_TX_CTL] set_property PACKAGE_PIN D16 [get_ports LAN_TXC] set_property PACKAGE_PIN C16 [get_ports {LAN_TXD[0]}] set_property PACKAGE_PIN B17 [get_ports {LAN_TXD[1]}] set_property PACKAGE_PIN B16 [get_ports {LAN_TXD[2]}] set_property PACKAGE_PIN A17 [get_ports {LAN_TXD[3]}] set_property IOSTANDARD LVCMOS25 [get_ports LAN_RX_CTL] set_property IOSTANDARD LVCMOS25 [get_ports LAN_RXC] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[0]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[1]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[2]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[3]}] set_property IOSTANDARD LVCMOS25 [get_ports LAN_TX_CTL] set_property IOSTANDARD LVCMOS25 [get_ports LAN_TXC] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[0]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[1]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[2]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[3]}] set_property PACKAGE_PIN F14 [get_ports FPGA_CLK_50M] set_property IOSTANDARD LVCMOS33 [get_ports FPGA_CLK_50M] create_clock -period 20.000 -name FPGA_CLK_50M -waveform {0.000 10.000} [get_ports FPGA_CLK_50M] create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC] set_clock_groups -asynchronous -group {FPGA_CLK_50M} -group {LAN_RXC} # RGMII output delay # For this constraint set PHY register 20.1 to 0 in software driver # # Double Data Rate Source Synchronous Outputs # # Source synchronous output interfaces can be constrained either by the max data skew # relative to the generated clock or by the destination device setup/hold requirements. # # Setup/Hold Case: # Setup and hold requirements for the destination device and board trace delays are known. # # forwarded _________________________________ # clock __________| |______________ # | | # tsu_r | thd_r tsu_f | thd_f # <------>|<-------> <------>|<-----> # ________|_________ ________|_______ # data @ destination XXX__________________XXXXXXXXXXXXXXXX________________XXXXX # # Example of creating generated clock at clock output port create_generated_clock -name LAN_TXC -multiply_by 1 -source [get_pins mmcm_1_inst/inst/clk_out5] [get_ports LAN_TXC] # gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk". set fwclk LAN_TXC; # forwarded clock name (generated using create_generated_clock at output clock port) set tsu_r 1.000; # destination device setup time requirement for rising edge set thd_r 0.800; # destination device hold time requirement for rising edge set tsu_f 1.000; # destination device setup time requirement for falling edge set thd_f 0.800; # destination device hold time requirement for falling edge set trce_dly_max 0.000; # maximum board trace delay set trce_dly_min 0.000; # minimum board trace delay set output_ports [list LAN_TX_CTL {LAN_TXD[0]} {LAN_TXD[1]} {LAN_TXD[2]} {LAN_TXD[3]}]; # list of output ports # Output Delay Constraints set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_f] [get_ports $output_ports] -clock_fall -add_delay; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_f] [get_ports $output_ports] -clock_fall -add_delay; Из доки на PHY: Правильно ли тут используется create_generated_clock -name LAN_TXC -multiply_by 1 -source [get_pins mmcm_1_inst/inst/clk_out5] [get_ports LAN_TXC] Т.к. вообще сам клок LAN_TXC берётся с ODDRE1 (пин mmcm_1_inst/inst/clk_out5 идёт на ODDRE1/С где ODDRE1/D1 == 1 и ODDRE1/D2 == 0)? Сам тестовый проект (тут с описакнием выходных задержек) под Vivado 2018.2: rgmii_v2.zip Каким образом ODDRE1 преобразовался в OSERDESE3?
  13. Спасибо. Сэкономили на FPGA, теперь ломаем голову, как исправить. Смотрю, что большая по ресурсам в том же корпусе позволит решить проблему малой кровью (появляется дополнительный HP банк рядом с HD банком, на котором уже висит Ethernet).
  14. Могу ли пренебречь (считать за 0.000), если линии клока и данных на плате выровнены? Так трассировка одинакова, откуда различия?
  15. Откуда min/max? Длина дорожки постоянна!