Регистры ROSC RP2350
Регистры кольцевого генератора RP2350, от которого чип стартует: включение и число звеньев, сила звеньев, случайное изменение частоты, затравка генератора случайности, выходной делитель, сдвиг фазы и остановка для сна.
ROSC — генератор из кольца инверторов, без внешних деталей; от него чип загружается. При загрузке частота около 11 МГц и гарантированно лежит между 4,6 и 19,6 МГц, а со случайным изменением — до 24 МГц. Частота зависит от техпроцесса, напряжения и температуры, поэтому для USB, АЦП и таймера AON нужен кварц (даташит RP2350, раздел 8.3).
Новое по сравнению с RP2040 — случайное изменение частоты: биты DS0_RANDOM и DS1_RANDOM отдают силу первых двух звеньев генератору LFSR, и частота на диапазоне LOW растёт до 22 %. Это защищает от восстановления системной частоты по следам потребления. Затравку LFSR записывают в RANDOM. В ревизии A3 оба бита включены после сброса.
Выходной делитель записывают как 0xAA00 + делитель. Здесь источники расходятся: по таблице даташита 0 означает деление на 256, по заголовку pico-sdk — на 128; после сброса делитель 32 по описанию регистра и 8 — по разделам 8.3.2 и 8.3.7.
| Экземпляр | Базовый адрес |
|---|---|
| ROSC | 0x400E 8000 |
В RP2040 блок ROSC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры ROSC RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| ROSC_CTRL | 0x00 | Включение и диапазон частот | 0x0000 0AA0 |
| ROSC_FREQA | 0x04 | Сила звеньев 0–3 | 0x0000 0000 |
| ROSC_FREQB | 0x08 | Сила звеньев 4–7 | 0x0000 0000 |
| ROSC_RANDOM | 0x0C | Затравка генератора случайности LFSR; запись перезапускает его | 0x3F04 B16D |
| ROSC_DORMANT | 0x10 | Остановка генератора для сна | не определено |
| ROSC_DIV | 0x14 | Выходной делитель: 0xAA00 + делитель | не определено |
| ROSC_PHASE | 0x18 | Выход со сдвигом фазы | 0x0000 0008 |
| ROSC_STATUS | 0x1C | Состояние генератора | 0x0000 0000 |
| ROSC_RANDOMBIT | 0x20 | Случайный бит: текущее состояние выхода генератора | 0x0000 0001 |
| ROSC_COUNT | 0x24 | Счётчик вниз на частоте генератора | 0x0000 0000 |
ROSC_CTRL — включение и диапазон частот
Смещение 0x00, адрес 0x400E 8000, после сброса 0x0000 0AA0. Макросы pico-sdk: ROSC_CTRL_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | ENABLE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ENABLE | FREQ_RANGE | ||||||||||||||
- ENABLE (биты 23:12, чтение и запись, после сброса не определено) — Включение кодом: 0xFAB — включить, 0xD1E — выключить, только после перевода системной частоты на другой источник; другой код включает.
Значение Имя в pico-sdk 0xD1E disable 0xFAB enable - FREQ_RANGE (биты 11:0, чтение и запись, после сброса 0xAA0) — Число звеньев в кольце: LOW — звенья 0–7, MEDIUM — 2–7, HIGH — 4–7; TOOHIGH превышает расчётную частоту и не используется.
Значение Имя в pico-sdk 0xFA4 low 0xFA5 medium 0xFA7 high 0xFA6 toohigh
ROSC_FREQA — сила звеньев 0–3
Смещение 0x04, адрес 0x400E 8004, после сброса 0x0000 0000. Макросы pico-sdk: ROSC_FREQA_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PASSWD | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DS3 | — | DS2 | DS1_RANDOM | DS1 | DS0_RANDOM | DS0 | ||||||||
- PASSWD (биты 31:16, чтение и запись, после сброса 0x0000) — Пароль 0x9696: без него запись обнуляет силу всех звеньев.
Значение Имя в pico-sdk 0x9696 pass - DSn, n = 0…3 (биты 2:0, 6:4, 10:8, 14:12; чтение и запись, после сброса 0x0) — Сила звена n: чем больше установленных бит, тем выше частота.
- DS1_RANDOM (бит 7, чтение и запись, после сброса 0x0) — Случайная сила звена 1 от генератора LFSR.
- DS0_RANDOM (бит 3, чтение и запись, после сброса 0x0) — Случайная сила звена 0 от генератора LFSR.
ROSC_FREQB — сила звеньев 4–7
Смещение 0x08, адрес 0x400E 8008, после сброса 0x0000 0000. Макросы pico-sdk: ROSC_FREQB_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PASSWD | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DS7 | — | DS6 | — | DS5 | — | DS4 | ||||||||
- PASSWD (биты 31:16, чтение и запись, после сброса 0x0000) — Пароль 0x9696: без него запись обнуляет силу всех звеньев.
Значение Имя в pico-sdk 0x9696 pass - DSn, n = 4…7 (биты 2:0, 6:4, 10:8, 14:12; чтение и запись, после сброса 0x0) — Сила звена n: чем больше установленных бит, тем выше частота.
ROSC_RANDOM — затравка генератора случайности LFSR; запись перезапускает его
Смещение 0x0C, адрес 0x400E 800C, после сброса 0x3F04 B16D. Макросы pico-sdk: ROSC_RANDOM_…
- SEED (биты 31:0, чтение и запись, после сброса 0x3F04 B16D) — Затравка генератора LFSR.
ROSC_DORMANT — остановка генератора для сна
Смещение 0x10, адрес 0x400E 8010, после сброса не определено, чтение и запись. Макросы pico-sdk: ROSC_DORMANT_…
Значение занимает регистр целиком, отдельных полей нет.
ROSC_DIV — выходной делитель: 0xAA00 + делитель
Смещение 0x14, адрес 0x400E 8014, после сброса не определено, чтение и запись. Макросы pico-sdk: ROSC_DIV_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
| Значение | Имя в pico-sdk |
|---|---|
| 0xAA00 | pass |
ROSC_PHASE — выход со сдвигом фазы
Смещение 0x18, адрес 0x400E 8018, после сброса 0x0000 0008. Макросы pico-sdk: ROSC_PHASE_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PASSWD | ENABLE | FLIP | SHIFT | |||||||||||
- PASSWD (биты 11:4, чтение и запись, после сброса 0x00) — Пароль 0xAA; другое значение включает выход без сдвига.
- ENABLE (бит 3, чтение и запись, после сброса 0x1) — Включение выхода со сдвигом фазы; можно менять на ходу.
- FLIP (бит 2, чтение и запись, после сброса 0x0) — Инверсия выхода со сдвигом фазы; не действует при делителе 1.
- SHIFT (биты 1:0, чтение и запись, после сброса 0x0) — Сдвиг фазы на столько входных тактов; перед установкой делителя 1 обнулить.
ROSC_STATUS — состояние генератора
Смещение 0x1C, адрес 0x400E 801C, после сброса 0x0000 0000. Макросы pico-sdk: ROSC_STATUS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| STABLE | — | BADWRITE | — | DIV_RUNNING | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ENABLED | — | |||||||||||||
- STABLE (бит 31, только чтение, после сброса 0x0) — Генератор работает устойчиво.
- BADWRITE (бит 24, сброс записью 1, после сброса 0x0) — В один из регистров генератора записано недопустимое значение; сбрасывается записью 1.
- DIV_RUNNING (бит 16, только чтение, после сброса не определено) — Выходной делитель работает.
- ENABLED (бит 12, только чтение, после сброса не определено) — Генератор включён, но ещё может не выйти на устойчивую генерацию.
ROSC_RANDOMBIT — случайный бит: текущее состояние выхода генератора
Смещение 0x20, адрес 0x400E 8020, после сброса 0x0000 0001, только чтение. Макросы pico-sdk: ROSC_RANDOMBIT_…
Отдельных полей нет: значение занимает бит 0, остальные биты не используются.
ROSC_COUNT — счётчик вниз на частоте генератора
Смещение 0x24, адрес 0x400E 8024, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: ROSC_COUNT_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
Частые вопросы
Зачем кольцевому генератору RP2350 случайная частота?
Чтобы по следам потребления нельзя было восстановить системную частоту — это мешает атакам на загрузку. Случайность включают биты DS0_RANDOM и DS1_RANDOM в FREQA; даташит советует включать оба, а затравку генератора можно задать в RANDOM.
Годится ли RANDOMBIT кольцевого генератора RP2350 для криптографии?
Нет: даташит прямо говорит, что для систем безопасности такой источник не подходит, а если ядра тактируются от того же ROSC, биты вообще не случайны. Для ключей есть блок TRNG.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 8.3.11: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- 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
- 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
Статьи и термины
- Кварцевый резонаторКварц у микроконтроллера: подключение, конденсаторы, часовой кварц
- Режимы снаSleep mode: Idle, Power-down, пробуждение и ток
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи
- RP2040 и RP2350RP2040 и RP2350: ядра, память, GPIO, PIO, АЦП, 5 В на выводах, эрраты