Технические вопросы и ответы QA1370

Общий QA и дорожная карта для разработки программного обеспечения USB на Mac OS X

Q: Можно ли обеспечить дорожную карту для разработки программного обеспечения для работы с USB-устройствами под Mac OS X?

A: Следующее является дорожной картой для разработки клиентского программного обеспечения Драйвера и Пользователя USB-устройства и представлено как сеанс Вопроса и Ответа.

Q: Какие Интерфейсы хост-контроллера USB Mac OS поддерживает?

A: Mac OS X поддерживает Open Host Controller Interface (OHCI), Усовершенствованный интерфейс хост-контроллера (EHCI) и Universal Host Controller Interface (UHCI) Контроллеры USB начиная с Mac OS X 10.4.x. Например, на Питании PC Основанные системы Macintosh, можно было установить PCI UHCI Плата контроллера USB или плата контроллера CardBus UHCI USB, как применимый, и найти, что Mac OS X 10.4.x или больше, будет поддерживать USB-устройства, присоединенные к карте.

Q: Какие Средства разработки я должен использовать и Где я могу получить их?

A: Оптимальная платформа разработки является основанной на Intel системой Macintosh с текущим выпуском Mac OS X. Для разработки используйте XCode. Последняя версия XCode предоставляет поддержку для записи Драйверов USB-устройства, и для Приложения и для в уровнях ядра.

Двумя другими важными инструментами USB является Тестер USB и версии журналирования IOUSBFamily kext. Тестер USB выводит на экран USB определенная информация от системы и от IORegistry. Это также выводит на экран сообщения о состоянии, сгенерированные вызовом функции USBLog. Версия журналирования IOUSBFamily kext дополнения Тестер USB, поскольку это - версия Драйвера USB, разработанного для обеспечения информации о статусе, которую не делает поставляющий выпуск. Версия журналирования IOUSBFamily, предоставляет подробную информацию относительно присоединения USB-устройства, соответствия драйвера и тестовых результатов счета, и запрашивает сделанный к USB-устройствам.

Тестер USB установлен как часть Разработчика установка SDK. Если Разработчик то определяют местоположение Тестера USB в/Developer/Applications/Utilities/USB Тестере, SDK был установлен.

Версия Журналирования IOUSBFamily Kext доступна от веб-сайта Apple Developer Connection (ADC).

С Mac OS X 10.6, приложение Тестера USB включает usbtracer инструмент интерфейса командной строки. Usbtracer может использоваться и с нежурналированием и с журналированием версий IOUSBFamily kext настоящее. Обратитесь к usbtracer инструменту QA для демонстрации использования usbtracer инструмента в Окне терминала.

Версия журналирования Расширения ядра IOUSBFamily не предоставляет пакетную информацию данных, которая доступна под Windows. Даже под Windows, USB Анализатор требуется, чтобы анализировать проблемы, следующие из STALL, DATA TOGGLE и другие условия ошибки протокола.

Q: Который тип Драйвера USB-устройства должен я реализовывать: Прикладной уровень Драйвер USB или Драйвер USB В уровне ядра?

A: Разработка программного обеспечения намного проще в пространстве Приложения. Можно использовать созданный в исходном отладчике уровня XCode с драйвером Прикладного уровня. Для В драйверах ядра необходимо будет использовать отладчик GDB для отладки драйвера устройства в ядре. Когда Вы Кодируете в Ядре, Ваши усилия по разработке намного более сложны. Если вообще возможный, не программируйте в ядре. Считайте Начало работы с Драйверами устройств для получения дополнительной информации.

Вы будете использовать IOKit в программировании драйвера USB-устройства и для приложения и для уровня ядра. Понимание IOKit поможет Вам реализовать свой драйвер USB-устройства.

Q: Каковы общие критерии записи Прикладного уровня программное обеспечение USB и где я могу получить доступ к примеру кода?

A: Следующее является некоторыми критериями и примерами случаев, где Вы захотите реализовать Прикладной уровень драйвер/приложение USB. Ссылки предоставлены для направления Вас к большей информации.

