Программирование ARM ESP32 DMA Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


ESP32 DMA Печать
Добавил(а) microsin   

Прямой доступ к памяти (Direct Memory Access, DMA) используется для высокоскоростных перемещений данный между периферийными устройствами и памятью, а также между областями памяти. Данные могут быстро перемещаться блоком DMA без участия CPU, что позволяет его ядрам более эффективно заниматься обработкой данных.

Примечание: в этой статье приведен перевод главы, посвященной DMA из документации [1]. Незнакомые термины и сокращения см. в Словарике, в конце статьи.

В ESP32 пересылки DMA поддерживают следующие устройства: UART0, UART1, UART2, SPI1, SPI2, SPI3, I2S0, I2S1, SDIO slave, SD/MMC host, EMAC, Bluetooth и Wi-Fi.

Особенности и функции контроллеров DMA ESP32:

• Архитектура шины AHB
• Поддерживаются full-duplex и half-duplex перемещения данных
• Программируемая длина передач в байтах
• Поддерживаются пакетные передачи (4-beat burst transfer)
• Адресное пространство 328 KB
• Все высокоскоростные модули коммуникаций получают питание от DMA

[Функциональное описание DMA]

Все модули аппаратуры, которые требуют высокоскоростных пакетных передач, содержат на борту контроллер DMA. Адресация DMA использует ту же самую шину данных, что и операции чтения/записи CPU, работающие с внутренней памятью (IRAM, Internal SRAM 1 и Internal SRAM 2). Это означает, что DMA использует адресное пространство 0x3FFE0000 .. 0x3FFFFFFF для чтения и записи Internal SRAM 1, и адресное пространство 0x3FFAE000 .. 0x3FFDFFFF для чтения и записи Internal SRAM 2.

В каждом контроллере DMA присутствуют разные функции. Однако архитектура подсистемы DMA (DMA Engine, DMA_ENGINE) одинаковая для всех контроллеров DMA.

DMA Engine Architecture fig12

Рис. 12. Архитектура DMA Engine.

DMA Engine получает доступ к SRAM через шину AHB. На рисунке 12 RAM представлена внутренними банками SRAM, доступными в ESP32. Более подробно см. раздел "System and Memory" технического руководства [2].

Программа может использовать DMA Engine путем настройки связанного списка (Linked List), в котором определены параметры рабочих операций DMA.

DMA Engine передает данные из RAM в периферийное устройство в соответствии с содержимым дескриптора out_link. Также DMA Engine сохраняет данные, принятые из периферийного устройства, в указанное место RAM, в соответствии с дескриптором in_link.

Linked List. Под этим термином подразумевается связанный список операций DMA. Связанные списки DMA для вывода и ввода (out_link и in_link) имеют одинаковую структуру.

DMA Linked List Structure fig13

Рис. 13. Структура Linked List.

Как показано на рис. 13, дескриптор связанного списка состоит из 3 слов. Каждое поле в слове означает следующее:

owner (DW0) [31]: разрешенный оператор буфера, соответствующий текущему связанному списку.

0: разрешенный оператор это CPU;
1: разрешенный оператор это контроллер DMA.

eof (DW0) [30]: символ конца файла (End-Of-File).

0: элемент связанного списка не помечает конец связанного списка;
1: элемент связанного списка является завершением связанного списка.

reserved (DW0) [29:24]: зарезервированные биты. Программа не должна записывать в эти биты лог. 1.

length (DW0) [23:12]: количество допустимых байт в буфере, соответствующее текущему связанному списку. Значение этого поля показывает количество байт, пересылаемое в буфер или из буфера, обозначенного словом DW1.

size (DW0) [11:0]: размер буфера, соответствующий текущему связанному списку. Важное замечание: значение size должно нацело делиться на 4 (word-aligned).

buffer address pointer (DW1): указатель на буфер. Это адрес буфера данных в памяти. Важное замечание: значение адреса должно нацело делиться на 4 (word-aligned).

next descriptor address (DW2): указатель на следующий элемент связанного списка. Его значение равно 0, если текущий элемент связанного списка последний в списке (eof=1).

Во время получения данных, если length транзакции меньше, чем указанный размер буфера size, то DMA не будет использовать оставшееся пространство. Эта особенность позволяет использовать DMA Engine для перемещения произвольного количества байт данных.

У ESP32 есть 3 интерфейса UART, которые совместно используют 2 контроллера UART DMA (UDMA). UHCI_UARTx_CE (здесь x заменяется на 0, 1 или 2) используется для выбора контроллера UART, чтобы он использовал UDMA.

DMA Data Transfer UDMA Mode fig14

Рис. 14. Транзакция данных в режиме UDMA.

Рисунок 14 показывает передачу данных UDMA. Перед тем, как DMA Engine примет данные, программа должна инициализировать связанный список приема (receive-linked-list). Регистр UHCI_INLINK_ADDR используется для указания на первый дескриптор in_link. Регистр должен быть запрограммирован младшими 20 битами адреса начального элемента связанного списка. После установки UHCI_INLINK_START блок Universal Host Controller Interface (UHCI) будет передавать данные, принятые UART, в Decoder. После парсинга данные будут сохранены в RAM, как это указано дескриптором receive-linked-list.

Перед тем, как DMA передаст данные, программа должна инициализировать связанный список передачи (transmit-linked-list) и данные, которые должны быть переданы. Регистр UHCI_OUTLINK_ADDR используется для указания на первый дескриптор out_link. Этот регистр должен быть запрограммирован младшими 20 битами адреса начального элемента transmit-linked-list. После установки UHCI_OUTLINK_START блок DMA Engine будет считывать данные из области RAM, указанной дескриптором связанного списка, и затем передавать эти данные в Encoder. DMA Engine затем будет последовательно выдвигать данные через передатчик UART.

UART DMA следует формату (separator + data + separator). Encoder используется для добавления сепараторов перед и после данных, как и для использования последовательностей спецсимволов для замены данных, совпадающих с сепараторами. Decoder используется для удаления сепараторов перед и после данных, как и для замены последовательностей спецсимволов сепараторами. Может быть несколько следующих друг за другом сепараторов, помечающих начало или конец данных. Эти сепараторы могут конфигурироваться через регистр UHCI_SEPER_CH, значение по умолчанию 0xC0. Данные, которые совпадают с сепараторами, могут быть заменены на UHCI_ESC_SEQ0_CHAR0 (по умолчанию 0xDB) и UHCI_ESC_SEQ0_CHAR1 (по умолчанию 0xDD). После завершения процесса передачи будет сгенерировано прерывание UHCI_OUT_TOTAL_EOF_INT. После завершения процедуры приема будет генерироваться прерывание UHCI_IN_SUC_EOF_INT.

Подробное описание регистров UART и его контроллера DMA см. в руководстве [1].

Модули ESP32 SPI могут использовать DMA так же, как это делает CPU для обмена данными с периферийными устройствами. Как можно увидеть из рис. 15, два канала DMA совместно используются контроллерами SPI1, SPI2 и SPI3. Каждый канал DMA может использоваться любым контроллером SPI в любой момент времени.

DMA SPI fig15

Рис. 15. SPI DMA.

ESP32 SPI DMA Engine тоже использует связанный список для приема/передачи данных. Поддерживаются пакетные передачи. Минимальная длина данных для одной транзакции 1 байт. Также поддерживаются следующие друг за другом транзакции.

Поля SPI1_DMA_CHAN_SEL[1:0], SPI2_DMA_CHAN_SEL[1:0] и SPI3_DMA_CHAN_SEL[1:0] в регистре DPORT_SPI_DMA_CHAN_SEL_REG должны быть сконфигурированы для разрешения интерфейса SPI DMA для определенного контроллера SPI. Каждый контроллер SPI соответствует одному домену, у которого есть два бита со значениями 0, 1 и 2. Значение 3 зарезервировано, и не должно использоваться для операций.

Если рассматривать для примера SPI1:

Если SPI SPI1_DMA_CHAN_SEL[1:0] = 0, то SPI1 не использует никакой канал DMA. Если SPI1_DMA_CHAN_SEL[1:0] = 1, то SPI1 разрешает DMA channel1. Если SPI1_DMA_CHAN_SEL[1:0] = 2, то SPI1 разрешает DMA channel2.

Бит SPI_OUTLINK_START в регистре SPI_DMA_OUT_LINK_REG, и бит SPI_INLINK_START в регистре SPI_DMA_IN_LINK_REG используются для разрешения DMA Engine. Эти два бита автоматически очищаются аппаратурой. Если SPI_OUTLINK_START установлен в 1, то DMA Engine запускает обработку outbound-дескриптора связанного списка и подготавливается к передаче данных. Если SPI_INLINK_START установлен в 1, то DMA Engine начинает обработку inbound-дескриптора связанного списка и готовится к приему данных.

Программа должна сконфигурировать SPI DMA следующим образом:

1. Сброс машины состояния DMA и параметры FIFO.
2. Конфигурирование регистров, относящихся к DMA.
3. Конфигурирование соответствующим образом регистров, относящихся к контроллеру SPI.
4. Установка SPI_USR для разрешения работы DMA.

[Прерывания DMA]

SPI_OUT_TOTAL_EOF_INT: срабатывает, когда использованы все связанные списки передачи.
SPI_OUT_EOF_INT: срабатывает, когда отправлен один связанный список.
SPI_OUT_DONE_INT: срабатывает, когда последний элемент связанного списка передачи имеет
нулевую длину.
SPI_IN_SUC_EOF_INT: срабатывает, когда приняты все обработаны все связанные списки приема.
SPI_IN_ERR_EOF_INT: срабатывает при обнаружении ошибки в связанных списках приема.
SPI_IN_DONE_INT: срабатывает, когда длина последнего связанного списка приема равна 0.
SPI_INLINK_DSCR_ERROR_INT: срабатывает, когда обнаружен недопустимый список приема.
SPI_OUTLINK_DSCR_ERROR_INT: срабатывает, когда обнаружен недопустимый список передачи.

Подробное описание регистров SPI и его контроллера DMA см. в руководстве [1].

ESP32 имеет на борту 2 модуля I2S, I2S0 и I2S1, каждый из которых снабжен каналом DMA. Бит REG_I2S_DSCR_EN bit в регистре I2S_FIFO_CONF_REG используется для разрешения работы DMA. ESP32 I2S DMA использует стандартный дескриптор связанного списка для конфигурирования транзакций данных DMA. Поддерживаются пакетные транзакции. Однако, в отличие от каналов SPI DMA, минимальный размер данных составляет 1 слово, или 4 байта. Биты REG_I2S_RX_EOF_NUM[31:0] в регистре I2S_RXEOF_NUM_REG используются для конфигурирования размера данных одиночной транзакции, этот размер должен нацело делиться на 4.

Бит I2S_OUTLINK_START в регистре I2S_OUT_LINK_REG и бит I2S_INLINK_START в регистре I2S_IN_LINK_REG используются для разрешения DMA Engine и они автоматически очищаются аппаратно. Когда I2S_OUTLINK_START установлен в 1, DMA Engine начинает обработку outbound-дескриптора связанного списка, и подготавливается к передаче данных. Когда I2S_INLINK_START установлен в 1, DMA Engine запускает обработку inbound-дескриптора связанного списка, и подготавливается к приему данных.

Программа должна сконфигурировать I2S DMA следующим образом:

1. Конфигурирования регистров, относящихся к контроллеру I2S.
2. Сброс машины состояний DMA и параметров FIFO.
3. Конфигурирование регистров, относящихся к DMA.
4. В режиме I2S master устанавливается бит I2S_TX_START bit или бит I2S_RX_START для инициации операции I2S. В режиме I2S slave устанавливается бит I2S_TX_START bit или бит I2S_RX_START bit, и DMA Engine ожидает инициирования транзакции данных со стороны устройства хоста.

[Прерывания DMA]

I2S_OUT_TOTAL_EOF_INT: срабатывает, когда использованы все связанные списки передачи.
I2S_IN_DSCR_EMPTY_INT: срабатывает, когда не осталось ни одного допустимого связанного списка для приема.
I2S_OUT_DSCR_ERR_INT: срабатывает, когда обнаружен недопустимый список передачи.
I2S_IN_DSCR_ERR_INT: срабатывает, когда обнаружен недопустимый список приема.
I2S_OUT_EOF_INT: срабатывает, когда завершается отправка пакета.
I2S_OUT_DONE_INT: срабатывает, когда все переданные и буферизированные данные были прочитаны.
I2S_IN_SUC_EOF_INT: срабатывает, когда все данные были приняты.
I2S_IN_DONE_INT: срабатывает, когда обработан текущий дескриптор приема.

Подробное описание регистров I2S и его контроллера DMA см. в руководстве [1].

Модуль SDIO Slave использует выделенный доступ DMA к данным, находящимся в RAM. Как показано на рис. 22, обращение DMA к RAM происходит через шину AHB, при помощи дескриптора связанного списка. Каждый элемент связанного списка составлен из 3 слов, как показано на рис. 25.

DMA SDIO Slave Linked List Structure fig25

Рис. 25. Структура связанного списка (Linked List) SDIO Slave DMA.

Owner: разрешенный оператор буфера, соответствующий текущему связанному списку. 0: CPU является разрешенным оператором, 1: DMA является разрешенным оператором.

Eof: маркер окончания, он показывает, что этот элемент связанного списка последний в пакете данных.

Length: количество допустимых байт в буфере, к которым разрешено обращение для чтения или записи.

Size: максимальное количество доступных буферов.

Buffer Address Pointer: адрес буфера данных в адресном пространстве RAM.

Next Descriptor Address: адрес следующего элемента связанного списка в адресном пространстве RAM. Если текущий связанный список последний, то бит Eof должен быть в лог. 1, и адрес последнего дескриптора должен быть 0.

Вот так может выглядеть цепочка связанного списка:

DMA SDIO Slave Linked List fig26

Рис. 26. SDIO Slave Linked List.

Устройства SDIO Host и SDIO Slave должны следовать следующим специальным процедурам для успешного обмена данными через интерфейс SDIO.

Отправка пакетов в SDIO Host. Передача пакетов Slave -> Host инициируется устройством Slave. Host будет оповещен прерыванием (для подробной информации по прерываниям см. описание протокола SDIO). После того, как Host прочитает соответствующую информацию из Slave, он инициирует подходящую транзакцию на шине SDIO. Вся эта процедура показана на рис. 27.

DMA SDIO Packet Sending Procedure Initiated by Slave fig27

Рис. 27: Процедура отправки пакета (инициируется устройством Slave).

Когда Host получил прерывание, от считывает соответствующую информацию от Slave путем обращения к регистрам SLC0HOST_INT и SLCHOST_PKT_LEN.

SLC0HOST_INT: регистр состояния прерывания. Если SLC0_RX_NEW_PACKET_INT_ST == 1, то это показывает, что у Slave есть пакет для отправки.
SLCHOST_PKT_LEN: регистр аккумулятора длины пакета. Текущее значение минус значение последнего раза равно длине пакета, отправленного в настоящий момент.

Чтобы запустить DMA, CPU должен записать младшие 20 бит адреса первого элемента связанного списка в поле SLC0_RXLINK_ADDR регистра SLC0RX_LINK, затем установить бит SLC0_RXLINK_START регистра SLC0RX_LINK. DMA автоматически завершит транзакцию данных. По завершению операции DMA вызовет срабатывание CPU, чтобы он мог освободить и/или повторно использовать пространство буфера.

Прием пакетов от SDIO Host. Передача пакетов Host -> Slave инициируется устройством Host. Устройство Slave принимает данные через DMA и сохраняет их в RAM. После завершения транзакции для CPU будет сгенерировано прерывание, чтобы он обработал принятые данные. Вся эта процедура демонстрируется на рис. 28.

DMA SDIO Packet Receiving Procedure Initiated by Host fig28

Рис. 28: Процедура приема пакета (инициируется устройством Host).

Host получает количество доступных буферов приема от Slave путем обращения к регистру SLC0HOST_TOKEN_RDATA. CPU в устройстве Slave должен обновить это значение после того, как подготовлен связанный список приема для DMA. Поле HOSTREG_SLC0_TOKEN1 в регистре SLC0HOST_TOKEN_RDATA хранит количество доступных буферов.

Host может определить доступное буферное пространство, используя HOSTREG_SLC0_TOKEN1 минус количество уже использованных буферов. Если буферов недостаточно, Host должен постоянно опрашивать этот регистр, пока не появится достаточное количество буферов. Для гарантирования достаточного количества буферов приема CPU устройства Slave должен постоянно загружать буферы в связанный список приема. Этот процесс показан на рис. 29.

DMA SDIO Loading Receiving Buffer fig29

Рис. 29. Загрузка буфера приема.

Сначала CPU должен присоединить сегменты нового буфера в конец связанного списка, который используется DMA, и доступен для приема данных.

Затем CPU должен оповестить DMA, что связанный список был обновлен. Это можно сделать путем установки бита SLC0_TXLINK_RESTART в регистре SLC0TX_LINK. Обратите внимание, что когда CPU впервые инициирует DMA для приема пакетов, бит SLC0_TXLINK_RESTART должен быть установлен в 1.

В завершение CPU обновляет информацию о любом доступном буфере путем записи в регистр SLC0TOKEN1.

Подробное описание регистров SDIO Slave и его контроллера DMA см. в руководстве [1].

Контроллер хоста SD/MMC состоит из двух основных функциональных блоков, как показано на рис 34:

Bus Interface Unit (BIU): предоставляет интерфейсы шины APB для доступа к регистрам периферийного устройства, операций чтения и записи FIFO и DMA.
Card Interface Unit (CIU): обрабатывает протоколы интерфейса внешней карты памяти. Также этот блок управляет формированием тактов.

DMA SDIO Host Block Diagram fig34

Рис. 34. Блок-схема SDIO Host.

BIU. Блок BIU предоставляет доступ к регистрам и FIFO данных через Host Interface Unit (HIU). Дополнительно BIU предоставляет доступ FIFO к независимым данным через интерфейс DMA. Интерфейс хоста может быть сконфигурирован как интерфейс APB. Рис. 34 иллюстрирует внутренние компоненты BIU. BIU предоставляет следующие функции:

• Интерфейс хоста
• Интерфейс DMA
• Управление прерываниями
• Доступ к регистрам
• Доступ к FIFO
• Управление питанием и подтяжкой сигналов (power/pull-up control) и детектирование установки карты памяти.

Субмодуль RAM это область буфера для отправки и приема. Его можно разделить на два блока: один для отправки (Transmit RAM Module), другой для приема данных (Receive RAM Module). Процесс отправки и приема данных также может быть осуществляться чтением и записью со стороны CPU и DMA. Доступ со стороны DMA описано подробнее ниже в разделе "Структура связанного списка".

Transmit RAM Module. Есть 2 способа разрешить операцию записи: чтение/запись DMA и чтение/запись CPU. Если разрешена отправка SDIO, то данные могут быть записаны для перемещения модулем RAM через интерфейс APB или DMA. Данные записываются из регистра EMAC_FIFO напрямую в CPU, через интерфейс APB.

Receive RAM Module. Есть 2 способа разрешить операцию чтения: чтение/запись DMA и чтение/запись CPU. Когда подсистема карты принимает данные, они будут записываться в буфер RAM. Затем эти данные принимающей стороной могут быть прочитаны либо методом обращения через APB, или методом DMA. Регистр EMAC_FIFO может быть напрямую прочитан через APB.

Цепочка дескрипторов. Каждый элемент связанного списка состоит из двух частей: сам связанный список, и буфер данных. Другими словами, каждый элемент списка указывает на уникальный буфер данных и связанный список, который следует за этим элементом. Рис. 38 показывает цепочку дескрипторов.

DMA SDIO Slave Linked List fig26

Рис. 38: Descriptor Chain.

[Структура связанного списка]

Каждый элемент списка состоит из 4 слов. Рис. 39 демонстрирует структуру связанного списка, и таблицы 34 .. 37 предоставляют описание полей слов элемента связанного списка.

DMA SDIO Host Structure Linked List fig39

Рис. 39: Структура Linked List.

DES0 содержит информацию управления и состояния.

Таблица 34. DES0.

Биты Имя Описание
31 OWN 0: показывает, что этим дескриптором владеет Host.
1: показывает, что этим дескриптором владеет DMAC. DMAC очистит этот бит, когда завершит перемещение данных.
30 CES Card Error Summary. Эти биты ошибки указывают на состояние транзакции в карту или из карты. Следующие биты также присутствуют в RINTSTS, и бит CES будет установлен, если установлен хотя бы один из следующих бит ошибки:
• EBE: End Bit Error
• RTO: Response Time out
• RCRC: Response CRC
• SBE: Start Bit Error
• DRTO: Data Read Timeout
• DCRC: Data CRC for Receive
• RE: Response Error
29:6   Зарезервировано
5 ER End of Ring.
1: показывает, что список достиг своего конечного дескриптора. Затем DMAC возвратится к базовому адресу списка, создавая кольцо дескрипторов (Descriptor Ring).
4 CH Second Address Chained.
1: показывает, что второй адрес в дескрипторе это адрес следующего дескриптора (Next Descriptor Address). В этом случае BS2 (DES1[25:13]) все должны быть нулевые.
3 FD First Descriptor.
1: показывает, что этот дескриптор содержит первый буфер данных. Если размер первого буфера 0, то следующий дескриптор (Next Descriptor) содержит начало данных.
2 LD Last Descriptor.
Этот бит ассоциируется с последним блоком транзакции DMA. 1: показывает, что буферы данных, на которые указывает этот дескриптор, последние. После завершения этого дескриптора оставшееся количество байт нулевое. Другими словами, после этого дескриптора с установленным биом LD, оставшееся количество байт должно быть 0.
1 DIC Disable Interrupt on Completion.
1: предотвращает установку бита TI/RI в регистре DMAC Status Register (IDSTS) для данных, которые завершаются в буфере, на который указывает этот дескриптор (запрет прерывания по завершению).
0   Зарезервировано

DES1 содержит размер буфера.

Таблица 35. DES1.

Биты Имя Описание
31:26   Зарезервировано
25:13   Зарезервировано
12:0 BS1 Buffer 1 Size.
Показывает размер буфера данных, который должен нацело делиться на 4. В случае, когда размер буфера не делится на 4, результат поведения не определен. Это поле не должно быть нулевым.

DES2 содержит указатель на буфер данных.

Таблица 36. DES2.

Биты Имя Описание
31:0 Buffer Address Pointer 1 Физический адрес буфера данных.

DES3 содержит указатель на следующий дескриптор в цепочке, если текущий дескриптор не последний в цепочке дескрипторов.

Таблица 37. DES3.

Биты Имя Описание
31:0 Next Descriptor Address Если установлен бит Second Address Chained (DES0[4]), то это указатель на физическую память, где находится следующий дескриптор. Если это не последний дескриптор, то значение Next Descriptor Address должно нацело делиться на 4 (DES3[1:0] == 0).

Инициализация DMAC. Инициализация контроллера DMAC должна быть выполнена следующим образом:

• Запись в регистр DMAC Bus Mode (BMOD_REG) установит параметры доступа шины хоста.
• Запись в регистр DMAC Interrupt Enable (IDINTEN), с маскированием ненужных прерываний.
• Программный драйвер создает связанный список либо передачи, либо приема. Затем записывается регистр DMAC Descriptor List Base Address (DBADDR), предоставляя для DMAC начального адреса списка.
• DMAC engine пытается захватить дескрипторы из предоставленного списка.

Инициализация передачи DMAC. Передача DMAC осуществляется следующим образом:

1. Хост настраивает элементы дескриптора (DES0-DES3) для передачи, и установит бит OWN (DES0[31]). Также хост подготавливает буфер данных.

2. Хост программирует команду write-data в регистр команд (CMD) блока BIU.

3. Также хост программирует требуемый порог передачи (поле TX_WMARK в регистре FIFOTH).

4. DMAC engine захватывает дескриптор, и проверяет его бит OWN. Если бит OWN не установлен, то это означает, что хост владеет этим дескриптором. В этом случае DMAC входит в состояние приостановки, и выставляет прерывание Descriptor Unable в регистре IDSTS. В такой ситуации хосту надо освободить DMAC записью значения в PLDMND_REG.

5. Затем выполняется ожидание бита завершения команды Command Done (CD) и при отсутствии ошибок от BIU, это означает, что транзакция может быть завершена.

6. Впоследствии DMAC engine ждет запроса интерфейса DMA (dw_dma_req) от BIU. Этот запрос генерируется на основе запрограммированного значения порога передачи. Для последних байт данных, к которым нельзя получить доступ с использованием пакетной передачи, одиночные транзакции выполняются на AHB Master Interface.

7. DMAC захватывает данные из буфера в памяти хоста, и передает их в FIFO для передачи на карту.

8. Когда данные распределены по нескольким дескрипторам, DMAC захватывает следующий дескриптор и расширяет свою операцию с использованием этого следующего дескриптора. Бит последнего дескриптора показывает, распространяются данные на несколько дескрипторов, или нет.

9. Когда передача завершена, информация статуса обновляется в регистре IDSTS путем установки прерывания передачи (Transmit Interrupt), если оно было разрешено. Также очистится бит OWN контроллером DMAC путем выполнения транзакции записи в DES0.

Инициализация приема DMAC. Прием DMAC осуществляется следующим образом:

1. Хост настраивает элементы (DES0 - DES3) для приема, и устанавливает бит OWN (DES0[31]).

2. Хост программирует команду read-data в регистр CMD блока BIU.

3. Хост программирует требуемый уровень порога приема (поле RX_WMARK в регистре FIFOTH).

4. DMAC engine захватывает дескриптор и проверяет бит OWN. Если бит OWN не установлен, то это значит, что хост владеет этим дескриптором. В этом случае, DMA входит в состояние приостановки, и выставляет прерывание Descriptor Unable в регистре IDSTS register. Для такой ситуации хосту нужно освободить DMAC записью любого значения в регистр PLDMND_REG.

5. Затем выполняется ожидание бита завершения команды Command Done (CD) и при отсутствии ошибок от BIU, это означает, что транзакция может быть завершена.

