void serial_init(serial_t *obj, PinName tx, PinName rx) { uint32_t uart_tx, uart_rx; uint32_t uart_sel; uint8_t uart_idx; PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter; // Determine the UART to use (UART0, UART1, or UART3) uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); uart_sel = pinmap_merge(uart_tx, uart_rx); uart_idx = RTL_GET_PERI_IDX(uart_sel); if (unlikely(uart_idx == (uint8_t)NC)) { DBG_UART_ERR("%s: Cannot find matched UART\n", __FUNCTION__); return; } pHalRuartOp = &(obj->hal_uart_op); pHalRuartAdapter = &(obj->hal_uart_adp); if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) { DBG_UART_ERR("%s: Allocate Adapter Failed\n", __FUNCTION__); return; } HalRuartOpInit((VOID*)pHalRuartOp); pHalRuartOp->HalRuartAdapterLoadDef(pHalRuartAdapter, uart_idx); pHalRuartAdapter->PinmuxSelect = RTL_GET_PERI_SEL(uart_sel); pHalRuartAdapter->BaudRate = 9600; // Configure the UART pins // TODO: // pinmap_pinout(tx, PinMap_UART_TX); // pinmap_pinout(rx, PinMap_UART_RX); // pin_mode(tx, PullUp); // pin_mode(rx, PullUp); pHalRuartOp->HalRuartInit(pHalRuartAdapter); pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter); pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter); #ifdef CONFIG_MBED_ENABLED // For stdio management if (uart_idx == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } #endif }
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_OP pHalRuartOp; u8 uart_idx; pHalRuartAdapter = &(obj->hal_uart_adp); pHalRuartOp = &(obj->hal_uart_op); uart_idx = pHalRuartAdapter->UartIndex; if (enable) { if (irq == RxIrq) { pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI; serial_irq_en[uart_idx] |= SERIAL_RX_IRQ_EN; HalRuartSetIMRRtl8195a (pHalRuartAdapter); } else { serial_irq_en[uart_idx] |= SERIAL_TX_IRQ_EN; } pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter); //log_uart pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter); } else { // disable if (irq == RxIrq) { pHalRuartAdapter->Interrupts &= ~(RUART_IER_ERBI | RUART_IER_ELSI); serial_irq_en[uart_idx] &= ~SERIAL_RX_IRQ_EN; } else { pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI; serial_irq_en[uart_idx] &= ~SERIAL_TX_IRQ_EN; } HalRuartSetIMRRtl8195a (pHalRuartAdapter); if (pHalRuartAdapter->Interrupts == 0) { InterruptUnRegister(&pHalRuartAdapter->IrqHandle); InterruptDis(&pHalRuartAdapter->IrqHandle); } } }
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { PHAL_RUART_ADAPTER pHalRuartAdapter; PHAL_RUART_OP pHalRuartOp; u8 uart_idx; pHalRuartAdapter = &(obj->hal_uart_adp); pHalRuartOp = &(obj->hal_uart_op); uart_idx = pHalRuartAdapter->UartIndex; if (enable) { if (irq == RxIrq) { pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI; serial_irq_en[uart_idx] |= SERIAL_RX_IRQ_EN; HalRuartSetIMRRtl8195a (pHalRuartAdapter); } else { serial_irq_en[uart_idx] |= SERIAL_TX_IRQ_EN; } pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter); pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter); } else { // disable if (irq == RxIrq) { pHalRuartAdapter->Interrupts &= ~(RUART_IER_ERBI | RUART_IER_ELSI); serial_irq_en[uart_idx] &= ~SERIAL_RX_IRQ_EN; } else { pHalRuartAdapter->Interrupts &= RUART_IER_ETBEI; serial_irq_en[uart_idx] &= ~SERIAL_TX_IRQ_EN; } HalRuartSetIMRRtl8195a (pHalRuartAdapter); if (pHalRuartAdapter->Interrupts == 0) { InterruptUnRegister(&pHalRuartAdapter->IrqHandle); InterruptDis(&pHalRuartAdapter->IrqHandle); } } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { uint32_t uart_tx, uart_rx; uint32_t uart_sel; uint8_t uart_idx; PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter; #ifdef CONFIG_GDMA_EN PUART_DMA_CONFIG pHalRuartDmaCfg; PHAL_GDMA_OP pHalGdmaOp=&UartGdmaOp; #endif // Determine the UART to use (UART0, UART1, or UART3) uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); uart_sel = pinmap_merge(uart_tx, uart_rx); uart_idx = RTL_GET_PERI_IDX(uart_sel); if (unlikely(uart_idx == (uint8_t)NC)) { DBG_UART_ERR("%s: Cannot find matched UART\n", __FUNCTION__); return; } #ifdef CONFIG_MBED_ENABLED else if (uart_idx == UART_3) { obj->index = UART_3; goto init_stdio; } #endif pHalRuartOp = &(obj->hal_uart_op); pHalRuartAdapter = &(obj->hal_uart_adp); if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) { DBG_UART_ERR("%s: Allocate Adapter Failed\n", __FUNCTION__); return; } HalRuartOpInit((VOID*)pHalRuartOp); #ifdef CONFIG_GDMA_EN HalGdmaOpInit((VOID*)pHalGdmaOp); pHalRuartDmaCfg = &obj->uart_gdma_cfg; pHalRuartDmaCfg->pHalGdmaOp = pHalGdmaOp; pHalRuartDmaCfg->pTxHalGdmaAdapter = &obj->uart_gdma_adp_tx; pHalRuartDmaCfg->pRxHalGdmaAdapter = &obj->uart_gdma_adp_rx; pHalRuartDmaCfg->pTxDmaBlkList = &obj->gdma_multiblk_list_tx; pHalRuartDmaCfg->pRxDmaBlkList = &obj->gdma_multiblk_list_rx; _memset((void*)(pHalRuartDmaCfg->pTxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER)); _memset((void*)(pHalRuartDmaCfg->pRxHalGdmaAdapter), 0, sizeof(HAL_GDMA_ADAPTER)); _memset((void*)(pHalRuartDmaCfg->pTxDmaBlkList), 0, sizeof(UART_DMA_MULTIBLK)); _memset((void*)(pHalRuartDmaCfg->pRxDmaBlkList), 0, sizeof(UART_DMA_MULTIBLK)); #endif pHalRuartOp->HalRuartAdapterLoadDef(pHalRuartAdapter, uart_idx); pHalRuartAdapter->PinmuxSelect = RTL_GET_PERI_SEL(uart_sel); pHalRuartAdapter->BaudRate = 9600; pHalRuartAdapter->IrqHandle.Priority = 6; if (HalRuartInit(pHalRuartAdapter) != HAL_OK) { DBG_UART_ERR("serial_init Err!\n"); return; } pHalRuartOp->HalRuartRegIrq(pHalRuartAdapter); pHalRuartOp->HalRuartIntEnable(pHalRuartAdapter); #ifdef CONFIG_MBED_ENABLED init_stdio: // For stdio management if (uart_idx == STDIO_UART) { // default setting to 38400 if (stdio_uart_inited) return; log_uart_init(&stdio_uart_log, 38400, 8, ParityNone, 1); stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } #endif }