Контекст DMA, образующий независимый канал DMA, состоит из контекстной программы и регистров контроллера. Контекстная программа — это список команд, отрабатываемых контроллером для передачи и приема пакетов данных. Каждый контекст DMA представлен в контроллере своим блоком регистров, в который входят регистры ContextControl (управление и состояние) и CommandPtr (указатель на команду). В дополнение к этому контексты изохронного приема имеют свои регистры шаблонов совпадений ContextMatch и общий регистр масок мультиканального приема. В последующем описании указывается смещение регистров относительно начального адреса своего блока регистров.
Управляющий регистр ContextControl контекста представлен парой регистров ContextControlSet (+0h) и ContextControlClear (+4h), обеспечивающих установку, сброс и чтение битов и полей. Формат регистра для асинхронных контекстов приведен на рисунке ниже, форматы регистров для изохронных контекстов описаны в соответствующем разделе. Назначение полей, используемых в регистрах всех контекстов, приведено далее:
Код | События | Контексты |
00 | evt_no_status, нет индикации события | AT, AR, IT, IR |
01 | reserved | |
02 | evt_long_packet, длина данных в принятом пакете больше, чем размер буфера | IR |
03 | evt_missing_ack, потерян пакет подтверждения ack | AT |
04 | evt_underrun, недостаточно данных в FIFO, переданный пакет усечен | AT |
05 | evt_overrun, переполнение FIFO при изохронном приеме | IR |
06 | evt_descriptor_read, неисправимая ошибка при чтении дескриптора контроллером | AT, AR, IT, IR |
07 | evt_data_read, неисправимая ошибка при чтении контроллером из памяти данных для передачи | AT, IT |
08 | evt_data_write, неисправимая ошибка при записи данных в память хоста | AR, IR, IT |
09 | evt_bus_reset, признак приема пакета, синтезированного по обнаружении сброса на шине | AR |
0A | evt_timeout, не удалась своевременно отправка пакета асинхронного ответа или изохронный контекст не смог записать число пропущенных циклов | AT, IT |
0B | evt_tcode_err, неверный код транзакции в принятом пакете | AT, IT |
0C-0D | Резерв | |
0E | evt_unknown, неизвестная ошибка | AT, AR, IT, IR |
0F | evt_flushed, пакет был отброшен из-за сброса шины | AT |
10 | Резерв | |
11 | ack_complete, пакет запроса или ответа от хоста успешнопринят узлом назначения и на этом транзакция завершена. Для пакетов, не требующих подтверждений, этот признак устанавливается автоматически | AT, AR, IT, IR |
12 | ack_pending, пакет запроса от хоста принят успешно узлом назначения, субакция ответа последует позже | AT, AR |
13 | Резерв | |
14 | ack_busy_X, переданный пакет не принимается узлом назначения (после исчерпания лимита попыток повторов), последний полученный код подтверждения — ack_busy_X | AT |
15 | ack_busy_A, переданный пакет не принимается узлом назначения (после исчерпания лимита попыток повторов), последний полученный код подтверждения — ack_busy_A | AT |
16 | ack_busy_B, переданный пакет не принимается узлом назначения (после исчерпания лимита попыток повторов), последний полученный код подтверждения — ack_busy_B | AT |
17-1A | Резерв | |
1B | ack_tardy, узел назначения не может принять пакет, поскольку его LINK приостановлен (в состоянии suspended) | AT |
1C | Резерв | |
1D | ack_data_error, AT-контекст принял пакет ack_data_error или изохронный контекст обнаружил ошибку CRC или длины данных (при приеме каждого пакета в отдельный буфер) | AT, IR |
1E | ack_type_error, недопустимый тип транзакции | AT, AR |
1F | Резерв |
Регистр CommandPtr (+Ch) содержит указатель на блок дескрипторов (старшие 28 бит адреса в поле descriptorAddress) и индикатор длины этого блока (поле Z). Длина (поле Z) указывается в 16-байтных блоках; дескрипторы выровнены по границе параграфа (младшие 4 бита — нулевые). Индикатор Z = 0 означает недействительность указателя — признак окончания контекстной программы. Допустимое число блоков в дескрипторе зависит от типа контекста. При инициализации контекста в регистр заносится указатель на начальный блок дескрипторов и их число в блоке. Дальнейшая программная модификация регистра допустима лишь при нулевом значении признаков run и active. Чтение регистра, в зависимости от состояния признаков run, dead, active и wake, дает различные значения указателей:
Инициализация контекста начинается с проверки состояния — биты run, active и dead должны быть сброшены. При этом условии в регистр CommandPtr помещается указатель на блок дескрипторов (и длина блока), после чего можно программно установить бит run.
Добавление дескрипторов в список возможно в любое время. Для этого в памяти формируется дескриптор или связанный список дескрипторов, и указатель на него (и поле Z) помещается в адрес перехода, находящийся в последнем дескрипторе прежнего списка. После этого необходимо программно установить бит wake — указать контроллеру на обновление списка.
Остановка контекста выполняется программным сбросом бита wake, но это может и не привести к немедленной остановке. Признаком остановки контекста после сброса run является обнуленный бит active.