diff --git a/fusee/fusee-primary/src/sdmmc.c b/fusee/fusee-primary/src/sdmmc.c index 68ee5df13..cce793cdb 100644 --- a/fusee/fusee-primary/src/sdmmc.c +++ b/fusee/fusee-primary/src/sdmmc.c @@ -1033,9 +1033,27 @@ static int sdmmc_handle_cpu_transfer(struct mmc *mmc, uint16_t blocks, bool is_w // Transfer the data to the relevant if (is_write) { - mmc->regs->buffer = *buffer; + if ((uintptr_t)buffer & 3) { + // Handle unaligned buffers + uint32_t w; + uint8_t *data = (uint8_t *)buffer; + w = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + mmc->regs->buffer = w; + } else { + mmc->regs->buffer = *buffer; + } } else { - *buffer = mmc->regs->buffer; + if ((uintptr_t)buffer & 3) { + // Handle unaligned buffers + uint32_t w = mmc->regs->buffer; + uint8_t *data = (uint8_t *)buffer; + data[0] = w & 0xFF; + data[1] = (w >> 8) & 0xFF; + data[2] = (w >> 16) & 0xFF; + data[3] = (w >> 24) & 0xFF; + } else { + *buffer = mmc->regs->buffer; + } } // Advance by a register size... diff --git a/fusee/fusee-secondary/src/sdmmc.c b/fusee/fusee-secondary/src/sdmmc.c index 68ee5df13..cce793cdb 100644 --- a/fusee/fusee-secondary/src/sdmmc.c +++ b/fusee/fusee-secondary/src/sdmmc.c @@ -1033,9 +1033,27 @@ static int sdmmc_handle_cpu_transfer(struct mmc *mmc, uint16_t blocks, bool is_w // Transfer the data to the relevant if (is_write) { - mmc->regs->buffer = *buffer; + if ((uintptr_t)buffer & 3) { + // Handle unaligned buffers + uint32_t w; + uint8_t *data = (uint8_t *)buffer; + w = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + mmc->regs->buffer = w; + } else { + mmc->regs->buffer = *buffer; + } } else { - *buffer = mmc->regs->buffer; + if ((uintptr_t)buffer & 3) { + // Handle unaligned buffers + uint32_t w = mmc->regs->buffer; + uint8_t *data = (uint8_t *)buffer; + data[0] = w & 0xFF; + data[1] = (w >> 8) & 0xFF; + data[2] = (w >> 16) & 0xFF; + data[3] = (w >> 24) & 0xFF; + } else { + *buffer = mmc->regs->buffer; + } } // Advance by a register size...