FireWire на OS X

FireWire является реализацией Apple Высокопроизводительной последовательной шины IEEE 1394. Быстрый, заменяемый в горячем режиме, и гибкий, FireWire является цифровым интерфейсом, поддерживающим объединение в гирляндную цепь и ветвление для истинной одноранговой связи.

Эта глава дает Вам краткий обзор FireWire. Затем это объясняет, как Набор I/O представляет устройства FireWire и описывает библиотеки интерфейса устройства, которые предоставляет семья IOFireWire.

Обзор FireWire

Шина FireWire появляется как большое, 64-разрядное адресное пространство с отображенной памятью с каждым устройством, представленным узлом, занимая определенный диапазон адресов. Старший разряд 16 битов каждого адреса идентифицируют узел и остающиеся 48 битов, для специфичного для устройства использования.

Из-за заменяемого в горячем режиме характера FireWire шина FireWire ни в коем случае не статична. Сброс шины происходит каждый раз, когда узлы появляются или исчезают или когда программное обеспечение инициирует его. Сигнал возврата в начальное положение шины стирает текущую топологию шины и вынуждает узлы повторно идентифицировать и повторно соединить себя. Несмотря на то, что большая часть логики для обработки сброса шины на уровне микропрограммы устройств, приложение должно быть готово управлять влиянием сброса шины в любой точке. В некоторых случаях это может означать устанавливать флаг в команде, запрашивающей его повторить после того, как шина сбросила. В других, однако, Вам, вероятно, придется выполнить значительные задачи реконфигурации оборудования, чтобы продолжать обрабатывать данные.

FireWire поддерживает два типа передачи данных: Асинхронный и изохронный. Асинхронная передача обеспечивает подтвержденную, гарантируемую поставку данных и предназначена к определенному узлу с явным адресом. Если данные, которые Вы отправляете, не терпимы к ошибке, таковы как данные, записанные в дисковод, асинхронная передача является надлежащей.

Изохронная передача, с другой стороны, широковещательно передается в one-many или непосредственном способе. Прежде чем узел начинает отправлять или получать изохронные данные, он запрашивает определенную сумму пропускной способности и одного или более изохронных каналов. Канал может иметь один передатчик данных (или говорящий) и любое число получателей (или слушатели). Изохронные передачи не допускают проверку ошибок или повторную передачу, но они действительно поставляют данные на постоянном, уровне в реальном времени. При отправке строго ограниченных во времени, терпимых к ошибке данных, таких как видеопоток, изохронные передачи предпочтительны.

Как носитель для передачи данных, определяющей, как переместить пакеты в шину FireWire, FireWire не указывает высокоуровневого протокола связи для использования. Протоколы являются специальными наборами коммуникационных инструкций, упрощающих и стандартизирующих передачу данных между устройствами FireWire. OS X поддерживает доступ пространства пользователя для двух протоколов, обычно используемых на FireWire: SBP-2 и AV/C.

Протокол последовательной шины 2, или SBP-2, является протоколом хранения, используемым для эффективной передачи больших объемов данных в высокой скорости. Принтеры, сканеры и жесткие диски обычно являются устройствами SBP-2. Протокол SBP-2 определяет данные, и объект транзакции команды вызвал ORB или Блок Запроса Работы. Вы используете нормальный ORBs для отправки данных и команд к устройству и специальному управлению ORBs для выполнения входа в систему устройства и выхода из системы. Протокол SBP-2 отправляет использованию ORBs асинхронный способ транспортировки данных FireWire. Можно получить больше информации о спецификации SBP-2 в http://t10 .org.

Аудио/Управление видео или AV/C, протокол определяет набор команд, привыкший к управляющим устройствам, таким как видеомагнитофоны и цифровые фотоаппараты. Как SBP-2, протокол AV/C использует асинхронный способ транспортировки данных FireWire. Команда AV/C или ответ сначала инкапсулируются в Функциональном Управляющем протоколе (или FCP) кадр. Затем запись FireWire или блочная транзакция записи передают кадр FCP к и от устройства.

Протокол AV/C использует понятие разъема для описания конечной точки соединения, которое модуль AV/C реализует, чтобы получить или передать данные. Разъемы могут быть внешними, физическими разъемами на самом устройстве, внутренними, виртуальными разъемами реализации модуля AV/C или разъемы последовательной шины, которые доступны через регистры управления разъема (или PCRs). Для получения дополнительной информации о спецификации AV/C, посмотрите http://www.1394ta.org.

