From 127543a42515d1fbd572b073789dcb3827abbd35 Mon Sep 17 00:00:00 2001 From: Michael Stoops <3201502+michaelstoops@users.noreply.github.com> Date: Tue, 13 Apr 2021 15:06:14 -0700 Subject: [PATCH] Fixing arithmetic underflow in SPI I/O loops https://github.com/raspberrypi/pico-sdk/issues/337 (#338) Co-authored-by: Michael Stoops --- src/rp2_common/hardware_spi/spi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rp2_common/hardware_spi/spi.c b/src/rp2_common/hardware_spi/spi.c index 175d199..bc59845 100644 --- a/src/rp2_common/hardware_spi/spi.c +++ b/src/rp2_common/hardware_spi/spi.c @@ -76,7 +76,7 @@ int __not_in_flash_func(spi_write_read_blocking)(spi_inst_t *spi, const uint8_t size_t rx_remaining = len, tx_remaining = len; while (rx_remaining || tx_remaining) { - if (tx_remaining && spi_is_writable(spi) && rx_remaining - tx_remaining < fifo_depth) { + if (tx_remaining && spi_is_writable(spi) && rx_remaining < tx_remaining + fifo_depth) { spi_get_hw(spi)->dr = (uint32_t) *src++; --tx_remaining; } @@ -125,7 +125,7 @@ int __not_in_flash_func(spi_read_blocking)(spi_inst_t *spi, uint8_t repeated_tx_ size_t rx_remaining = len, tx_remaining = len; while (rx_remaining || tx_remaining) { - if (tx_remaining && spi_is_writable(spi) && rx_remaining - tx_remaining < fifo_depth) { + if (tx_remaining && spi_is_writable(spi) && rx_remaining < tx_remaining + fifo_depth) { spi_get_hw(spi)->dr = (uint32_t) repeated_tx_data; --tx_remaining; } @@ -147,7 +147,7 @@ int __not_in_flash_func(spi_write16_read16_blocking)(spi_inst_t *spi, const uint size_t rx_remaining = len, tx_remaining = len; while (rx_remaining || tx_remaining) { - if (tx_remaining && spi_is_writable(spi) && rx_remaining - tx_remaining < fifo_depth) { + if (tx_remaining && spi_is_writable(spi) && rx_remaining < tx_remaining + fifo_depth) { spi_get_hw(spi)->dr = (uint32_t) *src++; --tx_remaining; } @@ -192,7 +192,7 @@ int __not_in_flash_func(spi_read16_blocking)(spi_inst_t *spi, uint16_t repeated_ size_t rx_remaining = len, tx_remaining = len; while (rx_remaining || tx_remaining) { - if (tx_remaining && spi_is_writable(spi) && rx_remaining - tx_remaining < fifo_depth) { + if (tx_remaining && spi_is_writable(spi) && rx_remaining < tx_remaining + fifo_depth) { spi_get_hw(spi)->dr = (uint32_t) repeated_tx_data; --tx_remaining; }