272增加qmc6309磁力计驱动,适配gps、充电芯片、马达 2679/target/2 2680/1 2680/head
authorpenglei <1624952103@qq.com>
Tue, 4 Nov 2025 08:29:50 +0000 (16:29 +0800)
committerpenglei <1624952103@qq.com>
Tue, 4 Nov 2025 08:29:50 +0000 (16:29 +0800)
23 files changed:
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/boards/brandy_evb/board_config/board_fd272.h
code/sdk/drivers/boards/brandy_evb/product/product.h
code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c
code/sdk/drivers/drivers/driver/uart/uart.c
code/sdk/zhihui/drivers/charge/CMakeLists.txt
code/sdk/zhihui/drivers/charge/hp4570/hp4570.c
code/sdk/zhihui/drivers/mag/CMakeLists.txt
code/sdk/zhihui/drivers/mag/qmc6309/CMakeLists.txt [new file with mode: 0644]
code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.c [new file with mode: 0644]
code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.h [new file with mode: 0644]
code/sdk/zhihui/drivers/mag/service/mag_at_cmd.c
code/sdk/zhihui/drivers/mag/service/mag_hal.c
code/sdk/zhihui/drivers/mag/service/mag_hal.h
code/sdk/zhihui/drivers/mag/service/mag_service.c
code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c
code/sdk/zhihui/drivers/vibrator/vibrator.c
code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h
code/sdk/zhihui/services/gnss/inc/gnss_ctl.h
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c
code/sdk/zhihui/services/gnss/src/gnss_ctl.c
code/sdk/zhihui/utils/custom_fileoperate_service.c

index a43afdd..8d0f885 100644 (file)
@@ -563,7 +563,9 @@ static void thread_main(const void *unused)
     \r
 #ifdef ENABLE_CUSTOM_I2C\r
     // custom_i2c_init(I2C_BUS_3);\r
-    // custom_i2c_init(I2C_BUS_0);\r
+#ifdef BOARD_FD272\r
+    custom_i2c_init(I2C_BUS_0);\r
+#endif\r
     custom_i2c_init(I2C_BUS_2);\r
 \r
 #ifdef SUPPORT_CYWEE_SERVICE\r
