Невозможно запросить интерфейс: Ресурс занят

Я работаю с 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();
    }
Другие вопросы по тегам