2015-07-29 9 views
3

Недавно я столкнулся с этой проблемой с головной болью, я уже потратил неделю на эту проблему, но все еще не удалось. Надеюсь, вы можете помочь мне отбросить этот камень, большое спасибо.USBInterfaceOpen всегда сообщает об ошибке kIOReturnExclusiveAccess

Моя проблема: Наш компонентный USB-накопитель для iPhone, на самом деле в этом устройстве хранения есть SD-карта. Теперь мы хотим разработать приложение Mac для обновления прошивки для этого устройства хранения. Но каждый раз, когда я подключаю запоминающее устройство к Mac, Mac автоматически устанавливает его, и я всегда терпит неудачу с kIOReturnExclusiveAccess при вызове USBInterfaceOpen.

Я также пытаюсь написать codeless kext, чтобы увеличить оценку зонда, но он по-прежнему не работает. Я не знаю, что я ошибаюсь, или некоторые ошибки для написания кодового файла kext, например, написать неправильный идентификатор IOClass, неправильный идентификатор пакета.

Моего Codeless Kext info.plist является:

<?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>BuildMachineOSBuild</key> 
    <string>14E46</string> 
    <key>CFBundleDevelopmentRegion</key> 
    <string>en</string> 
    <key>CFBundleIdentifier</key> 
    <string>com.mophie.MyDriverTest3</string> 
    <key>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>CFBundleName</key> 
    <string>MyDriverTest3</string> 
    <key>CFBundlePackageType</key> 
    <string>KEXT</string> 
    <key>CFBundleSignature</key> 
    <string>????</string> 
    <key>CFBundleVersion</key> 
    <string>1.0.3</string> 
    <key>DTCompiler</key> 
    <string>com.apple.compilers.llvm.clang.1_0</string> 
    <key>DTPlatformBuild</key> 
    <string>6E35b</string> 
    <key>DTPlatformVersion</key> 
    <string>GM</string> 
    <key>DTSDKBuild</key> 
    <string>14D125</string> 
    <key>DTSDKName</key> 
    <string>macosx10.10</string> 
    <key>DTXcode</key> 
    <string>0640</string> 
    <key>DTXcodeBuild</key> 
    <string>6E35b</string> 
    <key>IOKitPersonalities</key> 
    <dict> 
    <key>MyDriverTest3</key> 
     <dict> 
     <key>CFBundleIdentifier</key> 
     <string>com.apple.iokit.IOUSBFamily</string> 
     <key>IOClass</key> 
     <string>IOService</string> 
     <key>IOProviderClass</key> 
     <string>IOUSBDevice</string> 
     <key>bcdDevice</key> 
     <string>256</string> 
     <key>idProduct</key> 
     <integer>4369</integer> 
     <key>idVendor</key> 
     <integer>6631</integer> 
     </dict> 
    </dict> 
    <key>OSBundleRequired</key> 
    <string>Root</string> 
</dict> 
</plist>  

Ниже результат от ioreg для моего устройства хранения:

space [email protected] <class IOUSBDevice, id 0x100001773, registered, matched, active, busy 0 (300 ms), retain 9> 
+-o IOUSBCompositeDriver <class IOUSBCompositeDriver, id 0x100001775, !registered, !matched, active, busy 0, retain 4> 
+-o [email protected] <class IOUSBInterface, id 0x100001776, registered, matched, active, busy 0 (293 ms), retain 8> 
    +-o IOUSBMassStorageClass <class IOUSBMassStorageClass, id 0x100001777, registered, matched, active, busy 0 (201 ms), retain 9> 
    +-o IOSCSIPeripheralDeviceNub <class IOSCSIPeripheralDeviceNub, id 0x100001779, registered, matched, active, busy 0 (99 ms), retain 7> 
    +-o IOSCSIPeripheralDeviceType00 <class IOSCSIPeripheralDeviceType00, id 0x10000177a, !registered, !matched, active, busy 0 (13 ms), retain 9> 
    +-o IOBlockStorageServices <class IOBlockStorageServices, id 0x10000177d, registered, matched, active, busy 0 (13 ms), retain 6> 
     +-o IOBlockStorageDriver <class IOBlockStorageDriver, id 0x10000177e, registered, matched, active, busy 0 (12 ms), retain 47> 
     +-o mophie SpacePack Media <class IOMedia, id 0x100001784, registered, matched, active, busy 0 (12 ms), retain 11> 
     +-o IOMediaBSDClient <class IOMediaBSDClient, id 0x100001785, registered, matched, active, busy 0 (0 ms), retain 6> 
     +-o IOFDiskPartitionScheme <class IOFDiskPartitionScheme, id 0x100001788, !registered, !matched, active, busy 0 (1 ms), retain 6> 
      +-o Untitled [email protected] <class IOMedia, id 0x10000178a, registered, matched, active, busy 0 (1 ms), retain 10> 
      +-o IOMediaBSDClient <class IOMediaBSDClient, id 0x10000178b, registered, matched, active, busy 0 (0 ms), retain 7> 

