Кольцевой буфер RIRB (Response Input Ring Buffer) содержит 32-битные слова ответов у приходящих в каждом кадре от кодеков, дополняемые 32-битным словом расширения, генерируемым контроллером. Ответы могут быть ожидаемыми (solicit) ответами на команды и неожиданными (unsolicit); последние идентифицируются тегами, размещенными в старших 6 битах ответа и признаком в слове расширения. В слове расширения указывается 4-битный номер кодека, приславшего ответ, и признак неожиданного ответа. Размер буфера может составлять 2, 16 или 256 элементов. Указатели позиций CIRB WP и CIRB RP аналогичны вышеописанным, но по назначению им «зеркальны» (драйвер считывает ответ по RP).
Структура формата потока описывает тип потока (РСМ или нет), для РСМ-потока задаются частота выборок, разрядность и число каналов. Частота выборок определяется через базовую частоту (48 или 44,1 кГц), ее множитель (1-4) и делитель (1-8).
Данные потока размещаются в памяти определенным образом. Каждый отсчет в памяти упаковывается в контейнер длиной 8, 16 или 32 бита в зависимости от требуемой разрядности. Отсчет «прижимается» к левому краю (старшим битам) контейнера, неиспользуемые биты заполняются нулями. Так, 24-битный отсчет размещается в 32-битном контейнере, и его младшие 8 битов становятся нулевыми. По интерфейсу заполнители не передаются. Отсчеты одного блока (одновременные выборки всех каналов) размещаются в смежных контейнерах. Если частота выборок потока превышает 48 кГц, то пакет, который передается в кадре, будет содержать более одного блока. Пакеты располагаются в буферах длиной, кратной 128 байтам; в каждом буфере должен размещаться хотя бы один полный пакет.
Интерфейс контроллера позволяет управлять потоками: запускать, приостанавливать, возобновлять, останавливать и синхронизировать. В системе может быть установлено несколько контроллеров, и их потоки могут быть взаимно синхронизированы (программно, используя значения их счетчиков тактов). Потоки одного контроллера могут быть синхронизированы по запуску и останову. Прерывания от HDA генерируются по событиям контроллера и потоков.
Приведенное описание программного интерфейса HDA очень сильно напоминает изохронную часть контроллера OHCI для шины FireWire, что и неудивительно, поскольку они решают одни и те же задачи. Радует, что идеологически правильный подход к организации потокового взаимодействия становится фактическим стандартом в платформе PC.
♦ SYNC — сигнал синхронизации кадров (48 кГц), с помощью которого переда ются и теги выходных потоков (синхронизация и по фронту, и по спаду BCLK);
♦ SDO — шина данных, широковещательно передаваемых от контроллера к ко декам (синхронизация и по фронту, и по спаду BCLK);
Звуковые карты PC
♦ SDI — последовательные линии данных, передаваемых кодеками (двухточеч ные соединения);
♦ RST# — сигнал сброса.
По составу сигналов интерфейс HDA Link аналогичен AC-Link, но сигналы называются короче и используются иначе. Для масштабирования пропускной способности шина SDO может иметь разрядность 1, 2 или 4 бита. На широкой (более 1 бита) шине управляющая информация, передаваемая в начале каждого кадра, направляется по всем линиям шины (копируется). Данные распределяются по линиям (striping). Для повышения пропускной способности кодек может использовать более одной линии SDI, при этом с точки зрения интерфейса они независимы.
Организацию обмена на интерфейсе HDA Link иллюстрирует рис. 12.10. Начало кадра отмечается сигналом SYNC длительностью 4 такта. С момента его спада начинается передача пакета потока команд (command) и прием потока ответов (response). Передача пакета каждого выходного потока отмечается тегом, который передается по линии SYNC в конце передачи предыдущего пакета. В теге содержится 4-битный идентификатор потока, перед которым передается преамбула (1110). Такая конструкция позволяет отличить передачу тега от передачи метки начала кадра.
BCLK
Предыдущий кадр
I Следующий кадр
Рис. 12.10. Интерфейс HDALink
Для входных потоков пакеты маркируются иначе. Тег пакета, содержащий 4-битный идентификатор пакета и 6-битное поле длины данных, передается по линии SDI перед самим телом пакета. В конце пакета входного потока могут присутствовать 4 бита-заполнителя (нули).
Спецификация HDA определяет модульную архитектуру кодеков и информационные структуры, позволяющие программно выяснять возможности кодеков и управлять их конфигурацией и работой. Кодек состоит из параметризованных модулей и их наборов, выполняющих определенную функцию. Каждый подключенный кодек получает свой адрес (CAd). Каждый модуль, а также набор представляет собой узел (node), уникально адресуемый своим идентификатором N1 (Node Id) в пределах кодека. Узел имеет набор параметров (которые можно только читать) и команд (с помощью которых модуль подключается, конфигурируется и управляется). Корневой узел (root node) обеспечивает ссыл-