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();
40 kInternalControlReg = 0x07,
48 kDefaultTimeoutMicros = 5000,
51 static dif_rv_core_ibex_t rv_core_ibex;
52 static dif_pinmux_t pinmux;
55 static status_t read_product_id(
void) {
56 uint8_t reg = kProductIdReg, data = 0;
57 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
58 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
59 TRY_CHECK(data == kProductId,
"Unexpected value %x", data);
63 static status_t take_measurement(
void) {
65 uint8_t write_data[2] = {kInternalControlReg, 0x01};
66 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(write_data), write_data,
71 uint8_t status_reg = kStatusReg;
73 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &status_reg,
true));
74 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(
status), &
status,
75 kDefaultTimeoutMicros));
76 }
while ((
status & kMeasDone) == 0);
81 uint8_t read_data[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
82 uint8_t xout_reg = kXOutLowReg;
83 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &xout_reg,
true));
84 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(read_data), read_data,
85 kDefaultTimeoutMicros));
89 uint8_t all_bits = 0x00;
90 for (
size_t i = 0; i <
ARRAYSIZE(read_data); ++i) {
91 all_bits |= read_data[i];
93 TRY_CHECK(all_bits != 0x00,
"All measurement registers zero");
102 TRY(dif_rv_core_ibex_init(base_addr, &rv_core_ibex));
105 TRY(dif_i2c_init(base_addr, &i2c));
108 TRY(dif_pinmux_init(base_addr, &pinmux));
110 TRY(i2c_testutils_select_pinmux(&pinmux, 2, I2cPinmuxPlatformIdCw310Pmod));
117 static status_t reset_i2c_and_check(
void) {
127 TRY_CHECK(!i2c_status.
enable_host,
"I2C doesn't appear to have been reset.");
135 CHECK_STATUS_OK(test_init());
139 test_result = OK_STATUS();
140 for (
size_t i = 0; i <
ARRAYSIZE(speeds); ++i) {
141 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, speeds[i]));
148 CHECK_STATUS_OK(reset_i2c_and_check());
152 return status_ok(test_result);