From: Paul R Date: Mon, 22 Mar 2021 12:19:25 +0000 (+0000) Subject: Explicitly cast FetchNextCommandByte to u32 to ensure correct handling X-Git-Url: http://git.linex4red.de/pub/lufa.git/commitdiff_plain/3cc3335a60798721c98b780082e7b2edfe9864c5?hp=--cc Explicitly cast FetchNextCommandByte to u32 to ensure correct handling Without the explicit cast, avr-gcc generates incorrect asm which sets only the lower bytes of the u32, leading the upper bytes to be set to 0xFFFF when the input value has MSB set. This results in flashing past 32k bytes failing. Explicit casting corrects this behaviour in testing. --- 3cc3335a60798721c98b780082e7b2edfe9864c5 diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index 2c8748adf..6a0740a40 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -475,8 +475,8 @@ static void CDC_Task(void) else if (Command == AVR109_COMMAND_SetCurrentAddress) { /* Set the current address to that given by the host (translate 16-bit word address to byte address) */ - CurrAddress = (FetchNextCommandByte() << 9); - CurrAddress |= (FetchNextCommandByte() << 1); + CurrAddress = ((uint32_t)FetchNextCommandByte() << 9); + CurrAddress |= ((uint32_t)FetchNextCommandByte() << 1); /* Send confirmation byte back to the host */ WriteNextResponseByte('\r');