// return the byte count received before timeout, or error(<0) int32_t serial_recv_stream_timeout (serial_t *obj, char *prxbuf, uint32_t len, uint32_t timeout_ms, void *force_cs) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); uint32_t TimeoutCount=0, StartCount; int ret; void (*task_yield)(void); task_yield = NULL; pHalRuartOp = &(obj->hal_uart_op); HalRuartEnterCritical(pHalRuartAdapter); ret = pHalRuartOp->HalRuartIntRecv(pHalRuartAdapter, (u8*)prxbuf, len); HalRuartExitCritical(pHalRuartAdapter); if ((ret == HAL_OK) && (timeout_ms > 0)) { TimeoutCount = (timeout_ms*1000/TIMER_TICK_US); StartCount = HalTimerOp.HalTimerReadCount(1); task_yield = (void (*)(void))force_cs; while (pHalRuartAdapter->State & HAL_UART_STATE_BUSY_RX) { if (HAL_TIMEOUT == RuartIsTimeout(StartCount, TimeoutCount)) { ret = pHalRuartOp->HalRuartStopRecv((VOID*)pHalRuartAdapter); ret = pHalRuartOp->HalRuartResetRxFifo((VOID*)pHalRuartAdapter); pHalRuartAdapter->Status = HAL_UART_STATUS_TIMEOUT; break; } if (NULL != task_yield) { task_yield(); } } return (len - pHalRuartAdapter->RxCount); } else { return (-ret); } }
int32_t serial_recv_stream_abort (serial_t *obj) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); int ret; pHalRuartOp = &(obj->hal_uart_op); ret = pHalRuartOp->HalRuartStopRecv((VOID*)pHalRuartAdapter); ret = pHalRuartOp->HalRuartResetRxFifo((VOID*)pHalRuartAdapter); return (ret); }
int32_t serial_recv_stream_dma_timeout (serial_t *obj, char *prxbuf, uint32_t len, uint32_t timeout_ms, void *force_cs) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); u8 uart_idx = pHalRuartAdapter->UartIndex; uint32_t TimeoutCount=0, StartCount; int ret; void (*task_yield)(void); pHalRuartOp = &(obj->hal_uart_op); if ((serial_dma_en[uart_idx] & SERIAL_RX_DMA_EN)==0) { PUART_DMA_CONFIG pHalRuartDmaCfg; pHalRuartDmaCfg = &obj->uart_gdma_cfg; if (HAL_OK == HalRuartRxGdmaInit(pHalRuartOp, pHalRuartAdapter, pHalRuartDmaCfg)) { serial_dma_en[uart_idx] |= SERIAL_RX_DMA_EN; } else { return HAL_BUSY; } } HalRuartEnterCritical(pHalRuartAdapter); ret = pHalRuartOp->HalRuartDmaRecv(pHalRuartAdapter, (u8*)prxbuf, len); HalRuartExitCritical(pHalRuartAdapter); if ((ret == HAL_OK) && (timeout_ms > 0)) { TimeoutCount = (timeout_ms*1000/TIMER_TICK_US); StartCount = HalTimerOp.HalTimerReadCount(1); task_yield = (void (*)(void))force_cs; pHalRuartAdapter->Status = HAL_UART_STATUS_OK; while (pHalRuartAdapter->State & HAL_UART_STATE_BUSY_RX) { if (HAL_TIMEOUT == RuartIsTimeout(StartCount, TimeoutCount)) { ret = pHalRuartOp->HalRuartStopRecv((VOID*)pHalRuartAdapter); ret = pHalRuartOp->HalRuartResetRxFifo((VOID*)pHalRuartAdapter); pHalRuartAdapter->Status = HAL_UART_STATUS_TIMEOUT; break; } if (NULL != task_yield) { task_yield(); } } if (pHalRuartAdapter->Status == HAL_UART_STATUS_TIMEOUT) { return (len - pHalRuartAdapter->RxCount); } else { return len; } } else { return (-ret); } // return (ret); }
int32_t serial_recv_stream_abort (serial_t *obj) { PHAL_RUART_OP pHalRuartOp; PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)&(obj->hal_uart_adp); int ret; pHalRuartOp = &(obj->hal_uart_op); HalRuartEnterCritical(pHalRuartAdapter); ret = pHalRuartOp->HalRuartStopRecv((VOID*)pHalRuartAdapter); HalRuartExitCritical(pHalRuartAdapter); if (HAL_OK != ret) { return -ret; } // pHalRuartOp->HalRuartResetRxFifo((VOID*)pHalRuartAdapter); ret = obj->rx_len - pHalRuartAdapter->RxCount; return (ret); }