From: penglei <1624952103@qq.com> Date: Thu, 2 Jan 2025 08:21:53 +0000 (+0800) Subject: 增加l22 hx3509底层驱动,同时兼容hx3507 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=be8ebf7d37c07f256b767a108215775bc7fb01d5;p=mirrors%2FFD230.git 增加l22 hx3509底层驱动,同时兼容hx3507 --- 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 a0bccf2e0..d42928649 100644 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -500,7 +500,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG); #endif #ifdef ENABLE_CUSTOM_I2C - errcode_t result = custom_iic_init(); + errcode_t result = custom_i2c_init(I2C_BUS_2); if(result != SUCC) PRINT("custom_iic_init failed !!! \r\n"); else diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index 24e6de805..8ddd853bc 100644 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -467,7 +467,9 @@ target = { 'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1', 'TPTYPE_CST86XX', 'PPG_VC9202', - 'ROTARYENCODER_HX3507', + #'ROTARYENCODER_HX3507', + 'ROTARYENCODER_U8', + 'FUNC_KEY2', 'NANDFLASH_DS35X' ], 'ram_component': [ diff --git a/code/sdk/drivers/boards/brandy_evb/board_config/board_lt22.h b/code/sdk/drivers/boards/brandy_evb/board_config/board_lt22.h index ec77f3cd7..1941963f6 100644 --- a/code/sdk/drivers/boards/brandy_evb/board_config/board_lt22.h +++ b/code/sdk/drivers/boards/brandy_evb/board_config/board_lt22.h @@ -280,10 +280,10 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = { { S_AGPIO_L30, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL }, - // // S_AGPIO_L12 SDIO_BT 光电开关 sd - // { S_AGPIO_L12, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, - // // S_AGPIO_L13 SCLK_BT 光电开关 sc - // { S_AGPIO_L13, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, + // S_AGPIO_L12 SDIO_BT 光电开关 sd + { S_AGPIO_L12, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, + // S_AGPIO_L13 SCLK_BT 光电开关 sc + { S_AGPIO_L13, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, // // S_AGPIO_L26 心率复位 PPG reset // { S_AGPIO_L26, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, 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 f188974e3..45687c18e 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 @@ -18,6 +18,10 @@ extern void ppg_int_callback(pin_t pin, uintptr_t param); #ifdef ENABLE_CYWEE extern void cywee_int_callback(pin_t pin, uintptr_t param); #endif + +#ifdef ROTARYENCODER_U8 +extern void crown_int_callback(pin_t pin, uintptr_t param); +#endif /** * @addtogroup connectivity_config_boards * @{ @@ -171,8 +175,11 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = { { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE }, // S_AGPIO_L11 G_INT1 { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L12 i2c data HX3507_SDIO +#ifdef ROTARYENCODER_U8 + { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L13 i2c CLK HX3507_SCLK +#else { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_L13 i2c CLK HX3507_SCLK - +#endif { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L14 NC { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L15 NC { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L16 NC @@ -222,7 +229,11 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = { { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // 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 { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_R8 GYRO_INT1 - { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_R9 BAT_CHARGE_OFF 关掉充电 温度高的时候 +#ifdef BOARD_U8 + { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_R9 u8为key3 +#else + { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_R9 BAT_CHARGE_OFF 关掉充电 温度高的时候 +#endif { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_R10 Key2 ///////////////////HAL_PIO_IE_ENBALE input enable #if CORE == APPS @@ -275,9 +286,9 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = { // S_AGPIO_L17 HX3507_INT // { S_AGPIO_L17, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, // S_AGPIO_L12 SDIO_BT - { S_AGPIO_L12, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, + { S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, // S_AGPIO_L13 SCLK_BT - { S_AGPIO_L13, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, + { S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, // S_AGPIO_L26 心率复位 PPG reset { S_AGPIO_L26, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL }, @@ -320,6 +331,8 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = { #ifdef PPG_VC9202 { S_AGPIO_R6, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE, ppg_int_callback}, + { S_AGPIO_L12, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_HIGH, crown_int_callback}, + { S_AGPIO_L13, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_HIGH, crown_int_callback}, #endif }; diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c index be4a803c8..72baf7ec8 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c @@ -68,7 +68,10 @@ bool hp45xxx_read_reg(uint8_t reg, uint8_t *value) } // Initialize HP4570 chip -bool hp45xxx_init(uint8_t chip_ver){ +bool hp45xxx_init(uint8_t chip_ver) +{ + custom_i2c_init(I2C_BUS_0); + switch (chip_ver){ case HP4570K: hp45xxx_i2c_addr = HP4570K_I2C_ADDR; diff --git a/code/sdk/zhihui/drivers/charge/service/charge_at_cmd.c b/code/sdk/zhihui/drivers/charge/service/charge_at_cmd.c index 41d45a67e..552f30a23 100644 --- a/code/sdk/zhihui/drivers/charge/service/charge_at_cmd.c +++ b/code/sdk/zhihui/drivers/charge/service/charge_at_cmd.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-12-23 15:11:01 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2024-12-24 21:09:51 + * @LastEditTime: 2024-12-30 15:24:42 * @FilePath: /sdk615/code/sdk/zhihui/drivers/charge/HP4570/service/charge_at_cmd.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -89,7 +89,7 @@ static uint32_t hp4570_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd) return ERRCODE_SUCC; } static const at_cmd_table_t g_charge_cmd[] = { - { (char *)"AT^CHARGETEST", hp4570_test, (char *)"1" }, + { (char *)"AT^HP4570TEST", hp4570_test, (char *)"1" }, }; at_cmd_table_t *get_charge_cmd_table(uint32_t *cmd_count) diff --git a/code/sdk/zhihui/drivers/cywee/src/main_dml.c b/code/sdk/zhihui/drivers/cywee/src/main_dml.c index 7195e8bfa..38ea99f13 100644 --- a/code/sdk/zhihui/drivers/cywee/src/main_dml.c +++ b/code/sdk/zhihui/drivers/cywee/src/main_dml.c @@ -1176,7 +1176,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { if((int)sensorEVT->fData[1] == CUSTOM_OFFBODY_DETECT) { CWM_OS_dbgPrintf("CUSTOM_OFFBODY_DETECT !!! \r\n"); -#if 1 +#if 0 if((int)sensorEVT->fData[2] == 1) send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST); else diff --git a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt index 4b6e69cd2..d9223517b 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt @@ -16,7 +16,8 @@ set(PUBLIC_HEADER set(PUBLIC_DEFINES SUPPORT_AT_HX3507 ) -else() + +elseif("ROTARYENCODER_HX3509" IN_LIST DEFINES) set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/tyhx_OTS_hx3509_custom.c ${CMAKE_CURRENT_SOURCE_DIR}/hx3509/hx3509_hal.c @@ -27,7 +28,16 @@ set(PUBLIC_HEADER ) set(PUBLIC_DEFINES SUPPORT_AT_HX3509 +) +elseif("ROTARYENCODER_U8" IN_LIST DEFINES) +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/crown/crown.c +) +set(PUBLIC_HEADER + ${CMAKE_CURRENT_SOURCE_DIR}/crown +) +set(PUBLIC_DEFINES ) endif() diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c index 491dac39e..3bfc6a29e 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2024-12-23 14:24:09 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2024-12-30 17:28:09 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ // #include "hx3507.h" @@ -126,12 +134,12 @@ encoder_peripheral_api g_hx3507_api = { }; -void *rotary_encoder_get_api(void) +void *rotary_encoder_get_hx3507_api(void) { return ((void *)&g_hx3507_api); } -void *rotary_encoder_get_peri_attr(void) +void *rotary_encoder_get_hx3507_peri_attr(void) { return ((void *)NULL); } \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.h b/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.h index f4e6b5fb4..926b00662 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.h @@ -20,8 +20,8 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -void *rotary_encoder_get_api(void); -void *rotary_encoder_get_peri_attr(void); +void *rotary_encoder_get_hx3507_api(void); +void *rotary_encoder_get_hx3507_peri_attr(void); #ifdef __cplusplus #if __cplusplus diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c index 0d11aca38..d4ec4702b 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-12-18 10:23:22 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2024-12-20 18:45:27 + * @LastEditTime: 2025-01-02 16:20:33 * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/hx3509/hx3509_at_cmd.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -16,6 +16,7 @@ #include "tyhx_OTS_hx3509_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 diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c index 3ed4e00f3..88c40cfbc 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c @@ -15,8 +15,8 @@ uint32_t hx3509_start(void) re_print("SKIP hx3509test start, already started\r\n"); return 0; } - crown_init(); - crown_start(); + ots_init(); + ots_start(); g_hx3509_test_started = 1; return ERRCODE_SUCC; } @@ -27,7 +27,7 @@ uint32_t hx3509_stop(void) re_print("SKIP hx3509test stop, already stopped\r\n"); return 0; } - crown_stop(); + ots_stop(); g_hx3509_test_started = 0 ; return ERRCODE_SUCC; } @@ -48,8 +48,8 @@ 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 = get_crown_result(); - int16_t stand_still = get_stand_still(); + 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 ) { @@ -120,12 +120,12 @@ encoder_peripheral_api g_hx3509_api = { }; -// void *rotary_encoder_get_api(void) -// { -// return ((void *)&g_hx3509_api); -// } +void *rotary_encoder_get_hx3509_api(void) +{ + return ((void *)&g_hx3509_api); +} -// void *rotary_encoder_get_peri_attr(void) -// { -// return ((void *)NULL); -// } \ No newline at end of file +void *rotary_encoder_get_peri_hx3509_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/hx3509/hx3509_hal.h index 9401ff04d..6acfd8c1b 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2024-12-23 15:11:25 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2024-12-30 17:28:53 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE; + */ /** * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n * @@ -20,8 +28,8 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -// void *rotary_encoder_get_api(void); -// void *rotary_encoder_get_peri_attr(void); +void *rotary_encoder_get_hx3509_api(void); +void *rotary_encoder_get_peri_hx3509_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/hx3509/tyhx_OTS_hx3509_custom.c index bfc9a9207..bea41fcea 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c @@ -55,6 +55,7 @@ void ots_timer_handler(void * p_context); #define REPORT_MIN 2 // 这个是最小上报角度, 按照平均值预估的值, 由客户定义, 看多大的数据上报给UI处理一次 static int16_t ots_result = 0;//ots结果 +static int16_t stand_still = 1; //静止标志 1 静止,0 转动 bool ots_timer_running = false; //ots定时器是否运行标志 @@ -107,23 +108,113 @@ void ots_timer_handler(void * p_context) } /*----------------------以上为定时函数相关定义 建立/启动/停止定时器//定时中断处理---------- ---------------------*/ +void crown_i2c_SendByte(uint8_t byte) +{ + uint8_t i; + uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT); + + for (i = 0; i < 8; i++) + { + if (byte & 0x80) + { + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + } + else + { + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + } + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + if (i == 7) + { + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + } + byte <<= 1; + LOS_Udelay(COM_DELAY); + } +} + +uint8_t crown_i2c_ReadByte(void) +{ + uint8_t i; + uint8_t value = 0; + + for (i = 0; i < 8; i++) + { + value <<= 1; + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); + if (uapi_gpio_get_val(PIN_TYHX_SDIO)) + { + value++; + } + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + LOS_Udelay(COM_DELAY); + } + return value; +} -// 定义一个用于检测ACK信号的函数,返回1表示收到ACK,返回0表示未收到ACK -int crown_check_ack(void) +void crown_i2c_Ack(void) { + + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); +} - // 将SCLK引脚拉高,以便从设备在这个时钟周期内返回ACK信号(假设ACK在SCLK高电平期间有效) +void crown_i2c_NAck(void) +{ + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + LOS_Udelay(COM_DELAY); +} - // 读取SDIO引脚的电平状态,判断是否为低电平(低电平表示收到ACK) - if (uapi_gpio_get_val(PIN_TYHX_SDIO) == GPIO_LEVEL_LOW) { - return 1; // 收到ACK,返回1 - } - return 0; // 未收到ACK,返回0 +void crown_i2c_start(void) +{ + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); +} + +void crown_i2c_stop(void) +{ + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); +} + + +int crown_wait_ack(void) +{ + int ret = 0; + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + LOS_Udelay(COM_DELAY); + + if (uapi_gpio_get_val(PIN_TYHX_SDIO) == GPIO_LEVEL_LOW) + ret = 1; + else + ret = 0; + + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + LOS_Udelay(COM_DELAY); + return ret; } /*---------------------------以下为OTS 的寄存器读写,初始化/开始/结束------------------------*/ @@ -141,54 +232,70 @@ uint8_t crown_read_reg(uint8_t deviceAddr, uint8_t regaddr) // TYHX_LOG("regaddr 0x%x\r\n",regaddr); // regaddr &= 0x7f; - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - uapi_tcxo_delay_us(COM_DELAY); + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + // uapi_tcxo_delay_us(COM_DELAY); - // 先发送设备地址(包含读写位) - for(int i = 0; i < 8; i++) - { - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + crown_i2c_start(); - if(addrWithRwBit & 0x80) - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); - } - else - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - } - //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + crown_i2c_SendByte(addrWithRwBit); - addrWithRwBit <<= 1; - // uapi_tcxo_delay_us(COM_DELAY); - } + // // 先发送设备地址(包含读写位) + // for(int i = 0; i < 8; i++) + // { + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - // 发送寄存器地址 - for(int i = 0; i < 8; i++) + // if(addrWithRwBit & 0x80) + // { + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + // } + // else + // { + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + // } + // //uapi_tcxo_delay_us(COM_DELAY); + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + + // addrWithRwBit <<= 1; + // // uapi_tcxo_delay_us(COM_DELAY); + // } + + if(!crown_wait_ack()) { - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + // TYHX_LOG("111 wait ack error !!! \n"); + } - if(regaddr & 0x80) - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); - } - else - { - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - } - //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + crown_i2c_SendByte(regaddr); + // // 发送寄存器地址 + // for(int i = 0; i < 8; i++) + // { + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + + // if(regaddr & 0x80) + // { + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_HIGH); + // } + // else + // { + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + // } + // //uapi_tcxo_delay_us(COM_DELAY); + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + + // regaddr <<= 1; + // // uapi_tcxo_delay_us(COM_DELAY); + // } - regaddr <<= 1; - // uapi_tcxo_delay_us(COM_DELAY); + if(!crown_wait_ack()) + { + // TYHX_LOG("222 wait ack error !!! \n"); } - // // addrWithRwBit = (0x0 << 1) | 0x01; + addrWithRwBit = (deviceAddr << 1) | 0x01; + + crown_i2c_start(); - // addrWithRwBit = 0; - // printf("addrWithRwBit :0x%x \n",addrWithRwBit); + crown_i2c_SendByte(addrWithRwBit); // // 先发送设备地址(包含读写位) // for(int i = 0; i < 8; i++) @@ -210,35 +317,46 @@ uint8_t crown_read_reg(uint8_t deviceAddr, uint8_t regaddr) // // uapi_tcxo_delay_us(COM_DELAY); // } - // 开始读操作,HOST要把SDIO从输出端口改为输入端口. + if(!crown_wait_ack()) + { + // TYHX_LOG("333 wait ack error !!! \n"); + } + + + // // 开始读操作,HOST要把SDIO从输出端口改为输入端口. uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_INPUT); uapi_pin_set_pull(PIN_TYHX_SDIO, (pin_pull_t)HAL_PIO_PULL_UP); uapi_pin_set_ie(PIN_TYHX_SDIO,HAL_PIO_IE_ENBALE); // LOS_Udelay(COM_DELAY); //nrf_gpio_pin_clear(PIN_TYHX_SCLK); //uapi_tcxo_delay_us(COM_DELAY); + readvalue = crown_i2c_ReadByte(); - for(int i = 0; i < 8; i++) - { - readvalue <<= 1; - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + // for(int i = 0; i < 8; i++) + // { + // readvalue <<= 1; + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - //uapi_tcxo_delay_us(COM_DELAY); + // //uapi_tcxo_delay_us(COM_DELAY); - //uapi_tcxo_delay_us(COM_DELAY); + // //uapi_tcxo_delay_us(COM_DELAY); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_HIGH); - if(uapi_gpio_get_val(PIN_TYHX_SDIO)) - { - readvalue |= 0x1; - } - //uapi_tcxo_delay_us(COM_DELAY); + // if(uapi_gpio_get_val(PIN_TYHX_SDIO)) + // { + // readvalue |= 0x1; + // } + // //uapi_tcxo_delay_us(COM_DELAY); - } + // } uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + + + crown_i2c_NAck(); + crown_i2c_stop(); // TYHX_LOG("readvalue 0x%x\r\n",readvalue); return readvalue; } @@ -273,7 +391,7 @@ void crown_write_reg(uint8_t deviceAddr, uint8_t regaddr, uint8_t regvalue) addrWithRwBit <<= 1; } // if (!crown_check_ack()) { - // printf("write check error \n"); + // TYHX_LOG("write check error \n"); // return ; // } @@ -334,15 +452,18 @@ void ots_data_handler(void *p_event_data, uint16_t event_size) // if((ots_read_reg(RA_MOTION_BIT)&0x80)||(nrf_gpio_pin_read(PIN_TYHX_MOT)==false)) if((ots_read_reg(RA_MOTION_BIT)&0x80)) { + stand_still = 0; //X Y的数据必须全部被读出,但是我们只需要X的结果来判断方向和速度 deltax = ots_read_reg(RA_ACC_DELTA_X_LOW) |(ots_read_reg(RA_ACC_DELTA_X_HIG)<<8); deltay = ots_read_reg(RA_ACC_DELTA_Y_LOW) |(ots_read_reg(RA_ACC_DELTA_Y_HIG)<<8); TYHX_LOG("Deltay = %d \r\n",deltay);//djd0305 //用户添加程序, deltay 是表冠产生数据, 上报给UI, 如果需要数据变化, // 积攒到一定值再上报UI, 可以调用 ots_result_deal()函数处理. + ots_result_deal(deltax); } else { + stand_still = 1; //debug的时候, 可能用到, 看一下图像质量 TYHX_LOG("pic qulity =%d, agc num=%d\r\n",ots_read_reg(RA_DATA_2AGC),ots_read_reg(RA_EXP_NUM_SEL)&0x7F); } @@ -446,15 +567,15 @@ void crown_com_resync(void) void ots_init(void) { //此时要保证芯片已经正常上电 - // uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT); + uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT); - // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); + uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW); - // uapi_gpio_set_dir(PIN_TYHX_SCLK,GPIO_DIRECTION_OUTPUT); + uapi_gpio_set_dir(PIN_TYHX_SCLK,GPIO_DIRECTION_OUTPUT); - // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); + uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW); - // uapi_tcxo_delay_us(COM_DELAY); + uapi_tcxo_delay_us(COM_DELAY); // crown_com_resync(); int i; for(i=0; i<10; i++)//重复读DEVICE ID 是否等于0X35 @@ -646,7 +767,7 @@ bool ots_factory_test(void) */ void ots_result_deal(int16_t x) { -#if 0// 如果冠轴结构设计摆动角度很大(>5°), 请改成#if 1 +#if 1// 如果冠轴结构设计摆动角度很大(>5°), 请改成#if 1 if(abs(x)<=FILTER_MIN ) return; #endif @@ -666,11 +787,24 @@ void ots_result_deal(int16_t x) ots_result-=1; // } } - if(abs(ots_result)>=REPORT_MIN)//最小的值由用户定义, 就是得到值大于一定的值, 再上报UI - { - //OTS结果上报UI, 因为这里是定时读取的函数, 可以把结果上报 - ots_result = 0; - } + // if(abs(ots_result)>=REPORT_MIN)//最小的值由用户定义, 就是得到值大于一定的值, 再上报UI + // { + // //OTS结果上报UI, 因为这里是定时读取的函数, 可以把结果上报 + // ots_result = 0; + // } +} + +int16_t hx3509_get_stand_still(void) +{ + return stand_still; +} + +int16_t hx3509_get_crown_result(void) +{ + int16_t resulttemp; + resulttemp=ots_result; + ots_result = 0; + return resulttemp; } #else //其他平台,由用户自行添加上面对应的程序 diff --git a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h index a2a464ec4..215a42f33 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h @@ -38,7 +38,7 @@ /*----------------------以下为LOG打印函数, 用户需要改成自己平台的-------------------------------*/ //log 打印定义 -#define TYHX_LOG_ENABLE +// #define TYHX_LOG_ENABLE #ifdef TYHX_LOG_ENABLE #define TYHX_LOG(fmt, ...) \ do { \ @@ -186,4 +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); + #endif //_TYHX__OTS_hx3509_CUSTOM_H 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 4ff5d4159..9b5ae1636 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c @@ -176,16 +176,20 @@ static ext_errno re_register_callback(struct re_driver_data *attr) g_attr_re = attr; re_err("re_register_callback ----------succ!!!\n"); - if (attr->encoder_api->register_callback != NULL) { - ret = attr->encoder_api->register_callback(attr->private_data, re_callback_func); - if (ret != EXT_ERR_SUCCESS) { - re_err("register rotary encoder callback fail! ret=0x%x", ret); - return ret; + if(attr->encoder_api) + { + if (attr->encoder_api->register_callback != NULL) { + ret = attr->encoder_api->register_callback(attr->private_data, re_callback_func); + if (ret != EXT_ERR_SUCCESS) { + re_err("register rotary encoder callback fail! ret=0x%x", ret); + return ret; + } + } else { + re_err("rotary encoder callback register func is empty!"); } - } else { - re_err("rotary encoder callback register func is empty!"); } + return ret; } @@ -410,10 +414,12 @@ uint32_t re_init(void) int32_t ret; struct re_driver_data *redd = NULL; // re_err("re_init ----------1!!!\n"); - #ifdef ROTARYENCODER_HX3507 - g_encoder_drv.private_data = rotary_encoder_get_peri_attr(); - g_encoder_drv.encoder_api = rotary_encoder_get_api(); + g_encoder_drv.private_data = rotary_encoder_get_peri_hx3507_attr(); + g_encoder_drv.encoder_api = rotary_encoder_get_hx3507_api(); +#elif defined ROTARYENCODER_HX3509 + g_encoder_drv.private_data = rotary_encoder_get_peri_hx3509_attr(); + g_encoder_drv.encoder_api = rotary_encoder_get_hx3509_api(); #endif g_encoder_drv.ops = &g_re_status_ops; redd = rotary_encoder_get_driver_data(); @@ -450,23 +456,32 @@ uint32_t re_close(void) void rotary_encoder_suspend(void) { - + encoder_peripheral_api *encoder_ptr = NULL; /**灭屏,关闭Encoder*/ #ifdef ROTARYENCODER_HX3507 - encoder_peripheral_api *encoder_ptr = rotary_encoder_get_api(); + encoder_ptr = rotary_encoder_get_hx3507_api(); +#elif defined ROTARYENCODER_HX3509 + encoder_ptr = rotary_encoder_get_hx3509_api(); +#endif + if(encoder_ptr == NULL) + return; ext_errno ret = encoder_ptr->encoder_sleep(); if (ret != EXT_ERR_SUCCESS) { re_err("encoder sleep ret=0x%x", ret); } -#endif } void rotary_encoder_resume(void) { + encoder_peripheral_api *encoder_ptr = NULL; #ifdef ROTARYENCODER_HX3507 /**亮屏,恢复Encoder工作*/ - encoder_peripheral_api *encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_api(); + encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3507_api(); +#elif defined ROTARYENCODER_HX3509 + encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3509_api(); +#endif + if(encoder_ptr == NULL) + return; ext_errno ret = encoder_ptr->encoder_resume(); if (ret != EXT_ERR_SUCCESS) { re_err("encoder resume ret=0x%x", ret); } -#endif } void encoder_suspend_for_i2c(void) diff --git a/code/sdk/zhihui/utils/custom_utils.c b/code/sdk/zhihui/utils/custom_utils.c index aaf1d0ddc..79145d996 100644 --- a/code/sdk/zhihui/utils/custom_utils.c +++ b/code/sdk/zhihui/utils/custom_utils.c @@ -2510,7 +2510,7 @@ void custom_i2c_reset(uint8_t i2cbus, uint16_t i2c_clock) PRINT(" custom_iic_reset done! i2cbus %d clock %d\n",i2cbus,i2c_clock); } -errcode_t custom_iic_init(void) +errcode_t custom_i2c_init(uint8_t bus_index) { errcode_t result; @@ -2521,20 +2521,20 @@ errcode_t custom_iic_init(void) // #warning CONFIG_I2C_SUPPORT_DMA = 0 // #endif // #endif - if(i2c_installed == 0) - { - result = uapi_i2c_master_init(I2C_BUS_2, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */ + // if(i2c_installed == 0) + // { + result = uapi_i2c_master_init(bus_index, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */ - if (result != ERRCODE_SUCC) { - PRINT("cywee i2c init fail! ret=0x%x\n", result); - return ERRCODE_FAIL; - } - - i2c_installed = 1; - return ERRCODE_SUCC; - } - else + if (result != ERRCODE_SUCC) { + PRINT("cywee i2c init fail! ret=0x%x\n", result); return ERRCODE_FAIL; + } + + // i2c_installed = 1; + return ERRCODE_SUCC; + // } + // else + // return ERRCODE_FAIL; } errcode_t custom_i2c_read_regs(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex) diff --git a/code/sdk/zhihui/utils/custom_utils.h b/code/sdk/zhihui/utils/custom_utils.h index 8e47bdee3..1bff5fd13 100644 --- a/code/sdk/zhihui/utils/custom_utils.h +++ b/code/sdk/zhihui/utils/custom_utils.h @@ -315,6 +315,7 @@ errcode_t do_custom_fileoperate_service_check_msg(int cmd, void *params, int par int uapi_delete_files(const char *file_path); void uapi_restore_factory_setting(void); +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);