diff --git a/Downstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/Downstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h index d3a4832..9827e38 100644 --- a/Downstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ b/Downstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -163,6 +163,7 @@ HAL_StatusTypeDef HAL_Init(void); HAL_StatusTypeDef HAL_DeInit(void); void HAL_MspInit(void); void HAL_MspDeInit(void); +uint32_t HAL_GetHSECrystalFreqMHz(void); HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); /** * @} diff --git a/Downstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/Downstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c index 0b9ca68..951a780 100644 --- a/Downstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ b/Downstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -1009,7 +1009,8 @@ __weak uint32_t HAL_RCC_GetSysClockFreq(void) } case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ { - sysclockfreq = HSE_VALUE; + //sysclockfreq = HSE_VALUE; + sysclockfreq = (HAL_GetHSECrystalFreqMHz() * (uint32_t)1000000); break; } case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ diff --git a/Downstream/Inc/board_config.h b/Downstream/Inc/board_config.h index c898d76..66b0806 100644 --- a/Downstream/Inc/board_config.h +++ b/Downstream/Inc/board_config.h @@ -52,6 +52,10 @@ #define BOARD_REV_ID_PORT GPIOC #define BOARD_REV_1_0_BETA 0 +#define BOARD_REV_1_0_BETA_3 1 + +#define BOARD_REV_1_0_BETA_FREQ 8 +#define BOARD_REV_1_0_BETA_3_FREQ 16 #endif /* INC_BOARD_CONFIG_H_ */ diff --git a/Downstream/Src/hal_msp.c b/Downstream/Src/hal_msp.c index 157391e..046521c 100644 --- a/Downstream/Src/hal_msp.c +++ b/Downstream/Src/hal_msp.c @@ -52,6 +52,19 @@ void HAL_MspInit(void) } +uint32_t HAL_GetHSECrystalFreqMHz(void) +{ + if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) < BOARD_REV_1_0_BETA_3) + { + return BOARD_REV_1_0_BETA_FREQ; + } + else + { + return BOARD_REV_1_0_BETA_3_FREQ; + } +} + + void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct; diff --git a/Downstream/Src/main.c b/Downstream/Src/main.c index a13a160..4c4d0e7 100644 --- a/Downstream/Src/main.c +++ b/Downstream/Src/main.c @@ -58,12 +58,12 @@ int main(void) DisableFlashWrites(); CheckFirmwareMatchesHardware(); - /* Configure the system clock */ - SystemClock_Config(); - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ GPIO_Init(); LED_Init(); @@ -113,10 +113,11 @@ void CheckFirmwareMatchesHardware(void) GPIO_InitTypeDef GPIO_InitStruct; + __HAL_RCC_GPIOC_CLK_ENABLE(); + if ((*(uint32_t*)DBGMCU_BASE & DBGMCU_IDCODE_DEV_ID) == DBGMCU_IDCODE_DEV_ID_401xB_xC) { //Read in board revision and ID on port C - __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = BOARD_REV_PIN_MASK | BOARD_ID_PIN_MASK; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; @@ -125,7 +126,7 @@ void CheckFirmwareMatchesHardware(void) HAL_GPIO_Init(BOARD_REV_ID_PORT, &GPIO_InitStruct); //Correct board revision? - if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) == BOARD_REV_1_0_BETA) + if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) <= BOARD_REV_1_0_BETA_3) { //Correct board ID: downstream? if (!(BOARD_REV_ID_PORT->IDR & BOARD_ID_PIN_MASK)) @@ -162,8 +163,8 @@ void SystemClock_Config(void) RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLM = (HAL_GetHSECrystalFreqMHz() / 2); //PLL input frequency = 2MHz + RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) while (1); diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h index efbe1cb..0d5bc41 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -163,6 +163,7 @@ HAL_StatusTypeDef HAL_Init(void); HAL_StatusTypeDef HAL_DeInit(void); void HAL_MspInit(void); void HAL_MspDeInit(void); +uint32_t HAL_GetHSECrystalFreqMHz(void); HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); /** * @} diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c index 80ad960..8143f02 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -970,7 +970,8 @@ uint32_t HAL_RCC_GetSysClockFreq(void) } case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ { - sysclockfreq = HSE_VALUE; + //sysclockfreq = HSE_VALUE; + sysclockfreq = (HAL_GetHSECrystalFreqMHz() * (uint32_t)1000000); break; } case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ diff --git a/Upstream/Inc/board_config.h b/Upstream/Inc/board_config.h index 183f29a..a8a0cbc 100644 --- a/Upstream/Inc/board_config.h +++ b/Upstream/Inc/board_config.h @@ -52,6 +52,10 @@ #define BOARD_REV_ID_PORT GPIOC #define BOARD_REV_1_0_BETA 0 +#define BOARD_REV_1_0_BETA_3 1 + +#define BOARD_REV_1_0_BETA_FREQ 8 +#define BOARD_REV_1_0_BETA_3_FREQ 16 #endif /* INC_BOARD_CONFIG_H_ */ diff --git a/Upstream/Src/hal_msp.c b/Upstream/Src/hal_msp.c index 8c29f80..946726c 100755 --- a/Upstream/Src/hal_msp.c +++ b/Upstream/Src/hal_msp.c @@ -59,6 +59,19 @@ void HAL_MspInit(void) } +uint32_t HAL_GetHSECrystalFreqMHz(void) +{ + if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) < BOARD_REV_1_0_BETA_3) + { + return BOARD_REV_1_0_BETA_FREQ; + } + else + { + return BOARD_REV_1_0_BETA_3_FREQ; + } +} + + void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct; diff --git a/Upstream/Src/main.c b/Upstream/Src/main.c index b640d54..c8019ff 100755 --- a/Upstream/Src/main.c +++ b/Upstream/Src/main.c @@ -62,12 +62,12 @@ int main(void) DisableFlashWrites(); CheckFirmwareMatchesHardware(); - /* Configure the system clock */ - SystemClock_Config(); - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ GPIO_Init(); LED_Init(); @@ -108,10 +108,11 @@ void CheckFirmwareMatchesHardware(void) GPIO_InitTypeDef GPIO_InitStruct; + __HAL_RCC_GPIOC_CLK_ENABLE(); + if ((*(uint32_t*)DBGMCU_BASE & DBGMCU_IDCODE_DEV_ID) == DBGMCU_IDCODE_DEV_ID_401xB_xC) { //Read in board revision and ID on port C - __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = BOARD_REV_PIN_MASK | BOARD_ID_PIN_MASK; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; @@ -120,7 +121,7 @@ void CheckFirmwareMatchesHardware(void) HAL_GPIO_Init(BOARD_REV_ID_PORT, &GPIO_InitStruct); //Correct board revision? - if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) == BOARD_REV_1_0_BETA) + if ((BOARD_REV_ID_PORT->IDR & BOARD_REV_PIN_MASK) <= BOARD_REV_1_0_BETA_3) { //Correct board ID: upstream? if ((BOARD_REV_ID_PORT->IDR & BOARD_ID_PIN_MASK)) @@ -158,8 +159,8 @@ void SystemClock_Config(void) RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLM = (HAL_GetHSECrystalFreqMHz() / 2); //PLL input frequency = 2MHz + RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) while (1); diff --git a/Upstream/Src/upstream_msc_mock.c b/Upstream/Src/upstream_msc_mock.c deleted file mode 100644 index 606c250..0000000 --- a/Upstream/Src/upstream_msc_mock.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * upstream_msc_mock.c - * - * Created on: 17/07/2015 - * Author: Robert Fisk - * - * This file replaces upstream_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. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - - -#include -#include -#include -#include "stm32f4xx_hal.h" - - -//Stuff we need to save for our callbacks to use: -UpstreamMSCCallbackTypeDef TestReadyCallback; -UpstreamMSCCallbackUintPacketTypeDef GetCapacityCallback; -UpstreamMSCCallbackPacketTypeDef GetStreamDataCallback; -uint32_t ByteCount; -UpstreamPacketTypeDef* ReadStreamPacket; -uint8_t ReadStreamBusy; - - -static void Upstream_MSC_TestReadyReplyCallback(UpstreamPacketTypeDef* replyPacket); -static void Upstream_MSC_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPacket); -static void Upstream_MSC_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket); -static void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket); - - - -HAL_StatusTypeDef Upstream_MSC_TestReady(UpstreamMSCCallbackTypeDef 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_TransmitPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - //return Upstream_GetPacket(Upstream_MSC_TestReadyReplyCallback); - return Upstream_GetFreePacket(Upstream_MSC_TestReadyReplyCallback); -} - -void Upstream_MSC_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 Upstream_MSC_GetCapacity(UpstreamMSCCallbackUintPacketTypeDef 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_TransmitPacket(freePacket); - if (tempResult != HAL_OK) - { - return tempResult; - } - //return Upstream_GetPacket(Upstream_MSC_GetCapacityReplyCallback); - return Upstream_GetFreePacket(Upstream_MSC_GetCapacityReplyCallback); -} - - -void Upstream_MSC_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 Upstream_MSC_BeginRead(UpstreamMSCCallbackTypeDef 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_TransmitPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - //return Upstream_GetPacket(Upstream_MSC_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! - return Upstream_GetFreePacket(Upstream_MSC_TestReadyReplyCallback); -} - - - -HAL_StatusTypeDef Upstream_MSC_GetStreamDataPacket(UpstreamMSCCallbackPacketTypeDef 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? - { - Upstream_MSC_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(Upstream_MSC_GetStreamDataPacketCallback); - return Upstream_GetFreePacket(Upstream_MSC_GetStreamDataPacketCallback); -} - - -void Upstream_MSC_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) - { - Upstream_MSC_GetStreamDataPacket(NULL); //Try to get the next packet now, before USB asks for it - } -} - - - -HAL_StatusTypeDef Upstream_MSC_BeginWrite(UpstreamMSCCallbackTypeDef 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_TransmitPacket(freePacket); - if (tempResult != HAL_OK) - { - TestReadyCallback(tempResult); - } - //return Upstream_GetPacket(Upstream_MSC_BeginWriteReplyCallback); - return Upstream_GetFreePacket(Upstream_MSC_BeginWriteReplyCallback); -} - - -void Upstream_MSC_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 Upstream_MSC_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_TransmitPacket(packetToSend); -} -