Split out endpoint and pipe stream functions into new EndpointStream.c/.h and PipeStream.c/.h files.
This commit is contained in:
parent
4cc7f5200b
commit
e72f424f64
18 changed files with 1320 additions and 1161 deletions
|
|
@ -0,0 +1,45 @@
|
|||
uint8_t TEMPLATE_FUNC_NAME (void* Buffer,
|
||||
uint16_t Length)
|
||||
{
|
||||
uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
|
||||
|
||||
if (!(Length))
|
||||
Endpoint_ClearOUT();
|
||||
|
||||
while (Length)
|
||||
{
|
||||
if (Endpoint_IsSETUPReceived())
|
||||
return ENDPOINT_RWCSTREAM_HostAborted;
|
||||
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return ENDPOINT_RWCSTREAM_DeviceDisconnected;
|
||||
else if (USB_DeviceState == DEVICE_STATE_Suspended)
|
||||
return ENDPOINT_RWCSTREAM_BusSuspended;
|
||||
|
||||
if (Endpoint_IsOUTReceived())
|
||||
{
|
||||
while (Length && Endpoint_BytesInEndpoint())
|
||||
{
|
||||
TEMPLATE_TRANSFER_BYTE(DataStream);
|
||||
Length--;
|
||||
}
|
||||
|
||||
Endpoint_ClearOUT();
|
||||
}
|
||||
}
|
||||
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return ENDPOINT_RWCSTREAM_DeviceDisconnected;
|
||||
else if (USB_DeviceState == DEVICE_STATE_Suspended)
|
||||
return ENDPOINT_RWCSTREAM_BusSuspended;
|
||||
}
|
||||
|
||||
return ENDPOINT_RWCSTREAM_NoError;
|
||||
}
|
||||
|
||||
|
||||
#undef TEMPLATE_BUFFER_OFFSET
|
||||
#undef TEMPLATE_FUNC_NAME
|
||||
#undef TEMPLATE_TRANSFER_BYTE
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
uint8_t TEMPLATE_FUNC_NAME (const void* Buffer,
|
||||
uint16_t Length)
|
||||
{
|
||||
uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
|
||||
bool LastPacketFull = false;
|
||||
|
||||
if (Length > USB_ControlRequest.wLength)
|
||||
Length = USB_ControlRequest.wLength;
|
||||
else if (!(Length))
|
||||
Endpoint_ClearIN();
|
||||
|
||||
while (Length || LastPacketFull)
|
||||
{
|
||||
if (Endpoint_IsSETUPReceived())
|
||||
return ENDPOINT_RWCSTREAM_HostAborted;
|
||||
|
||||
if (Endpoint_IsOUTReceived())
|
||||
break;
|
||||
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return ENDPOINT_RWCSTREAM_DeviceDisconnected;
|
||||
else if (USB_DeviceState == DEVICE_STATE_Suspended)
|
||||
return ENDPOINT_RWCSTREAM_BusSuspended;
|
||||
|
||||
if (Endpoint_IsINReady())
|
||||
{
|
||||
uint8_t BytesInEndpoint = Endpoint_BytesInEndpoint();
|
||||
|
||||
while (Length && (BytesInEndpoint < USB_ControlEndpointSize))
|
||||
{
|
||||
TEMPLATE_TRANSFER_BYTE(DataStream);
|
||||
Length--;
|
||||
BytesInEndpoint++;
|
||||
}
|
||||
|
||||
LastPacketFull = (BytesInEndpoint == USB_ControlEndpointSize);
|
||||
Endpoint_ClearIN();
|
||||
}
|
||||
}
|
||||
|
||||
while (!(Endpoint_IsOUTReceived()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return ENDPOINT_RWCSTREAM_DeviceDisconnected;
|
||||
else if (USB_DeviceState == DEVICE_STATE_Suspended)
|
||||
return ENDPOINT_RWCSTREAM_BusSuspended;
|
||||
}
|
||||
|
||||
return ENDPOINT_RWCSTREAM_NoError;
|
||||
}
|
||||
|
||||
#undef TEMPLATE_BUFFER_OFFSET
|
||||
#undef TEMPLATE_FUNC_NAME
|
||||
#undef TEMPLATE_TRANSFER_BYTE
|
||||
79
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
Normal file
79
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
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;
|
||||
}
|
||||
|
||||
#undef TEMPLATE_FUNC_NAME
|
||||
#undef TEMPLATE_BUFFER_TYPE
|
||||
#undef TEMPLATE_TRANSFER_BYTE
|
||||
#undef TEMPLATE_CLEAR_ENDPOINT
|
||||
#undef TEMPLATE_BUFFER_OFFSET
|
||||
82
LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
Normal file
82
LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
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;
|
||||
|
||||
Pipe_SetPipeToken(TEMPLATE_TOKEN);
|
||||
|
||||
if ((ErrorCode = Pipe_WaitUntilReady()))
|
||||
return ErrorCode;
|
||||
|
||||
#if defined(FAST_STREAM_TRANSFERS)
|
||||
uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
|
||||
|
||||
if (Length >= 8)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
#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 ((ErrorCode = Pipe_WaitUntilReady()))
|
||||
return ErrorCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
TEMPLATE_TRANSFER_BYTE(DataStream);
|
||||
Length--;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue