From d172acba926b72c57c47697bd640c51c0fcb038d Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Tue, 20 Sep 2016 09:10:08 -0400 Subject: Still some problem with uart receive under heavy load, so change to a 2-byte receive buffer with half-complete callbacks, and raise the dma priority. --- .../TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c | 2 +- .../TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c | 42 +++++++++++++++++++--- .../TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c | 42 +++++++++++++++++++--- projects/hsm/hsm.c | 25 +++++++------ 4 files changed, 89 insertions(+), 22 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c index 7eeb6df..609c596 100644 --- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c +++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_hal_msp.c @@ -182,7 +182,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma->Init.Mode = DMA_CIRCULAR; - hdma->Init.Priority = DMA_PRIORITY_LOW; + hdma->Init.Priority = DMA_PRIORITY_HIGH; hdma->Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* hdma->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c index 7b8e97f..f69e790 100644 --- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c +++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it.c @@ -189,6 +189,12 @@ void USART2_IRQHandler(void) HAL_UART_IRQHandler(&huart_user); } +/** + * @brief Rx Transfer completed callbacks. + * @param huart: pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { extern void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart); @@ -201,23 +207,49 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) HAL_UART2_RxCpltCallback(huart); } +__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART1_RxCpltCallback could be implemented in the user file + */ +} + +__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART2_RxCpltCallback could be implemented in the user file + */ +} + /** - * @brief Rx Transfer completed callbacks. + * @brief Rx Half Transfer completed callbacks. * @param huart: pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ -__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart) +void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + extern void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart); + extern void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart); + + if (huart->Instance == USART1) + HAL_UART1_RxHalfCpltCallback(huart); + + else if (huart->Instance == USART2) + HAL_UART2_RxHalfCpltCallback(huart); +} + +__weak void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart) { /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_RxCpltCallback could be implemented in the user file + the HAL_UART1_RxHalfCpltCallback could be implemented in the user file */ } -__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) +__weak void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart) { /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file + the HAL_UART2_RxHalfCpltCallback could be implemented in the user file */ } diff --git a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c index 1118db2..0b829b3 100644 --- a/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c +++ b/libraries/mbed/targets/cmsis/TARGET_STM/TARGET_STM32F4/TARGET_CRYPTECH_ALPHA/stm32f4xx_it_rtos.c @@ -193,6 +193,12 @@ void USART2_IRQHandler(void) HAL_UART_IRQHandler(&huart_user); } +/** + * @brief Rx Transfer completed callbacks. + * @param huart: pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { extern void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart); @@ -205,23 +211,49 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) HAL_UART2_RxCpltCallback(huart); } +__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART1_RxCpltCallback could be implemented in the user file + */ +} + +__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART2_RxCpltCallback could be implemented in the user file + */ +} + /** - * @brief Rx Transfer completed callbacks. + * @brief Rx Half Transfer completed callbacks. * @param huart: pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ -__weak void HAL_UART1_RxCpltCallback(UART_HandleTypeDef *huart) +void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + extern void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart); + extern void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart); + + if (huart->Instance == USART1) + HAL_UART1_RxHalfCpltCallback(huart); + + else if (huart->Instance == USART2) + HAL_UART2_RxHalfCpltCallback(huart); +} + +__weak void HAL_UART1_RxHalfCpltCallback(UART_HandleTypeDef *huart) { /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_RxCpltCallback could be implemented in the user file + the HAL_UART1_RxHalfCpltCallback could be implemented in the user file */ } -__weak void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) +__weak void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart) { /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file + the HAL_UART2_RxHalfCpltCallback could be implemented in the user file */ } diff --git a/projects/hsm/hsm.c b/projects/hsm/hsm.c index 862e718..f2f1b12 100644 --- a/projects/hsm/hsm.c +++ b/projects/hsm/hsm.c @@ -103,7 +103,7 @@ osMutexId uart_mutex; osMutexDef(uart_mutex); #endif -static volatile uint8_t uart_rx; /* current character received from UART */ +static uint8_t uart_rx[2]; /* current character received from UART */ /* Callback for HAL_UART_Receive_DMA(). * With multiple worker threads, we can't do a blocking receive, because @@ -113,7 +113,7 @@ static volatile uint8_t uart_rx; /* current character received from UART */ * Even with only one worker thread, context-switching to the CLI thread * causes HAL_UART_Receive to miss input. */ -void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) +static void RxCallback(uint8_t c) { /* current RPC input buffer */ static rpc_buffer_t *ibuf = NULL; @@ -125,7 +125,7 @@ void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) ibuf->len = 0; } - if (hal_slip_recv_char(ibuf->buf, &ibuf->len, sizeof(ibuf->buf), &complete) != LIBHAL_OK) + if (hal_slip_process_char(c, ibuf->buf, &ibuf->len, sizeof(ibuf->buf), &complete) != LIBHAL_OK) Error_Handler(); if (complete) { @@ -135,17 +135,20 @@ void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) } } -void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +void HAL_UART2_RxHalfCpltCallback(UART_HandleTypeDef *huart) { - /* I dunno, just trap it for now */ - Error_Handler(); + RxCallback(uart_rx[0]); } -hal_error_t hal_serial_recv_char(uint8_t *cp) +void HAL_UART2_RxCpltCallback(UART_HandleTypeDef *huart) { - /* return the character from HAL_UART_Receive_DMA */ - *cp = uart_rx; - return LIBHAL_OK; + RxCallback(uart_rx[1]); +} + +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + /* I dunno, just trap it for now */ + Error_Handler(); } hal_error_t hal_serial_send_char(uint8_t c) @@ -269,7 +272,7 @@ int main() } /* Start the UART receiver. */ - if (HAL_UART_Receive_DMA(&huart_user, (uint8_t *)&uart_rx, 1) != CMSIS_HAL_OK) + if (HAL_UART_Receive_DMA(&huart_user, uart_rx, 2) != CMSIS_HAL_OK) Error_Handler(); /* Launch other threads (csprng warm-up thread?) -- cgit v1.2.3