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();
32 kManufacturerIdReg = 0x87,
34 kAlsMeasRateReg = 0x85,
35 kAlsDataCh10Reg = 0x88,
36 kAlsDataCh11Reg = 0x89,
37 kAlsDataCh00Reg = 0x8A,
38 kAlsDataCh01Reg = 0x8B,
43 kManufacturerId = 0x05,
45 kMeasRate = 0x01 << 3 | 0x02,
51 kDefaultTimeoutMicros = 1000,
54 static dif_rv_core_ibex_t rv_core_ibex;
55 static dif_pinmux_t pinmux;
59 uint8_t reg = kPartIdReg, data = 0;
60 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
61 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
62 TRY_CHECK(data == kPartId,
"Unexpected value %x", data);
66 static status_t read_manufacturer_id(
void) {
67 uint8_t reg = kManufacturerIdReg, data = 0;
68 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, ®,
true));
69 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &data, kDefaultTimeoutMicros));
70 TRY_CHECK(data == kManufacturerId,
"Unexpected value %x", data);
74 static status_t write_read_measure_rate(
void) {
76 uint8_t meas_reg = kAlsMeasRateReg;
77 uint8_t rate[2] = {meas_reg, kMeasRate};
78 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(rate), rate,
true));
80 uint8_t rate_data = 0;
81 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &meas_reg,
true));
82 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &rate_data,
83 kDefaultTimeoutMicros));
84 TRY_CHECK(rate_data == kMeasRate,
"Unexpected value %x", rate_data);
89 static status_t take_measurement(
void) {
91 uint8_t ctrl_reg = kAlsContrReg;
92 uint8_t ctrl[2] = {ctrl_reg, kCtrlActive};
93 TRY(i2c_testutils_write(&i2c, kDeviceAddr,
sizeof(ctrl), ctrl,
true));
95 uint8_t ctrl_data = 0;
96 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &ctrl_reg,
true));
97 TRY(i2c_testutils_read(&i2c, kDeviceAddr, 1, &ctrl_data,
98 kDefaultTimeoutMicros));
99 TRY_CHECK(ctrl_data == kCtrlActive,
"Unexpected value %x", ctrl_data);
102 uint8_t status_reg = kAlsStatusReg;
104 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &status_reg,
true));
106 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(
status), &
status,
107 kDefaultTimeoutMicros));
108 }
while ((
status & kDataStatus) == 0);
111 uint8_t data_start = kAlsDataCh10Reg;
112 uint8_t data[4] = {0xFF, 0xFF, 0xFF, 0xFF};
113 TRY(i2c_testutils_write(&i2c, kDeviceAddr, 1, &data_start,
true));
114 TRY(i2c_testutils_read(&i2c, kDeviceAddr,
sizeof(data), data,
115 kDefaultTimeoutMicros));
119 uint8_t all_ff[4] = {0xFF, 0xFF, 0xFF, 0xFF};
120 LOG_INFO(
"Measured data: [0x%02x, 0x%02x, 0x%02x, 0x%02x]", data[0], data[1],
122 TRY_CHECK_ARRAYS_NE(data, all_ff,
sizeof(data));
131 TRY(dif_rv_core_ibex_init(base_addr, &rv_core_ibex));
134 TRY(dif_i2c_init(base_addr, &i2c));
137 TRY(dif_pinmux_init(base_addr, &pinmux));
139 TRY(i2c_testutils_select_pinmux(&pinmux, 2, I2cPinmuxPlatformIdCw310Pmod));
148 CHECK_STATUS_OK(test_init());
155 test_result = OK_STATUS();
156 for (
size_t i = 0; i <
ARRAYSIZE(speeds); ++i) {
157 CHECK_STATUS_OK(i2c_testutils_set_speed(&i2c, speeds[i]));
164 return status_ok(test_result);