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/tm_main.c | 291 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 291 insertions(+), 0 deletions(-) diff --git a/keil/include/components/se/src/tm_main.c b/keil/include/components/se/src/tm_main.c new file mode 100644 index 0000000..ee859fa --- /dev/null +++ b/keil/include/components/se/src/tm_main.c @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and + * its subsidiaries and affiliates (collectly called MKSEMI). + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into an MKSEMI + * integrated circuit in a product or a software update for such product, + * must reproduce the above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of MKSEMI nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * MKSEMI integrated circuit. + * + * 5. Any software provided in binary form under this license must not be + * reverse engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <stdarg.h> +#include <errno.h> +#include <string.h> +#include <ctype.h> +#include <stdint.h> +#include "se_api.h" +#include "mk_trace.h" +#include "uart_in_spi.h" +#include "mk_gpio.h" +#include "mk_spi.h" + +#define SE_PRINT_DEBUG (0) + +#if SE_PRINT_DEBUG == 1 +#include "mk_uwb.h" +#include "RTTDEBUG.h" +#endif + +static uint8_t g_uart_data[1024]; + +uint16_t passthrough_apdu_to_t1(uint8_t *cmd_buf, uint16_t cmd_len, uint32_t *resp_buf_addr, uint16_t *resp_len) +{ + SE_data cmd_apdu; + SE_data rsp_apdu; + ESESTATUS status = ESESTATUS_FAILED; + + // memset(&cmd_apdu, 0x00, sizeof(SE_data)); + // memset(&rsp_apdu, 0x00, sizeof(SE_data)); + + cmd_apdu.p_data = cmd_buf; + cmd_apdu.len = cmd_len; + status = se_transmit_receive(&cmd_apdu, &rsp_apdu); + + if (status == ESESTATUS_SUCCESS) + { + if (rsp_apdu.len > 0) + { + int i = 0; + LOG_INFO(TRACE_MODULE_SE, "[TX][%d]", rsp_apdu.len); + while (i < rsp_apdu.len) + { + LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_SE, "%02X", rsp_apdu.p_data[i]); + i++; + } + LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_SE, "\r\n"); + } + + *resp_buf_addr = (uint32_t)rsp_apdu.p_data; + *resp_len = rsp_apdu.len; + } + else + { + LOG_INFO(TRACE_MODULE_SE, "response status=%d\r\n", status); + } + return (uint16_t)status; +} + +static void __NO_RETURN cmd_from_uart_to_t1(void) +{ + int len; + uint32_t resp_addr; + uint16_t resp_len; + uint8_t *p_data; + +#if SE_PRINT_DEBUG == 1 + uint32_t timer1, timer2; + uint8_t ins; +#endif + + while (1) + { + do + { + // memset(g_uart_data, 0, sizeof(g_uart_data)); + + len = uart_receive_in_spi(g_uart_data, (uint16_t)sizeof(g_uart_data), NULL); + if (len >= 5) + { + break; + } + } while (1); + +#if SE_PRINT_DEBUG == 1 + timer1 = phy_timer_count_get(); + ins = g_uart_data[1]; +#endif + + passthrough_apdu_to_t1(g_uart_data, (uint16_t)len, &resp_addr, (uint16_t *)&resp_len); + p_data = (uint8_t *)resp_addr; + +#if SE_PRINT_DEBUG == 1 + timer2 = phy_timer_count_get(); + SEGGER_RTT_printf(0, "T %u, ins = %02x\r\n", PHY_TIMER_COUNT_TO_MS(timer2 - timer1), ins); +#endif + + do + { + if (uart_send_in_spi(p_data, resp_len, NULL) == DRV_OK) + { + break; + } + } while (1); + }; +} + +int tm_main(void) +{ + if (se_init(ESE_MODE_NORMAL) != ESESTATUS_SUCCESS) + { + return 0; + } + + uart_in_spi_init(); + +#if SE_PRINT_DEBUG == 1 + RTTInit(); +#endif + + // SEGGER_RTT_printf(0,"\n\rinstall applet\n\r"); + cmd_from_uart_to_t1(); + + // se_deinit (); + + // return 1; +} + +uint16_t transmit_only_apdu_to_t1(uint8_t *cmd_buf, uint16_t cmd_len) +{ + SE_data cmd_apdu; + ESESTATUS status = ESESTATUS_FAILED; + + // memset(&cmd_apdu, 0x00, sizeof(SE_data)); + + cmd_apdu.p_data = cmd_buf; + cmd_apdu.len = cmd_len; + status = se_transmit_only(&cmd_apdu); + + if (status == ESESTATUS_SUCCESS) + { + } + else + { + LOG_INFO(TRACE_MODULE_SE, "response status=%d\r\n", status); + } + return (uint16_t)status; +} + +uint16_t receive_only_resp_from_t1(uint32_t *resp_buf_addr, uint16_t *resp_len) +{ + SE_data rsp_apdu; + ESESTATUS status = ESESTATUS_FAILED; + + status = se_receive_only(&rsp_apdu); + + /* + if (status == ESESTATUS_NO_DATA_TO_RECEIVE) + { + + } + else */ + if (status == ESESTATUS_SUCCESS) + { + *resp_buf_addr = (uint32_t)rsp_apdu.p_data; + *resp_len = rsp_apdu.len; + } + else + { + // LOG_INFO(TRACE_MODULE_SE, "response status=%d\r\n", status); + } + return (uint16_t)status; +} + +uint8_t uwbs_check_se(uint8_t *p_des_data, uint8_t *p_des_len); +uint8_t uwbs_check_se(uint8_t *p_des_data, uint8_t *p_des_len) +{ + struct SPI_CFG_T usr_spi_cfg = { + .bit_rate = 1000000, + .data_bits = 8, + .slave = 0, + .clk_phase = 0, + .clk_polarity = 0, + .ti_mode = 0, + .dma_rx = false, + .dma_tx = false, + .int_rx = false, + .int_tx = false, + }; + // get default AID from SE + SE_data cmd_apdu = { + .p_data = (uint8_t[]){0x00, 0xA4, 0x04, 0x00, 0x00}, + .len = 5, + }; + SE_data rsp_apdu; + uint8_t ret = DRV_OK; + + if (NULL == p_des_data || NULL == p_des_len) + { + LOG_ERROR(TRACE_MODULE_SE, "%s: input error!\r\n", __FUNCTION__); + *p_des_len = 1; + return DRV_ERROR; + } + // memset(&rsp_apdu, 0, sizeof(rsp_apdu)); + if (DRV_OK != (uint8_t)spi_open(SPI_ID1, &usr_spi_cfg)) + { + LOG_ERROR(TRACE_MODULE_SE, "%s: spi open error!\r\n", __FUNCTION__); + *p_des_len = 1; + return DRV_ERROR; + } + gpio_pin_set_dir(IO_PIN_8, GPIO_DIR_OUT, 1); + ESESTATUS status = se_init(ESE_MODE_NORMAL); + if (status != ESESTATUS_SUCCESS) + { + ret = (uint8_t)status; + LOG_ERROR(TRACE_MODULE_SE, "%s:se init error, ret=%02x\r\n", __FUNCTION__, ret); + *p_des_len = 1; + goto Errout; + } + status = se_transmit_receive(&cmd_apdu, &rsp_apdu); + if (status != ESESTATUS_SUCCESS) + { + ret = (uint8_t)status; + LOG_ERROR(TRACE_MODULE_SE, "%s: se transceive error! ret=%02x\r\n", __FUNCTION__, ret); + *p_des_len = 1; + goto Errout; + } + else + { + *p_des_len = (uint8_t)rsp_apdu.len; + memcpy(p_des_data, rsp_apdu.p_data, rsp_apdu.len); + } + status = se_init(ESE_MODE_NORMAL); + if (status != ESESTATUS_SUCCESS) + { + LOG_ERROR(TRACE_MODULE_SE, "%s: last se init error, status=%02x\r\n", __FUNCTION__, (uint8_t)status); + } + if (DRV_OK != spi_close(SPI_ID1)) + { + LOG_ERROR(TRACE_MODULE_SE, "%s: spi close error!\r\n", __FUNCTION__); + *p_des_len = 1; + return DRV_ERROR; + } + return DRV_OK; + +Errout: + se_init(ESE_MODE_NORMAL); + spi_close(SPI_ID1); + return ret; +} -- Gitblit v1.9.3