mirror of https://github.com/ARMmbed/mbed-os.git
fix for serial issue #5805
parent
90c87335ce
commit
83165deda3
|
@ -68,9 +68,13 @@ static HAL_GDMA_OP UartGdmaOp;
|
||||||
|
|
||||||
#ifdef CONFIG_MBED_ENABLED
|
#ifdef CONFIG_MBED_ENABLED
|
||||||
#include "log_uart_api.h"
|
#include "log_uart_api.h"
|
||||||
|
#include "hal_log_uart.h"
|
||||||
int stdio_uart_inited = 0;
|
int stdio_uart_inited = 0;
|
||||||
serial_t stdio_uart;
|
serial_t stdio_uart;
|
||||||
log_uart_t stdio_uart_log;
|
log_uart_t stdio_uart_log;
|
||||||
|
static uint32_t serial_log_irq_ids;
|
||||||
|
static uart_irq_handler log_irq_handler;
|
||||||
|
static uint32_t serial_log_irq_en;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void SerialTxDoneCallBack(VOID *pAdapter);
|
static void SerialTxDoneCallBack(VOID *pAdapter);
|
||||||
|
@ -256,7 +260,8 @@ static void SerialTxDoneCallBack(VOID *pAdapter)
|
||||||
pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI;
|
pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI;
|
||||||
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
||||||
|
|
||||||
if (irq_handler[uart_idx] != NULL) {
|
if (irq_handler[uart_idx] != NULL)
|
||||||
|
{
|
||||||
irq_handler[uart_idx](serial_irq_ids[uart_idx], TxIrq);
|
irq_handler[uart_idx](serial_irq_ids[uart_idx], TxIrq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -266,13 +271,49 @@ static void SerialRxDoneCallBack(VOID *pAdapter)
|
||||||
PHAL_RUART_ADAPTER pHalRuartAdapter = pAdapter;
|
PHAL_RUART_ADAPTER pHalRuartAdapter = pAdapter;
|
||||||
u8 uart_idx = pHalRuartAdapter->UartIndex;
|
u8 uart_idx = pHalRuartAdapter->UartIndex;
|
||||||
|
|
||||||
if (irq_handler[uart_idx] != NULL) {
|
if (irq_handler[uart_idx] != NULL)
|
||||||
|
{
|
||||||
irq_handler[uart_idx](serial_irq_ids[uart_idx], RxIrq);
|
irq_handler[uart_idx](serial_irq_ids[uart_idx], RxIrq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_MBED_ENABLED
|
||||||
|
static void serial_loguart_irq_handler(uint32_t id, LOG_UART_INT_ID event)
|
||||||
|
{
|
||||||
|
if(event == IIR_RX_RDY || event == IIR_CHAR_TIMEOUT)
|
||||||
|
{
|
||||||
|
if (log_irq_handler){
|
||||||
|
log_irq_handler(serial_log_irq_ids, RxIrq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(event == IIR_THR_EMPTY)
|
||||||
|
{
|
||||||
|
if (log_irq_handler){
|
||||||
|
log_irq_handler(serial_log_irq_ids, TxIrq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef CONFIG_MBED_ENABLED
|
||||||
|
if(obj->index == UART_3)
|
||||||
|
{
|
||||||
|
log_irq_handler = handler;
|
||||||
|
serial_log_irq_ids = id;
|
||||||
|
|
||||||
|
log_uart_irq_handler(&stdio_uart_log, serial_loguart_irq_handler, id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
PHAL_RUART_ADAPTER pHalRuartAdapter;
|
PHAL_RUART_ADAPTER pHalRuartAdapter;
|
||||||
u8 uart_idx;
|
u8 uart_idx;
|
||||||
|
|
||||||
|
@ -291,6 +332,22 @@ void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||||
|
|
||||||
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef CONFIG_MBED_ENABLED
|
||||||
|
if(obj->index == UART_3)
|
||||||
|
{
|
||||||
|
if(irq == RxIrq)
|
||||||
|
{
|
||||||
|
log_uart_irq_set(&stdio_uart_log, IIR_RX_RDY, enable);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_uart_irq_set(&stdio_uart_log, IIR_THR_EMPTY, enable);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
PHAL_RUART_ADAPTER pHalRuartAdapter;
|
PHAL_RUART_ADAPTER pHalRuartAdapter;
|
||||||
PHAL_RUART_OP pHalRuartOp;
|
PHAL_RUART_OP pHalRuartOp;
|
||||||
u8 uart_idx;
|
u8 uart_idx;
|
||||||
|
@ -298,27 +355,42 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||||
pHalRuartAdapter = &(obj->hal_uart_adp);
|
pHalRuartAdapter = &(obj->hal_uart_adp);
|
||||||
pHalRuartOp = &(obj->hal_uart_op);
|
pHalRuartOp = &(obj->hal_uart_op);
|
||||||
uart_idx = pHalRuartAdapter->UartIndex;
|
uart_idx = pHalRuartAdapter->UartIndex;
|
||||||
|
|
||||||
|
|
||||||
if (enable) {
|
if (enable)
|
||||||
if (irq == RxIrq) {
|
{
|
||||||
|
if (irq == RxIrq)
|
||||||
|
{
|
||||||
pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI;
|
pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI;
|
||||||
serial_irq_en[uart_idx] |= SERIAL_RX_IRQ_EN;
|
serial_irq_en[uart_idx] |= SERIAL_RX_IRQ_EN;
|
||||||
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
serial_irq_en[uart_idx] |= SERIAL_TX_IRQ_EN;
|
serial_irq_en[uart_idx] |= SERIAL_TX_IRQ_EN;
|
||||||
}
|
}
|
||||||
|
|
||||||
pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter);
|
pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter);
|
||||||
|
|
||||||
|
//log_uart
|
||||||
pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter);
|
pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter);
|
||||||
} else { // disable
|
}
|
||||||
if (irq == RxIrq) {
|
else
|
||||||
|
{ // disable
|
||||||
|
if (irq == RxIrq)
|
||||||
|
{
|
||||||
pHalRuartAdapter->Interrupts &= ~(RUART_IER_ERBI | RUART_IER_ELSI);
|
pHalRuartAdapter->Interrupts &= ~(RUART_IER_ERBI | RUART_IER_ELSI);
|
||||||
serial_irq_en[uart_idx] &= ~SERIAL_RX_IRQ_EN;
|
serial_irq_en[uart_idx] &= ~SERIAL_RX_IRQ_EN;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI;
|
pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI;
|
||||||
serial_irq_en[uart_idx] &= ~SERIAL_TX_IRQ_EN;
|
serial_irq_en[uart_idx] &= ~SERIAL_TX_IRQ_EN;
|
||||||
}
|
}
|
||||||
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
HalRuartSetIMRRtl8195a (pHalRuartAdapter);
|
||||||
if (pHalRuartAdapter->Interrupts == 0) {
|
|
||||||
|
if (pHalRuartAdapter->Interrupts == 0)
|
||||||
|
{
|
||||||
InterruptUnRegister(&pHalRuartAdapter->IrqHandle);
|
InterruptUnRegister(&pHalRuartAdapter->IrqHandle);
|
||||||
InterruptDis(&pHalRuartAdapter->IrqHandle);
|
InterruptDis(&pHalRuartAdapter->IrqHandle);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue