From 5f911c6dc2d157826b212971e92b4c1bc16395ec Mon Sep 17 00:00:00 2001 From: thread-liu Date: Sat, 24 Oct 2020 11:59:21 +0800 Subject: [PATCH] [update] mp1 drivers and add rs485 driver. --- .../stm32mp157a-st-discovery/board/Kconfig | 23 +++- .../stm32mp157a-st-discovery/board/SConscript | 3 + .../board/ports/OpenAMP/drv_openamp.c | 8 +- .../board/ports/drv_rcc.c | 9 +- .../board/ports/drv_rs485.c | 110 ++++++++++++++++++ .../board/ports/drv_rs485.h | 25 ++++ 6 files changed, 167 insertions(+), 11 deletions(-) create mode 100644 bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.c create mode 100644 bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.h diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig b/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig index 6f8ee6d86..2ea8df97a 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig +++ b/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig @@ -35,9 +35,24 @@ menu "Onboard Peripheral Drivers" config BSP_USING_OPENAMP bool "Enable OpenAMP" - select RT_USING_OPENAMP default n + menuconfig BSP_USING_RS485 + bool "Enable RS485 " + default n + if BSP_USING_RS485 + comment "set rts pin number " + config BSP_RS485_RTS_PIN + int "RS485 rts pin number" + range 1 176 + default 5 + + config RS485_UART_DEVICE_NAME + string "the uart name for rs485" + default "uart3" + + endif + endmenu menu "On-chip Peripheral Drivers" @@ -59,12 +74,10 @@ menu "On-chip Peripheral Drivers" config BSP_USING_UART3 bool "Enable UART3" default y - config BSP_UART3_RX_USING_DMA bool "Enable UART3 RX DMA" - depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA default n - config BSP_UART3_TX_USING_DMA bool "Enable UART3 TX DMA" depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA @@ -73,12 +86,10 @@ menu "On-chip Peripheral Drivers" config BSP_USING_UART4 bool "Enable UART4" default y - config BSP_UART4_RX_USING_DMA bool "Enable UART4 RX DMA" depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA default n - config BSP_UART4_TX_USING_DMA bool "Enable UART4 TX DMA" depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/SConscript b/bsp/stm32/stm32mp157a-st-discovery/board/SConscript index 305b3e60d..a99f95d78 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/SConscript +++ b/bsp/stm32/stm32mp157a-st-discovery/board/SConscript @@ -37,6 +37,9 @@ if GetDepend(['BSP_USING_TIM14']): if GetDepend(['BSP_USING_PMIC']): src += Glob('ports/drv_pmic.c') +if GetDepend(['BSP_USING_RS485']): + src += Glob('ports/drv_rs485.c') + if GetDepend(['BSP_USING_OPENAMP']): src += Glob('CubeMX_Config/CM4/Src/ipcc.c') src += Glob('CubeMX_Config/CM4/Src/openamp.c') diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/ports/OpenAMP/drv_openamp.c b/bsp/stm32/stm32mp157a-st-discovery/board/ports/OpenAMP/drv_openamp.c index 58e1c95f3..acdaa481a 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/ports/OpenAMP/drv_openamp.c +++ b/bsp/stm32/stm32mp157a-st-discovery/board/ports/OpenAMP/drv_openamp.c @@ -12,6 +12,7 @@ #ifdef BSP_USING_OPENAMP +#include #include #include #include @@ -234,7 +235,12 @@ int rt_hw_openamp_init(void) openamp_init(); rt_hw_openamp_register(&dev_openamp, "openamp", 0, NULL); - + + if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "openamp") == 0) + { + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); + } + return RT_EOK; } INIT_PREV_EXPORT(rt_hw_openamp_init); diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rcc.c b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rcc.c index a4924fced..8c6f45ad9 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rcc.c +++ b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rcc.c @@ -9,6 +9,7 @@ */ #include "board.h" + //#define DRV_DEBUG #define LOG_TAG "drv.rcc" #include @@ -17,12 +18,12 @@ static void enable_clock(void) { - __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); } static void disable_clock(void) { - __HAL_RCC_GPIOD_CLK_DISABLE(); + __HAL_RCC_GPIOH_CLK_DISABLE(); } static int rcc_sample(int argc, char *argv[]) @@ -47,8 +48,8 @@ static int rcc_sample(int argc, char *argv[]) _exit: { rt_kprintf("Usage:\n"); - rt_kprintf("rcc_sample enable - enable GPIOD clock, the LD8 will blink '\n"); - rt_kprintf("rcc_sample disable - disable GPIOD clock, the LD8 will stop blink'\n"); + rt_kprintf("rcc_sample enable - enable GPIOH clock, the LD7 will blink '\n"); + rt_kprintf("rcc_sample disable - disable GPIOH clock, the LD7 will stop blink'\n"); } return -RT_ERROR; diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.c b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.c new file mode 100644 index 000000000..e3130643e --- /dev/null +++ b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-10-24 thread-liu first version + */ + +#include +#include "drv_rs485.h" + +#ifdef BSP_USING_RS485 + +#define RS485_OUT rt_pin_write(BSP_RS485_RTS_PIN, PIN_HIGH) +#define RS485_IN rt_pin_write(BSP_RS485_RTS_PIN, PIN_LOW) + +static rt_device_t serial = {0}; +static struct rt_semaphore rx_sem = {0}; + +/* rs485 send data callback function */ +static rt_err_t rs485_output(rt_device_t dev, void * buffer) +{ + RS485_IN; + + return RT_EOK; +} + +static rt_err_t rs485_input(rt_device_t dev, rt_size_t size) +{ + rt_sem_release(&rx_sem); + + return RT_EOK; +} + +/* send string */ +int rs485_send_data(char *tbuf, rt_uint16_t t_len) +{ + /* set rs485 mode */ + RS485_OUT; + + /* send data */ + rt_device_write(serial, 0, tbuf, t_len); + + RS485_IN; + + return RT_EOK; +} + +static void rs485_thread_entry(void *parameter) +{ + char ch; + + while (1) + { + /* A byte of data is read from a serial port, and if it is not read, it waits for the received semaphore */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + + /* The data read through the serial port output dislocation */ + ch = ch + 1; + + rs485_send_data(&ch, 1); + } +} + +/* rs485 rts pin init */ +static int rs485_init(void) +{ + /* find uart device */ + serial = rt_device_find(RS485_UART_DEVICE_NAME); + if (!serial) + { + rt_kprintf("find %s failed!\n", RS485_UART_DEVICE_NAME); + return RT_ERROR; + } + + rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); + + /* set receive data callback function */ + rt_device_set_rx_indicate(serial, rs485_input); + + /* set the send completion callback function */ + rt_device_set_tx_complete(serial, rs485_output); + + rt_pin_mode(BSP_RS485_RTS_PIN, PIN_MODE_OUTPUT); + + RS485_IN; + + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + /* create rs485 thread */ + rt_thread_t thread = rt_thread_create("rs485", rs485_thread_entry, RT_NULL, 1024, 25, 10); + + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + return RT_ERROR; + } + + return RT_EOK; +} +INIT_DEVICE_EXPORT(rs485_init); + +#endif /* bsp_using_RS485 */ diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.h b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.h new file mode 100644 index 000000000..01edf84ae --- /dev/null +++ b/bsp/stm32/stm32mp157a-st-discovery/board/ports/drv_rs485.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-10-24 thread-liu first version + */ + +#ifndef __DRV_RS485_H__ +#define __DRV_RS485_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define RS485_SEND_MODE 0 +#define RS485_RECV_MODE 1 + +#ifdef __cplusplus +} +#endif + +#endif /* drv_rs485.h */ -- GitLab