12 #include "sw/device/lib/runtime/irq.h"
15 #include "sw/device/lib/testing/i2c_testutils.h"
16 #include "sw/device/lib/testing/rv_core_ibex_testutils.h"
17 #include "sw/device/lib/testing/test_framework/check.h"
23 static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__,
24 "This test assumes the target platform is little endian.");
26 OTTF_DEFINE_TEST_CONFIG();
32 kManufacturerIdReg = 0xFE,
34 kAccumConfigReg = 0x25,
36 kVSensenAvgReg = 0x13,
41 kManufacturerId = 0x54,
45 kDefaultTimeoutMicros = 5000,
48 static dif_rv_core_ibex_t rv_core_ibex;
49 static dif_pinmux_t pinmux;
52 static status_t read_manufacture_id(
void) {
53 uint8_t reg = kManufacturerIdReg, data = 0;
54 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
55 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
56 TRY_CHECK(data == kManufacturerId,
"Unexpected value %x", data);
60 static status_t read_product_id(
void) {
61 uint8_t reg = kProductIdReg, data = 0;
62 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
63 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
64 TRY_CHECK(data == kProductId,
"Unexpected value %x", data);
68 static status_t read_write_1byte(
void) {
69 uint8_t reg = kAccumConfigReg, read_data = 0;
72 uint8_t write_data[2] = {reg, 0x01};
73 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_data), write_data,
78 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(reg), ®,
true));
79 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), &read_data,
80 kDefaultTimeoutMicros));
81 TRY_CHECK(read_data == 0x01,
"Unexpected value %x", read_data,
82 kDefaultTimeoutMicros);
86 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_data), write_data,
91 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(reg), ®,
true));
92 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), &read_data,
93 kDefaultTimeoutMicros));
94 TRY_CHECK(read_data == 0x00,
"Unexpected value %x", read_data);
99 static status_t read_write_2bytes(
void) {
100 uint8_t reg = kOcLimitNReg, read_data[2] = {0};
103 uint8_t write_data[3] = {reg, 0xCA, 0xFE};
104 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_data), write_data,
108 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(reg), ®,
true));
109 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), read_data,
110 kDefaultTimeoutMicros));
111 TRY_CHECK(read_data[1] == 0xFE && read_data[0] == 0xCA,
112 "Unexpected value %02x%02x", read_data[1], read_data[0]);
117 static status_t read_write_block(
void) {
118 uint8_t reg = kOcLimitNReg, read_data[8] = {0};
119 uint8_t rnd_data[
sizeof(read_data)];
120 uint8_t write_data[
sizeof(read_data) + 1];
123 for (
int i = 0; i <
sizeof(rnd_data); ++i) {
125 TRY(rv_core_ibex_testutils_get_rnd_data(&rv_core_ibex, 1000, &rand));
126 rnd_data[i] = rand & 0xFF;
129 memcpy(&write_data[1], rnd_data,
sizeof(rnd_data));
131 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_data), write_data,
135 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(reg), ®,
true));
136 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), read_data,
137 kDefaultTimeoutMicros));
138 TRY_CHECK_ARRAYS_EQ(read_data, rnd_data,
sizeof(read_data));
147 TRY(dif_rv_core_ibex_init(base_addr, &rv_core_ibex));
150 TRY(dif_i2c_init(base_addr, &i2c));
153 TRY(dif_pinmux_init(base_addr, &pinmux));
155 TRY(i2c_testutils_select_pinmux(&pinmux, 2, I2cPinmuxPlatformIdCw310Pmod));
159 irq_global_ctrl(
true);
160 irq_external_ctrl(
true);
167 CHECK_STATUS_OK(test_init());
172 test_result = OK_STATUS();
173 for (
size_t i = 0; i <
ARRAYSIZE(speeds); ++i) {
174 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, speeds[i]));
182 return status_ok(test_result);