303 lines
9.1 KiB
C
303 lines
9.1 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef _IOT_MODBUS_EXT_H_
|
|
#define _IOT_MODBUS_EXT_H_
|
|
|
|
#include "iot_utils_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define big_little_swap16(d) ((((uint16_t)(d) & 0xff00) >> 8) | \
|
|
(((uint16_t)(d) & 0x00ff) << 8))
|
|
|
|
#pragma pack(push) /* save the pack status */
|
|
#pragma pack(1) /* 1 byte align */
|
|
|
|
/** fn code enum */
|
|
typedef enum _modbus_fn_code_e {
|
|
/* have to stay at the front */
|
|
MODBUS_EXT_FNCODE_MIN = 0x00,
|
|
/** modbus ext query cmd fn */
|
|
MODBUS_EXT_QUERY_FN = 0x03,
|
|
/** modbus ext set single register cmd fn */
|
|
MODBUS_EXT_SET_SINGLE_REG_FN = 0x06,
|
|
/** modbus ext set multi register cmd fn */
|
|
MODBUS_EXT_SET_MULTI_REG_FN = 0x10,
|
|
|
|
MODBUS_EXT_FNCODE_MAX = 0x10,
|
|
} modbus_fn_code_e;
|
|
|
|
/* fn = MODBUS_EXT_SET_SINGLE_REG_CMD
|
|
* subfn code is mapping to register address.
|
|
*/
|
|
enum modbus_set_single_ra_e {
|
|
/** set adapter id cmd subfn */
|
|
AID_SET_RA = 0x1000,
|
|
/** set slaver address cmd subfn */
|
|
SA_SET_RA = 0x1002,
|
|
/** set white list cmd subfn */
|
|
WL_SET_RA = 0x1004,
|
|
/** set gpio cmd subfn */
|
|
GPIO_SET_BASE_RA = 0x6e00,
|
|
};
|
|
|
|
/* fn = MODBUS_EXT_SET_MULTI_REG_CMD */
|
|
enum modbus_set_multi_ra_e {
|
|
/** add item in white list */
|
|
WL_ADD_ITEM_SET_RA = 0x1008,
|
|
/** remove item from white list */
|
|
WL_RM_ITEM_SET_RA = 0x1010,
|
|
|
|
};
|
|
|
|
/* fn = MODBUS_EXT_QUERY_CMD */
|
|
enum modbus_query_ra_e {
|
|
/** query adapter id cmd subfn */
|
|
AID_QUERY_RA = 0x1000,
|
|
/** query slaver address cmd subfn */
|
|
SA_QUERY_RA = 0x1002,
|
|
/** query item count from white list cmd subfn */
|
|
WL_ITEM_COUNT_QUERY_RA = 0x1006,
|
|
/** query item from white list cmd subfn */
|
|
WL_ITEM_QUERY_BASE_RA = 0x6000,
|
|
/** query gpio cmd subfn */
|
|
GPIO_QUERY_BASE_RA = 0x6e00,
|
|
};
|
|
|
|
/* modbus cmd tansmit direction */
|
|
typedef enum _mb_transmit_direction_e {
|
|
MODBUS_CMD_FROM_UART,
|
|
MODBUS_CMD_FROM_PLC,
|
|
} mb_transmit_direction_e;
|
|
|
|
/* modbus ext protocol frame header */
|
|
typedef struct _mb_extend_frm_hdr_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* register address. */
|
|
uint16_t reg_addr;
|
|
} mb_extend_fn_hdr_t;
|
|
|
|
typedef struct _mb_ext_cmd_current_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* the data of current cmd */
|
|
uint16_t data;
|
|
mb_transmit_direction_e dir;
|
|
} mb_ext_cmd_current_t;
|
|
|
|
/* modbus ext protocol frame tail */
|
|
typedef struct _mb_ext_frm_tail_t {
|
|
/* crc16 for modbus ext frame */
|
|
uint16_t check_sum;
|
|
} mb_ext_frm_tail_t;
|
|
|
|
// set single register sub fn.
|
|
|
|
typedef struct _mb_ext_frame_aid_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* adapter id. */
|
|
uint16_t adapt_id;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_aid_set_t;
|
|
|
|
typedef struct _mb_ext_frame_sa_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* slaver address. */
|
|
uint16_t slaver_addr;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_sa_set_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* 00:disable wl, 01:enable wl. */
|
|
uint16_t enable_wl;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_set_t;
|
|
|
|
typedef struct _mb_ext_frame_gpio_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* 0:low level, 1:high level. */
|
|
uint16_t gpio_value;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_gpio_set_t;
|
|
|
|
// set multi register sub fn.
|
|
|
|
typedef struct _mb_ext_frame_wl_add_item_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
uint16_t reg_count;
|
|
uint8_t data_len;
|
|
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
|
|
uint16_t slaver_addr;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_add_item_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_rm_item_set_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
uint16_t reg_count;
|
|
uint8_t data_len;
|
|
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
|
|
uint16_t slaver_addr;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_rm_item_t;
|
|
|
|
// query sub fn.
|
|
|
|
typedef struct _mb_ext_frame_aid_query_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_aid_query_t;
|
|
|
|
typedef struct _mb_ext_frame_sa_query_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_sa_query_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_item_count_query_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_query_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_item_query_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_item_query_t;
|
|
|
|
typedef struct _mb_ext_frame_gpio_query_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_gpio_query_t;
|
|
|
|
// resp
|
|
|
|
typedef struct _mb_ext_frame_set_resp_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* data of set to resp */
|
|
uint16_t data;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_set_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_aid_query_resp_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* bytes num of data */
|
|
uint8_t data_len;
|
|
/* adapter id. */
|
|
uint16_t adapt_id;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_aid_query_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_sa_query_resp_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* bytes num of data */
|
|
uint8_t data_len;
|
|
uint16_t slaver_addr;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_sa_query_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_item_count_query_resp_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* bytes num of data */
|
|
uint8_t data_len;
|
|
uint16_t item_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_item_count_query_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_item_query_resp_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* bytes num of data */
|
|
uint8_t data_len;
|
|
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
|
|
uint16_t slaver_addr;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_item_query_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_gpio_query_resp_t {
|
|
/* slaver address. */
|
|
uint8_t sa;
|
|
/* command code. */
|
|
uint8_t fn;
|
|
/* bytes num of data */
|
|
uint8_t data_len;
|
|
/* value of the gpio */
|
|
uint16_t gpio_value;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_gpio_query_resp_t;
|
|
|
|
typedef struct _mb_ext_frame_wl_item_set_resp_t {
|
|
mb_extend_fn_hdr_t hdr;
|
|
/* count of register to read */
|
|
uint16_t reg_count;
|
|
mb_ext_frm_tail_t tail;
|
|
} mb_ext_frame_wl_item_set_resp_t;
|
|
|
|
/* Gree Fn Code handle. Each Code should define itself function*/
|
|
typedef bool_t(* MODBUS_FN_HANDLE)(uint8_t *data, uint8_t len, \
|
|
mb_transmit_direction_e dir);
|
|
|
|
/* Modbus function code table */
|
|
typedef struct _mb_fnhdl_tbl_t
|
|
{
|
|
/*gree function code*/
|
|
uint32_t cmdid;
|
|
/*each code handler*/
|
|
MODBUS_FN_HANDLE cmd_handle_fn;
|
|
/*each fn handle statistic */
|
|
uint32_t cmd_num;
|
|
} mb_fnhdl_tbl_t;
|
|
|
|
#pragma pack(pop)
|
|
|
|
uint8_t iot_mb_ext_cmd_handler(uint8_t * data, uint16_t len,
|
|
mb_transmit_direction_e dir);
|
|
|
|
void iot_mb_ext_resp_cmd_timeout_or_failed();
|
|
|
|
uint8_t iot_mb_ext_handle_resp_from_ge(iot_pkt_t *p_pkt_frame);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _IOT_MODBUS_EXT_H_ */
|
|
|
|
|