367 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			12 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 PROTO_ACM_H
 | |
| #define PROTO_ACM_H
 | |
| 
 | |
| /* os shim includes */
 | |
| #include "os_types_api.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #define PROTO_ACM_SOF_BYTE             (0x68)
 | |
| #define PROTO_ACM_EOF_BYTE             (0x16)
 | |
| 
 | |
| #define PROTO_ACM_SOF_BYTE_LEN         (1)
 | |
| #define PROTO_ACM_EOF_BYTE_LEN         (1)
 | |
| #define PROTO_ACM_FCS_LEN              (2)
 | |
| 
 | |
| #define PROTO_ACM_PRM_MASTER           (1)
 | |
| #define PROTO_ACM_PRM_SLAVE            (0)
 | |
| 
 | |
| /* transmission direction */
 | |
| #define PROTO_ACM_DIR_DOWN_LINK        (0)
 | |
| #define PROTO_ACM_DIR_UP_LINK          (1)
 | |
| 
 | |
| /* control number */
 | |
| #define PROTO_ACM_CMD_ACK              (0)
 | |
| #define PROTO_ACM_CMD_NACK             (1)
 | |
| #define PROTO_ACM_CMD_DATA             (2)
 | |
| 
 | |
| /* apdu type */
 | |
| #define PROTO_ACM_APDU_TYPE_LINKREQUEST         (1)
 | |
| #define PROTO_ACM_APDU_TYPE_GETREQUEST          (2)
 | |
| #define PROTO_ACM_APDU_TYPE_SETREQUEST          (3)
 | |
| #define PROTO_ACM_APDU_TYPE_REPORTNOTIFICATION  (4)
 | |
| #define PROTO_ACM_APDU_TYPE_LINKRESPONSE        (129)
 | |
| #define PROTO_ACM_APDU_TYPE_GETRESPONSE         (130)
 | |
| #define PROTO_ACM_APDU_TYPE_SETRESPONSE         (131)
 | |
| #define PROTO_ACM_APDU_TYPE_REPORTRESPONSE      (132)
 | |
| 
 | |
| /* acm proto version */
 | |
| #define PROTO_ACM_PROTO_VER                     (0x1)
 | |
| 
 | |
| /* concurrent transportation window count */
 | |
| #define PROTO_ACM_CON_TRAN_WINDOW_CNT           (1)
 | |
| 
 | |
| /* virtual channel work mode count */
 | |
| #define PROTO_ACM_VIRTUAL_CHANNEL_CNT           (2)
 | |
| 
 | |
| /* virtual channel interface type */
 | |
| #define PROTO_ACM_VIRTUAL_CHANNEL_TYPE_ACM      (1)
 | |
| #define PROTO_ACM_VIRTUAL_CHANNEL_TYPE_ECM      (2)
 | |
| #define PROTO_ACM_VIRTUAL_CHANNEL_TYPE_HID      (3)
 | |
| 
 | |
| /* virtual channel function configuration */
 | |
| #define PROTO_ACM_FUN_CONF_MAG_CHANNEL          (0)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_REM             (1)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_PLC_RF          (2)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_RS485           (3)
 | |
| #define PROTO_ACM_FUN_CONF_TELE_PULSE           (4)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_CAN             (5)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_M_BUS           (6)
 | |
| #define PROTO_ACM_FUN_CONF_CONTROL              (7)
 | |
| #define PROTO_ACM_FUN_CONF_SIMU_COLLECT         (8)
 | |
| #define PROTO_ACM_FUN_CONF_COMM_RS232           (9)
 | |
| 
 | |
| #define PROTO_ACM_INVALID_ACM_SN                (0xFFFF)
 | |
| 
 | |
| /* acm proto module device type length */
 | |
| #define PROTO_ACM_MODULE_DEV_TYPE_LEN           (4)
 | |
| /* acm proto module device type */
 | |
| #define PROTO_ACM_MODULE_DEV_TYPE               "0001"
 | |
| 
 | |
| /* DTB function info for only read */
 | |
| #define PROTO_ACM_DTB_MODULE_INFO               (0x00)
 | |
| #define PROTO_ACM_DTB_LINK_INFO                 (0x01)
 | |
| #define PROTO_ACM_DTB_TRANS_STATUS              (0x02)
 | |
| #define PROTO_ACM_DTB_PROTO_VER                 (0x03)
 | |
| #define PROTO_ACM_DTB_POWER_STATUS              (0x04)
 | |
| 
 | |
| /* DTB function info for read write */
 | |
| #define PROTO_ACM_DTB_CLOCK                     (0x00)
 | |
| 
 | |
| /* DTB function info for only write */
 | |
| #define PROTO_ACM_DTB_HW_INIT                   (0x00)
 | |
| #define PROTO_ACM_DTB_PARAM_INIT                (0x01)
 | |
| #define PROTO_ACM_DTB_DATA_INIT                 (0x02)
 | |
| #define PROTO_ACM_DTB_FILE_TRANS                (0x03)
 | |
| 
 | |
| /* DTA2 type */
 | |
| #define PROTO_ACM_DTA2_ONLY_READ                (0x00)
 | |
| #define PROTO_ACM_DTA2_READ_WRITE               (0x01)
 | |
| #define PROTO_ACM_DTA2_ONLY_WRITE               (0x02)
 | |
| 
 | |
| /* DTA1 type */
 | |
| #define PROTO_ACM_DTA1_COMM_INFO                (0x00)
 | |
| 
 | |
| /* data access result */
 | |
| /* success */
 | |
| #define PROTO_ACM_DAR_OK                        (0)
 | |
| /* reject to operate */
 | |
| #define PROTO_ACM_DAR_REJECT                    (1)
 | |
| /* info type undefine */
 | |
| #define PROTO_ACM_DAR_UNDEFINE                  (2)
 | |
| /* others */
 | |
| #define PROTO_ACM_DAR_OTHERS                    (255)
 | |
| 
 | |
| /* get response result */
 | |
| #define PROTO_ACM_GET_RESP_DAR                  (0)
 | |
| #define PROTO_ACM_GET_RESP_DATA                 (1)
 | |
| 
 | |
| /* data struct type */
 | |
| #define PROTO_ACM_DATA_TYPE_ARRAY               (1)
 | |
| #define PROTO_ACM_DATA_TYPE_STRUCT              (2)
 | |
| #define PROTO_ACM_DATA_TYPE_UIN32               (6)
 | |
| #define PROTO_ACM_DATA_TYPE_STR                 (10)
 | |
| #define PROTO_ACM_DATA_TYPE_UIN8                (17)
 | |
| #define PROTO_ACM_DATA_TYPE_UIN16               (18)
 | |
| #define PROTO_ACM_DATA_TYPE_ENUM                (22)
 | |
| #define PROTO_ACM_DATA_TYPE_DATE                (26)
 | |
| 
 | |
| /* get response module info struct cnt */
 | |
| #define PROTO_ACM_GETRESPONSE_STRUCT_CNT_MOD    (7)
 | |
| /* get response link info struct cnt */
 | |
| #define PROTO_ACM_GETRESPONSE_STRUCT_CNT_LINK   (7)
 | |
| 
 | |
| /* virtual channel work mode struct cnt */
 | |
| #define PROTO_ACM_VIRTUAL_CHANNEL_STRU_CNT      (2)
 | |
| 
 | |
| #pragma pack(push)      /* save the pack status */
 | |
| #pragma pack(1)         /* 1 byte align */
 | |
| 
 | |
| typedef struct _proto_acm_data_type {
 | |
|     /* data struct type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           data_type;
 | |
| } proto_acm_data_type_t;
 | |
| 
 | |
| typedef struct _proto_acm_struct_type {
 | |
|     /* struct type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           type;
 | |
|     /* count */
 | |
|     uint8_t           cnt;
 | |
| } proto_acm_struct_type_t;
 | |
| 
 | |
| typedef struct _proto_acm_data_len {
 | |
|     /* data struct type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           data_type;
 | |
|     /* data length */
 | |
|     uint8_t           len;
 | |
| } proto_acm_data_len_t;
 | |
| 
 | |
| typedef struct _proto_acm_ctrl {
 | |
|     /* control number, see PROTO_ACM_CMD_XXX */
 | |
|     uint8_t cmd_type : 6,
 | |
|     /* start flag, see PROTO_ACM_PRM_XXX */
 | |
|             prm      : 1,
 | |
|     /* transmission direction, see PROTO_ACM_DIR_XXX */
 | |
|             dir      : 1;
 | |
|     uint8_t seq;
 | |
| } proto_acm_ctrl_t;
 | |
| 
 | |
| typedef struct _proto_acm_hdr {
 | |
|     /* start byte */
 | |
|     uint8_t           sof_byte;
 | |
|     /* frame length */
 | |
|     uint16_t          len  : 12,
 | |
|                       rsvd : 4;
 | |
|     /* control bytes */
 | |
|     proto_acm_ctrl_t  ctrl_byte;
 | |
|     /* apdu data */
 | |
|     uint8_t           apdu[0];
 | |
| } proto_acm_hdr_t;
 | |
| 
 | |
| typedef struct _proto_acm_tail {
 | |
|     /* fcs */
 | |
|     uint16_t          fcs;
 | |
|     /* eof byte */
 | |
|     uint8_t           eof_byte;
 | |
| } proto_acm_tail_t;
 | |
| 
 | |
| typedef struct _proto_acm_apdu_head {
 | |
|     /* apdu type, see PROTO_ACM_APDU_TYPE_XXX */
 | |
|     uint8_t           apdu_type;
 | |
|     /* apdu data */
 | |
|     uint8_t           data[0];
 | |
| } proto_acm_apdu_head_t;
 | |
| 
 | |
| typedef struct _proto_acm_proto_ver {
 | |
|     /* proto version number */
 | |
|     uint16_t          proto_ver;
 | |
| } proto_acm_proto_ver_t;
 | |
| 
 | |
| typedef struct _proto_acm_dev_type {
 | |
|     /* device type length */
 | |
|     uint8_t           len;
 | |
|     /* device type */
 | |
|     uint8_t           data[0];
 | |
| } proto_acm_dev_type_t;
 | |
| 
 | |
| typedef struct _proto_acm_dev_id {
 | |
|     /* device id length */
 | |
|     uint8_t           len;
 | |
|     /* device id */
 | |
|     uint8_t           data[0];
 | |
| } proto_acm_dev_id_t;
 | |
| 
 | |
| typedef struct _proto_acm_dev_param {
 | |
|     /* max send buffer length */
 | |
|     uint16_t          max_send_buf_len;
 | |
|     /* max recv buffer length */
 | |
|     uint16_t          max_recv_buf_len;
 | |
|     /* concurrent transportation window */
 | |
|     uint8_t           con_tran_window;
 | |
| } proto_acm_dev_param_t;
 | |
| 
 | |
| typedef struct _proto_acm_dev_param_type {
 | |
|     /* send buf len data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           send_data_type;
 | |
|     /* max send buffer length */
 | |
|     uint16_t          max_send_buf_len;
 | |
|     /* recv buf len data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           recv_data_type;
 | |
|     /* max recv buffer length */
 | |
|     uint16_t          max_recv_buf_len;
 | |
|     /* transportation window data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           window_data_type;
 | |
|     /* concurrent transportation window */
 | |
|     uint8_t           con_tran_window;
 | |
| } proto_acm_dev_param_type_t;
 | |
| 
 | |
| typedef struct _proto_acm_virtual_channel {
 | |
|     /* virtual channel interface type */
 | |
|     uint8_t           interface_type;
 | |
|     /* virtual channel interface function */
 | |
|     uint8_t           function;
 | |
| } proto_acm_virtual_channel_t;
 | |
| 
 | |
| typedef struct _proto_acm_virtual_channel_type {
 | |
|     /* virtual channel struct type */
 | |
|     proto_acm_struct_type_t         stru_type;
 | |
|     /*  interface type data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t                         int_data_type;
 | |
|     /* virtual channel interface type */
 | |
|     uint8_t                         interface_type;
 | |
|     /*  function type data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t                         func_data_type;
 | |
|     /* virtual channel interface function */
 | |
|     uint8_t                         function;
 | |
| } proto_acm_virtual_channel_type_t;
 | |
| 
 | |
| typedef struct _proto_acm_virtual_channel_work_mode {
 | |
|     /* mode count */
 | |
|     uint8_t           cnt;
 | |
|     /* virtual channel paramter */
 | |
|     proto_acm_virtual_channel_t channel[0];
 | |
| } proto_acm_virtual_channel_work_mode_t;
 | |
| 
 | |
| typedef struct _proto_acm_virtual_channel_work_mode_type {
 | |
|     /* count data type, see PROTO_ACM_DATA_TYPE_XXX */
 | |
|     uint8_t           cnt_data_type;
 | |
|     /* strcut type count */
 | |
|     uint8_t           cnt;
 | |
|     /* virtual channel paramter */
 | |
|     proto_acm_virtual_channel_type_t channel[0];
 | |
| } proto_acm_virtual_channel_work_mode_type_t;
 | |
| 
 | |
| typedef struct _acm_reject {
 | |
|     /* error code */
 | |
|     uint16_t   err_code;
 | |
| } acm_reject_t;
 | |
| 
 | |
| typedef struct _proto_acm_dt {
 | |
|     /* DTA2 type, see PROTO_ACM_DTA2_XXX */
 | |
|     uint16_t          dta2: 2,
 | |
|     /* DTA1 type, see PROTO_ACM_DTA1_XXX */
 | |
|                       dta1: 6,
 | |
|     /* DTB function info, see PROTO_ACM_DTB_XXX */
 | |
|                       dtb : 8;
 | |
| } proto_acm_dt_t;
 | |
| 
 | |
| typedef struct _proto_acm_dar {
 | |
|     /* data access result, see PROTO_ACM_DAR_XXX */
 | |
|     uint8_t           result;
 | |
| } proto_acm_dar_t;
 | |
| 
 | |
| typedef struct _proto_acm_get_resp {
 | |
|     /* dt */
 | |
|     proto_acm_dt_t    dt;
 | |
|     /* get response result, see PROTO_ACM_GET_RESP_XXX */
 | |
|     uint8_t           ret_type;
 | |
| } proto_acm_get_resp_t;
 | |
| 
 | |
| typedef struct _proto_acm_date {
 | |
|     /* year, 0xFFFF is invalid */
 | |
|     uint16_t          year;
 | |
|     /* month, 0xFF is invalid */
 | |
|     uint8_t           mon;
 | |
|     /* day of month, 0xFF is invalid */
 | |
|     uint8_t           day;
 | |
|     /* day of week, 0xFF is invalid */
 | |
|     uint8_t           week_day;
 | |
| } proto_acm_date_t;
 | |
| 
 | |
| typedef struct _proto_acm_build_info {
 | |
|     /* version data type */
 | |
|     uint8_t           ver_type;
 | |
|     /* version */
 | |
|     uint32_t          ver;
 | |
|     /* date data type */
 | |
|     uint8_t           date_type;
 | |
|     /* date */
 | |
|     proto_acm_date_t  date;
 | |
| } proto_acm_build_info_t;
 | |
| 
 | |
| typedef struct _proto_acm_vendor_id {
 | |
|     /* vendor id length */
 | |
|     uint8_t           len;
 | |
|     /* vendor id */
 | |
|     uint8_t           data[0];
 | |
| } proto_acm_vendor_id_t;
 | |
| 
 | |
| #pragma pack(pop)   /* restore the pack status */
 | |
| 
 | |
| void proto_acm_check_frame_handler(uint8_t *buffer, uint32_t buffer_len,
 | |
|     bool_t *is_frame);
 | |
| 
 | |
| /**
 | |
|  * @brief:         get length to reserve before app data in acm pkt.
 | |
|  *                 it's the sum of header length and extra headroom.
 | |
|  * @return:        length of acm UART packet header.
 | |
|  */
 | |
| static inline uint32_t proto_acm_get_rsvd_len()
 | |
| {
 | |
|     return sizeof(proto_acm_hdr_t);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief:         get length of iot_pkt to alloc for sending the acm pkt
 | |
|  *                 to uart.
 | |
|  * @data_len:      app data len in acm packet
 | |
|  * return:         length of the acm UART packet
 | |
|  */
 | |
| static inline uint32_t proto_acm_get_pkt_len(uint32_t data_len)
 | |
| {
 | |
|     return proto_acm_get_rsvd_len() + data_len + PROTO_ACM_FCS_LEN +
 | |
|         PROTO_ACM_EOF_BYTE_LEN;
 | |
| }
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif  /* PROTO_ACM_H */
 |