Цифровое видео (или DV) устройство, такое как цифровая видеокамера, реализует подблок спецификации AV/C. Если Вы хотите связаться с цифровой видеокамерой, необходимо использовать QuickTime, который обеспечивает OS X APIs. QuickTime предоставляет APIs и компоненты, чтобы закодировать и декодировать данные DV, связаться с устройством DV и обработать видео оцифровку. Для получения дополнительной информации о QuickTime посмотрите Ссылочную Библиотеку> QuickTime. В Использовании IOFireWireAVCLib этот документ описывает, как связаться с устройствами AV/C, которые не являются цифровыми видеокамерами.

Поддержка устройства FireWire в ядре

В ядре несколько уровней объектов представляют каждое устройство FireWire. Для каждого аппаратного интерфейса FireWire на Macintosh, таком как FireWire OHCI (или Интерфейс контроллера Открытого узла), семья IOFireWire публикует объект IOFireWireController в Реестре I/O. Объект IOFireWireController предоставляет услуги управления шиной для многократных устройств и протоколов, которые могут существовать в одном аппаратном интерфейсе FireWire.

Семья IOFireWire тогда пытается считать конфигурацию ROM каждого устройства на шине. Конфигурация устройства ROM (или конфигурация ROM) содержит информацию, такую как идентификация устройства и адреса различных регистров. Для каждого устройства, отвечающего его блоком информации шины, семья IOFireWire публикует объект IOFireWireDevice в Реестре I/O. Объект IOFireWireDevice отслеживает узел устройства ID (который может измениться с динамическим реконфигурированием шины), и это копирует свойства с конфигурации устройства ROM, такие как глобально уникальная идентификация устройства (или GUID), в его список свойств. Самое главное, однако, объект IOFireWireDevice сканирует конфигурацию ROM для каталогов модуля. Для каждого каталога модуля это находит, это публикует объект IOFireWireUnit в Реестре I/O. Рисунок 1-1 показывает штабель объектов, которые инстанцируют для модуля FireWire.

Рисунок 1-1  , В объектах ядра поддерживающий модуль FireWire
In-kernel objects supporting a FireWire unit

Объект IOFireWireUnit копирует свойства с модуля устройства в его список свойств в Реестре I/O. Набор I/O использует эти свойства, чтобы позволить соответствовать на определенной спецификации модуля ID и версию программного обеспечения модуля. Когда модуль SBP-2 появляется в Реестре I/O, например, расширение ядра IOFireWireSBP2 (или KEXT) соответствия на нем и загрузки. Семья IOFireWireSBP2 тогда публикует объект IOFireWireSBP2Target, сканирующий конфигурацию ROM и публикующий объект IOFireWireSBP2LUN для каждой логической единицы (или ЛУН), это находит.

Для модулей AV/C процесс подобен: IOFireWireAVC KEXT соответствует модуль AV/C и публикует объект IOFireWireAVCUnit в Реестре I/O для него.

Библиотеки интерфейса устройства семьи IOFireWire

То же устройство и свойства модуля использование Набора I/O для соответствия в драйвере ядра доступны Вам для устройства прикладного уровня, соответствующего (описанный в Устройстве, Соответствующем для Устройств FireWire). Поскольку много устройств, таких как сканеры, цифровые фотоаппараты, и принтеры, лучше управляются из приложений, можно использовать интерфейсы устройства, которые семья IOFireWire обеспечивает для доступа к ним. Почти все службы, доступные в драйверах ядра, также доступны приложению через один из интерфейсов устройства семьи IOFireWire.

Для передачи с устройствами FireWire или модулями из приложения семья IOFireWire предоставляет трем библиотекам, что каждый включает несколько интерфейсов устройства:

Заголовочные файлы для всех трех библиотек являются частью IOKit.framework, расположенный в /System/Library/Frameworks. В Вашем приложении Вы соединяетесь против IOKit.framework получить доступ к этим библиотекам.

Интерфейсы устройства IOFireWireLib

