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

Регистры BOOTRAM RP2350

Регистры рядом с загрузочной памятью RP2350: биты однократной записи для защитных функций загрузочного ПЗУ и восемь аппаратных блокировок, которыми ПЗУ разделяет доступ к своим функциям.

Загрузочная память (boot RAM) по адресу 0x400E 0000 принадлежит загрузочному ПЗУ: оно хранит там свои данные, и пользоваться ей для своих нужд даташит не советует — функции ПЗУ могут повести себя непредсказуемо. С адреса 0x400E 0800 на той же шине лежат несколько регистров (даташит RP2350, раздел 4.3.1).

WRITE_ONCE0 и WRITE_ONCE1 складывают записываемые биты по ИЛИ с текущими: установленный бит снимает только сброс — так ПЗУ реализует часть защитных функций. BOOTLOCK0–BOOTLOCK7 работают как спинлоки SIO, но отведены загрузочному ПЗУ: чтение захватывает блокировку и возвращает 1 << n при успехе или 0, запись освобождает; BOOTLOCK_STAT показывает все восемь (1 — свободна).

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

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

РегистрСмещениеНазначениеПосле сброса
BOOTRAM_WRITE_ONCE00x0800Биты однократной записи 0: запись складывается по ИЛИ, снимает только сброс0x0000 0000
BOOTRAM_WRITE_ONCE10x0804Биты однократной записи 1: запись складывается по ИЛИ, снимает только сброс0x0000 0000
BOOTRAM_BOOTLOCK_STAT0x0808Состояние восьми блокировок: 1 — свободна, 0 — захвачена0x0000 00FF
BOOTRAM_BOOTLOCKn0x080C + n · 0x04Блокировка n: чтение захватывает (1 << n — успех, 0 — занята), запись освобождает0x0000 0000

BOOTRAM_WRITE_ONCE0 — биты однократной записи 0: запись складывается по ИЛИ, снимает только сброс

Смещение 0x0800, адрес 0x400E 0800, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: BOOTRAM_WRITE_ONCE0_…

Значение занимает регистр целиком, отдельных полей нет.

BOOTRAM_WRITE_ONCE1 — биты однократной записи 1: запись складывается по ИЛИ, снимает только сброс

Смещение 0x0804, адрес 0x400E 0804, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: BOOTRAM_WRITE_ONCE1_…

Значение занимает регистр целиком, отдельных полей нет.

BOOTRAM_BOOTLOCK_STAT — состояние восьми блокировок: 1 — свободна, 0 — захвачена

Смещение 0x0808, адрес 0x400E 0808, после сброса 0x0000 00FF, чтение и запись. Макросы pico-sdk: BOOTRAM_BOOTLOCK_STAT_…

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

BOOTRAM_BOOTLOCKn — блокировка n: чтение захватывает (1 << n — успех, 0 — занята), запись освобождает

8 регистров, n = 0…7: смещение 0x080C + n · 0x04, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: BOOTRAM_BOOTLOCKn_…

Значение занимает регистр целиком, отдельных полей нет.

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

Можно ли пользоваться блокировками BOOTLOCK в своей программе?

Работают они так же, как спинлоки SIO, но обычно отведены загрузочному ПЗУ для разделения доступа к его функциям. Для своих критических секций берите спинлоки блока SIO, чтобы не мешать вызовам функций ПЗУ.

Источники

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

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

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

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