From a287c39b84d08ceed3ea5d0cc19596d2f66b0999 Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Tue, 7 Mar 2017 19:36:18 +1300 Subject: [PATCH] Fix for occasional freakouts on mass storage writes. Upstream's edge-detect interrupt that starts SPI transmission was not firing. Sometimes. On some boards only. The cause was Downstream not allowing enough time between edges for Upstream to catch the signal. Also misc code tidyups. --- .../Class/HID/Inc/usbh_hid.h | 84 +++++++++---------- Downstream/Src/downstream_spi.c | 3 +- Upstream/Src/upstream_spi.c | 2 + Upstream/Upstream Debug.launch | 2 +- 4 files changed, 46 insertions(+), 45 deletions(-) diff --git a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h index e8acdd4..c5a1630 100644 --- a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h +++ b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h @@ -66,48 +66,48 @@ #define HID_MIN_POLL 10 #define HID_MAX_REPORT_SIZE 8 #define HID_MAX_USAGE 10 -#define HID_MAX_NBR_REPORT_FMT 10 -#define HID_QUEUE_SIZE 10 - -#define HID_ITEM_LONG 0xFE - -#define HID_ITEM_TYPE_MAIN 0x00 -#define HID_ITEM_TYPE_GLOBAL 0x01 -#define HID_ITEM_TYPE_LOCAL 0x02 -#define HID_ITEM_TYPE_RESERVED 0x03 - - -#define HID_MAIN_ITEM_TAG_INPUT 0x08 -#define HID_MAIN_ITEM_TAG_OUTPUT 0x09 -#define HID_MAIN_ITEM_TAG_COLLECTION 0x0A -#define HID_MAIN_ITEM_TAG_FEATURE 0x0B -#define HID_MAIN_ITEM_TAG_ENDCOLLECTION 0x0C - - -#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0x00 -#define HID_GLOBAL_ITEM_TAG_LOG_MIN 0x01 -#define HID_GLOBAL_ITEM_TAG_LOG_MAX 0x02 -#define HID_GLOBAL_ITEM_TAG_PHY_MIN 0x03 -#define HID_GLOBAL_ITEM_TAG_PHY_MAX 0x04 -#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 0x05 -#define HID_GLOBAL_ITEM_TAG_UNIT 0x06 -#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 0x07 -#define HID_GLOBAL_ITEM_TAG_REPORT_ID 0x08 -#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 0x09 -#define HID_GLOBAL_ITEM_TAG_PUSH 0x0A -#define HID_GLOBAL_ITEM_TAG_POP 0x0B - - -#define HID_LOCAL_ITEM_TAG_USAGE 0x00 -#define HID_LOCAL_ITEM_TAG_USAGE_MIN 0x01 -#define HID_LOCAL_ITEM_TAG_USAGE_MAX 0x02 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 0x03 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MIN 0x04 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAX 0x05 -#define HID_LOCAL_ITEM_TAG_STRING_INDEX 0x07 -#define HID_LOCAL_ITEM_TAG_STRING_MIN 0x08 -#define HID_LOCAL_ITEM_TAG_STRING_MAX 0x09 -#define HID_LOCAL_ITEM_TAG_DELIMITER 0x0A +#define HID_MAX_NBR_REPORT_FMT 10 +//#define HID_QUEUE_SIZE 10 +// +//#define HID_ITEM_LONG 0xFE +// +//#define HID_ITEM_TYPE_MAIN 0x00 +//#define HID_ITEM_TYPE_GLOBAL 0x01 +//#define HID_ITEM_TYPE_LOCAL 0x02 +//#define HID_ITEM_TYPE_RESERVED 0x03 +// +// +//#define HID_MAIN_ITEM_TAG_INPUT 0x08 +//#define HID_MAIN_ITEM_TAG_OUTPUT 0x09 +//#define HID_MAIN_ITEM_TAG_COLLECTION 0x0A +//#define HID_MAIN_ITEM_TAG_FEATURE 0x0B +//#define HID_MAIN_ITEM_TAG_ENDCOLLECTION 0x0C +// +// +//#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0x00 +//#define HID_GLOBAL_ITEM_TAG_LOG_MIN 0x01 +//#define HID_GLOBAL_ITEM_TAG_LOG_MAX 0x02 +//#define HID_GLOBAL_ITEM_TAG_PHY_MIN 0x03 +//#define HID_GLOBAL_ITEM_TAG_PHY_MAX 0x04 +//#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 0x05 +//#define HID_GLOBAL_ITEM_TAG_UNIT 0x06 +//#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 0x07 +//#define HID_GLOBAL_ITEM_TAG_REPORT_ID 0x08 +//#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 0x09 +//#define HID_GLOBAL_ITEM_TAG_PUSH 0x0A +//#define HID_GLOBAL_ITEM_TAG_POP 0x0B +// +// +//#define HID_LOCAL_ITEM_TAG_USAGE 0x00 +//#define HID_LOCAL_ITEM_TAG_USAGE_MIN 0x01 +//#define HID_LOCAL_ITEM_TAG_USAGE_MAX 0x02 +//#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 0x03 +//#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MIN 0x04 +//#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAX 0x05 +//#define HID_LOCAL_ITEM_TAG_STRING_INDEX 0x07 +//#define HID_LOCAL_ITEM_TAG_STRING_MIN 0x08 +//#define HID_LOCAL_ITEM_TAG_STRING_MAX 0x09 +//#define HID_LOCAL_ITEM_TAG_DELIMITER 0x0A #define HID_REPORT_DIRECTION_IN 0x01 diff --git a/Downstream/Src/downstream_spi.c b/Downstream/Src/downstream_spi.c index 575ecd7..18f8b03 100644 --- a/Downstream/Src/downstream_spi.c +++ b/Downstream/Src/downstream_spi.c @@ -289,9 +289,7 @@ void Downstream_SPIProcess(void) { return; } - SpiInterruptCompleted = 0; - UPSTREAM_TX_REQUEST_DEASSERT; if (DownstreamInterfaceState >= DOWNSTREAM_INTERFACE_ERROR) { @@ -407,6 +405,7 @@ void Downstream_SPIProcess(void) //a transmit-only DMA transfer with CRC! (it does not clear RXNE flag on request) void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { + UPSTREAM_TX_REQUEST_DEASSERT; SpiInterruptCompleted = 1; } diff --git a/Upstream/Src/upstream_spi.c b/Upstream/Src/upstream_spi.c index d3c1b42..fd79377 100644 --- a/Upstream/Src/upstream_spi.c +++ b/Upstream/Src/upstream_spi.c @@ -234,6 +234,7 @@ HAL_StatusTypeDef Upstream_TransmitPacket(UpstreamPacketTypeDef* packetToWrite) //We TxRx our outgoing packet because the SPI hardware freaks out if we only Tx it :-/ void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { + UNUSED(hspi); SpiPacketReceivedCallbackTypeDef tempPacketCallback; UpstreamPacketTypeDef* tempPacketToFree; @@ -522,6 +523,7 @@ void Upstream_BeginReceivePacketBody(void) //Something bad happened! Possibly CRC error... void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) { + UNUSED(hspi); SpiPacketReceivedCallbackTypeDef tempPacketCallback; if (UpstreamInterfaceState >= UPSTREAM_INTERFACE_ERROR) diff --git a/Upstream/Upstream Debug.launch b/Upstream/Upstream Debug.launch index 5e0844d..035cd39 100644 --- a/Upstream/Upstream Debug.launch +++ b/Upstream/Upstream Debug.launch @@ -1,6 +1,6 @@ - +