diff --git a/drivers/hwinfo/CMakeLists.txt b/drivers/hwinfo/CMakeLists.txt index 6ff5d1929f6..437fbf969cf 100644 --- a/drivers/hwinfo/CMakeLists.txt +++ b/drivers/hwinfo/CMakeLists.txt @@ -8,6 +8,7 @@ zephyr_library_sources_ifdef(CONFIG_USERSPACE hwinfo_handlers.c) zephyr_library_sources_ifdef(CONFIG_HWINFO hwinfo_weak_impl.c) zephyr_library_sources_ifdef(CONFIG_HWINFO_SHELL hwinfo_shell.c) +zephyr_library_sources_ifdef(CONFIG_HWINFO_CC13XX_CC26XX hwinfo_cc13xx_cc26xx.c) zephyr_library_sources_ifdef(CONFIG_HWINFO_ESP32 hwinfo_esp32.c) zephyr_library_sources_ifdef(CONFIG_HWINFO_GECKO hwinfo_gecko.c) zephyr_library_sources_ifdef(CONFIG_HWINFO_IMXRT hwinfo_imxrt.c) diff --git a/drivers/hwinfo/Kconfig b/drivers/hwinfo/Kconfig index 879f2b3e9d7..6971315b6b8 100644 --- a/drivers/hwinfo/Kconfig +++ b/drivers/hwinfo/Kconfig @@ -21,6 +21,42 @@ config HWINFO_SHELL help Enable hwinfo Shell for testing. +menuconfig HWINFO_CC13XX_CC26XX + bool "TI SimpleLink CC13xx/CC26xx hwinfo driver" + default y + depends on SOC_SERIES_CC13X2_CC26X2 || SOC_SERIES_CC13X2X7_CC26X2X7 + help + Enable TI SimpleLink CC13xx/CC26xx hwinfo driver. + +if HWINFO_CC13XX_CC26XX + +config HWINFO_CC13XX_CC26XX_ALWAYS_USE_FACTORY_DEFAULT + bool "Ignore CCFG and always use factory value" + default y + help + Always return factory pre-programmed values, stored in FCFG and ignore + values provided in CCFG (Customer Configuration). + +choice + prompt "Select MAC address type for device ID" + default HWINFO_CC13XX_CC26XX_USE_IEEE_MAC + help + Specify the MAC address type to be used as device ID by the driver. + +config HWINFO_CC13XX_CC26XX_USE_IEEE_MAC + bool "Use IEEE 802.15.4 extended address" + help + Use 8-bytes length IEEE 802.15.4 extended address as device ID value. + +config HWINFO_CC13XX_CC26XX_USE_BLE_MAC + bool "Use BLE MAC address" + help + Use 6-bytes length BLE MAC address as device ID value. + +endchoice + +endif + config HWINFO_STM32 bool "STM32 hwinfo" default y diff --git a/drivers/hwinfo/hwinfo_cc13xx_cc26xx.c b/drivers/hwinfo/hwinfo_cc13xx_cc26xx.c new file mode 100644 index 00000000000..536ff15a192 --- /dev/null +++ b/drivers/hwinfo/hwinfo_cc13xx_cc26xx.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2023 Piotr Dymacz + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifdef CONFIG_HWINFO_CC13XX_CC26XX_USE_BLE_MAC +#define CC13XX_CC26XX_DEVID_SIZE 6 +#else +#define CC13XX_CC26XX_DEVID_SIZE 8 +#endif + +ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) +{ + uint8_t *mac; + + if (IS_ENABLED(CONFIG_HWINFO_CC13XX_CC26XX_USE_BLE_MAC)) { + if (IS_ENABLED(CONFIG_HWINFO_CC13XX_CC26XX_ALWAYS_USE_FACTORY_DEFAULT) || + sys_read32(CCFG_BASE + CCFG_O_IEEE_BLE_0) == 0xFFFFFFFF || + sys_read32(CCFG_BASE + CCFG_O_IEEE_BLE_1) == 0xFFFFFFFF) { + mac = (uint8_t *)(FCFG1_BASE + FCFG1_O_MAC_BLE_0); + } else { + mac = (uint8_t *)(CCFG_BASE + CCFG_O_IEEE_BLE_0); + } + } else if (IS_ENABLED(CONFIG_HWINFO_CC13XX_CC26XX_USE_IEEE_MAC)) { + if (IS_ENABLED(CONFIG_HWINFO_CC13XX_CC26XX_ALWAYS_USE_FACTORY_DEFAULT) || + sys_read32(CCFG_BASE + CCFG_O_IEEE_MAC_0) == 0xFFFFFFFF || + sys_read32(CCFG_BASE + CCFG_O_IEEE_MAC_1) == 0xFFFFFFFF) { + mac = (uint8_t *)(FCFG1_BASE + FCFG1_O_MAC_15_4_0); + } else { + mac = (uint8_t *)(CCFG_BASE + CCFG_O_IEEE_MAC_0); + } + } + + if (length > CC13XX_CC26XX_DEVID_SIZE) { + length = CC13XX_CC26XX_DEVID_SIZE; + } + + /* Provide device ID (MAC) in big endian */ + sys_memcpy_swap(buffer, mac, length); + + return length; +} + +int z_impl_hwinfo_get_reset_cause(uint32_t *cause) +{ + uint32_t reset_src; + + reset_src = SysCtrlResetSourceGet(); + + switch (reset_src) { + case RSTSRC_PWR_ON: + *cause = RESET_POR; + break; + case RSTSRC_PIN_RESET: + *cause = RESET_PIN; + break; + case RSTSRC_VDDS_LOSS: + __fallthrough; + case RSTSRC_VDDR_LOSS: + *cause = RESET_BROWNOUT; + break; + case RSTSRC_CLK_LOSS: + *cause = RESET_CLOCK; + break; + case RSTSRC_SYSRESET: + *cause = RESET_SOFTWARE; + break; + } + + return 0; +} + +int z_impl_hwinfo_clear_reset_cause(void) +{ + return -ENOSYS; +} + +int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported) +{ + *supported = (RESET_PIN + | RESET_SOFTWARE + | RESET_BROWNOUT + | RESET_POR + | RESET_CLOCK); + + return 0; +}