Просмотр исходного кода

485 IP 增加看门狗功能。

liyi 1 год назад
Родитель
Сommit
0495a5f00e
6 измененных файлов с 186 добавлено и 13 удалено
  1. 2 2
      485/CMakeLists.txt
  2. 7 3
      485/src/app.c
  3. 82 0
      485/src/main.c
  4. 8 8
      ip/CMakeLists.txt
  5. 8 0
      ip/src/common.h
  6. 79 0
      ip/src/sys.c

+ 2 - 2
485/CMakeLists.txt

@@ -4,7 +4,7 @@ cmake_minimum_required (VERSION 2.8)
 set(CMAKE_C_COMPILER "arm-openwrt-linux-gcc")
 set(CMAKE_CXX_COMPILER "arm-openwrt-linux-g++")
 
-set(SYS_ROOT "/home/liyi/tina/out/t113-bingpi_m2/staging_dir/target/usr/include")
+#set(SYS_ROOT "/home/liyi/tina/out/t113-bingpi_m2/staging_dir/target/usr/include")
 
 # 设置目标平台和架构
 set(CMAKE_SYSTEM_NAME Linux)
@@ -14,7 +14,7 @@ set(CMAKE_SYSTEM_PROCESSOR arm)
 project (pdu_ctrl_app)
 
 add_definitions(-DSHELL_CFG_USER="shell_cfg_user.h")
-include_directories(/home/liyi/123456/out/t113-bingpi_m2/staging_dir/target/usr/include/)
+include_directories($ENV{STAGING_DIR}/target/usr/include/)
 include_directories (${PROJECT_SOURCE_DIR}/modbus/inc ${PROJECT_SOURCE_DIR}/sqlite/inc)
 
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/os/inc)

+ 7 - 3
485/src/app.c

@@ -517,8 +517,6 @@ int sys_get_path(char *path, char *name)
 }
 
 
-
-
 /// @brief 全局结构体初始化
 /// @param _globalDeviceManager 
 /// @return 
@@ -529,8 +527,12 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
 {
     int ret = 0 ;
     int type = 0 ;
-
+    
     char path[PATH_MAX];
+    //wdog_init();
+    pthread_t pthread_wg = 0;
+    //pthread_create(&pthread_wg, NULL, _global_feed_dog, NULL);
+
 
     //初始化用户登录列表
     INIT_LIST_HEAD(&_GlobalUserLoginInfo.list);
@@ -697,9 +699,11 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
 
     //等待
     pthread_join(_globalDeviceManager->dev_samp_thread,NULL);
+    pthread_join(pthread_wg,NULL);
 
     while(1)
     {
+     //   wdog_feed();
         sleep(1);
     }
     return 0;

+ 82 - 0
485/src/main.c

@@ -12,13 +12,95 @@
 
 
 
+#include <linux/watchdog.h>
+
+#include "errno.h"
+
+#include "fcntl.h"
+
+
+
+
+static int wdog_fd=-1;
+
+static int wdog_init(void)
+{
+    int r =0;
+    char *path="/dev/watchdog";
+    if(wdog_fd<0) {
+        wdog_fd = open(path, O_RDWR);   //O_WRONLY
+        log_d("wdog_fd = %d\n",wdog_fd);
+        if(wdog_fd<0) {
+            printf("___ %s open failed\n", path);
+            return -1;
+        }
+    }
+
+    int i,option,timeout;
+    struct watchdog_info info;
+    
+    option = WDIOS_DISABLECARD;
+    r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
+
+    r = ioctl(wdog_fd, WDIOC_GETSUPPORT, &info);
+    if(r<0) {
+        printf("___ %s getsupport failed\n", path);
+        return -1;
+    }
+    printf("___ watchdog options: 0x%x\n", info.options&WDIOC_SETTIMEOUT);
+
+    timeout = 40;
+    r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &timeout);
+    if(r) {
+        printf("______set__________ wdog set timeout: %d failed, errno: %d\n", timeout, errno);
+    }
+
+    option = WDIOS_ENABLECARD;
+    r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
+
+//    }
+
+return r;
+}
+
+static int wdog_feed(void)
+{
+    int r=0;
+
+    //if(wdog_is_en()) {
+        r = ioctl(wdog_fd, WDIOC_KEEPALIVE, 0);
+
+        //int t1=200,t2=0;
+        //r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &t1);
+        //printf("______set__________ wdog timeout: %d, errno: %d\n", r, errno);
+        
+        //r = ioctl(wdog_fd, WDIOC_GETTIMEOUT, &t2);
+        //printf("________________ wdog timeout: %d\n", t2);
+    //}
+
+    return r;
+}
+
+void * _global_feed_dog(void* arg)
+{
+    while(1)
+    {
+        wdog_feed();
+        sleep(1);
+    }
+    pthread_exit(NULL);
+}
 
 
 
 //主函数
 int main(int argc,char* argv[])
 {
+    pthread_t pthread_wg = 0;
     initLogger();
+    wdog_init();
+    pthread_create(&pthread_wg, NULL, _global_feed_dog, NULL);
+
     //初始化系统
     _global_device_manage_init(&__globalDeviceManage);
 

+ 8 - 8
ip/CMakeLists.txt

@@ -11,8 +11,8 @@ set(CMAKE_SYSTEM_PROCESSOR arm)
 project (pdu_ctrl_app)
 
 add_definitions(-DSHELL_CFG_USER="shell_cfg_user.h")
-set(STAGING_DIR "/home/liyi/tina/out/t113-bingpi_m2/staging_dir")
-set(COMPILING_DIR "/home/liyi/tina/out/t113-bingpi_m2/compile_dir")
+#set(STAGING_DIR "/home/liyi/tina/out/t113-bingpi_m2/staging_dir")
+#set(COMPILING_DIR "/home/liyi/tina/out/t113-bingpi_m2/compile_dir")
 
 
 include_directories (${PROJECT_SOURCE_DIR}/modbus/inc 
@@ -22,7 +22,7 @@ include_directories (${PROJECT_SOURCE_DIR}/modbus/inc
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/os/inc)
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/inc)
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/plugins/file)
-include_directories (${STAGING_DIR}/target/usr/include)
+include_directories ($ENV{STAGING_DIR}/target/usr/include)
 
 include_directories (${PROJECT_SOURCE_DIR}/letter/src)
 include_directories (${PROJECT_SOURCE_DIR}/letter/os)
