Общий 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-устройством от прикладного уровня. Выборка предназначена для DevaSys USB I2C/IO, Интерфейсной платы.
USB Частная Выборка Данных. Эта выборка демонстрирует, как использовать IOKitLib и IOUSBLib для установки асинхронных обратных вызовов, когда USB-устройство присоединено или удаленный из системы. Это также показывает, как связать произвольные данные с каждым экземпляром устройства.
VendorSpecificType00. Это - выборка программы Интерфейса малых компьютерных систем (SCSI), работающая с устройствами Класса Массового хранения USB и демонстрирующая, как разделить драйвер IOSCSIPeripheralType00 на подклассы для добавления пользовательского поставщика определенная функциональность. Это также показывает, как установить простой интерфейс к коду пространства пользователя с помощью свойств I/O Registry. Если необходимо отправить команды SCSI в устройство Класса Массового хранения USB, необходимо рассмотреть Технический Q&A1179, Отправляющий Команды SCSI в Устройства хранения.
Для записи драйвера прикладного уровня необходимо быть знакомы с обнаружением устройств и открытием интерфейса устройства. Информация предоставлена о Работе с Интерфейсами USB-устройства. Пример кода Девы демонстрирует, как обнаружить обоих USB-устройство / интерфейс от пространства приложения.
Большим подмножеством устройств класса составного объекта USB являются Human Interface Devices (HID) - клавиатуры, мыши, планшеты, сенсорные панели, игровые приставки, и т.д. Для работы с USB устройства HID с помощью прикладного уровня USB, APIs может потребовать, чтобы реализация средние значения препятствовала тому, чтобы устройство HID было соответствующим к USB драйвер класса HID. Предпочтительная альтернатива работе с этими устройствами должна использовать менеджера по HID. Много примеров кода, демонстрирующих использование менеджера по HID, предоставлены в следующем списке.
Проводник HID. Эта полная выборка программы, в то время как не определенный USB, демонстрирует использование Утилит Human Interface Device (HID), чтобы получить доступ и проанализировать USB дескрипторы отчета устройства HID. Эта демонстрационная утилита работает с большей частью USB устройства HID, такие как мыши, клавиатуры, клавиатуры, джойстики и игровые планшеты.
Утилиты HID. Этот пример кода является библиотекой полезных подпрограмм HID и используется экстенсивно в примере кода Проводника HID
Инструмент Теста светодиодных индикаторов HID. Этот пример кода, чтобы показать, как повернуть LEDs включения - выключения на устройствах HID (например, блокировка прокрутки или Caps Lock LEDs на клавиатурах).
Самосвал HID. Этот пример кода, чтобы показать, как получить доступ к информации о HID от устройства HID.
Калибратор HID. Этот пример кода, чтобы показать, как протестировать калибровку HID.
Q: Когда я должен записать Драйвер USB-устройства Уровня ядра?
A: Вы реализуете драйвер Уровня ядра, когда Apple не обеспечит драйвера класса, соответствующего к Вашему устройству, и устройство будет использоваться процессом ядра. Например, сети USB, последовательные драйверы, и устройства массового хранения должны быть реализованы как Расширения ядра. Драйверы устройств HID могут быть в ядре, когда услуги устройства будут доступны всем приложениям, но должны быть реализованы как драйвер прикладного уровня, если устройство должно использоваться определенными приложениями.
Как с прикладным уровнем драйверы USB, необходимо понять программирование IOKit.
Q: Какие ресурсы программирования существуют для Уровня ядра драйверы USB?
A: Следующее является списком Apple драйверы Класса USB, для которых исходный код доступен от Дарвинского веб-сайта. Для доступа к этим файлам исходного кода Вы должны иметь ID пользователя Apple Developer Connection (ADC), а также согласиться на Исходное Лицензионное соглашение Общественности Apple.
USB Контроллер OHCI в проекте IOUSBFamily
USB Контроллер EHCI в проекте IOUSBFamily
Драйвер Класса Составного объекта USB в проекте IOUSBFamily
Драйвер HID USB в проекте IOUSBFamily - который поддерживает и клавиатуры и манипуляторы
USB Устройство CDC в проекте AppleUSBCDCDriver
Объем Массового хранения USB Только Устройство в проекте IOUSBMassStorageClass
Управление/Объем/Прерывание Массовым хранением USB (CBI) Устройство в проекте IOUSBMassStorageClass
Массовое хранение USB Устройство Uniform Floppy Interface(UFI) в проекте IOUSBMassStorageClass
Драйвер Класса Аудио USB в проекте AppleUSBAudio
Драйверы Класса 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, выведено на экран, утвердив, что должна быть перезапущена машина. Где я могу получить больше информации о том, как выяснить то, что происходит и что сделать для этой ситуации?

Когда Вы видите это окно, паника ядра произошла. Отошлите к Техническим замечаниям 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 и некоторых Общих вопросах и Ответах |