14 #include "sw/device/lib/testing/spi_device_testutils.h"
15 #include "sw/device/lib/testing/spi_flash_testutils.h"
16 #include "sw/device/lib/testing/test_framework/check.h"
20 #define MODULE_ID MAKE_MODULE_ID('s', 'h', 'f')
24 static const char kGettysburgPrelude[256] =
25 "Four score and seven years ago our fathers brought forth on this "
26 "continent, a new nation, conceived in Liberty, and dedicated to the "
27 "proposition that all men are created equal.";
43 status_t test_software_reset(dif_spi_host_t *spi) {
47 .opcode = {.opcode = kSpiDeviceFlashOpResetEnable,
55 status_t test_read_sfdp(dif_spi_host_t *spi) {
56 TRY(spi_flash_testutils_read_sfdp(spi, 0,
sfdp.data,
sizeof(
sfdp.data)));
57 LOG_INFO(
"SFDP signature is 0x%08x",
sfdp.header.signature);
58 CHECK(
sfdp.header.signature == kSfdpSignature,
59 "Expected to find the SFDP signature!");
61 uint32_t bfpt_offset = (uint32_t)
sfdp.param.table_pointer[0] |
62 (uint32_t)(
sfdp.param.table_pointer[1] << 8) |
63 (uint32_t)(
sfdp.param.table_pointer[2] << 16);
64 sfdp.bfpt = (uint32_t *)(
sfdp.data + bfpt_offset);
68 status_t test_read_jedec(dif_spi_host_t *spi, uint8_t manufacture_id) {
70 TRY(spi_flash_testutils_read_id(spi, &jdec));
71 TRY_CHECK(jdec.manufacturer_id == manufacture_id,
"Expected %x, got %x!",
72 manufacture_id, jdec.manufacturer_id);
76 status_t test_sector_erase(dif_spi_host_t *spi) {
77 TRY(spi_flash_testutils_erase_sector(spi, 0,
false));
80 uint8_t buf[256] = {0};
81 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
87 uint8_t expected[256];
88 memset(expected, 0xFF,
sizeof(expected));
89 TRY_CHECK_ARRAYS_EQ(buf, expected,
ARRAYSIZE(expected));
93 status_t test_enable_quad_mode(dif_spi_host_t *spi) {
94 if (
sfdp.param.length < 14) {
95 return INVALID_ARGUMENT();
99 LOG_INFO(
"Setting the EEPROM's QE bit via mechanism %d", mech);
100 TRY(spi_flash_testutils_quad_enable(spi, mech,
true));
105 status_t test_page_program(dif_spi_host_t *spi) {
106 TRY(spi_flash_testutils_program_page(spi, kGettysburgPrelude,
107 sizeof(kGettysburgPrelude),
111 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
116 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
121 dif_spi_host_t *spi, uint8_t opcode,
122 spi_flash_testutils_transaction_width_mode_t page_program_mode) {
123 enum { kPageSize = 256, kAddress = kPageSize * 10 };
125 TRY(spi_flash_testutils_erase_sector(spi, kAddress,
false));
127 TRY(spi_flash_testutils_program_op(
128 spi, opcode, kGettysburgPrelude,
sizeof(kGettysburgPrelude),
129 kAddress,
false, page_program_mode));
132 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
133 sizeof(buf), kAddress,
137 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
142 status_t test_fast_read(dif_spi_host_t *spi) {
144 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadFast, buf,
149 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
154 status_t test_dual_read(dif_spi_host_t *spi) {
156 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadDual, buf,
161 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
166 status_t test_quad_read(dif_spi_host_t *spi) {
168 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadQuad, buf,
173 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
177 bool is_4_bytes_address_mode_supported(
void) {
178 enum { kSupportOnly3Bytes, kSupport3and4Bytes, kSupportOnly4Bytes };
179 uint32_t address_mode =
181 return (address_mode == kSupport3and4Bytes ||
182 address_mode == kSupportOnly4Bytes);
185 status_t test_4bytes_address(dif_spi_host_t *spi) {
186 enum { kAddress = 0x01000100, kSectorSize = 4096 };
187 static_assert(kAddress % kSectorSize,
188 "Should be at the beginning of the sector.");
190 TRY(spi_flash_testutils_enter_4byte_address_mode(spi));
191 TRY(spi_flash_testutils_erase_sector(spi, kAddress,
true));
193 TRY(spi_flash_testutils_program_page(spi, kGettysburgPrelude,
194 sizeof(kGettysburgPrelude), kAddress,
198 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
199 sizeof(buf), kAddress,
203 TRY_CHECK_ARRAYS_EQ(buf, kGettysburgPrelude,
ARRAYSIZE(kGettysburgPrelude));
204 return spi_flash_testutils_exit_4byte_address_mode(spi);
207 status_t test_erase_32k_block(dif_spi_host_t *spi) {
208 enum { kPageSize = 256, kBlockSize = 32 * 1024, kAddress = kBlockSize * 3 };
209 TRY(spi_flash_testutils_erase_block32k(spi, kAddress,
false));
211 uint8_t expected[256];
212 memset(expected, 0xFF,
sizeof(expected));
214 memset(dummy, 0x5A,
sizeof(dummy));
216 for (
size_t addr = kAddress; addr < kAddress + kBlockSize;
218 uint8_t buf[256] = {0};
220 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
226 TRY_CHECK_ARRAYS_EQ(buf, expected,
ARRAYSIZE(expected));
230 TRY(spi_flash_testutils_program_page(spi, dummy,
sizeof(dummy),
238 status_t test_erase_64k_block(dif_spi_host_t *spi) {
239 enum { kPageSize = 256, kBlockSize = 64 * 1024, kAddress = kBlockSize * 5 };
240 TRY(spi_flash_testutils_erase_block64k(spi, kAddress,
false));
242 uint8_t expected[256];
243 memset(expected, 0xFF,
sizeof(expected));
245 memset(dummy, 0x5A,
sizeof(dummy));
247 for (
size_t addr = kAddress; addr < kAddress + kBlockSize;
249 uint8_t buf[256] = {0};
251 TRY(spi_flash_testutils_read_op(spi, kSpiDeviceFlashOpReadNormal, buf,
257 TRY_CHECK_ARRAYS_EQ(buf, expected,
ARRAYSIZE(expected));
261 TRY(spi_flash_testutils_program_page(spi, dummy,
sizeof(dummy),