Changeset 11658b64 in mainline for uspace/lib/usbvirt
- Timestamp:
- 2010-12-16T11:54:53Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 557c7d0, 5863a95, 82122f3, a8b7dfd, f2962621
- Parents:
- a9b6bec (diff), 70e5ad5 (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:
-
- 1 added
- 1 deleted
- 1 edited
- 8 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/Makefile
ra9b6bec r11658b64 31 31 32 32 LIBS = $(LIBUSB_PREFIX)/libusb.a 33 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include 33 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -Iinclude 34 34 35 35 SOURCES = \ 36 callback.c \37 ctrlpipe.c \38 debug.c \39 main.c \40 s tdreq.c \41 transaction.c36 src/callback.c \ 37 src/ctrlpipe.c \ 38 src/debug.c \ 39 src/main.c \ 40 src/stdreq.c \ 41 src/transaction.c 42 42 43 43 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usbvirt/include/usbvirt/device.h
ra9b6bec r11658b64 40 40 #include <usb/devreq.h> 41 41 42 /** Request type of a control transfer. */ 43 typedef enum { 44 /** Standard USB request. */ 45 USBVIRT_REQUEST_TYPE_STANDARD = 0, 46 /** Standard class USB request. */ 47 USBVIRT_REQUEST_TYPE_CLASS = 1 48 } usbvirt_request_type_t; 49 50 /** Recipient of control request. */ 51 typedef enum { 52 /** Device is the recipient of the control request. */ 53 USBVIRT_REQUEST_RECIPIENT_DEVICE = 0, 54 /** Interface is the recipient of the control request. */ 55 USBVIRT_REQUEST_RECIPIENT_INTERFACE = 1, 56 /** Endpoint is the recipient of the control request. */ 57 USBVIRT_REQUEST_RECIPIENT_ENDPOINT = 2, 58 /** Other part of the device is the recipient of the control request. */ 59 USBVIRT_REQUEST_RECIPIENT_OTHER = 3 60 } usbvirt_request_recipient_t; 61 62 /** Possible states of virtual USB device. 63 * Notice that these are not 1:1 mappings to those in USB specification. 64 */ 65 typedef enum { 66 /** Default state, device listens at default address. */ 67 USBVIRT_STATE_DEFAULT, 68 /** Device has non-default address assigned. */ 69 USBVIRT_STATE_ADDRESS, 70 /** Device is configured. */ 71 USBVIRT_STATE_CONFIGURED 72 } usbvirt_device_state_t; 73 42 74 typedef struct usbvirt_device usbvirt_device_t; 43 75 struct usbvirt_control_transfer; … … 47 79 uint8_t *data); 48 80 49 /** Callbacks for standard device requests. 50 * When these functions are NULL or return EFORWARD, this 51 * framework will try to satisfy the request by itself. 52 */ 53 typedef struct { 54 usbvirt_on_device_request_t on_get_status; 55 usbvirt_on_device_request_t on_clear_feature; 56 usbvirt_on_device_request_t on_set_feature; 57 usbvirt_on_device_request_t on_set_address; 58 usbvirt_on_device_request_t on_get_descriptor; 59 usbvirt_on_device_request_t on_set_descriptor; 60 usbvirt_on_device_request_t on_get_configuration; 61 usbvirt_on_device_request_t on_set_configuration; 62 usbvirt_on_device_request_t on_get_interface; 63 usbvirt_on_device_request_t on_set_interface; 64 usbvirt_on_device_request_t on_synch_frame; 65 } usbvirt_standard_device_request_ops_t; 81 /** Callback for control request over pipe zero. 82 * 83 * @param dev Virtual device answering the call. 84 * @param request Request setup packet. 85 * @param data Data when DATA stage is present. 86 * @return Error code. 87 */ 88 typedef int (*usbvirt_control_request_callback_t)(usbvirt_device_t *dev, 89 usb_device_request_setup_packet_t *request, 90 uint8_t *data); 91 92 /** Handler for control transfer on endpoint zero. */ 93 typedef struct { 94 /** Request type bitmap. 95 * Use USBVIRT_MAKE_CONTROL_REQUEST_TYPE for creating the bitmap. 96 */ 97 uint8_t request_type; 98 /** Request code. */ 99 uint8_t request; 100 /** Request name for debugging. */ 101 const char *name; 102 /** Callback for the request. 103 * NULL value here announces end of a list. 104 */ 105 usbvirt_control_request_callback_t callback; 106 } usbvirt_control_transfer_handler_t; 107 108 /** Create control request type bitmap. 109 * 110 * @param direction Transfer direction (use usb_direction_t). 111 * @param type Request type (use usbvirt_request_type_t). 112 * @param recipient Recipient of the request (use usbvirt_request_recipient_t). 113 * @return Request type bitmap. 114 */ 115 #define USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, type, recipient) \ 116 ((((direction) == USB_DIRECTION_IN) ? 1 : 0) << 7) \ 117 | (((type) & 3) << 5) \ 118 | (((recipient) & 31)) 119 120 /** Create last item in an array of control request handlers. */ 121 #define USBVIRT_CONTROL_TRANSFER_HANDLER_LAST { 0, 0, NULL, NULL } 66 122 67 123 /** Device operations. */ 68 124 typedef struct { 69 /** Callbacks for standard deivce requests. */ 70 usbvirt_standard_device_request_ops_t *standard_request_ops; 71 /** Callback for class-specific USB request. */ 72 usbvirt_on_device_request_t on_class_device_request; 73 125 /** Callbacks for transfers over control pipe zero. */ 126 usbvirt_control_transfer_handler_t *control_transfer_handlers; 127 74 128 int (*on_control_transfer)(usbvirt_device_t *dev, 75 129 usb_endpoint_t endpoint, struct usbvirt_control_transfer *transfer); … … 86 140 usb_direction_t (*decide_control_transfer_direction)( 87 141 usb_endpoint_t endpoint, void *buffer, size_t size); 142 143 /** Callback when device changes its state. 144 * 145 * It is correct that this function is called when both states 146 * are equal (e.g. this function is called during SET_CONFIGURATION 147 * request done on already configured device). 148 * 149 * @warning The value of <code>dev->state</code> before calling 150 * this function is not specified (i.e. can be @p old_state or 151 * @p new_state). 152 */ 153 void (*on_state_change)(usbvirt_device_t *dev, 154 usbvirt_device_state_t old_state, usbvirt_device_state_t new_state); 88 155 } usbvirt_device_ops_t; 89 156 … … 120 187 uint8_t current_configuration; 121 188 } usbvirt_descriptors_t; 122 123 /** Possible states of virtual USB device.124 * Notice that these are not 1:1 mappings to those in USB specification.125 */126 typedef enum {127 USBVIRT_STATE_DEFAULT,128 USBVIRT_STATE_ADDRESS,129 USBVIRT_STATE_CONFIGURED130 } usbvirt_device_state_t;131 189 132 190 /** Information about on-going control transfer. … … 157 215 usbvirt_device_ops_t *ops; 158 216 217 /** Custom device data. */ 218 void *device_data; 219 159 220 /** Reply onto control transfer. 160 221 */ -
uspace/lib/usbvirt/src/callback.c
ra9b6bec r11658b64 40 40 #include <mem.h> 41 41 42 #include "hub.h"43 #include "device.h"44 42 #include "private.h" 45 43 -
uspace/lib/usbvirt/src/debug.c
ra9b6bec r11658b64 36 36 #include <bool.h> 37 37 38 #include "device.h"39 38 #include "private.h" 40 39 -
uspace/lib/usbvirt/src/main.c
ra9b6bec r11658b64 39 39 #include <assert.h> 40 40 41 #include "hub.h"42 #include "device.h"43 41 #include "private.h" 44 42 -
uspace/lib/usbvirt/src/private.h
ra9b6bec r11658b64 36 36 #define LIBUSBVIRT_PRIVATE_H_ 37 37 38 #include "device.h" 39 #include "hub.h" 38 #include <usbvirt/device.h> 39 #include <usbvirt/hub.h> 40 #include <assert.h> 40 41 41 42 … … 86 87 } 87 88 89 extern usbvirt_control_transfer_handler_t control_pipe_zero_local_handlers[]; 90 88 91 #endif 89 92 /** -
uspace/lib/usbvirt/src/stdreq.c
ra9b6bec r11658b64 40 40 #include "private.h" 41 41 42 43 44 42 /* 45 43 * All sub handlers must return EFORWARD to inform the caller that … … 51 49 /** GET_DESCRIPTOR handler. */ 52 50 static int handle_get_descriptor(usbvirt_device_t *device, 53 uint8_t type, uint8_t index, uint16_t language, 54 uint16_t length) 51 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 55 52 { 53 uint8_t type = setup_packet->value_high; 54 uint8_t index = setup_packet->value_low; 55 56 56 /* 57 57 * Standard device descriptor. … … 110 110 /** SET_ADDRESS handler. */ 111 111 static int handle_set_address(usbvirt_device_t *device, 112 uint16_t new_address, 113 uint16_t zero1, uint16_t zero2) 112 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 114 113 { 114 uint16_t new_address = setup_packet->value; 115 uint16_t zero1 = setup_packet->index; 116 uint16_t zero2 = setup_packet->length; 117 115 118 if ((zero1 != 0) || (zero2 != 0)) { 116 119 return EINVAL; … … 128 131 /** SET_CONFIGURATION handler. */ 129 132 static int handle_set_configuration(usbvirt_device_t *device, 130 uint16_t configuration_value, 131 uint16_t zero1, uint16_t zero2) 133 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 132 134 { 135 uint16_t configuration_value = setup_packet->value; 136 uint16_t zero1 = setup_packet->index; 137 uint16_t zero2 = setup_packet->length; 138 133 139 if ((zero1 != 0) || (zero2 != 0)) { 134 140 return EINVAL; … … 151 157 152 158 if (configuration_value == 0) { 159 if (DEVICE_HAS_OP(device, on_state_change)) { 160 device->ops->on_state_change(device, device->state, 161 USBVIRT_STATE_ADDRESS); 162 } 153 163 device->state = USBVIRT_STATE_ADDRESS; 154 164 } else { … … 157 167 * user selected existing configuration. 158 168 */ 169 if (DEVICE_HAS_OP(device, on_state_change)) { 170 device->ops->on_state_change(device, device->state, 171 USBVIRT_STATE_CONFIGURED); 172 } 159 173 device->state = USBVIRT_STATE_CONFIGURED; 160 174 if (device->descriptors) { … … 167 181 } 168 182 169 #define HANDLE_REQUEST(request, data, type, dev, user_callback, default_handler) \ 170 do { \ 171 if ((request)->request == (type)) { \ 172 int _rc = EFORWARD; \ 173 if (((dev)->ops) && ((dev)->ops->standard_request_ops) \ 174 && ((dev)->ops->standard_request_ops->user_callback)) { \ 175 _rc = (dev)->ops->standard_request_ops->\ 176 user_callback(dev, request, data); \ 177 } \ 178 if (_rc == EFORWARD) { \ 179 default_handler; \ 180 } \ 181 return _rc; \ 182 } \ 183 } while (false) 184 185 /** Handle standard device request. */ 186 int handle_std_request(usbvirt_device_t *device, 187 usb_device_request_setup_packet_t *request, uint8_t *data) 188 { 189 device->lib_debug(device, 3, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO, 190 "handling standard request %d", request->request); 191 192 HANDLE_REQUEST(request, data, USB_DEVREQ_GET_DESCRIPTOR, 193 device, on_get_descriptor, 194 handle_get_descriptor(device, request->value_high, request->value_low, 195 request->index, request->length)); 196 197 HANDLE_REQUEST(request, data, USB_DEVREQ_SET_ADDRESS, 198 device, on_set_address, 199 handle_set_address(device, request->value, 200 request->index, request->length)); 201 202 HANDLE_REQUEST(request, data, USB_DEVREQ_SET_CONFIGURATION, 203 device, on_set_configuration, 204 handle_set_configuration(device, request->value, 205 request->index, request->length)); 206 207 return ENOTSUP; 208 } 183 184 #define MAKE_BM_REQUEST(direction, recipient) \ 185 USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, \ 186 USBVIRT_REQUEST_TYPE_STANDARD, recipient) 187 #define MAKE_BM_REQUEST_DEV(direction) \ 188 MAKE_BM_REQUEST(direction, USBVIRT_REQUEST_RECIPIENT_DEVICE) 189 190 usbvirt_control_transfer_handler_t control_pipe_zero_local_handlers[] = { 191 { 192 .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_IN), 193 .request = USB_DEVREQ_GET_DESCRIPTOR, 194 .name = "GetDescriptor()", 195 .callback = handle_get_descriptor 196 }, 197 { 198 .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT), 199 .request = USB_DEVREQ_SET_ADDRESS, 200 .name = "SetAddress()", 201 .callback = handle_set_address 202 }, 203 { 204 .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT), 205 .request = USB_DEVREQ_SET_CONFIGURATION, 206 .name = "SetConfiguration()", 207 .callback = handle_set_configuration 208 }, 209 USBVIRT_CONTROL_TRANSFER_HANDLER_LAST 210 }; 209 211 210 212 /** -
uspace/lib/usbvirt/src/transaction.c
ra9b6bec r11658b64 37 37 #include <mem.h> 38 38 39 #include "hub.h"40 39 #include "private.h" 41 40
Note:
See TracChangeset
for help on using the changeset viewer.