Software APIs
spi_host_gigadevice256Mb_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
16 #include "sw/device/lib/testing/spi_device_testutils.h"
17 #include "sw/device/lib/testing/spi_flash_testutils.h"
18 #include "sw/device/lib/testing/spi_host_testutils.h"
19 #include "sw/device/lib/testing/test_framework/check.h"
21 #include "sw/device/tests/spi_host_flash_test_impl.h"
22 
24 
25 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
26  "This test assumes the target platform is little endian.");
27 
28 OTTF_DEFINE_TEST_CONFIG();
29 
30 static void init_test(dif_spi_host_t *spi_host, dt_pad_t csb_pad) {
31  dif_pinmux_t pinmux;
32  mmio_region_t base_addr =
34  CHECK_DIF_OK(dif_pinmux_init(base_addr, &pinmux));
35 
36  spi_pinmux_platform_id_t platform_id = kSpiPinmuxPlatformIdCount;
37  switch (kDeviceType) {
38  case kDeviceSilicon:
39  platform_id = kSpiPinmuxPlatformIdTeacup;
40  break;
41  case kDeviceFpgaCw310:
42  platform_id = kSpiPinmuxPlatformIdCw310;
43  break;
44  case kDeviceFpgaCw340:
45  platform_id = kSpiPinmuxPlatformIdCw340;
46  break;
47  default:
48  CHECK(false, "Device not supported %u", kDeviceType);
49  break;
50  }
51  CHECK_STATUS_OK(
52  spi_host1_pinmux_connect_to_bob(&pinmux, csb_pad, platform_id));
53 
55  CHECK_DIF_OK(dif_spi_host_init(base_addr, spi_host));
56 
57  CHECK(kClockFreqUsbHz <= UINT32_MAX, "kClockFreqUsbHz must fit in uint32_t");
58 
59  CHECK_DIF_OK(dif_spi_host_configure(
60  spi_host,
62  .spi_clock = 1000000,
63  .peripheral_clock_freq_hz = (uint32_t)kClockFreqUsbHz,
64  }),
65  "SPI_HOST config failed!");
66 
67  CHECK_DIF_OK(dif_spi_host_output_set_enabled(spi_host, true));
68 }
69 
70 bool test_main(void) {
71  enum GigadeviceVendorSpecific {
72  kManufacturerId = 0xC8,
73  kPageQuadProgramOpcode = 0x32,
74  };
75 
76  // Chip select pins for the different 256Mb GigaDevice SPI Flashes available
77  // via PMOD
78  dt_pad_t csb_pads[] = {
79  kDtPadIoc11,
80  kDtPadIoa6,
81  };
82 
83  status_t result = OK_STATUS();
84  for (size_t i = 0; i < ARRAYSIZE(csb_pads); ++i) {
85  LOG_INFO("Testing flash device %u", (uint32_t)(i + 1));
86  dif_spi_host_t spi_host;
87 
88  init_test(&spi_host, csb_pads[i]);
89 
90  EXECUTE_TEST(result, test_software_reset, &spi_host);
91  EXECUTE_TEST(result, test_read_sfdp, &spi_host);
92  EXECUTE_TEST(result, test_sector_erase, &spi_host);
93  EXECUTE_TEST(result, test_read_jedec, &spi_host, kManufacturerId);
94  EXECUTE_TEST(result, test_enable_quad_mode, &spi_host);
95  EXECUTE_TEST(result, test_page_program, &spi_host);
96  if (is_4_bytes_address_mode_supported()) {
97  EXECUTE_TEST(result, test_4bytes_address, &spi_host);
98  }
99  EXECUTE_TEST(result, test_fast_read, &spi_host);
100  EXECUTE_TEST(result, test_dual_read, &spi_host);
101  EXECUTE_TEST(result, test_quad_read, &spi_host);
102 
103  // The Gigadevice flash `4PP` opcode operates in 1-1-4 mode.
104  EXECUTE_TEST(result, test_page_program_quad, &spi_host,
105  kPageQuadProgramOpcode, kTransactionWidthMode114);
106  EXECUTE_TEST(result, test_erase_32k_block, &spi_host);
107  EXECUTE_TEST(result, test_erase_64k_block, &spi_host);
108  }
109 
110  return status_ok(result);
111 }