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

Подсказки относительно драйвера USB, соответствующего для Mac OS X

Q: Я не могу заставить свой драйвер ядра соответствовать против моего USB-устройства. Что случилось?

A: Я не могу заставить свой драйвер ядра соответствовать против моего USB-устройства. Что случилось?

Могло быть много вещей, заставляющих Ваш драйвер не соответствовать, но наиболее распространенная ошибка является неправильной комбинацией свойства, вводит Ваше водительское Info.plist список свойств.

Драйвер USB, соответствующий, основывается на USB Общая Спецификация Класса. IOUSBFamily в сочетании с I/O Кит будет использовать тестовый счет для определения лучшего кандидата драйвера на определенное устройство.

Следующие таблицы показывают тестовые очки, полученные путем указания соответствующих ключей водительском Info.plist.

Обратите внимание на то, что Вы никогда не должны добавлять свое собственное IOProbeScore свойство к USB водительский список свойств. Кроме того, не добавляйте дополнительные ключи; только используйте сочетания клавиш, показанные в следующих таблицах.

Табличные 1  Свойства для соответствия USB-устройства (IOProviderClass является IOUSBDevice),

Ключи

Комментарии

Тестовый счет

idVendor + idProduct + bcdDevice

100000

idVendor + idProduct

90000

idVendor + bDeviceSubClass + bDeviceProtocol

Только если bDeviceClass является 0xFF (определенный поставщик).

80000

idVendor + bDeviceSubClass

Только если bDeviceClass является 0xFF (определенный поставщик).

70000

bDeviceClass + bDeviceSubClass + bDeviceProtocol

Только если bDeviceClass не является 0xFF.

60000

bDeviceClass + bDeviceSubClass

Только если bDeviceClass не является 0xFF.

50000

Табличные 2  Свойства для соответствия интерфейса USB (IOProviderClass является IOUSBInterface),

Ключи

Комментарии

Тестовый счет

idVendor + idProduct + bInterfaceNumber + bConfigurationValue + bcdDevice

100000

idVendor + idProduct + bInterfaceNumber + bConfigurationValue

90000

idVendor + bInterfaceSubClass + bInterfaceProtocol

Только если bInterfaceClass является 0xFF (определенный поставщик).

80000

idVendor + bInterfaceSubClass

Только если bInterfaceClass является 0xFF (определенный поставщик).

70000

bInterfaceClass + bInterfaceSubClass + bInterfaceProtocol

Только если bInterfaceClass не является 0xFF.

60000

bInterfaceClass + bInterfaceSubClass

Только если bInterfaceClass не является 0xFF.

50000

Если Вашему драйверу все еще не удается загрузиться, удостоверьтесь что значение для CFBundleIdentifier свойство в IOKitPersonalities словарь является тем же значением как CFBundleIdentifier свойство для драйвера как показано в Перечислении 1.

  Свойство Listing 1 CFBundleIdentifier в словаре индивидуальности.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>${EXECUTABLE_NAME}</string>
    ...
    <key>CFBundleIdentifier</key>
    <string>com.apple.dts.driver.HelloIOKit</string>
    ...
    <key>IOKitPersonalities</key>
    <dict>
        <key>HelloIOKit</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.apple.dts.driver.HelloIOKit</string>
            <key>IOClass</key>
            <string>com_apple_dts_driver_HelloIOKit</string>
            ...
        </dict>
    </dict>
    ...
</dict>
</plist>

Если Ваш драйвер соответствует, когда Вы заменяете свое устройство в горячем режиме, но не, когда Ваше устройство присоединяется во время начальной загрузки, драйвер времени начальной загрузки мог бы соответствовать к Вашему устройству. Даже при том, что Ваш драйвер является лучшим соответствием, Набор I/O не завершит драйвер, который уже был данным контролем над устройством.

В этом случае необходимо будет добавить a OSBundleRequired свойство к Вашему водительскому списку свойств так Ваш драйвер также рассматривают для соответствия во время начальной загрузки.

Для получения дополнительной информации о загрузке KEXTs во время начальной загрузки посмотрите Загружающиеся Расширения ядра во Время начальной загрузки в Темах Программирования Расширения ядра документа.

Другие проблемы загрузки драйвера могут быть диагностированы с помощью общих методов поиска и устранения неисправностей Набора I/O. Одна полезная подсказка должна использовать режим диагностики kextload команды, чтобы попытаться загрузить Ваш драйвер вручную как показано в Перечислении 2

  Опции Listing 2 Diagnostic для kextload команды.

$ kextload -nt HelloIOKit.kext

Подстановочное соответствие

Как показано в предыдущем разделе, Общая Спецификация Класса детализирует точный характер того, как поля USB-устройства и интерфейсного дескриптора используются для соответствия драйверов. В некоторых случаях, однако, было бы удобно не должным быть создать многократные лица Набора I/O для указания различных устройств, поддерживающихся определенным драйвером. Например, если необходимо было поддерживать целый набор устройств от единственного поставщика, Вы могли просто указать индивидуальность, соответствовавшую ко всем идентификаторам продукта для того поставщика. Если тогда необходимо было обрезать поддерживаемый продукт IDs, Вы могли бы использовать probe метод драйвера, чтобы отрицать соответствовать к идентификаторам продукта вне диапазона, который может поддерживать драйвер. Это - идея позади понятия подстановочного соответствия.

В таблицах выше, можно заменить звездочкой * подстановочный символ для любого из полей от устройства или интерфейсного дескриптора. Тип значения свойства должен быть изменен от <integer> к <string> когда подстановочный символ используется как показано в Перечислении 3. Тестовый счет будет тогда сокращен на 1 000 для каждого указанного подстановочного знака. Например, драйвер устройства, соответствующий на idProduct и idVendor будет иметь тестовый счет 90 000. Если подстановочный знак указан для idProduct, тестовый счет будет сокращен на 1 000 - 89 000. Это означает, что драйвер для того же устройства, не имеющего подстановочного знака, превзойдет поддерживающее подстановочный знак.

  Подстановочная индивидуальность соответствия перечисления 3 В качестве примера.

 <key>IOKitPersonalities</key>
        <dict>
                <key>WildCardMatching</key>
                <dict>
                        <key>CFBundleIdentifier</key>
                        <string>com.apple.dts.driver.HelloIOKit</string>
                        <key>IOClass</key>
                        <string>com_apple_dts_driver_HelloIOKit</string>
                        <key>IOProviderClass</key>
                        <string>IOUSBDevice</string>
                        <key>idProduct</key>
                        <string>*</string>
                        <key>idVendor</key>
                        <integer>1452</integer>
                </dict>
        </dict>

idProduct свойство может также соответствовать против указанного диапазона идентификаторов продукта, не имея необходимость реализовывать a probe метод для избавлений от нежелательных идентификаторов продукта. Это частичное соответствие сделано путем указания числового idProductMask свойство в водительской индивидуальности соответствия в дополнение к idProduct свойство. Эта маска будет поразрядным ANDed с каждым идентификатором продукта устройства кандидата прежде, чем сравнить его с idProduct свойство.

Перечисление 4 показывает, как указать соответствие на идентификаторах продукта между 4 752 (0x1290) и 4755 (0x1293). Значение idProductMask свойство 65532 (0xfffc). Таким образом любой идентификатор продукта будут считать соответствием, будучи ANDed с 0xfffc, равняющимся idProduct значение свойства 4 752.

  Пример перечисления 4 использования idProductMask для соответствия диапазона идентификаторов продукта.

 <key>IOKitPersonalities</key>
        <dict>
                <key>WildCardMatching</key>
                <dict>
                        <key>CFBundleIdentifier</key>
                        <string>com.apple.dts.driver.HelloIOKit</string>
                        <key>IOClass</key>
                        <string>com_apple_dts_driver_HelloIOKit</string>
                        <key>IOProviderClass</key>
                        <string>IOUSBDevice</string>
                        <key>idProduct</key>
                        <integer>4752</integer>
                        <key>idProductMask</key>
                        <integer>65532</integer>
                        <key>idVendor</key>
                        <integer>1452</integer>
                </dict>
        </dict>


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


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

Добавленная документация о подстановочной функции соответствия Тайгера. Внесенные другие редакционные изменения.

13.08.2008

Добавленная документация о подстановочной функции соответствия Тайгера. Внесенные другие редакционные изменения.

 

Добавленная документация о подстановочной функции соответствия Тайгера. Внесенные другие редакционные изменения.

08.08.2008

Добавленная документация о подстановочной функции соответствия Тайгера. Внесенные другие редакционные изменения.

 

Добавленная документация о подстановочной функции соответствия Тайгера. Внесенные другие редакционные изменения.

02.10.2001

Новый документ, дающий некоторые подсказки относительно получения драйвера USB, соответствующего для работы.