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

diff --git a/keil/include/drivers/mk_clock.c b/keil/include/drivers/mk_clock.c
new file mode 100644
index 0000000..470b8bc
--- /dev/null
+++ b/keil/include/drivers/mk_clock.c
@@ -0,0 +1,256 @@
+/*
+ * 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_clock.h"
+
+static void clock_32K_clk_config(uint8_t choice)
+{
+    // 0 - 32KHz RCO
+    // 1 - 32KHz XTAL oscillator
+    // 2 - External sine wave
+    // 3 - External square wave
+    if (choice)
+    {
+        if ((choice == 2) || (choice == 3))
+        {
+            clock_xtal32k_injection_set(choice == 3 ? CLOCK_XTAL_INJECTION_SQUARE : CLOCK_XTAL_INJECTION_SINE);
+        }
+
+        // XTAL, wait for ready
+        while (!(SYSCON->CLK_STATUS & SYSCON_CLK_STATUS_XTAL_32K_REDAY_MSK))
+        {
+        }
+        SYSCON->SYS_CMU |= SYSCON_SYS_CMU_32K_CLK_SEL_MSK;
+    }
+    else
+    {
+        SYSCON->SYS_CMU &= ~SYSCON_SYS_CMU_32K_CLK_SEL_MSK;
+    }
+}
+
+static void clock_sys_clk_config(uint8_t choice)
+{
+    // 0 - 32KHz
+    // 1 - 48MHz RO
+    // 2 - 62.4MHz Clock XTAL38.4M
+    // 3 - 62.4MHz Clock External 38.4M sine wave
+    // 4 - 62.4MHz Clock External 38.4M square wave
+
+    uint32_t sys_cmu = SYSCON->SYS_CMU;
+
+    if (choice == 0)
+    {
+        sys_cmu = (sys_cmu & ~SYSCON_SYS_CMU_SYS_CLK_SEL_MSK);
+    }
+    else if (choice == 1)
+    {
+        sys_cmu = (sys_cmu | SYSCON_SYS_CMU_SYS_CLK_SEL_MSK);
+        sys_cmu = (sys_cmu & ~SYSCON_SYS_CMU_HS_CLK_SEL_MSK);
+    }
+    else
+    {
+        if ((choice == 3) || (choice == 4))
+        {
+            clock_xtal38m4_injection_set(choice == 4 ? CLOCK_XTAL_INJECTION_SQUARE : CLOCK_XTAL_INJECTION_SINE);
+        }
+
+        // XTAL, wait for REFPLL ready
+        while (!(SYSCON->CLK_STATUS & SYSCON_CLK_STATUS_REFPLL_REDAY_MSK))
+        {
+        }
+        sys_cmu = (sys_cmu | SYSCON_SYS_CMU_SYS_CLK_SEL_MSK | SYSCON_SYS_CMU_HS_CLK_SEL_MSK);
+    }
+
+    SYSCON->SYS_CMU = sys_cmu;
+}
+
+static void clock_wdt_clk_config(uint8_t choice)
+{
+    if (choice)
+    {
+        SYSCON->CLK_DIV |= SYSCON_CLK_DIV_WDT_CLK_SEL_MSK;
+    }
+    else
+    {
+        SYSCON->CLK_DIV &= ~SYSCON_CLK_DIV_WDT_CLK_SEL_MSK;
+    }
+}
+
+static uint32_t clock_get_sys_clk_freq(void)
+{
+    uint32_t freq;
+    if (SYSCON->SYS_CMU & SYSCON_SYS_CMU_SYS_CLK_SEL_MSK)
+    {
+        freq = (SYSCON->SYS_CMU & SYSCON_SYS_CMU_HS_CLK_SEL_MSK) ? CLOCK_XTAL38P4M : CLOCK_RO_48M;
+    }
+    else
+    {
+        freq = (SYSCON->SYS_CMU & SYSCON_SYS_CMU_32K_CLK_SEL_MSK) ? CLOCK_XTAL_32K : CLOCK_RCO_32K;
+    }
+
+    return (freq);
+}
+
+static uint32_t clock_get_ahb_clk_freq(void)
+{
+    return (clock_get_sys_clk_freq() / (1 << GET_BIT_FIELD(SYSCON->CLK_DIV, SYSCON_CLK_DIV_HCLK_DIV_MSK, SYSCON_CLK_DIV_HCLK_DIV_POS)));
+}
+
+static uint32_t clock_get_apb_clk_freq(void)
+{
+    return (clock_get_ahb_clk_freq() / (1 << GET_BIT_FIELD(SYSCON->CLK_DIV, SYSCON_CLK_DIV_PCLK_DIV_MSK, SYSCON_CLK_DIV_PCLK_DIV_POS)));
+}
+
+static uint32_t clock_get_32k_clk_freq(void)
+{
+    return ((SYSCON->SYS_CMU & SYSCON_SYS_CMU_32K_CLK_SEL_MSK) ? CLOCK_XTAL_32K : CLOCK_RCO_32K);
+}
+
+static uint32_t clock_get_wdt_clk_freq(void)
+{
+    return ((SYSCON->CLK_DIV & SYSCON_CLK_DIV_WDT_CLK_SEL_MSK) ? clock_get_apb_clk_freq() : clock_get_32k_clk_freq());
+}
+
+static uint32_t clock_get_flash_clk_freq(void)
+{
+    return (clock_get_sys_clk_freq() / (1 << GET_BIT_FIELD(SYSCON->CLK_DIV, SYSCON_CLK_DIV_FLASH_CTRL_DIV_MSK, SYSCON_CLK_DIV_FLASH_CTRL_DIV_POS)));
+}
+
+void clock_enable(enum CLOCK_GATE_T clk)
+{
+    SYSCON->SYS_CMU |= (1U << clk);
+}
+
+void clock_disable(enum CLOCK_GATE_T clk)
+{
+    SYSCON->SYS_CMU &= ~(1U << clk);
+}
+
+void clock_attach(enum CLOCK_ATTACH_TYPE_T connection)
+{
+    uint8_t mux, choice;
+
+    mux = (uint8_t)connection;
+    choice = (uint8_t)(connection >> 8);
+
+    switch (mux)
+    {
+    case CLOCK_32K_CLK_SEL:
+        clock_32K_clk_config(choice);
+        break;
+    case CLOCK_SYS_CLK_SEL:
+        clock_sys_clk_config(choice);
+        break;
+    case CLOCK_WDT_CLK_SEL:
+        clock_wdt_clk_config(choice);
+        break;
+    default:
+        break;
+    }
+}
+
+void clock_set_divider(enum CLOCK_DIVIDER_T div_name, uint8_t div_value)
+{
+    switch (div_name)
+    {
+    case CLOCK_AHB_DIV:
+        SYSCON->CLK_DIV = (SYSCON->CLK_DIV & ~SYSCON_CLK_DIV_HCLK_DIV_MSK) | SYSCON_CLK_DIV_HCLK_DIV(div_value);
+        break;
+    case CLOCK_APB_DIV:
+        SYSCON->CLK_DIV = (SYSCON->CLK_DIV & ~SYSCON_CLK_DIV_PCLK_DIV_MSK) | SYSCON_CLK_DIV_PCLK_DIV(div_value);
+        break;
+    case CLOCK_FLASH_CTRL_DIV:
+        SYSCON->CLK_DIV = (SYSCON->CLK_DIV & ~SYSCON_CLK_DIV_FLASH_CTRL_DIV_MSK) | SYSCON_CLK_DIV_FLASH_CTRL_DIV(div_value);
+        break;
+    case CLOCK_UART1_FDIV:
+        SYSCON->CLK_DIV = (SYSCON->CLK_DIV & ~SYSCON_CLK_DIV_UART1_FDIV_MSK) | SYSCON_CLK_DIV_UART1_FDIV(div_value);
+        break;
+    case CLOCK_UART0_FDIV:
+        SYSCON->CLK_DIV = (SYSCON->CLK_DIV & ~SYSCON_CLK_DIV_UART0_FDIV_MSK) | SYSCON_CLK_DIV_UART0_FDIV(div_value);
+        break;
+    }
+}
+
+uint32_t clock_get_frequency(enum CLOCK_TYPE_T clk_name)
+{
+    uint32_t freq = 0;
+    switch (clk_name)
+    {
+    case CLOCK_SYS_CLK:
+        freq = clock_get_sys_clk_freq();
+        break;
+    case CLOCK_AHB_CLK:
+        freq = clock_get_ahb_clk_freq();
+        break;
+    case CLOCK_APB_CLK:
+        freq = clock_get_apb_clk_freq();
+        break;
+    case CLOCK_WDT_CLK:
+        freq = clock_get_wdt_clk_freq();
+        break;
+    case CLOCK_32K_CLK:
+        freq = clock_get_32k_clk_freq();
+        break;
+    case CLOCK_FLASH_CLK:
+        freq = clock_get_flash_clk_freq();
+        break;
+    }
+    return freq;
+}
+
+void clock_xtal38m4_injection_set(enum CLOCK_XTAL_INJECTION_TYPE_T type)
+{
+    uint32_t tmp_val = REG_READ(0x40000048);
+    tmp_val &= ~((0x3U << 16) | 0x7fU);
+    REG_WRITE(0x40000048, tmp_val | (type << 16));
+
+    REG_WRITE(0x40000210, 0x0);
+    REG_WRITE(0x40000104, 0x0FFF);
+
+    tmp_val = REG_READ(0x40000214);
+    REG_WRITE(0x40000214, tmp_val | (1 << 12) | (2 << 10) | (2 << 8));
+}
+
+void clock_xtal32k_injection_set(enum CLOCK_XTAL_INJECTION_TYPE_T type)
+{
+    uint32_t tmp_val = REG_READ(0x4000004C);
+    tmp_val &= ~(0x3U << 16);
+    REG_WRITE(0x4000004C, tmp_val | (type << 16));
+}

--
Gitblit v1.9.3