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

diff --git a/keil/include/drivers/mk_calib.c b/keil/include/drivers/mk_calib.c
new file mode 100644
index 0000000..f4eebfd
--- /dev/null
+++ b/keil/include/drivers/mk_calib.c
@@ -0,0 +1,262 @@
+/*
+ * 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 "mk_calib.h"
+#include "mk_clock.h"
+#include "mk_reset.h"
+#include "mk_trace.h"
+#include "mk_misc.h"
+#include "mk_rtc.h"
+
+#include "board.h"
+
+int calib_open(void)
+{
+    // enable CAL clock
+    clock_enable(CLOCK_CALIB);
+    reset_module(RESET_MODULE_CALIB);
+    return DRV_OK;
+}
+
+int calib_close(void)
+{
+    // disable CAL clock
+    clock_disable(CLOCK_CALIB);
+    return DRV_OK;
+}
+
+void calib_start(uint32_t items)
+{
+    REG_WRITE(CALIB_BASE, items | CALIB_START);
+}
+
+void calib_check(uint32_t done)
+{
+    while ((REG_READ(CALIB_BASE + 0x4) & done) != done)
+    {
+    }
+}
+
+void calib_chip(void)
+{
+    uint32_t val;
+
+    // load cap
+    if (board_param.flag & (1 << BOARD_LOAD_CAP))
+    {
+        calib_xtal38m4_load_cap_set(board_param.load_cap);
+    }
+    if (board_param.flag & (1 << BOARD_X32K_LOAD_CAP))
+    {
+        calib_xtal32k_load_cap_set(board_param.x32k_load_cap);
+    }
+
+    clock_enable(CLOCK_CALIB);
+
+    // fix DCDC_EN
+    val = REG_READ(0x40000204) & ~0x3U;
+    REG_WRITE(0x40000204, val | 0x2);
+
+    // LO PLL configure
+    REG_WRITE(0x4000060c, 0x0A106BAF);
+
+#if HIGH_PERFORMANCE_MODE_EN
+    // LPF_BM
+    REG_WRITE(0x40000608, 0x03E80004);
+    // increase Trim current to promote RF performance
+    REG_WRITE_BYTE(0x40010072, 0x77);
+#else
+    // decrease Trim current
+    // REG_WRITE_BYTE(0x40010072, 0x88); // lowest
+
+    // clear Trim code
+    REG_WRITE_BYTE(0x40010072, 0x00); // middle
+
+    val = REG_READ_BYTE(0x40010071) & 0x1F;
+    REG_WRITE_BYTE(0x40010071, (uint8_t)val);
+#endif
+
+#define LO_L (77 + (56 << 8) + (54 << 16) + (80 << 24))
+#define LO_H (49 + (46 << 8) + (50 << 16) + (54 << 24))
+#define WF (7 + (52 << 8))
+
+    // patch for buck calibration voltage
+    uint8_t x = REG_READ_BYTE(0x40010075);
+    if ((READ_WORD(0x4001007C) == LO_L) && (READ_WORD(0x40010078) == LO_H) && (READ_SHORT(0x40010076) == WF) && (x >= 1) && (x <= 19))
+    {
+        REG_WRITE_BYTE(0x40010073, 0x20);
+    }
+
+    // patch for ADC trim code
+    val = REG_READ_BYTE(0x4001006B);
+    if ((val & 0x1F) == 0)
+    {
+        REG_WRITE_BYTE(0x4001006B, (uint8_t)(val | 0x10));
+    }
+
+    // Open RCO for calibration
+    SYSCON->PMU_CTRL0 &= ~(1U << 5);
+
+    // calibrate
+    REG_WRITE(0x40006000, 0x80001cfe);
+
+    while ((REG_READ(0x40006004) & 0x80000000) == 0)
+    {
+    }
+
+    uint32_t id = mk_chip_id();
+    LOG_INFO(TRACE_MODULE_DRIVER, "Chip ID: %08x\r\n", id);
+    if (id == 0x0 || id == 0x400 || id == 0x800 || id == 0xC00)
+    {
+        LOG_INFO(TRACE_MODULE_DRIVER, "Old chip model is not supported by this SDK!!!\r\n");
+        while (1)
+        {
+        }
+    }
+
+    // Reduce next PA calibration time
+    val = REG_READ(0x400060d4) & ~0xfU;
+    REG_WRITE(0x400060d4, val);
+
+    val = REG_READ(0x400060c8) & ~((0xfU << 18) | (0x1));
+    REG_WRITE(0x400060c8, val);
+
+    // Reduce turnaround time
+    REG_WRITE(0x40000410, 400);
+    REG_WRITE(0x4000040c, 0x1f);
+
+    // val = REG_READ(0x4000020c) & ~(0x1fU << 7);
+    // REG_WRITE(0x4000020c, val | (0x18 << 7));
+
+#if (LOW_POWER_EN) && (XTAL32K_EN == 0)
+    rco32k_clk_calibrate(RCO32K_MEAS_TIME_64_CYCLES);
+#endif
+}
+
+void calib_xtal38m4_load_cap_auto_tune(int32_t ppm)
+{
+    uint32_t tmp_val = REG_READ(0x40000048);
+    uint8_t val = (tmp_val & 0x7FU);
+
+    if (ppm > 2)
+    {
+        val += 1;
+    }
+    else if (ppm < -2)
+    {
+        val -= 1;
+    }
+    else
+    {
+        return;
+    }
+    tmp_val &= ~0x7FU;
+    tmp_val |= (val & 0x7FU);
+    REG_WRITE(0x40000048, tmp_val);
+    LOG_INFO(TRACE_NO_REPORT_HOST | TRACE_MODULE_DRIVER, "XTAL load cap tune %d : %d\r\n", ppm, (tmp_val & 0x7FU));
+}
+
+void calib_xtal38m4_load_cap_set(uint8_t val)
+{
+    uint32_t tmp_val = REG_READ(0x40000048);
+
+    tmp_val &= ~0x7FU;
+    val &= 0x7FU;
+
+    REG_WRITE(0x40000048, tmp_val | val);
+    LOG_INFO(TRACE_MODULE_DRIVER, "XTAL load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU);
+}
+
+void calib_xtal38m4_with_clock_out(uint8_t val)
+{
+    /* Setting GPIO17 output 38.4M clock. */
+    uint32_t tmp_val = REG_READ(0x4000003C);
+    tmp_val &= ~0x70U;
+    tmp_val |= (0x1U << 4);
+    REG_WRITE(0x4000003C, tmp_val);
+
+    /* Setting internal load cap of MK8000, the valid value is from 0 ot 127. */
+    tmp_val = REG_READ(0x40000048);
+
+    tmp_val &= ~0x7FU;
+    val &= 0x7FU;
+
+    REG_WRITE(0x40000048, tmp_val | val);
+    REG_WRITE(0x40000104, 0x3FFF);
+    LOG_INFO(TRACE_MODULE_DRIVER, "XTAL load cap val %d\r\n", REG_READ(0x40000048) & 0x7FU);
+}
+
+void calib_xtal32k_load_cap_set(uint8_t val)
+{
+    uint32_t tmp_val = REG_READ(0x4000004C);
+
+    tmp_val &= ~0x7FU;
+    val &= 0x7FU;
+
+    REG_WRITE(0x4000004C, tmp_val | val);
+    LOG_INFO(TRACE_MODULE_DRIVER, "32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU);
+}
+
+void calib_xtal32k_with_clock_out(uint8_t val)
+{
+    /* Setting GPIO02 output 32K clock. */
+    uint32_t tmp_val = REG_READ(0x40000234);
+    tmp_val |= (0x1U << 10);
+    REG_WRITE(0x40000234, tmp_val);
+
+    /* Setting GPIO02 oupt 32K clock by pin mux. */
+    tmp_val = REG_READ(0x40000034);
+    tmp_val &= ~(0xFU << 8);
+    tmp_val |= (0x4U << 8);
+    REG_WRITE(0x40000034, tmp_val);
+
+    /* Setting internal load cap of MK8000, the valid value is from 0 ot 127. */
+    tmp_val = REG_READ(0x4000004C);
+
+    tmp_val &= ~0x7FU;
+    val &= 0x7FU;
+
+    REG_WRITE(0x4000004C, tmp_val | val);
+    LOG_INFO(TRACE_MODULE_DRIVER, "32K load cap val %d\r\n", REG_READ(0x4000004C) & 0x7FU);
+}
+
+void CALIB_IRQHandler(void)
+{
+}

--
Gitblit v1.9.3