Шина IEEE 1394 — FireWire
- Подробности
-
Родительская категория: Шина IEEE 1394 — FireWire
-
Категория: «Открытый» хост-контроллер IEEE 1394 — OHCI
Для передачи изохронных пакетов контроллер может иметь от 4 до 32 контекстов, с каждым из которых связан свой изохронный канал шины. Число контекстов можно определить, записав FFFF FFFF в регистр масок прерываний от контекстов и прочитав его значение: единицы останутся только в битах, соответствующих существующим контекстам. Контексты изохронных передач отличаются от контекстов асинхронных тем, что требуют привязки начала передачи к определенному моменту времени, а также реакции на невозможность своевременной передачи пакета.
Контекстные программы изохронной передачи содержат команды описания пакетов, передаваемых данным контекстом в изохронном периоде каждого цикла шины. Контекстная программа может быть ветвящейся, и для каждого пакета указыва- ются два адреса перехода:
- адрес перехода в случае нормальной передачи пакета (branchAddress);
- адрес пропуска — адрес перехода в случае пропуска цикла (skipAddress). По этому адресу программа переходит в случае, если в данном цикле передача пакета не удалась.
Каждый пакет описывается блоком из 1–8 дескрипторов, в которых используются следующие команды:
- OUTPUT_MORE — не первая и не последняя команда в блоке, задающая адрес и длину буфера данных, которые следует поместить в собираемый пакет (рис. 1, а). Эта команда используется для помещения блока данных в середину пакета;
- OUTPUT_MORE-Immediate — первая команда в блоке, используемая для передачи заголовка пакета с ненулевой длиной данных. Буфер (2 квадлета) находится в самом теле дескриптора (рис. 1, б). В команде задается адрес пропуска;
- OUTPUT_LAST — последняя команда в блоке, задающая адрес и длину буфера данных, которые следует поместить в собираемый пакет, а также адрес перехода или пропуска (рис. 1, в). В дескриптор команды при передаче контроллер помещает состояние контекста и метку времени. Команда используется двояко:
-----для помещения данных (но не заголовка) из буфера в конец пакета, при этом длина буфера ненулевая и в команде содержится адрес пропуска. В этом случае данной команде должна предшествовать команда OUTPUT_MORE или OUTPUT_MORE-Immediate;
-----как признак отсутствия пакета для передачи в данном цикле, при этом указывается нулевая длина буфера и в команде содержится адрес перехода. В этом случае команде не должны предшествовать команды OUTPUT_MORE или OUTPUT_MORE-Immediate;
- OUTPUT_LAST-Immediate — команда, используемая для формирования пакетов с нулевой длиной поля данных; буфер (2 квадлета) находится в самом теле дескриптора (рис. 1, г). Для такого пакета переход в любом случае происходит по одному и тому же адресу. В дескриптор команды при передаче контроллер помещает состояние контекста и метку времени;
- STORE_VALUE — команда, обеспечивающая программный мониторинг исполнения контекста без использования прерываний. Эта команда может быть введена в начало блока дескрипторов, при ее исполнении контроллер выполняет запись определенного слова данных по указанному адресу в случае успешной отработки блока. В дескрипторе указываются адрес пропуска, адрес записываемых данных и сами данные (рис. 1, д). В случае пропуска цикла (перехода по адресу пропуска) запись данных не производится.
Назначения полей в дескрипторах команд изохронной передачи следующие:
- cmd — код команды;
- key — ключ команды (расширение кода);
- b (branch control) — управление переходом: 0 — для OUTPUT_MORE или OUTPUT_MORE-Immediate , 3 — для OUTPUT_LAST или OUTPUT_LAST -Immediate, 1 и 2 — недопустимо;
- reqCount — длина буфера (в байтах);
- dataAddress — адрес буфера данных (нет требования выравнивания) или адрес записи для команды мониторинга;
- i (interrupt control) — управление прерываниями: 0 — нет прерываний, 1 и 2 — недопустимо, 3 — прерывание при переходе по адресу пропуска;
- branchAddress — адрес нормального перехода, указывающий на начало следующего блока дескрипторов;
- skipAddress — адрес перехода по пропуску;
- Z — длина следующего блока дескрипторов. Нулевая длина является указанием на останов контекстной программы;
- xferStatus — состояние передачи, в котором содержатся значения младших 16 бит регистра управления контекстом на момент завершения команды;
- timeStamp — метка времени помещения пакета в FIFO-буфер (3 младших бита second_count и 13 бит cycle_count), устанавливается аппаратно при передаче;
- S (status control) — признак модификации полей xferStatus и timeStamp, устанавливается контроллером;
- storeDoublet — младшее слово записываемых данных мониторинга (старшее слово — нулевое).
В контекстной программе должны быть описаны пакеты для каждого цикла. Если для данного цикла нет данных, в контексте должен быть описан пакет нулевой длины (командой OUTPUT_LAST-Immediate). Если канал в каком-то цикле не должен передавать пакет, это описывается единственной командой OUTPUT_LAST с нулевой длиной буфера. Останов контекстной программы происходит при переходе, для которого указан Z = 0.
Для определения цикла, с которого должна активизироваться работа контекста, в управляющем регистре контекста (рис. 2) введены дополнительные поля:
- cycleMatchEnable — разрешение активизации контекста по началу определенного цикла (только для изохронных контекстов);
- cycleMatch — указатель цикла, в котором активизируется контекст (только для изохронных контекстов).
Каждая контекстная программа обычно связана со своим изохронным каналом, номер канала присутствует в заголовках передаваемых пакетов (формируется программно).
Пакеты всех контекстов DMA изохронной передачи укладываются в один и тот же буфер FIFO, из которого они выбираются LINK-уровнем для передачи в шину. Пакеты соседних циклов в FIFO отделяются друг от друга специальным разделителем. Контроллер может укладывать пакеты в FIFO с опережением до двух циклов. В каждом цикле шины LINK-уровень из FIFO забирает на передачу пакеты до очередного разделителя, а контроллер DMA укладывает в FIFO очередные пакеты из контекстов. Возможна ситуация, когда за очередной цикл LINK-уровень не может выбрать все пакеты до разделителя. При этом контроллер DMA не может поместить в буфер очередные пакеты — это и есть пропуск цикла. Как правило, такая ситуация возникает из-за сброса шины. Ветвления контекстной программы позволяют отрабатывать эту ситуацию различными способами, как это иллюстрирует рис. 3:
- пропускать передачи пакета в случае пропуска цикла (контекст A) — адрес пропуска и адрес перехода указывают на один и тот же блок дескрипторов пакета для следующего цикла;
- настойчиво передавать каждый пакет (контекст B) — адрес пропуска в дескрипторе указывает на начало того же блока дескрипторов. При этом, естественно, появляется задержка доставки данных;
- в случае пропуска любого цикла послать (настойчиво) специальный завершающий пакет и остановить контекстную программу (контекст C) — адрес пропуска во всех дескрипторах цепочки указывает на дескриптор завершающего пакета;
- останавливать передачу по пропуску любого цикла (контекст D) — адрес пропуска во всех дескрипторах цепочки указывает на нуль-дескриптор.
Квадраты на рис. 3, а обозначают блоки дескрипторов контекста; выходящие из них прямые стрелки (снизу) указывают на нормальные переходы, изогнутые (сверху) — на переходы по пропускам. На рис. 3, б показаны состояния FIFOбуфера на моменты начала каждого цикла. Здесь показаны пакеты, собранные по соответствующим блокам дескрипторов, и разделители циклов. Как видно из рисунка, сброс на шине (BUS RESET) и процесс идентификации дерева и узлов (ID) прерывают передачу изохронных пакетов. В результате этого по шине передаются изохронные пакеты следующим образом:
- для контекста А: A1, A2, <пропуск двух циклов>, A3, A6, A7, — из-за сброса пропущены два цикла и потеряны (позже!) два пакета;
- для контекста B: B1, <пропуск двух циклов>, B2, B3, B4, B5, — из-за сброса пропущены два цикла (задержка доставки), но пакеты не потеряны
- для контекста C: C1, <пропуск двух циклов>, C2, C3, Cx (специальный пакет, сигнализирующий останов), останов — из-за сброса пропущены два цикла, чуть позже передача останавливается с предварительным уведомлением слушателей;
- для контекста D: D1, <пропуск двух циклов>, D2, D3, останов — из-за сброса пропущены два цикла, чуть позже передача останавливается без предупреждения.
Если во время передачи FIFO-буфер переопустошается (underrun), то передаваемый пакет теряется (в его дескрипторе поле состояния не обновляется), а программы всех оставшихся контекстов продвигаются по ветке пропуска цикла.
Программа хоста помещает пакеты изохронной передачи данных в буферы, описанные блоками дескрипторов. Формат пакетов данных (рис. 4) почти соответствует формату потоковых пакетов IEEE 1394. Отличие заключается в переносе поля длины пакета data_length во второй квадлет ради помещения в первый квадлет кода скорости spd (эта информация при передаче нужна раньше всего). Поля CRC заголовка и данных контроллер строит сам при передаче.