1. 程式人生 > >target裝置主動通訊遇到linux串列埠預設模式的尷尬

target裝置主動通訊遇到linux串列埠預設模式的尷尬

issue:sahara fail,場景linux系統第一次開機時,切到9008下載口

高通提供了一種升級方式是firehose,它工作在9008口,firehose的執行程式需要由sahara寫入pbl。

firehose可以很好的工作在windows端,模組系統接入android,會生成/dev/ttyUSB0等裝置節點,Android系統第一次啟動切到9008口;

從sahara讀到的hello包不正確;

sahara是一種裝置主動向host握手的通訊狀態機;但是linux的usb_serial驅動預設的工作方式為標準方式(還有一種raw方式),類似如下(不同系統可能有改動):

struct termios tty_std_termios = {
.c_iflag = ICRNL | IXON,
.c_oflag = OPOST | ONLCR,
.c_cflag = B38400 | CS8 | CREAD | HUPCL,
.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE | IEXTEN,
.c_cc = INIT_C_CC
};

可以看到c_lflag有一個ECHO屬性,這個表示回顯(理解為console上的輸入不光可以被後臺處理,還會顯示在console上);

sahara的主動握手和ECHO屬性發生化學反應,導致open後未設定attr前,host和device由device的一條hello開始越行越遠的溝通,最後把device的狀態機破壞。

01 00 00 00 20 00 00 00 03 00 00 00 00 04 00 00->01 00 00 00 20 00 00 00 03 00 00 00 00 00 00 00...;04不見了,因為VEOF就是04,這種情況資料送到緩衝(tty的讀buffer)不包括VEOF。