From b2d9b6fced7247182edc8b500d00013222a4ecbb Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Fri, 15 Apr 2016 00:02:09 +1200 Subject: [PATCH] Restructure & bugfix Upstream HID. Still some issue with Downstream... --- Downstream/Inc/downstream_interface_def.h | 2 +- Downstream/Inc/downstream_statemachine.h | 2 +- .../Class/HID/Src/usbh_hid.c | 4 +- Downstream/Src/downstream_hid.c | 3 +- Upstream/Inc/upstream_hid.h | 5 +- Upstream/Inc/upstream_interface_def.h | 2 +- Upstream/Inc/upstream_spi.h | 3 +- Upstream/Inc/upstream_statemachine.h | 3 +- Upstream/Src/upstream_hid.c | 70 +++++++++++-------- Upstream/Src/upstream_msc.c | 28 ++++---- Upstream/Src/upstream_spi.c | 8 --- Upstream/Src/upstream_statemachine.c | 9 ++- 12 files changed, 68 insertions(+), 71 deletions(-) diff --git a/Downstream/Inc/downstream_interface_def.h b/Downstream/Inc/downstream_interface_def.h index a5cdf56..57ebfcf 100644 --- a/Downstream/Inc/downstream_interface_def.h +++ b/Downstream/Inc/downstream_interface_def.h @@ -57,7 +57,7 @@ InterfaceCommandMscTypeDef; typedef enum { - COMMAND_HID_REPORT, //Downstream initiates HID report transfer to Upstream. Upstream just needs to Upstream_ReceivePacket each time. + COMMAND_HID_REPORT, //Returns HID report } InterfaceCommandHidTypeDef; diff --git a/Downstream/Inc/downstream_statemachine.h b/Downstream/Inc/downstream_statemachine.h index fbd5874..6e86311 100644 --- a/Downstream/Inc/downstream_statemachine.h +++ b/Downstream/Inc/downstream_statemachine.h @@ -33,7 +33,7 @@ typedef enum do { \ USB_Host_Disconnect(); \ LED_Fault_SetBlinkRate(LED_FAST_BLINK_RATE); \ - DownstreamState = STATE_ERROR; \ + /*DownstreamState = STATE_ERROR; */ \ while (1); \ } while (0); diff --git a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c index be36dfa..19e6bea 100644 --- a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c +++ b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c @@ -394,7 +394,7 @@ static USBH_StatusTypeDef USBH_HID_Process(USBH_HandleTypeDef *phost) if (urbStatus == USBH_URB_NOTREADY) { - HID_Handle->state = HID_IDLE; + HID_Handle->state = HID_GET_DATA; break; } @@ -404,7 +404,7 @@ static USBH_StatusTypeDef USBH_HID_Process(USBH_HandleTypeDef *phost) if(USBH_ClrFeature(phost, HID_Handle->ep_addr) == USBH_OK) { - HID_Handle->state = HID_IDLE; + HID_Handle->state = HID_GET_DATA; } } break; diff --git a/Downstream/Src/downstream_hid.c b/Downstream/Src/downstream_hid.c index b941663..9dd42dd 100644 --- a/Downstream/Src/downstream_hid.c +++ b/Downstream/Src/downstream_hid.c @@ -74,8 +74,7 @@ void Downstream_HID_InterruptReportCallback(DownstreamPacketTypeDef* packetToSen return; } - - Downstream_TransmitPacket(packetToSend); + Downstream_PacketProcessor_ClassReply(packetToSend); } diff --git a/Upstream/Inc/upstream_hid.h b/Upstream/Inc/upstream_hid.h index c3c0d03..9bc5de7 100644 --- a/Upstream/Inc/upstream_hid.h +++ b/Upstream/Inc/upstream_hid.h @@ -15,9 +15,7 @@ -//#include "usbd_def.h" #include "stm32f4xx_hal.h" -#include "upstream_interface_def.h" typedef uint8_t (*UpstreamHidSendReportCallback)(uint8_t *report, @@ -25,9 +23,8 @@ typedef uint8_t (*UpstreamHidSendReportCallback)(uint8_t *report, -void Upstream_HID_Init(InterfaceCommandClassTypeDef newClass); void Upstream_HID_DeInit(void); -void Upstream_HID_GetNextReport(UpstreamHidSendReportCallback callback); +HAL_StatusTypeDef Upstream_HID_GetNextReport(UpstreamHidSendReportCallback callback); diff --git a/Upstream/Inc/upstream_interface_def.h b/Upstream/Inc/upstream_interface_def.h index 9f00626..f122887 100644 --- a/Upstream/Inc/upstream_interface_def.h +++ b/Upstream/Inc/upstream_interface_def.h @@ -59,7 +59,7 @@ InterfaceCommandMscTypeDef; typedef enum { - COMMAND_HID_REPORT, //Downstream initiates HID report transfer to Upstream. Upstream just needs to Upstream_ReceivePacket each time. + COMMAND_HID_REPORT, //Returns HID report } InterfaceCommandHidTypeDef; diff --git a/Upstream/Inc/upstream_spi.h b/Upstream/Inc/upstream_spi.h index b96e00c..7e180c2 100644 --- a/Upstream/Inc/upstream_spi.h +++ b/Upstream/Inc/upstream_spi.h @@ -87,8 +87,7 @@ HAL_StatusTypeDef Upstream_ReceivePacket(SpiPacketReceivedCallbackTypeDef callba void Upstream_TxOkInterrupt(void); void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); -void Upstream_SetExpectedReceivedCommand(uint8_t expectedCommandClass, - uint8_t expectedCommand); + #endif /* INC_UPSTREAM_SPI_H_ */ diff --git a/Upstream/Inc/upstream_statemachine.h b/Upstream/Inc/upstream_statemachine.h index c199e66..99b4802 100644 --- a/Upstream/Inc/upstream_statemachine.h +++ b/Upstream/Inc/upstream_statemachine.h @@ -14,6 +14,7 @@ #include "led.h" +#include "upstream_interface_def.h" typedef enum @@ -37,7 +38,7 @@ typedef enum void Upstream_InitStateMachine(void); void Upstream_StateMachine_SetErrorState(void); -HAL_StatusTypeDef Upstream_StateMachine_CheckClassOperationOk(void); +InterfaceCommandClassTypeDef Upstream_StateMachine_CheckActiveClass(void); void Upstream_StateMachine_DeviceDisconnected(void); diff --git a/Upstream/Src/upstream_hid.c b/Upstream/Src/upstream_hid.c index 2de79ad..56212d6 100644 --- a/Upstream/Src/upstream_hid.c +++ b/Upstream/Src/upstream_hid.c @@ -21,7 +21,6 @@ -InterfaceCommandClassTypeDef ActiveHidClass = COMMAND_CLASS_INTERFACE; UpstreamPacketTypeDef* UpstreamHidPacket = NULL; UpstreamHidSendReportCallback ReportCallback = NULL; @@ -31,28 +30,8 @@ void Upstream_HID_GetNextReportReceiveCallback(UpstreamPacketTypeDef* receivedPa -void Upstream_HID_Init(InterfaceCommandClassTypeDef newClass) -{ - if ((newClass != COMMAND_CLASS_HID_MOUSE)) //add classes here - { - UPSTREAM_SPI_FREAKOUT; - return; - } - - if ((ActiveHidClass != COMMAND_CLASS_INTERFACE) || - (UpstreamHidPacket != NULL)) - { - UPSTREAM_SPI_FREAKOUT; - return; - } - - ActiveHidClass = newClass; -} - - void Upstream_HID_DeInit(void) { - ActiveHidClass = COMMAND_CLASS_INTERFACE; if (UpstreamHidPacket != NULL) { Upstream_ReleasePacket(UpstreamHidPacket); @@ -61,12 +40,17 @@ void Upstream_HID_DeInit(void) } -void Upstream_HID_GetNextReport(UpstreamHidSendReportCallback callback) + +HAL_StatusTypeDef Upstream_HID_GetNextReport(UpstreamHidSendReportCallback callback) { - if ((ActiveHidClass != COMMAND_CLASS_HID_MOUSE)) //add classes here + UpstreamPacketTypeDef* freePacket; + InterfaceCommandClassTypeDef activeClass; + + activeClass = Upstream_StateMachine_CheckActiveClass(); + if ((activeClass != COMMAND_CLASS_HID_MOUSE)) //add classes here { - UPSTREAM_SPI_FREAKOUT; - return; + UPSTREAM_STATEMACHINE_FREAKOUT; + return HAL_ERROR; } //Release packet used for last transaction (if any) @@ -78,23 +62,47 @@ void Upstream_HID_GetNextReport(UpstreamHidSendReportCallback callback) if (ReportCallback != NULL) { - UPSTREAM_SPI_FREAKOUT; - return; + UPSTREAM_STATEMACHINE_FREAKOUT; + return HAL_ERROR; } ReportCallback = callback; - //Get next packet - Upstream_SetExpectedReceivedCommand(ActiveHidClass, COMMAND_HID_REPORT); - Upstream_ReceivePacket(Upstream_HID_GetNextReportReceiveCallback); + freePacket = Upstream_GetFreePacketImmediately(); + if (freePacket == NULL) + { + return HAL_ERROR; + } + + freePacket->Length16 = UPSTREAM_PACKET_HEADER_LEN_16; + freePacket->CommandClass = activeClass; + freePacket->Command = COMMAND_HID_REPORT; + + if (Upstream_TransmitPacket(freePacket) == HAL_OK) + { + return Upstream_ReceivePacket(Upstream_HID_GetNextReportReceiveCallback); + } + + //else: + Upstream_ReleasePacket(freePacket); + return HAL_ERROR; } + void Upstream_HID_GetNextReportReceiveCallback(UpstreamPacketTypeDef* receivedPacket) { UpstreamHidSendReportCallback tempReportCallback; + InterfaceCommandClassTypeDef activeClass; uint8_t dataLength = 0; uint8_t i; + activeClass = Upstream_StateMachine_CheckActiveClass(); + if ((activeClass != COMMAND_CLASS_HID_MOUSE)) //add classes here + { + UPSTREAM_STATEMACHINE_FREAKOUT; + return; + } + if ((UpstreamHidPacket != NULL) || (ReportCallback == NULL)) { @@ -108,7 +116,7 @@ void Upstream_HID_GetNextReportReceiveCallback(UpstreamPacketTypeDef* receivedPa } - if (ActiveHidClass == COMMAND_CLASS_HID_MOUSE) + if (activeClass == COMMAND_CLASS_HID_MOUSE) { if (receivedPacket->Length16 != (UPSTREAM_PACKET_HEADER_LEN_16 + ((HID_MOUSE_DATA_LEN + 1) / 2))) { diff --git a/Upstream/Src/upstream_msc.c b/Upstream/Src/upstream_msc.c index dd35959..515ee3e 100644 --- a/Upstream/Src/upstream_msc.c +++ b/Upstream/Src/upstream_msc.c @@ -41,8 +41,9 @@ static void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPac HAL_StatusTypeDef Upstream_MSC_TestReady(UpstreamMSCCallbackTypeDef callback) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { + //UPSTREAM_STATEMACHINE_FREAKOUT; return HAL_ERROR; } @@ -60,7 +61,7 @@ void Upstream_MSC_TestReadyFreePacketCallback(UpstreamPacketTypeDef* freePacket) if (Upstream_TransmitPacket(freePacket) == HAL_OK) { - Upstream_ReleasePacket(freePacket); + Upstream_ReleasePacket(freePacket); /////////!!!!!!!!!!!!!??????????? if (Upstream_ReceivePacket(Upstream_MSC_TestReadyReplyCallback) != HAL_OK) { TestReadyCallback(HAL_ERROR); @@ -77,7 +78,7 @@ void Upstream_MSC_TestReadyFreePacketCallback(UpstreamPacketTypeDef* freePacket) void Upstream_MSC_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return; } @@ -89,7 +90,7 @@ void Upstream_MSC_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket) } if ((replyPacket->Length16 != (UPSTREAM_PACKET_HEADER_LEN_16 + 1)) || - (replyPacket->Data[0] != HAL_OK)) + (replyPacket->Data[0] != HAL_OK)) { Upstream_ReleasePacket(replyPacket); TestReadyCallback(HAL_ERROR); @@ -106,7 +107,7 @@ HAL_StatusTypeDef Upstream_MSC_GetCapacity(UpstreamMSCCallbackUintPacketTypeDef { UpstreamPacketTypeDef* freePacket; - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return HAL_ERROR; } @@ -126,6 +127,7 @@ HAL_StatusTypeDef Upstream_MSC_GetCapacity(UpstreamMSCCallbackUintPacketTypeDef return Upstream_ReceivePacket(Upstream_MSC_GetCapacityReplyCallback); } //else: + Upstream_ReleasePacket(freePacket); ////////????????? return HAL_ERROR; } @@ -135,7 +137,7 @@ void Upstream_MSC_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket) uint32_t uint1; uint32_t uint2; - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return; } @@ -164,7 +166,7 @@ HAL_StatusTypeDef Upstream_MSC_BeginRead(UpstreamMSCCallbackTypeDef callback, uint32_t readBlockCount, uint32_t readByteCount) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return HAL_ERROR; } @@ -207,7 +209,7 @@ void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket) HAL_StatusTypeDef Upstream_MSC_GetStreamDataPacket(UpstreamMSCCallbackPacketTypeDef callback) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return HAL_ERROR; } @@ -236,7 +238,7 @@ void Upstream_MSC_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket ReadStreamBusy = 0; - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return; } @@ -256,7 +258,7 @@ void Upstream_MSC_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket dataLength8 = (replyPacket->Length16 - UPSTREAM_PACKET_HEADER_LEN_16) * 2; if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here - (replyPacket->Length16 <= UPSTREAM_PACKET_HEADER_LEN_16) || //Should be at least one data byte in the reply. + (replyPacket->Length16 <= UPSTREAM_PACKET_HEADER_LEN_16) || //Should be at least one data byte in the reply. (dataLength8 > ByteCount)) //No more data than expected transfer length { GetStreamDataCallback(NULL, 0); @@ -277,7 +279,7 @@ HAL_StatusTypeDef Upstream_MSC_BeginWrite(UpstreamMSCCallbackTypeDef callback, uint64_t writeBlockStart, uint32_t writeBlockCount) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return HAL_ERROR; } @@ -318,7 +320,7 @@ void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket) { uint8_t tempResult; - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return; } @@ -347,7 +349,7 @@ void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket) HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, uint32_t dataLength8) { - if (Upstream_StateMachine_CheckClassOperationOk() != HAL_OK) + if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) { return HAL_ERROR; } diff --git a/Upstream/Src/upstream_spi.c b/Upstream/Src/upstream_spi.c index 25478cd..d3c1b42 100644 --- a/Upstream/Src/upstream_spi.c +++ b/Upstream/Src/upstream_spi.c @@ -540,12 +540,4 @@ void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) } -//Used by USB interface classes. -//This is required when Downstream sends a packet without an initiating request from us -void Upstream_SetExpectedReceivedCommand(uint8_t expectedCommandClass, - uint8_t expectedCommand) -{ - SentCommandClass = expectedCommandClass; - SentCommand = expectedCommand; -} diff --git a/Upstream/Src/upstream_statemachine.c b/Upstream/Src/upstream_statemachine.c index d43b6c0..1002b53 100644 --- a/Upstream/Src/upstream_statemachine.c +++ b/Upstream/Src/upstream_statemachine.c @@ -12,7 +12,6 @@ #include "upstream_statemachine.h" #include "upstream_spi.h" -#include "upstream_interface_def.h" #include "usb_device.h" #include "usbd_core.h" #include "usbd_msc.h" @@ -76,20 +75,20 @@ void Upstream_StateMachine_SetErrorState(void) } -HAL_StatusTypeDef Upstream_StateMachine_CheckClassOperationOk(void) +InterfaceCommandClassTypeDef Upstream_StateMachine_CheckActiveClass(void) { if (UpstreamState == STATE_ERROR) { - return HAL_ERROR; + return COMMAND_CLASS_ERROR; } if (UpstreamState != STATE_DEVICE_ACTIVE) { UPSTREAM_STATEMACHINE_FREAKOUT; - return HAL_ERROR; + return COMMAND_CLASS_INTERFACE; } - return HAL_OK; + return ConfiguredDeviceClass; }