Software APIs
spi_host_config_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/lib/testing/test_framework/ottf_utils.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 enum {
30  kDefaultTimeoutMicros = 50000,
31  // This test uses the hyperdebug bit banging. To ensure accurate signal
32  // capture and avoid aliasing, we run the spi at 40kHz, adhering to the
33  // Nyquist limit with the Hyperdebug's 100kHz sampling rate.
34  kSpiClock = 20000,
35 };
36 
37 OTTF_BACKDOOR_VAR
38 uint8_t backdoor_cpha = UINT8_MAX;
39 OTTF_BACKDOOR_VAR
40 uint8_t backdoor_cpol = UINT8_MAX;
41 OTTF_BACKDOOR_VAR
42 uint32_t backdoor_data = UINT32_MAX;
43 
44 static status_t spi_config_test(dif_spi_host_t *spi);
45 
46 static status_t configure_pinmux(const dif_pinmux_t *pinmux);
47 
48 bool test_main(void) {
49  dif_spi_host_t spi_host;
50  mmio_region_t base_addr =
52 
53  dif_pinmux_t pinmux;
54  CHECK_DIF_OK(dif_pinmux_init(base_addr, &pinmux));
56  CHECK_DIF_OK(dif_spi_host_init(base_addr, &spi_host));
57 
58  configure_pinmux(&pinmux);
59  for (size_t i = 0; i < 4; ++i) {
60  CHECK_STATUS_OK(spi_config_test(&spi_host));
61  }
62  return true;
63 }
64 
65 static status_t spi_config_test(dif_spi_host_t *spi) {
66  dif_spi_host_config_t config = {
67  .spi_clock = kSpiClock,
68  .peripheral_clock_freq_hz = (uint32_t)kClockFreqHiSpeedPeripheralHz / 2,
69  };
70  backdoor_cpha = UINT8_MAX;
71  backdoor_cpol = UINT8_MAX;
72  backdoor_data = UINT32_MAX;
73 
74  OTTF_WAIT_FOR(backdoor_cpha != UINT8_MAX, kDefaultTimeoutMicros);
75  config.cpha = backdoor_cpha;
76  OTTF_WAIT_FOR(backdoor_cpol != UINT8_MAX, kDefaultTimeoutMicros);
77  config.cpol = backdoor_cpol;
78  TRY(dif_spi_host_output_set_enabled(spi, false));
79  TRY(dif_spi_host_configure(spi, config));
80  TRY(dif_spi_host_output_set_enabled(spi, true));
81  LOG_INFO("Mode : CPOL=%d,CPHA=%d", config.cpol, config.cpha);
82 
83  static uint32_t address = 0;
84  OTTF_WAIT_FOR(backdoor_data != UINT32_MAX, kDefaultTimeoutMicros);
85  uint8_t data[sizeof(backdoor_data)];
86  memcpy(data, (const void *)&backdoor_data, sizeof(data));
87  busy_spin_micros(40000);
88  TRY(spi_flash_testutils_program_page(spi, data, sizeof(data), address,
89  false));
90  return OK_STATUS();
91 }
92 
93 static status_t configure_pinmux(const dif_pinmux_t *pinmux) {
94  // CSB.
97  // SCLK.
100  // SD0.
105 
106  // SD1.
111  return OK_STATUS();
112 }