1 /*- 2 * Copyright (c) 2003 3 * Bill Paul <wpaul@windriver.com>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Bill Paul. 16 * 4. Neither the name of the author nor the names of any co-contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * 32 * $FreeBSD$ 33 */ 34 35 #ifndef _USBD_VAR_H_ 36 #define _USBD_VAR_H_ 37 38 #define IOCTL_INTERNAL_USB_SUBMIT_URB 0x00220003 39 40 #define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 41 #define URB_FUNCTION_ABORT_PIPE 0x0002 42 #define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 43 #define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B 44 #define URB_FUNCTION_VENDOR_DEVICE 0x0017 45 #define URB_FUNCTION_VENDOR_INTERFACE 0x0018 46 #define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 47 #define URB_FUNCTION_CLASS_DEVICE 0x001A 48 #define URB_FUNCTION_CLASS_INTERFACE 0x001B 49 #define URB_FUNCTION_CLASS_ENDPOINT 0x001C 50 #define URB_FUNCTION_CLASS_OTHER 0x001F 51 #define URB_FUNCTION_VENDOR_OTHER 0x0020 52 53 #define USBD_STATUS_SUCCESS 0x00000000 54 #define USBD_STATUS_CANCELED 0x00010000 55 #define USBD_STATUS_PENDING 0x40000000 56 #define USBD_STATUS_NO_MEMORY 0x80000100 57 #define USBD_STATUS_REQUEST_FAILED 0x80000500 58 #define USBD_STATUS_INVALID_PIPE_HANDLE 0x80000600 59 #define USBD_STATUS_ERROR_SHORT_TRANSFER 0x80000900 60 #define USBD_STATUS_CRC 0xC0000001 61 #define USBD_STATUS_BTSTUFF 0xC0000002 62 #define USBD_STATUS_DATA_TOGGLE_MISMATCH 0xC0000003 63 #define USBD_STATUS_STALL_PID 0xC0000004 64 #define USBD_STATUS_DEV_NOT_RESPONDING 0xC0000005 65 #define USBD_STATUS_PID_CHECK_FAILURE 0xC0000006 66 #define USBD_STATUS_UNEXPECTED_PID 0xC0000007 67 #define USBD_STATUS_DATA_OVERRUN 0xC0000008 68 #define USBD_STATUS_DATA_UNDERRUN 0xC0000009 69 #define USBD_STATUS_RESERVED1 0xC000000A 70 #define USBD_STATUS_RESERVED2 0xC000000B 71 #define USBD_STATUS_BUFFER_OVERRUN 0xC000000C 72 #define USBD_STATUS_BUFFER_UNDERRUN 0xC000000D 73 #define USBD_STATUS_NOT_ACCESSED 0xC000000F 74 #define USBD_STATUS_FIFO 0xC0000010 75 #define USBD_STATUS_XACT_ERROR 0xC0000011 76 #define USBD_STATUS_BABBLE_DETECTED 0xC0000012 77 #define USBD_STATUS_DATA_BUFFER_ERROR 0xC0000013 78 #define USBD_STATUS_NOT_SUPPORTED 0xC0000E00 79 #define USBD_STATUS_TIMEOUT 0xC0006000 80 #define USBD_STATUS_DEVICE_GONE 0xC0007000 81 82 struct usbd_urb_header { 83 uint16_t uuh_len; 84 uint16_t uuh_func; 85 int32_t uuh_status; 86 void *uuh_handle; 87 uint32_t uuh_flags; 88 }; 89 90 enum usbd_pipe_type { 91 UsbdPipeTypeControl = UE_CONTROL, 92 UsbdPipeTypeIsochronous = UE_ISOCHRONOUS, 93 UsbdPipeTypeBulk = UE_BULK, 94 UsbdPipeTypeInterrupt = UE_INTERRUPT 95 }; 96 97 struct usbd_pipe_information { 98 uint16_t upi_maxpktsize; 99 uint8_t upi_epaddr; 100 uint8_t upi_interval; 101 enum usbd_pipe_type upi_type; 102 usb_endpoint_descriptor_t *upi_handle; 103 uint32_t upi_maxtxsize; 104 #define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE PAGE_SIZE 105 uint32_t upi_flags; 106 }; 107 108 struct usbd_interface_information { 109 uint16_t uii_len; 110 uint8_t uii_intfnum; 111 uint8_t uii_altset; 112 uint8_t uii_intfclass; 113 uint8_t uii_intfsubclass; 114 uint8_t uii_intfproto; 115 uint8_t uii_reserved; 116 void *uii_handle; 117 uint32_t uii_numeps; 118 struct usbd_pipe_information uii_pipes[1]; 119 }; 120 121 struct usbd_urb_select_interface { 122 struct usbd_urb_header usi_hdr; 123 void *usi_handle; 124 struct usbd_interface_information uusi_intf; 125 }; 126 127 struct usbd_urb_select_configuration { 128 struct usbd_urb_header usc_hdr; 129 usb_config_descriptor_t *usc_conf; 130 void *usc_handle; 131 struct usbd_interface_information usc_intf; 132 }; 133 134 struct usbd_urb_pipe_request { 135 struct usbd_urb_header upr_hdr; 136 usb_endpoint_descriptor_t *upr_handle; 137 }; 138 139 struct usbd_hcd_area { 140 void *reserved8[8]; 141 }; 142 143 struct usbd_urb_bulk_or_intr_transfer { 144 struct usbd_urb_header ubi_hdr; 145 usb_endpoint_descriptor_t *ubi_epdesc; 146 uint32_t ubi_trans_flags; 147 #define USBD_SHORT_TRANSFER_OK 0x00000002 148 uint32_t ubi_trans_buflen; 149 void *ubi_trans_buf; 150 struct mdl *ubi_mdl; 151 union usbd_urb *ubi_urblink; 152 struct usbd_hcd_area ubi_hca; 153 }; 154 155 struct usbd_urb_control_descriptor_request { 156 struct usbd_urb_header ucd_hdr; 157 void *ucd_reserved0; 158 uint32_t ucd_reserved1; 159 uint32_t ucd_trans_buflen; 160 void *ucd_trans_buf; 161 struct mdl *ucd_mdl; 162 union nt_urb *ucd_urblink; 163 struct usbd_hcd_area ucd_hca; 164 uint16_t ucd_reserved2; 165 uint8_t ucd_idx; 166 uint8_t ucd_desctype; 167 uint16_t ucd_langid; 168 uint16_t ucd_reserved3; 169 }; 170 171 struct usbd_urb_vendor_or_class_request { 172 struct usbd_urb_header uvc_hdr; 173 void *uvc_reserved0; 174 uint32_t uvc_trans_flags; 175 #define USBD_TRANSFER_DIRECTION_IN 1 176 uint32_t uvc_trans_buflen; 177 void *uvc_trans_buf; 178 struct mdl *uvc_mdl; 179 union nt_urb *uvc_urblink; 180 struct usbd_hcd_area uvc_hca; 181 uint8_t uvc_reserved1; 182 uint8_t uvc_req; 183 uint16_t uvc_value; 184 uint16_t uvc_idx; 185 uint16_t uvc_reserved2; 186 }; 187 188 struct usbd_interface_list_entry { 189 usb_interface_descriptor_t *uil_intfdesc; 190 struct usbd_interface_information *uil_intf; 191 }; 192 193 union usbd_urb { 194 struct usbd_urb_header uu_hdr; 195 struct usbd_urb_select_configuration uu_selconf; 196 struct usbd_urb_bulk_or_intr_transfer uu_bulkintr; 197 struct usbd_urb_control_descriptor_request uu_ctldesc; 198 struct usbd_urb_vendor_or_class_request uu_vcreq; 199 struct usbd_urb_pipe_request uu_pipe; 200 }; 201 202 #define USBD_URB_STATUS(urb) ((urb)->uu_hdr.uuh_status) 203 204 #define USBDI_VERSION 0x00000500 205 #define USB_VER_1_1 0x00000110 206 #define USB_VER_2_0 0x00000200 207 208 struct usbd_version_info { 209 uint32_t uvi_usbdi_vers; 210 uint32_t uvi_supported_vers; 211 }; 212 213 typedef struct usbd_version_info usbd_version_info; 214 215 extern image_patch_table usbd_functbl[]; 216 217 __BEGIN_DECLS 218 extern int usbd_libinit(void); 219 extern int usbd_libfini(void); 220 __END_DECLS 221 222 #endif /* _USBD_VAR_H_ */ 223