bool udi_cdc_comm_setup(void) { uint8_t port = udi_cdc_setup_to_port(); if (Udd_setup_is_in()) { // GET Interface Requests if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { // Requests Class Interface Get switch (udd_g_ctrlreq.req.bRequest) { case USB_REQ_CDC_GET_LINE_CODING: // Get configuration of CDC line if (sizeof(usb_cdc_line_coding_t) != udd_g_ctrlreq.req.wLength) return false; // Error for USB host udd_g_ctrlreq.payload = (uint8_t *) & udi_cdc_line_coding[port]; udd_g_ctrlreq.payload_size = sizeof(usb_cdc_line_coding_t); return true; } } } if (Udd_setup_is_out()) { // SET Interface Requests if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { // Requests Class Interface Set switch (udd_g_ctrlreq.req.bRequest) { case USB_REQ_CDC_SET_LINE_CODING: // Change configuration of CDC line if (sizeof(usb_cdc_line_coding_t) != udd_g_ctrlreq.req.wLength) return false; // Error for USB host udd_g_ctrlreq.callback = udi_cdc_line_coding_received; udd_g_ctrlreq.payload = (uint8_t *) & udi_cdc_line_coding[port]; udd_g_ctrlreq.payload_size = sizeof(usb_cdc_line_coding_t); return true; case USB_REQ_CDC_SET_CONTROL_LINE_STATE: // According cdc spec 1.1 chapter 6.2.14 UDI_CDC_SET_DTR_EXT(port, (0 != (udd_g_ctrlreq.req.wValue & CDC_CTRL_SIGNAL_DTE_PRESENT))); UDI_CDC_SET_RTS_EXT(port, (0 != (udd_g_ctrlreq.req.wValue & CDC_CTRL_SIGNAL_ACTIVATE_CARRIER))); return true; } } } return false; // request Not supported }
bool udi_vendor_setup(void) { if (Udd_setup_is_in()) { if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { return UDI_VENDOR_SETUP_IN_RECEIVED(); } } if (Udd_setup_is_out()) { if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { return UDI_VENDOR_SETUP_OUT_RECEIVED(); } } return false; // Not supported request }
bool udi_vendor_setup(void) { if (Udd_setup_is_in()) { if ((Udd_setup_type() == USB_REQ_TYPE_VENDOR) && (udd_g_ctrlreq.req.bRequest == 0)) { return UDI_VENDOR_SETUP_IN_RECEIVED(); } } if (Udd_setup_is_out()) { if ((Udd_setup_type() == USB_REQ_TYPE_VENDOR) && (udd_g_ctrlreq.req.bRequest == 0) && (0 != udd_g_ctrlreq.req.wLength)) { return UDI_VENDOR_SETUP_OUT_RECEIVED(); } } return false; // Not supported request }
bool udc_dfu_setup(void) { //** Interface requests if (Udd_setup_type() != USB_REQ_TYPE_CLASS) { return false; // Only class request decoded } // TODO: use state of DFU specification if (Udd_setup_is_in()) { // Requests Class Interface Get switch (udd_g_ctrlreq.req.bRequest) { case USB_REQ_DFU_GETSTATUS: if (0 != udd_g_ctrlreq.req.wValue) break; if (sizeof(udi_dfu_status) != udd_g_ctrlreq.req.wLength) break; udd_g_ctrlreq.payload = (uint8_t *) & udi_dfu_status; udd_g_ctrlreq.payload_size = sizeof(udi_dfu_status); return true; case USB_REQ_DFU_GETSTATE: if (0 != udd_g_ctrlreq.req.wValue) break; if (sizeof(udi_dfu_status.bState) != udd_g_ctrlreq.req.wLength) break; udd_g_ctrlreq.payload = (uint8_t *) & (udi_dfu_status.bState); udd_g_ctrlreq.payload_size = sizeof(udi_dfu_status.bState); return true; case USB_REQ_DFU_UPLOAD: break; } } if (Udd_setup_is_out()) { // Requests Class Interface Set switch (udd_g_ctrlreq.req.bRequest) { case USB_REQ_DFU_ABORT: break; case USB_REQ_DFU_CLRSTATUS: if (0 != udd_g_ctrlreq.req.wValue) break; if (0 != udd_g_ctrlreq.req.wLength) break; udi_dfu_clear_status(); return true; case USB_REQ_DFU_DNLOAD: break; } } // Unknown request udi_dfu_status.bStatus = DFU_STATUS_ERRSTALLEDPK; udi_dfu_status.bState = DFU_STATE_DFUERROR; return false; }