У меня есть простое 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
Есть ли что-то, что я могу установить для простого скрытого устройства?