Регистры XIP_CTRL RP2350
Регистры кеша XIP в RP2350: включение кеша отдельно для защищённого и незащищённого кода, разрешение записи в окна для PSRAM, разделение кеша между доменами, запрет обращений в обход кеша, счётчики и потоковое чтение.
Кеш XIP — 16 КБ, двухканальный ассоциативный, попадание за один такт; физически это два банка по 8 КБ с чётными и нечётными строками. Окно XIP повторяется четыре раза: с 0x1000 0000 — с кешем, с 0x1400 0000 — без кеша, с 0x1800 0000 — обслуживание кеша, с 0x1C00 0000 — без кеша и без трансляции адресов QMI (даташит RP2350, раздел 4.4).
По сравнению с RP2040 кеш включают раздельно для защищённого и незащищённого кода (EN_SECURE и EN_NONSECURE), а биты NO_UNCACHED_… и NO_UNTRANSLATED_… закрывают обходные окна, чтобы не тратить области SAU, MPU или PMP на их защиту. SPLIT_WAYS отдаёт каждому домену свой канал кеша, так что незащищённый код не видит изменений, вызванных защищённым.
XIP по умолчанию только для чтения: WRITABLE_M0 и WRITABLE_M1 разрешают запись в окна CS0 и CS1, если там подключена PSRAM. Регистра FLUSH больше нет — кеш обслуживают записью в окно 0x1800 0000. Потоковое чтение для DMA задают STREAM_ADDR и STREAM_CTR, данные забирают из STREAM_FIFO или быстрее — через XIP_AUX.
| Экземпляр | Базовый адрес |
|---|---|
| XIP_CTRL | 0x400C 8000 |
В RP2040 блок XIP устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры XIP RP2040».
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| XIP_CTRL | 0x00 | Управление кэшем | 0x0000 0083 |
| XIP_STAT | 0x08 | Состояние кэша и FIFO потокового чтения | 0x0000 0002 |
| XIP_CTR_HIT | 0x0C | Счётчик попаданий в кэш | 0x0000 0000 |
| XIP_CTR_ACC | 0x10 | Счётчик обращений к XIP | 0x0000 0000 |
| XIP_STREAM_ADDR | 0x14 | Адрес потокового чтения | 0x0000 0000 |
| XIP_STREAM_CTR | 0x18 | Число слов потокового чтения | 0x0000 0000 |
| XIP_STREAM_FIFO | 0x1C | FIFO потокового чтения | 0x0000 0000 |
XIP_CTRL — управление кэшем
Смещение 0x00, адрес 0x400C 8000, после сброса 0x0000 0083. Макросы pico-sdk: XIP_CTRL_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | WRITABLE_M1 | WRITABLE_M0 | SPLIT_WAYS | MAINT_NONSEC | NO_UNTRANSLATED_NONSEC | NO_UNTRANSLATED_SEC | NO_UNCACHED_NONSEC | NO_UNCACHED_SEC | POWER_DOWN | — | EN_NONSECURE | EN_SECURE | |||
- WRITABLE_M1 (бит 11, чтение и запись, после сброса 0x0) — Разрешить запись в окно CS1 (0x1100 0000…0x11FF FFFF) — для PSRAM; иначе только чтение.
- WRITABLE_M0 (бит 10, чтение и запись, после сброса 0x0) — Разрешить запись в окно CS0 (0x1000 0000…0x10FF FFFF) — для PSRAM; иначе только чтение.
- SPLIT_WAYS (бит 9, чтение и запись, после сброса 0x0) — Разделить кеш: защищённые обращения — в канал 0, незащищённые — в канал 1.
- MAINT_NONSEC (бит 8, чтение и запись, после сброса 0x0) — Разрешить незащищённому коду обслуживание кеша; при 0 — ошибка шины.
- NO_UNTRANSLATED_NONSEC (бит 7, чтение и запись, после сброса 0x1) — Ошибка шины при незащищённом обращении к окну без кеша и трансляции.
- NO_UNTRANSLATED_SEC (бит 6, чтение и запись, после сброса 0x0) — Ошибка шины при защищённом обращении к окну без кеша и трансляции.
- NO_UNCACHED_NONSEC (бит 5, чтение и запись, после сброса 0x0) — Ошибка шины при незащищённом обращении к окну без кеша.
- NO_UNCACHED_SEC (бит 4, чтение и запись, после сброса 0x0) — Ошибка шины при защищённом обращении к окну без кеша.
- POWER_DOWN (бит 3, чтение и запись, после сброса 0x0) — Отключение питания памяти кеша: содержимое сохраняется, но недоступно; запись 1 выключает кеш для обоих доменов.
- EN_NONSECURE (бит 1, чтение и запись, после сброса 0x1) — Включение кеша для незащищённых обращений.
- EN_SECURE (бит 0, чтение и запись, после сброса 0x1) — Включение кеша для защищённых обращений.
XIP_STAT — состояние кэша и FIFO потокового чтения
Смещение 0x08, адрес 0x400C 8008, после сброса 0x0000 0002. Макросы pico-sdk: XIP_STAT_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FIFO_FULL | FIFO_EMPTY | — | ||||||||||||
- FIFO_FULL (бит 2, только чтение, после сброса 0x0) — FIFO потокового чтения заполнено (в нём два слова).
- FIFO_EMPTY (бит 1, только чтение, после сброса 0x1) — FIFO потокового чтения пусто.
XIP_CTR_HIT — счётчик попаданий в кэш
Смещение 0x0C, адрес 0x400C 800C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_HIT_…
Значение занимает регистр целиком, отдельных полей нет.
XIP_CTR_ACC — счётчик обращений к XIP
Смещение 0x10, адрес 0x400C 8010, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_ACC_…
Значение занимает регистр целиком, отдельных полей нет.
XIP_STREAM_ADDR — адрес потокового чтения
Смещение 0x14, адрес 0x400C 8014, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_ADDR_…
Отдельных полей нет: значение занимает биты 31:2, остальные биты не используются.
XIP_STREAM_CTR — число слов потокового чтения
Смещение 0x18, адрес 0x400C 8018, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_CTR_…
Отдельных полей нет: значение занимает биты 21:0, остальные биты не используются.
XIP_STREAM_FIFO — fIFO потокового чтения
Смещение 0x1C, адрес 0x400C 801C, после сброса 0x0000 0000, чтение с побочным действием. Макросы pico-sdk: XIP_STREAM_FIFO_…
Значение занимает регистр целиком, отдельных полей нет.
Частые вопросы
Как разрешить запись в PSRAM через XIP на RP2350?
Установите WRITABLE_M1 (или WRITABLE_M0, если PSRAM на CS0) в регистре CTRL блока XIP_CTRL: по умолчанию окна XIP только для чтения. Сам QMI тоже нужно настроить на команды записи в M1_WFMT и M1_WCMD.
Чем XIP RP2350 отличается от RP2040?
Кеш включается раздельно для защищённого и незащищённого кода и может делиться между ними по каналам, окна в обход кеша можно закрыть, появилась запись для PSRAM, а вместо регистра FLUSH кеш обслуживают записью в окно с адреса 0x1800 0000. Контроллер памяти — QMI вместо SSI.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 4.4.5: список регистров, назначение полей, тип доступа и значения после сброса
- 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
- 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
- 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
Статьи и термины
- XIP (execute in place)Выполнение кода из внешней флеш через кэш: устройство, кэш, скорость
- QSPISPI с четырьмя линиями данных для флеш-памяти и PSRAM
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи
- RP2040 и RP2350RP2040 и RP2350: ядра, память, GPIO, PIO, АЦП, 5 В на выводах, эрраты