Changeset 56b962d in mainline for uspace/lib/usbvirt/src/stdreq.c
- Timestamp:
- 2010-11-26T11:26:35Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 84439d7
- Parents:
- 0eddb76
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/src/stdreq.c
r0eddb76 r56b962d 41 41 42 42 43 typedef int (*usbvirt_stdreq_handler_t)(usbvirt_device_t *, 44 usb_device_request_setup_packet_t *, uint8_t *); 43 45 44 46 /* … … 51 53 /** GET_DESCRIPTOR handler. */ 52 54 static int handle_get_descriptor(usbvirt_device_t *device, 53 uint8_t type, uint8_t index, uint16_t language, 54 uint16_t length) 55 { 55 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 56 { 57 uint8_t type = setup_packet->value_high; 58 uint8_t index = setup_packet->value_low; 59 56 60 /* 57 61 * Standard device descriptor. … … 110 114 /** SET_ADDRESS handler. */ 111 115 static int handle_set_address(usbvirt_device_t *device, 112 uint16_t new_address, 113 uint16_t zero1, uint16_t zero2) 114 { 116 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 117 { 118 uint16_t new_address = setup_packet->value; 119 uint16_t zero1 = setup_packet->index; 120 uint16_t zero2 = setup_packet->length; 121 115 122 if ((zero1 != 0) || (zero2 != 0)) { 116 123 return EINVAL; … … 128 135 /** SET_CONFIGURATION handler. */ 129 136 static int handle_set_configuration(usbvirt_device_t *device, 130 uint16_t configuration_value, 131 uint16_t zero1, uint16_t zero2) 132 { 137 usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data) 138 { 139 uint16_t configuration_value = setup_packet->value; 140 uint16_t zero1 = setup_packet->index; 141 uint16_t zero2 = setup_packet->length; 142 133 143 if ((zero1 != 0) || (zero2 != 0)) { 134 144 return EINVAL; … … 167 177 } 168 178 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) 179 static usbvirt_stdreq_handler_t local_handlers[USB_DEVREQ_LAST_STD] = { 180 [USB_DEVREQ_GET_DESCRIPTOR] = handle_get_descriptor, 181 [USB_DEVREQ_SET_ADDRESS] = handle_set_address, 182 [USB_DEVREQ_SET_CONFIGURATION] = handle_set_configuration 183 }; 184 184 185 185 /** Handle standard device request. */ 186 186 int handle_std_request(usbvirt_device_t *device, 187 usb_device_request_setup_packet_t *request, uint8_t *data) 188 { 187 usb_device_request_setup_packet_t *request_packet, uint8_t *data) 188 { 189 int request = request_packet->request; 190 189 191 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; 192 "handling standard request %d", request); 193 194 if (request >= USB_DEVREQ_LAST_STD) { 195 return ENOTSUP; 196 } 197 198 int rc = EFORWARD; 199 if ((device->ops) 200 && (device->ops->on_standard_request[request])) { 201 rc = device->ops->on_standard_request[request](device, 202 request_packet, data); 203 } 204 205 if (rc == EFORWARD) { 206 if (local_handlers[request]) { 207 rc = local_handlers[request](device, 208 request_packet, data); 209 } else { 210 rc = ENOTSUP; 211 } 212 } 213 214 assert(rc != EFORWARD); 215 return rc; 208 216 } 209 217
Note:
See TracChangeset
for help on using the changeset viewer.