Надеется, что вы можете мне помочь в этой проблеме, много много много спасибо , Я очень высоко ценю вашу помощь!

ответ

0

Несколько моментов:

  • Codeless Kext подход должен нормально работать в такой ситуации.
  • Как правило, ваш кодовый kext будет соответствовать (через IOProviderClass) IOUSBInterface, а не IOUSBDevice. (например, см. the FTDI example)
  • Идентификатор связки для IOService: com.apple.kpi.iokit, а не com.apple.iokit.IOUSBFamily, хотя я подозреваю, что это не должно быть проблемой.
  • Является ли ваш кодовый kext подписан и установлен правильно? (У меня были экземпляры, в которых kext в/Library/Extensions/не работал во время загрузки, по крайней мере, на OSX 10.9.x, в отличие от System/Library/Extensions, хотя он должен работать нормально для любых устройств с горячей заменой.) Убедитесь, что кеш kext/identity обновлен, другими словами, touch каталог Extensions всякий раз, когда вы обновляете kext.
  • Что делает kextutil -n сказать?
  • Вы пытались установить свойство личности IOKitDebug, чтобы узнать, есть ли у вашего kext возможность получить доступ к устройству?
  • В зависимости от того, как реализованы ваши команды обновления прошивки, вы можете использовать ioctl s на узле устройства. Вы можете отправлять необработанные запросы SCSI на устройства SCSI через ioctl. Я не уверен, что это будет работать для класса массовой памяти USB, но это определенно будет для USB-подключенного SCSI (UAS) или любого другого «истинного» устройства SCSI. Очевидно, что это помогает только в том случае, если ваши команды обновления прошивки открыты через SCSI.

Если после всего этого вы все еще застряли, предоставьте дополнительную информацию, относящуюся к вышеуказанным предложениям!

+0

Большое спасибо за пример FTDI. он упомянул долгосрочное решение - изменить приложение, чтобы открыть последовательный порт уровня BSD для связи с оборудованием FTDI. Кратковременное решение состоит в том, чтобы внедрить бескальный kext. Возможно, мне нужны исследования долгосрочного решения. – FlyingMan

+0

Я пробовал, как вы предлагаете, и все еще терпит неудачу. Я использую kextutil -n, он сказал: Предупреждения: Личность CFBundleIdentifier отличается от содержащего Kext (а не обязательно ошибки, но редко делается): MyDriverTest3 подписывания коды Отказ: не подписанный код Предупреждения: Личность CFBundleIdentifier отличается от содержащего kext (не обязательно ошибка, но редко делается): MyDriverTest3 /System/Library/Extensions/MyDriverTest3.kext представляется загружаемым (включая связь для библиотек на диске). Я также отключил кодовый знак: ** sudo nvram boot-args = kext-dev-mode = 1 ** – FlyingMan

+0

Ну, это просто предупреждения, а не ошибки, поэтому, если вы устанавливаете kext в/Library/Extensions и подключаете в устройстве, что происходит? Вы получаете какой-либо выход на консоль? И т. Д. – pmdj

0

Похоже, вы пытаетесь использовать низкоуровневые команды USB, предоставленные IOUSBInterfaceInterface, для подключения к интерфейсу USB для массовой памяти и отправки некоторых пользовательских команд для обновления прошивки. Поскольку этот интерфейс востребован драйверами Apple массового хранения, вам, вероятно, не разрешено это делать.

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

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

+0

Привет, Дэвид, большое спасибо за ваш ответ, но у нас нет интерфейса, определенного поставщиком. Наш продукт сейчас продается, из-за обновления iOS iOS не может распознать устройство. Поэтому мы планируем разработать приложение для Mac для обновления прошивки. Версия Windows очень проста, но для mac ** IOUSBInterfaceInterface ** всегда терпит неудачу. Мне так грустно. – FlyingMan

+0

Ну, облом. Разве нет аппаратной процедуры для перехода в режим загрузчика, к которому могут следовать клиенты? Поскольку микропрограммное обеспечение всегда может быть повреждено или запущено, устройство должно быть спроектировано с помощью специальной кнопки/кнопки, которая проверяется при включении питания, чтобы определить, следует ли перейти в режим обновления прошивки или нет. –

+0

Да, ваше предложение очень приятно, но у нашей прошивки нет этого механизма. – FlyingMan