Что не так при отправке сообщений на HID-устройство с помощью usb4java - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть простое hid-устройство на основе STM32, и я пытаюсь создать сервис для чтения / записи, используя usb4 java API низкого уровня.

import org.usb4java.*;
import java.nio.ByteBuffer;

public class DeviceServiceLow {

    public DeviceServiceLow(){
        int result = LibUsb.init(null);
        if (result != LibUsb.SUCCESS){
            throw new LibUsbException("Unable to initialze libusb",result);
        }
    }

    public static void main(String[] args){

        DeviceServiceLow deviceService = new DeviceServiceLow();
        DeviceList list = new DeviceList();
        int resultDeviceList = LibUsb.getDeviceList(null, list);
        if (resultDeviceList < 0) {
            {
                throw new RuntimeException(
                        "Unable to get device list. Result=" + resultDeviceList);
            }
        }
        showDeviceList(list);
        Device targetDevice = findDevice(list, BfbDeviceConstants.BFB_DEVICE_PID, BfbDeviceConstants.BFB_DEVICE_VID);
        System.out.println("Target device discovered = " + isDeviceNotNull(targetDevice));

        DeviceHandle handle = new DeviceHandle();
        int result = LibUsb.open(targetDevice, handle);
        if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to open USB device", result);
        try
        {
            claimInterface(handle, 0);
            byte[] message = new byte[2];
            message[0] = 2;
            message[1] = 20;

            boolean detach = (LibUsb.kernelDriverActive(handle, 0) == 1);
            if (detach) {
                int resultDetach = LibUsb.detachKernelDriver(handle,  0);
                if (resultDetach  != LibUsb.SUCCESS) throw new LibUsbException("Unable to detach kernel driver", resultDetach );
            }
         int resultDetach = LibUsb.detachKernelDriver(handle,  0);
         if (resultDetach != LibUsb.SUCCESS) throw new LibUsbException("Unable to detach kernel driver", resultDetach);
          sendMessage(handle, message);

        }
        finally
        {
            LibUsb.close(handle);
        }
    }

    public static void showDeviceList(DeviceList list) {
        int result;
        int deviceCounter = 0;
        try
        {
            // Iterate over all devices and scan for the right one
            for (Device device: list)
            {
                DeviceDescriptor descriptor = new DeviceDescriptor();
                result = LibUsb.getDeviceDescriptor(device, descriptor);
                if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to read device descriptor", result);
                System.out.printf("%d PID %s  VID %s%n", ++deviceCounter, descriptor.idProduct(), descriptor.idVendor());

            }
        }
        catch (Exception e){
            System.out.println("Exception while showing Devicelist" + e);
        }
    }

    public static void freeDeviceList(DeviceList list, boolean b){
        LibUsb.freeDeviceList(list, true);
    }

    public static Device findDevice(DeviceList list, short PID, short VID) {
        for (Device device : list) {
            DeviceDescriptor descriptor = getDeviceDescriptor(device);
            if (descriptor.idVendor() == VID && descriptor.idProduct() == PID) return device;
        }
        return null;
    }

    public static boolean isDeviceNotNull(Device device){
        return !(device == null);
    }

    public static DeviceDescriptor getDeviceDescriptor(Device device){
        DeviceDescriptor deviceDescriptor = new DeviceDescriptor();
        int result = LibUsb.getDeviceDescriptor(device, deviceDescriptor );
        if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to read device descriptor", result);
        return deviceDescriptor;
    }

    public static void claimInterface(DeviceHandle handle, int interfaceNumber){
        int result = LibUsb.claimInterface(handle, interfaceNumber);
        if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to claim interface", result);
        System.out.println("Interface claimed!");
    }

    public static void sendMessage(DeviceHandle handle, byte[] message)
    {
        ByteBuffer buffer = ByteBuffer.allocateDirect(message.length);

        int transfered = LibUsb.controlTransfer(handle,
                (byte) (LibUsb.REQUEST_TYPE_CLASS | LibUsb.RECIPIENT_INTERFACE),
                (byte) 0x03, (short) 2, (short) 1, buffer, 10);
        if (transfered < 0) throw new LibUsbException("Control transfer failed", transfered);
        System.out.println(transfered + " bytes sent");
    }
}

Если я пытаюсь отсоединить ядро, как было рекомендовано в do c, я получил это

Exception in thread "main" org.usb4java.LibUsbException: USB error 12:
Unable to detach kernel driver: Operation not supported or
unimplemented on this platform

Без обработки данных при попытке отправить сообщение на 0x03 конечная точка, за которой я следую

Exception in thread "main" org.usb4java.LibUsbException: USB error 12:
Unable to detach kernel driver: Operation not supported or
unimplemented on this platform

Есть ли что-то, что я могу установить для простого скрытого устройства?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...