GDMA — общий контроллер DMA у ESP32-C3 и ESP32-S3
В ESP32-C3 и ESP32-S3 у DMA нет закреплённых за периферией каналов: есть общий контроллер — GDMA, несколько каналов передачи и приёма, которые программа отдаёт той периферии, которой они сейчас нужны. Работает он через связные списки дескрипторов в ОЗУ.
Обновлено Редакция GAW
GDMA (General Direct Memory Access) — контроллер прямого доступа к памяти в ESP32-C3 и ESP32-S3, каналы которого не закреплены за периферией, а назначаются программой. Он пересылает данные из периферии в память, из памяти в периферию и из памяти в память без участия процессора (TRM ESP32-C3 v1.4, разд. 2.1).
Каналы и периферия
| Чип | Каналы | Периферия с GDMA | Память |
|---|---|---|---|
| ESP32-C3 | 3 передачи + 3 приёма | SPI2, UHCI0 (UART0/UART1), I2S, AES, SHA, ADC | до 384 КБ внутреннего ОЗУ |
| ESP32-S3 | 5 передачи + 5 приёма | SPI2, SPI3, UHCI0, I2S0, I2S1, LCD/CAM, AES, SHA, ADC, RMT | до 480 КБ внутреннего и 32 МБ внешнего ОЗУ |
Данные — TRM ESP32-C3, разд. 2.1–2.2, и TRM ESP32-S3, разд. 3.1–3.2. Периферию выбирают полями GDMA_PERI_IN_SEL_CHn и GDMA_PERI_OUT_SEL_CHn (у ESP32-C3: 0 — SPI2, 2 — UHCI0, 3 — I2S, 6 — AES, 7 — SHA, 8 — ADC); если канал подключён к периферии, другие каналы к ней уже не подключить (табл. 2.4-1). Между каналами контроллер распределяет доступ по фиксированным приоритетам и по кругу.
Связные списки дескрипторов
GDMA работает не с одним буфером, а со списком: каждый дескриптор указывает на буфер и на следующий дескриптор. Списки передачи называются outlink, приёма — inlink, и лежат во внутреннем ОЗУ (разд. 2.3). Дескриптор ESP32-C3 состоит из трёх слов:
| Слово, биты | Поле | Смысл |
|---|---|---|
| DW0 [31] | owner | 0 — буфер принадлежит процессору, 1 — контроллеру GDMA |
| DW0 [30] | suc_eof | конец передачи: прерывание после этого дескриптора; при приёме ставит аппаратура |
| DW0 [28] | err_eof | ошибка в принятых данных (только для UHCI0) |
| DW0 [23:12] | length | число действительных байт в буфере |
| DW0 [11:0] | size | размер буфера |
| DW1 | — | адрес буфера |
| DW2 | — | адрес следующего дескриптора, 0 у последнего |
С битом owner нужна аккуратность: в дескрипторе приёма контроллер сбрасывает его сам, закончив с буфером, а в дескрипторе передачи — только при установленном GDMA_OUT_AUTO_WRBACK_CHn (разд. 2.4.1). Запуск — адрес первого дескриптора в GDMA_INLINK_ADDR_CHn или GDMA_OUTLINK_ADDR_CHn и бит START, который аппаратура сбрасывает сама (разд. 2.4.4).
Если принято меньше, чем вмещает буфер, остаток этого буфера в следующей передаче не используется (разд. 2.4.1) — по нашему выводу, буферы стоит делать по размеру ожидаемых пакетов. По нашему выводу, связный список по сути заменяет кольцевой буфер и FIFO большой глубины: пока процессор разбирает один буфер, контроллер заполняет следующий.
Не путать
С DMA классического ESP32: в его TRM v5.8 блока GDMA нет. И с DMA в STM32, где каналы связаны с запросами периферии иначе — см. статью «DMA в STM32». Подробнее о чипах — ESP32-C3 и ESP32-S3.
Частые вопросы
Сколько каналов DMA у ESP32-C3?
Шесть: три канала передачи и три канала приёма. Любой канал можно отдать периферии с поддержкой GDMA — SPI2, UHCI0 (UART0 и UART1), I2S, AES, SHA или АЦП (TRM ESP32-C3 v1.4, разд. 2.1). У ESP32-S3 каналов десять — по пять в каждую сторону (TRM v1.8, разд. 3.1).
Что значит бит owner в дескрипторе GDMA?
Кто может работать с буфером: 0 — процессор, 1 — контроллер GDMA. Загружая список, программа ставит 1. В дескрипторе приёма GDMA сбрасывает бит сам, закончив с буфером; в дескрипторе передачи — только если установлен GDMA_OUT_AUTO_WRBACK_CHn (TRM ESP32-C3, разд. 2.4.1).
Можно ли через GDMA копировать память?
Да: бит GDMA_MEM_TRANS_EN_CHn соединяет выход канала передачи n со входом канала приёма n. Соединить можно только каналы с одинаковым номером (TRM ESP32-C3, разд. 2.4.3).
Источники
- Espressif. ESP32-C3 Technical Reference Manual v1.4 — гл. 2: разд. 2.1 — периферия–память, память–периферия, память–память без участия CPU; шесть каналов (три передачи, три приёма) для SPI2, UHCI0 (UART0/UART1), I2S, AES, SHA, ADC; фиксированный приоритет и круговой арбитраж; разд. 2.2 — шина AHB, длина в байтах, связный список, до 384 КБ внутреннего ОЗУ; разд. 2.3 — outlink и inlink в ОЗУ; разд. 2.4.1 — дескриптор из трёх слов, поля owner, suc_eof, err_eof, length, size, адрес буфера, адрес следующего дескриптора (0 у последнего); разд. 2.4.2, табл. 2.4-1 — выбор периферии GDMA_PERI_IN/OUT_SEL_CHn, канал, подключённый к периферии, исключает другие; разд. 2.4.3 — память–память только канал передачи n с каналом приёма n; разд. 2.4.4 — INLINK/OUTLINK_ADDR и START
- Espressif. ESP32-S3 Technical Reference Manual v1.8 — гл. 3, разд. 3.1–3.2: десять каналов (пять передачи, пять приёма) для SPI2, SPI3, UHCI0, I2S0, I2S1, LCD/CAM, AES, SHA, ADC, RMT; каждый канал работает и с внутренним, и с внешним ОЗУ; до 480 КБ внутреннего и 32 МБ внешнего ОЗУ
Нашли ошибку?
Смотрите также
- DMAПрямой доступ к памяти без участия ядра
- ESP32-C3: выводы и GPIO22 GPIO: функции, свободные и занятые выводы, флеш-память, strapping, USB, JTAG, токи
- ESP32-S3: выводы и GPIO45 GPIO: функции, свободные и занятые выводы, флеш и PSRAM, strapping, USB, JTAG, токи
- FIFO (буфер «первым пришёл — первым ушёл»)Аппаратная очередь между периферией и программой
- I²S (шина цифрового звука)Трёхпроводная шина для передачи звука: такт, выбор канала, данные
- DMA STM32Каналы и потоки, запросы периферии, кольцо, двойной буфер, FIFO, флаги, примеры