index 6509d8c..495c4a2 100644 (file)
@@ -1151,7 +1151,12 @@ target = {
             # 'MEMORY_CORRUPTION',
             'SAP_EFFECT_SWS_SUPPORT',
             'AUDIO_SMARTPA_AW88082',
-            "-:SUPPORT_LWIP",
+            '-:SUPPORT_LWIP',
+            'ENABLE_HP4507',
+            'SUPPORT_GNSS',
+            'DISABLE_UART_LOG',
+            'CONFIG_GNSS_UART_WITH_FLOWCTRL',
+            # 'DOWNLOAD_GNSS_SWITCH',
         ],
         #添加自定义应用
        'ram_component': [
@@ -1159,8 +1164,9 @@ target = {
                           'media_at_service', 
                           'bt_manager_at_service',
                            "ppg_sensor_hx3695",
-                        #   "ppgBleService",
-                           "mag_sensor_mmc5603",
+                          "ppgBleService",
+                        #    "mag_sensor_mmc5603",
+                        "mag_sensor_qmc6309",
                           "vibrator",
                           "vibrator_service",
                         #   "-:lwip",
@@ -1193,7 +1199,12 @@ target = {
                             "ppg_hal",
                             "mag_service",
                             "cywee_dml",
-                            #"cyweeBleService",
+                            "cyweeBleService",
+                            "charge_ic_hp4570",
+                            "gnss",
+                            "pgnss_sample",
+                            # "gnss_sample",
+                            "cyweeBleService",
                            ],
                'image_analysis': False,
                'fs_image_path':'fd272',
index 313f400..cdca2bf 100644 (file)
@@ -117,8 +117,8 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE }, // S_MGPIO12 I2C0 SDA
     { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO13 I2C1 SCL touch i2c
     { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO14  I2C1 SDA
-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_DRIVE_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6轴 指南针 心率
-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_DRIVE_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6轴 指南针 心率
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor 
     { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO17 i2c3 SCL    smart pa\ 预留马达控制 \安全芯片
     { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO18  I2C3 SDA
     { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_MGPIO19 uart1 tx
@@ -156,12 +156,12 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },       // S_MGPIO38 uart rx  NC
 #endif
 
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_AGPIO_L0  NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },     // S_AGPIO_L0  NC
 
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L1 i2s1
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L2
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L3
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L4
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_L1 i2s1
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L2
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L3
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L4
 
     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L5
     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L6 i2s0
@@ -204,7 +204,7 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L28    CAT_1复位 CAT1_RESET_N  拉低有效
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L29    charge done info 检测是否充满电
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L30   KP_MKIN1 唤醒 CAT1 ,输出
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L31    KP_MKOUIT1 唤醒 蓝牙 ,输入
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L31    KP_MKOUIT1 唤醒 蓝牙 ,输入
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_L32    NC
 
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R0   PRG_LED_POWER ON  心率等电源控制脚
@@ -213,7 +213,7 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     // { HAL_PIO_FUNC_PWMP1_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
     // { HAL_PIO_FUNC_PWMN1_M3, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
 //   #else
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
 //   #endif
 #ifdef BOARD_N9
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R3     NC   
@@ -309,7 +309,7 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
 #endif
 
 //默认关闭马达
-    {   S_AGPIO_R2, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    {   S_AGPIO_L16, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
 //默认开启 EXT LDO V3.0 V1.8
     // {   S_AGPIO_L18, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
 
index fc15618..baf12b8 100644 (file)
@@ -1,3 +1,11 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-05-15 11:27:17
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-11-04 16:21:23
+ * @FilePath: /FD230/code/sdk/drivers/boards/brandy_evb/product/product.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 /*
  * Copyright (c) @CompanyNameMagicTag 2020-2020. All rights reserved.
  * Description:  BRANDY product config
@@ -72,5 +80,9 @@
 #define EMMC_SD_BUSWIDTH                    MMCSD_BUSWIDTH_8
 #define PARTITION_EXIST                     YES
 #define ALIPAY_SEC_I2C_INDEX                I2C_BUS_3
+#ifdef BOARD_FD272
+#define ALIPAY_SEC_GPIO                     S_AGPIO_L4
+#else
 #define ALIPAY_SEC_GPIO                     S_AGPIO_R1
 #endif
+#endif
index ba97fa8..22e32bf 100644 (file)
@@ -369,7 +369,11 @@ static const system_mcu_perip_clk_t g_system_mcu_perp_clk_set_config[] = {
     {HAL_CLOCKS_APP_SPI2_MS_CLK, TURN_OFF},    // spi2 clock\r
     {HAL_CLOCKS_APP_UART_H0_CLK, TURN_ON},     // uart h0 clock\r
     {HAL_CLOCKS_APP_UART_H1_CLK, TURN_ON},     // uart h1 clock\r
+#ifdef BOARD_FD272\r
+    {HAL_CLOCKS_APP_I2C0_CLK, TURN_ON},       // i2c0 clock\r
+#else\r
     {HAL_CLOCKS_APP_I2C0_CLK, TURN_OFF},       // i2c0 clock\r
+#endif\r
     {HAL_CLOCKS_APP_I2C1_CLK, TURN_ON},        // i2c1 clock\r
     {HAL_CLOCKS_APP_I2C2_CLK, TURN_ON},       // i2c2 clock\r
     {HAL_CLOCKS_APP_I2C3_CLK, TURN_ON},        // i2c3 clock\r
index 170486a..84a3b54 100644 (file)
@@ -399,21 +399,10 @@ errcode_t uapi_uart_register_frame_error_callback(uart_bus_t bus, uart_error_cal
 #if defined(CONFIG_UART_SUPPORT_TX)
 int32_t uapi_uart_write(uart_bus_t bus, const uint8_t *buffer, uint32_t length, uint32_t timeout)
 {
-#ifdef SUPPORT_GNSS
+#if defined(SUPPORT_GNSS) && !defined(BOARD_FD272)
     if (getPGnssIsStart() == 1 && timeout != 0xFFFFFFF3) 
         return -1;
 
-    // if (getPGnssServerStat() == 1 && timeout == 0xFFFFFFF3 && !stat)
-    // {
-    //     stat = 1;
-    // }
-
-    // if (getPGnssServerStat() == 0 && stat)
-    // {
-    //     stat = 0;
-    //     sw_debug_uart_deinit();
-    //     uart_config_init();
-    // }
 #endif
     unused(timeout);
     bool tx_fifo_full = false;
@@ -691,7 +680,7 @@ int32_t uapi_uart_read_by_dma(uart_bus_t bus, const void *buffer, uint32_t lengt
 #if defined(CONFIG_UART_SUPPORT_RX)
 int32_t uapi_uart_read(uart_bus_t bus, const uint8_t *buffer, uint32_t length, uint32_t timeout)
 {
-#ifdef SUPPORT_GNSS
+#if defined(SUPPORT_GNSS) && !defined(BOARD_FD272)
     if (getPGnssIsStart() == 1 && timeout != 0xFFFFFFF3)
         return -1;
 #else
index 97149a1..6039880 100644 (file)
@@ -2,7 +2,7 @@
 # @brief    cmake file
 # Copyright (c) @CompanyNameMagicTag 2022-2023. All rights reserved.
 #===============================================================================
-set(COMPONENT_NAME "charge_ic")
+set(COMPONENT_NAME "charge_ic_hp4570")
 
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/hp4570/hp4570.c
@@ -26,7 +26,6 @@ set(PRIVATE_DEFINES
 
 set(PUBLIC_DEFINES
 SUPPORT_AT_CHARGE
-ENABLE_HP4507
 )
 
 # use this when you want to add ccflags like -include xxx
index a4dd2ea..f7120d8 100644 (file)
@@ -50,7 +50,7 @@ uint8_t hp45xxx_i2c_addr = 0;
 #define I2C_ERROR 1\r
 #define INVALID_INPUT 1\r
 \r
-#ifdef BOARD_L22\r
+#if defined(BOARD_L22) || defined(BOARD_FD272)\r
 #define HP4570_I2C_BUS I2C_BUS_0\r
 #elif defined BOARD_U8\r
 #define HP4570_I2C_BUS I2C_BUS_3\r
index a37147b..da8552e 100644 (file)
@@ -1,2 +1,3 @@
 add_subdirectory_if_exist(service)
-add_subdirectory_if_exist(mmc5603)
\ No newline at end of file
+add_subdirectory_if_exist(mmc5603)
+add_subdirectory_if_exist(qmc6309)
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/mag/qmc6309/CMakeLists.txt b/code/sdk/zhihui/drivers/mag/qmc6309/CMakeLists.txt
new file mode 100644 (file)
index 0000000..2ed6c09
--- /dev/null
@@ -0,0 +1,42 @@
+#===============================================================================
+# @brief    cmake file
+# Copyright (c) @CompanyNameMagicTag 2023-2023. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "mag_sensor_qmc6309")
+
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/qmc6309.c
+)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+set(PUBLIC_DEFINES
+    MAG_QMC6309
+)
+
+set(PRIVATE_HEADER
+)
+
+set(PRIVATE_DEFINES
+)
+
+# use this when you want to add ccflags like -include xxx
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+    -Wno-incompatible-function-pointer-types
+    -Wno-unused-function
+)
+
+set(WHOLE_LINK
+    true
+)
+
+set(MAIN_COMPONENT
+    false
+)
+
+install_sdk(${CMAKE_CURRENT_SOURCE_DIR} "*")
+
+build_component()
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.c b/code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.c
new file mode 100644 (file)
index 0000000..3a34908
--- /dev/null
@@ -0,0 +1,733 @@
+\r
+#include "qmc6309.h"\r
+#include "los_tick.h"\r
+#include "custom_utils.h"\r
+\r
+static qmc6309_data_t p_mag;\r
+static const unsigned char mag_slave[] = {QMC6309_IIC_ADDR};\r
+//static const unsigned char mag_slave[] = {QMC6309H_IIC_ADDR};\r
+\r
+#define QMC6309_I2C_BUS I2C_BUS_2\r
+\r
+int qmc6309_read_block(unsigned char addr, unsigned char *data, unsigned short len)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       int retry = 0;\r
+\r
+       while((ret!=QMC6309_OK) && (retry++ < 5))\r
+       {\r
+               // ret = bsp_i2c_read_reg(p_mag.slave_addr, addr, data, len);\r
+               ret = custom_i2c_read_regs(QMC6309_IIC_ADDR, addr, 1, data, len,QMC6309_I2C_BUS);\r
+       }\r
+\r
+       return ret;\r
+}\r
+\r
+int qmc6309_write_reg(unsigned char addr, unsigned char data)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       int retry = 0;\r
+\r
+       while((ret!=QMC6309_OK) && (retry++ < 5))\r
+       {\r
+               // ret = bsp_i2c_write_reg(p_mag.slave_addr, addr, data);\r
+               ret = custom_i2c_write_reg(QMC6309_IIC_ADDR, addr, 1, &data, 1,  QMC6309_I2C_BUS);\r
+       }\r
+\r
+       return ret;\r
+}\r
+\r
+void qmc6309_delay(unsigned int ms)\r
+{\r
+       // extern void qst_delay_ms(unsigned int n_ms);\r
+\r
+       // qst_delay_ms(ms);\r
+       LOS_Mdelay(ms);\r
+}\r
+\r
+\r
+void qmc6309_dump_reg(void)\r
+{\r
+#if 0\r
+       unsigned char ctrl_value[4];\r
+       unsigned char version_id;\r
+       unsigned char wafer_id;\r
+       unsigned char die_id[2];\r
+\r
+       QMC6309_LOG("qmc6309_dump_reg\r\n");\r
+       qmc6309_read_block(0x12, &version_id, 1);\r
+       qmc6309_read_block(0x37, &wafer_id, 1);\r
+       qmc6309_read_block(0x38, die_id, 2);\r
+       QMC6309_LOG("version id:0x%x wafer id:0x%x die id:0x%x \r\n", version_id, wafer_id, (die_id[1]<<8)|die_id[0]);\r
+       qmc6309_read_block(QMC6309_CTL_REG_ONE, ctrl_value, 2);\r
+       QMC6309_LOG("ctrlreg [0x0a=0x%x 0x0b=0x%x] \r\n", ctrl_value[0], ctrl_value[1]);\r
+       qmc6309_read_block(QMC6309_FIFO_REG_CTRL, ctrl_value, 1);\r
+       QMC6309_LOG("fifo-ctrl 0x%x=0x%x \r\n", QMC6309_FIFO_REG_CTRL, ctrl_value[0]);\r
+       qmc6309_read_block(0x40, ctrl_value, 1);\r
+       QMC6309_LOG("0x40 = 0x%x \r\n", ctrl_value[0]);\r
+#else\r
+       unsigned char i2c_0_2 = 0;\r
+       unsigned char version_id = 0;\r
+       unsigned char wafer_id = 0;\r
+       unsigned short d_id = 0;        \r
+       unsigned char g_reg_tbl[16];\r
+       \r
+       QMC6309_LOG("\r\n********qst reg dump(hex)********\r\n");\r
+       QMC6309_LOG("     |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\r\n");\r
+       QMC6309_LOG("______________________________________________________\r\n");\r
+//     qmc6309_read_block(0x00, &g_reg_tbl[0], 72);\r
+       qmc6309_read_block(0x00, &g_reg_tbl[0], 16);\r
+       QMC6309_LOG("0x%xx | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", 0,\r
+                                                                                                                                               g_reg_tbl[0],g_reg_tbl[1],g_reg_tbl[2],g_reg_tbl[3],\r
+                                                                                                                                               g_reg_tbl[4],g_reg_tbl[5],g_reg_tbl[6],g_reg_tbl[7],\r
+                                                                                                                                               g_reg_tbl[8],g_reg_tbl[9],g_reg_tbl[10],g_reg_tbl[11],\r
+                                                                                                                                               g_reg_tbl[12],g_reg_tbl[13],g_reg_tbl[14],g_reg_tbl[15]);\r
+\r
+       qmc6309_read_block(0x10, &g_reg_tbl[0], 16);\r
+//     qmc6309_delay(1);\r
+       QMC6309_LOG("0x%xx | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", 1,\r
+                                                                                                                                               g_reg_tbl[0],g_reg_tbl[1],g_reg_tbl[2],g_reg_tbl[3],\r
+                                                                                                                                               g_reg_tbl[4],g_reg_tbl[5],g_reg_tbl[6],g_reg_tbl[7],\r
+                                                                                                                                               g_reg_tbl[8],g_reg_tbl[9],g_reg_tbl[10],g_reg_tbl[11],\r
+                                                                                                                                               g_reg_tbl[12],g_reg_tbl[13],g_reg_tbl[14],g_reg_tbl[15]);\r
+       version_id = g_reg_tbl[0x02];\r
+\r
+       qmc6309_read_block(0x20, &g_reg_tbl[0], 16);\r
+//     qmc6309_delay(1);\r
+       QMC6309_LOG("0x%xx | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", 2,\r
+                                                                                                                                               g_reg_tbl[0],g_reg_tbl[1],g_reg_tbl[2],g_reg_tbl[3],\r
+                                                                                                                                               g_reg_tbl[4],g_reg_tbl[5],g_reg_tbl[6],g_reg_tbl[7],\r
+                                                                                                                                               g_reg_tbl[8],g_reg_tbl[9],g_reg_tbl[10],g_reg_tbl[11],\r
+                                                                                                                                               g_reg_tbl[12],g_reg_tbl[13],g_reg_tbl[14],g_reg_tbl[15]);\r
+       qmc6309_read_block(0x30, &g_reg_tbl[0], 16);\r
+//     qmc6309_delay(1);\r
+       QMC6309_LOG("0x%xx | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", 3,\r
+                                                                                                                                               g_reg_tbl[0],g_reg_tbl[1],g_reg_tbl[2],g_reg_tbl[3],\r
+                                                                                                                                               g_reg_tbl[4],g_reg_tbl[5],g_reg_tbl[6],g_reg_tbl[7],\r
+                                                                                                                                               g_reg_tbl[8],g_reg_tbl[9],g_reg_tbl[10],g_reg_tbl[11],\r
+                                                                                                                                               g_reg_tbl[12],g_reg_tbl[13],g_reg_tbl[14],g_reg_tbl[15]);       \r
+       wafer_id = g_reg_tbl[0x07]&0x1f;\r
+       d_id = (unsigned short)((g_reg_tbl[0x09]<<8)|g_reg_tbl[0x08]);\r
+       i2c_0_2 = ((g_reg_tbl[0x07]&0x20)>>3)|(g_reg_tbl[0x0b]&0x03);\r
+\r
+       qmc6309_read_block(0x40, &g_reg_tbl[0], 8);\r
+//     qmc6309_delay(1);\r
+       QMC6309_LOG("0x%xx | %02x %02x %02x %02x %02x %02x %02x %02x \r\n", 4,\r
+                                                                                                                                               g_reg_tbl[0],g_reg_tbl[1],g_reg_tbl[2],g_reg_tbl[3],\r
+                                                                                                                                               g_reg_tbl[4],g_reg_tbl[5],g_reg_tbl[6],g_reg_tbl[7]);\r
+\r
+       QMC6309_LOG("Version-ID:[0x%02x] Wafer-ID:[0x%02x] Di-ID:[0x%04x] I2C:[0x%x]\r\n", version_id, wafer_id, d_id, i2c_0_2);\r
+       QMC6309_LOG("********qst reg dump done********\r\n\r\n\r\n");\r
+#endif\r
+}\r
+\r
+void qmc6309_get_chip_info(unsigned int *info)\r
+{\r
+       unsigned char verid = 0;\r
+       unsigned char ctrl_value[4];\r
+       \r
+       qmc6309_read_block(0x37, ctrl_value, 3);\r
+       qmc6309_read_block(0x12, &verid, 1);\r
+       info[0] = (unsigned int)(((unsigned int)0x90<<24)|((unsigned int)ctrl_value[0]<<16)|((unsigned int)ctrl_value[2]<<8)|((unsigned int)ctrl_value[1]));\r
+       info[1] = verid;\r
+}\r
+\r
+int qmc6309_get_chipid(uint8_t *id)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       int retry=0;\r
+       unsigned char chip_id = 0x00;\r
+\r
+       retry = 0;\r
+       while((chip_id != QMC6309_CHIP_ID) && (retry++<5))\r
+       {\r
+               ret = qmc6309_read_block(QMC6309_CHIP_ID_REG, &chip_id, 1);\r
+               if(ret == QMC6309_OK)\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+       if((chip_id == QMC6309_CHIP_ID)||(chip_id == 0xa5))\r
+       {\r
+               QMC6309_LOG("qmc6309_get_chipid-ok slave:0x%x chipid = 0x%x\r\n", p_mag.slave_addr, chip_id);\r
+               *id = chip_id;\r
+               return 1;\r
+       }\r
+       else\r
+       {\r
+               QMC6309_LOG("qmc6309_get_chipid-fail slave:0x%x chip_id = 0x%x\r\n", p_mag.slave_addr, chip_id);\r
+               return 0;\r
+       }\r
+}\r
+\r
+void qmc6309_set_range(unsigned char range)\r
+{\r
+       QMC6309_LOG("qmc6309_set_range 0x%x\r\n", range);\r
+       p_mag.ctrl2.bit.range = range;\r
+\r
+       switch(p_mag.ctrl2.bit.range)\r
+       {\r
+               case QMC6309_RNG_32G:\r
+                       p_mag.ssvt = 1000;\r
+                       break;\r
+               case QMC6309_RNG_16G:\r
+                       p_mag.ssvt = 2000;\r
+                       break;\r
+               case QMC6309_RNG_8G:\r
+                       p_mag.ssvt = 4000;\r
+                       break;\r
+               default:\r
+                       p_mag.ssvt = 1000;\r
+                       break;\r
+       }\r
+}\r
+\r
+int qmc6309_enable(void)\r
+{\r
+       int ret = 0;\r
+\r
+       QMC6309_LOG("qmc6309_enable!\r\n");\r
+       if(p_mag.chip_type == TYPE_QMC6309H)\r
+       {\r
+               unsigned char reg = 0;\r
+\r
+               ret = qmc6309_read_block(0x40, &reg, 1);\r
+               QMC6309_LOG("read 0x40=0x%x\r\n", reg);\r
+#if defined(QMC6309H_VDD_MODE1)\r
+               reg = ((reg&0x3f)|0x80);\r
+               ret = qmc6309_write_reg(0x40, reg);\r
+#elif defined(QMC6309H_VDD_MODE2)\r
+               reg = ((reg&0x3f)|0x40);\r
+               ret = qmc6309_write_reg(0x40, reg);\r
+#endif\r
+               qmc6309_delay(1);\r
+       }\r
+       ret = qmc6309_write_reg(QMC6309_CTL_REG_TWO, p_mag.ctrl2.value);\r
+       QMC6309_CHECK_ERR(ret);\r
+       qmc6309_delay(1);\r
+       ret = qmc6309_write_reg(QMC6309_CTL_REG_ONE, p_mag.ctrl1.value);\r
+       QMC6309_CHECK_ERR(ret);\r
+       qmc6309_delay(1);\r
+\r
+       return ret;\r
+}\r
+\r
+int qmc6309_disable(void)\r
+{\r
+       int ret = 0;    \r
+       qmc6309_ctrlreg1        ctrl1;\r
+\r
+       QMC6309_LOG("qmc6309_disable!\r\n");\r
+       ctrl1.value = p_mag.ctrl1.value;\r
+       ctrl1.bit.mode = QMC6309_MODE_SUSPEND;\r
+       ret = qmc6309_write_reg(QMC6309_CTL_REG_ONE, ctrl1.value);\r
+       QMC6309_CHECK_ERR(ret);\r
+\r
+       return ret;\r
+}\r
+\r
+void qmc6309_enable_ibi(qmc6309_fifo_ibi flag)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       unsigned char ibi_value = 0x00;\r
+\r
+       QMC6309_LOG("qmc6309_enable_ibi 0x%x\r\n", flag);\r
+       ibi_value = (unsigned char)flag;\r
+       ret = qmc6309_write_reg(QMC6309_CTL_IBI, ibi_value);\r
+\r
+       QMC6309_CHECK_ERR(ret);\r
+}\r
+\r
+void qmc6309_init_para(unsigned char mode, unsigned char odr)\r
+{\r
+       p_mag.ctrl1.bit.mode = mode;    // QMC6309_MODE_HPFM; QMC6309_MODE_NORMAL\r
+       p_mag.ctrl1.bit.osr1 = QMC6309_OSR1_8;\r
+       p_mag.ctrl1.bit.osr2 = QMC6309_OSR2_4;\r
+       if(p_mag.chip_type == TYPE_QMC6309)     \r
+               p_mag.ctrl1.bit.zdbl_enb = QMC6309_ZDBL_ENB_ON;\r
+       else\r
+               p_mag.ctrl1.bit.zdbl_enb = QMC6309H_ZDBL_ENB_ON;                \r
+\r
+       p_mag.ctrl2.bit.set_rst = QMC6309_SET_RESET_ON;         // QMC6309_SET_ON, QMC6309_SET_RESET_ON QMC6309_SET_RESET_OFF\r
+       p_mag.ctrl2.bit.range = QMC6309_RNG_32G;\r
+       p_mag.ctrl2.bit.odr = odr;\r
+       p_mag.ctrl2.bit.soft_rst = 0;\r
+\r
+       qmc6309_set_range(p_mag.ctrl2.bit.range);\r
+#if defined(QMC6309_MODE_SWITCH)\r
+       p_mag.set_ctl.mode = 0;\r
+       p_mag.set_ctl.count = 0;\r
+#endif\r
+}\r
+\r
+\r
+void qmc6309_reload_otp(void)\r
+{\r
+       int ret = 0;\r
+       unsigned char status = 0;\r
+       int retry = 0;\r
+       int count = 0;\r
+\r
+       QMC6309_LOG("qmc6309_reload_otp\r\n");\r
+       while(retry++ < 20)\r
+       {\r
+               ret = qmc6309_write_reg(0x28, 0x02);\r
+               qmc6309_delay(2);\r
+               if(ret != QMC6309_OK)\r
+               {\r
+                       QMC6309_LOG("write 0x28 = 0x02 fail!\r\n");\r
+               }\r
+               qmc6309_delay(2);\r
+               count = 0;\r
+               while(count++<100)\r
+               {\r
+                       qmc6309_delay(1);\r
+                       status = 0;\r
+                       ret = qmc6309_read_block(QMC6309_STATUS_REG, &status, 1);\r
+                       if((ret==QMC6309_OK)&&(status & 0x10))\r
+                       {\r
+                               QMC6309_LOG("qmc6309_reload_otp done slave=0x%x status=0x%x\r\n", p_mag.slave_addr, status);\r
+                               //qmc6309_dump_reg();                           \r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       QMC6309_LOG("qmc6309_reload_otp fail\r\n");\r
+}\r
+\r
+\r
+void qmc6309_check_otp(void)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       int retry = 0;\r
+       unsigned char status = 0x00;\r
+       int count=10;\r
+\r
+       while(count > 0)\r
+       {\r
+               count--;\r
+               retry = 0;\r
+               while(retry++<5)\r
+               {\r
+                       ret = qmc6309_read_block(QMC6309_STATUS_REG, &status, 1);\r
+                       QMC6309_CHECK_ERR(ret);\r
+                       QMC6309_LOG("qmc6309 status 0x%x\r\n", status);\r
+                       if(status & 0x10)\r
+                       {\r
+                               QMC6309_LOG("qmc6309 NVM load done!\r\n");\r
+                               return;\r
+                       }\r
+                       qmc6309_delay(1);\r
+               }\r
+\r
+               if(!(status & 0x10))\r
+               {\r
+                       qmc6309_reload_otp();\r
+               }\r
+               else\r
+               {\r
+                       return;\r
+               }\r
+       }\r
+}\r
+\r
+\r
+void qmc6309_soft_reset(void)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       int retry = 0;\r
+       unsigned char status = 0x00;\r
+\r
+       QMC6309_LOG("qmc6309_soft_reset!\r\n");\r
+       ret = qmc6309_write_reg(QMC6309_CTL_REG_TWO, 0x80);\r
+       QMC6309_CHECK_ERR(ret);\r
+       ret = qmc6309_write_reg(QMC6309_CTL_REG_TWO, 0x00);\r
+       QMC6309_CHECK_ERR(ret);\r
+       qmc6309_delay(5);\r
+\r
+       while(retry++<5)\r
+       {\r
+               ret = qmc6309_read_block(QMC6309_STATUS_REG, &status, 1);\r
+               QMC6309_CHECK_ERR(ret);\r
+               QMC6309_LOG("qmc6309 status 0x%x\r\n", status);\r
+               if((status & 0x10)&&(status & 0x08))\r
+               {\r
+                       QMC6309_LOG("qmc6309 NVM load done!\r\n");\r
+                       break;\r
+               }\r
+               qmc6309_delay(1);\r
+       }\r
+}\r
+\r
+\r
+int qmc6309_read_mag_raw(short raw[3])\r
+{\r
+       static int qmc6309_fail_num = 0;\r
+       int res = QMC6309_FAIL;\r
+       unsigned char mag_data[6];\r
+       int t1 = 0;\r
+       unsigned char rdy = 0;\r
+\r
+       /* Check status register for data availability */\r
+       res = qmc6309_read_block(QMC6309_STATUS_REG, &rdy, 1);\r
+       while(!(rdy & (QMC6309_STATUS_DRDY|QMC6309_STATUS_OVFL)) & (t1++ < 5))\r
+       {\r
+               res = qmc6309_read_block(QMC6309_STATUS_REG, &rdy, 1);\r
+               QMC6309_CHECK_ERR(res);\r
+               qmc6309_delay(1);\r
+       }\r
+       if((res == QMC6309_FAIL)||(!(rdy & QMC6309_STATUS_DRDY)))\r
+       {\r
+               raw[0] = p_mag.last_data[0];\r
+               raw[1] = p_mag.last_data[1];\r
+               raw[2] = p_mag.last_data[2];\r
+               QMC6309_LOG("qmc6309_read_mag_raw read drdy fail! res=%d rdy=0x%x\r\n",res,rdy);\r
+               if(qmc6309_fail_num++ > 10)\r
+               {\r
+#if defined(QMC6309_RECOVER)\r
+                       qmc6309_recover();\r
+                       qmc6309_enable();\r
+#endif\r
+                       qmc6309_fail_num = 0;\r
+               }\r
+               res = QMC6309_OK;       // QMC6309_FAIL;\r
+       }\r
+       else if(rdy & QMC6309_STATUS_OVFL)\r
+       {\r
+               raw[0] = 32767;\r
+               raw[1] = 32767;\r
+               raw[2] = 32767;\r
+       }\r
+       else\r
+       {\r
+               qmc6309_fail_num = 0;\r
+               mag_data[0] = QMC6309_DATA_OUT_X_LSB_REG;\r
+               res = qmc6309_read_block(QMC6309_DATA_OUT_X_LSB_REG, mag_data, 6);\r
+               if(res == QMC6309_FAIL)\r
+               {\r
+                       QMC6309_LOG("qmc6309_read_mag_raw read data fail! res=%d\r\n",res);\r
+                       raw[0] = p_mag.last_data[0];\r
+                       raw[1] = p_mag.last_data[1];\r
+                       raw[2] = p_mag.last_data[2];\r
+                       res = QMC6309_OK;       // QMC6309_FAIL;\r
+               }\r
+               else\r
+               {\r
+                       raw[0] = (short)(((mag_data[1]) << 8) | mag_data[0]);\r
+                       raw[1] = (short)(((mag_data[3]) << 8) | mag_data[2]);\r
+                       raw[2] = (short)(((mag_data[5]) << 8) | mag_data[4]);\r
+               }\r
+       }\r
+       \r
+       p_mag.last_data[0] = raw[0];\r
+       p_mag.last_data[1] = raw[1];\r
+       p_mag.last_data[2] = raw[2];    \r
+#if defined(QMC6309_MODE_SWITCH)\r
+       qmc6309_setrst_auto_mode(raw);\r
+#endif\r
+\r
+       return res;\r
+}\r
+\r
+\r
+int qmc6309_read_mag_xyz(float uT[3], short raw[3])\r
+{\r
+       int res = QMC6309_FAIL;\r
+\r
+       res = qmc6309_read_mag_raw(raw);\r
+       if(res == QMC6309_OK)\r
+       {\r
+               uT[0] = (float)((float)raw[0] / ((float)p_mag.ssvt/100.f));             // ut\r
+               uT[1] = (float)((float)raw[1] / ((float)p_mag.ssvt/100.f));             // ut\r
+               uT[2] = (float)((float)raw[2] / ((float)p_mag.ssvt/100.f));             // ut\r
+       }\r
+       else\r
+       {\r
+               uT[0] = uT[1]= uT[2] = 0.0f;\r
+       }\r
+\r
+       if(p_mag.ctrl1.bit.mode == QMC6309_MODE_SINGLE)\r
+       {\r
+               res = qmc6309_write_reg(QMC6309_CTL_REG_ONE, p_mag.ctrl1.value);\r
+               QMC6309_CHECK_ERR(res);\r
+       }\r
+\r
+       return res;\r
+}\r
+\r
+\r
+int qmc6309_self_test(void)\r
+{\r
+       int selftest_result = 0;\r
+       int selftest_retry = 0;\r
+       signed char  st_data[3];\r
+       unsigned char abs_data[3];\r
+       unsigned char rdy = 0x00;\r
+       int t1 = 0;\r
+       int ret = QMC6309_FAIL;\r
+\r
+       while((selftest_result == 0)&&(selftest_retry<3))\r
+       {\r
+               selftest_retry++;\r
+               qmc6309_write_reg(QMC6309_CTL_REG_ONE, 0x00);\r
+               qmc6309_delay(2);\r
+               qmc6309_write_reg(QMC6309_CTL_REG_TWO, 0x00);\r
+               qmc6309_delay(2);\r
+               qmc6309_write_reg(QMC6309_CTL_REG_ONE, 0x03);\r
+               qmc6309_delay(20);\r
+               qmc6309_write_reg(0x0e, 0x80);\r
+               //qmc6309_delay(150);   // old 150ms\r
+               rdy = 0x00;\r
+               t1 = 0;\r
+               while(!(rdy & 0x04))\r
+               {\r
+                       qmc6309_delay(5);\r
+                       ret = qmc6309_read_block(QMC6309_STATUS_REG, &rdy, 1);\r
+\r
+                       if(t1++ > 50)\r
+                       {\r
+                               break;\r
+                       }\r
+               }               \r
+\r
+               if(rdy & 0x04)\r
+               {\r
+                       ret = qmc6309_read_block(QMC6309_DATA_OUT_ST_X, (unsigned char*)st_data, 3);\r
+                       if(ret == QMC6309_FAIL)\r
+                               continue;\r
+               }\r
+               else\r
+               {\r
+                       QMC6309_LOG("qmc6309 selftest drdy fail!\r\n");\r
+                       continue;\r
+               }\r
+\r
+               abs_data[0] = QMC6309_ABS(st_data[0]);\r
+               abs_data[1] = QMC6309_ABS(st_data[1]);\r
+               abs_data[2] = QMC6309_ABS(st_data[2]);\r
+\r
+               if(     ((abs_data[0] < QMC6309_SELFTEST_MAX_X) && (abs_data[0] > QMC6309_SELFTEST_MIN_X))\r
+                       && ((abs_data[1] < QMC6309_SELFTEST_MAX_Y) && (abs_data[1] > QMC6309_SELFTEST_MIN_Y))\r
+                       && ((abs_data[2] < QMC6309_SELFTEST_MAX_Z) && (abs_data[2] > QMC6309_SELFTEST_MIN_Z)) )\r
+           {\r
+                       QMC6309_LOG("qmc6309 selftest OK! status[0x%x]data[%d   %d      %d]\r\n",rdy,st_data[0],st_data[1],st_data[2]);\r
+               selftest_result = 1;\r
+           }\r
+               else\r
+               {\r
+                       QMC6309_LOG("qmc6309 selftest fail! status[0x%x]data[%d %d      %d]\r\n",rdy,st_data[0],st_data[1],st_data[2]);\r
+                       selftest_result = 0;\r
+               }\r
+       }\r
+\r
+       return selftest_result;\r
+}\r
+\r
+\r
+#if defined(QMC6309_MODE_SWITCH)\r
+void qmc6309_setrst_auto_mode(short hw_d[3])\r
+{\r
+       int ret = QMC6309_FAIL;\r
+\r
+       if(p_mag.set_ctl.mode == 0)\r
+       {// set reset on\r
+               if((QMC6309_ABS(hw_d[0]) > 8000)||(QMC6309_ABS(hw_d[1]) > 8000))\r
+               {\r
+                       p_mag.set_ctl.count++;\r
+                       if(p_mag.set_ctl.count >= 10)\r
+                       {\r
+                               p_mag.set_ctl.mode = 1;\r
+                               p_mag.set_ctl.count = 0;\r
+\r
+                               p_mag.ctrl2.bit.set_rst = QMC6309_SET_ON;\r
+                               ret = qmc6309_write_reg(QMC6309_CTL_REG_TWO, p_mag.ctrl2.value);\r
+                               QMC6309_CHECK_ERR(ret);\r
+                               qmc6309_delay(1);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       p_mag.set_ctl.count = 0;\r
+               }\r
+       }\r
+       else\r
+       {// set only\r
+               int force_switch = 0;\r
+               p_mag.set_ctl.count++;\r
+               if(p_mag.set_ctl.count >= 100)\r
+               {\r
+                       p_mag.set_ctl.count = 0;\r
+                       force_switch = 1;\r
+               }\r
+               if(((QMC6309_ABS(hw_d[0]) < 6000)&&(QMC6309_ABS(hw_d[1]) < 6000)) || force_switch)\r
+               {\r
+                       p_mag.set_ctl.mode = 0;\r
+                       p_mag.set_ctl.count = 0;\r
+\r
+                       p_mag.ctrl2.bit.set_rst = QMC6309_SET_RESET_ON;\r
+                       ret = qmc6309_write_reg(QMC6309_CTL_REG_TWO, p_mag.ctrl2.value);\r
+                       QMC6309_CHECK_ERR(ret);\r
+                       qmc6309_delay(1);\r
+               }\r
+       }\r
+\r
+}\r
+#endif\r
+\r
+void qmc6309_fifo_config(qmc6309_fifo_mode mode, qmc6309_fifo_ch ch, int wmk)\r
+{\r
+       unsigned char fifo_reg = 0x00;\r
+       int ret = QMC6309_OK;\r
+\r
+       fifo_reg = (mode|ch|(wmk<<3));\r
+       p_mag.fifo_ctrl = fifo_reg;\r
+       ret = qmc6309_write_reg(QMC6309_FIFO_REG_CTRL, fifo_reg);\r
+       QMC6309_CHECK_ERR(ret);\r
+       qmc6309_delay(1);\r
+       p_mag.fifo_frame_len = 0;\r
+       if(ch & QMC6309_FIFO_CH_X)\r
+       {\r
+               p_mag.fifo_frame_len+=2;\r
+       }       \r
+       if(ch & QMC6309_FIFO_CH_Y)\r
+       {\r
+               p_mag.fifo_frame_len+=2;\r
+       }\r
+       if(ch & QMC6309_FIFO_CH_Z)\r
+       {\r
+               p_mag.fifo_frame_len+=2;\r
+       }\r
+}\r
+\r
+int qmc6309_fifo_read(unsigned char *f_data)\r
+{\r
+       unsigned char fifo_status = 0;\r
+       unsigned char fifo_level = 0;\r
+       int ret = QMC6309_FAIL;\r
+\r
+       ret = qmc6309_read_block(QMC6309_FIFO_REG_STATUS, &fifo_status, 1);\r
+       QMC6309_CHECK_ERR(ret);\r
+       fifo_level = (fifo_status >> 4);\r
+       if(fifo_level)\r
+       {\r
+               ret = qmc6309_read_block(QMC6309_FIFO_REG_DATA, (unsigned char*)f_data, p_mag.fifo_frame_len*fifo_level);\r
+               //for(int index=0; index<fifo_level; index++)\r
+               //{\r
+               //      qmc6309_read_block(QMC6309_FIFO_REG_DATA, &f_data[index*6], p_mag.fifo_frame_len);\r
+               //}\r
+               //ret = qmc6309_write_reg(QMC6309_FIFO_REG_CTRL, p_mag.fifo_ctrl);\r
+               QMC6309_LOG("status:0x%x        fifo-level:%d\r\n", fifo_status, fifo_level);\r
+               QMC6309_CHECK_ERR(ret);\r
+       }\r
+\r
+       return (int)fifo_level;\r
+}\r
+\r
+#if defined(QMC6309_RECOVER)\r
+int qmc6309_recover(void)\r
+{\r
+       int ret = QMC6309_FAIL;\r
+       unsigned char slave_loop[]={0x7c,0x0c,0x1c,0x2c,0x3c,0x4c,0x5c,0x6c};\r
+\r
+       uint8_t id = 0;\r
+\r
+       for(int i=0; i<sizeof(slave_loop)/sizeof(slave_loop[0]); i++)\r
+       {\r
+               p_mag.chip_type = TYPE_UNKNOW;\r
+               p_mag.slave_addr = slave_loop[i];\r
+               ret = qmc6309_get_chipid(&id);  // read id again\r
+               if(ret)         // read id OK\r
+               {\r
+                       QMC6309_LOG("qmc6309_recover slave=0x%02x read id OK\r\n", p_mag.slave_addr);\r
+                       qmc6309_soft_reset();   // softreset reload OTP\r
+                       qmc6309_reload_otp();   // reload otp\r
+                       p_mag.chip_type = TYPE_UNKNOW;\r
+                       for(i=0; i<sizeof(mag_slave)/sizeof(mag_slave[0]); i++)\r
+                       {\r
+                               p_mag.slave_addr = mag_slave[i];\r
+                               ret = qmc6309_get_chipid(&id);\r
+                               if(ret)\r
+                               {\r
+                                       if(p_mag.slave_addr == QMC6309_IIC_ADDR)\r
+                                       {\r
+                                               p_mag.chip_type = TYPE_QMC6309;\r
+                                       }\r
+                                       else if(p_mag.slave_addr == QMC6309H_IIC_ADDR)\r
+                                       {\r
+                                               p_mag.chip_type = TYPE_QMC6309H;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               p_mag.chip_type = TYPE_UNKNOW;\r
+                                       }\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       break;\r
+               }\r
+       }\r
+ \r
+       QMC6309_LOG("qmc6309_recover %s mag_type=%d\r\n", ret?"OK":"FAIL", p_mag.chip_type);\r
+       return ret;\r
+}\r
+#endif\r
+\r
+int qmc6309_init(void)\r
+{\r
+       int ret = 0;\r
+       int i = 0;\r
+\r
+       uint8_t id = 0;\r
+\r
+       p_mag.chip_type = TYPE_UNKNOW;\r
+       for(i=0; i<sizeof(mag_slave)/sizeof(mag_slave[0]); i++)\r
+       {\r
+               p_mag.slave_addr = mag_slave[i];\r
+               ret = qmc6309_get_chipid(&id);\r
+               if(ret)\r
+               {\r
+                       if(p_mag.slave_addr == QMC6309_IIC_ADDR)\r
+                       {\r
+                               p_mag.chip_type = TYPE_QMC6309;\r
+                       }\r
+                       else if(p_mag.slave_addr == QMC6309H_IIC_ADDR)\r
+                       {\r
+                               p_mag.chip_type = TYPE_QMC6309H;\r
+                       }\r
+                       else\r
+                       {\r
+                               p_mag.chip_type = TYPE_UNKNOW;\r
+                       }\r
+                       break;\r
+               }\r
+       }\r
+\r
+#if defined(QMC6309_RECOVER)\r
+       if(p_mag.chip_type == TYPE_UNKNOW)\r
+       {\r
+               qmc6309_recover();\r
+       }\r
+#endif\r
+       if(p_mag.chip_type != TYPE_UNKNOW)\r
+       {\r
+               qmc6309_soft_reset();           \r
+               qmc6309_reload_otp();   // reload otp\r
+               //qmc6309_check_otp();\r
+               qmc6309_init_para(QMC6309_MODE_HPFM, QMC6309_ODR_HPFM);\r
+               //ret = qmc6309_disable();\r
+               QMC6309_CHECK_ERR(ret);\r
+               ret = qmc6309_enable();\r
+               QMC6309_CHECK_ERR(ret);\r
+               qmc6309_dump_reg();\r
+\r
+               return 1;\r
+       }\r
+       else\r
+       {\r
+               return 0;\r
+       }\r
+}\r
+\r
+\r
diff --git a/code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.h b/code/sdk/zhihui/drivers/mag/qmc6309/qmc6309.h
new file mode 100644 (file)
index 0000000..80b660c
--- /dev/null
@@ -0,0 +1,222 @@
+#ifndef __QMC6309_H\r
+#define __QMC6309_H\r
+\r
+#include <stdint.h>\r
+#include <stdbool.h>\r
+\r
+#define QMC6309_RECOVER\r
+\r
+#define QMC6309_OK                     1\r
+#define QMC6309_FAIL           0\r
+\r
+#define QMC6309_IIC_ADDR                               0x7c\r
+#define QMC6309H_IIC_ADDR                              0x0c\r
+\r
+//#define QMC6309H_VDD_MODE1                   // 1:vio = vdd  2:vio=1.8 vdd < 2.1\r
+//#define QMC6309H_VDD_MODE2                   // vio = 1.8 vdd >= 2.1\r
+\r
+/* chip id*/\r
+#define QMC6309_CHIP_ID                                        0x90\r
+\r
+/*data output register*/\r
+#define QMC6309_CHIP_ID_REG                            0x00\r
+#define QMC6309_DATA_OUT_X_LSB_REG             0x01\r
+#define QMC6309_DATA_OUT_X_MSB_REG             0x02\r
+#define QMC6309_DATA_OUT_Y_LSB_REG             0x03\r
+#define QMC6309_DATA_OUT_Y_MSB_REG             0x04\r
+#define QMC6309_DATA_OUT_Z_LSB_REG             0x05\r
+#define QMC6309_DATA_OUT_Z_MSB_REG             0x06\r
+#define QMC6309_TEMP_OUT_LSB_REG               0x07\r
+#define QMC6309_TEMP_OUT_MSB_REG               0x08\r
+\r
+#define QMC6309_DATA_OUT_ST_X                  0x13\r
+\r
+/*Status registers */\r
+#define QMC6309_STATUS_REG                             0x09\r
+/* configuration registers */\r
+#define QMC6309_CTL_REG_ONE                            0x0A  /* Contrl register one */\r
+#define QMC6309_CTL_REG_TWO                            0x0B  /* Contrl register two */\r
+#define QMC6309_CTL_REG_THREE                  0x0D  /* Contrl register three */\r
+#define QMC6309_CTL_IBI                                        0x21\r
+\r
+#define QMC6309_FIFO_REG_STATUS                        0x20\r
+#define QMC6309_FIFO_REG_CTRL                  0x2E\r
+#define QMC6309_FIFO_REG_DATA                  0x2F\r
+\r
+#define QMC6309_DATA_OFFSET_X_LSB_REG  0x22\r
+\r
+#define QMC6309_SET_RESET_ON                   0\r
+#define QMC6309_SET_ON                                         1\r
+#define QMC6309_RESET_ON                               2\r
+#define QMC6309_SET_RESET_OFF                  3\r
+\r
+#define QMC6309_RNG_32G                                        0\r
+#define QMC6309_RNG_16G                                        1\r
+#define QMC6309_RNG_8G                                 2\r
+\r
+#define QMC6309_MODE_SUSPEND                   0\r
+#define QMC6309_MODE_NORMAL                            1\r
+#define QMC6309_MODE_SINGLE                            2\r
+#define QMC6309_MODE_HPFM                              3\r
+\r
+#define QMC6309_ODR_HPFM                               0\r
+#define QMC6309_ODR_1HZ                                        0\r
+#define QMC6309_ODR_10HZ                               1\r
+#define QMC6309_ODR_50HZ                               2\r
+#define QMC6309_ODR_100HZ                              3\r
+#define QMC6309_ODR_200HZ                              4\r
+\r
+// CIC filter OSR: 512/256/128/64(0~3)\r
+#define QMC6309_OSR1_8                                 0\r
+#define QMC6309_OSR1_4                                 1\r
+#define QMC6309_OSR1_2                                 2\r
+#define QMC6309_OSR1_1                                 3\r
+\r
+// Moving average depth normal mode the depth:16/8/4/2/1(7~4/3/2/1/0). Single Mode also use this filter.       \r
+#define QMC6309_OSR2_1                                 0\r
+#define QMC6309_OSR2_2                                 1\r
+#define QMC6309_OSR2_4                                 2\r
+#define QMC6309_OSR2_8                                 3\r
+#define QMC6309_OSR2_16                                        4\r
+//#define QMC6309_OSR2_64                              6\r
+//#define QMC6309_OSR2_128                             7\r
+\r
+//ZDBL_ENB     0: OSR1_Z=2*OSR_XY   1:OSR1_Z=OSR_XY\r
+#define QMC6309H_ZDBL_ENB_ON                   1\r
+#define QMC6309H_ZDBL_ENB_OFF                  0\r
+\r
+#define QMC6309_ZDBL_ENB_ON                            0\r
+#define QMC6309_ZDBL_ENB_OFF                   1\r
+\r
+#define QMC6309_STATUS_DRDY                            0x01\r
+#define QMC6309_STATUS_OVFL                            0x02\r
+\r
+#define QMC6309_FIFO_STATUS_OR                 0x04\r
+#define QMC6309_FIFO_STATUS_WMK                        0x02\r
+#define QMC6309_FIFO_STATUS_FULL               0x01\r
+\r
+#define QMC6309_SELFTEST_MAX_X                 (50)\r
+#define QMC6309_SELFTEST_MIN_X                 (1)\r
+#define QMC6309_SELFTEST_MAX_Y                 (50)\r
+#define QMC6309_SELFTEST_MIN_Y                 (1)\r
+#define QMC6309_SELFTEST_MAX_Z                 (50)\r
+#define QMC6309_SELFTEST_MIN_Z                 (1)\r
+\r
+#define QMC6309_ABS(X)                                         ((X) < 0 ? (-1 * (X)) : (X))\r
+#define QMC6309_ABSF(X)                                ((X) < 0.0f ? (-1.0 * (X)) : (X))\r
+\r
+#define QMC6309_LOG            printf\r
+#define QMC6309_CHECK_ERR(ret) do {\\r
+                                                               if((ret) != QMC6309_OK) \\r
+                                                               QMC6309_LOG("qmc6309 error:%d line:%d\r\n",ret, __LINE__);      \\r
+                                                                       }while(0)\r
+\r
+//#define QMC6309_MODE_SWITCH\r
+\r
+enum\r
+{\r
+       TYPE_UNKNOW,\r
+       TYPE_QMC6309,\r
+       TYPE_QMC6309H,\r
+\r
+       TYPE_MAX\r
+};\r
+\r
+typedef enum\r
+{\r
+       QMC6309_FIFO_MODE_BYPASS = (0<<6),\r
+       QMC6309_FIFO_MODE_FIFO = (1<<6),\r
+       QMC6309_FIFO_MODE_STREAM = (2<<6),\r
+       QMC6309_FIFO_MODE_DEFAULT = (3<<6)\r
+} qmc6309_fifo_mode;\r
+\r
+typedef enum\r
+{\r
+       QMC6309_FIFO_CH_X = 0x01,\r
+       QMC6309_FIFO_CH_Y = 0x02,\r
+       QMC6309_FIFO_CH_Z = 0x04,\r
+       QMC6309_FIFO_CH_ALL = 0x07\r
+} qmc6309_fifo_ch;\r
+\r
+typedef enum\r
+{\r
+       QMC6309_IBI_OFF = 0x00,\r
+       QMC6309_IBI_DRDY = 0x01,\r
+       QMC6309_IBI_OVFL = 0x02,\r
+       QMC6309_IBI_ST_RDY = 0x04,\r
+       QMC6309_IBI_FIFO_FULL = 0x08,\r
+       QMC6309_IBI_FIFO_WMK = 0x10,\r
+       QMC6309_IBI_EN = 0x20\r
+} qmc6309_fifo_ibi;\r
+\r
+typedef struct\r
+{\r
+       char                    mode;\r
+       unsigned short  count;\r
+} qmc6309_set_ctl_t;\r
+\r
+typedef union\r
+{\r
+       struct\r
+       {\r
+               unsigned char mode:2;\r
+               unsigned char zdbl_enb:1;\r
+               unsigned char osr1:2;\r
+               unsigned char osr2:3;\r
+       }bit;\r
+       unsigned char value;\r
+} qmc6309_ctrlreg1;\r
+\r
+typedef union\r
+{\r
+       struct\r
+       {\r
+               unsigned char set_rst:2;\r
+               unsigned char range:2;\r
+               unsigned char odr:3;\r
+               unsigned char soft_rst:1;\r
+       }bit;\r
+       unsigned char value;\r
+} qmc6309_ctrlreg2;\r
+\r
+typedef struct\r
+{\r
+       unsigned char                   slave_addr;\r
+       int                                             chip_type;\r
+       unsigned short                  ssvt;\r
+       short                                   last_data[3];\r
+       qmc6309_ctrlreg1                ctrl1;\r
+       qmc6309_ctrlreg2                ctrl2;\r
+       unsigned char                   fifo_ctrl;\r
+       unsigned char                   fifo_frame_len;\r
+#if defined(QMC6309_MODE_SWITCH)\r
+       qmc6309_set_ctl_t               set_ctl;\r
+#endif\r
+} qmc6309_data_t;\r
+\r
+int qmc6309_write_reg(unsigned char addr, unsigned char data);\r
+int qmc6309_read_block(unsigned char addr, unsigned char *data, unsigned short len);\r
+\r
+int qmc6309_init(void);\r
+int qmc6309_disable(void);\r
+int qmc6309_enable(void);\r
+void qmc6309_soft_reset(void);\r
+#if defined(QMC6309_RECOVER)\r
+int qmc6309_recover(void);\r
+#endif\r
+void qmc6309_check_otp(void);\r
+void qmc6309_dump_reg(void);\r
+void qmc6309_get_chip_info(unsigned int *info);\r
+int qmc6309_read_mag_xyz(float uT[3], short raw[3]);\r
+int qmc6309_read_mag_raw(short data[3]);\r
+#if defined(QMC6309_MODE_SWITCH)\r
+void qmc6309_setrst_auto_mode(short hw_d[3]);\r
+#endif\r
+void qmc6309_set_range(unsigned char range);\r
+int qmc6309_self_test(void);\r
+void qmc6309_fifo_config(qmc6309_fifo_mode mode, qmc6309_fifo_ch ch, int wmk);\r
+int qmc6309_fifo_read(unsigned char *f_data);\r
+void qmc6309_enable_ibi(qmc6309_fifo_ibi flag);\r
+int qmc6309_get_chipid(uint8_t *id);\r
+#endif\r
+\r
index f44cbf2..20089ce 100644 (file)
@@ -57,7 +57,9 @@ static uint32_t mag_start_test(uint8_t *para, uint32_t paraLen, char *strCommonC
     UNUSED(paraLen);
     UNUSED(para);
     do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK);
+#ifdef MAG_MMC5603
     mag_set_factory_log_switch(1);
+#endif
     return ERRCODE_SUCC;
 }
 static uint32_t mag_stop_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
@@ -66,7 +68,9 @@ static uint32_t mag_stop_test(uint8_t *para, uint32_t paraLen, char *strCommonCm
     UNUSED(paraLen);
     UNUSED(para);
     do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK);
+#ifdef MAG_MMC5603
     mag_set_factory_log_switch(0);
+#endif
     return ERRCODE_SUCC;
 }
 static const at_cmd_table_t g_mag_cmd[] = {
index a267b35..42f21ef 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2025-05-16 11:36:48
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-08-18 17:33:25
+ * @LastEditTime: 2025-11-04 10:00:47
  * @FilePath: /FD230/code/sdk/zhihui/drivers/mag/hal/mag_hal.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
 #endif
 
 
+#ifdef MAG_QMC6309
+#include "qmc6309.h"
+#endif
+
+
 void mag_timer_handler(void)
 {
 #ifdef MAG_MMC5603
     mmc5603_check();
+#elif defined MAG_QMC6309
+    // qmc6309_read_mag_xyz();
 #endif
 }
 
 void mag_sensor_start(void)
 {
 #ifdef MAG_MMC5603
+    mag_readPara_infile();
     mmc5603_start();
+#elif defined MAG_QMC6309
+    qmc6309_init();
 #endif
 }
 
@@ -33,6 +43,9 @@ void mag_sensor_stop(void)
 {
 #ifdef MAG_MMC5603
     mmc5603_stop();
+    mag_savePara_infile();
+#elif defined MAG_QMC6309
+    qmc6309_disable();
 #endif
 }
 
@@ -42,6 +55,9 @@ uint8_t mag_get_chip_id(void)
 #ifdef MAG_MMC5603
     CUSTOM_MMC5603_GETID(&id);
     printf("MMC5603 CHIP ID : 0x%x\n",id);
+#elif defined MAG_QMC6309
+    qmc6309_get_chipid(&id);
+    printf("QMC6309 CHIP ID : 0x%x\n",id);
 #endif
     return id;
 }
index 2531c1f..0ea38e1 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-06-07 11:18:26
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-08-18 17:33:40
+ * @LastEditTime: 2025-11-04 10:06:53
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.h
  * @Description: 
  * 
@@ -18,8 +18,8 @@ extern "C" {
 
 #ifdef MAG_MMC5603
 #define MAG_SENSOR_CHIP_ID 0X10
-#else
-#define MAG_SENSOR_CHIP_ID 0
+#elif defined MAG_QMC6309
+#define MAG_SENSOR_CHIP_ID 0x90
 #endif
 
 void mag_timer_handler(void);
index 817da88..3d6fd87 100644 (file)
@@ -100,7 +100,7 @@ static void mag_service_check_task(void const *arg)
         }else if (mail.comm.app == MAG_SERVICE_CMD_START_CHECK){
             uapi_dev_runtime_set_mmc_status(1);
             // do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_READ, NULL, 0);
-            mag_readPara_infile();
+            // mag_readPara_infile();
             // mmc5603_start();
             mag_sensor_start();
             LOS_Mdelay(20);
@@ -110,7 +110,7 @@ static void mag_service_check_task(void const *arg)
         }else if (mail.comm.app == MAG_SERVICE_CMD_STOP_CHECK){
             uapi_dev_runtime_set_mmc_status(0);
             // do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_SAVE, NULL, 0);
-            mag_savePara_infile();
+            // mag_savePara_infile();
             mag_service_running_stat = false;
             osTimerStop(g_mag_service_timer);
             // mmc5603_stop();
index 10b7b6f..8fef223 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-03-13 15:08:38
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-10-27 16:05:36
+ * @LastEditTime: 2025-11-04 12:08:12
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
  * @Description: 
  * 
 #include "cywee_service.h"
 #endif
 
+#ifdef BOARD_FD272
+
+// S_AGPIO_L26 心率复位 PPG reset
+#define GPIO_PIN_PRG_RESET S_AGPIO_L26
+// S_AGPIO_R0 PRG_LED_POWER ON  心率等电源控制脚
+#define GPIO_PIN_PRG_LED_ON S_AGPIO_L3
+
+#else
 
 // S_AGPIO_L26 心率复位 PPG reset
 #define GPIO_PIN_PRG_RESET S_AGPIO_L26
 // S_AGPIO_R0 PRG_LED_POWER ON  心率等电源控制脚
 #define GPIO_PIN_PRG_LED_ON S_AGPIO_R0
 
+#endif
+
 static uint8_t ppg_factory_log = 0;
 
 void ppg_power_on(void)
index e99be79..15b5f55 100644 (file)
 
 #ifdef BOARD_LEINIAO
 #define VIBRATOR_GPIOPPIN S_HGPIO4
+#elif defined BOARD_FD272
+#define VIBRATOR_GPIOPPIN S_AGPIO_L16
+#define VIBRATORPIN_MODE HAL_PIO_FUNC_PWMP3_M1 
+static  pwm_channel_t channel = PWM_3;
 #else
 #define VIBRATOR_GPIOPPIN S_AGPIO_R2
+#define VIBRATORPIN_MODE HAL_PIO_FUNC_PWMN1_M3 
+static  pwm_channel_t channel = PWM_1;
 #endif
 
 // #define VIB_DEBUG
 #ifdef  VIB_USE_PWM
 
 // #define VIBRATORPIN_MODE HAL_PIO_FUNC_PWMP1_M2 
-#define VIBRATORPIN_MODE HAL_PIO_FUNC_PWMN1_M3 
 
 #define TEST_TCXO_DELAY_1000MS  1000
 #define TEST_PARAM_FOR_PWM_10   10
 #define TEST_PARAM_FOR_PWM_200  200
 
-static  pwm_channel_t channel = PWM_1;
+
 static  pin_t pin = VIBRATOR_GPIOPPIN;
 static  pin_mode_t mode = VIBRATORPIN_MODE;
 static  uint32_t delay_ms = 5;
index aa2aad2..78db209 100644 (file)
@@ -41,6 +41,19 @@ extern "C" {
 #define TIOT_PIN_UART_RTS   S_MGPIO35\r
 #define TIOT_PINMUX HAL_PIO_FUNC_UART_HS_UART\r
 \r
+#elif defined BOARD_FD272\r
+#define TIOT_UART_PORT  UART_BUS_0\r
+#define TIOT_PIN_WAKEUP_HOST_NUM    S_AGPIO_R1    /* 用于唤醒HOST. */\r
+#define TIOT_PIN_WAKEUP_GNSS_NUM    S_AGPIO_R0    /* 用于 唤醒GNSS. */\r
+#define TIOT_PIN_POWER      S_AGPIO_R2     /* 用于开启GNSS. */\r
+\r
+\r
+#define TIOT_PIN_UART_TX    S_MGPIO19\r
+#define TIOT_PIN_UART_RX    S_MGPIO20\r
+#define TIOT_PIN_UART_CTS   S_MGPIO21\r
+#define TIOT_PIN_UART_RTS   S_MGPIO22\r
+#define TIOT_PINMUX HAL_PIO_FUNC_UART1\r
+\r
 #else\r
 #define TIOT_PIN_WAKEUP_HOST_NUM    TIOT_PIN_NONE    /* 用于唤醒HOST. */\r
 #define TIOT_PIN_WAKEUP_GNSS_NUM    TIOT_PIN_NONE    /* 用于 唤醒GNSS. */\r
index de6cb52..621a469 100644 (file)
@@ -1,3 +1,11 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-05-15 11:28:07
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-11-04 13:49:13
+ * @FilePath: /FD230/code/sdk/zhihui/services/gnss/inc/gnss_ctl.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 // Copyright 2018-2025 Espressif Systems (Shanghai) PTE LTD
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,6 +47,7 @@ int GnssLogEnable(bool enable);
 
 /**test only */
 uint32_t gnss_write_cmd(uint8_t * cmdbuf,uint16_t cmdlen);
+void gnss_bat_switch(uint8_t cmd);
 
 #ifdef __cplusplus
 }
index d1d6e30..6fe4e81 100644 (file)
@@ -588,6 +588,8 @@ static void ListenGnssData(tiot_handle handle)
                         }
                         dump_location_data_to_buf(&g_global_gpsData, temp_buf, 512);
                         
+                        // printf("temp_buf : %s\n",temp_buf);
+
                         // 追加到pgnss_log中
                         if (pgnss_log != NULL) {
                             int current_len = strlen(pgnss_log);
@@ -724,16 +726,22 @@ void PGnssServerStartAutoModeStart(void)
 
     uapi_pm_add_sleep_veto(PM_ID_SYS);
 
-    #ifdef DOWNLOAD_GNSS_SWITCH
+#ifdef DOWNLOAD_GNSS_SWITCH
     download_gnss_switch(SWITCH_TO_GNSS);
-    #endif
+#endif
+
+#ifdef BOARD_FD272
+    gnss_bat_switch(1);
+#endif
 
     g_is_pgnss_start = 1;
     g_pgnss_stopflag = 0;
     g_cold_start_pgnss_stopflag = 0;
     g_is_listening_data = 0;  // 初始化监听状态
+
+#ifndef BOARD_FD272       
     sw_debug_uart_deinit();
-    
+#endif
     // Step1: init
     int32_t ret = tiot_service_init();
     if (ret != 0) {
@@ -825,16 +833,23 @@ void PGnssServerStartAutoModeStart(void)
     // Step8: deinit
     tiot_service_deinit();
 
-    #ifdef DOWNLOAD_GNSS_SWITCH
+#ifdef DOWNLOAD_GNSS_SWITCH
     download_gnss_switch(SWITCH_TO_DOWNLOAD);
-    #endif
+#endif
+
+#ifdef BOARD_FD272
+    gnss_bat_switch(0);
+#endif
+
     uapi_pm_remove_sleep_veto(PM_ID_SYS);
 
     g_is_pgnss_poweron = 0;
     g_is_pgnss_start = 0;
     g_pgnss_stopflag = 0;  // 清除停止标志
+#ifndef BOARD_FD272  
     sw_debug_uart_deinit();
     uart_config_init();
+#endif
     printf("finish auto start mode\r\n");
     
 
@@ -1070,6 +1085,8 @@ static int pgnss_startup_check(void)
         return 0; // 检查通过,可以正常启动PGNSS
     }
     
+#ifdef SUPPORT_CAT1_SERVICE
+
     printf("AGNSS folder is expired or does not exist. Attempting to download...\n");
     
     // 检查4G状态
@@ -1129,6 +1146,8 @@ static int pgnss_startup_check(void)
     uapi_gnss_http_server_deinit();
     printf("GNSS HTTP server deinitialized successfully\n");
     
+#endif
+
     return 1; // 检查失败,需要冷启动
 }
 
@@ -1210,13 +1229,20 @@ void PGnssServerStart(void)
 
     uapi_pm_add_sleep_veto(PM_ID_SYS);
 
-    #ifdef DOWNLOAD_GNSS_SWITCH
+
+#ifdef DOWNLOAD_GNSS_SWITCH
     download_gnss_switch(SWITCH_TO_GNSS);
-    #endif
+#endif
+
+#ifdef BOARD_FD272
+    gnss_bat_switch(1);
+#endif
 
-    g_is_pgnss_start = 1;
 
+    g_is_pgnss_start = 1;
+#ifndef BOARD_FD272  
     sw_debug_uart_deinit();
+#endif
     // Step1: init
     int32_t ret = tiot_service_init();
     if (ret != 0) {
@@ -1308,9 +1334,14 @@ void PGnssServerStart(void)
     // Step8: deinit
     tiot_service_deinit();
 
-    #ifdef DOWNLOAD_GNSS_SWITCH
+#ifdef DOWNLOAD_GNSS_SWITCH
     download_gnss_switch(SWITCH_TO_DOWNLOAD);
-    #endif
+#endif
+
+#ifdef BOARD_FD272
+    gnss_bat_switch(0);
+#endif
+
     uapi_pm_remove_sleep_veto(PM_ID_SYS);
     if(!g_cold_start_pgnss_stopflag)
     {
@@ -1318,9 +1349,10 @@ void PGnssServerStart(void)
         g_is_pgnss_poweron = 0;
         g_pgnss_stopflag = 0;  // 清除停止标志
     }
-
+#ifndef BOARD_FD272  
     sw_debug_uart_deinit();
     uart_config_init();
+#endif
     printf("finish gnss samples\r\n");
     
 
index 57eca61..1c3a432 100644 (file)
@@ -33,6 +33,9 @@
 // #include "gnss_sample.h"
 #include "pgnss_sample.h"
 // #include "cywee_hal.h"
+#include "tcxo.h"
+
+#define TIOT_PIN_BAT      S_AGPIO_L31     /* GNSS BAT */
 
 errcode_t gnss_power_on(void)
 {
@@ -157,4 +160,21 @@ errcode_t download_gnss_switch(DOWNLOAD_GPS_SWITCH_T download_gps_switch)
         PRINT("SWITCH uart to download set_value S_AGPIO_L16 GPIO_LEVEL_LOW ret %d\n",ret);
     }
     return ret;
-}
\ No newline at end of file
+}
+
+void gnss_bat_switch(uint8_t cmd)
+{
+    uapi_pin_set_mode(TIOT_PIN_BAT,HAL_PIO_FUNC_GPIO);
+    uapi_gpio_set_dir(TIOT_PIN_BAT, GPIO_DIRECTION_OUTPUT);
+    
+    if (cmd)
+    {
+        uapi_gpio_set_val(TIOT_PIN_BAT, GPIO_LEVEL_HIGH);
+        uapi_tcxo_delay_ms(10);
+    } 
+    else
+    {
+        uapi_gpio_set_val(TIOT_PIN_BAT, GPIO_LEVEL_LOW); 
+        uapi_tcxo_delay_ms(10);
+    }
+}
index 094beea..bca9003 100644 (file)
@@ -193,14 +193,14 @@ static void custom_fileoperate_service_check_task(void const *arg)
             // cywee_read_nap_data();
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_SAVE:
-#ifdef SUPPORT_MAG_SERVICE
-            mag_savePara_infile();
-#endif
+// #ifdef SUPPORT_MAG_SERVICE
+//             mag_savePara_infile();
+// #endif
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_READ:
-#ifdef SUPPORT_MAG_SERVICE
-            mag_readPara_infile();
-#endif
+// #ifdef SUPPORT_MAG_SERVICE
+            // mag_readPara_infile();
+// #endif
             break;
 
         case CUSTOM_FILEOPERATE_MSG_TYPE_MUSICNAME_READ: