Перейти к основному содержимому

mp.backend — 20 функций

Все блокирующие операции возвращают ok: bool, err: string.

local ok, err = mp.backend.connect()
if not ok then mp.log.error(err); return end

Стандартные операции

ФункцияВозвратОписание
connect()ok, errПодключение к таргету с текущим конфигом
read()ok, errЧтение памяти таргета в буфер
write()ok, errЗапись буфера в таргет (с blank check)
verify()ok, errВерификация таргета против буфера
erase()ok, errСтирание таргета (mass erase где доступно)
flash()ok, errПолный цикл: connect → erase → write → verify
connect_timeout(ms)ok, errconnect() с явным таймаутом
read_timeout(ms)ok, errread() с явным таймаутом
write_timeout(ms)ok, errwrite() с явным таймаутом

Расширенные операции (на момент написания — только TGSN)

ФункцияВозвратОписание
write_no_blank()ok, errЗапись без blank check (опирается на NOR-семантику)
blank_check()ok, errОтдельный blank check; ok=false называет первый не-пустой блок
erase_blocks()ok, errПоблочное стирание, никогда не mass
read_checksums()blocks|nil, errЧип-чексуммы по блокам / субблокам (см. ниже)

Бэкенды без поддержки этих операций возвращают явную ошибку "Not Supported: …", не зависают.

write_no_blank()

Пишет буфер в таргет минуя хостовый blank check. Полезно когда нужно несколько последовательных записей в один блок без erase между ними. Опирается на NOR-семантику: биты можно менять только 1→0. Попытка вернуть бит 0→1 на ячейке провалится молча — последующий verify() это покажет.

blank_check()

Возвращает ok=true если все блоки региона пусты (0xFF), иначе ok=false, err называет первый не-пустой блок.

erase_blocks()

Всегда поблочное стирание через команду стирания области, никогда не mass erase. Для семейств где стандартный erase() использует mass erase для скорости (например NEC 78K0/Kx2), erase_blocks() гарантирует, что стирается только память текущего региона — остальной flash остаётся нетронутым.

local ok, err = mp.backend.connect() if not ok then mp.log.error(err); return end
ok, err = mp.backend.erase_blocks() if not ok then mp.log.error(err); return end
ok, err = mp.backend.blank_check() -- ok=true, регион пуст

ok, err = mp.backend.write_no_blank() if not ok then mp.log.error(err); return end
ok, err = mp.backend.blank_check() -- ok=false, err: "Block N not blanked"

mp.memory.write_at("Code Flash", 0x400, {0x00})
ok, err = mp.backend.write_no_blank() -- 0xFF → 0x00 — валидный 1→0 переход
предупреждение

write_no_blank() обходит защитную проверку. Запись 1 поверх 0 технически выполнится, но реальное состояние flash останется 0 — последующий verify() или read() это покажет. Не используйте, если не уверены в семантике NOR.

read_checksums() — чип-чексуммы

Возвращает чексуммы, рассчитанные самим чипом для каждого блока и субблока всех регионов. Те же значения, что показывает диалог Renesas Checksum, но в виде структурированных данных. В отличие от mp.checksum.* (хост-сторона буфера), здесь данные приходят прямо от flash-контроллера — и для семейств с ECC включают вклад скрытых ECC-байт, недоступных через read().

local blocks, err = mp.backend.read_checksums()
if not blocks then mp.log.error(err); return end

for _, b in ipairs(blocks) do
mp.log.infof("block %d base=0x%04X subs=%04X %04X %04X %04X",
b.block_n, b.base_checksum,
b.sub_checksums[1], b.sub_checksums[2],
b.sub_checksums[3], b.sub_checksums[4])
end

Каждый элемент — таблица {block_n, base_checksum, sub_checksums[]}.

Состояние и информация

ФункцияВозвратОписание
is_connected()boolТекущий статус подключения
get_target_info()table{name, additional[]}
get_programmer_info()table{name, serial, connected, type} для текущего выбранного программатора
get_programmers()tableМассив всех программаторов из probe-scan. serial может быть пуст для устройств, не отдающих SN на этапе probe
get_progress()table{progress, speed, title, msg} — последний снимок прогресса

Питание

ФункцияВозвратОписание
power_on()voidУстановить VDD = 3.3 В
power_on_5v()voidУстановить VDD = 5 В
power_off()voidVDD выкл
power_toggle()voidПереключить
set_power(v)void"3v3" | "5v" | "off"