drivers: hwinfo: add TI MSPM0 support
Texas Instruments MSPM0 series supports device id fields with various part information and also resgister to hold reset reason. Reset cause register will defaults to 0 after first read. Signed-off-by: Parthiban Nallathambi <parthiban@linumiz.com>
This commit is contained in:
parent
70e4eae93c
commit
7e5434f246
2 changed files with 141 additions and 0 deletions
|
@ -297,4 +297,11 @@ config HWINFO_RENESAS_RA
|
|||
help
|
||||
Enable RENESAS RA hwinfo driver
|
||||
|
||||
config HWINFO_MSPM0
|
||||
bool "TI MSPM0 hwinfo"
|
||||
default y
|
||||
depends on SOC_FAMILY_TI_MSPM0
|
||||
help
|
||||
Enable TI MSPM0 hwinfo driver
|
||||
|
||||
endif
|
||||
|
|
134
drivers/hwinfo/hwinfo_mspm0.c
Normal file
134
drivers/hwinfo/hwinfo_mspm0.c
Normal file
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
* Copyright (c) 2025 Linumiz GmbH
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/drivers/hwinfo.h>
|
||||
#include <ti/driverlib/driverlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static uint32_t reset_cause;
|
||||
ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length)
|
||||
{
|
||||
struct mspm0_device_id {
|
||||
uint16_t manufacturer;
|
||||
uint16_t partnum;
|
||||
uint8_t version;
|
||||
uint32_t traceid;
|
||||
uint16_t user_partnum;
|
||||
uint8_t user_var;
|
||||
};
|
||||
|
||||
struct mspm0_device_id info = {0};
|
||||
|
||||
info.manufacturer = DL_FactoryRegion_getManufacturerCode();
|
||||
info.partnum = DL_FactoryRegion_getPartNumber();
|
||||
info.version = DL_FactoryRegion_getVersion();
|
||||
info.traceid = DL_FactoryRegion_getTraceID();
|
||||
info.user_partnum = DL_FactoryRegion_getUserIDPart();
|
||||
info.user_var = DL_FactoryRegion_getUserIDVariant();
|
||||
|
||||
if (length > sizeof(info)) {
|
||||
length = sizeof(info);
|
||||
}
|
||||
memcpy(buffer, &info, length);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
int z_impl_hwinfo_get_reset_cause(uint32_t *cause)
|
||||
{
|
||||
uint32_t reason;
|
||||
|
||||
if (reset_cause != 0) {
|
||||
*cause = reset_cause;
|
||||
return 0;
|
||||
}
|
||||
|
||||
reason = DL_SYSCTL_getResetCause();
|
||||
switch (reason) {
|
||||
case DL_SYSCTL_RESET_CAUSE_POR_HW_FAILURE:
|
||||
*cause = RESET_POR;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_POR_EXTERNAL_NRST:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOOTRST_EXTERNAL_NRST:
|
||||
*cause = RESET_PIN;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_POR_SW_TRIGGERED:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOOTRST_SW_TRIGGERED:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_SW_TRIGGERED:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_CPURST_SW_TRIGGERED:
|
||||
*cause = RESET_SOFTWARE;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOR_SUPPLY_FAILURE:
|
||||
*cause = RESET_BROWNOUT;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOR_WAKE_FROM_SHUTDOWN:
|
||||
*cause = RESET_LOW_POWER_WAKE;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOOTRST_NON_PMU_PARITY_FAULT:
|
||||
*cause = RESET_PARITY;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_BOOTRST_CLOCK_FAULT:
|
||||
*cause = RESET_CLOCK;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_BSL_EXIT:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_BSL_ENTRY:
|
||||
*cause = RESET_BOOTLOADER;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_WWDT0_VIOLATION:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_WWDT1_VIOLATION:
|
||||
*cause = RESET_WATCHDOG;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_FLASH_ECC_ERROR:
|
||||
*cause = RESET_FLASH;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_CPU_LOCKUP_VIOLATION:
|
||||
*cause = RESET_CPU_LOCKUP;
|
||||
break;
|
||||
case DL_SYSCTL_RESET_CAUSE_SYSRST_DEBUG_TRIGGERED:
|
||||
__fallthrough;
|
||||
case DL_SYSCTL_RESET_CAUSE_CPURST_DEBUG_TRIGGERED:
|
||||
*cause = RESET_DEBUG;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
reset_cause = *cause;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int z_impl_hwinfo_clear_reset_cause(void)
|
||||
{
|
||||
reset_cause = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported)
|
||||
{
|
||||
*supported = RESET_POR
|
||||
| RESET_PIN
|
||||
| RESET_SOFTWARE
|
||||
| RESET_BROWNOUT
|
||||
| RESET_LOW_POWER_WAKE
|
||||
| RESET_PARITY
|
||||
| RESET_CLOCK
|
||||
| RESET_BOOTLOADER
|
||||
| RESET_WATCHDOG
|
||||
| RESET_FLASH
|
||||
| RESET_CPU_LOCKUP
|
||||
| RESET_DEBUG;
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue