diff --git a/drivers/hwinfo/hwinfo_smartbond.c b/drivers/hwinfo/hwinfo_smartbond.c index f19c7770d60..be77f8b4f27 100644 --- a/drivers/hwinfo/hwinfo_smartbond.c +++ b/drivers/hwinfo/hwinfo_smartbond.c @@ -6,7 +6,42 @@ #include #include +#include #include +#include + +#define PRODUCT_INFO_GPOUP (12U) +#define CHIP_ID_GPOUP (13U) + +#define PRODUCT_INFO_LENGTH (3U) +#define CHIP_ID_LENGTH (1U) + +ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) +{ + size_t len; + uint32_t unique_id[4]; + uint8_t product_info_len; + uint8_t chip_id_len; + + product_info_len = da1469x_trimv_group_read(PRODUCT_INFO_GPOUP, &unique_id[0], + PRODUCT_INFO_LENGTH); + chip_id_len = da1469x_trimv_group_read(CHIP_ID_GPOUP, &unique_id[3], + CHIP_ID_LENGTH); + + if ((product_info_len != PRODUCT_INFO_LENGTH) || (chip_id_len != CHIP_ID_LENGTH)) { + return -ENODATA; + } + + for (uint8_t i = 0; i < (product_info_len + chip_id_len); i++) { + unique_id[i] = BSWAP_32(unique_id[i]); + } + + len = MIN(length, sizeof(unique_id)); + + memcpy(buffer, unique_id, len); + + return len; +} int z_impl_hwinfo_get_reset_cause(uint32_t *cause) {