OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 20 Октябрь, 2017 06:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Заголовочный модуль для LibUsb
СообщениеДобавлено: Суббота, 06 Декабрь, 2014 20:07 

Зарегистрирован: Пятница, 05 Декабрь, 2014 10:19
Сообщения: 2
Откуда: Ташкент, Узбекистан
Размещаю исходник заголовочного модуля для работы с 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.


Буду признателен за дополнения и замечания.


Вложения:
Комментарий к файлу: Пример использования
dll_test.zip [1.34 КБ]
Скачиваний: 77
Комментарий к файлу: Исходник заголовочного модуля lusb0_usb.odc
lusb0_usb.zip [2.42 КБ]
Скачиваний: 82
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заголовочный модуль для LibUsb
СообщениеДобавлено: Понедельник, 08 Декабрь, 2014 06:20 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Хорошее в принципе дело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заголовочный модуль для LibUsb
СообщениеДобавлено: Среда, 10 Декабрь, 2014 11:17 

Зарегистрирован: Пятница, 05 Декабрь, 2014 10:19
Сообщения: 2
Откуда: Ташкент, Узбекистан
Info21 писал(а):
Хорошее в принципе дело.

Спасибо. Недавно открыл для себя КП. Я вообще поклонник Паскаля, от Турбо7 до Дельфи. Это попытка внести вклад в его развитие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заголовочный модуль для LibUsb
СообщениеДобавлено: Среда, 10 Декабрь, 2014 20:13 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7676
Откуда: Троицк, Москва
Вам спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB