Skip to content

Commit 3816090

Browse files
raylau1martin-velay
authored andcommitted
[sw] Fix SPI device SyncReqAckDataHoldSrc2Dst assertion failure
This fixes the address mode pending mask, and ensures the smoke test does not change the address mode multiple times without waiting for the pending bit to clear. This commit also adds blocking and non-blocking variants of function to set the address mode. The spi_device_init function uses the non-blocking variant to prevent spi_device_init from blocking forever in environments where there is no active SPI clock to clear the pending bit.
1 parent 166a3f8 commit 3816090

3 files changed

Lines changed: 10 additions & 14 deletions

File tree

sw/device/lib/hal/spi_device.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,12 @@ void spi_device_enable_set(spi_device_t spi_device, bool enable)
5656
DEV_WRITE(spi_device + SPI_DEVICE_CTRL_REG, enable << SPI_DEVICE_CTRL_MODE_OFFSET);
5757
}
5858

59-
void spi_device_4b_addr_mode_enable_set(spi_device_t spi_device, bool enable)
59+
void spi_device_4b_addr_mode_enable_set_non_blocking(spi_device_t spi_device, bool enable)
60+
{
61+
DEV_WRITE(spi_device + SPI_DEVICE_ADDR_MODE_REG, (uint32_t)enable);
62+
}
63+
64+
void spi_device_4b_addr_mode_enable_set_blocking(spi_device_t spi_device, bool enable)
6065
{
6166
DEV_WRITE(spi_device + SPI_DEVICE_ADDR_MODE_REG, (uint32_t)enable);
6267

@@ -574,7 +579,7 @@ void spi_device_sfdp_table_init(spi_device_t spi_device)
574579

575580
void spi_device_init(spi_device_t spi_device)
576581
{
577-
spi_device_4b_addr_mode_enable_set(spi_device, true);
582+
spi_device_4b_addr_mode_enable_set_non_blocking(spi_device, true);
578583
spi_device_jedec_cc_set(spi_device, MOCHA_SPI_DEVICE_JEDEC_CC, MOCHA_SPI_DEVICE_JEDEC_CC_COUNT);
579584
spi_device_jedec_id_set(spi_device, MOCHA_SPI_DEVICE_ROM_BOOTSTRAP, MOCHA_SPI_DEVICE_CHIP_REV,
580585
MOCHA_SPI_DEVICE_CHIP_GEN, MOCHA_SPI_DEVICE_DENSITY_BYTES_LOG2,

sw/device/lib/hal/spi_device.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
#define SPI_DEVICE_ADDR_MODE_REG (0x20)
2929
#define SPI_DEVICE_ADDR_MODE_4B_EN_MASK (0x1)
30-
#define SPI_DEVICE_ADDR_MODE_PENDING_MASK (0x70000000)
30+
#define SPI_DEVICE_ADDR_MODE_PENDING_MASK (0x80000000)
3131

3232
#define SPI_DEVICE_FLASH_STATUS_REG (0x28)
3333
#define SPI_DEVICE_FLASH_STATUS_BUSY_MASK (0x1)
@@ -177,7 +177,8 @@ void spi_device_interrupt_enable(spi_device_t spi_device, uint8_t intr_id);
177177
void spi_device_interrupt_disable(spi_device_t spi_device, uint8_t intr_id);
178178
void spi_device_interrupt_trigger(spi_device_t spi_device, uint8_t intr_id);
179179
void spi_device_enable_set(spi_device_t spi_device, bool enable);
180-
void spi_device_4b_addr_mode_enable_set(spi_device_t spi_device, bool enable);
180+
void spi_device_4b_addr_mode_enable_set_non_blocking(spi_device_t spi_device, bool enable);
181+
void spi_device_4b_addr_mode_enable_set_blocking(spi_device_t spi_device, bool enable);
181182
bool spi_device_4b_addr_mode_enable_get(spi_device_t spi_device);
182183
void spi_device_flash_status_set(spi_device_t spi_device, uint32_t flash_status);
183184
uint32_t spi_device_flash_status_get(spi_device_t spi_device);

sw/device/tests/spi_device/smoketest.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,6 @@ bool cmd_info_readback_test(spi_device_t spi_device, uint32_t offset)
4848

4949
bool reg_test(spi_device_t spi_device)
5050
{
51-
spi_device_4b_addr_mode_enable_set(spi_device, true);
52-
if (!spi_device_4b_addr_mode_enable_get(spi_device)) {
53-
return false;
54-
}
55-
56-
spi_device_4b_addr_mode_enable_set(spi_device, false);
57-
if (spi_device_4b_addr_mode_enable_get(spi_device)) {
58-
return false;
59-
}
60-
6151
spi_device_jedec_cc_set(spi_device, 0xE1, 0x45);
6252
if ((spi_device_jedec_cc_get(spi_device) & 0xFFFF) != 0x45E1) {
6353
return false;

0 commit comments

Comments
 (0)