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();
29 kDeviceIdAddr = 0xF8 >> 1,
32 kManufacturerId = 0x00A,
35 kDefaultTimeoutMicros = 5000,
40 static status_t write_byte(dif_i2c_t *i2c,
const uint8_t addr[2],
42 uint8_t data[3] = {addr[0], addr[1],
byte};
43 return i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false);
46 static status_t read_byte(dif_i2c_t *i2c,
const uint8_t addr[2],
48 TRY(i2c_testutils_write(i2c, kDeviceAddr, 2, addr,
true));
49 return i2c_testutils_read(i2c, kDeviceAddr, 1,
byte, kDefaultTimeoutMicros);
52 static status_t read_device_id(dif_i2c_t *i2c) {
58 uint8_t cmd = kDeviceAddr << 1;
59 uint8_t data[3] = {0x00, 0x00, 0x00};
61 TRY(i2c_testutils_write(i2c, kDeviceIdAddr, 1, &cmd,
true));
62 TRY(i2c_testutils_read(i2c, kDeviceIdAddr,
sizeof(data), data,
63 kDefaultTimeoutMicros));
67 uint16_t manuf_id = (uint16_t)((uint16_t)data[0] << 8) + (data[1] >> 4);
68 uint16_t product_id = (uint16_t)((uint16_t)(data[1] & 0x0F) << 8) + data[2];
70 TRY_CHECK(manuf_id == kManufacturerId,
"Unexpected value 0x%x", data);
71 TRY_CHECK(product_id == kProductId,
"Unexpected value 0x%x", data);
76 static status_t write_read_byte(dif_i2c_t *i2c) {
78 const uint8_t kAddr[2] = {0x03, 0x21};
79 TRY(write_byte(i2c, kAddr, 0xAB));
82 uint8_t read_data = 0x00;
83 TRY(read_byte(i2c, kAddr, &read_data));
85 TRY_CHECK(read_data == 0xAB,
"Unexpected value: 0x%02x", read_data);
89 TRY(write_byte(i2c, kAddr, 0xFF));
90 TRY(read_byte(i2c, kAddr, &read_data));
91 TRY_CHECK(read_data == 0xFF,
"Unexpected value: 0x%02x", read_data);
96 static status_t write_read_page(dif_i2c_t *i2c) {
98 const uint8_t kAddr[2] = {0x02, 0x01};
99 uint8_t data[5] = {kAddr[0], kAddr[1], 0xAB, 0xCD, 0xEF};
100 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false));
103 uint8_t read_data[2] = {0x00, 0x00};
104 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(kAddr), kAddr,
true));
105 TRY(i2c_testutils_read(i2c, kDeviceAddr,
sizeof(read_data), read_data,
106 kDefaultTimeoutMicros));
109 TRY_CHECK_ARRAYS_EQ(read_data, data + 2,
sizeof(read_data));
112 uint8_t last_byte = 0x00;
113 TRY(i2c_testutils_read(i2c, kDeviceAddr, 1, &last_byte,
114 kDefaultTimeoutMicros));
116 TRY_CHECK(last_byte == data[4],
"Unexpected value: 0x%02x", last_byte);
120 uint8_t erase_data[5] = {kAddr[0], kAddr[1], 0xFF, 0xFF, 0xFF};
121 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(erase_data), erase_data,
123 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(kAddr), kAddr,
true));
124 uint8_t erase_read[3] = {0x00, 0x00, 0x00};
125 TRY(i2c_testutils_read(i2c, kDeviceAddr,
sizeof(erase_read), erase_read,
126 kDefaultTimeoutMicros));
129 TRY_CHECK_ARRAYS_EQ(erase_read, erase_data + 2,
sizeof(erase_read));
134 static status_t throughput(dif_i2c_t *i2c, uint32_t expected_kbps) {
135 enum { kTimeoutMicros = 1000 * 1000, kTxSize = 512 };
137 dif_rv_core_ibex_t rv_core_ibex;
138 CHECK_DIF_OK(dif_rv_core_ibex_init(
142 const uint8_t kAddr[2] = {0x04, 0x00};
143 uint8_t data[kTxSize +
sizeof(kAddr)] = {kAddr[0], kAddr[1]};
145 for (
int i =
sizeof(kAddr); i <
sizeof(data); ++i) {
147 TRY(rv_core_ibex_testutils_get_rnd_data(&rv_core_ibex, 2000, &rand));
148 data[i] = rand & 0xFF;
151 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(data), data,
false));
155 uint32_t kbps = (kTxSize * 8 * 1000) / (uint32_t)elapsed;
156 LOG_INFO(
"Wrote %u bytes, in %u micros, %u kbps. Expected was %u kbps",
157 kTxSize, (uint32_t)elapsed, kbps, expected_kbps);
158 TRY_CHECK(kbps >= expected_kbps,
"%u kbps is less than %u kpbs", kbps,
161 uint8_t read_data[kTxSize] = {0};
162 TRY(i2c_testutils_write(i2c, kDeviceAddr,
sizeof(kAddr), kAddr,
true));
164 TRY(i2c_testutils_read(i2c, kDeviceAddr, kTxSize, read_data, kTimeoutMicros));
166 kbps = (kTxSize * 8 * 1000) / (uint32_t)elapsed;
167 LOG_INFO(
"Read %u bytes, in %u micros, %u kbps. Expected was %u kbps",
168 kTxSize, (uint32_t)elapsed, kbps, expected_kbps);
169 TRY_CHECK(kbps >= expected_kbps);
171 TRY_CHECK_ARRAYS_EQ(read_data, data + 2,
sizeof(read_data));
176 static status_t i2c_configure(dif_i2c_t *i2c, dif_pinmux_t *pinmux,
177 uint8_t i2c_instance,
178 i2c_pinmux_platform_id_t platform) {
182 TRY_CHECK(i2c_instance <
ARRAYSIZE(kI2cBaseAddrTable));
186 TRY(dif_i2c_init(base_addr, i2c));
190 TRY(i2c_testutils_select_pinmux(pinmux, i2c_instance, platform));
197 static status_t test_shutdown(dif_i2c_t *i2c, dif_pinmux_t *pinmux,
198 uint8_t i2c_instance) {
200 return i2c_testutils_detach_pinmux(pinmux, i2c_instance);
221 CHECK_DIF_OK(dif_pinmux_init(
224 i2c_pinmux_platform_id_t platform = I2cPinmuxPlatformIdCw310Pmod;
226 for (uint8_t i2c_instance = 0; i2c_instance < kI2cInstances; ++i2c_instance) {
227 LOG_INFO(
"Testing i2c%d", i2c_instance);
228 CHECK_STATUS_OK(i2c_configure(&i2c, &pinmux, i2c_instance, platform));
230 for (
size_t i = 0; i <
ARRAYSIZE(kSetup); ++i) {
231 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, kSetup[i].speed));
235 EXECUTE_TEST(test_result, throughput, &i2c, kSetup[i].kbps);
236 CHECK_STATUS_OK(test_result);
238 CHECK_STATUS_OK(test_shutdown(&i2c, &pinmux, i2c_instance));
240 return status_ok(test_result);