Виды защит R8C
У МК семейства R8C есть несколько независимых механизмов защиты, на которые можно наткнуться в standard serial I/O mode (режим, который использует TGSN). Их легко перепутать, но ведут они себя совершенно по-разному — и именно от того, в каком состоянии МК, зависит, можно ли его восстановить. Здесь разобран каждый механизм и что при этом показывает MultiProg.
Основано на наших исследованиях и HW Manual.
1. Проверка ID-кода (блокировка по ID)
Обычная блокировка. В МК во flash по фиксированным адресам хранится 7-байтный
ID-код (0FFDFh, 0FFE3h, 0FFEBh, 0FFEFh, 0FFF3h, 0FFF7h, 0FFFBh). В serial
I/O mode загрузчик сверяет присланный ID с записанным:
- совпал → команды (чтение / запись / стирание) принимаются;
- не совпал → команды не подтверждаются → MultiProg показывает «R8C locked by ID».
МК при этом отвечает (можно подключиться, прочитать версию загрузчика) — просто отказывает в операциях, пока не введён правильный ID.
Если вектор сброса (
0FFFCh–0FFFEh) равенFFFFFFh, ID не проверяется и все команды принимаются (непрошитый / чистый МК).
Восстановление: ввести правильный ID, либо — если ID неизвестен — попробовать Forced Erase.
2. Forced Erase — зарезервированный ID ALeRASE
Аварийный способ доступа к залоченному по ID МК, ID ко торого неизвестен. Если
прислать зарезервированное слово ALeRASE, загрузчик сам полностью сотрёт user
ROM, после чего МК становится чистым и снова доступным (данные теряются — это
«разблокировка через стирание»).
ALeRASE = 41 4C 65 52 41 53 45 ("A" "L" "e" "R" "A" "S" "E", регистр важен)
- Только поколение R8C/3xC (R8C/32C, 33C, 35C, 36A/36C/36M/36T-A, 38C, 38W·X·Y·Z, …). У старых R8C/1x и R8C/2x этой функции нет.
- Срабатывает не всегда — зависит от ROM code protect (см. §3 и таблицу ниже).
На МК с включённым ROM code protect
ALeRASEотклоняется.
3. ROM code protect (регистр OFS)
Отдельная от ID-лока защита. Живёт в двух битах регистра OFS по адресу flash
0FFFFh:
| Бит | Имя | Значение |
|---|---|---|
| b2 | ROMCR | 1 = бит ROMCP1 действует |
| b3 | ROMCP1 | 0 = ROM code protect ВКЛЮЧЁН · 1 = выключен |
- Включён =
ROMCR=1, ROMCP1=0. У чистого/стёртого МК OFS =FFh, т.е. protect выключен. - Это опционный байт, прошиваемый в составе пользовательской прошивки (напр.
.org 0FFFFhв программе) — его осознанно ставит тот, кто шил МК; сам он не включается. - В parallel I/O mode запрещает чтение / перезапись / стирание flash. В
standard serial I/O mode его эффект — гейт для Forced Erase: при
включённом ROM code protect и записанном ID, не равном
ALeRASE, присланныйALeRASEтрактуется как обычная (неуспешная) ID-проверка — стирания нет. - Снять его можно только стиранием блока OFS через CPU rewrite mode (т.е. самой работающей программой МК). МК, который одновременно залочен по ID и защищён ROM code protect, внешним программатором не снять.
Прочитать биты OFS, пока МК залочен по ID, нельзя — чтение flash (включая OFS
по 0FFFFh) требует сначала пройденной ID-проверки. Поэтому
единственный способ определить ROM code protect извне — по поведению: TGSN
шлёт ALeRASE, и если МК отвечает mismatch ID-проверки (биты 3,2 статуса
SR1) вместо запуска стирания — значит ROM code protect включён. MultiProg тогда
сообщает «ALeRASE refused: ROM code protect enabled» с сырыми байтами статуса.
4. Зарезервированное слово Protect
Другое зарезервированное слово, хранится в той же ID-области:
Protect = 50 72 6F 74 65 63 74 ("P" "r" "o" "t" "e" "c" "t")
Когда записанный ID равен Protect, загрузчик вообще не ведёт serial / OCD
связь — МК фактически «молчит» по serial, его нельзя ни прочитать, ни
перезаписать, ни стереть этим путём. ALeRASE тут не поможет (нет рабочего
serial-канала, чтобы его прислать). Если Protect сочетается с включённым ROM
code protect, МК не вытащить даже parallel-программатором.
TGSN также всегда отклоняет Protect как присылаемый ID — слать его нет
смысла.
Не путайте «Protect» и «ROM code protect».
Protect— это записанное ID-слово, которое убивает serial-связь (МК молчит). ROM code protect — это пара битов OFS: МК продолжает отвечать, но блокирует Forced Erase. МК, отвечающий mismatch'ем, — это ROM-code-protect, а неProtect-лок.
Условия Forced Erase (выжимка из Table 12.2 HW-мана)
| Присланный ID | ID в МК | ROM code protect | Результат |
|---|---|---|---|
ALeRASE | не ALeRASE | выключен | Forced erase — user ROM стёрт |
ALeRASE | не ALeRASE | включён | ID-проверка → mismatch, стирания нет |
ALeRASE | ALeRASE | любой | Forced erase — user ROM стёрт |
не ALeRASE | ALeRASE | — | ID-проверка → mismatch |
не ALeRASE | не ALeRASE | — | обычная ID-проверка |
(Для записанного слова Protect см. §4 — serial-связь отключена, ничего из
вышеперечисленного не применяется.)
Что восстанавливается через TGSN
| Состояние МК | Коннект? | Восстановимо по serial? |
|---|---|---|
| Залочен по ID, ROM protect выкл | да (locked) | Да — ALeRASE стирает и разлочивает |
| Залочен по ID, ROM protect вкл | да (locked) | Нет — ALeRASE отклонён; нужен правильный ID |
Записано слово Protect | нет (молчит) | Нет — serial отключён |
Чистый / вектор сброса FFFFFFh | да | n/a — уже открыт |
Защита от случайного стирания
При Special Read, если восстановленный из МК ID оказывается ALeRASE,
MultiProg откажется подставлять его обратно в разблокировку — поэтому операция
чтения никогда случайно не сотрёт МК. Forced Erase запускается только по ID,
введённому пользователем осознанно.
Прошивка
Обработка R8C Forced Erase (поток ALeRASE, защиты Protect / ROM code protect и
понятная диагностика статуса выше) требует прошивки TGSN 3.3.7 или новее.