diff --git a/extra/libusb/authors.txt b/extra/libusb/authors.txt new file mode 100644 index 0000000000..67cf648cf5 --- /dev/null +++ b/extra/libusb/authors.txt @@ -0,0 +1 @@ +Erik Charlebois \ No newline at end of file diff --git a/extra/libusb/libusb.factor b/extra/libusb/libusb.factor new file mode 100644 index 0000000000..d521015d6f --- /dev/null +++ b/extra/libusb/libusb.factor @@ -0,0 +1,422 @@ +! Copyright (C) 2010 Erik Charlebois. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors alien alien.c-types alien.libraries +alien.syntax classes.struct combinators endian io.binary +kernel locals math sequences specialized-arrays +system unix.time unix.types ; +FROM: alien.c-types => short ; +IN: libusb + +<< "libusb" { + { [ os windows? ] [ "libusb-1.0.dll" ] } + { [ os macosx? ] [ "libusb-1.0.dylib" ] } + { [ os unix? ] [ "libusb-1.0.so" ] } + } cond "cdecl" add-library >> +LIBRARY: libusb + +: libusb_cpu_to_le16 ( x -- y ) + 2 >native-endian le> ; inline + +ALIAS: libusb_le16_to_cpu libusb_cpu_to_le16 + +CONSTANT: LIBUSB_CLASS_PER_INTERFACE 0 +CONSTANT: LIBUSB_CLASS_AUDIO 1 +CONSTANT: LIBUSB_CLASS_COMM 2 +CONSTANT: LIBUSB_CLASS_HID 3 +CONSTANT: LIBUSB_CLASS_PRINTER 7 +CONSTANT: LIBUSB_CLASS_PTP 6 +CONSTANT: LIBUSB_CLASS_MASS_STORAGE 8 +CONSTANT: LIBUSB_CLASS_HUB 9 +CONSTANT: LIBUSB_CLASS_DATA 10 +CONSTANT: LIBUSB_CLASS_VENDOR_SPEC HEX: ff +TYPEDEF: int libusb_class_code + +CONSTANT: LIBUSB_DT_DEVICE HEX: 01 +CONSTANT: LIBUSB_DT_CONFIG HEX: 02 +CONSTANT: LIBUSB_DT_STRING HEX: 03 +CONSTANT: LIBUSB_DT_INTERFACE HEX: 04 +CONSTANT: LIBUSB_DT_ENDPOINT HEX: 05 +CONSTANT: LIBUSB_DT_HID HEX: 21 +CONSTANT: LIBUSB_DT_REPORT HEX: 22 +CONSTANT: LIBUSB_DT_PHYSICAL HEX: 23 +CONSTANT: LIBUSB_DT_HUB HEX: 29 +TYPEDEF: int libusb_descriptor_type + +CONSTANT: LIBUSB_DT_DEVICE_SIZE 18 +CONSTANT: LIBUSB_DT_CONFIG_SIZE 9 +CONSTANT: LIBUSB_DT_INTERFACE_SIZE 9 +CONSTANT: LIBUSB_DT_ENDPOINT_SIZE 7 +CONSTANT: LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 +CONSTANT: LIBUSB_DT_HUB_NONVAR_SIZE 7 + +CONSTANT: LIBUSB_ENDPOINT_ADDRESS_MASK HEX: 0f +CONSTANT: LIBUSB_ENDPOINT_DIR_MASK HEX: 80 + +CONSTANT: LIBUSB_ENDPOINT_IN HEX: 80 +CONSTANT: LIBUSB_ENDPOINT_OUT HEX: 00 +TYPEDEF: int libusb_endpoint_direction + +CONSTANT: LIBUSB_TRANSFER_TYPE_MASK HEX: 03 + +CONSTANT: LIBUSB_TRANSFER_TYPE_CONTROL 0 +CONSTANT: LIBUSB_TRANSFER_TYPE_ISOCHRONOUS 1 +CONSTANT: LIBUSB_TRANSFER_TYPE_BULK 2 +CONSTANT: LIBUSB_TRANSFER_TYPE_INTERRUPT 3 +TYPEDEF: int libusb_transfer_type + +CONSTANT: LIBUSB_REQUEST_GET_STATUS HEX: 00 +CONSTANT: LIBUSB_REQUEST_CLEAR_FEATURE HEX: 01 +CONSTANT: LIBUSB_REQUEST_SET_FEATURE HEX: 03 +CONSTANT: LIBUSB_REQUEST_SET_ADDRESS HEX: 05 +CONSTANT: LIBUSB_REQUEST_GET_DESCRIPTOR HEX: 06 +CONSTANT: LIBUSB_REQUEST_SET_DESCRIPTOR HEX: 07 +CONSTANT: LIBUSB_REQUEST_GET_CONFIGURATION HEX: 08 +CONSTANT: LIBUSB_REQUEST_SET_CONFIGURATION HEX: 09 +CONSTANT: LIBUSB_REQUEST_GET_INTERFACE HEX: 0A +CONSTANT: LIBUSB_REQUEST_SET_INTERFACE HEX: 0B +CONSTANT: LIBUSB_REQUEST_SYNCH_FRAME HEX: 0C +TYPEDEF: int libusb_standard_request + +CONSTANT: LIBUSB_REQUEST_TYPE_STANDARD HEX: 00 +CONSTANT: LIBUSB_REQUEST_TYPE_CLASS HEX: 20 +CONSTANT: LIBUSB_REQUEST_TYPE_VENDOR HEX: 40 +CONSTANT: LIBUSB_REQUEST_TYPE_RESERVED HEX: 60 + +CONSTANT: LIBUSB_RECIPIENT_DEVICE HEX: 00 +CONSTANT: LIBUSB_RECIPIENT_INTERFACE HEX: 01 +CONSTANT: LIBUSB_RECIPIENT_ENDPOINT HEX: 02 +CONSTANT: LIBUSB_RECIPIENT_OTHER HEX: 03 +TYPEDEF: int libusb_request_recipient + +CONSTANT: LIBUSB_ISO_SYNC_TYPE_MASK HEX: 0C + +CONSTANT: LIBUSB_ISO_SYNC_TYPE_NONE 0 +CONSTANT: LIBUSB_ISO_SYNC_TYPE_ASYNC 1 +CONSTANT: LIBUSB_ISO_SYNC_TYPE_ADAPTIVE 2 +CONSTANT: LIBUSB_ISO_SYNC_TYPE_SYNC 3 +TYPEDEF: int libusb_iso_sync_type + +CONSTANT: LIBUSB_ISO_USAGE_TYPE_MASK HEX: 30 + +CONSTANT: LIBUSB_ISO_USAGE_TYPE_DATA 0 +CONSTANT: LIBUSB_ISO_USAGE_TYPE_FEEDBACK 1 +CONSTANT: LIBUSB_ISO_USAGE_TYPE_IMPLICIT 2 +TYPEDEF: int libusb_iso_usage_type + +STRUCT: libusb_device_descriptor + { bLength uint8_t } + { bDescriptorType uint8_t } + { bcdUSB uint16_t } + { bDeviceClass uint8_t } + { bDeviceSubClass uint8_t } + { bDeviceProtocol uint8_t } + { bMaxPacketSize0 uint8_t } + { idVendor uint16_t } + { idProduct uint16_t } + { bcdDevice uint16_t } + { iManufacturer uint8_t } + { iProduct uint8_t } + { iSerialNumber uint8_t } + { bNumConfigurations uint8_t } ; + +STRUCT: libusb_endpoint_descriptor + { bLength uint8_t } + { bDescriptorType uint8_t } + { bEndpointAddress uint8_t } + { bmAttributes uint8_t } + { wMaxPacketSize uint16_t } + { bInterval uint8_t } + { bRefresh uint8_t } + { bSynchAddress uint8_t } + { extra uchar* } + { extra_length int } ; + +STRUCT: libusb_interface_descriptor + { bLength uint8_t } + { bDescriptorType uint8_t } + { bInterfaceNumber uint8_t } + { bAlternateSetting uint8_t } + { bNumEndpoints uint8_t } + { bInterfaceClass uint8_t } + { bInterfaceSubClass uint8_t } + { bInterfaceProtocol uint8_t } + { iInterface uint8_t } + { endpoint libusb_endpoint_descriptor* } + { extra uchar* } + { extra_length int } ; + +STRUCT: libusb_interface + { altsetting libusb_interface_descriptor* } + { num_altsetting int } ; + +STRUCT: libusb_config_descriptor + { bLength uint8_t } + { bDescriptorType uint8_t } + { wTotalLength uint16_t } + { bNumInterfaces uint8_t } + { bConfigurationValue uint8_t } + { iConfiguration uint8_t } + { bmAttributes uint8_t } + { MaxPower uint8_t } + { interface libusb_interface* } + { extra uchar* } + { extra_length int } ; + +STRUCT: libusb_control_setup + { bmRequestType uint8_t } + { bRequest uint8_t } + { wValue uint16_t } + { wIndex uint16_t } + { wLength uint16_t } ; + +: LIBUSB_CONTROL_SETUP_SIZE ( -- x ) libusb_control_setup heap-size ; inline + +C-TYPE: libusb_context +C-TYPE: libusb_device +C-TYPE: libusb_device_handle + +CONSTANT: LIBUSB_SUCCESS 0 +CONSTANT: LIBUSB_ERROR_IO -1 +CONSTANT: LIBUSB_ERROR_INVALID_PARAM -2 +CONSTANT: LIBUSB_ERROR_ACCESS -3 +CONSTANT: LIBUSB_ERROR_NO_DEVICE -4 +CONSTANT: LIBUSB_ERROR_NOT_FOUND -5 +CONSTANT: LIBUSB_ERROR_BUSY -6 +CONSTANT: LIBUSB_ERROR_TIMEOUT -7 +CONSTANT: LIBUSB_ERROR_OVERFLOW -8 +CONSTANT: LIBUSB_ERROR_PIPE -9 +CONSTANT: LIBUSB_ERROR_INTERRUPTED -10 +CONSTANT: LIBUSB_ERROR_NO_MEM -11 +CONSTANT: LIBUSB_ERROR_NOT_SUPPORTED -12 +CONSTANT: LIBUSB_ERROR_OTHER -99 +TYPEDEF: int libusb_error + +C-ENUM: + LIBUSB_TRANSFER_COMPLETED + LIBUSB_TRANSFER_ERROR + LIBUSB_TRANSFER_TIMED_OUT + LIBUSB_TRANSFER_CANCELLED + LIBUSB_TRANSFER_STALL + LIBUSB_TRANSFER_NO_DEVICE + LIBUSB_TRANSFER_OVERFLOW ; +TYPEDEF: int libusb_transfer_status + +CONSTANT: LIBUSB_TRANSFER_SHORT_NOT_OK 1 +CONSTANT: LIBUSB_TRANSFER_FREE_BUFFER 2 +CONSTANT: LIBUSB_TRANSFER_FREE_TRANSFER 4 +TYPEDEF: int libusb_transfer_flags + +STRUCT: libusb_iso_packet_descriptor + { length uint } + { actual_length uint } + { status libusb_transfer_status } ; +SPECIALIZED-ARRAY: libusb_iso_packet_descriptor + +C-TYPE: libusb_transfer + +CALLBACK: void libusb_transfer_cb_fn ( libusb_transfer* transfer ) ; + +STRUCT: libusb_transfer + { dev_handle libusb_device_handle* } + { flags uint8_t } + { endpoint uchar } + { type uchar } + { timeout uint } + { status libusb_transfer_status } + { length int } + { actual_length int } + { callback libusb_transfer_cb_fn } + { user_data void* } + { buffer uchar* } + { num_iso_packets int } + { iso_packet_desc libusb_iso_packet_descriptor[0] } ; + +FUNCTION: int libusb_init ( libusb_context** ctx ) ; +FUNCTION: void libusb_exit ( libusb_context* ctx ) ; +FUNCTION: void libusb_set_debug ( libusb_context* ctx, int level ) ; + +FUNCTION: ssize_t libusb_get_device_list ( libusb_context* ctx, libusb_device*** list ) ; +FUNCTION: void libusb_free_device_list ( libusb_device** list, int unref_devices ) ; +FUNCTION: libusb_device* libusb_ref_device ( libusb_device* dev ) ; +FUNCTION: void libusb_unref_device ( libusb_device* dev ) ; + +FUNCTION: int libusb_get_configuration ( libusb_device_handle* dev, int* config ) ; +FUNCTION: int libusb_get_device_descriptor ( libusb_device* dev, libusb_device_descriptor* desc ) ; +FUNCTION: int libusb_get_active_config_descriptor ( libusb_device* dev, libusb_config_descriptor** config ) ; +FUNCTION: int libusb_get_config_descriptor ( libusb_device* dev, uint8_t config_index, libusb_config_descriptor** config ) ; +FUNCTION: int libusb_get_config_descriptor_by_value ( libusb_device* dev, uint8_t bConfigurationValue, libusb_config_descriptor** config ) ; +FUNCTION: void libusb_free_config_descriptor ( libusb_config_descriptor* config ) ; +FUNCTION: uint8_t libusb_get_bus_number ( libusb_device* dev ) ; +FUNCTION: uint8_t libusb_get_device_address ( libusb_device* dev ) ; +FUNCTION: int libusb_get_max_packet_size ( libusb_device* dev, uchar endpoint ) ; + +FUNCTION: int libusb_open ( libusb_device* dev, libusb_device_handle** handle ) ; +FUNCTION: void libusb_close ( libusb_device_handle* dev_handle ) ; +FUNCTION: libusb_device* libusb_get_device ( libusb_device_handle* dev_handle ) ; + +FUNCTION: int libusb_set_configuration ( libusb_device_handle* dev, int configuration ) ; +FUNCTION: int libusb_claim_interface ( libusb_device_handle* dev, int iface ) ; +FUNCTION: int libusb_release_interface ( libusb_device_handle* dev, int iface ) ; + +FUNCTION: libusb_device_handle* libusb_open_device_with_vid_pid ( libusb_context* ctx, uint16_t vendor_id, uint16_t product_id ) ; + +FUNCTION: int libusb_set_interface_alt_setting ( libusb_device_handle* dev, int interface_number, int alternate_setting ) ; +FUNCTION: int libusb_clear_halt ( libusb_device_handle* dev, uchar endpoint ) ; +FUNCTION: int libusb_reset_device ( libusb_device_handle* dev ) ; + +FUNCTION: int libusb_kernel_driver_active ( libusb_device_handle* dev, int interface ) ; +FUNCTION: int libusb_detach_kernel_driver ( libusb_device_handle* dev, int interface ) ; +FUNCTION: int libusb_attach_kernel_driver ( libusb_device_handle* dev, int interface ) ; + +: libusb_control_transfer_get_data ( transfer -- data ) + buffer>> LIBUSB_CONTROL_SETUP_SIZE swap ; inline + +: libusb_control_transfer_get_setup ( transfer -- setup ) + buffer>> libusb_control_setup memory>struct ; inline + +:: libusb_fill_control_setup ( buffer bmRequestType bRequest wValue wIndex wLength -- ) + buffer libusb_control_setup memory>struct + bmRequestType >>bmRequestType + bRequest >>bRequest + wValue libusb_cpu_to_le16 >>wValue + wIndex libusb_cpu_to_le16 >>wIndex + wLength libusb_cpu_to_le16 >>wLength drop ; inline + +FUNCTION: libusb_transfer* libusb_alloc_transfer ( int iso_packets ) ; +FUNCTION: int libusb_submit_transfer ( libusb_transfer* transfer ) ; +FUNCTION: int libusb_cancel_transfer ( libusb_transfer* transfer ) ; +FUNCTION: void libusb_free_transfer ( libusb_transfer* transfer ) ; + +:: libusb_fill_control_transfer ( transfer dev_handle buffer callback user_data timeout -- ) + transfer + dev_handle >>dev_handle + 0 >>endpoint + LIBUSB_TRANSFER_TYPE_CONTROL >>type + timeout >>timeout + buffer >>buffer + user_data >>user_data + callback >>callback + + buffer [ + libusb_control_setup memory>struct wLength>> LIBUSB_CONTROL_SETUP_SIZE + + ] [ 0 ] if* >>length drop ; inline + +:: libusb_fill_bulk_transfer ( transfer dev_handle endpoint buffer length callback user_data timeout -- ) + transfer + dev_handle >>dev_handle + endpoint >>endpoint + LIBUSB_TRANSFER_TYPE_BULK >>type + timeout >>timeout + buffer >>buffer + length >>length + user_data >>user_data + callback >>callback + drop ; inline + +:: libusb_fill_interrupt_transfer ( transfer dev_handle endpoint buffer length callback user_data timeout -- ) + transfer + dev_handle >>dev_handle + endpoint >>endpoint + LIBUSB_TRANSFER_TYPE_INTERRUPT >>type + timeout >>timeout + buffer >>buffer + length >>length + user_data >>user_data + callback >>callback + drop ; inline + +:: libusb_fill_iso_transfer ( transfer dev_handle endpoint buffer length num_iso_packets callback user_data timeout -- ) + transfer + dev_handle >>dev_handle + endpoint >>endpoint + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS >>type + timeout >>timeout + buffer >>buffer + length >>length + num_iso_packets >>num_iso_packets + user_data >>user_data + callback >>callback + drop ; inline + +: libusb_set_iso_packet_lengths ( transfer length -- ) + [ [ iso_packet_desc>> >c-ptr ] + [ num_iso_packets>> ] bi + + ] dip [ >>length drop ] curry each ; inline + +:: libusb_get_iso_packet_buffer ( transfer packet -- data ) + packet transfer num_iso_packets>> >= + [ f ] + [ + transfer + [ iso_packet_desc>> >c-ptr ] + [ num_iso_packets>> ] bi + 0 + [ length>> + ] reduce + transfer buffer>> + ] if ; + +:: libusb_get_iso_packet_buffer_simple ( transfer packet -- data ) + packet transfer num_iso_packets>> >= + [ f ] + [ + 0 transfer + [ iso_packet_desc>> >c-ptr ] + [ num_iso_packets>> ] bi + nth + length>> packet * + transfer buffer>> + ] if ; + +FUNCTION: int libusb_control_transfer ( libusb_device_handle* dev_handle, + uint8_t request_type, uint8_t request, uint16_t value, uint16_t index, + uchar* data, uint16_t length, uint timeout ) ; + +FUNCTION: int libusb_bulk_transfer ( libusb_device_handle* dev_handle, + uchar endpoint, uchar* data, int length, + int* actual_length, uint timeout ) ; + +FUNCTION: int libusb_interrupt_transfer ( libusb_device_handle* dev_handle, + uchar endpoint, uchar* data, int length, + int* actual_length, int timeout ) ; + +:: libusb_get_descriptor ( dev desc_type desc_index data length -- int ) + dev LIBUSB_ENDPOINT_IN LIBUSB_REQUEST_GET_DESCRIPTOR + desc_type 8 shift desc_index bitor 0 data + length 1000 libusb_control_transfer ; inline + +:: libusb_get_string_descriptor ( dev desc_index langid data length -- int ) + dev LIBUSB_ENDPOINT_IN LIBUSB_REQUEST_GET_DESCRIPTOR + LIBUSB_DT_STRING 8 shift desc_index bitor + langid data length 1000 libusb_control_transfer ; inline + +FUNCTION: int libusb_get_string_descriptor_ascii ( libusb_device_handle* dev, + uint8_t index, + uchar* data, + int length ) ; + +FUNCTION: int libusb_try_lock_events ( libusb_context* ctx ) ; +FUNCTION: void libusb_lock_events ( libusb_context* ctx ) ; +FUNCTION: void libusb_unlock_events ( libusb_context* ctx ) ; +FUNCTION: int libusb_event_handling_ok ( libusb_context* ctx ) ; +FUNCTION: int libusb_event_handler_active ( libusb_context* ctx ) ; +FUNCTION: void libusb_lock_event_waiters ( libusb_context* ctx ) ; +FUNCTION: void libusb_unlock_event_waiters ( libusb_context* ctx ) ; +FUNCTION: int libusb_wait_for_event ( libusb_context* ctx, timeval* tv ) ; +FUNCTION: int libusb_handle_events_timeout ( libusb_context* ctx, timeval* tv ) ; +FUNCTION: int libusb_handle_events ( libusb_context* ctx ) ; +FUNCTION: int libusb_handle_events_locked ( libusb_context* ctx, timeval* tv ) ; +FUNCTION: int libusb_get_next_timeout ( libusb_context* ctx, timeval* tv ) ; + +STRUCT: libusb_pollfd + { fd int } + { events short } ; + +CALLBACK: void libusb_pollfd_added_cb ( int fd, short events, void* user_data ) ; +CALLBACK: void libusb_pollfd_removed_cb ( int fd, void* user_data ) ; + +FUNCTION: libusb_pollfd** libusb_get_pollfds ( libusb_context* ctx ) ; +FUNCTION: void libusb_set_pollfd_notifiers ( libusb_context* ctx, + libusb_pollfd_added_cb added_cb, + libusb_pollfd_removed_cb removed_cb, + void* user_data ) ; diff --git a/extra/libusb/summary.txt b/extra/libusb/summary.txt new file mode 100644 index 0000000000..fc00ac5307 --- /dev/null +++ b/extra/libusb/summary.txt @@ -0,0 +1 @@ +Bindings to libusb diff --git a/extra/libusb/tags.txt b/extra/libusb/tags.txt new file mode 100644 index 0000000000..bb863cf9a0 --- /dev/null +++ b/extra/libusb/tags.txt @@ -0,0 +1 @@ +bindings