Невозможно запросить интерфейс: Ресурс занят
Я работаю с USB4Java (версия низкого уровня) и в основном работаю с этим кодом здесь. Я работаю в Ubuntu, и у меня возникла проблема с разрешениями, но я смог ее решить, запустив eclipse с помощью gksu из терминала.
Теперь у меня возникла новая проблема: когда я дохожу до точки в коде здесь:
public static void claimDevice(DeviceHandle handle, int interfaceNum){
int r = LibUsb.claimInterface(handle, interfaceNum);
.
.
.
Я получаю исключение, сообщающее, что "Ресурс занят":
USB error 6: Unable to claim interface: Resource busy
Я использовал Ubuntu раньше (но никогда не для разработки, поэтому я действительно новичок в этом). Если это не то место, где нужно решать этот вопрос, то, пожалуйста, скажите мне, где его взять, чтобы я мог получить ответ.
В частности, вопрос в том, что это значит и как я могу решить это? Моя цель, в данном случае это пользовательское USB-устройство, заключается в создании низкоуровневого кроссплатформенного... основанного на Java... "драйвера" (используя этот термин свободно). Я работаю с Ubuntu прямо сейчас, потому что команда терминала lsusb дает большое количество информации об рассматриваемом устройстве.
2 ответа
Мне удалось (благодаря некоторому уговору) найти ответ от Google: для всех, кто сталкивается с этой ошибкой и не хочет копать, в контексте, с которым я работал, мне пришлось отключить интерфейс от ядра. прежде чем я мог требовать это, вот так:
public static void claimDevice(DeviceHandle handle, int interfaceNum){
int r = LibUsb.detachKernelDriver(handle, interfaceNum);
if (r != LibUsb.SUCCESS &&
r != LibUsb.ERROR_NOT_SUPPORTED &&
r != LibUsb.ERROR_NOT_FOUND) throw new LibUsbException("Unable to detach kernel driver", r);
.
.
.
Надеюсь, это вам тоже поможет.
Более простой способ получить устройство - использовать принудительный запрос, как описано в документации по usb4java.
UsbConfiguration configuration = device.getActiveUsbConfiguration();
UsbInterface iface = configuration.getUsbInterface((byte) 0);
iface.claim(new UsbInterfacePolicy()
{
@Override
public boolean forceClaim(UsbInterface usbInterface)
{
return true;
}
});
try
{
System.out.println("is active: " + iface.isActive());
}
finally
{
iface.release();
}