瀏覽代碼

完成mb_bsp移植

mysterywolf 5 年之前
父節點
當前提交
1467ec994f
共有 3 個文件被更改,包括 52 次插入51 次删除
  1. 1 1
      Source/mb.c
  2. 0 6
      Source/mb.h
  3. 51 44
      Source/mb_bsp.c

+ 1 - 1
Source/mb.c

@@ -667,7 +667,7 @@ void  MB_ASCII_Tx (MODBUS_CH  *pch)
 }
 #endif
 
- 
+
 /*
 *********************************************************************************************************
 *                                            MB_RTU_RxByte()

+ 0 - 6
Source/mb.h

@@ -437,12 +437,6 @@ void         MB_CommPortCfg             (MODBUS_CH   *pch,
                                          CPU_INT08U   parity,
                                          CPU_INT08U   stops);
 
-
-void         MB_CommRxIntEn             (MODBUS_CH   *pch);           /* Enable  Rx interrupts                                        */
-
-void         MB_CommRxIntDis            (MODBUS_CH   *pch);           /* Disable Rx interrupts                                        */
-
-
 #if (MODBUS_CFG_RTU_EN == DEF_ENABLED)
 void         MB_RTU_TmrInit             (void);                       /* Initialize the timer used for RTU framing                    */
 

+ 51 - 44
Source/mb_bsp.c

@@ -46,8 +46,7 @@
 #include "mb.h"
 #include <os.h>
 #include <rtdevice.h>
-
-#define MODBUS_DEVICE_NAME "uart1"
+#include <stdlib.h>
 
 /*
 *********************************************************************************************************
@@ -75,9 +74,56 @@
 
 CPU_VOID  MB_CommExit (CPU_VOID)
 {
+    CPU_INT08U   ch;
+    MODBUS_CH   *pch;
+    char uart_dev_name[RT_NAME_MAX]={0};
+    rt_device_t uart_dev;
+
+    pch = &MB_ChTbl[0];
+    for (ch = 0; ch < MODBUS_CFG_MAX_CH; ch++) {
+        if(pch == RT_NULL){
+            pch++;
+            continue;
+        }
+
+        rt_snprintf(uart_dev_name, RT_NAME_MAX, "uart%d", pch->PortNbr);   
+        uart_dev = rt_device_find(uart_dev_name);
+        if(uart_dev == (rt_device_t)0){
+            pch++;
+            continue;
+        }
+
+        rt_device_close(uart_dev);
+        pch++;
+    }
+}
+
+static rt_err_t mb_rx_1_byte_handler(rt_device_t dev, rt_size_t size)
+{
+    CPU_INT08U byte;
+    CPU_INT08U   ch;
+    MODBUS_CH  *pch;
+    char dev_id_name[RT_NAME_MAX] = {0};
+    CPU_INT08U id;
+    
+    rt_strncpy(dev_id_name, &dev->parent.name[4], 2); /* "uart1" -> "1"*/
+    id = atoi(dev_id_name); /* "1" -> 1 */
+    
+    pch = &MB_ChTbl[0];
+    for (ch = 0; ch < MODBUS_CFG_MAX_CH; ch++) {
+        if(pch->PortNbr == id){
+            break;
+        }
+        pch++;
+    }
+    
+    if(rt_device_read(dev, -1, &byte, 1) == 1) /* read one byte from uart */
+    {
+        MB_RxByte(pch, byte); /* invoke MB_RxByte() */
+    }
+    return RT_EOK;
 }
 
- 
 /*
 *********************************************************************************************************
 *                                           MB_CommPortCfg()
@@ -194,7 +240,8 @@ CPU_VOID  MB_CommPortCfg (MODBUS_CH  *pch,
     config.bufsz     = 128;
     
     rt_device_control(uart_dev, RT_DEVICE_CTRL_CONFIG, &config);
-    rt_device_open(uart_dev, RT_DEVICE_FLAG_DMA_RX|RT_DEVICE_FLAG_DMA_TX);
+    rt_device_open(uart_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX);
+    rt_device_set_rx_indicate(uart_dev, mb_rx_1_byte_handler);
 }
 
 /*
@@ -243,46 +290,6 @@ void  MB_Tx (MODBUS_CH  *pch)
     }
 }
 
-/*
-*********************************************************************************************************
-*                                         MB_CommRxIntDis()
-*
-* Description : This function disables Rx interrupts.
-*
-* Argument(s) : pch        is a pointer to the Modbus channel
-*
-* Return(s)   : none.
-*
-* Caller(s)   : MB_CommExit()
-*
-* Note(s)     : none.
-*********************************************************************************************************
-*/
-
-void  MB_CommRxIntDis (MODBUS_CH  *pch)
-{
-}
-
-/*
-*********************************************************************************************************
-*                                          MB_CommRxIntEn()
-*
-* Description : This function enables Rx interrupts.
-*
-* Argument(s) : pch        is a pointer to the Modbus channel
-*
-* Return(s)   : none.
-*
-* Caller(s)   : MB_TxByte()
-*
-* Note(s)     : none.
-*********************************************************************************************************
-*/
-
-void  MB_CommRxIntEn (MODBUS_CH  *pch)
-{
-}
-
 
 /*
 *********************************************************************************************************