Обновление бутлоадера 1.3.0 => 1.4.0

Решил обновить софт на контроллере, заодно обновить прошивки.
Программа обновления прошивок предложила обновить бут. В итоге имеем интересное:

root@wirenboard:~# wb-mcu-fw-updater update-bl -a 141 /dev/ttyRS485-2
2024-03-04 20:30:30,520 Will find serial port settings for (/dev/ttyRS485-2 : 141; response_timeout: 0.20)...
2024-03-04 20:30:37,761 Has found serial port settings: {'baudrate': 115200, 'parity': 'N', 'stopbits': 2}
2024-03-04 20:30:39,352 bootloader (mr6G 141 on /dev/ttyRS485-2):
2024-03-04 20:30:39,353 Update: 1.3.0 -> 1.4.0 (mr6G 141 /dev/ttyRS485-2)
2024-03-04 20:30:41,479 Flashing /var/lib/wb-mcu-fw-updater/bootloader/wb-bootloader-updater_mr6G__1.4.0_master_c654e11.wbfw
100%|#############################################################################################################################################################################################|36/36
2024-03-04 20:30:46,050 Bootloader was successfully flashed. Will flash released firmware for "mr6G"
2024-03-04 20:30:49,354 Flashing /var/lib/wb-mcu-fw-updater/mr6G__1.21.1_master_ebe20ba.wbfw
2024-03-04 20:31:19,499 Flashing bootloader to (/dev/ttyRS485-2 141; response_timeout: 0.20s) has failed!
2024-03-04 20:31:19,500

Повторная заливка бута спасает ситуацию.

root@wirenboard:~# wb-mcu-fw-updater update-bl -a 141 /dev/ttyRS485-2
2024-03-04 20:35:43,285 Will find serial port settings for (/dev/ttyRS485-2 : 141; response_timeout: 0.20)...
2024-03-04 20:36:32,157 Will find bootloader port settings for (/dev/ttyRS485-2 : 141; response_timeout: 0.20)...
2024-03-04 20:36:39,715 Has found bootloader port settings: {'baudrate': 9600, 'parity': 'N', 'stopbits': 2}
2024-03-04 20:36:39,716 Device (/dev/ttyRS485-2 141; response_timeout: 0.20s) supposed to be alive, but found in bootloader
2024-03-04 20:36:40,374 Will flash bootloader v:latest to bring mr6G (/dev/ttyRS485-2 141; response_timeout: 0.20s) alive
2024-03-04 20:36:40,695 Flashing /var/lib/wb-mcu-fw-updater/bootloader/wb-bootloader-updater_mr6G__1.4.0_master_c654e11.wbfw
100%|#############################################################################################################################################################################################|36/36
2024-03-04 20:36:52,501 Flashing /var/lib/wb-mcu-fw-updater/mr6G__1.21.1_master_ebe20ba.wbfw
100%|###########################################################################################################################################################################################|213/213

Аналогичная ситуация была с модулем MAP3EV, MAP3E.

Складывается ощущение, что после заливки бута 1.4.0 бут начинает работать на скорости 9600, а софтина, которая пытается после этого залить прошивку, пытается это сделать на скорости 115200. Но как итог прошивка не заливается.
При обновлении бута до 1.3.0 таких проблем не было.

