mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			STM32 serial: improve irq index management for L4 devices
							parent
							
								
									665d4a8003
								
							
						
					
					
						commit
						84269c7ca2
					
				| 
						 | 
				
			
			@ -45,69 +45,79 @@ UART_HandleTypeDef uart_handlers[UART_NUM];
 | 
			
		|||
 | 
			
		||||
static uart_irq_handler irq_handler;
 | 
			
		||||
 | 
			
		||||
// Defined in serial_api.c
 | 
			
		||||
inline int8_t get_uart_index(UARTName uart_name);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * INTERRUPTS HANDLING
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void uart_irq(int id)
 | 
			
		||||
static void uart_irq(UARTName uart_name)
 | 
			
		||||
{
 | 
			
		||||
    UART_HandleTypeDef * huart = &uart_handlers[id];
 | 
			
		||||
    
 | 
			
		||||
    if (serial_irq_ids[id] != 0) {
 | 
			
		||||
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
 | 
			
		||||
            if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
 | 
			
		||||
                irq_handler(serial_irq_ids[id], TxIrq);
 | 
			
		||||
    int8_t id = get_uart_index(uart_name);
 | 
			
		||||
 | 
			
		||||
    if (id >= 0) {
 | 
			
		||||
        UART_HandleTypeDef * huart = &uart_handlers[id];
 | 
			
		||||
        if (serial_irq_ids[id] != 0) {
 | 
			
		||||
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
 | 
			
		||||
                if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
 | 
			
		||||
                    irq_handler(serial_irq_ids[id], TxIrq);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
 | 
			
		||||
            if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
 | 
			
		||||
                irq_handler(serial_irq_ids[id], RxIrq);
 | 
			
		||||
                /*  Flag has been cleared when reading the content */
 | 
			
		||||
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
 | 
			
		||||
                if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
 | 
			
		||||
                    irq_handler(serial_irq_ids[id], RxIrq);
 | 
			
		||||
                    /* Flag has been cleared when reading the content */
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
 | 
			
		||||
            if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
 | 
			
		||||
                volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; // Clear ORE flag
 | 
			
		||||
            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
 | 
			
		||||
                if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
 | 
			
		||||
                    volatile uint32_t tmpval __attribute__((unused)) = huart->Instance->RDR; // Clear ORE flag
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(USART1_BASE)
 | 
			
		||||
static void uart1_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(0);
 | 
			
		||||
    uart_irq(UART_1);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USART2_BASE)
 | 
			
		||||
static void uart2_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(1);
 | 
			
		||||
    uart_irq(UART_2);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(USART3_BASE)
 | 
			
		||||
static void uart3_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(2);
 | 
			
		||||
    uart_irq(UART_3);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(UART4_BASE)
 | 
			
		||||
static void uart4_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(3);
 | 
			
		||||
    uart_irq(UART_4);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(UART5_BASE)
 | 
			
		||||
static void uart5_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(4);
 | 
			
		||||
    uart_irq(UART_5);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(LPUART1_BASE)
 | 
			
		||||
static void lpuart1_irq(void)
 | 
			
		||||
{
 | 
			
		||||
    uart_irq(5);
 | 
			
		||||
    uart_irq(LPUART_1);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -126,41 +136,44 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
 | 
			
		|||
    IRQn_Type irq_n = (IRQn_Type)0;
 | 
			
		||||
    uint32_t vector = 0;
 | 
			
		||||
 | 
			
		||||
    if (obj_s->uart == UART_1) {
 | 
			
		||||
        irq_n = USART1_IRQn;
 | 
			
		||||
        vector = (uint32_t)&uart1_irq;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj_s->uart == UART_2) {
 | 
			
		||||
        irq_n = USART2_IRQn;
 | 
			
		||||
        vector = (uint32_t)&uart2_irq;
 | 
			
		||||
    }
 | 
			
		||||
    switch (obj_s->uart) {
 | 
			
		||||
#if defined(USART1_BASE)
 | 
			
		||||
        case UART_1:
 | 
			
		||||
            irq_n = USART1_IRQn;
 | 
			
		||||
            vector = (uint32_t)&uart1_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(USART2_BASE)
 | 
			
		||||
        case UART_2:
 | 
			
		||||
            irq_n = USART2_IRQn;
 | 
			
		||||
            vector = (uint32_t)&uart2_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(USART3_BASE)
 | 
			
		||||
    if (obj_s->uart == UART_3) {
 | 
			
		||||
        irq_n = USART3_IRQn;
 | 
			
		||||
        vector = (uint32_t)&uart3_irq;
 | 
			
		||||
    }
 | 
			
		||||
        case UART_3:
 | 
			
		||||
            irq_n = USART3_IRQn;
 | 
			
		||||
            vector = (uint32_t)&uart3_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(UART4_BASE)
 | 
			
		||||
    if (obj_s->uart == UART_4) {
 | 
			
		||||
        irq_n = UART4_IRQn;
 | 
			
		||||
        vector = (uint32_t)&uart4_irq;
 | 
			
		||||
    }
 | 
			
		||||
        case UART_4:
 | 
			
		||||
            irq_n = UART4_IRQn;
 | 
			
		||||
            vector = (uint32_t)&uart4_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(UART5_BASE)
 | 
			
		||||
    if (obj_s->uart == UART_5) {
 | 
			
		||||
        irq_n = UART5_IRQn;
 | 
			
		||||
        vector = (uint32_t)&uart5_irq;
 | 
			
		||||
    }
 | 
			
		||||
        case UART_5:
 | 
			
		||||
            irq_n = UART5_IRQn;
 | 
			
		||||
            vector = (uint32_t)&uart5_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(LPUART1_BASE)
 | 
			
		||||
    if (obj_s->uart == LPUART_1) {
 | 
			
		||||
        irq_n = LPUART1_IRQn;
 | 
			
		||||
        vector = (uint32_t)&lpuart1_irq;
 | 
			
		||||
    }
 | 
			
		||||
        case LPUART_1:
 | 
			
		||||
            irq_n = LPUART1_IRQn;
 | 
			
		||||
            vector = (uint32_t)&lpuart1_irq;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (enable) {
 | 
			
		||||
        if (irq == RxIrq) {
 | 
			
		||||
| 
						 | 
				
			
			@ -311,48 +324,48 @@ static void serial_enable_event(serial_t *obj, int event, uint8_t enable)
 | 
			
		|||
/**
 | 
			
		||||
* Get index of serial object TX IRQ, relating it to the physical peripheral.
 | 
			
		||||
*
 | 
			
		||||
* @param obj pointer to serial object
 | 
			
		||||
* @param uart_name i.e. UART_1, UART_2, ...
 | 
			
		||||
* @return internal NVIC TX IRQ index of U(S)ART peripheral
 | 
			
		||||
*/
 | 
			
		||||
static IRQn_Type serial_get_irq_n(serial_t *obj)
 | 
			
		||||
static IRQn_Type serial_get_irq_n(UARTName uart_name)
 | 
			
		||||
{
 | 
			
		||||
    struct serial_s *obj_s = SERIAL_S(obj);
 | 
			
		||||
    IRQn_Type irq_n;
 | 
			
		||||
 | 
			
		||||
    switch (obj_s->index) {
 | 
			
		||||
        case 0:
 | 
			
		||||
    switch (uart_name) {
 | 
			
		||||
#if defined(USART1_BASE)
 | 
			
		||||
        case UART_1:
 | 
			
		||||
            irq_n = USART1_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 1:
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(USART2_BASE)
 | 
			
		||||
        case UART_2:
 | 
			
		||||
            irq_n = USART2_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(USART3_BASE)
 | 
			
		||||
        case 2:
 | 
			
		||||
        case UART_3:
 | 
			
		||||
            irq_n = USART3_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(UART4_BASE)
 | 
			
		||||
        case 3:
 | 
			
		||||
        case UART_4:
 | 
			
		||||
            irq_n = UART4_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(UART5_BASE)
 | 
			
		||||
        case 4:
 | 
			
		||||
        case UART_5:
 | 
			
		||||
            irq_n = UART5_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(LPUART1_BASE)
 | 
			
		||||
        case 5:
 | 
			
		||||
        case LPUART_1:
 | 
			
		||||
            irq_n = LPUART1_IRQn;
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            irq_n = (IRQn_Type)0;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return irq_n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -397,7 +410,7 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
 | 
			
		|||
    serial_enable_event(obj, event, 1); // Set only the wanted events
 | 
			
		||||
    
 | 
			
		||||
    // Enable interrupt
 | 
			
		||||
    IRQn_Type irq_n = serial_get_irq_n(obj);
 | 
			
		||||
    IRQn_Type irq_n = serial_get_irq_n(obj_s->uart);
 | 
			
		||||
    NVIC_ClearPendingIRQ(irq_n);
 | 
			
		||||
    NVIC_DisableIRQ(irq_n);
 | 
			
		||||
    NVIC_SetPriority(irq_n, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -447,7 +460,7 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
 | 
			
		|||
    
 | 
			
		||||
    serial_rx_buffer_set(obj, rx, rx_length, rx_width);
 | 
			
		||||
 | 
			
		||||
    IRQn_Type irq_n = serial_get_irq_n(obj);
 | 
			
		||||
    IRQn_Type irq_n = serial_get_irq_n(obj_s->uart);
 | 
			
		||||
    NVIC_ClearPendingIRQ(irq_n);
 | 
			
		||||
    NVIC_DisableIRQ(irq_n);
 | 
			
		||||
    NVIC_SetPriority(irq_n, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue