diff --git a/devel/libusb1/Makefile b/devel/libusb1/Makefile new file mode 100644 index 00000000000..fef656fad34 --- /dev/null +++ b/devel/libusb1/Makefile @@ -0,0 +1,51 @@ +# $OpenBSD: Makefile,v 1.1.1.1 2011/11/02 14:31:56 mpi Exp $ + +COMMENT = library for USB device access from userspace + +VERSION = 1.0.8 +DISTNAME = libusb-${VERSION} +PKGNAME = libusb1-${VERSION} +SHARED_LIBS += usb-1.0 0.0 # 0.0 + +CATEGORIES = devel + +HOMEPAGE = http://www.libusb.org + +MAINTAINER = Martin Pieuchot + +# LGPL 2.1 +PERMIT_PACKAGE_CDROM = Yes +PERMIT_PACKAGE_FTP = Yes +PERMIT_DISTFILES_CDROM =Yes +PERMIT_DISTFILES_FTP = Yes + +MASTER_SITES = ${MASTER_SITE_SOURCEFORGE:=libusb/} +EXTRACT_SUFX = .tar.bz2 + +USE_LIBTOOL = Yes +AUTOCONF_VERSION = 2.65 +AUTOMAKE_VERSION = 1.11 +CONFIGURE_STYLE = automake autoconf +CONFIGURE_ARGS += ${CONFIGURE_SHARED} + +.ifdef DEBUG +CONFIGURE_ARGS += --enable-log \ + --enable-debug-log \ + --enable-examples-build +.endif + +AUTO_ENV= AUTOCONF_VERSION=${AUTOCONF_VERSION} \ + AUTOMAKE_VERSION=${AUTOMAKE_VERSION} + +post-extract: + cp ${FILESDIR}/openbsd_ugen.c ${WRKSRC}/libusb/os/ + +post-patch: + @echo "Running aclocal-${AUTOMAKE_VERSION} in ${WRKSRC}" + @cd ${WRKSRC}; ${AUTO_ENV} aclocal + +pre-configure: + @echo "Running automake-${AUTOMAKE_VERSION} in ${WRKSRC}" + @cd ${WRKSRC}; ${AUTO_ENV} automake --foreign + +.include diff --git a/devel/libusb1/distinfo b/devel/libusb1/distinfo new file mode 100644 index 00000000000..86e68970f17 --- /dev/null +++ b/devel/libusb1/distinfo @@ -0,0 +1,5 @@ +MD5 (libusb-1.0.8.tar.bz2) = N9NObqpppLZFoZ/0ymPO7w== +RMD160 (libusb-1.0.8.tar.bz2) = WkE6d+JAoVSA7xQ31fU5O6266YU= +SHA1 (libusb-1.0.8.tar.bz2) = VIQ5eGD3Ccm1FhHSJIGfjtWZQGM= +SHA256 (libusb-1.0.8.tar.bz2) = IdDTpXEPf0IRxZUQLGuezLQkNaF6T1vSw/QWarG626k= +SIZE (libusb-1.0.8.tar.bz2) = 331820 diff --git a/devel/libusb1/files/openbsd_ugen.c b/devel/libusb1/files/openbsd_ugen.c new file mode 100644 index 00000000000..1d95588e510 --- /dev/null +++ b/devel/libusb1/files/openbsd_ugen.c @@ -0,0 +1,628 @@ +/* + * Copyright (c) 2011 Martin Pieuchot + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "libusbi.h" + +struct device_priv { + char devnode[16]; + int fd; + int open; + + unsigned char *cdesc; /* active config descriptor */ + usb_device_descriptor_t ddesc; /* usb device descriptor */ +}; + +/* + * Backend functions + */ +int ugen_get_device_list(struct libusb_context *, struct discovered_devs **); +int ugen_open(struct libusb_device_handle *); +void ugen_close(struct libusb_device_handle *); + +int ugen_get_device_descriptor(struct libusb_device *, unsigned char *, int *); +int ugen_get_active_config_descriptor(struct libusb_device *, unsigned char *, + size_t, int *); +int ugen_get_config_descriptor(struct libusb_device *, uint8_t, unsigned char *, + size_t, int *); + +int ugen_get_configuration(struct libusb_device_handle *, int *); +int ugen_set_configuration(struct libusb_device_handle *, int); + +int ugen_claim_interface(struct libusb_device_handle *, int); +int ugen_release_interface(struct libusb_device_handle *, int); + +int ugen_set_interface_altsetting(struct libusb_device_handle *, int, int); +int ugen_clear_halt(struct libusb_device_handle *, unsigned char); +int ugen_reset_device(struct libusb_device_handle *); +void ugen_destroy_device(struct libusb_device *); + +int ugen_submit_transfer(struct usbi_transfer *); +int ugen_cancel_transfer(struct usbi_transfer *); +void ugen_clear_transfer_priv(struct usbi_transfer *); +int ugen_handle_events(struct libusb_context *ctx, struct pollfd *, nfds_t, + int); +int ugen_clock_gettime(int, struct timespec *); + +/* + * Private functions + */ +int _errno_to_libusb(int); +int _cache_active_config_descriptor(struct libusb_device *, int); +int _sync_control_transfer(struct usbi_transfer *); +int _sync_gen_transfer(struct usbi_transfer *); + +const struct usbi_os_backend openbsd_backend = { + "Synchronous OpenBSD backend", + NULL, /* init() */ + NULL, /* exit() */ + ugen_get_device_list, + ugen_open, + ugen_close, + + ugen_get_device_descriptor, + ugen_get_active_config_descriptor, + ugen_get_config_descriptor, + + ugen_get_configuration, + ugen_set_configuration, + + ugen_claim_interface, + ugen_release_interface, + + ugen_set_interface_altsetting, + ugen_clear_halt, + ugen_reset_device, + + NULL, /* kernel_driver_active() */ + NULL, /* detach_kernel_driver() */ + NULL, /* attach_kernel_driver() */ + + ugen_destroy_device, + + ugen_submit_transfer, + ugen_cancel_transfer, + ugen_clear_transfer_priv, + + ugen_handle_events, + + ugen_clock_gettime, + sizeof(struct device_priv), + 0, /* device_handle_priv_size */ + 0, /* transfer_priv_size */ + 0, /* add_iso_packet_size */ +}; + +int +ugen_get_device_list(struct libusb_context * ctx, + struct discovered_devs **discdevs) +{ + struct libusb_device *dev; + struct device_priv *dpriv; + struct usb_device_info di; + unsigned long session_id; + char devnode[16]; + int fd, err, i; + + usbi_dbg(""); + + /* Only ugen(4) is supported */ + for (i = 0; i < USB_MAX_DEVICES; i++) { + /* Control endpoint is always .00 */ + snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); + + if ((fd = open(devnode, O_RDONLY)) < 0) { + if (errno != ENOENT && errno != ENXIO) + usbi_err(ctx, "could no open %s", devnode); + continue; + } + + if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) + continue; + + session_id = (di.udi_bus << 8 | di.udi_addr); + dev = usbi_get_device_by_session_id(ctx, session_id); + + if (dev == NULL) { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) + return (LIBUSB_ERROR_NO_MEM); + + dev->bus_number = di.udi_bus; + dev->device_address = di.udi_addr; + + dpriv = (struct device_priv *)dev->os_priv; + strlcpy(dpriv->devnode, devnode, sizeof(devnode)); + + if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { + err = errno; + goto error; + } + + dpriv->cdesc = NULL; + if (_cache_active_config_descriptor(dev, fd)) { + err = errno; + goto error; + } + + if ((err = usbi_sanitize_device(dev))) + goto error; + } + close(fd); + + if (discovered_devs_append(*discdevs, dev) == NULL) + return (LIBUSB_ERROR_NO_MEM); + } + + return (0); + +error: + close(fd); + libusb_unref_device(dev); + return (err); +} + +int +ugen_open(struct libusb_device_handle *handle) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + dpriv->fd = open(dpriv->devnode, O_RDWR); + if (dpriv->fd < 0) { + dpriv->fd = open(dpriv->devnode, O_RDONLY); + if (dpriv->fd < 0) + return _errno_to_libusb(errno); + } + + usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); + + dpriv->open = 1; + + return (usbi_add_pollfd(HANDLE_CTX(handle), dpriv->fd, POLLOUT)); +} + +void +ugen_close(struct libusb_device_handle *handle) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("close: fd %d", dpriv->fd); + + usbi_remove_pollfd(HANDLE_CTX(handle), dpriv->fd); + + close(dpriv->fd); + + dpriv->open = 0; +} + +int +ugen_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, + int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return (0); +} + +int +ugen_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg("len %d", len); + + memcpy(buf, dpriv->cdesc, len); + + *host_endian = 0; + + return (0); +} + +int +ugen_get_config_descriptor(struct libusb_device *dev, uint8_t idx, + unsigned char *buf, size_t len, int *host_endian) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_full_desc ufd; + int fd, err; + + usbi_dbg("index %d, len %d", idx, len); + + /* Endpoint cannot be opened twice */ + if (dpriv->open) { + fd = dpriv->fd; + } else { + fd = open(dpriv->devnode, O_RDONLY); + if (fd < 0) + return _errno_to_libusb(errno); + } + + ufd.ufd_config_index = idx; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { + err = errno; + if (!dpriv->open) + close(fd); + return _errno_to_libusb(err); + } + + if (!dpriv->open) + close(fd); + + *host_endian = 0; + + return (0); +} + +int +ugen_get_configuration(struct libusb_device_handle *handle, int *config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg(""); + + if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("configuration %d", *config); + + return (0); +} + +int +ugen_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + + usbi_dbg("configuration %d", config); + + if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) + return _errno_to_libusb(errno); + + return _cache_active_config_descriptor(handle->dev, dpriv->fd); +} + +int +ugen_claim_interface(struct libusb_device_handle *handle, int iface) +{ + /* + * The USB specification does not speak about interface + * claiming and OpenBSD does not provide such mechanism. + * + * But because people shouldn't be able to attach or + * detach a specific driver for a device it is safe to + * return 0 instead of LIBUSB_ERROR_NOT_SUPPORTED. + */ + return (0); +} + +int +ugen_release_interface(struct libusb_device_handle *handle, int iface) +{ + return (0); +} + +int +ugen_set_interface_altsetting(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_alt_interface intf; + + usbi_dbg("iface %d, setting %d", iface, altsetting); + + memset(&intf, 0, sizeof(intf)); + + intf.uai_interface_index = iface; + intf.uai_alt_no = altsetting; + + if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) + return _errno_to_libusb(errno); + + return (0); +} + +int +ugen_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) +{ + struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; + struct usb_ctl_request req; + + usbi_dbg(""); + + req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; + req.ucr_request.bRequest = UR_CLEAR_FEATURE; + USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); + USETW(req.ucr_request.wIndex, endpoint); + USETW(req.ucr_request.wLength, 0); + + if (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0) + return _errno_to_libusb(errno); + + return (0); +} + +int +ugen_reset_device(struct libusb_device_handle *handle) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +ugen_destroy_device(struct libusb_device *dev) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + + usbi_dbg(""); + + free(dpriv->cdesc); +} + +int +ugen_submit_transfer(struct usbi_transfer *itr) +{ + struct libusb_transfer *transfer; + int err = 0; + + usbi_dbg(""); + + transfer = __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itr); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + err = _sync_control_transfer(itr); + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + if (transfer->endpoint & LIBUSB_ENDPOINT_OUT) { + /* Isochronous write is not supported */ + err = LIBUSB_ERROR_NOT_SUPPORTED; + break; + } + /* PASSTHROUGH */ + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + err = _sync_gen_transfer(itr); + break; + } + + if (err) + return (err); + + /* + * Because this backend is synchronous we have + * notify now that the transfer is complete. + */ + return usbi_handle_transfer_completion(itr, LIBUSB_TRANSFER_COMPLETED); +} + +int +ugen_cancel_transfer(struct usbi_transfer *itransfer) +{ + usbi_dbg(""); + + return (LIBUSB_ERROR_NOT_SUPPORTED); +} + +void +ugen_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + /* Nothing to do */ +} + +int +ugen_handle_events(struct libusb_context *ctx, struct pollfd *fds, nfds_t nfds, + int num_ready) +{ + usbi_dbg(""); + + /* + * This backend is synchronous so there's no event to handle. + */ + + return (0); +} + +int +ugen_clock_gettime(int clkid, struct timespec *tp) +{ + usbi_dbg("clock %d", clkid); + + if (clkid == USBI_CLOCK_REALTIME) + return clock_gettime(CLOCK_REALTIME, tp); + + if (clkid == USBI_CLOCK_MONOTONIC) + return clock_gettime(CLOCK_MONOTONIC, tp); + + return (LIBUSB_ERROR_INVALID_PARAM); +} + +int +_errno_to_libusb(int err) +{ + switch (err) { + case EIO: + return (LIBUSB_ERROR_IO); + case EACCES: + return (LIBUSB_ERROR_ACCESS); + case ENOENT: + return (LIBUSB_ERROR_NO_DEVICE); + case ENOMEM: + return (LIBUSB_ERROR_NO_MEM); + } + + usbi_dbg("error: %s", strerror(err)); + + return (LIBUSB_ERROR_OTHER); +} + +int +_cache_active_config_descriptor(struct libusb_device *dev, int fd) +{ + struct device_priv *dpriv = (struct device_priv *)dev->os_priv; + struct usb_config_desc ucd; + struct usb_full_desc ufd; + unsigned char* buf; + int len; + + usbi_dbg("fd %d", fd); + + ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; + + if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) + return _errno_to_libusb(errno); + + usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); + + len = UGETW(ucd.ucd_desc.wTotalLength); + buf = malloc(len); + if (buf == NULL) + return (LIBUSB_ERROR_NO_MEM); + + ufd.ufd_config_index = ucd.ucd_config_index; + ufd.ufd_size = len; + ufd.ufd_data = buf; + + usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); + + if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) + return _errno_to_libusb(errno); + + if (dpriv->cdesc) + free(dpriv->cdesc); + dpriv->cdesc = buf; + + return (0); +} + +int +_sync_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct libusb_control_setup *setup; + struct device_priv *dpriv; + struct usb_ctl_request req; + + transfer = __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + setup = (struct libusb_control_setup *)transfer->buffer; + + usbi_dbg("type %d request %d value %d index %d length %d timeout %d", + setup->bmRequestType, setup->bRequest, + libusb_le16_to_cpu(setup->wValue), + libusb_le16_to_cpu(setup->wIndex), + libusb_le16_to_cpu(setup->wLength), transfer->timeout); + + usbi_dbg("byte %p", transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE); + + req.ucr_request.bmRequestType = setup->bmRequestType; + req.ucr_request.bRequest = setup->bRequest; + /* Don't use USETW, libusb already deals with the endianness */ + (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; + (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; + (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; + req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + req.ucr_flags = USBD_SHORT_XFER_OK; + + if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) + return _errno_to_libusb(errno); + + itransfer->transferred = req.ucr_actlen; + + usbi_dbg("transferred %d", itransfer->transferred); + + return (0); +} + +int +_sync_gen_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer; + struct device_priv *dpriv; + int fd, err, endpt, nr = 1; + char *s, devnode[16]; + mode_t mode; + + transfer = __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; + + endpt = UE_GET_ADDR(transfer->endpoint); + mode = (transfer->endpoint & LIBUSB_ENDPOINT_IN) ? O_RDONLY : O_WRONLY; + + usbi_dbg("endpoint %d mode %d", endpt, mode); + + /* Pick the right node given the control one */ + strlcpy(devnode, dpriv->devnode, sizeof(devnode)); + s = strchr(devnode, '.'); + snprintf(s, (s - devnode), ".%02d", endpt); + + /* + * Bulk, Interrupt or Isochronous transfer depends on the + * endpoint and thus the node to open. + */ + if ((fd = open(devnode, mode)) < 0) + return _errno_to_libusb(errno); + + if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) + return _errno_to_libusb(errno); + + if (transfer->endpoint & LIBUSB_ENDPOINT_IN) { + if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) + if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) + return _errno_to_libusb(errno); + + nr = read(fd, transfer->buffer, transfer->length); + } else { + nr = write(fd, transfer->buffer, transfer->length); + } + + if (nr < 0) { + err = errno; + close(fd); + return _errno_to_libusb(err); + } + + close(fd); + itransfer->transferred = nr; + + return (0); +} diff --git a/devel/libusb1/patches/patch-configure_ac b/devel/libusb1/patches/patch-configure_ac new file mode 100644 index 00000000000..0cd282dd442 --- /dev/null +++ b/devel/libusb1/patches/patch-configure_ac @@ -0,0 +1,23 @@ +--- configure.ac.orig Wed May 5 00:01:36 2010 ++++ configure.ac Sat Sep 24 19:48:36 2011 +@@ -30,12 +30,20 @@ + backend="darwin" + AM_LDFLAGS="-Wl,-framework -Wl,IOKit -Wl,-framework -Wl,CoreFoundation -Wl,-prebind -no-undefined" + ;; ++*-openbsd*) ++ AC_DEFINE(OS_OPENBSD, [], [OpenBSD backend]) ++ AC_SUBST(OS_OPENBSD) ++ AC_MSG_RESULT([OpenBSD]) ++ backend="openbsd" ++ AM_LDFLAGS="" ++ ;; + *) + AC_MSG_ERROR([unsupported operating system]) + esac + + AM_CONDITIONAL([OS_LINUX], [test "x$backend" == "xlinux"]) + AM_CONDITIONAL([OS_DARWIN], [test "x$backend" == "xdarwin"]) ++AM_CONDITIONAL([OS_OPENBSD], [test "x$backend" == "xopenbsd"]) + + # Library versioning + lt_major="0" diff --git a/devel/libusb1/patches/patch-libusb-1.0.pc_in b/devel/libusb1/patches/patch-libusb-1.0.pc_in new file mode 100644 index 00000000000..74c31845671 --- /dev/null +++ b/devel/libusb1/patches/patch-libusb-1.0.pc_in @@ -0,0 +1,10 @@ +--- libusb-1.0.pc.in.orig Sun Sep 25 12:22:30 2011 ++++ libusb-1.0.pc.in Sun Sep 25 12:24:04 2011 +@@ -6,6 +6,6 @@ + Name: libusb-1.0 + Description: C API for USB device access from Linux userspace + Version: @VERSION@ +-Libs: -L${libdir} -lusb-1.0 ++Libs: -L${libdir} -lusb-1.0 -pthread + Cflags: -I${includedir}/libusb-1.0 + diff --git a/devel/libusb1/patches/patch-libusb_Makefile_am b/devel/libusb1/patches/patch-libusb_Makefile_am new file mode 100644 index 00000000000..26b7ac7959c --- /dev/null +++ b/devel/libusb1/patches/patch-libusb_Makefile_am @@ -0,0 +1,24 @@ +--- libusb/Makefile.am.orig Sat Sep 24 16:28:54 2011 ++++ libusb/Makefile.am Sat Sep 24 16:29:57 2011 +@@ -2,8 +2,9 @@ + + LINUX_USBFS_SRC = os/linux_usbfs.h os/linux_usbfs.c + DARWIN_USB_SRC = os/darwin_usb.h os/darwin_usb.c ++OPENBSD_USB_SRC = os/openbsd_ugen.c + +-EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) ++EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) + + if OS_LINUX + OS_SRC = $(LINUX_USBFS_SRC) +@@ -12,6 +13,10 @@ + if OS_DARWIN + OS_SRC = $(DARWIN_USB_SRC) + AM_CFLAGS_EXT = -no-cpp-precomp ++endif ++ ++if OS_OPENBSD ++OS_SRC = $(OPENBSD_USB_SRC) + endif + + libusb_1_0_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) -pthread diff --git a/devel/libusb1/patches/patch-libusb_core_c b/devel/libusb1/patches/patch-libusb_core_c new file mode 100644 index 00000000000..802a6158bcf --- /dev/null +++ b/devel/libusb1/patches/patch-libusb_core_c @@ -0,0 +1,11 @@ +--- libusb/core.c.orig Fri Sep 23 12:27:20 2011 ++++ libusb/core.c Fri Sep 23 12:27:39 2011 +@@ -36,6 +36,8 @@ + const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; + #elif defined(OS_DARWIN) + const struct usbi_os_backend * const usbi_backend = &darwin_backend; ++#elif defined(OS_OPENBSD) ++const struct usbi_os_backend * const usbi_backend = &openbsd_backend; + #else + #error "Unsupported OS" + #endif diff --git a/devel/libusb1/patches/patch-libusb_libusbi_h b/devel/libusb1/patches/patch-libusb_libusbi_h new file mode 100644 index 00000000000..10eafa1ef79 --- /dev/null +++ b/devel/libusb1/patches/patch-libusb_libusbi_h @@ -0,0 +1,10 @@ +--- libusb/libusbi.h.orig Fri Sep 23 12:29:59 2011 ++++ libusb/libusbi.h Fri Sep 23 12:30:01 2011 +@@ -805,6 +805,7 @@ + + extern const struct usbi_os_backend linux_usbfs_backend; + extern const struct usbi_os_backend darwin_backend; ++extern const struct usbi_os_backend openbsd_backend; + + #endif + diff --git a/devel/libusb1/pkg/DESCR b/devel/libusb1/pkg/DESCR new file mode 100644 index 00000000000..cb3f93024d7 --- /dev/null +++ b/devel/libusb1/pkg/DESCR @@ -0,0 +1 @@ +libusb is a library for USB device access from userland. diff --git a/devel/libusb1/pkg/PFRAG.shared b/devel/libusb1/pkg/PFRAG.shared new file mode 100644 index 00000000000..4b46bedef95 --- /dev/null +++ b/devel/libusb1/pkg/PFRAG.shared @@ -0,0 +1,2 @@ +@comment $OpenBSD: PFRAG.shared,v 1.1.1.1 2011/11/02 14:31:56 mpi Exp $ +@lib lib/libusb-1.0.so.${LIBusb-1.0_VERSION} diff --git a/devel/libusb1/pkg/PLIST b/devel/libusb1/pkg/PLIST new file mode 100644 index 00000000000..c09b979a128 --- /dev/null +++ b/devel/libusb1/pkg/PLIST @@ -0,0 +1,8 @@ +@comment $OpenBSD: PLIST,v 1.1.1.1 2011/11/02 14:31:56 mpi Exp $ +%%SHARED%% +include/libusb-1.0/ +include/libusb-1.0/libusb.h +lib/libusb-1.0.a +lib/libusb-1.0.la +lib/pkgconfig/ +lib/pkgconfig/libusb-1.0.pc