Fw_setenv

Добрый день!

Решил немного модифицировать алгоритм загрузки - чтобы по нажатию кнопки если есть флешка, то прошивка как обычно. А если usb пустой, то при нажатии кнопки принудительное переключение с /dev/mmcblk0p2 на /dev/mmcblk0p3 и наоборот. Но столкнулся с проблемой - не могу запихнуть в переменные строчки типа ${mmcpart}. Они подменяются пробелами когда гружу через fw_setenv. Через загрузчик => и sеtenv тоже самое.

Вот что я делал:

fw_setenv maybe_usbupdate “echo Check button… ; run led_wait_init ; if run wait_button_up; then if run wait_button_down; then run part_or_update; fi; fi”
fw_setenv part_or_update “echo Button pressed… ; regulator dev usb1_vbus ; regulator enable ; usb start ; echo Check usb flash… ; if usb storage ; then run try_usb_update ; elif run switch_part; fi”
fw_setenv try_usb_update “if load ${fw_dev} ${loadaddr} ${fw_file} 1 ; then run _usb_update_start ; elif load ${fw_dev} ${loadaddr} ${fw_reset_file} 1 ; then setenv fw_file ${fw_reset_file} ; run _usb_update_start ; fi”
fw_setenv switch_part “if test ${mmcpart} -eq 2; then echo Switching to rootfs on partition 3;setenv mmcpart 3;else; echo Switching to rootfs on partition 2;setenv mmcpart 2;fi;setenv bootcount 0;saveenv; continuing boot”

Немного непонятно…
В переменной mmcpart лежит ‘/dev/mmcblk0p3’?

В этой переменной лежит 2 или 3. А бутлоадер уже сам выбырает партишн

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

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

Вроде разобрался
чтобы получить “if load ${fw_dev}…….
надо писать “if load $’{‘fw_dev’}’…….
то есть снаружи выражения двойные кавычки, а спецсимволы в одинарные

Полезная функция получилась. Если с контроллером что то не так, то простой электрик с отверткой может исправить ситуацию до приезда специалиста. Правда не знаю поможет ли это с софтом wirenboard. Мы не используем. С боковыми модулями работаем напрямую по i2c. Хорошо, что почти все модули на одних и тех же чипах.

В wb-hwconf-manager долго не могли найти глюк. Провели эксперимент - перезагружали котроллер целый день по питанию. Примерно каждую 20 загрузку wb-hwconf-manager отрабатывал с ошибкой /etc/wb-hardware.conf not found. Когда заменили линк /etc/wb-hardware.conf на реальный файл ошибка пропала. Чудеса. Решили вообще отказаться. Встроенные модули конфигурим прямыми вызовами /user/share/wb-hwconf-manager/functions.sh

спасибо, постараемся воспроизвести. Не сохранилось у вас информации про версии софта, которые были установлены?

Тестировали на прошлогодних контроллерах и на 6.7. Прошивки с 2020-08-31 по последнюю. Мне кажется, на старых прошивках проблем не было. Всегда после загрузки был в наличии ttyRS485-2. Но с какой то версии заметили, что не всегда.