diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt index 534812f833..c13ce8fb89 100644 --- a/LUFA/DoxygenPages/ChangeLog.txt +++ b/LUFA/DoxygenPages/ChangeLog.txt @@ -7,7 +7,23 @@ /** \page Page_ChangeLog Project Changelog * * \section Sec_ChangeLogXXXXXX Version XXXXXX - * None. + * New: + * - Core: + * - None + * - Library Applications: + * - None + * + * Changed: + * - Core: + * - Android Accessory Host property strings changed from a struct of pointer to an array to prevent unaligned access on greater than 8-bit architectures + * - Library Applications: + * - None + * + * Fixed: + * - Core: + * - None + * - Library Applications: + * - None * * \section Sec_ChangeLog120219 Version 120219 * New: diff --git a/LUFA/DoxygenPages/MigrationInformation.txt b/LUFA/DoxygenPages/MigrationInformation.txt index 2c62d836d9..0210a37d83 100644 --- a/LUFA/DoxygenPages/MigrationInformation.txt +++ b/LUFA/DoxygenPages/MigrationInformation.txt @@ -11,7 +11,9 @@ * areas relevant to making older projects compatible with the API changes of each new release. * * \section Sec_MigrationXXXXXX Migrating from 120219 to XXXXXX - * None. + * Host Mode + * - The Android Accessory Host class driver property strings are now a array of \c char* rather than a struct of named pointers. Existing applications + * should use C99 Designated Initializers with the property string indexes located in \ref AOA_Strings_t instead. * * \section Sec_Migration120219 Migrating from 111009 to 120219 * USB Core diff --git a/LUFA/Drivers/USB/Class/Common/HIDParser.c b/LUFA/Drivers/USB/Class/Common/HIDParser.c index d3e7d0226e..4447e8a0b6 100644 --- a/LUFA/Drivers/USB/Class/Common/HIDParser.c +++ b/LUFA/Drivers/USB/Class/Common/HIDParser.c @@ -61,17 +61,18 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, switch (HIDReportItem & HID_RI_DATA_SIZE_MASK) { case HID_RI_DATA_BITS_32: - ReportItemData = le32_to_cpu(*((uint32_t*)ReportData)); + ReportItemData = (((uint32_t)ReportData[3] << 24) | ((uint32_t)ReportData[2] << 16) | + ((uint16_t)ReportData[1] << 8) | ReportData[0]); ReportSize -= 4; ReportData += 4; break; case HID_RI_DATA_BITS_16: - ReportItemData = le16_to_cpu(*((uint16_t*)ReportData)); + ReportItemData = (((uint16_t)ReportData[1] << 8) | (ReportData[0])); ReportSize -= 2; ReportData += 2; break; case HID_RI_DATA_BITS_8: - ReportItemData = *((uint8_t*)ReportData); + ReportItemData = ReportData[0]; ReportSize -= 1; ReportData += 1; break; diff --git a/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c b/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c index cc70589375..eb4c2530d5 100644 --- a/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c +++ b/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c @@ -233,7 +233,7 @@ static uint8_t AOA_Host_GetAccessoryProtocol(uint16_t* const Protocol) static uint8_t AOA_Host_SendPropertyString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, const uint8_t StringIndex) { - const char* String = ((char**)&AOAInterfaceInfo->Config.PropertyStrings)[StringIndex]; + const char* String = AOAInterfaceInfo->Config.PropertyStrings[StringIndex]; if (String == NULL) String = ""; diff --git a/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h b/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h index d98134281d..58bd98fe8f 100644 --- a/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h +++ b/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h @@ -91,16 +91,8 @@ uint8_t DataOUTPipeNumber; /**< Pipe number of the AOA interface's OUT data pipe. */ bool DataOUTPipeDoubleBank; /**< Indicates if the AOA interface's OUT data pipe should use double banking. */ - struct - { - char* Manufacturer; /**< Device manufacturer string. */ - char* Model; /**< Device model name string. */ - char* Description; /**< Device description string. */ - char* Version; /**< Device version string. */ - char* URI; /**< Device URI information string. */ - char* Serial; /**< Device serial number string. */ - } ATTR_PACKED PropertyStrings; /**< Android Accessory property strings, sent to identify the accessory when the - * Android device is switched into Open Accessory mode. */ + char* PropertyStrings[AOA_STRING_TOTAL_STRINGS]; /**< Android Accessory property strings, sent to identify the accessory when the + * Android device is switched into Open Accessory mode. */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * must be set or the interface will fail to enumerate and operate correctly. */ diff --git a/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c b/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c index 2d34991109..379ccb01c9 100644 --- a/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c +++ b/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c @@ -278,7 +278,7 @@ uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, } uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, - void* String) + const char* const String) { uint8_t ErrorCode; diff --git a/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h b/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h index 4d9baf0fa2..c8c997f741 100644 --- a/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h +++ b/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h @@ -190,7 +190,7 @@ * \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* String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); /** Sends the given raw data stream to the attached printer's input endpoint. This should contain commands that the * printer is able to understand - for example, PCL data. Not all printers accept all printer languages; see diff --git a/LUFA/Drivers/USB/Core/HostStandardReq.c b/LUFA/Drivers/USB/Core/HostStandardReq.c index 649ad5e8fe..ccade464b6 100644 --- a/LUFA/Drivers/USB/Core/HostStandardReq.c +++ b/LUFA/Drivers/USB/Core/HostStandardReq.c @@ -38,17 +38,16 @@ uint8_t USB_Host_ConfigurationNumber; -uint8_t USB_Host_SendControlRequest(void* const BufferPtr) +static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr) { uint8_t* DataStream = (uint8_t*)BufferPtr; - bool BusSuspended = USB_Host_IsBusSuspended(); uint8_t ReturnStatus = HOST_SENDCONTROL_Successful; uint16_t DataLen = USB_ControlRequest.wLength; USB_Host_ResumeBus(); if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) - goto End_Of_Control_Send; + return ReturnStatus; Pipe_SetPipeToken(PIPE_TOKEN_SETUP); Pipe_ClearError(); @@ -71,12 +70,12 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) Pipe_ClearSETUP(); if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; Pipe_Freeze(); if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) - goto End_Of_Control_Send; + return ReturnStatus; if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST) { @@ -89,7 +88,7 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) Pipe_Unfreeze(); if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; if (!(Pipe_BytesInPipe())) DataLen = 0; @@ -109,12 +108,12 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) Pipe_Unfreeze(); if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; Pipe_ClearOUT(); if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; } else { @@ -126,7 +125,7 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) while (DataLen) { if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; while (DataLen && (Pipe_BytesInPipe() < USB_Host_ControlPipeSize)) { @@ -138,7 +137,7 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) } if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; Pipe_Freeze(); } @@ -147,19 +146,11 @@ uint8_t USB_Host_SendControlRequest(void* const BufferPtr) Pipe_Unfreeze(); if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) - goto End_Of_Control_Send; + return ReturnStatus; Pipe_ClearIN(); } - -End_Of_Control_Send: - Pipe_Freeze(); - - if (BusSuspended) - USB_Host_SuspendBus(); - - Pipe_ResetPipe(PIPE_CONTROLPIPE); - + return ReturnStatus; } @@ -187,6 +178,21 @@ static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType) return HOST_SENDCONTROL_Successful; } +uint8_t USB_Host_SendControlRequest(void* const BufferPtr) +{ + bool BusSuspended = USB_Host_IsBusSuspended(); + uint8_t ReturnStatus = USB_Host_SendControlRequest_PRV(BufferPtr); + + Pipe_Freeze(); + + if (BusSuspended) + USB_Host_SuspendBus(); + + Pipe_ResetPipe(PIPE_CONTROLPIPE); + + return ReturnStatus; +} + uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber) { uint8_t ErrorCode; diff --git a/LUFA/Drivers/USB/Core/HostStandardReq.h b/LUFA/Drivers/USB/Core/HostStandardReq.h index d4f4187434..35c8dd3f2b 100644 --- a/LUFA/Drivers/USB/Core/HostStandardReq.h +++ b/LUFA/Drivers/USB/Core/HostStandardReq.h @@ -278,6 +278,7 @@ /* Function Prototypes: */ #if defined(__INCLUDE_FROM_HOSTSTDREQ_C) + static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr); static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType); #endif #endif