Регистры 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_DETECTOR | 0x4015 8000 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| GLITCH_DETECTOR_ARM | 0x00 | Принудительный взвод детекторов | 0x0000 5BAD |
| GLITCH_DETECTOR_DISARM | 0x04 | Принудительное снятие взвода, заданного в OTP; не действует, если взвёл ARM | 0x0000 0000 |
| GLITCH_DETECTOR_SENSITIVITY | 0x08 | Чувствительность детекторов вместо значений из OTP | 0x0000 0000 |
| GLITCH_DETECTOR_LOCK | 0x0C | Блокировка: ненулевое значение запрещает запись в ARM, DISARM, SENSITIVITY и LOCK | 0x0000 0000 |
| GLITCH_DETECTOR_TRIG_STATUS | 0x10 | Какие детекторы сработали | 0x0000 0000 |
| GLITCH_DETECTOR_TRIG_FORCE | 0x14 | Имитация срабатывания: единицы ставят флаги в TRIG_STATUS, а при взведённом блоке сразу сбрасывают чип | 0x0000 0000 |
GLITCH_DETECTOR_ARM — принудительный взвод детекторов
Смещение 0x00, адрес 0x4015 8000, после сброса 0x0000 5BAD, чтение и запись. Макросы pico-sdk: GLITCH_DETECTOR_ARM_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
| Значение | Имя в pico-sdk | Что значит |
|---|---|---|
| 0x5BAD | no | Не взводить принудительно |
| 0x0 | yes | Взвести; так действует любое значение, кроме 0x5BAD |
GLITCH_DETECTOR_DISARM — принудительное снятие взвода, заданного в OTP; не действует, если взвёл ARM
Смещение 0x04, адрес 0x4015 8004, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: GLITCH_DETECTOR_DISARM_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
| Значение | Имя в pico-sdk | Что значит |
|---|---|---|
| 0x0 | no | Не снимать взвод; так действует любое значение, кроме 0xDCAF |
| 0xDCAF | yes | Снять взвод детекторов |
GLITCH_DETECTOR_SENSITIVITY — чувствительность детекторов вместо значений из OTP
Смещение 0x08, адрес 0x4015 8008, после сброса 0x0000 0000. Макросы pico-sdk: GLITCH_DETECTOR_SENSITIVITY_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| DEFAULT | — | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DET3_INV | DET2_INV | DET1_INV | DET0_INV | DET3 | DET2 | DET1 | DET0 | ||||||||
- DEFAULT (биты 31:24, чтение и запись, после сброса 0x00) — Откуда брать чувствительность: из OTP или из этого регистра.
Значение Имя в pico-sdk Что значит 0x0 yes Чувствительность из OTP; так действует любое значение, кроме 0xDE 0xDE no Чувствительность из полей этого регистра - 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_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DET3 | DET2 | DET1 | DET0 | |||||||||||
- 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 показывает, какой из четырёх детекторов сработал. Это помогает подобрать чувствительность каждого детектора.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 10.9.3: список регистров, назначение полей, тип доступа и значения после сброса
- Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause
Нашли ошибку в регистрах?
Другие регистры RP2350
- Все регистры RP2350Блоки периферии и базовые адреса
- SHA256 — ускоритель SHA-256SHA256_CSR, SHA256_WDATA, SHA256_SUMn
- TICKS — генераторы тиковTICKS_PROC0_CTRL, TICKS_PROC0_CYCLES, TICKS_PROC0_COUNT, TICKS_PROC1_CTRL, TICKS_PROC1_CYCLES, TICKS_PROC1_COUNT
- TRNG — генератор случайных чиселTRNG_RNG_IMR, TRNG_RNG_ISR, TRNG_RNG_ICR, TRNG_TRNG_CONFIG, TRNG_TRNG_VALID, TRNG_EHR_DATA0
- HSTX — быстрый последовательный выводHSTX_CTRL_CSR, HSTX_CTRL_BITn, HSTX_CTRL_EXPAND_SHIFT, HSTX_CTRL_EXPAND_TMDS
- HSTX_FIFO — FIFO быстрого выводаHSTX_FIFO_STAT, HSTX_FIFO_FIFO
- QMI — интерфейс QSPI-памятиQMI_DIRECT_CSR, QMI_DIRECT_TX, QMI_DIRECT_RX, QMI_M0_TIMING, QMI_M0_RFMT, QMI_M0_RCMD
- XIP_AUX — быстрый порт FIFO XIPXIP_AUX_STREAM, XIP_AUX_QMI_DIRECT_TX, XIP_AUX_QMI_DIRECT_RX
- BOOTRAM — регистры загрузочной памятиBOOTRAM_WRITE_ONCE0, BOOTRAM_WRITE_ONCE1, BOOTRAM_BOOTLOCK_STAT, BOOTRAM_BOOTLOCKn
- CORESIGHT_TRACE — FIFO трассировкиCORESIGHT_TRACE_CTRL_STATUS, CORESIGHT_TRACE_TRACE_CAPTURE_FIFO
- EPPB — регистры ядра от Raspberry PiM33_EPPB_NMI_MASK0, M33_EPPB_NMI_MASK1, M33_EPPB_SLEEPCTRL
- OTP — однократно программируемая памятьOTP_SW_LOCKn, OTP_SBPI_INSTR, OTP_SBPI_WDATA_0, OTP_SBPI_WDATA_1, OTP_SBPI_WDATA_2, OTP_SBPI_WDATA_3
- POWMAN — менеджер питанияPOWMAN_BADPASSWD, POWMAN_VREG_CTRL, POWMAN_VREG_STS, POWMAN_VREG, POWMAN_VREG_LP_ENTRY, POWMAN_VREG_LP_EXIT
- ACCESSCTRL — права доступа к шинеACCESSCTRL_LOCK, ACCESSCTRL_FORCE_CORE_NS, ACCESSCTRL_CFGRESET, ACCESSCTRL_GPIO_NSMASK0, ACCESSCTRL_GPIO_NSMASK1, ACCESSCTRL_ROM
- TIMER — системные таймерыTIMER_TIMEHW, TIMER_TIMELW, TIMER_TIMEHR, TIMER_TIMELR, TIMER_ALARMn, TIMER_ARMED
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR
- PWM — широтно-импульсная модуляцияPWM_CHn_CSR, PWM_CHn_DIV, PWM_CHn_CTR, PWM_CHn_CC, PWM_CHn_TOP, PWM_EN
- XOSC — кварцевый генераторXOSC_CTRL, XOSC_STATUS, XOSC_DORMANT, XOSC_STARTUP, XOSC_COUNT
- PLL — умножители частотыPLL_CS, PLL_PWR, PLL_FBDIV_INT, PLL_PRIM, PLL_INTR, PLL_INTE
- PADS_BANK0 — электрические настройки GPIOPADS_BANK0_VOLTAGE_SELECT, PADS_BANK0_GPIOn, PADS_BANK0_SWCLK, PADS_BANK0_SWD
- PADS_QSPI — электрические настройки выводов QSPIPADS_QSPI_VOLTAGE_SELECT, PADS_QSPI_GPIO_QSPI_SCLK, PADS_QSPI_GPIO_QSPI_SD0, PADS_QSPI_GPIO_QSPI_SD1, PADS_QSPI_GPIO_QSPI_SD2, PADS_QSPI_GPIO_QSPI_SD3
- RESETS — сброс подсистемRESETS_RESET, RESETS_WDSEL, RESETS_RESET_DONE
- PSM — автомат включения питанияPSM_FRCE_ON, PSM_FRCE_OFF, PSM_WDSEL, PSM_DONE
- SYSINFO — сведения о чипеSYSINFO_CHIP_ID, SYSINFO_PACKAGE_SEL, SYSINFO_PLATFORM, SYSINFO_GITREF_RP2350
- BUSCTRL — управление шинойBUSCTRL_BUS_PRIORITY, BUSCTRL_BUS_PRIORITY_ACK, BUSCTRL_PERFCTR_EN, BUSCTRL_PERFCTRn, BUSCTRL_PERFSELn
- ROSC — кольцевой генераторROSC_CTRL, ROSC_FREQA, ROSC_FREQB, ROSC_RANDOM, ROSC_DORMANT, ROSC_DIV
- SYSCFG — системные настройкиSYSCFG_PROC_CONFIG, SYSCFG_PROC_IN_SYNC_BYPASS, SYSCFG_PROC_IN_SYNC_BYPASS_HI, SYSCFG_DBGFORCE, SYSCFG_MEMPOWERDOWN, SYSCFG_AUXCTRL
- XIP_CTRL — кеш выполнения из флеш-памятиXIP_CTRL, XIP_STAT, XIP_CTR_HIT, XIP_CTR_ACC, XIP_STREAM_ADDR, XIP_STREAM_CTR
- USB — контроллер USBUSB_ADDR_ENDP, USB_ADDR_ENDPn, USB_MAIN_CTRL, USB_SOF_WR, USB_SOF_RD, USB_SIE_CTRL
- PIO — программируемый ввод-выводPIO_CTRL, PIO_FSTAT, PIO_FDEBUG, PIO_FLEVEL, PIO_TXFn, PIO_RXFn
- DMA — прямой доступ к памятиDMA_CHn_READ_ADDR, DMA_CHn_WRITE_ADDR, DMA_CHn_TRANS_COUNT, DMA_CHn_CTRL_TRIG, DMA_CHn_AL1_CTRL, DMA_CHn_AL1_READ_ADDR
- SIO — однотактный ввод-вывод ядерSIO_CPUID, SIO_GPIO_IN, SIO_GPIO_HI_IN, SIO_GPIO_OUT, SIO_GPIO_HI_OUT, SIO_GPIO_OUT_SET
- CLOCKS — тактированиеCLOCKS_CLK_GPOUT0_CTRL, CLOCKS_CLK_GPOUTn_DIV, CLOCKS_CLK_GPOUTn_SELECTED, CLOCKS_CLK_GPOUT1_CTRL, CLOCKS_CLK_GPOUT2_CTRL, CLOCKS_CLK_GPOUT3_CTRL
- IO_BANK0 — мультиплексор GPIOIO_BANK0_GPIOn_STATUS, IO_BANK0_GPIOn_CTRL, IO_BANK0_IRQSUMMARY_PROC0_SECURE0, IO_BANK0_IRQSUMMARY_PROC0_SECURE1, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE0, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE1
- IO_QSPI — мультиплексор выводов QSPI и USBIO_QSPI_USBPHY_DP_STATUS, IO_QSPI_USBPHY_DP_CTRL, IO_QSPI_USBPHY_DM_STATUS, IO_QSPI_USBPHY_DM_CTRL, IO_QSPI_GPIO_QSPI_SCLK_STATUS, IO_QSPI_GPIO_QSPI_SCLK_CTRL
- M33 — системные регистры Cortex-M33M33_ITM_STIMn, M33_ITM_TER0, M33_ITM_TPR, M33_ITM_TCR, M33_INT_ATREADY, M33_INT_ATVALID
Статьи и термины
- Детектор пониженного питанияBrown-out detector: сброс МК при просадке питания
- OTP-памятьОднократно программируемая память: ключи, настройки, необратимые биты
- Безопасная загрузкаЗапуск только подписанной прошивки: подпись, ключи в OTP, откат версий
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи