Решение на самом деле концептуально довольно просто. Загрузчик по своей природе предназначен для загрузки новых прошивок на устройство. Поэтому он будет содержать хотя бы одну инструкцию spm. Поскольку регистр конфигурации spm должен быть записан не более чем за 4 цикла до инструкции spm, это означает, что на практике практически не встречаются последовательности: только последовательности sts, spm или out, spm. Итак, все, что вам нужно, это найти последовательность в разделе загрузчика; установить правильные регистры и вызвать его.
Однако оказалось, что с этим тоже была серьезная проблема. Инструкции spm загрузчика самопрограммирующегося загрузчика V-USB - это не простая рутинная процедура, а встроенный в основной код; так что его вызов вызовет сбой AVR, когда он попытается выполнить остальную часть загрузчика V-USB.
Противно, но опять же есть решение. Используя таймер, работающий на частоте ЦП (что легко на AVR), вы можете создать подпрограмму в ассемблере, которая устанавливает регистры для последовательности out, spm загрузчика; вызывает его и как раз в тот момент, когда выполняется первый цикл самого spm, прерывание по таймеру отключается, и AVR должен перейти к вашей процедуре прерывания (в пространстве приложения). Подпрограмма прерывания извлекает адрес загрузчика и затем возвращается к предыдущему коду - это подпрограмма, которая устанавливает последовательность out, spm. Это должно работать, потому что когда вы применяете инструкции spm к разделу загрузчика, ЦП останавливается до тех пор, пока он не завершится.
Таким образом, в основном, вы можете заняться каким-то интересным программированием и заставить загрузчик работать самостоятельно, делая MCU бесполезным без специального программиста.