Software APIs
spi_host_winbond_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 
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/test_framework/check.h"
19 #include "sw/device/tests/spi_host_flash_test_impl.h"
20 
22 
23 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
24  "This test assumes the target platform is little endian.");
25 
26 OTTF_DEFINE_TEST_CONFIG();
27 
28 bool test_main(void) {
29  dif_spi_host_t spi_host;
30  CHECK_DIF_OK(dif_spi_host_init(
32 
33  uint32_t spi_speed = 10000000; // 10MHz
34  if (kDeviceType == kDeviceSilicon) {
35  spi_speed = 16000000; // 16MHz
36 
37  dif_pinmux_t pinmux;
38  mmio_region_t base_addr =
40  CHECK_DIF_OK(dif_pinmux_init(base_addr, &pinmux));
41 
42  dif_pinmux_pad_attr_t out_attr;
43  dif_pinmux_pad_attr_t in_attr = {
44  .slew_rate = 0,
45  .drive_strength = 0,
46  .flags = kDifPinmuxPadAttrPullResistorEnable |
47  kDifPinmuxPadAttrPullResistorUp};
48 
49  CHECK_DIF_OK(
50  dif_pinmux_pad_write_attrs(&pinmux, kTopEarlgreyDirectPadsSpiHost0Sd2,
51  kDifPinmuxPadKindDio, in_attr, &out_attr));
52 
53  CHECK_DIF_OK(
54  dif_pinmux_pad_write_attrs(&pinmux, kTopEarlgreyDirectPadsSpiHost0Sd3,
55  kDifPinmuxPadKindDio, in_attr, &out_attr));
56  }
57 
58  CHECK(kClockFreqHiSpeedPeripheralHz <= UINT32_MAX,
59  "kClockFreqHiSpeedPeripheralHz must fit in uint32_t");
60  CHECK_DIF_OK(
61  dif_spi_host_configure(&spi_host,
63  .spi_clock = spi_speed,
64  .peripheral_clock_freq_hz =
66  }),
67  "SPI_HOST config failed!");
68  CHECK_DIF_OK(dif_spi_host_output_set_enabled(&spi_host, true));
69 
70  enum WinbondVendorSpecific {
71  kManufactureId = 0xef,
72  kPageQuadProgramOpcode = 0x32,
73  };
74 
75  status_t result = OK_STATUS();
76  EXECUTE_TEST(result, test_software_reset, &spi_host);
77  EXECUTE_TEST(result, test_read_sfdp, &spi_host);
78  EXECUTE_TEST(result, test_sector_erase, &spi_host);
79  EXECUTE_TEST(result, test_read_jedec, &spi_host, kManufactureId);
80  EXECUTE_TEST(result, test_enable_quad_mode, &spi_host);
81  EXECUTE_TEST(result, test_page_program, &spi_host);
82  if (is_4_bytes_address_mode_supported()) {
83  EXECUTE_TEST(result, test_4bytes_address, &spi_host);
84  }
85  EXECUTE_TEST(result, test_fast_read, &spi_host);
86  EXECUTE_TEST(result, test_dual_read, &spi_host);
87  EXECUTE_TEST(result, test_quad_read, &spi_host);
88  // The Winbond flash `4PP` opcode operates in 1-1-4 mode.
89  EXECUTE_TEST(result, test_page_program_quad, &spi_host,
90  kPageQuadProgramOpcode, kTransactionWidthMode114);
91  EXECUTE_TEST(result, test_erase_32k_block, &spi_host);
92  EXECUTE_TEST(result, test_erase_64k_block, &spi_host);
93 
94  return status_ok(result);
95 }