Parcourir la source

增加 : ch423s驱动;

lch il y a 5 mois
Parent
commit
11d8aa8e07

+ 2 - 1
README.md

@@ -53,4 +53,5 @@
 06. 增加 : led资源;
 
 # 202512(22-28)
-01. 修改 : 对接开入量数据;
+01. 修改 : 对接开入量数据;
+02. 增加 : ch423s驱动;

+ 0 - 4
app_public/fuxi_public/fuxi_bsp/include/bspconfig.h

@@ -14,7 +14,6 @@
 
 #include "rt.h"
 #include "MCF54418.h"
-#include "gpio_def.h"
 #include "build_info.h"
 #include "defineSys.h"
 //----------------------------- BSP版本  ---------------------------
@@ -30,9 +29,6 @@
 
 //----------------------------- 设备架构  ---------------------------
 #define EQU_SLOT_NUM_MAX		16
-#define EQU_SLOT_MAIN			0	// 主板
-#define EQU_SLOT_KZ				1	// 控制板
-#define EQU_SLOT_HMI			2	// 面板
 
 #define EQU_SLOT_AC_BEGIN		1	// 采样板起始槽位
 #define EQU_SLOT_AC_NUM			1	// 一个装置支持AC板的最大槽数。1 -> 2 DTUv5采用两块采样板

+ 39 - 0
app_public/fuxi_public/fuxi_bsp/include/ch423s.h

@@ -0,0 +1,39 @@
+/**
+ * @file           ch423s.h
+ * @brief          
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * 
+ * @copyright Copyright (c) 2025 by OLE, All Rights Reserved.
+ * 
+ * @par 修改日志:
+ * <table>
+ * <tr><th>Date        <th>Version         <th>Author          <th>Description
+ * <tr><td>20251224    <td>2.0             <td>test            <td>内容
+ * </table>
+ */
+#ifdef IO_CHIP_CH423S
+
+#ifndef DEF_CH423S_H
+#define DEF_CH423S_H
+
+/***** 宏定义 *****/
+
+/***** 头文件 *****/
+
+/*****  枚举  *****/
+
+/***** 结构体 *****/
+
+/***** 变量对外声明 *****/
+
+/***** 函数对外声明 *****/
+
+extern int ch423sio_set_io(uint8_t _uc_idx, uint8_t _uc_state);
+extern int ch423sio_init_dev(void)
+extern int ch423sio_exit_dev(void);
+
+
+#endif /* DEF_CH423S_H */
+#endif /* IO_CHIP_CH423S */

+ 6 - 5
app_public/fuxi_public/fuxi_bsp/include/dido.h

@@ -67,19 +67,20 @@ struct di_struct
 	u8  type;		//DI类型
 
 	// 滤波处理
+#if !defined CPU_FUXI
 	int b_first_change;  
 	u32 tm_keep;	// 保持时间
 	u32 tm_back;	// 返回时间
-
-	// 变位记录
-	int	b_on;		// 滤波后的遥信状态
-	u32 tm_di_time;
-	u32 dt;
 	struct timespec ts_di;	// 滤波前的变位时刻
 #ifdef	DIDO_TS_MODE
 	struct timespec ts_tmp;
 	uint32 acc_nsec;
 #endif
+#endif
+
+	// 变位记录
+	int	b_on;		// 滤波后的遥信状态
+	u32 dt;
 };
 
 

+ 1 - 0
app_public/fuxi_public/fuxi_bsp/include/equ.h

@@ -309,6 +309,7 @@ u8   equ_di_type(u8 slot,u8 no);  //
 u8  equ_pub_di_type(u8 slot,u8 no);
 #ifdef CPU_FUXI
 int equ_init_rv_di(void);
+int equ_reinit_rv_di(void);
 #endif
 #endif //_EQU_H
 

+ 13 - 17
app_public/fuxi_public/fuxi_bsp/include/gpio.h

@@ -15,19 +15,20 @@
 /*------------------------------- 宏定义 --------------------------------------
 */
 // 通道配置中控制板硬件地址(0~9)、外部接口之间关系
-enum 
+enum
 {
-	DO_OUT0,	// KC-A1开出使能继电器
-	DO_OUT1,	// KC-B1合闸继电器
-	DO_OUT2,	// KC-A2跳闸继电器
-	DO_OUT3,	// KC-B2备用
-	DO_OUT4,	// KC-A3活化启动
-	DO_OUT5,	// KC-B3活化退出
-	DO_OUT6,	// KC-A4残压闭锁
-	DO_OUT7, 	// KC-B4残压复归
-	DO_OUT8,	// KC-A5活化退出
-	DO_OUT9,	// KC-B5残压闭锁
-	DO_NUM,// 支持的开出个数
+    DO_OUT0 = 0,   // KC 保护跳闸
+    DO_OUT1,       // KC 保护合闸
+    DO_OUT2,       // KC 遥控分闸
+    DO_OUT3,       // KC 遥控合闸
+    DO_OUT4,       // KC 残压模块复归
+    DO_OUT5,       // KC 备用1
+    DO_OUT6,       // KC 备用2
+    DO_OUT7,       // KC 备用3
+    DO_OUT_PRESET, // KC 预置继电器 只能控制前4个
+    DO_IN_PRESET,  // KC 预置继电器 返校状态
+
+    DO_NUM, // 支持的开出个数
 };
 
 // sunxi 20220413 added
@@ -35,11 +36,6 @@ enum
 {
 	// KOUT_EN0,
 	// KOUT_EN1, //辅助板上的单片机控
-	RUN_LED,
-	ERR_LED,
-	ESAM_PWR,		// 加密芯片电源
-	// WATCHDOG,
-	LINE_LOSS_SET,  // 线损维护口切换
 	GPIO_NUM_OTHER,
 };
 

+ 291 - 0
app_public/fuxi_public/fuxi_bsp/source/ch423s.c

@@ -0,0 +1,291 @@
+/**
+ * @file           ch423s.h
+ * @brief
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ *
+ * @copyright Copyright (c) 2025 by OLE, All Rights Reserved.
+ *
+ * @par 修改日志:
+ * <table>
+ * <tr><th>Date        <th>Version         <th>Author          <th>Description
+ * <tr><td>20251224    <td>2.0             <td>test            <td>内容
+ * </table>
+ */
+#ifdef IO_CHIP_CH423S
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
+#include <errno.h>
+#include "head.h"
+
+/*  设置系统参数命令 */
+#define CH423_SYS_CMD 0x48 // 设置系统参数命令,默认方式
+#define BIT_SLEEP 0x30     // 低功耗睡眠控制 0正常工作 1睡眠模式
+#define BIT_INTENS 0x20    // 动态显示驱动亮度控制
+#define BIT_OD_OE 0x10     // 输出引脚 OC15~OC0 开漏输出使能 0推挽输出低电平和高电平 1开漏输出低电平和不输出
+#define BIT_X_INT 0x08     // 使能输入电平变化中断 0禁止输入电平变化中断 为1并且DEC_H为0允许从OC15引脚输出电平变化中断
+#define BIT_DEC_H 0x04     // 控制开漏输出引脚高8位的片选译码 0通用输出 1分时显示扫描计数器译码后
+#define BIT_DEC_L 0x02     // 控制开漏输出引脚低8位的片选译码 0通用输出 1分时显示扫描计数器译码后
+#define BIT_IO_OE 0x01     // 控制双向输入输出引脚的三态输出 0禁止输出 1允许输出
+
+/*  设置低8位开漏输出命令 */
+#define CH423_OC_L_CMD 0x44 // 设置低8位开漏输出命令,默认方式
+#define BIT_OC0_L_DAT 0x01  // OC0为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC1_L_DAT 0x02  // OC1为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC2_L_DAT 0x04  // OC2为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC3_L_DAT 0x08  // OC3为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC4_L_DAT 0x10  // OC4为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC5_L_DAT 0x20  // OC5为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC6_L_DAT 0x40  // OC6为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC7_L_DAT 0x80  // OC7为0则使引脚输出低电平,为1则引脚不输出
+
+/*  设置高8位开漏输出命令 */
+#define CH423_OC_H_CMD 0x46 // 设置低8位开漏输出命令,默认方式
+#define BIT_OC8_L_DAT 0x01  // OC8为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC9_L_DAT 0x02  // OC9为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC10_L_DAT 0x04 // OC10为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC11_L_DAT 0x08 // OC11为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC12_L_DAT 0x10 // OC12为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC13_L_DAT 0x20 // OC13为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC14_L_DAT 0x40 // OC14为0则使引脚输出低电平,为1则引脚不输出
+#define BIT_OC15_L_DAT 0x80 // OC15为0则使引脚输出低电平,为1则引脚不输出
+
+/* 设置双向输入输出命令 */
+#define CH423_SET_IO_CMD 0x60 // 设置双向输入输出命令,默认方式
+#define BIT_IO0_DAT 0x01      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO0为0输出低电平,为1输出高电平
+#define BIT_IO1_DAT 0x02      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO1为0输出低电平,为1输出高电平
+#define BIT_IO2_DAT 0x04      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO2为0输出低电平,为1输出高电平
+#define BIT_IO3_DAT 0x08      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO3为0输出低电平,为1输出高电平
+#define BIT_IO4_DAT 0x10      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO4为0输出低电平,为1输出高电平
+#define BIT_IO5_DAT 0x20      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO5为0输出低电平,为1输出高电平
+#define BIT_IO6_DAT 0x40      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO6为0输出低电平,为1输出高电平
+#define BIT_IO7_DAT 0x80      // 写入双向输入输出引脚的输出寄存器,当IO_OE=1,IO7为0输出低电平,为1输出高电平
+
+struct t_dev_cfg
+{
+    uint8_t uc_port;
+    uint8_t uc_pin;
+};
+
+struct t_dev_cfg t_ch423_gpio[] =
+    {
+        {CH423_OC_L_CMD, 0},
+        {CH423_OC_L_CMD, 1},
+        {CH423_OC_L_CMD, 2},
+        {CH423_OC_L_CMD, 3},
+        {CH423_OC_L_CMD, 4},
+        {CH423_OC_L_CMD, 5},
+        {CH423_OC_L_CMD, 6},
+        {CH423_OC_L_CMD, 7},
+        {CH423_OC_H_CMD, 8},
+        {CH423_OC_H_CMD, 9},
+        {CH423_OC_H_CMD, 10},
+        {CH423_OC_H_CMD, 11},
+        {CH423_OC_H_CMD, 12},
+        {CH423_OC_H_CMD, 13},
+        {CH423_OC_H_CMD, 14},
+        {CH423_OC_H_CMD, 15},
+        {CH423_SET_IO_CMD, 16},
+        {CH423_SET_IO_CMD, 17},
+        {CH423_SET_IO_CMD, 18},
+        {CH423_SET_IO_CMD, 19},
+        {CH423_SET_IO_CMD, 20},
+        {CH423_SET_IO_CMD, 21},
+        {CH423_SET_IO_CMD, 22},
+        {CH423_SET_IO_CMD, 23},
+};
+
+#define I2C_DEV "/dev/i2c-5"
+static int sl_ch423s_fd = -1, sl_ch423s_init = -1;
+static uint32_t sul_io_status = 0;
+static unsigned long mtll_updata_ch423s_timer = 0;
+
+/**
+ * @brief
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @param[in/out]  {uint8_t} _uc_cmd 命令
+ * @param[in/out]  {uint8_t} _uc_state 状态
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+static int ch423_write_data(uint8_t _uc_cmd, uint8_t _uc_state)
+{
+    uint8_t uca_data[2] = {0};
+
+    uca_data[0] = _uc_cmd;
+    uca_data[1] = _uc_state;
+    if (write(sl_ch423s_fd, &uca_data[0], 2) != 2)
+    {
+        dp_err_n_c_rt("Failed to send init command: %s", strerror(errno));
+
+        return -1;
+    }
+    return 0;
+}
+
+/**
+ * @brief
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @param[in/out]  {uint8_t} _uc_idx
+ * @param[in/out]  {uint8_t} _uc_state
+ * @return         * void
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+static void ch423s_updata_port_status(uint8_t _uc_idx, uint8_t _uc_state)
+{
+    /* 清除原始状态 */
+    if ((sul_io_status >> _uc_idx) & 0x01)
+    {
+        sul_io_status ^= (1 << _uc_idx);
+    }
+
+    /* 重新设置 */
+    sul_io_status |= _uc_state ? (0 << _uc_idx) : (1 << _uc_idx);
+}
+
+/**
+ * @brief          定时更新gpio状态
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+int ch423sio_updata_status_ontime(void)
+{
+    uint8_t uca_state[3] = {0};
+    int l_ret = 0;
+
+    if (bsp_ustimer_get_duration(mtll_updata_ch423s_timer) < (USTIMER_MS * 50) || sl_ch423s_fd < 0)
+    {
+        return -1;
+    }
+
+    mtll_updata_ch423s_timer = bsp_ustimer_get_origin();
+
+    uca_state[0] = (uint8_t)(sul_io_status & 0xff);
+    (0 = ch423_write_data(CH423_OC_L_CMD, uca_state[0])) ? l_ret : l_ret--;
+
+    uca_state[1] = (uint8_t)((sul_io_status >> 8) & 0xff);
+    (0 = ch423_write_data(CH423_OC_H_CMD, uca_state[1])) ? l_ret : l_ret--;
+
+    uca_state[2] = (uint8_t)((sul_io_status >> 16) & 0xff);
+    (0 = ch423_write_data(CH423_SET_IO_CMD, uca_state[2])) ? l_ret : l_ret--;
+
+    return l_ret;
+}
+
+/**
+ * @brief          设置io状态
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @param[in/out]  {uint8_t} _uc_idx 下标
+ * @param[in/out]  {uint8_t} _uc_state 电平状态
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+int ch423sio_set_io(uint8_t _uc_idx, uint8_t _uc_state)
+{
+    uint8_t uc_num = sizeof(t_ch423_gpio) / sizeof(struct t_dev_cfg);
+
+    if (_uc_idx >= uc_num || sl_ch423s_init < 0 || _uc_state > 1)
+    {
+        return -1;
+    }
+
+    switch (t_ch423_gpio[_uc_idx].uc_port)
+    {
+    case CH423_OC_L_CMD:
+        ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
+        break;
+
+    case CH423_OC_H_CMD:
+        ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
+        break;
+
+    case CH423_SET_IO_CMD:
+        ch423s_updata_port_status(t_ch423_gpio[_uc_idx].uc_pin, _uc_state);
+        break;
+
+    default:
+        return -2;
+        break;
+    }
+    return 0;
+}
+
+/**
+ * @brief          初始化设备
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+int ch423sio_init_dev(void)
+{
+    // 打开I2C设备
+    sl_ch423s_fd = open(I2C_DEV, O_RDWR);
+    if (sl_ch423s_fd < 0)
+    {
+        dp_err_n_c_rt("Failed to open I2C device %s: %s", I2C_DEV, strerror(errno));
+
+        return -1;
+    }
+
+    ch423_write_data(CH423_SYS_CMD, BIT_IO_OE); /* 将IO7~IO0设置为输出 其它参数使用默认值 */
+    ch423_write_data(CH423_OC_L_CMD, 0xff);
+    ch423_write_data(CH423_OC_H_CMD, 0xff);
+    ch423_write_data(CH423_SET_IO_CMD, 0xff);
+
+    sl_ch423s_init = 0;
+    return 0;
+}
+
+/**
+ * @brief          关闭句柄
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251224
+ * @return         * int
+ * @retval         none
+ *
+ * @warning        none
+ * @note           none
+ */
+int ch423sio_exit_dev(void)
+{
+    if (sl_ch423s_fd >= 0)
+    {
+        close(sl_ch423s_fd);
+        sl_ch423s_fd = -1;
+    }
+
+    return 0;
+}
+
+#endif /* TMP_CHIP_AHT20 */

+ 51 - 75
app_public/fuxi_public/fuxi_bsp/source/dido.c

@@ -30,6 +30,7 @@
 #define DO_PWM_SW_NULL 2
 #define DO_PWM_SW_FZ 3
 #define DO_QD_KC DO_OUT4
+
 /*------------------------------ 类型结构 -------------------------------------
  */
 
@@ -87,9 +88,9 @@ static inline void _io_do_status_update(int on, unsigned int i)
 
 /**
  * @brief          控制开出动作
- * @param[in/out]  {type} slot 
- * @param[in/out]  {type} v  
- * @param[in/out]  {type} is_on 
+ * @param[in/out]  {u32} slot 板卡索引
+ * @param[in/out]  {u16} v  控制码
+ * @param[in/out]  {int} is_on 合分
  * @return         * int
  * @retval         none
  * 
@@ -116,6 +117,7 @@ static int _dido_do(u32 slot, u16 v, int is_on)
     return 0;
 }
 
+#if !defined CPU_FUXI
 /**
  * @brief          开入防抖处理
  * @param[in/out]  {type} slot 
@@ -260,52 +262,12 @@ static int _get_di(int slot, u16 di_num, u32 di, struct timespec ts)
 
     return 0;
 }
+#endif
 
 /*------------------------------ 外部函数 -------------------------------------
 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
 */
 
-/**
- * @brief          开入数据初始化
- * @return         * void
- * @retval         none
- * 
- * @warning        none
- * @note           none
- */
-void dido_init_di(void)
-{
-    u32 i, slot;
-    u32 di0, di, di_num;
-
-    di0 = gpio_get_di();
-    // 主板
-    slot = EQU_SLOT_KZ;
-    di = (di0 & 0x7FFFF);
-    g_di[slot].value[0] = di ^ g_di[slot].inv[0];
-
-    di_num = equ_get_di_num(slot);
-    for (i = 0; i < di_num; i++)
-    {
-        if (di & (1 << i))
-        {
-            g_di_st[slot][i].b_on = 1;
-        }
-        else
-        {
-            g_di_st[slot][i].b_on = 0;
-        }
-        if (g_di[slot].value[0] & (1 << i))
-        {
-            sw_di_set(g_di_st[slot][i].owner, g_di_st[slot][i].type, SW_DI_TYPE_ON);
-            g_di[slot].ts_v[i][g_di[slot].ts_i[i].n] = 1;
-        }
-
-        g_di[slot].ts_t[i][g_di[slot].ts_i[i].n] = 0;
-        g_di[slot].ts_i[i].n++;
-    }
-}
-
 /**
  * @brief          开入开出初始化
  * @return         * int
@@ -345,8 +307,6 @@ int dido_init(void)
         }
     }
 
-    dido_init_di();
-
     dido_stat_reset();
 
     return 0;
@@ -367,7 +327,7 @@ int dido_do_have_select(u32 slot, u32 index)
     int i = 0;
 
     i = equ_get_do_channel(index);
-    if (i == DO_OUT0 || i == DO_OUT1 || i == DO_OUT5 || i == DO_OUT6)
+    if (i == DO_OUT0 || i == DO_OUT1 || i == DO_OUT2 || i == DO_OUT3)
     {
         return 1;
     }
@@ -439,10 +399,6 @@ void io_do_check(void)
     {
         now |= 0x01;
     }
-    // if(g_do_status &((1<<DO_PWM_SW_FZ)|(1<<DO_PWM_SW_HZ)))//动作反校
-    //{
-    // now |= 0x01;//0x02;
-    //}
 #else
     // 取返校值,必须在下面时间点检查之
     fj = gpio_di_fj() & 0x02;
@@ -518,7 +474,6 @@ void io_do_return(void)
 */
 void dido_do_poll(void)
 {
-#if 1
     int i;
 
     // 真正开出
@@ -544,6 +499,7 @@ void dido_do_poll(void)
     // 开出返回
     io_do_return();
 
+#if !defined CPU_FUXI
     // 开出返校
     if (g_board_info[EQU_SLOT_KZ].do_num != 0)
     {
@@ -556,8 +512,8 @@ void dido_do_poll(void)
         // io_do_check();
 #endif
     }
-    return;
 #endif
+    return;
 }
 
 /******************************************************************************
@@ -575,6 +531,7 @@ void dido_qd_set_keeptime(u32 us)
     g_do_st[DO_QD_KC].us_keep = us;
 }
 
+#if !defined CPU_FUXI
 /******************************************************************************
 函数名称:	get_di
 函数版本:	01.01
@@ -611,6 +568,7 @@ void dido_di_poll(SHM_SAMPLE_T *sample_data)
     _get_di(slot, di_num, di, sample_data->ts);
     rt_stat_other_in(6, ustimer_get_duration(us0));
 }
+#endif
 
 /******************************************************************************
 函数名称:	dido_di_is_on
@@ -690,7 +648,7 @@ int dido_do_kz(int on, unsigned int i)
 {
     if (on) // 开出,需启动启动继电器打开电源
     {
-        if (i == DO_OUT0 || i == DO_OUT1 || i == DO_OUT5 || i == DO_OUT6)
+        if (i == DO_OUT0 || i == DO_OUT1 || i == DO_OUT2 || i == DO_OUT3)
         {
             gpio_kout_do(on, DO_QD_KC - DO_OUT0); // 对应X4端子的DO0~DO7
             _io_do_status_update(1, DO_QD_KC);
@@ -753,11 +711,13 @@ int dido_di_update(uint32_t _value_new, uint8_t _index, struct timespec *ts)
  */
 int get_shm_didata(void)
 {
+    uint8_t b_on = 0;
+    u32 ul_di_state = 0, dt = 0;
     int l_read_ret = 0, l_cnt = 0;
-    u32 ul_di_state = 0, dt;
     struct t_shmdata_di shm_data_di = {0};
     static struct t_sd_di_status smt_di[DI_MAX] = {0}, smt_di_bk[DI_MAX] = {0}; /* 数据 */
     struct timespec ts;
+    struct di_struct *pt_di = NULL;
 
     l_read_ret = shm_packet_read_v2(SHM_ADDR_W_DI, sizeof(shm_data_di), (uint8_t *)&shm_data_di, sizeof(shm_data_di));
 
@@ -770,52 +730,68 @@ int get_shm_didata(void)
     {
         memcpy((void *)&smt_di, (void *)&shm_data_di.di, sizeof(struct t_sd_di_status) * DI_MAX);
 
+        /* 第一次 数据初始化 */
         if (false == g_di[g_di_slot].bInited)
         {
             for (uint8_t i = 0; i < DI_MAX; i++)
             {
-                ul_di_state |= smt_di[i].uc_state << i;
-                sw_di_set(g_di_st[g_di_slot][i].owner,
-                          g_di_st[g_di_slot][i].type,
-                          smt_di[i].uc_state ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
+                pt_di = &g_di_st[g_di_slot][i];
+                b_on = smt_di[i].uc_state;
+                if (g_di[g_di_slot].inv[0] & (1 << i))
+                {
+                    b_on = !b_on;
+                }
+                pt_di->b_on = b_on;
+                ul_di_state |= b_on << i;
+                sw_di_set(pt_di->owner,
+                          pt_di->type,
+                          b_on ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
                 // 双点的值也需要重新初始化
-                plc_db_init_value(g_di_slot, i, smt_di[i].uc_state);
+                plc_db_init_value(g_di_slot, i, b_on);
                 // 遥信时标
                 g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = 0;
-                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = smt_di[i].uc_state;
+                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
                 g_di[g_di_slot].ts_i[i].n++;
 
-                memcpy((void *)&smt_di_bk, (void *)&shm_data_di.di, sizeof(struct t_sd_di_status) * DI_MAX);
             }
+            memcpy((void *)&smt_di_bk, (void *)&shm_data_di.di, sizeof(struct t_sd_di_status) * DI_MAX);
             g_di[g_di_slot].bInited = TRUE;
         }
 
         for (uint8_t i = 0; i < DI_MAX; i++)
         {
-            ul_di_state |= smt_di[i].uc_state << i;
-
             if (smt_di_bk[i].uc_state != smt_di[i].uc_state)
             {
+                pt_di = &g_di_st[g_di_slot][i];
+                b_on = smt_di[i].uc_state;
+                if (g_di[g_di_slot].inv[0] & (1 << i))
+                {
+                    b_on = !b_on;
+                }
+                pt_di->b_on = b_on;
+                ul_di_state |= b_on << i;
+
                 transform_msts_to_tts(smt_di[i].ull_timestamp, &ts);
-                soe_record_yx(i + (g_di_slot << 8), smt_di[i].uc_state, &ts);
+                soe_record_yx(i + (g_di_slot << 8), b_on, &ts);
 
                 // 更新逻辑模型中的值
-                sw_di_set(g_di_st[g_di_slot][i].owner,
-                          g_di_st[g_di_slot][i].type,
-                          (smt_di[i].uc_state) ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
+                sw_di_set(pt_di->owner,
+                          pt_di->type,
+                          (b_on) ? SW_DI_TYPE_ON : SW_DI_TYPE_OFF);
 
                 // 更新记录
-                dt = g_adc_dots_count;
+                dt = g_adc_dots_data_count;
+                dt = ((dt + ADC_REC_DOTS_MASK) - (pt_di->tm_filter * ADC_REC_SAMPLE)) % ADC_REC_DOTS_MASK;
                 g_di[g_di_slot].ts_t[i][g_di[g_di_slot].ts_i[i].n] = dt;
-                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = smt_di[i].uc_state;
+                g_di[g_di_slot].ts_v[i][g_di[g_di_slot].ts_i[i].n] = b_on;
                 g_di[g_di_slot].ts_i[i].n++;
                 smt_di_bk[i].uc_state = smt_di[i].uc_state;
-                // dp_err_n_c_rt("change smt_di[%02d].uc_state = %d", i, smt_di[i].uc_state);
+                // dp_err_n_c_rt("change smt_di[%02d].uc_state = %d", i, b_on);
             }
         }
-        g_di[g_di_slot].value[0] = ul_di_state;
-        // dp_err_n_c_rt("g_di[%02d].value[0] = 0x%04x", g_di_slot, g_di[g_di_slot].value[0]);
-        rt_printf("\r\n");
+        g_di[g_di_slot].value[0] = ul_di_state ^ g_di[g_di_slot].inv[0];
+        // dp_err_n_c_rt("g_di[g_di_slot].inv[0] = %d, g_di[%02d].value[0] = 0x%04x", g_di[g_di_slot].inv[0], g_di_slot, g_di[g_di_slot].value[0]);
+        // rt_printf("\r\n");
     }
 
     return l_read_ret;
@@ -908,7 +884,7 @@ int dido_printf(void)
 
     rt_printf("\r\n");
 
-    slot = EQU_SLOT_MAIN;
+    slot = g_di_slot;
     index = 1;
     ts_i.n = g_di[slot].ts_i[index].n;
     rt_printf("开入时间戳记录:slot=%d,index=%d,ts_i=%d.\r\n", slot, index, ts_i.n);

+ 35 - 31
app_public/fuxi_public/fuxi_bsp/source/equ_fuxi.c

@@ -53,29 +53,13 @@ static const s8 g_ac_index[BOARD_TYPE_KZ_NUM][EQU_SLOT_AC_CHN] =
 //遥信转换表
 s8 g_change_di_index[BOARD_TYPE_KZ_NUM][EQU_DB_YX_NUM] =
 {
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 13
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 14 FB_V3_22_8 21,20,19,22,23,24,25,26,27,28,29,30,31,32}
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 15
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}, // 16 FBV1_19_6
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 17 FB_V3_22_12
-    {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 18 null
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 19 null
-    {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 20 FB_V4_24_12
-    {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 21 FB_V4.1_24_12
-    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 24, 23, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32}, // 22 FB_V3.1_22_12
-    {2, 4, 6, 8, 10, 12, 14, 15, 16, 1, 3, 5, 7, 9, 11, 13, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 23 FB_V3D_122_12
-    {1, 3, 5, 7, 9, 11, 13, 15, 19, 21, 25, 27, 29, 2, 4, 6, 8, 10, 12, 14, 16, 20, 22, 26, 28, 30, 17, 18, 23, 24, 00, 00}, // 24 V4_D_30_12
+    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32},
 };
 
 // 开出对应关系
 static const s8 g_do_index[BOARD_TYPE_KZ_NUM][DO_NUM] = 
 {
 	{-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1},
-
-	{DO_OUT8,DO_OUT0,DO_OUT1,DO_OUT6,DO_OUT5,DO_OUT2,DO_OUT3,DO_OUT4,DO_OUT7,-1},  	//14 
-	{DO_OUT9,DO_OUT0,DO_OUT2,DO_OUT4,DO_OUT6,DO_OUT1,DO_OUT3,DO_OUT5,DO_OUT7,-1}, 	//15
-	{-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1},  //  18  老版本分布式主板类型,不起作用
-	{-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1},  //  19  老版本分布式主板类型,不起作用
 };
 
 
@@ -118,19 +102,18 @@ unsigned int change_di_ch(unsigned int di)
  */
 int equ_config_di_yd(void)
 {
-	u32 i;
-	struct equ_config_di *ecd;
+    u32 i;
+    struct equ_config_di *ecd;
 
-	// 用户配置的保持时间、拥有者、类型
-	ecd = g_equ_config_di;
-	for(i=0;i<g_equ_config->di_num;i++)
-	{
-		// 开入扫描在156us中断,通过以下算法,得出对应不同防抖延时的最佳动态转换系数,理论误差为156us左右
-		g_di_st[ecd->slot][ecd->index].tm_filter = (u32)tRunPara.wYXFD * 1000 / 156;
-		ecd++;
-	}
+    // 用户配置的保持时间、拥有者、类型
+    ecd = g_equ_config_di;
+    for (i = 0; i < g_equ_config->di_num; i++)
+    {
+        g_di_st[ecd->slot][ecd->index].tm_filter = (u32)tRunPara.wYXFD * 1000;
+        ecd++;
+    }
 
-	return 0;
+    return 0;
 }
 
 int equ_config_do_yd(void)
@@ -425,6 +408,7 @@ int equ_get_do_channel(u32 index)
 	return g_do_index[g_brd_type_kz][index];
 }
 
+#ifdef CPU_FUXI
 /**
  * @brief          初始化rv核数据
  * @author         lch (lch_work@foxmail.com)
@@ -438,21 +422,41 @@ int equ_get_do_channel(u32 index)
  */
 int equ_init_rv_di(void)
 {
-#ifdef CPU_FUXI
 	struct t_shmdata_di_astime t_di_cfg = {0};
 	struct equ_config_di *ecd;
 
     ecd = g_equ_config_di;
-    rt_printf("g_equ_config->di_num = %d\r\n", g_equ_config->di_num);
+    // rt_printf("g_equ_config->di_num = %d\r\n", g_equ_config->di_num);
     for (int i = 0; i < g_equ_config->di_num; i++)
     {
         t_di_cfg.us_as_time[i] = ecd->filter_time;
         ecd++;
     }
 	return shm_packet_write_v2(SHM_ADDR_R_DI_ASTIME, (uint8_t *)&t_di_cfg, sizeof(struct t_shmdata_di_astime));
-#endif
 }
 
+/**
+ * @brief          初始化rv核数据
+ * @author         lch (lch_work@foxmail.com)
+ * @version        1.0
+ * @date           20251222
+ * @return         * int
+ * @retval         none
+ * 
+ * @warning        none
+ * @note           none
+ */
+int equ_reinit_rv_di(void)
+{
+	struct t_shmdata_di_astime t_di_cfg = {0};
+    for (int i = 0; i < g_equ_config->di_num; i++)
+    {
+        t_di_cfg.us_as_time[i] = tRunPara.wYXFD;
+    }
+	return shm_packet_write_v2(SHM_ADDR_R_DI_ASTIME, (uint8_t *)&t_di_cfg, sizeof(struct t_shmdata_di_astime));
+}
+#endif
+
 
 
 

+ 97 - 79
app_public/fuxi_public/fuxi_bsp/source/gpio.c

@@ -9,8 +9,8 @@
 修改记录:
 
 [new]-->applay
-B_DO_ADJ	--> GPIOD_17	-->  gpio113
-B_DO_0		--> GPIOD_03	-->  gpio99
+B_DO_ADJ	--> GPIOD_17	-->  gpio113 预置返校
+B_DO_0		--> GPIOD_03	-->  gpio99 预置
 B_DO_1		--> GPIOD_19	-->  gpio115
 B_DO_2		--> GPIOD_02	-->  gpio98
 B_DO_3		--> GPIOD_09	-->  gpio105
@@ -67,13 +67,9 @@ int gpio_val_fd[DO_NUM];
 int gpio_dev_type[DO_NUM] = {
     SYS_GPIO,
 }; // 0:系统GPIO, 1:RTDM GPIO
-const int gpio_val[DO_NUM] = {98, 99, 115, 98, 105, 114, 112, 103, 104, 102};
 
-int gpio_val_fd_other[GPIO_NUM_OTHER];
-int gpio_dev_type_other[GPIO_NUM_OTHER] = {
-    SYS_GPIO,
-};
-const int gpio_val_other[GPIO_NUM_OTHER] = {39, 164, 359, 389};
+/* 开出gpio */
+const int gpio_val[DO_NUM] = {115, 98, 105, 114, 112, 103, 104, 102, 99, 113};
 
 // static int gpio_watchdog_val = 0;
 static int gpio_run_led_val = 0;
@@ -188,6 +184,7 @@ int sysfs_gpio_set_edge_detect(int gpio, int edge)
     close(fd);
     return 0;
 }
+
 int sysfs_gpio_set_value(int gpio, int value)
 {
     char path[64];
@@ -232,7 +229,6 @@ int sysfs_gpio_init(int gpio, int direction)
 
 int is_rtdm_device(int fd)
 {
-
     if (gpio_dev_type[fd] > SYS_GPIO)
         return 1;
     else if (gpio_dev_type[fd] == SYS_GPIO)
@@ -240,6 +236,7 @@ int is_rtdm_device(int fd)
     else
         return -1;
 }
+
 int rt_write(int fd, char *buf, int len)
 {
     int value;
@@ -266,6 +263,7 @@ int rt_write(int fd, char *buf, int len)
         return write(fd, buf, len);
     }
 }
+
 int rtdm_gpio_init(int gpio, int direction)
 {
 #define GPIO_LOW 0
@@ -280,7 +278,14 @@ int rtdm_gpio_init(int gpio, int direction)
         return -1;
     }
 
-    ret = ioctl(fd, GPIO_RTIOC_DIR_OUT, &value);
+    if (113 == gpio) /* 预置继电器是开入 */
+    {
+        ret = ioctl(fd, GPIO_RTIOC_DIR_IN, &value);
+    }
+    else
+    {
+        ret = ioctl(fd, GPIO_RTIOC_DIR_OUT, &value);
+    }
     if (ret < 0)
     {
         perror("ioctl DIR_OUT");
@@ -294,10 +299,9 @@ int rtdm_gpio_init(int gpio, int direction)
 
 int gpio_init(void)
 {
-#define GPIO_OUTPUT 1
+    #define GPIO_OUTPUT 1
     int i;
 
-#ifdef NW_AREA_MAIN_2021
     for (i = 0; i < DO_NUM; i++)
     {
         gpio_val_fd[i] = rtdm_gpio_init(gpio_val[i], GPIO_OUTPUT);
@@ -317,27 +321,6 @@ int gpio_init(void)
             gpio_dev_type[i] = gpio_val_fd[i]; // 保存RTDM设备类型句柄,这里有风险,fd句柄可能为0
         }
     }
-#else
-#endif
-    for (i = 0; i < GPIO_NUM_OTHER; i++)
-    {
-        gpio_val_fd_other[i] = -1;
-        if (gpio_val_fd_other[i] < 0)
-        {
-            gpio_val_fd_other[i] = sysfs_gpio_init(gpio_val_other[i], GPIO_OUTPUT);
-            if (gpio_val_fd_other[i] < 0)
-            {
-                dp_err_n_c("gpio_val_fd_other[%d] error", i);
-                gpio_val_fd_other[i] = -1;
-                gpio_dev_type_other[i] = -1;
-                return -1;
-            }
-        }
-        else
-        {
-            gpio_dev_type_other[i] = gpio_val_fd_other[i]; // 保存RTDM设备类型句柄,这里有风险,fd句柄可能为0
-        }
-    }
 
     msleep(10); // 延时10ms
 
@@ -346,29 +329,18 @@ int gpio_init(void)
     kc_kout0_stu = 0;
     kc_kout1_stu = 0;
 
-    // 其他与底层GPIO相关的配置再此处添加 比如 LED WATCHDOG
-    write(gpio_val_fd_other[RUN_LED], "0", 2);
-    gpio_run_led_val = 0;
-
-    // 上电默认切换到外部232串口
-    // 后续根据投退判断是否需要切换到线损的维护口
-    write(gpio_val_fd_other[LINE_LOSS_SET], "0", 2);
-
-    // 开启esam供电
-    write(gpio_val_fd_other[ESAM_PWR], "0", 2);
-#ifdef NW_AREA_MAIN_2021
-    for (i = 0; i < DO_NUM; i++)
+    for (i = DO_OUT1; i < DO_NUM; i++)
     {
         write(gpio_val_fd[i], "1", 2);
     }
-#endif
+
     return 0;
 }
 
 int gpio_exit(void)
 {
     int i;
-#ifdef NW_AREA_MAIN_2021
+
     for (i = 0; i < DO_NUM; i++)
     {
         if (gpio_val_fd[i] >= 0)
@@ -378,16 +350,6 @@ int gpio_exit(void)
         }
         sysfs_gpio_unexport(gpio_val[i]);
     }
-#endif
-    for (i = 0; i < GPIO_NUM_OTHER; i++)
-    {
-        if (gpio_val_fd_other[i] >= 0)
-        {
-            close(gpio_val_fd_other[i]);
-            gpio_val_fd_other[i] = -1;
-        }
-        sysfs_gpio_unexport(gpio_val_other[i]);
-    }
 
     return 0;
 }
@@ -469,17 +431,17 @@ unsigned short gpio_di_fj(void)
 
 static void gpio_kouten_do(int on, unsigned int kouten)
 {
-    // if (kouten > KOUT_EN1)
-    //     return;
+#if !defined CPU_FUXI
+    if (kouten > KOUT_EN1)
+        return;
 
-    // if(on)
-    // {
-    //     write(gpio_val_fd_other[KOUT_EN0+kouten], "1", 2);
-    // }
-    // else
-    // {
-    //     write(gpio_val_fd_other[KOUT_EN0+kouten], "0", 2);
-    // }
+    if(on)
+    {
+    }
+    else
+    {
+    }
+#endif
 }
 
 /******************************************************************************
@@ -496,13 +458,11 @@ static void gpio_kouten_do(int on, unsigned int kouten)
 */
 void gpio_kout_do(int on, unsigned int kout)
 {
-
     // if (kout > (DO_NUM-DO_OUT0))
     //     return;
 
     if (on)
     {
-
         if ((kout == 6) || (kout == 7))
         {
             // gpio_kouten_do(1,KOUT_EN1);
@@ -518,7 +478,6 @@ void gpio_kout_do(int on, unsigned int kout)
     }
     else
     {
-
         write(gpio_val_fd[kout + DO_OUT0], "1", 2);
 
         if ((kout == 6) || (kout == 7))
@@ -641,8 +600,8 @@ void _led_run_err(void)
         if (!(err_led & 0x01))
         {
             err_led |= 1;
-            write(gpio_val_fd_other[ERR_LED], "0", 2);
-            write(gpio_val_fd_other[RUN_LED], "1", 2);
+            // write(gpio_val_fd_other[ERR_LED], "0", 2);
+            // write(gpio_val_fd_other[RUN_LED], "1", 2);
         }
         return;
     }
@@ -650,28 +609,28 @@ void _led_run_err(void)
     if (err_led)
     {
         err_led = 0;
-        write(gpio_val_fd_other[ERR_LED], "1", 2);
+        // write(gpio_val_fd_other[ERR_LED], "1", 2);
     }
 
     // 运行指示灯,每隔1s改变状态一次
     if (!gpio_run_led_val)
     {
         gpio_run_led_val = 1;
-        write(gpio_val_fd_other[RUN_LED], "0", 2);
+        // write(gpio_val_fd_other[RUN_LED], "0", 2);
     }
     else
     {
         gpio_run_led_val = 0;
-        write(gpio_val_fd_other[RUN_LED], "1", 2);
+        // write(gpio_val_fd_other[RUN_LED], "1", 2);
     }
 }
 
 void esam_power_ctrl(int on)
 {
-    if (on)
-        write(gpio_val_fd_other[ESAM_PWR], "1", 2);
-    else
-        write(gpio_val_fd_other[ESAM_PWR], "0", 2);
+    // if (on)
+    //     write(gpio_val_fd_other[ESAM_PWR], "1", 2);
+    // else
+    //     write(gpio_val_fd_other[ESAM_PWR], "0", 2);
 }
 
 /*------------------------------ 内部函数 -------------------------------------
@@ -724,4 +683,63 @@ int gpio_test(void)
 #endif
     return ret;
 }
+
+int test_kc_function(void)
+{
+    write(gpio_val_fd[DO_OUT_PRESET], "0", 2); // 预置动作
+    char gpio_state[2];
+    int ret;
+
+    // 读取GPIO状态
+    ret = read(gpio_val_fd[DO_IN_PRESET], gpio_state, sizeof(gpio_state));
+    printf("ret: %d\n", ret);
+    if (ret > 0)
+    {
+        gpio_state[ret] = '\0';             // 添加字符串结束符
+        printf("PRESET: %s\n", gpio_state); // 应该是"0"或"1"
+    }
+
+    write(gpio_val_fd[DO_OUT0], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT0], "1", 2);
+
+    write(gpio_val_fd[DO_OUT1], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT1], "1", 2);
+
+    write(gpio_val_fd[DO_OUT2], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT2], "1", 2);
+
+    write(gpio_val_fd[DO_OUT3], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT3], "1", 2);
+
+    write(gpio_val_fd[DO_OUT_PRESET], "1", 2); // 预置动作
+    // 读取GPIO状态
+    ret = read(gpio_val_fd[DO_IN_PRESET], gpio_state, sizeof(gpio_state));
+    printf("ret: %d\n", ret);
+    if (ret > 0)
+    {
+        gpio_state[ret] = '\0';             // 添加字符串结束符
+        printf("PRESET: %s\n", gpio_state); // 应该是"0"或"1"
+    }
+
+    write(gpio_val_fd[DO_OUT4], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT4], "1", 2);
+
+    write(gpio_val_fd[DO_OUT5], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT5], "1", 2);
+
+    write(gpio_val_fd[DO_OUT6], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT6], "1", 2);
+
+    write(gpio_val_fd[DO_OUT7], "0", 2);
+    sleep(1);
+    write(gpio_val_fd[DO_OUT7], "1", 2);
+}
+
 #endif

+ 4 - 0
app_public/fuxi_public/fuxi_bsp/source/led_ftu.c

@@ -115,6 +115,7 @@ static int _led_kc_op(int i)
 	
 	// 先将板卡的索引转换为开出函数的索引
 	channel = equ_get_do_channel(i);
+#if !defined CPU_FUXI
 	switch(g_led_stu[g_led_slot[EQU_SLOT_KZ].sn[i].sw][g_led_slot[EQU_SLOT_KZ].sn[i].no])
 	{
 		case LED_ON:
@@ -139,6 +140,7 @@ static int _led_kc_op(int i)
 			}
 		break;
 	}
+#endif
 
 	return 0;
 }
@@ -159,6 +161,7 @@ int led_polling_5ms(void)
 {
 	int i;
 	// 遍历所有灯
+#if !defined CPU_FUXI
 	// TODO EWen 开出点控灯的集中式不用此方式
 	for (i=0; i<g_led_slot[EQU_SLOT_KZ].num; i++)
 	{
@@ -173,6 +176,7 @@ int led_polling_5ms(void)
 			_led_kc_op(i);
 		}
 	}
+#endif
 
 	// 计数到清零,并切换状态
 	if (g_kc_led.slow_t == SLOW_FLASH)

+ 2 - 0
dtu/dtu_main_t536/app/MmiData.c

@@ -5851,10 +5851,12 @@ int mmd_GetFileInf(int value)
     extern struct board_res_head    *g_board_res_head;
     for(i=0; i<g_board_res_head->br_num; i++)
     {
+#if !defined CPU_FUXI
         if(g_board_res[i].type==g_board_info[EQU_SLOT_KZ].type)
         {
             index=i;
         }
+#endif
     }
 #if LCD_SIZE==128
     sprintf(strGprsInf[num],"%d.装置资源:%04XH",num+1,g_crc_rsc);						//显示面板上num排序应从1(num+1)开始

+ 23 - 27
dtu/dtu_main_t536/app/defineSys.h

@@ -12,7 +12,7 @@
 #ifndef _DEFINE_SYS_H
 #define _DEFINE_SYS_H
 
-#define DEVICE_VERSION_INFORMATION "NW24_20251223_008" // NW2022意思是按照22年南网标准文件(总调)来做的
+#define DEVICE_VERSION_INFORMATION "NW24_20251224_002" // NW2022意思是按照22年南网标准文件(总调)来做的
 
 #ifdef ___defineSys____//!!!此宏定义不开启,以下宏不直接开启,只用于注释显示
 
@@ -87,10 +87,13 @@
 #define PRO_PT_LL_NC                   // 非Fa联络 无压有流动作 PT断线告警
 #define FIXAREA_VERSION_T              // 定值区号版本2 待召唤定值区号、待执行定值区号
 #define PUB_SET_SECTION                // 定义之后公共定值在定值区概念里面管辖
-// #define TMP_CHIP_AHT20
+#define IEC_NOLINK_NO_CALLYX           // 级联无响应遥信
+#define GOOSE_NETTYPE_SET              // goose网络类型设置
+#define TMP_CHIP_AHT20                 // 温湿度芯片AHT20
+#define IO_CHIP_CH423S                 // 扩展IO芯片
 
 //定制功能
-// #define CUSTOMIZE_BZT			//定制功能-备自投
+#define CUSTOMIZE_BZT			//定制功能-备自投
 
 #define GD_AREA_ZHONGSHAN       // 中山局要求
 #define GD_AREA_ZHONGSHAN_2020  // 中山局2020要求
@@ -122,24 +125,19 @@
 #endif
 
 // 默认开启以下宏定义开关
-#define PASSWORD_4_STR                     // 默认密码四位数
-// #define IECTABLE_NEWDPI_V106   // 转发表配合工具完成合并点和遥信单双点配合版本  0X01010106
+#define PASSWORD_4_STR                 // 默认密码四位数
 #define COMM_STATION_NR                // 定义南瑞主站适应模式	,遥控报文优先上送
 #define YD_TEST_REALTIME_VALUE_DISPLAY // 远动测试遥信、遥测数据显示
-#define FUNC_FIT_QOS      // 101/104通讯的预置取消报文不判断qos(设定命令限定词)位
-#define GEN_QUEUE         // 录波相关
-#define RCD_STRAN_M       /*录波传输*/
-#define RCD_STRAN_S       /*录波传输*/
-#define SOE_RELINK_DISCOS /*soe续传不传cos*/
-#define FUNC_MORE_PRESET  // 支持遥调时多次预置,固化
-#define FUNC_PRINT_PT_ERR // PT断线时应报相关打印信息
-#define SOE_PARA_ALL_SAVE // 故障断面所有遥测全部显示
-#ifndef CPU_FUXI
-#define FUN_HMI_WATCH
-#endif
-
-// #define IEC_NOLINK_NO_CALLYX // 级联无响应遥信
-// #define GOOSE_NETTYPE_SET   //goose网络类型设置
+#define FUNC_FIT_QOS                   // 101/104通讯的预置取消报文不判断qos(设定命令限定词)位
+#define GEN_QUEUE                      // 录波相关
+#define RCD_STRAN_M                    // 录波传输
+#define RCD_STRAN_S                    // 录波传输
+#define SOE_RELINK_DISCOS              // soe续传不传cos
+#define FUNC_MORE_PRESET               // 支持遥调时多次预置,固化
+#define FUNC_PRINT_PT_ERR              // PT断线时应报相关打印信息
+#define SOE_PARA_ALL_SAVE              // 故障断面所有遥测全部显示
+#define DO_KOUT_CHECK                  // 开出反校
+#define IO_CHIP_CH423S                 // 扩展IO芯片
 
 //区分地区&客户个性化需求定义
 #if defined  GD_AREA_ECZD_2020    	//2020广东配网终端二次功能指导意见
@@ -149,8 +147,8 @@
 		#define VER_NUM 				    29101			// 版本号29.101
 	#endif
     #define XDL_ZT            // 小电流接地
-    #define RCD_STRAN_M       /*录波传输*/
-    #define RCD_STRAN_S       /*录波传输*/
+    #define RCD_STRAN_M       // 录波传输
+    #define RCD_STRAN_S       // 录波传输
     #define FUNC_MODE_JS      // 切换模式解除闭锁
     #define FUNC_DRIVE        // 不停电传动功能
     #define FUNC_MORE_PREREAD // 支持遥调时多次读取
@@ -168,8 +166,8 @@
 		#define VER_NUM			 		4102          // 版本号4.102
 	#endif
 	#define GEN_QUEUE	
-	#define RCD_STRAN_M			/*录波传输*/
-	#define RCD_STRAN_S			/*录波传输*/
+	#define RCD_STRAN_M			// 录波传输
+	#define RCD_STRAN_S			// 录波传输
 
 #elif defined GD_AREA_ZHONGSHAN_2020	//中山局2020要求
 	#define VER_NUM 				    30103			// 版本号30.101->30.103
@@ -177,8 +175,8 @@
     #define ADD_DEBUG_RECORD_FUN    //增加调试记录功能选项
     #define ADD_DEBUG_RECORD_AUTO_SHOW_FUN    //增加调试记录功能自动显示功能
 	#define GEN_QUEUE	
-	#define RCD_STRAN_M			/*录波传输*/
-	#define RCD_STRAN_S			/*录波传输*/
+	#define RCD_STRAN_M			// 录波传输
+	#define RCD_STRAN_S			// 录波传输
 
 /*!!!!!注意!!!!!:往上↑↑↑↑↑↑↑↑地区版本定义VER_NUM不允许超32101/32201(goose)*/
 #else
@@ -224,8 +222,6 @@
 	#undef FUNC_S1_BUTTON
 #endif
 
-#define NW_AREA_MAIN_2021
-
 #define BATTERY_WITH_COMM		//带通讯电源模块
 #define YB_AUTO_SELECT			//在没配置硬压板的时自动选择软压板执行
 

+ 2 - 0
dtu/dtu_main_t536/app/main.c

@@ -175,6 +175,8 @@ int app_main (void *unused)
     msleep(100);
     factor_printf();
     msleep(100);
+    extern int test_kc_function(void);
+    test_kc_function();
 #endif
 
 	{

+ 1 - 0
dtu/dtu_main_t536/app/set.c

@@ -4283,6 +4283,7 @@ void MakeRunPara(bool bFirstInit, bool bUboot)
                 extern int equ_config_do_yd(void);
                 equ_config_di_yd();
                 equ_config_do_yd();
+                equ_reinit_rv_di();
             }
         }
     }

+ 0 - 31
dtu/dtu_main_t536/app/uart_comm.c

@@ -98,36 +98,8 @@ void Uart_Comm_Send(void)
 		}
 		
 	}
-			
-		
-
 }
 
-#ifdef FUN_HMI_WATCH
-u8 hmi_commstate=false;
-
-void set_hmi_comstate(u8 state)
-{	
-	static int first=0;
-	
-	if(state == true)
-	{	
-		if(first == 0)
-		{
-			first = 1;
-			watchdog_register_hmi();	/*第一次连接上注册软看门狗*/			
-			log_str_time(LOG_OPERATE,"---监视启动\r\n",0,0); 
-		}
-		else
-		{
-			watchdog_feed_hmi();				
-		}				
-	}
-
-	hmi_commstate = state;		
-}
-#endif
-
 void Uart_Comm_Recv(void)
 {
 	u8 buf[UART_FRAME_LEN];
@@ -150,9 +122,6 @@ void Uart_Comm_Recv(void)
 			switch(src_addr)	
 			{
 			case HMI_BOARD:	
-		#ifdef FUN_HMI_WATCH
-				set_hmi_comstate(true);
-		#endif
 				HMI_Board_Recv((int)buf[1] + 6, buf);
 				hmi_status = true;
 		        count = ustimer_get_origin();							

+ 2 - 0
dtu/dtu_main_t536/main_mod.c

@@ -365,8 +365,10 @@ int di_do_adc (void *unused)
     }
     else
     {
+        l_retrv_di = 0;
         dp_info_nt("rvdi init ok!");
     }
+    // dp_info_nt("l_retrv_di = %d", l_retrv_di);
 #endif
 
     while (1)

+ 1 - 0
dtu/dtu_main_t536/sh/t536/Makefile

@@ -80,6 +80,7 @@ OBJS =  main_mod.o \
 		tmp/fuxi_bsp/source/flexcan.o \
 		tmp/fuxi_bsp/source/can_app.o \
 		tmp/fuxi_bsp/source/aht20.o \
+		tmp/fuxi_bsp/source/ch423s.o \
 		\
 		tmp/bsp_share/bsp_shm.o \
 		tmp/bsp_share/bsp_share.o \

+ 1 - 1
dtu/dtu_main_t536/sh/t536/mybuild_for_std_dtu5.0

@@ -1,6 +1,6 @@
 #!/bin/sh
 
 if [ -e ./mybuild_for_gw_public_t536 ]; then
-	./mybuild_for_gw_public_t536 GuoWang DGD_AREA_ECZD_2020 DCPU_FUXI DMACHINE_NULL
+	./mybuild_for_gw_public_t536 NanWang DGD_AREA_ECZD_2020 DCPU_FUXI DMACHINE_NULL
 fi