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。

猜你喜欢

转载自www.cnblogs.com/green-crosswalk/p/10236024.html