Отправка файла через последовательный порт с использованием ожидаемого и ymodem на Linux? - PullRequest
0 голосов
/ 14 сентября 2018

Цикл командной строки ATF (arm trust firmware, BL1, BL2) поддерживает протокол ymodem.В Windows я использую TeraTerm и могу использовать его меню для ручной отправки файлов на устройство, используя протокол ymodem, после ввода команды ymodem <address> и просмотра символа C:

NOTICE:  Booting Trusted Firmware
NOTICE:  BL1: v1.4(release):58e7395
NOTICE:  BL1: Built : 17:39:25, Jan  2 2018
# ymodem 0x45103000
NOTICE:  ## Ready for binary (ymodem) download to 0x451030000 at 115200 bps...
C

Tera Termтакже поддержка макросов для автоматизации процесса, который работает нормально.Теперь я хочу использовать screen + expect + sz под Linux, чтобы сделать то же самое ... Но пока я не добился успеха.

В настоящее время я тестирую со следующим кодом:

 85 spawn screen /dev/ttyUSB0 115200
 86 set screen $spawn_id
 93 send "ymodem 0x45103000\r"
 94 set timeout 3
 95 expect {
 96         timeout {
 97                 puts "timeout..."
 98                 exit 1
 99         }
100         "115200 bps...\r\nC"
101 }
102 #stty -echo raw
103 spawn sz --ymodem $bl2_burn_path
104 interact -u $screen
105 expect "Bytes"    # can expect see this? 
106 stty echo -raw
107
108 send "\r\r\r"
109 send "exit\r"

Кажется sz повторная отправка файла, но нет обратной связи с удаленной стороны:

expect: does "ymodem 0x45103000\r\n\u001b)0\u001b[?1049h\u001b[4l\u001b[?1h\u001b=\u001b[0m\u001b(B\u001b[1;24r\u001b[H\u001b[J\u001b[H\u001b[Jymodem 0x45103000\r\nNOTICE:  ## Ready for binary (ymodem) download to 0x45103000 at 115200 bps...\r\nC" (spawn_id exp7) match glob pattern "115200 bps...\r\nC"? yes
expect: set expect_out(0,string) "115200 bps...\r\nC"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "ymodem 0x45103000\r\n\u001b)0\u001b[?1049h\u001b[4l\u001b[?1h\u001b=\u001b[0m\u001b(B\u001b[1;24r\u001b[H\u001b[J\u001b[H\u001b[Jymodem 0x45103000\r\nNOTICE:  ## Ready for binary (ymodem) download to 0x45103000 at 115200 bps...\r\nC"
spawn sz --ymodem /home/bruin/work/f5/bsp/bl2-burn.bin
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {31117}
spawn id exp7 sent <C>
spawn id exp8 sent <\u0001\u0000\u00ffbl2-burn.bin\u000045352 13335245531 100700 0 1 45352\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001c\u0013\u00a4>

spawn id exp8 sent <\u0001\u0000\u00ffbl2-burn.bin\u000045352 13335245531 100700 0 1 45352\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001c\u0013\u00a4>

Чего не хватает в приведенном выше сценарии?

У меня есть еще один вопрос о том, как определить, что передача файла завершена.Обычно (в Windows, как я заметил), после завершения передачи файла, среди прочего, ATF напечатает размер передаваемых данных, например 45123 Bytes.Как expect смотреть это сообщение сейчас?Насколько я понимаю, эти два порожденных процесса (screen и sz) говорят напрямую, минуя expect, нет?

1 Ответ

0 голосов
/ 15 сентября 2018

Вы не должны делать секунду spawn, чтобы запустить sz.Вы запустили screen для использования устройства tty, поэтому теперь вы должны попросить его запустить для вас sz, подключив любой вывод этой команды к tty и передав любой вывод из tty в качестве входных данных для этой команды.Вы делаете это, отправляя команду exec процессу screen, а затем команду sz для выполнения.Вам также необходимо добавить 2 индикатора !!, чтобы соединить стандартный вывод и стандартный вывод команды с tty.И вам нужно отправить обычный префикс control-a : и двоеточие, чтобы экран принял ваш ввод в качестве команды.

Поэтому замените строку spawn sz --ymodem $bl2_burn_path на что-то вроде

send "\001:exec !! spawn sz --ymodem $bl2_burn_path\r"
...