Загрузчик периферийных устройств Wiren Board

Материал из Wiren Board


Загрузчик прошивок

В новых версиях наших устройств реализован механизм загрузчика прошивок (bootloader). Он позволяет обновлять микропрограммы устройств/модулей Wiren Board по RS-485/Modbus RTU.

В режиме загрузчика основной функционал устройства отключается. Коммуникационные параметры в режиме загрузчика фиксированы и не зависят от значений в памяти устройства: 9600 8N2.

Переход в режим загрузчика

Внимание: Отображаемое название «Загрузчик периферийных устройств Wiren Board» переопределяет ранее заданное отображаемое название «Загрузка прошивок на устройства Wiren Board».

Описание

Что такое загрузчик (28:27)

В периферийных устройствах с Modbus есть прошивка, которая реализует заложенную логику работы. Чтобы прошивку можно было обновлять прямо в инсталляции по RS-485, в устройствах предусмотрен загрузчик (bootloader), который отвечает за инициализацию устройства и обновление прошивки.

В документации на каждое устройство есть раздел «Обновление прошивки», где есть ссылки на инструкцию по обновлению и список изменений. В это статье мы рассмотрим только обновление загрузчика.

Переход устройств в режим загрузчика

Индикация режима загрузчика

Устройство находится в режиме загрузчика в следующих случаях:

  • первые 2 секунды после включения питания, если на устройстве есть корректная прошивка;
  • постоянно, если на устройстве нет корректной прошивки, например, был сбой при обновлении прошивки;
  • при записи 1 в holding-регистр 129(0x81) в момент работы основной программы — в этом случае устройство перезагружается и остается в режиме загрузчика 120 секунд с параметрами соединения 9600N2. Этот режим можно активировать запустив утилиту wb-mcu-fw-flasher с ключем -j.
  • при записи 1 в holding-регистр 131(0x83) в момент работы основной программы — в этом случае устройство перезагружается и остается в режиме загрузчика 120 секунд с параметрами соединения, установленными в настройках устройства. Это может быть полезно для обновления устройств за шлюзами без перенастройки параметров шлюза.
    Перейти в этот режим можно в wb-mcu-fw-flasher начиная с версии 1.3.0 запустив его с ключем -J. Кроме того для запуска режима необходима поддержка со стороны загрузчика (версия 1.3.0 и выше) и со стороны прошивки (см. changelog прошивки).

В режиме загрузчика индикатор Status устройства мигает с периодом 1 секунда, а при записи прошивки мигание индикатора учащается.

Восстановление прошивки описано в статье Обновление прошивки Modbus-устройств Wiren Board.

Проверка связи с устройством в режиме загрузчика

Загрузчик продолжает слушать шину RS-485 и отвечает на опрос некоторых регистров. Можно прочитать сигнатуру устройства используя команду modbus_client --debug -mrtu -b9600 -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r290 -c12 Важно: именно 12 регистров одним запросом, начиная с адреса 290.

Список изменений

Изменения во всех версиях описаны на странице Список изменений в загрузчике.

Обновление загрузчика

Текущую версию загрузчика можно узнать, считав 8 holding регистров с адреса 330, например, с помощью modbus_client:

echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r330 -c8 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

Есть несколько способов обновления загрузчика:

С контроллера Wiren Board

Загрузчик обновляется из консоли контроллера Wiren Board утилитой wb-mcu-fw-updater, которой для работы нужен доступ в интернет. Если интернета нет, используйте другой способ.

Учитывайте, что утилита учитывает установленный на контроллер релиз ПО , то есть вы не сможете зашить тестовую версию загрузчика, если на контроллере стабильный релиз.

Перед обновлением загрузчика, обновите прошивку контроллера через apt или другим способом по инструкциям.

Обновление загрузчика одного устройства

Процесс:

  1. Подключитесь к контроллеру по SSH.
  2. Запустите команду, заменив в ней порт и адрес:
    wb-mcu-fw-updater update-bl /dev/ttyRS485-1 -a1
    

Утилита считает модель устройства, проверит наличие обновления прошивки загрузчика, скачает обновление и зашьёт его в устройство.

Обновление загрузчика всех устройств

Начиная с версии 1.10.8 утилита wb-mcu-fw-updater умеет в режиме обновление прошивок устройств проверять и версии загрузчика, а потом обновлять его:

  1. Подключитесь к контроллеру по SSH.
  2. Запустите команду:
    wb-mcu-fw-updater update-bl /dev/ttyRS485-1 -a1
    
  3. Если есть новые версии загрузчика для устройств, утилита запросит подтверждение на обновление загрузчика, нужно ответить y. Если откажетесь, прошивка обновиться, но загрузчик останется старым.

Пример:

