99 lines
2.2 KiB
C
99 lines
2.2 KiB
C
/*
|
|
* 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;
|
|
}
|