优化w9心率驱动,并添加血压蓝牙协议(未验证),修改hx3509为hx3508,完善u8蓝牙音频产测 1656/1 1656/head 1695/target/1
authorpenglei <1624952103@qq.com>
Mon, 24 Feb 2025 07:08:24 +0000 (15:08 +0800)
committerpenglei <1624952103@qq.com>
Mon, 24 Feb 2025 07:08:24 +0000 (15:08 +0800)
43 files changed:
code/sdk/application/brandy/brandy_standard/service_init.c
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/fd230/service/msg_center/include/notify/findwatch_notification.h
code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h
code/sdk/drivers/boards/brandy_evb/board_config/board_w9.h
code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c
code/sdk/files/u8/fs/user/music/20-20KHZ.mp3 [new file with mode: 0644]
code/sdk/middleware/chips/brandy/pm/include/pm_definition.h
code/sdk/middleware/chips/brandy/pm/pm_adapt/pm_core.c
code/sdk/zhihui/UI/producttest/include/testmicrophoneC.h
code/sdk/zhihui/UI/producttest/src/testTP.cpp
code/sdk/zhihui/UI/producttest/src/testmicrophone.cpp
code/sdk/zhihui/drivers/bp/CMakeLists.txt
code/sdk/zhihui/drivers/bp/bn02/bn02.c
code/sdk/zhihui/drivers/bp/service/bp_ble_service.c [new file with mode: 0644]
code/sdk/zhihui/drivers/bp/service/bp_ble_service.h [new file with mode: 0644]
code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h
code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h
code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c
code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c
code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c
code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_hal.c
code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp
code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt
code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.c [moved from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c with 52% similarity]
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.h [moved from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.h with 83% similarity]
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.c [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h [moved from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h with 89% similarity]
code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.c [moved from code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c with 96% similarity]
code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.h [moved from code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h with 95% similarity]
code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c [deleted file]
code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c
code/sdk/zhihui/services/battery/service/battery_driver.cpp
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h
code/sdk/zhihui/utils/custom_cmd_service.c
code/sdk/zhihui/utils/custom_utils.c
code/sdk/zhihui/utils/custom_utils.h

index 0a7399e..d5f13a7 100644 (file)
@@ -77,8 +77,8 @@
 #ifdef CONFIG_OTA_UPDATE_SUPPORT\r
 #include "upg.h"\r
 #endif\r
-#ifdef SUPPORT_AT_HX3509\r
-#include "hx3509_at_cmd.h"\r
+#ifdef SUPPORT_AT_HX3508\r
+#include "hx3508_at_cmd.h"\r
 #endif\r
 #ifdef SUPPORT_AT_LQBP002TA\r
 #include "lqbp_at_cmd.h"\r
@@ -191,10 +191,10 @@ static void register_at_service(void)
     at_cmd_table_t *rtc_table = get_rtc_cmd_table(&rtc_cmd_count);\r
     at_cmd_add_moudle(rtc_table, rtc_cmd_count);\r
 #endif\r
-#ifdef SUPPORT_AT_HX3509\r
-    uint32_t hx3509_cmd_count;\r
-    at_cmd_table_t *hx3509_table = get_hx3509_cmd_table(&hx3509_cmd_count);\r
-    at_cmd_add_moudle(hx3509_table, hx3509_cmd_count);\r
+#ifdef SUPPORT_AT_HX3508\r
+    uint32_t hx3508_cmd_count;\r
+    at_cmd_table_t *hx3508_table = get_hx3508_cmd_table(&hx3508_cmd_count);\r
+    at_cmd_add_moudle(hx3508_table, hx3508_cmd_count);\r
 #endif\r
 #ifdef SUPPORT_AT_LQBP002TA\r
     uint32_t lqbp002ta_cmd_count;\r
index c672e65..fece0ba 100644 (file)
@@ -528,6 +528,10 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
     uapi_bp_service_init();\r
 #endif\r
 \r
+#endif\r
+\r
+#ifdef ENABLE_CUSTOM_SPI\r
+    custom_spi_init(SPI_BUS_0);\r
 #endif\r
 \r
     /*启动蓝牙ble服务,cywee有重置 mac地址的操作,会需要把 蓝牙服务开启放在cywee服务之后*/\r
index 6c9126e..bbd7d09 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-03-25 17:31:19
- * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-12-18 15:22:38
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-10 17:04:22
  * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/include/notify/findwatch_notification.h
  */
 #ifndef FIND_WATCH_NOTIFICATION_H
@@ -73,7 +73,7 @@ namespace OHOS
         int FindWatchRingPlayStop(void);
         int FindWatchRingPlayStart(const char *path);
         int FindWatchRingPlayerInit(const char *path);
-        int FindWatchRingPlayerStat(void);
+        int FindWatchRingPlayerStat(bool isLooping = true);
         bool GetFindWatchNotifyFlag(void);
         void SetFindWatchNotifyFlag(bool flag);
         void SetVibration(void);
index 3af24c6..f17eb26 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-03-25 17:33:47
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-12-21 15:54:46
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-10 17:43:06
  * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/findwatch_notification.cpp
  * @details:实现查找手表的功能一般需要手表和智能手机之间的配合,通常是通过手机上的应用(App)或其他设备发送指令给手表,触发手表的查找功能。
  * 以下是基本的实现步骤:
@@ -212,8 +212,9 @@ namespace OHOS
 
     /*
      * @brief 准备并播放铃声
+     * @brief isLooping 是否重复播放
      */
-    int FindWatchViewEventListener::FindWatchRingPlayerStat(void)
+    int FindWatchViewEventListener::FindWatchRingPlayerStat(bool isLooping)
     {
         /* -------------------------------- 1.检查播放器实例 ------------------------------- */
         int32_t ret;
@@ -261,11 +262,11 @@ namespace OHOS
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");
             return OHOS_FAILURE;
         }
-        playerCtr->SetVolume(300, 300); // 将左声道和右声道音量都设置为50
+        // playerCtr->SetVolume(300, 300); // 将左声道和右声道音量都设置为50
         playerCtr->SetAudioSessionId(sessionId);
         // 播放
         playerCtr->Play();
-        playerCtr->EnableSingleLooping(true); // 设置是否循环播放
+        playerCtr->EnableSingleLooping(isLooping); // 设置是否循环播放
         return OHOS_SUCCESS;
     }
 
@@ -306,7 +307,7 @@ namespace OHOS
     {
         FindWatchRingPlayStop(); // 如果playerCtr上音频资源没被释放,先释放
         FindWatchRingPlayerInit(((path == nullptr) ? RingMusicName : path));
-        FindWatchRingPlayerStat();
+        FindWatchRingPlayerStat(((path == nullptr) ? true : false));
         return OHOS_SUCCESS;
     }
 
index 512d802..2e40b9e 100644 (file)
@@ -553,6 +553,7 @@ target = {
                     # 'ACC_LIS2DOC',
                     'ENABLE_CYWEE',
                     'ENABLE_CUSTOM_I2C',
+                    #'ENABLE_CUSTOM_SPI',
                     'SUPPORT_AT_CYWEE',
                     'MAG_MMC5603',
                     'ENABLE_VIBRATOR',
@@ -703,7 +704,7 @@ target = {
                     'TEST_GPS_UI',
                     'NANDFLASH_F35UQA',
                     'PPG_VC921X',
-                    'ROTARYENCODER_HX3509',
+                    'ROTARYENCODER_HX3508',
                     'FACTORYTEST_SERVICE',
                     # 'BLE_INSTRUCT'
                     
index 24e558a..aec596b 100644 (file)
@@ -330,8 +330,8 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
 #endif
 
 #ifdef ROTARYENCODER_U8
-    {   S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE,  crown_int_callback},
-    {   S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE,  crown_int_callback},
+    {   S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE,  crown_int_callback},
+    // {   S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE,  crown_int_callback},
 #endif
 
 };
index b15d665..b506e9c 100644 (file)
 extern void bp_int_callback(pin_t pin, uintptr_t param);
 #endif
 
+#ifdef PPG_GH3X2X
+extern void ppg_int_callback(pin_t pin, uintptr_t param);
+#endif
+
 /**
  * @addtogroup connectivity_config_boards
  * @{
@@ -208,10 +212,10 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
 //   #else
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM 马达控制脚 兼容预留马达驱动复位脚
 //   #endif
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R3     NC   
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE  },   // S_AGPIO_R3     NC   
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE  },    // S_AGPIO_R4     tp reset
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R5     touch int
-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_R6     PRG_INT 心率中断
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_AGPIO_R6     PRG_INT 心率中断
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R7     GYRO_INT2
 #ifdef ENABLE_GYRO
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_R8     GYRO_INT1
@@ -322,7 +326,10 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
     // {   S_AGPIO_L32, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
 #endif
 #ifdef ENABLE_BN02
-     {   S_AGPIO_R3, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_FALLING_EDGE, bp_int_callback },
+     {   S_AGPIO_R3, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, bp_int_callback },
+#endif
+#ifdef PPG_GH3X2X
+    // {   S_AGPIO_R6, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE,  ppg_int_callback},
 #endif
 };
 /**
index 9ea7761..a2e75cb 100644 (file)
@@ -364,7 +364,11 @@ static const system_mcu_perip_clk_t g_system_mcu_perp_clk_set_config[] = {
 \r
     /* Clocks M_CLKEN1 region */\r
     {HAL_CLOCKS_APP_TIMER_CLK, TURN_ON},       // timer clock\r
+#if defined(ENABLE_CUSTOM_SPI) \r
+    {HAL_CLOCKS_APP_SPI0_M_CLK, TURN_ON},     // spi0 clock\r
+#else\r
     {HAL_CLOCKS_APP_SPI0_M_CLK, TURN_OFF},     // spi0 clock\r
+#endif\r
     {HAL_CLOCKS_APP_SPI1_MS_CLK, TURN_OFF},    // spi1 clock\r
     {HAL_CLOCKS_APP_SPI2_MS_CLK, TURN_OFF},    // spi2 clock\r
     {HAL_CLOCKS_APP_UART_H0_CLK, TURN_ON},     // uart h0 clock\r
diff --git a/code/sdk/files/u8/fs/user/music/20-20KHZ.mp3 b/code/sdk/files/u8/fs/user/music/20-20KHZ.mp3
new file mode 100644 (file)
index 0000000..315109e
Binary files /dev/null and b/code/sdk/files/u8/fs/user/music/20-20KHZ.mp3 differ
index 2bc0c75..ed94c49 100644 (file)
@@ -50,6 +50,7 @@ typedef enum {
     PM_ID_CAT1,//Cat1 communication
     PM_ID_P_TEST,//产测
     PM_ID_BUTTON_GPIO,//gpio按键
+    PM_ID_BP,//血压
     PM_ID_MAX,
 } pm_id_t;
 
index 04a5764..9e6e113 100644 (file)
@@ -111,23 +111,31 @@ void pm_core_wait_uart_tx_idle(void)
 }
 #endif
 void pm_sikey_suspend(void) {
-    //ÐÄÂÊ£¬Âí´ï£¬¼ÓËÙ¼ÆÍâÉèµÄI2CͨµÀ¼Ä´æÆ÷±£´æ£¬¹ØÖжÏ
+    //���ʣ�������ټ������I2Cͨ���Ĵ������棬���ж�
     
     custom_i2c_suspend();
+#ifdef ENABLE_CUSTOM_SPI
+    custom_spi_suspend();
+#endif
     //ADD alipay I2C3 suspend, 
     alipay_suspend();
 }
 
 void pm_sikey_resume(void){
-    //ÐÄÂÊ£¬Âí´ï£¬¼ÓËÙ¼ÆÍâÉèµÄI2CͨµÀ¼Ä´æÆ÷µÄ»Ö¸´£¬¹ØÖжϣ¬ÖØÐÂÅäÖÃpinmux£¬ÖØÐ³õʼ»¯¡£
+    //���ʣ�������ټ������I2Cͨ���Ĵ����Ļָ������жϣ���������pinmux�����³�ʼ����
     custom_i2c_resume();
+
+#ifdef ENABLE_CUSTOM_SPI
+    custom_spi_resume();
+#endif
+
     alipay_resume();
 }
 void pm_core_suspend(void)
 {
 
 //.......................................................
-    pm_sikey_suspend(); //ÆäËûÍâÉè¼ÓÔÚÕâÀï
+    pm_sikey_suspend(); //���������������
 //.......................................................
 #if (ARCH == RISCV70)
     clic_suspend();
@@ -288,7 +296,7 @@ void pm_core_resume(void)
     pm_misc_regs_resume();
     pm_core_restore_reset_pc();
 //.......................................................
-    pm_sikey_resume(); //ÆäËûÍâÉè¼ÓÔÚÕâÀï
+    pm_sikey_resume(); //���������������
 //.......................................................
 }
 
index f68033a..ee9f6ea 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-06-07 11:18:25
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-07-24 11:56:54
+ * @LastEditTime: 2025-02-14 14:40:50
  * @FilePath: /FD230/code/sdk/application/wearable/fd230/nativeapp/nativeui/producttest/include/testmicrophoneC.h
  * @Description: 
  * 
@@ -18,7 +18,7 @@ extern "C"
 #endif
 #endif
     int32_t microhone_switch(bool isopen);
-    void check_spk(bool isopen);
+    void check_spk(uint8_t isopen);
     void check_mic(bool isopen);
 #ifdef __cplusplus
 #if __cplusplus
index 884005e..259d314 100644 (file)
@@ -117,7 +117,7 @@ namespace OHOS
         {
             for(int j=0;j<4;j++)
             {
-                if(x>116*j && x<116*(j+1) && y >116*i && y<116*(i+1))
+                if(x>Screen::GetInstance().GetWidth()/4*j && x<Screen::GetInstance().GetWidth()/4*(j+1) && y >Screen::GetInstance().GetHeight()/4*i && y<Screen::GetInstance().GetHeight()/4*(i+1))
                 {
                      button[i*4+j]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
                     RootView::GetInstance()->Invalidate();
@@ -140,7 +140,7 @@ namespace OHOS
         testTPScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
         //testTPScrollView->SetStyle(STYLE_BORDER_RADIUS, 0);
         testTPScrollView->SetViewId("TP_test");
-        testTPScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
+        testTPScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
         testTPScrollView->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
      
 
@@ -149,19 +149,19 @@ namespace OHOS
         ButtonConfig_ext_t buttonconfig;
         buttonconfig.x = 0;
         buttonconfig.y = 0;
-        buttonconfig.w = 116;
-        buttonconfig.h = 116;
+        buttonconfig.w = Screen::GetInstance().GetWidth()/4;
+        buttonconfig.h =Screen::GetInstance().GetHeight()/4;
         for (int i = 0; i < 4; i++)
         {
             for(int j=0;j<4;j++)
             {
            
                 buttonconfig.ViewId = viewid_str[i*4+j];
-                buttonconfig.x=116*j;
+                buttonconfig.x=Screen::GetInstance().GetWidth()/4*j;
                 button[i*4+j] = SetTheButton_ext(buttonconfig, touchListener);
                 testTPScrollView->Add(button[i*4+j]);
             }
-            buttonconfig.y+=116;
+            buttonconfig.y+=Screen::GetInstance().GetHeight()/4;
         }
         
        
index bc0861f..a1e71ea 100644 (file)
@@ -358,19 +358,36 @@ extern "C"
         }
     }
 
-    void check_spk(bool isopen)
+    void check_spk(uint8_t isopen)
     {
-        if(isopen)
+        if(isopen == 1)
         {
             // AlarmClockModel::GetInstance()->testPlayerStart("/user/userdata/microphone.mp3");
+            // FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
+            // AlarmClockModel::GetInstance()->AlarmPlayerStart();
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+            FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
+#else
             // FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/userdata/microphone.mp3");
             AlarmClockModel::GetInstance()->AlarmPlayerStart();
+#endif
+
         }
-        else
+        else if(isopen == 2)
+        {
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+            FindWatchViewEventListener::GetInstance().PopInterPlayMusic("/user/music/20-20KHZ.mp3");
+#endif
+        }
+        else if(!isopen)
         {
             // AlarmClockModel::GetInstance()->AlarmPlayerStop();
-            // FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
+#if defined(BOARD_FD230) || defined(BOARD_U8)
+            FindWatchViewEventListener::GetInstance().PopInterCancelMusic();
+#else
             AlarmClockModel::GetInstance()->AlarmPlayerStop();
+#endif
+            // AlarmClockModel::GetInstance()->AlarmPlayerStop();
         }
 
     }
index 16351bc..15776c1 100644 (file)
@@ -8,6 +8,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/bn02/bn02.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_at_cmd.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_service.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/service/bp_ble_service.c
 )
 
 set(PUBLIC_HEADER
index 4330510..6159755 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-16 12:35:15\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-17 14:35:00\r
+ * @LastEditTime: 2025-02-14 11:37:22\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
@@ -12,6 +12,8 @@
 #include "pinctrl_porting.h"\r
 #include "hal_gpio.h"\r
 #include "i2c.h"\r
+#include "pm_definition.h"\r
+#include "bp_ble_service.h"\r
 \r
 #define BN02_I2C_ADDR 0x05\r
 #define BN02_I2C_BUS I2C_BUS_0\r
 \r
 bool Bn02_write_reg(uint8_t data)\r
 {\r
+       uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    if (cnt == 0) \r
+    {\r
+        uapi_pm_add_sleep_veto(PM_ID_BP);\r
+    }\r
+\r
        i2c_data_t i2c_data;\r
        i2c_data.send_buf = &data;\r
     i2c_data.send_len = sizeof(data);\r
@@ -34,11 +42,24 @@ bool Bn02_write_reg(uint8_t data)
        if (ret != ERRCODE_SUCC)\r
         printf("i2c Write data write fail! ret=0x%x\n", ret);\r
 \r
+       cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    if (cnt == 1) \r
+    {\r
+        uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+    }\r
+\r
     return 1;\r
 }\r
 \r
 bool Bn02_reads(uint8_t *data,int len)\r
 {\r
+\r
+       uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    if (cnt == 0) \r
+    {\r
+        uapi_pm_add_sleep_veto(PM_ID_BP);\r
+    }\r
+\r
        i2c_data_t i2c_data;\r
        i2c_data.send_buf = NULL;\r
     i2c_data.send_len = 0;\r
@@ -49,6 +70,12 @@ bool Bn02_reads(uint8_t *data,int len)
        if (ret != ERRCODE_SUCC) \r
         printf("i2c read data fail! ret=0x%x\n", ret);\r
 \r
+       cnt = pm_veto_get_id_cnt(PM_ID_BP);\r
+    if (cnt == 1) \r
+    {\r
+        uapi_pm_remove_sleep_veto(PM_ID_BP);\r
+    }\r
+\r
        return 1;\r
 }\r
 \r
@@ -83,13 +110,30 @@ void Bn02_Power_Ctrl(int onoff)
        }\r
 }\r
 \r
+void bn02_int_init(void)\r
+{\r
+       uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE);\r
+}\r
+\r
+void bn02_int_deinit(void)\r
+{\r
+       uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE);\r
+}\r
+\r
 void bn02_int_handle(void)\r
 {\r
     uint8_t bn02_buf[48] = {0};\r
        int i;\r
        memset(bn02_buf,0,sizeof(bn02_buf));\r
        Bn02_reads(bn02_buf,48);\r
-       for(i = 0;i<48;i++)\r
+\r
+    if(bn02_get_ble_status())\r
+    {\r
+        bn02_replymsg(bn02_buf,sizeof(bn02_buf),1);\r
+    }\r
+\r
+\r
+    for(i = 0;i<48;i++)\r
        {\r
                printf("[%d]= 0x%x\n",i,bn02_buf[i]);\r
        }\r
@@ -98,13 +142,13 @@ void bn02_int_handle(void)
 void bn02_start(void)\r
 {\r
        Bn02_Power_Ctrl(1);\r
+       bn02_int_init();\r
        Bn02_write_reg(BN02_START_CMD);\r
 }\r
 \r
 void bn02_stop(void)\r
 {\r
+       bn02_int_deinit();\r
        Bn02_write_reg(BN02_STOP_CMD);\r
        Bn02_Power_Ctrl(0);\r
 }\r
-\r
-\r
diff --git a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
new file mode 100644 (file)
index 0000000..9a5c697
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:21
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-14 14:43:09
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+#include "stdint.h"
+#include "bn02.h"
+#include "custom_utils.h"
+#include "bp_service.h"
+#include "bp_ble_service.h"
+
+#define START_CODE 0x55
+#define PPG_DATA_SIZE 3
+#define PACKET_DATA_LENGTH (PPG_DATA_SIZE * 16)
+
+static uint8_t ble_status = 0;
+
+typedef struct ble_bp_data_t
+{
+    uint8_t start_code; //0x55
+    uint8_t main_func_code; //主功能码
+    uint8_t sub_func_code; //从功能码;
+    uint16_t  data_length; //标识和数据的长度之和
+    uint16_t flags; //标识
+    uint8_t* data;
+    uint8_t checksum; //验内容包括起始符、功能码、数据长度、标识、数据5个部分,取其和的最后8位作为校验和
+}ble_bp_data_t;
+
+
+static ble_bp_data_t ble_bp_data = {0};
+
+uint8_t bn02_get_ble_status(void)
+{
+    uint8_t status = ble_status;
+    return status;
+}
+
+uint8_t bn02_calculate_checksum(ble_bp_data_t frame) 
+{
+    uint8_t checksum = 0;
+    checksum += frame.start_code;
+    checksum += frame.main_func_code;
+    checksum += frame.sub_func_code;
+    checksum += (frame.data_length >> 8) & 0xFF; // 数据长度高字节
+    checksum += frame.data_length & 0xFF;        // 数据长度低字节
+    checksum += (frame.flags >> 8) & 0xFF;       // 标识高字节
+    checksum += frame.flags & 0xFF;              // 标识低字节
+
+    for (uint16_t i = 0; i < frame.data_length - 2; i++) { // 数据长度包含标识
+        checksum += frame.data[i];
+    }
+    return checksum;
+}
+
+errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size)
+{
+    if(buf != NULL && event_size>=(1+2+2+2+1+1))
+    {
+        memset_s(ble_bp_data,0,sizeof(ble_bp_data),0);
+        
+        ble_bp_data.start_code = buf[0];
+        ble_bp_data.main_func_code =  buf[1];
+        ble_bp_data.sub_func_code = buf[2];
+        ble_bp_data.data_length = (buf[3] << 8) + buf[4];
+        ble_bp_data.flags = (buf[5] << 8) + buf[6];
+        ble_bp_data.data = &buf[7];
+
+        if(buf[8] != bn02_calculate_checksum(ble_bp_data))
+            return ERRCODE_FAIL;
+
+        if(!(*ble_bp_data.data))
+        {
+            do_bp_service_check_msg(BP_SERVICE_CMD_START_CHECK);
+            ble_status = 1;
+        }
+
+        else
+        {   
+            do_bp_service_check_msg(BP_SERVICE_CMD_STOP_CHECK);
+            ble_status = 0;
+        }   
+
+
+    }
+    else
+    {
+        printf("buf is null or event_size < (1+2+2+2+1+1) \n");
+        return ERRCODE_FAIL;
+    }
+    return ERRCODE_SUCC;
+}
+
+errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags)
+{
+    errcode_t ret;
+    ble_bp_data.sub_func_code += 0x80;
+    ble_bp_data.data = input_data;
+    ble_bp_data.data_length = input_len + 2;
+
+    if(ble_bp_data.flags < (1 << 14))
+        ble_bp_data.flags++;
+
+    if(flags) 
+    {
+        ble_bp_data.flags |= (1 << 15);
+    }
+
+    ble_bp_data.checksum = bn02_calculate_checksum(ble_bp_data);
+
+    ret = ble_factorytest_server_send_input_report((uint8_t *)&ble_bp_data,sizeof(ble_bp_data));
+
+    return ret;
+}
diff --git a/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
new file mode 100644 (file)
index 0000000..ace1004
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-02-14 10:30:32
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-02-14 11:35:06
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+#ifndef _BP_BLE_SERVICE_H_
+#define _BP_BLE_SERVICE_H_
+
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#include "stdint.h"
+#include "errcode.h"
+
+errcode_t bn02_replymsg(uint8_t *input_data,uint16_t input_len,uint8_t flags);
+errcode_t bn02_parse_frame(uint8_t *buf, uint16_t event_size);
+uint8_t bn02_get_ble_status(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
\ No newline at end of file
index 1687590..352ef11 100644 (file)
@@ -54,6 +54,8 @@ typedef long long           GS64;   /**< 64bit signed integer type */
 #define GH3020_ID                           (0x00)\r
 #define GH3026_ID                           (0x01)\r
 \r
+#define GH3220_ID                           (0x03)\r
+\r
 #define GH3X2X_MP_DISABLE                   (0)\r
 #define GH3X2X_MP_ENABLE                    (1)\r
 \r
index f22e31a..4ccc448 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2025-01-13 10:11:20\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-17 15:57:59\r
+ * @LastEditTime: 2025-02-17 11:32:58\r
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
@@ -11,7 +11,7 @@
 #include "gh3x2x_afe_drv.h"\r
 \r
 \r
-#define   GH3X2X_CHIP_ID               GH3020_ID\r
+#define   GH3X2X_CHIP_ID               GH3220_ID\r
 #define   GH3X2X_AFE_MP_MODE           GH3X2X_MP_ENABLE\r
 \r
 \r
 /******  chip reset type config ***************************/\r
 #define GH3X2X_AFE_RESET_TYPE          GH3X2X_AFE_RESET_SOFTWARE\r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
+void hal_gh3x2x_afe_int_init(void);\r
+void hal_gh3x2x_afe_int_deinit(void);\r
 \r
 #endif\r
 \r
index 148fc99..211b1e0 100644 (file)
@@ -1,3 +1,11 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-01-13 11:45:20\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-02-12 10:50:38\r
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
 #include "gh3x2x_afe_ecg.h"\r
 #include "gh3x2x_afe_adt.h"\r
 #include "gh3x2x_afe_agc.h"\r
@@ -11,12 +19,14 @@ GU32 g_unFuncMode = GH3X2X_NO_FUNCTION;
 \r
 void GH3X2X_AFE_StartFunction(GU32 unFuncMode)\r
 {\r
+    //红外佩戴检测\r
     if(unFuncMode & (GH3X2X_FUNCTION_ADT))\r
     {\r
-                   GH3x2xAdtAlgoInit();\r
+        GH3x2xAdtAlgoInit();\r
         GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,1);\r
     }\r
        \r
+    //心电图\r
     if(unFuncMode & (GH3X2X_FUNCTION_ECG))\r
     {\r
         GH3X2X_LeadOffDetectInit();                    \r
@@ -38,7 +48,7 @@ void GH3X2X_AFE_StopFunction(GU32 unFuncMode)
     if(unFuncMode & (GH3X2X_FUNCTION_ADT))\r
     {\r
         GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,0);\r
-                   GH3x2xAdtAlgoDeinit();\r
+        GH3x2xAdtAlgoDeinit();\r
     }\r
     if(unFuncMode & (GH3X2X_FUNCTION_ECG))\r
     {\r
index b0e72b3..0d66772 100644 (file)
@@ -375,8 +375,7 @@ void GH3X2X_AFE_I2cSendCmd(GU8 uchCmd)
     uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR);\r
     uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR);\r
     uchBuffArr[2] = uchCmd;\r
-    hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 3);\r
-    // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, GH3X2X_AFE_I2C_CMD_ADDR, 1 , &uchCmd, 1, GH3X2X_I2C_BUS);\r
+    hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 3);\r
 }\r
 \r
 /**\r
@@ -400,8 +399,7 @@ void GH3X2X_AFE_I2cWriteReg(GU16 usRegAddr, GU16 usRegValue)
     uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
     uchBuffArr[2] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegValue);\r
     uchBuffArr[3] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegValue);\r
-    hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 4);\r
-    // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , &usRegValue, szieof(usRegValue), GH3X2X_I2C_BUS);\r
+    hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 4);\r
 }\r
 \r
 \r
@@ -425,9 +423,7 @@ GU16 GH3X2X_AFE_I2cReadReg(GU16 usRegAddr)
 \r
     uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
     uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
-    hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, uchReadBuffArr, 2);\r
-\r
-    // custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , uchReadBuffArr, sizeof(uchReadBuffArr), GH3X2X_I2C_BUS);\r
+    hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, uchReadBuffArr, 2);\r
 \r
     return GH3X2X_AFE_MAKEUP_WORD(uchReadBuffArr[0], uchReadBuffArr[1]);\r
 }\r
@@ -450,13 +446,11 @@ void GH3X2X_I2cReadRegs(GU16 usRegAddr, GU16 *pusRegValueArr, GU8 uchLen)
 {\r
     GU8 uchBuffArr[2] = {0};\r
 \r
-    // uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
-    // uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
-\r
-    custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr,1, pusRegValueArr, uchLen ,GH3X2X_I2C_BUS);\r
+    uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr);\r
+    uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr);\r
 \r
-    // hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 2, \\r
-    //                     (GU8 *)pusRegValueArr, uchLen * 2);\r
+    hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 2, \\r
+                        (GU8 *)pusRegValueArr, uchLen * 2);\r
     GH3X2X_SwapLittleBigEndianData((GU8 *)pusRegValueArr, (GU16)uchLen * 2);\r
 }\r
 \r
@@ -482,7 +476,7 @@ void GH3X2X_AFE_I2cReadFifo(GU8 *puchDataBuffer, GU16 usLen)
 \r
     uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR);\r
     uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR);\r
-    hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, puchDataBuffer, usLen);\r
+    hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, puchDataBuffer, usLen);\r
 }\r
 \r
 #endif\r
@@ -680,7 +674,7 @@ void GH3X2X_AFE_CommunicateConfirm(void)
     }\r
     else\r
     {\r
-        GH3X2X_INFO_LOG("[%s]ready code reg is error !!! \r\n", __FUNCTION__);\r
+        GH3X2X_INFO_LOG("[%s]ready code reg is error !!! 0x%x\r\n", __FUNCTION__,GH3X2X_AFE_READ_REG(GH3X2X_AFE_REG_CHIP_READY_CODE_REG_ADDR));\r
         while(1);\r
     }\r
 \r
@@ -1326,7 +1320,7 @@ GS8 GH3X2X_AFE_CheckChipId(void)
     GS8 chipd_id = GH3X2X_AFE_GetChipId();\r
        if(GH3X2X_CHIP_ID != chipd_id)\r
        {\r
-               GH3X2X_INFO_LOG("wrong chip id!!\r\n");\r
+               GH3X2X_INFO_LOG("wrong chip id!! 0x%x\r\n",chipd_id);\r
                chRet = GH3X2X_AFE_RET_GENERIC_ERROR;\r
        }\r
     else\r
index 8190fed..291208e 100644 (file)
 #include "gh3x2x_demo_goodix_PLATFORM.h"\r
 #else\r
 \r
+\r
 #include "spi.h"\r
 \r
+#include "custom_utils.h"\r
+\r
 #define GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length)\r
 #define GOODIX_PLATFORM_SPI_READ_ENTITY()\r
 #define GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY()\r
@@ -39,6 +42,8 @@
 #define GH3X2X_MOSI S_MGPIO1\r
 #define GH3X2X_MISO S_MGPIO0\r
 \r
+#define H_INT S_AGPIO_R6\r
+\r
 #define GH3X2X_SPI_BUS SPI_BUS_0\r
 #define GH3X2X_I2C_BUS I2C_BUS_2\r
 \r
@@ -128,35 +133,9 @@ void hal_gh3x2x_afe_i2c_init(void)
  */\r
 GU8 hal_gh3x2x_afe_i2c_write(GU8 device_id, const GU8 write_buffer[], GU16 length)\r
 {\r
-    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
-    if (cnt == 0) \r
-    {\r
-        uapi_pm_add_sleep_veto(PM_ID_HEART);\r
-    }\r
-    uint8_t ret = 1;\r
-\r
-    /* code implement by user */\r
-\r
-    // GOODIX_PLATFORM_I2C_WRITE_ENTITY(device_id, write_buffer,length);\r
-    i2c_data_t i2c_data;\r
-       i2c_data.send_buf = write_buffer;\r
-    i2c_data.send_len = length;\r
-    i2c_data.receive_buf = NULL;\r
-    i2c_data.receive_len = 0;\r
-       // custom_i2c_write_reg(BN02_I2C_ADDR, 0x00, 1, &data, 1, BN02_I2C_BUS);\r
-       errcode_t result = uapi_i2c_master_write(GH3X2X_I2C_BUS, device_id, &i2c_data);\r
-       if (result != ERRCODE_SUCC) \r
-        printf("i2c write data fail! ret=0x%x\n", result);\r
-    // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS);\r
-\r
-    cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
-    if (cnt == 1) \r
-    {\r
-        uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
-    }\r
-\r
-\r
-    return ret;\r
+    // custom_i2c_transfer(0x14,write_buffer, length, NULL, 0, GH3X2X_I2C_BUS);\r
+    custom_i2c_write_reg(0x14, 0, 0, write_buffer, length, GH3X2X_I2C_BUS);\r
+    return 1;\r
 }\r
 \r
 /**\r
@@ -179,35 +158,8 @@ GU8 hal_gh3x2x_afe_i2c_write(GU8 device_id, const GU8 write_buffer[], GU16 lengt
  */\r
 GU8 hal_gh3x2x_afe_i2c_read(GU8 device_id, const GU8 write_buffer[], GU16 write_length, GU8 read_buffer[], GU16 read_length)\r
 {\r
-    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
-    if (cnt == 0) \r
-    {\r
-        uapi_pm_add_sleep_veto(PM_ID_HEART);\r
-    }\r
-    uint8_t ret = 1;\r
-\r
-    /* code implement by user */\r
-\r
-    // GOODIX_PLATFORM_I2C_READ_ENTITY(device_id, write_buffer, write_length, read_buffer, read_length);\r
-\r
-    i2c_data_t i2c_data;\r
-       i2c_data.send_buf = write_buffer;\r
-    i2c_data.send_len = write_length;\r
-    i2c_data.receive_buf = read_buffer;\r
-    i2c_data.receive_len = read_length;\r
-\r
-       errcode_t result = uapi_i2c_master_writeread(GH3X2X_I2C_BUS, device_id, &i2c_data);\r
-       if (result != ERRCODE_SUCC) \r
-        printf("i2c read data fail! ret=0x%x\n", result);\r
-    // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS);\r
-\r
-    cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
-    if (cnt == 1) \r
-    {\r
-        uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
-    }\r
-\r
-    return ret;\r
+    custom_i2c_transfer(0x14,write_buffer, write_length, read_buffer, read_length, GH3X2X_I2C_BUS);\r
+    return 1;\r
 }\r
 \r
 #else \r
@@ -229,24 +181,7 @@ GU8 hal_gh3x2x_afe_i2c_read(GU8 device_id, const GU8 write_buffer[], GU16 write_
 void hal_gh3x2x_afe_spi_init(void)\r
 {\r
     /* init spi and cs pin */\r
-    // GOODIX_PLATFORM_SPI_INIT_ENTITY();\r
-    spi_bus_t bus;\r
-    spi_attr_t attr;\r
-    bus = SPI_BUS_0;\r
-    attr.is_slave = false;\r
-    attr.slave_num = 1;\r
-    attr.bus_clk = 40000000;\r
-    attr.freq_mhz = 10;\r
-    attr.clk_polarity = (uint32_t)SPI_CFG_CLK_CPOL_1;\r
-    attr.clk_phase = (uint32_t)SPI_CFG_CLK_CPHA_1;\r
-    attr.frame_format = SPI_CFG_FRAME_FORMAT_MOTOROLA_SPI;\r
-    attr.spi_frame_format = (uint32_t)HAL_SPI_FRAME_FORMAT_STANDARD;\r
-    attr.frame_size = (uint32_t)HAL_SPI_FRAME_SIZE_8;\r
-    attr.tmod = HAL_SPI_TRANS_MODE_TXRX;\r
-    attr.sste = SPI_CFG_SSTE_DISABLE;\r
-    attr.ndf = 1;\r
-\r
-    uapi_spi_init(bus,&attr,NULL);\r
+    GOODIX_PLATFORM_SPI_INIT_ENTITY();\r
 }\r
 \r
 /**\r
@@ -267,9 +202,14 @@ void hal_gh3x2x_afe_spi_init(void)
  */\r
 GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length)\r
 {\r
-    GU8 ret = 1;\r
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+    if (cnt == 0) \r
+    {\r
+        uapi_pm_add_sleep_veto(PM_ID_HEART);\r
+    }\r
+\r
+    errcode_t ret;\r
 \r
-    \r
     //   GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length);\r
     spi_xfer_data_t sdata ={0} ;\r
        sdata.tx_buff = write_buffer;\r
@@ -277,10 +217,17 @@ GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length)
        sdata.rx_buff = NULL;\r
        sdata.rx_bytes = 0;\r
 \r
-    ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0x100);\r
+    ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+    if (ret != ERRCODE_SUCC) \r
+        printf("spi write data fail! ret=0x%x\n", ret);\r
 \r
+    cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+    if (cnt == 1) \r
+    {\r
+        uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
+    }\r
 \r
-    return ret;\r
+    return 1;\r
 }\r
 \r
 \r
@@ -301,7 +248,13 @@ GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length)
  */\r
 GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length)\r
 {\r
-    GU8 ret = 1;\r
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+    if (cnt == 0) \r
+    {\r
+        uapi_pm_add_sleep_veto(PM_ID_HEART);\r
+    }\r
+\r
+    errcode_t ret;\r
     // GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
     // GH3X2X_AFE_UNUSED_VAR(length);\r
     // GOODIX_PLATFORM_SPI_READ_ENTITY();\r
@@ -312,9 +265,15 @@ GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length)
        sdata.rx_buff = read_buffer;\r
        sdata.rx_bytes = length;\r
 \r
-    ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0x100);\r
+    ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+\r
+    cnt = pm_veto_get_id_cnt(PM_ID_HEART);\r
+    if (cnt == 1) \r
+    {\r
+        uapi_pm_remove_sleep_veto(PM_ID_HEART);\r
+    }\r
 \r
-    return ret;\r
+    return 1;\r
 }\r
 #elif (GH3X2X_AFE_SPI_TYPE == GH3X2X_AFE_SPI_HARDWEAR_CS)\r
 /**\r
@@ -333,12 +292,28 @@ GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length)
  */\r
 GU8 hal_gh3x2x_afe_spi_write_F1_and_read(GU8 read_buffer[], GU16 length)\r
 {\r
-    GU8 ret = 1;\r
-    GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
-    GH3X2X_AFE_UNUSED_VAR(length);\r
-    GOODIX_PLATFORM_SPI_READ_ENTITY();\r
+    // GU8 ret = 1;\r
+    // GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
+    // GH3X2X_AFE_UNUSED_VAR(length);\r
+    // GOODIX_PLATFORM_SPI_READ_ENTITY();\r
     \r
-    return ret;\r
+    // return ret;\r
+\r
+    errcode_t ret = 1;\r
+    // GH3X2X_AFE_UNUSED_VAR(read_buffer);\r
+    // GH3X2X_AFE_UNUSED_VAR(length);\r
+    // GOODIX_PLATFORM_SPI_READ_ENTITY();\r
+\r
+    spi_xfer_data_t sdata ={0} ;\r
+       sdata.tx_buff = NULL;\r
+       sdata.tx_bytes = 0;\r
+       sdata.rx_buff = read_buffer;\r
+       sdata.rx_bytes = length;\r
+\r
+    ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF);\r
+    if (ret != ERRCODE_SUCC) \r
+        printf("spi read data fail! ret=0x%x\n", ret);\r
+    return 1;\r
 }\r
 #endif\r
 \r
@@ -363,7 +338,7 @@ void hal_gh3x2x_afe_spi_cs_ctrl(GU8 cs_pin_level)
     // GH3X2X_AFE_UNUSED_VAR(cs_pin_level);\r
     // GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY();\r
 \r
-    uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+    uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_SPI0);\r
     uapi_gpio_set_dir(GH3X2X_CS, GPIO_DIRECTION_OUTPUT);\r
     uapi_gpio_set_val(GH3X2X_CS, cs_pin_level);\r
 \r
@@ -430,7 +405,14 @@ void hal_gh3x2x_afe_reset_pin_ctrl(GU8 pin_level)
 \r
 void hal_gh3x2x_afe_int_init(void)\r
 {\r
-    GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+    // GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+    uapi_pin_set_ie(H_INT,HAL_PIO_IE_ENBALE);\r
+}\r
+\r
+void hal_gh3x2x_afe_int_deinit(void)\r
+{\r
+    // GOODIX_PLATFORM_INT_INIT_ENTITY();\r
+    uapi_pin_set_ie(H_INT,HAL_PIO_IE_DISABLE);\r
 }\r
 \r
 #if (GH3X2X_AFE_PRO_BY_INT == GH3X2X_AFE_PRO_TYPE)\r
@@ -452,7 +434,7 @@ void hal_gh3x2x_afe_int_handler_call_back(void)
        GH3X2X_AFE_SetNeedWakeUpGh3x2xFlag(0);  //not need wake up gh3x2x_afe when process int event\r
        g_uchGh3x2xAfeIntCallBackIsCalled = 1;\r
 #if GH3X2X_AFE_MP_MODE\r
-       GH3X2X_MP_SET_INT_FLAG();  //gh3x2x mp test must call it\r
+       // GH3X2X_MP_SET_INT_FLAG();  //gh3x2x mp test must call it\r
 #endif\r
 /****************** DO NOT MODITY ****************************************************************/\r
     \r
index d1eea6e..5a6f1ec 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-01-17 17:57:09
+ * @LastEditTime: 2025-02-18 14:35:27
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c
  * @Description: 
  * 
@@ -17,6 +17,8 @@
 #include "pm_control.h"
 #include "pinctrl_porting.h"
 #include "hal_gpio.h"
+#include "gh3x2x_afe_user.h"
+#include "gh3x2x_afe_demo.h"
 
 // S_AGPIO_L26 心率复位 PPG reset
 #define GPIO_PIN_PRG_RESET S_AGPIO_L26
 
 uint32_t tyhx_poweron(void)
 {
-    
+    uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
+    uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
+    uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH);
+    LOS_Mdelay(10);
     uapi_pin_set_mode(S_AGPIO_L24, (pin_mode_t)HAL_PIO_FUNC_GPIO);
     uapi_gpio_set_dir(S_AGPIO_L24, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(S_AGPIO_L24, GPIO_LEVEL_LOW);
-    LOS_Mdelay(1);
+    LOS_Mdelay(10);
     uapi_pin_set_mode(S_MGPIO0, (pin_mode_t)HAL_PIO_FUNC_GPIO);
     uapi_gpio_set_dir(S_MGPIO0, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(S_MGPIO0, GPIO_LEVEL_LOW);
-    LOS_Mdelay(1);
-    uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
-    uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
-    uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH);
-    LOS_Mdelay(1);
+    LOS_Mdelay(10);
     uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO);
     uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_HIGH);
-   
-    LOS_Mdelay(50);
+    LOS_Mdelay(10);
     return 0;
 }
 uint32_t tyhx_poweroff(void)
 {
+    hal_gh3x2x_afe_int_deinit();
+    
     uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO);
     uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_LOW);
@@ -54,61 +56,50 @@ uint32_t tyhx_poweroff(void)
     uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO);
     uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_LOW);
-    LOS_Mdelay(50);
+    LOS_Mdelay(10);
     return 0;
 }
 
 void ppg_send_cmd_to_gh3x2x_driver(char* mode, uint8_t enable)
 {
-    // work_mode md = 1;
-    // if (strcmp(mode, "hrs") == 0) {
-    //     md = WORK_MODE_HR;
-    // } else if (strcmp(mode, "hrv") == 0) {
-    //     md = WORK_MODE_HRV;
-    // } else if (strcmp(mode, "spo2") == 0) {
-    //     md = WORK_MODE_SPO2;
-    // } else if (strcmp(mode, "leaklight") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // } else if (strcmp(mode, "graycard") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // } else if (strcmp(mode, "ledoff") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // } else if (strcmp(mode, "wear") == 0) {
-    //     md = WORK_MODE_WEAR;
-    // } else if (strcmp(mode, "single") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // }else if (strcmp(mode, "factory") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // }else if (strcmp(mode, "fpc") == 0) {
-    //     md = WORK_MODE_UNDEFINED;
-    // }else if (strcmp(mode, "int") == 0) {
-    //     if(vc921x_device)
-    //         vc921x_device->ops->dev_irq_handler(0,0);
-    //     return;
-    // } 
 
-    // if (enable == 1)
-    // {
-    //     // ppg_service_running_stat = true;
-    //     uapi_pm_control(PM_APP_WAKE_NEEDED);
-    //     tyhx_poweron();
+    uint32_t md = 1;
+    if (strcmp(mode, "hrs") == 0) {
+        md = 0;
+    } else if (strcmp(mode, "hrv") == 0) {
+        md = 1;
+    } else if (strcmp(mode, "spo2") == 0) {
+        md = 2;
+    } else if (strcmp(mode, "leaklight") == 0) {
+        md = 4;
+    } else if (strcmp(mode, "graycard") == 0) {
+        md = 8;
+    } else if (strcmp(mode, "ledoff") == 0) {
+        md = 16;
+    } else if (strcmp(mode, "wear") == 0) {
+        md = 32;
+    } else if (strcmp(mode, "single") == 0) {
+        md = 64;
+    }else if (strcmp(mode, "factory") == 0) {
+        md = 128;
+    }else if (strcmp(mode, "fpc") == 0) {
+        // md = WORK_MODE_UNDEFINED;
+    }else if (strcmp(mode, "int") == 0) {
+    } 
 
-    //     vc921x_device = get_vc921x_device();
-    //     if(!vc921x_device)
-    //     {
-    //         printf("get_vc921x_device failed !!!\n");
-    //         tyhx_poweroff();
-    //         return;
-    //     }
-    //     InitParamTypeDef pInit_Param = {0};
-    //     pInit_Param.sampling_gap_time = 400;
-    //     pInit_Param.work_mode = md;
-    //     vc921x_device->ops->dev_init(&pInit_Param);
+    if (enable == 1)
+    {
+        // ppg_service_running_stat = true;
+        uapi_pm_control(PM_APP_WAKE_NEEDED);
+        tyhx_poweron();
+        // GH3X2X_AFE_StartFunction(mode);
+        GH3X2X_AFE_Init();
+        GH3X2X_AFE_StartSampling(1);
 
-    // } else {
+    } else {
         
-    //     uapi_pm_control(PM_APP_WAKE_NONEED);
-    //     vc921x_device->ops->stop_work();
-    //     tyhx_poweroff();
-    // } 
+        uapi_pm_control(PM_APP_WAKE_NONEED);
+        GH3X2X_AFE_StopSampling();
+        tyhx_poweroff();
+    } 
 }
\ No newline at end of file
index 7644bda..72492c7 100644 (file)
@@ -381,6 +381,9 @@ static void ppg_service_check_task(void  *arg)
             cmd = "int";
             enable = 1;
             ppg_send_cmd_to_vc921x_driver(cmd,enable);
+#elif defined PPG_GH3X2X
+            hal_gh3x2x_afe_int_handler_call_back();
+            GH3X2X_AFE_ChipPro();
 #endif
             continue;
         }
@@ -410,6 +413,8 @@ static void ppg_service_check_task(void  *arg)
        ppg_send_cmd_to_vc9202_driver(cmd,enable);
 #elif defined(PPG_VC921X)
     ppg_send_cmd_to_vc921x_driver(cmd,enable);
+#elif defined(PPG_GH3X2X)
+    ppg_send_cmd_to_gh3x2x_driver(cmd,enable);
 #endif
 
     if(enable == 1)
index 3c8a501..2553256 100644 (file)
@@ -17,17 +17,17 @@ set(PUBLIC_DEFINES
 SUPPORT_AT_HX3507
 )
 
-elseif("ROTARYENCODER_HX3509" IN_LIST DEFINES)
+elseif("ROTARYENCODER_HX3508" IN_LIST DEFINES)
 set(SOURCES
-    ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/tyhx_OTS_hx3509_custom.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/hx3509_hal.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/hx3509_at_cmd.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/tyhx_OTS_hx3508_custom.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/hx3508_hal.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/hx3508/hx3508_at_cmd.c
 )
 set(PUBLIC_HEADER
-    ${CMAKE_CURRENT_SOURCE_DIR}/hx3509
+    ${CMAKE_CURRENT_SOURCE_DIR}/hx3508
 )
 set(PUBLIC_DEFINES
-SUPPORT_AT_HX3509
+SUPPORT_AT_HX3508
 )
 
 elseif("ROTARYENCODER_U8" IN_LIST DEFINES)
index 0b3aeb6..ab3ae6f 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-31 10:20:16
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-10 11:48:37
+ * @LastEditTime: 2025-02-18 17:52:31
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
@@ -40,24 +40,20 @@ void crown_int_callback(pin_t pin, uintptr_t param)
 {
     uapi_gpio_clear_interrupt(pin);
 
-    if(pin == PIN_TYHX_SDIO)
+    if (pin == PIN_TYHX_SDIO) 
     {
-        if (uapi_gpio_get_val(PIN_TYHX_SCLK)) 
-        {
-            direction = 2; // 顺时针旋转
-            crown_diff--;
-        }
-    } 
-    else if (pin == PIN_TYHX_SCLK) 
-    {
-        if (uapi_gpio_get_val(PIN_TYHX_SDIO))  
-        {
+        gpio_level_t pin_sclk_state = uapi_gpio_get_val(PIN_TYHX_SCLK);
+        gpio_level_t pin_sdio_state = uapi_gpio_get_val(PIN_TYHX_SDIO);
+
+        if (pin_sclk_state == pin_sdio_state) {
             direction = 1; // 逆时针旋转
             crown_diff++;
+        } else {
+
+            direction = 2; // 顺时针旋转
+            crown_diff--;
         }
     }
-    // PRINT("pin : %d , direction : %d , crown_diff : %d \n",pin,direction,crown_diff);
-
 }
 
 int16_t crown_get_stand_still(void)
@@ -82,7 +78,7 @@ void crown_start(void)
     {
         uapi_pin_set_ie(PIN_TYHX_SDIO,HAL_PIO_IE_ENBALE);
         uapi_pin_set_ie(PIN_TYHX_SCLK,HAL_PIO_IE_ENBALE);
-        // app_timer_start(g_hx3509_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
+        // app_timer_start(g_hx3508_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
         osTimerStart(g_crown_timer,50);
         crown_timer_running = true;
     }
@@ -108,7 +104,7 @@ void crown_timer_handler(void)
     else
     {
         stand_still = 0;
-        crown_result = crown_diff * 30;
+        crown_result = crown_diff * 20;
         crown_diff = 0;
         // PRINT("crown_result : %d direction : %d\n",crown_result,direction);
         if (g_encoder_callback != NULL)
@@ -2,30 +2,30 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-18 10:23:22
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-02 16:20:33
- * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3509/hx3509_at_cmd.c
+ * @LastEditTime: 2025-02-05 09:23:52
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3508/hx3508_at_cmd.c
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
 
-// #include "hx3509.h"
+// #include "hx3508.h"
 
 
 #include "at_cmd_api.h"
 #include "pm_control.h"
 #include "debug_print.h"
-#include "tyhx_OTS_hx3509_custom.h"
+#include "tyhx_OTS_hx3508_custom.h"
 #include "custom_utils.h"
 
 
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
-#define HX3509_MAX_ARGC            8
-#define HX3509_MAX_ARGV_LEN        64
+#define HX3508_MAX_ARGC            8
+#define HX3508_MAX_ARGV_LEN        64
 
-#define HX3509_SUCCESS             0
-#define HX3509_FAILED              (-1)
+#define HX3508_SUCCESS             0
+#define HX3508_FAILED              (-1)
 
 static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
-        uint8_t argv[HX3509_MAX_ARGC][HX3509_MAX_ARGV_LEN], uint32_t* argc)
+        uint8_t argv[HX3508_MAX_ARGC][HX3508_MAX_ARGV_LEN], uint32_t* argc)
 {
     uint32_t pos = 0;
     *argc = 0;
@@ -35,14 +35,14 @@ static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
             argv[*argc][pos] = '\0';
             *argc += 1;
             pos = 0;
-            if (*argc >= HX3509_MAX_ARGC) {
-                return HX3509_FAILED;
+            if (*argc >= HX3508_MAX_ARGC) {
+                return HX3508_FAILED;
             }
         } else {
             argv[*argc][pos] = para[i];
             pos++;
-            if (pos >= HX3509_MAX_ARGV_LEN) {
-                return HX3509_FAILED;
+            if (pos >= HX3508_MAX_ARGV_LEN) {
+                return HX3508_FAILED;
             }
         }
     }
@@ -50,56 +50,56 @@ static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
         *argc += 1;
     }
 
-    return HX3509_SUCCESS;
+    return HX3508_SUCCESS;
 }
 
-static uint8_t g_hx3509_test_started = 0;
-static uint32_t hx3509_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+static uint8_t g_hx3508_test_started = 0;
+static uint32_t hx3508_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
 {
     UNUSED(strCommonCmd);
-    uint8_t argv[HX3509_MAX_ARGC][HX3509_MAX_ARGV_LEN] = { 0 };
+    uint8_t argv[HX3508_MAX_ARGC][HX3508_MAX_ARGV_LEN] = { 0 };
     uint32_t argc = 0;
 
     int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
-    if (ret != HX3509_SUCCESS) {
-        PRINT("HX3509TEST ATCMD Convert Command Failed\n");
+    if (ret != HX3508_SUCCESS) {
+        PRINT("HX3508TEST ATCMD Convert Command Failed\n");
         return ERRCODE_FAIL;
     }
 
     if (argc != 1) {
-        PRINT("HX3509TEST ATCMD Set Parameter Failed argc %d\n",argc);
+        PRINT("HX3508TEST ATCMD Set Parameter Failed argc %d\n",argc);
         return ERRCODE_FAIL;
     }
     uint8_t start = (uint8_t)atoi((char*)argv[0]);
     if (start == 1)
     {
-        // if (g_hx3509_test_started == 1) 
+        // if (g_hx3508_test_started == 1) 
         // {
-        //     PRINT("SKIP hx3509test start, already started\r\n");
+        //     PRINT("SKIP hx3508test start, already started\r\n");
         //     return 0;
         // }
         ots_init();
         // ots_start();
-        g_hx3509_test_started = 1;
+        g_hx3508_test_started = 1;
     }else if (start == 2){
-        if (g_hx3509_test_started == 0) 
+        if (g_hx3508_test_started == 0) 
         {
-            PRINT("SKIP hx3509test stop, already stopped\r\n");
+            PRINT("SKIP hx3508test stop, already stopped\r\n");
             return 0;
         }
         ots_stop();
-        g_hx3509_test_started = 0 ;
+        g_hx3508_test_started = 0 ;
     }else{
         custom_exit_lpm();
     }
     return ERRCODE_SUCC;
 }
-static const at_cmd_table_t g_hx3509_cmd[] = {
-    { (char *)"AT^HX3509TEST",      hx3509_test, (char *)"1" },
+static const at_cmd_table_t g_hx3508_cmd[] = {
+    { (char *)"AT^HX3508TEST",      hx3508_test, (char *)"1" },
 };
 
-at_cmd_table_t *get_hx3509_cmd_table(uint32_t *cmd_count)
+at_cmd_table_t *get_hx3508_cmd_table(uint32_t *cmd_count)
 {
-    *cmd_count = ARRAY_COUNT(g_hx3509_cmd);
-    return (at_cmd_table_t *)g_hx3509_cmd;
+    *cmd_count = ARRAY_COUNT(g_hx3508_cmd);
+    return (at_cmd_table_t *)g_hx3508_cmd;
 }
@@ -2,8 +2,8 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-18 10:23:22
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-12-18 10:32:32
- * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3509/hx3509_at_cmd.h
+ * @LastEditTime: 2025-02-05 09:25:32
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3508/hx3508_at_cmd.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
 /**
@@ -14,8 +14,8 @@
  * History: \n
  * 2022-07-20, Create file. \n
  */
-#ifndef HX3509_AT_PROCESS_H
-#define HX3509_AT_PROCESS_H
+#ifndef HX3508_AT_PROCESS_H
+#define HX3508_AT_PROCESS_H
 
 #include <stdint.h>
 #include <stdio.h>
@@ -29,7 +29,7 @@ extern "C" {
 #endif /* __cplusplus */
 #endif /* __cplusplus */
 
-at_cmd_table_t *get_hx3509_cmd_table(uint32_t *cmd_count);
+at_cmd_table_t *get_hx3508_cmd_table(uint32_t *cmd_count);
 
 #ifdef __cplusplus
 #if __cplusplus
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.c
new file mode 100644 (file)
index 0000000..3a909b7
--- /dev/null
@@ -0,0 +1,131 @@
+#include "at_cmd_api.h"
+#include "pm_control.h"
+#include "tyhx_OTS_hx3508_custom.h"
+#include "rotary_encoder_def.h"
+#include "i2c.h"
+#include "debug_print.h"
+#include "hal_i2c.h"
+
+static uint8_t g_hx3508_test_started = 0;
+encoder_callback g_encoder_callback = NULL;
+uint32_t hx3508_start(void)
+{
+    if (g_hx3508_test_started == 1) 
+    {
+        re_print("SKIP hx3508test start, already started\r\n");
+        return 0;
+    }
+    ots_init();
+    ots_start();
+    g_hx3508_test_started = 1;
+    return ERRCODE_SUCC;
+}
+uint32_t hx3508_stop(void)
+{
+    if (g_hx3508_test_started == 0) 
+    {
+        re_print("SKIP hx3508test stop, already stopped\r\n");
+        return 0;
+    }
+    ots_stop();
+    g_hx3508_test_started = 0 ;
+    return ERRCODE_SUCC;
+}
+
+static ext_errno hx3508_encoder_init(void *attr)
+{
+    re_print("hx3508_encoder_init\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_deinit(void)
+{
+    re_print("hx3508_encoder_deinit\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len)
+{
+
+    if (data_len != sizeof(re_input_event_info))
+        return EXT_ERR_NOT_SUPPORT;
+    re_input_event_info *encoder_info = (re_input_event_info*)data;
+    int16_t diff = hx3508_get_crown_result();
+    int16_t stand_still = hx3508_get_stand_still();
+    // re_print("hx3508_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still);
+    if (stand_still == 1 )
+    {
+        encoder_info->re_event = MC_RE_COVER;
+    }else {
+        encoder_info->re_event = MC_RE_MOVE;
+    }
+    encoder_info->re_event_info.x_axis[0] = diff;
+    encoder_info->re_event_info.y_axis[0] = diff;
+    encoder_info->re_event_info.z_axis[0] = diff;
+    encoder_info->finger_id = 0 ;
+    encoder_info->point_num = 0 ;
+    encoder_info->tv_usec = (uint32_t)uapi_tcxo_get_ms();
+    //re_print("hx3508_encoder_get_encoderinfo  %s rotate %d\r\n",encoder_info->re_event == MC_RE_SLIDE_UP?"MC_RE_SLIDE_UP":"MC_RE_SLIDE_DOWN",diff);
+
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_suspend(void)
+{
+    re_print("hx3508_encoder_suspend\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_resume(void)
+{
+    re_print("hx3508_encoder_resume\r\n");
+    hx3508_start();
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_sleep(void)
+{
+    re_print("hx3508_encoder_sleep\r\n");
+    hx3508_stop();
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_reset(void)
+{
+    re_print("hx3508_encoder_reset\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_encoder_bus_init(void *private_data)
+{
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_register_callback(void *peri_data, encoder_callback func)
+{
+    re_print("hx3508_register_callback\r\n");
+    g_encoder_callback = func;
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno hx3508_unregister_callback(void *peri_data)
+{
+    re_print("hx3508_unregister_callback\r\n");
+    g_encoder_callback = NULL;
+    return EXT_ERR_SUCCESS;
+}
+
+encoder_peripheral_api g_hx3508_api = {
+    .encoder_init = hx3508_encoder_init,
+    .encoder_deinit = hx3508_encoder_deinit,
+    .encoder_get_encoderinfo = hx3508_encoder_get_encoderinfo,
+    .encoder_suspend = hx3508_encoder_suspend,
+    .encoder_resume = hx3508_encoder_resume,
+    .encoder_sleep = hx3508_encoder_sleep,
+    .encoder_reset = hx3508_encoder_reset,
+    .encoder_bus_init = hx3508_encoder_bus_init,
+    .register_callback = hx3508_register_callback,
+    .unregister_callback = hx3508_unregister_callback,
+};
+
+
+void *rotary_encoder_get_hx3508_api(void)
+{
+    return ((void *)&g_hx3508_api);
+}
+
+void *rotary_encoder_get_hx3508_peri_attr(void)
+{
+    return ((void *)NULL);
+}
\ No newline at end of file
@@ -3,7 +3,7 @@
  * @Date: 2024-12-23 15:11:25
  * @LastEditors: penglei 1624952103@qq.com
  * @LastEditTime: 2025-01-02 19:43:35
- * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE;
  */
 /**
@@ -28,8 +28,8 @@ extern "C" {
 #endif /* __cplusplus */
 #endif /* __cplusplus */
 
-void *rotary_encoder_get_hx3509_api(void);
-void *rotary_encoder_get_hx3509_peri_attr(void);
+void *rotary_encoder_get_hx3508_api(void);
+void *rotary_encoder_get_hx3508_peri_attr(void);
 
 #ifdef __cplusplus
 #if __cplusplus
@@ -6,7 +6,7 @@
  */
 
 /*****************************************************************************
-    * @file     TYHX_OTS_HX3509_CUSTOM.C
+    * @file     TYHX_OTS_hx3508_CUSTOM.C
     * @author   TYHX team
        * @product  saker
     * @version  V0.1
@@ -21,7 +21,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include "tyhx_OTS_hx3509_custom.h"
+#include "tyhx_OTS_hx3508_custom.h"
 #include "cmsis_os2.h"
 #include "custom_utils.h"
 #include "hal_gpio.h"
 
 #define HAISI_SDK
 
-#ifdef CHIP_HX3509
+#ifdef CHIP_HX3508
 //下面是NORDIC平台用到的所有函数,其他平台由用户自行添加
 #ifdef HAISI_SDK
-// APP_TIMER_DEF(g_hx3509_timer); //定义OTS 读写间隔定时器
+// APP_TIMER_DEF(g_hx3508_timer); //定义OTS 读写间隔定时器
 void ots_timer_handler(void * p_context);
 
 #define REPORT_MIN  2  // 这个是最小上报角度, 按照平均值预估的值, 由客户定义, 看多大的数据上报给UI处理一次
@@ -59,7 +59,7 @@ static int16_t stand_still = 1; //静止标志 1 静止,0 转动
 
 bool ots_timer_running = false; //ots定时器是否运行标志
 
-static osTimerId_t g_hx3509_timer = NULL;
+static osTimerId_t g_hx3508_timer = NULL;
 
 /*--------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-----------*/
 
@@ -69,8 +69,8 @@ static osTimerId_t g_hx3509_timer = NULL;
  */
 void ots_timer_creat(void)
 {
-    // app_timer_create(&g_hx3509_timer, APP_TIMER_MODE_REPEATED, ots_timer_handler);
-    g_hx3509_timer = osTimerNew((osTimerFunc_t)ots_timer_handler, osTimerPeriodic, NULL, NULL);
+    // app_timer_create(&g_hx3508_timer, APP_TIMER_MODE_REPEATED, ots_timer_handler);
+    g_hx3508_timer = osTimerNew((osTimerFunc_t)ots_timer_handler, osTimerPeriodic, NULL, NULL);
 }
 
 /**
@@ -81,8 +81,8 @@ void ots_timer_start(void)
 {
     if(ots_timer_running == false)
     {
-        // app_timer_start(g_hx3509_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
-        osTimerStart(g_hx3509_timer,50);
+        // app_timer_start(g_hx3508_timer, APP_TIMER_TICKS(50), NULL);//定义为50ms定时器间隔
+        osTimerStart(g_hx3508_timer,50);
         ots_timer_running = true;
     }
 }
@@ -93,8 +93,8 @@ void ots_timer_start(void)
  */
 void ots_timer_stop(void)
 {
-    // app_timer_stop(g_hx3509_timer);
-    osTimerStop(g_hx3509_timer);
+    // app_timer_stop(g_hx3508_timer);
+    osTimerStop(g_hx3508_timer);
     ots_timer_running = false;
 }
 /**
@@ -427,7 +427,7 @@ uint8_t ots_read_reg(uint8_t regaddr)
     uint8_t data_buf = 0;
     //add by user, i2c read function
     // tyhx_read_regs(I2C_DEV_7ADDR,regaddr,&data_buf,1);
-    // custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,HX3509_I2C_BUS);
+    // custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,hx3508_I2C_BUS);
     data_buf = crown_read_reg(I2C_DEV_7ADDR,regaddr);
     return data_buf; //返回读到的寄存器值
 }
@@ -479,7 +479,7 @@ void ots_data_handler(void *p_event_data, uint16_t event_size)
 #if (defined(MOT_FALLINGTRI_MODE))//脉冲模式中断
     if(nrf_gpio_pin_read(PIN_TYHX_MOT))//读完数据, MOT应该会恢复默认电平
     {
-        TYHX_LOG("ots mot is cleared\r\n");//HX3509进入sleep后关闭定时器
+        TYHX_LOG("ots mot is cleared\r\n");//hx3508进入sleep后关闭定时器
     }
 #endif
 //如果是MOT_NO_USE_MODE , 由用户程序处理,在不需要芯片时候关闭读50ms定时器
@@ -597,7 +597,7 @@ void ots_init(void)
     }
     if(i==10)
     {
-        TYHX_LOG("HX3509 communication err,  please check\r\n");
+        TYHX_LOG("hx3508 communication err,  please check\r\n");
         return;
     }
 
@@ -608,7 +608,7 @@ void ots_init(void)
     ots_mot_init();
 #endif
 }
-void hx3509l_calibration(void)
+void hx3508l_calibration(void)
 {
        uint8_t cali75,cali74;  
        LOS_Mdelay(2);//必须有这个delay
@@ -692,7 +692,7 @@ void ots_start(void)
     ots_write_reg(RA_OP_MODE,0x1d);    
     LOS_Mdelay(10);
     ots_write_reg(RA_DEBUG_CAS0,0x43);
-       hx3509l_calibration();
+       hx3508l_calibration();
 
 #ifdef MOT_NO_USE_MODE   // 如果是非中断模式, 初始后, 开启定时器; 
     ots_timer_start();
@@ -794,12 +794,12 @@ void ots_result_deal(int16_t x)
        // }
 }
 
-int16_t hx3509_get_stand_still(void)
+int16_t hx3508_get_stand_still(void)
 {
     return stand_still;
 }
 
-int16_t hx3509_get_crown_result(void)
+int16_t hx3508_get_crown_result(void)
 {
     int16_t resulttemp;
     resulttemp=ots_result;
@@ -6,17 +6,17 @@
 */
 
 /***************************************************************************
-    * @file     TYHX_OTS_hx3509_CUSTOM.h
+    * @file     TYHX_OTS_hx3508_CUSTOM.h
     * @author   TYHX team
        * @product  saker
     * @version  V0.1
     * @date     2023-11-29;
 
 ****************************************************************************/
-#ifndef _TYHX_OTS_hx3509_CUSTOM_H_
-#define _TYHX_OTS_hx3509_CUSTOM_H_
+#ifndef _TYHX_OTS_HX3508_CUSTOM_H_
+#define _TYHX_OTS_HX3508_CUSTOM_H_
 
-#define CHIP_HX3509  //使用OTS芯片的定义
+#define CHIP_HX3508  //使用OTS芯片的定义
 
 #define I2C_DEV_7ADDR  0x32 //7bit i2c device addr
 
@@ -186,8 +186,8 @@ void ots_result_deal(int16_t x);
 //工厂测试模式
 bool ots_factory_test(void);
 
-int16_t hx3509_get_crown_result(void);
-int16_t hx3509_get_stand_still(void);
-int32_t microhone_switch(bool isopen);
+int16_t hx3508_get_crown_result(void);
+int16_t hx3508_get_stand_still(void);
 
-#endif //_TYHX__OTS_hx3509_CUSTOM_H
+
+#endif //_TYHX__OTS_hx3508_CUSTOM_H
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c
deleted file mode 100644 (file)
index ef3f470..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#include "at_cmd_api.h"
-#include "pm_control.h"
-#include "tyhx_OTS_hx3509_custom.h"
-#include "rotary_encoder_def.h"
-#include "i2c.h"
-#include "debug_print.h"
-#include "hal_i2c.h"
-
-static uint8_t g_hx3509_test_started = 0;
-encoder_callback g_encoder_callback = NULL;
-uint32_t hx3509_start(void)
-{
-    if (g_hx3509_test_started == 1) 
-    {
-        re_print("SKIP hx3509test start, already started\r\n");
-        return 0;
-    }
-    ots_init();
-    ots_start();
-    g_hx3509_test_started = 1;
-    return ERRCODE_SUCC;
-}
-uint32_t hx3509_stop(void)
-{
-    if (g_hx3509_test_started == 0) 
-    {
-        re_print("SKIP hx3509test stop, already stopped\r\n");
-        return 0;
-    }
-    ots_stop();
-    g_hx3509_test_started = 0 ;
-    return ERRCODE_SUCC;
-}
-
-static ext_errno hx3509_encoder_init(void *attr)
-{
-    re_print("hx3509_encoder_init\r\n");
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_deinit(void)
-{
-    re_print("hx3509_encoder_deinit\r\n");
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len)
-{
-
-    if (data_len != sizeof(re_input_event_info))
-        return EXT_ERR_NOT_SUPPORT;
-    re_input_event_info *encoder_info = (re_input_event_info*)data;
-    int16_t diff = hx3509_get_crown_result();
-    int16_t stand_still = hx3509_get_stand_still();
-    // re_print("hx3509_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still);
-    if (stand_still == 1 )
-    {
-        encoder_info->re_event = MC_RE_COVER;
-    }else {
-        encoder_info->re_event = MC_RE_MOVE;
-    }
-    encoder_info->re_event_info.x_axis[0] = diff;
-    encoder_info->re_event_info.y_axis[0] = diff;
-    encoder_info->re_event_info.z_axis[0] = diff;
-    encoder_info->finger_id = 0 ;
-    encoder_info->point_num = 0 ;
-    encoder_info->tv_usec = (uint32_t)uapi_tcxo_get_ms();
-    //re_print("hx3509_encoder_get_encoderinfo  %s rotate %d\r\n",encoder_info->re_event == MC_RE_SLIDE_UP?"MC_RE_SLIDE_UP":"MC_RE_SLIDE_DOWN",diff);
-
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_suspend(void)
-{
-    re_print("hx3509_encoder_suspend\r\n");
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_resume(void)
-{
-    re_print("hx3509_encoder_resume\r\n");
-    hx3509_start();
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_sleep(void)
-{
-    re_print("hx3509_encoder_sleep\r\n");
-    hx3509_stop();
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_reset(void)
-{
-    re_print("hx3509_encoder_reset\r\n");
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_encoder_bus_init(void *private_data)
-{
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_register_callback(void *peri_data, encoder_callback func)
-{
-    re_print("hx3509_register_callback\r\n");
-    g_encoder_callback = func;
-    return EXT_ERR_SUCCESS;
-}
-static ext_errno hx3509_unregister_callback(void *peri_data)
-{
-    re_print("hx3509_unregister_callback\r\n");
-    g_encoder_callback = NULL;
-    return EXT_ERR_SUCCESS;
-}
-
-encoder_peripheral_api g_hx3509_api = {
-    .encoder_init = hx3509_encoder_init,
-    .encoder_deinit = hx3509_encoder_deinit,
-    .encoder_get_encoderinfo = hx3509_encoder_get_encoderinfo,
-    .encoder_suspend = hx3509_encoder_suspend,
-    .encoder_resume = hx3509_encoder_resume,
-    .encoder_sleep = hx3509_encoder_sleep,
-    .encoder_reset = hx3509_encoder_reset,
-    .encoder_bus_init = hx3509_encoder_bus_init,
-    .register_callback = hx3509_register_callback,
-    .unregister_callback = hx3509_unregister_callback,
-};
-
-
-void *rotary_encoder_get_hx3509_api(void)
-{
-    return ((void *)&g_hx3509_api);
-}
-
-void *rotary_encoder_get_hx3509_peri_attr(void)
-{
-    return ((void *)NULL);
-}
\ No newline at end of file
index 7cb61bc..6d1e531 100644 (file)
@@ -17,8 +17,8 @@
 #include "hx3507_hal.h"
 #endif
 
-#ifdef ROTARYENCODER_HX3509
-#include "hx3509_hal.h"
+#ifdef ROTARYENCODER_HX3508
+#include "hx3508_hal.h"
 #endif
 
 #ifdef ROTARYENCODER_U8
@@ -425,9 +425,9 @@ uint32_t re_init(void)
 #ifdef ROTARYENCODER_HX3507
     g_encoder_drv.private_data = rotary_encoder_get_hx3507_peri_attr();
     g_encoder_drv.encoder_api = rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
-    g_encoder_drv.private_data = rotary_encoder_get_hx3509_peri_attr();
-    g_encoder_drv.encoder_api = rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+    g_encoder_drv.private_data = rotary_encoder_get_hx3508_peri_attr();
+    g_encoder_drv.encoder_api = rotary_encoder_get_hx3508_api();
 #elif defined ROTARYENCODER_U8
     g_encoder_drv.private_data = rotary_encoder_get_crown_peri_attr();
     g_encoder_drv.encoder_api = rotary_encoder_get_crown_api();
@@ -471,8 +471,8 @@ void rotary_encoder_suspend(void)
     /**灭屏,关闭Encoder*/
 #ifdef ROTARYENCODER_HX3507
     encoder_ptr = rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
-    encoder_ptr = rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+    encoder_ptr = rotary_encoder_get_hx3508_api();
 #elif defined ROTARYENCODER_U8
     encoder_ptr = rotary_encoder_get_crown_api();
 #endif
@@ -488,8 +488,8 @@ void rotary_encoder_resume(void)
 #ifdef ROTARYENCODER_HX3507
     /**亮屏,恢复Encoder工作*/
     encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3507_api();
-#elif defined ROTARYENCODER_HX3509
-    encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_HX3508
+    encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3508_api();
 #elif defined ROTARYENCODER_U8
     encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_crown_api();
 #endif
index 2ca706f..0ee9844 100644 (file)
@@ -231,6 +231,29 @@ float battery_ntc_map[][2]={
 
 
 float battery_percent_map[][2]={
+#ifdef BOARD_U8
+    {3.8, 100},
+    {3.782, 95},
+    {3.764, 90},
+    {3.746, 85},
+    {3.728, 80},
+    {3.71, 75},
+    {3.692, 70},
+    {3.674, 65},
+    {3.656, 60},
+    {3.638, 55},
+    {3.62, 50},
+    {3.602, 45},
+    {3.584, 40},
+    {3.566, 35},
+    {3.548, 30},
+    {3.53, 25},
+    {3.512, 20},
+    {3.494, 15},
+    {3.476, 10},
+    {3.405, 5},
+    {3.3, 0}
+#else
     {4.3,100},
     {4.264,95},
     {4.228,90},
@@ -252,11 +275,16 @@ float battery_percent_map[][2]={
     {3.652,10},
     {3.41,5},
     {3.3,0}
+#endif
 };
 
+#ifdef BOARD_U8
+#define batteryservice_VOLTAGE_MAX (3.8f)
+#define batteryservice_VOLTAGE_MIN (3.3f)
+#else
 #define batteryservice_VOLTAGE_MAX (4.3f)
 #define batteryservice_VOLTAGE_MIN (3.3f)
-
+#endif
 static uint32_t g_adc_sample_times = 0;
 static uint32_t g_adc_sample_discard = 0;
 static uint32_t g_adc_sample_stick = 0;
index aa12365..47edc72 100644 (file)
@@ -264,34 +264,8 @@ bool bigDataBufState=false;//大数据传输状态
 /**\r
  * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算\r
 */\r
-static uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)\r
-{\r
-    uint8_t lrcValue = _lrcValue;\r
-    if(data == NULL)\r
-    {\r
-        return false;   \r
-    }\r
-       for(uint16_t i = 0; i < len; i++)\r
-       {\r
-               lrcValue =lrcValue+ data[i];\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);\r
-    }\r
-    return lrcValue;\r
-}\r
 \r
 \r
-/***\r
- * 根据求和后的数据计算crc 值 \r
-*/\r
-uint8_t get_crc_from_lrc(uint8_t lrcValue)\r
-{\r
-    uint8_t crcbuf  = 0;\r
-    crcbuf = lrcValue%256;\r
-    crcbuf = 256-crcbuf;\r
-    crcbuf = crcbuf%256;\r
-    return crcbuf;\r
-}\r
-\r
 uint8_t  calculate_lrc_file(char *file_path)\r
 {\r
     uint8_t lrcValue =0;\r
@@ -356,23 +330,6 @@ static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte
 }\r
 \r
 \r
-static uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte\r
-{\r
-    uint8_t crcbuf  = 0;\r
-    uint8_t lrcValue = 0x00;\r
-    lrcValue = calculate_lrc(data+17,len-17,0x00);\r
-    crcbuf = get_crc_from_lrc(lrcValue);\r
-    return crcbuf;\r
-}\r
-\r
-static uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte\r
-{\r
-    uint8_t crcbuf  = 0;\r
-    uint8_t lrcValue = 0x00;\r
-       lrcValue = calculate_lrc(data,len,0x00);\r
-    crcbuf = get_crc_from_lrc(lrcValue);\r
-    return crcbuf;\r
-}\r
 \r
 static cJSON *cjson_json_tmp = NULL;\r
 //发送ble数据\r
index bd095c6..d75740f 100644 (file)
@@ -850,6 +850,8 @@ void reply_APP_OpenSportModeCmd(bool falg);
 
 void watch_synchronization_time(void);
 
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len);//计算20byte
+
 ///////////////////////////自定义文件传输协议/////////////////////////////
 #define OTA_FILE_MSG_CMD  0x0601 
 #define OTA_FILE_DATA_CMD 0x0602
index e12969e..14a98d4 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-01-16 10:01:35\r
+ * @LastEditTime: 2025-02-20 18:34:13\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
 #include "NMEA0183.h"\r
 static gps_data_t send_gps_data = {0};\r
 #endif\r
+\r
+#ifdef ENABLE_BN02\r
+#include "bp_ble_service.h"\r
+#endif\r
+\r
 #pragma pack(1)\r
 typedef struct factorytest_cmd_header_t\r
 {\r
@@ -543,7 +548,9 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t
                 ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0); //进入产测模式 关闭充电弹窗\r
                 uapi_dev_runtime_set_factory_test_status(1); //设置产测模式runtime\r
                 svr_ble_adv_factory_test_start_param(); //设置蓝牙广播 避免出现连接问题\r
-#endif\r
+                \r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV,NULL,0);\r
+#endif          \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON,\r
                 BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE,\r
                 0x01,\r
@@ -551,7 +558,15 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t
                 1);\r
 #ifdef FD230\r
                 uapi_hfp_connect_();\r
+                // uint8_t cmd = BR_HFP_CONNECT;\r
+\r
+                // cmd = BR_A2DP_CONNECT;\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd));\r
+                \r
                 LOS_Msleep(500);\r
+\r
+                // cmd = BR_A2DP_CONNECT;\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd));\r
                 uapi_a2dp_snk_connect_();\r
 #endif\r
             } else if (testitem == 0x02)\r
@@ -2101,6 +2116,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 uint8_t send_data= 0;\r
                 // uapi_start_audio_test(30);\r
                 uapi_microhone_switch(1);\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_MIC,NULL,0);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
                         0x01,\r
@@ -2113,6 +2129,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 uint8_t send_data= 0;\r
                 // uapi_stop_audio_test();\r
                 uapi_microhone_switch(0);\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_MIC,NULL,0);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
                         0x02,\r
@@ -2124,6 +2141,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //播放录音\r
                 uint8_t send_data= 0;\r
                 uapi_check_mic(1);\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_CHECK_MIC,NULL,0);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
                         0x03,\r
@@ -2134,6 +2152,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //停止播放\r
                 uint8_t send_data= 0;\r
                 uapi_check_mic(0);\r
+                // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_CHECK_MIC,NULL,0);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
                         0x04,\r
@@ -2148,23 +2167,55 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                         0x05,\r
                         &send_data,\r
                         1);\r
+            } else if(testitem == 0x06)\r
+            {\r
+                //播放扫频文件\r
+                uint8_t send_data = 0;\r
+                uapi_check_spk(2);\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+                        0x06,\r
+                        &send_data,\r
+                        1);\r
+            } else if(testitem == 0x07)\r
+            {\r
+                //删除扫频文件\r
+                uint8_t send_data = uapi_delete_files("/user/music/20-20KHZ.mp3");\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+                        0x07,\r
+                        &send_data,\r
+                        1);\r
             }\r
-\r
-            if (testitem == 0x06)\r
+            else if (testitem == 0x08)\r
             {\r
                 uint8_t send_data = 0x00;\r
-#ifdef FD230\r
-                uapi_hfp_connect_();\r
-                LOS_Msleep(500);\r
-                uapi_a2dp_snk_connect_();\r
-#endif\r
+\r
+                send_data = factorytest_upload_mic_file();\r
+\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
-                        0x03,\r
+                        0x08,\r
                         &send_data,\r
                         1);\r
             }\r
 \r
+\r
+//             else if (testitem == 0x08)\r
+//             {\r
+//                 uint8_t send_data = 0x00;\r
+// #ifdef FD230\r
+//                 uapi_hfp_connect_();\r
+//                 LOS_Msleep(500);\r
+//                 uapi_a2dp_snk_connect_();\r
+// #endif\r
+//                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+//                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
+//                         0x03,\r
+//                         &send_data,\r
+//                         1);\r
+//             }\r
+\r
             break;\r
 \r
         case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP:\r
@@ -2389,7 +2440,15 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size)
 \r
             }\r
             \r
-         }else{\r
+         } \r
+        else if(header.header == BLE_TEST_BN02_HEADER)\r
+        {\r
+#ifdef ENABLE_BN02\r
+            bn02_parse_frame(buf,event_size);\r
+#endif\r
+        }\r
+        else\r
+        {\r
             printf("crc error!\r\n");\r
             return ERRCODE_FAIL;\r
         }\r
index d238728..b2cbec6 100644 (file)
@@ -43,7 +43,7 @@ extern "C" {
 // 3、大端模式。
 // 4、长耗时命令,先确认收到,执行完再返回结果。
 #define BLE_TEST_PROTOCOL_HEADER 0xFD
-
+#define BLE_TEST_BN02_HEADER 0x55
 
 //公共模式 子模式ID  模式切换
 #define BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE 0x01
index 052976c..9ccffd3 100644 (file)
@@ -60,6 +60,7 @@ void cat1_start_SCO_audio_(void){}
 #endif
 
 #ifdef SUPPORT_BLE_SERVICE
+#include "bleService.h"
 #ifdef BLE_INSTRUCT
 #include "bleInstruct.h"
 #endif
@@ -361,11 +362,31 @@ static void custom_cmd_service_check_task(void const *arg)
         case CUSTOM_CMD_MSG_CAT_HFP_DIS_SCO_CONNECT:
             cat1_disconn_sco_();
             break;
-         case CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START:
+        case CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START:
             cat1_start_SCO_audio_();
             break;
-        
-        
+        case CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV:
+#ifdef SUPPORT_BLE_SERVICE
+            svr_ble_adv_factory_test_start_param();
+#endif
+            break;
+
+        case CUSTOM_CMD_MSG_START_MIC:
+            uapi_microhone_switch(1);
+            break;
+
+        case CUSTOM_CMD_MSG_STOP_MIC:
+            uapi_microhone_switch(0);
+            break;
+
+        case CUSTOM_CMD_MSG_START_CHECK_MIC:
+            uapi_check_mic(1);
+            break;
+
+        case CUSTOM_CMD_MSG_STOP_CHECK_MIC:
+            uapi_check_mic(0);
+            break;
+
         default:
             PRINT("Unknown CUSTOM_CMD_MSG cmd 0x%02X \r\n", mail.cmd);
             break;
index 77d8df9..91d30d3 100644 (file)
@@ -98,6 +98,11 @@ void system_init_uart(void){}
 #ifdef TPTYPE_CST86XX
 #include "cst86xx_touch1.h"
 #endif
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleEvent.h"
+#endif
+
 errcode_t uapi_create_osThread_custom(app_task_definition_t *task_cfg)
 {
     if (task_cfg==NULL)
@@ -2659,8 +2664,15 @@ error:
 }
 
 
-errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex)
+errcode_t custom_i2c_transfer(uint16_t slaveAddr,uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex)
 {
+
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 0) 
+    {
+        uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+    }
+
     errcode_t ret;
     uint32_t retry;
     i2c_data_t data;
@@ -2668,22 +2680,14 @@ errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, u
     int16_t write_len = 0;
 
     //custom_iic_init();
-    write_len = regLength + writeDataSize;
+    write_len = writeDataSize;
     write_data = (uint8_t *)osal_kmalloc(write_len, OSAL_GFP_KERNEL);
     if (write_data == NULL) {
         PRINT(" send buff malloc fail!");
         goto error;
     }
 
-    if( regLength == 2)
-    {
-        write_data[0] = ((uint8_t*)&reg)[0];
-        write_data[1] = ((uint8_t*)&reg)[1];
-    }else{
-        write_data[0] = (uint8_t)reg;
-    }
-
-    ret = (uint32_t)memcpy_s(write_data + regLength, writeDataSize, writeData, writeDataSize);
+    ret = (uint32_t)memcpy_s(write_data, writeDataSize, writeData, writeDataSize);
     if (ret != EOK) {
         PRINT("send_buf content copy fail! ret=0x%x\n", ret);
         goto free_mem;
@@ -2706,9 +2710,28 @@ errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, u
 free_mem:
     osal_kfree(write_data);
 error:
+
+    cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
+    }
+
     return (ret>0) ? ret*-1: ret;
 }
 
+
+uint32_t custom_spi_suspend(void)
+{
+    spi_save_reg(SPI_BUS_0);
+    return 0;
+}
+uint32_t custom_spi_resume(void)
+{
+    spi_recovery_reg(SPI_BUS_0);
+    return 0;
+}
+
 uint32_t custom_i2c_suspend(void)
 {
     i2c_save_reg(I2C_BUS_2);
@@ -2726,6 +2749,32 @@ uint32_t custom_i2c_resume(void)
     return 0;
 }
 
+
+errcode_t custom_spi_init(uint8_t bus_index)
+{
+    spi_bus_t bus;
+    spi_attr_t attr;
+    bus = bus_index;
+    attr.is_slave = false;
+    attr.slave_num = 1;
+    attr.bus_clk = 32000000; 
+    attr.freq_mhz = 8;
+    attr.clk_polarity = (uint32_t)SPI_CFG_CLK_CPOL_1;
+    attr.clk_phase = (uint32_t)SPI_CFG_CLK_CPHA_1;
+    attr.frame_format = SPI_CFG_FRAME_FORMAT_MOTOROLA_SPI;
+    attr.spi_frame_format = (uint32_t)HAL_SPI_FRAME_FORMAT_STANDARD;
+    attr.frame_size = (uint32_t)HAL_SPI_FRAME_SIZE_8;
+    attr.tmod = HAL_SPI_TRANS_MODE_TXRX;
+    attr.sste = SPI_CFG_SSTE_ENABLE;
+    attr.ndf = 1;
+
+    errcode_t ret = uapi_spi_init(bus,&attr,NULL);
+    if (ret != ERRCODE_SUCC) {
+        PRINT("spi init fail! ret=0x%x\n", ret);
+    }
+    return ret;
+}
+
 /*省电模式*/
 void uapi_enter_power_saving_mode(void)
 {
@@ -2870,7 +2919,7 @@ int32_t uapi_microhone_switch(bool isopen)
     
 }
 
-void uapi_check_spk(bool isopen)
+void uapi_check_spk(uint8_t isopen)
 {
     #ifdef FD230
         check_spk(isopen);
@@ -4097,3 +4146,142 @@ void remove_debug_vote(void)
         uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
     } 
 }
+
+#ifdef SUPPORT_BLE_SERVICE
+
+void factorytest_send_big_data(ble_data_type type,char *data, uint16 datalen)
+{
+    // 动态分配内存空间,防止堆栈溢出
+    uint8_t *buf =NULL;
+    buf = malloc(17 + datalen + 1); 
+    memset_s(buf,250,0,17 + datalen + 1);
+    if (buf == NULL && datalen!=0) {
+        //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");
+        return;
+    }
+    if(type.Packet_id>=2)
+    {
+        msleep(get_ble_interval()+5);//多包数据发送增加延迟
+    }
+    // 设置消息头部信息
+    buf[0] = 0x72; // 消息头
+    buf[1] = type.type; // 类型
+    buf[2] = type.type_id; // 类型ID
+    memcpy(buf + 3, &type.packet_total, 4); // 总包数
+    memcpy(buf + 7, &type.total, 4); // 总数据长度
+    memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID
+    memcpy(buf + 15, &datalen, 2); // 包数据长度
+
+    // 处理数据和计算CRC
+    if (data == NULL) {
+        //数据为空 按照18个字节总长度发送给app
+        buf[17] = 0x00; // 直接写0x00的校验和
+    } else {
+        memcpy(buf + 17, data, datalen); // 复制数据到缓冲区
+        buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC
+    }
+
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");
+    
+    // for(int i=0;i<17 + datalen + 1;i++)
+    // {
+    //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);
+    // }
+    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");
+
+    ble_factorytest_server_send_input_report(buf, 17 + datalen + 1);
+    
+
+    free(buf); // 释放内存空间
+}
+
+#endif
+
+bool factorytest_upload_mic_file(void)
+{
+    uint8_t pack_size = 200;
+    char *data= (char *)malloc(pack_size+1);
+    uint16_t read_size=0;
+    FILE *fp=fopen("/user/userdata/microphone.mp3","rb+");
+    
+    uint32_t file_size = uapi_get_file_size("/user/userdata/microphone.mp3");
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);
+
+    uint32_t pack=file_size/pack_size+1;
+    uint32_t pack_id=1;
+    if(fp==NULL)
+    {
+        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+        free(data);
+        return false;
+    }
+
+    do
+    {
+        memset_s(data,pack_size+1,0,pack_size+1);
+        read_size=fread(data,1,pack_size,fp);
+        if(read_size!=0)
+        {
+#ifdef SUPPORT_BLE_SERVICE
+            ble_data_type type_={0x1b,0x08,file_size,pack,pack_id};
+            // send_big_data(type_,(char *)data,read_size);
+            factorytest_send_big_data(type_,(char *)data,read_size);
+#endif
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);
+        }
+    
+        //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);
+        pack_id++;
+       
+    } while (read_size==pack_size);
+    free(data);
+    fclose(fp);
+    return true;
+}
+
+
+uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte
+{
+    uint8_t crcbuf  = 0;
+    uint8_t lrcValue = 0x00;
+    lrcValue = calculate_lrc(data+17,len-17,0x00);
+    crcbuf = get_crc_from_lrc(lrcValue);
+    return crcbuf;
+}
+
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte
+{
+    uint8_t crcbuf  = 0;
+    uint8_t lrcValue = 0x00;
+       lrcValue = calculate_lrc(data,len,0x00);
+    crcbuf = get_crc_from_lrc(lrcValue);
+    return crcbuf;
+}
+
+
+/***
+ * 根据求和后的数据计算crc 值 
+*/
+uint8_t get_crc_from_lrc(uint8_t lrcValue)
+{
+    uint8_t crcbuf  = 0;
+    crcbuf = lrcValue%256;
+    crcbuf = 256-crcbuf;
+    crcbuf = crcbuf%256;
+    return crcbuf;
+}
+
+uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)
+{
+    uint8_t lrcValue = _lrcValue;
+    if(data == NULL)
+    {
+        return false;   
+    }
+       for(uint16_t i = 0; i < len; i++)
+       {
+               lrcValue =lrcValue+ data[i];
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);
+    }
+    return lrcValue;
+}
index f119a67..ed203be 100644 (file)
@@ -254,6 +254,15 @@ uint32_t uapi_calendar_store_date(void);
 
 #define CUSTOM_CMD_MSG_CAT_HFP_SCO_AUDIO_START 0x19
 
+#define CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV 0x1A
+
+#define CUSTOM_CMD_MSG_START_MIC 0x1B
+
+#define CUSTOM_CMD_MSG_STOP_MIC 0x1C
+
+#define CUSTOM_CMD_MSG_START_CHECK_MIC 0x1D
+
+#define CUSTOM_CMD_MSG_STOP_CHECK_MIC 0x1E
 
 typedef enum {
     BR_HFP_CONNECT=1,
@@ -312,7 +321,7 @@ errcode_t custom_i2c_init(uint8_t bus_index);
 void custom_i2c_reset(uint8_t i2cbus, uint16_t i2c_clock);
 errcode_t custom_i2c_write_reg(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex);
 errcode_t custom_i2c_read_regs(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex);
-errcode_t custom_i2c_transfer(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex);
+errcode_t custom_i2c_transfer(uint16_t slaveAddr,uint8_t *writeData, int writeDataSize, uint8_t *readData, int readDataSize, int busIndex);
 errcode_t custom_i2c_test(void);
 
 uint32_t custom_i2c_suspend(void);
@@ -331,7 +340,7 @@ void uapi_ppg_get_id(uint8_t *chip_id);
 
 
 int32_t uapi_microhone_switch(bool isopen);
-void uapi_check_spk(bool isopen);
+void uapi_check_spk(uint8_t isopen);
 void uapi_check_mic(bool isopen);
 void uapi_factorytest_set_lcd_color(int color);
 void uapi_factorytest_enter_test_view(int cmd);
@@ -364,6 +373,12 @@ void uapi_save_sleep_flag(uint8_t *data,uint16_t len);
 void start_save_file_thread(void);
 void uapi_create_folder(char *dir_path);
 uint32_t uapi_get_file_size(char *filepath);
+
+uint32_t custom_spi_suspend(void);
+uint32_t custom_spi_resume(void);
+
+errcode_t custom_spi_init(uint8_t bus_index);
+
 /**
  * 资源文件校验码保存在文件 /user/fileschecksum.txt 中
  * 读出每一行,输入本函数,检测文件是否正常。
@@ -428,6 +443,17 @@ errcode_t enable_offline_log_nv(uint8_t log_enable);
 
 void remove_debug_vote(void);
 
+bool factorytest_upload_mic_file(void);
+
+uint8_t Calculate_CRC(uint8_t *data,uint16_t len);
+uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len);
+/***
+ * 根据求和后的数据计算crc 值 
+*/
+uint8_t get_crc_from_lrc(uint8_t lrcValue);
+
+uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue);
+
 #include "custom_utilscpp.h"