diff --git a/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml b/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml index f51dc0d2b5059..97b5b04e28778 100644 --- a/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml +++ b/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml @@ -9,6 +9,7 @@ toolchain: supported: - gpio - serial + - hwinfo - trng - i2c - dma diff --git a/boards/adi/max32657evkit/max32657evkit_max32657.yaml b/boards/adi/max32657evkit/max32657evkit_max32657.yaml index 1446352e7e42a..1b7e95badd294 100644 --- a/boards/adi/max32657evkit/max32657evkit_max32657.yaml +++ b/boards/adi/max32657evkit/max32657evkit_max32657.yaml @@ -11,6 +11,7 @@ supported: - gpio - trng - watchdog + - hwinfo - dma - counter - pwm diff --git a/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml b/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml index 7aa536ce62806..a7ae42af7dc76 100644 --- a/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml +++ b/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml @@ -9,6 +9,7 @@ toolchain: supported: - gpio - serial + - hwinfo - spi - i2c - trng diff --git a/boards/adi/max78002evkit/max78002evkit_max78002_m4.yaml b/boards/adi/max78002evkit/max78002evkit_max78002_m4.yaml index fb537c20e6a61..4ba1fe340f514 100644 --- a/boards/adi/max78002evkit/max78002evkit_max78002_m4.yaml +++ b/boards/adi/max78002evkit/max78002evkit_max78002_m4.yaml @@ -9,6 +9,7 @@ toolchain: supported: - gpio - serial + - hwinfo - trng - i2c - dma diff --git a/drivers/hwinfo/hwinfo_max32.c b/drivers/hwinfo/hwinfo_max32.c index e0ec75dd72259..72f1dbb061be3 100644 --- a/drivers/hwinfo/hwinfo_max32.c +++ b/drivers/hwinfo/hwinfo_max32.c @@ -4,21 +4,33 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include #include #include #include #include +static struct k_spinlock device_id_lock; +static bool initialized; +static uint8_t usn[MXC_SYS_USN_LEN]; + ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) { - uint8_t usn[MXC_SYS_USN_LEN]; - int error; + int ret; + k_spinlock_key_t key; + + key = k_spin_lock(&device_id_lock); + + if (!initialized) { + ret = Wrap_MXC_SYS_GetUSN(usn); + + if (ret != E_NO_ERROR) { + /* Error reading USN */ + goto exit; + } - error = Wrap_MXC_SYS_GetUSN(usn); - if (error != E_NO_ERROR) { - /* Error reading USN */ - return error; + initialized = true; } if (length > sizeof(usn)) { @@ -27,6 +39,9 @@ ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) /* Provide device ID in big endian */ sys_memcpy_swap(buffer, usn, length); + ret = length; - return length; +exit: + k_spin_unlock(&device_id_lock, key); + return ret; }