IOFireWireLib является библиотекой интерфейсов устройства, предоставляющих доступ приложений и к стандартным функциям устройства FireWire и к изохронной коммуникации. IOFireWireLib обеспечивает самый низкий уровень, который интерфейсы FireWire, доступные в пространстве пользователя, позволяя Вам просмотреть конфигурацию ROM внешнего устройства, отправляют командам и выполняют автобусные перевозки FireWire. IOFireWireLib также дает Вам контроль изохронной связи с устройством FireWire путем обеспечения интерфейса, позволяющего, Вы для открытия канала возражаете и отправляете и получаете изохронные данные. Рисунок 1-2 показывает интерфейсы, доступные в IOFireWireLib.

Рисунок 1-2  интерфейсы устройства IOFireWireLib
IOFireWireLib device interfaces

Для использования других интерфейсов в IOFireWireLib необходимо сначала получить экземпляр основного интерфейса, IOFireWireDeviceInterface. IOFireWireDeviceInterface включает функции, позволяющие Вам связываться непосредственно с устройством и методами, создающими другие интерфейсы, перечисленные на рисунке 1-2. Можно получить IOFireWireDeviceInterface для устройства FireWire или даже локального узла (определенный, чтобы быть самим Macintosh). Рисунок 1-3 показывает, как приложение использует экземпляр IOFireWireDeviceInterface для передачи с устройством на шине FireWire.

Рисунок 1-3  Используя IOFireWireDeviceInterface
Using the IOFireWireDeviceInterface

Когда у Вас есть экземпляр IOFireWireDeviceInterface, Вы можете:

  • Выполните сброс шины FireWire

  • Создайте интерфейсы объекта команды FireWire, чтобы выполнить асинхронное чтение, записать и заблокировать операции

  • Создайте изохронный интерфейс, предоставляющий изохронные услуги, такие как создание и управление изохронными каналами и отправка и получение изохронных данных

  • Создайте другие интерфейсы, предоставляющие разные услуги, такие как управление локальными каталогами модуля в Macintosh и доступе и просмотре конфигурации удаленного устройства ROMs

Можно также использовать службы IOFireWireLib и интерфейсы в сочетании с интерфейсами от других двух библиотек интерфейса устройства FireWire. Рисунок 1-5 и рисунок 1-7 показывают, как приложение может использовать IOFireWireDeviceInterface в сотрудничестве с интерфейсами от других библиотек. Для получения дополнительной информации о том, как сделать это, посмотрите Получение Многократных Интерфейсов Устройства FireWire. Для примеров кода, иллюстрирующих, как использовать различные интерфейсы устройства FireWire, посмотрите пользование Библиотеками Интерфейса Устройства FireWire.

Интерфейсы устройства IOFireWireSBP2Lib

IOFireWireSBP2Lib является библиотекой интерфейсов и функций, позволяющих Вам управлять функциями SBP-2 своего устройства. Рисунок 1-4 показывает интерфейсы IOFireWireSBP2Lib.

  Интерфейсы рисунка 1-4 IOFireWireSBP2Lib
IOFireWireSBP2Lib interfaces

Для использования функций SBP-2, IOFireWireSBP2Lib обеспечивает, Вы сначала получаете основной интерфейс, IOFireWireSBP2LibLUNInterface, предоставляющий методы, управляющие работой логической единицы (или ЛУН) в целом. Когда у Вас есть IOFireWireSBP2LibLUNInterface, можно получить два других интерфейса:

  • IOFireWireSBP2LibLoginInterface, предоставляющий методы, управляющие поведением и выполнением сеанса входа в систему SBP-2, включая выполнение ORBs

  • IOFireWireSBP2LibMgmtORBInterface, обеспечивающий методы, конфигурирующие и добавляющие связанные с невходом в систему функции управления

Сам IOFireWireSBP2LibLoginInterface обеспечивает другой интерфейс, IOFireWireSBP2LibORBInterface, предоставляющий методы для конфигурирования нормальной команды ORBs.

IOFireWireSBP2Lib обрабатывает коммуникацию устройства на протокольном уровне SBP-2. Другими словами, это затронуто главным образом с отправкой и получением ORBs и управлением сеансами входа в систему. Это не включает интерфейсы, позволяющие Вам связываться непосредственно с устройством. Если необходимо отправить команды в само устройство, например, чтобы считать конфигурацию ROM или обслужить дополнительную функциональность вне объема SBP-2, необходимо использовать IOFireWireDeviceInterface IOFireWireLib (для получения дополнительной информации о том, как сделать это, посмотрите Получение Многократных Интерфейсов Устройства FireWire).

Рисунок 1-5 показывает приложение с помощью IOFireWireSBP2LibLUNInterface для передачи с логической единицей устройства FireWire SBP-2 и, дополнительно, с помощью IOFireWireDeviceInterface для передачи с устройством.

Рисунок 1-5  Используя IOFireWireSBP2LibLUNInterface и IOFireWireDeviceInterface
Using the IOFireWireSBP2LibLUNInterface and IOFireWireDeviceInterface

Интерфейсы устройства IOFireWireAVCLib

IOFireWireAVCLib является библиотекой интерфейсов и функций, которые можно использовать для отправки команд AV/C в модуль AV/C. Рисунок 1-6 показывает интерфейсы в IOFireWireAVCLib.

Рисунок 1-6  интерфейсы IOFireWireAVCLib

IOFireWireAVCLib предоставляет два интерфейса для обработки модулей AV/C и команд: IOFireWireAVCLibProtocolInterface и IOFireWireAVCLibUnitInterface. В отличие от интерфейсов устройства в IOFireWireLib и IOFireWireSBP2Lib, эти интерфейсы устройства не зависят друг от друга всегда. Можно получить или IOFireWireAVCLibProtocolInterface или IOFireWireAVCLibUnitInterface или обоих, согласно тому, что необходимо выполнить. Поскольку они - оба основные интерфейсы, Вы не должны получать тот перед другим.

Кроме того, IOFireWireAVCLib предоставляет ограниченный интерфейс, поддерживающий подмножество функциональности асинхронного соединения. IOFireWireAVCLibConsumerInterface основывается на предположении, что узел контроллера встроен в потребительский узел, и что этот двойной объект реализован в Macintosh. Функции в поддержке IOFireWireAVCLibConsumerInterface, создающей асинхронное соединение к производителю, отправляя команды производителю, и получая данные от производителя. IOFireWireAVCLibConsumerInterface не поддерживает никакую другую конфигурацию потребителя, контроллера и узлов производителя и не позволяет паре потребителя/контроллера получать команды.

IOFireWireAVCLibProtocolInterface позволяет Вашему приложению обрабатывать Macintosh как устройство AV/C и получать доступ к его регистрам управления разъема (или PCRs). Для доступа к PCRs внешнего устройства FireWire необходимо использовать IOFireWireDeviceInterface. Поскольку IOFireWireAVCLibProtocolInterface в частности для доступа к Macintosh как устройство AV/C, можно открыть его только на локальном узле. С IOFireWireAVCLibProtocolInterface Вы можете:

  • Выделите и освободите разъемы ввода и вывода

  • Считайте текущую стоимость разъемов ввода и вывода

  • Обратные вызовы регистра для команд AV/C отправили к Macintosh и для сброса шины и сообщений переподключения

  • Обновите значение разъемов ввода и вывода, моделировав транзакции блокировки

IOFireWireAVCLibUnitInterface предоставляет функции, дающие команды AV/C к модулю AV/C. Начинаясь в OS X v10.4, IOFireWireAVCLibUnitInterface включает функции, поддерживающие асинхронные команды AV/C (чтобы не быть перепутанными с асинхронными соединениями AV/C). Можно использовать асинхронные функции команды для, например, получить уведомления, когда пользователь корректирует переключатель на устройстве, Вы связываетесь с. Поскольку асинхронные команды являются частью IOFireWireAVCLibUnitInterface, Вы не должны получать отдельный интерфейсный объект использовать их.

Как с IOFireWireSBP2LibLUNInterface, можно использовать и IOFireWireAVCLibUnitInterface и IOFireWireDeviceInterface для управления модулем AV/C, а также объектом устройства. Для получения дополнительной информации о том, как сделать это, посмотрите Получение Многократных Интерфейсов Устройства FireWire.

Рисунок 1-7 показывает приложение с помощью IOFireWireAVCLibUnitInterface, IOFireWireAVCLibProtocolInterface, и, дополнительно, IOFireWireDeviceInterface.

Рисунок 1-7  Используя интерфейсы IOFireWireAVCLib и IOFireWireDeviceInterface
Using the IOFireWireAVCLib interfaces and IOFireWireDeviceInterface