void usb_set_device(struct usb_device* dev, int force) { device = dev; if(force) { UDADDR = dev->addr & 0x7f; UDADDR |= 1 << ADDEN; } else { usb_set_addr(dev->addr); } }
static void usb_handle_control_done(void *data, ssize_t len, void *cbdata) { if (usb.state == USBD_STATE_SETTING_ADDRESS) { usb.state = USBD_STATE_ADDRESS; usb_set_addr(usb.address); } usb_setup_control(); }
void usb_rx_setup(const uint8_t *buf, const unsigned len) { const uint8_t req_type = buf[0]; const uint8_t req = buf[1]; const uint16_t req_val = buf[2] | (buf[3] << 8); const uint16_t req_index = buf[4] | (buf[5] << 8); const uint16_t req_count = buf[6] | (buf[7] << 8); //printf("ep0 setup type %02x req %02x val %04x index %04x count %04x\r\n", // req_type, req, req_val, req_index, req_count); if (req_type == 0x80 && req == 0x06) // get descriptor { const void *p_desc = NULL; uint16_t desc_len = 0; if (req_val == 0x0100) // get device descriptor { p_desc = &g_usb_device_desc; desc_len = sizeof(g_usb_device_desc); } else if (req_val == 0x0200) // get configuration descriptor { p_desc = &g_usb_config_desc; desc_len = sizeof(g_usb_config_desc); } else if (req_val == 0x0300) // get string language list { p_desc = &g_usb_lang_list_desc; desc_len = sizeof(g_usb_lang_list_desc); } else if (req_val == 0x0302) // get product string { p_desc = g_metal_usb_setup_pkt_buf; desc_len = usb_stuff_desc_string(g_metal_usb_product_str); } else if (req_val == 0x0301) // get vendor string { p_desc = g_metal_usb_setup_pkt_buf; desc_len = usb_stuff_desc_string(g_metal_usb_vendor_str); } //////////////////// if (p_desc) { int tx_len = desc_len < req_count ? desc_len : req_count; usb_tx(0, p_desc, tx_len); } else { printf("TRAP!!! unknown descriptor request: 0x%04x\r\n", req_val); while(1) { } // IT'S A TRAP } } else if (req_type == 0x00 && req == 0x05) // set address usb_set_addr((uint8_t)req_val); else if (req_type == 0x00 && req == 0x09) // set configuration { // todo: call into mac-specific function to set up endpoints, etc. usb_tx(0, NULL, 0); } else { printf("unknown setup rx: req_type = 0x%02x, req = 0x%02x\r\n", req_type, req); printf("trapping...\r\n"); while(1) { } // IT'S A TRAP } }