Добрый день всем. В общем, имеется последовательный порт (на ft232), по нему идет обмен. В силу извращений с протоколом, которые сделал вендор необходимо запилить следующий флоу.
отправить пакет установления нового баудрейта получить пакет на новом баудрейте, убедиться что тот цел, то есть это работающий сетап. отправить пакет на старом баудрейте с подтверждением изменения скорости полностью перейти на передачу на новой скорости.
В общем, код, местами кривоватый, ибо постоянно экспериментирую с протоколом разными хаками, тут: https://github.com/nekromant/stcdude
И вот тут начинается самое интересное. Оказывается, write сливает данные в какой-то кеш. И закрытие дескриптора порта приводит к тому, что на логическом анализаторе виден только маленький кусок отправленных данных. fsync, tcdrain тут так же не спасают, ровно как и разные O_SYNC/O_DSYNC при открытии. Если дескриптор не закрывать, а просто поменять скорость, то последняя посылка отправляется частично на новой скорости. Единственный хак который дал рабочий вариант -
char* packet = pack_payload(tmp, len, HOST2MCU);
write(us->fd, packet, PACKED_SIZE(len));
usleep(200000); /* FixMe: Find a better way to flush the data */