FLASH BACKDOOR или как лишиться микроконтроллера Kinetis K22
Jun 06, 2017 17:25
Возникла у меня тут в очередной раз задача написать бутлоадер. Только вот уже на другом контроллере, раньше были STM, теперь вот Kinetis.
И я подумал.....а что если написать основную часть одну на всех? Ну а в случае STM - новую прошивку брать по радио, а на Kinetis - через USB? Да, в целом-то, вообще не важно откуда её брать. Откуда хочешь.
И сел я за разработку бутлоадера. Так как он должен быть легковесным - то использовать всякие ОС не предоставляется возможным. Максимальный размер - 8 КБ.
Дай, думаю, на STM32L072 все запущу. У меня и плата демонстрационная есть. С программатором. Сел, всё настроил - проект, собрал прошивку, настроил отладку....ну как же, ничего нет: ОС нет, наработок нет - а бутлоадер писать надо. Без отладки - никак. Но оп, на плате STM32F072B - DISCO отладчика не нашел. На плате STM32VLDISCOVERY отладчик есть, к нему коннект проходит от GDB, а вот с 072 - нет. Ну ладно, думаю, поздно уже, потом что-нибудь придумаю.
А потом пришел Kinetis. Тут все уже хорошо, хотя конечно с отладкой пришлось повозиться знатно. Для отладки - плата LPC-Link2 с прошивкой Segger JLink. А целевой процесор - просто на демо плате самостоятельной разработки.
Ну и начал. А процессор K22 - Cortex-M4.
Думаю, ну вот зачем мне в бутлоадере вся таблица векторов аж в 239 штук! Вот мне вот жалко этот килобайт. Пригодится. Всё равно сам всё буду делать. Ну и оставил только вершину стека и Reset Handler в начале прошивки. А дальше всё, уже свой код.
И всё было хорошо, пока мой размер прошивки не стал больше 1020 байт.
Просто так вот разработчики Kinetis сделали, что во FLASH памяти, начиная с адреса 0x400 лежит всякая разная информация по поводу работы с FLASH-памятью и прочее. Её не много - всего 12 байт. И есть там такие байты как BACKDOOR_KEY1 и BACKDOOR_KEY2, при предъявлении который можно открыть память на запись. Есть и 32 бита запрета записи FLASH памяти с точностью до сектора размером 2KB. И вот как только моя прошивка стала налезать на этот адрес - я радостно и закрыл свой FLASH на запись при прошивке на какие-то рэндомные ключи.
Ну да ладно, не проблема. Бинарник есть - можно посмотреть ключики и открыть ее. Благо JLink так умеет.
Но не это самое главное. Самое главное то, что пока я разбирался почему же так - я второй раз попал на запись по этому адресу. А программатор тоже не глупый - он мне и говорит, мол, "Вы закрываете FLASH память. Правда ваш проц этого не поддерживает, поэтому будут выставлены значения по умолчанию". И одна кнопка такая "ОК". Без вариантов.
Ну, в прошлый раз я её нажал и потом долго возился с тем, что бы сделать анлок на процессор. Думаю "Хм. А я вот сейчас такой с процессора питание сниму, и нажму кнопку ок". И ничего не запишется. Ну и вытащил плату из USB.
И правда, ничего не записалось. Только вот процессор теперь больше не Cortex-M4, а хрен знает что. Программатор не видит. Ядро работает на кокой-то непонятной частоте в 2 с чем-то кГц.
Info: Device "MK22FN256XXX12" selected. DLL version V5.00c, compiled Jun 11 2015 11:40:27 Firmware: J-Link LPCXpresso V2 compiled Jan 28 2015 16:43:37 Hardware: V1.00 S/N: 000000000 Emulator has Trace capability VTarget = 3.300V Info: Found SWD-DP with ID 0x2BA01477 /* вот тут он говорит, что нашел что-то похожее на микроконтроллер...*/
/* а дальше такой */
****** Error: Kinetis (connect): Timeout while halting CPU. CPU does not stop. ****** Error: Error while identifying Cortex-M core. / * и всё */
И всё. Пока всё. Может когда-нибудь его удасться оживить, но не сейчас. Сейчас его выкидываем и берем новую плату.
А в чем проблема? Правильно. Читайте документацию - там же ведь всё написано. И если всю таблицу векторов прописать - то как раз ровно прям на этот адерс и попадаем. Аккуратно прописываем ключики и оп! Всё работает и никакой магии!