Исправить вход UlitCo в SCI через Monitor
Передавать контрольную сумму команды перехода в загрузчик. Отправлять Monitor на 468750 бод и затем включать скорость SCI из JSON. Обновить эталонные проверки входа в загрузчик.
This commit is contained in:
@@ -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 # Подтверждённые порции и отправленный терминатор завершили поток.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user