
On Tue, May 17, 2022 at 01:55:07PM -0400, Sean Anderson wrote:
ARM semihosting provides no provisions for determining if there is pending input. The only way to determine if there is console input is to do a read (and block until the user types something). For this reason, we always return true for tstc (since you will always get input if you try). However, this behavior can cause problems for code which expects tstc to eventually be empty. In query_console_serial, there is the following construct:
/* empty input buffer */ while (tstc()) getchar();
with the current implementation, this effectively turns into an infinite loop. To avoid this, fake tstc by returning false half of the time. This is generally OK because the other common construct looks like
do { if (tstc()) process(getchar()); } while (!timeout());
so it's fine if we only read a new character every other loop. This will break things like CYGACC_COMM_IF_GETC_TIMEOUT, but that could be reworked to test on the timeout instead of calling tstc again (and ymodem over semihosted serial is not that useful in the first place).
Signed-off-by: Sean Anderson sean.anderson@seco.com
Applied to u-boot/next, thanks!