Мультиконфигурационное USB-устройство — проблемы в Catalina

Драйверы для интерфейсов USB-устройства со 2-й конфигурацией получают KIOServiceTerminated . Те же драйвера для аналогичных интерфейсов в конфигурации 1 загружаются и работают корректно. Я получаю следующий журнал для интерфейса, который загружается и сразу же получает сообщение о прекращении после этих сообщений. В чем проблема?

default 16:42:40.813546+0530    kernel  IOUSBHostInterface: not registry member at registerService()
default 16:42:40.813560+0530    kernel  IOUSBHostInterface: bad busy count (0,-1)


Backtrace 0xffffff8000a125c6 0xffffff7f812f4731 0xffffff7f812f38a1 0xffffff7f81129388 0xffffff800037b625 0xffffff800037b151 0xffffff80002e013e

default 16:42:40.813561+0530    kernel        Kernel Extensions in backtrace:

default 16:42:40.813570+0530    kernel           com.apple.iokit.IOUSBHostFamily(1.2)[5E8D1616-2C4B-3E81-B199-59D3531E0759]@0xffffff7f8111a000->0xffffff7f81212fff

default 16:42:40.813577+0530    kernel              dependency: com.apple.driver.AppleBusPowerController(1.0)[5F8013C3-D135-3795-8C05-F5DDA387ADC4]@0xffffff7f81100000

default 16:42:40.813584+0530    kernel              dependency: com.apple.driver.usb.AppleUSBCommon(1.0)[98454AB6-B806-330F-98C6-FEA7F44D22BA]@0xffffff7f81108000

default 16:42:40.813590+0530    kernel              dependency: com.apple.driver.AppleUSBHostMergeProperties(1.2)[A7569701-C592-31CF-8740-439114078F9F]@0xffffff7f81116000

default 16:42:40.813597+0530    kernel           com.apple.iokit.IOUSBFamily(900.4.2)[3FCD6CD5-5077-374F-AD7A-6A0EA61E1FC5]@0xffffff7f812a2000->0xffffff7f8133bfff

default 16:42:40.813602+0530    kernel              dependency: com.apple.iokit.IOPCIFamily(2.9)[AA7C7A4F-9F5D-3533-9E78-177C3B6A72BF]@0xffffff7f810a2000

default 16:42:40.813608+0530    kernel              dependency: com.apple.iokit.IOUSBHostFamily(1.2)[5E8D1616-2C4B-3E81-B199-59D3531E0759]@0xffffff7f8111a000

default 16:42:40.813615+0530    kernel              dependency: com.apple.driver.usb.AppleUSBCommon(1.0)[98454AB6-B806-330F-98C6-FEA7F44D22BA]@0xffffff7f81108000

список информации об устройствах cdc usb

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>xxandroid_usbbus</string>
    <key>CFBundleGetInfoString</key>
    <string>5.5, xx Mobile USB CDC driver for MAV</string>
    <key>CFBundleIdentifier</key>
    <string>com.xx.driver.xxAndroidusbbus</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>USB CDC driver</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>5.5</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>5.5</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>AndroidUSBCDCDevice</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.xx.driver.xxAndroidusbbus</string>
            <key>IOClass</key>
            <string>xxUSBCDC</string>
            <key>IOProbeScore</key>
            <integer>99999</integer>
            <key>IOProviderClass</key>
            <string>IOUSBDevice</string>
            <key>bDeviceClass</key>
            <integer>0</integer>
            <key>bDeviceProtocol</key>
            <integer>0</integer>
            <key>bDeviceSubClass</key>
            <integer>0</integer>
            <key>idProduct</key>
            <integer>1000</integer>
            <key>idVendor</key>
            <integer>1000</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOUSBFamily</key>
        <string>650.4.1</string>
        <key>com.apple.kpi.iokit</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.mach</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.unsupported</key>
        <string>13.0.0</string>
    </dict>
</dict>
</plist>

Информация о файле plist интерфейса управления acm cdc

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>xxandroid_mdmcontrol</string>
    <key>CFBundleGetInfoString</key>
    <string>5.5, xx Mobile USB CDC ACM driver Control Interface for MAV</string>
    <key>CFBundleIdentifier</key>
    <string>com.xx.driver.xxAndroidmdmcontrol</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>xxUSBCDCACMControl</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>5.5</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>5.5</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>AndroidUSBCDCACMControl </key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.xxxdriver.xxAndroidmdmcontrol</string>
            <key>IOClass</key>
            <string>xxUSBCDCACMControl</string>
            <key>IOProviderClass</key>
            <string>IOUSBInterface</string>
            <key>bConfigurationValue</key>
            <integer>2</integer>
            <key>bInterfaceNumber</key>
            <integer>1</integer>
            <key>IOProbeScore</key>
            <integer>99999</integer>
            <key>bInterfaceSubClass</key>
            <integer>2</integer>
            <key>bInterfaceProtocol</key>
            <integer>1</integer>
            <key>idProduct</key>
            <integer>1000</integer>
            <key>idVendor</key>
            <integer>1000</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOSerialFamily</key>
        <string>10.0.7</string>
        <key>com.apple.iokit.IOUSBFamily</key>
        <string>650.4.1</string>
        <key>com.apple.kpi.iokit</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.mach</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.unsupported</key>
        <string>13.0.0</string>
    </dict>
</dict>
</plist>

информация об интерфейсе передачи данных ACM

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>xxandroid_mdmcontrol</string>
    <key>CFBundleGetInfoString</key>
    <string>5.5, xx Mobile USB CDC ACM driver Control Interface for MAV</string>
    <key>CFBundleIdentifier</key>
    <string>com.xx.driver.xxAndroidmdmcontrol</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>xxUSBCDCACMControl</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>5.5</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>5.5</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>AndroidUSBCDCACMControl </key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.xxxdriver.xxAndroidmdmcontrol</string>
            <key>IOClass</key>
            <string>xxUSBCDCACMControl</string>
            <key>IOProviderClass</key>
            <string>IOUSBInterface</string>
            <key>bConfigurationValue</key>
            <integer>2</integer>
            <key>bInterfaceNumber</key>
            <integer>1</integer>
            <key>IOProbeScore</key>
            <integer>99999</integer>
            <key>bInterfaceSubClass</key>
            <integer>2</integer>
            <key>bInterfaceProtocol</key>
            <integer>1</integer>
            <key>idProduct</key>
            <integer>1000</integer>
            <key>idVendor</key>
            <integer>1000</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOSerialFamily</key>
        <string>10.0.7</string>
        <key>com.apple.iokit.IOUSBFamily</key>
        <string>650.4.1</string>
        <key>com.apple.kpi.iokit</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.mach</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.unsupported</key>
        <string>13.0.0</string>
    </dict>
</dict>
</plist>

информация о последовательном интерфейсе cdc

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>CFBundleGetInfoString</key>
    <string>5.5, xx Mobile USB CDC DIAG driver Interface for MAV</string>
    <key>CFBundleExecutable</key>
    <string>xxandroid_serial</string>
    <key>CFBundleIdentifier</key>
    <string>com.xxx.driver.xxAndroidserial</string>
    <key>CFBundleName</key>
    <string>xxUSBCDCSerialData</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>5.5</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>5.5</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>AndroidUSBCDCSerail</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.xx.driver.xxAndroidserial</string>
            <key>IOClass</key>
            <string>xxUSBCDCSerialData</string>
            <key>IOProviderClass</key>
            <string>IOUSBInterface</string>
            <key>InputBuffers</key>
            <integer>8</integer>
            <key>OutputBuffers</key>
            <integer>32</integer>
            <key>bConfigurationValue</key>
            <integer>2</integer>
            <key>bInterfaceNumber</key>
            <integer>3</integer>
            <key>idProduct</key>
            <integer>1000</integer>
            <key>idVendor</key>
            <integer>1000</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOSerialFamily</key>
        <string>10.0.7</string>
        <key>com.apple.iokit.IOUSBFamily</key>
        <string>650.4.1</string>
        <key>com.apple.kpi.bsd</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.iokit</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.mach</key>
        <string>13.0.0</string>
        <key>com.apple.kpi.unsupported</key>
        <string>13.0.0</string>
    </dict>
</dict>
</plist>

ioreg -lirc IOUSBHostInterface

