1/* 2 * usbfs header structures 3 * Copyright © 2007 Daniel Drake <dsd@gentoo.org> 4 * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#ifndef LIBUSB_USBFS_H 22#define LIBUSB_USBFS_H 23 24#include <linux/types.h> 25 26#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices" 27 28struct usbfs_ctrltransfer { 29 /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ 30 uint8_t bmRequestType; 31 uint8_t bRequest; 32 uint16_t wValue; 33 uint16_t wIndex; 34 uint16_t wLength; 35 36 uint32_t timeout; /* in milliseconds */ 37 38 /* pointer to data */ 39 void *data; 40}; 41 42struct usbfs_bulktransfer { 43 /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ 44 unsigned int ep; 45 unsigned int len; 46 unsigned int timeout; /* in milliseconds */ 47 48 /* pointer to data */ 49 void *data; 50}; 51 52struct usbfs_setinterface { 53 /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ 54 unsigned int interface; 55 unsigned int altsetting; 56}; 57 58#define USBFS_MAXDRIVERNAME 255 59 60struct usbfs_getdriver { 61 unsigned int interface; 62 char driver[USBFS_MAXDRIVERNAME + 1]; 63}; 64 65#define USBFS_URB_SHORT_NOT_OK 0x01 66#define USBFS_URB_ISO_ASAP 0x02 67#define USBFS_URB_BULK_CONTINUATION 0x04 68#define USBFS_URB_QUEUE_BULK 0x10 69#define USBFS_URB_ZERO_PACKET 0x40 70 71enum usbfs_urb_type { 72 USBFS_URB_TYPE_ISO = 0, 73 USBFS_URB_TYPE_INTERRUPT = 1, 74 USBFS_URB_TYPE_CONTROL = 2, 75 USBFS_URB_TYPE_BULK = 3, 76}; 77 78struct usbfs_iso_packet_desc { 79 unsigned int length; 80 unsigned int actual_length; 81 unsigned int status; 82}; 83 84#define MAX_ISO_BUFFER_LENGTH 32768 85#define MAX_BULK_BUFFER_LENGTH 16384 86#define MAX_CTRL_BUFFER_LENGTH 4096 87 88struct usbfs_urb { 89 unsigned char type; 90 unsigned char endpoint; 91 int status; 92 unsigned int flags; 93 void *buffer; 94 int buffer_length; 95 int actual_length; 96 int start_frame; 97 int number_of_packets; 98 int error_count; 99 unsigned int signr; 100 void *usercontext; 101 struct usbfs_iso_packet_desc iso_frame_desc[0]; 102}; 103 104struct usbfs_connectinfo { 105 unsigned int devnum; 106 unsigned char slow; 107}; 108 109struct usbfs_ioctl { 110 int ifno; /* interface 0..N ; negative numbers reserved */ 111 int ioctl_code; /* MUST encode size + direction of data so the 112 * macros in <asm/ioctl.h> give correct values */ 113 void *data; /* param buffer (in, or out) */ 114}; 115 116struct usbfs_hub_portinfo { 117 unsigned char numports; 118 unsigned char port[127]; /* port to device num mapping */ 119}; 120 121#define USBFS_CAP_ZERO_PACKET 0x01 122#define USBFS_CAP_BULK_CONTINUATION 0x02 123#define USBFS_CAP_NO_PACKET_SIZE_LIM 0x04 124#define USBFS_CAP_BULK_SCATTER_GATHER 0x08 125 126#define USBFS_DISCONNECT_CLAIM_IF_DRIVER 0x01 127#define USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02 128 129struct usbfs_disconnect_claim { 130 unsigned int interface; 131 unsigned int flags; 132 char driver[USBFS_MAXDRIVERNAME + 1]; 133}; 134 135#define IOCTL_USBFS_CONTROL _IOWR('U', 0, struct usbfs_ctrltransfer) 136#define IOCTL_USBFS_BULK _IOWR('U', 2, struct usbfs_bulktransfer) 137#define IOCTL_USBFS_RESETEP _IOR('U', 3, unsigned int) 138#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface) 139#define IOCTL_USBFS_SETCONFIG _IOR('U', 5, unsigned int) 140#define IOCTL_USBFS_GETDRIVER _IOW('U', 8, struct usbfs_getdriver) 141#define IOCTL_USBFS_SUBMITURB _IOR('U', 10, struct usbfs_urb) 142#define IOCTL_USBFS_DISCARDURB _IO('U', 11) 143#define IOCTL_USBFS_REAPURB _IOW('U', 12, void *) 144#define IOCTL_USBFS_REAPURBNDELAY _IOW('U', 13, void *) 145#define IOCTL_USBFS_CLAIMINTF _IOR('U', 15, unsigned int) 146#define IOCTL_USBFS_RELEASEINTF _IOR('U', 16, unsigned int) 147#define IOCTL_USBFS_CONNECTINFO _IOW('U', 17, struct usbfs_connectinfo) 148#define IOCTL_USBFS_IOCTL _IOWR('U', 18, struct usbfs_ioctl) 149#define IOCTL_USBFS_HUB_PORTINFO _IOR('U', 19, struct usbfs_hub_portinfo) 150#define IOCTL_USBFS_RESET _IO('U', 20) 151#define IOCTL_USBFS_CLEAR_HALT _IOR('U', 21, unsigned int) 152#define IOCTL_USBFS_DISCONNECT _IO('U', 22) 153#define IOCTL_USBFS_CONNECT _IO('U', 23) 154#define IOCTL_USBFS_CLAIM_PORT _IOR('U', 24, unsigned int) 155#define IOCTL_USBFS_RELEASE_PORT _IOR('U', 25, unsigned int) 156#define IOCTL_USBFS_GET_CAPABILITIES _IOR('U', 26, __u32) 157#define IOCTL_USBFS_DISCONNECT_CLAIM _IOR('U', 27, struct usbfs_disconnect_claim) 158 159extern usbi_mutex_static_t linux_hotplug_lock; 160 161#if defined(HAVE_LIBUDEV) 162int linux_udev_start_event_monitor(void); 163int linux_udev_stop_event_monitor(void); 164int linux_udev_scan_devices(struct libusb_context *ctx); 165void linux_udev_hotplug_poll(void); 166#else 167int linux_netlink_start_event_monitor(void); 168int linux_netlink_stop_event_monitor(void); 169void linux_netlink_hotplug_poll(void); 170#endif 171 172void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name); 173void linux_device_disconnected(uint8_t busnum, uint8_t devaddr, const char *sys_name); 174 175int linux_get_device_address (struct libusb_context *ctx, int detached, 176 uint8_t *busnum, uint8_t *devaddr, const char *dev_node, 177 const char *sys_name); 178int linux_enumerate_device(struct libusb_context *ctx, 179 uint8_t busnum, uint8_t devaddr, const char *sysfs_dir); 180 181#endif 182