From 1fcc97f8f1e1349a1f2d38a426c2974557c7a2a1 Mon Sep 17 00:00:00 2001 From: penglei <1624952103@qq.com> Date: Mon, 24 Feb 2025 15:08:24 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96w9=E5=BF=83=E7=8E=87=E9=A9=B1?= =?utf8?q?=E5=8A=A8=EF=BC=8C=E5=B9=B6=E6=B7=BB=E5=8A=A0=E8=A1=80=E5=8E=8B?= =?utf8?q?=E8=93=9D=E7=89=99=E5=8D=8F=E8=AE=AE=EF=BC=88=E6=9C=AA=E9=AA=8C?= =?utf8?q?=E8=AF=81=EF=BC=89=EF=BC=8C=E4=BF=AE=E6=94=B9hx3509=E4=B8=BAhx35?= =?utf8?q?08=EF=BC=8C=E5=AE=8C=E5=96=84u8=E8=93=9D=E7=89=99=E9=9F=B3?= =?utf8?q?=E9=A2=91=E4=BA=A7=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/service_init.c | 12 +- .../brandy/brandy_standard/thread_pri_init.c | 4 + .../include/notify/findwatch_notification.h | 6 +- .../src/notify/findwatch_notification.cpp | 13 +- .../config/target_config/brandy/config.py | 3 +- .../boards/brandy_evb/board_config/board_u8.h | 4 +- .../boards/brandy_evb/board_config/board_w9.h | 13 +- .../clocks/drivers/acore/clocks_config_priv.c | 4 + code/sdk/files/u8/fs/user/music/20-20KHZ.mp3 | Bin 0 -> 45039 bytes .../chips/brandy/pm/include/pm_definition.h | 1 + .../chips/brandy/pm/pm_adapt/pm_core.c | 16 +- .../UI/producttest/include/testmicrophoneC.h | 4 +- code/sdk/zhihui/UI/producttest/src/testTP.cpp | 12 +- .../UI/producttest/src/testmicrophone.cpp | 25 ++- code/sdk/zhihui/drivers/bp/CMakeLists.txt | 1 + code/sdk/zhihui/drivers/bp/bn02/bn02.c | 52 ++++- .../drivers/bp/service/bp_ble_service.c | 116 ++++++++++ .../drivers/bp/service/bp_ble_service.h | 33 +++ .../drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h | 2 + .../drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h | 13 +- .../drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c | 14 +- .../drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c | 26 +-- .../drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c | 164 ++++++-------- .../drivers/ppg/gh3x2x/src/gh3x2x_hal.c | 107 ++++----- .../drivers/ppg/service/ppg_service.cpp | 5 + .../drivers/rotary_encoder/CMakeLists.txt | 12 +- .../drivers/rotary_encoder/crown/crown.c | 28 +-- .../hx3508_at_cmd.c} | 62 ++--- .../hx3508_at_cmd.h} | 10 +- .../rotary_encoder/hx3508/hx3508_hal.c | 131 +++++++++++ .../hx3509_hal.h => hx3508/hx3508_hal.h} | 6 +- .../tyhx_OTS_hx3508_custom.c} | 36 +-- .../tyhx_OTS_hx3508_custom.h} | 16 +- .../rotary_encoder/hx3509/hx3509_hal.c | 131 ----------- .../rotary_encoder/rotary_encoder_drv.c | 18 +- .../battery/service/battery_driver.cpp | 30 ++- .../ble_service/bleservice/bleEvent.c | 43 ---- .../ble_service/bleservice/bleEvent.h | 2 + .../factorytest_protocol.c | 81 ++++++- .../factorytest_protocol.h | 2 +- code/sdk/zhihui/utils/custom_cmd_service.c | 27 ++- code/sdk/zhihui/utils/custom_utils.c | 212 +++++++++++++++++- code/sdk/zhihui/utils/custom_utils.h | 30 ++- 43 files changed, 1010 insertions(+), 517 deletions(-) create mode 100644 code/sdk/files/u8/fs/user/music/20-20KHZ.mp3 create mode 100644 code/sdk/zhihui/drivers/bp/service/bp_ble_service.c create mode 100644 code/sdk/zhihui/drivers/bp/service/bp_ble_service.h rename code/sdk/zhihui/drivers/rotary_encoder/{hx3509/hx3509_at_cmd.c => hx3508/hx3508_at_cmd.c} (52%) rename code/sdk/zhihui/drivers/rotary_encoder/{hx3509/hx3509_at_cmd.h => hx3508/hx3508_at_cmd.h} (83%) create mode 100644 code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.c rename code/sdk/zhihui/drivers/rotary_encoder/{hx3509/hx3509_hal.h => hx3508/hx3508_hal.h} (89%) rename code/sdk/zhihui/drivers/rotary_encoder/{hx3509/tyhx_OTS_hx3509_custom.c => hx3508/tyhx_OTS_hx3508_custom.c} (96%) rename code/sdk/zhihui/drivers/rotary_encoder/{hx3509/tyhx_OTS_hx3509_custom.h => hx3508/tyhx_OTS_hx3508_custom.h} (95%) delete mode 100644 code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c diff --git a/code/sdk/application/brandy/brandy_standard/service_init.c b/code/sdk/application/brandy/brandy_standard/service_init.c index 0a7399e4d..d5f13a72e 100644 --- a/code/sdk/application/brandy/brandy_standard/service_init.c +++ b/code/sdk/application/brandy/brandy_standard/service_init.c @@ -77,8 +77,8 @@ #ifdef CONFIG_OTA_UPDATE_SUPPORT #include "upg.h" #endif -#ifdef SUPPORT_AT_HX3509 -#include "hx3509_at_cmd.h" +#ifdef SUPPORT_AT_HX3508 +#include "hx3508_at_cmd.h" #endif #ifdef SUPPORT_AT_LQBP002TA #include "lqbp_at_cmd.h" @@ -191,10 +191,10 @@ static void register_at_service(void) at_cmd_table_t *rtc_table = get_rtc_cmd_table(&rtc_cmd_count); at_cmd_add_moudle(rtc_table, rtc_cmd_count); #endif -#ifdef SUPPORT_AT_HX3509 - uint32_t hx3509_cmd_count; - at_cmd_table_t *hx3509_table = get_hx3509_cmd_table(&hx3509_cmd_count); - at_cmd_add_moudle(hx3509_table, hx3509_cmd_count); +#ifdef SUPPORT_AT_HX3508 + uint32_t hx3508_cmd_count; + at_cmd_table_t *hx3508_table = get_hx3508_cmd_table(&hx3508_cmd_count); + at_cmd_add_moudle(hx3508_table, hx3508_cmd_count); #endif #ifdef SUPPORT_AT_LQBP002TA uint32_t lqbp002ta_cmd_count; diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c index c672e658c..fece0ba84 100644 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -528,6 +528,10 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG); uapi_bp_service_init(); #endif +#endif + +#ifdef ENABLE_CUSTOM_SPI + custom_spi_init(SPI_BUS_0); #endif /*启动蓝牙ble服务,cywee有重置 mac地址的操作,会需要把 蓝牙服务开启放在cywee服务之后*/ diff --git a/code/sdk/application/wearable/fd230/service/msg_center/include/notify/findwatch_notification.h b/code/sdk/application/wearable/fd230/service/msg_center/include/notify/findwatch_notification.h index 6c9126ed5..bbd7d0964 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/include/notify/findwatch_notification.h +++ b/code/sdk/application/wearable/fd230/service/msg_center/include/notify/findwatch_notification.h @@ -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); diff --git a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp index 3af24c606..f17eb2610 100644 --- a/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp +++ b/code/sdk/application/wearable/fd230/service/msg_center/src/notify/findwatch_notification.cpp @@ -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; } diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index 512d8027e..2e40b9edb 100644 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -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' diff --git a/code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h b/code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h index 24e558ae9..aec596b6a 100644 --- a/code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h +++ b/code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h @@ -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 }; diff --git a/code/sdk/drivers/boards/brandy_evb/board_config/board_w9.h b/code/sdk/drivers/boards/brandy_evb/board_config/board_w9.h index b15d665b9..b506e9cd8 100644 --- a/code/sdk/drivers/boards/brandy_evb/board_config/board_w9.h +++ b/code/sdk/drivers/boards/brandy_evb/board_config/board_w9.h @@ -15,6 +15,10 @@ 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 }; /** diff --git a/code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c b/code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c index 9ea77612c..a2e75cb66 100644 --- a/code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c +++ b/code/sdk/drivers/chips/brandy/clocks/drivers/acore/clocks_config_priv.c @@ -364,7 +364,11 @@ static const system_mcu_perip_clk_t g_system_mcu_perp_clk_set_config[] = { /* Clocks M_CLKEN1 region */ {HAL_CLOCKS_APP_TIMER_CLK, TURN_ON}, // timer clock +#if defined(ENABLE_CUSTOM_SPI) + {HAL_CLOCKS_APP_SPI0_M_CLK, TURN_ON}, // spi0 clock +#else {HAL_CLOCKS_APP_SPI0_M_CLK, TURN_OFF}, // spi0 clock +#endif {HAL_CLOCKS_APP_SPI1_MS_CLK, TURN_OFF}, // spi1 clock {HAL_CLOCKS_APP_SPI2_MS_CLK, TURN_OFF}, // spi2 clock {HAL_CLOCKS_APP_UART_H0_CLK, TURN_ON}, // uart h0 clock 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 index 0000000000000000000000000000000000000000..315109e98f1ab0bed8d2624717ab953111feb4a7 GIT binary patch literal 45039 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 literal 0 HcmV?d00001 diff --git a/code/sdk/middleware/chips/brandy/pm/include/pm_definition.h b/code/sdk/middleware/chips/brandy/pm/include/pm_definition.h index 2bc0c7537..ed94c4913 100644 --- a/code/sdk/middleware/chips/brandy/pm/include/pm_definition.h +++ b/code/sdk/middleware/chips/brandy/pm/include/pm_definition.h @@ -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; diff --git a/code/sdk/middleware/chips/brandy/pm/pm_adapt/pm_core.c b/code/sdk/middleware/chips/brandy/pm/pm_adapt/pm_core.c index 04a5764f6..9e6e113a9 100644 --- a/code/sdk/middleware/chips/brandy/pm/pm_adapt/pm_core.c +++ b/code/sdk/middleware/chips/brandy/pm/pm_adapt/pm_core.c @@ -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(); //��������������� //....................................................... } diff --git a/code/sdk/zhihui/UI/producttest/include/testmicrophoneC.h b/code/sdk/zhihui/UI/producttest/include/testmicrophoneC.h index f68033adf..ee9f6ea6d 100644 --- a/code/sdk/zhihui/UI/producttest/include/testmicrophoneC.h +++ b/code/sdk/zhihui/UI/producttest/include/testmicrophoneC.h @@ -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 diff --git a/code/sdk/zhihui/UI/producttest/src/testTP.cpp b/code/sdk/zhihui/UI/producttest/src/testTP.cpp index 884005e49..259d314a6 100644 --- a/code/sdk/zhihui/UI/producttest/src/testTP.cpp +++ b/code/sdk/zhihui/UI/producttest/src/testTP.cpp @@ -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 && xScreen::GetInstance().GetHeight()/4*i && ySetStyle(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; } diff --git a/code/sdk/zhihui/UI/producttest/src/testmicrophone.cpp b/code/sdk/zhihui/UI/producttest/src/testmicrophone.cpp index bc0861f23..a1e71ea2b 100644 --- a/code/sdk/zhihui/UI/producttest/src/testmicrophone.cpp +++ b/code/sdk/zhihui/UI/producttest/src/testmicrophone.cpp @@ -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(); } } diff --git a/code/sdk/zhihui/drivers/bp/CMakeLists.txt b/code/sdk/zhihui/drivers/bp/CMakeLists.txt index 16351bc4f..15776c1fc 100644 --- a/code/sdk/zhihui/drivers/bp/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/bp/CMakeLists.txt @@ -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 diff --git a/code/sdk/zhihui/drivers/bp/bn02/bn02.c b/code/sdk/zhihui/drivers/bp/bn02/bn02.c index 4330510e5..6159755b6 100644 --- a/code/sdk/zhihui/drivers/bp/bn02/bn02.c +++ b/code/sdk/zhihui/drivers/bp/bn02/bn02.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-16 12:35:15 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-17 14:35:00 + * @LastEditTime: 2025-02-14 11:37:22 * @FilePath: /sdk615/code/sdk/zhihui/drivers/bp/bn02/bn02.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -12,6 +12,8 @@ #include "pinctrl_porting.h" #include "hal_gpio.h" #include "i2c.h" +#include "pm_definition.h" +#include "bp_ble_service.h" #define BN02_I2C_ADDR 0x05 #define BN02_I2C_BUS I2C_BUS_0 @@ -24,6 +26,12 @@ bool Bn02_write_reg(uint8_t data) { + uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); + if (cnt == 0) + { + uapi_pm_add_sleep_veto(PM_ID_BP); + } + i2c_data_t i2c_data; i2c_data.send_buf = &data; i2c_data.send_len = sizeof(data); @@ -34,11 +42,24 @@ bool Bn02_write_reg(uint8_t data) if (ret != ERRCODE_SUCC) printf("i2c Write data write fail! ret=0x%x\n", ret); + cnt = pm_veto_get_id_cnt(PM_ID_BP); + if (cnt == 1) + { + uapi_pm_remove_sleep_veto(PM_ID_BP); + } + return 1; } bool Bn02_reads(uint8_t *data,int len) { + + uint8_t cnt = pm_veto_get_id_cnt(PM_ID_BP); + if (cnt == 0) + { + uapi_pm_add_sleep_veto(PM_ID_BP); + } + i2c_data_t i2c_data; i2c_data.send_buf = NULL; i2c_data.send_len = 0; @@ -49,6 +70,12 @@ bool Bn02_reads(uint8_t *data,int len) if (ret != ERRCODE_SUCC) printf("i2c read data fail! ret=0x%x\n", ret); + cnt = pm_veto_get_id_cnt(PM_ID_BP); + if (cnt == 1) + { + uapi_pm_remove_sleep_veto(PM_ID_BP); + } + return 1; } @@ -83,13 +110,30 @@ void Bn02_Power_Ctrl(int onoff) } } +void bn02_int_init(void) +{ + uapi_pin_set_ie(P_INT,HAL_PIO_IE_ENBALE); +} + +void bn02_int_deinit(void) +{ + uapi_pin_set_ie(P_INT,HAL_PIO_IE_DISABLE); +} + void bn02_int_handle(void) { uint8_t bn02_buf[48] = {0}; int i; memset(bn02_buf,0,sizeof(bn02_buf)); Bn02_reads(bn02_buf,48); - for(i = 0;i<48;i++) + + if(bn02_get_ble_status()) + { + bn02_replymsg(bn02_buf,sizeof(bn02_buf),1); + } + + + for(i = 0;i<48;i++) { printf("[%d]= 0x%x\n",i,bn02_buf[i]); } @@ -98,13 +142,13 @@ void bn02_int_handle(void) void bn02_start(void) { Bn02_Power_Ctrl(1); + bn02_int_init(); Bn02_write_reg(BN02_START_CMD); } void bn02_stop(void) { + bn02_int_deinit(); Bn02_write_reg(BN02_STOP_CMD); Bn02_Power_Ctrl(0); } - - 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 index 000000000..9a5c697f6 --- /dev/null +++ b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.c @@ -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 index 000000000..ace1004f6 --- /dev/null +++ b/code/sdk/zhihui/drivers/bp/service/bp_ble_service.h @@ -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 diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h b/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h index 16875905d..352ef117e 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_drv.h @@ -54,6 +54,8 @@ typedef long long GS64; /**< 64bit signed integer type */ #define GH3020_ID (0x00) #define GH3026_ID (0x01) +#define GH3220_ID (0x03) + #define GH3X2X_MP_DISABLE (0) #define GH3X2X_MP_ENABLE (1) diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h b/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h index f22e31afd..4ccc448a9 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-01-13 10:11:20 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-17 15:57:59 + * @LastEditTime: 2025-02-17 11:32:58 * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/inc/gh3x2x_afe_user.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -11,7 +11,7 @@ #include "gh3x2x_afe_drv.h" -#define GH3X2X_CHIP_ID GH3020_ID +#define GH3X2X_CHIP_ID GH3220_ID #define GH3X2X_AFE_MP_MODE GH3X2X_MP_ENABLE @@ -33,13 +33,8 @@ /****** chip reset type config ***************************/ #define GH3X2X_AFE_RESET_TYPE GH3X2X_AFE_RESET_SOFTWARE - - - - - - - +void hal_gh3x2x_afe_int_init(void); +void hal_gh3x2x_afe_int_deinit(void); #endif diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c index 148fc9918..211b1e080 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-01-13 11:45:20 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-02-12 10:50:38 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_demo.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #include "gh3x2x_afe_ecg.h" #include "gh3x2x_afe_adt.h" #include "gh3x2x_afe_agc.h" @@ -11,12 +19,14 @@ GU32 g_unFuncMode = GH3X2X_NO_FUNCTION; void GH3X2X_AFE_StartFunction(GU32 unFuncMode) { + //红外佩戴检测 if(unFuncMode & (GH3X2X_FUNCTION_ADT)) { - GH3x2xAdtAlgoInit(); + GH3x2xAdtAlgoInit(); GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,1); } + //心电图 if(unFuncMode & (GH3X2X_FUNCTION_ECG)) { GH3X2X_LeadOffDetectInit(); @@ -38,7 +48,7 @@ void GH3X2X_AFE_StopFunction(GU32 unFuncMode) if(unFuncMode & (GH3X2X_FUNCTION_ADT)) { GH3X2X_AFE_WriteRegBitField(GH3X2X_AFE_REG_SLOT_EN_ADDR,GH3X2X_ADT_SLOT_NUM,GH3X2X_ADT_SLOT_NUM,0); - GH3x2xAdtAlgoDeinit(); + GH3x2xAdtAlgoDeinit(); } if(unFuncMode & (GH3X2X_FUNCTION_ECG)) { diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c index b0e72b3f7..0d6677247 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_drv.c @@ -375,8 +375,7 @@ void GH3X2X_AFE_I2cSendCmd(GU8 uchCmd) uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR); uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_I2C_CMD_ADDR); uchBuffArr[2] = uchCmd; - hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 3); - // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, GH3X2X_AFE_I2C_CMD_ADDR, 1 , &uchCmd, 1, GH3X2X_I2C_BUS); + hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 3); } /** @@ -400,8 +399,7 @@ void GH3X2X_AFE_I2cWriteReg(GU16 usRegAddr, GU16 usRegValue) uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr); uchBuffArr[2] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegValue); uchBuffArr[3] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegValue); - hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 4); - // custom_i2c_write_reg(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , &usRegValue, szieof(usRegValue), GH3X2X_I2C_BUS); + hal_gh3x2x_afe_i2c_write(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 4); } @@ -425,9 +423,7 @@ GU16 GH3X2X_AFE_I2cReadReg(GU16 usRegAddr) uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr); uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr); - hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, uchReadBuffArr, 2); - - // custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr, 1 , uchReadBuffArr, sizeof(uchReadBuffArr), GH3X2X_I2C_BUS); + hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, uchReadBuffArr, 2); return GH3X2X_AFE_MAKEUP_WORD(uchReadBuffArr[0], uchReadBuffArr[1]); } @@ -450,13 +446,11 @@ void GH3X2X_I2cReadRegs(GU16 usRegAddr, GU16 *pusRegValueArr, GU8 uchLen) { GU8 uchBuffArr[2] = {0}; - // uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr); - // uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr); - - custom_i2c_read_regs(GH3X2X_AFE_I2C_DEVICE_ADDR, usRegAddr,1, pusRegValueArr, uchLen ,GH3X2X_I2C_BUS); + uchBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(usRegAddr); + uchBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(usRegAddr); - // hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchBuffArr, 2, \ - // (GU8 *)pusRegValueArr, uchLen * 2); + hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchBuffArr, 2, \ + (GU8 *)pusRegValueArr, uchLen * 2); GH3X2X_SwapLittleBigEndianData((GU8 *)pusRegValueArr, (GU16)uchLen * 2); } @@ -482,7 +476,7 @@ void GH3X2X_AFE_I2cReadFifo(GU8 *puchDataBuffer, GU16 usLen) uchCmdBuffArr[0] = GH3X2X_AFE_GET_HIGH_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR); uchCmdBuffArr[1] = GH3X2X_AFE_GET_LOW_BYTE_FROM_WORD(GH3X2X_AFE_FIFO_REG_ADDR); - hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_ADDR, uchCmdBuffArr, 2, puchDataBuffer, usLen); + hal_gh3x2x_afe_i2c_read(GH3X2X_AFE_I2C_DEVICE_BASE, uchCmdBuffArr, 2, puchDataBuffer, usLen); } #endif @@ -680,7 +674,7 @@ void GH3X2X_AFE_CommunicateConfirm(void) } else { - GH3X2X_INFO_LOG("[%s]ready code reg is error !!! \r\n", __FUNCTION__); + 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)); while(1); } @@ -1326,7 +1320,7 @@ GS8 GH3X2X_AFE_CheckChipId(void) GS8 chipd_id = GH3X2X_AFE_GetChipId(); if(GH3X2X_CHIP_ID != chipd_id) { - GH3X2X_INFO_LOG("wrong chip id!!\r\n"); + GH3X2X_INFO_LOG("wrong chip id!! 0x%x\r\n",chipd_id); chRet = GH3X2X_AFE_RET_GENERIC_ERROR; } else diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c index 8190fedb9..291208e23 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_afe_user.c @@ -15,8 +15,11 @@ #include "gh3x2x_demo_goodix_PLATFORM.h" #else + #include "spi.h" +#include "custom_utils.h" + #define GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length) #define GOODIX_PLATFORM_SPI_READ_ENTITY() #define GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY() @@ -39,6 +42,8 @@ #define GH3X2X_MOSI S_MGPIO1 #define GH3X2X_MISO S_MGPIO0 +#define H_INT S_AGPIO_R6 + #define GH3X2X_SPI_BUS SPI_BUS_0 #define GH3X2X_I2C_BUS I2C_BUS_2 @@ -128,35 +133,9 @@ void hal_gh3x2x_afe_i2c_init(void) */ GU8 hal_gh3x2x_afe_i2c_write(GU8 device_id, const GU8 write_buffer[], GU16 length) { - uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); - if (cnt == 0) - { - uapi_pm_add_sleep_veto(PM_ID_HEART); - } - uint8_t ret = 1; - - /* code implement by user */ - - // GOODIX_PLATFORM_I2C_WRITE_ENTITY(device_id, write_buffer,length); - i2c_data_t i2c_data; - i2c_data.send_buf = write_buffer; - i2c_data.send_len = length; - i2c_data.receive_buf = NULL; - i2c_data.receive_len = 0; - // custom_i2c_write_reg(BN02_I2C_ADDR, 0x00, 1, &data, 1, BN02_I2C_BUS); - errcode_t result = uapi_i2c_master_write(GH3X2X_I2C_BUS, device_id, &i2c_data); - if (result != ERRCODE_SUCC) - printf("i2c write data fail! ret=0x%x\n", result); - // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS); - - cnt = pm_veto_get_id_cnt(PM_ID_HEART); - if (cnt == 1) - { - uapi_pm_remove_sleep_veto(PM_ID_HEART); - } - - - return ret; + // custom_i2c_transfer(0x14,write_buffer, length, NULL, 0, GH3X2X_I2C_BUS); + custom_i2c_write_reg(0x14, 0, 0, write_buffer, length, GH3X2X_I2C_BUS); + return 1; } /** @@ -179,35 +158,8 @@ GU8 hal_gh3x2x_afe_i2c_write(GU8 device_id, const GU8 write_buffer[], GU16 lengt */ GU8 hal_gh3x2x_afe_i2c_read(GU8 device_id, const GU8 write_buffer[], GU16 write_length, GU8 read_buffer[], GU16 read_length) { - uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); - if (cnt == 0) - { - uapi_pm_add_sleep_veto(PM_ID_HEART); - } - uint8_t ret = 1; - - /* code implement by user */ - - // GOODIX_PLATFORM_I2C_READ_ENTITY(device_id, write_buffer, write_length, read_buffer, read_length); - - i2c_data_t i2c_data; - i2c_data.send_buf = write_buffer; - i2c_data.send_len = write_length; - i2c_data.receive_buf = read_buffer; - i2c_data.receive_len = read_length; - - errcode_t result = uapi_i2c_master_writeread(GH3X2X_I2C_BUS, device_id, &i2c_data); - if (result != ERRCODE_SUCC) - printf("i2c read data fail! ret=0x%x\n", result); - // custom_i2c_read_regs(device_id, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS); - - cnt = pm_veto_get_id_cnt(PM_ID_HEART); - if (cnt == 1) - { - uapi_pm_remove_sleep_veto(PM_ID_HEART); - } - - return ret; + custom_i2c_transfer(0x14,write_buffer, write_length, read_buffer, read_length, GH3X2X_I2C_BUS); + return 1; } #else @@ -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) { /* init spi and cs pin */ - // GOODIX_PLATFORM_SPI_INIT_ENTITY(); - spi_bus_t bus; - spi_attr_t attr; - bus = SPI_BUS_0; - attr.is_slave = false; - attr.slave_num = 1; - attr.bus_clk = 40000000; - attr.freq_mhz = 10; - 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_DISABLE; - attr.ndf = 1; - - uapi_spi_init(bus,&attr,NULL); + GOODIX_PLATFORM_SPI_INIT_ENTITY(); } /** @@ -267,9 +202,14 @@ void hal_gh3x2x_afe_spi_init(void) */ GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length) { - GU8 ret = 1; + uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); + if (cnt == 0) + { + uapi_pm_add_sleep_veto(PM_ID_HEART); + } + + errcode_t ret; - // GOODIX_PLATFORM_SPI_WRITE_ENTITY(write_buffer, length); spi_xfer_data_t sdata ={0} ; sdata.tx_buff = write_buffer; @@ -277,10 +217,17 @@ GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length) sdata.rx_buff = NULL; sdata.rx_bytes = 0; - ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0x100); + ret = uapi_spi_master_write(GH3X2X_SPI_BUS, &sdata, 0XFF); + if (ret != ERRCODE_SUCC) + printf("spi write data fail! ret=0x%x\n", ret); + cnt = pm_veto_get_id_cnt(PM_ID_HEART); + if (cnt == 1) + { + uapi_pm_remove_sleep_veto(PM_ID_HEART); + } - return ret; + return 1; } @@ -301,7 +248,13 @@ GU8 hal_gh3x2x_afe_spi_write(GU8 write_buffer[], GU16 length) */ GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length) { - GU8 ret = 1; + uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); + if (cnt == 0) + { + uapi_pm_add_sleep_veto(PM_ID_HEART); + } + + errcode_t ret; // GH3X2X_AFE_UNUSED_VAR(read_buffer); // GH3X2X_AFE_UNUSED_VAR(length); // GOODIX_PLATFORM_SPI_READ_ENTITY(); @@ -312,9 +265,15 @@ GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length) sdata.rx_buff = read_buffer; sdata.rx_bytes = length; - ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0x100); + ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF); + + cnt = pm_veto_get_id_cnt(PM_ID_HEART); + if (cnt == 1) + { + uapi_pm_remove_sleep_veto(PM_ID_HEART); + } - return ret; + return 1; } #elif (GH3X2X_AFE_SPI_TYPE == GH3X2X_AFE_SPI_HARDWEAR_CS) /** @@ -333,12 +292,28 @@ GU8 hal_gh3x2x_afe_spi_read(GU8 read_buffer[], GU16 length) */ GU8 hal_gh3x2x_afe_spi_write_F1_and_read(GU8 read_buffer[], GU16 length) { - GU8 ret = 1; - GH3X2X_AFE_UNUSED_VAR(read_buffer); - GH3X2X_AFE_UNUSED_VAR(length); - GOODIX_PLATFORM_SPI_READ_ENTITY(); + // GU8 ret = 1; + // GH3X2X_AFE_UNUSED_VAR(read_buffer); + // GH3X2X_AFE_UNUSED_VAR(length); + // GOODIX_PLATFORM_SPI_READ_ENTITY(); - return ret; + // return ret; + + errcode_t ret = 1; + // GH3X2X_AFE_UNUSED_VAR(read_buffer); + // GH3X2X_AFE_UNUSED_VAR(length); + // GOODIX_PLATFORM_SPI_READ_ENTITY(); + + spi_xfer_data_t sdata ={0} ; + sdata.tx_buff = NULL; + sdata.tx_bytes = 0; + sdata.rx_buff = read_buffer; + sdata.rx_bytes = length; + + ret = uapi_spi_master_read(GH3X2X_SPI_BUS, &sdata, 0XFF); + if (ret != ERRCODE_SUCC) + printf("spi read data fail! ret=0x%x\n", ret); + return 1; } #endif @@ -363,7 +338,7 @@ void hal_gh3x2x_afe_spi_cs_ctrl(GU8 cs_pin_level) // GH3X2X_AFE_UNUSED_VAR(cs_pin_level); // GOODIX_PLATFORM_SPI_CS_CTRL_ENTITY(); - uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_GPIO); + uapi_pin_set_mode(GH3X2X_CS, (pin_mode_t)HAL_PIO_FUNC_SPI0); uapi_gpio_set_dir(GH3X2X_CS, GPIO_DIRECTION_OUTPUT); uapi_gpio_set_val(GH3X2X_CS, cs_pin_level); @@ -430,7 +405,14 @@ void hal_gh3x2x_afe_reset_pin_ctrl(GU8 pin_level) void hal_gh3x2x_afe_int_init(void) { - GOODIX_PLATFORM_INT_INIT_ENTITY(); + // GOODIX_PLATFORM_INT_INIT_ENTITY(); + uapi_pin_set_ie(H_INT,HAL_PIO_IE_ENBALE); +} + +void hal_gh3x2x_afe_int_deinit(void) +{ + // GOODIX_PLATFORM_INT_INIT_ENTITY(); + uapi_pin_set_ie(H_INT,HAL_PIO_IE_DISABLE); } #if (GH3X2X_AFE_PRO_BY_INT == GH3X2X_AFE_PRO_TYPE) @@ -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 g_uchGh3x2xAfeIntCallBackIsCalled = 1; #if GH3X2X_AFE_MP_MODE - GH3X2X_MP_SET_INT_FLAG(); //gh3x2x mp test must call it + // GH3X2X_MP_SET_INT_FLAG(); //gh3x2x mp test must call it #endif /****************** DO NOT MODITY ****************************************************************/ diff --git a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_hal.c b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_hal.c index d1eea6e1d..5a6f1ec43 100644 --- a/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_hal.c +++ b/code/sdk/zhihui/drivers/ppg/gh3x2x/src/gh3x2x_hal.c @@ -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 @@ -25,28 +27,28 @@ 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 diff --git a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp index 7644bdaef..72492c79b 100644 --- a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp +++ b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp @@ -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) diff --git a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt index 3c8a50168..25532568e 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt @@ -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) diff --git a/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c b/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c index 0b3aeb6ed..ab3ae6f1d 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c @@ -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) diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.c similarity index 52% rename from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c rename to code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.c index d4ec4702b..269ddfaaa 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.c @@ -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; } diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.h b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.h similarity index 83% rename from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.h rename to code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.h index 20eadf83c..a747b609f 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_at_cmd.h @@ -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 #include @@ -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 index 000000000..3a909b7ad --- /dev/null +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.c @@ -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 diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h similarity index 89% rename from code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h rename to code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h index d60d8fd07..740d4f325 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h @@ -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 diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.c similarity index 96% rename from code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c rename to code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.c index bea41fcea..e695aee35 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.c @@ -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 #include #include -#include "tyhx_OTS_hx3509_custom.h" +#include "tyhx_OTS_hx3508_custom.h" #include "cmsis_os2.h" #include "custom_utils.h" #include "hal_gpio.h" @@ -47,10 +47,10 @@ #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; diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.h similarity index 95% rename from code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h rename to code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.h index 215a42f33..2fed13dff 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3508/tyhx_OTS_hx3508_custom.h @@ -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 index ef3f47024..000000000 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c +++ /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 diff --git a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c index 7cb61bcc9..6d1e53190 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c @@ -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 diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index 2ca706fc6..0ee9844da 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -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; diff --git a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c index aa12365de..47edc7275 100644 --- a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c +++ b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c @@ -264,34 +264,8 @@ bool bigDataBufState=false;//大数据传输状态 /** * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算 */ -static 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; -} -/*** - * 根据求和后的数据计算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_file(char *file_path) { uint8_t lrcValue =0; @@ -356,23 +330,6 @@ static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte } -static 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; -} - -static 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; -} static cJSON *cjson_json_tmp = NULL; //发送ble数据 diff --git a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h index bd095c624..d75740f62 100644 --- a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h +++ b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h @@ -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 diff --git a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c index e12969eb1..14a98d4c8 100644 --- a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c +++ b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-06-17 14:31:08 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-16 10:01:35 + * @LastEditTime: 2025-02-20 18:34:13 * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c * @Description: * @@ -69,6 +69,11 @@ #include "NMEA0183.h" static gps_data_t send_gps_data = {0}; #endif + +#ifdef ENABLE_BN02 +#include "bp_ble_service.h" +#endif + #pragma pack(1) typedef struct factorytest_cmd_header_t { @@ -543,7 +548,9 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0); //进入产测模式 关闭充电弹窗 uapi_dev_runtime_set_factory_test_status(1); //设置产测模式runtime svr_ble_adv_factory_test_start_param(); //设置蓝牙广播 避免出现连接问题 -#endif + + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV,NULL,0); +#endif factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON, BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE, 0x01, @@ -551,7 +558,15 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t 1); #ifdef FD230 uapi_hfp_connect_(); + // uint8_t cmd = BR_HFP_CONNECT; + + // cmd = BR_A2DP_CONNECT; + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd)); + LOS_Msleep(500); + + // cmd = BR_A2DP_CONNECT; + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd)); uapi_a2dp_snk_connect_(); #endif } else if (testitem == 0x02) @@ -2101,6 +2116,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint uint8_t send_data= 0; // uapi_start_audio_test(30); uapi_microhone_switch(1); + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x01, @@ -2113,6 +2129,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint uint8_t send_data= 0; // uapi_stop_audio_test(); uapi_microhone_switch(0); + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x02, @@ -2124,6 +2141,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //播放录音 uint8_t send_data= 0; uapi_check_mic(1); + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_CHECK_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x03, @@ -2134,6 +2152,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //停止播放 uint8_t send_data= 0; uapi_check_mic(0); + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_CHECK_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x04, @@ -2148,23 +2167,55 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint 0x05, &send_data, 1); + } else if(testitem == 0x06) + { + //播放扫频文件 + uint8_t send_data = 0; + uapi_check_spk(2); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, + BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, + 0x06, + &send_data, + 1); + } else if(testitem == 0x07) + { + //删除扫频文件 + uint8_t send_data = uapi_delete_files("/user/music/20-20KHZ.mp3"); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, + BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, + 0x07, + &send_data, + 1); } - - if (testitem == 0x06) + else if (testitem == 0x08) { uint8_t send_data = 0x00; -#ifdef FD230 - uapi_hfp_connect_(); - LOS_Msleep(500); - uapi_a2dp_snk_connect_(); -#endif + + send_data = factorytest_upload_mic_file(); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, - 0x03, + 0x08, &send_data, 1); } + +// else if (testitem == 0x08) +// { +// uint8_t send_data = 0x00; +// #ifdef FD230 +// uapi_hfp_connect_(); +// LOS_Msleep(500); +// uapi_a2dp_snk_connect_(); +// #endif +// factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, +// BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, +// 0x03, +// &send_data, +// 1); +// } + break; case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP: @@ -2389,7 +2440,15 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size) } - }else{ + } + else if(header.header == BLE_TEST_BN02_HEADER) + { +#ifdef ENABLE_BN02 + bn02_parse_frame(buf,event_size); +#endif + } + else + { printf("crc error!\r\n"); return ERRCODE_FAIL; } diff --git a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h index d238728fd..b2cbec6f1 100644 --- a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h +++ b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h @@ -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 diff --git a/code/sdk/zhihui/utils/custom_cmd_service.c b/code/sdk/zhihui/utils/custom_cmd_service.c index 052976c05..9ccffd351 100644 --- a/code/sdk/zhihui/utils/custom_cmd_service.c +++ b/code/sdk/zhihui/utils/custom_cmd_service.c @@ -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; diff --git a/code/sdk/zhihui/utils/custom_utils.c b/code/sdk/zhihui/utils/custom_utils.c index 77d8df903..91d30d3e1 100644 --- a/code/sdk/zhihui/utils/custom_utils.c +++ b/code/sdk/zhihui/utils/custom_utils.c @@ -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*)®)[0]; - write_data[1] = ((uint8_t*)®)[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; +} diff --git a/code/sdk/zhihui/utils/custom_utils.h b/code/sdk/zhihui/utils/custom_utils.h index f119a67e4..ed203beca 100644 --- a/code/sdk/zhihui/utils/custom_utils.h +++ b/code/sdk/zhihui/utils/custom_utils.h @@ -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" -- 2.17.1