Rockchip · AI & Linux Hub

Аппаратные интерфейсы

Rockchip RT-Thread Ymodem: протокол, передача файлов и совместимость

Rockchip RT-Thread Ymodem: протокол, передача файлов и совместимость — V1.0.0

· ArmSoM Editorial · Rockchip source documentation · 5 мин чтения

Полный технический текст китайского RK-KF-YF-076 V1.0.0, стр.6–9. Продукт/версия указаны как общие, без проверки конкретных плат ArmSoM, SoC или BSP. Это справочник RT-Thread, не ядра Linux. Проверьте реальные исходники RT-Thread, UART, уровни напряжения, DFS и прошивку. Английского PDF нет; четыре оригинальных рисунка китайского PDF используются во всех языках, даже если подписи внутри английские. Производительность и совместимость — исторические данные источника, не испытания ArmSoM.

Оговорка редакции: утверждения о системе счисления File_size, повторах при CRC и безвредности 0x1A сохранены, но не распространены на все реализации Ymodem. Особенно для двоичной прошивки проверяйте реализацию, длину и контрольную сумму до и после передачи; заполнение нельзя считать автоматически безвредным. Совместимость и upstream относятся только ко времени источника.

ArmSoM Docs · RT-Thread

1. Принцип работы

Ymodem передаёт файлы через последовательный порт и происходит от Xmodem. Блоки по 128 или 1024 байт образуют пакеты по 133 или 1029 байт. Источник описывает CRC16 и прекращение передачи при ошибке проверки. При разработке Chuck Forsberg предусмотрел варианты размера пакета, проверки и повторной передачи; источник связывает множество разновидностей с необязательностью этих функций. Реализации могут быть несовместимы. RT-Thread ориентирован прежде всего на SecureCRT. Обмен отправителя и получателя состоит из согласования, передачи и завершения.

Обмен отправителя и получателя Ymodem

Обмен отправителя и получателя Ymodem

1.1 Согласование

Получатель периодически посылает C (0x43), здесь раз в 1s. Отправитель отвечает SOH|0x00|0xFF|File_name 00 File_size NULL|CRC16|. SOH (0x01) обозначает блок 128 байт; для 1024 байт используется STX (0x02). 0x00 — номер пакета, 0xFF — его инверсия. File_name задаёт имя принимаемого файла, File_size — выделяемое место хранения. Источник утверждает, что File_size обычно содержит число байт в шестнадцатеричном ASCII, а SecureCRT использует десятичный ASCII. Последние два байта — CRC16. Получатель отвечает ACK (0x06), затем C (0x43), начиная передачу. Если после повторных C пакет не приходит, происходит тайм-аут; здесь допускаются 10 попыток.

1.2 Передача

Отправитель посылает SOH|0x01|0xFE| Data[0~127] |CRC16|; получатель отвечает ACK (0x06), после чего передаётся следующий пакет. По источнику SecureCRT при ошибке пакета не запрашивает повтор через NAK (0x15), а прекращает передачу. В исходном тесте по описанной ниже методике файл более 5M при 115200 бод был передан без ошибок. Последний пакет: SOH|0x??|0x??| Data[0~??] 0x1A |CRC16|. Неполный блок дополняется до 128 байт значением 0x1A, соответствующим Ctrl+Z/концу файла. Источник считает завершающие 0x1A нормальными и не влияющими на использование файла; см. оговорку выше. Отправка CAN (0x18) или Ctrl+C в терминале отменяет передачу.

1.3 Завершение

Отправитель посылает EOT (0x04). Получатель запрашивает подтверждение через NAK (0x15); отправитель повторяет EOT (0x04), а получатель отвечает ACK (0x06), завершая файл. Затем C (0x43) запрашивает следующий файл. Если файлов больше нет, отправляется SOH|0x00|0xFF| NULL |CRC16|, на что получатель отвечает ACK (0x06). Сеанс завершён.

2. Применение

2.1 Настройка Ymodem

Протокол и примеры находятся в /components/utilities/ymodem: ymodem.c и ymodem.h реализуют протокол, ry_sy.c — приём и передачу файлов. Запустите scons --menuconfig и включите Ymodem в Utilities. Другие производители часто применяют его для OTA в RT-Thread без зависимости от DFS. Rockchip использует в основном передачу файлов, поэтому ry_sy.c читает и записывает DFS. Включение передачи файлов активирует команды ry_sy. Необязательный CRC Table заменяет прямой расчёт поиском по таблице. Теоретически это быстрее, но источник не отмечает существенного выигрыша для блоков 128 байт при 115200 бод; отключение экономит память. Соберите и загрузите настроенную прошивку, затем используйте Ymodem через последовательный порт.

RT-Thread Components --->
            Utilities --->
                [*] Enable Ymodem
                    [ ] Enable CRC Table in Ymodem
                    [*] Enable file transfer feature

2.2 Приём файлов

По умолчанию приём использует Console; аргумент выбирает другой UART. Введите ry: Console выводит C в ожидании хоста. В SecureCRT выберите Transfer → Send Ymodem и файл. Приём сопровождается индикацией хода. Для другого устройства используйте, например, ry uart2. На время передачи любой вывод в последовательный порт запрещается.

Исходный пример приёма файла

Исходный пример приёма файла

msh />ry
CCCC
Starting ymodem transfer.  Press Ctrl+C to cancel.
Transferring test.mp3...
  100%    2476 KB       3 KB/sec    00:10:51       0 Errors

По умолчанию файлы сохраняются в корневом каталоге. Измените fpath в _rym_recv_begin файла ry_sy.c для выбора другого пути.

2.3 Передача файлов

Передача также использует Console по умолчанию; аргумент задаёт другой UART. Введите sy file_path и ожидайте хост. В SecureCRT выберите Transfer → Receive Ymodem. Отображается ход передачи. Для uart2 используйте sy file_path uart2. На время передачи любой вывод в последовательный порт запрещается.

Исходный пример отправки файла

Исходный пример отправки файла

msh />sy /test.mp3

Starting ymodem transfer.  Press Ctrl+C to cancel.
Transferring test.mp3...
  100%    2476 KB       3 KB/sec    00:10:52       0 Errors

Используйте абсолютный путь; относительные пути этой версией не поддерживаются. Имя принятого файла содержит весь путь. При необходимости измените _rym_send_begin в ry_sy.c, чтобы разобрать путь и удалить каталоги из имени.

3. Известные проблемы и направления улучшения

На момент выпуска источника протокол и пример приложения уже были включены в основную ветку RT-Thread, что показано на рисунке. Перечислены дальнейшие направления:

  1. Поддержать отправку блоков по 1024 байт.

  2. При 115200 бод скорость держалась около 4kB/s. Повышение до 1.5M и выше приводило к ошибкам передачи.

  3. При 115200 бод теоретический предел составлял 11kB/s, практический — 8kB/s; накладные расходы протокола велики.

  4. Поддержать больше терминальных программ.

Исходный снимок записи слияния RT-Thread

Исходный снимок записи слияния RT-Thread

4. Совместимость по исходному документу

ОС Терминал Приём Передача
Windows SecureCRT Поддерживается Поддерживается
MacOS SecureCRT Не поддерживается Поддерживается
MacOS Minicom Не поддерживается Не поддерживается
Linux Minicom Поддерживается Не поддерживается

Другие статьи по теме → · Учебные маршруты →