Для записи драйвера прикладного уровня необходимо быть знакомы с обнаружением устройств и открытием интерфейса устройства. Информация предоставлена о Работе с Интерфейсами USB-устройства. Пример кода Девы демонстрирует, как обнаружить обоих USB-устройство / интерфейс от пространства приложения.

Большим подмножеством устройств класса составного объекта USB являются Human Interface Devices (HID) - клавиатуры, мыши, планшеты, сенсорные панели, игровые приставки, и т.д. Для работы с USB устройства HID с помощью прикладного уровня USB, APIs может потребовать, чтобы реализация средние значения препятствовала тому, чтобы устройство HID было соответствующим к USB драйвер класса HID. Предпочтительная альтернатива работе с этими устройствами должна использовать менеджера по HID. Много примеров кода, демонстрирующих использование менеджера по HID, предоставлены в следующем списке.

Q: Когда я должен записать Драйвер USB-устройства Уровня ядра?

A: Вы реализуете драйвер Уровня ядра, когда Apple не обеспечит драйвера класса, соответствующего к Вашему устройству, и устройство будет использоваться процессом ядра. Например, сети USB, последовательные драйверы, и устройства массового хранения должны быть реализованы как Расширения ядра. Драйверы устройств HID могут быть в ядре, когда услуги устройства будут доступны всем приложениям, но должны быть реализованы как драйвер прикладного уровня, если устройство должно использоваться определенными приложениями.

Как с прикладным уровнем драйверы USB, необходимо понять программирование IOKit.

Q: Какие ресурсы программирования существуют для Уровня ядра драйверы USB?

A: Следующее является списком Apple драйверы Класса USB, для которых исходный код доступен от Дарвинского веб-сайта. Для доступа к этим файлам исходного кода Вы должны иметь ID пользователя Apple Developer Connection (ADC), а также согласиться на Исходное Лицензионное соглашение Общественности Apple.

Драйверы Класса USB Apple основываются на Спецификациях Класса устройства, которые доступны от веб-страницы Документов Класса устройства USB-IF.

Q: С кем я могу связаться для большей помощи?

A: Список рассылки USB является лучшей начальной точкой для получения дополнительной помощи. Необходимо подписаться на список для задавания вопроса. Участники Команды инженеров USB являются участниками списка, и они вместе с многочисленными разработчиками в списке могут реагировать на Ваш вопрос. Если Вы имеете вводный вопрос о типе, просматриваете Почтовые архивы USB, поскольку вопрос, возможно, ранее задали и ответили.

При нахождении ошибки с Mac OS X, драйверы Класса USB, или с использованием или реализацией Apple предоставили API's, представьте Отчет об ошибках, так, чтобы можно было отследить вопрос. Используйте Отчет об ошибках для подачи запросов улучшения к Mac OS X, и к Apple предоставил API's.

Для дополнительной справки, когда нет никакого удовлетворительного ответа из Почтового Списка USB, можно подать запрос Инцидента Технической поддержки.

Q: Действительно ли я могу лицензировать программное обеспечение Apple или его логотип?

A: Если необходимо будет лицензировать программное обеспечение Apple, свяжитесь с Лицензированием программного обеспечения Apple для перечисления лицензируемого программного обеспечения и для процедуры для получения лицензии. Логотип Mac также лицензируем от Лицензирования программного обеспечения Apple.

Q: Я могу сделать, чтобы Apple помог с тестированием совместимости моего устройства и программного обеспечения?

A: Если Вы хотели бы, чтобы Apple обеспечил тест совместимости беглого взгляда Вашего продукта с продуктами Apple, включающими встроенную поддержку USB, отправляющими 5 из Ваших продуктов к:

Craig Keithley I/O Technology Evangelist Apple, Inc. 1 Infinite Loop, MS-303-2TE Cupertino, CA 95014

Общие вопросы и ответы

Следующее является некоторыми общими вопросами, с которыми разработчики, плохо знакомые с разработкой Драйверов USB-устройства для Mac OS X, встречаются и часто спрашиваются относительно Почтового Списка USB.

Каковы правила для соответствия к USB-устройствам и интерфейсам?

