Datasheet

Table Of Contents
379 uint8_t req_direction = pkt->bmRequestType;
380 uint8_t req = pkt->bRequest;
381
382 // Reset PID to 1 for EP0 IN
383 usb_get_endpoint_configuration(EP0_IN_ADDR)->next_pid = 1u;
384
385 if (req_direction == USB_DIR_OUT) {
386 if (req == USB_REQUEST_SET_ADDRESS) {
387 usb_set_device_address(pkt);
388 } else if (req == USB_REQUEST_SET_CONFIGURATION) {
389 usb_set_device_configuration(pkt);
390 } else {
391 printf("Other OUT request (0x%x)\r\n", pkt->bRequest);
392 }
393 } else if (req_direction == USB_DIR_IN) {
394 if (req == USB_REQUEST_GET_DESCRIPTOR) {
395 uint16_t descriptor_type = pkt->wValue >> 8;
396
397 switch (descriptor_type) {
398 case USB_DT_DEVICE:
399 usb_handle_device_descriptor();
400 printf("GET DEVICE DESCRIPTOR\r\n");
401 break;
402
403 case USB_DT_CONFIG:
404 usb_handle_config_descriptor(pkt);
405 printf("GET CONFIG DESCRIPTOR\r\n");
406 break;
407
408 case USB_DT_STRING:
409 usb_handle_string_descriptor(pkt);
410 printf("GET STRING DESCRIPTOR\r\n");
411 break;
412
413 default:
414 printf("Unhandled GET_DESCRIPTOR type 0x%x\r\n", descriptor_type);
415 }
416 } else {
417 printf("Other IN request (0x%x)\r\n", pkt->bRequest);
418 }
419 }
420 }
4.1.3.2.4. Replying to a setup packet on EP0 IN
The first thing a host will request is the device descriptor, the following code handles that setup request.
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/pre_release/usb/device/dev_lowlevel/dev_lowlevel.c Lines 267 - 274
267 void usb_handle_device_descriptor(void) {
268 const struct usb_device_descriptor *d = dev_config.device_descriptor;
269 // EP0 in
270 struct usb_endpoint_configuration *ep = usb_get_endpoint_configuration(EP0_IN_ADDR);
271 // Always respond with pid 1
272 ep->next_pid = 1;
273 usb_start_transfer(ep, (uint8_t *) d, sizeof(struct usb_device_descriptor));
274 }
The usb_start_transfer function copies the data to send into the appropriate hardware buffer, and configures the buffer
RP2040 Datasheet
4.1. USB 394