| /* |
| * Copyright (c) 2023 Piotr Dymacz |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <errno.h> |
| #include <string.h> |
| #include <zephyr/drivers/hwinfo.h> |
| #include <zephyr/sys/byteorder.h> |
| |
| #include <driverlib/sys_ctrl.h> |
| #include <inc/hw_ccfg.h> |
| #include <inc/hw_fcfg1.h> |
| #include <inc/hw_memmap.h> |
| |
| #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; |
| } |