Changeset b4b534ac in mainline for uspace/lib/usbvirt
- Timestamp:
- 2016-07-22T08:24:47Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f76d2c2
- Parents:
- 5b18137 (diff), 8351f9a4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/usbvirt
- Files:
-
- 2 added
- 6 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/Makefile
r5b18137 rb4b534ac 34 34 -I$(LIBUSB_PREFIX)/include \ 35 35 -I$(LIBUSBDEV_PREFIX)/include \ 36 -Iinclude 36 -Iinclude \ 37 -Iinclude/usbvirt 37 38 38 39 SOURCES = \ … … 42 43 src/ipc_hc.c \ 43 44 src/stdreq.c \ 44 src/transfer.c 45 src/transfer.c \ 46 src/virthub_base.c \ 47 src/virthub_descriptors.c 45 48 46 49 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usbvirt/include/usbvirt/device.h
r5b18137 rb4b534ac 40 40 #include <usb/dev/request.h> 41 41 #include <async.h> 42 #include <errno.h> 43 42 44 43 45 /** Maximum number of endpoints supported by virtual USB. */ … … 57 59 typedef int (*usbvirt_on_data_to_device_t)(usbvirt_device_t *dev, 58 60 usb_endpoint_t endpoint, usb_transfer_type_t transfer_type, 59 void *buffer, size_t buffer_size);61 const void *buffer, size_t buffer_size); 60 62 61 63 /** Callback for data from device (IN transaction). … … 88 90 uint8_t *data, size_t *act_data_size); 89 91 92 /** Create a class request to get data from device 93 * 94 * @param rec Request recipient. 95 * @param req Request code. 96 */ 97 #define CLASS_REQ_IN(rec, req) \ 98 .request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_CLASS, rec), \ 99 .request = req 100 101 /** Create a class request to send data to device 102 * 103 * @param rec Request recipient. 104 * @param req Request code. 105 */ 106 #define CLASS_REQ_OUT(rec, req) \ 107 .request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_CLASS, rec), \ 108 .request = req 109 110 /** Create a standard request to get data from device 111 * 112 * @param rec Request recipient. 113 * @param req Request code. 114 */ 115 #define STD_REQ_IN(rec, req) \ 116 .request_type = SETUP_REQUEST_TO_HOST(USB_REQUEST_TYPE_STANDARD, rec), \ 117 .request = req 118 119 /** Create a standard request to send data to device 120 * 121 * @param rec Request recipient. 122 * @param req Request code. 123 */ 124 #define STD_REQ_OUT(rec, req) \ 125 .request_type = SETUP_REQUEST_TO_DEVICE(USB_REQUEST_TYPE_STANDARD, rec), \ 126 .request = req 127 90 128 /** Callback for control request on a virtual USB device. 91 129 * … … 94 132 */ 95 133 typedef struct { 96 /** Request direction (in or out). */ 97 usb_direction_t req_direction; 98 /** Request recipient (device, interface or endpoint). */ 99 usb_request_recipient_t req_recipient; 100 /** Request type (standard, class or vendor). */ 101 usb_request_type_t req_type; 134 /* Request type. See usb/request.h */ 135 uint8_t request_type; 102 136 /** Actual request code. */ 103 137 uint8_t request; … … 111 145 typedef struct { 112 146 /** Actual data. */ 113 uint8_t *data;147 const uint8_t *data; 114 148 /** Data length. */ 115 149 size_t length; … … 121 155 usb_standard_configuration_descriptor_t *descriptor; 122 156 /** Array of extra data. */ 123 usbvirt_device_configuration_extras_t *extra;157 const usbvirt_device_configuration_extras_t *extra; 124 158 /** Length of @c extra array. */ 125 159 size_t extra_count; … … 131 165 * There is always only one such descriptor for the device. 132 166 */ 133 usb_standard_device_descriptor_t *device;167 const usb_standard_device_descriptor_t *device; 134 168 135 169 /** Configurations. */ … … 164 198 * Last handler is expected to have the @c callback field set to NULL 165 199 */ 166 usbvirt_control_request_handler_t *control;200 const usbvirt_control_request_handler_t *control; 167 201 /** Callback when device changes state. 168 202 * … … 180 214 /** Virtual USB device. */ 181 215 struct usbvirt_device { 216 /** Device does not require USB bus power */ 217 bool self_powered; 218 /** Device is allowed to signal remote wakeup */ 219 bool remote_wakeup; 182 220 /** Name for debugging purposes. */ 183 221 const char *name; … … 187 225 usbvirt_device_ops_t *ops; 188 226 /** Device descriptors. */ 189 usbvirt_descriptors_t *descriptors;227 const usbvirt_descriptors_t *descriptors; 190 228 /** Current device address. 191 229 * You shall treat this field as read only in your code. … … 202 240 }; 203 241 242 243 int req_nop(usbvirt_device_t *device, 244 const usb_device_request_setup_packet_t *setup_packet, 245 uint8_t *data, size_t *act_size); 246 204 247 int usbvirt_device_plug(usbvirt_device_t *, const char *); 205 248 void usbvirt_device_unplug(usbvirt_device_t *); 206 249 207 250 void usbvirt_control_reply_helper(const usb_device_request_setup_packet_t *, 208 uint8_t *, size_t *, void *, size_t);209 210 int usbvirt_control_write(usbvirt_device_t *, void *, size_t, void *, size_t);211 int usbvirt_control_read(usbvirt_device_t *, void *, size_t, void *, size_t, size_t *);251 uint8_t *, size_t *, const void *, size_t); 252 253 int usbvirt_control_write(usbvirt_device_t *, const void *, size_t, void *, size_t); 254 int usbvirt_control_read(usbvirt_device_t *, const void *, size_t, void *, size_t, size_t *); 212 255 int usbvirt_data_out(usbvirt_device_t *, usb_transfer_type_t, usb_endpoint_t, 213 void *, size_t);256 const void *, size_t); 214 257 int usbvirt_data_in(usbvirt_device_t *, usb_transfer_type_t, usb_endpoint_t, 215 258 void *, size_t, size_t *); -
uspace/lib/usbvirt/include/usbvirt/virthub_base.h
r5b18137 rb4b534ac 1 1 /* 2 * Copyright (c) 201 0 Vojtech Horky2 * Copyright (c) 2013 Jan Vesely 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup drvusbvhc29 /** @addtogroup libusbvirt 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief Virtual USB hub.33 * Virtual USB device. 34 34 */ 35 35 36 #ifndef VHCD_HUB_H_37 #define VHCD_HUB_H_36 #ifndef LIBUSBVIRT_VIRTHUB_BASE_H_ 37 #define LIBUSBVIRT_VIRTHUB_BASE_H_ 38 38 39 39 #include <usbvirt/device.h> 40 #include < ddf/driver.h>40 #include <usb/classes/hub.h> 41 41 42 #include "hub/hub.h" 43 #include "hub/virthub.h" 42 enum { 43 VIRTHUB_EXTR_DESC = 3, 44 }; 44 45 45 extern usbvirt_device_t virtual_hub_device; 46 typedef struct { 47 usb_standard_configuration_descriptor_t config_descriptor; 48 usb_standard_endpoint_descriptor_t endpoint_descriptor; 49 usbvirt_device_configuration_extras_t extra[VIRTHUB_EXTR_DESC]; 50 usbvirt_device_configuration_t configuration; 51 usbvirt_descriptors_t descriptors; 52 usbvirt_device_t device; 53 void *data; 54 } virthub_base_t; 46 55 47 void virtual_hub_device_init(ddf_fun_t *); 56 void *virthub_get_data(usbvirt_device_t *dev); 57 58 int virthub_base_init(virthub_base_t *instance, 59 const char *name, usbvirt_device_ops_t *ops, void *data, 60 const usb_standard_device_descriptor_t *device_desc, 61 const usb_hub_descriptor_header_t *hub_desc, usb_endpoint_t ep); 62 63 usb_address_t virthub_base_get_address(virthub_base_t *instance); 64 65 int virthub_base_request(virthub_base_t *instance, usb_target_t target, 66 usb_direction_t dir, const usb_device_request_setup_packet_t *setup, 67 void *buffer, size_t buffer_size, size_t *real_size); 68 69 int virthub_base_get_hub_descriptor(usbvirt_device_t *dev, 70 const usb_device_request_setup_packet_t *request, uint8_t *data, 71 size_t *act_size); 72 int virthub_base_get_null_status(usbvirt_device_t *dev, 73 const usb_device_request_setup_packet_t *request, uint8_t *data, 74 size_t *act_size); 75 48 76 49 77 #endif 78 50 79 /** 51 80 * @} -
uspace/lib/usbvirt/src/ctrltransfer.c
r5b18137 rb4b534ac 50 50 */ 51 51 int process_control_transfer(usbvirt_device_t *dev, 52 usbvirt_control_request_handler_t *control_handlers,53 usb_device_request_setup_packet_t *setup,52 const usbvirt_control_request_handler_t *control_handlers, 53 const usb_device_request_setup_packet_t *setup, 54 54 uint8_t *data, size_t *data_sent_size) 55 55 { … … 60 60 return EFORWARD; 61 61 } 62 63 usb_direction_t direction = setup->request_type & 128 ? 64 USB_DIRECTION_IN : USB_DIRECTION_OUT; 65 usb_request_recipient_t req_recipient = setup->request_type & 31; 66 usb_request_type_t req_type = (setup->request_type >> 5) & 3; 67 68 usbvirt_control_request_handler_t *handler = control_handlers; 69 while (handler->callback != NULL) { 70 if (handler->req_direction != direction) { 71 goto next; 72 } 73 if (handler->req_recipient != req_recipient) { 74 goto next; 75 } 76 if (handler->req_type != req_type) { 77 goto next; 78 } 79 if (handler->request != setup->request) { 80 goto next; 62 const usbvirt_control_request_handler_t *handler = control_handlers; 63 for (;handler->callback != NULL; ++handler) { 64 if (handler->request != setup->request || 65 handler->request_type != setup->request_type) { 66 continue; 81 67 } 82 68 … … 84 70 usb_debug_str_buffer((uint8_t*) setup, sizeof(*setup), 0)); 85 71 int rc = handler->callback(dev, setup, data, data_sent_size); 86 if (rc == EFORWARD) {87 goto next;72 if (rc != EFORWARD) { 73 return rc; 88 74 } 89 75 90 return rc;91 92 next:93 handler++;94 76 } 95 77 -
uspace/lib/usbvirt/src/private.h
r5b18137 rb4b534ac 39 39 40 40 int process_control_transfer(usbvirt_device_t *, 41 usbvirt_control_request_handler_t *,42 usb_device_request_setup_packet_t *,41 const usbvirt_control_request_handler_t *, 42 const usb_device_request_setup_packet_t *, 43 43 uint8_t *, size_t *); 44 44 -
uspace/lib/usbvirt/src/stdreq.c
r5b18137 rb4b534ac 51 51 void usbvirt_control_reply_helper(const usb_device_request_setup_packet_t *setup_packet, 52 52 uint8_t *data, size_t *act_size, 53 void *actual_data, size_t actual_data_size)53 const void *actual_data, size_t actual_data_size) 54 54 { 55 55 size_t expected_size = setup_packet->length; … … 63 63 *act_size = actual_data_size; 64 64 } 65 } 66 67 /** NOP handler */ 68 int req_nop(usbvirt_device_t *device, 69 const usb_device_request_setup_packet_t *setup_packet, 70 uint8_t *data, size_t *act_size) 71 { 72 return EOK; 65 73 } 66 74 … … 98 106 } 99 107 /* Copy the data. */ 100 usbvirt_device_configuration_t *config = &device->descriptors101 ->configuration[index];108 const usbvirt_device_configuration_t *config = 109 &device->descriptors->configuration[index]; 102 110 uint8_t *all_data = malloc(config->descriptor->total_length); 103 111 if (all_data == NULL) { … … 110 118 size_t i; 111 119 for (i = 0; i < config->extra_count; i++) { 112 usbvirt_device_configuration_extras_t *extra120 const usbvirt_device_configuration_extras_t *extra 113 121 = &config->extra[i]; 114 122 memcpy(ptr, extra->data, extra->length); … … 189 197 } 190 198 199 static int req_get_dev_status(usbvirt_device_t *device, 200 const usb_device_request_setup_packet_t *setup_packet, uint8_t *data, size_t *act_size) 201 { 202 if (setup_packet->length != 2) 203 return ESTALL; 204 data[0] = (device->self_powered ? 1 : 0) | (device->remote_wakeup ? 2 : 0); 205 data[1] = 0; 206 *act_size = 2; 207 return EOK; 208 } 209 static int req_get_iface_ep_status(usbvirt_device_t *device, 210 const usb_device_request_setup_packet_t *setup_packet, uint8_t *data, size_t *act_size) 211 { 212 if (setup_packet->length != 2) 213 return ESTALL; 214 data[0] = 0; 215 data[1] = 0; 216 *act_size = 2; 217 return EOK; 218 } 219 191 220 /** Standard request handlers. */ 192 221 usbvirt_control_request_handler_t library_handlers[] = { 193 222 { 194 .req_direction = USB_DIRECTION_OUT, 195 .req_recipient = USB_REQUEST_RECIPIENT_DEVICE, 196 .req_type = USB_REQUEST_TYPE_STANDARD, 197 .request = USB_DEVREQ_SET_ADDRESS, 223 STD_REQ_OUT(USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_SET_ADDRESS), 198 224 .name = "SetAddress", 199 225 .callback = req_set_address 200 226 }, 201 227 { 202 .req_direction = USB_DIRECTION_IN, 203 .req_recipient = USB_REQUEST_RECIPIENT_DEVICE, 204 .req_type = USB_REQUEST_TYPE_STANDARD, 205 .request = USB_DEVREQ_GET_DESCRIPTOR, 206 .name = "GetDescriptor", 228 STD_REQ_IN(USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_DESCRIPTOR), 229 .name = "GetStdDescriptor", 207 230 .callback = req_get_descriptor 208 231 }, 209 232 { 210 .req_direction = USB_DIRECTION_OUT, 211 .req_recipient = USB_REQUEST_RECIPIENT_DEVICE, 212 .req_type = USB_REQUEST_TYPE_STANDARD, 213 .request = USB_DEVREQ_SET_CONFIGURATION, 233 STD_REQ_OUT(USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_SET_CONFIGURATION), 214 234 .name = "SetConfiguration", 215 235 .callback = req_set_configuration 216 236 }, 217 237 { 238 STD_REQ_IN(USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_STATUS), 239 .name = "GetDeviceStatus", 240 .callback = req_get_dev_status, 241 }, 242 { 243 STD_REQ_IN(USB_REQUEST_RECIPIENT_INTERFACE, USB_DEVREQ_GET_STATUS), 244 .name = "GetInterfaceStatus", 245 .callback = req_get_iface_ep_status, 246 }, 247 { 248 /* virtual EPs by default cannot be stalled */ 249 STD_REQ_IN(USB_REQUEST_RECIPIENT_ENDPOINT, USB_DEVREQ_GET_STATUS), 250 .name = "GetEndpointStatus", 251 .callback = req_get_iface_ep_status, 252 }, 218 253 { .callback = NULL } 219 254 }; -
uspace/lib/usbvirt/src/transfer.c
r5b18137 rb4b534ac 51 51 */ 52 52 static int usbvirt_control_transfer(usbvirt_device_t *dev, 53 void *setup, size_t setup_size,53 const void *setup, size_t setup_size, 54 54 void *data, size_t data_size, size_t *data_size_sent) 55 55 { … … 60 60 return ESTALL; 61 61 } 62 usb_device_request_setup_packet_t *setup_packet = setup;62 const usb_device_request_setup_packet_t *setup_packet = setup; 63 63 if (data_size != setup_packet->length) { 64 64 return ESTALL; … … 100 100 * @return Error code. 101 101 */ 102 int usbvirt_control_write(usbvirt_device_t *dev, void *setup, size_t setup_size,103 void *data, size_t data_size)102 int usbvirt_control_write(usbvirt_device_t *dev, const void *setup, 103 size_t setup_size, void *data, size_t data_size) 104 104 { 105 105 return usbvirt_control_transfer(dev, setup, setup_size, … … 119 119 * @return Error code. 120 120 */ 121 int usbvirt_control_read(usbvirt_device_t *dev, void *setup, size_t setup_size,121 int usbvirt_control_read(usbvirt_device_t *dev, const void *setup, size_t setup_size, 122 122 void *data, size_t data_size, size_t *data_size_sent) 123 123 { … … 136 136 */ 137 137 int usbvirt_data_out(usbvirt_device_t *dev, usb_transfer_type_t transf_type, 138 usb_endpoint_t endpoint, void *data, size_t data_size)138 usb_endpoint_t endpoint, const void *data, size_t data_size) 139 139 { 140 140 if ((endpoint <= 0) || (endpoint >= USBVIRT_ENDPOINT_MAX)) {
Note:
See TracChangeset
for help on using the changeset viewer.