uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, uint16_t Length, uint16_t* const BytesProcessed) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); uint16_t BytesInTransfer = 0; uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; if (BytesProcessed != NULL) { Length -= *BytesProcessed; TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); } while (Length) { if (!(Endpoint_IsReadWriteAllowed())) { TEMPLATE_CLEAR_ENDPOINT(); if (BytesProcessed != NULL) { *BytesProcessed += BytesInTransfer; return ENDPOINT_RWSTREAM_IncompleteTransfer; } #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } else { TEMPLATE_TRANSFER_BYTE(DataStream); TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInTransfer++; } } return ENDPOINT_RWSTREAM_NoError; }
uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, uint16_t Length __CALLBACK_PARAM) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; #if defined(FAST_STREAM_TRANSFERS) uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07); if (Length >= 8) { Length -= BytesRemToAlignment; switch (BytesRemToAlignment) { default: do { if (!(Endpoint_IsReadWriteAllowed())) { TEMPLATE_CLEAR_ENDPOINT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) return ENDPOINT_RWSTREAM_CallbackAborted; #endif if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } Length -= 8; TEMPLATE_TRANSFER_BYTE(DataStream); case 7: TEMPLATE_TRANSFER_BYTE(DataStream); case 6: TEMPLATE_TRANSFER_BYTE(DataStream); case 5: TEMPLATE_TRANSFER_BYTE(DataStream); case 4: TEMPLATE_TRANSFER_BYTE(DataStream); case 3: TEMPLATE_TRANSFER_BYTE(DataStream); case 2: TEMPLATE_TRANSFER_BYTE(DataStream); case 1: TEMPLATE_TRANSFER_BYTE(DataStream); } while (Length >= 8); } } #endif while (Length) { if (!(Endpoint_IsReadWriteAllowed())) { TEMPLATE_CLEAR_ENDPOINT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) return ENDPOINT_RWSTREAM_CallbackAborted; #endif if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } else { TEMPLATE_TRANSFER_BYTE(DataStream); Length--; } } return ENDPOINT_RWSTREAM_NoError; }