Перейти к содержанию
    

ZynqMp saveenv перезаписывает u-boot

во время загрузки, получаю предупреждение

Loading Environment from SPI Flash... SF: Detected n25q512a with page size 512 Bytes, erase size 128 KiB, total 128 MiB
*** Warning - bad CRC, using default environment
Это как бы понятно, бутарги не сохранялись. и грузятся те что по умолчанию

Я установил в реталинукс-конфиг партишины,

Скопировал CONFIG_EXTRA_ENV_SETTINGS в platform-top.h

Но дефолтные бутарги не соответствуют тем что я установил.

В итоге, kernel грузится не с того адреса, так как  kernelstart не соответствует правильному смещению. 

И если я установлю правильное смещение и сохраню - u-boot после этого не грузится.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

во время загрузки, получаю предупреждение

Loading Environment from SPI Flash... SF: Detected n25q512a with page size 512 Bytes, erase size 128 KiB, total 128 MiB
*** Warning - bad CRC, using default environment
Это как бы понятно, бутарги не сохранялись. и грузятся те что по умолчанию

Я установил в реталинукс-конфиг партишины,

Скопировал CONFIG_EXTRA_ENV_SETTINGS в platform-top.h

Но дефолтные бутарги не соответствуют тем что я установил.

В итоге, kernel грузится не с того адреса, так как  kernelstart не соответствует правильному смещению. 

И если я установлю правильное смещение и сохраню - u-boot после этого не грузится.

 

 

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

тогда в исходниках убута находите ветку, где отрабатывается команда saveenv и выводите на консоль все критичные адреса и размеры, потом вносите правки в "CONFIG_EXTRA_ENV_SETTINGS в platform-top.h"

под окружение кажись выделяется страница или кратно странице

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, Jury093 said:

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

тогда в исходниках убута находите ветку, где отрабатывается команда saveenv и выводите на консоль все критичные адреса и размеры, потом вносите правки в "CONFIG_EXTRA_ENV_SETTINGS в platform-top.h"

под окружение кажись выделяется страница или кратно странице

 В petalinux-config

устанавливаю размеры partition

Затем из platform-auto.h копирую в plaform-top.h

#define CONFIG_EXTRA_ENV_SETTINGS \
    SERIAL_MULTI \ 
    CONSOLE_ARG \ 
    DFU_ALT_INFO_RAM \ 
    PSSERIAL0 \ 
    "nc=setenv stdout nc;setenv stdin nc;\0" \ 
    "ethaddr=00:0a:35:00:22:01\0" \
    "autoload=no\0" \ 
    "sdbootdev=0\0" \ 
    "clobstart=0x10000000\0" \ 
    "netstart=0x10000000\0" \ 
    "dtbnetstart=0x23fff000\0" \ 
    "loadaddr=0x10000000\0" \ 
    "bootsize=0x1000000\0" \ 
    "bootstart=0x0\0" \ 
    "boot_img=BOOT.BIN\0" \ 
    "load_boot=tftpboot ${clobstart} ${boot_img}\0" \ 
    "update_boot=setenv img boot; setenv psize ${bootsize}; setenv installcmd \"install_boot\"; run load_boot test_img; setenv img; setenv psize; setenv installcmd\0" \ 
    "install_boot=sf probe 0 && sf erase ${bootstart} ${bootsize} && " \ 
        "sf write ${clobstart} ${bootstart} ${filesize}\0" \ 
    "bootenvsize=0x40000\0" \ 
    "bootenvstart=0x1000000\0" \ 
    "eraseenv=sf probe 0 && sf erase ${bootenvstart} ${bootenvsize}\0" \ 
    "jffs2size=0x2000000\0" \ 
    "jffs2start=0x3040000\0" \ 
    "jffs2_img=rootfs.jffs2\0" \ 
    "load_jffs2=tftpboot ${clobstart} ${jffs2_img}\0" \ 
    "update_jffs2=setenv img jffs2; setenv psize ${jffs2size}; setenv installcmd \"install_jffs2\"; run load_jffs2 test_img; setenv img; setenv psize; setenv installcmd\0" \ 
    "install_jffs2=sf probe 0 && sf erase ${jffs2start} ${jffs2size} && " \ 
        "sf write ${clobstart} ${jffs2start} ${filesize}\0" \ 
    "kernelsize=0x2000000\0" \ 
    "kernelstart=0x1040000\0" \ 
    "kernel_img=image.ub\0" \ 
    "load_kernel=tftpboot ${clobstart} ${kernel_img}\0" \ 
    "update_kernel=setenv img kernel; setenv psize ${kernelsize}; setenv installcmd \"install_kernel\"; run load_kernel test_crc; setenv img; setenv psize; setenv installcmd\0" \ 
    "install_kernel=sf probe 0 && sf erase ${kernelstart} ${kernelsize} && " \ 
        "sf write ${clobstart} ${kernelstart} ${filesize}\0" \ 
    "cp_kernel2ram=sf probe 0 && sf read ${netstart} ${kernelstart} ${kernelsize}\0" \ 
    "dtb_img=system.dtb\0" \ 
    "load_dtb=tftpboot ${clobstart} ${dtb_img}\0" \ 
    "update_dtb=setenv img dtb; setenv psize ${dtbsize}; setenv installcmd \"install_dtb\"; run load_dtb test_img; setenv img; setenv psize; setenv installcmd\0" \ 
    "fault=echo ${img} image size is greater than allocated place - partition ${img} is NOT UPDATED\0" \ 
    "test_crc=if imi ${clobstart}; then run test_img; else echo ${img} Bad CRC - ${img} is NOT UPDATED; fi\0" \ 
    "test_img=setenv var \"if test ${filesize} -gt ${psize}\\; then run fault\\; else run ${installcmd}\\; fi\"; run var; setenv var\0" \ 
    "netboot=tftpboot ${netstart} ${kernel_img} && bootm\0" \ 
    "default_bootcmd=run cp_kernel2ram && bootm ${netstart}\0" \ 
""

Тут, в CONFIG_EXTRA_ENV_SETTINGS, все смещения и размеры правильные.

bootsize=0x1000000  - 16 МБ, а boot.bin 6.6 MB.

Дальше радел bootenv

bootenvstart=0x1000000  bootenvsize=0x40000

После него идет kernel 

kernelstart=0x1040000

 

И я ожидал эти бутарги после загрузки увидеть в u-boot.

Но когда я их вывожу, то вижу что они совсем другие

bootenvstart=0x100000

kernelstart=0x140000

Я пробовал записать правильные смещения, для bootenvstart, но после этого u-boot не грузится.

 

Проблема в том, что у меня грузятся дефолтные переменные, которые не соответствуют,тем что я установил в проекте.

И я не знаю, откуда они берутся, я ожидал, что они будут браться из /project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h

Безымянный111.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мыши плакали, кололись, но продолжали жрать петалинукс. Что вам мешает собрать связку PMU/FSBL/ATF/U-Boot отдельно и в конфиге убута явно сказать, с какого адреса у вас живет Environment?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, gosha-z said:

Мыши плакали, кололись, но продолжали жрать петалинукс. Что вам мешает собрать связку PMU/FSBL/ATF/U-Boot отдельно и в конфиге убута явно сказать, с какого адреса у вас живет Environment?

Мыши жрут то, на что у них есть хоть какие то примеры.

Вот то, что я делаю.   

petalinux-config --get-hw-description=/home/user/petalinux/2019.2

petalinux-build

petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --fpga /home/user/petalinux/2019.2/zynqus/Zynq_TOP.bit --force

И задав партишины и и их размеры, я ведь указываю с какого адреса, кто где живет. Видимо я что то упустил изначально. 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Партишны - это которые для bootgen??? Ибо флешовые партишны - они только для NAND, для QSPI надо явно указать адрес и размер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, gosha-z said:

Партишны - это которые для bootgen??? Ибо флешовые партишны - они только для NAND, для QSPI надо явно указать адрес и размер.

Я указал и адрес и размер, на скрине видно.

И в system-conf.dtsi появились разделы с правильными адресами.


        partition@0x00000000 {
            label = "boot";
            reg = <0x00000000 0x01000000>;
        };
        partition@0x01000000 {
            label = "bootenv";
            reg = <0x01000000 0x00040000>;
        };
        partition@0x01040000 {
            label = "kernel";
            reg = <0x01040000 0x02000000>;
        };
        partition@0x03040000 {
            label = "jffs2";
            reg = <0x03040000 0x02000000>;
        };


Я их еще и в system-user.dtsi прописал

 

       partition@boot { /* for testing purpose */
            label = "boot";
            reg = <0x0 0x01000000>;
        };
        partition@bootenv { /* for testing purpose */
            label = "bootenv";
            reg = <0x1000000 0x00040000>;
        };
        partition@kernel { /* for testing purpose */
            label = "kernel";
            reg = <0x01040000 0x02000000>;
        };
        partition@jffs2 { /* for testing purpose */
            label = "jffs2";
            reg = <0x03040000 0x02000000>;
        };

И в  #define CONFIG_EXTRA_ENV_SETTINGS  они есть.

Но в u-boot попадают левые адреса, и размеры. 

Warning - bad CRC, using default environment

Возможно default environment это не переменные из CONFIG_EXTRA_ENV_SETTINGS . Но я не знаю где эти default environment прописать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Volkov сказал:

Warning - bad CRC, using default environment

Возможно default environment это не переменные из CONFIG_EXTRA_ENV_SETTINGS . Но я не знаю где эти default environment прописать.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это чей DT, убута или ядра?

Конфиг U-Boot должен выглядеть так:

image.thumb.png.2d993577aff3b587592860f6e097ebcf.png

Соотв. Environment offset - смещение в QSPI, где хранится ваш Environment, Environment Size - его размер (не имеет смысла делать его меньше Erase Size, в вашем случае - 128kB)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, gosha-z said:

Это чей DT, убута или ядра?

Конфиг U-Boot должен выглядеть так:

image.thumb.png.2d993577aff3b587592860f6e097ebcf.png

Соотв. Environment offset - смещение в QSPI, где хранится ваш Environment, Environment Size - его размер (не имеет смысла делать его меньше Erase Size, в вашем случае - 128kB)

Это конфиг петалинукса. Я поменял и в у-буте - не помогло. 

 

50 minutes ago, Jury093 said:

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

Так это и есть - plaform-top.h, я туда скопировал всю эту ерунду.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Volkov сказал:

Так это и есть - plaform-top.h, я туда скопировал всю эту ерунду.  

загляните в бинарник - попадают ли туда ваши настройки..

"bootenvsize=0x40000\0" \  - 256кБ не много для окружения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Jury093 said:

"bootenvsize=0x40000\0" \  - 256кБ не много для окружения?

У него размер сектора 128. И 128MB всего. В любом случае, не меньше Erase Size

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, gosha-z сказал:

У него размер сектора 128. И 128MB всего. В любом случае, не меньше Erase Size

это-то понятно, но зачем 256? если 64к вполне достаточно, т.е. прописать надо разумный минимум 128

и вот это "kernelsize=0x2000000\0" \ ядро 36МБ - это или косяк в размере или ядро слинкованное с рамфс

у ТС явно проблема с наложением областей и я дал выше совет, куда посмотреть и как проверить.

я работал с spi загрузкой с 3-5 платформами, там ничего магического нет, чистая математика

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если ничего не поменялось, то PetaLinux формирует FIT, а ему все эти установки в Environment до лампочки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Jury093 said:

это-то понятно, но зачем 256? если 64к вполне достаточно, т.е. прописать надо разумный минимум 128

и вот это "kernelsize=0x2000000\0" \ ядро 36МБ - это или косяк в размере или ядро слинкованное с рамфс

у ТС явно проблема с наложением областей и я дал выше совет, куда посмотреть и как проверить.

я работал с spi загрузкой с 3-5 платформами, там ничего магического нет, чистая математика

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

Это не у ТС проблема - это петялинукс косячил. Создал новый проект, но в этот раз я изначально, перед  petalinux-build ввел все адреса и размеры партов. 

И все заработало!!!!! Три дня я боролся фиг знает с чем.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...