Для понимания правил устройства и соответствия интерфейса отошлите к Техническим Вопросам и ответам Подсказки QA1076 относительно драйвера USB, соответствующего для Mac OS X.

Как я могу определить то, что ненулевые результаты USB вызывает среднее значение?

Коды распространенной ошибки, возвращенные функциями USB, определяются в IOReturn.h и заголовочных файлах USB.h. Ошибочными результатами формы 0xE0000XXX являются общие ошибки IOKit. Ошибочными результатами формы 0xE00040XX является USB определенные ошибки.

Полный путь к заголовочному файлу IOReturn.h

/System/Library/Frameworks/IOKit. Framework/Headers/IOReturn.h.

Полный путь к заголовочному файлу USB.h

/System/Library/Frameworks/IOKit. Framework/Headers/usb/USB.h.

Вы хотите вывести на экран ошибочный результат в шестнадцатеричном для соответствия против ошибочных определений, перечисленных в IOReturn.h или USB.h. Например, USBInterfaceOpen вызов мог бы перестать работать с результатом-536870203. Преобразуйте это значение в шестнадцатеричный - 0xE00002C5. От перечисления в IOReturn.h эта ошибка приравнивается к kIOReturnExclusiveAccess.

  Выборка перечисления 1 от IOReturn.h

...
#ifndef sys_iokit
#define sys_iokit                    err_system(0x38)
#endif /* sys_iokit */
#define sub_iokit_common             err_sub(0)
#define sub_iokit_usb                err_sub(1)
...
#define	iokit_common_err(return) (sys_iokit|sub_iokit_common|return)
#define	iokit_family_err(sub,return) (sys_iokit|sub|return)

#define kIOReturnSuccess         KERN_SUCCESS            // OK
..
#define kIOReturnNoResources     iokit_common_err(0x2be) // resource shortage 
#define kIOReturnIPCError        iokit_common_err(0x2bf) // error during IPC 
#define kIOReturnNoDevice        iokit_common_err(0x2c0) // no such device 
#define kIOReturnNotPrivileged   iokit_common_err(0x2c1) // privilege violation 
#define kIOReturnBadArgument     iokit_common_err(0x2c2) // invalid argument 
#define kIOReturnLockedRead      iokit_common_err(0x2c3) // device read locked 
#define kIOReturnLockedWrite     iokit_common_err(0x2c4) // device write locked 
#define kIOReturnExclusiveAccess iokit_common_err(0x2c5) // exclusive access and
                                                         //   device already open

Для лучше понимания ошибочных объявлений отошлите к Техническим Вопросам и ответам QA1075, Понимающий Коды ошибки Набора I/O для объяснения кодов ошибки Набора I/O.

То, когда я загружаю свой Драйвер устройства KEXT в ядре, окно как показано на рисунке 1, выведено на экран, утвердив, что должна быть перезапущена машина. Где я могу получить больше информации о том, как выяснить то, что происходит и что сделать для этой ситуации?

Art/qa1370_1.jpg

Когда Вы видите это окно, паника ядра произошла. Отошлите к Техническим замечаниям 2 063 Понимания и Отладку Паники Ядра для получения информации о том, как продолжить.

Как я могу отправить пользовательские команды SCSI в свое Устройство Класса Массового хранения USB?

Этот вопрос задан в Технических Вопросах и ответах QA1179, Отправляющий Команды SCSI в Устройства хранения.

Где я нахожу usbtracer инструмент и как я могу использовать его?

usbtracer инструмент полезен для наблюдения пакетной обработки USB. Инструмент доступен начиная с Mac OS X 10.6. Можно найти инструмент в комплекте приложений Тестера USB в папке Resource. Перечисление 2 обеспечивает короткую демонстрацию использования инструмента. Для узнавания больше об использовании инструмента открывают инструмент в Окне терминала с -help переключатель. Нажать Ctrl-C выходить из использования инструмента. Обратите внимание на то, что административные привилегии требуются, чтобы использовать инструмент. Инструмент работает и с журналированием и с нежурналированием версий IOUSBFamily.

Если у Вас есть исходный код для 10.6.x выпуск IOUSBFamily, можно найти точки трассировки путем поиска вызова к функции USBTrace.

  Демонстрационное Использование перечисления 2 usbtracer