-o MTP@0  <class IORegistryEntry:IOService:IOUSBNub:IOUSBInterface, id 0x100002520, registered, matched, active, busy 0 (16 ms), retain 6>
    {
      "USBSpeed" = 3
      "iInterface" = 5
      "IOServiceLegacyMatchingRegistryID" = 4294976802
      "bInterfaceProtocol" = 0
      "bAlternateSetting" = 0
      "idProduct" = 1000
      "bcdDevice" = 1028
      "USB Interface Name" = "MTP"
      "USB Product Name" = “xxx”
      "locationID" = 336592896
      "bInterfaceClass" = 255
      "bInterfaceSubClass" = 255
      "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBHostFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
      "USBPortType" = 0
      "kUSBString" = "MTP"
      "bInterfaceNumber" = 0
      "bConfigurationValue" = 1
      "USB Vendor Name" = “xxx”
      "idVendor" = 1000
      "IOServiceDEXTEntitlements" = (("com.apple.developer.driverkit.transport.usb"))
      "bNumEndpoints" = 3
      "USB Serial Number" = “xxxxx”
      "IOGeneralInterest" = "IOCommand is not serializable"
      "IOClassNameOverride" = "IOUSBInterface"
    }


+-o ADB Interface@1  <class IORegistryEntry:IOService:IOUSBNub:IOUSBInterface, id 0x100002521, registered, matched, active, busy 0 (16 ms), retain 6>
    {
      "USBSpeed" = 3
      "iInterface" = 6
      "IOServiceLegacyMatchingRegistryID" = 4294976805
      "bInterfaceProtocol" = 1
      "bAlternateSetting" = 0
      "idProduct" = 1000
      "bcdDevice" = 1028
      "USB Interface Name" = "ADB Interface"
      "USB Product Name" = “xxxx”
      "locationID" = 336592896
      "bInterfaceClass" = 255
      "bInterfaceSubClass" = 66
      "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBHostFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
      "USBPortType" = 0
      "kUSBString" = "ADB Interface"
      "bInterfaceNumber" = 1
      "bConfigurationValue" = 1
      "USB Vendor Name" = “xxx”
      "idVendor" = 1000
      "IOServiceDEXTEntitlements" = (("com.apple.developer.driverkit.transport.usb"))
      "bNumEndpoints" = 2
      "USB Serial Number" = “xxxx”
      "IOGeneralInterest" = "IOCommand is not serializable"
      "IOClassNameOverride" = "IOUSBInterface"
    }

person david    schedule 19.11.2019    source источник
comment
Что это за драйвер? Kext (IOUSBFamily или IOUSBHostFamily?), DriverKit или IOKitLib? Что именно вызывает это сообщение? Подразумевается, что эта проблема специфична для Каталины? Означает ли это, что он работает на ‹= Мохаве?   -  person pmdj    schedule 19.11.2019
comment
@pmdj спасибо за редактирование, это устройство представляет собой составное USB-устройство (Android Mobile) с несколькими интерфейсами (BUS, ACM, SERIAL). когда подключаю драйвера устройств грузятся и появляется это сообщение. До того, как ОС Catalina работала правильно с теми же драйверами и устройством, в ОС Catalina возникла проблема. Драйвер шины (IOKitPersonalities -> IOProviderClass(IOUSBDevice) ), (OSBundleLibraries -> com.apple.iokit.IOUSBFamily). Драйвер управления ACM (IOKitPersonalities -> IOProviderClass(IOUSBInterface) ), (OSBundleLibraries -> com.apple.iokit.IOUSBFamily,com.apple.iokit.IOUSBSerialFamily).   -  person david    schedule 19.11.2019
comment
Драйвер данных ACM (IOKitPersonalities -> IOProviderClass(IOUSBInterface) ), (OSBundleLibraries -> com.apple.iokit.IOUSBFamily,com.apple.iokit.IOUSBSerialFamily). Последовательный драйвер CDC (IOKitPersonalities -> IOProviderClass(IOUSBInterface) ), (OSBundleLibraries -> com.apple.iokit.IOUSBFamily,com.apple.iokit.IOUSBSerialFamily).   -  person david    schedule 19.11.2019
comment
Чтобы уточнить, эти кексты без кода вы контролируете? (Возможно, вы могли бы отредактировать свой ответ, включив в него XML-код IOKitPersonalities и/или соответствующую часть вывода из ioreg -lirc IOUSBHostInterface)   -  person pmdj    schedule 19.11.2019
comment
это не бескодовые кексы, USB-интерфейсы конкретных поставщиков, аналогичные ACM/ECM.   -  person david    schedule 19.11.2019
comment
Итак, драйвер для них, который вы пытаетесь загрузить, представляет собой полный кекст (с двоичным кодом)?   -  person pmdj    schedule 19.11.2019
comment
да, устройство с теми же интерфейсами в конфигурации 1 работает нормально, но на другом устройстве с такими же интерфейсами в конфигурации 2 я получаю эти проблемы, во всех других предыдущих ОС все работает нормально.   -  person david    schedule 19.11.2019


Ответы (1)


Я еще не совсем понимаю, что вы пытаетесь сделать на данный момент (вы предоставили очень мало достоверной информации), поэтому в идеале мне нужно больше информации, чтобы быть уверенным - kext info.plist, вызовы API, которые запускают ошибка и т.д.

Однако, учитывая, что вы указываете «IOProviderClass (IOUSBInterface)» в своих комментариях, а com.apple.iokit.IOUSBFamily появляется в процитированной вами обратной трассе, я подозреваю, что вы сталкиваетесь с ошибками во все более плохо поддерживаемом устаревшем уровне совместимости IOUSBFamily, который вы, кажется, используете в своем kext . Я обнаружил различные проблемы с этим слоем в Мохаве и тем более в Каталине, некоторые из них зависят от аппаратного обеспечения (например, некоторые проблемы возникают только на некоторых моделях Mac).

Вы можете попробовать сообщить об ошибках в Apple, но я подозреваю, что вы получите тот же совет, который я собираюсь вам дать: вы должны перенести свой драйвер на более новый IOUSBHostFamily API. Если возможно, используйте DriverKit или как обычный демон пользовательского пространства, иначе как расширение ядра. Если это должно быть расширение ядра, файлы заголовков IOUSBHost*.h из macOS SDK содержат инструкции по переносу в комментариях вверху каждого файла.

person pmdj    schedule 19.11.2019
comment
Спасибо за ответ, я обновлю информацию plist и вывод ioreg для устройства. Поскольку кексы обновлений WWDC поддерживаются в ОС Catalina, мы пытаемся проверить ОС Catalina. У вас есть идеи, почему эта проблема может произойти? для USB запуск интерфейса данных acm вызывается через некоторое время по умолчанию 20:15:47.424654+0530 ядро ​​CDC ACM Data: не является членом реестра в registerService() по умолчанию 20:15:47.424699+0530 ядро ​​CDC ACM Data: плохой счетчик занятости (0, -1) - person david; 19.11.2019
comment
@david Kexts по-прежнему поддерживаются на Catalina, да. На основании предоставленной вами информации кажется, что вы используете API IOUSBFamily (IOUSBInterface, IOUSBDevice и т. д.) в своем kext. Он был заменен API IOUSBHostFamily в macOS 10.11 El Capitan. API IOUSBFamily устарел для некоторых версий и с тех пор полностью удален из SDK macOS. По-прежнему существует уровень совместимости, который переводит вызовы IOUSBFamily в IOUSBHostFamily, но с каждой версией macOS в него вводятся новые регрессии, вызывающие проблемы с драйверами, использующими старый API. - person pmdj; 19.11.2019
comment
@david Поскольку Apple постепенно пытается удалить сторонние кексты, я предлагаю, если вы портируете свой кекст на новый API, проверьте, можете ли вы вместо этого реализовать его с помощью DriverKit или драйвера пользовательского пространства, так как это дает гораздо лучший пользователь опыт работы с Каталиной. (кексты требуют сложного утверждения пользователем) DriverKit в настоящее время не поддерживает широкий спектр API, но поддерживается USB. - person pmdj; 19.11.2019
comment
Спасибо за ответ. Я обновил вывод plist и ioreg. если это поможет вам @pmdj, пожалуйста, дайте мне знать. тем временем будут проходить ваши обновления для последних выпусков Mac. поскольку кексты поддерживаются в ОС Catalina, мы решили это исправить. И мы планировали двигаться дальше в будущих ОС для декстов. Вот почему мы пытаемся загрузить кексты на каталину. - person david; 19.11.2019
comment
@david Спасибо за публикацию этой дополнительной информации. Это подтверждает, что вы определенно используете старые API-интерфейсы IOUSBFamily. Вы можете обойти проблему, изменив свой код — например, возможно, у вас есть ошибка подсчета ссылок в коде реконфигурации вашего устройства. Однако в равной степени возможно, что вы столкнулись с ошибкой на уровне совместимости Apple API. Я рекомендую отказаться от IOUSBFamily, по крайней мере, в драйвере, который задает конфигурацию устройства. - person pmdj; 19.11.2019
comment
Большое спасибо pmj. проверит и сообщит. - person david; 19.11.2019