增加l22 hx3509底层驱动,同时兼容hx3507 1589/1 1589/head 1591/target/1
authorpenglei <1624952103@qq.com>
Thu, 2 Jan 2025 08:21:53 +0000 (16:21 +0800)
committerpenglei <1624952103@qq.com>
Thu, 2 Jan 2025 08:21:53 +0000 (16:21 +0800)
18 files changed:
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/boards/brandy_evb/board_config/board_lt22.h
code/sdk/drivers/boards/brandy_evb/board_config/board_u8.h
code/sdk/zhihui/drivers/charge/hp4570/hp4570.c
code/sdk/zhihui/drivers/charge/service/charge_at_cmd.c
code/sdk/zhihui/drivers/cywee/src/main_dml.c
code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt
code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c
code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.h
code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_at_cmd.c
code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.c
code/sdk/zhihui/drivers/rotary_encoder/hx3509/hx3509_hal.h
code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.c
code/sdk/zhihui/drivers/rotary_encoder/hx3509/tyhx_OTS_hx3509_custom.h
code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c
code/sdk/zhihui/utils/custom_utils.c
code/sdk/zhihui/utils/custom_utils.h

index a0bccf2..d429286 100644 (file)
@@ -500,7 +500,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
 #endif\r
     \r
 #ifdef ENABLE_CUSTOM_I2C\r
-    errcode_t result = custom_iic_init();\r
+    errcode_t result = custom_i2c_init(I2C_BUS_2);\r
     if(result != SUCC)\r
         PRINT("custom_iic_init failed !!! \r\n");\r
     else\r
index 24e6de8..8ddd853 100644 (file)
@@ -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': [
index ec77f3c..1941963 100644 (file)
@@ -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 },
index f188974..45687c1 100644 (file)
@@ -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
 
 };
index be4a803..72baf7e 100644 (file)
@@ -68,7 +68,10 @@ bool hp45xxx_read_reg(uint8_t reg, uint8_t *value)
 }\r
 \r
 // Initialize HP4570 chip\r
-bool hp45xxx_init(uint8_t chip_ver){\r
+bool hp45xxx_init(uint8_t chip_ver)\r
+{\r
+  custom_i2c_init(I2C_BUS_0);\r
+\r
   switch (chip_ver){\r
     case HP4570K:\r
       hp45xxx_i2c_addr = HP4570K_I2C_ADDR;\r
index 41d45a6..552f30a 100644 (file)
@@ -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)
index 7195e8b..38ea99f 100644 (file)
@@ -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
index 4b6e69c..d922351 100644 (file)
@@ -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()
 
index 491dac3..3bfc6a2 100644 (file)
@@ -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
index f4e6b5f..926b006 100644 (file)
@@ -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
index 0d11aca..d4ec470 100644 (file)
@@ -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
index 3ed4e00..88c40cf 100644 (file)
@@ -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
index 9401ff0..6acfd8c 100644 (file)
@@ -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
index bfc9a92..bea41fc 100644 (file)
@@ -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 //其他平台,由用户自行添加上面对应的程序
index a2a464e..215a42f 100644 (file)
@@ -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
index 4ff5d41..9b5ae16 100644 (file)
@@ -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)
index aaf1d0d..79145d9 100644 (file)
@@ -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)
index 8e47bde..1bff5fd 100644 (file)
@@ -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);