Размещаю исходник заголовочного модуля для работы с libusb0.dll из BlackBox. Может, кому-то будет полезен. Транслирован мной с оригинального lusb0_usb.h. Типы описаны полностью, а функции охвачены не все, поскольку выявились проблемы использования LibUsb в частном случае на конкретном железе под Win7, и от использования этой либы пришлось отказаться (проблемы не связаны с BlackBox). Постараюсь перевести позже, когда закончу проект. Хотя не должно составить особого труда при необходимости перевести их самостоятельно по данному шаблону и руководствуясь принципами трансляции, перечисленными на форуме. Привожу также простой пример использования. LibUsb, естественно, должна быть установлена.
Код модуля lusb0_usb:
Код:
MODULE lusb0_usb ['libusb0.dll'] ;
IMPORT SYSTEM;
CONST
LIBUSB_PATH_MAX = 512;
USB_OK = 0;
(* Device and/or Interface Class codes *)
USB_CLASS_PER_INTERFACE = 0;
USB_CLASS_AUDIO = 1;
USB_CLASS_COMM = 2;
USB_CLASS_HID = 3;
USB_CLASS_PRINTER = 7;
USB_CLASS_MASS_STORAGE = 8;
USB_CLASS_HUB = 9;
USB_CLASS_DATA = 10;
USB_CLASS_VENDOR_SPEC = 0FFH;
(*Descriptor types *)
USB_DT_DEVICE = 01H;
USB_DT_CONFIG = 02H;
USB_DT_STRING = 03H;
USB_DT_INTERFACE = 04H;
USB_DT_ENDPOINT = 05H;
USB_DT_HID = 21H;
USB_DT_REPORT = 22H;
USB_DT_PHYSICAL = 23H;
USB_DT_HUB = 29H;
(* Descriptor sizes per descriptor type *)
USB_DT_DEVICE_SIZE = 18;
USB_DT_CONFIG_SIZE = 9;
USB_DT_INTERFACE_SIZE = 9;
USB_DT_ENDPOINT_SIZE = 7;
USB_DT_ENDPOINT_AUDIO_SIZE = 9;
USB_DT_HUB_NONVAR_SIZE = 7;
(* Endpoint descriptor *)
USB_MAXENDPOINTS = 32;
USB_ENDPOINT_ADDRESS_MASK = 0FH; (* in bEndpointAddress *)
USB_ENDPOINT_DIR_MASK = 80H;
USB_ENDPOINT_TYPE_MASK = 03H; (* in bmAttributes *)
USB_ENDPOINT_TYPE_CONTROL = 0;
USB_ENDPOINT_TYPE_ISOCHRONOUS = 1;
USB_ENDPOINT_TYPE_BULK = 2;
USB_ENDPOINT_TYPE_INTERRUPT = 3;
(* Interface descriptor *)
USB_MAXINTERFACES = 32;
USB_MAXALTSETTING = 128; (* Hard limit *)
(* Configuration descriptor information *)
USB_MAXCONFIG = 8;
(* Standard requests *)
USB_REQ_GET_STATUS = 00H;
USB_REQ_CLEAR_FEATURE = 01H;
USB_REQ_SET_FEATURE = 03H;
USB_REQ_SET_ADDRESS = 05H;
USB_REQ_GET_DESCRIPTOR = 06H;
USB_REQ_SET_DESCRIPTOR = 07H;
USB_REQ_GET_CONFIGURATION = 08H;
USB_REQ_SET_CONFIGURATION = 09H;
USB_REQ_GET_INTERFACE = 0AH;
USB_REQ_SET_INTERFACE = 0BH;
USB_REQ_SYNCH_FRAME = 0CH;
USB_TYPE_STANDARD = 00H; (*$00 shl 5 *)
USB_TYPE_CLASS = 20H; (* $01 shl 5 *)
USB_TYPE_VENDOR = 40H; (* $02 shl 5 *)
USB_TYPE_RESERVED = 60H; (* $03 shl 5 *)
USB_RECIP_DEVICE = 00H;
USB_RECIP_INTERFACE = 01H;
USB_RECIP_ENDPOINT = 02H;
USB_RECIP_OTHER = 03H;
(* Various libusb API related stuff *)
USB_ENDPOINT_IN = 80H;
USB_ENDPOINT_OUT = 00H;
(* Error codes *)
USB_ERROR_BEGIN = 500000;
USB_TIMEOUT = 5000;
TYPE
(* All standard descriptors have these 2 fields in common *)
usb_descriptor_header* = RECORD [untagged]
bLength*, bDescriptorType*: SHORTCHAR;
END;
(* String descriptor *)
usb_string_descriptor* = RECORD [untagged]
bLength*, bDescriptorType*: SHORTCHAR;
wData: ARRAY 1 OF SHORTINT; (*wData[1]*);
END;
usb_hid_descriptor* = RECORD [untagged]
bLength*, bDescriptorType*: SHORTCHAR;
bcdHID*: SHORTINT;
bCountryCode*, bNumDescriptors*: SHORTCHAR;
END;
(* Endpoint descriptor *)
pusb_endpoint_descriptor* = POINTER TO usb_endpoint_descriptor;
usb_endpoint_descriptor* = RECORD [untagged]
bLength*, bDescriptorType*, bEndpointAddress*, bmAttributes*: SHORTCHAR;
wMaxPacketSize*: SHORTINT;
bInterval*, bRefresh*, bSynchAddress*: SHORTINT;
extra*: POINTER TO ARRAY [untagged] OF SHORTCHAR;
extralen*: INTEGER;
END;
PArray_usb_endpoint_descriptor* = POINTER TO ARRAY [untagged] 65535 OF usb_endpoint_descriptor;
(* Interface descriptor *)
pusb_interface_descriptor* = POINTER TO usb_interface_descriptor;
usb_interface_descriptor* = RECORD [untagged]
bLength*,
bDescriptorType*,
bInterfaceNumber*,
bAlternateSetting*,
bNumEndpoints*,
bInterfaceClass*,
bInterfaceSubClass*,
bInterfaceProtocol*,
iInterface*: SHORTCHAR;
endpoint*: PArray_usb_endpoint_descriptor;
extra*: POINTER TO ARRAY [untagged] OF SHORTCHAR;
extralen*: INTEGER;
END;
PArray_usb_interface_descriptor* = POINTER TO ARRAY [untagged] 65535 OF usb_interface_descriptor;
pusb_interface* = POINTER TO usb_interface;
usb_interface* = RECORD [untagged]
altsetting*: PArray_usb_interface_descriptor;
num_altsetting*: INTEGER;
END;
PArray_usb_interface* = POINTER TO ARRAY [untagged] 65535 OF usb_interface;
(* Configuration descriptor information *)
pusb_config_descriptor* = POINTER TO usb_config_descriptor;
usb_config_descriptor* = RECORD [untagged]
bLength*, bDescriptorType*: SHORTCHAR;
wTotalLength*: SHORTINT;
bNumInterfaces*, bConfigurationValue*, iConfiguration*, bmAttributes*, MaxPower*: SHORTCHAR;
interface*: PArray_usb_interface;
extra*: POINTER TO ARRAY [untagged] OF SHORTCHAR;
extralen*: INTEGER;
END;
PArray_usb_config_descriptor* = POINTER TO ARRAY 65535 OF usb_config_descriptor;
(* Device descriptor *)
usb_device_descriptor* = RECORD [untagged]
bLength*, bDescriptorType*: SHORTCHAR;
bcdUSB*: SHORTINT;
bDeviceClass*, bDeviceSubClass*, bDeviceProtocol*, bMaxPacketSize0*: SHORTCHAR;
idVendor*, idProduct*, bcdDevice*: SHORTINT;
iManufacturer*, iProduct*, iSerialNumber*, bNumConfigurations*: SHORTCHAR;
END;
usb_ctrl_setup* = RECORD [untagged]
bRequestType*, bRequest*: SHORTCHAR;
wValue*, wIndex*, wLength*: SHORTINT;
END;
pusb_bus* = POINTER TO usb_bus;
pusb_device* = POINTER TO usb_device;
usb_bus* = RECORD [untagged]
next*, prev*: pusb_bus;
dirname*: ARRAY LIBUSB_PATH_MAX OF SHORTCHAR;
devices*, root_dev*: pusb_device;
location*: INTEGER; (*LONGINT*);
END;
usb_device* = RECORD [untagged]
next*, prev*: pusb_device;
filename*: ARRAY LIBUSB_PATH_MAX OF SHORTCHAR;
bus*: pusb_bus;
descriptor*: usb_device_descriptor;
config*: PArray_usb_config_descriptor;
dev*: INTEGER; (*Pointer*);
devnum*, num_children*: SHORTCHAR;
children*: POINTER TO ARRAY [untagged] OF POINTER TO ARRAY [untagged] OF usb_device;
END;
pusb_dev_handle* = POINTER TO usb_dev_handle;
usb_dev_handle* = RECORD [untagged]
fd*: INTEGER;
bus*: pusb_bus;
dev*: pusb_device;
cfg*,
intfac*,
altset*: INTEGER;
impl_info*: ANYPTR;
END;
(* Version information, Windows specific *)
pusb_version* = POINTER TO usb_version;
usb_version* = RECORD [untagged]
dllmajor-,
dllminor-,
dllmicro-,
dllnano-: INTEGER;
drivermajor-,
driverminor-,
drivermicro-,
drivernano-: INTEGER;
END;
PROCEDURE [ccall] usb_get_version*(): pusb_version;
PROCEDURE [ccall] usb_init*;
PROCEDURE [ccall] usb_find_busses*(): INTEGER;
PROCEDURE [ccall] usb_find_devices*(): INTEGER;
PROCEDURE [ccall] usb_get_busses*(): pusb_bus;
PROCEDURE [ccall] usb_open*(dev: pusb_device): pusb_dev_handle;
PROCEDURE [ccall] usb_control_msg*(dev: pusb_dev_handle; requesttype, request, value, index: INTEGER; VAR bytes: POINTER TO ARRAY [untagged] OF SHORTCHAR; size, timeout: INTEGER): INTEGER;
PROCEDURE [ccall] usb_close*(dev: pusb_dev_handle): INTEGER;
END lusb0_usb.
Пример использования, выводит версии библиотеки, драйвера, и пытается открыть устройство по Vendor_ID и Product_ID:
Код:
MODULE Dll_Test;
IMPORT StdLog, lusb0_usb;
TYPE
TLIBUSB = RECORD
bus: lusb0_usb.pusb_bus;
dev: lusb0_usb.pusb_device;
handle: lusb0_usb.pusb_dev_handle;
VID, PID: INTEGER;
version: lusb0_usb.pusb_version;
(*dat: ARRAY 255 OF BYTE;*)
END;
VAR usb: TLIBUSB;
PROCEDURE USBdevInit;
BEGIN
usb.dev := NIL;
usb.handle := NIL;
lusb0_usb.usb_init;
END USBdevInit;
PROCEDURE USBdevOpen(): BOOLEAN;
VAR num_busses, num_devs: INTEGER;
BEGIN
num_busses := lusb0_usb.usb_find_busses();
num_devs := lusb0_usb.usb_find_devices();
StdLog.Int(num_busses); StdLog.Int(num_devs); StdLog.Ln;
usb.bus := lusb0_usb.usb_get_busses();
WHILE usb.bus # NIL DO
usb.dev := usb.bus.devices;
StdLog.Int(usb.dev.descriptor.idVendor);
WHILE usb.dev # NIL DO
IF (usb.dev.descriptor.idVendor = usb.VID) & (usb.dev.descriptor.idProduct = usb.PID) THEN
usb.handle := lusb0_usb.usb_open(usb.dev);
IF usb.handle # NIL THEN RETURN TRUE ELSE RETURN FALSE END;
END;
usb.dev := usb.dev.next;
END;
usb.bus := usb.bus.next;
END;
RETURN FALSE;
END USBdevOpen;
PROCEDURE USBdevClose(): BOOLEAN;
BEGIN
IF usb.handle = NIL THEN RETURN FALSE END;
IF lusb0_usb.usb_close(usb.handle) = 0 THEN
usb.dev := NIL;
usb.handle := NIL;
RETURN TRUE;
END;
END USBdevClose;
PROCEDURE Do*;
VAR p: lusb0_usb.pusb_version;
BEGIN
USBdevInit;
p := lusb0_usb.usb_get_version();
StdLog.String("Версия Dll: "); StdLog.Int(p.dllmajor);
StdLog.Int(p.dllminor); StdLog.Int(p.dllmicro); StdLog.Ln;
StdLog.String("Драйвер: "); StdLog.Int(p.drivermajor);
StdLog.Int(p.driverminor); StdLog.Int(p.drivermicro); StdLog.Ln;
usb.VID := 0458H;
usb.PID := 0019H;
IF USBdevOpen() THEN StdLog.String("Устройство найдено") ELSE StdLog.String("Устройство не найдено");
StdLog.Ln;
END;
IF USBdevClose() = TRUE THEN StdLog.String("Устройство выгружено") END;
END Do;
END Dll_Test.
Буду признателен за дополнения и замечания.