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

Регистры 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.

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

В RP2040 блок ROSC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры ROSC RP2040».

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

РегистрСмещениеНазначениеПосле сброса
ROSC_CTRL0x00Включение и диапазон частот0x0000 0AA0
ROSC_FREQA0x04Сила звеньев 0–30x0000 0000
ROSC_FREQB0x08Сила звеньев 4–70x0000 0000
ROSC_RANDOM0x0CЗатравка генератора случайности LFSR; запись перезапускает его0x3F04 B16D
ROSC_DORMANT0x10Остановка генератора для снане определено
ROSC_DIV0x14Выходной делитель: 0xAA00 + делительне определено
ROSC_PHASE0x18Выход со сдвигом фазы0x0000 0008
ROSC_STATUS0x1CСостояние генератора0x0000 0000
ROSC_RANDOMBIT0x20Случайный бит: текущее состояние выхода генератора0x0000 0001
ROSC_COUNT0x24Счётчик вниз на частоте генератора0x0000 0000

ROSC_CTRL — включение и диапазон частот

Смещение 0x00, адрес 0x400E 8000, после сброса 0x0000 0AA0. Макросы pico-sdk: ROSC_CTRL_…

31302928272625242322212019181716
—ENABLE
1514131211109876543210
ENABLEFREQ_RANGE
  • ENABLE (биты 23:12, чтение и запись, после сброса не определено) — Включение кодом: 0xFAB — включить, 0xD1E — выключить, только после перевода системной частоты на другой источник; другой код включает.
    ЗначениеИмя в pico-sdk
    0xD1Edisable
    0xFABenable
  • FREQ_RANGE (биты 11:0, чтение и запись, после сброса 0xAA0) — Число звеньев в кольце: LOW — звенья 0–7, MEDIUM — 2–7, HIGH — 4–7; TOOHIGH превышает расчётную частоту и не используется.
    ЗначениеИмя в pico-sdk
    0xFA4low
    0xFA5medium
    0xFA7high
    0xFA6toohigh

ROSC_FREQA — сила звеньев 0–3

Смещение 0x04, адрес 0x400E 8004, после сброса 0x0000 0000. Макросы pico-sdk: ROSC_FREQA_…

31302928272625242322212019181716
PASSWD
1514131211109876543210
—DS3—DS2DS1_RANDOMDS1DS0_RANDOMDS0
  • PASSWD (биты 31:16, чтение и запись, после сброса 0x0000) — Пароль 0x9696: без него запись обнуляет силу всех звеньев.
    ЗначениеИмя в pico-sdk
    0x9696pass
  • 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_…

31302928272625242322212019181716
PASSWD
1514131211109876543210
—DS7—DS6—DS5—DS4
  • PASSWD (биты 31:16, чтение и запись, после сброса 0x0000) — Пароль 0x9696: без него запись обнуляет силу всех звеньев.
    ЗначениеИмя в pico-sdk
    0x9696pass
  • 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
0xAA00pass

ROSC_PHASE — выход со сдвигом фазы

Смещение 0x18, адрес 0x400E 8018, после сброса 0x0000 0008. Макросы pico-sdk: ROSC_PHASE_…

1514131211109876543210
—PASSWDENABLEFLIPSHIFT
  • 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_…

31302928272625242322212019181716
STABLE—BADWRITE—DIV_RUNNING
1514131211109876543210
—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.

Источники

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

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

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

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