13 #include "sw/device/lib/runtime/irq.h"
16 #include "sw/device/lib/testing/i2c_testutils.h"
17 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
18 #include "sw/device/lib/testing/rv_plic_testutils.h"
19 #include "sw/device/lib/testing/test_framework/check.h"
25 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
26 "This test assumes the target platform is little endian.");
28 OTTF_DEFINE_TEST_CONFIG();
37 kManufacturerIdReg = 0xDE,
41 kCache63BitsReg = 0xCF,
43 kManufacturerId = 0xA1,
47 kDefaultTimeoutMicros = 10000,
57 static volatile dif_i2c_irq_t irq_fired;
58 static dif_rv_plic_t plic;
59 static dif_rv_core_ibex_t rv_core_ibex;
60 static dif_pinmux_t pinmux;
82 "IRQ from incorrect peripheral: exp = %d(i2c2), found = %d",
89 LOG_INFO(
"%s: plic:%d, i2c:%d", __func__, plic_irq_id, irq_fired);
90 TRY(dif_i2c_irq_acknowledge(&i2c, irq_fired));
97 void ottf_external_isr(uint32_t *exc_info) {
99 if (status_ok(isr_result)) {
104 static status_t read_manufacture_id(
void) {
105 uint8_t reg = kManufacturerIdReg, data = 0;
106 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
107 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
108 TRY_CHECK(data == kManufacturerId,
"Unexpected value %x", data);
112 static status_t read_product_id(
void) {
113 uint8_t reg = kProductIdReg, data = 0;
114 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
115 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
116 TRY_CHECK(data == kProductId,
"Unexpected value %x", data);
120 static status_t rx_stretch_timeout(
void) {
121 enum { kTimeoutMillis = 15 };
122 TRY(dif_i2c_irq_set_enabled(&i2c, kDifI2cIrqStretchTimeout,
127 uint8_t write_buffer[2] = {kRxDelayReg, kTimeoutMillis};
128 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_buffer),
129 write_buffer,
true));
132 uint32_t cycles = (kTimeoutMillis - 1) * 100;
135 uint8_t reg = kProductIdReg;
136 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
138 irq_global_ctrl(
false);
139 irq_fired = UINT32_MAX;
140 TRY(i2c_testutils_issue_read(&i2c, kDeviceAddr, 1));
141 ATOMIC_WAIT_FOR_INTERRUPT(irq_fired == kDifI2cIrqStretchTimeout);
143 TRY(dif_i2c_irq_set_enabled(&i2c, kDifI2cIrqStretchTimeout,
148 uint8_t write_buffer[2] = {kRxDelayReg, 0};
149 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_buffer),
150 write_buffer,
true));
161 enum { kTimeoutMillis = 1, kTxSize = 63 };
165 uint8_t write_buffer[2] = {kTxDelayReg, kTimeoutMillis};
166 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_buffer),
167 write_buffer,
true));
171 uint8_t rnd_data[kTxSize];
172 for (
int i = 0; i <
sizeof(rnd_data); ++i) {
174 TRY(rv_core_ibex_testutils_get_rnd_data(&rv_core_ibex, 1000, &rand));
175 rnd_data[i] = rand & 0xFF;
177 uint8_t write_buffer[kTxSize + 1];
178 write_buffer[0] = kCache63BitsReg;
179 memcpy(&write_buffer[1], rnd_data,
sizeof(rnd_data));
180 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_buffer), write_buffer,
183 const size_t timeout = (kTimeoutMillis * kTxSize) * 1000;
186 uint8_t reg = kCache63BitsReg;
187 uint8_t read_data[kTxSize] = {0};
188 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(reg), ®,
true));
189 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), read_data,
191 TRY_CHECK_ARRAYS_EQ(read_data, rnd_data,
sizeof(read_data));
195 uint8_t write_buffer[2] = {kTxDelayReg, 0};
196 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_buffer),
197 write_buffer,
true));
207 TRY(dif_rv_core_ibex_init(base_addr, &rv_core_ibex));
210 TRY(dif_i2c_init(base_addr, &i2c));
213 TRY(dif_pinmux_init(base_addr, &pinmux));
214 TRY(i2c_testutils_select_pinmux(&pinmux, 2, I2cPinmuxPlatformIdCw310Pmod));
218 TRY(dif_rv_plic_init(base_addr, &plic));
220 rv_plic_testutils_irq_range_enable(&plic, kHart,
225 irq_global_ctrl(
true);
226 irq_external_ctrl(
true);
232 CHECK_STATUS_OK(test_init());
238 for (
size_t i = 0; i <
ARRAYSIZE(speeds); ++i) {
239 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, speeds[i]));
246 return status_ok(test_result) && status_ok(isr_result);