X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/e72f424f6450cf67d3ef57d347a4f8d86ec5a119..279e1b6ece7fbc90db6cb642f1c289b45648cf9c:/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c index fb64dd837..8c5d47d4d 100644 --- a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c +++ b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c @@ -1,65 +1,33 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, - uint16_t Length - __CALLBACK_PARAM) + uint16_t Length, + uint16_t* const BytesProcessed) { - uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + uint16_t BytesInTransfer = 0; uint8_t ErrorCode; - + Pipe_SetPipeToken(TEMPLATE_TOKEN); if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; - #if defined(FAST_STREAM_TRANSFERS) - uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07); - - if (Length >= 8) + if (BytesProcessed != NULL) { - Length -= BytesRemToAlignment; - - switch (BytesRemToAlignment) - { - default: - do - { - if (!(Pipe_IsReadWriteAllowed())) - { - TEMPLATE_CLEAR_PIPE(); - - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return PIPE_RWSTREAM_CallbackAborted; - #endif - - if ((ErrorCode = Pipe_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); - } + Length -= *BytesProcessed; + TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); } - #endif - + while (Length) { if (!(Pipe_IsReadWriteAllowed())) { TEMPLATE_CLEAR_PIPE(); - #if !defined(NO_STREAM_CALLBACKS) - if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) - return PIPE_RWSTREAM_CallbackAborted; - #endif + if (BytesProcessed != NULL) + { + *BytesProcessed += BytesInTransfer; + return PIPE_RWSTREAM_IncompleteTransfer; + } if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; @@ -67,10 +35,12 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, else { TEMPLATE_TRANSFER_BYTE(DataStream); + TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; + BytesInTransfer++; } } - + return PIPE_RWSTREAM_NoError; } @@ -80,3 +50,4 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer, #undef TEMPLATE_TRANSFER_BYTE #undef TEMPLATE_CLEAR_PIPE #undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE