OberonCore https://forum.oberoncore.ru/ |
|
Заголовочный модуль для LibUsb https://forum.oberoncore.ru/viewtopic.php?f=2&t=5269 |
Страница 1 из 1 |
Автор: | negaton [ Суббота, 06 Декабрь, 2014 20:07 ] | |||
Заголовок сообщения: | Заголовочный модуль для LibUsb | |||
Размещаю исходник заголовочного модуля для работы с 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. Буду признателен за дополнения и замечания.
|
Автор: | Info21 [ Понедельник, 08 Декабрь, 2014 06:20 ] |
Заголовок сообщения: | Re: Заголовочный модуль для LibUsb |
Хорошее в принципе дело. |
Автор: | negaton [ Среда, 10 Декабрь, 2014 11:17 ] |
Заголовок сообщения: | Re: Заголовочный модуль для LibUsb |
Info21 писал(а): Хорошее в принципе дело. Спасибо. Недавно открыл для себя КП. Я вообще поклонник Паскаля, от Турбо7 до Дельфи. Это попытка внести вклад в его развитие. |
Автор: | Info21 [ Среда, 10 Декабрь, 2014 20:13 ] |
Заголовок сообщения: | Re: Заголовочный модуль для LibUsb |
Вам спасибо. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |