Перейти к содержанию

Регистры GLITCH_DETECTOR RP2350

Регистры детектора сбоев RP2350: четыре цепи, которые замечают потерю запаса по времени в системном тактовом домене — например, при атаке на тактовую частоту или питание ядра — и сбрасывают чип, не давая программе работать в неопределённом состоянии.

Детектор сбоев следит за запасом времени установки и удержания в системном тактовом домене. Потерять его можно из-за умышленного вмешательства в тактовую частоту или напряжение ядра; взведённый детектор в ответ сбрасывает чип и реагирует за один такт системной частоты, тогда как детектор просадки питания гораздо медленнее (даташит RP2350, раздел 10.9).

Детекторов четыре, они разнесены по кристаллу. Каждый — пара триггеров, один из которых переключается через программируемую линию задержки от 75 до 120 % минимального периода системной частоты с шагом 15 %; при потере запаса триггеры расходятся. Начальную чувствительность задают флаги в OTP, регистр SENSITIVITY уточняет её для каждого детектора.

По умолчанию детектор выключен. Его взводит флаг GLITCH_DETECTOR_EN в OTP или регистр ARM, если в DISARM не записан код снятия. Срабатывание держит почти весь коммутируемый домен ядра в сбросе около 120 мкс и устанавливает флаг HAD_GLITCH_DETECT в регистре CHIP_RESET блока POWMAN. Регистры блока доступны только из защищённого режима, а ненулевое значение в LOCK запрещает их изменение.

ЭкземплярБазовый адрес
GLITCH_DETECTOR0x4015 8000

Регистры блока

РегистрСмещениеНазначениеПосле сброса
GLITCH_DETECTOR_ARM0x00Принудительный взвод детекторов0x0000 5BAD
GLITCH_DETECTOR_DISARM0x04Принудительное снятие взвода, заданного в OTP; не действует, если взвёл ARM0x0000 0000
GLITCH_DETECTOR_SENSITIVITY0x08Чувствительность детекторов вместо значений из OTP0x0000 0000
GLITCH_DETECTOR_LOCK0x0CБлокировка: ненулевое значение запрещает запись в ARM, DISARM, SENSITIVITY и LOCK0x0000 0000
GLITCH_DETECTOR_TRIG_STATUS0x10Какие детекторы сработали0x0000 0000
GLITCH_DETECTOR_TRIG_FORCE0x14Имитация срабатывания: единицы ставят флаги в TRIG_STATUS, а при взведённом блоке сразу сбрасывают чип0x0000 0000

GLITCH_DETECTOR_ARM — принудительный взвод детекторов

Смещение 0x00, адрес 0x4015 8000, после сброса 0x0000 5BAD, чтение и запись. Макросы pico-sdk: GLITCH_DETECTOR_ARM_…

Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.

ЗначениеИмя в pico-sdkЧто значит
0x5BADnoНе взводить принудительно
0x0yesВзвести; так действует любое значение, кроме 0x5BAD

GLITCH_DETECTOR_DISARM — принудительное снятие взвода, заданного в OTP; не действует, если взвёл ARM

Смещение 0x04, адрес 0x4015 8004, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: GLITCH_DETECTOR_DISARM_…

Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.

ЗначениеИмя в pico-sdkЧто значит
0x0noНе снимать взвод; так действует любое значение, кроме 0xDCAF
0xDCAFyesСнять взвод детекторов

GLITCH_DETECTOR_SENSITIVITY — чувствительность детекторов вместо значений из OTP

Смещение 0x08, адрес 0x4015 8008, после сброса 0x0000 0000. Макросы pico-sdk: GLITCH_DETECTOR_SENSITIVITY_…

31302928272625242322212019181716
DEFAULT—
1514131211109876543210
DET3_INVDET2_INVDET1_INVDET0_INVDET3DET2DET1DET0
  • DEFAULT (биты 31:24, чтение и запись, после сброса 0x00) — Откуда брать чувствительность: из OTP или из этого регистра.
    ЗначениеИмя в pico-sdkЧто значит
    0x0yesЧувствительность из OTP; так действует любое значение, кроме 0xDE
    0xDEnoЧувствительность из полей этого регистра
  • DETn_INV, n = 0…3 (биты 9:8, 11:10, 13:12, 15:14; чтение и запись, после сброса 0x0) — Должно быть инверсией DETn, иначе действует значение по умолчанию.
  • DETn, n = 0…3 (биты 1:0, 3:2, 5:4, 7:6; чтение и запись, после сброса 0x0) — Чувствительность детектора n: чем больше, тем чувствительнее.

GLITCH_DETECTOR_LOCK — блокировка: ненулевое значение запрещает запись в ARM, DISARM, SENSITIVITY и LOCK

Смещение 0x0C, адрес 0x4015 800C, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: GLITCH_DETECTOR_LOCK_…

Отдельных полей нет: значение занимает биты 7:0, остальные биты не используются.

GLITCH_DETECTOR_TRIG_STATUS — какие детекторы сработали

Смещение 0x10, адрес 0x4015 8010, после сброса 0x0000 0000. Макросы pico-sdk: GLITCH_DETECTOR_TRIG_STATUS_…

1514131211109876543210
—DET3DET2DET1DET0
  • DETn, n = 0…3 (биты 0, 1, 2, 3; сброс записью 1, после сброса 0x0) — Детектор n сработал; сбрасывается записью 1, но сразу встаёт снова, если детектор остаётся в отказе.

GLITCH_DETECTOR_TRIG_FORCE — имитация срабатывания: единицы ставят флаги в TRIG_STATUS, а при взведённом блоке сразу сбрасывают чип

Смещение 0x14, адрес 0x4015 8014, после сброса 0x0000 0000, сбрасывается сам. Макросы pico-sdk: GLITCH_DETECTOR_TRIG_FORCE_…

Отдельных полей нет: значение занимает биты 3:0, остальные биты не используются.

Частые вопросы

Как включить детектор сбоев RP2350?

Надёжный способ — запрограммировать флаг GLITCH_DETECTOR_EN в OTP: тогда детектор взводится при каждом запуске. Для отладки его взводят записью в ARM любого значения, кроме 0x5BAD, но в защищённых изделиях даташит так делать не советует: до этой записи система уязвима.

Как узнать, что RP2350 перезагрузил детектор сбоев?

После такого сброса в регистре CHIP_RESET блока POWMAN установлен флаг HAD_GLITCH_DETECT, а TRIG_STATUS показывает, какой из четырёх детекторов сработал. Это помогает подобрать чувствительность каждого детектора.

Источники

  1. Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 10.9.3: список регистров, назначение полей, тип доступа и значения после сброса
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?

Другие регистры RP2350

Статьи и термины