12 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
13 #include "sw/device/lib/testing/pinmux_testutils.h"
14 #include "sw/device/lib/testing/test_framework/check.h"
15 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
16 #include "sw/device/lib/testing/test_framework/status.h"
19 #include "otp_ctrl_regs.h"
21 OTTF_DEFINE_TEST_CONFIG();
28 OTP_CTRL_PARAM_DEVICE_ID_OFFSET - OTP_CTRL_PARAM_HW_CFG0_OFFSET,
29 kDeviceIdSizeInBytes = OTP_CTRL_PARAM_DEVICE_ID_SIZE,
30 kDeviceIdSizeIn32BitWords = kDeviceIdSizeInBytes /
sizeof(uint32_t),
33 static dif_uart_t uart0;
34 static dif_pinmux_t pinmux;
35 static dif_otp_ctrl_t otp;
37 static const uint32_t kTestDeviceId[kDeviceIdSizeIn32BitWords] = {
38 0xdeadbeef, 0x12345678, 0xabcdef12, 0xcafebeef,
39 0x87654321, 0x21fedcba, 0xa1b2c3d4, 0xacdc4321,
45 static status_t peripheral_handles_init(
void) {
48 TRY(dif_otp_ctrl_init(
55 static status_t otp_ctrl_read_hw_cfg0_device_id(uint32_t *device_id) {
56 for (
size_t i = kDeviceIdOffset; i < kDeviceIdSizeIn32BitWords; ++i) {
58 kDeviceIdOffset + (i * 4),
60 LOG_INFO(
"Device ID (%d) = %08x", i, device_id[i]);
71 static status_t check_device_id_is_unprovisioned(
void) {
79 uint32_t expected_device_id[kDeviceIdSizeIn32BitWords] = {0};
80 uint32_t actual_device_id[kDeviceIdSizeIn32BitWords] = {0};
81 TRY(otp_ctrl_read_hw_cfg0_device_id(actual_device_id));
82 CHECK_ARRAYS_EQ(actual_device_id, expected_device_id,
83 kDeviceIdSizeIn32BitWords);
90 static status_t check_device_id_is_provisioned(
void) {
98 uint32_t actual_device_id[kDeviceIdSizeIn32BitWords] = {0};
99 TRY(otp_ctrl_read_hw_cfg0_device_id(actual_device_id));
100 CHECK_ARRAYS_EQ(actual_device_id, kTestDeviceId, kDeviceIdSizeIn32BitWords);
107 static status_t provisioning_device_id_start(
void) {
108 LOG_INFO(
"Provisioning Device ID in OTP.");
109 check_device_id_is_unprovisioned();
111 kDeviceIdOffset, kTestDeviceId,
112 kDeviceIdSizeIn32BitWords));
119 static status_t provisioning_device_id_end(
void) {
121 check_device_id_is_provisioned();
126 CHECK_STATUS_OK(peripheral_handles_init());
128 pinmux_testutils_init(&pinmux);
129 CHECK(
kUartBaudrate <= UINT32_MAX,
"kUartBaudrate must fit in uint32_t");
131 "kClockFreqPeripheralHz must fit in uint32_t");
143 CHECK_STATUS_OK(provisioning_device_id_start());
144 CHECK_STATUS_OK(provisioning_device_id_end());
146 test_status_set(kTestStatusPassed);