user$ cd /Developer/Applications/Utilities/USB\ Prober.app/Contents/Resources/
user$ sudo ./usbtracer 
Password:
36:076:636    UHCI::FilterInterrupt (0x03860000) active interrupts 0x0001
36:076:661 -> UHCI::Begin HandleInterrupt (0x03860000) 
36:076:663    UHCI::HandleInterrupt (0x03860000) Processing interrupt USBSTS = 0x0000
36:076:673    Controller::Complete (0x03860000) completion: 0x92d54a, status: 0x0
36:076:682    Controller::Interrupt Comp (0x00000000) Bus: 0x1d, Address: 2, Endpoint: 1  length: 64, data in: 0x058891d8 0x88daf399
36:076:683    Controller::Complete (0x03860000) completion: 0xf81318, status: 0x0
36:076:740 -> Controller::Interrupt Start (0x03860000) Bus: 0x1d, Address: 2, Endpoint: 1, (in) reqCount: 64
36:076:749 <- Controller::Interrupt End (0x03860000) error 0x0
36:076:766 <- UHCI::End HandleInterrupt (0x03860000) 
36:084:628    UHCI::FilterInterrupt (0x03860000) active interrupts 0x0001
36:084:651 -> UHCI::Begin HandleInterrupt (0x03860000) 
36:084:652    UHCI::HandleInterrupt (0x03860000) Processing interrupt USBSTS = 0x0000
36:084:663    Controller::Complete (0x03860000) completion: 0x92d54a, status: 0x0
36:084:673    Controller::Interrupt Comp (0x00000000) Bus: 0x1d, Address: 2, Endpoint: 1  length: 64, data in: 0x058892d8 0x88dbf399
36:084:674    Controller::Complete (0x03860000) completion: 0xf81318, status: 0x0
36:084:731 -> Controller::Interrupt Start (0x03860000) Bus: 0x1d, Address: 2, Endpoint: 1, (in) reqCount: 64
36:084:739 <- Controller::Interrupt End (0x03860000) error 0x0
36:084:744 <- UHCI::End HandleInterrupt (0x03860000) 
36:092:631    UHCI::FilterInterrupt (0x03860000) active interrupts 0x0001
...
53:923:044 -> Controller::Control Start (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0, (in) bmRequestType: 0x80, bRequest: 0x06, wValue: 0x0200, wIndex: 0x0000, wLength: 0x0004
53:923:088 <- Controller::Control End (0x039a1000) error 0x0
53:923:118    EHCI::Primary Interrupt (0x039a1000) enabledInterrupts 0x0000001f activeInterrupts 0x00000001
53:923:141 -> EHCI::Begin PollInterrupts (0x039a1000) _errorInterrupt 0 _completeInterrupt 1 _portChangeInterrupt 0
53:923:141    EHCI::PollInterrupts (0x039a1000) Completion Interrupt
53:923:147    Controller::Complete (0x039a1000) completion: 0x92d9be, status: 0x0
53:923:148 -> Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 status 0x0 bufferSizeRemaining 0
53:923:149 <- Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 todo 0x60 status 0x0
53:923:156 <- EHCI::End PollInterrupts (0x039a1000) 
53:923:377    EHCI::Primary Interrupt (0x039a1000) enabledInterrupts 0x0000001f activeInterrupts 0x00000001
53:923:392 -> EHCI::Begin PollInterrupts (0x039a1000) _errorInterrupt 0 _completeInterrupt 1 _portChangeInterrupt 0
53:923:392    EHCI::PollInterrupts (0x039a1000) Completion Interrupt
53:923:395    Controller::Complete (0x039a1000) completion: 0x92d9be, status: 0x0
53:923:396 -> Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 status 0x0 bufferSizeRemaining 0
53:923:397 <- Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 todo 0x40 status 0x0
53:923:398    Controller::Complete (0x039a1000) completion: 0x92d9be, status: 0x0
53:923:398 -> Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 status 0x0 bufferSizeRemaining 0
53:923:404    Controller::Packet Handler (0x00000000) Bus: 0xfd, Address: 3, Endpoint: 0  length: 4, data out: 0x09022700 0x00000000
53:923:410    Controller::Complete (0x039a1000) completion: 0x9267e0, status: 0x0
53:923:415 <- Controller::PacketHandler (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0 todo 0x0 status 0x0
53:923:428 <- EHCI::End PollInterrupts (0x039a1000) 

Ctrl-C to quit

usbtracer данные, показанные в Перечислении 2, показывают обработку пакетов USB с клавиатуры USB. Можно определить это путем запуска приложения Тестера USB. Щелкните по вкладке IORegistry, выберите Плоский пункт всплывающего меню IOService, и необходимо видеть данные, подобные следующему, взятому из Книги Mac Pro система в Перечислении 3

Перечисление 3  тестер USB - перечисление IORegistry

 0x1d: USB1@1D <class IOPCIDevice>                                              <- note bus 0x1D
       AppleUSBUHCI <class AppleUSBUHCI>
           1: UHCI Root Hub Simulation@1D <class IOUSBRootHubDevice>
           2: Apple Internal Keyboard / Trackpad@1d200000 <class IOUSBDevice>   <- note address 2
   0x3d: USB2@1D,1 <class IOPCIDevice>
       AppleUSBUHCI <class AppleUSBUHCI>
           1: UHCI Root Hub Simulation@1D,1 <class IOUSBRootHubDevice>
   0x5d: USB3@1D,2 <class IOPCIDevice>
       AppleUSBUHCI <class AppleUSBUHCI>
           1: UHCI Root Hub Simulation@1D,2 <class IOUSBRootHubDevice>
           2: IR Receiver@5d200000 <class IOUSBDevice>
   0x7d: USB4@1D,3 <class IOPCIDevice>
       AppleUSBUHCI <class AppleUSBUHCI>
           1: UHCI Root Hub Simulation@1D,3 <class IOUSBRootHubDevice>
           2: IOUSBWirelessControllerDevice@7d100000 <class IOUSBDevice>
   0xfd: USB7@1D,7 <class IOPCIDevice>                                           <- note bus 0xFD
       IOService <class IOService>
       AppleUSBEHCI <class AppleUSBEHCI>
           1: EHCI Root Hub Simulation@1D,7 <class IOUSBRootHubDevice>
           2: Built-in iSight@fd400000 <class IOUSBDevice>
           3: iPod@fd800000 <class IOUSBDevice>                                  <- note address 3

В Перечислении 2 существует следующая запись

36:076:682 Controller::Interrupt Comp (0x00000000) Bus: 0x1d, Address: 2, Endpoint: 1 length: 64, data in: 0x058891d8 0x88daf399e

От Перечисления 3 отмечают, что шина 0x1D, адресуйте 2 соответствия на Внутреннюю клавиатуру Apple.

Когда система работает в 32-разрядном режиме, для данных в / событиях usbtracer показывает первые 8 байтов данных. Когда система будет в 64-разрядном режиме, usbtracer покажет первые 16 байтов данных.

Для следующей записи в Перечислении 2

53:923:044 -> Controller::Control Start (0x039a1000) Bus: 0xfd, Address: 3, Endpoint: 0, (in) bmRequestType: 0x80, bRequest: 0x06, wValue: 0x0200, wIndex: 0x0000, wLength: 0x0004

От Перечисления 3 отмечают, что шина 0xFD, адресуйте 3 соответствия к iPod. Обратите внимание на то, что usbtracer предоставляет информацию запроса управления USB, отправляемую в iPod.



История версии документа


ДатаПримечания
23.03.2010

Добавьте ссылку на Общую Фазу как USB источник Анализатора. Удалите устаревшие ссылки примера кода. Фиксированные устаревшие ссылки ссылки. Добавленная usbtracer информация.

28.02.2006

Обновленный для отражения поддержки UHCI. Фиксированные опечатки. Добавленная ссылка на Технические замечания 2 163 «Здания Universal Драйверы Набора I/O».

22.09.2004

Новый документ, что дорожная карта для разработки программного обеспечения USB на Mac OS X и некоторых Общих вопросах и Ответах