diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2010-10-13 14:05:35 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2010-10-13 14:05:35 +0000 |
commit | 5a4def747897c1c6ffbe465506d846c7c686d3e9 (patch) | |
tree | e5a9ca31ab554e993f1a9041e44976cf7b253921 /LUFA/Drivers/USB/Class/Host | |
parent | a8871c7fba73307226bd13e2cad4c840c850e6f1 (diff) | |
download | lufa-5a4def747897c1c6ffbe465506d846c7c686d3e9.tar.gz lufa-5a4def747897c1c6ffbe465506d846c7c686d3e9.tar.bz2 lufa-5a4def747897c1c6ffbe465506d846c7c686d3e9.zip |
Clean up excessive whitespace at the end of each line using the wspurify tool made by Laszlo Monda
Diffstat (limited to 'LUFA/Drivers/USB/Class/Host')
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/CDC.c | 79 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/CDC.h | 45 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/HID.c | 85 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/HID.h | 39 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/HIDParser.c | 109 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/HIDParser.h | 51 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/HIDReportData.h | 23 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/MIDI.c | 41 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/MIDI.h | 29 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/MassStorage.c | 85 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/MassStorage.h | 45 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/Printer.c | 83 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/Printer.h | 37 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/RNDIS.c | 91 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/RNDIS.h | 31 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/StillImage.c | 89 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/StillImage.h | 39 |
17 files changed, 509 insertions, 492 deletions
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index 0f81d0ea4..57ca35cdc 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.c +++ b/LUFA/Drivers/USB/Class/Host/CDC.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -62,7 +62,7 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo DCOMP_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) { return CDC_ENUMERROR_NoCompatibleInterfaceFound; - } + } DataINEndpoint = NULL; DataOUTEndpoint = NULL; @@ -79,10 +79,10 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo NotificationEndpoint = NULL; } - + continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) @@ -97,7 +97,7 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo DataOUTEndpoint = EndpointData; } } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == CDCInterfaceInfo->Config.DataINPipeNumber) @@ -141,7 +141,7 @@ static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescrip { USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); - + if ((CurrentInterface->Class == CDC_CONTROL_CLASS) && (CurrentInterface->SubClass == CDC_CONTROL_SUBCLASS) && (CurrentInterface->Protocol == CDC_CONTROL_PROTOCOL)) @@ -149,7 +149,7 @@ static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescrip return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -159,7 +159,7 @@ static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor { USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); - + if ((CurrentInterface->Class == CDC_DATA_CLASS) && (CurrentInterface->SubClass == CDC_DATA_SUBCLASS) && (CurrentInterface->Protocol == CDC_DATA_PROTOCOL)) @@ -167,7 +167,7 @@ static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -177,9 +177,9 @@ static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescri { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); - + uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); - + if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress))) { @@ -198,7 +198,7 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) { if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) return; - + Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipeNumber); Pipe_Unfreeze(); @@ -206,14 +206,14 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) { USB_Request_Header_t Notification; Pipe_Read_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NO_STREAM_CALLBACK); - + if ((Notification.bRequest == CDC_NOTIF_SerialState) && (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))) { Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost, sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost), NO_STREAM_CALLBACK); - + Pipe_ClearIN(); EVENT_CDC_Host_ControLineStateChanged(CDCInterfaceInfo); @@ -223,7 +223,7 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) Pipe_ClearIN(); } } - + Pipe_Freeze(); CDC_Host_Flush(CDCInterfaceInfo); @@ -241,7 +241,7 @@ uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInf }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + return USB_Host_SendControlRequest(&CDCInterfaceInfo->State.LineEncoding); } @@ -257,7 +257,7 @@ uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCI }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + return USB_Host_SendControlRequest(NULL); } @@ -274,7 +274,7 @@ uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + return USB_Host_SendControlRequest(NULL); } @@ -287,12 +287,12 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, uint8_t ErrorCode; - Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); ErrorCode = Pipe_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK); Pipe_Freeze(); - + return ErrorCode; } @@ -301,12 +301,12 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, { if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) return PIPE_READYWAIT_DeviceDisconnected; - + uint8_t ErrorCode; - Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if (!(Pipe_IsReadWriteAllowed())) { Pipe_ClearOUT(); @@ -315,9 +315,9 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, return ErrorCode; } - Pipe_Write_Byte(Data); + Pipe_Write_Byte(Data); Pipe_Freeze(); - + return PIPE_READYWAIT_NoError; } @@ -325,7 +325,7 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo { if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) return 0; - + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); @@ -346,7 +346,7 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo else { Pipe_Freeze(); - + return 0; } } @@ -355,7 +355,7 @@ int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) { if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) return -1; - + int16_t ReceivedByte = -1; Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber); @@ -369,7 +369,7 @@ int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) if (!(Pipe_BytesInPipe())) Pipe_ClearIN(); } - + Pipe_Freeze(); return ReceivedByte; @@ -379,12 +379,12 @@ uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) { if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) return PIPE_READYWAIT_DeviceDisconnected; - + uint8_t ErrorCode; - Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); + Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if (!(Pipe_BytesInPipe())) return PIPE_READYWAIT_NoError; @@ -401,7 +401,7 @@ uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) } Pipe_Freeze(); - + return PIPE_READYWAIT_NoError; } @@ -438,7 +438,7 @@ static int CDC_Host_getchar(FILE* Stream) static int CDC_Host_getchar_Blocking(FILE* Stream) { int16_t ReceivedByte; - + while ((ReceivedByte = CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))) < 0) { if (USB_HostState == HOST_STATE_Unattached) @@ -457,3 +457,4 @@ void CDC_Host_Event_Stub(void) } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h index e80d01423..8a4b576ca 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.h +++ b/LUFA/Drivers/USB/Class/Host/CDC.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -59,7 +59,7 @@ #include <stdio.h> #include <string.h> - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -88,7 +88,7 @@ uint8_t DataOUTPipeNumber; /**< Pipe number of the CDC interface's OUT data pipe. */ bool DataOUTPipeDoubleBank; /**< Indicates if the CDC interface's OUT data pipe should use double banking. */ - uint8_t NotificationPipeNumber; /**< Pipe number of the CDC interface's IN notification endpoint, if used. */ + uint8_t NotificationPipeNumber; /**< Pipe number of the CDC interface's IN notification endpoint, if used. */ bool NotificationPipeDoubleBank; /**< Indicates if the CDC interface's notification pipe should use double banking. */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * <b>must</b> be set or the interface will fail to enumerate and operate correctly. @@ -100,11 +100,11 @@ * Configured state. */ uint8_t ControlInterfaceNumber; /**< Interface index of the CDC-ACM control interface within the attached device. */ - + uint16_t DataINPipeSize; /**< Size in bytes of the CDC interface's IN data pipe. */ uint16_t DataOUTPipeSize; /**< Size in bytes of the CDC interface's OUT data pipe. */ uint16_t NotificationPipeSize; /**< Size in bytes of the CDC interface's IN notification pipe, if used. */ - + struct { uint8_t HostToDevice; /**< Control line states from the host to device, as a set of CDC_CONTROL_LINE_OUT_* @@ -115,7 +115,7 @@ * masks. This value is updated each time \ref CDC_Host_USBTask() is called. */ } ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */ - + struct { uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second. */ @@ -136,7 +136,7 @@ * the interface is enumerated. */ } USB_ClassInfo_CDC_Host_t; - + /* Enums: */ /** Enum for the possible error codes returned by the \ref CDC_Host_ConfigurePipes() function. */ enum CDC_Host_EnumerationFailure_ErrorCodes_t @@ -145,7 +145,7 @@ CDC_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ CDC_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor. */ }; - + /* Function Prototypes: */ /** General management task for a given CDC host class interface, required for the correct operation of the interface. This should * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). @@ -153,7 +153,7 @@ * \param[in,out] CDCInterfaceInfo Pointer to a structure containing an CDC Class host configuration and state. */ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Host interface configuration routine, to configure a given CDC host interface instance using the Configuration * Descriptor read from an attached USB device. This function automatically updates the given CDC Host instance's * state values and configures the pipes required to communicate with the interface if it is found within the device. @@ -173,7 +173,7 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, uint16_t ConfigDescriptorSize, void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); - + /** Sets the line encoding for the attached device's virtual serial port. This should be called when the LineEncoding * values of the interface have been changed to push the new settings to the USB device. * @@ -193,7 +193,7 @@ * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. */ uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Sends a Send Break request to the device. This is generally used to separate data data or to indicate a special condition * to the receiving device. * @@ -204,10 +204,10 @@ */ uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1); - + /** Sends a given string to the attached USB device, if connected. If a device is not connected when the function is called, the * string is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the - * \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be + * \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be * packed into a single pipe packet, increasing data throughput. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -222,10 +222,10 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const char* const Data, const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); - + /** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the * byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the - * \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be + * \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be * packed into a single pipe packet, increasing data throughput. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -265,7 +265,7 @@ * \return Next received byte from the device, or a negative value if no data received. */ int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -335,7 +335,7 @@ static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); #endif #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -344,3 +344,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c index ce1ceb1ca..e5afca06c 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.c +++ b/LUFA/Drivers/USB/Class/Host/HID.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -44,9 +44,9 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL; USB_HID_Descriptor_HID_t* HIDDescriptor = NULL; - + memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State)); - + if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) return HID_ENUMERROR_InvalidConfigDescriptor; @@ -58,7 +58,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo { if (DataINEndpoint || DataOUTEndpoint) break; - + do { if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, @@ -66,11 +66,11 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo { return HID_ENUMERROR_NoCompatibleInterfaceFound; } - + HIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); } while (HIDInterfaceInfo->Config.HIDInterfaceProtocol && (HIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol)); - + if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, DCOMP_HID_Host_NextHID) != DESCRIPTOR_SEARCH_COMP_Found) { @@ -84,15 +84,15 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) DataINEndpoint = EndpointData; else - DataOUTEndpoint = EndpointData; + DataOUTEndpoint = EndpointData; } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == HIDInterfaceInfo->Config.DataINPipeNumber) @@ -101,7 +101,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, HIDInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); - + HIDInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == HIDInterfaceInfo->Config.DataOUTPipeNumber) @@ -115,13 +115,13 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo HIDInterfaceInfo->State.DeviceUsesOUTPipe = true; } } - + HIDInterfaceInfo->State.InterfaceNumber = HIDInterface->InterfaceNumber; HIDInterfaceInfo->State.HIDReportSize = HIDDescriptor->HIDReportLength; HIDInterfaceInfo->State.SupportsBootProtocol = (HIDInterface->SubClass != HID_BOOTP_NonBootProtocol); HIDInterfaceInfo->State.LargestReportSize = 8; HIDInterfaceInfo->State.IsActive = true; - + return HID_ENUMERROR_NoError; } @@ -131,11 +131,11 @@ static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor) { USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); - + if (CurrentInterface->Class == HID_INTERFACE_CLASS) return DESCRIPTOR_SEARCH_Found; } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -154,7 +154,7 @@ static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescri if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, - USB_Descriptor_Endpoint_t); + USB_Descriptor_Endpoint_t); if (!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress))) return DESCRIPTOR_SEARCH_Found; @@ -182,11 +182,11 @@ uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceI }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + return USB_Host_SendControlRequest(Buffer); } #endif - + uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, void* Buffer) { @@ -197,7 +197,7 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + uint16_t ReportSize; uint8_t* BufferPos = Buffer; @@ -205,13 +205,13 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, if (!(HIDInterfaceInfo->State.UsingBootProtocol)) { uint8_t ReportID = 0; - + if (HIDInterfaceInfo->Config.HIDParserData->UsingReportIDs) { ReportID = Pipe_Read_Byte(); *(BufferPos++) = ReportID; } - + ReportSize = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, HID_REPORT_ITEM_In); } else @@ -222,10 +222,10 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, if ((ErrorCode = Pipe_Read_Stream_LE(BufferPos, ReportSize, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + Pipe_ClearIN(); Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } @@ -244,19 +244,19 @@ uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo if (HIDInterfaceInfo->State.DeviceUsesOUTPipe && (ReportType == HID_REPORT_ITEM_Out)) { uint8_t ErrorCode; - + Pipe_SelectPipe(HIDInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if (ReportID) Pipe_Write_Stream_LE(&ReportID, sizeof(ReportID), NO_STREAM_CALLBACK); - + if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, ReportSize, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + Pipe_ClearOUT(); Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } else @@ -276,7 +276,7 @@ uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + return USB_Host_SendControlRequest(Buffer); } } @@ -290,11 +290,11 @@ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + ReportReceived = Pipe_IsINReceived(); - + Pipe_Freeze(); - + return ReportReceived; } @@ -312,7 +312,7 @@ uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInf }; Pipe_SelectPipe(PIPE_CONTROLPIPE); - + if (!(HIDInterfaceInfo->State.SupportsBootProtocol)) return HID_ERROR_LOGICAL; @@ -321,7 +321,7 @@ uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInf HIDInterfaceInfo->State.LargestReportSize = 8; HIDInterfaceInfo->State.UsingBootProtocol = true; - + return HOST_SENDCONTROL_Successful; } @@ -331,7 +331,7 @@ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceI uint8_t ErrorCode; uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize]; - + USB_ControlRequest = (USB_Request_Header_t) { .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE), @@ -345,7 +345,7 @@ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceI if ((ErrorCode = USB_Host_SendControlRequest(HIDReportData)) != HOST_SENDCONTROL_Successful) return ErrorCode; - + if (HIDInterfaceInfo->State.UsingBootProtocol) { USB_ControlRequest = (USB_Request_Header_t) @@ -362,10 +362,10 @@ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceI HIDInterfaceInfo->State.UsingBootProtocol = false; } - + if (HIDInterfaceInfo->Config.HIDParserData == NULL) return HID_ERROR_LOGICAL; - + if ((ErrorCode = USB_ProcessHIDReport(HIDReportData, HIDInterfaceInfo->State.HIDReportSize, HIDInterfaceInfo->Config.HIDParserData)) != HID_PARSE_Successful) { @@ -380,3 +380,4 @@ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceI #endif #endif + diff --git a/LUFA/Drivers/USB/Class/Host/HID.h b/LUFA/Drivers/USB/Class/Host/HID.h index eca94fbd8..0ef3674d8 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.h +++ b/LUFA/Drivers/USB/Class/Host/HID.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -58,7 +58,7 @@ #include "../../USB.h" #include "../Common/HID.h" #include "HIDParser.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -73,7 +73,7 @@ /* Macros: */ /** Error code for some HID Host functions, indicating a logical (and not hardware) error. */ #define HID_ERROR_LOGICAL 0x80 - + /* Type Defines: */ /** \brief HID Class Host Mode Configuration and State Structure. * @@ -116,7 +116,7 @@ uint16_t DataINPipeSize; /**< Size in bytes of the HID interface's IN data pipe. */ uint16_t DataOUTPipeSize; /**< Size in bytes of the HID interface's OUT data pipe. */ - + bool SupportsBootProtocol; /**< Indicates if the current interface instance supports the HID Boot * Protocol when enabled via \ref HID_Host_SetBootProtocol(). */ @@ -125,7 +125,7 @@ */ bool UsingBootProtocol; /**< Indicates that the interface is currently initialized in Boot Protocol mode */ uint16_t HIDReportSize; /**< Size in bytes of the HID report descriptor in the device. */ - + uint8_t LargestReportSize; /**< Largest report the device will send, in bytes. */ } State; /**< State data for the USB class interface within the device. All elements in this section * <b>may</b> be set to initial values, but may also be ignored to default to sane values when @@ -141,7 +141,7 @@ HID_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ HID_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor. */ }; - + /* Function Prototypes: */ /** Host interface configuration routine, to configure a given HID host interface instance using the Configuration * Descriptor read from an attached USB device. This function automatically updates the given HID Host instance's @@ -169,7 +169,7 @@ /** Receives a HID IN report from the attached HID device, when a report has been received on the HID IN Data pipe. - * + * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the * call will fail. * @@ -202,7 +202,7 @@ const uint8_t ReportID, void* Buffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); #endif - + /** Sends an OUT or FEATURE report to the currently attached HID device, using the device's OUT pipe if available, * or the device's Control pipe if not. * @@ -244,7 +244,7 @@ * \return Boolean true if a report has been received, false otherwise. */ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Switches the attached HID device's reporting protocol over to the Boot Report protocol mode, on supported devices. * * \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method must still be called @@ -276,7 +276,7 @@ */ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); #endif - + /* Inline Functions: */ /** General management task for a given Human Interface Class host class interface, required for the correct operation of * the interface. This should be called frequently in the main program loop, before the master USB management task @@ -288,7 +288,7 @@ static inline void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) { (void)HIDInterfaceInfo; - } + } /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) @@ -300,9 +300,9 @@ static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_HID_Host_NextHID(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); - #endif - #endif - + #endif + #endif + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -311,3 +311,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c index c5d5f948a..43f703a93 100644 --- a/LUFA/Drivers/USB/Class/Host/HIDParser.c +++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -41,7 +41,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH]; HID_StateTable_t* CurrStateTable = &StateTable[0]; HID_CollectionPath_t* CurrCollectionPath = NULL; - HID_ReportSizeInfo_t* CurrReportIDInfo = &ParserData->ReportIDSizes[0]; + HID_ReportSizeInfo_t* CurrReportIDInfo = &ParserData->ReportIDSizes[0]; uint16_t UsageList[HID_USAGE_STACK_DEPTH]; uint8_t UsageListSize = 0; HID_MinMax_t UsageMinMax = {0, 0}; @@ -50,16 +50,16 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, memset(CurrStateTable, 0x00, sizeof(HID_StateTable_t)); memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t)); - ParserData->TotalDeviceReports = 1; + ParserData->TotalDeviceReports = 1; while (ReportSize) { uint8_t HIDReportItem = *ReportData; uint32_t ReportItemData = 0; - + ReportData++; ReportSize--; - + switch (HIDReportItem & DATA_SIZE_MASK) { case DATA_SIZE_4: @@ -84,7 +84,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, case (TYPE_GLOBAL | TAG_GLOBAL_PUSH): if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1]) return HID_PARSE_HIDStackOverflow; - + memcpy((CurrStateTable + 1), CurrStateTable, sizeof(HID_ReportItem_t)); @@ -94,7 +94,7 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, case (TYPE_GLOBAL | TAG_GLOBAL_POP): if (CurrStateTable == &StateTable[0]) return HID_PARSE_HIDStackUnderflow; - + CurrStateTable--; break; case (TYPE_GLOBAL | TAG_GLOBAL_USAGEPAGE): @@ -139,25 +139,25 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, break; } } - + if (CurrReportIDInfo == NULL) { if (ParserData->TotalDeviceReports == HID_MAX_REPORT_IDS) return HID_PARSE_InsufficientReportIDItems; - + CurrReportIDInfo = &ParserData->ReportIDSizes[ParserData->TotalDeviceReports++]; memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t)); } } - + ParserData->UsingReportIDs = true; - + CurrReportIDInfo->ReportID = CurrStateTable->ReportID; break; case (TYPE_LOCAL | TAG_LOCAL_USAGE): if (UsageListSize == HID_USAGE_STACK_DEPTH) return HID_PARSE_UsageListOverflow; - + UsageList[UsageListSize++] = ReportItemData; break; case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN): @@ -174,42 +174,42 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, else { HID_CollectionPath_t* ParentCollectionPath = CurrCollectionPath; - + CurrCollectionPath = &ParserData->CollectionPaths[1]; - + while (CurrCollectionPath->Parent != NULL) { if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS - 1]) return HID_PARSE_InsufficientCollectionPaths; - + CurrCollectionPath++; } - + CurrCollectionPath->Parent = ParentCollectionPath; } - + CurrCollectionPath->Type = ReportItemData; CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page; - + if (UsageListSize) { CurrCollectionPath->Usage.Usage = UsageList[0]; for (uint8_t i = 0; i < UsageListSize; i++) UsageList[i] = UsageList[i + 1]; - + UsageListSize--; } else if (UsageMinMax.Minimum <= UsageMinMax.Maximum) { CurrCollectionPath->Usage.Usage = UsageMinMax.Minimum++; } - + break; case (TYPE_MAIN | TAG_MAIN_ENDCOLLECTION): if (CurrCollectionPath == NULL) return HID_PARSE_UnexpectedEndCollection; - + CurrCollectionPath = CurrCollectionPath->Parent; break; case (TYPE_MAIN | TAG_MAIN_INPUT): @@ -218,60 +218,60 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, for (uint8_t ReportItemNum = 0; ReportItemNum < CurrStateTable->ReportCount; ReportItemNum++) { HID_ReportItem_t NewReportItem; - + memcpy(&NewReportItem.Attributes, &CurrStateTable->Attributes, sizeof(HID_ReportItem_Attributes_t)); - + NewReportItem.ItemFlags = ReportItemData; NewReportItem.CollectionPath = CurrCollectionPath; NewReportItem.ReportID = CurrStateTable->ReportID; - + if (UsageListSize) { NewReportItem.Attributes.Usage.Usage = UsageList[0]; - + for (uint8_t i = 0; i < UsageListSize; i++) UsageList[i] = UsageList[i + 1]; - + UsageListSize--; } else if (UsageMinMax.Minimum <= UsageMinMax.Maximum) { NewReportItem.Attributes.Usage.Usage = UsageMinMax.Minimum++; } - + uint8_t ItemTag = (HIDReportItem & TAG_MASK); - + if (ItemTag == TAG_MAIN_INPUT) NewReportItem.ItemType = HID_REPORT_ITEM_In; else if (ItemTag == TAG_MAIN_OUTPUT) NewReportItem.ItemType = HID_REPORT_ITEM_Out; else NewReportItem.ItemType = HID_REPORT_ITEM_Feature; - + NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]; - + CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize; - + if (ParserData->LargestReportSizeBits < NewReportItem.BitOffset) ParserData->LargestReportSizeBits = NewReportItem.BitOffset; - + if (!(ReportItemData & IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem)) { if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS) return HID_PARSE_InsufficientReportItems; - + memcpy(&ParserData->ReportItems[ParserData->TotalReportItems], &NewReportItem, sizeof(HID_ReportItem_t)); - + ParserData->TotalReportItems++; } } - + break; } - + if ((HIDReportItem & TYPE_MASK) == TYPE_MAIN) { UsageMinMax.Minimum = 0; @@ -279,10 +279,10 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, UsageListSize = 0; } } - + if (!(ParserData->TotalReportItems)) return HID_PARSE_NoUnfilteredReportItems; - + return HID_PARSE_Successful; } @@ -292,27 +292,27 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData, uint16_t DataBitsRem = ReportItem->Attributes.BitSize; uint16_t CurrentBit = ReportItem->BitOffset; uint32_t BitMask = (1 << 0); - + if (ReportItem->ReportID) { if (ReportItem->ReportID != ReportData[0]) return false; - + ReportData++; } - + ReportItem->PreviousValue = ReportItem->Value; ReportItem->Value = 0; - + while (DataBitsRem--) { if (ReportData[CurrentBit / 8] & (1 << (CurrentBit % 8))) ReportItem->Value |= BitMask; - + CurrentBit++; BitMask <<= 1; } - + return true; } @@ -322,20 +322,20 @@ void USB_SetHIDReportItemInfo(uint8_t* ReportData, uint16_t DataBitsRem = ReportItem->Attributes.BitSize; uint16_t CurrentBit = ReportItem->BitOffset; uint32_t BitMask = (1 << 0); - + if (ReportItem->ReportID) { ReportData[0] = ReportItem->ReportID; ReportData++; } - + ReportItem->PreviousValue = ReportItem->Value; - + while (DataBitsRem--) { if (ReportItem->Value & (1 << (CurrentBit % 8))) ReportData[CurrentBit / 8] |= BitMask; - + CurrentBit++; BitMask <<= 1; } @@ -348,7 +348,7 @@ uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, for (uint8_t i = 0; i < HID_MAX_REPORT_IDS; i++) { uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType]; - + if (ParserData->ReportIDSizes[i].ReportID == ReportID) return ((ReportSizeBits >> 3) + ((ReportSizeBits & 0x07) ? 1 : 0)); } @@ -357,3 +357,4 @@ uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h index f772fed20..ba7346968 100644 --- a/LUFA/Drivers/USB/Class/Host/HIDParser.h +++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -35,7 +35,7 @@ * a HID device transmits to the host. It also provides an easy API for extracting and processing the data * elements inside a HID report sent from an attached HID device. */ - + /** \ingroup Group_USB * @defgroup Group_HIDParser HID Report Parser * @@ -86,7 +86,7 @@ */ #define HID_STATETABLE_STACK_DEPTH 2 #endif - + #if !defined(HID_USAGE_STACK_DEPTH) || defined(__DOXYGEN__) /** Constant indicating the maximum stack depth of the usage table. A larger usage table * allows for more USAGE items to be indicated sequentially for REPORT COUNT entries of more than @@ -107,17 +107,17 @@ */ #define HID_MAX_COLLECTIONS 10 #endif - + #if !defined(HID_MAX_REPORTITEMS) || defined(__DOXYGEN__) - /** Constant indicating the maximum number of report items (IN, OUT or FEATURE) that can be processed + /** Constant indicating the maximum number of report items (IN, OUT or FEATURE) that can be processed * in the report item descriptor and stored in the user HID Report Info structure. A large value allows - * for more report items to be stored, but consumes more memory. By default this is set to 20 items, + * for more report items to be stored, but consumes more memory. By default this is set to 20 items, * but this can be overridden by defining HID_MAX_REPORTITEMS to another value in the user project * makefile, and passing the define to the compiler using the -D compiler switch. */ #define HID_MAX_REPORTITEMS 20 #endif - + #if !defined(HID_MAX_REPORT_IDS) || defined(__DOXYGEN__) /** Constant indicating the maximum number of unique report IDs that can be processed in the report item * descriptor for the report size information array in the user HID Report Info structure. A large value @@ -141,12 +141,12 @@ #define HID_ALIGN_DATA(ReportItem, Type) ((Type)(ReportItem->Value << ((8 * sizeof(Type)) - ReportItem->Attributes.BitSize))) /* Public Interface - May be used in end-application: */ - /* Enums: */ + /* Enums: */ /** Enum for the possible error codes in the return value of the \ref USB_ProcessHIDReport() function. */ enum HID_Parse_ErrorCodes_t { HID_PARSE_Successful = 0, /**< Successful parse of the HID report descriptor, no error. */ - HID_PARSE_HIDStackOverflow = 1, /**< More than \ref HID_STATETABLE_STACK_DEPTH nested PUSHes in the report. */ + HID_PARSE_HIDStackOverflow = 1, /**< More than \ref HID_STATETABLE_STACK_DEPTH nested PUSHes in the report. */ HID_PARSE_HIDStackUnderflow = 2, /**< A POP was found when the state table stack was empty. */ HID_PARSE_InsufficientReportItems = 3, /**< More than \ref HID_MAX_REPORTITEMS report items in the report. */ HID_PARSE_UnexpectedEndCollection = 4, /**< An END COLLECTION item found without matching COLLECTION item. */ @@ -155,8 +155,8 @@ HID_PARSE_InsufficientReportIDItems = 7, /**< More than \ref HID_MAX_REPORT_IDS report IDs in the device. */ HID_PARSE_NoUnfilteredReportItems = 8, /**< All report items from the device were filtered by the filtering callback routine. */ }; - - /* Type Defines: */ + + /* Type Defines: */ /** \brief HID Parser Report Item Min/Max Structure. * * Type define for an attribute with both minimum and maximum values (e.g. Logical Min/Max). @@ -176,7 +176,7 @@ uint32_t Type; /**< Unit type (refer to HID specifications for details). */ uint8_t Exponent; /**< Unit exponent (refer to HID specifications for details). */ } HID_Unit_t; - + /** \brief HID Parser Report Item Usage Structure. * * Type define for the Usage attributes of a report item. @@ -206,13 +206,13 @@ typedef struct { uint8_t BitSize; /**< Size in bits of the report item's data. */ - + HID_Usage_t Usage; /**< Usage of the report item. */ HID_Unit_t Unit; /**< Unit type and exponent of the report item. */ HID_MinMax_t Logical; /**< Logical minimum and maximum of the report item. */ HID_MinMax_t Physical; /**< Physical minimum and maximum of the report item. */ } HID_ReportItem_Attributes_t; - + /** \brief HID Parser Report Item Details Structure. * * Type define for a report item (IN, OUT or FEATURE) layout attributes and other details. @@ -226,13 +226,13 @@ HID_CollectionPath_t* CollectionPath; /**< Collection path of the item. */ HID_ReportItem_Attributes_t Attributes; /**< Report item attributes. */ - + uint32_t Value; /**< Current value of the report item - use \ref HID_ALIGN_DATA() when processing * a retrieved value so that it is aligned to a specific type. */ - uint32_t PreviousValue; /**< Previous value of the report item. */ + uint32_t PreviousValue; /**< Previous value of the report item. */ } HID_ReportItem_t; - + /** \brief HID Parser Report Size Structure. * * Type define for a report item size information structure, to retain the size of a device's reports by ID. @@ -267,7 +267,7 @@ * element in its HID report descriptor. */ } HID_ReportInfo_t; - + /* Function Prototypes: */ /** Function to process a given HID report returned from an attached device, and store it into a given * \ref HID_ReportInfo_t structure. @@ -285,7 +285,7 @@ /** Extracts the given report item's value out of the given HID report and places it into the Value * member of the report item's \ref HID_ReportItem_t structure. * - * When called on a report with an item that exists in that report, this copies the report item's Value + * When called on a report with an item that exists in that report, this copies the report item's Value * to it's PreviousValue element for easy checking to see if an item's value has changed before processing * a report. If the given item does not exist in the report, the function does not modify the report item's * data. @@ -348,7 +348,7 @@ uint8_t ReportID; } HID_StateTable_t; #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -357,3 +357,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/HIDReportData.h b/LUFA/Drivers/USB/Class/Host/HIDReportData.h index dca1ebb3a..848bfb5d4 100644 --- a/LUFA/Drivers/USB/Class/Host/HIDReportData.h +++ b/LUFA/Drivers/USB/Class/Host/HIDReportData.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -42,7 +42,7 @@ * * @{ */ - + #ifndef __HIDREPORTDATA_H__ #define __HIDREPORTDATA_H__ @@ -107,11 +107,11 @@ #define DATA_SIZE_1 0x01 #define DATA_SIZE_2 0x02 #define DATA_SIZE_4 0x03 - + #define TYPE_MAIN 0x00 #define TYPE_GLOBAL 0x04 #define TYPE_LOCAL 0x08 - + #define TAG_MAIN_INPUT 0x80 #define TAG_MAIN_OUTPUT 0x90 #define TAG_MAIN_COLLECTION 0xA0 @@ -130,12 +130,13 @@ #define TAG_GLOBAL_REPORTCOUNT 0x90 #define TAG_GLOBAL_PUSH 0xA0 #define TAG_GLOBAL_POP 0xB0 - + #define TAG_LOCAL_USAGE 0x00 #define TAG_LOCAL_USAGEMIN 0x10 #define TAG_LOCAL_USAGEMAX 0x20 #endif /** @} */ - + #endif + diff --git a/LUFA/Drivers/USB/Class/Host/MIDI.c b/LUFA/Drivers/USB/Class/Host/MIDI.c index cf59193c2..99ae8a8ab 100644 --- a/LUFA/Drivers/USB/Class/Host/MIDI.c +++ b/LUFA/Drivers/USB/Class/Host/MIDI.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -68,7 +68,7 @@ uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceI continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) @@ -76,7 +76,7 @@ uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceI else DataOUTEndpoint = EndpointData; } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == MIDIInterfaceInfo->Config.DataINPipeNumber) @@ -84,16 +84,16 @@ uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceI Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, MIDIInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - MIDIInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; + + MIDIInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == MIDIInterfaceInfo->Config.DataOUTPipeNumber) { Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, MIDIInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - MIDIInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; + + MIDIInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } } @@ -117,7 +117,7 @@ static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDes return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -127,9 +127,9 @@ static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const Current { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); - + uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); - + if ((EndpointType == EP_TYPE_BULK) && !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress))) return DESCRIPTOR_SEARCH_Found; } @@ -145,7 +145,7 @@ uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) { if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) return PIPE_RWSTREAM_DeviceDisconnected; - + uint8_t ErrorCode; Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipeNumber); @@ -166,7 +166,7 @@ uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface { if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) return HOST_SENDCONTROL_DeviceDisconnected; - + Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipeNumber); if (Pipe_IsReadWriteAllowed()) @@ -179,7 +179,7 @@ uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface if (!(Pipe_IsReadWriteAllowed())) Pipe_ClearOUT(); } - + return PIPE_RWSTREAM_NoError; } @@ -188,7 +188,7 @@ bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface { if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) return HOST_SENDCONTROL_DeviceDisconnected; - + Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataINPipeNumber); if (!(Pipe_IsReadWriteAllowed())) @@ -198,8 +198,9 @@ bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface if (!(Pipe_IsReadWriteAllowed())) Pipe_ClearIN(); - + return true; } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/MIDI.h b/LUFA/Drivers/USB/Class/Host/MIDI.h index 4aa6eb8e5..e77487db4 100644 --- a/LUFA/Drivers/USB/Class/Host/MIDI.h +++ b/LUFA/Drivers/USB/Class/Host/MIDI.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -56,7 +56,7 @@ /* Includes: */ #include "../../USB.h" #include "../Common/MIDI.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -66,7 +66,7 @@ #if !defined(__INCLUDE_FROM_MIDI_DRIVER) #error Do not include this file directly. Include LUFA/Drivers/Class/MIDI.h instead. #endif - + /* Public Interface - May be used in end-application: */ /* Type Defines: */ /** \brief MIDI Class Host Mode Configuration and State Structure. @@ -81,7 +81,7 @@ { uint8_t DataINPipeNumber; /**< Pipe number of the MIDI interface's streaming IN data pipe. */ bool DataINPipeDoubleBank; /**< Indicates if the MIDI interface's IN data pipe should use double banking. */ - + uint8_t DataOUTPipeNumber; /**< Pipe number of the MIDI interface's streaming OUT data pipe. */ bool DataOUTPipeDoubleBank; /**< Indicates if the MIDI interface's OUT data pipe should use double banking. */ } Config; /**< Config data for the USB class interface within the device. All elements in this section @@ -102,7 +102,7 @@ * the interface is enumerated. */ } USB_ClassInfo_MIDI_Host_t; - + /* Enums: */ /** Enum for the possible error codes returned by the \ref MIDI_Host_ConfigurePipes() function. */ enum MIDI_Host_EnumerationFailure_ErrorCodes_t @@ -111,7 +111,7 @@ MIDI_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ MIDI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible MIDI interface was not found in the device's Configuration Descriptor. */ }; - + /* Function Prototypes: */ /** Host interface configuration routine, to configure a given MIDI host interface instance using the Configuration * Descriptor read from an attached USB device. This function automatically updates the given MIDI Host instance's @@ -156,7 +156,7 @@ * \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. */ uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Receives a MIDI event packet from the device. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -193,9 +193,9 @@ #if defined(__INCLUDE_FROM_MIDI_CLASS_HOST_C) static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); - #endif + #endif #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -204,3 +204,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.c b/LUFA/Drivers/USB/Class/Host/MassStorage.c index 2d7956e9f..26d096b4f 100644 --- a/LUFA/Drivers/USB/Class/Host/MassStorage.c +++ b/LUFA/Drivers/USB/Class/Host/MassStorage.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -68,7 +68,7 @@ uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) @@ -76,7 +76,7 @@ uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, else DataOUTEndpoint = EndpointData; } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == MSInterfaceInfo->Config.DataINPipeNumber) @@ -84,16 +84,16 @@ uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, MSInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - MSInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; + + MSInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == MSInterfaceInfo->Config.DataOUTPipeNumber) { Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, MSInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - MSInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; + + MSInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } } @@ -117,7 +117,7 @@ static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor) return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -174,7 +174,7 @@ static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInf Pipe_Freeze(); return ErrorCode; } - + return ErrorCode; } @@ -189,7 +189,7 @@ static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInte while (!(Pipe_IsINReceived())) { uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); - + if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; @@ -197,7 +197,7 @@ static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInte if (!(TimeoutMSRem--)) return PIPE_RWSTREAM_Timeout; } - + Pipe_Freeze(); Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); @@ -208,7 +208,7 @@ static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInte return PIPE_RWSTREAM_PipeStalled; } - + Pipe_Freeze(); Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); @@ -219,14 +219,14 @@ static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInte return PIPE_RWSTREAM_PipeStalled; } - + if (USB_HostState == HOST_STATE_Unattached) return PIPE_RWSTREAM_DeviceDisconnected; }; - + Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipeNumber); Pipe_Freeze(); - + Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Freeze(); @@ -250,7 +250,7 @@ static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfac Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -265,7 +265,7 @@ static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfac return ErrorCode; Pipe_ClearOUT(); - + while (!(Pipe_IsOUTReady())) { if (USB_HostState == HOST_STATE_Unattached) @@ -288,19 +288,19 @@ static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterf Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t), NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) { return ErrorCode; } - + Pipe_ClearIN(); Pipe_Freeze(); - + if (SCSICommandStatus->Status != MS_SCSI_COMMAND_Pass) ErrorCode = MS_ERROR_LOGICAL_CMD_FAILED; - + return ErrorCode; } @@ -314,7 +314,7 @@ uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) .wIndex = MSInterfaceInfo->State.InterfaceNumber, .wLength = 0, }; - + Pipe_SelectPipe(PIPE_CONTROLPIPE); return USB_Host_SendControlRequest(NULL); @@ -333,7 +333,7 @@ uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, .wIndex = MSInterfaceInfo->State.InterfaceNumber, .wLength = 1, }; - + Pipe_SelectPipe(PIPE_CONTROLPIPE); if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) != HOST_SENDCONTROL_Successful) @@ -341,7 +341,7 @@ uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, *MaxLUNIndex = 0; ErrorCode = HOST_SENDCONTROL_Successful; } - + return ErrorCode; } @@ -351,7 +351,7 @@ uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, { if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) return HOST_SENDCONTROL_DeviceDisconnected; - + uint8_t ErrorCode; MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) @@ -370,12 +370,12 @@ uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, 0x00 // Unused (control) } }; - + MS_CommandStatusWrapper_t SCSICommandStatus; if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, InquiryData)) != PIPE_RWSTREAM_NoError) - return ErrorCode; - + return ErrorCode; + if ((ErrorCode = MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSICommandStatus)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -406,12 +406,12 @@ uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, 0x00 // Unused (control) } }; - + MS_CommandStatusWrapper_t SCSICommandStatus; if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError) - return ErrorCode; - + return ErrorCode; + if ((ErrorCode = MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSICommandStatus)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -447,7 +447,7 @@ uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInf 0x00 // Unused (control) } }; - + MS_CommandStatusWrapper_t SCSICommandStatus; if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, DeviceCapacity)) != PIPE_RWSTREAM_NoError) @@ -455,7 +455,7 @@ uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInf SwapEndian_n(&DeviceCapacity->Blocks, sizeof(DeviceCapacity->Blocks)); SwapEndian_n(&DeviceCapacity->BlockSize, sizeof(DeviceCapacity->BlockSize)); - + if ((ErrorCode = MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSICommandStatus)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -487,7 +487,7 @@ uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, 0x00 // Unused (control) } }; - + MS_CommandStatusWrapper_t SCSICommandStatus; if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, SenseData)) != PIPE_RWSTREAM_NoError) @@ -524,12 +524,12 @@ uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInter 0x00 // Unused (control) } }; - + MS_CommandStatusWrapper_t SCSICommandStatus; if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + if ((ErrorCode = MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSICommandStatus)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -617,7 +617,7 @@ uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, BlockBuffer)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + if ((ErrorCode = MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSICommandStatus)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -625,3 +625,4 @@ uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.h b/LUFA/Drivers/USB/Class/Host/MassStorage.h index 4feac0e7b..f442db846 100644 --- a/LUFA/Drivers/USB/Class/Host/MassStorage.h +++ b/LUFA/Drivers/USB/Class/Host/MassStorage.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -56,7 +56,7 @@ /* Includes: */ #include "../../USB.h" #include "../Common/MassStorage.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -71,7 +71,7 @@ /* Macros: */ /** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error. */ #define MS_ERROR_LOGICAL_CMD_FAILED 0x80 - + /* Type Defines: */ /** \brief Mass Storage Class Host Mode Configuration and State Structure. * @@ -101,14 +101,14 @@ uint16_t DataINPipeSize; /**< Size in bytes of the Mass Storage interface's IN data pipe. */ uint16_t DataOUTPipeSize; /**< Size in bytes of the Mass Storage interface's OUT data pipe. */ - + uint32_t TransactionTag; /**< Current transaction tag for data synchronizing of packets. */ } State; /**< State data for the USB class interface within the device. All elements in this section * <b>may</b> be set to initial values, but may also be ignored to default to sane values when * the interface is enumerated. */ } USB_ClassInfo_MS_Host_t; - + /** \brief SCSI Device LUN Capacity Structure. * * SCSI capacity structure, to hold the total capacity of the device in both the number @@ -128,7 +128,7 @@ MS_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ MS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor. */ }; - + /* Function Prototypes: */ /** Host interface configuration routine, to configure a given Mass Storage host interface instance using the * Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass @@ -217,7 +217,7 @@ const uint8_t LUNIndex, SCSI_Capacity_t* const DeviceCapacity) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); - + /** Retrieves the device sense data, indicating the current device state and error codes for the previously * issued command. * @@ -234,7 +234,7 @@ const uint8_t LUNIndex, SCSI_Request_Sense_Response_t* const SenseData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); - + /** Issues a PREVENT MEDIUM REMOVAL command, to logically (or, depending on the type of device, physically) lock * the device from removal so that blocks of data on the medium can be read or altered. * @@ -250,7 +250,7 @@ uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, const uint8_t LUNIndex, const bool PreventRemoval) ATTR_NON_NULL_PTR_ARG(1); - + /** Reads blocks of data from the attached Mass Storage device's medium. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -271,7 +271,7 @@ const uint8_t Blocks, const uint16_t BlockSize, void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6); - + /** Writes blocks of data to the attached Mass Storage device's medium. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -318,22 +318,22 @@ #define CBW_SIGNATURE 0x43425355UL #define CSW_SIGNATURE 0x53425355UL - + #define COMMAND_DIRECTION_DATA_OUT (0 << 7) #define COMMAND_DIRECTION_DATA_IN (1 << 7) - + #define COMMAND_DATA_TIMEOUT_MS 10000 - + /* Function Prototypes: */ - #if defined(__INCLUDE_FROM_MS_CLASS_HOST_C) + #if defined(__INCLUDE_FROM_MS_CLASS_HOST_C) static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); - + static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, MS_CommandBlockWrapper_t* const SCSICommandBlock, const void* const BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, + static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, MS_CommandBlockWrapper_t* const SCSICommandBlock, void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, @@ -341,7 +341,7 @@ ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); #endif #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -350,3 +350,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/Printer.c b/LUFA/Drivers/USB/Class/Host/Printer.c index 2c9a4eb8b..6cbd892dc 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.c +++ b/LUFA/Drivers/USB/Class/Host/Printer.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -48,7 +48,7 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI if (DESCRIPTOR_TYPE(DeviceConfigDescriptor) != DTYPE_Configuration) return PRNT_ENUMERROR_InvalidConfigDescriptor; - + while (!(DataINEndpoint) || !(DataOUTEndpoint)) { if (!(PrinterInterface) || @@ -60,15 +60,15 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI { return PRNT_ENUMERROR_NoCompatibleInterfaceFound; } - - PrinterInterface = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Interface_t); + + PrinterInterface = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Interface_t); DataINEndpoint = NULL; DataOUTEndpoint = NULL; continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(DeviceConfigDescriptor, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) @@ -76,7 +76,7 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI else DataOUTEndpoint = EndpointData; } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == PRNTInterfaceInfo->Config.DataINPipeNumber) @@ -84,16 +84,16 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PRNTInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - PRNTInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; + + PRNTInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == PRNTInterfaceInfo->Config.DataOUTPipeNumber) { Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PRNTInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - - PRNTInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; + + PRNTInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } } @@ -118,7 +118,7 @@ static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* CurrentDescriptor) return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -150,7 +150,7 @@ uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInte if (PRNTInterfaceInfo->State.AlternateSetting) { uint8_t ErrorCode; - + USB_ControlRequest = (USB_Request_Header_t) { .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE), @@ -159,13 +159,13 @@ uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInte .wIndex = PRNTInterfaceInfo->State.InterfaceNumber, .wLength = 0, }; - + Pipe_SelectPipe(PIPE_CONTROLPIPE); - + if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) return ErrorCode; } - + return HOST_SENDCONTROL_Successful; } @@ -206,12 +206,12 @@ uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) { if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) return PIPE_READYWAIT_DeviceDisconnected; - + uint8_t ErrorCode; - Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber); + Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if (!(Pipe_BytesInPipe())) return PIPE_READYWAIT_NoError; @@ -228,7 +228,7 @@ uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) } Pipe_Freeze(); - + return PIPE_READYWAIT_NoError; } @@ -237,12 +237,12 @@ uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, { if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) return PIPE_READYWAIT_DeviceDisconnected; - + uint8_t ErrorCode; - Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber); + Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if (!(Pipe_IsReadWriteAllowed())) { Pipe_ClearOUT(); @@ -251,9 +251,9 @@ uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, return ErrorCode; } - Pipe_Write_Byte(Data); + Pipe_Write_Byte(Data); Pipe_Freeze(); - + return PIPE_READYWAIT_NoError; } @@ -268,14 +268,14 @@ uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; Pipe_ClearOUT(); - + ErrorCode = Pipe_WaitUntilReady(); - + Pipe_Freeze(); return ErrorCode; @@ -285,7 +285,7 @@ uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI { if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) return 0; - + Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); @@ -306,7 +306,7 @@ uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI else { Pipe_Freeze(); - + return 0; } } @@ -329,7 +329,7 @@ int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo if (!(Pipe_BytesInPipe())) Pipe_ClearIN(); } - + Pipe_Freeze(); return ReceivedByte; @@ -350,33 +350,34 @@ uint8_t PRNT_Host_GetDeviceID(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo .wIndex = PRNTInterfaceInfo->State.InterfaceNumber, .wLength = sizeof(DeviceIDStringLength), }; - + Pipe_SelectPipe(PIPE_CONTROLPIPE); if ((ErrorCode = USB_Host_SendControlRequest(&DeviceIDStringLength)) != HOST_SENDCONTROL_Successful) return ErrorCode; - + if (!(DeviceIDStringLength)) { DeviceIDString[0] = 0x00; return HOST_SENDCONTROL_Successful; } - + DeviceIDStringLength = SwapEndian_16(DeviceIDStringLength); if (DeviceIDStringLength > BufferSize) DeviceIDStringLength = BufferSize; USB_ControlRequest.wLength = DeviceIDStringLength; - + if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful) return ErrorCode; - + memmove(&DeviceIDString[0], &DeviceIDString[2], DeviceIDStringLength - 2); DeviceIDString[DeviceIDStringLength - 2] = 0x00; - + return HOST_SENDCONTROL_Successful; } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/Printer.h b/LUFA/Drivers/USB/Class/Host/Printer.h index b6298daae..96ecd0fd6 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.h +++ b/LUFA/Drivers/USB/Class/Host/Printer.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -56,7 +56,7 @@ /* Includes: */ #include "../../USB.h" #include "../Common/Printer.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -111,7 +111,7 @@ PRNT_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ PRNT_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Printer interface was not found in the device's Configuration Descriptor. */ }; - + /* Function Prototypes: */ /** General management task for a given Printer host class interface, required for the correct operation of * the interface. This should be called frequently in the main program loop, before the master USB management task @@ -140,7 +140,7 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, uint16_t ConfigDescriptorSize, void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); - + /** Configures the printer to enable Bidirectional mode, if it is not already in this mode. This should be called * once the connected device's configuration has been set, to ensure the printer is ready to accept commands. * @@ -149,7 +149,7 @@ * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. */ uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Retrieves the status of the virtual Printer port's inbound status lines. The result can then be masked against the * PRNT_PORTSTATUS_* macros to determine the printer port's status. * @@ -195,12 +195,12 @@ * \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. */ uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, - void* Buffer, + void* Buffer, const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); /** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the * byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the - * \ref PRNT_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be + * \ref PRNT_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be * packed into a single pipe packet, increasing data throughput. * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the @@ -226,8 +226,8 @@ * * \return Total number of buffered bytes received from the device. */ - uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo); - + uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo); + /** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function * returns a negative value. The \ref PRNT_Host_BytesReceived() function may be queried in advance to determine how many bytes * are currently buffered in the Printer interface's data receive pipe. @@ -240,7 +240,7 @@ * \return Next received byte from the device, or a negative value if no data received. */ int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo); - + /** Retrieves the attached printer device's ID string, formatted according to IEEE 1284. This string is sent as a * Unicode string from the device and is automatically converted to an ASCII encoded C string by this function, thus * the maximum reportable string length is two less than the size given (to accommodate the Unicode string length @@ -268,14 +268,14 @@ #define REQ_GetDeviceID 0 #define REQ_GetPortStatus 1 #define REQ_SoftReset 2 - + /* Function Prototypes: */ - #if defined(__INCLUDE_FROM_PRINTER_CLASS_HOST_C) + #if defined(__INCLUDE_FROM_PRINTER_CLASS_HOST_C) static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); #endif #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -284,3 +284,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.c b/LUFA/Drivers/USB/Class/Host/RNDIS.c index 7663b6301..541b7d3d1 100644 --- a/LUFA/Drivers/USB/Class/Host/RNDIS.c +++ b/LUFA/Drivers/USB/Class/Host/RNDIS.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -64,7 +64,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa DCOMP_RNDIS_Host_NextRNDISDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) { return RNDIS_ENUMERROR_NoCompatibleInterfaceFound; - } + } DataINEndpoint = NULL; DataOUTEndpoint = NULL; @@ -76,15 +76,15 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa { return RNDIS_ENUMERROR_NoCompatibleInterfaceFound; } - + RNDISControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); NotificationEndpoint = NULL; } - + continue; } - + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) @@ -99,7 +99,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa DataOUTEndpoint = EndpointData; } } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == RNDISInterfaceInfo->Config.DataINPipeNumber) @@ -141,7 +141,7 @@ static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDes { USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); - + if ((CurrentInterface->Class == RNDIS_CONTROL_CLASS) && (CurrentInterface->SubClass == RNDIS_CONTROL_SUBCLASS) && (CurrentInterface->Protocol == RNDIS_CONTROL_PROTOCOL)) @@ -149,7 +149,7 @@ static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDes return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -159,7 +159,7 @@ static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescri { USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); - + if ((CurrentInterface->Class == RNDIS_DATA_CLASS) && (CurrentInterface->SubClass == RNDIS_DATA_SUBCLASS) && (CurrentInterface->Protocol == RNDIS_DATA_PROTOCOL)) @@ -167,7 +167,7 @@ static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescri return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -177,9 +177,9 @@ static uint8_t DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDe { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); - + uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); - + if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress))) { @@ -223,7 +223,7 @@ static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const R .wIndex = RNDISInterfaceInfo->State.ControlInterfaceNumber, .wLength = Length, }; - + Pipe_SelectPipe(PIPE_CONTROLPIPE); return USB_Host_SendControlRequest(Buffer); } @@ -234,7 +234,7 @@ uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac RNDIS_KeepAlive_Message_t KeepAliveMessage; RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse; - + KeepAliveMessage.MessageType = REMOTE_NDIS_KEEPALIVE_MSG; KeepAliveMessage.MessageLength = sizeof(RNDIS_KeepAlive_Message_t); KeepAliveMessage.RequestId = RNDISInterfaceInfo->State.RequestID++; @@ -244,13 +244,13 @@ uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac { return ErrorCode; } - + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &KeepAliveMessageResponse, sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful) { return ErrorCode; } - + return HOST_SENDCONTROL_Successful; } @@ -268,13 +268,13 @@ uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInter InitMessage.MajorVersion = REMOTE_NDIS_VERSION_MAJOR; InitMessage.MinorVersion = REMOTE_NDIS_VERSION_MINOR; InitMessage.MaxTransferSize = RNDISInterfaceInfo->Config.HostMaxPacketSize; - + if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &InitMessage, sizeof(RNDIS_Initialize_Message_t))) != HOST_SENDCONTROL_Successful) { return ErrorCode; } - + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &InitMessageResponse, sizeof(RNDIS_Initialize_Complete_t))) != HOST_SENDCONTROL_Successful) { @@ -283,9 +283,9 @@ uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInter if (InitMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS) return RNDIS_COMMAND_FAILED; - + RNDISInterfaceInfo->State.DeviceMaxPacketSize = InitMessageResponse.MaxTransferSize; - + return HOST_SENDCONTROL_Successful; } @@ -301,18 +301,18 @@ uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInter RNDIS_Set_Message_t SetMessage; uint8_t ContiguousBuffer[Length]; } SetMessageData; - + RNDIS_Set_Complete_t SetMessageResponse; - + SetMessageData.SetMessage.MessageType = REMOTE_NDIS_SET_MSG; SetMessageData.SetMessage.MessageLength = sizeof(RNDIS_Set_Message_t) + Length; SetMessageData.SetMessage.RequestId = RNDISInterfaceInfo->State.RequestID++; - + SetMessageData.SetMessage.Oid = Oid; SetMessageData.SetMessage.InformationBufferLength = Length; SetMessageData.SetMessage.InformationBufferOffset = (sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t)); SetMessageData.SetMessage.DeviceVcHandle = 0; - + memcpy(&SetMessageData.ContiguousBuffer, Buffer, Length); if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &SetMessageData, @@ -320,7 +320,7 @@ uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInter { return ErrorCode; } - + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &SetMessageResponse, sizeof(RNDIS_Set_Complete_t))) != HOST_SENDCONTROL_Successful) { @@ -329,7 +329,7 @@ uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInter if (SetMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS) return RNDIS_COMMAND_FAILED; - + return HOST_SENDCONTROL_Successful; } @@ -351,7 +351,7 @@ uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInt QueryMessage.MessageType = REMOTE_NDIS_QUERY_MSG; QueryMessage.MessageLength = sizeof(RNDIS_Query_Message_t); QueryMessage.RequestId = RNDISInterfaceInfo->State.RequestID++; - + QueryMessage.Oid = Oid; QueryMessage.InformationBufferLength = 0; QueryMessage.InformationBufferOffset = 0; @@ -362,7 +362,7 @@ uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInt { return ErrorCode; } - + if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &QueryMessageResponseData, sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful) { @@ -385,11 +385,11 @@ bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac return false; Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber); - + Pipe_Unfreeze(); - PacketWaiting = Pipe_IsINReceived(); + PacketWaiting = Pipe_IsINReceived(); Pipe_Freeze(); - + return PacketWaiting; } @@ -404,19 +404,19 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + if (!(Pipe_IsReadWriteAllowed())) { if (Pipe_IsINReceived()) Pipe_ClearIN(); - + *PacketLength = 0; Pipe_Freeze(); return PIPE_RWSTREAM_NoError; } RNDIS_Packet_Message_t DeviceMessage; - + if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t), NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) { @@ -424,17 +424,17 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn } *PacketLength = (uint16_t)DeviceMessage.DataLength; - + Pipe_Discard_Stream(DeviceMessage.DataOffset - (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)), NO_STREAM_CALLBACK); - + Pipe_Read_Stream_LE(Buffer, *PacketLength, NO_STREAM_CALLBACK); - + if (!(Pipe_BytesInPipe())) Pipe_ClearIN(); Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } @@ -454,7 +454,7 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn DeviceMessage.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength); DeviceMessage.DataOffset = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)); DeviceMessage.DataLength = PacketLength; - + Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); @@ -468,8 +468,9 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn Pipe_ClearOUT(); Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.h b/LUFA/Drivers/USB/Class/Host/RNDIS.h index 71f96eb5d..5ff2e1b84 100644 --- a/LUFA/Drivers/USB/Class/Host/RNDIS.h +++ b/LUFA/Drivers/USB/Class/Host/RNDIS.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -60,7 +60,7 @@ #include <stdio.h> #include <string.h> - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -89,9 +89,9 @@ uint8_t DataOUTPipeNumber; /**< Pipe number of the RNDIS interface's OUT data pipe. */ bool DataOUTPipeDoubleBank; /**< Indicates if the RNDIS interface's OUT data pipe should use double banking. */ - uint8_t NotificationPipeNumber; /**< Pipe number of the RNDIS interface's IN notification endpoint, if used. */ + uint8_t NotificationPipeNumber; /**< Pipe number of the RNDIS interface's IN notification endpoint, if used. */ bool NotificationPipeDoubleBank; /**< Indicates if the RNDIS interface's notification pipe should use double banking. */ - + uint32_t HostMaxPacketSize; /**< Maximum size of a packet which can be buffered by the host. */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * <b>must</b> be set or the interface will fail to enumerate and operate correctly. @@ -103,20 +103,20 @@ * Configured state. */ uint8_t ControlInterfaceNumber; /**< Interface index of the RNDIS control interface within the attached device. */ - + uint16_t DataINPipeSize; /**< Size in bytes of the RNDIS interface's IN data pipe. */ uint16_t DataOUTPipeSize; /**< Size in bytes of the RNDIS interface's OUT data pipe. */ - uint16_t NotificationPipeSize; /**< Size in bytes of the RNDIS interface's IN notification pipe, if used. */ + uint16_t NotificationPipeSize; /**< Size in bytes of the RNDIS interface's IN notification pipe, if used. */ uint32_t DeviceMaxPacketSize; /**< Maximum size of a packet which can be buffered by the attached RNDIS device. */ - + uint32_t RequestID; /**< Request ID counter to give a unique ID for each command/response pair. */ } State; /**< State data for the USB class interface within the device. All elements in this section * <b>may</b> be set to initial values, but may also be ignored to default to sane values when * the interface is enumerated. */ } USB_ClassInfo_RNDIS_Host_t; - + /* Enums: */ /** Enum for the possible error codes returned by the \ref RNDIS_Host_ConfigurePipes() function. */ enum RNDIS_Host_EnumerationFailure_ErrorCodes_t @@ -211,7 +211,7 @@ * \return Boolean true if a packet is waiting to be read in by the host, false otherwise. */ bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); - + /** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave * only the packet contents for processing by the host in the nominated buffer. * @@ -268,7 +268,7 @@ /* Function Prototypes: */ #if defined(__INCLUDE_FROM_RNDIS_CLASS_HOST_C) - static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, + static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); @@ -291,3 +291,4 @@ #endif /** @} */ + diff --git a/LUFA/Drivers/USB/Class/Host/StillImage.c b/LUFA/Drivers/USB/Class/Host/StillImage.c index c3ade3b55..f7f8637a2 100644 --- a/LUFA/Drivers/USB/Class/Host/StillImage.c +++ b/LUFA/Drivers/USB/Class/Host/StillImage.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -46,7 +46,7 @@ uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, USB_Descriptor_Interface_t* StillImageInterface = NULL; memset(&SIInterfaceInfo->State, 0x00, sizeof(SIInterfaceInfo->State)); - + if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) return SI_ENUMERROR_InvalidConfigDescriptor; @@ -63,7 +63,7 @@ uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, } StillImageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); - + DataINEndpoint = NULL; DataOUTEndpoint = NULL; EventsEndpoint = NULL; @@ -85,7 +85,7 @@ uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, DataOUTEndpoint = EndpointData; } } - + for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { if (PipeNum == SIInterfaceInfo->Config.DataINPipeNumber) @@ -113,8 +113,8 @@ uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, SIInterfaceInfo->State.EventsPipeSize = EventsEndpoint->EndpointSize; } - } - + } + SIInterfaceInfo->State.InterfaceNumber = StillImageInterface->InterfaceNumber; SIInterfaceInfo->State.IsActive = true; @@ -135,7 +135,7 @@ uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor) return DESCRIPTOR_SEARCH_Found; } } - + return DESCRIPTOR_SEARCH_NotFound; } @@ -145,7 +145,7 @@ uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor) { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); - + uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && @@ -166,7 +166,7 @@ uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, SI_PIMA_Container_t* const PIMAHeader) { uint8_t ErrorCode; - + if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) return PIPE_RWSTREAM_DeviceDisconnected; @@ -178,7 +178,7 @@ uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, if ((ErrorCode = Pipe_Write_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0)); if (ParamBytes) @@ -186,10 +186,10 @@ uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, if ((ErrorCode = Pipe_Write_Stream_LE(&PIMAHeader->Params, ParamBytes, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError) return ErrorCode; } - + Pipe_ClearOUT(); Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } @@ -204,11 +204,11 @@ uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInf Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); - + while (!(Pipe_IsINReceived())) { uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); - + if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; @@ -216,7 +216,7 @@ uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInf if (!(TimeoutMSRem--)) return PIPE_RWSTREAM_Timeout; } - + Pipe_Freeze(); Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); @@ -236,25 +236,25 @@ uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInf USB_Host_ClearPipeStall(SIInterfaceInfo->Config.DataINPipeNumber); return PIPE_RWSTREAM_PipeStalled; } - + if (USB_HostState == HOST_STATE_Unattached) return PIPE_RWSTREAM_DeviceDisconnected; } - + Pipe_Read_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NO_STREAM_CALLBACK); - + if (PIMAHeader->Type == SI_PIMA_CONTAINER_ResponseBlock) { uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0)); if (ParamBytes) Pipe_Read_Stream_LE(&PIMAHeader->Params, ParamBytes, NO_STREAM_CALLBACK); - + Pipe_ClearIN(); } - + Pipe_Freeze(); - + return PIPE_RWSTREAM_NoError; } @@ -269,12 +269,12 @@ uint8_t SI_Host_SendData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipeNumber); Pipe_Unfreeze(); - + ErrorCode = Pipe_Write_Stream_LE(Buffer, Bytes, NO_STREAM_CALLBACK); Pipe_ClearOUT(); Pipe_Freeze(); - + return ErrorCode; } @@ -293,7 +293,7 @@ uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, ErrorCode = Pipe_Read_Stream_LE(Buffer, Bytes, NO_STREAM_CALLBACK); Pipe_Freeze(); - + return ErrorCode; } @@ -306,12 +306,12 @@ bool SI_Host_IsEventReceived(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipeNumber); Pipe_Unfreeze(); - + if (Pipe_BytesInPipe()) IsEventReceived = true; - + Pipe_Freeze(); - + return IsEventReceived; } @@ -325,12 +325,12 @@ uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInf Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipeNumber); Pipe_Unfreeze(); - + ErrorCode = Pipe_Read_Stream_LE(PIMAHeader, sizeof(SI_PIMA_Container_t), NO_STREAM_CALLBACK); - + Pipe_ClearIN(); Pipe_Freeze(); - + return ErrorCode; } @@ -351,16 +351,16 @@ uint8_t SI_Host_OpenSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) .Code = 0x1002, .Params = {1}, }; - + if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + if ((PIMABlock.Type != SI_PIMA_CONTAINER_ResponseBlock) || (PIMABlock.Code != 0x2001)) return SI_ERROR_LOGICAL_CMD_FAILED; - + SIInterfaceInfo->State.IsSessionOpen = true; return PIPE_RWSTREAM_NoError; @@ -380,10 +380,10 @@ uint8_t SI_Host_CloseSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) .Code = 0x1003, .Params = {1}, }; - + if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) return ErrorCode; - + if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -411,9 +411,9 @@ uint8_t SI_Host_SendCommand(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, .Type = SI_PIMA_CONTAINER_CommandBlock, .Code = Operation, }; - + memcpy(&PIMABlock.Params, Params, sizeof(uint32_t) * TotalParams); - + if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) return ErrorCode; @@ -433,8 +433,9 @@ uint8_t SI_Host_ReceiveResponse(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) if ((PIMABlock.Type != SI_PIMA_CONTAINER_ResponseBlock) || (PIMABlock.Code != 0x2001)) return SI_ERROR_LOGICAL_CMD_FAILED; - + return PIPE_RWSTREAM_NoError; } #endif + diff --git a/LUFA/Drivers/USB/Class/Host/StillImage.h b/LUFA/Drivers/USB/Class/Host/StillImage.h index 0e1e8ac16..d2e6fe0d2 100644 --- a/LUFA/Drivers/USB/Class/Host/StillImage.h +++ b/LUFA/Drivers/USB/Class/Host/StillImage.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -56,7 +56,7 @@ /* Includes: */ #include "../../USB.h" #include "../Common/StillImage.h" - + /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -66,7 +66,7 @@ #if !defined(__INCLUDE_FROM_SI_DRIVER) #error Do not include this file directly. Include LUFA/Drivers/Class/StillImage.h instead. #endif - + /* Public Interface - May be used in end-application: */ /* Macros: */ /** Error code for some Still Image Host functions, indicating a logical (and not hardware) error. */ @@ -89,7 +89,7 @@ uint8_t DataOUTPipeNumber; /**< Pipe number of the Still Image interface's OUT data pipe. */ bool DataOUTPipeDoubleBank; /**< Indicates if the Still Image interface's OUT data pipe should use double banking. */ - uint8_t EventsPipeNumber; /**< Pipe number of the Still Image interface's IN events endpoint, if used. */ + uint8_t EventsPipeNumber; /**< Pipe number of the Still Image interface's IN events endpoint, if used. */ bool EventsPipeDoubleBank; /**< Indicates if the Still Image interface's events data pipe should use double banking. */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * <b>must</b> be set or the interface will fail to enumerate and operate correctly. @@ -105,7 +105,7 @@ uint16_t DataINPipeSize; /**< Size in bytes of the Still Image interface's IN data pipe. */ uint16_t DataOUTPipeSize; /**< Size in bytes of the Still Image interface's OUT data pipe. */ uint16_t EventsPipeSize; /**< Size in bytes of the Still Image interface's IN events pipe. */ - + bool IsSessionOpen; /**< Indicates if a PIMA session is currently open with the attached device. */ uint32_t TransactionID; /**< Transaction ID for the next transaction to send to the device. */ } State; /**< State data for the USB class interface within the device. All elements in this section @@ -113,7 +113,7 @@ * the interface is enumerated. */ } USB_ClassInfo_SI_Host_t; - + /* Enums: */ /** Enum for the possible error codes returned by the \ref SI_Host_ConfigurePipes() function. */ enum SI_Host_EnumerationFailure_ErrorCodes_t @@ -148,7 +148,7 @@ /** Opens a new PIMA session with the attached device. This should be used before any session-orientated PIMA commands * are issued to the device. Only one session can be open at the one time. - * + * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the * call will fail. * @@ -186,7 +186,7 @@ uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, SI_PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); - + /** Receives a raw PIMA block header to the device. This can be used to receive arbitrary PIMA blocks from the device with * or without parameters. * @@ -203,7 +203,7 @@ ATTR_NON_NULL_PTR_ARG(2); /** Sends a given PIMA command to the attached device, filling out the PIMA command header's Transaction ID automatically. - * + * * \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the * call will fail. * @@ -258,7 +258,7 @@ uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, SI_PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); - + /** Sends arbitrary data to the attached device, for use in the data phase of PIMA commands which require data * transfer beyond the regular PIMA command block parameters. * @@ -290,7 +290,7 @@ uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, void* Buffer, const uint16_t Bytes) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); - + /* Inline Functions: */ /** General management task for a given Still Image host class interface, required for the correct operation of the * interface. This should be called frequently in the main program loop, before the master USB management task @@ -302,7 +302,7 @@ static inline void SI_Host_USBTask(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) { (void)SIInterfaceInfo; - } + } /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) @@ -312,14 +312,14 @@ #define STILL_IMAGE_PROTOCOL 0x01 #define COMMAND_DATA_TIMEOUT_MS 10000 - + /* Function Prototypes: */ #if defined(__INCLUDE_FROM_SI_CLASS_HOST_C) static uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); static uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1); #endif #endif - + /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } @@ -328,3 +328,4 @@ #endif /** @} */ + |