\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
# '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': [
'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",
"ppg_hal",
"mag_service",
"cywee_dml",
- #"cyweeBleService",
+ "cyweeBleService",
+ "charge_ic_hp4570",
+ "gnss",
+ "pgnss_sample",
+ # "gnss_sample",
+ "cyweeBleService",
],
'image_analysis': False,
'fs_image_path':'fd272',
{ 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
{ 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
{ 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 心率等电源控制脚
// { 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
#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 },
+/*
+ * @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
#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
{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
#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;
#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
# @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
set(PUBLIC_DEFINES
SUPPORT_AT_CHARGE
-ENABLE_HP4507
)
# use this when you want to add ccflags like -include xxx
#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
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
--- /dev/null
+#===============================================================================
+# @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
--- /dev/null
+\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, ®, 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
--- /dev/null
+#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
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)
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[] = {
* @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
}
{
#ifdef MAG_MMC5603
mmc5603_stop();
+ mag_savePara_infile();
+#elif defined MAG_QMC6309
+ qmc6309_disable();
#endif
}
#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;
}
* @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:
*
#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);
}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);
}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();
* @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)
#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;
#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
+/*
+ * @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");
/**test only */
uint32_t gnss_write_cmd(uint8_t * cmdbuf,uint16_t cmdlen);
+void gnss_bat_switch(uint8_t cmd);
#ifdef __cplusplus
}
}
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);
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) {
// 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");
return 0; // 检查通过,可以正常启动PGNSS
}
+#ifdef SUPPORT_CAT1_SERVICE
+
printf("AGNSS folder is expired or does not exist. Attempting to download...\n");
// 检查4G状态
uapi_gnss_http_server_deinit();
printf("GNSS HTTP server deinitialized successfully\n");
+#endif
+
return 1; // 检查失败,需要冷启动
}
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) {
// 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)
{
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");
// #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)
{
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);
+ }
+}
// 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: