uriy 5 17 августа, 2022 Опубликовано 17 августа, 2022 · Жалоба Портировал программу под GD32F303 из STM32L151. Прошивал прямо из кейл, вроде все отлично работает. Дошли до производства, возник вопрос с защитой от чтения. Для STM использовали ST-Link и ставили там ROP Level 1. На производстве попробовали зашить через ST-Link говорят получилось, но плата не подает признаков жизни и сейчас ее не удается стереть, хотя JTAG соединяется. Далее попробовали зашить через JFlash с выбором процессора GD32F303 в таком режиме не активен пункт Target->Manual Programming->Secure chip. Соответственно защиты от чтения нет, плата работает, проц можем снова стереть и записать. Затем попробовал в JFlash выбрать STM32F303, зашил и установил защиту от чтения Target->Manual Programming->Secure chip. Плата не работает, стереть чип больше не могу, но JTAG соединяется. Сейчас имею три процессора, через jlink commander могу считать регистре 0x1FFF F800 две платы выдают значение 0xFFFFFFFF, а одна выдает 0x FFFF55AA. Видел вот это https://wiki.segger.com/STM32#cite_note-1, пробовал без изменений. Сравнил биты вроде все логично по командам exit steps, но защита от чтения не появляется. Поэтому вопрос чем шьете гигадевайсы и как ставите защиту от чтения? Кстати в GD32F303 судя по ref man нет аналога ROP Level 2 приводящего к невозвратной блокировке чтения. Поэтому надеюсь эти процы тоже можно вернуть к жизни. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 128 17 августа, 2022 Опубликовано 17 августа, 2022 · Жалоба Использовал GD32F100, защиту выставляю своим загрузчиком по команде в зашифрованном образе прошивки (программа одна и та же, что для STM, что для GD32, единственное - пришлось вставить __DSB() между записью ключей в OPTKEYR и проверкой OPTWRE). После выставления защиты у меня отправка подтверждения и бесконечный цикл со сбросом по сторожевой собаке. Наблюдал проблему, что при подключенном отладчике (SWD, ST-link + OpenOCD) после выставления защиты и сброса по собаке программа не выполняется, куда его уносит непонятно (защита-то включена). И вывести его из этого состояния можно было только передергиванием питания - после передергивания питания программа работала штатно, отладчиком можно подключиться и снять защиту. Если отладчик не подключать - тоже все работает штатно (устанавливается защита, собака сбрасывает, программа начинает работать с начала). Потратил часа два, пока догадался отключить отладчик, глубже копать не стал - изделие старое, доработок не планируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 17 августа, 2022 Опубликовано 17 августа, 2022 · Жалоба Странные дела. Тоже попробовал сделать защиту от чтения внутри исходников. Работает! Как вы писали сразу добавил __DSB() . Но я бы эту процедуру лучше вынес из исходников. Уверен что при отладке закомментирую и забуду. Пободаюсь еще с JLink. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 18 августа, 2022 Опубликовано 18 августа, 2022 · Жалоба С JFlash ничего не вышло. Либо защита от чтения не устанавливается, либо код в процессоре не работает и я не могу стереть флешку через JFlash, он вылетает по таймауту. Засунул такой код в бут, использовал SPL с сайта гигадевайса, внутри функций все кажется логичным. fmc_unlock(); fmc_flag_clear(FMC_INT_FLAG_BANK0_PGERR); fmc_flag_clear(FMC_INT_FLAG_BANK0_WPERR); fmc_flag_clear(FMC_INT_FLAG_BANK0_END); fmc_flag_clear(FMC_INT_FLAG_BANK1_PGERR); fmc_flag_clear(FMC_INT_FLAG_BANK1_WPERR); fmc_flag_clear(FMC_INT_FLAG_BANK1_END); if((OB_SPC & 0xFF) == FMC_NSPC) { fmc_state_enum state; WARNING("OB_SPC = 0x%04X no read protection!", OB_SPC); ob_unlock(); __DSB(); state = ob_security_protection_config(FMC_USPC); if(state == FMC_READY) INFO("Must be protected on next reboot"); else ERROR("Read protect error!"); ob_lock(); } else { INFO("OB_SPC = 0x%04X read protected", OB_SPC); } fmc_lock(); По логам отрабатывает как надо, но оказывается стереть после этого флешку тоже не удается. И при подключении лоченной STM JFlash сразу выдает сообщение о том что видит залоченную флешку. С гигадевайсом нет такого сообщения. Он просто не может считать данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 47 18 августа, 2022 Опубликовано 18 августа, 2022 · Жалоба 49 минут назад, uriy сказал: По логам отрабатывает как надо, но оказывается стереть после этого флешку тоже не удается. Reset на SWD подключен ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 18 августа, 2022 Опубликовано 18 августа, 2022 · Жалоба Нет RESET не подключен. Не думаю что в это дело, у меня же соединение устанавливается. Но попробовал соединить, изменений нет. Осцилом проверил что ресет формируется. Вот такие логи JFlash после нажатия F7 (Production programming). Это рабочий процессор, залоченный исходниками в буте. Средствами бута прошить могу, JTAGом не могу. Auto programming target (20460 bytes, 1 range) ... - Connecting ... - Connecting via USB to probe/ programmer device 0 - Probe/ Programmer firmware: J-Link V9 compiled Jan 11 2038 11:06:30 - Device "GD32F303RC" selected. - Target interface speed: 4000 kHz (Fixed) - VTarget = 3.303V - Found SW-DP with ID 0x2BA01477 - Unknown DP version. Assuming DPv0 - Scanning AP map to find all available APs - AP[1]: Stopped AP scan as end of AP map has been reached - AP[0]: AHB-AP (IDR: 0x24770011) - Iterating through AP map to find AHB-AP to use - AP[0]: Core found - AP[0]: AHB-AP ROM base: 0xE00FF000 - CPUID register: 0x410FC241. Implementer code: 0x41 (ARM) - Found Cortex-M4 r0p1, Little endian. - FPUnit: 6 code (BP) slots and 2 literal slots - CoreSight components: - ROMTbl[0] @ E00FF000 - ROMTbl[0][0]: E000E000, CID: B105E00D, PID: 000BB00C SCS-M7 - ROMTbl[0][1]: E0001000, CID: B105E00D, PID: 003BB002 DWT - ROMTbl[0][2]: E0002000, CID: B105E00D, PID: 002BB003 FPB - ROMTbl[0][3]: E0000000, CID: B105E00D, PID: 003BB001 ITM - ROMTbl[0][4]: E0040000, CID: B105900D, PID: 000BB9A1 TPIU - ROMTbl[0][5]: E0041000, CID: 00000000, PID: 00000000 ??? - Executing init sequence ... - Executing Reset (0, 0 ms) - Reset: Halt core after reset via DEMCR.VC_CORERESET. - Reset: Reset device via AIRCR.SYSRESETREQ. - Initialized successfully - Target interface speed: 4000 kHz (Fixed) - Found 1 JTAG device. Core ID: 0x2BA01477 (None) - Connected successfully - Checking if selected data fits into selected flash sectors. - Start of preparing flash programming - End of preparing flash programming - Start of determining dirty areas in flash cache - End of determining dirty areas - CPU speed could not be measured. - Start of erasing sectors - Blank checking 0x08000000 - 0x08004FFF - ERROR: Timeout while blank checking, RAMCode did not respond in time. (PC = 0xF3229AA3, CPSR = 0x40006C04, LR = 0x01000000)! - ERROR: Failed to blank checking. Failed to execute RAMCode for blank check! - ERROR: Error while blank checking. - Erasing range 0x08000000 - 0x08004FFF ( 10 Sectors, 20 KB) - ERROR: Failed to erase sectors 0 @ address 0x08000000 ((erase error)) - ERROR: Failed to erase sectors. - End of erasing sectors - ERROR: Erase failed - Start of restoring - End of restoring - ERROR: Failed to auto program target Disconnecting ... - Disconnected И вот эти адреса читаются через командер J-Link>mem32 0x1ffff800,4 1FFFF800 = FFFF44BB FFFFFFFF FFFFFFFF FFFFFFFF J-Link>mem32 0x40022000, 32 40022000 = 00000030 00000000 00000000 00000000 40022010 = 00000000 00000000 00000000 03FFFFFE 40022020 = FFFFFFFF 00000000 00000000 00000000 40022030 = 00000000 00000000 00000000 00000000 40022040 = 00000000 00000000 00000000 00000000 40022050 = 00000080 00000000 00000000 00000000 40022060 = 00000000 00000000 00000000 00000000 40022070 = 00000000 00000000 00000000 00000000 40022080 = 00000000 00000100 00000000 00000000 40022090 = 00000000 00000000 00000000 00000000 400220A0 = 00000000 00000000 00000000 00000000 400220B0 = 00000000 00000000 00000000 00000000 400220C0 = 00000000 00000000 J-Link>mem32 0x08000000, 32 Could not read memory. J-Link> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 18 августа, 2022 Опубликовано 18 августа, 2022 · Жалоба Смог стереть процессоры где программа не выполнялась и JTAG не мог стереть. Использовал UART с программой GigaDevice MCU ISP Programmer Она увидела что процессор залочен, но сказала что защиту снять не может. Однако после передергивания питания защиты нет и JTAG работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 19 августа, 2022 Опубликовано 19 августа, 2022 · Жалоба Оказывается у гигадевайс есть еще свой JTAG программатор GDLink. Софтина судя по всему работает через CMSIS-DAP. У segger есть в новостях что они тоже поддерживают https://www.segger.com/news/segger-j-link-now-supports-cmsis-dap/ Значит их софтина должна работать с JLink в том числе. У меня только китайские JLink V8 и V9. При выборе в KEIL для них CMSIS-DAP отладчик не виден. Попался еще CMSIS-DAP для BluePill https://github.com/xjtuecho/CMSIS-DAP Может кто-то уже пробовал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 6 мая, 2023 Опубликовано 6 мая, 2023 · Жалоба Привет! А подскажите как стереть залоченый GD32E230 имея на руках старый китайский J-LINK или CMSIS-DAP для BlackPill ? Проц виден, пока не залочишь шьётся и отлаживается, но вот EraseAll не работает. Может я залочил его через чур? if(OB_OBSTAT_PLEVEL_NO == ob_obstat_plevel_get()) { fmc_unlock(); ob_unlock(); __DSB(); ob_erase(); ob_security_protection_config(FMC_LSPC); ob_lock(); fmc_lock(); ob_reset(); } Вроде как FMC_LSPC - Low Security Protection Code, я так понимаю стирабельный.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 6 мая, 2023 Опубликовано 6 мая, 2023 · Жалоба Использую GD32E103 и ST-Link/v2. Защиту устанавливает загрузчик. Снимаю защиту так [$(PG)=ST-LINK_CLI.exe]: unlock: $(PG) -c -w32 0x40022004 0x45670123 -w32 0x40022004 0xCDEF89AB -w32 0x40022008 0x45670123 -w32 0x40022008 0xCDEF89AB -w32 0x40022010 0x00000220 \ -w32 0x40022010 0x00000260 -w32 0x40022010 0x00000200 -w32 0x40022010 0x00000210 -w32 0x1ffff800 0xFFFF00A5 -w32 0x40022010 0x00000200 Программа местами поругивается, но снятию защиты это не мешает. Правда, если ноги SWD переопределены, то предварительно нужно зайти в заводской загрузчик (BOOT+RESET). PS. От GD-Link отказался, т.к. не знаю как на нем обновить прошивку и включить управление выходом RESET. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 7 мая, 2023 Опубликовано 7 мая, 2023 · Жалоба Спасибо за наводку. Я так понял инициализация переферии и в последствии запись в Option Bytes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться