mcu_hi3321_watch/middleware/utils/dfx/diag/diag_pkt.h
2025-05-26 20:15:20 +08:00

118 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) @CompanyNameMagicTag 2021-2021. All rights reserved.
* Description: zdiag pkt
* This file should be changed only infrequently and with great care.
*/
#ifndef DIAG_PKT_H
#define DIAG_PKT_H
#include <stdint.h>
#include <stdbool.h>
#include "diag_common.h"
#include "common_def.h"
enum {
DIAG_PKT_MEM_TYPE_STACK_DATA_STACK,
DIAG_PKT_MEM_TYPE_DATA_DFX_MALLOC,
};
enum {
DIAG_PKT_DATA_ID_0,
DIAG_PKT_DATA_ID_1,
DIAG_PKT_DATA_ID_2,
DIAG_PKT_DATA_ID_MAX,
};
#define DIAG_PKT_DATA_ATTRIBUTE_SINGLE_TASK 0x1
#define DIAG_PKT_DATA_ATTRIBUTE_DYN_MEM 0x2
typedef enum {
DIAG_PKT_STACK_DATA = DIAG_PKT_DATA_ATTRIBUTE_SINGLE_TASK,
DIAG_PKT_DFX_MALLOC_DATA = DIAG_PKT_DATA_ATTRIBUTE_DYN_MEM,
} diag_pkt_data_t;
typedef struct {
uint8_t *data[DIAG_PKT_DATA_ID_MAX];
uint16_t data_len[DIAG_PKT_DATA_ID_MAX];
uint8_t data_cnt : 2;
uint8_t need_free : 1; /* true:pkt有数据需要释放 false:pkt无数据需要释放 */
uint8_t single_task : 1; /* true:pkt有数据无法跨任务传递 false:pkt无数据无法跨任务传递 */
uint8_t critical : 1; /* 非调度报文,如:死机 */
uint8_t output_type : 2; /* 0从对应通道输出或处理1: 保存至本地 */
uint8_t resvered : 1; /* 保留字段 */
} diag_pkt_handle_t;
errcode_t diag_check_mux_pkt(const diag_router_frame_t *frame, uint16_t size);
errcode_t diag_check_hcc_pkt(uint8_t *data, uint16_t size);
void diag_pkt_handle_init(diag_pkt_handle_t *pkt, uint8_t data_cnt);
void diag_pkt_set_critical(diag_pkt_handle_t *pkt);
void diag_pkt_set_output_type(diag_pkt_handle_t *pkt, uint8_t type);
void diag_pkt_handle_set_data(diag_pkt_handle_t *pkt, uint8_t idx, uint8_t *data,
uint16_t data_len, diag_pkt_data_t attribute);
void diag_mk_log_pkt(diag_cmd_log_layer_stru_t *log_pkt, uint32_t module_id, uint32_t msg_id);
void diag_mk_normal_log_pkt(diag_cmd_normal_log_layer_t *log_pkt, uint8_t module_id, uint32_t msg_id);
void diag_mk_extend_log_pkt(diag_cmd_extend_log_layer_t *log_pkt, uint8_t module_id, uint32_t msg_id);
void diag_mk_min_log_pkt(diag_cmd_minimal_log_layer_t *log_pkt, uint32_t msg_id);
void diag_mk_log_pkt_sn(diag_cmd_log_layer_stru_t *log_pkt, uint32_t module_id, uint32_t msg_id, uint32_t sn);
void diag_mk_normal_log_pkt_sn(diag_cmd_normal_log_layer_t *log_pkt, uint8_t module_id, uint32_t msg_id, uint16_t sn);
void diag_mk_extend_log_pkt_sn(diag_cmd_extend_log_layer_t *log_pkt, uint8_t module_id, uint32_t msg_id, uint8_t sn);
void diag_mk_min_log_pkt_sn(diag_cmd_minimal_log_layer_t *log_pkt, uint32_t msg_id, uint16_t sn);
void diag_mk_ind_header(diag_head_ind_stru_t *ind, uint16_t cmd_id);
void diag_mk_req_header(diag_head_req_stru_t *req, uint16_t cmd_id);
void diag_mk_frame_header_1(diag_router_frame_t *frame, uint16_t pkt_size);
static inline diag_router_frame_t *diag_pkt_handle_get_frame(diag_pkt_handle_t *pkt)
{
return (diag_router_frame_t *)pkt->data[0];
}
static inline diag_head_ind_stru_t *diag_receive_pkt_handle_get_ind(diag_pkt_handle_t *pkt)
{
return (diag_head_ind_stru_t *)(pkt->data[0] + DIAG_ROUTER_HEADER_LEN);
}
static inline uint8_t *diag_receive_pkt_handle_get_ind_data(diag_pkt_handle_t *pkt)
{
return pkt->data[0] + DIAG_ROUTER_HEADER_LEN + DIAG_IND_HEADER_SIZE;
}
static inline diag_head_req_stru_t *diag_receive_pkt_handle_get_req(diag_pkt_handle_t *pkt)
{
return (diag_head_req_stru_t *)(pkt->data[0] + DIAG_ROUTER_HEADER_LEN);
}
static inline uint8_t *diag_receive_pkt_handle_get_req_data(diag_pkt_handle_t *pkt)
{
return pkt->data[0] + DIAG_ROUTER_HEADER_LEN + DIAG_REQ_HEADER_SIZE;
}
static inline uint32_t diag_pkt_handle_get_total_size(diag_pkt_handle_t *pkt)
{
uint32_t total_size = 0;
for (int i = 0; i < pkt->data_cnt; i++) {
total_size += (uint32_t)pkt->data_len[i];
}
return total_size;
}
static inline void diag_pkt_handle_clean(diag_pkt_handle_t *pkt)
{
pkt->need_free = false;
for (int i = 0; i < pkt->data_cnt; i++) {
pkt->data[i] = NULL;
pkt->data_len[i] = 0;
}
pkt->data_cnt = 0;
}
static inline void diag_pkt_cnt_increase(diag_pkt_handle_t *pkt, uint8_t cnt)
{
pkt->data_cnt += cnt;
}
#endif