Changes in uspace/lib/usbdev/src/pipesinit.c [58563585:bb655dab] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/pipesinit.c
r58563585 rbb655dab 38 38 #include <usb/dev/request.h> 39 39 #include <usb/usb.h> 40 #include <usb/debug.h> 40 41 #include <usb/descriptor.h> 41 42 … … 59 60 NESTING(INTERFACE, HID), 60 61 NESTING(HID, HID_REPORT), 62 NESTING(ENDPOINT, SSPEED_EP_COMPANION), 61 63 LAST_NESTING 62 64 }; … … 70 72 { 71 73 return descriptor[1] == USB_DESCTYPE_ENDPOINT; 74 } 75 76 /** Tells whether given descriptor is of superspeed companion type. 77 * 78 * @param descriptor Descriptor in question. 79 * @return Whether the given descriptor is superspeed companion descriptor. 80 */ 81 static inline bool is_superspeed_companion_descriptor(const uint8_t *descriptor) 82 { 83 return descriptor[1] == USB_DESCTYPE_SSPEED_EP_COMPANION; 72 84 } 73 85 … … 150 162 * @param interface Interface descriptor under which belongs the @p endpoint. 151 163 * @param endpoint Endpoint descriptor. 164 * @param companion Superspeed companion descriptor. 152 165 * @return Error code. 153 166 */ … … 156 169 usb_standard_interface_descriptor_t *interface, 157 170 usb_standard_endpoint_descriptor_t *endpoint_desc, 171 usb_superspeed_endpoint_companion_descriptor_t *companion_desc, 158 172 usb_dev_session_t *bus_session) 159 173 { … … 162 176 * Get endpoint characteristics. 163 177 */ 164 165 /* Actual endpoint number is in bits 0..3 */166 const usb_endpoint_t ep_no = endpoint_desc->endpoint_address & 0x0F;167 168 178 const usb_endpoint_description_t description = { 169 /* Endpoint direction is set by bit 7 */ 170 .direction = (endpoint_desc->endpoint_address & 128) 171 ? USB_DIRECTION_IN : USB_DIRECTION_OUT, 172 /* Transfer type is in bits 0..2 and 173 * the enum values corresponds 1:1 */ 174 .transfer_type = endpoint_desc->attributes & 3, 179 .transfer_type = USB_ED_GET_TRANSFER_TYPE(*endpoint_desc), 180 .direction = USB_ED_GET_DIR(*endpoint_desc), 175 181 176 182 /* Get interface characteristics. */ … … 194 200 } 195 201 196 int rc = usb_pipe_initialize(&ep_mapping->pipe, 197 ep_no, description.transfer_type, 198 ED_MPS_PACKET_SIZE_GET( 199 uint16_usb2host(endpoint_desc->max_packet_size)), 200 description.direction, 201 ED_MPS_TRANS_OPPORTUNITIES_GET( 202 uint16_usb2host(endpoint_desc->max_packet_size)), bus_session); 203 if (rc != EOK) { 204 return rc; 205 } 202 int err = usb_pipe_initialize(&ep_mapping->pipe, bus_session); 203 if (err) 204 return err; 206 205 207 206 ep_mapping->present = true; 208 207 ep_mapping->descriptor = endpoint_desc; 208 ep_mapping->companion_descriptor = companion_desc; 209 209 ep_mapping->interface = interface; 210 210 … … 235 235 do { 236 236 if (is_endpoint_descriptor(descriptor)) { 237 /* Check if companion descriptor is present too, it should immediatelly follow. */ 238 const uint8_t *companion_desc = usb_dp_get_nested_descriptor(parser, 239 parser_data, descriptor); 240 if (companion_desc && !is_superspeed_companion_descriptor(companion_desc)) { 241 /* Not what we wanted, don't pass it further. */ 242 companion_desc = NULL; 243 } 244 237 245 (void) process_endpoint(mapping, mapping_count, 238 246 (usb_standard_interface_descriptor_t *) … … 240 248 (usb_standard_endpoint_descriptor_t *) 241 249 descriptor, 250 (usb_superspeed_endpoint_companion_descriptor_t *) 251 companion_desc, 242 252 bus_session); 243 253 } … … 288 298 if (config_descriptor == NULL) 289 299 return EBADMEM; 290 300 291 301 if (config_descriptor_size < 292 302 sizeof(usb_standard_configuration_descriptor_t)) { … … 328 338 } 329 339 330 /** Probe default control pipe for max packet size.331 *332 * The function tries to get the correct value of max packet size several333 * time before giving up.334 *335 * The session on the pipe shall not be started.336 *337 * @param pipe Default control pipe.338 * @return Error code.339 */340 int usb_pipe_probe_default_control(usb_pipe_t *pipe)341 {342 assert(pipe);343 static_assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);344 345 if ((pipe->direction != USB_DIRECTION_BOTH) ||346 (pipe->transfer_type != USB_TRANSFER_CONTROL) ||347 (pipe->endpoint_no != 0)) {348 return EINVAL;349 }350 351 uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE];352 size_t transferred_size;353 int rc;354 for (size_t attempt_var = 0; attempt_var < 3; ++attempt_var) {355 rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD,356 USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE,357 0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE,358 &transferred_size);359 if (rc == EOK) {360 if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) {361 rc = ELIMIT;362 continue;363 }364 break;365 }366 }367 if (rc != EOK) {368 return rc;369 }370 371 pipe->max_packet_size372 = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];373 374 return EOK;375 }376 377 340 /** 378 341 * @}
Note:
See TracChangeset
for help on using the changeset viewer.