05-03-2024 12:44:34.294 [session-c10.scope]	Will run: fuser -k -CONT /dev/ttyRS485-2
05-03-2024 12:44:34.293 [session-c10.scope]	Has saved db to /var/lib/wb-mcu-fw-updater/devices.jsondb
05-03-2024 12:44:34.286 [session-c10.scope]	
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 102, in _send_info
    self.instrument.write_u16_regs(self.INFO_BLOCK_START, regs_row)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 42, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 69, in wrapper
    raise thrown_exc
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 63, in wrapper
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 285, in write_u16_regs
    self.device.write_registers(beginning, values)
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 885, in write_registers
    self._generic_command(
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 1139, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 1203, in _perform_command
    response = self._communicate(request, number_of_bytes_to_read)
  File "/usr/lib/python3/dist-packages/wb_modbus/instruments.py", line 161, in _communicate
    self._write_to_bus(request)
  File "/usr/lib/python3/dist-packages/wb_modbus/instruments.py", line 251, in _write_to_bus
    raise minimalmodbus.NoResponseError("No communication with the instrument (no answer)")
wb_modbus.minimalmodbus.NoResponseError: No communication with the instrument (no answer)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/bin/wb-mcu-fw-updater", line 90, in _update_alive_device
    update_monitor.flash_alive_device(modbus_connection, mode, branch, version, force, erase_settings)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 578, in flash_alive_device
    _do_flash(modbus_connection, downloaded_fw, mode, erase_settings, force=force)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 522, in _do_flash
    direct_flash(downloaded_fw, modbus_connection, erase_settings, force=force)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 385, in direct_flash
    flasher.flash_in_bl(fw_fpath)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 160, in flash_in_bl
    self._send_info(info_block)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 106, in _send_info
    six.raise_from(FlashingError, e)
  File "<string>", line 3, in raise_from
wb_mcu_fw_updater.fw_flasher.FlashingError
05-03-2024 12:44:34.270 [session-c10.scope]	Flashing bootloader to (/dev/ttyRS485-2 65; response_timeout: 0.20s) has failed!
05-03-2024 12:44:04.124 [session-c10.scope]	Flashing /var/lib/wb-mcu-fw-updater/mr6cuG__1.21.1_master_ebe20ba.wbfw
05-03-2024 12:44:02.736 [session-c10.scope]	http://fw-releases.wirenboard.com/fw/by-signature/mr6cuG/main/1.21.1.wbfw => /var/lib/wb-mcu-fw-updater/mr6cuG__1.21.1_master_ebe20ba.wbfw
05-03-2024 12:44:02.734 [session-c10.scope]	Got fname: mr6cuG__1.21.1_master_ebe20ba.wbfw
05-03-2024 12:44:02.732 [session-c10.scope]	Trying to get fname from content-disposition
05-03-2024 12:44:02.292 [session-c10.scope]	GET: http://fw-releases.wirenboard.com/fw/by-signature/mr6cuG/main/1.21.1.wbfw
05-03-2024 12:44:02.292 [session-c10.scope]	GET: http://fw-releases.wirenboard.com/fw/by-signature/mr6cuG/main/1.21.1.wbfw
05-03-2024 12:44:02.288 [session-c10.scope]	FW version for mr6cuG on release stable: 1.21.1 (endpoint: fw/by-signature/mr6cuG/main/1.21.1.wbfw)
05-03-2024 12:44:00.973 [session-c10.scope]	GET: http://fw-releases.wirenboard.com/fw/by-signature/release-versions.yaml
05-03-2024 12:44:00.972 [session-c10.scope]	Looking to http://fw-releases.wirenboard.com/fw/by-signature/release-versions.
[diag_output_AANBN45D_2024-03-05-12.45.40.zip|attachment](upload://3g8PXSsfWIa84rqbV6GgcDEeFff.zip) (270,2 КБ)
yaml (suite: stable)
05-03-2024 12:44:00.971 [session-c10.scope]	FW releases files: ['http://fw-releases.wirenboard.com/fw/by-signature/release-versions.yaml']

Добрый день.
Так, сейчас попробую воспроизвести.

Посмотрите на Ошибка обновления устройств WB-MRPS6/S - #10 от пользователя BrainRoot

Похоже проблема проявляется только при обновлении на бут 1.4.0.
Меня пока спасает то, что бут таки взлетает, хоть и на скорости 9600.
Если вызвать wb-mcu-fw-updater update-bl --force -a 18 /dev/ttyRS485-2, то обновление бута происходит на скорости 115200 и последующая заливка прошивки похоже заливается так же на 115200.
А вот обновление происходит со сбоем:

root@wirenboard:~# wb-mcu-fw-updater update-bl -a 18 /dev/ttyRS485-2
2024-03-06 19:16:58,762 Will find serial port settings for (/dev/ttyRS485-2 : 18; response_timeout: 0.20)...
2024-03-06 19:17:06,002 Has found serial port settings: {'baudrate': 115200, 'parity': 'N', 'stopbits': 2}
2024-03-06 19:17:07,643 bootloader (mr6cpG 18 on /dev/ttyRS485-2):
2024-03-06 19:17:07,646 Update: 1.3.0 -> 1.4.0 (mr6cpG 18 /dev/ttyRS485-2)
2024-03-06 19:17:09,766 Flashing /var/lib/wb-mcu-fw-updater/bootloader/wb-bootloader-updater_mr6cpG__1.4.0_master_c654e11.wbfw
100%|#############################################################################################################################################################################################|36/36
2024-03-06 19:17:14,331 Bootloader was successfully flashed. Will flash released firmware for "mr6cpG"
2024-03-06 19:17:17,953 Flashing /var/lib/wb-mcu-fw-updater/mr6cpG__1.21.1_master_ebe20ba.wbfw
2024-03-06 19:17:48,108 Flashing bootloader to (/dev/ttyRS485-2 18; response_timeout: 0.20s) has failed!
2024-03-06 19:17:48,109
root@wirenboard:~# wb-mcu-fw-updater update-bl -a 18 /dev/ttyRS485-2
2024-03-06 19:18:18,307 Will find serial port settings for (/dev/ttyRS485-2 : 18; response_timeout: 0.20)...
2024-03-06 19:19:07,143 Will find bootloader port settings for (/dev/ttyRS485-2 : 18; response_timeout: 0.20)...
2024-03-06 19:19:14,707 Has found bootloader port settings: {'baudrate': 9600, 'parity': 'N', 'stopbits': 2}
2024-03-06 19:19:14,709 Device (/dev/ttyRS485-2 18; response_timeout: 0.20s) supposed to be alive, but found in bootloader
2024-03-06 19:19:15,222 Will flash bootloader v:latest to bring mr6cpG (/dev/ttyRS485-2 18; response_timeout: 0.20s) alive
2024-03-06 19:19:15,511 Flashing /var/lib/wb-mcu-fw-updater/bootloader/wb-bootloader-updater_mr6cpG__1.4.0_master_c654e11.wbfw
100%|#############################################################################################################################################################################################|36/36
2024-03-06 19:19:27,346 Flashing /var/lib/wb-mcu-fw-updater/mr6cpG__1.21.1_master_ebe20ba.wbfw
100%|###########################################################################################################################################################################################|215/215
root@wirenboard:~# wb-mcu-fw-updater update-bl -a 18 /dev/ttyRS485-2
2024-03-06 19:20:24,760 Will find serial port settings for (/dev/ttyRS485-2 : 18; response_timeout: 0.20)...
2024-03-06 19:20:31,997 Has found serial port settings: {'baudrate': 115200, 'parity': 'N', 'stopbits': 2}
2024-03-06 19:20:33,555 bootloader (mr6cpG 18 on /dev/ttyRS485-2):
2024-03-06 19:20:33,556 Update skipped: 1.4.0 -> 1.4.0 (mr6cpG 18 /dev/ttyRS485-2)
2024-03-06 19:20:33,557 Done
root@wirenboard:~# wb-mcu-fw-updater update-bl --force -a 18 /dev/ttyRS485-2
2024-03-06 19:20:43,836 Will find serial port settings for (/dev/ttyRS485-2 : 18; response_timeout: 0.20)...
2024-03-06 19:20:51,072 Has found serial port settings: {'baudrate': 115200, 'parity': 'N', 'stopbits': 2}
2024-03-06 19:20:52,592 bootloader (mr6cpG 18 on /dev/ttyRS485-2):
2024-03-06 19:20:52,594 Force update: 1.4.0 -> 1.4.0 (mr6cpG 18 /dev/ttyRS485-2)
2024-03-06 19:20:54,719 Flashing /var/lib/wb-mcu-fw-updater/bootloader/wb-bootloader-updater_mr6cpG__1.4.0_master_c654e11.wbfw
100%|#############################################################################################################################################################################################|36/36
2024-03-06 19:20:59,324 Bootloader was successfully flashed. Will flash released firmware for "mr6cpG"
2024-03-06 19:21:02,726 Flashing /var/lib/wb-mcu-fw-updater/mr6cpG__1.21.1_master_ebe20ba.wbfw
100%|###########################################################################################################################################################################################|215/215
2024-03-06 19:21:28,984 Done

Ну и в журнале событий имеем ошибку после первой попытки выполнить обновление бута:

06-03-2024 19:17:48.122 [session-c14.scope]	
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 102, in _send_info
    self.instrument.write_u16_regs(self.INFO_BLOCK_START, regs_row)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 42, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 69, in wrapper
    raise thrown_exc
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 63, in wrapper
    return f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/wb_modbus/bindings.py", line 285, in write_u16_regs
    self.device.write_registers(beginning, values)
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 885, in write_registers
    self._generic_command(
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 1139, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/usr/lib/python3/dist-packages/wb_modbus/minimalmodbus.py", line 1203, in _perform_command
    response = self._communicate(request, number_of_bytes_to_read)
  File "/usr/lib/python3/dist-packages/wb_modbus/instruments.py", line 161, in _communicate
    self._write_to_bus(request)
  File "/usr/lib/python3/dist-packages/wb_modbus/instruments.py", line 251, in _write_to_bus
    raise minimalmodbus.NoResponseError("No communication with the instrument (no answer)")
wb_modbus.minimalmodbus.NoResponseError: No communication with the instrument (no answer)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/bin/wb-mcu-fw-updater", line 90, in _update_alive_device
    update_monitor.flash_alive_device(modbus_connection, mode, branch, version, force, erase_settings)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 578, in flash_alive_device
    _do_flash(modbus_connection, downloaded_fw, mode, erase_settings, force=force)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 522, in _do_flash
    direct_flash(downloaded_fw, modbus_connection, erase_settings, force=force)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/update_monitor.py", line 385, in direct_flash
    flasher.flash_in_bl(fw_fpath)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 160, in flash_in_bl
    self._send_info(info_block)
  File "/usr/lib/python3/dist-packages/wb_mcu_fw_updater/fw_flasher.py", line 106, in _send_info
    six.raise_from(FlashingError, e)
  File "<string>", line 3, in raise_from
wb_mcu_fw_updater.fw_flasher.FlashingError
06-03-2024 19:17:48.109 [session-c14.scope]	Flashing bootloader to (/dev/ttyRS485-2 18; response_timeout: 0.20s) has failed!

Используйте wb-mcu-fw-flasher.

Это работает, как и вызов, например, wb-mcu-fw-updater update-fw -a 18 /dev/ttyRS485-2, когда фейлится заливка прошивки после обновления бута. Но получается, что для перехода на бут 1.4.0 ломается весь механизм автоматического обновления бута и последующей заливки прошивки в лучшем случае, в худшем запарывается устройство.
Ладно, если это 2-3-4 устройства, а если надо будет обновить 2-3 десятка?

Ну и тут ещё 2 обращения было по выходу из строя устройств после обновления бута на 1.4.0.

До текущей версии апдейтера автоматического обновления bootloader не было, совсем. То есть только вручную.
https://wirenboard.com/wiki/Wb-mcu-fw-updater#Обновление_загрузчика_(update-bl)

Под автоматическим понимается, что при ручном обновлении бута процесс идет по пути заливки бута и последующем накатывании прошивки.
При обновлении на 1.3.0 накатываешь бут и после автоматом накатывается прошивка.
Сейчас же прошивка либо не заливается и прошивальщик падает, либо заливается у народа, но криво.

Да, это как раз и должен исправить bootloader 1.4

Однако он это не исправляет, а добавляет головной боли.
Тогда правильнее допилить обновлятор, чтобы тот после обновления бута пытался обновить флэш и на скорости 9600, если не удаётся подключиться к устройству на скорости шины, а не падать с грохотом, как описано в первых сообщениях.
Скорее всего у народа накрываются модули после установки бута 1.4.0 из-за того, что при кривой заливке флэша пытаются их “передёрнуть” какими-нибудь способами.
Как только народ массово начнёт обновляться на 1.4.0, то количество претензий будет расти.

1 лайк

Подключил ещё старые модули, где бут 1.2.2. Они до 1.4.0 обновились без проблем.

1 лайк

Обновил бут у оставшихся 16 устройств на буте 1.3.0. Но вот танцы с каждым раздражали.
Так ещё обновлятор каждый раз лезед в инет за прошивкой/бутом несмотря на то, что у него всё уже есть в каталоге /var/lib/wb-mcu-fw-updater.
В итоге 3 минуты на обновление бута с выкачиванием самого бута и прошивки из инета, которая в модуль не заливается. А потом обновлятор ещё 5 минут тупит в попытках понять в каком состоянии залип модуль с последующей попыткой выкачать из инета уже лежащую на диске прошивку.
На всё ушло 2 часа.