14 #include "sw/device/lib/testing/i2c_testutils.h"
15 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
16 #include "sw/device/lib/testing/test_framework/check.h"
22 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
23 "This test assumes the target platform is little endian.");
25 OTTF_DEFINE_TEST_CONFIG();
30 kDefaultTimeoutMicros = 5000,
33 kAckPollTimeoutMicros = 80000,
36 static status_t write_byte(dif_i2c_t *i2c,
const uint8_t addr[2],
38 uint8_t data[3] = {addr[0], addr[1],
byte};
39 return i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false);
42 static status_t read_byte(dif_i2c_t *i2c,
const uint8_t addr[2],
44 TRY(i2c_testutils_write(i2c, kDeviceAddr, 2, addr,
true));
45 return i2c_testutils_read(i2c, kDeviceAddr, 1,
byte, kDefaultTimeoutMicros);
55 static status_t poll_while_busy(dif_i2c_t *i2c) {
56 return i2c_testutils_read(i2c, kDeviceAddr, 0, NULL, kAckPollTimeoutMicros);
62 static status_t check_irq(dif_i2c_t *i2c, dif_i2c_irq_t irq,
bool expected) {
63 bool asserted =
false;
64 TRY(dif_i2c_irq_is_pending(i2c, irq, &asserted));
65 TRY_CHECK(expected == asserted,
"Irq %u not in the expected state", irq);
69 static status_t write_read_random(dif_i2c_t *i2c) {
72 const uint8_t kAddr[2] = {0x03, 0x21};
73 TRY(write_byte(i2c, kAddr, 0xAB));
76 naks = TRY(poll_while_busy(i2c));
77 TRY_CHECK(naks > 0,
"We should have received naks");
80 uint8_t read_data = 0x00;
81 TRY(read_byte(i2c, kAddr, &read_data));
84 TRY_CHECK(read_data == 0xAB,
"Unexpected value: 0x%02x", read_data);
88 TRY(write_byte(i2c, kAddr, 0xFF));
89 naks = TRY(poll_while_busy(i2c));
90 TRY_CHECK(naks > 0,
"We should have received naks");
91 TRY(read_byte(i2c, kAddr, &read_data));
94 TRY_CHECK(read_data == 0xFF,
"Unexpected value: 0x%02x", read_data);
99 static status_t write_read_page(dif_i2c_t *i2c,
bool use_irq) {
101 const uint8_t kAddr[2] = {0x02, 0x01};
102 uint8_t data[10] = {kAddr[0], kAddr[1], 0x01, 0x23, 0x45,
103 0x67, 0x89, 0xAB, 0xCD, 0xEF};
104 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false));
108 TRY(check_irq(i2c, kDifI2cIrqFmtThreshold,
false));
112 TRY(poll_while_busy(i2c));
115 uint8_t read_data[8] = {
118 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(kAddr), kAddr,
true));
119 TRY(i2c_testutils_read(i2c, kDeviceAddr,
sizeof(read_data), read_data,
120 kDefaultTimeoutMicros));
123 TRY_CHECK_ARRAYS_EQ(read_data, data + 2,
sizeof(read_data));
127 memset(&data[2], 0xFF,
sizeof(read_data));
128 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false));
129 TRY(poll_while_busy(i2c));
130 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(kAddr), kAddr,
true));
134 bool asserted =
false;
136 TRY(dif_i2c_irq_is_pending(i2c, kDifI2cIrqRxThreshold, &asserted));
138 TRY_CHECK(asserted,
"RxThreshold interrupt not asserted");
140 TRY(i2c_testutils_read(i2c, kDeviceAddr,
sizeof(read_data), read_data,
141 kDefaultTimeoutMicros));
144 TRY_CHECK_ARRAYS_EQ(read_data, data + 2,
sizeof(read_data));
149 static status_t write_read_page_with_irq(dif_i2c_t *i2c) {
150 TRY(dif_i2c_irq_acknowledge_all(i2c));
153 TRY(write_read_page(i2c,
true));
156 TRY(check_irq(i2c, kDifI2cIrqFmtThreshold,
true));
158 return check_irq(i2c, kDifI2cIrqRxThreshold,
false);
161 static status_t i2c_configure(dif_i2c_t *i2c, dif_pinmux_t *pinmux,
162 uint8_t i2c_instance,
163 i2c_pinmux_platform_id_t platform) {
167 TRY_CHECK(i2c_instance <
ARRAYSIZE(kI2cBaseAddrTable));
171 TRY(dif_i2c_init(base_addr, i2c));
175 TRY(i2c_testutils_select_pinmux(pinmux, i2c_instance, platform));
182 static status_t test_shutdown(dif_i2c_t *i2c, dif_pinmux_t *pinmux,
183 uint8_t i2c_instance) {
185 return i2c_testutils_detach_pinmux(pinmux, i2c_instance);
191 CHECK_DIF_OK(dif_pinmux_init(
194 i2c_pinmux_platform_id_t platform = I2cPinmuxPlatformIdCw310Pmod;
196 for (uint8_t i2c_instance = 0; i2c_instance < 3; ++i2c_instance) {
197 LOG_INFO(
"Testing i2c%d", i2c_instance);
198 CHECK_STATUS_OK(i2c_configure(&i2c, &pinmux, i2c_instance, platform));
203 for (
size_t i = 0; i <
ARRAYSIZE(kSpeeds); ++i) {
204 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, kSpeeds[i]));
206 EXECUTE_TEST(test_result, write_read_page, &i2c,
false);
207 EXECUTE_TEST(test_result, write_read_page_with_irq, &i2c);
209 CHECK_STATUS_OK(test_shutdown(&i2c, &pinmux, i2c_instance));
212 return status_ok(test_result);