From cc432b761c884a0bd8e9d83db0a4e26109fc08b1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 08 十一月 2024 15:35:38 +0800 Subject: [PATCH] 安邦手环GPS删除部分无用数据和修改4G波特率9600出厂测试固件 --- keil/include/components/se/src/se_api.c | 303 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 303 insertions(+), 0 deletions(-) diff --git a/keil/include/components/se/src/se_api.c b/keil/include/components/se/src/se_api.c new file mode 100644 index 0000000..0ad3655 --- /dev/null +++ b/keil/include/components/se/src/se_api.c @@ -0,0 +1,303 @@ +#include <string.h> +#include "se_api.h" +#include "phdriver.h" +#include "mk_trace.h" +#include "mk_misc.h" + +/*********************** Global Variables *************************************/ +SE_context g_ese_ctx = {0}; + +/** + * First read, use the default length(0xFE). + * Ohters read, use the IFSD REQ length, if this REQ is success. + * This memory cannot be freed, unitl this process died. + */ + +static void init_se_ctx_from_config(void); + +/***************************************************************************** + * @Function se_open + * @Param init_mode - init mode for normal OMA or download mode + * @Returns This function return ESESTATUS_SUCCES (0) in case of success. + ******************************************************************************/ +ESESTATUS se_open(SE_init_mode init_mode) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + phdriver_open(); + + // memset(&g_ese_ctx, 0x00, sizeof(g_ese_ctx)); + init_se_ctx_from_config(); + + status = ESESTATUS_SUCCESS; + g_ese_ctx.ESE_lib_status = ESESTATUS_OPENED; + + return status; +} + +/***************************************************************************** + * @Function se_init + * @Param init_mode - init mode for normal OMA or download mode + * @Returns This function return ESESTATUS_SUCCES (0) in case of success. + ******************************************************************************/ +ESESTATUS se_init(SE_init_mode init_mode) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + short cnt; + + LOG_INFO(TRACE_MODULE_SE, "%s: enter\r\n", __FUNCTION__); + + status = se_open(init_mode); + + if (ESESTATUS_SUCCESS != status) + { + LOG_INFO(TRACE_MODULE_SE, "%s: open device failed, errno = %d\r\n", __FUNCTION__, errno); + goto cleanup; + } + + cnt = 0; + do + { + status = t1_CIP_req(); + if ((ESESTATUS_SUCCESS == status) && (g_ese_ctx.max_IFSC != 0)) + { + break; + } + cnt++; + if (cnt >= 1) + { + LOG_INFO(TRACE_MODULE_SE, "%s: CIP REQ failed[%d]\r\n", __FUNCTION__, status); + goto cleanup; + } + else + { + sys_timer_delay_ms(100); + } + } while (1); + + if (!g_ese_ctx.is_T1_ext_hdr_len) + { + goto cleanup; + } + + status = t1_IFSD_req(); + if (ESESTATUS_SUCCESS != status) + { + LOG_INFO(TRACE_MODULE_SE, "%s: IFSD REQ failed[%d]\r\n", __FUNCTION__, status); + status = ESESTATUS_SUCCESS; + goto cleanup; + } + +cleanup: + return status; +} + +ESESTATUS se_status(void) +{ + return g_ese_ctx.ESE_lib_status; +} + +/***************************************************************************** + * @Function se_transmit_receive + * @Param p_cmd - Command to eSE + * p_resp - Response from eSE (Returned data to be freed after copying) + * @Returns On Success ESESTATUS_SUCCESS else an error code. + *****************************************************************************/ +ESESTATUS se_transmit_receive(SE_data *p_cmd, SE_data *p_resp) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + if ((NULL == p_cmd) || (NULL == p_resp)) + { + status = ESESTATUS_INVALID_PARAMETER; + goto cleanup; + } + + if ((0 == p_cmd->len) || (NULL == p_cmd->p_data)) + { + LOG_INFO(TRACE_MODULE_SE, "%s: Invalid Parameter no data\r\n", __FUNCTION__); + status = ESESTATUS_INVALID_PARAMETER; + goto cleanup; + } + else if ((ESESTATUS_CLOSED == g_ese_ctx.ESE_lib_status)) + { + LOG_INFO(TRACE_MODULE_SE, "%s ESE Not Initialized\r\n", __FUNCTION__); + status = ESESTATUS_NOT_INITIALISED; + goto cleanup; + } + + status = t1_transmit_receive_apdu(p_cmd->p_data, p_cmd->len); + if (ESESTATUS_SUCCESS == status) + { + status = t1_receive_data_and_get(&p_resp->p_data, &p_resp->len); + } + else + { + LOG_INFO(TRACE_MODULE_SE, "%s failed, status = %d\n\r", __FUNCTION__, status); + p_resp->p_data = NULL; + } + // LOG_INFO(TRACE_MODULE_SE, "%s Processing complete\n\r", __FUNCTION__); + +cleanup: + + return status; +} + +/***************************************************************************** + * @Function se_deinit + * @Returns ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0). + *****************************************************************************/ +ESESTATUS se_deinit(void) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + if ((ESESTATUS_CLOSED == g_ese_ctx.ESE_lib_status)) + { + LOG_INFO(TRACE_MODULE_SE, " %s ESE Not Initialized \n", __FUNCTION__); + status = ESESTATUS_NOT_INITIALISED; + goto cleanup; + } + + status = t1_prop_end_apdu_req(); + if (ESESTATUS_SUCCESS != status) + { + LOG_INFO(TRACE_MODULE_SE, "%s: END_APUD REQ failed[%d]", __FUNCTION__, status); + LOG_INFO(TRACE_MODULE_SE, "%s: IntfReset (CIP)", __FUNCTION__); + status = t1_CIP_req(); + if (status != ESESTATUS_SUCCESS) + { + LOG_INFO(TRACE_MODULE_SE, "%s: IntfReset Failed", __FUNCTION__); + } + } + else + { + LOG_INFO(TRACE_MODULE_SE, "%s: END_APUD REQ success", __FUNCTION__); + } + +cleanup: + + status = se_close(); + + return status; +} + +/***************************************************************************** + * @Function se_close + * @Returns This function return ESESTATUS_SUCCES (0) in case of success. + *****************************************************************************/ +ESESTATUS se_close(void) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + if ((ESESTATUS_CLOSED == g_ese_ctx.ESE_lib_status)) + { + LOG_INFO(TRACE_MODULE_SE, " %s ESE Not Opened", __FUNCTION__); + status = ESESTATUS_CLOSED; + return status; + } + + status = ESESTATUS_SUCCESS; + return status; +} + +static void init_se_ctx_from_config(void) +{ + g_ese_ctx.max_write_retry_cnt = 10; + g_ese_ctx.write_retry_time = 1000; + // WTX is 1s, read error will delay 1ms and retry, so the max retry is 1010 + g_ese_ctx.max_read_retry_cnt = 1010; + g_ese_ctx.read_retry_time = 1000; + g_ese_ctx.max_IFSD = 258; + + g_ese_ctx.max_recovery_cnt = 3; + + g_ese_ctx.max_blk_retry_cnt = 3; + g_ese_ctx.max_wtx_cnt = 30; +} + +/****************************************************************** + * @Function se_transmit_only + * @Param p_cmd - Command to eSE + * @Returns On Success ESESTATUS_SUCCESS else an error code. + *****************************************************************/ +ESESTATUS se_transmit_only(SE_data *p_cmd) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + if (NULL == p_cmd) // || (NULL == pRsp)) + { + status = ESESTATUS_INVALID_PARAMETER; + goto cleanup; + } + + if ((0 == p_cmd->len) || (NULL == p_cmd->p_data)) + { + LOG_INFO(TRACE_MODULE_SE, "%s: Invalid Parameter no data", __FUNCTION__); + status = ESESTATUS_INVALID_PARAMETER; + goto cleanup; + } + else if ((ESESTATUS_CLOSED == g_ese_ctx.ESE_lib_status)) + { + LOG_INFO(TRACE_MODULE_SE, "%s ESE Not Initialized", __FUNCTION__); + status = ESESTATUS_NOT_INITIALISED; + goto cleanup; + } + + status = t1_transmit_only_apdu(p_cmd->p_data, p_cmd->len); + if (ESESTATUS_SUCCESS == status) + { + } + else + { + LOG_INFO(TRACE_MODULE_SE, "%s failed, status = %d\n\r", __FUNCTION__, status); + // pRsp->p_data = NULL; + } + // LOG_INFO(TRACE_MODULE_SE, "%s Processing complete\n\r", __FUNCTION__); + +cleanup: + + return status; +} + +/***************************************************************************** + * @Function se_receive_only + * @Param p_resp - Response from eSE (Returned data to be freed after copying) + * @Returns On Success ESESTATUS_SUCCESS else an error code. + *****************************************************************************/ +ESESTATUS se_receive_only(SE_data *p_resp) +{ + ESESTATUS status = ESESTATUS_SUCCESS; + + if (NULL == p_resp) // || (NULL == pRsp)) + { + status = ESESTATUS_INVALID_PARAMETER; + goto cleanup; + } + + if ((ESESTATUS_CLOSED == g_ese_ctx.ESE_lib_status)) + { + LOG_INFO(TRACE_MODULE_SE, "%s ESE Not Initialized\r\n", __FUNCTION__); + status = ESESTATUS_NOT_INITIALISED; + goto cleanup; + } + + status = t1_receive_only_apdu(); + if (ESESTATUS_NO_DATA_TO_RECEIVE == status) + { + // LOG_INFO(TRACE_MODULE_SE, "%s : NO data from SE, status = %d\r\r", __FUNCTION__, status); + } + else if (ESESTATUS_SUCCESS == status) + { + status = t1_receive_data_and_get(&p_resp->p_data, &p_resp->len); + // LOG_INFO(TRACE_MODULE_SE, "%s Processing complete\r\n", __FUNCTION__); + } + else + { + // LOG_INFO(TRACE_MODULE_SE, "%s failed, status = %d\r\n", __FUNCTION__, status); + p_resp->p_data = NULL; + } + +cleanup: + + return status; +} -- Gitblit v1.9.3