@@ -39,11 +39,11 @@ link_directories(${PROJECT_SOURCE_DIR}/appweb/lib)
 link_directories(${PROJECT_SOURCE_DIR}/snmp/lib)
 #link_directories(${PROJECT_SOURCE_DIR}/sqlite/lib)
 link_directories(${PROJECT_SOURCE_DIR}/modbus/lib)
-link_directories(${STAGING_DIR}/target/usr/lib)
-link_directories(${STAGING_DIR}/target/lib)
-link_directories(${COMPILING_DIR}/target/lib)
-link_directories(${COMPILING_DIR}/target/usr/lib)
-link_directories(${COMPILING_DIR}/target/usr/lib/arm-qt/lib)
+link_directories($ENV{STAGING_DIR}/target/usr/lib)
+link_directories($ENV{STAGING_DIR}/target/lib)
+link_directories($ENV{COMPILING_DIR}/target/lib)
+link_directories($ENV{COMPILING_DIR}/target/usr/lib)
+link_directories($ENV{COMPILING_DIR}/target/usr/lib/arm-qt/lib)
 add_definitions("-Wall -g")
 
 set(PDU_SRC_LIST

+ 8 - 0
ip/src/common.h

@@ -264,6 +264,13 @@ typedef struct
     char          dns2[64];    					//dns2
 }NetworkInfo_t;
 
+typedef struct {
+    int         watchdog;
+    int         flip_time;
+    int         led;
+    int         beep;
+    int         rotate;
+}MiscInfo_t;
 
 /// @brief 用户登录
 typedef struct
@@ -292,6 +299,7 @@ typedef struct
     NetworkInfo_t   _network_info ;             ;//网络信息
     ModbusInfo_t    _gmodbus_info               ;//级联端口    
     float           consumer                    ;  
+    MiscInfo_t      misc;
 }GlobalDeviceInfo;
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////

+ 79 - 0
ip/src/sys.c

@@ -1126,6 +1126,83 @@ static void mem_check(void)
     }
 }
 
+//https://blog.csdn.net/weixin_47604497/article/details/136913868
+#include <linux/watchdog.h>
+static int wdog_fd=-1;
+static int wdog_is_en(void)
+{
+    GlobalDeviceManager *dm=&__globalDeviceManage;
+    MiscInfo_t *misc=&dm->_globalDevInfo.misc;
+
+    return misc->watchdog;
+}
+static int wdog_init(void)
+{
+    int r=0;
+
+    //if(wdog_is_en() == 0) {
+        char *path="/dev/watchdog";
+        
+        if(wdog_fd<0) {
+            wdog_fd = open(path, O_RDWR);   //O_WRONLY
+            log_d("wdog_fd = %d\n",wdog_fd);
+            if(wdog_fd<0) {
+                printf("___ %s open failed\n", path);
+                return -1;
+            }
+        }
+
+#if (CHIP_TYPE == CHIP_T113s)
+        int i,option,timeout;
+        struct watchdog_info info;
+        
+        option = WDIOS_DISABLECARD;
+        r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
+
+        r = ioctl(wdog_fd, WDIOC_GETSUPPORT, &info);
+        if(r<0) {
+            printf("___ %s getsupport failed\n", path);
+            return -1;
+        }
+        printf("___ watchdog options: 0x%x\n", info.options&WDIOC_SETTIMEOUT);
+
+        timeout = 40;
+        r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &timeout);
+        if(r) {
+            printf("______set__________ wdog set timeout: %d failed, errno: %d\n", timeout, errno);
+        }
+
+        option = WDIOS_ENABLECARD;
+        r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
+#endif
+//    }
+
+    return r;
+}
+
+
+
+static int wdog_feed(void)
+{
+    int r=0;
+
+    //if(wdog_is_en()) {
+        r = ioctl(wdog_fd, WDIOC_KEEPALIVE, 0);
+
+        //int t1=200,t2=0;
+        //r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &t1);
+        //printf("______set__________ wdog timeout: %d, errno: %d\n", r, errno);
+        
+        //r = ioctl(wdog_fd, WDIOC_GETTIMEOUT, &t2);
+        //printf("________________ wdog timeout: %d\n", t2);
+    //}
+
+    return r;
+}
+
+
+
+
 
 
 static void* polling_thread(void *arg)
@@ -1134,6 +1211,7 @@ static void* polling_thread(void *arg)
 
     while(h->quit==0) {
         mem_check();
+        wdog_feed();
         sleep(1);
     }
     pthread_exit(NULL);
@@ -1143,6 +1221,7 @@ static void* polling_thread(void *arg)
 int sys_init(void)
 {
     //userShellInit();
+    wdog_init();
     initLogger();
     lock_s_init();