/*----------------------------------------------* * 包含头文件 * *----------------------------------------------*/ #include "bsp_dbg_uart.h" #include "cola_device.h" #include "cola_init.h" #include "cola_fifo.h" #include "shell_port.h" #include "sdk_project_config.h" #include #include /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ #define DBG_UART_RX_BUF_LEN 256 /*----------------------------------------------* * 枚举定义 * *----------------------------------------------*/ /*----------------------------------------------* * 结构体定义 * *----------------------------------------------*/ /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ /** \var s_bsp_dbg_uart_dev * \brief debug uart的操作句柄 */ static cola_device_t s_bsp_dbg_uart_dev; /** \var s_bsp_dbg_uart_rx_buf_handle * \brief debug uart rx ringbuf的操作句柄 */ static cola_fifo_t s_bsp_dbg_uart_rx_buf_handle; /** \var s_bsp_dbg_uart_rx_buf * \brief debug uart rx ringbuf */ static uint8_t s_bsp_dbg_uart_rx_buf[DBG_UART_RX_BUF_LEN]; /* Timeout in ms for blocking operations */ #define TIMEOUT 500U /* Receive buffer size */ #define BUFFER_SIZE 256U #define uart_instance uart_instance_lu1 #define UART_PAL_CONFIG &LPUART_1_uart_pal_config0 /* Buffer used to receive data from the console */ uint8_t RX_buffer[BUFFER_SIZE]; uint8_t bufferIdx; uint8_t recv_buf = 0; /** \var s_bsp_dbg_uart_dev * \brief debug uart的操作句柄 */ static struct cola_device_ops bsp_dbg_uart_ops = { .open = bsp_dbg_uart_open, .close = bsp_dbg_uart_close, .write = bsp_dbg_uart_write, .read = bsp_dbg_uart_read }; /*----------------------------------------------* * 函数原型说明 * *----------------------------------------------*/ /* UART rx callback for continuous reception, byte by byte */ void rxCallback(void *driverState, uart_event_t event, void *userData) { /* Unused parameters */ (void)driverState; (void)userData; /* Check the event type */ if (event == UART_EVENT_RX_FULL) { /* The reception stops when newline is received or the buffer is full */ if ((RX_buffer[bufferIdx] != '\n') && (bufferIdx != (BUFFER_SIZE - 2U))) { /* Update the buffer index and the rx buffer */ bufferIdx++; UART_SetRxBuffer(&uart_instance, &RX_buffer[bufferIdx], 1U); } } ; } /** * @brief DBG USART RX IRQ callback * @param None * @return None */ static void bsp_dbg_uart_rx_irq_callback(void) { //uint8_t data = (uint8_t)USART_ReadData(DBG_USART_UNIT); //cola_fifo_write(&s_bsp_dbg_uart_rx_buf_handle, &data, 1); } /** * @brief debug uart open. * @param [in] cola_device_t *dev 设备操作句柄 * @param [in] int oflag 无效参数 * @return None */ int bsp_dbg_uart_open(cola_device_t *dev, int oflag) { // 初始化接收fifo cola_fifo_init(&s_bsp_dbg_uart_rx_buf_handle, s_bsp_dbg_uart_rx_buf, DBG_UART_RX_BUF_LEN); bsp_dbg_uart_init_uart(); return 0; } /** * @brief debug uart close. * @param [in] cola_device_t *dev 设备操作句柄 * @return None */ int bsp_dbg_uart_close(cola_device_t *dev) { bsp_dbg_uart_deinit_uart(); // 清空数据 cola_fifo_flush(&s_bsp_dbg_uart_rx_buf_handle); return 0; } /** *@brief 向串口写入数据 * *@param cola_device_t *dev 设备句柄 *@param int pos 操作类型 *@param void *buffer 缓存空间 *@param int size 缓存空间大小 * *@return int 写入的结果 * */ int bsp_dbg_uart_write(cola_device_t *dev, int pos, const void *buffer, int size) { if (!buffer || (size == 0)) { return 0; } UART_SendDataBlocking(&uart_instance, buffer, size, TIMEOUT); return 0; } /** *@brief 从串口读取数据 * *@param cola_device_t *dev 设备句柄 *@param int pos 操作类型 *@param void *buffer 缓存空间 *@param int size 缓存空间大小 * *@return int 读入的长度 * */ int bsp_dbg_uart_read(cola_device_t *dev, int pos, void *buffer, int size) { status_t status; uint32_t bytesRemaining; UART_ReceiveData(&uart_instance, RX_buffer, 1U); } /** *@brief 串口初始化 * *@param none * *@return none * */ void bsp_dbg_uart_init_uart(void) { UART_Init(&uart_instance, UART_PAL_CONFIG); #if 0 LPUART_DRV_Init(INST_LPUART_0, &lpUartState0, &lpuart_0_InitConfig0); LPUART_DRV_InstallRxCallback(INST_LPUART_0, rxCallback, NULL); //printf("hello\r\n"); #endif } /** *@brief 串口去初始化 * *@param none * *@return none * */ void bsp_dbg_uart_deinit_uart(void) { } ///* 锟截讹拷锟斤拷 _write */ int _write(int fd, char *buf, int nbytes) { UART_SendDataBlocking(&uart_instance, buf, nbytes, TIMEOUT); //LPUART_DRV_SendDataBlocking(INST_LPUART_0, buf, nbytes, TIMEOUT); return nbytes; } void bsp_dbg_uart_read_uart(void) { /* Write your local variable definition here */ status_t status; /* Declare a buffer used to store the received data */ uint32_t bytesRemaining; /* Receive and store data byte by byte until new line character is received, * or the buffer becomes full (256 characters received) */ //LPUART_DRV_ReceiveData(INST_LPUART_0, RX_buffer, 1U); /* Wait for transfer to be completed */ //while(LPUART_DRV_GetReceiveStatus(INST_LPUART_0, &bytesRemaining) == STATUS_BUSY); #if 0 /* Check the status */ status = LPUART_DRV_GetReceiveStatus(INST_LPUART_0, &bytesRemaining); if (status != STATUS_SUCCESS) { /* If an error occurred, send the error message and exit the loop */ //LPUART_DRV_SendDataBlocking(INST_LPUART_0, (uint8_t *)errorMsg, strlen(errorMsg), TIMEOUT); //break; } /* Append string terminator to the received data */ bufferIdx++; buffer[bufferIdx] = 0U; /* If the received string is "Hello Board", send back "Hello World" */ if(strcmp((char *)buffer, "Hello Board\n") == 0) { strcpy((char *)buffer, "Hello World\n"); } /* Send the received data back */ LPUART_DRV_SendDataBlocking(INST_LPUART_0, buffer, bufferIdx, TIMEOUT); /* Reset the buffer index to start a new reception */ bufferIdx = 0U; #endif } /** *@brief debug uart适配的挂载 * *@param none *@return none * */ void bsp_dbg_uart_configuration(void) { s_bsp_dbg_uart_dev.name = "dbg_uart"; s_bsp_dbg_uart_dev.dops = &bsp_dbg_uart_ops; cola_device_register(&s_bsp_dbg_uart_dev); } register_initcall(bsp_dbg_uart_configuration);