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 с чем-то кГц.

[Грозный JLink]

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.
/ * и всё */


И всё. Пока всё. Может когда-нибудь его удасться оживить, но не сейчас.
Сейчас его выкидываем и берем новую плату.

А в чем проблема? Правильно. Читайте документацию - там же ведь всё написано.
И если всю таблицу векторов прописать - то как раз ровно прям на этот адерс и попадаем. Аккуратно прописываем ключики и оп! Всё работает и никакой магии!

[Кусочек startup-файла]

/* interrupt vectors */
.section  .isr_vectors, "ax"
int_vectors:
.word  SRAM_STACK_TOP
.word  Reset_Handler
.word  NMI_Handler
.word  HardFault_Handler
.word  MemManage_Handler
.word  BusFault_Handler
.word  UsageFault_Handler
.word  0
.word  0
.word  0
.word  0
.word  SVC_Handler
.word  DebugMon_Handler
.word  0
.word  PendSV_Handler
.word  SysTick_Handler
.rept IRQ_VECTORS_COUNT
  .word  irq_handler
.endr
.syntax unified
.cpu cortex-m4
.thumb
.section  .flashconfig, "ax"
.word FLASH_IRC_TRIM
.word FLASH_BACKDOOR1
.word FLASH_BACKDOOR2
.word FLASH_FPROT
.byte FLASH_FSEC
.byte FLASH_FOPT
.byte 0xFF
.byte 0xFF
 .section  .reset, "ax" /* reset function logic */


[Кусочек линкера]

SECTIONS
{
.text :
{
KEEP(*(.isr_vectors));
KEEP(*(.flashconfig));
KEEP(*(.reset));
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata.* .gnu.linkonce.r.*)
. = ALIGN(4);
_etext = .;
} > FLASH
_end = . ;
}


Плата кстати у Freescale очень красивая:

косячок, программирование, shel, roma_jam

Previous post Next post
Up