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:
+107
-44
File diff suppressed because one or more lines are too long
@@ -3,3 +3,4 @@
|
||||
/.launches/
|
||||
/targetConfigs/
|
||||
/project.log
|
||||
/Release/
|
||||
|
||||
@@ -190,6 +190,26 @@
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/Include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/Include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_headers/include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_headers/include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/gas167.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/gas167.c</locationURI>
|
||||
</link>
|
||||
</linkedResources>
|
||||
<variableList>
|
||||
<variable>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
ccsVersionValidationPolicy=warning
|
||||
compilerVersionValidationPolicy=flexible
|
||||
eclipse.preferences.version=1
|
||||
productVersionsValidationPolicy=flexible
|
||||
@@ -1,5 +1,40 @@
|
||||
## Номер выпуска
|
||||
|
||||
Меняйте `FIRMWARE_VERSION_MAJOR`, `FIRMWARE_VERSION_MINOR` и
|
||||
`FIRMWARE_VERSION_PATCH` в `firmware_version.h` в корне проекта CCS.
|
||||
Например, `0U`, `1U`, `2U` задают версию 0.1.2. Сохраните файл и
|
||||
выполните Rebuild. После обновления настроек закройте/откройте проект и
|
||||
выполните Clean/Rebuild.
|
||||
|
||||
Debug и Release запускают `prepare_identity.py`: он читает номер из заголовка
|
||||
и передаёт его общему генератору. `firmware_identity.json` содержит только
|
||||
product/target; номер выпуска в нём редактировать не нужно.
|
||||
`${BuildDirectory}/generated/firmware_identity.h` и JSON-паспорт создаются
|
||||
автоматически; вручную их не меняйте. Диапазоны: major/minor 0..255,
|
||||
patch 0..999. Неверный номер останавливает генерацию.
|
||||
# Результаты сборки
|
||||
|
||||
Версия 0.1.1 возвращает паспорт прошивки и блочное чтение EEPROM поверх
|
||||
подтверждённой на плате базы `c6c9128`. COM_1 остаётся на 115200; исходники
|
||||
`main.c`, `RS485.c`, `RS485.h` и настройки PLL не менялись относительно этой базы.
|
||||
Не используйте 250000/256000 для проверки этой сборки. FIFO остаётся включённым,
|
||||
как в рабочей базе; диагностический вариант без FIFO здесь не используется.
|
||||
Блочное чтение, проверка размера и host-тесты проверяются программно;
|
||||
после загрузки сначала проверьте чтение версии 0.1.1, затем 256 байт EEPROM.
|
||||
|
||||
Debug post-build CCS12 также копирует проверенный BIN и сопутствующие
|
||||
`.manifest.json`/`.sha256` в
|
||||
`../newProject/SETGUI/..periph_28335/firmware/periph28335/bal`.
|
||||
Папка создаётся автоматически; имя BIN с Git commit сохраняется.
|
||||
Копирование выполняет `copy_bin_to_setgui.ps1` после успешной проверки образа
|
||||
и создания паспорта. Пути определяются относительно репозитория, не cwd CCS.
|
||||
Для ручного копирования: `./copy_bin_to_setgui.ps1 -Path ./Bin/<имя>.bin`.
|
||||
|
||||
Версия работающей прошивки, SHA-256 BIN и паспорт сборки описаны в
|
||||
[инструкции для 167](../Doc/FIRMWARE_IDENTITY.md). Перед компиляцией запускается
|
||||
`preBuildStep.bat`; требуются Python 3.10+ и Git в PATH CCS. Debug post-build
|
||||
создаёт рядом с BIN файлы `.manifest.json` и `.sha256`.
|
||||
|
||||
Для сборки требуется общий UMP-протокол из соседнего репозитория:
|
||||
`../newProject/SETGUI/third_party/templates/c/set-protocol` (от корня этого
|
||||
репозитория). Пути к заголовкам заданы в `.cproject` для Debug и Release;
|
||||
@@ -14,3 +49,7 @@
|
||||
BIN создаётся скриптом `build_bin.bat`; Git должен быть доступен в `PATH`
|
||||
процесса CCS. Если определить коммит не удалось, сборка завершается ошибкой.
|
||||
При наличии незакоммиченных правок хеш обозначает HEAD и не описывает эти правки.
|
||||
|
||||
## GAS для новой EEPROM
|
||||
|
||||
При EEPROM_M95M02=1 доступен профиль GAS 167/v1 через Modbus и служебный CAN УМП. Карта, проверки и измеренные размеры: [GAS_167_M95M02.md](../Doc/GAS_167_M95M02.md). В сборке AT25256B GAS исключён; её загрузочный BIN не увеличивается. После обновления проекта выполнить Clean/Rebuild: новый gas167.c зарегистрирован в .project.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"product": "Balsam-167-PM35",
|
||||
"target": "TMS320F28335"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef BALSAM_FIRMWARE_VERSION_H
|
||||
#define BALSAM_FIRMWARE_VERSION_H
|
||||
|
||||
/* Edit these numbers before releasing firmware, then rebuild. */
|
||||
#define FIRMWARE_VERSION_MAJOR 1U
|
||||
#define FIRMWARE_VERSION_MINOR 1U
|
||||
#define FIRMWARE_VERSION_PATCH 2U
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
for %%I in ("%~dp0..") do set "SRC_ROOT=%%~fI"
|
||||
|
||||
:process_arg
|
||||
if "%1"=="" goto end_process_arg
|
||||
set name=%1
|
||||
set value=
|
||||
|
||||
:process_arg_value
|
||||
if NOT "%value%"=="" set value=%value% %2
|
||||
if "%value%"=="" set value=%2
|
||||
shift
|
||||
if "%2"=="!" goto set_arg
|
||||
if "%2"=="" goto set_arg
|
||||
goto process_arg_value
|
||||
|
||||
:set_arg
|
||||
set %name%=%value%
|
||||
shift
|
||||
shift
|
||||
goto process_arg
|
||||
:end_process_arg
|
||||
|
||||
pushd "%SRC_ROOT%\Bin" || exit /b 1
|
||||
hex2000.exe UKSSTMS320F28335.out -boot -sci8 -map UKSSTMS320F28335.map -o UKSSTMS320F28335.hex -i
|
||||
set "BUILD_RESULT=%errorlevel%"
|
||||
popd
|
||||
if not "%BUILD_RESULT%"=="0" exit /b %BUILD_RESULT%
|
||||
|
||||
call "%SRC_ROOT%\build_bin.bat"
|
||||
exit /b %errorlevel%
|
||||
@@ -0,0 +1,48 @@
|
||||
"""Generate build identity using the release version from firmware_version.h."""
|
||||
import argparse
|
||||
import importlib.util
|
||||
import json
|
||||
from pathlib import Path
|
||||
import re
|
||||
import tempfile
|
||||
|
||||
|
||||
def read_version(header):
|
||||
text = header.read_text(encoding="utf-8-sig")
|
||||
text = re.sub(r"/\*.*?\*/|//[^\n]*", "", text, flags=re.S)
|
||||
version = []
|
||||
for part, limit in (("MAJOR", 255), ("MINOR", 255), ("PATCH", 999)):
|
||||
name = "FIRMWARE_VERSION_" + part
|
||||
definitions = re.findall(r"^\s*#\s*define\s+" + name + r"\b([^\n]*)", text, re.M)
|
||||
if len(definitions) != 1:
|
||||
raise ValueError(f"{header}: define {name} exactly once")
|
||||
value = definitions[0].strip()
|
||||
if not re.fullmatch(r"(?:0|[1-9][0-9]*)[uU]?", value):
|
||||
raise ValueError(f"{header}: {name} must be a decimal integer")
|
||||
number = int(value.rstrip("uU"))
|
||||
if not 0 <= number <= limit:
|
||||
raise ValueError(f"{header}: {name} must be in 0..{limit}")
|
||||
version.append(number)
|
||||
return version
|
||||
|
||||
|
||||
def prepare(project, templates, output):
|
||||
settings = json.loads((project / "firmware_identity.json").read_text(encoding="utf-8-sig"))
|
||||
settings["version"] = read_version(project / "firmware_version.h")
|
||||
spec = importlib.util.spec_from_file_location("shared_firmware_identity", templates / "c/firmware-info/tools/identity.py")
|
||||
identity = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(identity)
|
||||
# The source header owns SemVer; retain the shared generator and manifest format.
|
||||
with tempfile.TemporaryDirectory(prefix="balsam-identity-") as directory:
|
||||
config = Path(directory) / "config.json"
|
||||
config.write_text(json.dumps(settings), encoding="utf-8")
|
||||
return identity.prepare(project, templates, config, output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--project", type=Path, required=True)
|
||||
parser.add_argument("--templates", type=Path, required=True)
|
||||
parser.add_argument("--output", type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
print(json.dumps(prepare(args.project, args.templates, args.output)))
|
||||
Reference in New Issue
Block a user