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/t1_split.c |  319 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 319 insertions(+), 0 deletions(-)

diff --git a/keil/include/components/se/src/t1_split.c b/keil/include/components/se/src/t1_split.c
new file mode 100644
index 0000000..98a9c8e
--- /dev/null
+++ b/keil/include/components/se/src/t1_split.c
@@ -0,0 +1,319 @@
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "phdriver.h"
+#include "se_api.h"
+#include "mk_misc.h"
+#include "mk_trace.h"
+
+/******************************************************************************
+ * @Function     t1_read_no_wait
+ * @Param        p_data_len - point to data length.
+ * @Returns      On success return ESESTATUS_SUCCESS, else ESESTATUS_xxx.
+ ******************************************************************************/
+static ESESTATUS t1_read_no_wait(uint16_t *p_data_len)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+    int ret = -1;
+    uint16_t total_cnt = 0, num_bytes_to_read = 0, read_index = 0;
+
+#ifdef USE_SPI_SPLIT_READ
+    const uint8_t hdrLen = get_header_len(false) + 1;
+#else
+    const uint8_t hdrLen = g_ese_ctx.max_IFSD;
+#endif
+
+#ifdef DBG_LEVEL_STACK
+    if (gDumpStackFlag)
+    {
+        dumpCallstack();
+    }
+    gDumpStackFlag = true;
+#endif
+
+    // memset(gp_data_rx, 0x00, sizeof(gp_data_rx));
+
+    // sys_timer_delay_ms(1); // 10
+
+    ret = phdriver_read(gp_data_rx, 1);
+
+    if ((ret < 0) || (NAD_C2DT != gp_data_rx[0]))
+    {
+        return ESESTATUS_NO_DATA_TO_RECEIVE;
+    }
+    else
+    {
+        ret = phdriver_read(gp_data_rx + 1, (hdrLen - 1));
+
+        if (g_ese_ctx.is_T1_ext_hdr_len)
+        {
+            num_bytes_to_read = (uint16_t)(((uint16_t)gp_data_rx[T1_FRAME_LEN_OFFSET]) << 8);
+            num_bytes_to_read |= gp_data_rx[T1_FRAME_LEN_OFFSET2];
+
+            // CRC has 2 bytes, so the second read len is INF len + 1
+            if (CRC == g_atr.checksum)
+            {
+                num_bytes_to_read += 1;
+            }
+        }
+        else
+        {
+            // LRC has 1 bytes, so the second read len is INF len
+            num_bytes_to_read = gp_data_rx[T1_FRAME_LEN_OFFSET];
+        }
+        read_index = hdrLen;
+        total_cnt += hdrLen;
+    }
+
+#ifdef USE_SPI_SPLIT_READ
+    if (ret < 0)
+    {
+        if ((-1 == ret) && (4 == errno))
+        {
+            // Interrupted system call, is NFC_DLD_FLUSH
+            status = ESESTATUS_FATAL_ERROR;
+        }
+        else
+        {
+            status = ESESTATUS_FAILED;
+        }
+    }
+    else
+    {
+        if (0 != num_bytes_to_read)
+        {
+            ret = phdriver_read(&gp_data_rx[read_index], num_bytes_to_read);
+            if (ret < 0)
+            {
+                status = ESESTATUS_PH_IO;
+            }
+            else
+            {
+                total_cnt += num_bytes_to_read;
+            }
+        }
+    }
+#endif
+
+    if (ESESTATUS_SUCCESS != status)
+    {
+        *p_data_len = 0;
+    }
+    else
+    {
+        *p_data_len = total_cnt;
+    }
+
+    return status;
+}
+
+/******************************************************************************
+ * @Function     response_no_wait_process
+ * @Returns      On success return ESESTATUS_SUCCESS or else ESESTATUS error.
+ ******************************************************************************/
+static ESESTATUS response_no_wait_process(void)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+    uint16_t data_len = 0;
+
+    status = t1_read_no_wait(&data_len);
+    if (status == ESESTATUS_NO_DATA_TO_RECEIVE)
+    {
+        return ESESTATUS_NO_DATA_TO_RECEIVE;
+    }
+
+    if (ESESTATUS_SUCCESS == status)
+    {
+        status = t1_chk_epilogue(gp_data_rx, 0, data_len);
+        if (status == ESESTATUS_SUCCESS)
+        {
+            status = t1_decode_frame(data_len);
+
+            if (ESESTATUS_SUCCESS == status)
+            {
+            }
+        }
+        else
+        {
+            status = do_T1_recovery_at_undecode();
+        }
+    }
+    else if (ESESTATUS_FATAL_ERROR == status)
+    {
+        g_ese_ctx.next_T1_state = STATE_IDEL;
+    }
+    else
+    {
+        status = do_T1_recovery_at_undecode();
+    }
+
+    return status;
+}
+
+/******************************************************************************
+ * @Function     transmit_only_process
+ * @Returns      On success return ESESTATUS_SUCCESS or else ESESTATUS error.
+ ******************************************************************************/
+static ESESTATUS transmit_only_process(void)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+
+    g_ese_ctx.is_read_done = false;
+
+    g_recv_total_len = 0;
+    while (STATE_IDEL != g_ese_ctx.next_T1_state)
+    {
+        switch (g_ese_ctx.p_T1_params->tx_frame_type)
+        {
+            case IFRAME:
+            {
+                status = t1_send_Iframe();
+                break;
+            }
+
+            case RFRAME:
+            {
+                status = t1_send_Rframe();
+                break;
+            }
+
+            case SFRAME:
+            {
+                status = t1_send_Sframe(); // just send
+                break;
+            }
+            case FRAME_TYPE_INVALID_MAX:
+            case FRAME_TYPE_INVALID_MIN:
+            {
+                status = ESESTATUS_INVALID_PARAMETER;
+                LOG_INFO(TRACE_MODULE_SE, "%s : invalid T1 frame type: %d\r\n", __FUNCTION__, g_ese_ctx.p_T1_params->tx_frame_type);
+            }
+        }
+
+        if (ESESTATUS_SUCCESS == status)
+        {
+            if ((g_ese_ctx.p_T1_params->is_device_chaining == true) && (g_ese_ctx.next_T1_state != STATE_IDEL))
+            {
+#ifdef DBG_LEVEL_STACK
+                gDumpStackFlag = false;
+#endif
+                g_ese_ctx.p_T1_params->blk_retry_cnt = 0;
+                status = response_process();
+                // status = response_no_wait_process();
+            }
+            else
+            {
+                break;
+            }
+        }
+        else
+        {
+            if (((ESESTATUS_PH_IO != status) && (ESESTATUS_MEM_EXCEPTION != status)) || (g_ese_ctx.p_T1_params->blk_retry_cnt >= g_ese_ctx.max_blk_retry_cnt))
+            {
+                LOG_INFO(TRACE_MODULE_SE, "%s: send frame failed, frameType = %d, status = %d, retryCnt = %d\r\n", __FUNCTION__,
+                         g_ese_ctx.p_T1_params->tx_frame_type, status, g_ese_ctx.max_blk_retry_cnt);
+                g_ese_ctx.next_T1_state = STATE_IDEL;
+                break;
+            }
+            else
+            {
+                // resend
+                g_ese_ctx.p_T1_params->blk_retry_cnt++;
+            }
+        }
+    }
+
+    return status;
+}
+
+/******************************************************************************
+ * @Function     receive_only_process
+ * @Returns      On success return ESESTATUS_SUCCESS or else ESESTATUS error.
+ ******************************************************************************/
+static ESESTATUS receive_only_process(void)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+#ifdef DBG_LEVEL_STACK
+    gDumpStackFlag = false;
+#endif
+    g_ese_ctx.p_T1_params->blk_retry_cnt = 0;
+    status = response_no_wait_process();
+
+    while ((status != ESESTATUS_NO_DATA_TO_RECEIVE) && (g_ese_ctx.next_T1_state != STATE_IDEL))
+    {
+        if (g_ese_ctx.p_T1_params->last_rx_frame_type == IFRAME)
+        {
+            if ((g_ese_ctx.p_T1_params->is_card_chaining == true) && (g_ese_ctx.next_T1_state == R_ACK))
+            {
+                status = Transmit_receive_process();
+                // status = transmit_only_process();
+            }
+            break;
+        }
+        else // if (g_ese_ctx.p_T1_params->last_rx_frame_type == RFRAME)
+        {
+            transmit_only_process();
+            status = response_no_wait_process();
+        }
+    }
+
+    return status;
+}
+
+/******************************************************************************
+ * @Function     t1_transmit_only_apdu
+ * @Param        p_cmd_apdu - 7816-4 APDU that shall be sent.
+ *               cmd_len    - Length of the apduCmd to be sent.
+ * @Returns      On success return ESESTATUS_SUCCESS or else ESESTATUS error.
+ ******************************************************************************/
+ESESTATUS t1_transmit_only_apdu(uint8_t *p_cmd_apdu, uint16_t cmd_len)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+    status = init_Iframe_from_cmd_apdu(p_cmd_apdu, cmd_len);
+    if (ESESTATUS_SUCCESS != status)
+    {
+        goto cleanup;
+    }
+
+    status = transmit_only_process();
+
+    if (ESESTATUS_SUCCESS != status)
+    {
+        LOG_INFO(TRACE_MODULE_SE, "%s: failed, status = %d\r\n", __FUNCTION__, status);
+    }
+    else
+    {
+        // if success,after receiving the resp,execu deinit_Iframe_from_cmd_apdu
+        return status;
+    }
+
+cleanup:
+    deinit_Iframe_from_cmd_apdu();
+    return status;
+}
+
+/******************************************************************************
+ * @Function     t1_receive_only_apdu
+ * @Returns      On success return ESESTATUS_SUCCESS or else ESESTATUS error.
+ ******************************************************************************/
+ESESTATUS t1_receive_only_apdu(void)
+{
+    ESESTATUS status = ESESTATUS_SUCCESS;
+
+    status = receive_only_process(); // response_no_wait_process();
+
+    if (ESESTATUS_NO_DATA_TO_RECEIVE == status)
+    {
+        return ESESTATUS_NO_DATA_TO_RECEIVE;
+    }
+
+    if (ESESTATUS_SUCCESS != status)
+    {
+        LOG_INFO(TRACE_MODULE_SE, "%s: failed, status = %d\r\n", __FUNCTION__, status);
+    }
+
+    deinit_Iframe_from_cmd_apdu();
+    return status;
+}

--
Gitblit v1.9.3