Add TonHe 30kW PSU control with LV/HV restart (v1.0.37).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
raduet
2026-09-23 14:05:53 +02:00
co-authored by Cursor
parent 644fcf1692
commit 10691b77f2
15 changed files with 10132 additions and 8832 deletions
+50 -2
View File
@@ -10,16 +10,64 @@ InfoBlock_t *InfoBlock = (InfoBlock_t *)(VERSION_OFFSET);
static uint16_t s_connector_max_current_0p1A = (uint16_t)PSU_MAX_CURRENT * 10u;
void Board_SelectInfoBlockAddress(void)
{
const volatile uint32_t *new_base = (const volatile uint32_t *)VERSION_OFFSET;
if (*new_base == 0xFFFFFFFFu) {
InfoBlock = (InfoBlock_t *)VERSION_OFFSET_LEGACY;
} else {
InfoBlock = (InfoBlock_t *)VERSION_OFFSET;
}
}
PsuType_t Board_GetPsuType(void)
{
/* Legacy ConfigBlock has no psuType field; keep Niuera path. */
if (InfoBlock == (InfoBlock_t *)VERSION_OFFSET_LEGACY) {
return PSU_TYPE_NONE;
}
return (PsuType_t)InfoBlock->psuType;
}
uint16_t Board_GetPsuMaxCurrentA(void)
{
switch (Board_GetPsuType()) {
case PSU_TYPE_TONHE_30KW:
case PSU_TYPE_NIUERA_30KW:
return (uint16_t)PSU_BLOCK_CURRENT_30KW;
case PSU_TYPE_NIUERA_40KW:
return (uint16_t)PSU_BLOCK_CURRENT_40KW;
case PSU_TYPE_NONE:
default:
return (uint16_t)PSU_MAX_CURRENT;
}
}
uint32_t Board_GetPsuMaxPowerW(void)
{
switch (Board_GetPsuType()) {
case PSU_TYPE_TONHE_30KW:
case PSU_TYPE_NIUERA_30KW:
return PSU_BLOCK_POWER_30KW;
case PSU_TYPE_NIUERA_40KW:
return PSU_BLOCK_POWER_40KW;
case PSU_TYPE_NONE:
default:
return (uint32_t)PSU_MAX_POWER;
}
}
static uint16_t Board_ResolveConnectorCurrentLimitA(uint16_t raw_limit_a)
{
return (raw_limit_a == 0u) ? (uint16_t)PSU_MAX_CURRENT : raw_limit_a;
return (raw_limit_a == 0u) ? Board_GetPsuMaxCurrentA() : raw_limit_a;
}
void Board_LoadInfoBlockLimits(void)
{
const uint16_t limit_a = Board_ResolveConnectorCurrentLimitA(InfoBlock->connector1CurrentLimitA);
uint32_t limit_0p1a = (uint32_t)limit_a * 10u;
const uint32_t hw_max_0p1a = (uint32_t)PSU_MAX_CURRENT * 10u;
const uint32_t hw_max_0p1a = (uint32_t)Board_GetPsuMaxCurrentA() * 10u;
if (limit_0p1a > hw_max_0p1a) {
limit_0p1a = hw_max_0p1a;