hw/bus/spi_hal: Fix bus_spi_write_read
Function bus_spi_write_read() was calling hal_spi_txrx()
with NULL for txbuf for transactions involving more then 16 bytes.
NULL pointer is not valid for this function.
When code was build with SPI_HAL_USE_NOBLOCK enabled, zeroed receive buffer
was already used as argument for transmit buffer.
Same approach is now used when SPI_HAL_USE_NOBLOCK is not set.
For data reads 0xFF is used for MOSI line just to be consistent.
Some places used 0 some had 0xFF now 0xFF is used as it was
originally.
diff --git a/hw/bus/drivers/spi_hal/src/spi_hal.c b/hw/bus/drivers/spi_hal/src/spi_hal.c
index 1404456..5832fee 100644
--- a/hw/bus/drivers/spi_hal/src/spi_hal.c
+++ b/hw/bus/drivers/spi_hal/src/spi_hal.c
@@ -212,7 +212,7 @@
#if MYNEWT_VAL(SPI_HAL_USE_NOBLOCK)
if (wlength + rlength <= sizeof(buf)) {
memcpy(buf, wbuf, wlength);
- memset(buf + wlength, 0, rlength);
+ memset(buf + wlength, 0xFF, rlength);
rc = hal_spi_txrx_noblock(dev->spi_dev.cfg.spi_num, buf, buf, wlength + rlength);
if (rc == 0) {
os_sem_pend(&dev->sem, OS_TIMEOUT_NEVER);
@@ -222,7 +222,7 @@
rc = hal_spi_txrx_noblock(dev->spi_dev.cfg.spi_num, (uint8_t *)wbuf, NULL, wlength);
if (rc == 0) {
os_sem_pend(&dev->sem, OS_TIMEOUT_NEVER);
- memset(rbuf, 0, rlength);
+ memset(rbuf, 0xFF, rlength);
rc = hal_spi_txrx_noblock(dev->spi_dev.cfg.spi_num, rbuf, rbuf, rlength);
if (rc == 0) {
os_sem_pend(&dev->sem, OS_TIMEOUT_NEVER);
@@ -239,7 +239,8 @@
} else {
rc = hal_spi_txrx(dev->spi_dev.cfg.spi_num, (uint8_t *)wbuf, NULL, wlength);
if (rc == 0) {
- rc = hal_spi_txrx(dev->spi_dev.cfg.spi_num, NULL, rbuf, rlength);
+ memset(rbuf, 0xFF, rlength);
+ rc = hal_spi_txrx(dev->spi_dev.cfg.spi_num, rbuf, rbuf, rlength);
}
}
#endif