1

ATF(arm 可信固件,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 还支持宏来自动化该过程,效果很好。现在我想在Linux下使用screen++expect来做sz同样的事情......但到目前为止我还没有成功。

我目前正在使用以下代码进行测试:

 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看这个消息?我的理解是,这两个衍生进程(screensz)直接对话,绕过expect,不是吗?

4

1 回答 1

0

你不应该做第二次spawn运行sz。您已经启动screen使用 tty 设备,所以现在您必须要求它sz为您运行,将该命令的任何输出连接到 tty,并将 tty 的任何输出作为输入传递回该命令。为此,您可以向进程发送一个exec命令,然后是要执行的命令。您还需要添加 2 个指标来将命令的 stdin 和 stdout 连接到 tty。您需要发送通常的前缀和冒号以使 screen 将您的输入作为命令。 screensz!!control-a :

所以用spawn sz --ymodem $bl2_burn_path类似的东西替换线

send "\001:exec !! spawn sz --ymodem $bl2_burn_path\r"
于 2018-09-15T15:13:18.720 回答