FreeCalypso > hg > fc-sim-sniff
view sw/sniff-rx/initflush.c @ 55:5268246520de
simsniff-dec: decode command opcodes
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 04 Oct 2023 00:20:05 +0000 |
parents | b112c2df6c43 |
children |
line wrap: on
line source
/* * FTDI chip+driver combo (specifically the combination of FTDI chips and * ftdi_sio driver in Linux, not sure who is the actual culprit) exhibits * this unpleasant behaviour: even though we request "please flush all * previous input" when we set our termios params, old accumulated serial * Rx bytes still remain in some buffer somewhere, and a newly started * serial application receives this stale garbage. As a workaround, * we do an additional flush of our own: we put the fd in non-blocking mode * and keep reading and discarding data until we get EAGAIN or EWOULDBLOCK. */ #include <sys/types.h> #include <sys/errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> extern int target_fd; void init_serial_flush() { u_char buf[512]; int cc; set_serial_nonblock(1); for (;;) { cc = read(target_fd, buf, sizeof buf); if (cc <= 0) break; } if (cc == 0) { fprintf(stderr, "read EOF from serial port during initial flush\n"); exit(1); } if (errno == EAGAIN || errno == EWOULDBLOCK) return; /* success */ perror("serial port read"); exit(1); }