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

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-C33 передачи + 3 приёмаSPI2, UHCI0 (UART0/UART1), I2S, AES, SHA, ADCдо 384 КБ внутреннего ОЗУ
ESP32-S35 передачи + 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]owner0 — буфер принадлежит процессору, 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).

Источники

  1. 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
  2. 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 МБ внешнего ОЗУ

Нашли ошибку?