aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-02-19 22:59:27 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-02-19 22:59:27 +0000
commit1daa5e16f9a395fb2943906a715adb35b8106988 (patch)
tree016c5790c2b0e50753f9a4edda21ce54b40e914d /LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c
parent3832182fe1de292998eef73e00511f73af0efa87 (diff)
downloadlufa-1daa5e16f9a395fb2943906a715adb35b8106988.tar.gz
lufa-1daa5e16f9a395fb2943906a715adb35b8106988.tar.bz2
lufa-1daa5e16f9a395fb2943906a715adb35b8106988.zip
Initial restructuring of the core USB driver module to support multiple architectures in the future.
Diffstat (limited to 'LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c')
-rw-r--r--LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c
new file mode 100644
index 000000000..147ce5ad4
--- /dev/null
+++ b/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c
@@ -0,0 +1,53 @@
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const 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;
+
+ Pipe_SetPipeToken(TEMPLATE_TOKEN);
+
+ if ((ErrorCode = Pipe_WaitUntilReady()))
+ return ErrorCode;
+
+ if (BytesProcessed != NULL)
+ {
+ Length -= *BytesProcessed;
+ TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+ }
+
+ while (Length)
+ {
+ if (!(Pipe_IsReadWriteAllowed()))
+ {
+ TEMPLATE_CLEAR_PIPE();
+
+ if (BytesProcessed != NULL)
+ {
+ *BytesProcessed += BytesInTransfer;
+ return PIPE_RWSTREAM_IncompleteTransfer;
+ }
+
+ if ((ErrorCode = Pipe_WaitUntilReady()))
+ return ErrorCode;
+ }
+ else
+ {
+ TEMPLATE_TRANSFER_BYTE(DataStream);
+ TEMPLATE_BUFFER_MOVE(DataStream, 1);
+ Length--;
+ BytesInTransfer++;
+ }
+ }
+
+ return PIPE_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TOKEN
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_PIPE
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE