// Called in ISR context when a data OUT stage has been performed void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) { if ((length == 1) || (length == 2)) { uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf); CONTROL_TRANSFER * transfer = getTransferPtr(); switch (transfer->setup.wValue >> 8) { case MUTE_CONTROL: switch (transfer->setup.bRequest) { case REQUEST_SET_CUR: mute = data & 0xff; if (updateVol) updateVol.call(); break; default: break; } break; case VOLUME_CONTROL: switch (transfer->setup.bRequest) { case REQUEST_SET_CUR: volCur = data; volume = (float)volCur/(float)volMax; if (updateVol) updateVol.call(); break; default: break; } break; default: break; } }
bool USBCDC::USBCallback_request(void) { /* Called in ISR context */ bool success = false; CONTROL_TRANSFER * transfer = getTransferPtr(); /* Process class-specific requests */ if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { switch (transfer->setup.bRequest) { case CDC_GET_LINE_CODING: transfer->remaining = 7; transfer->ptr = cdc_line_coding; transfer->direction = DEVICE_TO_HOST; success = true; break; case CDC_SET_LINE_CODING: transfer->remaining = 7; success = true; break; case CDC_SET_CONTROL_LINE_STATE: success = true; break; default: break; } } return success; }
// Called in ISR context to process a class specific request bool USBMSD::USBCallback_request(void) { bool success = false; CONTROL_TRANSFER * transfer = getTransferPtr(); static uint8_t maxLUN[1] = {0}; if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { switch (transfer->setup.bRequest) { case MSC_REQUEST_RESET: reset(); success = true; break; case MSC_REQUEST_GET_MAX_LUN: transfer->remaining = 1; transfer->ptr = maxLUN; transfer->direction = DEVICE_TO_HOST; success = true; break; default: break; } } return success; }
void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) { // Request of setting line coding has 7 bytes if (length != 7) { return; } CONTROL_TRANSFER * transfer = getTransferPtr(); /* Process class-specific requests */ if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { if (transfer->setup.bRequest == CDC_SET_LINE_CODING) { if (memcmp(cdc_line_coding, buf, 7)) { memcpy(cdc_line_coding, buf, 7); int baud = buf[0] + (buf[1] << 8) + (buf[2] << 16) + (buf[3] << 24); int stop = buf[4]; int bits = buf[6]; int parity = buf[5]; lineCodingChanged(baud, bits, parity, stop); } } } }
bool RJBaseUSBDevice::USBCallback_request() { /* Called in ISR context */ CONTROL_TRANSFER* transfer = getTransferPtr(); // Handle vendor-specific requests if (transfer->setup.bmRequestType.Type == VENDOR_TYPE) { switch (transfer->setup.bRequest) { case Base2015ControlCommand::RadioWriteRegister: LOG(INF3, "writeReg request"); if (writeRegisterCallback) writeRegisterCallback(transfer->setup.wIndex, transfer->setup.wValue); return true; case Base2015ControlCommand::RadioReadRegister: LOG(INF3, "readReg request"); if (transfer->setup.wLength > 0 && readRegisterCallback) { _controlTransferReplyValue = readRegisterCallback(transfer->setup.wIndex); // setup reply transfer with reg value transfer->direction = DEVICE_TO_HOST; transfer->ptr = &_controlTransferReplyValue; transfer->remaining = sizeof(_controlTransferReplyValue); } else { // stall EP0 to indicate error EP0stall(); } return true; case Base2015ControlCommand::RadioStrobe: LOG(INF3, "strobe request"); if (strobeCallback) strobeCallback(transfer->setup.wIndex); return true; default: LOG(WARN, "Unrecognized usb VENDOR request '%d'", transfer->setup.bRequest); // stall EP0 to indicate error EP0stall(); break; } } // unhandled request return false; }
bool USBCDCMSC::USBCallback_request(void) { /* Called in ISR context */ bool success = false; CONTROL_TRANSFER * transfer = getTransferPtr(); static uint8_t maxLUN[1] = {0}; /* Process class-specific requests */ if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { switch (transfer->setup.bRequest) { case CDC_GET_LINE_CODING: transfer->remaining = 7; transfer->ptr = cdc_line_coding; transfer->direction = DEVICE_TO_HOST; success = true; break; case CDC_SET_LINE_CODING: transfer->remaining = 7; success = true; break; case CDC_SET_CONTROL_LINE_STATE: success = true; break; case CDC_SEND_BREAK: cdcbreak = 1; success = true; break; case MSC_REQUEST_RESET: reset(); success = true; break; case MSC_REQUEST_GET_MAX_LUN: transfer->remaining = 1; transfer->ptr = maxLUN; transfer->direction = DEVICE_TO_HOST; success = true; break; default: break; } } return success; }
// Called in ISR context // Called by USBDevice on Endpoint0 request // This is used to handle extensions to standard requests and class specific requests. // Return true if class handles this request bool USBAudio::USBCallback_request() { bool success = false; CONTROL_TRANSFER * transfer = getTransferPtr(); // Process class-specific requests if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { // Feature Unit: Interface = 0, ID = 2 if (transfer->setup.wIndex == 0x0200) { // Master Channel if ((transfer->setup.wValue & 0xff) == 0) { switch (transfer->setup.wValue >> 8) { case MUTE_CONTROL: switch (transfer->setup.bRequest) { case REQUEST_GET_CUR: transfer->remaining = 1; transfer->ptr = &mute; transfer->direction = DEVICE_TO_HOST; success = true; break; case REQUEST_SET_CUR: transfer->remaining = 1; transfer->notify = true; transfer->direction = HOST_TO_DEVICE; success = true; break; default: break; } break; case VOLUME_CONTROL: switch (transfer->setup.bRequest) { case REQUEST_GET_CUR: transfer->remaining = 2; transfer->ptr = (uint8_t *)&volCur; transfer->direction = DEVICE_TO_HOST; success = true; break; case REQUEST_GET_MIN: transfer->remaining = 2; transfer->ptr = (uint8_t *)&volMin; transfer->direction = DEVICE_TO_HOST; success = true; break; case REQUEST_GET_MAX: transfer->remaining = 2; transfer->ptr = (uint8_t *)&volMax; transfer->direction = DEVICE_TO_HOST; success = true; break; case REQUEST_GET_RES: transfer->remaining = 2; transfer->ptr = (uint8_t *)&volRes; transfer->direction = DEVICE_TO_HOST; success = true; break; case REQUEST_SET_CUR: transfer->remaining = 2; transfer->notify = true; transfer->direction = HOST_TO_DEVICE; success = true; break; case REQUEST_SET_MIN: transfer->remaining = 2; transfer->notify = true; transfer->direction = HOST_TO_DEVICE; success = true; break; case REQUEST_SET_MAX: transfer->remaining = 2; transfer->notify = true; transfer->direction = HOST_TO_DEVICE; success = true; break; case REQUEST_SET_RES: transfer->remaining = 2; transfer->notify = true; transfer->direction = HOST_TO_DEVICE; success = true; break; } break; default: break; } } } } return success; }
// Called in ISR context // Called by USBDevice on Endpoint0 request // This is used to handle extensions to standard requests // and class specific requests // Return true if class handles this request bool USBHID::USBCallback_request() { bool success = false; CONTROL_TRANSFER * transfer = getTransferPtr(); uint8_t *hidDescriptor; // Process additional standard requests if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE)) { switch (transfer->setup.bRequest) { case GET_DESCRIPTOR: switch (DESCRIPTOR_TYPE(transfer->setup.wValue)) { case REPORT_DESCRIPTOR: if ((reportDesc() != NULL) \ && (reportDescLength() != 0)) { transfer->remaining = reportDescLength(); transfer->ptr = reportDesc(); transfer->direction = DEVICE_TO_HOST; success = true; } break; case HID_DESCRIPTOR: // Find the HID descriptor, after the configuration descriptor hidDescriptor = findDescriptor(HID_DESCRIPTOR); if (hidDescriptor != NULL) { transfer->remaining = HID_DESCRIPTOR_LENGTH; transfer->ptr = hidDescriptor; transfer->direction = DEVICE_TO_HOST; success = true; } break; default: break; } break; default: break; } } // Process class-specific requests if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { switch (transfer->setup.bRequest) { case SET_REPORT: // First byte will be used for report ID outputReport.data[0] = transfer->setup.wValue & 0xff; outputReport.length = transfer->setup.wLength + 1; transfer->remaining = sizeof(outputReport.data) - 1; transfer->ptr = &outputReport.data[1]; transfer->direction = HOST_TO_DEVICE; transfer->notify = true; success = true; default: break; } } return success; }