6. Впоследствии DMAC engine ждет запроса интерфейса DMA (dw_dma_req) от BIU. Этот запрос генерируется на основе запрограммированного значения порога приема. Для последних байт данных, к которым нельзя получить доступ с использованием пакетной передачи, на AHB Master Interface выполняются одиночные транзакции.

7. DMAC захватывает данные из FIFO, и передает их в память хоста.

8. Когда данные распределены по нескольким дескрипторам, DMAC захватывает следующий дескриптор и расширяет свою операцию с использованием этого следующего дескриптора. Бит последнего дескриптора показывает, распространяются данные на несколько дескрипторов, или нет.

9. Когда прием данных завершен, обновляется информация статуса в регистре IDSTS путем установки прерывания приема (Receive Interrupt), если оно было разрешено. Также очищается бит OWN контроллером DMAC путем выполнения транзакции записи в DES0.

Подробное описание регистров SD/MMC Host и прерываний см. в руководстве [1].

Ethernet DMA оборудован независимыми подсистемами передачи и приема, и пространством регистров управления и состояния CSR (Control and Status Registers). Подсистема передачи (Transmit engine) перемещает данные из системной памяти в порт устройства (MTL), в то время как подсистема приема (Receive engine) перемещает данные из порта устройства в память системы. Контроллер использует дескрипторы для эффективного перемещения данных из места источника в место назначения с минимальной тратой процессорного времени CPU. DMA разработан для транзакций, ориентированных на передачу пакетов, таких как кадр (фрейм) Ethernet. Контроллер может быть запрограммирован для прерывания Host CPU в нормальных ситуациях, таких как завершение приема или передачи кадра, или когда произошли ошибки.

Ниже описывается структура связанных списков и дескрипторов. Каждый связанный список состоит из 8 слов.

Дескрипторы передачи. Структура связанных списков передачи показана на рис. В таблицах от 43 до 48 приведено описание полей дескрипторов элемента связанного списка.

DMA Ethernet Transmit Descriptor fig49

Рис. 49: Transmit Descriptor.

Таблица 43. Transmit Descriptor 0 (TDES0).

Биты Имя Описание
31 OWN 0: показывает, что этим дескриптором владеет Host.
1: показывает, что этим дескриптором владеет DMA. DMAC очистит этот бит, либо когда завершит передачу фрейма, либо когда пустые буферы, выделенные для дескриптора.
30 IC Interrupt on Completion. Когда установлен, этот бит установит прерывание передачи (Transmit Interrupt, Register 5[0]) после того, как был передан текущий фрейм. Этот бит достоверен только когда установлен бит последнего сегмента (TDES0[29]).
29 LS Last Segment. Когда установлен, этот бит показывает, что буфер содержит последний сегмент фрейма. В этом случае поле TBS1 или TBS2 в TDES1 должно иметь ненулевое значение.
28 FS First Segment. Когда установлен, этот бит показывает, что буфер содержит первый сегмент фрейма.
27 DC Disable CRC. Когда этот бит установлен, MAC не добавляет контрольную сумму (CRC) в конец передаваемого фрейма. Это допустимо только когда установлен флаг первого сегмента FS (TDES0[28]).
26 DP Disable Pad.
0: MAC автоматически дополняет пустыми байтами фрейм, который короче 64 байт, и добавляет CRC независимо от состояния бита DC (TDES0[27]). Это допустимо только когда установлен флаг первого сегмента FS (TDES0[28]).
1: MAC не дополняет автоматически фрейм, который короче 64 bytes.
25 TTSE Transmit Timestamp Enable.
Когда установлен, этот бит разрешает аппаратную метку времени IEEE1588 для передачи фрейма, на который ссылается этот дескриптор. Это поле допустимо только когда установлен флаг первого сегмента FS (TDES0[28]).
24 CRCR CRC Replacement Control.
Когда этот бит установлен, MAC заменит последние 4 байта передаваемого пакета на пересчитанную CRC. Хост должен гарантировать, что байты CRC присутствуют во фрейме, передаваемом из буфера передачи. Этот бит допустим только когда установлен флаг первого сегмента FS (TDES0[28]). Кроме того, замена CRC выполняется только когда бит TDES0[27] установлен в 1.
23:22 CIC Checksum Insertion Control.
Эти биты управляют вычислением и вставкой контрольной суммы (CRC). Следующий список описывает кодирование этих бит:
00: вставка CRC запрещена.
01: разрешено вычисление и вставка CRC только для заголовка IP.
10: разрешены вычисление и вставка заголовка IP и полезной нагрузки, однако pseudo-header checksum аппаратно не вычисляется.
11: разрешены вычисление и вставка заголовка IP и полезной нагрузки, и pseudo-header checksum вычисляется аппаратно.

Это поле допустимо только когда установлен флаг первого сегмента FS (TDES0[28]) .
21 TER Transmit End of Ring.
Когда установлен, этот бит показывает, что список достиг конечного дескриптора. DMA вернется к базовому адресу списка, создавая кольцо дескрипторов (Descriptor Ring).
20 TCH Second Address Chained.
Когда установлен, этот бит показывает, что второй адрес в дескрипторе это адрес следующего дескриптора (Next Descriptor Address), а не адрес второго буфера. Когда установлен TCH (TDES0[20]), поле TBS2 (TDES1[28:16]) не имеет значения. TER (TDES0[21]) имеет приоритет над TCH (TDES0[20]). Этот бит должен быть установлен в 1.
19:18 VLIC VLAN Insertion Control.
Когда это поле ненулевое, оно побуждают MAC выполнить вставку тега/метки VLAN (tagging) или выполнить извлечение тега VLAN (untagging) перед передачей фрейма. Если фрейм был модифицирован метками VLAN, то MAC автоматически пересчитает и заменит байты CRC. Следующий список описывает значение этих бит:
00: не добавлять тег VLAN.
01: удалить тег VLAN из фреймов перед передачей. Эта опция должна использоваться только с фреймами VLAN.
10: вставка тега VLAN со значением, запрограммированным в регистр VLAN Tag Inclusion or Replacement.
11: замена тега VLAN во фреймах на значение тега, запрограммированного в регистр VLAN Tag Inclusion or Replacement. Эта опция должна использоваться только с фреймами VLAN.
17 TTSS Transmit Timestamp Status.
Это поле используется в качестве бита статуса, чтобы показать, что метка времени была захвачена для описываемого фрейма передачи. Когда этот бит установлен, TDES2 и TDES3 содержат метку времени, захваченную для фрейма передачи. Это поле допустимо только когда установлен бит последнего сегмента LS (TDES0[29]).
16 IHE IP Header Error.
Когда установлен, этот бит показывает, что передатчик MAC определил ошибку датаграммы заголовка IP. Передатчик проверяет длину заголовка в пакете IPv4 на количество байт заголовка, полученное от приложения, и выдает статус ошибки, если произошло несовпадение. Для фреймов IPv6 об ошибке заголовка сообщается, если основная длина заголовка не равна 40 байтам. Кроме того значение поля Ethernet Length/Type для фрейма IPv4 или IPv6 должно совпадать с версией заголовка IP, принятой с пакетом. Для фреймов IPv4 будет также показан статус ошибки, если поле длины заголовка меньше 0x5.
15 ES Error Summary.
Этот бит будет установлен, если установится хотя бы один из следующих бит ошибки:
TDES0[14]: Jabber Timeout
TDES0[13]: Frame Flush
TDES0[11]: Loss of Carrier
TDES0[10]: No Carrier
TDES0[9]: Late Collision
TDES0[8]: Excessive Collision
TDES0[2]: Excessive Deferral
TDES0[1]: Underflow Error
TDES0[16]: IP Header Error
TDES0[12]: IP Payload Error
14 JT Jabber Timeout.
Когда установлен, этот бит показывает, что MAC обнаружил jabber timeout. Этот бит установится только когда не установлен бит EMACJABBER регистра EMACCONFIG_REG.
13 FF Frame Flushed.
Когда установлен, этот бит показывает, что DMA или MTL сбросил фрейм из-за того, что CPU выдал команду Flush.
12 IPE IP Payload Error.
Когда установлен, этот бит показывает, что передатчик MAC определил ошибку в полезной нагрузке IP-датаграммы пакета TCP, UDP или ICMP. Передатчик проверяет длину полезной нагрузки, принятой в заголовке IPv4 или IPv6 на совпадение с реальным количеством байт пакета TCP, UDP или ICMP, полученным от приложения, и выдает ошибку, если обнаружено несовпадение.
11 LOC Loss of Carrier.
Когда установлен, этот бит показывает, что произошла потеря несущей во время передачи фрейма (т. е. сигнал MII_CRS был неактивен в время одного или большего количества периодов тактов во время передачи фрейма). Это допустимо только для фреймов, передаваемых без коллизии, когда MAC работает в режиме half-duplex.
10 NC No Carrier.
Когда установлен, этот бит показывает, что сигнал определения несущей Carrier Sense от PHY не был выставлен во время передачи.
9 LC Late Collision.
Когда установлен, этот бит показывает, что передача фрейма была оборвана из-за коллизии после окна коллизии (64 байт, включая Preamble в режиме MII, и 512 байт включая Preamble и Carrier Extension). Этот бит недопустим, если установлен бит Underflow Error.
8 EC Excessive Collision.
Когда установлен, этот бит показывает, что передача была оборвана после 16 следующих друг за другом коллизий при попытке передать текущий фрейм. Если установлен бит EMACRETRY в регистре EMACCONFIG_REG, то этот бит установится после первой коллизии, и будет оборвана передача фрейма.
7 VF VLAN Frame.
Если этот бит установлен, то это показывает, что у передаваемого фрейма тип VLAN.
6:3 Ctrl/status Эти биты статуса показывают количество коллизий, которое произошло перед тем, как фрейм был передан. Это количество недостоверно, когда установлен бит EC (TDES0[8]). Ядро обновит это поле статуса только в режиме half-duplex.
2 ED Excessive Deferral.
Когда установлен, этот бит показывает, что передача была завершена из-за excessive deferral больше чем 24288 бит (если разрешен Jumbo Frame), если установлен бит EMACDEFERRAL регистра EMACCONFIG_REG.
1 UF Underflow Error.
Когда установлен, этот бит показывает, что MAC оборвал фрейм из-за того, что слишком поздно поступили данные из памяти хоста (недогрузка). Underflow Error показывает, что DMA в процессе передачи фрейма встретился с пустым буфером передачи. Процесс передачи входит в состояние приостановки (Suspended state), и установятся оба бита Bit[5] в Transmit Underflow Register (Status Register) и Bit[0] в Transmit Interrupt Register (Status Register).
0 DB Deferred Bit.
Когда установлен, этот бит показывает, что MAC отложил передачу из-за наличия несущей. Этот бит допустим только в режиме half-duplex.

Таблица 44. Transmit Descriptor 1 (TDES1).

Биты Имя Описание
31:29 SAIC SA Insertion Control.
Эти биты побуждают MAC добавить или заменить поле Source Address (адрес источника) во фрейме Ethernet значением, которое присутствует в регистре MAC Address 0. Если поле Source Address во фрейме изменено, то MAC автоматически пересчитает и заменит байты CRC. Бит [31] указывает значение MAC Address Register value (1 или 0), который используется для вставки или замены Source Address. Следующий список описывает смысл значений бит [30:29]:
00: не добавлять адрес источника.
01: подключить или добавить адрес источника. Для надежной передачи приложение должно предоставить фреймы без адреса источника.
10: замена адреса источника. Для надежной передачи приложение должно предоставить фреймы с адресом источника.
11: зарезервировано.

Эти биты допустимы, когда установлен бит первого сегмента FS (TDES0[28]).
28:16   Зарезервировано
15:13   Зарезервировано
12:0 TBS1 Transmit Buffer 1 Size.
Эти биты показывают размер буфера данных в байтах. Если это поле равно 0, то DMA игнорирует этот буфер, и использует Buffer 2 или следующий дескриптор.

Таблица 45. Transmit Descriptor 2 (TDES2).

Биты Имя Описание
31:0 Buffer 1 Address Pointer Физический адрес буфера данных 1.

Таблица 46. Transmit Descriptor 3 (TDES3).

Биты Имя Описание
31:0 Next Descriptor Address Указатель на физическую память, где находится следующий дескриптор.

Таблица 47. Transmit Descriptor 6 (TDES6).

Биты Имя Описание
31:0 TTSL Transmit Frame Timestamp Low.
Это поле обновляется DMA младшими значащими 32 битами метки времени, захваченной для соответствующего фрейма передачи. Это поле имеет метку времени только если установлен бит последнего сегмента LS, и также установлен бит статуса метки времени (TTSS).

Таблица 48. Transmit Descriptor 7 (TDES7).

Биты Имя Описание
31:0 TTSH Transmit Frame Timestamp High.
Это поле обновляется DMA старшими значащими 32 битами метки времени, захваченной для соответствующего фрейма передачи. Это поле имеет метку времени только если установлен бит последнего сегмента LS, и также установлен бит статуса метки времени (TTSS).

Дескрипторы приема. Структура связанных списков приема показана на рис. 50. Таблицы от 49 до 55 предоставляют описание полей дескрипторов элемента связанного списка.

DMA Ethernet Receive Descriptor fig50

Рис. 50. Receive Descriptor.

Таблица 49. Receive Descriptor 0 (RDES0).

Биты Имя Описание
31 OWN 0: показывает, что этим дескриптором владеет Host.
1: показывает, что этим дескриптором владеет DMA DWC_gmac. DMA очистит этот бит, когда завершит прием данных, или когда будут заполнены буферы, связанные с этим дескриптором.
30 AFM Destination Address Filter Fail.
Когда установлен, этот бит показывает сбой фрейма в DA Filter MAC.
29:16 FL Frame Length.
Эти биты показывают длину в байтах принятого фрейма, который был передан в память хоста. Эта поле допустимо, когда установлен бит последнего дескриптора LS (RDES0[8]), и сброшен либо бит ошибки дескриптора DE (RDES0[14]), либо бит ошибки переполнения OE (RDES0[11]). Длина фрейма также включает 2 байта, добавленных к фрейму Ethernet, когда разрешено вычисление контрольной суммы IP (Type 1), и принятый фрейм не является фреймом MAC control.
15 ES Error Summary.
Этот бит установится, если был установлен хотя бы один из следующих бит:
RDES0[1]: CRC Error
RDES0[3]: Receive Error
RDES0[4]: Watchdog Timeout
RDES0[6]: Late Collision
RDES0[7]: Giant Frame
RDES4[4:3]: IP Header or Payload Error
RDES0[11]: Overflow Error
RDES0[14]: Descriptor Error

Это поле допустимо только когда установлен бит последнего дескриптора LS (RDES0[8]).
14 DE Descriptor Error.
Когда установлен, этот бит показывает не усечение фрейма, вызванное фреймом, который не помещается в буферы текущего дескриптора, и DMA не владеет следующим дескриптором. Эта поле допустимо, только когда установлен бит последнего дескриптора LS (RDES0[8]).
13 SAF Source Address Filter Fail.
Когда установлен, этот бит показывает, что в поле SA фрейма произошел сбой фильтра SA в MAC.
12 LE Length Error.
Когда установлен, этот бит показывает, что реальная длина принятого фрейма не совпадает с полем Length/Type. Этот бит достоверен только когда сброшен бит типа фрейма FT (RDES0[5]).
11 OE Overflow Error.
Когда установлен, этот бит показывает, что принятый фрейм был поврежден из-за переполнения буфера в MTL.
10 VLAN VLAN Tag.
Когда установлен, этот бит показывает, что фрейм, на который указывает этот дескриптор, является фреймом VLAN, которому MAC присвоил метку VLAN (tag). Присвоение метки VLAN зависит зависит от проверки полей VLAN принятого фрейма на основе настроек VLAN Tag Register.
9 FS First Descriptor.
Когда установлен, бит показывает, что этот дескриптор содержит первый буфер фрейма. Если размер первого буфера равен 0, второй буфер содержит начало фрейма. Если размер второго буфера также 0, то следующий дескриптор содержит начало фрейма.
8 LS Last Descriptor.
Когда установлен, бит показывает, что буферы, на которые показывает этот дескриптор, последние в этом фрейме.
7 Timestamp Available, IP Checksum Error (Type1) или Giant Frame Когда присутствует функция Advanced Timestamp, и когда установлен этот бит, это показывает, что захват метки времени записан в слова 6 (RDES6) и 7 (RDES7) дескриптора. Это допустимо только когда установлен бит последнего дескриптора LS (RDES0[8]).
Когда выбрана IP Checksum Engine (Type 1), то этот бит, если установлен, показывает одно из следующего:
• Контрольная 16-битная сумма заголовка IPv4, вычисленная ядром, не совпадает с принятыми байтами контрольной суммы.
• Для фреймов non-IPv4 проверка контрольной суммы пропущено.

Иначе, когда этот бит установлен, это показывает Giant Frame Status. Фреймы Giant, которые больше 1518 байт (или 1522 байт для VLAN или 2000 байт, когда установлен бит [27] MAC Configuration register), нормальные фреймы и фреймы больше чем 9018 байт (9022 байт для VLAN), когда разрешена обработка Jumbo Frame.
6 LC Late Collision.
Когда установлен, этот бит показывает, что произошла поздняя коллизия во время приема фрейма в режиме half-duplex.
5 FT Frame Type.
Когда установлен, этот бит показывает, что принятый фрейм имеет тип Ethernet (поле LT больше или равно 1536). Когда этот бит сброшен, это показывает, что принятый фрейм IEEE 802.3. Этот бит недопустим для урезанных фреймов (Runt frame), которые меньше 14 байт.
4 RWT Receive Watchdog Timeout.
Когда установлен, этот бит показывает истечение таймаута Receive Watchdog Timer во время приема текущего фрейма, и этот фрейм обрезан после Watchdog Timeout.
3 RE Receive Error.
Когда установлен, этот бит показывает, что выставлен сигнал MII_RXER, когда во время приема фрейма установлен MII_RXDV.
2 DE Dribble Bit Error.
Когда установлен, этот бит показывает, что принятый фрейм имеет не целое количество байт (нечетное количество нибблов). Этот бит допустим только в режиме MII.
1 CE CRC Error.
Когда установлен, этот бит показывает, что произошла ошибка контрольной суммы на принятом фрейме. Это поле допустимо только когда установлен бит последнего дескриптора LS (RDES0[8]).
0 Extended Status Available / Rx MAC Address Когда присутствует либо Advanced Timestamp или IP Checksum Offload (Type 2), этот бит, когда установлен, показывает доступность расширенного статуса в слове 4 дескриптора (RDES4). Это допустимо только когда установлен бит последнего дескриптора LS (RDES0[8]). Этот бит недопустим, когда установлен бит 30.

Когда присутствует IP Checksum Offload (Type 2), этот бит установится даже когда подсистема IP Checksum Offload пропустила обработку принятого фрейма. Пропуск может быть по причине non-IP фрейма, или IP фрейма с полезной нагрузкой non-TCP/UDP/ICMP.

Когда не выбрана функция Advance Timestamp или IPC Full Offload, этот бит показывает статус Rx MAC Address. Когда установлен, этот показывает, что значение регистра Rx MAC Address (от 1 до 15) совпадает с полем DA фрейма. Когда сброшен, этот бит показывает, что значение Rx MAC Address Register 0 совпадает с полем DA.

Таблица 50. Receive Descriptor 1 (RDES1).

Биты Имя Описание
31 Ctrl Когда установлен, этот бит предотвращает установку бита RI регистра статуса (CSR5[6]) для принятого фрейма, который заканчивается в буфере, соответствующем этому дескриптору. Это, в свою очередь, блокирует установку прерывания для Host из-за RI на этом фрейме.
30:29   Зарезервировано
28:16   Зарезервировано
15 RER Receive End of Ring.
Когда установлен, этот бит показывает, что список достиг своего конечного дескриптора. DMA вернется к базовому адресу списка, создавая кольцо дескрипторов (Descriptor Ring).
14 RCH Second Address Chained.
Когда установлен, этот бит показывает, что второй адрес в дескрипторе является адресом следующего дескриптора (Next Descriptor Address), а не адрес второго буфера. Когда этот бит установлен, значение RBS2 (RDES1[28:16]) не имеет смысла. RER (RDES1[15]) имеет приоритет перед RCH (RDES1[14]).
13   Зарезервировано
12:0 RBS1 Receive Buffer 1 Size.
Показывает размер первого буфера данных в байтах. Размер буфера должен нацело делиться на 4, даже если значение RDES2 (указатель на Buffer 1) не выровнен на ширину шины. Когда размер буфера не делится нацело на 4, результирующее поведение не определено. Если это поле равно 0, то DMA игнорирует этот буфер, и использует Buffer 2, или следующий дескриптор, в зависимости от значения бита RCH (RDES1[14]).

Таблица 51. Receive Descriptor 2 (RDES2).

Биты Имя Описание
31:0 Buffer 1 Address Pointer Физический адрес буфера данных 1.

Таблица 52. Receive Descriptor 3 (RDES3).

Биты Имя Описание
31:0 Next Descriptor Address Указатель на физическую память, где находится следующий дескриптор.

Таблица 53. Receive Descriptor 4 (RDES4).

Биты Имя Описание
31:15   Зарезервировано
14 Timestamp Dropped Когда установлен, этот бит показывает, что была захвачена метка времени для этого фрейма, но она была отброшена из-за переполнения в MTL Rx FIFO.
13 PTP Version Когда установлен, этот бит показывает, что принятое сообщение PTP имеет формат IEEE 1588 version 2. Когда этот бит сброшен, то используется формат version 1.
12 PTP Frame Type Когда установлен, этот бит показывает, что сообщение PTP отправлено напрямую через Ethernet. Когда этот бит сброшен, и тип сообщения ненулевой, то это показывает, что сообщение PTP отправлено через UDP-IPv4 или UDP-IPv6. Информация о том, IPv4 или IPv6, может быть получена из бит 6 и 7.
11:8 Message Type Эти биты кодируют тип принятого сообщения.
0000: не было принято сообщение PTP
0001: SYNC (все типы тактов)
0010: Follow_Up (все типы тактов)
0011: Delay_Req (все типы тактов)
0100: Delay_Resp (все типы тактов)
0101: Pdelay_Req (в прозрачных тактах peer-to-peer)
0110: Pdelay_Resp (в прозрачных тактах peer-to-peer)
0111: Pdelay_Resp_Follow_Up (в прозрачных тактах peer-to-peer)
1000: Announce
1001: Management
1010: Signaling
1011-1110: зарезервировано
1111: пакет PTP с зарезервированным типом сообщения
7 IPv6 Packet Received Когда установлен, этот бит показывает, что принятый пакет IPv6. Этот бит обновляется только когда бит установлен бит 10 (IPC) регистра конфигурации (MAC Configuration Register).
6 IPv4 Packet Received Когда установлен, этот бит показывает, что принятый пакет IPv4. Этот бит обновляется только когда бит установлен бит 10 (IPC) регистра конфигурации (MAC Configuration Register).
5 IP Checksum Bypassed Когда установлен, этот бит показывает, что подсистема контрольной суммы пропущена.
4 IP Payload Error Когда установлен, этот бит показывает, что вычисленная ядром 16-битная контрольная сумма полезной нагрузки IP (т. е. контрольная сумма TCP, UDP или ICMP) не совпадает с соответствующим полем контрольной суммы принятого сегмента. Этот бит также установится, когда длина сегмента TCP, UDP или ICMP не совпадает со значением длины полезной нагрузки в поле заголовка IP. Этот бит допустим, когда установлен бит 7 или бит 6.
3 IP Header Error Когда установлен, этот бит показывает, что либо не совпадает 16-битная контрольная сумма заголовка IPv4, вычисленная ядром, либо версия датаграммы IP не соответствует значению Ethernet Type. Этот бит допустим, когда установлен бит 7 или бит 6.
2:0 IP Payload Type Эти биты кодируют тип полезной нагрузки, инкапсулированной в датаграмме IP, обработанной подсистемой проверки контрольной суммы (Receive Checksum Offload Engine, COE). COE также установит биты 00, если она не обработала полезную нагрузку датаграммы IP из-за ошибки заголовка IP или из-за фрагментированного IP.
000: неизвестный тип, или не была обработана полезная нагрузка IP
001: UDP
010: TCP
011: ICMP
1xx: зарезервировано

Этот бит допустим, когда установлен бит 7 или бит 6.

Таблица 54. Receive Descriptor 6 (RDES6).

Биты Имя Описание
31:0 RTSL Receive Frame Timestamp Low.
Это поле обновляется DMA младшими значащими 32 битами метки времени, захваченной для соответствующего фрейма передачи. Это поле обновляется DMA только для последнего дескриптора принятого фрейма который показывается битом LS (RDES0[8]).

Таблица 55. Receive Descriptor 7 (RDES7).

Биты Имя Описание
31:0 RTSH Receive Frame Timestamp High.
Это поле обновляется DMA старшими значащими 32 битами метки времени, захваченной для соответствующего фрейма передачи. Это поле обновляется DMA только для последнего дескриптора принятого фрейма который показывается битом LS (RDES0[8]).

Подробное описание регистров Ethernet и его контроллера DMA см. в руководстве [1].

Контроллер DMA с двумя каналами DMA может использоваться для вывода двух каналов DAC. Путем конфигурирования SENS_SAR_DAC_DIG_FORCE, I2S_clk может быть подключен к DAC clk, и I2S_DATA_OUT может быть подключен к DAC_DATA для прямого доступа к памяти.

Подробное описание регистров DAC см. в руководстве [1].

[Словарик]

AHB Advanced High-performance Bus.

APB Advanced Peripheral Bus.

DMAC DMA Controller.

EMAC Ethernet Media Access Controller.

EOF End-Of-File, конец файла.

MTL MAC transaction layer, низкий уровень транзакций Ethernet, использующий MAC-адреса.

PTP Precision Time Protocol, протокол передачи точного времени.

[Ссылки]

1. ESP32 Technical Reference Manual DMA Controller site:docs.espressif.com.
2. ESP32: устройство системы и памяти.
3ESP32: управление энергопотреблением.

 

Добавить комментарий


Защитный код
Обновить

Top of Page