Software APIs
spi_host_macronix128Mb_flash_test.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 #include <assert.h>
5 
6 #include "dt/dt_api.h" // Generated
15 #include "sw/device/lib/testing/spi_device_testutils.h"
16 #include "sw/device/lib/testing/spi_flash_testutils.h"
17 #include "sw/device/lib/testing/spi_host_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
20 #include "sw/device/tests/spi_host_flash_test_impl.h"
21 
23 
24 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
25  "This test assumes the target platform is little endian.");
26 
27 OTTF_DEFINE_TEST_CONFIG();
28 
29 static void init_test(dif_spi_host_t *spi_host) {
30  dif_pinmux_t pinmux;
32  CHECK_DIF_OK(dif_pinmux_init(addr, &pinmux));
33 
34  spi_pinmux_platform_id_t platform_id = kSpiPinmuxPlatformIdCount;
35  switch (kDeviceType) {
36  case kDeviceSilicon:
37  platform_id = kSpiPinmuxPlatformIdTeacup;
38  break;
39  case kDeviceFpgaCw310:
40  platform_id = kSpiPinmuxPlatformIdCw310;
41  break;
42  case kDeviceFpgaCw340:
43  platform_id = kSpiPinmuxPlatformIdCw340;
44  break;
45  default:
46  CHECK(false, "Device not supported %u", kDeviceType);
47  break;
48  }
49  dt_pad_t csb_pad = kDtPadIoc9;
50  CHECK_STATUS_OK(
51  spi_host1_pinmux_connect_to_bob(&pinmux, csb_pad, platform_id));
52 
54  CHECK_DIF_OK(dif_spi_host_init(addr, spi_host));
55 
56  CHECK(kClockFreqUsbHz <= UINT32_MAX, "kClockFreqUsbHz must fit in uint32_t");
57 
58  CHECK_DIF_OK(dif_spi_host_configure(
59  spi_host,
61  .spi_clock = 1000000,
62  .peripheral_clock_freq_hz = (uint32_t)kClockFreqUsbHz,
63  }),
64  "SPI_HOST config failed!");
65 
66  CHECK_DIF_OK(dif_spi_host_output_set_enabled(spi_host, true));
67 }
68 
69 bool test_main(void) {
70  dif_spi_host_t spi_host;
71 
72  init_test(&spi_host);
73  enum MacronixVendorSpecific {
74  kManufacturerId = 0xC2,
75  kPageQuadProgramOpcode = 0x38,
76  };
77 
78  status_t result = OK_STATUS();
79  EXECUTE_TEST(result, test_software_reset, &spi_host);
80  EXECUTE_TEST(result, test_read_sfdp, &spi_host);
81  EXECUTE_TEST(result, test_sector_erase, &spi_host);
82  EXECUTE_TEST(result, test_read_jedec, &spi_host, kManufacturerId);
83  EXECUTE_TEST(result, test_enable_quad_mode, &spi_host);
84  EXECUTE_TEST(result, test_page_program, &spi_host);
85  if (is_4_bytes_address_mode_supported()) {
86  EXECUTE_TEST(result, test_4bytes_address, &spi_host);
87  }
88  EXECUTE_TEST(result, test_fast_read, &spi_host);
89  EXECUTE_TEST(result, test_dual_read, &spi_host);
90  EXECUTE_TEST(result, test_quad_read, &spi_host);
91  // The Macronix flash `4PP` opcode operates in 1-4-4 mode.
92  EXECUTE_TEST(result, test_page_program_quad, &spi_host,
93  kPageQuadProgramOpcode, kTransactionWidthMode144);
94  EXECUTE_TEST(result, test_erase_32k_block, &spi_host);
95  EXECUTE_TEST(result, test_erase_64k_block, &spi_host);
96 
97  return status_ok(result);
98 }