static struct usb_config_descriptor * get_device_config(struct usb_pipe *pipe) { struct usb_config_descriptor cfg; struct usb_ctrlrequest req; req.bRequestType = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE; req.bRequest = USB_REQ_GET_DESCRIPTOR; req.wValue = USB_DT_CONFIG<<8; req.wIndex = 0; req.wLength = sizeof(cfg); int ret = usb_send_default_control(pipe, &req, &cfg); if (ret) return NULL; void *config = malloc_tmphigh(cfg.wTotalLength); if (!config) return NULL; req.wLength = cfg.wTotalLength; ret = usb_send_default_control(pipe, &req, config); if (ret) { free(config); return NULL; } //hexdump(config, cfg.wTotalLength); return config; }
static int set_configuration(struct usb_pipe *pipe, u16 val) { struct usb_ctrlrequest req; req.bRequestType = USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE; req.bRequest = USB_REQ_SET_CONFIGURATION; req.wValue = val; req.wIndex = 0; req.wLength = 0; return usb_send_default_control(pipe, &req, NULL); }
// Get the first 8 bytes of the device descriptor. static int get_device_info8(struct usb_pipe *pipe, struct usb_device_descriptor *dinfo) { struct usb_ctrlrequest req; req.bRequestType = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE; req.bRequest = USB_REQ_GET_DESCRIPTOR; req.wValue = USB_DT_DEVICE<<8; req.wIndex = 0; req.wLength = 8; return usb_send_default_control(pipe, &req, dinfo); }
// Send USB HID SetIdle request. static int set_idle(struct usb_pipe *pipe, int ms) { struct usb_ctrlrequest req; req.bRequestType = USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE; req.bRequest = HID_REQ_SET_IDLE; req.wValue = (ms/4)<<8; req.wIndex = 0; req.wLength = 0; return usb_send_default_control(pipe, &req, NULL); }
// Send USB HID protocol message. static int set_protocol(struct usb_pipe *pipe, u16 val) { struct usb_ctrlrequest req; req.bRequestType = USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE; req.bRequest = HID_REQ_SET_PROTOCOL; req.wValue = val; req.wIndex = 0; req.wLength = 0; return usb_send_default_control(pipe, &req, NULL); }
static int usb_msc_maxlun(struct usb_pipe *pipe) { struct usb_ctrlrequest req; req.bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE; req.bRequest = 0xfe; req.wValue = 0; req.wIndex = 0; req.wLength = 1; unsigned char maxlun; int ret = usb_send_default_control(pipe, &req, &maxlun); if (ret) return 0; return maxlun; }
// Assign an address to a device in the default state on the given // controller. static int usb_set_address(struct usbdevice_s *usbdev) { ASSERT32FLAT(); struct usb_s *cntl = usbdev->hub->cntl; dprintf(3, "set_address %p\n", cntl); if (cntl->maxaddr >= USB_MAXADDR) return -1; msleep(USB_TIME_RSTRCY); // Create a pipe for the default address. struct usb_endpoint_descriptor epdesc = { .wMaxPacketSize = speed_to_ctlsize[usbdev->speed], .bmAttributes = USB_ENDPOINT_XFER_CONTROL, }; usbdev->defpipe = usb_alloc_pipe(usbdev, &epdesc); if (!usbdev->defpipe) return -1; // Send set_address command. struct usb_ctrlrequest req; req.bRequestType = USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE; req.bRequest = USB_REQ_SET_ADDRESS; req.wValue = cntl->maxaddr + 1; req.wIndex = 0; req.wLength = 0; int ret = usb_send_default_control(usbdev->defpipe, &req, NULL); if (ret) { usb_free_pipe(usbdev, usbdev->defpipe); return -1; } msleep(USB_TIME_SETADDR_RECOVERY); cntl->maxaddr++; usbdev->devaddr = cntl->maxaddr; usbdev->defpipe = usb_realloc_pipe(usbdev, usbdev->defpipe, &epdesc); if (!usbdev->defpipe) return -1; return 0; }