diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/common/pin_mux.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/common/pin_mux.c index 63eed88b2..75f521a2d 100755 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/common/pin_mux.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/common/pin_mux.c @@ -995,6 +995,22 @@ void BOARD_InitUartPins(void) IOMUXC_GPIO_AD_B1_03_LPUART2_RX, 0x10B0u); #endif + +#ifdef BSP_USING_LPUART3 + IOMUXC_SetPinMux( + IOMUXC_GPIO_AD_B1_06_LPUART3_TX, + 0U); + IOMUXC_SetPinMux( + IOMUXC_GPIO_AD_B1_07_LPUART3_RX, + 0U); + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B1_06_LPUART3_TX, + 0x10B0u); + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B1_07_LPUART3_RX, + 0x10B0u); +#endif + } /*********************************************************************************************************************** diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/Kconfig b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/Kconfig index 93c86b33f..a38efb16b 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/Kconfig +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/Kconfig @@ -27,3 +27,34 @@ if BSP_USING_LPUART2 string "serial bus 2 device name" default "uart2_dev2" endif + +config BSP_USING_LPUART3 +bool "Enable LPUART3" +default y +if BSP_USING_LPUART3 + config SERIAL_BUS_NAME_3 + string "serial bus 3 name" + default "uart3" + config SERIAL_DRV_NAME_3 + string "serial bus 3 driver name" + default "uart3_drv" + config SERIAL_3_DEVICE_NAME_0 + string "serial bus 3 device name" + default "uart3_dev3" +endif + +config BSP_USING_LPUART8 +bool "Enable LPUART8" +default y +if BSP_USING_LPUART8 + config SERIAL_BUS_NAME_8 + string "serial bus 8 name" + default "uart8" + config SERIAL_DRV_NAME_8 + string "serial bus 8 driver name" + default "uart8_drv" + config SERIAL_8_DEVICE_NAME_0 + string "serial bus 8 device name" + default "uart8_dev8" +endif + diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c index 6ce8b6695..3e346fbb7 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c @@ -66,6 +66,24 @@ void LPUART2_IRQHandler(int irqn, void *arg) DECLARE_HW_IRQ(UART2_IRQn, LPUART2_IRQHandler, NONE); #endif +#ifdef BSP_USING_LPUART3 +struct SerialBus serial_bus_3; +struct SerialDriver serial_driver_3; +struct SerialHardwareDevice serial_device_3; + +void LPUART3_IRQHandler(int irqn, void *arg) +{ + + DisableIRQ(LPUART3_IRQn); + + UartIsr(&serial_bus_3, &serial_driver_3, &serial_device_3); + EnableIRQ(LPUART3_IRQn); + +} +DECLARE_HW_IRQ(LPUART3_IRQn, LPUART3_IRQHandler, NONE); +#endif + + static void SerialCfgParamCheck(struct SerialCfgParam *serial_cfg_default, struct SerialCfgParam *serial_cfg_new) { struct SerialDataCfg *data_cfg_default = &serial_cfg_default->data_cfg; @@ -426,5 +444,38 @@ int Imxrt1052HwUartInit(void) } #endif +#ifdef BSP_USING_LPUART3 + static struct SerialCfgParam serial_cfg_3; + memset(&serial_cfg_3, 0, sizeof(struct SerialCfgParam)); + + static struct SerialDevParam serial_dev_param_3; + memset(&serial_dev_param_3, 0, sizeof(struct SerialDevParam)); + + serial_driver_3.drv_done = &drv_done; + serial_driver_3.configure = &SerialDrvConfigure; + serial_device_3.hwdev_done = &hwdev_done; + + serial_cfg_3.data_cfg = data_cfg_init; + + serial_cfg_3.hw_cfg.private_data = (void *)LPUART3; + serial_cfg_3.hw_cfg.serial_irq_interrupt = LPUART3_IRQn; + serial_driver_3.private_data = (void *)&serial_cfg_3; + + serial_dev_param_3.serial_work_mode = SIGN_OPER_INT_RX; + serial_device_3.haldev.private_data = (void *)&serial_dev_param_3; + + ret = BoardSerialBusInit(&serial_bus_3, &serial_driver_3, SERIAL_BUS_NAME_3, SERIAL_DRV_NAME_3); + if (EOK != ret) { + KPrintf("Imxrt1052HwUartInit uart error ret %u\n", ret); + return ERROR; + } + + ret = BoardSerialDevBend(&serial_device_3, (void *)&serial_cfg_3, SERIAL_BUS_NAME_3, SERIAL_3_DEVICE_NAME_0); + if (EOK != ret) { + KPrintf("Imxrt1052HwUartInit uart error ret %u\n", ret); + return ERROR; + } +#endif + return ret; } diff --git a/Ubiquitous/XiZi/kernel/kernel_test/Kconfig b/Ubiquitous/XiZi/kernel/kernel_test/Kconfig index 72033058b..c8ef23852 100644 --- a/Ubiquitous/XiZi/kernel/kernel_test/Kconfig +++ b/Ubiquitous/XiZi/kernel/kernel_test/Kconfig @@ -3,6 +3,9 @@ menuconfig KERNEL_TEST default n if KERNEL_TEST + config KERNEL_TEST_485 + bool "Config test ch485" + default n config KERNEL_TEST_AVLTREE bool "Config test avl tree" default n diff --git a/Ubiquitous/XiZi/kernel/kernel_test/Makefile b/Ubiquitous/XiZi/kernel/kernel_test/Makefile index d8d58996c..9b2ab7646 100644 --- a/Ubiquitous/XiZi/kernel/kernel_test/Makefile +++ b/Ubiquitous/XiZi/kernel/kernel_test/Makefile @@ -1,5 +1,9 @@ SRC_FILES := test_main.c test_fpu.c +ifeq ($(CONFIG_KERNEL_TEST_485),y) + SRC_FILES += test_485.c +endif + ifeq ($(CONFIG_KERNEL_TEST_SEM),y) SRC_FILES += test_sem.c endif diff --git a/Ubiquitous/XiZi/kernel/kernel_test/test_485.c b/Ubiquitous/XiZi/kernel/kernel_test/test_485.c new file mode 100644 index 000000000..e03b109ec --- /dev/null +++ b/Ubiquitous/XiZi/kernel/kernel_test/test_485.c @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file test_485.c +* @brief support to test ch485 function, only support xidatong +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2022-05-30 +*/ + +#include +#include +#include "board.h" +#include "connect_ch438.h" + +#define DATA_BUFF_SIZE 255 + +static struct Bus *bus; +static struct HardwareDev *dev; +static struct Driver *drv; + +static int uart3_fd = 0; +static BusType ch485dir_pin; + +#define BSP_485A_DIR 2 + +void Set485Input() +{ + struct PinStat pin_stat; + struct BusBlockWriteParam write_param; + write_param.buffer = (void *)&pin_stat; + + pin_stat.val = GPIO_LOW; + pin_stat.pin = BSP_485A_DIR; + BusDevWriteData(ch485dir_pin->owner_haldev, &write_param); +} + +void Set485Output() +{ + struct PinStat pin_stat; + struct BusBlockWriteParam write_param; + write_param.buffer = (void *)&pin_stat; + + pin_stat.val = GPIO_HIGH; + pin_stat.pin = BSP_485A_DIR; + BusDevWriteData(ch485dir_pin->owner_haldev, &write_param); + +} + +static void Read485(void *parameter) +{ + uint8 RevLen; + + char data_buffer[128] = {0}; + char data_size = 0; + + while (1) + { + MdelayKTask(100); + + memset(data_buffer, 0, 128); + data_size = read(uart3_fd, data_buffer, 128); + + KPrintf("\n"); + for(int i=0;iowner_driver, &configure_info); + if (ret != EOK) { + KPrintf("config BSP_CH438_NWR_PIN pin %d failed!\n", BSP_485A_DIR); + return ERROR; + } + + uart3_fd = open("/dev/uart3_dev3", O_RDWR); + if (uart3_fd < 0) { + KPrintf("open fd error %d\n", uart3_fd); + } + KPrintf("open fd %d\n", uart3_fd); + + struct SerialDataCfg cfg; + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_buffer_size = 128; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = 0; + cfg.serial_invert_mode = 0; + cfg.ext_uart_no = 0; + cfg.port_configure = 0; + + KPrintf("before ioctl\n"); + + if (ret != ioctl(uart3_fd, OPE_INT, &cfg)) { + KPrintf("ioctl fd error %d\n", ret); + } + + int32 task_CH438_read = KTaskCreate("task_CH438_read", Read485, NONE, 2048, 10); + flag = StartupKTask(task_CH438_read); + if (flag != EOK) { + KPrintf("StartupKTask task_CH438_read failed .\n"); + return; + } + + int32 task_CH438_write = KTaskCreate("task_CH438_write", Write485, NONE, 2048, 10); + flag = StartupKTask(task_CH438_write); + if (flag != EOK) { + KPrintf("StartupKTask task_CH438_write failed .\n"); + return; + } +} + +void Test485(void) +{ + Test485Init(); + MdelayKTask(500); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + Test485, Test485, Test485 );