Esp32-s3, амфору откопал старинную

Копал-копал и случайно выкопал. Короче, в этом вашем ESP32-S3 (ну и в других тоже, но я - про ESP32-S3 тут рассказываю), обнаружился еще один нигде не описанный блок. Простенький, но интересный. Называется “Backup DMA peripheral“. Это не тот DMA с дескрипторами, к которому все привыкли - это больше на регистровый энжин похоже.

Что оно умеет делать:

  1. Умеет копировать ИЗ MMIO регистров (т.е. из памяти, начиная с адреса 0x60000000) в RAM. Ну и наеборот - из RAM в MMIO. В чем разница между обнаковенным копированием и этим? Нет read side effects. Например, если вы , в своем скетче, на своем устройстве ESP32-S3 попробуете прочитать 256 байт начиная с адреса 0x60000000 у вас умрет UART. Ну потому, что он как раз по этим адресам и расположен и чтение некоторых его регистров ставит систему раком.

А вот backup dma engine - спокойно копирует, не вызывая side effects.

  1. Если вы будете копировать память в MMIO регистры, то, соответственно, будут исполнятся какие-то действия этими самыми MMIO регистрами. Backup DMA умеет копировать из памяти в MMIO без всего этого.

В некотором роде это такой backdoor, который позволяет незаметно читать и писать MMIO регистры пачкой, без side effects. Ни аппаратные watchpoints/breakpoints ни другие средства отладки работу этой backup dma engine не видят. К сожалению, этот микро-DMA движок странный НЕ УМЕЕТ из RAM в RAM копировать :(. Проверил.

Ограничения у этой backup DMA такие - память должна быть выровнена на 4 байта, макисмальный размер передаваемых данных - 1024 байта.

Если интересно, то я напишу про это пост, ну а если нет, то напишу на Reddit

PS: Зачем оно в системе - используется для сохранения \ восстановления MMIO регистров всей перефирии по засыпанию\просыпанию.

++ за энтузиазм)
А прикинь как люди очей нагребли за амфору))).