# wb-mcu-fw-updater update-all
2024-04-03 07:17:24,061 Will probe all devices on enabled serial ports of /etc/wb-mqtt-serial.conf:
2024-04-03 07:17:24,063 Probing WB-MAP6S fw2 (port: /dev/ttyRS485-1, slaveid: 26, uart_params: 9600N2, response_timeout: 0.50)...
2024-04-03 07:17:26,460 Update: 2.8.0-rc1 -> 2.8.1 (WB-MAP6S fw2 (26, /dev/ttyRS485-1))
2024-04-03 07:17:27,128 Flashing firmware to WB-MAP6S fw2 (26, /dev/ttyRS485-1)
2024-04-03 07:17:28,073 
2024-04-03 07:17:28,073 Bootloader update (v1.3.0 -> v1.4.1) for map6semG16 /dev/ttyRS485-1:26 is available! (bootloader updates are highly recommended to install) Do a bootloader update? [Y/N]

С компьютера и других устройств

Установка утилиты

Если у вас нет контроллера Wiren Board или на нём нет интернета, можно обновить загрузчик в ручном режиме утилитой wb-mcu-fw-flasher, которую надо установить по инструкции.

Чтение сигнатуры

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

Сделать это можно прочитав 12 holding регистров с адреса 290, например, с помощью modbus_client:

echo -e $(modbus_client -mrtu -pnone -s2 /dev/ttyRS485-1 -a1 -t0x03 -r290 -c12 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

В результате на экран будет выведена строка вида mwac0 — это и есть сигнатура.

Скачивание файлов

Чтобы скачать файл с загрузчиком, перейдите по адресу https://fw-releases.wirenboard.com/?prefix=bootloader/by-signature/ ,выберите папку с полученной выше сигнатурой, далее раздел main и скачайте файл latest.wbfw.

Чтобы скачать прошивку, перейдите по адресу https://fw-releases.wirenboard.com/?prefix=fw/by-signature/. ,выберите папку с полученной выше сигнатурой, далее раздел main и скачайте файл latest.wbfw. Если вам необходима конкретная версия прошивки, можно скачать именно её.

Прошивка

Теперь, когда файлы обновления загрузчика и прошивки скачаны, их надо зашить в устройство:

  1. Запустите обновление загрузчика, замените порт /dev/ttyRS485-1, скорость -b, адрес -a и имя файла на свои:
    wb-mcu-fw-flasher -d /dev/ttyRS485-1 -b9600 -a1 -f wb-bootloader-updater_mwac0__1.4.1_master_e676613.wbfw -j
    
    утилита сотрёт прошивку и зашьёт новый загрузчик.
  2. Запустите обновление прошивки, замените порт /dev/ttyRS485-1, скорость -b, адрес -a и имя файла на свои:
    wb-mcu-fw-flasher -d /dev/ttyRS485-1 -b9600 -a1 -f mwac0__1.21.1_main_ac00010.wbfw
    
    так как устройство со стёртой прошивкой находится в загрузчике, то в команде выше нет ключа -j.

Более подробно про ручное обновление прошивки читайте в статье Обновление прошивки Modbus-устройств Wiren Board

Известные ошибки

Список известных неисправностей

Автоматическое обновление прошивки с контроллера Wiren Board

Прошивку устройств, подключенных к контроллеру Wiren Board можно обновить с помощью утилиты wb-mcu-fw-updater. Утилита проверяет наличие новой версии прошивки для всех подключенных устройств и, при необходимости, обновляет их.

Для установки выполните в консоли:

dpkg -s wb-mcu-fw-updater || (apt update && apt install wb-mcu-fw-updater)

Утилита автоматически останавливает сервис wb-mqtt-serial перед началом работы и запускает заново после. Если вместо wb-mqtt-serial используется стороннее ПО, опрашивающее устройства по последовательному порту — остановите это ПО.

Для обновления прошивки всех устройств, описанных в разделе Serial Devices Configuration (файл /etc/wb-mqtt-serial.conf), выполните:

wb-mcu-fw-updater update-all

Для обновления прошивки конкретного устройства, укажите порт и его адрес Modbus:

wb-mcu-fw-updater update-fw /dev/ttyRS485-2 -a70

Подробную информацию смотрите в выводе

wb-mcu-fw-updater --help

Ручная прошивка устройств

Выбор прошивки

Прошивки публикуются на сайте fw-releases.wirenboard.com в виде файлов с расширением .wbfw.

Прошивки сгруппированы по версиям и сигнатурам (типам) устройств.

Каждое Modbus устройство Wiren Board имеет сигнатуру — наименование аппаратного типа устройства. Перезапись прошивки возможна только при совпадении сигнатур устройства и прошивки.

Сигнатура устройства хранится в формате строки из 12 ASCII символов, по одному символу в регистре, и доступна по адресу 290. Получить можно командой:

echo -e $(modbus_client -mrtu -pnone -s2 '''/dev/ttyRS485-1''' -a '''A''' -t3 -r 290 -c 12 | grep Data | sed -e 's/.*Data://' -e 's/ 0x00/\\x/g')

замените значения /dev/ttyRS485-1 на имя устройства шины и A на адрес устройства.

В результате будет выведена строка с сигнатурой, например mr6c

Прошивку вы можете скачать например с помощью команды wget, для mr6c это будет выглядеть следующим образом:

wget http://fw-releases.wirenboard.com/fw/by-signature/mr6c/stable/latest.wbfw

Подключение устройства

Прошивать устройство лучше по стандартному адресу (на который устройство отвечает из основной программы).

Так же можно прошивать по широковещательному адресу «0», если у вас одно устройство на шине в режиме загрузчика.

Поэтому для прошивки нескольких устройств на шине можно:

  1. переводить в режим загрузчика (перезагрузкой по питанию или записью в регистр) и прошивать по отдельности с указанием нешироковещательного Modbus-адреса.
  2. переводить по очереди в режим загрузчика (перезагрузкой по питанию) и прошивать по адресу 0.
  • Одновременная прошивка устройств невозможна — имеющаяся прошивка на устройствах будет испорчена.
  • Перевести устройство в бутлоадер по широковещательному адресу 0 — нельзя!
  • При прошивке с контроллера остановите wb-mqtt-serial:
    service wb-mqtt-serial stop
  • Если вместо wb-mqtt-serial используется стороннее ПО, опрашивающее устройства по последовательному порту - остановите это стороннее ПО

Утилита wb-mcu-fw-flasher для прошивки устройств

Для установки утилиты на контроллер Wiren Board выполните команды:

apt-get update
apt-get install wb-mcu-fw-flasher

Версия утилиты для MS Windows: Wb-mcu-fw-flasher_1.0.3.zip

Для установки на компьютер с Debian скачайте пакет — Wb-mcu-fw-flasher_1.0.3_amd64-all.deb и выполните команды в директории, куда загрузился пакет:

apt-get update
apt-get install libmodbus5
dpkg -i Wb-mcu-fw-flasher_1.0.3_amd64-all.deb

Для контроллеров других производителей с процессорами ARM Cortex можно воспользоваться Debian-пакетом для Wiren Board: http://releases.contactless.ru/?prefix=stable/stretch/pool/main/w/wb-mcu-fw-flasher/

Опции запуска утилиты wb-mcu-fw-flasher:

Параметр Описание Значение по умолчанию
-d Устройство последовательного порта (обязательно)
-f Файл прошивки
-a Адрес Modbus 1
-j Отправить на устройство команду перехода в режим загрузчика
-b Скорость порта (baudrate) 9600
-p Чётность (parity) N
-s Количество стопбитов 2
-r Адрес holding-регистра для перехода в режим загрузчика 129
-D Включить режим отладки
-u Восстановление заводских настроек UART и Modbus адреса
-e Сброс всех настроек до заводских

Пример (устройство в рабочем режиме):

wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw

Пример для Windows (устройство в рабочем режиме):

wb-mcu-fw-flasher.exe -j -d COM10 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw

Здесь COM10 — имя виртуального последовательного порта, которое присвоено адаптеру USB RS-485.

Пример для устройства с нестандартными настройками UART (со скоростью порта 115200):

wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f WB-MR-MR6C_MCU3_3_1.9.4.wbfw -b 115200

Прошивка устройств

Итого, порядок действий:

  1. При прошивке с контроллера остановите wb-mqtt-serial.
  2. Подключите устройство к RS-485.
  3. Скачайте файл прошивки, например, mr6c__1.14.1_master_19c9ca5.wbfw
  4. Прошейте устройство утилитой wb-mcu-fw-flasher:
    wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 25 -f mr6c__1.14.1_master_19c9ca5.wbfw
  5. После успешной прошивки устройство само выйдет из режима загрузчика и перезапустится в основной программе.

Успешный процесс прошивки выглядит так:

   wb-mcu-fw-flasher -j -d /dev/ttyRS485-1 -a 1 -f mr6c__1.14.1_master_19c9ca5.wbfw    
   /dev/ttyRS485-1 opened successfully.
   Send jump to bootloader command and wait 2 seconds...
   Error: Connection timed out.
   May be device already in bootloader, try to send firmware...
   mr6c__1.14.1_master_19c9ca5.wbfw opened successfully, size 12136 bytes
   Sending info block... OK
   Sending data block 89 of 89... OK.
   All done!

Пример ошибки при несовпадении сигнатуры:

   Sending info block...
   Error while sending info block: Slave device or server failure 
   Data format is invalid or firmware signature doesn't match the device