Browse Source

[update] mp1 drivers and add rs485 driver.

thread-liu 4 years ago
parent
commit
5f911c6dc2

+ 17 - 6
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

+ 3 - 0
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')

+ 7 - 1
bsp/stm32/stm32mp157a-st-discovery/board/ports/OpenAMP/drv_openamp.c

@@ -12,6 +12,7 @@
 
 #ifdef BSP_USING_OPENAMP
 
+#include <finsh.h>
 #include <drv_openamp.h>
 #include <openamp.h>
 #include <virt_uart.h>
@@ -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);

+ 5 - 4
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 <drv_log.h>
@@ -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;

+ 110 - 0
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 <board.h>
+#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 */

+ 25 - 0
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 */