Usb cfg configuration not found что делать
Usb cfg configuration not found что делать
Консоль только появилась и я еще новичок в этом. PS3 Slim CECH-2104A 500Gb DARKNET 4.70 COBRA 7.03
samsung s1 160gb. 1 основной активный раздел
Строка была USB\VID_04E8&PID_2F04\00000021E093105003A4
Написал в файле USB.CFG: 0x04e8:0x2f04:1 Закинул в папку мультимена, но диск не видит. Нажимаю «определить NTFS устройства». Толку 0.
Подскажите, пожалуйста, как решить проблему. Пока разбил его на 2 раздела: ntfs и fat. Но хочется только ntfs, потому что образы все большие
решение Включение PFS драйвера
Я удалил файл из каталога мультимена. Навел курсор на меняю пуска в файловом менеджере. Выбрал PFS драйвер
NTFS HDD auto-detection failed!
Please create proper USB.CFG file.
Добавлено (13 Апр 2015, 23:51)
———————————————
В общем вернул файл обратно. Но теперь через файловый менеджер мультимен включаю PFS драйвер (не знаю, где в другом месте) и все ок.
Еще игры не научился ставить, но уже попилял ее и отшлифовал радиаторы
у меня уже побывало много разных приставок, и уже масса экспериментов пройдена.
помню я момент появления pentium1 и с тех самых пор я постоянно улучшал свои железки модингом охлаждения, пилил разные радиаторы вырезал под все что грелось свыше нормы, на видяхи и их транзюки и на память. по сегодняшний день все также тщательно охлаждаю. еще ни одна видяха или мать не умерла после модинга, и живут по сегодняшний день. друзья удивляются постоянно, как ето у меня в разгоне все живет а в них даже на родных частотах умирает железяка за лет так 2-3.
вот например в ПС3 фат или толстушек если сделать внизу под куллером такое охлаждение, да процы будут чуть меньше греется, а вот другие части просто раскалялись и перегревались ну очень сильно. рукой даже притронутся к блоку питания невозможно. потому что охлаждение продумано до мелочей, турбина или куллер затягивает воздух с краев из отверстий и прогоняет по всей приставке охлаждая ее.
тоесть, на ПС3 фат такой ход неоправдан.
у меня на такой вопрос о перегреве решался просто, надо немного повысить обороты куллера чтоб увеличить поток продуваемого воздуха. тем более сейчас ето очень просто сделать, например через webMAN_mod.
вот у ПС3 слим я точно также поднимал обороты.
но как себя покажет такой мод надо вам проверить. особенно ето заденет на слимке нагрев жесткого диска ну и поднимется температура между приводом и мат-платой.
тоесть все проверь теперь не греется ли.
вот пример принципа работы охлаждения подобно как у ПС3 слим.
Только дно приставки как грелось так и греется. Возникает мысль выпилить дно приставки и заменить на сетку.
Вентилятор нужно будет заказать новый, если оставлю приставку у себя после прохождения эксклюзивов. Этот даже при включении немного тарахтит.
Для того чтобы внешний NTFS HDD заработал в мультимане обязательно надо отредактировать USB.CFG
Для этого сначала надо узнать vendor ID и product ID своего внешнего HDD.
Сохраняем файл, и кидаем его на пс3 в папку dev_hdd0/game/BLES80608/USRDIR/
Имеет следующие основные возможности:
— Встроенный и постоянно активный FTP сервер
— Файловый менеджер для работы с содержимым PS3 и подключенных устройств
— Расширенные опции в файле options.ini (options_default.ini)
— Индикатор Копирования/Бэкапа
— Поддерживает и отображает 7 устройств (HDD/USB/BD/SDHC/MS/CF)
— Поддержка дистанционного управления через PSP или другие совместимые девайсы
— Анимированная иконка и задний фон
— Функция проверить/скачать обновление выполняется при помощи кнопки [R3]
— Поддержка COVER.PNG в видео каталогах AVCHD
— Поддерживает активацию AVCHD с внешнего USB устройства.
— Поддерживает бэкап AVCHD на внутренний HDD
— Поддерживает проигрывание AVCHD и BDVM содержимого с внутреннего HDD
— Поддержка пересканирования DLP и CRT TV
— Проигрывание MP3 (проигрывает песни при помощи File Manager,возможно проигрывать песни по сети)
— Просмотр картинок JPEG/PNG (просматривать картинки через File manager, возможно просматритвать картинки по сети)
— HEX просмотрщик файлов
— Поддержка 4 типов шрифтов (можно менять кнопкой [SELECT]+[R3])
Диск на всякий случай вставляете в привод,еще не все игры идут без диска.Все игры советую запускать через иконку диска!Так надежнее!
Usb cfg configuration not found что делать
Дополнительно: Монтирование с помощью PS3 NET Server
Образы игр в формате iso/bin поместить в папку
/dev_hdd0/PSXISO или
/dev_hdd0/PSXGAMES
Игра появится в колонке «Ретро» в XMMB.
чтоб работали сейвы:
1. Запускаем PS3
2. Идем в раздел XBM «Сохранения PS/PS2»
3. Создаем карту памяти PS1
4. Карте даем любое имя (например, » Internal Memory Card «)
5. На созданной карте жмем треугольник->назначить->слот1
6. Запускаем через мультимен игру
Альтернативный вариант
Для работы необходим «PS2 Classics Placeholder» (скачивается в XMMB в колонке «Сеть»), игры поместить в /dev_hdd0/PS2ISO.
Если нет карт памяти, мультимен сам их создаст в папке SAVEDATA, которая появится в папке с игрой.
Для работы игр используйте следующий формат:
/dev_hdd0/PS2ISO/[SCUS-97194] NFL GameDay 2003 (мультимен скачает обложку по ID игры, если она есть в наличии)
/dev_hdd0/PS2ISO/[SCUS-97194] NFL GameDay 2003/ISO.BIN.ENC
/dev_hdd0/PS2ISO/[SCUS-97194] NFL GameDay 2003/COVER.JPG (не обязательно, но если файл будет в наличии, то отображаться будет именно эта обложка, а не скачанная)
/dev_hdd0/PS2ISO/[SCUS-97194] NFL GameDay 2003/SAVEDATA/SCEVMC0.VME (мультимен сам создаст, если этого файла нет)
/dev_hdd0/PS2ISO/[SCUS-97194] NFL GameDay 2003/SAVEDATA/SCEVMC1.VME (мультимен сам создаст, если этого файла нет)
По сути, для игры достаточно лишь ISO.BIN.ENC в:
и появится иконка диска в «Ретро» колонке XMMB. Если назвать папку с игрой кодом диска, то скачается обложка. Если положить файл «COVER.JPG» рядом с iso файлом игры, то он и будет использоваться как обложка.
Альтернативный вариант
Для работы эмулятора старых консолей необходимо установить программу RetroArch. Ее можно загрузить в колонке «Сеть» в XMMB.
1. SNES9x (Super Nintendo ES Emulator)
— Игры и обложки помещать в /dev_usb00*/ROMS/snes или /dev_hdd0/ROMS/snes
— Расширения файлов игр: SMC/smc, FIG/fig, SFC/sfc, GD3/gd3, GD7/gd7, DX2/dx2, BSX/bsx, SWC/swc, JMA/jma, ZIP/zip
2. GenesisPlus GX (SEGA Genesis / Mega Drive emulator)
— Игры и обложки помещать в /dev_usb00*/ROMS/gen или /dev_hdd0/ROMS/gen
— Расширения файлов игр: BIN/bin, SMD/smd, GEN/gen, SMS/sms, md/MD, zip/ZIP
3. FCEU (NES / FCE Ultra emulator)
— Игры и обложки помещать в /dev_usb00*/ROMS/fceu или /dev_hdd0/ROMS/fceu
— Расширения файлов игр: UNIF/unif, NES/nes, FDS/fds, ZIP/zip
4. VBA (Gameboy / Advanced emulator)
— Игры и обложки помещать в /dev_usb00*/ROMS/vba или /dev_hdd0/ROMS/vba
— Расширения файлов игр: gba/GBA, gbc/GBC, gb/GB
5. FB Alpha/Next
— Игры и обложки помещать в /dev_usb00*/ROMS/fba или /dev_hdd0/ROMS/fba
— Расширения файлов игр: zip/ZIP или файлы без расширения.
Для того чтобы внешний NTFS HDD заработал, в мультимане обязательно надо отредактировать/создать файл под названием USB.CFG
Для этого сначала надо узнать Vendor ID и Product ID своего внешнего HDD.
В некоторых играх присутствуют файлы, размером больше 4 Гб (далее «большой файл»), они не могут быть помещены на жесткий диск, отформатированный в систему FAT32. Тем не менее, существует способ запуска таких игр частично с внешнего FAT32 диска.
Вам понадобится последний multiMAN manager и программа для разрезания большого файла (например, программа Split4G, разработанная автором multiMAN), который будет находиться на внутреннем диске консоли, а все остальные файлы игры – на внешнем.
1. Ваша игра должна находиться на диске с файловой системой NTFS (т.к. невозможно держать большие файлы на системе FAT32).
2. Скачайте и запустите программу Split4G из любого места на компьютере.
4. В поле с номером 2 выберите место, куда будет скопирована готовая игра уже с разрезанными большими файлами. Например, X:\games\.
5. В поле с номером 3 выберите формат «666хх» (как на картинке) и нажмите Start. Программа просканирует папку с игрой на наличие больших файлов и примется за дело.
Если вы выбрали во втором поле тот же самый путь, что и в первом, то разрезанный большой файл просто добавится туда и вам придется удалять неразрезанный файл вручную.
Если вы выбрали во втором поле, какой либо другой путь, то туда будет скопирована вся игра уже с разрезанными большими файлами. Поэтому имеет смысл во второе поле вбивать путь к вашему FAT32 диску, игра будет туда скопирована напрямую полностью и уже с разрезанными файлами.
В multiMAN запускаете игру как обычно, но перед первым запуском появится предупрждение, что большой файл будет установлен на внутренний диск консоли, соглашаетесь, происходит установка, потом вас выбросит в XMB, а дальше запускайте игру как обычно.
— Так же автор multiMAN сообщает, что менеджер поддерживает не более 10-ти игр с разрезанными большими файлами одновременно.
— Так же автор говорит, что не все игры поддерживают этот способ запуска.
Примечание:
Для большей уверенности, следует выполнить процедуру копирования раза три, и потом проверить с помощью программ, так как иногда файл бэкапа создаётся некорректно и при восстановлении консоли с помощью некорректного файла, можно окончательно ее «убить».
multiMAN поддерживает управление AVCHD и BDMV структур, но на самом деле не проигрывает их. Он монтирует их в нужных местах так чтобы ваша PS3 могла найти/распознать эту структуру и воспроизвести их с через XMB в разделе видео.
Вы можете создать соответствующие структуры AVCHD с использованием различных инструментов и оборудования, как multiAVCHD, AVCHD Coder, tsMuxeR, AVCHD camcoders.
Окраска и префиксы в игровом режиме(меню):
Желтый = AVCHD
Оранжевый/Красный = Blu-ray (BDMV)
* AVCHD или BDMV на внешних HDD/USB должны храниться в корневой папке\устройства:
X:\AVCHD_MOVIE_1\BDMV\INDEX.BDM
X:\BLURAY_MOVIE_2\BDMV\index.bdmv (Не работает должным образом)
* AVCHD или BDMV на внутреннем жестком диске должны храниться в той же папке, где и ваши игры (например, /dev_hdd0/GAMES)
* AVCHD фильмы на внешнем USB HDD будут правильно переименованы при активации (только одна активная папка AVCHD поддерживается PS3)
* AVCHD фильмы на внутреннем жестком диске будут смонтированы к внешнему USB/SDHC/ MS запоминающему устройству (USB Stick/SDHС/MS требуется 22KB свободного пространства)
Эти 77 пользователя(ей) сказали Спасибо Agent Raptor за это полезное сообщение: |
Модуль | Описание |
---|---|
core | Основной модуль USB. |
util | Вспомогательные функции. |
control | Стандартные запросы управления. |
legacy | Слой совместимости с версиями 0.x. |
backend | Субпакет содержащий встроенные бэкенды. |
К примеру, чтобы импортировать модуль core, введите следующее:
Ну что ж начнём
Далее следует простенькая программа, которая посылает строку ‘test’ в первый найденный источник данных (endpoint OUT):
Первые две строки импортируют модули пакета PyUSB. usb.core — основной модуль, а usb.util содержит вспомогательные функции. Следующая команда ищет наше устройство и возвращает экземпляр объекта, если находит. Если нет, возвращается None. Далее, мы устанавливаем конфигурацию, которую будем использовать. Заметьте: отсутствие аргументов означает, что нужная конфигурация была проставлена по-умолчанию. Как Вы увидите, во многих функциях PyUSB есть настройки по-умолчанию для большинства распространенных устройств. В этом случае, ставится первая найденная конфигурация.
Затем, мы ищем конечную точку в которой заинтересованы. Мы ищем ее внутри первого интерфейса, который у нас есть. После того как нашли эту точку мы посылаем в неё данные.
Если нам заранее известен адрес конечной точки, мы можем просто вызвать функцию write объекта device:
Здесь мы пишем строку ‘test’ в контрольную точку под адресом 1. Все эти функции будут разобраны лучше в последующих разделах.
Что не так?
Каждая функция в PyUSB вызывает исключение в случае ошибки. Помимо стандартных исключений Python, PyUSB определяет usb.core.USBError для ошибок связанных с USB.
Вы также можете использовать функции лога PyUSB. Он использует модуль logging. Для его использования определите переменную окружения PYUSB_DEBUG с одним из следующих уровней логирования: critical, error, warning, info или debug.
По-умолчанию сообщения посылаются в sys.stderr. Если хотите, Вы можете перенаправить сообщения лога в файл определив переменную окружения PYUSB_LOG_FILENAME. Если её значение — корректный путь к файлу, сообщения будут записываться туда, иначе они будут посылаться в sys.stderr.
Где ты?
Функция find() в модуле core используется чтобы найти и пронумеровать устройства присоединенные к системе. К примеру, скажем что у нашего устройства есть vendor ID со значением 0xfffe и product ID равный 0x0001. Если нам нужно найти это устройство мы сделаем так:
Вот и всё, функция возвратит объект usb.core.Device, который представляет наше устройство. Если устройство не найдено оно возвратит None. На самом деле Вы можете использовать любое поле класса Device Descriptor, которое хотите. К примеру, что если мы захотим узнать есть ли USB-принтер подключенный к системе? Это очень легко:
7 — это код для класса принтеров в соответствии со спецификацией USB. О, постойте, что если я хочу пронумеровать все имеющиеся принтеры? Без проблем:
Что случилось? Что ж, время для небольшого объяснения… у find есть параметр, который называется find_all и по-умолчанию имеет значение False. Когда он имеет ложное значение [1], find будет возвращать первое устройство, которое подходит под указанные критерии (скоро об этом поговорим). Если Вы передадите параметру истинное значение, find вместо этого возвратит список из всех устройств подходящих по критериям. Вот и всё! Просто, не правда ли?
Мы закончили? Нет! Я ещё не всё рассказал: многие устройства на самом деле ставят свою информацию о классе в Interface Descriptor вместо Device Descriptor. Так что, чтобы по-настоящему найти все принтеры подключенные к системе, нам нужно будет перебрать все конфигурации, а также все интерфейсы и проверить — выставлено ли у одного из интерфейсов в bInterfaceClass значение 7. Если Вы программист как и я Вы можете задаться вопросом: есть ли путь полегче с помощью которого это можно реализовать. Ответ: да, он есть. Для начала давайте посмотрим на готовый код нахождения всех подключенных принтеров:
Параметр custom_match принимает любой вызываемый объект, который получает объект устройства. Он должен возвращать истинное значение для подходящего устройства и ложное — для неподходящего. Вы также можете скомбинировать custom_match с полями устройства, если захотите:
Здесь нас интересуют принтеры поставщика 0xfffe.
Опиши себя
Ок, мы нашли наше устройство, но перед тем как с ним взаимодействовать, нам хотелось бы узнать больше о нём. Ну Вы знаете, конфигурации, интерфейсы, конечные точки, типы потоков данных…
Если у Вас есть устройство, Вы можете получить доступ к любому полю дескриптора устройства как к свойствам объекта:
Для доступа к имеющимся конфигурациям в устройстве, Вы можете итерировать устройство:
Таким же образом Вы можете итерировать конфигурацию для доступа к интерфейсам, а также итерировать интерфейсы для доступа к их контрольным точкам. У каждого типа объекта есть поля соответствующего дескриптора как атрибуты. Взглянем на пример:
Вы также можете использовать индексы для произвольного доступа к дескрипторам, как здесь:
Как вы можете увидеть индексы отсчитываются с 0. Но постойте! Есть что-то странное в том, как я получаю доступ к интерфейсу… Да, Вы правы, индекс для Configuration принимает ряд из двух значений, из которых первый — это индекс Interface’а, а второй — альтернативная настройка. В общем, чтобы получить доступ к первому интерфейсу, но со второй настройкой, мы напишем cfg[(0,1)].
Теперь время научиться мощному способу поиска дескрипторов — полезной функции find_descriptor. Мы уже видели её в примере поиска принтеров. find_descriptor работает практически также как и find, с двумя исключениями:
Заметьте, что find_descriptor находится в модуле usb.util. Он также принимает описанный ранее параметр custom_match.
Имеем дело с множественными идентичными устройствами
Иногда у Вас может быть два идентичных устройства подсоединенных к компьютеру. Как Вы можете различать их? Объекты Device идут с двумя дополнительными атрибутами, которые не являются частью спецификации USB, но очень полезны: атрибуты bus и address. Прежде всего, стоит сказать, что эти атрибуты идут от бэкенда, а бэкенд может и не поддерживать их — в этом случае они выставлены на None. Тем не менее эти атрибуты представляют номер и адрес шины устройства и, как Вы могли уже догадаться, могут быть использованы для того, чтобы различать два устройства с одинаковыми значениями атрибутов idVendor и idProduct.
Как я должен работать?
Устройства USB после подсоединения должны конфигурироваться с помощью нескольких стандартных запросов. Когда я начал изучать спецификацию USB, я был обескуражен дексрипторами, конфигурациями, интерфейсами, альтернативными настройками, типами передачи и всем этим… И что самое худшее — Вы не можете просто игнорировать их: устройство не работает без установки конфигурации, даже если оно одно! PyUSB пытается сделать Вашу жизнь настолько проще, насколько это возможно. К примеру, после получения Вашего объекта устройства, первым делом, перед тем как взаимодействовать с ним, нужно отправить запрос set_configuration. Параметр конфигурации для этого запроса, который Вас интересует — bConfigurationValue. У большинства устройств есть не более одной конфигурации, а отслеживание значения конфигурации для использования раздражает (хотя большинство кода, который я видел просто жестко кодировали это). Следовательно, в PyUSB, Вы можете просто отправить запрос set_configuration без аргументов. В этом случае он установит первую найденную конфигурацию (если у Вашего устройства она всего одна, Вам вообще не надо беспокоиться о значении конфигурации). К примеру, представим, что у Вас устройство с одним декриптором конфигурации, а его поле bConfigurationValue равно 5 [3], последующие запросы будут работать одинаково:
Вау! Вы можете использовать объект Configuration как параметр для set_configuration! Да, также у него есть метод set для конфигурации самого себя в текущую конфигурацию.
Другая опция, которую Вам нужно или не нужно будет настроить — опция смены интерфейсов. Каждое устройство может иметь только одну активированную конфигурацию в один момент, и у каждой конфигурации может быть больше чем один интерфейс, а Вы можете использовать все интерфейсы в одно и то же время. Вам лучше понять эту концепцию, если Вы думаете о интерфейсе как о логическом устройстве. К примеру, давайте представим многофункциональный принтер, который в одно и то же время и принтер, и сканер. Чтобы не усложнять (или по крайней мере делать настолько просто насколько возможно), давайте будем считать, что у него есть всего одна конфигурация. Т.к. у нас есть принтер и сканер у конфигурации есть 2 интерфейса: один для принтера и один для сканера. Устройство с более чем одним интерфейсом называется композитным устройством. Когда Вы подключаете Ваш многофункциональный принтер к Вашему компьютеру, Операционная Система загрузит два разных драйвера: один для каждого «логического» периферического устройства, которое у Вас есть [4].
Что насчёт альтернытивных настроек интерфейса? Хорошо, что Вы спросили. У интерфейса есть один или более альтернытивных настроек. Интерфейс у которого только одна альтернативная настройка рассматривается как не имеющий альтернативных настроек [5]. Альтернативные настройки для интерфейсов как конфигурации для устройств, то есть на каждый интерфейс у Вас может быть только одна активная альтернативная настройка. К примеру, спецификация USB говорит о том, что у устройства не может быть изохронной контрольной точки в его основной альтернативной настройке [6], так что потоковое устройство должно иметь как минимум две альтернативные настройки, со второй настройкой, имеющей изохронную контрольную точку. Но, в отличии от конфигураций, интерфейсы только с одной альтернативной настройкой не нуждается в настройке [7]. Вы выбираете альтернативную настройку интерфейса с помощью функции set_interface_altsetting:
Спецификация USB говорит, что устройству позволяется возвращать ошибку в случае, если оно получает запрос SET_INTERFACE к интерфейсу у которого нет дополнительных альтернативных настроек. Так что, если Вы не уверены в том, что интерфейс имеет более одной альтернативной настройки или в том, что он принимает запрос SET_INTERFACE, наиболее безопасным методом будет вызвать set_interface_altsetting внутри блока try-except, как здесь:
Вы также можете использовать объект Interface как параметр функции, параметры interface и alternate_setting автоматически наследуются от полей bInterfaceNumber и bAlternateSetting. Пример:
Объект Interface должен принадлежать активному дескриптору конфигурации.
Поговори со мной, милая
А теперь для нас настало время понять как взаимодействовать c USB устройствами. У USB есть четыре типа потоков данных: массовый (bulk transfer), прерывающийся (interrupt transfer), изохронный (isochronous transfer) и управляющий (control transfer). Я не планирую объяснять назначение каждого потока и различия между ними. Поэтому я предполагаю, что у Вас есть по крайней мере базовые знания о потоках данных USB.
Управляющий поток данных — единственный поток, структура которого описана в спецификации, остальные просто отправляют и получают необработанные данные с точки зрения USB. Поэтому у Вас есть различные функции для работы с управляющими потоками, а остальные потоки обрабатываются одними и теми же функциями.
Вы можете обратиться к управляющему потоку данных посредством метода ctrl_transfer. Он используется как для исходящих (OUT) так и для входящих (IN) потоков. Направление потока определяет параметр bmRequestType.
Параметры ctrl_transfer практически совпадают со структурой управляющего запроса. Далее следует пример того, как организовывать управляющий поток данных [8]:
В этом примере предполагается, что наше устройство включает в себя два пользовательских управляющих запроса, которые действуют как loopback pipe. То, что Вы пишете с сообщением CTRL_LOOPBACK_WRITE, Вы можете прочитать с сообщением CTRL_LOOPBACK_READ.
Первые четыре параметра — bmRequestType, bmRequest, wValue и wIndex — поля стандартной структуры управляющего потока. Пятый параметр — это либо пересылаемые данные для исходящего потока данных или кол-во считываемых данных во входящем потоке. Пересылаемые данные могут быть любым типом последовательности, которая может быть подана в качестве параметра на вход метода __init__ для массива. Если нет пересылаемых данных параметр должен иметь значение None (или 0 в случае входящего потока данных). Есть ещё один опциональный параметр указывающий таймаут операции. Если Вы не передаете его, будет использоваться таймаут по-умолчанию (больше об этом дальше). В исходящем потоке данных возвращаемое значение — это количество байтов, реально посылаемое устройству. Во входящем потоке возвращаемое значение — массива со считанными данными.
Для других потоков Вы можете использовать методы write и read, соответственно, чтобы записывать и считывать данные. Вам не нужно беспокоиться о типе потока — он автоматически определяется по адресу контрольной точки. Вот наш пример loopback при условии, что у нас есть loopback pipe в контрольной точке 1:
Первый и третий параметры одинаковы для обоих методов — это адрес контрольной точки и таймаут, соответственно. Второй параметр — пересылаемые данные (write) или количество байтов для считывания (read). Возвращенными данными будут либо экземпляр объекта массива для метода read, либо количество записанных байтов для метода write.
С бета 2 версии вместо количества байтов, Вы можете передать для read или ctrl_transfer объект массива, в который данные будут считываться. В этом случае, количество байтов для считывания будет длиной массива умноженной на значение array.itemsize.
В ctrl_transfer, параметр timeout опционален. Когда timeout опущено, используется свойство Device.default_timeout как операционный таймаут.
Контролируй себя
Кроме функций потоков данных модуль usb.control предоставляет функции, которые включают в себя стандартные управляющие запросы USB, а в модуле usb.util есть удобная функция get_string специально выводящая дескрипторы строк.
Дополнительные темы
За каждой великой абстракцией стоит великая реализация
Раньше был только libusb. Потом пришел libusb 1.0 и у нас были libusb 0.1 и 1.0. После этого мы создали OpenUSB и сейчас мы живем в Вавилонской Башне USB-библиотек [9]. Как PyUSB справляется с этим? Что ж, PyUSB — демократичная библиотека, Вы можете выбрать какую хотите бибилиотеку. На самом деле Вы можете написать вашу собственную библиотеку USB с нуля и сказать PyUSB использовать её.
Функция find имеет ещё один параметр, о котором я Вам не рассказал. Это параметр backend. Если Вы его не передаете — будет использоваться один из встроенных бэкендов. Бэкенд — это объект унаследованный от usb.backend.IBackend, ответственный за введение специфического для операционной системы хлама USB. Как Вы могли догадаться, встроенные libusb 0.1, libusb 1.0 и OpenUSB — бэкенды.
Вы можете написать свой собственный бэкенд и использовать его. Просто наследуйте от IBackend и включите необходимые методы. Вам может понадобиться посмотреть в документацию usb.backend, чтобы понять как это делается.
Не будьте эгоистичны
У Python есть то, что мы называем автоматическое управление памятью. Это значит, что виртуальная машина будет решать когда выгрузить объекты из памяти. Под капотом PyUSB управляет всеми низко-уровневыми ресурсами, с которыми необходимо работать (утверждение интерфейса, регулировки устройства, и т.д.) и большинству пользователей не нужно беспокоиться об этом. Но, из-за непредопределенной природы автоматического уничтожения объектов Python’ом, пользователи не могут предсказать когда выделенные ресурсы будут освобождены. Некоторые приложения нуждаются в том, чтобы выделить и освободить ресурсы детерминировано. Для таких приложений модуль usb.util предоставляет функции для взаимодействия с управлением ресурсами.
Если Вы хотите запрашивать и освобождать интерфейсы вручную, Вы можете использовать функции claim_interface и release_interface. Функция claim_interface будет запрашивать указанный интерфейс, если устройство до сих пор этого не сделало. Если устройство уже запросило интерфейс, она ничего не делает. Так же release_interface будет освобождать указанный интерфейс, если он запрошен. Если интерфейс не запрошен, она ничего не делает. Вы можете использовать ручное запрашивание интерфейсов, чтобы решить описанную в документации libusb проблему выбора конфигурации.
Если Вы хотите освободить все ресурсы выделенные объектом устройства (включая запрошенные интерфейсы), Вы можете использовать функцию dispose_resources. Она освобождает все выделенные ресурсы и переводит объект устройства (но не в аппаратные средства устройства самого по себе) в то состояние, в котором оно было возвращено после использования функции find.
Определение библиотек вручную
В общем, бэкенд — это обертка над общей библиотекой, которая реализует API для доступа к USB. По-умолчанию, бэкенд использует ctypes функцию find_library(). На Linux и других Unix-подобных Операционных Системах, find_library пытается запустить внешние программы (такие как /sbin/ldconfig, gcc и objdump) в целях нахождения файла библиотеки.
В системах в которых эти программы отсутствуют и/или кэш библиотек отключен, эта функция не может использоваться. Чтобы преодолеть ограничения, PyUSB позволяет Вам подавать пользовательскую функцию find_library() на бэкенд.
Примером такого сценария будет:
Заметьте, что find_library — аргумент для функции get_backend(), в котором Вы поставляете функцию, которая ответственная за поиск правильной библиотеки для бэкенда.
Правила старой школы
Если Вы пишите приложение используя старые API PyUSB (0.что-то-там), Вы можете спрашивать себя, нужно ли Вам обновить Ваш код, чтобы использовать новый API. Что ж, Вам стоит это сделать, но это не обязательно. PyUSB 1.0 идет вместе с модулем совместимости usb.legacy. Он включает в себя старое API на основе нового API. «Что ж, должен ли я просто заменить мою строчку import usb на import usb.legacy as usb чтобы заставить моё приложение работать?», спросите Вы. Ответ — да, это будет работать, но это не обязательно. Если Вы запустите свое приложение неизмененным оно будет работать, потому что строчка import usb импортирует все публичные символы из usb.legacy. Если Вы сталкиваетесь с проблемой — скорее всего Вы нашли баг.
Помогите мне, пожалуйста
Если Вас нужна помощь, не пишите мне на e-mail, для этого есть список рассылки. Инструкции по подписке могут быть найдены на сайте PyUSB.
[1] Когда я пишу True или False (с большой буквы), я имею ввиду соответственные значения языка Python. А когда я говорю истинно (true) или ложно (false), я имею ввиду любое выражение Python, которое расценивается как истинное или ложное. (Данное сходство имело место в оригинале и помогает понять понятия истинного и ложного в переводе. — Прим.пер.):
[2] Смотрите конкретную документацию бэкенда.
[3] Спецификация USB не навязывает какое-либо определенное значение для значения конфигурации. То же истинно для номеров интерфейса и альтернативной настройки.
[4] На самом деле всё немного сложнее, но этого просто объяснения для нас хватит.
[5] Я знаю, что это звучит странно.
[6] Это потому, что если нету пропускной способности для изохронных потоков данных во время конфигурации устройства, оно может быть успешно пронумеровано.
[7] Этого не происходит для конфигурации, потому что устройству разрешено быть в несконфигурированном состоянии.
[8] В PyUSB управляющие потоки данных обращаются к контрольной точке 0. Очень очень очень редко устройство имеет альтернативную управляющую контрольную точку (Я никогда не встречал такого устройства).
[9] Это просто шутка, не принимайте это всерьез. Большой выбор лучше, чем без выбора.
- Анемия что это такое и чем опасна
- Как звали родителей брюса уэйна