diff --git a/Upstream/.cproject b/Upstream/.cproject index 089676a..af954a0 100755 --- a/Upstream/.cproject +++ b/Upstream/.cproject @@ -109,7 +109,7 @@ - + @@ -234,7 +234,7 @@ - + diff --git a/Upstream/Inc/downstream_interface_msc.h b/Upstream/Inc/downstream_interface_msc.h deleted file mode 100644 index 0458abf..0000000 --- a/Upstream/Inc/downstream_interface_msc.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * downstream_interface_msc.h - * - * Created on: 4/07/2015 - * Author: Robert Fisk - */ - -#ifndef INC_DOWNSTREAM_INTERFACE_MSC_H_ -#define INC_DOWNSTREAM_INTERFACE_MSC_H_ - - -#include "downstream_spi.h" - - -typedef void (*DownstreamInterfaceMSCCallbackTypeDef)(HAL_StatusTypeDef result); -typedef void (*DownstreamInterfaceMSCCallbackPacketTypeDef)(HAL_StatusTypeDef result, - DownstreamPacketTypeDef* downstreamPacket, - uint16_t dataLength); -typedef void (*DownstreamInterfaceMSCCallbackUintPacketTypeDef)(HAL_StatusTypeDef result, - uint32_t result_uint[], - DownstreamPacketTypeDef* downstreamPacket); - - -HAL_StatusTypeDef DownstreamInterface_TestReady(DownstreamInterfaceMSCCallbackTypeDef callback); -HAL_StatusTypeDef DownstreamInterface_GetCapacity(DownstreamInterfaceMSCCallbackUintPacketTypeDef callback); -HAL_StatusTypeDef DownstreamInterface_BeginRead(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount, - uint32_t readByteCount); -HAL_StatusTypeDef DownstreamInterface_GetStreamDataPacket(DownstreamInterfaceMSCCallbackPacketTypeDef callback); -HAL_StatusTypeDef DownstreamInterface_BeginWrite(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount); -HAL_StatusTypeDef DownstreamInterface_PutStreamDataPacket(DownstreamPacketTypeDef* packetToSend, - uint32_t dataLength); - - - -#endif /* INC_DOWNSTREAM_INTERFACE_MSC_H_ */ diff --git a/Upstream/Inc/downstream_spi.h b/Upstream/Inc/downstream_spi.h deleted file mode 100644 index 55069e7..0000000 --- a/Upstream/Inc/downstream_spi.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * downstream_spi.h - * - * Created on: 21/06/2015 - * Author: Robert Fisk - */ - -#ifndef INC_DOWNSTREAM_SPI_H_ -#define INC_DOWNSTREAM_SPI_H_ - - -#include "usbd_config.h" - - -#define DOWNSTREAM_PACKET_HEADER_LEN (2) //Min length = CommandClass & Command bytes -#define DOWNSTREAM_PACKET_LEN (DOWNSTREAM_PACKET_HEADER_LEN + MSC_MEDIA_PACKET) -#define DOWNSTREAM_PACKET_LEN_MIN (DOWNSTREAM_PACKET_HEADER_LEN) - - -#define SPI_INTERFACE_FREAKOUT_VOID \ - do { \ - while (1); \ - /*DownstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ - /*return;*/ \ -} while (0); - -#define SPI_INTERFACE_FREAKOUT_HAL_ERROR \ - do { \ - while (1); \ - /*DownstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ - /*return HAL_ERROR;*/ \ -} while (0); - - - -typedef enum -{ - INTERFACE_STATE_RESET = 0, - INTERFACE_STATE_WAITING_CLIENT = 1, - INTERFACE_STATE_IDLE = 2, - INTERFACE_STATE_TX_SIZE_WAIT = 3, - INTERFACE_STATE_TX_SIZE = 4, - INTERFACE_STATE_TX_PACKET_WAIT = 5, - INTERFACE_STATE_TX_PACKET = 6, - INTERFACE_STATE_RX_SIZE_WAIT = 7, - INTERFACE_STATE_RX_SIZE = 8, - INTERFACE_STATE_RX_PACKET_WAIT = 9, - INTERFACE_STATE_RX_PACKET = 10, - INTERFACE_STATE_ERROR = 11 -} InterfaceStateTypeDef; - - -typedef enum -{ - NOT_BUSY = 0, - BUSY = 1 -} PacketBusyTypeDef; - - -typedef struct -{ - PacketBusyTypeDef Busy; //Everything after Busy should be word-aligned - uint16_t Length __ALIGN_END; //Packet length includes CommandClass, Command, and Data - uint8_t CommandClass; - uint8_t Command; - uint8_t Data[MSC_MEDIA_PACKET]; //Should (must?) be word-aligned, for USB copy routine - uint8_t RxCrc; -} -DownstreamPacketTypeDef; - - - -typedef void (*FreePacketCallbackTypeDef)(DownstreamPacketTypeDef* freePacket); -typedef void (*SpiPacketReceivedCallbackTypeDef)(DownstreamPacketTypeDef* replyPacket); - - -void Downstream_InitInterface(void); -HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback); -DownstreamPacketTypeDef* Downstream_GetFreePacketImmediately(void); -void Downstream_ReleasePacket(DownstreamPacketTypeDef* packetToRelease); -HAL_StatusTypeDef Downstream_SendPacket(DownstreamPacketTypeDef* packetToWrite); -HAL_StatusTypeDef Downstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback); -void Downstream_TxOkInterrupt(void); -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); - - -#endif /* INC_DOWNSTREAM_SPI_H_ */ diff --git a/Upstream/Inc/downstream_interface_def.h b/Upstream/Inc/upstream_interface_def.h similarity index 84% rename from Upstream/Inc/downstream_interface_def.h rename to Upstream/Inc/upstream_interface_def.h index 34d344c..1ea7e56 100644 --- a/Upstream/Inc/downstream_interface_def.h +++ b/Upstream/Inc/upstream_interface_def.h @@ -5,13 +5,13 @@ * Author: Robert Fisk */ -#ifndef INC_DOWNSTREAM_INTERFACE_DEF_H_ -#define INC_DOWNSTREAM_INTERFACE_DEF_H_ +#ifndef INC_UPSTREAM_INTERFACE_DEF_H_ +#define INC_UPSTREAM_INTERFACE_DEF_H_ //*************** // Attention! -// Keep this file synchronised with upstream_interface_def.h +// Keep this file synchronised with downstream_interface_def.h // in the Downstream project. //*************** @@ -43,4 +43,4 @@ typedef enum InterfaceCommandMscTypeDef; -#endif /* INC_DOWNSTREAM_INTERFACE_DEF_H_ */ +#endif /* INC_UPSTREAM_INTERFACE_DEF_H_ */ diff --git a/Upstream/Inc/upstream_interface_msc.h b/Upstream/Inc/upstream_interface_msc.h new file mode 100644 index 0000000..e7a1587 --- /dev/null +++ b/Upstream/Inc/upstream_interface_msc.h @@ -0,0 +1,39 @@ +/* + * upstream_interface_msc.h + * + * Created on: 4/07/2015 + * Author: Robert Fisk + */ + +#ifndef INC_UPSTREAM_INTERFACE_MSC_H_ +#define INC_UPSTREAM_INTERFACE_MSC_H_ + + +#include + + +typedef void (*UpstreamInterfaceMSCCallbackTypeDef)(HAL_StatusTypeDef result); +typedef void (*UpstreamInterfaceMSCCallbackPacketTypeDef)(HAL_StatusTypeDef result, + UpstreamPacketTypeDef* upstreamPacket, + uint16_t dataLength); +typedef void (*UpstreamInterfaceMSCCallbackUintPacketTypeDef)(HAL_StatusTypeDef result, + uint32_t result_uint[], + UpstreamPacketTypeDef* upstreamPacket); + + +HAL_StatusTypeDef UpstreamInterface_TestReady(UpstreamInterfaceMSCCallbackTypeDef callback); +HAL_StatusTypeDef UpstreamInterface_GetCapacity(UpstreamInterfaceMSCCallbackUintPacketTypeDef callback); +HAL_StatusTypeDef UpstreamInterface_BeginRead(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount, + uint32_t readByteCount); +HAL_StatusTypeDef UpstreamInterface_GetStreamDataPacket(UpstreamInterfaceMSCCallbackPacketTypeDef callback); +HAL_StatusTypeDef UpstreamInterface_BeginWrite(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount); +HAL_StatusTypeDef UpstreamInterface_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, + uint32_t dataLength); + + + +#endif /* INC_UPSTREAM_INTERFACE_MSC_H_ */ diff --git a/Upstream/Inc/upstream_spi.h b/Upstream/Inc/upstream_spi.h new file mode 100644 index 0000000..33a54d8 --- /dev/null +++ b/Upstream/Inc/upstream_spi.h @@ -0,0 +1,89 @@ +/* + * upstream_spi.h + * + * Created on: 21/06/2015 + * Author: Robert Fisk + */ + +#ifndef INC_UPSTREAM_SPI_H_ +#define INC_UPSTREAM_SPI_H_ + + +#include "usbd_config.h" + + +#define UPSTREAM_PACKET_HEADER_LEN (2) //Min length = CommandClass & Command bytes +#define UPSTREAM_PACKET_LEN (UPSTREAM_PACKET_HEADER_LEN + MSC_MEDIA_PACKET) +#define UPSTREAM_PACKET_LEN_MIN (UPSTREAM_PACKET_HEADER_LEN) + + +#define SPI_INTERFACE_FREAKOUT_VOID \ + do { \ + while (1); \ + /*UpstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ + /*return;*/ \ +} while (0); + +#define SPI_INTERFACE_FREAKOUT_HAL_ERROR \ + do { \ + while (1); \ + /*UpstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ + /*return HAL_ERROR;*/ \ +} while (0); + + + +typedef enum +{ + UPSTREAM_INTERFACE_RESET, + UPSTREAM_INTERFACE_WAITING_CLIENT, + UPSTREAM_INTERFACE_IDLE, + UPSTREAM_INTERFACE_TX_SIZE_WAIT, + UPSTREAM_INTERFACE_TX_SIZE, + UPSTREAM_INTERFACE_TX_PACKET_WAIT, + UPSTREAM_INTERFACE_TX_PACKET, + UPSTREAM_INTERFACE_RX_SIZE_WAIT, + UPSTREAM_INTERFACE_RX_SIZE, + UPSTREAM_INTERFACE_RX_PACKET_WAIT, + UPSTREAM_INTERFACE_RX_PACKET, + UPSTREAM_INTERFACE_ERROR +} InterfaceStateTypeDef; + + +typedef enum +{ + NOT_BUSY, + BUSY +} PacketBusyTypeDef; + + +typedef struct +{ + PacketBusyTypeDef Busy; //Everything after Busy should be word-aligned + uint16_t Length __ALIGN_END; //Packet length includes CommandClass, Command, and Data + uint8_t CommandClass; + uint8_t Command; + uint8_t Data[MSC_MEDIA_PACKET]; //Should (must?) be word-aligned, for USB copy routine + uint8_t RxCrc; +} +UpstreamPacketTypeDef; + + + +typedef void (*FreePacketCallbackTypeDef)(UpstreamPacketTypeDef* freePacket); +typedef void (*SpiPacketReceivedCallbackTypeDef)(UpstreamPacketTypeDef* replyPacket); + + +void Upstream_InitSPI(void); +HAL_StatusTypeDef Upstream_GetFreePacket(FreePacketCallbackTypeDef callback); +UpstreamPacketTypeDef* Upstream_GetFreePacketImmediately(void); +void Upstream_ReleasePacket(UpstreamPacketTypeDef* packetToRelease); +HAL_StatusTypeDef Upstream_SendPacket(UpstreamPacketTypeDef* packetToWrite); +HAL_StatusTypeDef Upstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback); +void Upstream_TxOkInterrupt(void); +void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); + + +#endif /* INC_UPSTREAM_SPI_H_ */ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h index 597a521..81b07f1 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h @@ -37,7 +37,7 @@ #include "usbd_msc_bot.h" #include "usbd_msc_scsi.h" #include "usbd_ioreq.h" -#include "downstream_spi.h" +#include /** @addtogroup USBD_MSC_BOT * @{ @@ -80,7 +80,7 @@ typedef struct uint8_t bot_status; uint16_t bot_data_length; uint8_t* bot_data; - DownstreamPacketTypeDef* bot_packet; //Not NULL indicates we currently own a downstream packet buffer, and should free it when we are done. + UpstreamPacketTypeDef* bot_packet; //Not NULL indicates we currently own an upstream packet buffer, and should free it when we are done. USBD_MSC_BOT_CBWTypeDef cbw; USBD_MSC_BOT_CSWTypeDef csw; diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_storage_template.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_storage_template.h deleted file mode 100755 index e54e41c..0000000 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_storage_template.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_storage.h - * @author MCD Application Team - * @version V2.3.0 - * @date 04-November-2014 - * @brief Header file for the usbd_msc_storage.c file - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2014 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MSC_STORAGE_H -#define __USBD_MSC_STORAGE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_STORAGE - * @brief header file for the usbd_msc_storage.c file - * @{ - */ - -/** @defgroup USBD_STORAGE_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_STORAGE_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_STORAGE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_Variables - * @{ - */ -extern USBD_StorageTypeDef USBD_MSC_Template_fops; -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype - * @{ - */ - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MSC_STORAGE_H */ - -/** - * @} - */ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c index bde7f06..952a0fa 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c @@ -41,9 +41,9 @@ */ /* Includes ------------------------------------------------------------------*/ +#include +#include #include "usbd_msc.h" -#include "downstream_interface_def.h" -#include "downstream_spi.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ @@ -542,7 +542,7 @@ uint8_t USBD_MSC_BufferFreed(USBD_HandleTypeDef *pdev) { if (((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet != NULL) { - Downstream_ReleasePacket(((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet); + Upstream_ReleasePacket(((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet); ((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet = NULL; } } diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c index 83e9b9b..94fad3e 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c @@ -26,14 +26,14 @@ */ /* Includes ------------------------------------------------------------------*/ +#include +#include +#include #include "usbd_msc_bot.h" #include "usbd_msc_scsi.h" #include "usbd_msc.h" #include "usbd_msc_data.h" #include "usbd_descriptors.h" -#include "downstream_interface_def.h" -#include "downstream_interface_msc.h" -#include "downstream_spi.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY @@ -106,16 +106,16 @@ static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr); void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result); void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, uint32_t result_uint[], - DownstreamPacketTypeDef* downstreamPacket); + UpstreamPacketTypeDef* upstreamPacket); void SCSI_ReadFormatCapacityCallback(HAL_StatusTypeDef result, uint32_t result_uint[], - DownstreamPacketTypeDef* packetToUse); + UpstreamPacketTypeDef* packetToUse); void SCSI_Read10BeginCallback(HAL_StatusTypeDef result); void SCSI_Read10ReplyCallback(HAL_StatusTypeDef result, - DownstreamPacketTypeDef* downstreamPacket, + UpstreamPacketTypeDef* upstreamPacket, uint16_t dataLength); void SCSI_Write10BeginCallback(HAL_StatusTypeDef result); -void SCSI_Write10FreePacketCallback(DownstreamPacketTypeDef* freePacket); +void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket); /** @@ -234,7 +234,7 @@ void SCSI_TestUnitReady(void) return; } - if (DownstreamInterface_TestReady(SCSI_TestUnitReadyCallback) != HAL_OK) + if (UpstreamInterface_TestReady(SCSI_TestUnitReadyCallback) != HAL_OK) { SCSI_TestUnitReadyCallback(HAL_ERROR); } @@ -273,9 +273,9 @@ static void SCSI_Inquiry(void) { uint8_t* pPage; uint16_t len; - DownstreamPacketTypeDef* freePacket; + UpstreamPacketTypeDef* freePacket; - freePacket = Downstream_GetFreePacketImmediately(); + freePacket = Upstream_GetFreePacketImmediately(); SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; @@ -314,7 +314,7 @@ static void SCSI_Inquiry(void) */ static void SCSI_ReadCapacity10(void) { - if (DownstreamInterface_GetCapacity(SCSI_ReadCapacity10Callback) != HAL_OK) + if (UpstreamInterface_GetCapacity(SCSI_ReadCapacity10Callback) != HAL_OK) { SCSI_ReadCapacity10Callback(HAL_ERROR, NULL, NULL); } @@ -323,7 +323,7 @@ static void SCSI_ReadCapacity10(void) void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, uint32_t result_uint[], - DownstreamPacketTypeDef* downstreamPacket) + UpstreamPacketTypeDef* upstreamPacket) { if (result != HAL_OK) { @@ -335,8 +335,8 @@ void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, return; } - SCSI_ProcessCmd_hmsc->bot_packet = downstreamPacket; - SCSI_ProcessCmd_hmsc->bot_data = downstreamPacket->Data; + SCSI_ProcessCmd_hmsc->bot_packet = upstreamPacket; + SCSI_ProcessCmd_hmsc->bot_data = upstreamPacket->Data; SCSI_ProcessCmd_hmsc->scsi_blk_nbr = result_uint[0]; SCSI_ProcessCmd_hmsc->scsi_blk_size = result_uint[1]; @@ -364,7 +364,7 @@ void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, */ static void SCSI_ReadFormatCapacity(void) { - if (DownstreamInterface_GetCapacity(SCSI_ReadFormatCapacityCallback) != HAL_OK) + if (UpstreamInterface_GetCapacity(SCSI_ReadFormatCapacityCallback) != HAL_OK) { SCSI_ReadFormatCapacityCallback(HAL_ERROR, NULL, NULL); } @@ -373,7 +373,7 @@ static void SCSI_ReadFormatCapacity(void) void SCSI_ReadFormatCapacityCallback(HAL_StatusTypeDef result, uint32_t result_uint[], - DownstreamPacketTypeDef* packetToUse) + UpstreamPacketTypeDef* packetToUse) { if (result != HAL_OK) { @@ -416,9 +416,9 @@ void SCSI_ReadFormatCapacityCallback(HAL_StatusTypeDef result, static void SCSI_ModeSense6 (void) { uint16_t len = 8; - DownstreamPacketTypeDef* freePacket; + UpstreamPacketTypeDef* freePacket; - freePacket = Downstream_GetFreePacketImmediately(); + freePacket = Upstream_GetFreePacketImmediately(); SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; @@ -442,9 +442,9 @@ static void SCSI_ModeSense6 (void) static void SCSI_ModeSense10(void) { uint16_t len = 8; - DownstreamPacketTypeDef* freePacket; + UpstreamPacketTypeDef* freePacket; - freePacket = Downstream_GetFreePacketImmediately(); + freePacket = Upstream_GetFreePacketImmediately(); SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; @@ -469,9 +469,9 @@ static void SCSI_ModeSense10(void) static void SCSI_RequestSense(void) { uint8_t i; - DownstreamPacketTypeDef* freePacket; + UpstreamPacketTypeDef* freePacket; - freePacket = Downstream_GetFreePacketImmediately(); + freePacket = Upstream_GetFreePacketImmediately(); SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; @@ -589,7 +589,7 @@ static void SCSI_Read10(void) return; } - if (DownstreamInterface_BeginRead(SCSI_Read10BeginCallback, + if (UpstreamInterface_BeginRead(SCSI_Read10BeginCallback, SCSI_ProcessCmd_hmsc->scsi_blk_addr, SCSI_ProcessCmd_hmsc->scsi_blk_len, SCSI_ProcessCmd_hmsc->cbw.dDataLength) != HAL_OK) @@ -600,7 +600,7 @@ static void SCSI_Read10(void) } //hmsc->bot_state is already USBD_BOT_DATA_IN - if (DownstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) + if (UpstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) { SCSI_Read10ReplyCallback(HAL_ERROR, NULL, 0); } @@ -620,7 +620,7 @@ void SCSI_Read10BeginCallback(HAL_StatusTypeDef result) } SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_DATA_IN; - if (DownstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) + if (UpstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) { SCSI_Read10ReplyCallback(HAL_ERROR, NULL, 0); } @@ -628,7 +628,7 @@ void SCSI_Read10BeginCallback(HAL_StatusTypeDef result) void SCSI_Read10ReplyCallback(HAL_StatusTypeDef result, - DownstreamPacketTypeDef* downstreamPacket, + UpstreamPacketTypeDef* upstreamPacket, uint16_t dataLength) { if (result != HAL_OK) @@ -644,8 +644,8 @@ void SCSI_Read10ReplyCallback(HAL_StatusTypeDef result, if (SCSI_ProcessCmd_hmsc->bot_packet != NULL) while (1); /////////////////////////////////////////! - SCSI_ProcessCmd_hmsc->bot_packet = downstreamPacket; - SCSI_ProcessCmd_hmsc->bot_data = downstreamPacket->Data; + SCSI_ProcessCmd_hmsc->bot_packet = upstreamPacket; + SCSI_ProcessCmd_hmsc->bot_data = upstreamPacket->Data; USBD_LL_Transmit (SCSI_ProcessCmd_pdev, MSC_EPIN_ADDR, SCSI_ProcessCmd_hmsc->bot_data, @@ -716,7 +716,7 @@ static void SCSI_Write10(void) return; } - if (DownstreamInterface_BeginWrite(SCSI_Write10BeginCallback, + if (UpstreamInterface_BeginWrite(SCSI_Write10BeginCallback, SCSI_ProcessCmd_hmsc->scsi_blk_addr, SCSI_ProcessCmd_hmsc->scsi_blk_len) != HAL_OK) { @@ -728,7 +728,7 @@ static void SCSI_Write10(void) //hmsc->bot_state is already USBD_BOT_DATA_OUT dataLength = MIN(SCSI_ProcessCmd_hmsc->csw.dDataResidue, MSC_MEDIA_PACKET); - if (DownstreamInterface_PutStreamDataPacket(SCSI_ProcessCmd_hmsc->bot_packet, + if (UpstreamInterface_PutStreamDataPacket(SCSI_ProcessCmd_hmsc->bot_packet, dataLength) != HAL_OK) { SCSI_SenseCode(SCSI_ProcessCmd_pdev, @@ -748,7 +748,7 @@ static void SCSI_Write10(void) } /* Prepare EP to Receive next packet */ - if (Downstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) + if (Upstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) { SCSI_SenseCode(SCSI_ProcessCmd_pdev, SCSI_ProcessCmd_lun, @@ -782,7 +782,7 @@ void SCSI_Write10BeginCallback(HAL_StatusTypeDef result) /* Prepare EP to receive first data packet */ SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_DATA_OUT; - if (Downstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) + if (Upstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) { SCSI_SenseCode(SCSI_ProcessCmd_pdev, SCSI_ProcessCmd_lun, @@ -793,7 +793,7 @@ void SCSI_Write10BeginCallback(HAL_StatusTypeDef result) } -void SCSI_Write10FreePacketCallback(DownstreamPacketTypeDef* freePacket) +void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket) { SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; diff --git a/Upstream/Src/downstream_interface_msc.c b/Upstream/Src/downstream_interface_msc.c deleted file mode 100644 index bceca34..0000000 --- a/Upstream/Src/downstream_interface_msc.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * downstream_interface_msc.c - * - * Created on: 4/07/2015 - * Author: Robert Fisk - */ - - -#include "stm32f4xx_hal.h" -#include "downstream_interface_msc.h" -#include "downstream_interface_def.h" -#include "downstream_spi.h" - - -//Stuff we need to save for our callbacks to use: -DownstreamInterfaceMSCCallbackTypeDef TestReadyCallback; -DownstreamInterfaceMSCCallbackUintPacketTypeDef GetCapacityCallback; -DownstreamInterfaceMSCCallbackPacketTypeDef GetStreamDataCallback; -uint32_t ByteCount; -DownstreamPacketTypeDef* ReadStreamPacket; -uint8_t ReadStreamBusy; - - -static void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket); - - - -HAL_StatusTypeDef DownstreamInterface_TestReady(DownstreamInterfaceMSCCallbackTypeDef callback) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - TestReadyCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_TEST_UNIT_READY; - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); -} - -void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ - if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || - (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || - (replyPacket->Data[0] != HAL_OK)) - { - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(HAL_ERROR); - return; - } - - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(HAL_OK); -} - - - -HAL_StatusTypeDef DownstreamInterface_GetCapacity(DownstreamInterfaceMSCCallbackUintPacketTypeDef callback) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - GetCapacityCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_GET_CAPACITY; - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - return Downstream_GetPacket(DownstreamInterface_GetCapacityReplyCallback); -} - -void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ - uint32_t uint[2]; - - if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 8) || - (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG))) - { - GetCapacityCallback(HAL_ERROR, NULL, NULL); - return; - } - - uint[0] = *(uint32_t*)&(replyPacket->Data[0]); - uint[1] = *(uint32_t*)&(replyPacket->Data[4]); - GetCapacityCallback(HAL_OK, uint, replyPacket); //usb_msc_scsi will use this packet, so don't release now -} - - - -HAL_StatusTypeDef DownstreamInterface_BeginRead(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount, - uint32_t readByteCount) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use - ReadStreamBusy = 0; - - TestReadyCallback = callback; - ByteCount = readByteCount; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_BEGIN_READ; - *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; - *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; - - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! -} - - - -HAL_StatusTypeDef DownstreamInterface_GetStreamDataPacket(DownstreamInterfaceMSCCallbackPacketTypeDef callback) -{ - GetStreamDataCallback = callback; - - if (ReadStreamBusy != 0) - { - return HAL_OK; - } - ReadStreamBusy = 1; - - if (ReadStreamPacket && GetStreamDataCallback) //Do we have a stored packet and an address to send it? - { - DownstreamInterface_GetStreamDataPacketCallback(ReadStreamPacket); //Send it now! - ReadStreamPacket = NULL; - return HAL_OK; //Our callback will call us again, so we don't need to get a packet in this case. - } - return Downstream_GetPacket(DownstreamInterface_GetStreamDataPacketCallback); -} - -void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket) -{ - uint16_t dataLength; - - ReadStreamBusy = 0; - if (GetStreamDataCallback == NULL) - { - ReadStreamPacket = replyPacket; //We used up our callback already, so save this one for later. - return; - } - - if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here - (replyPacket->Length <= DOWNSTREAM_PACKET_HEADER_LEN) || //Should be at least one data byte in the reply. - (replyPacket->Length > ByteCount)) - { - GetStreamDataCallback(HAL_ERROR, NULL); - return; - } - - dataLength = replyPacket->Length - DOWNSTREAM_PACKET_HEADER_LEN; - ByteCount -= dataLength; - GetStreamDataCallback(HAL_OK, replyPacket, dataLength); //usb_msc_scsi will use this packet, so don't release now - if (ByteCount > 0) - { - DownstreamInterface_GetStreamDataPacket(NULL); //Try to get the next packet now, before USB asks for it - } -} - - - -HAL_StatusTypeDef DownstreamInterface_BeginWrite(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - TestReadyCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_BEGIN_WRITE; - *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; - *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; - - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - return Downstream_GetPacket(DownstreamInterface_BeginWriteReplyCallback); -} - -void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ - if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || - (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || - ((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) - { - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(HAL_ERROR); - return; - } - - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(replyPacket->Data[0]); -} - - - -HAL_StatusTypeDef DownstreamInterface_PutStreamDataPacket(DownstreamPacketTypeDef* packetToSend, - uint32_t dataLength) -{ - packetToSend->Length = dataLength + DOWNSTREAM_PACKET_HEADER_LEN; - packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; - packetToSend->Command = COMMAND_MSC_BEGIN_WRITE; - return Downstream_SendPacket(packetToSend); -} diff --git a/Upstream/Src/downstream_interface_msc_mock.c b/Upstream/Src/downstream_interface_msc_mock.c deleted file mode 100644 index a0b21eb..0000000 --- a/Upstream/Src/downstream_interface_msc_mock.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * downstream_interface_msc_mock.c - * - * Created on: 17/07/2015 - * Author: Robert Fisk - * - * This file replaces downstream_interface_msc.c to allow operational - * testing of Upstream, without Downstream in place and communicating - * over SPI. It still attempts to write downstream packets out the SPI port. - */ - - -#include "stm32f4xx_hal.h" -#include "downstream_interface_msc.h" -#include "downstream_interface_def.h" -#include "downstream_spi.h" - - -//Stuff we need to save for our callbacks to use: -DownstreamInterfaceMSCCallbackTypeDef TestReadyCallback; -DownstreamInterfaceMSCCallbackUintPacketTypeDef GetCapacityCallback; -DownstreamInterfaceMSCCallbackPacketTypeDef GetStreamDataCallback; -uint32_t ByteCount; -DownstreamPacketTypeDef* ReadStreamPacket; -uint8_t ReadStreamBusy; - - -static void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket); -static void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket); - - - -HAL_StatusTypeDef DownstreamInterface_TestReady(DownstreamInterfaceMSCCallbackTypeDef callback) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - TestReadyCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_TEST_UNIT_READY; - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - //return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); - return Downstream_GetFreePacket(DownstreamInterface_TestReadyReplyCallback); -} - -void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ -// if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || -// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || -// (replyPacket->Data[0] != HAL_OK)) -// { -// Downstream_ReleasePacket(replyPacket); -// TestReadyCallback(HAL_ERROR); -// return; -// } - - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(HAL_OK); -} - - - -HAL_StatusTypeDef DownstreamInterface_GetCapacity(DownstreamInterfaceMSCCallbackUintPacketTypeDef callback) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - GetCapacityCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_GET_CAPACITY; - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - //return Downstream_GetPacket(DownstreamInterface_GetCapacityReplyCallback); - return Downstream_GetFreePacket(DownstreamInterface_GetCapacityReplyCallback); -} - -void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ - uint32_t uint[2]; - -// if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 8) || -// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG))) -// { -// GetCapacityCallback(HAL_ERROR, NULL, NULL); -// } - - *(uint32_t*)&(replyPacket->Data[0]) = 262144; //* 512B = 128MB - *(uint32_t*)&(replyPacket->Data[4]) = 512; - - uint[0] = *(uint32_t*)&(replyPacket->Data[0]); - uint[1] = *(uint32_t*)&(replyPacket->Data[4]); - GetCapacityCallback(HAL_OK, uint, replyPacket); //usb_msc_scsi will use this packet, so don't release now -} - - - -HAL_StatusTypeDef DownstreamInterface_BeginRead(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount, - uint32_t readByteCount) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use - ReadStreamBusy = 0; - - TestReadyCallback = callback; - ByteCount = readByteCount; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_BEGIN_READ; - *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; - *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; - - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - //return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! - return Downstream_GetFreePacket(DownstreamInterface_TestReadyReplyCallback); -} - - - -HAL_StatusTypeDef DownstreamInterface_GetStreamDataPacket(DownstreamInterfaceMSCCallbackPacketTypeDef callback) -{ - GetStreamDataCallback = callback; - - if (ReadStreamBusy != 0) - { - return HAL_OK; - } - ReadStreamBusy = 1; - - if (ReadStreamPacket && GetStreamDataCallback) //Do we have a stored packet and an address to send it? - { - DownstreamInterface_GetStreamDataPacketCallback(ReadStreamPacket); //Send it now! - ReadStreamPacket = NULL; - return HAL_OK; //Our callback will call us again, so we don't need to get a packet in this case. - } - //return Downstream_GetPacket(DownstreamInterface_GetStreamDataPacketCallback); - return Downstream_GetFreePacket(DownstreamInterface_GetStreamDataPacketCallback); -} - -void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket) -{ - uint16_t dataLength; - - ReadStreamBusy = 0; - if (GetStreamDataCallback == NULL) - { - ReadStreamPacket = replyPacket; //We used up our callback already, so save this one for later. - return; - } - -// if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here -// (replyPacket->Length <= DOWNSTREAM_PACKET_HEADER_LEN) || //Should be at least one data byte in the reply. -// (replyPacket->Length > ByteCount)) -// { -// GetStreamDataCallback(HAL_ERROR, NULL); -// return; -// } - - replyPacket->Length = MIN((ByteCount + DOWNSTREAM_PACKET_HEADER_LEN), (MSC_MEDIA_PACKET + DOWNSTREAM_PACKET_HEADER_LEN)); - - dataLength = replyPacket->Length - DOWNSTREAM_PACKET_HEADER_LEN; - ByteCount -= dataLength; - GetStreamDataCallback(HAL_OK, replyPacket, dataLength); //usb_msc_scsi will use this packet, so don't release now - if (ByteCount > 0) - { - DownstreamInterface_GetStreamDataPacket(NULL); //Try to get the next packet now, before USB asks for it - } -} - - - -HAL_StatusTypeDef DownstreamInterface_BeginWrite(DownstreamInterfaceMSCCallbackTypeDef callback, - uint64_t readBlockStart, - uint32_t readBlockCount) -{ - DownstreamPacketTypeDef* freePacket; - HAL_StatusTypeDef tempResult; - - TestReadyCallback = callback; - freePacket = Downstream_GetFreePacketImmediately(); - - freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); - freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; - freePacket->Command = COMMAND_MSC_BEGIN_WRITE; - *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; - *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; - - tempResult = Downstream_SendPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - //return Downstream_GetPacket(DownstreamInterface_BeginWriteReplyCallback); - return Downstream_GetFreePacket(DownstreamInterface_BeginWriteReplyCallback); -} - -void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket) -{ -// if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || -// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || -// ((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) -// { -// Downstream_ReleasePacket(replyPacket); -// TestReadyCallback(HAL_ERROR); -// return; -// } - - Downstream_ReleasePacket(replyPacket); - TestReadyCallback(replyPacket->Data[0]); -} - - - -HAL_StatusTypeDef DownstreamInterface_PutStreamDataPacket(DownstreamPacketTypeDef* packetToSend, - uint32_t dataLength) -{ - packetToSend->Length = dataLength + DOWNSTREAM_PACKET_HEADER_LEN; - packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; - packetToSend->Command = COMMAND_MSC_BEGIN_WRITE; - return Downstream_SendPacket(packetToSend); -} diff --git a/Upstream/Src/interrupts.c b/Upstream/Src/interrupts.c index 279e9e9..471b41a 100755 --- a/Upstream/Src/interrupts.c +++ b/Upstream/Src/interrupts.c @@ -33,10 +33,10 @@ */ /* Includes ------------------------------------------------------------------*/ #include +#include #include "stm32f4xx_hal.h" #include "stm32f4xx.h" #include "board_config.h" -#include "downstream_spi.h" /* USER CODE BEGIN 0 */ @@ -88,7 +88,7 @@ void EXTI3_IRQHandler(void) { SPI_DMA_ACTIVE_ON; __HAL_GPIO_EXTI_CLEAR_IT(3); - Downstream_TxOkInterrupt(); + Upstream_TxOkInterrupt(); SPI_DMA_ACTIVE_OFF; } ///////////////////////// diff --git a/Upstream/Src/main.c b/Upstream/Src/main.c index 5bc1c31..f082e2a 100755 --- a/Upstream/Src/main.c +++ b/Upstream/Src/main.c @@ -33,7 +33,7 @@ */ /* Includes ------------------------------------------------------------------*/ -#include +#include #include "stm32f4xx_hal.h" #include "usb_device.h" #include "board_config.h" @@ -64,7 +64,7 @@ int main(void) GPIO_Init(); USB_Device_Init(); - Downstream_InitInterface(); + Upstream_InitSPI(); while (1) diff --git a/Upstream/Src/upstream_interface_msc.c b/Upstream/Src/upstream_interface_msc.c new file mode 100644 index 0000000..6df992f --- /dev/null +++ b/Upstream/Src/upstream_interface_msc.c @@ -0,0 +1,232 @@ +/* + * upstream_interface_msc.c + * + * Created on: 4/07/2015 + * Author: Robert Fisk + */ + + +#include +#include +#include +#include "stm32f4xx_hal.h" + + +//Stuff we need to save for our callbacks to use: +UpstreamInterfaceMSCCallbackTypeDef TestReadyCallback; +UpstreamInterfaceMSCCallbackUintPacketTypeDef GetCapacityCallback; +UpstreamInterfaceMSCCallbackPacketTypeDef GetStreamDataCallback; +uint32_t ByteCount; +UpstreamPacketTypeDef* ReadStreamPacket; +uint8_t ReadStreamBusy; + + +static void UpstreamInterface_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket); + + + +HAL_StatusTypeDef UpstreamInterface_TestReady(UpstreamInterfaceMSCCallbackTypeDef callback) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + TestReadyCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_TEST_UNIT_READY; + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + return Upstream_GetPacket(UpstreamInterface_TestReadyReplyCallback); +} + +void UpstreamInterface_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ + if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 1)) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || + (replyPacket->Data[0] != HAL_OK)) + { + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_ERROR); + return; + } + + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_OK); +} + + + +HAL_StatusTypeDef UpstreamInterface_GetCapacity(UpstreamInterfaceMSCCallbackUintPacketTypeDef callback) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + GetCapacityCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_GET_CAPACITY; + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + return Upstream_GetPacket(UpstreamInterface_GetCapacityReplyCallback); +} + +void UpstreamInterface_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ + uint32_t uint[2]; + + if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 8) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG))) + { + GetCapacityCallback(HAL_ERROR, NULL, NULL); + return; + } + + uint[0] = *(uint32_t*)&(replyPacket->Data[0]); + uint[1] = *(uint32_t*)&(replyPacket->Data[4]); + GetCapacityCallback(HAL_OK, uint, replyPacket); //usb_msc_scsi will use this packet, so don't release now +} + + + +HAL_StatusTypeDef UpstreamInterface_BeginRead(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount, + uint32_t readByteCount) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use + ReadStreamBusy = 0; + + TestReadyCallback = callback; + ByteCount = readByteCount; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_READ; + *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; + *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; + + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + return Upstream_GetPacket(UpstreamInterface_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! +} + + + +HAL_StatusTypeDef UpstreamInterface_GetStreamDataPacket(UpstreamInterfaceMSCCallbackPacketTypeDef callback) +{ + GetStreamDataCallback = callback; + + if (ReadStreamBusy != 0) + { + return HAL_OK; + } + ReadStreamBusy = 1; + + if (ReadStreamPacket && GetStreamDataCallback) //Do we have a stored packet and an address to send it? + { + UpstreamInterface_GetStreamDataPacketCallback(ReadStreamPacket); //Send it now! + ReadStreamPacket = NULL; + return HAL_OK; //Our callback will call us again, so we don't need to get a packet in this case. + } + return Upstream_GetPacket(UpstreamInterface_GetStreamDataPacketCallback); +} + +void UpstreamInterface_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket) +{ + uint16_t dataLength; + + ReadStreamBusy = 0; + if (GetStreamDataCallback == NULL) + { + ReadStreamPacket = replyPacket; //We used up our callback already, so save this one for later. + return; + } + + if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here + (replyPacket->Length <= UPSTREAM_PACKET_HEADER_LEN) || //Should be at least one data byte in the reply. + (replyPacket->Length > ByteCount)) + { + GetStreamDataCallback(HAL_ERROR, NULL, NULL); + return; + } + + dataLength = replyPacket->Length - UPSTREAM_PACKET_HEADER_LEN; + ByteCount -= dataLength; + GetStreamDataCallback(HAL_OK, replyPacket, dataLength); //usb_msc_scsi will use this packet, so don't release now + if (ByteCount > 0) + { + UpstreamInterface_GetStreamDataPacket(NULL); //Try to get the next packet now, before USB asks for it + } +} + + + +HAL_StatusTypeDef UpstreamInterface_BeginWrite(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + TestReadyCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_WRITE; + *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; + *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; + + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + return Upstream_GetPacket(UpstreamInterface_BeginWriteReplyCallback); +} + +void UpstreamInterface_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ + if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 1)) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || + ((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) + { + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_ERROR); + return; + } + + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(replyPacket->Data[0]); +} + + + +HAL_StatusTypeDef UpstreamInterface_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, + uint32_t dataLength) +{ + packetToSend->Length = dataLength + UPSTREAM_PACKET_HEADER_LEN; + packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; + packetToSend->Command = COMMAND_MSC_BEGIN_WRITE; + return Upstream_SendPacket(packetToSend); +} diff --git a/Upstream/Src/upstream_interface_msc_mock.c b/Upstream/Src/upstream_interface_msc_mock.c new file mode 100644 index 0000000..599ec60 --- /dev/null +++ b/Upstream/Src/upstream_interface_msc_mock.c @@ -0,0 +1,245 @@ +/* + * upstream_interface_msc_mock.c + * + * Created on: 17/07/2015 + * Author: Robert Fisk + * + * This file replaces upstream_interface_msc.c to allow operational + * testing of Upstream, without Upstream in place and communicating + * over SPI. It still attempts to write downstream packets out the SPI port. + */ + + +#include +#include +#include +#include "stm32f4xx_hal.h" + + +//Stuff we need to save for our callbacks to use: +UpstreamInterfaceMSCCallbackTypeDef TestReadyCallback; +UpstreamInterfaceMSCCallbackUintPacketTypeDef GetCapacityCallback; +UpstreamInterfaceMSCCallbackPacketTypeDef GetStreamDataCallback; +uint32_t ByteCount; +UpstreamPacketTypeDef* ReadStreamPacket; +uint8_t ReadStreamBusy; + + +static void UpstreamInterface_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket); +static void UpstreamInterface_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket); + + + +HAL_StatusTypeDef UpstreamInterface_TestReady(UpstreamInterfaceMSCCallbackTypeDef callback) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + TestReadyCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_TEST_UNIT_READY; + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + //return Upstream_GetPacket(UpstreamInterface_TestReadyReplyCallback); + return Upstream_GetFreePacket(UpstreamInterface_TestReadyReplyCallback); +} + +void UpstreamInterface_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ +// if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 1)) || +// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || +// (replyPacket->Data[0] != HAL_OK)) +// { +// Upstream_ReleasePacket(replyPacket); +// TestReadyCallback(HAL_ERROR); +// return; +// } + + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_OK); +} + + + +HAL_StatusTypeDef UpstreamInterface_GetCapacity(UpstreamInterfaceMSCCallbackUintPacketTypeDef callback) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + GetCapacityCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_GET_CAPACITY; + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + //return Upstream_GetPacket(UpstreamInterface_GetCapacityReplyCallback); + return Upstream_GetFreePacket(UpstreamInterface_GetCapacityReplyCallback); +} + +void UpstreamInterface_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ + uint32_t uint[2]; + +// if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 8) || +// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG))) +// { +// GetCapacityCallback(HAL_ERROR, NULL, NULL); +// } + + *(uint32_t*)&(replyPacket->Data[0]) = 262144; //* 512B = 128MB + *(uint32_t*)&(replyPacket->Data[4]) = 512; + + uint[0] = *(uint32_t*)&(replyPacket->Data[0]); + uint[1] = *(uint32_t*)&(replyPacket->Data[4]); + GetCapacityCallback(HAL_OK, uint, replyPacket); //usb_msc_scsi will use this packet, so don't release now +} + + + +HAL_StatusTypeDef UpstreamInterface_BeginRead(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount, + uint32_t readByteCount) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use + ReadStreamBusy = 0; + + TestReadyCallback = callback; + ByteCount = readByteCount; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_READ; + *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; + *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; + + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + //return Upstream_GetPacket(UpstreamInterface_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! + return Upstream_GetFreePacket(UpstreamInterface_TestReadyReplyCallback); +} + + + +HAL_StatusTypeDef UpstreamInterface_GetStreamDataPacket(UpstreamInterfaceMSCCallbackPacketTypeDef callback) +{ + GetStreamDataCallback = callback; + + if (ReadStreamBusy != 0) + { + return HAL_OK; + } + ReadStreamBusy = 1; + + if (ReadStreamPacket && GetStreamDataCallback) //Do we have a stored packet and an address to send it? + { + UpstreamInterface_GetStreamDataPacketCallback(ReadStreamPacket); //Send it now! + ReadStreamPacket = NULL; + return HAL_OK; //Our callback will call us again, so we don't need to get a packet in this case. + } + //return Upstream_GetPacket(UpstreamInterface_GetStreamDataPacketCallback); + return Upstream_GetFreePacket(UpstreamInterface_GetStreamDataPacketCallback); +} + +void UpstreamInterface_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket) +{ + uint16_t dataLength; + + ReadStreamBusy = 0; + if (GetStreamDataCallback == NULL) + { + ReadStreamPacket = replyPacket; //We used up our callback already, so save this one for later. + return; + } + +// if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here +// (replyPacket->Length <= UPSTREAM_PACKET_HEADER_LEN) || //Should be at least one data byte in the reply. +// (replyPacket->Length > ByteCount)) +// { +// GetStreamDataCallback(HAL_ERROR, NULL); +// return; +// } + + replyPacket->Length = MIN((ByteCount + UPSTREAM_PACKET_HEADER_LEN), (MSC_MEDIA_PACKET + UPSTREAM_PACKET_HEADER_LEN)); + + dataLength = replyPacket->Length - UPSTREAM_PACKET_HEADER_LEN; + ByteCount -= dataLength; + GetStreamDataCallback(HAL_OK, replyPacket, dataLength); //usb_msc_scsi will use this packet, so don't release now + if (ByteCount > 0) + { + UpstreamInterface_GetStreamDataPacket(NULL); //Try to get the next packet now, before USB asks for it + } +} + + + +HAL_StatusTypeDef UpstreamInterface_BeginWrite(UpstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount) +{ + UpstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + TestReadyCallback = callback; + freePacket = Upstream_GetFreePacketImmediately(); + + freePacket->Length = UPSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_WRITE; + *(uint64_t*)&(freePacket->Data[0]) = readBlockStart; + *(uint32_t*)&(freePacket->Data[8]) = readBlockCount; + + tempResult = Upstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + //return Upstream_GetPacket(UpstreamInterface_BeginWriteReplyCallback); + return Upstream_GetFreePacket(UpstreamInterface_BeginWriteReplyCallback); +} + +void UpstreamInterface_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket) +{ +// if ((replyPacket->Length != (UPSTREAM_PACKET_HEADER_LEN + 1)) || +// (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || +// ((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) +// { +// Upstream_ReleasePacket(replyPacket); +// TestReadyCallback(HAL_ERROR); +// return; +// } + + Upstream_ReleasePacket(replyPacket); + TestReadyCallback(replyPacket->Data[0]); +} + + + +HAL_StatusTypeDef UpstreamInterface_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, + uint32_t dataLength) +{ + packetToSend->Length = dataLength + UPSTREAM_PACKET_HEADER_LEN; + packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; + packetToSend->Command = COMMAND_MSC_BEGIN_WRITE; + return Upstream_SendPacket(packetToSend); +} diff --git a/Upstream/Src/downstream_spi.c b/Upstream/Src/upstream_spi.c similarity index 57% rename from Upstream/Src/downstream_spi.c rename to Upstream/Src/upstream_spi.c index bc9c6ac..40c4ec8 100644 --- a/Upstream/Src/downstream_spi.c +++ b/Upstream/Src/upstream_spi.c @@ -1,12 +1,12 @@ /* - * downstream_spi.c + * upstream_spi.c * * Created on: 21/06/2015 * Author: Robert Fisk */ -#include -#include "downstream_interface_def.h" +#include +#include #include "stm32f4xx_hal.h" #include "usbd_def.h" #include "board_config.h" @@ -14,12 +14,12 @@ SPI_HandleTypeDef Hspi1; -DownstreamPacketTypeDef DownstreamPacket0; -DownstreamPacketTypeDef DownstreamPacket1; -DownstreamPacketTypeDef* CurrentWorkingPacket; -DownstreamPacketTypeDef* NextTxPacket; //Indicates we have a pending TX packet +UpstreamPacketTypeDef UpstreamPacket0; +UpstreamPacketTypeDef UpstreamPacket1; +UpstreamPacketTypeDef* CurrentWorkingPacket; +UpstreamPacketTypeDef* NextTxPacket; //Indicates we have a pending TX packet -InterfaceStateTypeDef DownstreamInterfaceState; +InterfaceStateTypeDef UpstreamInterfaceState; FreePacketCallbackTypeDef PendingFreePacketCallback; //Indicates someone is waiting for a packet buffer to become available SpiPacketReceivedCallbackTypeDef ReceivePacketCallback; //Indicates someone is waiting for a received packet @@ -28,18 +28,18 @@ uint8_t SentCommand; static void SPI1_Init(void); -static HAL_StatusTypeDef Downstream_CheckBeginPacketReception(void); -static void Downstream_BeginPacketReception(DownstreamPacketTypeDef* freePacket); +static HAL_StatusTypeDef Upstream_CheckBeginPacketReception(void); +static void Upstream_BeginPacketReception(UpstreamPacketTypeDef* freePacket); -void Downstream_InitInterface(void) +void Upstream_InitSPI(void) { - DownstreamInterfaceState = INTERFACE_STATE_RESET; + UpstreamInterfaceState = UPSTREAM_INTERFACE_RESET; SPI1_Init(); - DownstreamPacket0.Busy = NOT_BUSY; - DownstreamPacket1.Busy = NOT_BUSY; + UpstreamPacket0.Busy = NOT_BUSY; + UpstreamPacket1.Busy = NOT_BUSY; NextTxPacket = NULL; PendingFreePacketCallback = NULL; ReceivePacketCallback = NULL; @@ -47,7 +47,7 @@ void Downstream_InitInterface(void) //Todo: check connection to downstream, await client USB insertion while (!DOWNSTREAM_TX_OK_ACTIVE); - DownstreamInterfaceState = INTERFACE_STATE_IDLE; + UpstreamInterfaceState = UPSTREAM_INTERFACE_IDLE; } @@ -72,11 +72,11 @@ void SPI1_Init(void) //Used by USB interface classes, and by our internal RX code. -HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback) +HAL_StatusTypeDef Upstream_GetFreePacket(FreePacketCallbackTypeDef callback) { //Sanity checks - if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || - (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + if ((UpstreamInterfaceState < UPSTREAM_INTERFACE_IDLE) || + (UpstreamInterfaceState > UPSTREAM_INTERFACE_RX_PACKET)) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; } @@ -88,16 +88,16 @@ HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback) } //Check if there is a free buffer now - if (DownstreamPacket0.Busy == NOT_BUSY) + if (UpstreamPacket0.Busy == NOT_BUSY) { - DownstreamPacket0.Busy = BUSY; - callback(&DownstreamPacket0); + UpstreamPacket0.Busy = BUSY; + callback(&UpstreamPacket0); return HAL_OK; } - if (DownstreamPacket1.Busy == NOT_BUSY) + if (UpstreamPacket1.Busy == NOT_BUSY) { - DownstreamPacket1.Busy = BUSY; - callback(&DownstreamPacket1); + UpstreamPacket1.Busy = BUSY; + callback(&UpstreamPacket1); return HAL_OK; } @@ -107,25 +107,25 @@ HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback) } -DownstreamPacketTypeDef* Downstream_GetFreePacketImmediately(void) +UpstreamPacketTypeDef* Upstream_GetFreePacketImmediately(void) { //Sanity checks - if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || - (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + if ((UpstreamInterfaceState < UPSTREAM_INTERFACE_IDLE) || + (UpstreamInterfaceState > UPSTREAM_INTERFACE_RX_PACKET)) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; } //We are expecting a free buffer now - if (DownstreamPacket0.Busy == NOT_BUSY) + if (UpstreamPacket0.Busy == NOT_BUSY) { - DownstreamPacket0.Busy = BUSY; - return &DownstreamPacket0; + UpstreamPacket0.Busy = BUSY; + return &UpstreamPacket0; } - if (DownstreamPacket1.Busy == NOT_BUSY) + if (UpstreamPacket1.Busy == NOT_BUSY) { - DownstreamPacket1.Busy = BUSY; - return &DownstreamPacket1; + UpstreamPacket1.Busy = BUSY; + return &UpstreamPacket1; } //Should not happen: @@ -134,10 +134,16 @@ DownstreamPacketTypeDef* Downstream_GetFreePacketImmediately(void) //Used by USB interface classes, and by our internal RX code. -void Downstream_ReleasePacket(DownstreamPacketTypeDef* packetToRelease) +void Upstream_ReleasePacket(UpstreamPacketTypeDef* packetToRelease) { FreePacketCallbackTypeDef tempCallback; + if ((packetToRelease != &UpstreamPacket0) && + (packetToRelease != &UpstreamPacket1)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + if (PendingFreePacketCallback != NULL) { tempCallback = PendingFreePacketCallback; //In extreme situations, running this callback can trigger another request for a free packet, @@ -154,30 +160,27 @@ void Downstream_ReleasePacket(DownstreamPacketTypeDef* packetToRelease) //Used by USB interface classes only. //OK to call when still transmitting another packet. //Not OK to call when receiving or waiting for downstream reply. -HAL_StatusTypeDef Downstream_SendPacket(DownstreamPacketTypeDef* packetToWrite) +HAL_StatusTypeDef Upstream_SendPacket(UpstreamPacketTypeDef* packetToWrite) { //Sanity checks - if ((packetToWrite != &DownstreamPacket0) && - (packetToWrite != &DownstreamPacket1)) + if ((packetToWrite != &UpstreamPacket0) && + (packetToWrite != &UpstreamPacket1)) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; } if ((packetToWrite->Busy != BUSY) || - (packetToWrite->Length < DOWNSTREAM_PACKET_LEN_MIN) || - (packetToWrite->Length > DOWNSTREAM_PACKET_LEN)) + (packetToWrite->Length < UPSTREAM_PACKET_LEN_MIN) || + (packetToWrite->Length > UPSTREAM_PACKET_LEN)) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; } - //Cancel any outstanding receive request - ReceivePacketCallback = NULL; - - switch (DownstreamInterfaceState) + switch (UpstreamInterfaceState) { - case INTERFACE_STATE_TX_SIZE_WAIT: - case INTERFACE_STATE_TX_SIZE: - case INTERFACE_STATE_TX_PACKET_WAIT: - case INTERFACE_STATE_TX_PACKET: + case UPSTREAM_INTERFACE_TX_SIZE_WAIT: + case UPSTREAM_INTERFACE_TX_SIZE: + case UPSTREAM_INTERFACE_TX_PACKET_WAIT: + case UPSTREAM_INTERFACE_TX_PACKET: if (NextTxPacket != NULL) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; @@ -185,21 +188,21 @@ HAL_StatusTypeDef Downstream_SendPacket(DownstreamPacketTypeDef* packetToWrite) NextTxPacket = packetToWrite; break; - case INTERFACE_STATE_RX_SIZE_WAIT: - case INTERFACE_STATE_RX_SIZE: - case INTERFACE_STATE_RX_PACKET_WAIT: - case INTERFACE_STATE_RX_PACKET: + case UPSTREAM_INTERFACE_RX_SIZE_WAIT: + case UPSTREAM_INTERFACE_RX_SIZE: + case UPSTREAM_INTERFACE_RX_PACKET_WAIT: + case UPSTREAM_INTERFACE_RX_PACKET: //We can't let the size/packet sequence get out of sync. SPI_INTERFACE_FREAKOUT_HAL_ERROR; - case INTERFACE_STATE_IDLE: - DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE_WAIT; + case UPSTREAM_INTERFACE_IDLE: + UpstreamInterfaceState = UPSTREAM_INTERFACE_TX_SIZE_WAIT; CurrentWorkingPacket = packetToWrite; SentCommandClass = CurrentWorkingPacket->CommandClass; SentCommand = CurrentWorkingPacket->Command; if (DOWNSTREAM_TX_OK_ACTIVE) { - Downstream_TxOkInterrupt(); //Manually trigger edge interrupt processing if the line was already asserted + Upstream_TxOkInterrupt(); //Manually trigger edge interrupt processing if the line was already asserted } break; @@ -217,56 +220,57 @@ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { SPI1_NSS_DEASSERT; - if ((DownstreamInterfaceState != INTERFACE_STATE_TX_SIZE) && - (DownstreamInterfaceState != INTERFACE_STATE_TX_PACKET)) + if ((UpstreamInterfaceState != UPSTREAM_INTERFACE_TX_SIZE) && + (UpstreamInterfaceState != UPSTREAM_INTERFACE_TX_PACKET)) { SPI_INTERFACE_FREAKOUT_VOID; } - if (DownstreamInterfaceState == INTERFACE_STATE_TX_SIZE) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_TX_SIZE) { - DownstreamInterfaceState = INTERFACE_STATE_TX_PACKET_WAIT; + UpstreamInterfaceState = UPSTREAM_INTERFACE_TX_PACKET_WAIT; if (DOWNSTREAM_TX_OK_ACTIVE) { - Downstream_TxOkInterrupt(); + Upstream_TxOkInterrupt(); } return; } - if (DownstreamInterfaceState == INTERFACE_STATE_TX_PACKET) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_TX_PACKET) { if ((PendingFreePacketCallback != NULL) && (NextTxPacket == NULL)) { //SPI_INTERFACE_FREAKOUT_VOID; ///////////////////////////////////////! } - Downstream_ReleasePacket(CurrentWorkingPacket); + Upstream_ReleasePacket(CurrentWorkingPacket); if (NextTxPacket != NULL) { - //NextTxPacket has already passed the checks in SendDownstreamPacket. + //NextTxPacket has already passed the checks in SendUpstreamPacket. //So we just need to pass it to HAL_SPI_Transmit_DMA. - DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE_WAIT; + UpstreamInterfaceState = UPSTREAM_INTERFACE_TX_SIZE_WAIT; CurrentWorkingPacket = NextTxPacket; NextTxPacket = NULL; if (DOWNSTREAM_TX_OK_ACTIVE) { - Downstream_TxOkInterrupt(); + Upstream_TxOkInterrupt(); } return; } - DownstreamInterfaceState = INTERFACE_STATE_IDLE; + UpstreamInterfaceState = UPSTREAM_INTERFACE_IDLE; if (ReceivePacketCallback != NULL) { - Downstream_CheckBeginPacketReception(); + Upstream_CheckBeginPacketReception(); } } } //Used by USB interface classes. -//Ok to call when transmitting, receiving, or waiting for downstream. -HAL_StatusTypeDef Downstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback) +//Ok to call when idle or transmitting. +//Not OK to call when receiving or waiting for downstream reply. +HAL_StatusTypeDef Upstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback) { if (ReceivePacketCallback != NULL) { @@ -274,30 +278,30 @@ HAL_StatusTypeDef Downstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback } ReceivePacketCallback = callback; - return Downstream_CheckBeginPacketReception(); + return Upstream_CheckBeginPacketReception(); } //Internal use only. -HAL_StatusTypeDef Downstream_CheckBeginPacketReception(void) +HAL_StatusTypeDef Upstream_CheckBeginPacketReception(void) { - if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || - (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + if ((UpstreamInterfaceState < UPSTREAM_INTERFACE_IDLE) || + (UpstreamInterfaceState > UPSTREAM_INTERFACE_RX_SIZE_WAIT)) { SPI_INTERFACE_FREAKOUT_HAL_ERROR; } - if (DownstreamInterfaceState == INTERFACE_STATE_IDLE) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_IDLE) { - DownstreamInterfaceState = INTERFACE_STATE_RX_SIZE_WAIT; + UpstreamInterfaceState = UPSTREAM_INTERFACE_RX_SIZE_WAIT; } - if (DownstreamInterfaceState == INTERFACE_STATE_RX_SIZE_WAIT) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_RX_SIZE_WAIT) { if (DOWNSTREAM_TX_OK_ACTIVE) { - //DownstreamTxOkInterrupt(); - Downstream_GetFreePacket(Downstream_BeginPacketReception); //Take a shortcut here :) + //UpstreamTxOkInterrupt(); + Upstream_GetFreePacket(Upstream_BeginPacketReception); //Take a shortcut here :) } } return HAL_OK; @@ -306,12 +310,12 @@ HAL_StatusTypeDef Downstream_CheckBeginPacketReception(void) //This is called by EXTI3 falling edge interrupt, //indicating that downstream is ready for next transaction. -void Downstream_TxOkInterrupt(void) +void Upstream_TxOkInterrupt(void) { - switch (DownstreamInterfaceState) + switch (UpstreamInterfaceState) { - case INTERFACE_STATE_TX_SIZE_WAIT: - DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE; + case UPSTREAM_INTERFACE_TX_SIZE_WAIT: + UpstreamInterfaceState = UPSTREAM_INTERFACE_TX_SIZE; SPI1_NSS_ASSERT; if (HAL_SPI_Transmit_DMA(&Hspi1, (uint8_t*)&CurrentWorkingPacket->Length, @@ -321,8 +325,8 @@ void Downstream_TxOkInterrupt(void) } break; - case INTERFACE_STATE_TX_PACKET_WAIT: - DownstreamInterfaceState = INTERFACE_STATE_TX_PACKET; + case UPSTREAM_INTERFACE_TX_PACKET_WAIT: + UpstreamInterfaceState = UPSTREAM_INTERFACE_TX_PACKET; SPI1_NSS_ASSERT; if ((HAL_SPI_Transmit_DMA(&Hspi1, &CurrentWorkingPacket->CommandClass, @@ -332,12 +336,12 @@ void Downstream_TxOkInterrupt(void) } break; - case INTERFACE_STATE_RX_SIZE_WAIT: - Downstream_GetFreePacket(Downstream_BeginPacketReception); + case UPSTREAM_INTERFACE_RX_SIZE_WAIT: + Upstream_GetFreePacket(Upstream_BeginPacketReception); break; - case INTERFACE_STATE_RX_PACKET_WAIT: - DownstreamInterfaceState = INTERFACE_STATE_RX_PACKET; + case UPSTREAM_INTERFACE_RX_PACKET_WAIT: + UpstreamInterfaceState = UPSTREAM_INTERFACE_RX_PACKET; SPI1_NSS_ASSERT; if ((HAL_SPI_Receive_DMA(&Hspi1, &CurrentWorkingPacket->CommandClass, @@ -355,13 +359,13 @@ void Downstream_TxOkInterrupt(void) //Internal use only. //Called when we want to receive downstream packet, and a packet buffer has become free. -void Downstream_BeginPacketReception(DownstreamPacketTypeDef* freePacket) +void Upstream_BeginPacketReception(UpstreamPacketTypeDef* freePacket) { - if (DownstreamInterfaceState != INTERFACE_STATE_RX_SIZE_WAIT) + if (UpstreamInterfaceState != UPSTREAM_INTERFACE_RX_SIZE_WAIT) { SPI_INTERFACE_FREAKOUT_VOID; } - DownstreamInterfaceState = INTERFACE_STATE_RX_SIZE; + UpstreamInterfaceState = UPSTREAM_INTERFACE_RX_SIZE; CurrentWorkingPacket = freePacket; CurrentWorkingPacket->Length = 0; //Our RX buffer is used by HAL_SPI_Receive_DMA as dummy TX data, we set Length to 0 so downstream will know this is a dummy packet. SPI1_NSS_ASSERT; @@ -382,30 +386,30 @@ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) SPI1_NSS_DEASSERT; - if ((DownstreamInterfaceState != INTERFACE_STATE_RX_SIZE) && - (DownstreamInterfaceState != INTERFACE_STATE_RX_PACKET)) + if ((UpstreamInterfaceState != UPSTREAM_INTERFACE_RX_SIZE) && + (UpstreamInterfaceState != UPSTREAM_INTERFACE_RX_PACKET)) { SPI_INTERFACE_FREAKOUT_VOID; } - if (DownstreamInterfaceState == INTERFACE_STATE_RX_SIZE) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_RX_SIZE) { - if ((CurrentWorkingPacket->Length < DOWNSTREAM_PACKET_LEN_MIN) || - (CurrentWorkingPacket->Length > DOWNSTREAM_PACKET_LEN)) + if ((CurrentWorkingPacket->Length < UPSTREAM_PACKET_LEN_MIN) || + (CurrentWorkingPacket->Length > UPSTREAM_PACKET_LEN)) { SPI_INTERFACE_FREAKOUT_VOID; } - DownstreamInterfaceState = INTERFACE_STATE_RX_PACKET_WAIT; + UpstreamInterfaceState = UPSTREAM_INTERFACE_RX_PACKET_WAIT; if (DOWNSTREAM_TX_OK_ACTIVE) { - Downstream_TxOkInterrupt(); + Upstream_TxOkInterrupt(); } return; } - if (DownstreamInterfaceState == INTERFACE_STATE_RX_PACKET) + if (UpstreamInterfaceState == UPSTREAM_INTERFACE_RX_PACKET) { - DownstreamInterfaceState = INTERFACE_STATE_IDLE; + UpstreamInterfaceState = UPSTREAM_INTERFACE_IDLE; if ((SentCommandClass != (CurrentWorkingPacket->CommandClass & COMMAND_CLASS_MASK)) || (SentCommand != CurrentWorkingPacket->Command)) {