diff --git a/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/Kconfig b/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/Kconfig index e95c28aad..c9a07f334 100644 --- a/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/Kconfig +++ b/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/Kconfig @@ -9,8 +9,11 @@ menuconfig BSP_USING_USART1 string "serial bus 1 driver name" default "usart1_drv" config SERIAL_1_DEVICE_NAME_0 - string "serial bus 1 device name" - default "usart1_dev1" + string "serial bus 1 device 0 name" + default "usart1_dev1" + config USART1_USING_DMA + bool "usart1 using DMA" + default n endif menuconfig BSP_USING_USART2 @@ -24,8 +27,11 @@ menuconfig BSP_USING_USART2 string "serial bus 2 driver name" default "usart2_drv" config SERIAL_2_DEVICE_NAME_0 - string "serial bus 2 device name" - default "usart2_dev2" + string "serial bus 2 device 0 name" + default "usart2_dev2" + config USART2_USING_DMA + bool "usart2 using DMA" + default n endif menuconfig BSP_USING_USART3 @@ -39,8 +45,11 @@ menuconfig BSP_USING_USART3 string "serial bus 3 driver name" default "usart3_drv" config SERIAL_3_DEVICE_NAME_0 - string "serial bus 3 device name" - default "usart3_dev3" + string "serial bus 3 device 0 name" + default "usart3_dev3" + config USART3_USING_DMA + bool "usart3 using DMA" + default n endif menuconfig BSP_USING_UART4 @@ -54,8 +63,11 @@ menuconfig BSP_USING_UART4 string "serial bus 4 driver name" default "uart4_drv" config SERIAL_4_DEVICE_NAME_0 - string "serial bus 4 device name" - default "uart4_dev4" + string "serial bus 4 device 0 name" + default "uart4_dev4" + config USART4_USING_DMA + bool "usart4 using DMA" + default n endif menuconfig BSP_USING_UART5 @@ -69,6 +81,9 @@ menuconfig BSP_USING_UART5 string "serial bus 5 driver name" default "uart5_drv" config SERIAL_5_DEVICE_NAME_0 - string "serial bus 5 device name" - default "uart5_dev5" + string "serial bus 5 device 0 name" + default "uart5_dev5" + config USART5_USING_DMA + bool "usart5 using DMA" + default n endif diff --git a/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/connect_usart.c b/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/connect_usart.c index 23bed8857..32f8cda32 100644 --- a/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/connect_usart.c +++ b/Ubiquitous/XiUOS/board/aiit-arm32-board/third_party_driver/uart/connect_usart.c @@ -228,19 +228,19 @@ static void SerialCfgParamCheck(struct SerialCfgParam *serial_cfg_default, struc struct SerialDataCfg *data_cfg_default = &serial_cfg_default->data_cfg; struct SerialDataCfg *data_cfg_new = &serial_cfg_new->data_cfg; - if((data_cfg_default->serial_baud_rate != data_cfg_new->serial_baud_rate) && (data_cfg_new->serial_baud_rate)){ + if((data_cfg_default->serial_baud_rate != data_cfg_new->serial_baud_rate) && (data_cfg_new->serial_baud_rate)) { data_cfg_default->serial_baud_rate = data_cfg_new->serial_baud_rate; } - if((data_cfg_default->serial_bit_order != data_cfg_new->serial_bit_order) && (data_cfg_new->serial_bit_order)){ + if((data_cfg_default->serial_bit_order != data_cfg_new->serial_bit_order) && (data_cfg_new->serial_bit_order)) { data_cfg_default->serial_bit_order = data_cfg_new->serial_bit_order; } - if((data_cfg_default->serial_buffer_size != data_cfg_new->serial_buffer_size) && (data_cfg_new->serial_buffer_size)){ + if((data_cfg_default->serial_buffer_size != data_cfg_new->serial_buffer_size) && (data_cfg_new->serial_buffer_size)) { data_cfg_default->serial_buffer_size = data_cfg_new->serial_buffer_size; } - if((data_cfg_default->serial_data_bits != data_cfg_new->serial_data_bits) && (data_cfg_new->serial_data_bits)){ + if((data_cfg_default->serial_data_bits != data_cfg_new->serial_data_bits) && (data_cfg_new->serial_data_bits)) { data_cfg_default->serial_data_bits = data_cfg_new->serial_data_bits; } @@ -322,8 +322,7 @@ static uint32 Stm32SerialConfigure(struct SerialDriver *serial_drv, int serial_o USART_ITConfig(serial_hw_cfg->uart_device, USART_IT_RXNE, ENABLE); break; case OPER_CONFIG : - if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode) - { + if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode) { DMAConfiguration(serial_dev, serial_hw_cfg->uart_device); } } @@ -378,8 +377,16 @@ static void DmaRxDoneIsr(struct Stm32Usart *serial, struct SerialDriver *serial_ if (DMA_GetFlagStatus(dma->RxStream, dma->RxFlag) != RESET) { x_base level = CriticalAreaLock(); - x_size_t recv_len = dma->SettingRecvLen - dma->LastRecvIndex; - dma->LastRecvIndex = 0; + x_size_t recv_len; + + x_size_t recv_total_index = dma->SettingRecvLen - DMA_GetCurrDataCounter(dma->RxStream); + if (0 != recv_total_index) { + recv_len = recv_total_index - dma->LastRecvIndex; + } else { + recv_len = dma->SettingRecvLen - dma->LastRecvIndex; + } + dma->LastRecvIndex = recv_total_index; + CriticalAreaUnLock(level); if (recv_len) SerialSetIsr(serial_dev, SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); @@ -397,15 +404,14 @@ static void UartIsr(struct Stm32Usart *serial, struct SerialDriver *serial_drv, if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_RXNE) != RESET) { SerialSetIsr(serial_dev, SERIAL_EVENT_RX_IND); USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_RXNE); - } - if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) { + } else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) { DmaUartRxIdleIsr(serial_dev, dma, serial_hw_cfg->uart_device); - } - if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) { + } else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) { USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_TC); - } - if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) { - USART_ReceiveData(serial_hw_cfg->uart_device); + } else { + if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) { + USART_ReceiveData(serial_hw_cfg->uart_device); + } } } @@ -673,6 +679,9 @@ int Stm32HwUsartInit(void) serial_driver_1.private_data = (void *)&serial_cfg_1; serial_dev_param_1.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART1_USING_DMA + serial_dev_param_1.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_1.haldev.private_data = (void *)&serial_dev_param_1; NVIC_Configuration(serial_hw_cfg_1.irq); @@ -707,7 +716,6 @@ int Stm32HwUsartInit(void) serial_device_2.hwdev_done = &hwdev_done; serial_cfg_2.data_cfg = data_cfg_init; - serial_cfg_2.data_cfg.serial_baud_rate=BAUD_RATE_115200; serial_hw_cfg_2.uart_device = USART2; serial_hw_cfg_2.irq = USART2_IRQn; @@ -715,6 +723,9 @@ int Stm32HwUsartInit(void) serial_driver_2.private_data = (void *)&serial_cfg_2; serial_dev_param_2.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART2_USING_DMA + serial_dev_param_2.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_2.haldev.private_data = (void *)&serial_dev_param_2; NVIC_Configuration(serial_hw_cfg_2.irq); @@ -749,7 +760,6 @@ int Stm32HwUsartInit(void) serial_device_3.hwdev_done = &hwdev_done; serial_cfg_3.data_cfg = data_cfg_init; - serial_cfg_3.data_cfg.serial_baud_rate=BAUD_RATE_57600; serial_hw_cfg_3.uart_device = USART3; serial_hw_cfg_3.irq = USART3_IRQn; @@ -757,6 +767,9 @@ int Stm32HwUsartInit(void) serial_driver_3.private_data = (void *)&serial_cfg_3; serial_dev_param_3.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART3_USING_DMA + serial_dev_param_3.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_3.haldev.private_data = (void *)&serial_dev_param_3; NVIC_Configuration(serial_hw_cfg_3.irq); @@ -798,6 +811,9 @@ int Stm32HwUsartInit(void) serial_driver_4.private_data = (void *)&serial_cfg_4; serial_dev_param_4.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART4_USING_DMA + serial_dev_param_4.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_4.haldev.private_data = (void *)&serial_dev_param_4; NVIC_Configuration(serial_hw_cfg_4.irq); @@ -839,6 +855,9 @@ int Stm32HwUsartInit(void) serial_driver_5.private_data = (void *)&serial_cfg_5; serial_dev_param_5.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART5_USING_DMA + serial_dev_param_5.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_5.haldev.private_data = (void *)&serial_dev_param_5; NVIC_Configuration(serial_hw_cfg_5.irq); diff --git a/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/Kconfig b/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/Kconfig index 79ce0890c..c9a07f334 100644 --- a/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/Kconfig +++ b/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/Kconfig @@ -9,8 +9,11 @@ menuconfig BSP_USING_USART1 string "serial bus 1 driver name" default "usart1_drv" config SERIAL_1_DEVICE_NAME_0 - string "serial bus 1 device 0 name" - default "usart1_dev1" + string "serial bus 1 device 0 name" + default "usart1_dev1" + config USART1_USING_DMA + bool "usart1 using DMA" + default n endif menuconfig BSP_USING_USART2 @@ -24,8 +27,11 @@ menuconfig BSP_USING_USART2 string "serial bus 2 driver name" default "usart2_drv" config SERIAL_2_DEVICE_NAME_0 - string "serial bus 2 device 0 name" - default "usart2_dev2" + string "serial bus 2 device 0 name" + default "usart2_dev2" + config USART2_USING_DMA + bool "usart2 using DMA" + default n endif menuconfig BSP_USING_USART3 @@ -39,8 +45,11 @@ menuconfig BSP_USING_USART3 string "serial bus 3 driver name" default "usart3_drv" config SERIAL_3_DEVICE_NAME_0 - string "serial bus 3 device 0 name" - default "usart3_dev3" + string "serial bus 3 device 0 name" + default "usart3_dev3" + config USART3_USING_DMA + bool "usart3 using DMA" + default n endif menuconfig BSP_USING_UART4 @@ -54,8 +63,11 @@ menuconfig BSP_USING_UART4 string "serial bus 4 driver name" default "uart4_drv" config SERIAL_4_DEVICE_NAME_0 - string "serial bus 4 device 0 name" - default "uart4_dev4" + string "serial bus 4 device 0 name" + default "uart4_dev4" + config USART4_USING_DMA + bool "usart4 using DMA" + default n endif menuconfig BSP_USING_UART5 @@ -69,6 +81,9 @@ menuconfig BSP_USING_UART5 string "serial bus 5 driver name" default "uart5_drv" config SERIAL_5_DEVICE_NAME_0 - string "serial bus 5 device 0 name" - default "uart5_dev5" + string "serial bus 5 device 0 name" + default "uart5_dev5" + config USART5_USING_DMA + bool "usart5 using DMA" + default n endif diff --git a/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/connect_usart.c b/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/connect_usart.c index 9ff17887b..b10ea6cba 100644 --- a/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/connect_usart.c +++ b/Ubiquitous/XiUOS/board/stm32f407-st-discovery/third_party_driver/uart/connect_usart.c @@ -280,7 +280,7 @@ static uint32 Stm32SerialInit(struct SerialDriver *serial_drv, struct BusConfigu USART_InitStructure.USART_WordLength = USART_WordLength_9b; } - if (serial_cfg->data_cfg.serial_stop_bits == STOP_BITS_1){ + if (serial_cfg->data_cfg.serial_stop_bits == STOP_BITS_1) { USART_InitStructure.USART_StopBits = USART_StopBits_1; } else if (serial_cfg->data_cfg.serial_stop_bits == STOP_BITS_2) { USART_InitStructure.USART_StopBits = USART_StopBits_2; @@ -323,7 +323,7 @@ static uint32 Stm32SerialConfigure(struct SerialDriver *serial_drv, int serial_o USART_ITConfig(serial_hw_cfg->uart_device, USART_IT_RXNE, ENABLE); break; case OPER_CONFIG : - if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode){ + if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode) { DMAConfiguration(serial_dev, serial_hw_cfg->uart_device); } } @@ -378,8 +378,16 @@ static void DmaRxDoneIsr(struct Stm32Usart *serial, struct SerialDriver *serial_ if (DMA_GetFlagStatus(dma->RxStream, dma->RxFlag) != RESET) { x_base level = CriticalAreaLock(); - x_size_t recv_len = dma->SettingRecvLen - dma->LastRecvIndex; - dma->LastRecvIndex = 0; + x_size_t recv_len; + + x_size_t recv_total_index = dma->SettingRecvLen - DMA_GetCurrDataCounter(dma->RxStream); + if (0 != recv_total_index) { + recv_len = recv_total_index - dma->LastRecvIndex; + } else { + recv_len = dma->SettingRecvLen - dma->LastRecvIndex; + } + dma->LastRecvIndex = recv_total_index; + CriticalAreaUnLock(level); if (recv_len) SerialSetIsr(serial_dev, SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); @@ -397,15 +405,14 @@ static void UartIsr(struct Stm32Usart *serial, struct SerialDriver *serial_drv, if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_RXNE) != RESET) { SerialSetIsr(serial_dev, SERIAL_EVENT_RX_IND); USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_RXNE); - } - if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) { + } else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) { DmaUartRxIdleIsr(serial_dev, dma, serial_hw_cfg->uart_device); - } - if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) { + } else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) { USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_TC); - } - if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) { - USART_ReceiveData(serial_hw_cfg->uart_device); + } else { + if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) { + USART_ReceiveData(serial_hw_cfg->uart_device); + } } } @@ -673,6 +680,9 @@ int Stm32HwUsartInit(void) serial_driver_1.private_data = (void *)&serial_cfg_1; serial_dev_param_1.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART1_USING_DMA + serial_dev_param_1.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_1.haldev.private_data = (void *)&serial_dev_param_1; NVIC_Configuration(serial_hw_cfg_1.irq); @@ -714,6 +724,9 @@ int Stm32HwUsartInit(void) serial_driver_2.private_data = (void *)&serial_cfg_2; serial_dev_param_2.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART2_USING_DMA + serial_dev_param_2.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_2.haldev.private_data = (void *)&serial_dev_param_2; NVIC_Configuration(serial_hw_cfg_2.irq); @@ -755,6 +768,9 @@ int Stm32HwUsartInit(void) serial_driver_3.private_data = (void *)&serial_cfg_3; serial_dev_param_3.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART3_USING_DMA + serial_dev_param_3.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_3.haldev.private_data = (void *)&serial_dev_param_3; NVIC_Configuration(serial_hw_cfg_3.irq); @@ -796,6 +812,9 @@ int Stm32HwUsartInit(void) serial_driver_4.private_data = (void *)&serial_cfg_4; serial_dev_param_4.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART4_USING_DMA + serial_dev_param_4.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_4.haldev.private_data = (void *)&serial_dev_param_4; NVIC_Configuration(serial_hw_cfg_4.irq); @@ -837,6 +856,9 @@ int Stm32HwUsartInit(void) serial_driver_5.private_data = (void *)&serial_cfg_5; serial_dev_param_5.serial_work_mode = SIGN_OPER_INT_RX; +#ifdef USART5_USING_DMA + serial_dev_param_5.serial_work_mode = SIGN_OPER_DMA_RX; +#endif serial_device_5.haldev.private_data = (void *)&serial_dev_param_5; NVIC_Configuration(serial_hw_cfg_5.irq); diff --git a/Ubiquitous/XiUOS/kernel/kernel_test/test_serial.c b/Ubiquitous/XiUOS/kernel/kernel_test/test_serial.c index 8fbd0cf61..f810be149 100644 --- a/Ubiquitous/XiUOS/kernel/kernel_test/test_serial.c +++ b/Ubiquitous/XiUOS/kernel/kernel_test/test_serial.c @@ -66,11 +66,13 @@ static void TestSerialRecvTask(void *parameter) read_param.buffer = &recv_data; read_param.read_length = 0; + KPrintf("ready to read data\n"); BusDevReadData(bus_device, &read_param); for (i = 0; i < read_param.read_length; i ++) { KPrintf("TestSerialRecvTask i %d char 0x%x\n", i, recv_data); } + KPrintf("send data %c\n", recv_data); write_param.buffer = &recv_data; write_param.size = 1; BusDevWriteData(bus_device, &write_param); @@ -141,7 +143,8 @@ static int SerialBusCheck(const char *bus_name, const char *driver_name, const c bus->match(bus_driver, bus_device); /*step 3: open bus_device, configure struct SerialDevParam if necessary*/ - serial_dev_param->serial_set_mode = SIGN_OPER_INT_RX; + serial_dev_param->serial_set_mode = 0; + serial_dev_param->serial_work_mode = SIGN_OPER_DMA_RX;//SIGN_OPER_INT_RX; serial_dev_param->serial_stream_mode = SIGN_OPER_STREAM; BusDevOpen(bus_device); KPrintf("BusDevOpen done\n"); diff --git a/Ubiquitous/XiUOS/resources/serial/dev_serial.c b/Ubiquitous/XiUOS/resources/serial/dev_serial.c index d97e336fe..1e694ed6b 100644 --- a/Ubiquitous/XiUOS/resources/serial/dev_serial.c +++ b/Ubiquitous/XiUOS/resources/serial/dev_serial.c @@ -303,6 +303,7 @@ static inline int SerialDevDMARead(struct SerialHardwareDevice *serial_dev, stru serial_dev->serial_fifo.serial_rx->serial_rx_buffer, read_dma_length + serial_dev->serial_fifo.serial_rx->serial_recv_num - serial_cfg->data_cfg.serial_buffer_size); } SerialDmaRxSetRecvLength(serial_dev, read_dma_length); + read_param->read_length = read_dma_length; CriticalAreaUnLock(lock); return EOK; } else { diff --git a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c index 564d8325e..277349d35 100644 --- a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c +++ b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c @@ -1642,14 +1642,12 @@ void shellTask(void *param) /* One input key from the the keyboard/uart may consist of mutliple characters (e.g., arrow keys). */ char data[KEY_LENGTH]; int i; - int data_len; + char data_len; while(RET_TRUE) { - if (shell->read && shell->read(data) == 0) { - // KPrintf("in 1741 the char is: '%c' and ascii code is %d.\n\n",data,data); - // KPrintf("the buffer is:'%s'\n\n",shell->parser.); - data_len = strlen(data); + if (shell->read) { + data_len = shell->read(data); for (i = 0; i < data_len; i++) { shellHandler(shell, data[i]); } diff --git a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell_port.c b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell_port.c index 5393fb9e0..607d53749 100644 --- a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell_port.c +++ b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell_port.c @@ -46,13 +46,17 @@ void userShellWrite(char data) */ signed char userShellRead(char *data) { + char read_length = 0; struct BusBlockReadParam read_param; + read_param.read_length = 0; read_param.size = 1; read_param.buffer = data; BusDevReadData(console, &read_param); - return 0; + read_length = (char)read_param.read_length; + + return read_length; } #ifdef SHELL_ENABLE_FILESYSTEM @@ -107,7 +111,7 @@ int userShellInit(void) /*Open the serial device in interrupt receiving and polling sending mode */ struct SerialDevParam *serial_dev_param = (struct SerialDevParam *)console->private_data; - serial_dev_param->serial_set_mode = SIGN_OPER_INT_RX; + serial_dev_param->serial_set_mode = 0; serial_dev_param->serial_stream_mode = SIGN_OPER_STREAM; BusDevOpen(console);