Исправить вход UlitCo в SCI через Monitor

Передавать контрольную сумму команды перехода в загрузчик.
Отправлять Monitor на 468750 бод и затем включать скорость SCI из JSON.
Обновить эталонные проверки входа в загрузчик.
This commit is contained in:
2026-11-13 17:06:39 +03:00
parent d057df7698
commit 80d8fe1794
4 changed files with 7 additions and 5 deletions
@@ -56,13 +56,15 @@ class SciWorker(QThread): # Один сеанс владеет COM-портом
serial = None # Ошибка проверки образа не должна даже открывать аппаратный интерфейс.
try: # Все исключения превращаются в конечный результат GUI.
session = Session(self.kernel, self.image) # Проверяет RAM-ядро и Flash-таблицу до любой управляющей команды.
serial = QSerialPort(); serial.setPortName(self.port); serial.setBaudRate(self.baud) # Использует точный COM-порт и скорость из формы/manifest.
serial = QSerialPort(); serial.setPortName(self.port); serial.setBaudRate(468750 if self.enter else self.baud) # Штатный Monitor ИБП работает на 468750 бит/с (MONITOR_BRR=9, LSPCLK=37,5 МГц); при ручном входе сразу используется скорость загрузчика из manifest.
serial.setDataBits(QSerialPort.DataBits.Data8); serial.setParity(QSerialPort.Parity.NoParity); serial.setStopBits(QSerialPort.StopBits.OneStop); serial.setFlowControl(QSerialPort.FlowControl.NoFlowControl) # TI SCI Boot и первичный загрузчик UlitCo используют 8N1 без аппаратного управления потоком.
if not serial.open(QIODevice.OpenModeFlag.ReadWrite): raise OSError(serial.errorString()) # Занятый терминалом порт не открывается вторым владельцем.
serial.clear() # Старые данные терминала не должны стать ложным эхо autobaud.
if self.enter: # Приложение UlitCo принимает переход в загрузчик лишь в разрешённом остановленном состоянии.
self.progress.emit(0, "Переход UlitCo в первичный загрузчик…") # Показывает отдельный этап до передачи RAM-ядра.
self._write(serial, ulitco_enter()); self._pause(500); serial.clear() # Штатная команда Monitor №93 не подменяется BIOS ПМ35.
self._write(serial, ulitco_enter()); self._pause(500) # Отправляет проверенную команду Monitor №93 на скорости приложения и даёт штатному SCI-приёмнику 500 мс на подготовку autobaud.
if not serial.setBaudRate(self.baud): raise OSError("Не удалось переключить COM на скорость загрузчика SCI") # Только после выхода из приложения включает скорость RAM-ядра из manifest; отказ запрещает дальнейшую передачу.
serial.clear() # Остатки ответов Monitor не должны стать ложным эхом нового autobaud.
while True: # Порядок обменов полностью определяется общим C-автоматом.
self._cancelled(); state, tx, expected, delay = session.next() # Порт не вычисляет пакетные поля или checksum.
if state == 0: break # Подтверждённые порции и отправленный терминатор завершили поток.
+1 -1
View File
@@ -48,4 +48,4 @@ def test_ascii_decode_memory_ranges_and_monitor_command(): # Проверяет
with pytest.raises(ValueError): decode(ascii_image[:-2]) # Усечённый ETX не должен оставить частично декодированное ядро.
with pytest.raises(ValueError): validate(sci8(0x33FFF8, [0x1234])) # Область CSM-паролей запрещена независимо от имени файла.
with pytest.raises(ValueError): validate(sci8(0x8000, [0x1234])) # RAM-образ не может стать Flash-приложением из-за выбранного loader.
assert ulitco_enter() == bytes([247, 213, 255, 93, 0, 0, 1, 0, 0, 0]) # Эталон совпадает с десятиоктетным Monitor-запросом FLASH_NUM=93 текущей прошивки UlitCo.
assert ulitco_enter() == bytes([247, 213, 255, 93, 0, 0, 1, 0, 93, 1]) # Эталон совпадает с десятиоктетным Monitor-запросом FLASH_NUM=93 текущей прошивки UlitCo.