Перейти к основному содержимому

Виды защит 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.

Если вектор сброса (0FFFCh0FFFEh) равен 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:

БитИмяЗначение
b2ROMCR1 = бит ROMCP1 действует
b3ROMCP10 = 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-мана)

Присланный IDID в МКROM code protectРезультат
ALeRASEне ALeRASEвыключенForced erase — user ROM стёрт
ALeRASEне ALeRASEвключёнID-проверка → mismatch, стирания нет
ALeRASEALeRASEлюбойForced erase — user ROM стёрт
не ALeRASEALeRASEID-проверка → 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 или новее.