feat: add M95M02-only GAS and EEPROM profiles

Expose the existing registers through Modbus and service CAN using one GAS provider only in M95M02 builds.
Include the EEPROM layout/driver, LOAD protection and calibration, firmware identity and shared CCS build workflow.
Add transport/profile and SCI8 validation tests, documentation and the checked M95M02 firmware image.
This commit is contained in:
2026-10-09 16:17:37 +03:00
parent c6c9128238
commit 5d9818291b
63 changed files with 2307 additions and 365 deletions
+19 -4
View File
@@ -12,7 +12,9 @@
#include "message.h"
#include "peripher.h"
#include "log_to_mem.h"
#include "DAC.h"
#include "ump_can_protocol.h"
#include "gas167.h"
// Prototype statements for functions found within this file.
@@ -234,11 +236,18 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
Data[1] = (loword>>16) & 0xffff;
Data[2] = (loword ) & 0xffff;
if(bit[0]) if(adr < ANSWER_LEN) modbus[adr] = Data[0]; adr++;
if(bit[1]) if(adr < ANSWER_LEN) modbus[adr] = Data[1]; adr++;
if(bit[2]) if(adr < ANSWER_LEN) modbus[adr] = Data[2];
if(bit[0]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[0]; adr++;
if(bit[1]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[1]; adr++;
if(bit[2]) if(adr < ANSWER_LEN &&
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[2];
/* Ôèêñèðóåì ïðèìåí¸ííóþ êîìàíäó äî âûõîäà èç îáðàáîò÷èêà CAN. */
/* A short frame cannot confirm voltage freshness. Service frames
* UMP_MARKER return above and do not refresh this timeout. */
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8)
Load_voltage_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
ump_log_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
led2_toggle();
}
@@ -316,7 +325,13 @@ void UMP_CAN_service(void)
saved = __disable_interrupts();
tag = ump_can_tag; address = ump_can_address; value = ump_can_value;
ump_can_pending = 0;
ump_can_length = ump_can_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
if (address >= 0x1300U && address < 0x1308U)
ump_can_length = Load_protection_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
#if EEPROM_M95M02
else if (gas167_contains(address))
ump_can_length = gas167_prepare(tag & 0xFF, address, value, 1, ump_can_reply, &error);
#endif
else ump_can_length = ump_can_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
ump_can_reply_tag = (tag & 0xFF00) | error;
ump_can_index = 0;
__restore_interrupts(saved);