Регистры OTP RP2350
Регистры управления OTP в RP2350 — 8 КБ однократно программируемой памяти с идентификатором чипа, настройками защиты и ключами: блокировки страниц, программирование через мост SBPI, ключи доступа, критичные флаги, разрешение отладки и выбор архитектуры ядер.
Содержание
- Регистры блока
- OTP_SW_LOCKn
- OTP_SBPI_INSTR
- OTP_SBPI_WDATA_0
- OTP_SBPI_WDATA_1
- OTP_SBPI_WDATA_2
- OTP_SBPI_WDATA_3
- OTP_SBPI_RDATA_0
- OTP_SBPI_RDATA_1
- OTP_SBPI_RDATA_2
- OTP_SBPI_RDATA_3
- OTP_SBPI_STATUS
- OTP_USR
- OTP_DBG
- OTP_BIST
- OTP_CRT_KEY_W0
- OTP_CRT_KEY_W1
- OTP_CRT_KEY_W2
- OTP_CRT_KEY_W3
- OTP_CRITICAL
- OTP_KEY_VALID
- OTP_DEBUGEN
- OTP_DEBUGEN_LOCK
- OTP_ARCHSEL
- OTP_ARCHSEL_STATUS
- OTP_BOOTDIS
- OTP_INTR
- OTP_INTE
- OTP_INTF
- OTP_INTS
OTP RP2350 — 8 КБ однократно программируемой памяти: 4096 строк по 24 бита, в каждой 16 бит данных с защитой ECC. Там хранятся записанные на заводе уникальный идентификатор и подстройка генераторов, настройки защиты, отпечатки ключей безопасной загрузки, ключи расшифровки, настройки загрузчика USB и даже образы программ. Бит можно перевести из 0 в 1, но не обратно (даташит RP2350, глава 13).
Этот блок — регистры управления по адресу 0x4012 0000; сами данные читаются через окна с 0x4013 0000 — с исправлением ошибок или без, с защищённой проверкой или без. Память разбита на 64 страницы по 64 строки, у каждой — уровни доступа для защищённого и незащищённого кода: чтение и запись, только чтение или недоступна. Уровни загружаются из OTP при сбросе, а SW_LOCK0–SW_LOCK63 позволяют программе повысить их до следующего сброса OTP — например, спрятать ключи от поздних стадий загрузки.
Записывают OTP через мост SBPI — регистры SBPI_INSTR, SBPI_WDATA и SBPI_STATUS, — но удобнее функция загрузочного ПЗУ otp_access или интерфейс PICOBOOT загрузчика USB. CRITICAL показывает критичные флаги, прочитанные при запуске: безопасная загрузка, отключение отладки, архитектура ядер, детектор сбоев. DEBUGEN возвращает отключённую отладку, ARCHSEL выбирает Arm или RISC-V для каждого ядра.
| Экземпляр | Базовый адрес |
|---|---|
| OTP | 0x4012 0000 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| OTP_SW_LOCKn | 0x00 + n · 0x04 | Программная блокировка страницы n | 0x0000 0000 |
| OTP_SBPI_INSTR | 0x0100 | Инструкция для моста SBPI — программирование OTP | 0x0000 0000 |
| OTP_SBPI_WDATA_0 | 0x0104 | Данные записи SBPI, байты 3…0 | 0x0000 0000 |
| OTP_SBPI_WDATA_1 | 0x0108 | Данные записи SBPI, байты 7…4 | 0x0000 0000 |
| OTP_SBPI_WDATA_2 | 0x010C | Данные записи SBPI, байты 11…8 | 0x0000 0000 |
| OTP_SBPI_WDATA_3 | 0x0110 | Данные записи SBPI, байты 15…12 | 0x0000 0000 |
| OTP_SBPI_RDATA_0 | 0x0114 | Прочитанные данные SBPI, байты 3…0; после чтения обнуляется | 0x0000 0000 |
| OTP_SBPI_RDATA_1 | 0x0118 | Прочитанные данные SBPI, байты 7…4; после чтения обнуляется | 0x0000 0000 |
| OTP_SBPI_RDATA_2 | 0x011C | Прочитанные данные SBPI, байты 11…8; после чтения обнуляется | 0x0000 0000 |
| OTP_SBPI_RDATA_3 | 0x0120 | Прочитанные данные SBPI, байты 15…12; после чтения обнуляется | 0x0000 0000 |
| OTP_SBPI_STATUS | 0x0124 | Состояние моста SBPI | 0x0000 0000 |
| OTP_USR | 0x0128 | Интерфейс чтения данных по шине APB | 0x0000 0001 |
| OTP_DBG | 0x012C | Отладка автомата включения OTP | 0x0000 0000 |
| OTP_BIST | 0x0134 | Счётчик ячеек с утечкой при самопроверке | 0x0FFF 0000 |
| OTP_CRT_KEY_W0 | 0x0138 | Ключ доступа, слово 0 (биты 31…0); только запись, чтение даёт 0 | 0x0000 0000 |
| OTP_CRT_KEY_W1 | 0x013C | Ключ доступа, слово 1 (биты 63…32); только запись, чтение даёт 0 | 0x0000 0000 |
| OTP_CRT_KEY_W2 | 0x0140 | Ключ доступа, слово 2 (биты 95…64); только запись, чтение даёт 0 | 0x0000 0000 |
| OTP_CRT_KEY_W3 | 0x0144 | Ключ доступа, слово 3 (биты 127…96); только запись, чтение даёт 0 | 0x0000 0000 |
| OTP_CRITICAL | 0x0148 | Критичные флаги, прочитанные при запуске | 0x0000 0000 |
| OTP_KEY_VALID | 0x014C | Какие ключи доступа были записаны к моменту загрузки | 0x0000 0000 |
| OTP_DEBUGEN | 0x0150 | Возврат отключённых отладочных функций | 0x0000 0000 |
| OTP_DEBUGEN_LOCK | 0x0154 | Закрепление битов DEBUGEN; сбрасывается холодным сбросом ядер | 0x0000 0000 |
| OTP_ARCHSEL | 0x0158 | Выбор архитектуры ядер: Arm или RISC-V | 0x0000 0000 |
| OTP_ARCHSEL_STATUS | 0x015C | Текущая архитектура ядер | 0x0000 0000 |
| OTP_BOOTDIS | 0x0160 | Запрет загрузочных векторов из регистров scratch | 0x0000 0000 |
| OTP_INTR | 0x0164 | Необработанные флаги прерываний | 0x0000 0000 |
| OTP_INTE | 0x0168 | Разрешение прерываний | 0x0000 0000 |
| OTP_INTF | 0x016C | Принудительная установка прерываний | 0x0000 0000 |
| OTP_INTS | 0x0170 | Флаги прерываний после маски и принуждения | 0x0000 0000 |
OTP_SW_LOCKn — программная блокировка страницы n
64 регистра, n = 0…63: смещение 0x00 + n · 0x04, после сброса 0x0000 0000. Макросы pico-sdk: OTP_SW_LOCKn_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | NSEC | SEC | |||||||||||||
- NSEC (биты 3:2, чтение и запись, после сброса не определено) — Уровень доступа к странице для незащищённого кода; запись складывается по ИЛИ — уровень только растёт.
Значение Имя в pico-sdk Что значит 0x0 read_write Чтение и запись 0x1 read_only Только чтение 0x3 inaccessible Недоступна - SEC (биты 1:0, чтение и запись, после сброса не определено) — Уровень доступа к странице для защищённого кода; незащищённому коду поле доступно только для чтения.
Значение Имя в pico-sdk Что значит 0x0 read_write Чтение и запись 0x1 read_only Только чтение 0x3 inaccessible Недоступна
OTP_SBPI_INSTR — инструкция для моста SBPI — программирование OTP
Смещение 0x0100, адрес 0x4012 0100, после сброса 0x0000 0000. Макросы pico-sdk: OTP_SBPI_INSTR_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | EXEC | IS_WR | HAS_PAYLOAD | PAYLOAD_SIZE_M1 | TARGET | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CMD | SHORT_WDATA | ||||||||||||||
- EXEC (бит 30, сбрасывается сам, после сброса 0x0) — Выполнить инструкцию.
- IS_WR (бит 29, чтение и запись, после сброса 0x0) — Данные инструкции — запись.
- HAS_PAYLOAD (бит 28, чтение и запись, после сброса 0x0) — У инструкции есть данные для записи или чтения.
- PAYLOAD_SIZE_M1 (биты 27:24, чтение и запись, после сброса 0x0) — Размер данных в байтах минус 1.
- TARGET (биты 23:16, чтение и запись, после сброса 0x00) — Получатель инструкции: PMC (0x3A) или DAP (0x02).
- CMD (биты 15:8, чтение и запись, после сброса 0x00) — Код команды SBPI.
- SHORT_WDATA (биты 7:0, чтение и запись, после сброса 0x00) — Данные записи, когда PAYLOAD_SIZE_M1 = 0.
OTP_SBPI_WDATA_0 — данные записи SBPI, байты 3…0
Смещение 0x0104, адрес 0x4012 0104, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: OTP_SBPI_WDATA_0_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_WDATA_1 — данные записи SBPI, байты 7…4
Смещение 0x0108, адрес 0x4012 0108, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: OTP_SBPI_WDATA_1_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_WDATA_2 — данные записи SBPI, байты 11…8
Смещение 0x010C, адрес 0x4012 010C, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: OTP_SBPI_WDATA_2_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_WDATA_3 — данные записи SBPI, байты 15…12
Смещение 0x0110, адрес 0x4012 0110, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: OTP_SBPI_WDATA_3_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_RDATA_0 — прочитанные данные SBPI, байты 3…0; после чтения обнуляется
Смещение 0x0114, адрес 0x4012 0114, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: OTP_SBPI_RDATA_0_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_RDATA_1 — прочитанные данные SBPI, байты 7…4; после чтения обнуляется
Смещение 0x0118, адрес 0x4012 0118, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: OTP_SBPI_RDATA_1_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_RDATA_2 — прочитанные данные SBPI, байты 11…8; после чтения обнуляется
Смещение 0x011C, адрес 0x4012 011C, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: OTP_SBPI_RDATA_2_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_RDATA_3 — прочитанные данные SBPI, байты 15…12; после чтения обнуляется
Смещение 0x0120, адрес 0x4012 0120, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: OTP_SBPI_RDATA_3_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_SBPI_STATUS — состояние моста SBPI
Смещение 0x0124, адрес 0x4012 0124, после сброса 0x0000 0000. Макросы pico-sdk: OTP_SBPI_STATUS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MISO | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FLAG | — | INSTR_MISS | — | INSTR_DONE | — | RDATA_VLD | ||||||||
- MISO (биты 23:16, только чтение, после сброса не определено) — Ответ SBPI.
- FLAG (бит 12, только чтение, после сброса не определено) — Флаг SBPI.
- INSTR_MISS (бит 8, сброс записью 1, после сброса 0x0) — Инструкция пропущена — предыдущая ещё выполнялась; сбрасывается записью 1.
- INSTR_DONE (бит 4, сброс записью 1, после сброса 0x0) — Инструкция выполнена; сбрасывается записью 1.
- RDATA_VLD (бит 0, сброс записью 1, после сброса 0x0) — Команда чтения вернула данные; сбрасывается записью 1.
OTP_USR — интерфейс чтения данных по шине APB
Смещение 0x0128, адрес 0x4012 0128, после сброса 0x0000 0001. Макросы pico-sdk: OTP_USR_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PD | — | DCTRL | ||||||||||||
- PD (бит 4, чтение и запись, после сброса 0x0) — Отключение источника опорного тока; для чтения OTP должно быть 0.
- DCTRL (бит 0, чтение и запись, после сброса 0x1) — 1 — чтение данных по шине APB, 0 — доступ через SBPI; перед программированием OTP бит сбрасывают.
OTP_DBG — отладка автомата включения OTP
Смещение 0x012C, адрес 0x4012 012C, после сброса 0x0000 0000. Макросы pico-sdk: OTP_DBG_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CUSTOMER_RMA_FLAG | — | PSM_STATE | ROSC_UP | ROSC_UP_SEEN | BOOT_DONE | PSM_DONE | ||||||||
- CUSTOMER_RMA_FLAG (бит 12, только чтение, после сброса не определено) — Чип выведен из эксплуатации (режим RMA).
- PSM_STATE (биты 7:4, только чтение, после сброса не определено) — Состояние автомата включения OTP.
- ROSC_UP (бит 3, только чтение, после сброса не определено) — Кольцевой генератор OTP работает.
- ROSC_UP_SEEN (бит 2, сброс записью 1, после сброса 0x0) — Кольцевой генератор был замечен работающим; сбрасывается записью 1.
- BOOT_DONE (бит 1, только чтение, после сброса не определено) — Автомат включения завершил загрузку.
- PSM_DONE (бит 0, только чтение, после сброса не определено) — Автомат включения завершил работу.
OTP_BIST — счётчик ячеек с утечкой при самопроверке
Смещение 0x0134, адрес 0x4012 0134, после сброса 0x0FFF 0000. Макросы pico-sdk: OTP_BIST_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CNT_FAIL | CNT_CLR | CNT_ENA | CNT_MAX | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CNT | ||||||||||||||
- CNT_FAIL (бит 30, только чтение, после сброса не определено) — Ячеек с утечкой больше, чем CNT_MAX.
- CNT_CLR (бит 29, сбрасывается сам, после сброса 0x0) — Обнулить счётчик перед использованием.
- CNT_ENA (бит 28, чтение и запись, после сброса 0x0) — Включить счётчик до запуска самопроверки.
- CNT_MAX (биты 27:16, чтение и запись, после сброса 0xFFF) — Порог для флага CNT_FAIL.
- CNT (биты 12:0, только чтение, после сброса не определено) — Ячеек хотя бы с одним битом с утечкой.
OTP_CRT_KEY_W0 — ключ доступа, слово 0 (биты 31…0); только запись, чтение даёт 0
Смещение 0x0138, адрес 0x4012 0138, после сброса 0x0000 0000, только запись. Макросы pico-sdk: OTP_CRT_KEY_W0_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_CRT_KEY_W1 — ключ доступа, слово 1 (биты 63…32); только запись, чтение даёт 0
Смещение 0x013C, адрес 0x4012 013C, после сброса 0x0000 0000, только запись. Макросы pico-sdk: OTP_CRT_KEY_W1_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_CRT_KEY_W2 — ключ доступа, слово 2 (биты 95…64); только запись, чтение даёт 0
Смещение 0x0140, адрес 0x4012 0140, после сброса 0x0000 0000, только запись. Макросы pico-sdk: OTP_CRT_KEY_W2_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_CRT_KEY_W3 — ключ доступа, слово 3 (биты 127…96); только запись, чтение даёт 0
Смещение 0x0144, адрес 0x4012 0144, после сброса 0x0000 0000, только запись. Макросы pico-sdk: OTP_CRT_KEY_W3_…
Значение занимает регистр целиком, отдельных полей нет.
OTP_CRITICAL — критичные флаги, прочитанные при запуске
Смещение 0x0148, адрес 0x4012 0148, после сброса 0x0000 0000. Макросы pico-sdk: OTP_CRITICAL_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | RISCV_DISABLE | ARM_DISABLE | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | GLITCH_DETECTOR_SENS | GLITCH_DETECTOR_ENABLE | DEFAULT_ARCHSEL | DEBUG_DISABLE | SECURE_DEBUG_DISABLE | SECURE_BOOT_ENABLE | |||||||||
- RISCV_DISABLE (бит 17, только чтение, после сброса 0x0) — Флаг запрета RISC-V: архитектура принудительно Arm.
- ARM_DISABLE (бит 16, только чтение, после сброса 0x0) — Флаг запрета Arm; начиная с ревизии A3 не действует.
- GLITCH_DETECTOR_SENS (биты 6:5, только чтение, после сброса 0x0) — Начальная чувствительность детектора сбоев.
- GLITCH_DETECTOR_ENABLE (бит 4, только чтение, после сброса 0x0) — Детектор сбоев взводится до запуска программ.
- DEFAULT_ARCHSEL (бит 3, только чтение, после сброса 0x0) — Архитектура по умолчанию: 0 — Arm, 1 — RISC-V.
- DEBUG_DISABLE (бит 2, только чтение, после сброса 0x0) — Отладка отключена полностью, Mem-AP выключены.
- SECURE_DEBUG_DISABLE (бит 1, только чтение, после сброса 0x0) — Отключена защищённая отладка: заводской JTAG, защищённые обращения Mem-AP и остановка защищённых ядер.
- SECURE_BOOT_ENABLE (бит 0, только чтение, после сброса 0x0) — Безопасная загрузка: ПЗУ проверяет подписи, заводской JTAG выключен, архитектура — Arm.
OTP_KEY_VALID — какие ключи доступа были записаны к моменту загрузки
Смещение 0x014C, адрес 0x4012 014C, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: OTP_KEY_VALID_…
Отдельных полей нет: значение занимает биты 7:0, остальные биты не используются.
OTP_DEBUGEN — возврат отключённых отладочных функций
Смещение 0x0150, адрес 0x4012 0150, после сброса 0x0000 0000. Макросы pico-sdk: OTP_DEBUGEN_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | MISC | — | PROC1_SECURE | PROC1 | PROC0_SECURE | PROC0 | |||||||||
- MISC (бит 8, чтение и запись, после сброса 0x0) — Включить прочие отладочные блоки — CTI и APB-AP модуля отладки RISC-V.
- PROC1_SECURE (бит 3, чтение и запись, после сброса 0x0) — Разрешить Mem-AP ядра 1 защищённые обращения и защищённую отладку ядра 1.
- PROC1 (бит 2, чтение и запись, после сброса 0x0) — Включить Mem-AP ядра 1, если он отключён.
- PROC0_SECURE (бит 1, чтение и запись, после сброса 0x0) — Разрешить Mem-AP ядра 0 защищённые обращения и защищённую отладку ядра 0.
- PROC0 (бит 0, чтение и запись, после сброса 0x0) — Включить Mem-AP ядра 0, если он отключён.
OTP_DEBUGEN_LOCK — закрепление битов DEBUGEN; сбрасывается холодным сбросом ядер
Смещение 0x0154, адрес 0x4012 0154, после сброса 0x0000 0000. Макросы pico-sdk: OTP_DEBUGEN_LOCK_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | MISC | — | PROC1_SECURE | PROC1 | PROC0_SECURE | PROC0 | |||||||||
- MISC (бит 8, чтение и запись, после сброса 0x0) — Запись 1 закрепляет бит MISC в DEBUGEN; снять нельзя.
- PROC1_SECURE (бит 3, чтение и запись, после сброса 0x0) — Запись 1 закрепляет бит PROC1_SECURE в DEBUGEN; снять нельзя.
- PROC1 (бит 2, чтение и запись, после сброса 0x0) — Запись 1 закрепляет бит PROC1 в DEBUGEN; снять нельзя.
- PROC0_SECURE (бит 1, чтение и запись, после сброса 0x0) — Запись 1 закрепляет бит PROC0_SECURE в DEBUGEN; снять нельзя.
- PROC0 (бит 0, чтение и запись, после сброса 0x0) — Запись 1 закрепляет бит PROC0 в DEBUGEN; снять нельзя.
OTP_ARCHSEL — выбор архитектуры ядер: Arm или RISC-V
Смещение 0x0158, адрес 0x4012 0158, после сброса 0x0000 0000. Макросы pico-sdk: OTP_ARCHSEL_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CORE1 | CORE0 | |||||||||||||
- CORE1 (бит 1, чтение и запись, после сброса 0x0) — Архитектура ядра 1 после следующего тёплого сброса.
- CORE0 (бит 0, чтение и запись, после сброса 0x0) — Архитектура ядра 0 после следующего тёплого сброса.
OTP_ARCHSEL_STATUS — текущая архитектура ядер
Смещение 0x015C, адрес 0x4012 015C, после сброса 0x0000 0000. Макросы pico-sdk: OTP_ARCHSEL_STATUS_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | CORE1 | CORE0 | |||||||||||||
- CORE1 (бит 1, только чтение, после сброса 0x0) — Текущая архитектура ядра 1; обновляется при тёплом сбросе ядра.
- CORE0 (бит 0, только чтение, после сброса 0x0) — Текущая архитектура ядра 0; обновляется при тёплом сбросе ядра.
OTP_BOOTDIS — запрет загрузочных векторов из регистров scratch
Смещение 0x0160, адрес 0x4012 0160, после сброса 0x0000 0000. Макросы pico-sdk: OTP_BOOTDIS_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | NEXT | NOW | |||||||||||||
- NEXT (бит 1, чтение и запись, после сброса 0x0) — Игнорировать загрузочные векторы в регистрах scratch после следующего отключения ядра; программно только устанавливается.
- NOW (бит 0, сброс записью 1, после сброса 0x0) — Загрузочное ПЗУ сейчас игнорирует векторы в регистрах scratch; сбрасывается записью 1.
OTP_INTR — необработанные флаги прерываний
Смещение 0x0164, адрес 0x4012 0164, после сброса 0x0000 0000. Макросы pico-sdk: OTP_INTR_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | APB_RD_NSEC_FAIL | APB_RD_SEC_FAIL | APB_DCTRL_FAIL | SBPI_WR_FAIL | SBPI_FLAG_N | ||||||||||
- APB_RD_NSEC_FAIL (бит 4, сброс записью 1, после сброса 0x0) — Событие: неудачное чтение по шине APB из незащищённого режима.
- APB_RD_SEC_FAIL (бит 3, сброс записью 1, после сброса 0x0) — Событие: неудачное чтение по шине APB из защищённого режима.
- APB_DCTRL_FAIL (бит 2, сброс записью 1, после сброса 0x0) — Событие: неудачное обращение по шине APB, связанное с битом USR.DCTRL.
- SBPI_WR_FAIL (бит 1, сброс записью 1, после сброса 0x0) — Событие: неудачная запись через SBPI.
- SBPI_FLAG_N (бит 0, только чтение, после сброса 0x0) — Событие: флаг SBPI (инверсный).
OTP_INTE — разрешение прерываний
Смещение 0x0168, адрес 0x4012 0168, после сброса 0x0000 0000. Макросы pico-sdk: OTP_INTE_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | APB_RD_NSEC_FAIL | APB_RD_SEC_FAIL | APB_DCTRL_FAIL | SBPI_WR_FAIL | SBPI_FLAG_N | ||||||||||
- APB_RD_NSEC_FAIL (бит 4, чтение и запись, после сброса 0x0) — Разрешение прерывания: неудачное чтение по шине APB из незащищённого режима.
- APB_RD_SEC_FAIL (бит 3, чтение и запись, после сброса 0x0) — Разрешение прерывания: неудачное чтение по шине APB из защищённого режима.
- APB_DCTRL_FAIL (бит 2, чтение и запись, после сброса 0x0) — Разрешение прерывания: неудачное обращение по шине APB, связанное с битом USR.DCTRL.
- SBPI_WR_FAIL (бит 1, чтение и запись, после сброса 0x0) — Разрешение прерывания: неудачная запись через SBPI.
- SBPI_FLAG_N (бит 0, чтение и запись, после сброса 0x0) — Разрешение прерывания: флаг SBPI (инверсный).
OTP_INTF — принудительная установка прерываний
Смещение 0x016C, адрес 0x4012 016C, после сброса 0x0000 0000. Макросы pico-sdk: OTP_INTF_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | APB_RD_NSEC_FAIL | APB_RD_SEC_FAIL | APB_DCTRL_FAIL | SBPI_WR_FAIL | SBPI_FLAG_N | ||||||||||
- APB_RD_NSEC_FAIL (бит 4, чтение и запись, после сброса 0x0) — Принудительное прерывание: неудачное чтение по шине APB из незащищённого режима.
- APB_RD_SEC_FAIL (бит 3, чтение и запись, после сброса 0x0) — Принудительное прерывание: неудачное чтение по шине APB из защищённого режима.
- APB_DCTRL_FAIL (бит 2, чтение и запись, после сброса 0x0) — Принудительное прерывание: неудачное обращение по шине APB, связанное с битом USR.DCTRL.
- SBPI_WR_FAIL (бит 1, чтение и запись, после сброса 0x0) — Принудительное прерывание: неудачная запись через SBPI.
- SBPI_FLAG_N (бит 0, чтение и запись, после сброса 0x0) — Принудительное прерывание: флаг SBPI (инверсный).
OTP_INTS — флаги прерываний после маски и принуждения
Смещение 0x0170, адрес 0x4012 0170, после сброса 0x0000 0000. Макросы pico-sdk: OTP_INTS_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | APB_RD_NSEC_FAIL | APB_RD_SEC_FAIL | APB_DCTRL_FAIL | SBPI_WR_FAIL | SBPI_FLAG_N | ||||||||||
- APB_RD_NSEC_FAIL (бит 4, только чтение, после сброса 0x0) — Прерывание после маски: неудачное чтение по шине APB из незащищённого режима.
- APB_RD_SEC_FAIL (бит 3, только чтение, после сброса 0x0) — Прерывание после маски: неудачное чтение по шине APB из защищённого режима.
- APB_DCTRL_FAIL (бит 2, только чтение, после сброса 0x0) — Прерывание после маски: неудачное обращение по шине APB, связанное с битом USR.DCTRL.
- SBPI_WR_FAIL (бит 1, только чтение, после сброса 0x0) — Прерывание после маски: неудачная запись через SBPI.
- SBPI_FLAG_N (бит 0, только чтение, после сброса 0x0) — Прерывание после маски: флаг SBPI (инверсный).
Частые вопросы
Можно ли стереть OTP RP2350?
Нет: каждый бит можно только перевести из 0 в 1, и это необратимо. Уровни блокировки страниц тоже только растут — и записанные в OTP, и повышенные программно через SW_LOCK до следующего сброса OTP.
Как программно выбрать ядра RISC-V на RP2350?
Запишите 1 в биты CORE0 и CORE1 регистра ARCHSEL блока OTP: ядро возьмёт новую архитектуру при следующем тёплом сбросе, а ARCHSEL_STATUS покажет текущую. Допустимые значения ограничивают критичные флаги — при включённой безопасной загрузке архитектура принудительно Arm.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 13.9: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- GLITCH_DETECTOR — детектор сбоевGLITCH_DETECTOR_ARM, GLITCH_DETECTOR_DISARM, GLITCH_DETECTOR_SENSITIVITY, GLITCH_DETECTOR_LOCK, GLITCH_DETECTOR_TRIG_STATUS, GLITCH_DETECTOR_TRIG_FORCE
- 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
- 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
Статьи и термины
- OTP-памятьОднократно программируемая память: ключи, настройки, необратимые биты
- Безопасная загрузкаЗапуск только подписанной прошивки: подпись, ключи в OTP, откат версий
- Шифрование флеш-памятиПрошивка во внешней памяти в зашифрованном виде: XTS-AES, ключи в чипе
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи