Merge #1616 into sdk602patch1126 from refs/changes/1616/head 1618/target/1
author彭磊 <1624952103@qq.com>
Thu, 9 Jan 2025 13:37:24 +0000 (13:37 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Thu, 9 Jan 2025 13:37:24 +0000 (13:37 +0000)
w9添加光电编码器,陀螺仪驱动。u8添加蓝牙产测

* refs/changes/1616/head: (1 commits squashed)

  - w9添加光电编码器,陀螺仪驱动。u8添加蓝牙产测

Signed-off-by: aliyun6865282430 <1624952103@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1616
52 files changed:
code/sdk/application/brandy/brandy_standard/input_app.h
code/sdk/application/brandy/brandy_standard/service_init.c
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_w9.h
code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.c
code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.h
code/sdk/zhihui/UI/producttest/src/testPresenter.cpp
code/sdk/zhihui/UI/producttest/src/testbt.cpp
code/sdk/zhihui/UI/producttest/src/testbutton.cpp
code/sdk/zhihui/drivers/CMakeLists.txt
code/sdk/zhihui/drivers/barometer/driver/lqbp002ta.c
code/sdk/zhihui/drivers/barometer/driver/lqbp002ta.h
code/sdk/zhihui/drivers/charge/hp4570/hp4570.c
code/sdk/zhihui/drivers/charge/hp4570/hp4570.h
code/sdk/zhihui/drivers/gyro/CMakeLists.txt [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.c [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.h [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/service/gyro_service.c [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/service/gyro_service.h [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/sh5001/sh5001.c [new file with mode: 0644]
code/sdk/zhihui/drivers/gyro/sh5001/sh5001.h [new file with mode: 0644]
code/sdk/zhihui/drivers/mag/mmc5603/mmc5603_main.c
code/sdk/zhihui/drivers/ppg/service/ppg_at_cmd.cpp
code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp
code/sdk/zhihui/drivers/ppg/service/ppg_service.h
code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_user.h
code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver.c
code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_hal.c
code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user.c
code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt
code/sdk/zhihui/drivers/rotary_encoder/crown/crown.c
code/sdk/zhihui/drivers/rotary_encoder/crown/crown.h
code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.c [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.h [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507.c
code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507.h
code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507_hal.c
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.c [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.h [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.c [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.h [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h [new file with mode: 0644]
code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c
code/sdk/zhihui/drivers/slip/cat1Service/cat1_ctl.cpp
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.h
code/sdk/zhihui/utils/custom_cmd_service.c
code/sdk/zhihui/utils/custom_utils.c
code/sdk/zhihui/utils/custom_utils.h
code/sdk/zhihui/utils/custom_utils_at_cmd.c

index 0c8b1a7..bb7e3c5 100644 (file)
@@ -110,7 +110,6 @@ typedef enum {
     BUTTON1_LONGPRESS_9S_OVER,
     BUTTON1_INVALID,
 
-#ifdef BOARD_U8
     BUTTON2_START,
     BUTTON2_PRESS,
     BUTTON2_CLICKUP,
@@ -134,8 +133,7 @@ typedef enum {
     BUTTON2_LONGPRESS_8S_OVER,
     BUTTON2_LONGPRESS_9S_OVER,
     BUTTON2_INVALID,
-#endif
-
+    
     BUTTON_BUTT
 } event_button_t;
 
index a30b1a8..dd608c9 100644 (file)
 #ifdef SUPPORT_AT_CROWN\r
 #include "crown_at_cmd.h"\r
 #endif\r
+#ifdef SUPPORT_AT_MIXO\r
+#include "mixo_at_cmd.h"\r
+#endif\r
+#ifdef SUPPORT_AT_GYRO\r
+#include "gyro_at_cmd.h"\r
+#endif\r
 static void register_at_service(void)\r
 {\r
 #ifdef SUPPORT_AT_GRAPHIC\r
@@ -202,6 +208,16 @@ static void register_at_service(void)
     at_cmd_table_t *crown_table = get_crown_cmd_table(&crown_cmd_count);\r
     at_cmd_add_moudle(crown_table, crown_cmd_count);    \r
 #endif\r
+#ifdef SUPPORT_AT_MIXO\r
+    uint32_t mixo_cmd_count;\r
+    at_cmd_table_t *mixo_table = get_mixo_cmd_table(&mixo_cmd_count);\r
+    at_cmd_add_moudle(mixo_table, mixo_cmd_count);\r
+#endif\r
+#ifdef SUPPORT_AT_GYRO\r
+    uint32_t gyro_cmd_count;\r
+    at_cmd_table_t *gyro_table = get_gyro_cmd_table(&gyro_cmd_count);\r
+    at_cmd_add_moudle(gyro_table, gyro_cmd_count);\r
+#endif\r
 }\r
 \r
 #ifdef CONFIG_OTA_UPDATE_SUPPORT\r
index d429286..5304530 100644 (file)
@@ -500,28 +500,33 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
 #endif\r
     \r
 #ifdef ENABLE_CUSTOM_I2C\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
-    {\r
-        PRINT("custom_iic_init succed !!! \r\n");\r
-        #ifdef MAG_MMC5603\r
-            uapi_mag_service_init();\r
-        #endif\r
-\r
-        #ifdef SUPPORT_PPG_SERVICE\r
-            uapi_ppg_service_init();\r
-        #endif\r
-\r
-        #ifdef ENABLE_CYWEE\r
-            uapi_cywee_service_init();\r
-        #endif \r
-\r
-        #ifdef ENABLE_LQBP002TA\r
-            uapi_lqbp_service_init();\r
-        #endif \r
-    }\r
+\r
+#ifdef ENABLE_HP4507\r
+#ifdef BOARD_L22\r
+#define HP4570_I2C_BUS I2C_BUS_0\r
+#elif defined BOARD_U8\r
+#define HP4570_I2C_BUS I2C_BUS_3\r
+#endif\r
+    custom_i2c_init(HP4570_I2C_BUS);\r
+#endif\r
+    custom_i2c_init(I2C_BUS_2);\r
+\r
+#ifdef MAG_MMC5603\r
+    uapi_mag_service_init();\r
+#endif\r
+\r
+#ifdef SUPPORT_PPG_SERVICE\r
+    uapi_ppg_service_init();\r
+#endif\r
+\r
+#ifdef ENABLE_CYWEE\r
+    uapi_cywee_service_init();\r
+#endif \r
+\r
+#ifdef ENABLE_LQBP002TA\r
+    uapi_lqbp_service_init();\r
+#endif \r
+ \r
 #endif\r
 \r
     /*启动蓝牙ble服务,cywee有重置 mac地址的操作,会需要把 蓝牙服务开启放在cywee服务之后*/\r
index 556613d..bafc22c 100644 (file)
@@ -474,7 +474,6 @@ target = {
                     'PPG_VC9202',
                     #'ROTARYENCODER_HX3507',
                     'ROTARYENCODER_U8',
-                    'FUNC_KEY2',
                     'NANDFLASH_DS35X',
                     'BLE_INSTRUCT',
                     'FACTORYTEST_SERVICE',
@@ -572,7 +571,7 @@ target = {
                     'SUPPORT_HID_SERVICE',
                     'SUPPORT_BAIDU_MAP',
                     'CFG_FLASH_SIZE=8',
-                    # 'SUPPORT_BLE_SERVICE',
+                     'SUPPORT_BLE_SERVICE',
                     # 'FD230',
                     #"MEM_CHECK",
                     #'ENABLE_WEBSOCKET',
@@ -584,7 +583,9 @@ target = {
                     'TPTYPE_CST86XX',
                     'TEST_4G_UI',
                     'TEST_GPS_UI',
-                    'NANDFLASH_F35UQA'
+                    'NANDFLASH_F35UQA',
+                    #'BLE_INSTRUCT',
+                    'FACTORYTEST_SERVICE',
                     ],
                'ram_component': [
                         #'baidumapsdk',
@@ -599,7 +600,7 @@ target = {
                         "slip",
                         "cat1_service",
                         "audio_manager",
-                        # "CustomUIcomponentTool",
+                        #"CustomUIcomponentTool",
                         "custom_utils",
                         "custom_utilscpp",
                         "custom_config",
@@ -610,11 +611,11 @@ target = {
                         "gnss_sample",
                         #    "acc_sensor",
                            "batterry_service",
-                        #  "bleservice",
-                        #  "ppgBleService",
-                        #  "blemoder",
-                        #  "factorytest_service",
-                        #  "hid_service",
+                           "bleservice",
+                           "ppgBleService",
+                           #"blemoder",
+                          "factorytest_service",
+                         "hid_service",
                          "producttest",
                         "cywee"
                            ],
index 2613527..73b7d58 100644 (file)
@@ -76,8 +76,13 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_HGPIO15 emmc clk
 #endif
     { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO0   NC
+#ifdef BOARD_W9
+    { HAL_PIO_FUNC_I2C2_M3, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },  // S_MGPIO1 I2C2 SCL Sensor 6轴 指南针 心率
+    { HAL_PIO_FUNC_I2C2_M3, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },  // S_MGPIO2 I2C2 SDA Sensor
+#else
     { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO1   NC
     { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO2   NC
+#endif
     { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO3   NC
 
 // #if (defined BRANDY_PRODUCT_EVB4)
@@ -97,8 +102,13 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
     { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO12 I2C0 SDA
     { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO13 I2C1 SCL touch i2c
     { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO14  I2C1 SDA
-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6轴 指南针 心率
-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor
+#ifdef BOARD_W9
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },  // S_MGPIO15 I2C2 SCL Sensor 6轴 指南针 心率
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },  // S_MGPIO16 I2C2 SDA Sensor
+#else
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6轴 指南针 心率
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor
+#endif
     { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO17 i2c3 SCL    smart pa\ 预留马达控制 \安全芯片
     { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO18  I2C3 SDA
     { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_MGPIO19 uart1 tx
@@ -199,7 +209,12 @@ 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_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_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
+#else
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R8     GYRO_INT1
+#endif
+
     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R9     BAT_CHARGE_OFF 关掉充电 温度高的时候
     { 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
 
@@ -296,9 +311,12 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
     // {   S_AGPIO_L31, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_RISING_EDGE,  cat1_ring_isr_callback},
 
 #endif
+#ifdef ENABLE_GYRO
+     {   S_AGPIO_R8, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#else
   /**S_AGPIO_L32 GPO gps reset*/
     // {   S_AGPIO_L32, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
-
+#endif
 };
 /**
  * @}
index d856beb..9a0f084 100644 (file)
@@ -402,6 +402,11 @@ ext_errno cst86xx_deinit(void)
     return EXT_ERR_SUCCESS;\r
 }\r
 \r
+void cst86xx_get_chip_id(uint16_t *chip_id)\r
+{\r
+    *chip_id = g_cst86xx_drv.chip_id;\r
+}\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 40f0a10..e2f5c20 100644 (file)
@@ -348,6 +348,9 @@ ext_errno cst86xx_get_power_mode(uint32_t *power_mode);
 ext_errno cst86xx_resume(void);\r
 ext_errno cst86xx_irq_callback(uint8_t *data_buf, uint8_t data_len);\r
 ext_errno cst86xx_host_init_sample(void);\r
+\r
+void cst86xx_get_chip_id(uint16_t *chip_id);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 58f623a..b5abaf2 100644 (file)
@@ -375,25 +375,38 @@ namespace OHOS
     if(testbuttonView::GetInstance())\r
     {\r
         if (keyID == 41 )\r
-    {\r
+        {\r
+            if(keystate)\r
+            testbuttonView::GetInstance()-> Changbutton(0,true);\r
+            else\r
+            testbuttonView::GetInstance()-> Changbutton(0,false);\r
+        \r
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        }\r
+        if (keyID == 0)\r
+        {\r
         if(keystate)\r
-        testbuttonView::GetInstance()-> Changbutton(0,true);\r
-        else\r
-        testbuttonView::GetInstance()-> Changbutton(0,false);\r
-       \r
-        // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
-        // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-    }\r
-    if (keyID == 0)\r
-    {\r
-       if(keystate)\r
-        testbuttonView::GetInstance()-> Changbutton(1,true);\r
-        else\r
-        testbuttonView::GetInstance()-> Changbutton(1,false);\r
-       \r
-        // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
-        // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-    }\r
+            testbuttonView::GetInstance()-> Changbutton(1,true);\r
+            else\r
+            testbuttonView::GetInstance()-> Changbutton(1,false);\r
+        \r
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        }\r
+\r
+#ifdef BOARD_U8\r
+        if (keyID == 2)\r
+        {\r
+        if(keystate)\r
+            testbuttonView::GetInstance()-> Changbutton(2,true);\r
+            else\r
+            testbuttonView::GetInstance()-> Changbutton(2,false);\r
+        \r
+            // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();\r
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
+        }\r
+#endif\r
 \r
     }\r
  \r
@@ -445,15 +458,18 @@ extern "C"
 \r
     void factorytest_enter_test_tp_view(void)\r
     {\r
-        testView::GetInstance()->ChangeView(TESTVIEW,TP);\r
+        if(testView::GetInstance())\r
+            testView::GetInstance()->ChangeView(TESTVIEW,TP);\r
+        else\r
+            printf("xxxxxxxxxxxxxxxxxxxxx\r\n");\r
     }\r
 \r
     void factorytest_enter_test_lcd_view(void)\r
     {\r
         if( testView::GetInstance())\r
-        testView::GetInstance()->ChangeView(TESTVIEW,LCD);\r
+            testView::GetInstance()->ChangeView(TESTVIEW,LCD);\r
         else\r
-        printf("xxxxxxxxxxxxxxxxxxxxx\r\n");\r
+            printf("xxxxxxxxxxxxxxxxxxxxx\r\n");\r
     }\r
 \r
     void factorytest_enter_test_button_view(void)\r
index 61fa663..327e91a 100644 (file)
@@ -13,7 +13,9 @@
 #include "bts_br_gap.h"
 #include "bts_le_gap.h"
 
+#ifdef SUPPORT_BLE_SERVICE
 #include "bleService.h"
+#endif
 
 #include "BluetoothModel.h"
 #include "producttest/include/testView.h"
index f6aae65..a84ca8e 100644 (file)
@@ -149,9 +149,25 @@ namespace OHOS
                     {
                         button[1]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
                         button[1]->SetText("DOWN_KEY::\nraise");
+                    }
+                }
 
+#ifdef BOARD_U8
+                if(i==2)
+                {
+ 
+                    if(falg==true)
+                    {
+                        button[3]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);
+                        button[3]->SetText("DOWN_KEY::\npress");
+                    }
+                    else
+                    {
+                        button[3]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
+                        button[3]->SetText("DOWN_KEY::\nraise");
                     }
                 }
+#endif
            
             RootView::GetInstance()->Invalidate();
            
@@ -234,8 +250,8 @@ namespace OHOS
         buttonconfig.label_x=40;
         buttonconfig.label_y=0;
         buttonconfig.Fontsize=25;
-        buttonconfig.ViewId="UP_KEY::";
-        buttonconfig.str="UP_KEY";
+        buttonconfig.ViewId="POWER_KEY:";
+        buttonconfig.str="POWER_KEY:";
         buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
         button[0]=SetTheButton_ext(buttonconfig);
         testBUTTONScrollView->Add(button[0]);
@@ -247,12 +263,41 @@ namespace OHOS
         buttonconfig.label_x=40;
         buttonconfig.label_y=0;
         buttonconfig.Fontsize=25; 
-        buttonconfig.ViewId="DOWN_KEY::";
-        buttonconfig.str="DOWN_KEY";
+        buttonconfig.ViewId="FUNC_KEY:";
+        buttonconfig.str="FUNC_KEY:";
         buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
         button[1]=SetTheButton_ext(buttonconfig);
         testBUTTONScrollView->Add(button[1]);
 
+#ifdef BOARD_U8
+        buttonconfig.x = 80;
+        buttonconfig.y = 300;
+        buttonconfig.w = 200;
+        buttonconfig.h = 80;
+        buttonconfig.label_x=40;
+        buttonconfig.label_y=0;
+        buttonconfig.Fontsize=25; 
+        buttonconfig.ViewId="FUNC_KEY2:";
+        buttonconfig.str="FUNC_KEY2:";
+        buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
+        button[3]=SetTheButton_ext(buttonconfig);
+        testBUTTONScrollView->Add(button[3]);
+
+        buttonconfig.x = 80;
+        buttonconfig.y = 600;
+        buttonconfig.w = 200;
+        buttonconfig.h = 80;
+        buttonconfig.label_x=40;
+        buttonconfig.label_y=0;
+        buttonconfig.Fontsize=25; 
+        buttonconfig.ViewId="crown::";
+        buttonconfig.str="crown::";
+        buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
+        button[2]=SetTheButton_ext(buttonconfig);
+        testBUTTONScrollView->Add(button[2]);
+
+#else
+    
         buttonconfig.x = 80;
         buttonconfig.y = 400;
         buttonconfig.w = 200;
@@ -265,6 +310,8 @@ namespace OHOS
         buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
         button[2]=SetTheButton_ext(buttonconfig);
         testBUTTONScrollView->Add(button[2]);
+#endif
+
 
 
         
index db812e4..5ce5f28 100644 (file)
@@ -19,3 +19,4 @@ add_subdirectory_if_exist(entest)
 add_subdirectory_if_exist(barometer)
 add_subdirectory_if_exist(charge)
 add_subdirectory_if_exist(charge/hp4570)
+add_subdirectory_if_exist(gyro)
index 930518b..5833997 100644 (file)
@@ -7,6 +7,9 @@
 static struct LQBP002TA_t LQBP002TA = {0};\r
 static struct LQBP002TA_t *p_LQBP002TA = NULL;\r
 \r
+static float Temp = 0.0f;\r
+static float Pressure = 0.0f;\r
+\r
 void LQBP002TA_write(uint8_t hwadr, uint8_t regadr, uint8_t val);\r
 uint8_t LQBP002TA_read(uint8_t hwadr, uint8_t regadr);\r
 void LQBP002TA_get_calib_param(void);\r
@@ -434,7 +437,12 @@ float LQBP002TA_get_temperature(void)
     //printf("(float)p_LQBP002TA->calib_param.c0 * 0.5f : %f\n",(float)p_LQBP002TA->calib_param.c0 * 0.5f);\r
     //printf("((float)p_LQBP002TA->calib_param.c1) * fTsc : %f\n",((float)p_LQBP002TA->calib_param.c1) * fTsc);\r
     //printf("fTsc : %f\n",fTsc);\r
-    printf("fTCompensate : %f\n",fTCompensate);\r
+    // printf("fTCompensate : %f\n",fTCompensate);\r
+\r
+    Temp = fTCompensate;\r
+\r
+    // printf("Temp : %f\n",Temp);\r
+\r
     return fTCompensate;\r
 }\r
 \r
@@ -463,7 +471,12 @@ float LQBP002TA_get_pressure(void)
        else\r
                qua3 = fTsc * fPsc * (p_LQBP002TA->calib_param.c11 + fPsc * p_LQBP002TA->calib_param.c21);\r
     fPCompensate = p_LQBP002TA->calib_param.c00 + fPsc * qua2 + fTsc * p_LQBP002TA->calib_param.c01 + qua3;\r
-    printf("fPCompensate : %f\n",fPCompensate);\r
+    // printf("fPCompensate : %f\n",fPCompensate);\r
+\r
+    Pressure = fPCompensate;\r
+\r
+    // printf("Pressure : %f\n",Pressure);\r
+\r
     return fPCompensate;\r
 }\r
 \r
@@ -481,12 +494,10 @@ void lqbp002ta_start(void)
 \r
 void lqbp002ta_check(void)\r
 {\r
-    float fSplTemp = 0.0f;\r
-    float fSplPressure = 0.0f;\r
     LQBP002TA_get_raw_temp();\r
     LQBP002TA_get_raw_pressure();\r
-    fSplTemp = LQBP002TA_get_temperature();\r
-    fSplPressure = LQBP002TA_get_pressure();\r
+    LQBP002TA_get_temperature();\r
+    LQBP002TA_get_pressure();\r
 }\r
 \r
 \r
@@ -494,3 +505,24 @@ void lqbp002ta_stop(void)
 {\r
     LQBP002TA_stop();\r
 }\r
+\r
+float lqbp002ta_get_temp(void)\r
+{\r
+    float temp = Temp;\r
+    Temp = 0;\r
+    // printf("temp : %f\n",temp);\r
+    return temp;\r
+}\r
+\r
+float lqbp002ta_get_pressure(void)\r
+{\r
+    float pressure = Pressure;\r
+    Pressure = 0;\r
+    // printf("pressure : %f\n",pressure);\r
+    return pressure;\r
+}\r
+\r
+uint8_t lqbp002ta_get_id(void)\r
+{\r
+    return LQBP002TA_read(HW_ADR, 0x0D);\r
+}
\ No newline at end of file
index 989afd3..318b0ab 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-12-16 20:03:01\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2024-12-17 21:05:56\r
+ * @LastEditTime: 2025-01-04 15:43:49\r
  * @FilePath: /sdk615/code/sdk/drivers/peripheral/LQBP002TA/driver/lqbp002ta.h\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE;\r
  */\r
@@ -58,5 +58,10 @@ void lqbp002ta_check(void);
 void lqbp002ta_stop(void);\r
 uint8_t lqbp002ta_check_exist(void);\r
 \r
+float lqbp002ta_get_temp(void);\r
+float lqbp002ta_get_pressure(void);\r
+\r
+uint8_t lqbp002ta_get_id(void);\r
+\r
 #endif\r
 \r
index 72baf7e..a4dd2ea 100644 (file)
@@ -70,8 +70,6 @@ bool hp45xxx_read_reg(uint8_t reg, uint8_t *value)
 // Initialize HP4570 chip\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
@@ -766,4 +764,12 @@ bool hp45xxx_read_status_watchdog_int(void){
   uint8_t value;\r
   hp45xxx_read_reg(HP45XXX_REG_INT0_STAT, &value);\r
   return (value & HP45XXX_WATCHDOG_INT_MASK) ? true : false;\r
+}\r
+\r
+uint8_t hp4507_get_id(void)\r
+{\r
+    uint8_t id = 0;\r
+    hp45xxx_i2c_addr = HP45XXX_I2C_ADDR;\r
+    hp45xxx_read_reg(HP45XXX_REG_CHIP_VER, &id);\r
+    return id;\r
 }
\ No newline at end of file
index 57d9318..320625d 100644 (file)
@@ -502,4 +502,8 @@ bool hp45xxx_read_status_pwrkey_wk(void);// PWRKEY 2S low time wake up from ship
 bool hp45xxx_read_status_vbus_wk(void);// VBUS plug in wake up from ship mode\r
 bool hp45xxx_read_status_watchdog_int(void);// Watch dog time expire IRQ\r
 \r
+\r
+uint8_t hp4507_get_id(void);\r
+\r
+\r
 #endif // HP4570_CHARGER_H
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/gyro/CMakeLists.txt b/code/sdk/zhihui/drivers/gyro/CMakeLists.txt
new file mode 100644 (file)
index 0000000..161f02e
--- /dev/null
@@ -0,0 +1,44 @@
+#===============================================================================
+# @brief    cmake file
+# Copyright (c) @CompanyNameMagicTag 2023-2023. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "gyro")
+
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/sh5001/sh5001.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/service/gyro_at_cmd.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/service/gyro_service.c
+)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}/sh5001
+    ${CMAKE_CURRENT_SOURCE_DIR}/service
+)
+set(PUBLIC_DEFINES
+    SUPPORT_AT_GYRO
+    ENABLE_GYRO
+)
+
+set(PRIVATE_HEADER
+)
+
+set(PRIVATE_DEFINES
+)
+
+# use this when you want to add ccflags like -include xxx
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+    -Wno-incompatible-function-pointer-types
+    -Wno-unused-function
+)
+
+set(WHOLE_LINK
+    true
+)
+
+set(MAIN_COMPONENT
+    false
+)
+
+build_component()
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.c b/code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.c
new file mode 100644 (file)
index 0000000..300f46f
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2024-12-16 20:49:09
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-04 17:01:37
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/GYRO/service/lqbp_at_cmd.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+#include "at_cmd_api.h"
+#include "pm_control.h"
+#include "gyro_service.h"
+#include "sh5001.h"
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
+#define GYRO_MAX_ARGC            8
+#define GYRO_MAX_ARGV_LEN        64
+
+#define GYRO_SUCCESS             0
+#define GYRO_FAILED              (-1)
+
+static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
+        uint8_t argv[GYRO_MAX_ARGC][GYRO_MAX_ARGV_LEN], uint32_t* argc)
+{
+    uint32_t pos = 0;
+    *argc = 0;
+
+    for (uint32_t i = 0; i < paraLen; i++) {
+        if ((para[i] == ' ' || para[i] == '\n') && pos != 0) {
+            argv[*argc][pos] = '\0';
+            *argc += 1;
+            pos = 0;
+            if (*argc >= GYRO_MAX_ARGC) {
+                return GYRO_FAILED;
+            }
+        } else {
+            argv[*argc][pos] = para[i];
+            pos++;
+            if (pos >= GYRO_MAX_ARGV_LEN) {
+                return GYRO_FAILED;
+            }
+        }
+    }
+    if (pos != 0) {
+        *argc += 1;
+    }
+
+    return GYRO_SUCCESS;
+}
+
+static uint32_t gyro_start_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+    UNUSED(paraLen);
+    UNUSED(para);
+    // do_lqbp_service_check_msg(GYRO_SERVICE_CMD_START_CHECK);
+    SH5001_init();
+    return ERRCODE_SUCC;
+}
+static uint32_t gyro_stop_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+    UNUSED(paraLen);
+    UNUSED(para);
+    // do_lqbp_service_check_msg(GYRO_SERVICE_CMD_STOP_CHECK);
+    return ERRCODE_SUCC;
+}
+static const at_cmd_table_t g_gyro_cmd[] = {
+    { (char *)"AT^GYROTESTSTART",      gyro_start_test, (char *)"1" },
+    { (char *)"AT^GYROTESTSTOP",      gyro_stop_test, (char *)"1" },
+};
+
+at_cmd_table_t *get_gyro_cmd_table(uint32_t *cmd_count)
+{
+    *cmd_count = ARRAY_COUNT(g_gyro_cmd);
+    return (at_cmd_table_t *)g_gyro_cmd;
+}
diff --git a/code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.h b/code/sdk/zhihui/drivers/gyro/service/gyro_at_cmd.h
new file mode 100644 (file)
index 0000000..e6bd34c
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2024-12-16 20:49:19
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-04 16:47:46
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/GYRO002TA/service/gyro_at_cmd.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
+ *
+ * Description: Provides at cmd register func \n
+ * Author: @CompanyNameTag \n
+ * History: \n
+ * 2022-07-20, Create file. \n
+ */
+#ifndef GYRO_AT_PROCESS_H
+#define GYRO_AT_PROCESS_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include "errcode.h"
+#include "soc_osal.h"
+#include "at_cmd_api.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+at_cmd_table_t *get_gyro_cmd_table(uint32_t *cmd_count);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
diff --git a/code/sdk/zhihui/drivers/gyro/service/gyro_service.c b/code/sdk/zhihui/drivers/gyro/service/gyro_service.c
new file mode 100644 (file)
index 0000000..ef6bae7
--- /dev/null
@@ -0,0 +1,173 @@
+
+#include "debug_print.h"
+#include "soc_osal.h"
+#include "tcxo.h"
+#include "irmalloc.h"
+#include "errcode.h"
+#include "common_def.h"
+#include "tcxo.h"
+#include "input_app.h"
+#include "cmsis_os2.h"
+#include "custom_utils.h"
+#include "sh5001.h"
+#include "gyro_service.h"
+// #include "custom_runtime.h"
+/***
+ * 其他cmd在Header里定义,对外开放
+*/
+#define GYRO_SERVICE_CMD_TIMER_CHECK 0x11
+
+#define GYRO_CHECK_MS 30
+
+static bool g_gyro_service_initialled = false;
+
+osTimerId_t g_gyro_service_timer = NULL;
+
+static bool g_gyro_sensor_exist = false;
+
+static bool g_bat_timer_is_running = false;
+
+static unsigned long g_app_queue= 0xFFFFFFFF;
+
+static bool gyro_service_running_stat = false;
+
+static void gyro_service_check_timer_callback(void* data);
+
+static void gyro_service_timer_start_check(uint32_t rtc_ms)
+{
+    
+    if (g_bat_timer_is_running )  
+        osTimerStop(g_gyro_service_timer);
+    
+    if (gyro_service_running_stat == true)
+        osTimerStart(g_gyro_service_timer, rtc_ms);
+    
+    g_bat_timer_is_running = true;
+    
+}
+void do_gyro_service_check_msg(int cmd);
+
+static void gyro_service_check_timer_callback(void * data)
+{
+    unused(data);
+
+    g_bat_timer_is_running = false;
+
+    if(gyro_service_running_stat == true){
+        // mmc5603_check(); //此处只能直接加到timer callback中,采用queue的话,新能跟不上,系统资源会挂掉。
+        do_gyro_service_check_msg(GYRO_SERVICE_CMD_TIMER_CHECK);
+        // gyro_service_timer_start_check(gyro_CHECK_MS);
+    }
+   
+     
+   
+}
+void uapi_gyro_service_deinit(void)
+{
+    /* Stop the time and clear the pin map */
+    osTimerStop(g_gyro_service_timer);
+    osTimerDelete(g_gyro_service_timer);
+
+    g_bat_timer_is_running = false;
+    g_gyro_service_timer = NULL;
+}
+
+
+
+void do_gyro_service_check_msg(int cmd)
+{
+    int ret;
+    if (g_gyro_sensor_exist == false)
+        return ;
+    common_notify_mail_t mail = {0};
+    mail.comm.app = cmd;
+    ret = osal_msg_queue_write_copy(g_app_queue, (void *)&mail,
+                                    sizeof(common_notify_mail_t), 0);
+    if (ret != OSAL_SUCCESS) {
+        PRINT("Error gyro Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret);
+    }
+    
+}
+
+static void gyro_service_check_task(void const *arg)
+{
+    unused(arg);
+    int32_t ret;
+    common_notify_mail_t mail;
+    uint32_t msgsize = (uint32_t)sizeof(common_notify_mail_t);
+    while (1) {
+        ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS) {
+            continue;
+        }
+
+        if (mail.comm.app == GYRO_SERVICE_CMD_TIMER_CHECK) {
+            gyro_check();
+        }else if (mail.comm.app == GYRO_SERVICE_CMD_START_CHECK){
+            gyro_start();
+            LOS_Mdelay(30);
+            gyro_service_running_stat = true;
+            gyro_service_timer_start_check(GYRO_CHECK_MS);
+        }else if (mail.comm.app == GYRO_SERVICE_CMD_STOP_CHECK){
+            gyro_service_running_stat = false;
+            osTimerStop(g_gyro_service_timer);
+            gyro_stop();
+            LOS_Mdelay(20);
+        }
+
+
+    }
+}
+void create_gyro_queue(void)
+{
+
+    if (osal_msg_queue_create("gyro_service_queue", APP_BOARD_MSG_COUNT, &g_app_queue,
+                              0, sizeof(common_notify_mail_t)) != ERRCODE_SUCC) {
+        PRINT("[gyro][service] app create mail fail\n");
+    }
+}
+
+#define GYRO_BOARD_TASK_SIZE   0x1000
+errcode_t uapi_gyro_service_init(void)
+{
+    PRINT("uapi_gyro_service_init !\r\n");
+
+    if(!gyro_check_exist())
+    {
+        //TODO 设置气压计检测是否存在标识
+        PRINT("gyro not found!\r\n");
+        return ERRCODE_FAIL;
+    }
+    g_gyro_sensor_exist = true;
+
+    app_task_definition_t taskcfg={0};
+    taskcfg.create_queue_handle = create_gyro_queue;
+    taskcfg.attr.name="gyro_service";
+    taskcfg.attr.priority = osPriorityBelowNormal4;
+    taskcfg.attr.stack_size = GYRO_BOARD_TASK_SIZE;
+    taskcfg.func = gyro_service_check_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create gyro_service failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    g_gyro_service_timer = osTimerNew((osTimerFunc_t)gyro_service_check_timer_callback, osTimerPeriodic, NULL, NULL);
+  
+
+    return ERRCODE_SUCC;
+}
+
+// void gyro_service_service_resume(void)
+// {
+//     MMC_LOG("gyro_service_service resume!\r\n");
+//     gyro_service_check_timer_callback(0);
+// }
+// void gyro_service_service_suspend(void)
+// {
+//     MMC_LOG("gyro_service_service suspend!\r\n");
+// }
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/gyro/service/gyro_service.h b/code/sdk/zhihui/drivers/gyro/service/gyro_service.h
new file mode 100644 (file)
index 0000000..27f9f1d
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
+ *
+ * Description: Test adc header \n
+ * Author: @CompanyNameTag \n
+ * History: \n
+ * 2022-08-16, Create file. \n
+ */
+
+#ifndef GYRO_SERVICE_H__
+#define GYRO_SERVICE_H__
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#include "stdint.h"
+#include "errcode.h"
+
+
+#define GYRO_SERVICE_CMD_START_CHECK 0x12
+#define GYRO_SERVICE_CMD_STOP_CHECK 0x13
+
+errcode_t uapi_gyro_service_init(void);
+void uapi_gyro_service_deinit(void);
+void do_gyro_service_check_msg(int cmd);
+
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/gyro/sh5001/sh5001.c b/code/sdk/zhihui/drivers/gyro/sh5001/sh5001.c
new file mode 100644 (file)
index 0000000..77ff6b8
--- /dev/null
@@ -0,0 +1,3054 @@
+/******************************************************************\r
+* Senodia 6D IMU(Gyroscope+Accelerometer) SH5001 driver, By Senodia AE@20220505;\r
+*\r
+*\r
+* 1. SH5001_init() : SH5001 initialize function\r
+* 2. SH5001_GetImuData( ... ): SH5001 read gyro and accel data function\r
+* 3. SH5001_GetTempData(): SH5001 read termperature function\r
+* 4. delay_ms(x): delay x millisecond.\r
+* 5. SH5001_initFIFO(): initialize FIFO function\r
+* 6. SH5001_ReadFIFO(): read FIFO data\r
+*      \r
+******************************************************************/\r
+\r
+#include "sh5001.h"\r
+#include "custom_utils.h"\r
+#include "los_base.h"\r
+\r
+// 32-bit version number represented as major[31:16].minor[15:0]\r
+#define SH5001_MAJOR        1\r
+#define SH5001_MINOR       01\r
+#define SH5001_REV         31\r
+#define MCU_VERSION_SH5001  ((SH5001_MAJOR<<16) | (SH5001_MINOR<<8) | SH5001_REV)\r
+\r
+#define SH5001_I2C_BUS I2C_BUS_2\r
+\r
+/******************************************************************\r
+* Description: I2C or SPI bus interface functions      and delay time function\r
+*\r
+* Parameters: \r
+*   devAddr: I2C device address, modify the macro(SH5001_ADDRESS @SH5001.h) based on your I2C function.                                                  \r
+*            If SPI interface, please ingnore the parameter.\r
+*   regAddr: register address\r
+*   readLen: data length to read\r
+*   *readBuf: data buffer to read; If using FIFO function, the max buffer size is 1024; \r
+*   writeLen: data length to write\r
+*   *writeBuf: data buffer to write\r
+*      \r
+* Note: I2C interface, define USER_INTERFACE_I2C (1)\r
+*       SPI interface, define USER_INTERFACE_I2C (0)\r
+*              SPI 3 Wire interface, define SH5001_SPI_3WIRE_MODE (1)\r
+*              SPI 4 Wire interface, define SH5001_SPI_3WIRE_MODE (0)\r
+*      \r
+******************************************************************/\r
+#define USER_INTERFACE_I2C             (1)\r
+\r
+#if USER_INTERFACE_I2C\r
+\r
+unsigned char I2C_ReadNBytes(  unsigned char devAddr, \r
+                                unsigned char regAddr, \r
+                                unsigned short readLen, \r
+                                unsigned char *readBuf)\r
+{\r
+       //your I2C interface code:\r
+       //......\r
+       custom_i2c_read_regs(devAddr, regAddr, 1, readBuf, readLen,SH5001_I2C_BUS);\r
+       return (SH5001_TRUE);\r
+}\r
+\r
+unsigned char I2C_WriteNBytes( unsigned char devAddr, \r
+                                unsigned char regAddr, \r
+                                unsigned short writeLen, \r
+                                unsigned char *writeBuf)\r
+{\r
+       //your I2C interface code:\r
+       //......\r
+       custom_i2c_write_reg(devAddr, regAddr, 1, writeBuf, writeLen,SH5001_I2C_BUS);\r
+       return (SH5001_TRUE);\r
+}                                                                                                                              \r
+\r
+IMU_read    SH5001_read     = I2C_ReadNBytes;\r
+IMU_write   SH5001_write    = I2C_WriteNBytes;\r
+\r
+#else\r
+\r
+#define SH5001_SPI_3WIRE_MODE  (0)\r
+\r
+unsigned char SPI_readNBytes ( unsigned char devAddr, \r
+                                unsigned char regAddr, \r
+                                unsigned short readLen, \r
+                                unsigned char *readBuf)\r
+{\r
+       //your SPI interface code:\r
+\r
+       //For example:  \r
+       //unsigned char u8Data;         \r
+       //devAddr = devAddr;    \r
+       //u8Data = (regAddr > 0x7F) ? 0x01 : 0x00;\r
+       //SPIWrite(SH5001_SPI_REG_ACCESS, &u8Data, 1);\r
+       \r
+       //SPIRead((regAddr | 0x80), readBuf, readLen);  \r
+       return (SH5001_TRUE);\r
+}\r
+\r
+unsigned char SPI_writeNBytes( unsigned char devAddr, \r
+                                unsigned char regAddr, \r
+                                unsigned short writeLen, \r
+                                unsigned char *writeBuf)\r
+{\r
+       //your SPI interface code:\r
+       \r
+       //For example: \r
+       //unsigned char u8Data; \r
+       //devAddr = devAddr;    \r
+       //u8Data = (regAddr > 0x7F) ? 0x01 : 0x00;\r
+       //SPIWrite(SH5001_SPI_REG_ACCESS, &u8Data, 1);\r
+       \r
+       //SPIWrite((regAddr & 0x7F), writeBuf, writeLen);\r
+       return (SH5001_TRUE);\r
+}                                                                                                                              \r
+\r
+IMU_read       SH5001_read             = SPI_readNBytes;\r
+IMU_write      SH5001_write    = SPI_writeNBytes;\r
+\r
+#endif\r
+\r
+\r
+static void delay_ms(unsigned short mSecond)\r
+{  \r
+       //your delay code(mSecond: millisecond):\r
+       //......\r
+       LOS_Mdelay(mSecond);\r
+       // HAL_Delay(mSecond);\r
+} \r
+\r
+\r
+#if SH5001_OIS_ENABLE\r
+unsigned char SH5001_OIS_read( unsigned char devAddr,\r
+                                unsigned char regAddr,\r
+                                unsigned short readLen,\r
+                                unsigned char *readBuf)\r
+{\r
+       //your SPI interface code:\r
+\r
+\r
+       //SPIRead((regAddr | 0x80), readBuf, readLen);\r
+       return (SH5001_TRUE);\r
+}\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************\r
+* Description: Local Variable          \r
+******************************************************************/\r
+\r
+\r
+/******************************************************************\r
+* Description: Local Function Prototypes               \r
+******************************************************************/\r
+static void SH5001_ModuleReset(void);\r
+static void SH5001_Acc_Config(unsigned char accODR, \r
+                              unsigned char accRange, \r
+                              unsigned char accCutOffFreq,\r
+                              unsigned char accFilter,\r
+                              unsigned char accByPass);\r
+\r
+static void SH5001_Gyro_Config(        unsigned char gyroODR, \r
+                                unsigned char gyroRange, \r
+                                unsigned char gyroCutOffFreq,\r
+                                unsigned char gyroFilter,\r
+                                unsigned char gyroByPass);\r
+\r
+static void SH5001_TimeStamp_Config(unsigned char timeStampODR, \r
+                                       unsigned char timeStampEnable);\r
+\r
+static void SH5001_Temp_Config(        unsigned char tempODR, \r
+                                unsigned char tempEnable);                                                                                                                                                                                                     \r
+\r
+       \r
+\r
+static void SH5001_SoftReset(void)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       regData = 0x01;\r
+       SH5001_write(SH5001_ADDRESS, 0x2B, 1, &regData);\r
+       regData = 0x73;\r
+       SH5001_write(SH5001_ADDRESS, 0x00, 1, &regData);\r
+\r
+       delay_ms(50);\r
+}\r
+\r
+static void SH5001_DriveStart(void)\r
+{\r
+       unsigned char regData = 0;\r
+       //Driver start\r
+       regData = 0x01;\r
+       SH5001_write(SH5001_ADDRESS, 0x2B, 1, &regData);\r
+\r
+       delay_ms(2);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0x2B, 1, &regData);\r
+\r
+       delay_ms(1);\r
+\r
+}\r
+\r
+static void SH5001_ADCReset(void)\r
+{\r
+    unsigned char regData = 0;\r
+\r
+       regData = 0x08;\r
+       SH5001_write(SH5001_ADDRESS, 0x30, 1, &regData);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0xD2, 1, &regData);\r
+\r
+       regData = 0x6B;\r
+       SH5001_write(SH5001_ADDRESS, 0xD1, 1, &regData);\r
+\r
+       regData = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xD5, 1, &regData);\r
+       delay_ms(5);\r
+\r
+       regData = 0x68;\r
+       SH5001_write(SH5001_ADDRESS, 0xD1, 1, &regData);\r
+       delay_ms(2);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0xD5, 1, &regData);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0x30, 1, &regData);\r
+\r
+       regData = 0x08;\r
+       SH5001_write(SH5001_ADDRESS, 0x30, 1, &regData);\r
+\r
+       regData = 0xE0;\r
+       SH5001_write(SH5001_ADDRESS, 0xD8, 1, &regData);\r
+\r
+       delay_ms(5);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0xD8, 1, &regData);\r
+\r
+       regData = 0x00;\r
+       SH5001_write(SH5001_ADDRESS, 0x30, 1, &regData);\r
+}\r
+\r
+static void SH5001_CVAReset(void)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       regData = 0x12;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &regData);\r
+       regData = 0x12;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &regData);\r
+       regData = 0x12;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &regData);\r
+\r
+       delay_ms(1);\r
+\r
+       regData = 0x2;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &regData);\r
+       regData = 0x2;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &regData);\r
+       regData = 0x2;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &regData);\r
+\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: reset some internal modules;\r
+*\r
+* Parameters: void     \r
+*                                              \r
+* return:      void\r
+*                                                                                                                              \r
+******************************************************************/\r
+static void SH5001_ModuleReset(void)\r
+{\r
+       unsigned char regData = 0;      \r
+       \r
+       // soft reset\r
+       SH5001_SoftReset();\r
+\r
+#if SH5001_SPI_3WIRE_MODE\r
+       SH5001_SPI_Config(SH5001_SPI_3_WIRE);\r
+#endif \r
+\r
+       //Driver start\r
+       SH5001_DriveStart();\r
+\r
+       \r
+       // ADC reset\r
+       SH5001_ADCReset();\r
+\r
+       //CVA Reset\r
+       SH5001_CVAReset();\r
+\r
+       delay_ms(250);\r
+}      \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.set accelerometer parameters;\r
+*               2.accCutOffRreq = accODR * 0.40 or accODR * 0.25 or accODR * 0.11 or accODR * 0.04 or accODR * 0.02;\r
+*\r
+* Parameters:  accODR                  accRange                accCutOffFreq           accFilter                               accByPass\r
+*               SH5001_ACC_ODR_1000HZ  SH5001_ACC_RANGE_16G    SH5001_ACC_ODRX040              SH5001_ACC_FILTER_EN    SH5001_ACC_BYPASS_EN\r
+*               SH5001_ACC_ODR_500HZ   SH5001_ACC_RANGE_8G             SH5001_ACC_ODRX025              SH5001_ACC_FILTER_DIS   SH5001_ACC_BYPASS_DIS\r
+*               SH5001_ACC_ODR_250HZ   SH5001_ACC_RANGE_4G             SH5001_ACC_ODRX011\r
+*               SH5001_ACC_ODR_125HZ   SH5001_ACC_RANGE_2G             SH5001_ACC_ODRX004\r
+*               SH5001_ACC_ODR_63HZ                                                            SH5001_ACC_ODRX002\r
+*               SH5001_ACC_ODR_31HZ\r
+*               SH5001_ACC_ODR_16HZ\r
+*               SH5001_ACC_ODR_2000HZ\r
+*               SH5001_ACC_ODR_4000HZ\r
+*               SH5001_ACC_ODR_8000HZ\r
+*  \r
+* return:      void\r
+*\r
+******************************************************************/\r
+unsigned char storeAccODR;\r
+static void SH5001_Acc_Config(unsigned char accODR, \r
+                              unsigned char accRange, \r
+                              unsigned char accCutOffFreq,\r
+                              unsigned char accFilter,\r
+                              unsigned char accByPass)\r
+{\r
+    unsigned char regData = 0; \r
+       \r
+       // enable acc digital filter and bypass or not\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, &regData);\r
+       regData = (regData & 0xFCU) | accFilter | accByPass;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, &regData);\r
+       \r
+       // set acc ODR range\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, &regData);\r
+       regData = (regData & 0x80U) | accODR | accRange;\r
+       storeAccODR = regData;\r
+       //regData = (regData & 0x80U)| accRange | accODR;\r
+       //regData = (regData & 0x80U)| 0x38;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, &regData);\r
+       \r
+       // set acc low pass filter cut-off frequency\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+       regData = (regData & 0xF0U) | accCutOffFreq;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+\r
+}\r
+\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.set accelerometer parameters;\r
+*               2.accCutOffRreq = accODR * 0.40 or accODR * 0.25 or accODR * 0.11 or accODR * 0.04 or accODR * 0.02;\r
+*\r
+* Parameters:  accODR                  accRange                accCutOffFreq           accOisEnable\r
+\r
+* return:      void\r
+*\r
+******************************************************************/\r
+static void SH5001_Acc_OIS_Config(unsigned char accODR,\r
+                              unsigned char accRange,\r
+                              unsigned char accCutOffFreq,\r
+                              unsigned char accOisEnable)\r
+{\r
+    unsigned char regData = 0;\r
+\r
+       regData = accODR | accRange | accCutOffFreq | accOisEnable;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_OIS_ACC_CONF, 1, &regData);\r
+\r
+}\r
+\r
+/******************************************************************\r
+* Description: 1.set gyroscope parameters;\r
+*               2.gyroCutOffRreq is at Page 33 of SH5001 datasheet.\r
+*\r
+* Parameters:   gyroODR                gyroRangeX,Y,Z          gyroCutOffFreq      gyroFilter                          gyroByPass\r
+*               SH5001_GYRO_ODR_800HZ  SH5001_GYRO_RANGE_125   SH5001_GYRO_ODRX00      SH5001_GYRO_FILTER_EN   SH5001_GYRO_BYPASS_EN\r
+*               SH5001_GYRO_ODR_400HZ  SH5001_GYRO_RANGE_250   SH5001_GYRO_ODRX01      SH5001_GYRO_FILTER_DIS  SH5001_GYRO_BYPASS_DIS\r
+*               SH5001_GYRO_ODR_200HZ  SH5001_GYRO_RANGE_500   SH5001_GYRO_ODRX02\r
+*               SH5001_GYRO_ODR_100HZ  SH5001_GYRO_RANGE_1000  SH5001_GYRO_ODRX03\r
+*               SH5001_GYRO_ODR_50HZ   SH5001_GYRO_RANGE_2000\r
+*               SH5001_GYRO_ODR_25HZ\r
+*               SH5001_GYRO_ODR_1600HZ\r
+*               SH5001_GYRO_ODR_3200HZ\r
+*               SH5001_GYRO_ODR_6400HZ\r
+*               SH5001_GYRO_ODR_12800HZ\r
+*               SH5001_GYRO_ODR_25600HZ\r
+*       \r
+*               gyroOnOff\r
+*               SH5001_GYRO_OFF_INACT\r
+*               SH5001_GYRO_ON_INACT\r
+* return:      void\r
+*\r
+******************************************************************/\r
+/*\r
+static void SH5001_Gyro_Config(        unsigned char gyroODR, \r
+                                unsigned char gyroRange, \r
+                                unsigned char gyroCutOffFreq,\r
+                                unsigned char gyroFilter,\r
+                                unsigned char gyroByPass,\r
+                                unsigned char gyroOnOff)\r
+{\r
+    unsigned char regData = 0; \r
+       \r
+       // enable gyro digital filter\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+       regData = (regData & 0x7CU) | gyroFilter | gyroByPass | gyroOnOff;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+       \r
+       // set gyro ODR\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, &regData);\r
+       regData = (regData & 0xF0U) | gyroODR;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, &regData);\r
+       \r
+       // set gyro low pass filter cut-off frequency\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, &regData);\r
+       regData = (regData & 0xFCU) | gyroCutOffFreq;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, &regData);\r
+               \r
+\r
+       // set gyro range\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF3, 1, &regData);\r
+       regData = (regData & 0xF8U) | gyroRange;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF3, 1, &regData);            \r
+\r
+}\r
+\r
+*/\r
+static void SH5001_Gyro_Config(        unsigned char gyroODR,\r
+                                unsigned char gyroRange,\r
+                                unsigned char gyroCutOffFreq,\r
+                                unsigned char gyroFilter,\r
+                                unsigned char gyroByPass)\r
+{\r
+    unsigned char regData = 0;\r
+\r
+       // enable gyro digital filter\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+       regData = (regData & 0x7CU) | gyroFilter | gyroByPass;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+\r
+       // set gyro ODR Range\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, &regData);\r
+       regData = (regData & 0x80U) | gyroODR | gyroRange;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, &regData);\r
+\r
+       // set gyro low pass filter cut-off frequency\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, &regData);\r
+       regData = (regData & 0xF0U) | gyroCutOffFreq;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, &regData);\r
+\r
+}\r
+\r
+//Jin: Modify \r
+/*  */\r
+\r
+\r
+static void SH5001_Gyro_OIS_Config(    unsigned char gyroODR,\r
+                                unsigned char gyroRange,\r
+                                unsigned char gyroCutOffFreq,\r
+                                unsigned char gyroOisEnable)\r
+{\r
+    unsigned char regData = 0;\r
+\r
+       regData = gyroODR | gyroRange | gyroCutOffFreq | gyroOisEnable;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_OIS_GYRO_CONF, 1, &regData);\r
+\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: set time stamp parameters;\r
+*\r
+* Parameters:  timeStampODR                    timeStampEnable\r
+*               SH5001_TS_ODR_25KHZ            SH5001_TS_EN\r
+*               SH5001_TS_ODR_1KHZ             SH5001_TS_DIS           \r
+*\r
+* return:      void\r
+*                                                      \r
+******************************************************************/\r
+static void SH5001_TimeStamp_Config(unsigned char timeStampODR, \r
+                                       unsigned char timeStampEnable)\r
+{\r
+    unsigned char regData = 0; \r
+       \r
+       // config time stamp\r
+       SH5001_read(SH5001_ADDRESS, SH5001_TIMESTAMP_CONF, 1, &regData);\r
+       regData = (regData & 0x9FU) | timeStampODR | timeStampEnable;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_TIMESTAMP_CONF, 1, &regData);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: set temperature parameters;\r
+*\r
+* Parameters:  tempODR                   tempEnable\r
+*               SH5001_TEMP_ODR_500HZ    SH5001_TEMP_EN\r
+*               SH5001_TEMP_ODR_250HZ    SH5001_TEMP_DIS\r
+*               SH5001_TEMP_ODR_125HZ          \r
+*               SH5001_TEMP_ODR_63HZ           \r
+*\r
+* return:      void\r
+*                                                      \r
+******************************************************************/\r
+static void SH5001_Temp_Config(        unsigned char tempODR, \r
+                                unsigned char tempEnable)\r
+{\r
+    unsigned char regData = 0; \r
+       \r
+       // enable temperature, set ODR\r
+       SH5001_read(SH5001_ADDRESS, SH5001_TEMP_CONF0, 1, &regData);\r
+       regData = (regData & 0xF8U) | tempODR | tempEnable;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_TEMP_CONF0, 1, &regData);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: read temperature parameters;\r
+*\r
+* Parameters:  void    \r
+*              \r
+* return:      temperature data(deg);\r
+* \r
+******************************************************************/\r
+float SH5001_GetTempData(void)\r
+{\r
+    unsigned char regData[2] = {0};    \r
+    unsigned short int tempref[2] = {0};\r
+       \r
+       // read temperature data, unsigned 12bits;   SH5001_TEMP_CONF2..SH5001_TEMP_CONF1\r
+       SH5001_read(SH5001_ADDRESS, SH5001_TEMP_CONF1, 2, &regData[0]);\r
+       tempref[0] = ((unsigned short int)(regData[1] & 0x0FU) << 8U) | regData[0];\r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_TEMP_ZL, 2, &regData[0]);\r
+       tempref[1] = ((unsigned short int)(regData[1] & 0x0FU) << 8U) | regData[0];     \r
+       \r
+       return ( (((float)(tempref[1] - tempref[0]))/14.0f) + 25.0f );\r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: enable or disable INT, mapping interrupt to INT pin or INT1 pin\r
+*\r
+* Parameters:   intType                 intEnable               intPinSel\r
+*               SH5001_INT_LOWG         SH5001_INT_EN                  SH5001_INT_MAP_INT0\r
+*               SH5001_INT_HIGHG        SH5001_INT_DIS         SH5001_INT_MAP_INT1\r
+*               SH5001_INT_INACT                         \r
+*               SH5001_INT_ACT\r
+*               SH5001_INT_DOUBLE_TAP\r
+*               SH5001_INT_SINGLE_TAP\r
+*               SH5001_INT_FLAT\r
+*               SH5001_INT_ORIENTATION\r
+*                              SH5001_INT_TAP (Only INT/INT1 Map)\r
+*                              SH5001_INT_SMD\r
+*               SH5001_INT_FIFO_WATERMARK\r
+*               SH5001_INT_GYRO_READY\r
+*               SH5001_INT_ACC_READY\r
+*               SH5001_INT_FREE_FALL\r
+*               SH5001_INT_UP_DOWN_Z\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Enable(        unsigned short intType, \r
+                        unsigned char intEnable, \r
+                        unsigned char intPinSel)\r
+{\r
+  unsigned char regData[2] = {0};      \r
+  unsigned short int u16IntVal = 0; \r
+       \r
+       // Z axis change between UP to DOWN\r
+       if((intType & 0x0040U) == SH5001_INT_UP_DOWN_Z)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, &regData[0]);\r
+               regData[0] = (intEnable == SH5001_INT_EN) \\r
+                     ? (regData[0] & 0xBFU) : (regData[0] | 0x40U);\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, &regData[0]);\r
+       }       \r
+       \r
+       if(intType & 0xFF3FU)\r
+       {       \r
+               // enable or disable INT\r
+               SH5001_read(SH5001_ADDRESS, SH5001_INT_ENABLE0, 2, &regData[0]); \r
+    \r
+               u16IntVal = ((unsigned short int)regData[0] << 8U) | regData[1]; \r
+               \r
+               u16IntVal = u16IntVal & 0xFF1FU;\r
+               u16IntVal = (intEnable == SH5001_INT_EN) \\r
+                    ? (u16IntVal | intType) : (u16IntVal & ~intType);          \r
+                \r
+               regData[0] = (unsigned char)(u16IntVal >> 8U);\r
+               regData[1] = (unsigned char)(u16IntVal);                \r
+               //SH5001_write(SH5001_ADDRESS, SH5001_INT_ENABLE0, 2, &regData[0]);\r
+               SH5001_write(SH5001_ADDRESS, SH5001_INT_ENABLE0, 1, &regData[0]);\r
+               SH5001_write(SH5001_ADDRESS, SH5001_INT_ENABLE1, 1, &regData[1]);\r
+                               \r
+               // mapping interrupt to INT0 pin or INT1 pin\r
+               SH5001_read(SH5001_ADDRESS, SH5001_INT_PIN_MAP0, 2, &regData[0]);\r
+               u16IntVal = ((unsigned short int)regData[0] << 8U) | regData[1];\r
+    \r
+               u16IntVal = u16IntVal & 0xFF3FU;\r
+        u16IntVal = (intPinSel == SH5001_INT_MAP_INT1) \\r
+                    ? (u16IntVal | intType) : (u16IntVal & ~intType);  \r
+               \r
+               regData[0] = (unsigned char)(u16IntVal >> 8U);\r
+               regData[1] = (unsigned char)(u16IntVal);\r
+               SH5001_write(SH5001_ADDRESS, SH5001_INT_PIN_MAP0, 1, &regData[0]);\r
+               SH5001_write(SH5001_ADDRESS, SH5001_INT_PIN_MAP1, 1, &regData[1]);\r
+       }       \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.config INT function\r
+*               2.intCount is valid only when intLatch is equal to SH5001_INT_NO_LATCH;\r
+*\r
+* Parameters:   intLevel                                       intLatch                                        intClear                                        \r
+*               SH5001_INT_LEVEL_HIGH          SH5001_INT_NO_LATCH                     SH5001_INT_CLEAR_ANY\r
+*               SH5001_INT_LEVEL_LOW           SH5001_INT_LATCH                        SH5001_INT_CLEAR_STATUS\r
+*\r
+*               intTime\r
+*               Unit: 2mS\r
+*\r
+*                              int1Mode                                        int0Mode\r
+*               SH5001_INT1_NORMAL                     SH5001_INT0_NORMAL\r
+*               SH5001_INT1_OD                         SH5001_INT0_OD\r
+*\r
+*                              int1OE                                          int0OE\r
+*                              SH5001_INT1_OUTPUT                      SH5001_INT0_OUTPUT\r
+*                              SH5001_INT1_INPUT                       SH5001_INT1_INPUT\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+\r
+\r
+void SH5001_INT_Config(        unsigned char intLevel,\r
+                        unsigned char intLatch,\r
+                        unsigned char intClear,\r
+                        unsigned char intTime,\r
+                        unsigned char int1Mode,\r
+                        unsigned char int0Mode,\r
+                        unsigned char int1OE,\r
+                        unsigned char int0OE)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       //SH5001_read(SH5001_ADDRESS, SH5001_INT_CONF, 1, &regData);\r
+\r
+    regData = (intLevel == SH5001_INT0_LEVEL_LOW) \\r
+              ? (regData | SH5001_INT0_LEVEL_LOW) : (regData & SH5001_INT0_LEVEL_HIGH);\r
+\r
+    regData = (intLatch == SH5001_INT_NO_LATCH) \\r
+              ? (regData | SH5001_INT_NO_LATCH) : (regData & SH5001_INT_LATCH);\r
+\r
+    regData = (intClear == SH5001_INT_CLEAR_ANY) \\r
+              ? (regData | SH5001_INT_CLEAR_ANY) : (regData & SH5001_INT_CLEAR_STATUS);\r
+\r
+    regData = (int1Mode == SH5001_INT1_OD) \\r
+              ? (regData | SH5001_INT1_OD) : (regData & SH5001_INT1_NORMAL);\r
+\r
+    regData = (int1OE == SH5001_INT1_OUTPUT) \\r
+              ? (regData | SH5001_INT1_OUTPUT) : (regData & SH5001_INT1_INPUT);\r
+\r
+    regData = (int0Mode == SH5001_INT0_OD) \\r
+              ? (regData | SH5001_INT0_OD) : (regData & SH5001_INT0_NORMAL);\r
+\r
+    regData = (int0OE == SH5001_INT0_OUTPUT) \\r
+              ? (regData | SH5001_INT0_OUTPUT) : (regData & SH5001_INT0_INPUT);\r
+\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INT_CONF, 1, &regData);\r
+\r
+       if(intLatch == SH5001_INT_NO_LATCH)\r
+       {\r
+               regData = intTime;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_INT_LIMIT, 1, &regData);\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.config INT0 & INT1 function\r
+*\r
+* Parameters:  int1Mode                                        int0Mode\r
+*               SH5001_INT1_NORMAL                     SH5001_INT0_NORMAL\r
+*               SH5001_INT1_OD                         SH5001_INT0_OD\r
+*\r
+*                              int1OE                                          int0OE          \r
+*                              SH5001_INT1_OUTPUT                      SH5001_INT0_OUTPUT\r
+*                              SH5001_INT1_INPUT                       SH5001_INT1_INPUT\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Output_Config( unsigned char int1Mode,\r
+                                                               unsigned char int0Mode,\r
+                                                               unsigned char int1OE,\r
+                                                               unsigned char int0OE)\r
+{\r
+       unsigned char regData = 0;       \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_INT_CONF, 1, &regData);\r
+               \r
+       regData = (int1Mode == SH5001_INT1_OD) \\r
+              ? (regData | SH5001_INT1_OD) : (regData & SH5001_INT1_NORMAL);\r
+       \r
+       regData = (int1OE == SH5001_INT1_OUTPUT) \\r
+              ? (regData | SH5001_INT1_OUTPUT) : (regData & SH5001_INT1_INPUT);\r
+  \r
+       regData = (int0Mode == SH5001_INT0_OD) \\r
+              ? (regData | SH5001_INT0_OD) : (regData & SH5001_INT0_NORMAL);\r
+       \r
+       regData = (int0OE == SH5001_INT0_OUTPUT) \\r
+              ? (regData | SH5001_INT0_OUTPUT) : (regData & SH5001_INT1_INPUT);                        \r
+       \r
+       SH5001_write(SH5001_ADDRESS, SH5001_INT_CONF, 1, &regData);      \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: orientation config;\r
+*\r
+* Parameters:  orientBlockMode                         orientMode                              orientTheta\r
+*               SH5001_ORIENT_BLOCK_MODE0      SH5001_ORIENT_SYMM                      (1 Byte)\r
+*               SH5001_ORIENT_BLOCK_MODE1      SH5001_ORIENT_HIGH_ASYMM\r
+*               SH5001_ORIENT_BLOCK_MODE2      SH5001_ORIENT_LOW_ASYMM\r
+*               SH5001_ORIENT_BLOCK_MODE3\r
+*\r
+*               orientG1point5                         orientSlope                                     orientHyst\r
+*               (2 Bytes)                                      (2 Bytes)                                       (2 Bytes)\r
+*              \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Orient_Config( unsigned char   orientBlockMode,\r
+                                unsigned char  orientMode,\r
+                                unsigned char  orientTheta,\r
+                                unsigned short orientG1point5,\r
+                                unsigned short         orientSlope,\r
+                                unsigned short         orientHyst)\r
+{\r
+       unsigned char regData[2] = {0}; \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, &regData[0]);\r
+       regData[0] |= (regData[0] & 0xC0U) | (orientTheta & 0x3FU); \r
+       SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, &regData[0]);\r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, &regData[0]);\r
+       regData[0] |= (regData[0] & 0xF0U) | (orientBlockMode & 0x0CU) | (orientMode & 0x03U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, &regData[0]);\r
+       \r
+       regData[0] = (unsigned char)orientG1point5;\r
+       regData[1] = (unsigned char)(orientG1point5 >> 8U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INT_1G5_LOW, 2, &regData[0]);\r
+       \r
+       regData[0] = (unsigned char)orientSlope;\r
+       regData[1] = (unsigned char)(orientSlope >> 8U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INT_SLOPE_LOW, 2, &regData[0]);       \r
+       \r
+       regData[0] = (unsigned char)orientHyst;\r
+       regData[1] = (unsigned char)(orientHyst >> 8U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INT_HYST_LOW, 2, &regData[0]);         \r
+}\r
+\r
+\r
+\r
+// Jin: flatTimeTH 200,400,800,000, sure? \r
+\r
+/******************************************************************\r
+* Description: flat INT time threshold, unit: mS;\r
+*\r
+* Parameters:  flatTimeTH                                      flatTanHeta2\r
+*               SH5001_FLAT_TIME_200MS         0 ~ 63\r
+*               SH5001_FLAT_TIME_400MS\r
+*               SH5001_FLAT_TIME_800MS\r
+*               SH5001_FLAT_TIME_000MS\r
+*              \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Flat_Config(unsigned char flatTimeTH, \r
+                                                       unsigned char flatTanHeta2)\r
+{\r
+       unsigned char regData = 0;      \r
+  \r
+    SH5001_read(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, &regData);   \r
+    regData = (regData & 0xF3U) | SH5001_ORIENT_BLOCK_MODE1;\r
+    SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, &regData);  \r
+  \r
+    SH5001_read(SH5001_ADDRESS, SH5001_FLAT_INT_CONF, 1, &regData);    \r
+       regData =  (flatTimeTH & 0xC0U) | (flatTanHeta2 & 0x3FU);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FLAT_INT_CONF, 1, &regData);                \r
+}      \r
+\r
+// Jin: Act  and inAct function --- actIntClear ?\r
+\r
+/******************************************************************\r
+* Description: activity INT config;\r
+*                              actIntThres: 1 LSB is 0.24mg@+/-2G, 0.48mg@+/-4G, 0.97mg@+/-8G, 1.95mg@+/-16G\r
+*\r
+* Parameters:  actEnDisIntX                    actEnDisIntY                    actEnDisIntZ\r
+*               SH5001_ACT_X_INT_EN            SH5001_ACT_Y_INT_EN             SH5001_ACT_Z_INT_EN\r
+*               SH5001_ACT_X_INT_DIS   SH5001_ACT_Y_INT_DIS    SH5001_ACT_Z_INT_DIS\r
+*                                                              \r
+*                                                              \r
+*               actTimeNum             actIntThres             actLinkStatus                           actIntClear                                             \r
+*               (1 Byte)               (2 Byte2)               SH5001_LINK_PRE_STA                     SH5001_ACT_INACT_CLR_STATUS1\r
+*                                                                              SH5001_LINK_PRE_STA_NO          SH5001_ACT_INACT_CLR_STATUS3\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Act_Config(    unsigned char actEnDisIntX,\r
+                            unsigned char actEnDisIntY,\r
+                            unsigned char actEnDisIntZ,\r
+                            unsigned char actTimeNum,\r
+                            unsigned short actIntThres,\r
+                            unsigned char actLinkStatus,\r
+                            unsigned char actIntClear)\r
+{\r
+       unsigned char regData[2] = {0}; \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, &regData[0]); \r
+       regData[0] |= (regData[0] & 0x8FU) | actEnDisIntX | actEnDisIntY | actEnDisIntZ;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, &regData[0]);        \r
+       \r
+       regData[0] = (unsigned char)actIntThres;\r
+       regData[1] = (unsigned char)(actIntThres >> 8U);\r
+       //SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_THRESHOLDL, 2, &regData[0]);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_THRESHOLDL, 1, &regData[0]);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_THRESHOLDH, 1, &regData[1]);\r
+\r
+       regData[0] = actTimeNum;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_TIME, 1, &regData[0]);\r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData[0]); \r
+       regData[0] |= (regData[0] & 0x7EU) | actLinkStatus | actIntClear;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData[0]);           \r
+}      \r
+\r
+\r
+/******************************************************************\r
+* Description: inactivity INT config;\r
+*\r
+* Parameters:  inactEnDisIntX              inactEnDisIntY                              inactEnDisIntZ\r
+*               SH5001_INACT_X_INT_EN          SH5001_INACT_Y_INT_EN           SH5001_INACT_Z_INT_EN\r
+*               SH5001_INACT_X_INT_DIS     SH5001_INACT_Y_INT_DIS          SH5001_INACT_Z_INT_DIS\r
+*                                                                                                                              \r
+*               inactLinkStatus                                inactTimeMs                                     inactIntThres\r
+*               SH5001_LINK_PRE_STA                    Unit: mS                                        (2 Bytes)                               \r
+*               SH5001_LINK_PRE_STA_NO\r
+*\r
+*               inactG1                                                inactIntClear\r
+*               (2 Bytes)                                      SH5001_ACT_INACT_CLR_STATUS1\r
+*                                                                                      SH5001_ACT_INACT_CLR_STATUS3\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Inact_Config(  unsigned char inactEnDisIntX,\r
+                                unsigned char inactEnDisIntY,\r
+                                unsigned char inactEnDisIntZ,\r
+                                unsigned char inactLinkStatus,\r
+                                unsigned char inactTimeMs,\r
+                                unsigned short inactIntThres,\r
+                                unsigned short inactG1,\r
+                                unsigned char inactIntClear)\r
+{\r
+       unsigned char regData = 0;      \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, &regData);            \r
+       regData |= (regData & 0xF8U) | inactEnDisIntX | inactEnDisIntY | inactEnDisIntZ;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, &regData);   \r
+       \r
+       regData = (unsigned char)inactIntThres;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_THRESHOLDL, 1, &regData);\r
+       regData = (unsigned char)(inactIntThres >> 8U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_THRESHOLDH, 1, &regData); \r
+               \r
+       regData = inactTimeMs;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_TIME, 1, &regData);       \r
+       \r
+       /*\r
+       regData = (unsigned char)inactG1;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_1G_REFL, 1, &regData);\r
+       regData = (unsigned char)(inactG1 >> 8U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_1G_REFH, 1, &regData);    \r
+               \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData);    \r
+       regData |= (regData & 0x7EU) | inactLinkStatus | inactIntClear;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData);           \r
+       */\r
+}      \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.tap INT config;\r
+*                              2.tapIntThres is between 0 and 8191;\r
+*               3.tapWaitTimeWindowMs is more than tapWaitTimeMs;\r
+*\r
+* Parameters:  tapEnDisIntX                            tapEnDisIntY                            tapEnDisIntZ\r
+*               SH5001_TAP_X_INT_EN                    SH5001_TAP_Y_INT_EN                     SH5001_TAP_Z_INT_EN\r
+*               SH5001_TAP_X_INT_DIS           SH5001_TAP_Y_INT_DIS            SH5001_TAP_Z_INT_DIS\r
+*                                                                                                                              \r
+*               tapIntThres            tapTimeMs           tapWaitTimeMs               tapWaitTimeWindowMs\r
+*               (13 bits)              Unit: mS                Unit: mS                                Unit: 2mS\r
+*                                                              \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_Tap_Config(    unsigned char tapEnDisIntX,\r
+                            unsigned char tapEnDisIntY,\r
+                            unsigned char tapEnDisIntZ,\r
+                            unsigned char tapIntThres,\r
+                            unsigned char tapTimeMs,\r
+                            unsigned char tapWaitTimeMs,\r
+                            unsigned char tapWaitTimeWindowMs)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData);    \r
+       regData |= (regData & 0xF1U) | tapEnDisIntX | tapEnDisIntY | tapEnDisIntZ;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, &regData);                                                                                                                                                   \r
+                                                                                                                                                       \r
+       regData = (unsigned char)tapIntThres; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDL, 1, &regData);\r
+       SH5001_read(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDH, 1, &regData);\r
+       regData = ((unsigned char)(tapIntThres >> 8U) & 0x1FU) | (regData & 0xE0U); \r
+       SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDH, 1, &regData);\r
+       \r
+       regData = tapTimeMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_DURATION, 1, &regData);     \r
+       \r
+       regData = tapWaitTimeMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_LATENCY, 1, &regData);      \r
+\r
+       regData = tapWaitTimeWindowMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_DTAP_INT_WINDOW, 1, &regData);        \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.SMD INT config;\r
+*                              2.smdBlockTimeS:0-0.5S;         1-1.0S;         2-1.5S;         3-2.0S;\r
+*                                                              4-3.0S;         5-4.0S;         6-5.0S;         7-6.0S;\r
+*                                                              8-7.0S;         9-8.0S;         A-9.0S;         B-10S;\r
+*                                                              C-12S;          D-14S;          E-15S;          F-16S;\r
+*\r
+*               3.smdProofTimeS:0-0.2S;                1-0.25S;        2-0.3S;         3-0.4S;\r
+*                                                              4-0.5S;         5-0.6S;         6-0.7S;         7-0.8S;\r
+*                                                              8-0.9S;         9-1.0S;         A-1.2S;         B-1.5S;\r
+*                                                              C-1.8S;         D-2.1S;         E-2.4S;         F-2.8S;\r
+*\r
+* Parameters:  smdThres                smdBlockTimeS           smdProofTimeS\r
+*                              2 Bytes                 Unit: S                         Unit: S\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_SMD_Config(    unsigned short smdThres,\r
+                            unsigned char smdBlockTimeS,\r
+                                                       unsigned char smdProofTimeS)\r
+{\r
+       unsigned char regData[2] = {0};         \r
+                                               \r
+       regData[0] = (unsigned char)smdThres; \r
+       regData[1] = (unsigned char)(smdThres >> 8U); \r
+       SH5001_write(SH5001_ADDRESS, SH5001_SMD_INT_THRESHOLDL, 2, &regData[0]);        \r
+\r
+       regData[0] |= (unsigned char)((smdBlockTimeS & 0xF0U) << 4U) | (smdProofTimeS & 0xF0U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, &regData[0]);    \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.highG INT config;\r
+*                              2.highGThres is between 0 and 8191;\r
+*               3.highGThres: x=0.5mG@2G, x=1mG@4G, x=2mG@8G, x=4mG@16G\r
+*\r
+* Parameters:  highGEnDisIntX              highGEnDisIntY              highGEnDisIntZ                          \r
+*               SH5001_HIGHG_X_INT_EN          SH5001_HIGHG_Y_INT_EN           SH5001_HIGHG_Z_INT_EN           \r
+*               SH5001_HIGHG_X_INT_DIS         SH5001_HIGHG_Y_INT_DIS          SH5001_HIGHG_Z_INT_DIS\r
+*                      \r
+*               highGEnDisIntAll                       highGThres                                      highGTimeMs\r
+*               SH5001_HIGHG_ALL_INT_EN                Unit: x*8mG                             Unit: 2mS\r
+*               SH5001_HIGHG_ALL_INT_DIS       (13 bits)\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_HighG_Config(  unsigned char highGEnDisIntX,\r
+                                unsigned char highGEnDisIntY,\r
+                                unsigned char highGEnDisIntZ,\r
+                                unsigned char highGEnDisIntAll,\r
+                                unsigned short highGThres,\r
+                                unsigned char highGTimeMs)\r
+{\r
+       unsigned char regData[2] = {0};         \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, &regData[0]);     \r
+       regData[0] |= (regData[0] & 0x0FU) | highGEnDisIntX | highGEnDisIntY | highGEnDisIntZ | highGEnDisIntAll;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, &regData[0]);            \r
+                               \r
+       SH5001_read(SH5001_ADDRESS, SH5001_HIGHG_INT_THRESHOLDL, 2, &regData[0]);                       \r
+       regData[0] = (unsigned char)highGThres; \r
+       regData[1] = (regData[1] & 0xE0U) | ((unsigned char)(highGThres >> 8U) & 0x1FU); \r
+       SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_THRESHOLDL, 2, &regData[0]);      \r
+                       \r
+       regData[0] = highGTimeMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_TIME, 1, &regData[0]);     \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.lowG INT config;\r
+*                              2.lowGThres is between 0 and 8191;\r
+*               3.lowGThres: x=0.5mG@2G or x=1mG@4G or x=2mG@8G or x=4mG@16G\r
+*\r
+* Parameters:  lowGEnDisIntAll             lowGThres           lowGTimeMs\r
+*               SH5001_LOWG_ALL_INT_EN         Unit: x*8mG             Unit: 2mS\r
+*               SH5001_LOWG_ALL_INT_DIS                (13 bits)\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_LowG_Config(   unsigned char lowGEnDisIntAll,\r
+                                unsigned short lowGThres,\r
+                                unsigned char lowGTimeMs)\r
+{\r
+       unsigned char regData[2] = {0};         \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, &regData[0]);     \r
+       regData[0] |= (regData[0] & 0xFEU) | lowGEnDisIntAll;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, &regData[0]);    \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_LOWG_INT_THRESHOLDL, 2, &regData[0]);        \r
+       regData[0] = (unsigned char)lowGThres; \r
+       regData[1] = (regData[1] & 0xE0U) | ((unsigned char)(lowGThres >> 8U) & 0x1FU);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_LOWG_INT_THRESHOLDL, 2, &regData[0]);       \r
+       \r
+       regData[0] = lowGTimeMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_LOWG_INT_TIME, 1, &regData[0]);             \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.freeFall INT config;\r
+*               2.freeFallThres: x=0.5mG@2G or x=1mG@4G or x=2mG@8G or x=4mG@16G\r
+*\r
+* Parameters:  freeFallThres   freeFallTimeMs\r
+*               Unit: x*8mG            Unit: 2mS\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_INT_FreeFall_Config(       unsigned char freeFallThres,\r
+                                    unsigned char freeFallTimeMs)\r
+{\r
+       unsigned char regData = 0;\r
+       \r
+       regData = freeFallThres; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_FREEFALL_INT_THRES, 1, &regData);   \r
+       \r
+       regData = freeFallTimeMs; \r
+       SH5001_write(SH5001_ADDRESS, SH5001_FREEFALL_INT_TIME, 1, &regData);                                                                                                                                                                            \r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.read INT status0\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      unsigned short\r
+*                      bit 13: Tap, Single or Double Tap Interrupt status      \r
+*                      bit 12: SMD Interrupt status\r
+*           bit 11: FIFO Watermark Interrupt status                                                    \r
+*           bit 10: Gyro Data Ready Interrupt status\r
+*           bit 9: Acc Data Ready Interrupt status\r
+*           bit 8: Free-fall Interrupt status \r
+*           bit 7: Low-G Interrupt status\r
+*           bit 6: High-G Interrupt status\r
+*           bit 5: Inactivity Interrupt status\r
+*           bit 4: Activity Interrupt status\r
+*           bit 3: Double Tap Interrupt status \r
+*           bit 2: Single Tap Interrupt status\r
+*           bit 1: Flat Interrupt status\r
+*           bit 0: Orientation Interrupt status \r
+*               0: Not Active\r
+*               1: Active\r
+*\r
+******************************************************************/\r
+unsigned short SH5001_INT_Read_Status01(void)\r
+{\r
+       unsigned char regData[3] = {0};\r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_INT_STA0, 3, &regData[0]);\r
+\r
+       return( ((unsigned short)(regData[1] & 0x3FU) << 8U) | regData[0] );\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.read INT status2\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      unsigned char\r
+*           bit 7: High-G Sign\r
+*               0: Positive\r
+*               1: Negative\r
+*           bit 6: High-G X-axis Interrupt status\r
+*           bit 5: High-G Y-axis Interrupt status\r
+*           bit 4: High-G Z-axis Interrupt status\r
+*               0: No Active\r
+*               1: Active\r
+*           bit 3: Reserved\r
+*           bit 2: Reserved\r
+*           bit 1: Reserved\r
+*           bit 0: Low-G Interrupt status\r
+*               0: Not Active\r
+*               1: Active\r
+*\r
+******************************************************************/\r
+unsigned char SH5001_INT_Read_Status2(void)\r
+{\r
+       unsigned char regData = 0;      \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_INT_STA2, 1, &regData);      \r
+\r
+       return( (regData & 0xF1U));\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.read INT status3\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      unsigned char\r
+*           bit 7: Activity-Inactivity Sign\r
+*               0: Positive\r
+*               1: Negative\r
+*           bit 6: Activity-Inactivity X-axis Interrupt Status\r
+*           bit 5: Activity-Inactivity Y-axis Interrupt Status\r
+*           bit 4: Activity-Inactivity Z-axis Interrupt Status\r
+*               0: No Active\r
+*               1: Active\r
+*                      bit 3: Sign of acceleration that trigger Single or Double Tap Interrup\r
+*               0: Positive\r
+*               1: Negative\r
+*                      bit 2: Whether Single or Double Tap Interrupt is triggered by X axis\r
+*                      bit 1: Whether Single or Double Tap Interrupt is triggered by Y axis\r
+*                      bit 0: Whether Single or Double Tap Interrupt is triggered by Z axis\r
+*               0: No\r
+*               1: Yes\r
+******************************************************************/\r
+unsigned char SH5001_INT_Read_Status3(void)\r
+{\r
+       unsigned char regData = 0;      \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_INT_STA3, 1, &regData);      \r
+\r
+       return(regData);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.read INT status4\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      unsigned char\r
+*           bit 7: Reserved\r
+*           bit 6: Reserved\r
+*           bit 5: Reserved\r
+*           bit 4: Reserved\r
+*           bit 3: Reserved\r
+*           bit 2: Orientation Interrupt Value of Z-axis\r
+*               0: Upward\r
+*               1: Downward\r
+*           bit 1..0: Orientation Interrupt Value of X and Y-axis\r
+*               00: Landscape left\r
+*               01: Landscape right\r
+*               10: Portrait upside down\r
+*               11: Portrait upright\r
+*\r
+******************************************************************/\r
+unsigned char SH5001_INT_Read_Status4(void)\r
+{\r
+       unsigned char regData = 0;      \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_INT_STA4, 1, &regData);      \r
+\r
+       return(regData & 0x07U);\r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: reset FIFO controller;\r
+*\r
+* Parameters:  fifoMode\r
+*               SH5001_FIFO_MODE_DIS\r
+*               SH5001_FIFO_MODE_FIFO\r
+*               SH5001_FIFO_MODE_STREAM\r
+*               SH5001_FIFO_MODE_TRIGGER\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_FIFO_Mode_Set(unsigned char fifoMode)\r
+{\r
+       unsigned char regData = 0;              \r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, &regData);\r
+       regData &= 0x7F;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, &regData);\r
+       \r
+       regData = fifoMode & 0x03;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, &regData);\r
+}\r
+\r
+void SH5001_FIFO_Reset(void)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, &regData);\r
+       regData |= 0x80;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, &regData);\r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.FIFO down sample frequency config;\r
+*               2.fifoAccFreq: accODR*1/2, *1/4, *1/8, *1/16, *1/32, *1/64, *1/128, *1/256\r
+*               3.fifoGyroFreq:        gyroODR*1/2, *1/4, *1/8, *1/16, *1/32, *1/64, *1/128, *1/256\r
+*\r
+* Parameters:  fifoAccDownSampleEnDis          fifoAccFreq/fifoGyroFreq        fifoGyroDownSampleEnDis\r
+*               SH5001_FIFO_ACC_DOWNS_EN       SH5001_FIFO_FREQ_X1_2           SH5001_FIFO_GYRO_DOWNS_EN\r
+*               SH5001_FIFO_ACC_DOWNS_DIS      SH5001_FIFO_FREQ_X1_4           SH5001_FIFO_GYRO_DOWNS_DIS\r
+*                                                                                      SH5001_FIFO_FREQ_X1_8\r
+*                                                                                      SH5001_FIFO_FREQ_X1_16\r
+*                                                                                      SH5001_FIFO_FREQ_X1_32\r
+*                                                                                      SH5001_FIFO_FREQ_X1_64\r
+*                                                                                      SH5001_FIFO_FREQ_X1_128\r
+*                                                                                      SH5001_FIFO_FREQ_X1_256\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_FIFO_Freq_Config(  unsigned char fifoAccDownSampleEnDis,\r
+                                unsigned char fifoAccFreq,\r
+                                unsigned char fifoGyroDownSampleEnDis,\r
+                                unsigned char fifoGyroFreq)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       regData |= fifoAccDownSampleEnDis | fifoGyroDownSampleEnDis;\r
+       regData |= (fifoAccFreq << 4) | fifoGyroFreq;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF4, 1, &regData); \r
+}\r
+\r
+\r
+// Jin: fifoWaterMarkLevel???\r
+/******************************************************************\r
+* Description: 1.config data type in FIFO;\r
+*               2.fifoWaterMarkLevel <= channelNum*2*(INT(1024/(channelNum*2))-1)\r
+*                 eg. fifomode = SH5001_FIFO_ACC_X_EN | SH5001_FIFO_ACC_Y_EN | SH5001_FIFO_ACC_Z_EN\r
+*                     then fifoWaterMarkLevel maximum is 1014\r
+*\r
+* Parameters:  fifoMode                                                fifoWaterMarkLevel\r
+                               SH5001_FIFO_TIMESTAMP_EN                <=1024                            \r
+*               SH5001_FIFO_EXT_Z_EN\r
+*               SH5001_FIFO_EXT_Y_EN\r
+*               SH5001_FIFO_EXT_X_EN                                                   \r
+*               SH5001_FIFO_TEMPERATURE_EN                                                     \r
+*               SH5001_FIFO_GYRO_Z_EN                                                  \r
+*               SH5001_FIFO_GYRO_Y_EN                                          \r
+*               SH5001_FIFO_GYRO_X_EN\r
+*               SH5001_FIFO_ACC_Z_EN\r
+*               SH5001_FIFO_ACC_Y_EN\r
+*               SH5001_FIFO_ACC_X_EN\r
+*               SH5001_FIFO_ALL_DIS\r
+*                                                                                                                      \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_FIFO_Data_Config(  unsigned short fifoMode,\r
+                                unsigned short fifoWaterMarkLevel)\r
+{\r
+       unsigned char regData = 0;\r
+       \r
+       if(fifoWaterMarkLevel > 1024U)\r
+       {\r
+               fifoWaterMarkLevel = 1024U;\r
+       }\r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_FIFO_CONF2, 1, &regData);\r
+       regData = (regData & 0x88U) \\r
+              | ((unsigned char)(fifoMode >> 8U) & 0x70U) \\r
+              | (((unsigned char)(fifoWaterMarkLevel >> 8U)) & 0x07U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF2, 1, &regData);\r
+\r
+       regData = (unsigned char)fifoMode;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF3, 1, &regData);\r
+       \r
+       regData = (unsigned char)fifoWaterMarkLevel;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF1, 1, &regData);            \r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description: 1. read Fifo status and fifo entries count\r
+*\r
+* Parameters:  *fifoEntriesCount, store fifo entries count, less than or equal to 1024;\r
+*\r
+*                                                                                                                      \r
+* return:      unsigned char\r
+*           bit 7: 0\r
+*           bit 6: 0\r
+*           bit 5: Whether FIFO Watermark has been reached\r
+*           bit 4: Whether FIFO is full\r
+*           bit 3: Whether FIFO is empty\r
+*               0: No\r
+*               1: Yes\r
+*           bit 2: 0\r
+*           bit 1: 0\r
+*           bit 0: 0\r
+*\r
+*\r
+******************************************************************/\r
+unsigned char SH5001_FIFO_Read_Status(unsigned short int *fifoEntriesCount)\r
+{\r
+       unsigned char regData[2] = {0};         \r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_FIFO_STA0, 2, &regData[0]);\r
+\r
+       *fifoEntriesCount = ((unsigned short int)(regData[1] & 0x0FU) << 8U) | regData[0];\r
+\r
+       \r
+       return (regData[1] & 0x70U);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1. read Fifo data\r
+*\r
+* Parameters:  *fifoReadData           fifoDataLength\r
+*               data                           data length\r
+*                                                                                                                      \r
+* return:      void\r
+*\r
+*\r
+******************************************************************/\r
+void SH5001_FIFO_Read_Data(unsigned char *fifoReadData, unsigned short int fifoDataLength)\r
+{\r
+    if(fifoDataLength == 0)\r
+       {\r
+               return;\r
+       } \r
+    \r
+       if(fifoDataLength > 1024U)\r
+       {\r
+               fifoDataLength = 1024U;\r
+       } \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_FIFO_DATA, fifoDataLength, fifoReadData);\r
+       /*\r
+    while(fifoDataLength--)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_FIFO_DATA, 1, fifoReadData);\r
+               fifoReadData++;\r
+       }  \r
+       */\r
+}      \r
+\r
+\r
+/******************************************************************\r
+* Description: reset Mater I2C;\r
+*\r
+* Parameters:  void\r
+*                                                                                                                      \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_MI2C_Reset(void)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       regData |= 0x80U;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       regData &= 0x7FU;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);   \r
+       \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.master I2C config;\r
+*               2.master I2C clock frequency is (1MHz/(6+3*mi2cFreq));\r
+*               3.mi2cSlaveAddr: slave device address, 7 bits;\r
+*\r
+*\r
+* Parameters:  mi2cReadMode                                    mi2cODR                                                 mi2cFreq\r
+*               SH5001_MI2C_READ_MODE_AUTO             SH5001_MI2C_READ_ODR_200HZ              <=15\r
+*               SH5001_MI2C_READ_MODE_MANUAL   SH5001_MI2C_READ_ODR_100HZ\r
+*                                                                                              SH5001_MI2C_READ_ODR_50HZ               \r
+*                                                                                              SH5001_MI2C_READ_ODR_25HZ                                                                                                                                                                                       \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_MI2C_Bus_Config(   unsigned char mi2cReadMode,\r
+                                unsigned char mi2cODR,\r
+                                unsigned char mi2cFreq)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       if(mi2cFreq > 15U)\r
+       {\r
+               mi2cFreq = 15U;\r
+       }\r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF1, 1, &regData);\r
+       regData = (regData & 0xC0U) | (mi2cODR & 0x30U) | mi2cFreq;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF1, 1, &regData);   \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       regData = (regData & 0xBFU) | mi2cReadMode;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);           \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.master I2C address and command config;\r
+*               2.mi2cSlaveAddr: slave device address, 7 bits;\r
+*\r
+* Parameters:  mi2cSlaveAddr           mi2cSlaveCmd            mi2cReadMode\r
+*               (1 Byte)                       (1 Byte)                        SH5001_MI2C_READ_MODE_AUTO\r
+*                                                       SH5001_MI2C_READ_MODE_MANUAL\r
+*                                                                                                                                                                              \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_MI2C_Cmd_Config(   unsigned char mi2cSlaveAddr,\r
+                                unsigned char mi2cSlaveCmd,\r
+                                unsigned char mi2cReadMode)\r
+{\r
+       unsigned char regData = 0;      \r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       regData = (regData & 0xBFU) | mi2cReadMode;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CMD0, 1, &regData);\r
+       regData |= (mi2cSlaveAddr << 1U);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CMD0, 1, &regData);\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CMD1, 1, &mi2cSlaveCmd);                                                                                                                                                                                                                                                                                                                       \r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.master I2C write data fucntion;\r
+*               2.mi2cWriteData: write data;\r
+*\r
+* Parameters:  mi2cWriteData\r
+*                                                                                                                                                                              \r
+* return:      SH5001_TRUE or SH5001_FALSE\r
+* \r
+******************************************************************/\r
+unsigned char SH5001_MI2C_Write(unsigned char mi2cWriteData)\r
+{\r
+       unsigned char regData = 0;      \r
+       unsigned char i = 0;\r
+\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_WR, 1, &mi2cWriteData);\r
+               \r
+       //Master I2C enable, write-operation\r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       regData = (regData & 0xFCU) | 0x02U;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       \r
+       // wait write-operation to end\r
+       while(i++ < 20U)\r
+       {       \r
+               SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+               if(regData & 0x30U)\r
+                       break;\r
+       }\r
+               \r
+       if((regData & 0x30U) == SH5001_MI2C_SUCCESS)\r
+       {\r
+               return (SH5001_TRUE);   \r
+       }       \r
+       else\r
+       {\r
+               return (SH5001_FALSE);  \r
+       }               \r
+}                                                                                                                              \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.master I2C read data fucntion;\r
+*               2.*mi2cReadData: read data;\r
+*\r
+* Parameters:  *mi2cReadData\r
+*                                                                                                                                                                              \r
+* return:      SH5001_TRUE or SH5001_FALSE\r
+* \r
+******************************************************************/\r
+unsigned char SH5001_MI2C_Read(unsigned char *mi2cReadData)\r
+{\r
+       unsigned char regData = 0;                      \r
+       unsigned char i = 0;\r
+               \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       if((regData & 0x40U) == 0)\r
+       {       \r
+               //Master I2C enable, read-operation\r
+               regData |= 0x03U;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       }\r
+       \r
+       // wait read-operation to end\r
+       while(i++ < 20U)\r
+       {       \r
+               SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+               if(regData & 0x30U)\r
+                       break;\r
+       }       \r
+\r
+       SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, &regData);\r
+       if((regData & 0x30U) == SH5001_MI2C_SUCCESS)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_MI2C_RD, 1, &regData);\r
+               *mi2cReadData = regData;\r
+               \r
+               return (SH5001_TRUE);   \r
+       }       \r
+       else\r
+       {\r
+               return (SH5001_FALSE);  \r
+       }               \r
+}      \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.SPI interface config;  Default: SH5001_SPI_4_WIRE\r
+*\r
+* Parameters:  spiInterfaceMode\r
+*               SH5001_SPI_3_WIRE\r
+*               SH5001_SPI_4_WIRE\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_SPI_Config(        unsigned char spiInterfaceMode)\r
+{\r
+       #if 0\r
+       unsigned char regData = 0;              \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_SPI_CONF, 1, &regData);      \r
+       regData = (regData & 0xDFU) | spiInterfaceMode;\r
+       #endif\r
+       unsigned char regData = spiInterfaceMode;\r
+\r
+       SH5001_write(SH5001_ADDRESS, SH5001_SPI_CONF, 1, &regData);\r
+} \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.I2C interface config;  Default: SH5001_I2C_EN\r
+*\r
+* Parameters:  i2cInterfaceEnDis\r
+*               SH5001_I2C_EN\r
+*               SH5001_I2C_DIS\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_I2C_Config(unsigned char i2cInterfaceEnDis)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_I2C_CONF, 1, &regData);      \r
+       regData = (regData & 0x7FU) | i2cInterfaceEnDis;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_I2C_CONF, 1, &regData);\r
+} \r
+\r
+\r
+\r
+// Jin\r
+/******************************************************************\r
+* Description: 1.I2C loop mode config;\r
+*                              2.SH5001_I2C_LP_06BYTE: ACC_X ACC_Y ACC_Z\r
+*                              3.SH5001_I2C_LP_12BYTE: ACC_X ACC_Y ACC_Z GYRO_X GYRO_Y GYRO_Z\r
+*                              4.SH5001_I2C_LP_14BYTE: ACC_X ACC_Y ACC_Z GYRO_X GYRO_Y GYRO_Z TEMPERATURE\r
+*\r
+* Parameters:  i2cReadLoopMode\r
+*               SH5001_I2C_LP_06BYTE\r
+*               SH5001_I2C_LP_12BYTE\r
+*                              SH5001_I2C_LP_14BYTE\r
+*                              SH5001_I2C_LP_DISABLE\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_I2C_LP_Config(unsigned char i2cReadLoopMode)\r
+{\r
+       unsigned char regData = 0;              \r
+       \r
+       SH5001_read(SH5001_ADDRESS, SH5001_I2C_CONF, 1, &regData);      \r
+       regData = (regData & 0xF8U) | i2cReadLoopMode;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_I2C_CONF, 1, &regData);\r
+} \r
+\r
+\r
+/******************************************************************\r
+* Description: 1.OIS SPI interface config;  Default: SH5001_OIS_SPI_DIS\r
+*\r
+* Parameters:  oisSpiInterfaceMode             oisSpiInterfaceEnDis\r
+*               SH5001_OIS_SPI_3WIRE   SH5001_OIS_SPI_EN\r
+*               SH5001_OIS_SPI_4WIRE   SH5001_OIS_SPI_DIS\r
+*\r
+* return:      void\r
+* \r
+******************************************************************/\r
+\r
+void SH5001_OIS_SPI_Config(unsigned char oisSpiInterfaceEnDis)\r
+{\r
+  unsigned char regData = 0;\r
+\r
+  SH5001_read(SH5001_ADDRESS, SH5001_OIS_SPI_CONF, 1, &regData);\r
+  regData = (regData & 0xEFU) | oisSpiInterfaceEnDis;\r
+  SH5001_write(SH5001_ADDRESS, SH5001_OIS_SPI_CONF, 1, &regData);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description: 1.Switch SH5001 power mode;\r
+*               2.SH5001_NORMAL_MODE\r
+*                              3.SH5001_ACC_HP_MODE\r
+*               4.SH5001_ACC_LP_MODE\r
+*                              5.SH5001_POWERDOWN_MODE\r
+*\r
+* Parameters:   powerMode\r
+*               SH5001_NORMAL_MODE\r
+*               SH5001_ACC_HP_MODE\r
+*                              SH5001_ACC_LP_MODE\r
+*               SH5001_POWERDOWN_MODE\r
+*\r
+* return:      SH5001_FALSE or SH5001_TRUE\r
+*\r
+******************************************************************/\r
+unsigned char SH5001_SwitchPowerMode(unsigned char powerMode)\r
+{\r
+\r
+       int i = 0;\r
+       unsigned char reg_addr[SH5001_POWMODE_REG_NUM] = { 0x30, 0x20, 0x2B, 0xBD, 0xD9, 0xD1, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8};\r
+       unsigned char reg_data_normal[SH5001_POWMODE_REG_NUM] = { 0x08, 0x23, 0x00, 0x0C, 0x99, 0x68, 0x00, 0x00, 0x01, 0x50, 0x00};\r
+       unsigned char reg_data_acc_hp[SH5001_POWMODE_REG_NUM] = { 0x08, 0x23, 0x01, 0x0C, 0x98, 0x6B, 0x00, 0x7A, 0xFF, 0xFC, 0x00};\r
+       unsigned char reg_data_acc_lp[SH5001_POWMODE_REG_NUM] = { 0x08, 0xA1, 0x01, 0x0E, 0x98, 0x6B, 0x90, 0xFA, 0xFF, 0xFC, 0x00};\r
+       unsigned char reg_data_powerdown[SH5001_POWMODE_REG_NUM] = { 0x08, 0xA1, 0x01, 0x0E, 0x98, 0x6B, 0xF1, 0xFE, 0xFF, 0xFC, 0xE2};\r
+       unsigned char accODR = SH5001_ACC_ODR_2000HZ;\r
+    unsigned char regData = 0;\r
+\r
+       if(powerMode > 0x03)\r
+       {\r
+               return (SH5001_FALSE);\r
+       }\r
+\r
+       switch(powerMode)\r
+       {\r
+       case SH5001_NORMAL_MODE:\r
+\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+               regData = regData & 0x7F;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, &storeAccODR);\r
+               for(i = 0; i < SH5001_POWMODE_REG_NUM; i++)\r
+               {\r
+                       SH5001_write(SH5001_ADDRESS, reg_addr[i], 1, &reg_data_normal[i]);\r
+               }\r
+\r
+               SH5001_DriveStart();\r
+               SH5001_ADCReset();\r
+               SH5001_CVAReset();\r
+               delay_ms(100);// or discard 10\r
+\r
+               return (SH5001_TRUE);\r
+\r
+       case SH5001_ACC_HP_MODE:\r
+\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+               regData = regData | 0x80;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, &storeAccODR);\r
+               for(i = 0; i < SH5001_POWMODE_REG_NUM; i++)\r
+               {\r
+                       SH5001_write(SH5001_ADDRESS, reg_addr[i], 1, &reg_data_acc_hp[i]);\r
+               }\r
+\r
+               delay_ms(30); // or discard 2\r
+\r
+               return (SH5001_TRUE);\r
+\r
+       case SH5001_ACC_LP_MODE:\r
+\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+               regData = regData & 0x7F;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+\r
+               regData = (storeAccODR & 0xF0) | accODR;\r
+               SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, &regData);\r
+               for(i = 0; i < SH5001_POWMODE_REG_NUM; i++)\r
+               {\r
+                       SH5001_write(SH5001_ADDRESS, reg_addr[i], 1, &reg_data_acc_lp[i]);\r
+               }\r
+\r
+               delay_ms(30); // or discard 2\r
+               return (SH5001_TRUE);\r
+\r
+       case SH5001_POWERDOWN_MODE:\r
+\r
+               for(i = 0; i < SH5001_POWMODE_REG_NUM; i++)\r
+               {\r
+                       SH5001_write(SH5001_ADDRESS, reg_addr[i], 1, &reg_data_powerdown[i]);\r
+               }\r
+\r
+               return (SH5001_TRUE);\r
+\r
+       default:\r
+               return (SH5001_FALSE);\r
+       }\r
+}\r
+\r
+/******************************************************************\r
+* Description: 1. fast compensate offset\r
+*\r
+* Parameters:   SH5001Positon\r
+*               SH5001_X_UP\r
+*               SH5001_X_DOWN\r
+*                              SH5001_Y_UP\r
+*               SH5001_Y_DOWN\r
+*                              SH5001_Z_UP\r
+*               SH5001_Z_DOWN\r
+*\r
+* return:      SH5001_FALSE or SH5001_TRUE\r
+*\r
+******************************************************************/\r
+void SH5001_FastOffsetComp(unsigned char SH5001Positon)\r
+{\r
+  unsigned char regData = 0;\r
+    \r
+  switch(SH5001Positon)\r
+    {\r
+  case SH5001_X_UP:\r
+    regData = 0x90U;\r
+    break;\r
+  case SH5001_X_DOWN:\r
+    regData = 0x91U;\r
+    break;  \r
+  case SH5001_Y_UP:\r
+    regData = 0x92U;\r
+    break;\r
+  case SH5001_Y_DOWN:\r
+    regData = 0x93U;\r
+    break;     \r
+  case SH5001_Z_UP:\r
+    regData = 0x94U;\r
+    break;\r
+  case SH5001_Z_DOWN:\r
+    regData = 0x95U;\r
+    break; \r
+  default:\r
+    regData = 0x94U;\r
+    break;\r
+  }\r
+  \r
+//  SH5001_write(SH5001_ADDRESS, SH5001_FAST_COMP, 1, &regData);\r
+}  \r
+\r
+\r
+#ifdef SH5001_ACTIVITY_INT\r
+\r
+void SH5001_Init_Activity_Int(void)\r
+{\r
+\r
+       unsigned char regData = 0;\r
+\r
+       SH5001_INT_Config(SH5001_INT0_LEVEL_HIGH,\r
+                      SH5001_INT_LATCH, //SH5001_INT_NO_LATCH, SH5001_INT_LATCH\r
+                      SH5001_INT_CLEAR_STATUS,  //SH5001_INT_CLEAR_ANY, SH5001_INT_CLEAR_STATUS\r
+                      1,\r
+                      SH5001_INT1_NORMAL,\r
+                      SH5001_INT0_NORMAL,\r
+                      SH5001_INT1_OUTPUT,\r
+                      SH5001_INT0_OUTPUT);\r
+\r
+       SH5001_INT_Act_Config(SH5001_ACT_X_INT_EN,\r
+       SH5001_ACT_Y_INT_EN,\r
+       SH5001_ACT_Z_INT_EN,\r
+       2,\r
+       20,\r
+       SH5001_LINK_PRE_STA_NO,\r
+       SH5001_ACT_INACT_CLR_STATUS1);\r
+\r
+       SH5001_INT_Enable(SH5001_INT_ACT,\r
+                      SH5001_INT_EN,\r
+                      SH5001_INT_MAP_INT0);\r
+       //TODO\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+       regData = regData & 0x7F;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, &regData);\r
+\r
+       SH5001_read(SH5001_ADDRESS, 0xBD, 1, &regData);\r
+       regData = (regData & 0x7F);\r
+       SH5001_write(SH5001_ADDRESS, 0xBD, 1, &regData);\r
+}\r
+\r
+#endif\r
+\r
+#ifdef SH5001_DATA_READY_INT\r
+void SH5001_Init_Data_Ready_Int(void)\r
+{\r
+\r
+       unsigned char regData = 0;\r
+\r
+       SH5001_INT_Config(SH5001_INT0_LEVEL_HIGH,\r
+                      SH5001_INT_LATCH, //SH5001_INT_NO_LATCH, SH5001_INT_LATCH\r
+                      SH5001_INT_CLEAR_STATUS,  //SH5001_INT_CLEAR_ANY, SH5001_INT_CLEAR_STATUS\r
+                      1,\r
+                      SH5001_INT1_NORMAL,\r
+                      SH5001_INT0_NORMAL,\r
+                      SH5001_INT1_OUTPUT,\r
+                      SH5001_INT0_OUTPUT);\r
+\r
+       SH5001_INT_Enable(SH5001_INT_ACC_READY, //SH5001_INT_GYRO_READY SH5001_INT_ACC_READY\r
+                      SH5001_INT_EN,\r
+                      SH5001_INT_MAP_INT0);\r
+\r
+}\r
+\r
+#endif\r
+\r
+/******************************************************************\r
+* Description:         1. SH5001 initialization FIFO\r
+*               2. INT mode\r
+*               3. Enable ACC_X, ACC_Y, ACC_Z, GYRO_X, GYRO_Y, GYRO_Z\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      void\r
+*\r
+******************************************************************/\r
+void SH5001_InitFIFO(void)\r
+{  \r
+\r
+       SH5001_INT_Config(SH5001_INT0_LEVEL_HIGH,\r
+                      SH5001_INT_LATCH, //SH5001_INT_NO_LATCH, SH5001_INT_LATCH\r
+                      SH5001_INT_CLEAR_STATUS,  //SH5001_INT_CLEAR_ANY, SH5001_INT_CLEAR_STATUS\r
+                      1,\r
+                      SH5001_INT1_NORMAL,\r
+                      SH5001_INT0_NORMAL,\r
+                      SH5001_INT1_OUTPUT,\r
+                      SH5001_INT0_OUTPUT);\r
+\r
+       SH5001_FIFO_Reset();\r
+\r
+       SH5001_FIFO_Freq_Config(SH5001_FIFO_ACC_DOWNS_DIS,\r
+                            SH5001_FIFO_FREQ_X1_32,\r
+                            SH5001_FIFO_GYRO_DOWNS_DIS,\r
+                            SH5001_FIFO_FREQ_X1_32);\r
+\r
+    SH5001_FIFO_Data_Config(SH5001_FIFO_ACC_X_EN\r
+                            | SH5001_FIFO_ACC_Y_EN\r
+                            | SH5001_FIFO_ACC_Z_EN\r
+                            | SH5001_FIFO_GYRO_X_EN\r
+                            | SH5001_FIFO_GYRO_Y_EN\r
+                            | SH5001_FIFO_GYRO_Z_EN,\r
+                            120);\r
+\r
+    SH5001_FIFO_Mode_Set(SH5001_FIFO_MODE_FIFO);\r
+\r
+       SH5001_INT_Enable(SH5001_INT_FIFO_WATERMARK,\r
+                      SH5001_INT_EN, \r
+                      SH5001_INT_MAP_INT0);\r
+\r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description:         1. SH5001 read ACC_X, ACC_Y, ACC_Z, GYRO_X, GYRO_Y, GYRO_Z @FIFO\r
+*               2. clear FIFO Watermark INT\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      void\r
+*\r
+******************************************************************/\r
+void SH5001_ReadFIFO(void)\r
+{\r
+       unsigned short fifoEntriesCount = 0;\r
+       unsigned char fifoData[SH5001_FIFO_BUFFER] = {0};\r
+       unsigned short i = 0, j = 0, dataGroup = 0;\r
+       short accData[3], gyroData[3];\r
+       unsigned char regData = 0;\r
+\r
+       // read FIFO entries count\r
+       SH5001_FIFO_Read_Status(&fifoEntriesCount);\r
+\r
+       dataGroup = (unsigned short)(fifoEntriesCount/SH5001_WATERMARK_DIV);\r
+       fifoEntriesCount = dataGroup * SH5001_WATERMARK_DIV;\r
+\r
+       SH5001_FIFO_Read_Data(fifoData, fifoEntriesCount);\r
+\r
+       printf("fc %d\r\n", fifoEntriesCount);\r
+\r
+       for(i = 0; i < dataGroup; i++) \r
+       {                               \r
+               accData[0] = ((short)fifoData[j+1] << 8) | fifoData[j];\r
+               accData[1] = ((short)fifoData[j+3] << 8) | fifoData[j+2];\r
+               accData[2] = ((short)fifoData[j+5] << 8) | fifoData[j+4];       \r
+               gyroData[0] = ((short)fifoData[j+7] << 8) | fifoData[j+6];\r
+               gyroData[1] = ((short)fifoData[j+9] << 8) | fifoData[j+8];\r
+               gyroData[2] = ((short)fifoData[j+11] << 8) | fifoData[j+10];    \r
+\r
+               printf("%d %d %d %d %d %d\r\n", accData[0], accData[1], accData[2],gyroData[0], gyroData[1], gyroData[2]);\r
+       \r
+               j = j + SH5001_WATERMARK_DIV;\r
+       }       \r
+    \r
+        \r
+    // clear INT    \r
+   // SH5001_INT_Read_Status01();\r
+\r
+\r
+}  \r
+\r
+ #define SH5001_REGISTER_SETTING_TOTAL 18\r
+static int sh5001DumpReg(void)\r
+{\r
+       int i = 0;\r
+       int ret = 0;\r
+       uint8_t reg = 0;\r
+       uint8_t regData = 0;\r
+\r
+       //uint8_t SH5001Reg[SH5001_REGISTER_SETTING_TOTAL]      =       {0x20, 0x21,0x22, 0x23, 0x24, 0x25};\r
+\r
+       //uint8_t SH5001Reg[SH5001_REGISTER_SETTING_TOTAL]      =       {0x20, 0x21,0x22, 0x23, 0x24, 0x25, 0x40, 0x41, 0x42, 0x43, 0x66}; //FIFO wm int\r
+       uint8_t SH5001Reg[SH5001_REGISTER_SETTING_TOTAL]        =       {0x20, 0x21,0x22, 0x23, 0x24, 0x25,0x40, 0x41, 0x42, 0x43, 0x66, 0x4D, 0x4E,  0x54,0x55, 0x56, 0xBD};  //Activity int\r
+\r
+       //uint8_t SH3001Reg[SH3001_REGISTER_SETTING_TOTAL]      =       {0x28, 0x29, 0x2B, 0x23, 0x26, 0xdd}; //lpf setting\r
+       // uint8_t SH3001Reg[SH3001_REGISTER_SETTING_TOTAL]     =       {0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,0x2A, 0x2B};\r
+       //uint8_t SH3001Reg[SH3001_REGISTER_SETTING_TOTAL]      =       {0x22, 0x23, 0x24, 0x25, 0x26, 0x35,0x36,0x37, 0x38,0x39};\r
+       //uint8_t ST3001RegData[SH3001_REGISTER_SETTING_TOTAL] = {0x00,0x1F,0x00,0x2B,0x00};\r
+       //uint8_t SH3001INTFIFOReg[SH3001_REGISTER_SETTING_TOTAL]       =       {0x35, 0x36, 0x37, 0x38, 0x39, 0x40,0x41,0x44, 0x45,0x46, 0x47, 0x4d,0x79,0x7A,0x0F,0x8F,0x9F,0xAF};\r
+       //uint8_t SH3001Reg[SH3001_REGISTER_SETTING_TOTAL]      =       {0x35, 0x36, 0x37, 0x38, 0x39, 0x40,0x41,0x42, 0x43,0x44, 0x45,0x46, 0x47, 0xFE};\r
+       //uint8_t SH3001Reg[SH3001_REGISTER_SETTING_TOTAL]      =       {0x20, 0x21, 0x0c, 0x0d};\r
+\r
+       for( i = 0 ; i < SH5001_REGISTER_SETTING_TOTAL ; i++ )\r
+       {\r
+\r
+               //read\r
+               reg = SH5001Reg[i];\r
+\r
+               ret = SH5001_read(SH5001_ADDRESS, reg, 1, &regData);\r
+               if(ret != 0)\r
+               {\r
+                       printf("Senodia Dump Reg 0x%x read error\r\n", reg);\r
+                       return -1;\r
+               }\r
+\r
+               printf("Senodia DR >>>>> 0x%x = 0x%x\r\n", reg, regData);\r
+\r
+       }\r
+\r
+\r
+       return ret;\r
+\r
+}\r
+\r
+static void SH5001_IMU_Data_Stablize(void)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       //TODO Three times maybe\r
+       //acc\r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, &regData);\r
+       regData &= 0xFE;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, &regData);\r
+       regData |= 0x1;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, &regData);\r
+\r
+\r
+       //gyro\r
+       SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+       regData &= 0xFE;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+       regData |= 0x1;\r
+       SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, &regData);\r
+}\r
+\r
+static void SH5001_OSC_FREQ(void)\r
+{\r
+       unsigned char regData = 0;\r
+\r
+       SH5001_read(SH5001_ADDRESS, 0xDA, 1, &regData);\r
+       if((regData & 0x07) != 0x07)\r
+       {\r
+               regData |= 0x07;\r
+               SH5001_write(SH5001_ADDRESS, 0xDA, 1, &regData);\r
+       }\r
+\r
+}\r
+\r
+#if SENODIA_VDD_3V3\r
+short v3_acc[3] = {0};\r
+unsigned char use_otp_comp = 0;\r
+\r
+void SH5001_Get_Otpoffset(short vacc[3])\r
+{\r
+       unsigned char regData[3]={0};\r
+       unsigned char data = 0;\r
+\r
+       //entry otp read mode\r
+       data = 0x72;\r
+       SH5001_write(SH5001_ADDRESS, 0x02, 1, &data);\r
+\r
+       //read otp page\r
+       data = 0;\r
+       SH5001_read(SH5001_ADDRESS, 0x0, 1, &data);\r
+       printf("otp page data:0x%x\n", data);\r
+       if(data == 0x70){\r
+               //exit otp mode\r
+               data = 0x71;\r
+               SH5001_write(SH5001_ADDRESS, 0x03, 1, &data);\r
+\r
+               //entry otp page 2\r
+               data = 0x70;\r
+               SH5001_write(SH5001_ADDRESS, 0x05, 1, &data);\r
+\r
+               //entry otp read mode\r
+               data = 0x72;\r
+               SH5001_write(SH5001_ADDRESS, 0x02, 1, &data);\r
+\r
+       }\r
+       //otp read data\r
+       SH5001_read(SH5001_ADDRESS, 0x08, 3, regData);\r
+\r
+       //exit otp mode\r
+       data = 0x71;\r
+       SH5001_write(SH5001_ADDRESS, 0x03, 1, &data);\r
+\r
+       if(regData[0] == 0x5f && regData[1] == 0x0 && regData[2] == 0x48)\r
+               use_otp_comp = 0;\r
+       else\r
+               use_otp_comp = 1;\r
+       printf("use_otp_comp:%d\n", use_otp_comp);\r
+       vacc[0] = ((signed char)regData[0]) * 8;\r
+       vacc[1] = ((signed char)regData[1]) * 8;\r
+       vacc[2] = ((signed char)regData[2]) * 8;\r
+       printf("%d %d %d %d %d %d \r\n", regData[0], regData[1], regData[2], vacc[0], vacc[1], vacc[2]);\r
+}\r
+#endif\r
+/******************************************************************\r
+* Description:         SH5001 initialization function\r
+*\r
+* Parameters:  void\r
+*                                                                                                                                                                              \r
+* return:      SH5001_TRUE or SH5001_FALSE\r
+*\r
+******************************************************************/\r
+unsigned char SH5001_init(void) \r
+{\r
+       unsigned char regData = 0;\r
+       unsigned char i = 0;\r
+\r
+#if SH5001_SPI_3WIRE_MODE\r
+       SH5001_SPI_Config(SH5001_SPI_3_WIRE);\r
+#endif\r
+\r
+       // SH5001 chipID = 0xA1;        \r
+       while((regData != 0xA1U) && (i++ < 3U))\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_CHIP_ID, 1, &regData);       \r
+               if((i == 3) && (regData != 0xA1U))\r
+               {\r
+                       printf("SH5001 init fail, Chip ID = 0x%x\r\n", regData);\r
+                       return SH5001_FALSE;\r
+               }       \r
+       }\r
+       printf("SH5001 Chip ID = 0x%x\r\n", regData);\r
+               \r
+       // reset internal module, don't modify it\r
+       SH5001_ModuleReset();   \r
+\r
+       SH5001_OSC_FREQ();\r
+\r
+       #if SH5001_OIS_ENABLE\r
+       SH5001_OIS_SPI_Config(SH5001_OIS_SPI_EN);\r
+       #endif\r
+\r
+       // 500Hz, 16G, cut off Freq(BW)=500*0.25Hz=125Hz, enable filter;\r
+       SH5001_Acc_Config(SH5001_ACC_ODR_125HZ, \r
+                    SH5001_ACC_RANGE_16G, //SH5001_ACC_RANGE_8G  SH5001_ACC_RANGE_16G\r
+                    SH5001_ACC_ODRX040,\r
+                    SH5001_ACC_FILTER_EN,\r
+                    SH5001_ACC_BYPASS_EN);\r
+\r
+       printf("SH5001 acc config ok\r\n");\r
+\r
+       // 800Hz, X\Y\Z 2000deg/s, cut off Freq(BW)=291Hz, enable filter;\r
+       SH5001_Gyro_Config(     SH5001_GYRO_ODR_125HZ,\r
+                      SH5001_GYRO_RANGE_2000,\r
+                      SH5001_GYRO_ODRX040,\r
+                      SH5001_GYRO_FILTER_EN,\r
+                      SH5001_GYRO_BYPASS_EN);\r
+\r
+       SH5001_IMU_Data_Stablize();\r
+\r
+       #if SH5001_OIS_ENABLE\r
+       SH5001_Acc_OIS_Config(SH5001_ACC_OIS_ODR_1000HZ,\r
+               SH5001_ACC_OIS_RANGE_8G,\r
+               SH5001_ACC_OIS_ODRX004,\r
+               SH5001_ACC_OIS_ENABLE);\r
+\r
+       SH5001_Gyro_OIS_Config(SH5001_GYRO_OIS_ODR_8000HZ,\r
+               SH5001_GYRO_OIS_RANGE_2000,\r
+               SH5001_GYRO_OIS_ODRX004,\r
+               SH5001_GYRO_OIS_ENABLE);\r
+       #endif\r
+\r
+       #if SH5001_TS_ENABLE\r
+       SH5001_TimeStamp_Config(SH5001_TS_ODR_1KHZ, SH5001_TS_EN);\r
+       #endif\r
+\r
+       // temperature ODR is 63Hz, enable temperature measurement\r
+       SH5001_Temp_Config(SH5001_TEMP_ODR_63HZ, SH5001_TEMP_EN);\r
+\r
+       //sh5001DumpReg();\r
+       #ifdef SH5001_FIFO_WM_INT\r
+       SH5001_InitFIFO();\r
+       #endif\r
+\r
+       #ifdef SH5001_ACTIVITY_INT\r
+       SH5001_Init_Activity_Int();\r
+       #endif\r
+\r
+       #ifdef SH5001_DATA_READY_INT\r
+       SH5001_Init_Data_Ready_Int();\r
+       #endif\r
+\r
+#if SENODIA_VDD_3V3\r
+       SH5001_Get_Otpoffset(v3_acc);\r
+#endif\r
+       //sh5001DumpReg();\r
+       //sh5001DumpRegAll();\r
+\r
+       return SH5001_TRUE;\r
+}\r
+\r
+\r
+\r
+/******************************************************************\r
+* Description:         Read SH5001 gyroscope and accelerometer data\r
+*\r
+* Parameters:  accData[3]: acc X,Y,Z;  gyroData[3]: gyro X,Y,Z;\r
+*                                                                                                                                                                              \r
+* return:      void\r
+* \r
+******************************************************************/\r
+void SH5001_GetImuData( short accData[3], short gyroData[3] )\r
+{\r
+       unsigned char regData[12]={0};  \r
+               \r
+       SH5001_read(SH5001_ADDRESS, SH5001_ACC_XL, 12, regData); \r
+  \r
+       accData[0] = ((short)regData[1] << 8) | regData[0];\r
+       accData[1] = ((short)regData[3] << 8) | regData[2];\r
+       accData[2] = ((short)regData[5] << 8) | regData[4];             \r
+       \r
+       gyroData[0] = ((short)regData[7] << 8) | regData[6];\r
+       gyroData[1] = ((short)regData[9] << 8) | regData[8];\r
+       gyroData[2] = ((short)regData[11] << 8) | regData[10];\r
+\r
+#if SENODIA_VDD_3V3\r
+       if(use_otp_comp){\r
+               accData[0] -= v3_acc[0];\r
+               accData[1] -= v3_acc[1];\r
+               accData[2] -= v3_acc[2];\r
+       }\r
+#endif\r
+\r
+       printf("%d %d %d %d %d %d\r\n", accData[0], accData[1], accData[2], gyroData[0], gyroData[1], gyroData[2]);\r
+}\r
+\r
+void SH5001_OIS_GetTS(int timestamp[1])\r
+{\r
+       unsigned char regData[3]={0};\r
+\r
+       SH5001_read(SH5001_ADDRESS, 0xE, 3, regData);\r
+\r
+       timestamp[0] = ((int)regData[2] << 16) | ((int)regData[1] << 8) | regData[0];\r
+\r
+}\r
+\r
+#if SH5001_OIS_ENABLE\r
+void SH5001_OIS_GetImuData( short accData[3], short gyroData[3] )\r
+{\r
+       unsigned char regData[12]={0};\r
+       int i = 0;\r
+\r
+       SH5001_OIS_read(SH5001_ADDRESS, SH5001_ACC_XL, 12, regData);\r
+\r
+       accData[0] = ((short)regData[1] << 8) | regData[0];\r
+       accData[1] = ((short)regData[3] << 8) | regData[2];\r
+       accData[2] = ((short)regData[5] << 8) | regData[4];\r
+\r
+       gyroData[0] = ((short)regData[7] << 8) | regData[6];\r
+       gyroData[1] = ((short)regData[9] << 8) | regData[8];\r
+       gyroData[2] = ((short)regData[11] << 8) | regData[10];\r
+\r
+       //printf("%d %d %d %d %d %d\r\n", accData[0], accData[1], accData[2], gyroData[0], gyroData[1], gyroData[2]);\r
+}\r
+#endif\r
+\r
+#define SH5001_OFFSET_REG_NUM 13\r
+void offset_comp_save_reg(float offset[3])\r
+{\r
+       unsigned char offsetData[SH5001_OFFSET_REG_NUM] = {0};\r
+\r
+       short offset_otp[3] = {0};\r
+       short gain_otp[3] = {0};\r
+       unsigned int range = 1;\r
+\r
+       int offset_temp[3] = {0};\r
+       short offset_new[3] = {0};\r
+       unsigned short s_offset_new[3] = {0};\r
+\r
+       unsigned char i;\r
+\r
+\r
+       unsigned char offsetRegister[SH5001_OFFSET_REG_NUM] = { 0x8C, 0x8D, 0x8E, 0x8F, 0x98, 0x99, 0x9A, 0x9B, 0xA4, 0xA5 , 0xA6,\r
+       0xA7, 0x24};\r
+\r
+       for(i=0; i<SH5001_OFFSET_REG_NUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, offsetRegister[i], 1, &offsetData[i]);\r
+               #ifdef SH5001_OT_DEBUG\r
+               printf("0x%x = 0x%x\r\n", offsetRegister[i], offsetData[i]);\r
+               #endif\r
+       }\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("n offset %f %f %f \r\n", offset[0], offset[1],offset[2]);\r
+       #endif\r
+\r
+       offset_otp[0] = ((short)offsetData[3] << 8) | offsetData[2];\r
+       offset_otp[1] = ((short)offsetData[7] << 8) | offsetData[6];\r
+       offset_otp[2] = ((short)offsetData[11] << 8) | offsetData[10];\r
+\r
+       gain_otp[0] = ((short)offsetData[1] << 8) | offsetData[0];\r
+       gain_otp[1] = ((short)offsetData[5] << 8) | offsetData[4];\r
+       gain_otp[2] = ((short)offsetData[9] << 8) | offsetData[8];\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("offset_otp %d %d %d \r\n", offset_otp[0], offset_otp[1],offset_otp[2]);\r
+       printf("gain_otp %d %d %d \r\n", gain_otp[0], gain_otp[1],gain_otp[2]);\r
+       #endif\r
+\r
+       offsetData[12] = (offsetData[12] & 0x70) >> 4;\r
+\r
+       if(offsetData[12] != 0)\r
+       {\r
+                       for(i=0; i < offsetData[12] + 7; i++)\r
+                       {\r
+                               range = range * 2;\r
+                       }\r
+       }\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("range %d \r\n", range);\r
+       #endif\r
+\r
+       for(i = 0; i < 3; i++)\r
+       {\r
+               offset_temp[i] = offset_otp[i] + (int)(offset[i] * ((float)range) / ((float)gain_otp[i]));  //\r
+               //offset_new[i] = offset_otp[i] + (offset[i] * range / gain_otp[i]);  //\r
+       }\r
+\r
+       if(offset_temp[0] > 32767)\r
+               offset_temp[0] = 32767;\r
+       else if(offset_temp[0] < -32768)\r
+               offset_temp[0] = -32768;\r
+       if(offset_temp[1] > 32767)\r
+               offset_temp[1] = 32767;\r
+       else if(offset_temp[1] < -32768)\r
+               offset_temp[1] = -32768;\r
+       if(offset_temp[2] > 32767)\r
+               offset_temp[2] = 32767;\r
+       else if(offset_temp[2] < -32768)\r
+               offset_temp[2] = -32768;\r
+\r
+       offset_new[0] = (short)offset_temp[0];\r
+       offset_new[1] = (short)offset_temp[1];\r
+       offset_new[2] = (short)offset_temp[2];\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("offset_new %d %d %d \r\n", offset_new[0], offset_new[1],offset_new[2]);\r
+       #endif\r
+\r
+       s_offset_new[0] = (unsigned short)offset_new[0];\r
+       s_offset_new[1] = (unsigned short)offset_new[1];\r
+       s_offset_new[2] = (unsigned short)offset_new[2];\r
+\r
+       offsetData[3] = (unsigned char)((s_offset_new[0] & 0xFF00)>>8);\r
+       offsetData[7] = (unsigned char)((s_offset_new[1] & 0xFF00)>>8);\r
+       offsetData[11] = (unsigned char)((offset_new[2] & 0xFF00)>>8);\r
+       offsetData[2] = (unsigned char)((s_offset_new[0] & 0x00FF));\r
+       offsetData[6] = (unsigned char)((s_offset_new[1] & 0x00FF));\r
+       offsetData[10] = (unsigned char)((s_offset_new[2] & 0x00FF));\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("offsetData %x %x %x %x %x %x\r\n", offsetData[2], offsetData[3],offsetData[6], offsetData[7], offsetData[10], offsetData[11]);\r
+  #endif\r
+\r
+       SH5001_write(SH5001_ADDRESS, 0x8E, 1, &offsetData[2]);\r
+       SH5001_write(SH5001_ADDRESS, 0x8F, 1, &offsetData[3]);\r
+       SH5001_write(SH5001_ADDRESS, 0x9A, 1, &offsetData[6]);\r
+       SH5001_write(SH5001_ADDRESS, 0x9B, 1, &offsetData[7]);\r
+       SH5001_write(SH5001_ADDRESS, 0xA6, 1, &offsetData[10]);\r
+       SH5001_write(SH5001_ADDRESS, 0xA7, 1, &offsetData[11]);\r
+\r
+       //for test\r
+       #if 0\r
+       for(i=0; i<SH5001_OFFSET_REG_NUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, offsetRegister[i], 1, &offsetData[i]);\r
+               #ifdef SH5001_OT_DEBUG\r
+               printf("read back 0x%x = 0x%x\r\n", offsetRegister[i], offsetData[i]);\r
+               #endif\r
+       }\r
+       #endif\r
+}\r
+\r
+#define SH5001_TEMPCOMP_REG_NUM 10\r
+void temp_comp_save_reg(float k[3])\r
+{\r
+       unsigned char tempCompData[SH5001_OFFSET_REG_NUM] = {0};\r
+\r
+       signed char beta_otp[3] = {0};\r
+       short gain_otp[3] = {0};\r
+       unsigned int range = 1;\r
+\r
+       unsigned char  beta_new[3] = {0};\r
+       signed char  s_beta_new[3] = {0};\r
+       int  s_beta_temp[3] = {0};\r
+\r
+       unsigned char i;\r
+\r
+       unsigned char tempCompRegister[SH5001_OFFSET_REG_NUM] = { 0x8C, 0x8D,  0x98, 0x99,  0xA4, 0xA5 , 0x92,0x9e,0xAA, 0x24};\r
+\r
+       for(i=0; i<SH5001_TEMPCOMP_REG_NUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, tempCompRegister[i], 1, &tempCompData[i]);\r
+               #ifdef SH5001_OT_DEBUG\r
+               printf("0x%x = 0x%x\r\n", tempCompRegister[i], tempCompData[i]);\r
+               #endif\r
+       }\r
+\r
+       for(i=0; i<3; i++)\r
+       {\r
+               k[i] = k[i] * 16.4 / 14.0; // deg/c  to lsb/lsb  range2000dps\r
+       }\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("k %f %f %f \r\n", k[0], k[1],k[2]);\r
+       #endif\r
+\r
+       gain_otp[0] = ((short)tempCompData[1] << 8) | tempCompData[0];\r
+       gain_otp[1] = ((short)tempCompData[3] << 8) | tempCompData[2];\r
+       gain_otp[2] = ((short)tempCompData[5] << 8) | tempCompData[4];\r
+\r
+       //TODO unsigned to signed\r
+       beta_otp[0] = ((signed char)tempCompData[6]);\r
+       beta_otp[1] = ((signed char)tempCompData[7]);\r
+       beta_otp[2] = ((signed char)tempCompData[8]);\r
+\r
+       tempCompData[9] = (tempCompData[9] & 0x70) >> 4;\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("gain_otp %d %d %d \r\n", gain_otp[0], gain_otp[1],gain_otp[2]);\r
+       printf("temp_otp %d %d %d \r\n", beta_otp[0], beta_otp[1],beta_otp[2]);\r
+       printf("range 0x%x \r\n", tempCompData[9]);\r
+       #endif\r
+\r
+       if(tempCompData[9] != 0)\r
+       {\r
+                       for(i=0; i < tempCompData[9] + 14; i++)\r
+                       {\r
+                               range = range * 2;\r
+                       }\r
+       }\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("range222 %d \r\n", range);\r
+       #endif\r
+  //TODO\r
+       for(i = 0; i < 3; i++)\r
+       {\r
+               s_beta_temp[i] = beta_otp[i] - (int)(k[i] * ((float)range) / ((float)gain_otp[i]));\r
+               #ifdef SH5001_OT_DEBUG\r
+                       printf("beta_ 111 %f %d\r\n", k[i] * range / gain_otp[i], (int)(k[i] * range / gain_otp[i]));\r
+               #endif\r
+       }\r
+\r
+       if(s_beta_temp[0] > 127)\r
+               s_beta_temp[0] = 127;\r
+       else if(s_beta_temp[0] < -128)\r
+               s_beta_temp[0] = -128;\r
+       if(s_beta_temp[1] > 127)\r
+               s_beta_temp[1] = 127;\r
+       else if(s_beta_temp[1] < -128)\r
+               s_beta_temp[1] = -128;\r
+       if(s_beta_temp[2] > 127)\r
+               s_beta_temp[2] = 127;\r
+       else if(s_beta_temp[2] < -128)\r
+               s_beta_temp[2] = -128;\r
+\r
+       s_beta_new[0] = (char)s_beta_temp[0];\r
+       s_beta_new[1] = (char)s_beta_temp[1];\r
+       s_beta_new[2] = (char)s_beta_temp[2];\r
+\r
+       beta_new[0] = (unsigned char)s_beta_new[0];\r
+       beta_new[1] = (unsigned char)s_beta_new[1];\r
+       beta_new[2] = (unsigned char)s_beta_new[2];\r
+\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("s_beta_new %d %d %d \r\n", s_beta_new[0], s_beta_new[1],s_beta_new[2]);\r
+       printf("beta_new %x %x %x \r\n", beta_new[0], beta_new[1],beta_new[2]);\r
+    #endif\r
+\r
+       SH5001_write(SH5001_ADDRESS, 0x92, 1, &beta_new[0]);\r
+       SH5001_write(SH5001_ADDRESS, 0x9e, 1, &beta_new[1]);\r
+       SH5001_write(SH5001_ADDRESS, 0xAA, 1, &beta_new[2]);\r
+}\r
+\r
+#define SH5001_ACC_REG_NUM 4\r
+void acc_temp_comp_save_reg(float k[3])\r
+{\r
+       unsigned char tempCompData[SH5001_ACC_REG_NUM] = {0};\r
+       signed char beta_otp[3] = {0};\r
+       short gain_otp[3] = {0};\r
+       unsigned int range = 1;\r
+       float rangek = 1;\r
+       unsigned char beta_new[3] = {0};\r
+       signed char s_beta_new[3] = {0};\r
+       int s_beta_temp[3] = {0};\r
+       unsigned char i;\r
+       unsigned char tempCompRegister[SH5001_ACC_REG_NUM] = {0x71, 0x7c, 0x88, 0x21};\r
+       for(i=0; i<SH5001_ACC_REG_NUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, tempCompRegister[i], 1, &tempCompData[i]);\r
+               #ifdef SH5001_OT_DEBUG\r
+               printf("0x%x = 0x%x\r\n", tempCompRegister[i], tempCompData[i]);\r
+               #endif\r
+       }\r
+       beta_otp[0] = ((signed char)tempCompData[0]);\r
+       beta_otp[1] = ((signed char)tempCompData[1]);\r
+       beta_otp[2] = ((signed char)tempCompData[2]);\r
+       tempCompData[3] = (tempCompData[3] & 0x70) >> 4;\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("temp_otp %d %d %d \r\n", beta_otp[0], beta_otp[1],beta_otp[2]);\r
+       printf("range 0x%x \r\n", tempCompData[3]);\r
+       #endif\r
+       if(tempCompData[3] != 0)\r
+       {\r
+                       for(i=0; i < 6 - tempCompData[3]; i++)\r
+                       {\r
+                               range = range * 2;\r
+                       }\r
+       }\r
+       for(i=0; i<3; i++)\r
+       {\r
+               k[i] = k[i] * range * 2.048 / 14;\r
+       }\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("k %f %f %f \r\n", k[0], k[1],k[2]);\r
+       #endif\r
+       if(tempCompData[3] != 0)\r
+       {\r
+                       for(i=0; i < tempCompData[3] + 1; i++)\r
+                       {\r
+                               rangek = rangek * 2;\r
+                       }\r
+       }\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("range222 %f \r\n", rangek);\r
+       #endif\r
+       for(i = 0; i < 3; i++)\r
+       {\r
+               s_beta_temp[i] = beta_otp[i] - (int)(k[i] * rangek);\r
+               #ifdef SH5001_OT_DEBUG\r
+               printf("beta_111 %f %d\r\n", k[i] * rangek , (int)(k[i] * rangek));\r
+               #endif\r
+       }\r
+       if(s_beta_temp[0] > 127)\r
+               s_beta_temp[0] = 127;\r
+       else if(s_beta_temp[0] < -128)\r
+               s_beta_temp[0] = -128;\r
+       if(s_beta_temp[1] > 127)\r
+               s_beta_temp[1] = 127;\r
+       else if(s_beta_temp[1] < -128)\r
+               s_beta_temp[1] = -128;\r
+       if(s_beta_temp[2] > 127)\r
+               s_beta_temp[2] = 127;\r
+       else if(s_beta_temp[2] < -128)\r
+               s_beta_temp[2] = -128;\r
+       s_beta_new[0] = (char)s_beta_temp[0];\r
+       s_beta_new[1] = (char)s_beta_temp[1];\r
+       s_beta_new[2] = (char)s_beta_temp[2];\r
+       beta_new[0] = (unsigned char)s_beta_new[0];\r
+       beta_new[1] = (unsigned char)s_beta_new[1];\r
+       beta_new[2] = (unsigned char)s_beta_new[2];\r
+       #ifdef SH5001_OT_DEBUG\r
+       printf("s_beta_new %d %d %d \r\n", s_beta_new[0], s_beta_new[1],s_beta_new[2]);\r
+       printf("beta_new %x %x %x \r\n", beta_new[0], beta_new[1],beta_new[2]);\r
+    #endif\r
+       SH5001_write(SH5001_ADDRESS, 0x71, 1, &beta_new[0]);\r
+       SH5001_write(SH5001_ADDRESS, 0x7c, 1, &beta_new[1]);\r
+       SH5001_write(SH5001_ADDRESS, 0x88, 1, &beta_new[2]);\r
+}\r
+\r
+#define SH5001_QUAD_REG_NUM 10\r
+#define SH5001_QUAD_DEBUG\r
+\r
+void sh5001_gyro_trim_quad(unsigned char quadval[6])\r
+{\r
+  short S_Gyro_Quad[3] = {0};\r
+  short C_Gyro_Quad[3] = {0};\r
+  unsigned char quadData[SH5001_QUAD_REG_NUM] = {0};\r
+  int sumGyroData[3] = {0};\r
+  short avgGyroData[3] = {0};\r
+  short GyroData[3] = {0};\r
+  unsigned char temp[6]= {0};\r
+  unsigned char i;\r
+  double Slope[3] = {560, 560, 560};\r
+\r
+  unsigned char quadRegister[SH5001_QUAD_REG_NUM] = {0x8B, 0x97, 0xA3, 0xD9,  0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC};\r
+  unsigned char RegWrt_1[SH5001_QUAD_REG_NUM] = {0xFF, 0xFF, 0xFF, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+\r
+  for(i=0; i<SH5001_QUAD_REG_NUM; i++)\r
+  {\r
+    SH5001_read(SH5001_ADDRESS, quadRegister[i], 1, &quadData[i]);\r
+    #ifdef SH5001_QUAD_DEBUG\r
+    printf("quadRegister RegWrt_1 raw 0x%x:0x%x\r\n",quadRegister[i], quadData[i]);\r
+    #endif\r
+  }\r
+\r
+  for(i=0; i<4; i++)\r
+  {\r
+    SH5001_write(SH5001_ADDRESS, quadRegister[i], 1, &RegWrt_1[i]);\r
+  }\r
+\r
+  delay_ms(80);\r
+\r
+  for(i=20; i>0; i--)\r
+  {\r
+    delay_ms(1);\r
+\r
+    SH5001_read(SH5001_ADDRESS, 0x06, 6, temp);\r
+    GyroData[0]=((short)(temp[1]<<8))|temp[0];\r
+    GyroData[1]=((short)(temp[3]<<8))|temp[2];\r
+    GyroData[2]=((short)(temp[5]<<8))|temp[4];\r
+\r
+    sumGyroData[0] += GyroData[0];\r
+    sumGyroData[1] += GyroData[1];\r
+    sumGyroData[2] += GyroData[2];\r
+\r
+    #ifdef SH5001_QUAD_DEBUG\r
+    printf("sumGyroData %d %d %d\r\n",GyroData[0], GyroData[1], GyroData[2]);\r
+    #endif\r
+  }\r
+\r
+  for(i = 0; i < 3; i++)\r
+  {\r
+    avgGyroData[i] = sumGyroData[i] / 20;\r
+  }\r
+\r
+  #ifdef SH5001_QUAD_DEBUG\r
+  printf("avgGyroData %d %d %d\r\n",avgGyroData[0], avgGyroData[1], avgGyroData[2]);\r
+  #endif\r
+\r
+  for (i = 0; i < 3; i++)\r
+  {\r
+      S_Gyro_Quad[i] = (quadData[i + 7] & 0x04) >> 2;\r
+      C_Gyro_Quad[i] = quadData[i + 4] + (quadData[i + 7] & 0x03) * 256;\r
+\r
+      #ifdef SH5001_QUAD_DEBUG\r
+      printf("raw S_Gyro_Quad[%d] : %d  C_Gyro_Quad[%d]: %d  \r\n",i, S_Gyro_Quad[i], i, C_Gyro_Quad[i]);\r
+      #endif\r
+\r
+      C_Gyro_Quad[i] = (S_Gyro_Quad[i] == 0) ? C_Gyro_Quad[i]: (C_Gyro_Quad[i] * (-1) - 1);\r
+      C_Gyro_Quad[i] = (int)(C_Gyro_Quad[i] - avgGyroData[i] / Slope[i]);\r
+\r
+      S_Gyro_Quad[i] = C_Gyro_Quad[i] >= 0 ? 0 : 1;\r
+      C_Gyro_Quad[i] = C_Gyro_Quad[i] >= 0 ? C_Gyro_Quad[i]: (C_Gyro_Quad[i] * (-1) - 1);\r
+\r
+      RegWrt_1[i + 4] = C_Gyro_Quad[i] & 0x00FF;\r
+      RegWrt_1[i + 7] = (quadData[i + 7] & 0xF8) + S_Gyro_Quad[i] * 4 + ((C_Gyro_Quad[i] & 0x0300) >> 8);\r
+\r
+  }\r
+  #ifdef SH5001_QUAD_DEBUG\r
+  printf("mod S_Gyro_Quad %d %d %d C_Gyro_Quad %d %d %d RegWrt_1 %d %d %d %d %d %d\r\n",S_Gyro_Quad[0],\r
+  S_Gyro_Quad[1],S_Gyro_Quad[2],C_Gyro_Quad[0],C_Gyro_Quad[1],C_Gyro_Quad[2], RegWrt_1[4], RegWrt_1[5], RegWrt_1[6], RegWrt_1[7], RegWrt_1[8], RegWrt_1[9]);\r
+  #endif\r
+\r
+\r
+  //TODO Save Reg\r
+  for(i=0; i<6; i++) {\r
+    SH5001_write(SH5001_ADDRESS, quadRegister[i + 4], 1, &RegWrt_1[i + 4]);\r
+    quadval[i] = RegWrt_1[i + 4];\r
+  }\r
+\r
+  for(i=0; i<4; i++)\r
+    SH5001_write(SH5001_ADDRESS, quadRegister[i], 1, &quadData[i]);\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description:         SH5001 Acc self-test function\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      SH3001_TRUE or SH3001_FALSE\r
+*\r
+******************************************************************/\r
+\r
+#define  SH5001_ACC_SELFTEST_REGNUM 7\r
+#define  SH5001_ACC_SELFTEST_DEBUG\r
+\r
+unsigned char SH5001_AccSelfTest(void)\r
+{\r
+       unsigned char regAddr[SH5001_ACC_SELFTEST_REGNUM] = {0x21, 0x69, 0x74, 0x80, 0xB9, 0xBA, 0xBB};\r
+       unsigned char regInit[SH5001_ACC_SELFTEST_REGNUM] = {0x30, 0xFF, 0xFF, 0xFF, 0x40, 0x45, 0x45};\r
+       unsigned char regBack[SH5001_ACC_SELFTEST_REGNUM] = {0};\r
+       unsigned char accTemp[6] = {0};\r
+       signed int accSum[3] = {0};\r
+       signed short accAvg1[3] = {0}, accAvg2[3] = {0};\r
+       unsigned char i = 0;\r
+       signed short accRange[3] = {0};\r
+\r
+\r
+       for(i=0; i<SH5001_ACC_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, regAddr[i], 1, &regBack[i]);\r
+       }\r
+\r
+       for(i=0; i<SH5001_ACC_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddr[i], 1, &regInit[i]);\r
+       }\r
+\r
+       delay_ms(100);\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ACC_XL, 6, accTemp);\r
+               accSum[0] += ((short)accTemp[1] << 8) | accTemp[0];\r
+               accSum[1] += ((short)accTemp[3] << 8) | accTemp[2];\r
+               accSum[2] += ((short)accTemp[5] << 8) | accTemp[4];\r
+\r
+               #ifdef SH5001_ACC_SELFTEST_DEBUG\r
+               printf("bf %d %d %d\r\n", ((short)accTemp[1] << 8) | accTemp[0], ((short)accTemp[3] << 8) | accTemp[2], ((short)accTemp[5] << 8) | accTemp[4]);\r
+               #endif\r
+       }\r
+       accAvg1[0] = accSum[0]/20;\r
+       accAvg1[1] = accSum[1]/20;\r
+       accAvg1[2] = accSum[2]/20;\r
+\r
+\r
+       accTemp[0] = 0x60;\r
+       SH5001_write(SH5001_ADDRESS, 0xB9, 1, &accTemp[0]);\r
+       accTemp[0] = 0x65;\r
+       SH5001_write(SH5001_ADDRESS, 0xBA, 1, &accTemp[0]);\r
+       accTemp[0] = 0x65;\r
+       SH5001_write(SH5001_ADDRESS, 0xBB, 1, &accTemp[0]);\r
+\r
+       delay_ms(100);\r
+\r
+       accSum[0] = 0;\r
+       accSum[1] = 0;\r
+       accSum[2] = 0;\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_ACC_XL, 6, accTemp);\r
+               accSum[0] += ((short)accTemp[1] << 8) | accTemp[0];\r
+               accSum[1] += ((short)accTemp[3] << 8) | accTemp[2];\r
+               accSum[2] += ((short)accTemp[5] << 8) | accTemp[4];\r
+               #ifdef SH5001_ACC_SELFTEST_DEBUG\r
+               printf("af %d %d %d\r\n", ((short)accTemp[1] << 8) | accTemp[0], ((short)accTemp[3] << 8) | accTemp[2], ((short)accTemp[5] << 8) | accTemp[4]);\r
+               #endif\r
+       }\r
+       accAvg2[0] = accSum[0]/20;\r
+       accAvg2[1] = accSum[1]/20;\r
+       accAvg2[2] = accSum[2]/20;\r
+\r
+\r
+       for(i=0; i<SH5001_ACC_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddr[i], 1, &regBack[i]);\r
+       }\r
+\r
+       accRange[0] = accAvg2[0] - accAvg1[0];\r
+       accRange[1] = accAvg2[1] - accAvg1[1];\r
+       accRange[2] = accAvg2[2] - accAvg1[2];\r
+\r
+       #ifdef SH5001_ACC_SELFTEST_DEBUG\r
+       printf("accdiff %d %d %d\r\n", accRange[0],accRange[1] ,accRange[2]);\r
+       #endif\r
+\r
+       if(((accRange[0] > 3900) && (accRange[0] < 9200))\r
+       && ((accRange[1] > 4100) && (accRange[1] < 9600))\r
+       && ((accRange[2] > 4500) && (accRange[2] < 10900)))\r
+       {\r
+               return(SH5001_TRUE);\r
+       }\r
+       else\r
+       {\r
+               return(SH5001_FALSE);\r
+       }\r
+}\r
+\r
+\r
+/******************************************************************\r
+* Description:         SH5001 Gyro self-test function\r
+*\r
+* Parameters:  void\r
+*\r
+* return:      SH3001_TRUE or SH3001_FALSE\r
+*\r
+******************************************************************/\r
+\r
+#define SH5001_GYRO_SELFTEST_REGNUM 11\r
+#define  SH5001_GYRO_SELFTEST_DEBUG\r
+\r
+unsigned char SH5001_GyroSelfTest(void)\r
+{\r
+       unsigned char regAddr[SH5001_GYRO_SELFTEST_REGNUM] = {0x24, 0x8B, 0x97, 0xA3, 0xCA, 0xCB, 0xCC, 0xCD,\\r
+                                                               0xCE, 0xCF, 0xD9};\r
+       unsigned char regInit[SH5001_GYRO_SELFTEST_REGNUM] = {0x60, 0xFF, 0xFF, 0xFF, 0x60, 0x60, 0x60, 0x02,\\r
+                                                               0x02, 0x02, 0x91};\r
+       unsigned char regBack[SH5001_GYRO_SELFTEST_REGNUM] = {0};\r
+       unsigned char gyroTemp[6] = {0};\r
+       signed int gyroSum[3] = {0};\r
+       signed short gyroAvg1[3] = {0}, gyroAvg2[3] = {0};\r
+       unsigned char i = 0;\r
+       signed short gyroRange[3] = {0};\r
+\r
+       for(i=0; i<SH5001_GYRO_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, regAddr[i], 1, &regBack[i]);\r
+       }\r
+\r
+       for(i=0; i<SH5001_GYRO_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddr[i], 1, &regInit[i]);\r
+       }\r
+\r
+       //Gyro x\r
+       gyroTemp[0] = 0x15;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_XL, 2, gyroTemp);\r
+               gyroSum[0] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gx bf %d \r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+       }\r
+       gyroAvg1[0] = gyroSum[0]/20;\r
+\r
+       gyroTemp[0] = 0x14;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       gyroSum[0] = 0;\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_XL, 2, gyroTemp);\r
+               gyroSum[0] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gx af %d \r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+       }\r
+       gyroAvg2[0] = gyroSum[0]/20;\r
+\r
+       //gyro y\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x15;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_YL, 2, gyroTemp);\r
+               gyroSum[1] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gy bf %d \r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+       }\r
+       gyroAvg1[1] = gyroSum[1]/20;\r
+\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x14;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       gyroSum[1] = 0;\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_YL, 2, gyroTemp);\r
+               gyroSum[1] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gy af %d \r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+\r
+       }\r
+       gyroAvg2[1] = gyroSum[1]/20;\r
+\r
+       //gyro z\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x15;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_ZL, 2, gyroTemp);\r
+               gyroSum[2] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gz bf %d \r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+       }\r
+       gyroAvg1[2] = gyroSum[2]/20;\r
+\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCD, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x02;\r
+       SH5001_write(SH5001_ADDRESS, 0xCE, 1, &gyroTemp[0]);\r
+       gyroTemp[0] = 0x14;\r
+       SH5001_write(SH5001_ADDRESS, 0xCF, 1, &gyroTemp[0]);\r
+\r
+       delay_ms(50);\r
+\r
+       gyroSum[2] = 0;\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_ZL, 2, gyroTemp);\r
+               gyroSum[2] += ((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+               #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+               printf("Gz af %d\r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]));\r
+               #endif\r
+       }\r
+       gyroAvg2[2] = gyroSum[2]/20;\r
+\r
+       for(i=0; i<SH5001_GYRO_SELFTEST_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddr[i], 1, &regBack[i]);\r
+       }\r
+\r
+       #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+       printf("G b average %d %d %d\r\n", gyroAvg1[0],gyroAvg1[1] ,gyroAvg1[2]);\r
+       printf("G a average %d %d %d\r\n", gyroAvg2[0],gyroAvg2[1] ,gyroAvg2[2]);\r
+       #endif\r
+\r
+       gyroRange[0] = gyroAvg2[0] - gyroAvg1[0];\r
+       gyroRange[1] = gyroAvg2[1] - gyroAvg1[1];\r
+       gyroRange[2] = gyroAvg2[2] - gyroAvg1[2];\r
+\r
+       #ifdef SH5001_GYRO_SELFTEST_DEBUG\r
+       printf("Gyro diff %d %d %d\r\n", gyroRange[0],gyroRange[1] ,gyroRange[2]);\r
+       #endif\r
+\r
+       if(((gyroRange[0] > -4500) && (gyroRange[0] < 7100))\r
+               && ((gyroRange[1] > -6900) && (gyroRange[1] < 8200))\r
+               && ((gyroRange[2] > -9300) && (gyroRange[2] < 4600)))\r
+       {\r
+               return(SH5001_TRUE);\r
+       }\r
+       else\r
+       {\r
+               return(SH5001_FALSE);\r
+       }\r
+}\r
+\r
+void sh5001_adc_phase(void)\r
+{\r
+       unsigned char addr = 0xD0;\r
+       unsigned char regData;\r
+\r
+       SH5001_read(SH5001_ADDRESS, addr, 1, &regData);\r
+       //printf("0xD0 = 0x%x\r\n", regData);\r
+\r
+       if((regData & 0x02) == 0x02)\r
+               regData &= 0xFD;\r
+       else\r
+               regData |= 0x02;\r
+       SH5001_write(SH5001_ADDRESS, addr, 1, &regData);\r
+       //printf("0xD0 = 0x%x\r\n", regData);\r
+\r
+}\r
+\r
+#define SH5001_GYRO_ADC_S1_REGNUM 5\r
+#define SH5001_GYRO_ADC_S2_REGNUM 1\r
+//#define SH5001_GYRO_ADC__DEBUG\r
+int adc_count = 0;\r
+int err_count = 0;\r
+void SH5001_Get_Adc_Polarity(short gyroPolarity[3])\r
+{\r
+       unsigned char regAddrS1[SH5001_GYRO_ADC_S1_REGNUM] = {0xA3, 0xC6, 0xCC, 0xCF, 0xD0};\r
+       unsigned char regInitS1[SH5001_GYRO_ADC_S1_REGNUM] = {0xFF, 0x00, 0x69, 0x1A, 0x0A};\r
+       unsigned char regAddrS2[SH5001_GYRO_ADC_S2_REGNUM] = {0xD0};\r
+       unsigned char regInitS2[SH5001_GYRO_ADC_S2_REGNUM] = {0x08};\r
+       unsigned char regBackS1[SH5001_GYRO_ADC_S1_REGNUM] = {0};\r
+       unsigned char gyroTemp[6] = {0};\r
+       signed int gyroSum[3] = {0};\r
+       signed short gyroAvg1[3] = {0}, gyroAvg2[3] = {0};\r
+       unsigned char i = 0;\r
+       //signed short gyroPolarity[3] = {0};\r
+\r
+       for(i=0; i<SH5001_GYRO_ADC_S1_REGNUM; i++)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, regAddrS1[i], 1, &regBackS1[i]);\r
+       }\r
+\r
+       for(i=0; i<SH5001_GYRO_ADC_S1_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddrS1[i], 1, &regInitS1[i]);\r
+       }\r
+\r
+       delay_ms(50);\r
+\r
+       i = 0;\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_XL, 6, gyroTemp);\r
+               gyroSum[0] += (signed short)((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+               gyroSum[1] += (signed short)((short)gyroTemp[3] << 8) | gyroTemp[2];\r
+               gyroSum[2] += (signed short)((short)gyroTemp[5] << 8) | gyroTemp[4];\r
+               #ifdef SH5001_GYRO_ADC__DEBUG\r
+               printf("bf %d %d %d\r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]), (signed short)(((short)gyroTemp[3] << 8) | gyroTemp[2]), (signed short)(((short)gyroTemp[5] << 8) | gyroTemp[4]));\r
+               #endif\r
+       }\r
+       gyroAvg1[0] = gyroSum[0]/20;\r
+       gyroAvg1[1] = gyroSum[1]/20;\r
+       gyroAvg1[2] = gyroSum[2]/20;\r
+\r
+       for(i=0; i<SH5001_GYRO_ADC_S2_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddrS2[i], 1, &regInitS2[i]);\r
+       }\r
+\r
+       delay_ms(50);\r
+\r
+       gyroSum[0] = 0;\r
+       gyroSum[1] = 0;\r
+       gyroSum[2] = 0;\r
+       i = 0;\r
+\r
+       while(i++ < 20)\r
+       {\r
+               SH5001_read(SH5001_ADDRESS, SH5001_GYRO_XL, 6, gyroTemp);\r
+               gyroSum[0] += (signed short)((short)gyroTemp[1] << 8) | gyroTemp[0];\r
+               gyroSum[1] += (signed short)((short)gyroTemp[3] << 8) | gyroTemp[2];\r
+               gyroSum[2] += (signed short)((short)gyroTemp[5] << 8) | gyroTemp[4];\r
+\r
+               #ifdef SH5001_GYRO_ADC__DEBUG\r
+               printf("af %d %d %d\r\n", (signed short)(((short)gyroTemp[1] << 8) | gyroTemp[0]), (signed short)(((short)gyroTemp[3] << 8) | gyroTemp[2]), (signed short)(((short)gyroTemp[5] << 8) | gyroTemp[4]));\r
+               #endif\r
+       }\r
+\r
+       gyroAvg2[0] = gyroSum[0]/20;\r
+       gyroAvg2[1] = gyroSum[1]/20;\r
+       gyroAvg2[2] = gyroSum[2]/20;\r
+\r
+       for(i=0; i<SH5001_GYRO_ADC_S1_REGNUM; i++)\r
+       {\r
+               SH5001_write(SH5001_ADDRESS, regAddrS1[i], 1, &regBackS1[i]);\r
+       }\r
+\r
+       gyroPolarity[0] = gyroAvg2[0] - gyroAvg1[0];\r
+       gyroPolarity[1] = gyroAvg2[1] - gyroAvg1[1];\r
+       gyroPolarity[2] = gyroAvg2[2] - gyroAvg1[2];\r
+       adc_count++;\r
+       #ifdef SH5001_GYRO_ADC__DEBUG\r
+       printf("gyroPolarity %d %d %d %d %d\r\n", adc_count, err_count, gyroPolarity[0],gyroPolarity[1] ,gyroPolarity[2]);\r
+       #endif\r
+\r
+       if(gyroPolarity[2] < 0)\r
+       {\r
+               err_count++;\r
+       }\r
+\r
+}\r
+\r
+int sh5001_get_version(void)\r
+{\r
+       return MCU_VERSION_SH5001;\r
+}
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/gyro/sh5001/sh5001.h b/code/sdk/zhihui/drivers/gyro/sh5001/sh5001.h
new file mode 100644 (file)
index 0000000..58ee98b
--- /dev/null
@@ -0,0 +1,695 @@
+#ifndef __SH5001_H \r
+#define __SH5001_H\r
+\r
+//#define SH5001_FIFO_WM_INT\r
+//#define SH5001_ACTIVITY_INT\r
+//#define SH5001_DATA_READY_INT\r
+\r
+/******************************************************************\r
+*      SH5001 I2C address Macro Definition \r
+*\r
+*   (7bit):    (0x37)011 0111@SDO=1;    (0x36)011 0110@SDO=0;\r
+******************************************************************/\r
+#define SH5001_ADDRESS                         (0x36U)         \r
+#define SENODIA_VDD_3V3 1\r
+\r
+/******************************************************************\r
+*      SH5001 Registers Macro Definitions \r
+******************************************************************/\r
+#define SH5001_ACC_XL                          (0x00U)\r
+#define SH5001_ACC_XH                          (0x01U)\r
+#define SH5001_ACC_YL                          (0x02U)\r
+#define SH5001_ACC_YH                          (0x03U)\r
+#define SH5001_ACC_ZL                          (0x04U)\r
+#define SH5001_ACC_ZH                          (0x05U)\r
+#define SH5001_GYRO_XL                         (0x06U)\r
+#define SH5001_GYRO_XH                         (0x07U)\r
+#define SH5001_GYRO_YL                         (0x08U)\r
+#define SH5001_GYRO_YH                         (0x09U)\r
+#define SH5001_GYRO_ZL                         (0x0AU)\r
+#define SH5001_GYRO_ZH                         (0x0BU)\r
+#define SH5001_TEMP_ZL                         (0x0CU)\r
+#define SH5001_TEMP_ZH                         (0x0DU)\r
+#define SH5001_TIMESTAMP_L                     (0x0EU)\r
+#define SH5001_TIMESTAMP_M                     (0x0FU)\r
+#define SH5001_TIMESTAMP_H                     (0x10U)\r
+#define SH5001_INT_STA0                                (0x16U)\r
+#define SH5001_INT_STA1                                (0x17U)\r
+#define SH5001_INT_STA2                                (0x18U)\r
+#define SH5001_INT_STA3                                (0x19U)\r
+#define SH5001_INT_STA4                                (0x1AU)\r
+#define SH5001_FIFO_STA0                       (0x1BU)\r
+#define SH5001_FIFO_STA1                       (0x1CU)\r
+#define SH5001_FIFO_DATA                       (0x1DU)\r
+\r
+#define SH5001_CHIP_ID                         (0x1FU)\r
+\r
+#define SH5001_ACC_CONF0                       (0x20U)\r
+#define SH5001_ACC_CONF1                       (0x21U)\r
+#define SH5001_ACC_CONF2                       (0x22U)\r
+\r
+#define SH5001_GYRO_CONF0                      (0x23U)\r
+#define SH5001_GYRO_CONF1                      (0x24U)\r
+#define SH5001_GYRO_CONF2                      (0x25U)\r
+\r
+#define SH5001_OIS_ACC_CONF                    (0x26U)\r
+#define SH5001_OIS_GYRO_CONF           (0x27U)\r
+\r
+#define SH5001_TEMP_CONF0                      (0x28U)\r
+#define SH5001_ACC_DOWNSAMPLE          (0x28U)\r
+#define SH5001_TEMP_CONF1                      (0x29U)\r
+#define SH5001_TEMP_CONF2                      (0x2AU)\r
+#define SH5001_TIMESTAMP_CONF          (0x2AU)\r
+\r
+#define SH5001_POWER_MODE                      (0x30U)\r
+#define SH5001_POWER_MODE_PWM          (0x31U)\r
+\r
+#define SH5001_I2C_CONF                                (0x34U)\r
+#define SH5001_SPI_CONF                                (0x34U)\r
+#define SH5001_I2C_READ_LOOP           (0x34U)\r
+#define SH5001_OIS_SPI_CONF                    (0x34U)\r
+\r
+\r
+#define SH5001_FIFO_CONF0                      (0x35U)\r
+#define SH5001_FIFO_CONF1                      (0x36U)\r
+#define SH5001_FIFO_CONF2                      (0x37U)\r
+#define SH5001_FIFO_CONF3                      (0x38U)\r
+#define SH5001_FIFO_CONF4                      (0x39U)\r
+\r
+#define SH5001_MI2C_CONF0                      (0x3AU)\r
+#define SH5001_MI2C_CONF1                      (0x3BU)\r
+#define SH5001_MI2C_CMD0                       (0x3CU)\r
+#define SH5001_MI2C_CMD1                       (0x3DU)\r
+#define SH5001_MI2C_WR                         (0x3EU)\r
+#define SH5001_MI2C_RD                         (0x3FU)\r
+\r
+#define SH5001_INT_ENABLE0                     (0x40U)\r
+#define SH5001_INT_ENABLE1                     (0x41U)\r
+#define SH5001_INT_CONF                                (0x42U)\r
+#define SH5001_INT_LIMIT                       (0x43U)\r
+#define SH5001_ORIEN_INTCONF0          (0x44U)\r
+#define SH5001_ORIEN_INTCONF1          (0x45U)\r
+#define SH5001_ORIEN_INT_1G5_LOW       (0x46U)\r
+#define SH5001_ORIEN_INT_1G5_HIGH      (0x47U)\r
+#define SH5001_ORIEN_INT_SLOPE_LOW     (0x48U)\r
+#define SH5001_ORIEN_INT_SLOPE_HIGH    (0x49U)\r
+#define SH5001_ORIEN_INT_HYST_LOW      (0x4AU)\r
+#define SH5001_ORIEN_INT_HYST_HIGH     (0x4BU)\r
+\r
+#define SH5001_FLAT_INT_CONF           (0x4CU)\r
+\r
+#define SH5001_ACT_INACT_INT_CONF      (0x4DU)\r
+#define SH5001_ACT_INACT_INT_LINK      (0x4EU)\r
+#define SH5001_ACT_INT_THRESHOLDL      (0x54U)\r
+#define SH5001_ACT_INT_THRESHOLDH      (0x55U)\r
+#define SH5001_ACT_INT_TIME                    (0x56U)\r
+\r
+#define SH5001_INACT_INT_THRESHOLDL    (0x57U)\r
+#define SH5001_INACT_INT_THRESHOLDH    (0x58U)\r
+#define SH5001_INACT_INT_TIME          (0x59U)\r
+\r
+#define SH5001_SMD_INT_THRESHOLDL      (0x5AU)\r
+#define SH5001_SMD_INT_THRESHOLDH      (0x5BU)\r
+#define SH5001_SMD_INT_TIME                    (0x5CU)\r
+\r
+#define SH5001_TAP_INT_CONF                    (0x4EU)\r
+#define SH5001_TAP_INT_THRESHOLDL      (0x4FU)\r
+#define SH5001_TAP_INT_THRESHOLDH      (0x50U)\r
+#define SH5001_TAP_INT_DURATION                (0x51U)\r
+#define SH5001_TAP_INT_LATENCY         (0x52U)\r
+#define SH5001_DTAP_INT_WINDOW         (0x53U)\r
+\r
+#define SH5001_HIGHG_INT_CONF          (0x5DU)\r
+#define SH5001_HIGHG_INT_THRESHOLDL    (0x5EU)\r
+#define SH5001_HIGHG_INT_THRESHOLDH    (0x5FU)\r
+#define SH5001_HIGHG_INT_TIME          (0x60U)\r
+\r
+#define SH5001_LOWG_INT_CONF           (0x5DU)\r
+#define SH5001_LOWG_INT_THRESHOLDL     (0x61U)\r
+#define SH5001_LOWG_INT_THRESHOLDH     (0x62U)\r
+#define SH5001_LOWG_INT_TIME           (0x63U)\r
+\r
+#define SH5001_FREEFALL_INT_THRES      (0x64U)\r
+#define SH5001_FREEFALL_INT_TIME       (0x65U)\r
+\r
+#define SH5001_INT_PIN_MAP0                    (0x66U)\r
+#define SH5001_INT_PIN_MAP1                    (0x67U)\r
+\r
+#define SH5001_SPI_REG_ACCESS          (0x7FU)\r
+#define SH5001_AUX_I2C_CONF                    (0xFDU)\r
+\r
+#define SH5001_PIN_PP_CONF0                    (0xFDU)\r
+#define SH5001_PIN_PP_CONF1                    (0xFEU)\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+/******************************************************************\r
+*      ACC Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_ACC_ODR_1000HZ  (0x00U)  //TODO need to set ref datasheet\r
+#define SH5001_ACC_ODR_500HZ   (0x01U)\r
+#define SH5001_ACC_ODR_250HZ   (0x02U)\r
+#define SH5001_ACC_ODR_125HZ   (0x03U)\r
+\r
+#define SH5001_ACC_ODR_2000HZ  (0x08U)\r
+#define SH5001_ACC_ODR_4000HZ  (0x09U)\r
+#define SH5001_ACC_ODR_8000HZ  (0x0AU)\r
+\r
+#define SH5001_ACC_RANGE_4G            (0x10U)\r
+#define SH5001_ACC_RANGE_8G            (0x20U)\r
+#define SH5001_ACC_RANGE_16G   (0x30U)\r
+//#define SH5001_ACC_RANGE_32G (0x40U)\r
+\r
+#define SH5001_ACC_ODRX040             (0x00U)\r
+#define SH5001_ACC_ODRX036             (0x01U)\r
+#define SH5001_ACC_ODRX032             (0x02U)\r
+#define SH5001_ACC_ODRX028             (0x03U)\r
+#define SH5001_ACC_ODRX024             (0x04U)\r
+#define SH5001_ACC_ODRX020             (0x05U)\r
+#define SH5001_ACC_ODRX016             (0x06U)\r
+#define SH5001_ACC_ODRX014             (0x07U)\r
+#define SH5001_ACC_ODRX012             (0x08U)\r
+#define SH5001_ACC_ODRX010             (0x09U)\r
+#define SH5001_ACC_ODRX008             (0x0aU)\r
+#define SH5001_ACC_ODRX006             (0x0bU)\r
+#define SH5001_ACC_ODRX004             (0x0cU)\r
+#define SH5001_ACC_ODRX003             (0x0dU)\r
+#define SH5001_ACC_ODRX002             (0x0eU)\r
+#define SH5001_ACC_ODRX001             (0x0fU)\r
+\r
+#define SH5001_ACC_FILTER_EN   (0x01U)\r
+#define SH5001_ACC_FILTER_DIS  (0x00U)\r
+#define SH5001_ACC_BYPASS_EN   (0x02U)\r
+#define SH5001_ACC_BYPASS_DIS  (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      GYRO Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_GYRO_ODR_1000HZ (0x00U)\r
+#define SH5001_GYRO_ODR_500HZ  (0x01U)\r
+#define SH5001_GYRO_ODR_250HZ  (0x02U)\r
+#define SH5001_GYRO_ODR_125HZ  (0x03U)\r
+#define SH5001_GYRO_ODR_2000HZ (0x08U)\r
+#define SH5001_GYRO_ODR_4000HZ (0x09U)\r
+#define SH5001_GYRO_ODR_8000HZ (0x0AU)\r
+#define SH5001_GYRO_ODR_16000HZ        (0x0BU)\r
+\r
+\r
+\r
+#define SH5001_GYRO_RANGE_31   (0x00U)\r
+#define SH5001_GYRO_RANGE_62   (0x10U)\r
+#define SH5001_GYRO_RANGE_125  (0x20U)\r
+#define SH5001_GYRO_RANGE_250  (0x30U)\r
+#define SH5001_GYRO_RANGE_500  (0x40U)\r
+#define SH5001_GYRO_RANGE_1000 (0x50U)\r
+#define SH5001_GYRO_RANGE_2000 (0x60U)\r
+#define SH5001_GYRO_RANGE_4000 (0x70U)\r
+\r
+#define SH5001_GYRO_ODRX040            (0x00U)\r
+#define SH5001_GYRO_ODRX036            (0x01U)\r
+#define SH5001_GYRO_ODRX032            (0x02U)\r
+#define SH5001_GYRO_ODRX028            (0x03U)\r
+#define SH5001_GYRO_ODRX024            (0x04U)\r
+#define SH5001_GYRO_ODRX020            (0x05U)\r
+#define SH5001_GYRO_ODRX016            (0x06U)\r
+#define SH5001_GYRO_ODRX014            (0x07U)\r
+#define SH5001_GYRO_ODRX012            (0x08U)\r
+#define SH5001_GYRO_ODRX010            (0x09U)\r
+#define SH5001_GYRO_ODRX008            (0x0aU)\r
+#define SH5001_GYRO_ODRX006            (0x0bU)\r
+#define SH5001_GYRO_ODRX004            (0x0cU)\r
+#define SH5001_GYRO_ODRX003            (0x0dU)\r
+#define SH5001_GYRO_ODRX002            (0x0eU)\r
+#define SH5001_GYRO_ODRX001            (0x0fU)\r
+\r
+#define SH5001_GYRO_FILTER_EN  (0x01U)\r
+#define SH5001_GYRO_FILTER_DIS (0x00U)\r
+#define SH5001_GYRO_BYPASS_EN  (0x02U)\r
+#define SH5001_GYRO_BYPASS_DIS (0x00U)\r
+\r
+#define SH5001_GYRO_OFF_INACT   (0x80U)\r
+#define SH5001_GYRO_ON_INACT    (0x00U)\r
+\r
+/******************************************************************\r
+*      Time Stamp Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_TS_ODR_25KHZ            (0x20U)\r
+#define SH5001_TS_ODR_1KHZ             (0x00U)\r
+#define SH5001_TS_EN                   (0x40U)\r
+#define SH5001_TS_DIS                  (0x00U)\r
+\r
+/******************************************************************\r
+*      Temperature Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_TEMP_ODR_500HZ  (0x00U)\r
+#define SH5001_TEMP_ODR_250HZ  (0x02U)\r
+#define SH5001_TEMP_ODR_125HZ  (0x04U)\r
+#define SH5001_TEMP_ODR_63HZ   (0x06U)\r
+\r
+#define SH5001_TEMP_EN                 (0x01U)\r
+#define SH5001_TEMP_DIS                        (0x00U)\r
+\r
+/******************************************************************\r
+*      INT Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_INT_LOWG                                (0x8000U)\r
+#define SH5001_INT_HIGHG                       (0x4000U)\r
+#define SH5001_INT_INACT                       (0x2000U)\r
+#define SH5001_INT_ACT                         (0x1000U)\r
+#define SH5001_INT_DOUBLE_TAP          (0x0800U)\r
+#define SH5001_INT_SINGLE_TAP          (0x0400U)\r
+#define SH5001_INT_FLAT                                (0x0200U)\r
+#define SH5001_INT_ORIENTATION         (0x0100U)\r
+#define SH5001_INT_TAP                         (0x0020U)\r
+#define SH5001_INT_SMD                         (0x0010U)\r
+#define SH5001_INT_FIFO_WATERMARK      (0x0008U)\r
+#define SH5001_INT_GYRO_READY          (0x0004U)\r
+#define SH5001_INT_ACC_READY           (0x0002U)\r
+#define SH5001_INT_FREE_FALL           (0x0001U)\r
+#define SH5001_INT_UP_DOWN_Z           (0x0040U)\r
+\r
+#define SH5001_INT_EN                          (0x01U)\r
+#define SH5001_INT_DIS                         (0x00U)\r
+\r
+#define SH5001_INT_MAP_INT1                    (0x01U)\r
+#define SH5001_INT_MAP_INT0                    (0x00U)\r
+\r
+#define SH5001_INT0_LEVEL_LOW          (0x80U)\r
+#define SH5001_INT0_LEVEL_HIGH         (0x7FU)\r
+#define SH5001_INT_NO_LATCH                    (0x40U)\r
+#define SH5001_INT_LATCH                       (0xBFU)\r
+#define SH5001_INT_CLEAR_ANY           (0x10U)\r
+#define SH5001_INT_CLEAR_STATUS            (0xEFU)\r
+#define SH5001_INT1_OD                         (0x08U)\r
+#define SH5001_INT1_NORMAL                     (0xF7U)\r
+#define SH5001_INT1_OUTPUT                     (0x04U)\r
+#define SH5001_INT1_INPUT                      (0xFBU)\r
+#define SH5001_INT0_OD                         (0x02U)\r
+#define SH5001_INT0_NORMAL                     (0xFDU)\r
+#define SH5001_INT0_OUTPUT                     (0x01U)\r
+#define SH5001_INT0_INPUT                      (0xFEU)\r
+\r
+\r
+/******************************************************************\r
+*      Orientation Blocking Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_ORIENT_BLOCK_MODE0      (0x00U)\r
+#define SH5001_ORIENT_BLOCK_MODE1      (0x04U)\r
+#define SH5001_ORIENT_BLOCK_MODE2      (0x08U)\r
+#define SH5001_ORIENT_BLOCK_MODE3      (0x0CU)\r
+\r
+#define SH5001_ORIENT_SYMM                     (0x00U)\r
+#define SH5001_ORIENT_HIGH_ASYMM       (0x01U)\r
+#define SH5001_ORIENT_LOW_ASYMM                (0x02U)\r
+\r
+\r
+/******************************************************************\r
+*      Flat Time Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_FLAT_TIME_200MS         (0x00U)\r
+#define SH5001_FLAT_TIME_400MS         (0x40U)\r
+#define SH5001_FLAT_TIME_800MS         (0x80U)\r
+#define SH5001_FLAT_TIME_000MS         (0xC0U)\r
+\r
+/******************************************************************\r
+*      ACT and INACT Int Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_ACT_X_INT_EN            (0x40U)\r
+#define SH5001_ACT_X_INT_DIS   (0x00U)\r
+#define SH5001_ACT_Y_INT_EN            (0x20U)\r
+#define SH5001_ACT_Y_INT_DIS   (0x00U)\r
+#define SH5001_ACT_Z_INT_EN            (0x10U)\r
+#define SH5001_ACT_Z_INT_DIS   (0x00U)\r
+\r
+#define SH5001_INACT_X_INT_EN  (0x04U)\r
+#define SH5001_INACT_X_INT_DIS (0x00U)\r
+#define SH5001_INACT_Y_INT_EN  (0x02U)\r
+#define SH5001_INACT_Y_INT_DIS (0x00U)\r
+#define SH5001_INACT_Z_INT_EN  (0x01U)\r
+#define SH5001_INACT_Z_INT_DIS (0x00U)\r
+\r
+\r
+#define SH5001_LINK_PRE_STA            (0x01U)\r
+#define SH5001_LINK_PRE_STA_NO (0x00U)\r
+\r
+#define SH5001_ACT_INACT_CLR_STATUS1   (0x00U)\r
+#define SH5001_ACT_INACT_CLR_STATUS3   (0x80U)\r
+\r
+/******************************************************************\r
+*      TAP Int Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_TAP_X_INT_EN            (0x08U)\r
+#define SH5001_TAP_X_INT_DIS   (0x00U)\r
+#define SH5001_TAP_Y_INT_EN            (0x04U)\r
+#define SH5001_TAP_Y_INT_DIS   (0x00U)\r
+#define SH5001_TAP_Z_INT_EN            (0x02U)\r
+#define SH5001_TAP_Z_INT_DIS   (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      HIGHG Int Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_HIGHG_ALL_INT_EN                (0x80U)\r
+#define SH5001_HIGHG_ALL_INT_DIS       (0x00U)\r
+#define SH5001_HIGHG_X_INT_EN          (0x40U)\r
+#define SH5001_HIGHG_X_INT_DIS         (0x00U)\r
+#define SH5001_HIGHG_Y_INT_EN          (0x20U)\r
+#define SH5001_HIGHG_Y_INT_DIS         (0x00U)\r
+#define SH5001_HIGHG_Z_INT_EN          (0x10U)\r
+#define SH5001_HIGHG_Z_INT_DIS         (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      LOWG Int Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_LOWG_ALL_INT_EN         (0x01U)\r
+#define SH5001_LOWG_ALL_INT_DIS                (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      SPI Interface Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_SPI_3_WIRE      (0x20U)\r
+#define SH5001_SPI_4_WIRE      (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      I2C Interface Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_I2C_DIS                         (0x80U)\r
+#define SH5001_I2C_EN                          (0x00U)\r
+\r
+//Jin\r
+#define SH5001_I2C_LP_06BYTE           (0x04U)\r
+#define SH5001_I2C_LP_12BYTE           (0x02U)\r
+#define SH5001_I2C_LP_14BYTE           (0x01U)\r
+#define SH5001_I2C_LP_DISABLE          (0x00U)\r
+\r
+/******************************************************************\r
+*      OIS SPI Interface Config Macro Definitions \r
+******************************************************************/\r
+//#define SH5001_OIS_SPI_3WIRE         (0x00U)\r
+//#define SH5001_OIS_SPI_4WIRE         (0x40U)\r
+#define SH5001_OIS_SPI_EN                      (0x10U)\r
+#define SH5001_OIS_SPI_DIS                     (0x00U)\r
+\r
+#define SH5001_ACC_OIS_ENABLE          (0x80U)\r
+#define SH5001_ACC_OIS_DISABLE (0x00U)\r
+\r
+#define SH5001_ACC_OIS_RANGE_4G                (0x10U)\r
+#define SH5001_ACC_OIS_RANGE_8G                (0x20U)\r
+#define SH5001_ACC_OIS_RANGE_16G       (0x30U)\r
+\r
+#define SH5001_ACC_OIS_ODRX008         (0x0CU)\r
+#define SH5001_ACC_OIS_ODRX004         (0x08U)\r
+#define SH5001_ACC_OIS_ODRX002         (0x04U)\r
+#define SH5001_ACC_OIS_ODRX000         (0x00U)  //bypass\r
+\r
+\r
+#define SH5001_ACC_OIS_ODR_1000HZ      (0x00U)  //TODO need to set ref datasheet\r
+#define SH5001_ACC_OIS_ODR_2000HZ      (0x01U)\r
+#define SH5001_ACC_OIS_ODR_4000HZ      (0x02U)\r
+#define SH5001_ACC_OIS_ODR_8000HZ      (0x03U)\r
+\r
+\r
+\r
+\r
+#define SH5001_GYRO_OIS_ENABLE         (0x80U)\r
+#define SH5001_GYRO_OIS_DISABLE                (0x00U)\r
+\r
+#define SH5001_GYRO_OIS_RANGE_31       (0x00U)\r
+#define SH5001_GYRO_OIS_RANGE_62       (0x10U)\r
+#define SH5001_GYRO_OIS_RANGE_125      (0x20U)\r
+#define SH5001_GYRO_OIS_RANGE_250      (0x30U)\r
+#define SH5001_GYRO_OIS_RANGE_500      (0x40U)\r
+#define SH5001_GYRO_OIS_RANGE_1000     (0x50U)\r
+#define SH5001_GYRO_OIS_RANGE_2000     (0x60U)\r
+#define SH5001_GYRO_OIS_RANGE_4000     (0x70U)\r
+\r
+#define SH5001_GYRO_OIS_ODRX008                (0x0CU)\r
+#define SH5001_GYRO_OIS_ODRX004                (0x08U)\r
+#define SH5001_GYRO_OIS_ODRX002                (0x04U)\r
+#define SH5001_GYRO_OIS_ODRX000                (0x00U)  //bypass\r
+\r
+#define SH5001_GYRO_OIS_ODR_1000HZ     (0x00U)\r
+#define SH5001_GYRO_OIS_ODR_2000HZ     (0x01U)\r
+#define SH5001_GYRO_OIS_ODR_4000HZ     (0x02U)\r
+#define SH5001_GYRO_OIS_ODR_8000HZ     (0x03U)\r
+\r
+\r
+\r
+\r
+/******************************************************************\r
+*      FIFO Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_FIFO_MODE_DIS           (0x00U)\r
+#define SH5001_FIFO_MODE_FIFO          (0x01U)\r
+#define SH5001_FIFO_MODE_STREAM                (0x02U)\r
+#define SH5001_FIFO_MODE_TRIGGER       (0x03U)\r
+\r
+#define SH5001_FIFO_ACC_DOWNS_EN       (0x80U)\r
+#define SH5001_FIFO_ACC_DOWNS_DIS      (0x00U)\r
+#define SH5001_FIFO_GYRO_DOWNS_EN      (0x08U)\r
+#define SH5001_FIFO_GYRO_DOWNS_DIS     (0x00U)\r
+\r
+#define SH5001_FIFO_FREQ_X1_2          (0x00U)\r
+#define SH5001_FIFO_FREQ_X1_4          (0x01U)\r
+#define SH5001_FIFO_FREQ_X1_8          (0x02U)\r
+#define SH5001_FIFO_FREQ_X1_16         (0x03U)\r
+#define SH5001_FIFO_FREQ_X1_32         (0x04U)\r
+#define SH5001_FIFO_FREQ_X1_64         (0x05U)\r
+#define SH5001_FIFO_FREQ_X1_128                (0x06U)\r
+#define SH5001_FIFO_FREQ_X1_256                (0x07U)\r
+\r
+#define SH5001_FIFO_TIMESTAMP_EN       (0x4000U)\r
+#define SH5001_FIFO_EXT_Z_EN           (0x2000U)\r
+#define SH5001_FIFO_EXT_Y_EN           (0x1000U)\r
+#define SH5001_FIFO_EXT_X_EN           (0x0080U)\r
+#define SH5001_FIFO_TEMPERATURE_EN     (0x0040U)\r
+#define SH5001_FIFO_GYRO_Z_EN          (0x0020U)\r
+#define SH5001_FIFO_GYRO_Y_EN          (0x0010U)\r
+#define SH5001_FIFO_GYRO_X_EN          (0x0008U)\r
+#define SH5001_FIFO_ACC_Z_EN           (0x0004U)\r
+#define SH5001_FIFO_ACC_Y_EN           (0x0002U)\r
+#define SH5001_FIFO_ACC_X_EN           (0x0001U)\r
+#define SH5001_FIFO_ALL_DIS                    (0x0000U)\r
+\r
+/******************************************************************\r
+*      AUX I2C Config Macro Definitions \r
+******************************************************************/\r
+#define SH5001_MI2C_NORMAL_MODE                        (0x00U)\r
+#define SH5001_MI2C_BYPASS_MODE                        (0x01U)\r
+\r
+#define SH5001_MI2C_READ_ODR_200HZ         (0x00U)\r
+#define SH5001_MI2C_READ_ODR_100HZ         (0x10U)\r
+#define SH5001_MI2C_READ_ODR_50HZ              (0x20U)\r
+#define SH5001_MI2C_READ_ODR_25HZ              (0x30U)\r
+\r
+#define SH5001_MI2C_FAIL                               (0x20U)\r
+#define SH5001_MI2C_SUCCESS                            (0x10U)\r
+\r
+#define SH5001_MI2C_READ_MODE_AUTO             (0x40U)\r
+#define SH5001_MI2C_READ_MODE_MANUAL   (0x00U)\r
+\r
+\r
+/******************************************************************\r
+*      Fast offset compensation Macro Definitions \r
+******************************************************************/\r
+#define SH5001_X_UP     (0x00U)\r
+#define SH5001_X_DOWN   (0x01U)\r
+#define SH5001_Y_UP     (0x02U)\r
+#define SH5001_Y_DOWN   (0x03U)\r
+#define SH5001_Z_UP     (0x04U)\r
+#define SH5001_Z_DOWN   (0x05U)\r
+\r
+\r
+/******************************************************************\r
+*      Other Macro Definitions \r
+******************************************************************/\r
+#define SH5001_TRUE            (0U)\r
+#define SH5001_FALSE   (1U)\r
+\r
+#define SH5001_CALI_REG_NUM 8\r
+#define SH5001_POWMODE_REG_NUM 11\r
+#define SH5001_NORMAL_MODE             (0x00)\r
+#define SH5001_ACC_HP_MODE             (0x01)\r
+#define SH5001_ACC_LP_MODE             (0x02)\r
+#define SH5001_POWERDOWN_MODE  (0x03)\r
+\r
+// FIFO Mode DIV = FIFO channel * 2;\r
+#define SH5001_WATERMARK_DIV    (12U)                  \r
+//#define SH5001_FIFO_BUFFER      (1024U)\r
+#define SH5001_FIFO_BUFFER      (500U)\r
+\r
+\r
+/***************************************************************************\r
+*       Type Definitions                                              \r
+****************************************************************************/\r
+typedef unsigned char (*IMU_read)(     unsigned char devAddr, \r
+                                    unsigned char regAddr, \r
+                                    unsigned short readLen, \r
+                                    unsigned char *readBuf);\r
+\r
+typedef unsigned char (*IMU_write)(    unsigned char devAddr, \r
+                                    unsigned char regAddr, \r
+                                    unsigned short writeLen, \r
+                                    unsigned char *writeBuf);\r
+\r
+\r
+\r
+\r
+/***************************************************************************\r
+        Exported Functions                                           \r
+****************************************************************************/                                                                                                                                                                                                                                                  \r
+                                                                                                                                                                       \r
+extern unsigned char SH5001_init(void);\r
+extern void SH5001_GetImuData( short accData[3], short gyroData[3] );\r
+extern float SH5001_GetTempData(void);                                                                                                                                 \r
+extern unsigned char SH5001_SwitchPowerMode(unsigned char powerMode);          \r
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               \r
+                                                                                                                                               \r
+\r
+// interrupt related fucntions\r
+extern void SH5001_INT_Enable( unsigned short intType, \r
+                                                               unsigned char intEnable, \r
+                                                               unsigned char intPinSel);\r
+\r
+extern void SH5001_INT_Config( unsigned char intLevel,\r
+                        unsigned char intLatch,\r
+                        unsigned char intClear,\r
+                        unsigned char intTime,\r
+                        unsigned char int1Mode,\r
+                        unsigned char int0Mode,\r
+                        unsigned char int1OE,\r
+                        unsigned char int0OE);\r
+\r
+extern void SH5001_INT_Output_Config(  unsigned char int1Mode,\r
+                                                                               unsigned char int0Mode,\r
+                                                                               unsigned char int1OE,\r
+                                                                               unsigned char int0OE);                                                          \r
+                                                               \r
+extern void SH5001_INT_Orient_Config(  unsigned char   orientBlockMode,\r
+                                                                               unsigned char   orientMode,\r
+                                                                               unsigned char   orientTheta,\r
+                                                                               unsigned short  orientG1point5,\r
+                                                                               unsigned short  orientSlope,\r
+                                                                               unsigned short  orientHyst);                                                            \r
+                                                               \r
+extern void SH5001_INT_Flat_Config(    unsigned char flatTimeTH, \r
+                                                                       unsigned char flatTanHeta2);                                                            \r
+                                                               \r
+extern void SH5001_INT_Act_Config(     unsigned char actEnDisIntX,\r
+                                       unsigned char actEnDisIntY,\r
+                                       unsigned char actEnDisIntZ,\r
+                                       unsigned char actTimeNum,\r
+                                       unsigned short actIntThres,\r
+                                       unsigned char actLinkStatus,\r
+                                       unsigned char actIntClear);                                                             \r
+\r
+extern void SH5001_INT_Inact_Config(   unsigned char inactEnDisIntX,\r
+                                               unsigned char inactEnDisIntY,\r
+                                               unsigned char inactEnDisIntZ,\r
+                                               unsigned char inactLinkStatus,\r
+                                               unsigned char inactTimeMs,\r
+                                               unsigned short inactIntThres,\r
+                                               unsigned short inactG1,\r
+                                               unsigned char inactIntClear);\r
+\r
+extern void SH5001_INT_Tap_Config(     unsigned char tapEnDisIntX,\r
+                                                                       unsigned char tapEnDisIntY,\r
+                                                                       unsigned char tapEnDisIntZ,\r
+                                                                       unsigned char tapIntThres,\r
+                                                                       unsigned char tapTimeMs,\r
+                                                                       unsigned char tapWaitTimeMs,\r
+                                                                       unsigned char tapWaitTimeWindowMs);\r
+\r
+extern void SH5001_INT_SMD_Config(     unsigned short smdThres,\r
+                                       unsigned char smdBlockTimeS,\r
+                                                                       unsigned char smdProofTimeS);                                                                   \r
+\r
+extern void SH5001_INT_HighG_Config(   unsigned char highGEnDisIntX,\r
+                                                                               unsigned char highGEnDisIntY,\r
+                                                                               unsigned char highGEnDisIntZ,\r
+                                                                               unsigned char highGEnDisIntAll,\r
+                                                                               unsigned short highGThres,\r
+                                                                               unsigned char highGTimeMs);\r
+\r
+extern void SH5001_INT_LowG_Config(    unsigned char lowGEnDisIntAll,\r
+                                                                       unsigned short lowGThres,\r
+                                                                       unsigned char lowGTimeMs);\r
+\r
+extern void SH5001_INT_FreeFall_Config(        unsigned char freeFallThres,\r
+                                                                               unsigned char freeFallTimeMs);\r
+\r
+extern unsigned short SH5001_INT_Read_Status01(void);\r
+\r
+extern unsigned char SH5001_INT_Read_Status2(void);\r
+\r
+extern unsigned char SH5001_INT_Read_Status3(void);\r
+\r
+extern unsigned char SH5001_INT_Read_Status4(void);\r
+                                                               \r
+                       \r
+// Fifo related fucntions\r
+extern void SH5001_FIFO_Reset(void);\r
+\r
+extern void SH5001_FIFO_Freq_Config(   unsigned char fifoAccDownSampleEnDis,\r
+                                                                               unsigned char fifoAccFreq,\r
+                                                                               unsigned char fifoGyroDownSampleEnDis,\r
+                                                                               unsigned char fifoGyroFreq);\r
+                                                                               \r
+extern void SH5001_FIFO_Data_Config(   unsigned short fifoMode,\r
+                                                                               unsigned short fifoWaterMarkLevel);                                                                             \r
+                                                                               \r
+extern unsigned char SH5001_FIFO_Read_Status(unsigned short int *fifoEntriesCount);                                                                            \r
+                                                                               \r
+extern void SH5001_FIFO_Read_Data(     unsigned char *fifoReadData, \r
+                                                                       unsigned short int fifoDataLength);                                                                             \r
+                       \r
+\r
+// Master I2C related fucntions\r
+extern void SH5001_MI2C_Reset(void);\r
+\r
+extern void SH5001_MI2C_Bus_Config(    unsigned char mi2cReadMode,\r
+                                                                       unsigned char mi2cODR,\r
+                                                                       unsigned char mi2cFreq);                        \r
+                       \r
+extern void SH5001_MI2C_Cmd_Config(    unsigned char mi2cSlaveAddr,\r
+                                                                       unsigned char mi2cSlaveCmd,\r
+                                                                       unsigned char mi2cReadMode);                    \r
+                       \r
+extern unsigned char SH5001_MI2C_Write(unsigned char mi2cWriteData);                   \r
+                       \r
+extern unsigned char SH5001_MI2C_Read(unsigned char *mi2cReadData);\r
+\r
+                                                                                                                                                                                                                                                                                                                                                                                                               \r
+// SPI interface related fucntions\r
+extern void SH5001_SPI_Config(unsigned char spiInterfaceMode);\r
+\r
+\r
+// I2C interface related fucntions\r
+extern void SH5001_I2C_Config( unsigned char i2cInterfaceEnDis);\r
+\r
+extern void SH5001_I2C_LP_Config(unsigned char i2cReadLoopMode);\r
+\r
+\r
+// OIS SPI interface related fucntions\r
+extern void SH5001_OIS_SPI_Config(unsigned char oisSpiInterfaceEnDis);\r
+\r
+\r
+// fast offset compensation function\r
+extern void SH5001_FastOffsetComp(unsigned char SH5001Positon);                  \r
+ \r
+    \r
+// Read FIFO data functions\r
+extern void SH5001_initFIFO(void);                                    \r
+    \r
+extern void SH5001_ReadFIFO(void);      \r
+                                    \r
+#endif\r
+\r
index 4bed63f..a131c35 100644 (file)
@@ -320,8 +320,8 @@ int mmc5603_savePara_infile(void)
                PRINT("fwrite failed %d\n",ret);\r
                return -1;\r
        }\r
-       for(int i = 0; i < 4 ; i++)\r
-               PRINT("write p[%d] : %f \r\n",i,saveData[i]);\r
+       // for(int i = 0; i < 4 ; i++)\r
+       //      PRINT("write p[%d] : %f \r\n",i,saveData[i]);\r
     fclose(fp);\r
        return 1;\r
 }\r
@@ -341,8 +341,8 @@ int mmc5603_readPara_infile(void)
         PRINT("fread failed %d\n",ret);\r
                return -1;\r
     }\r
-       for(int i = 0; i < 4 ; i++)\r
-               PRINT("read p[%d] : %f \r\n",i,saveData[i]);\r
+       // for(int i = 0; i < 4 ; i++)\r
+       //      PRINT("read p[%d] : %f \r\n",i,saveData[i]);\r
     fclose(fp);\r
        return 1;\r
 }\r
index d867295..de8421c 100644 (file)
@@ -84,6 +84,8 @@ static uint32_t ppg_do_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
         md = PPG_SERVICE_CMD_TYPE_DO_GRAYCARD_TEST;
     } else if (strcmp(mode, "fpc") == 0) {
         md = PPG_SERVICE_CMD_TYPE_FPC_TEST;
+    } else if (strcmp(mode, "factory") == 0) {
+        md = PPG_SERVICE_CMD_TYPE_FACTORY_TEST;
     }
 
     if(enabled == 0 )
index 6e37653..40f29c8 100644 (file)
@@ -385,6 +385,12 @@ static void ppg_service_check_task(void  *arg)
 #ifdef PPG_VC9202
             cmd = "fpc";
             enable = 1;
+#endif
+        }
+        else if (mail == PPG_SERVICE_CMD_TYPE_FACTORY_TEST){
+#ifdef PPG_VC9202
+            cmd = "factory";
+            enable = 1;
 #endif
         }
         if (ppg_service_running_stat == true && enable ==1 )
@@ -490,7 +496,7 @@ void ppg_int_callback(pin_t pin, uintptr_t param)
     uapi_gpio_clear_interrupt(pin);
     uint32_t tm;
     uapi_get_timestampe_ms(&tm);
-    PRINT("ppg_int_callback %d 0x%X   tm : %d \n",pin,param,tm);
+    // PRINT("ppg_int_callback %d 0x%X   tm : %d \n",pin,param,tm);
     send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_INT_HANDLER);
 }
 // void ppg_service_service_resume(void)
index cb273de..012a1d8 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-03-27 09:07:00
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-12-10 17:11:28
+ * @LastEditTime: 2025-01-06 16:57:23
  * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/service/ppg_service.h
  * @Description: 
  * 
@@ -48,6 +48,7 @@ extern "C" {
 #define PPG_SERVICE_CMD_TYPE_CLOSE_HRS_BLE 0x25
 #define PPG_SERVICE_CMD_TYPE_INT_HANDLER 0x26
 #define PPG_SERVICE_CMD_TYPE_FPC_TEST 0x27
+#define PPG_SERVICE_CMD_TYPE_FACTORY_TEST 0x28
 
 errcode_t uapi_ppg_service_init(void);
 void uapi_ppg_service_deinit(void);
index f2f07ec..213da80 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-12-07 16:04:22\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2024-12-21 17:20:35\r
+ * @LastEditTime: 2025-01-07 16:00:59\r
  * @FilePath: /sdk615/code/sdk/drivers/peripheral/ppg/vc9202/inc/vc9202_user.h\r
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
  */\r
@@ -54,5 +54,10 @@ unsigned char vc9202_usr_get_int_reason(void);
 unsigned char vc9202_usr_get_wear_status(void);\r
 void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2_alg_mode );\r
 \r
+uint32_t vc9202_get_hr_ppg_data(void);\r
+void vc9202_get_spo2_ppg_data(uint32_t *ir_data,uint32_t *red_data);\r
+void vc9202_get_leaklight_data(uint32_t *led_cur,uint32_t *apre_val,uint32_t *aps_val);\r
+void vc9202_get_graycard_data(uint32_t *apre_val,uint32_t *aps_val);\r
+\r
 #endif\r
 \r
index 5164e20..9c8fce5 100644 (file)
@@ -223,11 +223,11 @@ static int vc9202_drv_calc_biology_sense(unsigned short int bio_value, unsigned
        }\r
        uint32_t tm;\r
     uapi_get_timestampe_ms(&tm);\r
-       printf("before  f_BIOdetect bio_value :%d , ps_value : %d  , env : %d , tm : %d\n",bio_value,ps_value,env,tm);\r
-       printf("before  f_BIOdetect calc_bio :%d , calc_ps : %d  , VC9202_CFG_WEAR_PARAM_PS  : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret);\r
+       // printf("before  f_BIOdetect bio_value :%d , ps_value : %d  , env : %d , tm : %d\n",bio_value,ps_value,env,tm);\r
+       // printf("before  f_BIOdetect calc_bio :%d , calc_ps : %d  , VC9202_CFG_WEAR_PARAM_PS  : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret);\r
        ret = f_BIOdetect(calc_bio, calc_ps, VC9202_CFG_WEAR_PARAM_PS);\r
-       printf("after  f_BIOdetect calc_bio :%d , calc_ps : %d  , VC9202_CFG_WEAR_PARAM_PS  : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret);\r
-       printf("after  f_BIOdetect bio_value :%d , ps_value : %d  , env : %d , tm : %d\n",bio_value,ps_value,env,tm);\r
+       // printf("after  f_BIOdetect calc_bio :%d , calc_ps : %d  , VC9202_CFG_WEAR_PARAM_PS  : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret);\r
+       // printf("after  f_BIOdetect bio_value :%d , ps_value : %d  , env : %d , tm : %d\n",bio_value,ps_value,env,tm);\r
        if (VC9202_BIO_STA_HOLD == ret)\r
        {\r
                vc9202_drv_set_algo_wear_status(WEAR_STA_HOLD); /* bio */\r
@@ -246,7 +246,7 @@ static int vc9202_drv_calc_biology_sense(unsigned short int bio_value, unsigned
  */\r
 static VC9202WearChangeTypeDef vc9202_drv_wear_status_identify(VC9202WearInfoTypeDef *pwear, unsigned char env, unsigned char ps, unsigned short int bio)\r
 {\r
-       printf("vc9202_drv_wear_status_identify  bio : %d \n",bio);\r
+       // printf("vc9202_drv_wear_status_identify  bio : %d \n",bio);\r
        VC9202WearChangeTypeDef ret_change = WEAR_NO_CHANGE;\r
        int ret_bio_algo = VC9202_BIO_STA_NONE;\r
        /* bio算法运算 */\r
@@ -274,7 +274,7 @@ static VC9202WearChangeTypeDef vc9202_drv_wear_status_identify(VC9202WearInfoTyp
        switch (pwear->wear_status)\r
        {\r
        case WEAR_STA_DROP:\r
-               printf("WEAR_STA_DROP   ps : %d , env : %d , ret_bio_algo : %d ,  alg_wear_status : %d , gsnesor_axis_diff : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,gsnesor_axis_diff,BIO_HOLD_DROP_FLAG);\r
+               // printf("WEAR_STA_DROP   ps : %d , env : %d , ret_bio_algo : %d ,  alg_wear_status : %d , gsnesor_axis_diff : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,gsnesor_axis_diff,BIO_HOLD_DROP_FLAG);\r
                if ((ps >= VC9202_CFG_WEAR_PARAM_PS) && (env <= VC9202_CFG_WEAR_PARAM_ENVMIN) && (VC9202_BIO_STA_HOLD == ret_bio_algo) &&\r
                        (WEAR_STA_HOLD == alg_wear_status) && (1 == gsnesor_axis_diff) && (BIO_HOLD_DROP_FLAG == 2))\r
                {\r
@@ -292,7 +292,7 @@ static VC9202WearChangeTypeDef vc9202_drv_wear_status_identify(VC9202WearInfoTyp
                break;\r
 \r
        case WEAR_STA_HOLD:\r
-               printf("WEAR_STA_HOLD   ps : %d , env : %d , ret_bio_algo : %d ,  alg_wear_status : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,BIO_HOLD_DROP_FLAG);\r
+               // printf("WEAR_STA_HOLD   ps : %d , env : %d , ret_bio_algo : %d ,  alg_wear_status : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,BIO_HOLD_DROP_FLAG);\r
                if ((ps < VC9202_CFG_WEAR_PARAM_PS) || (env > VC9202_CFG_WEAR_PARAM_ENVMIN) || (VC9202_BIO_STA_DROP == ret_bio_algo) || (WEAR_STA_DROP == alg_wear_status) || (BIO_HOLD_DROP_FLAG == 1))\r
                {\r
                        if ((WEAR_STA_DROP == alg_wear_status) || (ret_bio_algo == VC9202_BIO_STA_DROP))\r
@@ -868,24 +868,24 @@ static VC9202DrvRetTypeDef vc9202_drv_status_event_verify(unsigned char status,
                /* over load, max current */\r
                if (event & VC9202_EVENT_OV_MARK)\r
                {\r
-                       printf("event & VC9202_EVENT_OV_MARK \n");\r
+                       // printf("event & VC9202_EVENT_OV_MARK \n");\r
                        vc_ret |= vc9202_drv_adjust_over_load_configure(&dev9202_adjust[index_slot], index_slot, status);\r
                }\r
                /* env, max res */\r
                if (event & VC9202_EVENT_ENV_MARK)\r
                {\r
-                       printf("event & VC9202_EVENT_ENV_MARK \n");\r
+                       // printf("event & VC9202_EVENT_ENV_MARK \n");\r
                        vc_ret |= vc9202_drv_adjust_env_configure(&dev9202_adjust[index_slot], index_slot);\r
                }\r
                /* ppg interruput */\r
                if (event & VC9202_EVENT_PPG_MARK)\r
                {\r
                        vc_ret |= vc9202_drv_adjust_ppg_configure(&dev9202_adjust[index_slot], index_slot, dev9202_info.enfifo_div, dev9202_info.slot_number);\r
-                       printf("event & VC9202_EVENT_PPG_MARK vc_ret : 0x%x\n",vc_ret);\r
+                       // printf("event & VC9202_EVENT_PPG_MARK vc_ret : 0x%x\n",vc_ret);\r
                }\r
                else\r
                {\r
-                       printf("event : 0x%x \n",event);\r
+                       // printf("event : 0x%x \n",event);\r
                        dev9202_adjust[index].info.dir = AGC_DIR_NULL;\r
                        dev9202_adjust[index].info.last_dir = AGC_DIR_NULL;\r
                }\r
@@ -1253,14 +1253,14 @@ void vc9202_drv_system_param_init(unsigned char fifo_div, unsigned char enslot)
                bio_result = VC9202_BIO_STA_NONE;\r
        }\r
 #else\r
-       printf("fifo_div : %d, enslot : %d \n", fifo_div, enslot );\r
-       printf("f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN );\r
+       // printf("fifo_div : %d, enslot : %d \n", fifo_div, enslot );\r
+       // printf("f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN );\r
        if (VC9202_BIO_STA_NONE == bio_result)\r
        {\r
                uint32_t irq_sts = osal_irq_lock();\r
                f_BIOInit(VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN);\r
                osal_irq_restore(irq_sts);\r
-               printf("  VC9202_BIO_STA_DROP == bio_result   f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN );\r
+               // printf("  VC9202_BIO_STA_DROP == bio_result   f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN );\r
        }\r
 #endif\r
 }\r
@@ -1278,7 +1278,7 @@ unsigned char vc9202_drv_get_chip_id(void)
 {\r
        unsigned char chip_id = 0;\r
        usr_iic_read_bytes(0x00, &chip_id, 1);\r
-       printf("vc9202 chip id : 0x%x\n",chip_id);\r
+       // printf("vc9202 chip id : 0x%x\n",chip_id);\r
        return chip_id;\r
 }\r
 \r
@@ -1601,17 +1601,17 @@ unsigned char vc9202_drv_get_sampling_data(SamplingDataTypeDef *pSamplingData, u
        usr_iic_read_bytes(0x01, &dev9202_info.work_status, 1);\r
        usr_iic_read_bytes(0x02, (unsigned char *)&dev9202_info.int_event, 1);\r
 \r
-       printf("dev9202_info.work_status : 0x%x ,dev9202_info.int_event : 0x%x\n",dev9202_info.work_status,dev9202_info.int_event);\r
+       // printf("dev9202_info.work_status : 0x%x ,dev9202_info.int_event : 0x%x\n",dev9202_info.work_status,dev9202_info.int_event);\r
 \r
        if (dev9202_info.work_status & 0xf8) /* 防止insample和conflict时数据错误,则不对设备进行处理 */\r
        {\r
-               printf("dev9202_info.work_status & 0xf8 \n");\r
+               // printf("dev9202_info.work_status & 0xf8 \n");\r
                dev9202_info.int_event = 0; /* 异常时,避免执行佩戴检测 */\r
                return 1;\r
        }\r
        if (-1 == vc9202_drv_check_running_gaptime())\r
        {\r
-               printf("-1 == vc9202_drv_check_running_gaptime() \n");\r
+               // printf("-1 == vc9202_drv_check_running_gaptime() \n");\r
                dev9202_info.int_event = 0; /* 异常时,避免执行佩戴检测 */\r
                return 1;\r
        }\r
index 907333c..5e2d234 100644 (file)
@@ -111,13 +111,13 @@ void ppg_send_cmd_to_vc9202_driver(char* mode, uint8_t enable)
 #endif
     } else if (strcmp(mode, "leaklight") == 0) {
 #ifdef PPG_VC9202
-        md = WORK_MODE_NONE;
+        md = WORK_MODE_FACTORY;
 #elif defined PPG_HX3695
         md = FT_LEAK_LIGHT_MODE;
 #endif
     } else if (strcmp(mode, "graycard") == 0) {
 #ifdef PPG_VC9202
-        md = WORK_MODE_NONE;
+        md = WORK_MODE_FACTORY;
 #elif defined PPG_HX3695
         md = FT_GRAY_CARD_MODE;
 #endif
index 5d5fbbc..9cd777c 100644 (file)
@@ -34,6 +34,17 @@ extern void vc9202_debug_send_spo2_data( SamplingDataTypeDef* presult ,GsensorTy
 #define CHIP_I2C_ADDRESS 0x33\r
 #define VC9202_I2C_BUS I2C_BUS_2\r
 \r
+static uint32_t gr_ppg_data = 0;\r
+static uint32_t red_ppg_data = 0;\r
+static uint32_t ir_ppg_data = 0;\r
+\r
+static uint32_t leaklight_led_cur = 0;  //最大电流,黑箱通道2\r
+static uint32_t leaklight_apre_val = 0;//绿灯强度,漏光模式通道1\r
+static uint32_t leaklight_aps_val = 0;//红外强度,灰卡模式通道3\r
+\r
+static uint32_t graycard_apre_val = 0;//绿灯强度,漏光模式通道1\r
+static uint32_t graycard_aps_val = 0;//红外强度,灰卡模式通道3\r
+\r
 /**\r
   * @brief  iic多字节写\r
   * @param\r
@@ -84,8 +95,10 @@ unsigned int usr_get_clock_ticks(void)
   */\r
 void vc9202_usr_get_chip_id( unsigned char *pchip_id, unsigned char *pvers_id )\r
 {\r
+       tyhx_poweron();\r
        usr_iic_read_bytes( 0x00, pchip_id, 1 );\r
        usr_iic_read_bytes( 0x40, pvers_id, 1 );\r
+       tyhx_poweroff();\r
 }\r
 \r
 /**\r
@@ -326,6 +339,7 @@ static short int alg_calculate_hr_handler( short int last_hr_val, SamplingDataTy
                alg_i_data.axes.y    = pgsensor->gsensor_y_axis[i];\r
                alg_i_data.axes.z    = pgsensor->gsensor_z_axis[i];\r
                alg_i_data.ppgSample = pdata->ppg_data[i];\r
+               gr_ppg_data = (uint32_t)pdata->ppg_data[i];\r
                printf("pdata->ppg_data[%d] : %d \n",i,pdata->ppg_data[i]);\r
                // printf(" i : alg_i_data.axes.x : %d ,alg_i_data.axes.y : %d , alg_i_data.axes.z : %d \n",i,alg_i_data.axes.x,alg_i_data.axes.y,alg_i_data.axes.z);\r
                Algo_Input( &alg_i_data, 1000/25, hr_alg_mode, 1, 1 );\r
@@ -360,6 +374,9 @@ static unsigned char alg_calculate_spo2_handler( unsigned char last_spo2_val , S
        {\r
                ir_PPG = (float)pdata->ppg_data[i*2];\r
                red_PPG  = (float)pdata->ppg_data[i*2+1];\r
+               red_ppg_data = (uint32_t)red_PPG;\r
+               ir_ppg_data = (uint32_t)ir_PPG;\r
+               // printf("ir_PPG : %.3f , red_PPG : %.3f \n",ir_PPG,red_PPG);\r
                // ret_spo2 = vcSpo2Calculate( red_PPG, ir_PPG );\r
                ret_spo2 = spo2Algo(red_PPG,ir_PPG,1);\r
                sport_flag = vcSportMotionCalculate( pgsensor->gsensor_x_axis[i], pgsensor->gsensor_y_axis[i], pgsensor->gsensor_z_axis[i] );\r
@@ -371,19 +388,50 @@ static unsigned char alg_calculate_spo2_handler( unsigned char last_spo2_val , S
        return spo2_value;\r
 }\r
 \r
-static void factory_test_function( SamplingDataTypeDef *pdata )\r
+static void factory_test_function( SamplingDataTypeDef *pdata ,uint16_t size)\r
 {\r
-       // /* 最大电流 */\r
-       // unsigned char ledMaxCur = pdata->led_cur[0];  //最大电流,黑箱通道2\r
-       // /* 获取测试数据 */\r
-       // unsigned int pre0 = pdata->apre_val[0];//绿灯强度,漏光模式通道1\r
-       // unsigned int ps   = pdata->aps_val;//红外强度,灰卡模式通道3\r
-       // /* 温度 */\r
-       // signed short int temp0 = pdata->temp_val_i;\r
-       // signed short int temp1 = pdata->temp_val_o;\r
-       // /* compare abs(bio0,bio1) */\r
-       // unsigned short int bio0 = pdata->bio_val_o;\r
-       // unsigned short int bio1 = pdata->bio_val_o;\r
+       /* 最大电流 */\r
+       unsigned char ledMaxCur = pdata->led_cur[0];  //最大电流,黑箱通道2\r
+       /* 获取测试数据 */\r
+       unsigned int pre0 = pdata->apre_val[0];//绿灯强度,漏光模式通道1\r
+       unsigned int ps   = pdata->aps_val;//红外强度,灰卡模式通道3\r
+       /* 温度 */\r
+       signed short int temp0 = pdata->temp_val_i;\r
+       signed short int temp1 = pdata->temp_val_o;\r
+       /* compare abs(bio0,bio1) */\r
+       unsigned short int bio0 = pdata->bio_val_o;\r
+       unsigned short int bio1 = pdata->bio_val_o;\r
+\r
+       // uint8_t leak_light_pass = 0;\r
+       // uint8_t gray_card_pass = 0;\r
+       //      黑箱测试:\r
+       printf("pdata->led_cur[0] : %d , pdata->apre_val[0] : %d , pdata->aps_val : %d \n",pdata->led_cur[0],pdata->apre_val[0],pdata->aps_val);\r
+       leaklight_led_cur = pdata->led_cur[0];\r
+       leaklight_apre_val = pdata->apre_val[0];\r
+       leaklight_aps_val = pdata->aps_val;\r
+       // if(pdata->led_cur[0] >= 100 && pdata->apre_val[0] <= 64 && pdata->aps_val <= 64)\r
+       // {\r
+       //      leak_light_pass = 1;\r
+       // }\r
+       // else\r
+       // {\r
+       //      leak_light_pass = 0;\r
+       // }\r
+\r
+       //      灰卡测试:\r
+       printf("pdata->apre_val[0] : %d , pdata->aps_val : %d\n",pdata->apre_val[0],pdata->aps_val);\r
+       graycard_apre_val = pdata->apre_val[0];\r
+       graycard_aps_val = pdata->aps_val;\r
+\r
+       // if(pdata->apre_val[0] >= 210 && pdata->aps_val >= 210)\r
+       // {\r
+       //      gray_card_pass = 1;\r
+       // }\r
+       // else\r
+       // {\r
+       //      gray_card_pass = 0;\r
+       // }\r
+\r
 }\r
 static void fpc_test_function(SamplingDataTypeDef *pdata)\r
 {\r
@@ -433,15 +481,15 @@ void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2
        unsigned char gsensor_size = 0;\r
        unsigned char ppg_size = 0;\r
        VC9202DrvRetTypeDef ret = vc9202_drv_get_sampling_data( &data, &ppg_size );\r
-       printf("ppg_size : %d work_mode : %d  ret : %d\n",ppg_size,work_mode,ret);\r
+       // printf("ppg_size : %d work_mode : %d  ret : %d\n",ppg_size,work_mode,ret);\r
        switch ( work_mode )\r
        {\r
                case WORK_MODE_HR:\r
-                       printf("11111 vc9202_usr_get_int_reason : 0x%x \n",vc9202_usr_get_int_reason());\r
+                       // printf("11111 vc9202_usr_get_int_reason : 0x%x \n",vc9202_usr_get_int_reason());\r
                        if( vc9202_usr_get_int_reason()&(VC9202_EVENT_PS_MARK|VC9202_EVENT_FIFO_MARK) )\r
                        {\r
                                wear_status = vc9202_usr_get_wear_status();\r
-                               printf("11111 wear_status : %d \n",wear_status);\r
+                               // printf("11111 wear_status : %d \n",wear_status);\r
                                get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size);\r
                                if( gsensor_size>0 )\r
                                {\r
@@ -450,7 +498,7 @@ void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2
                                if(wear_status)\r
                                {\r
                                        vc9202_alg_results.hr_rate = alg_calculate_hr_handler( vc9202_alg_results.hr_rate, &data, ppg_size, &gsensor_data, hr_alg_mode );\r
-                                       printf("vc9202_alg_results.hr_rate : %d \n",vc9202_alg_results.hr_rate);\r
+                                       // printf("vc9202_alg_results.hr_rate : %d \n",vc9202_alg_results.hr_rate);\r
                                        vc9202_debug_send_heart_rate_data( &data, &gsensor_data, vc9202_alg_results.hr_rate, hr_alg_mode, ppg_size );\r
                                }\r
                                else\r
@@ -469,7 +517,7 @@ void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2
                                if(wear_status)\r
                                {\r
                                        vc9202_alg_results.spo2_val = alg_calculate_spo2_handler( vc9202_alg_results.spo2_val, &data, ppg_size/2, &gsensor_data, spo2_alg_mode );\r
-                                       printf("vc9202_alg_results.spo2_val : %d \n",vc9202_alg_results.spo2_val);\r
+                                       // printf("vc9202_alg_results.spo2_val : %d \n",vc9202_alg_results.spo2_val);\r
                                        vc9202_debug_send_spo2_data( &data, &gsensor_data, vc9202_alg_results.spo2_val, ppg_size/2 );\r
                                }\r
                                else\r
@@ -529,16 +577,16 @@ void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2
                                /* 根据佩戴状态添加对应的处理代码 */\r
                                if(wear_status)\r
                                {\r
-                                       printf("111 wear \n");\r
+                                       // printf("111 wear \n");\r
                                }\r
                                else\r
                                {\r
-                                       printf("222  nowear \n");\r
+                                       // printf("222  nowear \n");\r
                                }\r
                        }\r
                        break;\r
                case WORK_MODE_FACTORY:\r
-                       factory_test_function( &data );\r
+                       factory_test_function( &data ,ppg_size);\r
                        break;\r
                case WORK_MODE_FPC_TEST:\r
                        fpc_test_function(&data);\r
@@ -549,6 +597,41 @@ void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2
        }\r
 }\r
 \r
+uint32_t vc9202_get_hr_ppg_data(void)\r
+{\r
+       uint32_t ppg_data = gr_ppg_data;\r
+       gr_ppg_data = 0;\r
+       return ppg_data;\r
+} \r
+\r
+void vc9202_get_spo2_ppg_data(uint32_t *ir_data,uint32_t *red_data)\r
+{\r
+       *ir_data = ir_ppg_data;\r
+       *red_data = red_ppg_data;\r
+       red_ppg_data = 0;\r
+       ir_ppg_data = 0;\r
+}\r
+\r
+void vc9202_get_leaklight_data(uint32_t *led_cur,uint32_t *apre_val,uint32_t *aps_val)\r
+{\r
+       *led_cur = leaklight_led_cur;\r
+       *apre_val = leaklight_apre_val;\r
+       *aps_val = leaklight_aps_val;\r
+\r
+       leaklight_led_cur = 0;\r
+       leaklight_apre_val = 0;\r
+       leaklight_aps_val = 0;\r
+}\r
+\r
+void vc9202_get_graycard_data(uint32_t *apre_val,uint32_t *aps_val)\r
+{\r
+       *apre_val = graycard_apre_val;\r
+       *aps_val = graycard_aps_val;\r
+\r
+       graycard_apre_val = 0;\r
+       graycard_aps_val = 0;\r
+}\r
+\r
 #if 0\r
 int main(int argc, char *argv[])\r
 {\r
index 153476e..3c8a501 100644 (file)
@@ -34,6 +34,7 @@ elseif("ROTARYENCODER_U8" IN_LIST DEFINES)
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/crown/crown.c
     ${CMAKE_CURRENT_SOURCE_DIR}/crown/crown_at_cmd.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/crown/crown_hal.c
 )
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/crown
@@ -41,6 +42,20 @@ set(PUBLIC_HEADER
 set(PUBLIC_DEFINES
 SUPPORT_AT_CROWN
 )
+
+elseif("ROTARYENCODER_MIXO" IN_LIST DEFINES)
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_ots_driver.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_ots_access.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_at_cmd.c
+)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}/mixo
+)
+set(PUBLIC_DEFINES
+SUPPORT_AT_MIXO
+)
+
 endif()
 
 set(SOURCES
index 9b2804e..a087b32 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-31 10:20:16
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-02 20:18:27
+ * @LastEditTime: 2025-01-09 15:39:10
  * @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
  */
@@ -21,7 +21,9 @@
 #include "pm_veto.h"
 #include "crown.h"
 #include "cmsis_os2.h"
+#include "crown_hal.h"
 
+static int16_t crown_diff = 0;
 static int16_t crown_result = 0;
 static uint8_t stand_still = 1; //静止标志 1 静止,0 转动
 static uint8_t direction = 0; //方向标志 1 顺时针,2 逆时针
@@ -30,6 +32,10 @@ bool crown_timer_running = false; //ots定时器是否运行标志
 
 static osTimerId_t g_crown_timer = NULL;
 
+static pin_t his_pin = 0;
+
+extern encoder_callback g_encoder_callback;
+
 void crown_int_callback(pin_t pin, uintptr_t param)
 {
     uapi_gpio_clear_interrupt(pin);
@@ -38,21 +44,21 @@ void crown_int_callback(pin_t pin, uintptr_t param)
     {
         if (uapi_gpio_get_val(PIN_TYHX_SCLK)) 
         {
-            direction = 1; // 顺时针旋转
-            crown_result++;
+            direction = 2; // 顺时针旋转
+            crown_diff--;
         }
     } 
     else if (pin == PIN_TYHX_SCLK) 
     {
         if (uapi_gpio_get_val(PIN_TYHX_SDIO))  
         {
-            direction = 2; // 逆时针旋转
-            crown_result--;
+            direction = 1; // 逆时针旋转
+            crown_diff++;
         }
     }
-    PRINT("pin : %d , direction : %d , crown_result : %d \n",pin,direction,crown_result);
-}
+    PRINT("pin : %d , direction : %d , crown_diff : %d \n",pin,direction,crown_diff);
 
+}
 
 int16_t crown_get_stand_still(void)
 {
@@ -62,7 +68,7 @@ int16_t crown_get_stand_still(void)
  * 获取表冠的数据结果接口函数
  * @param NULL
 */
-int16_t crown_get_crown_result(void)
+int16_t crown_get_result(void)
 {
     int16_t resulttemp;
     resulttemp=crown_result;
@@ -72,8 +78,10 @@ int16_t crown_get_crown_result(void)
 
 void crown_start(void)
 {
-    if(crown_timer_running == false)
+    if(crown_timer_running == false && g_crown_timer)
     {
+        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定时器间隔
         osTimerStart(g_crown_timer,50);
         crown_timer_running = true;
@@ -82,8 +90,10 @@ void crown_start(void)
 
 void crown_stop(void)
 {
-    if(crown_timer_running == true)
+    if(crown_timer_running == true && g_crown_timer)
     {
+        uapi_pin_set_ie(PIN_TYHX_SDIO,HAL_PIO_IE_DISABLE);
+        uapi_pin_set_ie(PIN_TYHX_SCLK,HAL_PIO_IE_DISABLE);
         osTimerStop(g_crown_timer);
         crown_timer_running = false;
     }
@@ -91,8 +101,22 @@ void crown_stop(void)
 
 void crown_timer_handler(void)
 {
-    PRINT("crown_result : %d \n",crown_result);
-    crown_result = 0;
+    if(!crown_diff)
+    {
+        stand_still = 1;
+    }
+    else
+    {
+        stand_still = 0;
+        crown_result = crown_diff * 30;
+        crown_diff = 0;
+        // PRINT("crown_result : %d direction : %d\n",crown_result,direction);
+        if (g_encoder_callback != NULL)
+            g_encoder_callback();
+        else
+            PRINT("no call back crown_result = %d\r\n",crown_result);
+    }
+
 }
 
 
@@ -100,6 +124,9 @@ void crown_init(void)
 {
     if(!g_crown_timer)
         g_crown_timer = osTimerNew((osTimerFunc_t)crown_timer_handler, osTimerPeriodic, NULL, NULL);
+    
+    if(!g_crown_timer)
+        PRINT("g_crown_timer init failed \n");
 }
 
 // #endif
index dce7d2b..63b9f55 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-31 10:20:24
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2025-01-02 19:57:42
+ * @LastEditTime: 2025-01-08 15:13:01
  * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/crown/crown.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.c
new file mode 100644 (file)
index 0000000..323d7f2
--- /dev/null
@@ -0,0 +1,138 @@
+#include "at_cmd_api.h"
+#include "pm_control.h"
+#include "crown.h"
+#include "crown_hal.h"
+
+#include "rotary_encoder_def.h"
+#include "i2c.h"
+#include "debug_print.h"
+#include "hal_i2c.h"
+
+static uint8_t g_crown_test_started = 0;
+encoder_callback g_encoder_callback = NULL;
+uint32_t rotary_crown_start(void)
+{
+    if (g_crown_test_started == 1) 
+    {
+        re_print("SKIP crowntest start, already started\r\n");
+        return 0;
+    }
+    crown_init();
+    crown_start();
+    g_crown_test_started = 1;
+    return ERRCODE_SUCC;
+}
+uint32_t rotary_crown_stop(void)
+{
+    if (g_crown_test_started == 0) 
+    {
+        re_print("SKIP crowntest stop, already stopped\r\n");
+        return 0;
+    }
+    crown_stop();
+    g_crown_test_started = 0 ;
+    return ERRCODE_SUCC;
+}
+
+static ext_errno crown_encoder_init(void *attr)
+{
+    re_print("crown_encoder_init\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_deinit(void)
+{
+    re_print("crown_encoder_deinit\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len)
+{
+
+    if (data_len != sizeof(re_input_event_info))
+    {
+        re_print("data_len != sizeof(re_input_event_info) \n");
+        return EXT_ERR_NOT_SUPPORT;
+    }
+
+    re_input_event_info *encoder_info = (re_input_event_info*)data;
+    int16_t diff = crown_get_result();
+    int16_t stand_still = crown_get_stand_still();
+    // re_print("crown_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("crown_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 crown_encoder_suspend(void)
+{
+    re_print("crown_encoder_suspend\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_resume(void)
+{
+    re_print("crown_encoder_resume\r\n");
+    crown_init();
+    crown_start();
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_sleep(void)
+{
+    re_print("crown_encoder_sleep\r\n");
+    crown_stop();
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_reset(void)
+{
+    re_print("crown_encoder_reset\r\n");
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_encoder_bus_init(void *private_data)
+{
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_register_callback(void *peri_data, encoder_callback func)
+{
+    re_print("crown_register_callback\r\n");
+    g_encoder_callback = func;
+    return EXT_ERR_SUCCESS;
+}
+static ext_errno crown_unregister_callback(void *peri_data)
+{
+    re_print("crown_unregister_callback\r\n");
+    g_encoder_callback = NULL;
+    return EXT_ERR_SUCCESS;
+}
+
+encoder_peripheral_api g_crown_api = {
+    .encoder_init = crown_encoder_init,
+    .encoder_deinit = crown_encoder_deinit,
+    .encoder_get_encoderinfo = crown_encoder_get_encoderinfo,
+    .encoder_suspend = crown_encoder_suspend,
+    .encoder_resume = crown_encoder_resume,
+    .encoder_sleep = crown_encoder_sleep,
+    .encoder_reset = crown_encoder_reset,
+    .encoder_bus_init = crown_encoder_bus_init,
+    .register_callback = crown_register_callback,
+    .unregister_callback = crown_unregister_callback,
+};
+
+
+void *rotary_encoder_get_crown_api(void)
+{
+    return ((void *)&g_crown_api);
+}
+
+void *rotary_encoder_get_crown_peri_attr(void)
+{
+    return ((void *)NULL);
+}
\ No newline at end of file
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.h b/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_hal.h
new file mode 100644 (file)
index 0000000..2829758
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-01-07 16:44:07
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-07 17:01:25
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_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
+ *
+ * Description: Provides at cmd register func \n
+ * Author: @CompanyNameTag \n
+ * History: \n
+ * 2022-07-20, Create file. \n
+ */
+#ifndef CROWN_HAL_H
+#define CROWN_HAL_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include "errcode.h"
+#include "soc_osal.h"
+#include "rotary_encoder_def.h"
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+void *rotary_encoder_get_crown_api(void);
+void *rotary_encoder_get_crown_peri_attr(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
index 4096463..18a0955 100644 (file)
@@ -62,7 +62,7 @@ static int16_t crown_result = 0;
 static int16_t stand_still = 1; //静止标志 1 静止,0 转动
 /*----------------------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-------------------------------*/
 
-int16_t get_stand_still(void)
+int16_t hx3507_get_stand_still(void)
 {
     return stand_still;
 }
@@ -594,7 +594,7 @@ void report_zero_data_for_start_stop_flag(void)
  * 获取表冠的数据结果接口函数
  * @param NULL
 */
-int16_t get_crown_result(void)
+int16_t hx3507_get_crown_result(void)
 {
     int16_t resulttemp;
     resulttemp=crown_result;
index 565d54d..145a544 100644 (file)
@@ -1,3 +1,11 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2024-12-23 14:24:09
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-07 17:04:23
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3507/hx3507.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 /**
  * Copyright (c) 2014 - 2023, 南京天易合芯电子有限公司
  *
@@ -85,9 +93,9 @@ void crown_com_resync(void);
 
 //把读出的数据转换为大概角度函数
 void put_crown_result(int16_t x);
-int16_t get_stand_still(void);
+int16_t hx3507_get_stand_still(void);
 void report_zero_data_for_start_stop_flag(void);
 
 //把角度结果上报的函数
-int16_t get_crown_result(void);
+int16_t hx3507_get_crown_result(void);
 #endif //_TYHX_CROWN_CUSTOM_H_
index 3bfc6a2..3513d81 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com
  * @Date: 2024-12-23 14:24:09
  * @LastEditors: penglei 1624952103@qq.com
- * @LastEditTime: 2024-12-30 17:28:09
+ * @LastEditTime: 2025-01-09 18:35:13
  * @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
  */
@@ -62,8 +62,8 @@ static ext_errno hx3507_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 = hx3507_get_crown_result();
+    int16_t stand_still = hx3507_get_stand_still();
     // re_print("hx3507_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still);
     if (stand_still == 1 )
     {
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.c
new file mode 100644 (file)
index 0000000..b81485d
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2024-12-18 10:23:22
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-04 11:21:49
+ * @FilePath: /sdk615/code/sdk/drivers/peripheral/rotary_encoder/mixo/mixo_at_cmd.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+// #include "mixo.h"
+
+
+#include "at_cmd_api.h"
+#include "pm_control.h"
+#include "debug_print.h"
+#include "mixo_ots_driver.h"
+#include "custom_utils.h"
+
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
+#define MIXO_MAX_ARGC            8
+#define MIXO_MAX_ARGV_LEN        64
+
+#define MIXO_SUCCESS             0
+#define MIXO_FAILED              (-1)
+
+static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen,
+        uint8_t argv[MIXO_MAX_ARGC][MIXO_MAX_ARGV_LEN], uint32_t* argc)
+{
+    uint32_t pos = 0;
+    *argc = 0;
+
+    for (uint32_t i = 0; i < paraLen; i++) {
+        if ((para[i] == ' ' || para[i] == '\n') && pos != 0) {
+            argv[*argc][pos] = '\0';
+            *argc += 1;
+            pos = 0;
+            if (*argc >= MIXO_MAX_ARGC) {
+                return MIXO_FAILED;
+            }
+        } else {
+            argv[*argc][pos] = para[i];
+            pos++;
+            if (pos >= MIXO_MAX_ARGV_LEN) {
+                return MIXO_FAILED;
+            }
+        }
+    }
+    if (pos != 0) {
+        *argc += 1;
+    }
+
+    return MIXO_SUCCESS;
+}
+
+static uint8_t g_mixo_test_started = 0;
+static uint32_t mixo_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+    uint8_t argv[MIXO_MAX_ARGC][MIXO_MAX_ARGV_LEN] = { 0 };
+    uint32_t argc = 0;
+
+    int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+    if (ret != MIXO_SUCCESS) {
+        PRINT("MIXOTEST ATCMD Convert Command Failed\n");
+        return ERRCODE_FAIL;
+    }
+
+    if (argc != 1) {
+        PRINT("MIXOTEST 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_mixo_test_started == 1) 
+        // {
+        //     PRINT("SKIP mixotest start, already started\r\n");
+        //     return 0;
+        // }
+        mixo_ots_init();
+        // mixo_start();
+        g_mixo_test_started = 1;
+    }else if (start == 2){
+        if (g_mixo_test_started == 0) 
+        {
+            PRINT("SKIP mixotest stop, already stopped\r\n");
+            return 0;
+        }
+        // mixo_stop();
+        g_mixo_test_started = 0 ;
+    }
+    return ERRCODE_SUCC;
+}
+static const at_cmd_table_t g_mixo_cmd[] = {
+    { (char *)"AT^MIXOTEST",      mixo_test, (char *)"1" },
+};
+
+at_cmd_table_t *get_mixo_cmd_table(uint32_t *cmd_count)
+{
+    *cmd_count = ARRAY_COUNT(g_mixo_cmd);
+    return (at_cmd_table_t *)g_mixo_cmd;
+}
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_at_cmd.h
new file mode 100644 (file)
index 0000000..e882445
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-01-02 19:52:36
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-04 11:27:51
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/crown/crown_at_cmd.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
+ *
+ * Description: Provides at cmd register func \n
+ * Author: @CompanyNameTag \n
+ * History: \n
+ * 2022-07-20, Create file. \n
+ */
+#ifndef MIXO_AT_PROCESS_H
+#define MIXO_AT_PROCESS_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include "errcode.h"
+#include "soc_osal.h"
+#include "at_cmd_api.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+at_cmd_table_t *get_mixo_cmd_table(uint32_t *cmd_count);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.c
new file mode 100644 (file)
index 0000000..6078260
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * @Author: penglei 1624952103@qq.com
+ * @Date: 2025-01-04 10:53:54
+ * @LastEditors: penglei 1624952103@qq.com
+ * @LastEditTime: 2025-01-04 16:38:46
+ * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/mixo/src/mixo_ots_access.c
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+/*
+ * Copyright (c) 2022 MixoSense Technology Ltd <contact@mixosense.com>.
+ *
+ * All rights are reserved.
+ * Proprietary and confidential.
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
+ * Any use is subject to an appropriate license granted by MixoSense Technology
+ * Ltd.
+ *
+ */
+
+/*-----------------------------------------------------------------------------
+ * HEADER FILES
+ *---------------------------------------------------------------------------*/
+#include "mixo_ots_access.h"
+#include "custom_utils.h"
+
+
+static uint8_t slave_addr = 0x74;
+
+#define MIXO_OTS_I2C_BUS I2C_BUS_2
+
+void mixo_ots_set_slave_id(uint8_t slave_id)
+{
+    slave_addr = slave_id;
+}
+int mixo_ots_reg_read(uint8_t regAddr, uint8_t* regData)
+{
+    *regData = 0x00;  // 清空数据
+    // printf("<-%02X,%02X,%02X\r\n",slave_addr,regAddr,*regData);
+    // return mixo_gpio_i2c_write_read(slave_addr, &regAddr, 1, regData, 1);
+    return custom_i2c_read_regs(slave_addr, regAddr, 1, regData, 1,MIXO_OTS_I2C_BUS);
+}
+
+int mixo_ots_reg_consecutive_read(uint8_t regStartAddr,int len,uint8_t* regData)
+{
+    int rc = 0;
+    // rc = mixo_gpio_i2c_write_read(slave_addr, &regStartAddr, 1, regData, len);
+    rc = custom_i2c_read_regs(slave_addr, regStartAddr, 1, regData, len,MIXO_OTS_I2C_BUS);
+    // for(int i=0;i<len;i++)
+    // {
+    //     printf("<-%02X,%02X,%02X\r\n",slave_addr,regStartAddr+i,regData[i]);
+    // }
+    return rc;
+}
+
+int mixo_ots_reg_write(uint8_t regAddr, uint8_t regData)
+{
+    // uint8_t tmp[2] = {regAddr, regData};
+    // printf("->%02X,%02X,%02X\r\n",slave_addr,regAddr,regData);
+    // return mixo_gpio_i2c_write_read(slave_addr, tmp, 2, NULL, 0);
+    return custom_i2c_write_reg(slave_addr, regAddr, 1, &regData, 1,MIXO_OTS_I2C_BUS);
+}
+
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_access.h
new file mode 100644 (file)
index 0000000..4c2e504
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2022 MixoSense Technology Ltd <contact@mixosense.com>.
+ *
+ * All rights are reserved.
+ * Proprietary and confidential.
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
+ * Any use is subject to an appropriate license granted by MixoSense Technology
+ * Ltd.
+ *
+ */
+
+#ifndef _MXS_REG_ACCESS_H_
+#define _MXS_REG_ACCESS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-----------------------------------------------------------------------------
+ * HEADER FILES
+ *---------------------------------------------------------------------------*/
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+/*-----------------------------------------------------------------------------
+ * MACRO DEFINITION
+ *---------------------------------------------------------------------------*/
+#ifdef _WIN32
+#ifdef MXS_DLL_EXPORTS
+#define MXS_API __declspec(dllexport)
+#else
+#define MXS_API
+#endif
+#else
+#define MXS_API
+#endif
+
+/*-----------------------------------------------------------------------------
+ * FUNCTIONS DEFINITION
+ *---------------------------------------------------------------------------*/
+
+/**
+ * @brief mxs配置I2C从设备地址
+ *
+ * @param {uint8_t} slave_id
+ *
+ * @return {*}
+ */
+void mixo_ots_set_slave_id(uint8_t slave_id);
+
+/**
+ * @brief mxs寄存器写入接口
+ *
+ * @param {uint8_t} regAddr
+ * @param {uint8_t} regData
+ *
+ * @return {*}
+ */
+int mixo_ots_reg_write(uint8_t regAddr, uint8_t regData);
+
+/**
+ * @brief mxs寄存器读取接口
+ *
+ * @param {uint8_t} regAddr
+ * @param {uint8_t} *regData
+ *
+ * @return {*}
+ */
+int mixo_ots_reg_read(uint8_t regAddr, uint8_t* regData);
+int mixo_ots_reg_consecutive_read(uint8_t regStartAddr,
+                                  int len,
+                                  uint8_t* regData);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  //_MXS_REG_ACCESS_H_
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c
new file mode 100644 (file)
index 0000000..21e6ed8
--- /dev/null
@@ -0,0 +1,285 @@
+#include "mixo_ots_driver.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "mixo_ots_access.h"
+#include "cmsis_os2.h"
+
+#ifndef ABS
+#define ABS(x) ((x) > 0 ? (x) : -(x))
+#endif
+
+// macro definitions about reigster data
+#define REG_PROTECT_ID_HIGH 0x58
+#define REG_PROTECT_ID_LOW  0x5B
+
+static int dx_sum = 0;
+
+static bool ots_timer_running = false; //ots定时器是否运行标志
+
+static osTimerId_t g_ots_timer = NULL;
+
+
+static void ots_timer_callback(void)
+{
+    uint8_t mot_status = 0x00;
+    mixo_ots_get_mot_status(&mot_status);
+    if ((mot_status & 0x80) == 0x80)
+    {
+        // Get raw datas
+        raw_data_t raw_data;
+        mixo_ots_get_raw_data(&raw_data);
+        dx_sum += raw_data.dx;
+
+        // Output raw data
+        // printf("%ld,%d,%d,%d,%d\r\n", timestamp, raw_data.dx, raw_data.dy, mot_status, dx_sum);
+    }
+}
+
+void mixo_ots_start(void)
+{
+    if(ots_timer_running == false && g_ots_timer)
+    {
+        osTimerStart(g_ots_timer,10);
+        ots_timer_running = true;
+    }
+}
+
+void mixo_ots_stop(void)
+{
+    if(ots_timer_running == true && g_ots_timer)
+    {
+        osTimerStop(g_ots_timer);
+        ots_timer_running = false;
+    }
+}
+
+void mixo_ots_timer_init(void)
+{
+    g_ots_timer = osTimerNew((osTimerFunc_t)ots_timer_callback, osTimerPeriodic, NULL, NULL);
+    
+    if(!g_ots_timer)
+        PRINT("g_ots_timer init failed \n");
+}
+
+
+/**
+ * @brief 接收1byte数据
+ * @param[in] original_dx   低8bit的dx数据
+ * @param[in] original_dy   低8bit的dy数据
+ * @param[in] high_bit      高4bit的dx/dy数据
+ * @param[out] dx           合成后的dx数据
+ * @param[out] dx           合成后的dy数据
+ * */
+static void data_synthesis(uint8_t original_dx,
+                           uint8_t original_dy,
+                           uint8_t high_bit,
+                           int16_t* dx,
+                           int16_t* dy)
+{
+    // move high 4 bits to bit 11 ~ bit 8
+    int16_t dx_high = (high_bit << 4) & 0x0F00;
+    int16_t dy_high = (high_bit << 8) & 0x0F00;
+
+    // sign extension
+    if (dx_high & 0x0800)
+    {
+        dx_high |= 0xF000;
+    }
+    if (dy_high & 0x0800)
+    {
+        dy_high |= 0xF000;
+    }
+
+    // move low 8 bits to bit 7 ~ bit 0
+    *dx = dx_high | (int16_t)original_dx;
+    *dy = dy_high | (int16_t)original_dy;
+
+    // overflow of 12-bit data
+    *dx = (*dx == 2048) ? 0 : *dx;
+    *dy = (*dy == 2048) ? 0 : *dy;
+}
+
+int mixo_ots_get_mot_status(uint8_t* mot_status)
+{
+    int ret                = 0;
+    uint8_t tmp_mot_status = 0x00;
+    ret                    = mixo_ots_reg_read(0x02, &tmp_mot_status);  // get MOTION STATUS
+    if (ret != 0) goto Exit;
+    *mot_status = tmp_mot_status;
+
+Exit:
+    return ret;
+}
+
+int mixo_ots_get_raw_data(raw_data_t* raw_data)
+{
+    int ret = 0;
+    uint8_t tmp = 0x00;
+
+    uint8_t tmp_dx          = 0x00;
+    uint8_t tmp_dy          = 0x00;
+    uint8_t tmp_dx_dy_hight = 0x00;
+
+    if (raw_data == NULL)
+    {
+        printf("null `raw_data`!");
+        ret = -1;
+        goto Exit;
+    }
+
+    ret = mixo_ots_reg_read(0x12, &tmp_dx_dy_hight);  // get DELTA XY HIGH
+    if (ret != 0) goto Exit;
+    ret = mixo_ots_reg_read(0x03, &tmp_dx);  // get DELTA X
+    if (ret != 0) goto Exit;
+    ret = mixo_ots_reg_read(0x04, &tmp_dy);  // get DELTA Y
+    if (ret != 0) goto Exit;
+
+    data_synthesis(
+        tmp_dx, tmp_dy, tmp_dx_dy_hight, &(raw_data->dx), &(raw_data->dy));
+
+    // If overflowed, clear out the data
+    if ((ABS(raw_data->dx) == 2047) || (ABS(raw_data->dy) == 2047))
+    {
+        printf("dy/dx overflowed.");
+        mixo_ots_reg_read(0x02, &tmp);
+
+        mixo_ots_reg_read(0x02, &tmp);
+    }
+
+Exit:
+    return ret;
+}
+
+/* 强制清除MOT的中断信号 */
+void mixo_ots_forced_clear_int(void)
+{
+    uint8_t tmp = 0x00;
+    mixo_ots_reg_read(0x02, &tmp);
+    mixo_ots_reg_read(0x02, &tmp);
+}
+
+/* 进入/退出Suspend模式 */
+void mixo_ots_enter_suspend_mode(uint8_t true_or_false)
+{
+    uint8_t tmp = 0;
+    // 将数据从寄存器中读出后进行位操作,再重新写回
+    if (true_or_false)
+    {
+        // bit 3 写 1, 进入Suspend
+        mixo_ots_reg_read(0x06, &tmp);
+        mixo_ots_reg_write(0x06, (tmp | 0x08));
+    }
+    else
+    {
+        // bit 3 写 0, 退出Suspend
+        mixo_ots_reg_read(0x06, &tmp);
+        mixo_ots_reg_write(0x06, (tmp & 0xF7));
+    }
+}
+
+
+int callisto_2x_init(void)
+{
+    int ret         = 0;
+    int read_id_ok  = 0;
+    uint8_t id_high = 0x00;
+    uint8_t id_low  = 0x00;
+    uint8_t tmp_read      = 0x00;
+    uint8_t sensor_option = 0x04;  // sensor_option default is 0x04
+
+    printf("CONFIG_CALLISTO_2X\n");
+    mixo_ots_reg_write(0x09, 0x5A);     // write_protect, WO, Disable write protect
+    mixo_ots_reg_write(0x3C, 0xAC);     // bank_switch, WO, Banck switch
+    mixo_ots_reg_write(0x09, 0xA5);     // write_protect, WO, Disable write protect
+    mixo_ots_reg_write(0x6D, 0x39);     // read_protect, WO, Disable read protect
+    mixo_ots_reg_read(0x00, &id_high);  // Read chip-id high byte
+    mixo_ots_reg_read(0x01, &id_low);   // Read chip-id low byte
+    if (id_high == REG_PROTECT_ID_HIGH && id_low == REG_PROTECT_ID_LOW)
+    {
+        read_id_ok = 1;
+    }
+
+    if (read_id_ok)
+    {
+        mixo_ots_reg_write(0x19,
+                           sensor_option);  // sensor_option default is 0x04, WO, Enable 12bit mode; Disable x-y swap
+        mixo_ots_reg_write(0x3E, 0x73);  // comm_mode, WO, Switch to LED CC mode, and bypass AVDD
+        mixo_ots_reg_write(0x48, 0x2F);  // led_current, WO, Control LDP driven current
+        mixo_ots_reg_write(0x1F, 0xFE);  // led_current, WO, Control LDP driven current
+        mixo_ots_reg_write(0x73, 0x08);  // 2a3_motion, WO, To be compatible with 2A3 module
+        mixo_ots_reg_write(0x68, 0x67);  // col_counter, WO, Adjust the reference voltage for the Bandgap output; Adjust
+                                         // the output voltage of the 1.8V in sleep mode
+        mixo_ots_reg_write(0x7D, 0x60);  // trb_osch, WO, Adjust the output frequency of OSCH
+        mixo_ots_reg_write(0x60, 0x00);  // col_bias_and_output_drive, WO, Adjust the magnitude of the bias current in
+                                         // the sensor column; Adjust the sensor output drive strength
+
+        // TO DO, if need calibration
+    }
+
+    if (read_id_ok)
+    {
+        mixo_ots_reg_write(0x0D, 0x20);  // If cpi value is not assigned, use default value
+        mixo_ots_reg_write(0x0E, 0x20);  // If cpi value is not assigned, use default value
+
+        /**
+         * Enable 12bit mode Read the original value
+         * If swap_xy is true, swap dx and dy
+         * If inv_x is true, invert dx's output
+         * If inv_y is true, invert dy's output
+         */
+        mixo_ots_reg_read(0x19, &tmp_read);
+        if (tmp_read != sensor_option)
+        {
+            printf("sensor_option init failed!(The expected %02X, and the actual %02X)\r\n", sensor_option, tmp_read);
+        }
+
+        ret = 0;
+    }
+    else
+    {
+        ret = -1;
+        printf("callisto_2x init failed!\r\n");
+    }
+
+    return ret;
+}
+
+
+
+int mixo_ots_init(void)
+{
+    int rc             = 0;
+    uint8_t HardWareId = 0;
+
+    mixo_ots_reg_read(0x1B, &HardWareId);
+    printf("Address: %x, Data: %x\r\n", 0x1B, HardWareId);
+
+    switch (HardWareId)
+    {
+        case 0xA1:
+            rc = callisto_2x_init();
+            break;
+        case 0xB1:
+            rc = callisto_2x_init();
+            break;
+        case 0xC1:
+            rc = callisto_2x_init();
+            break;
+        default:
+            printf("OTS Sensor Not Support!\n");
+            break;
+    }
+
+    if(rc == 0)
+    {
+        printf("mixo_ots_init succed !!! \n");
+    }
+    else
+    {
+        printf("mixo_ots_init failed !!! \n");
+    }
+    return rc;
+}
+
diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h
new file mode 100644 (file)
index 0000000..5093bb2
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2019 MixoSense Technology Ltd <contact@mixosense.com>.
+ *
+ * All rights are reserved.
+ * Proprietary and confidential.
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
+ * Any use is subject to an appropriate license granted by MixoSense Technology
+ * Ltd.
+ *
+ */
+
+#ifndef _MXS_DRIVER_H_
+#define _MXS_DRIVER_H_
+
+#include <stdint.h>
+
+typedef struct
+{
+    int16_t dx;
+    int16_t dy;
+} raw_data_t;
+
+int mixo_ots_init(void);
+int mixo_ots_get_mot_status(uint8_t* mot_status);
+int mixo_ots_get_raw_data(raw_data_t* raw_data);
+void mixo_ots_forced_clear_int(void);
+void mixo_ots_enter_suspend_mode(uint8_t true_or_false);
+
+#endif  //_MXS_DRIVER_H_
index bc96310..7cb61bc 100644 (file)
 #ifdef ROTARYENCODER_HX3507
 #include "hx3507_hal.h"
 #endif
+
+#ifdef ROTARYENCODER_HX3509
+#include "hx3509_hal.h"
+#endif
+
+#ifdef ROTARYENCODER_U8
+#include "crown_hal.h"
+#endif
 // #if defined(TPTYPE_TMA525B)
 // #include "tma525b_drv1.h"
 // #include "tma525b_ctrl.h"
@@ -420,6 +428,9 @@ uint32_t re_init(void)
 #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_U8
+    g_encoder_drv.private_data = rotary_encoder_get_crown_peri_attr();
+    g_encoder_drv.encoder_api = rotary_encoder_get_crown_api();
 #endif
     g_encoder_drv.ops = &g_re_status_ops;
     redd = rotary_encoder_get_driver_data();
@@ -462,6 +473,8 @@ void rotary_encoder_suspend(void)
     encoder_ptr = rotary_encoder_get_hx3507_api();
 #elif defined ROTARYENCODER_HX3509
     encoder_ptr = rotary_encoder_get_hx3509_api();
+#elif defined ROTARYENCODER_U8
+    encoder_ptr = rotary_encoder_get_crown_api();
 #endif
     if(encoder_ptr == NULL)
         return;
@@ -477,6 +490,8 @@ void rotary_encoder_resume(void)
     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_U8
+    encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_crown_api();
 #endif
     if(encoder_ptr == NULL)
         return;
index 51597f3..cc4bc6c 100644 (file)
@@ -31,8 +31,11 @@ extern "C" {
 uint32_t uapi_cat1_bat_on(uint32_t pwron)
 {
 
-#if defined(BOARD_L22) || defined(BOARD_W9)
+#if defined(BOARD_L22)
     pin_t bat_en_pin =  S_AGPIO_L14;
+#elif defined(BOARD_W9)
+    pin_t bat_en_pin =  S_AGPIO_L17;
+
     if( pwron == 0)
     {
         uapi_gpio_set_dir(bat_en_pin, GPIO_DIRECTION_OUTPUT);
index bef190a..a590391 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2024-12-31 15:39:53\r
+ * @LastEditTime: 2025-01-09 16:57:54\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
 #ifdef FD230\r
 #include "PhoneServiceC.h"\r
 #endif\r
+#ifdef ENABLE_LQBP002TA\r
+#include "lqbp_service.h"\r
+#include "lqbp002ta.h"\r
+#endif\r
+#ifdef ENABLE_HP4507\r
+#include "hp4570.h"\r
+#endif\r
+\r
 #pragma pack(1)\r
 typedef struct factorytest_cmd_header_t\r
 {\r
@@ -81,7 +89,8 @@ static osTimerId_t g_ble_acc_timer = NULL;
 static int aging_time = 0;\r
 \r
 static uint8_t pwr_button_result = 0;\r
-static uint8_t func_button_result = 1;\r
+static uint8_t func_button_result = 0;\r
+static uint8_t func2_button_result = 0;\r
 \r
 errcode_t factorytest_protocol_replymsg(uint8_t mode, uint8_t submode,uint8_t testitem,\r
                                 uint8_t *input_data,uint16_t input_len)\r
@@ -142,6 +151,19 @@ static void func_button_callback_long_press_2s(void)
     func_button_result = 2;\r
 }\r
 \r
+static void func2_button_callback_press(void)\r
+{\r
+    func2_button_result = 1;\r
+}\r
+static void func2_button_callback_click_2(void)\r
+{\r
+    func2_button_result = 3;\r
+}\r
+static void func2_button_callback_long_press_2s(void)\r
+{\r
+    func2_button_result = 2;\r
+}\r
+\r
 void ble_vibrator_check_timer_callback(void)\r
 {\r
     // uapi_vibrationModeSet(3);\r
@@ -415,7 +437,7 @@ void aging_task(void)
         PRINT("gsensor失败次数 : %d \r\n",aging_t.gsensor_error);\r
 \r
 /*********************磁力计 老化测试*****************************/\r
-        float fAzimuth,fPitch,fRoll;\r
+        float fAzimuth = 0;\r
 \r
         total_time = 2 * 60;\r
         enter_time = 0;\r
@@ -430,7 +452,7 @@ void aging_task(void)
                 return;\r
             }\r
             uapi_get_timestampe_ss(&current_time);\r
-            mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);\r
+            mmc5603_getdata(&fAzimuth);\r
             if(fAzimuth < 0)\r
             {\r
                 aging_t.mag_error++;\r
@@ -510,21 +532,21 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t
 \r
                 factorytest_mode_flag = 1;\r
 \r
+#ifdef FD230\r
                 ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0); //进入产测模式 关闭充电弹窗\r
                 uapi_dev_runtime_set_factory_test_status(1); //设置产测模式runtime\r
                 svr_ble_adv_factory_test_start_param(); //设置蓝牙广播 避免出现连接问题\r
-\r
+#endif\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON,\r
                 BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE,\r
                 0x01,\r
                 &send_data,\r
                 1);\r
-                #ifdef FD230\r
+#ifdef FD230\r
                 uapi_hfp_connect_();\r
                 LOS_Msleep(500);\r
                 uapi_a2dp_snk_connect_();\r
-                #endif\r
-\r
+#endif\r
             } else if (testitem == 0x02)\r
             {\r
     \r
@@ -782,9 +804,11 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //打开马达\r
                 uint8_t send_data = 0x00;\r
 \r
-                g_ble_vibrator_timer = osTimerNew((osTimerFunc_t)ble_vibrator_check_timer_callback, osTimerPeriodic, NULL, NULL);\r
+                if(g_ble_vibrator_timer == NULL)\r
+                    g_ble_vibrator_timer = osTimerNew((osTimerFunc_t)ble_vibrator_check_timer_callback, osTimerPeriodic, NULL, NULL);\r
 \r
-                osTimerStart(g_ble_vibrator_timer,500);\r
+                if(g_ble_vibrator_timer)\r
+                    osTimerStart(g_ble_vibrator_timer,500);\r
                 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR,\r
@@ -797,8 +821,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //关闭马达\r
                 uint8_t send_data = 0x00;\r
 \r
-                osTimerStop(g_ble_vibrator_timer);\r
-                osTimerDelete(g_ble_vibrator_timer);\r
+                if(g_ble_vibrator_timer)\r
+                    osTimerStop(g_ble_vibrator_timer);\r
+                // osTimerDelete(g_ble_vibrator_timer);\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR,\r
@@ -825,7 +850,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 if(g_ble_vibrator_timer != NULL)\r
                 {\r
                     osTimerStop(g_ble_vibrator_timer);\r
-                    osTimerDelete(g_ble_vibrator_timer);\r
+                    // osTimerDelete(g_ble_vibrator_timer);\r
                 }\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR,\r
@@ -841,6 +866,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             {\r
                 uint8_t send_data = 0;\r
 \r
+                pwr_button_result = 0;\r
+                func_button_result = 0;\r
+                func2_button_result = 0;\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
                         0x01,\r
@@ -923,6 +951,34 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                         &send_data,\r
                         1);\r
             }\r
+            else if(testitem == 0x08)\r
+            {\r
+                //开启功能键2测试\r
+                uint8_t send_data = 0;\r
+\r
+                uapi_button_unregister_event_cb(BUTTON2_CLICKUP_2);\r
+                uapi_button_unregister_event_cb(BUTTON2_LONGPRESS_2S);\r
+\r
+                uapi_button_register_event_cb(func2_button_callback_press, BUTTON2_CLICKUP);\r
+                uapi_button_register_event_cb(func2_button_callback_click_2, BUTTON2_CLICKUP_2);\r
+                uapi_button_register_event_cb(func2_button_callback_long_press_2s, BUTTON2_LONGPRESS_2S);\r
+\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x08,\r
+                        &send_data,\r
+                        1);\r
+            } else if(testitem == 0x09)\r
+            {\r
+                //查询功能键2测试结果\r
+                uint8_t send_data = func2_button_result;\r
+\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x09,\r
+                        &send_data,\r
+                        1);\r
+            }\r
 \r
             break;\r
 \r
@@ -1377,6 +1433,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //获取 ppg_id\r
                 uint8_t ppg_id;\r
                 uapi_ppg_get_id(&ppg_id);\r
+                PRINT("0x%x\n",ppg_id);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS,\r
                         0x01,\r
@@ -1396,7 +1453,11 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             } else if(testitem == 0x03)\r
             {\r
                 //打开心率检测\r
+#ifdef PPG_HX3695\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST);\r
+#elif defined PPG_VC9202\r
+                send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST);\r
+#endif\r
                 LOS_Msleep(500);\r
                 uint8_t databuf[4] = {0};\r
 #ifdef PPG_HX3695\r
@@ -1405,7 +1466,15 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 databuf[1] = (uint8_t)((ft_result.gr_data_final & 0x00FF0000) >> 16);\r
                 databuf[2] = (uint8_t)((ft_result.gr_data_final & 0x0000FF00) >> 8);\r
                 databuf[3] = (uint8_t)((ft_result.gr_data_final & 0x000000FF) >> 0);\r
+#elif defined PPG_VC9202\r
+                uint32_t ppg_data = vc9202_get_hr_ppg_data();\r
+                PRINT("ppg_data : %d \n",ppg_data);\r
+                databuf[0] = (uint8_t)((ppg_data & 0xFF000000) >> 24);\r
+                databuf[1] = (uint8_t)((ppg_data & 0x00FF0000) >> 16);\r
+                databuf[2] = (uint8_t)((ppg_data & 0x0000FF00) >> 8);\r
+                databuf[3] = (uint8_t)((ppg_data & 0x000000FF) >> 0);\r
 #endif\r
+\r
             send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);\r
 \r
             PRINT("%2X %2X %2X %2X \r\n",databuf[0],databuf[1],databuf[2],databuf[3]);\r
@@ -1419,32 +1488,51 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             } else if(testitem == 0x04)\r
             {\r
                 //打开血氧检测\r
+#ifdef PPG_HX3695\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST);\r
+#elif defined PPG_VC9202\r
+                send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST);\r
+#endif\r
                 LOS_Msleep(500);\r
-                uint8_t databuf[4] = {0};\r
+                uint8_t databuf[8] = {0};\r
 #ifdef PPG_HX3695\r
                 FT_RESULTS_t ft_result = hx3695_factroy_test(SINGLE_CHECK_TEST);\r
                 databuf[0] = (uint8_t)((ft_result.red_data_final & 0xFF000000) >> 24);\r
                 databuf[1] = (uint8_t)((ft_result.red_data_final & 0x00FF0000) >> 16);\r
                 databuf[2] = (uint8_t)((ft_result.red_data_final & 0x0000FF00) >> 8);\r
                 databuf[3] = (uint8_t)((ft_result.red_data_final & 0x000000FF) >> 0);\r
+#elif defined PPG_VC9202\r
+                uint32_t red_data = 0;\r
+                uint32_t ir_data = 9;\r
+                vc9202_get_spo2_ppg_data(&ir_data,&red_data);\r
+                PRINT("ir_data : %d ,red_data : %d \n",ir_data,red_data);\r
+                databuf[0] = (uint8_t)((ir_data & 0xFF000000) >> 24);\r
+                databuf[1] = (uint8_t)((ir_data & 0x00FF0000) >> 16);\r
+                databuf[2] = (uint8_t)((ir_data & 0x0000FF00) >> 8);\r
+                databuf[3] = (uint8_t)((ir_data & 0x000000FF) >> 0);\r
+\r
+                databuf[4] = (uint8_t)((red_data & 0xFF000000) >> 24);\r
+                databuf[5] = (uint8_t)((red_data & 0x00FF0000) >> 16);\r
+                databuf[6] = (uint8_t)((red_data & 0x0000FF00) >> 8);\r
+                databuf[7] = (uint8_t)((red_data & 0x000000FF) >> 0);\r
 #endif\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);\r
                 PRINT("%2X %2X %2X %2X \r\n",databuf[0],databuf[1],databuf[2],databuf[3]);\r
+                PRINT("%2X %2X %2X %2X \r\n",databuf[4],databuf[5],databuf[6],databuf[7]);\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                                     BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS,\r
                                     0x04,\r
                                     databuf,\r
-                                    4);\r
+                                    sizeof(databuf));\r
 \r
             } else if(testitem == 0x05)\r
             {\r
                 //灰卡测试\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_GRAYCARD_TEST);\r
                 LOS_Msleep(500);\r
-                uint8_t databuf[12] = {0};\r
 #ifdef PPG_HX3695\r
+                uint8_t databuf[12] = {0};\r
                 FT_RESULTS_t ft_result = hx3695_factroy_test(GRAY_CARD_TEST);\r
                 databuf[0] = (uint8_t)((ft_result.gr_data_final & 0xFF000000) >> 24);\r
                 databuf[1] = (uint8_t)((ft_result.gr_data_final & 0x00FF0000) >> 16);\r
@@ -1460,26 +1548,47 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 databuf[9] = (uint8_t)((ft_result.ir_data_final & 0x00FF0000) >> 16);\r
                 databuf[10] = (uint8_t)((ft_result.ir_data_final & 0x0000FF00) >> 8);\r
                 databuf[11] = (uint8_t)((ft_result.ir_data_final & 0x000000FF) >> 0);\r
-#endif\r
-                send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);\r
-                PRINT("%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\r\n",\r
-                databuf[0],databuf[1],databuf[2],databuf[3],\r
-                databuf[4],databuf[5],databuf[6],databuf[7],\r
-                databuf[8],databuf[9],databuf[10],databuf[11]\r
-                );\r
 \r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                    BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS,\r
+                    0x05,\r
+                    databuf,\r
+                    12);\r
+#elif defined PPG_VC9202\r
+                uint8_t databuf[8] = {0};\r
+                uint32_t apre_val = 0;\r
+                uint32_t aps_val = 9;\r
+                vc9202_get_graycard_data(&apre_val,&aps_val);\r
+                PRINT("apre_val : %d ,aps_val : %d \n",apre_val,aps_val);\r
+                databuf[0] = (uint8_t)((apre_val & 0xFF000000) >> 24);\r
+                databuf[1] = (uint8_t)((apre_val & 0x00FF0000) >> 16);\r
+                databuf[2] = (uint8_t)((apre_val & 0x0000FF00) >> 8);\r
+                databuf[3] = (uint8_t)((apre_val & 0x000000FF) >> 0);\r
+\r
+                databuf[4] = (uint8_t)((aps_val & 0xFF000000) >> 24);\r
+                databuf[5] = (uint8_t)((aps_val & 0x00FF0000) >> 16);\r
+                databuf[6] = (uint8_t)((aps_val & 0x0000FF00) >> 8);\r
+                databuf[7] = (uint8_t)((aps_val & 0x000000FF) >> 0);\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                                     BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS,\r
                                     0x05,\r
                                     databuf,\r
-                                    12);\r
+                                    8);\r
+#endif\r
+                send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);\r
+                // PRINT("%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\r\n",\r
+                // databuf[0],databuf[1],databuf[2],databuf[3],\r
+                // databuf[4],databuf[5],databuf[6],databuf[7],\r
+                // databuf[8],databuf[9],databuf[10],databuf[11]\r
+                // );\r
+\r
 \r
             } else if(testitem == 0x06)\r
             {\r
                 //漏光测试\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_LEAKLIGHT_TEST);\r
-                LOS_Msleep(200);\r
+                LOS_Msleep(500);\r
                 uint8_t databuf[12] = {0};\r
 #ifdef PPG_HX3695\r
                 FT_RESULTS_t ft_result = hx3695_factroy_test(LEAK_LIGHT_TEST);\r
@@ -1498,6 +1607,26 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 databuf[9] = (uint8_t)((ft_result.ir_data_final & 0x00FF0000) >> 16);\r
                 databuf[10] = (uint8_t)((ft_result.ir_data_final & 0x0000FF00) >> 8);\r
                 databuf[11] = (uint8_t)((ft_result.ir_data_final & 0x000000FF) >> 0);\r
+#elif defined PPG_VC9202\r
+                uint32_t led_cur = 0;\r
+                uint32_t apre_val = 0;\r
+                uint32_t aps_val = 9;\r
+                vc9202_get_leaklight_data(&led_cur,&apre_val,&aps_val);\r
+                PRINT("led_cur : %d ,apre_val : %d ,aps_val : %d \n",led_cur,apre_val,aps_val);\r
+                databuf[0] = (uint8_t)((led_cur & 0xFF000000) >> 24);\r
+                databuf[1] = (uint8_t)((led_cur & 0x00FF0000) >> 16);\r
+                databuf[2] = (uint8_t)((led_cur & 0x0000FF00) >> 8);\r
+                databuf[3] = (uint8_t)((led_cur & 0x000000FF) >> 0);\r
+\r
+                databuf[4] = (uint8_t)((apre_val & 0xFF000000) >> 24);\r
+                databuf[5] = (uint8_t)((apre_val & 0x00FF0000) >> 16);\r
+                databuf[6] = (uint8_t)((apre_val & 0x0000FF00) >> 8);\r
+                databuf[7] = (uint8_t)((apre_val & 0x000000FF) >> 0);\r
+\r
+                databuf[8] = (uint8_t)((aps_val & 0xFF000000) >> 24);\r
+                databuf[9] = (uint8_t)((aps_val & 0x00FF0000) >> 16);\r
+                databuf[10] = (uint8_t)((aps_val & 0x0000FF00) >> 8);\r
+                databuf[11] = (uint8_t)((aps_val & 0x000000FF) >> 0);\r
 #endif\r
                 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST);\r
 \r
@@ -1532,37 +1661,47 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             } else if(testitem == 0x02)\r
             {\r
                 //地磁sensor测试\r
-                float fAzimuth,fPitch,fRoll;\r
-                mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);\r
-                \r
-                uint8_t databuf[6] = {0};\r
+                float fAzimuth = 0;\r
+                do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK);\r
+                LOS_Msleep(500);\r
+                mmc5603_getdata(&fAzimuth);\r
+                do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK);\r
+                uint8_t databuf[2] = {0};\r
 \r
                 databuf[0] = (uint8_t)(((uint32_t)fAzimuth & 0xFF00) >> 8);\r
                 databuf[1] = (uint8_t)((uint32_t)fAzimuth & 0x00FF);\r
 \r
-                databuf[2] = (uint8_t)(((uint32_t)fPitch & 0xFF00) >> 8);\r
-                databuf[3] = (uint8_t)((uint32_t)fPitch & 0x00FF);\r
-\r
-                databuf[4] = (uint8_t)(((uint32_t)fRoll & 0xFF00) >> 8);\r
-                databuf[5] = (uint8_t)((uint32_t)fRoll & 0x00FF);\r
-\r
-                PRINT("%2X %2X %2X %2X %2X %2X\r\n",databuf[0],databuf[1],databuf[2],databuf[3],databuf[4],databuf[5]);\r
+                // PRINT("%2X %2X %2X %2X %2X %2X\r\n",databuf[0],databuf[1],databuf[2],databuf[3],databuf[4],databuf[5]);\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS,\r
                         0x02,\r
                         databuf,\r
-                        6);\r
+                        sizeof(databuf));\r
             }\r
 \r
             break;\r
 \r
         case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM:\r
-            if(testitem == 0x02)\r
+            if(testitem == 0x01)\r
+            {\r
+                //获取充电IC ID\r
+                uint8_t chip_id = 0;\r
+#ifdef ENABLE_HP4507\r
+                chip_id = hp4507_get_id();\r
+                PRINT("chip id = 0x%x\n",chip_id);\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM,\r
+                        0x01,\r
+                        &chip_id,\r
+                        1);\r
+            }\r
+            else if(testitem == 0x02)\r
             {\r
                 //获取充电状态\r
                 bool state;\r
-                state = uapi_get_charger_plug_status();\r
+                state = get_charge_stat();\r
                 uint8_t send_data[2] = {0};\r
                 send_data[1] = state;\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
@@ -1574,12 +1713,12 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             } else if(testitem == 0x03)\r
             {\r
                 //获取电量\r
-                uint8_t power;\r
-                battery_getvolpower(&power);\r
-\r
+                float voltage;\r
+                uint8_t power = battery_get_voltage(&voltage);\r
+                \r
                 uint8_t send_data[3] = {0};\r
                 send_data[2] = power & 0XFF;\r
-\r
+                PRINT("power : %d \n",power);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM,\r
                         0x03,\r
@@ -1590,13 +1729,13 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 //获取电压\r
                 float voltage;\r
                 uint16_t vol;\r
-                battery_getvoltage(&voltage);\r
+                battery_get_voltage(&voltage);\r
 \r
                 uint8_t send_data[3] = {0};\r
                 vol = voltage * 1000;\r
                 send_data[1] = (vol >> 8) ;\r
                 send_data[2] = vol;\r
-\r
+                PRINT("vol : %d \n",vol);\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM,\r
                         0x04,\r
@@ -1984,20 +2123,89 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
 \r
             if (testitem == 0x06)\r
             {\r
-                #ifdef FD230\r
-                \r
+                uint8_t send_data = 0x00;\r
+#ifdef FD230\r
                 uapi_hfp_connect_();\r
                 LOS_Msleep(500);\r
                 uapi_a2dp_snk_connect_();\r
-                #endif\r
-\r
-                uint8_t send_data = 0x00;\r
+#endif\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
                         BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER,\r
                         0x03,\r
                         &send_data,\r
                         1);\r
-               \r
+            }\r
+\r
+            break;\r
+\r
+        case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP:\r
+\r
+            if (testitem == 0x01)\r
+            {\r
+                uint8_t send_data = 0x00;\r
+#ifdef ENABLE_LQBP002TA\r
+                send_data = lqbp002ta_get_id();\r
+                PRINT("send_data : 0x%x \n",send_data);\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP,\r
+                        0x01,\r
+                        &send_data,\r
+                        1);\r
+            } else if(testitem == 0x02)\r
+            {\r
+                //获取温度\r
+                uint8_t databuf[4] = {0};\r
+                float temp = 0;\r
+#ifdef ENABLE_LQBP002TA\r
+                do_lqbp_service_check_msg(LQBP_SERVICE_CMD_START_CHECK);\r
+                LOS_Msleep(100);\r
+                temp = lqbp002ta_get_temp(); \r
+                do_lqbp_service_check_msg(LQBP_SERVICE_CMD_STOP_CHECK);  \r
+#endif\r
+                PRINT("temp : %f\n",temp);\r
+\r
+                int integer_part = (int)temp;\r
+\r
+                int decimal_part = (int)((temp - integer_part) * 100);\r
+\r
+                PRINT("integer_part : %d , decimal_part : %d\n",integer_part,decimal_part);\r
+\r
+                databuf[0] = (uint8_t)((integer_part >> 8) & 0xFF);\r
+                databuf[1] = (uint8_t)(integer_part & 0xFF);\r
+\r
+                databuf[2] = (uint8_t)((decimal_part >> 8) & 0xFF);\r
+                databuf[3] = (uint8_t)(decimal_part & 0xFF);\r
+\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP,\r
+                        0x02,\r
+                        databuf,\r
+                        sizeof(databuf));\r
+            } else if(testitem == 0x03)\r
+            {\r
+                //获取气压\r
+                uint8_t databuf[4] = {0};\r
+                int pressure = 0;\r
+#ifdef ENABLE_LQBP002TA\r
+                do_lqbp_service_check_msg(LQBP_SERVICE_CMD_START_CHECK);\r
+                LOS_Msleep(100);\r
+                pressure = (int)lqbp002ta_get_pressure();  \r
+                do_lqbp_service_check_msg(LQBP_SERVICE_CMD_STOP_CHECK);  \r
+#endif\r
+                PRINT("pressure : %d\n",pressure);\r
+\r
+                // memcpy(databuf, &pressure, sizeof(pressure));\r
+                databuf[0] = (uint8_t)((pressure & 0xFF000000) >> 24);\r
+                databuf[1] = (uint8_t)((pressure & 0x00FF0000) >> 16);\r
+                databuf[2] = (uint8_t)((pressure & 0x0000FF00) >> 8);\r
+                databuf[3] = (uint8_t)((pressure & 0x000000FF) >> 0);\r
+\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP,\r
+                        0x03,\r
+                        databuf,\r
+                        sizeof(databuf));\r
             }\r
 \r
             break;\r
@@ -2039,7 +2247,7 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size)
                 \r
             printf("crc16 0x%04X vs 0x%04X\n",crc16,crc16_2);\r
 \r
-            if( crc16 == crc16_2) //校验通过,开始正式解析\r
+            // if( crc16 == crc16_2) //校验通过,开始正式解析\r
             {\r
                 if(factorytest_mode_flag == 0 && header.submod != BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE)\r
                     return ERRCODE_FAIL;\r
index f4eae3b..b8198b4 100644 (file)
@@ -93,6 +93,8 @@ extern "C" {
 #define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CAT1  0x1A
 //软件测试 子模式ID  SPEAKER
 #define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER  0x1B
+//软件测试 子模式ID  气压计
+#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP  0x1C
 //软件测试 子模式ID  通讯录
 #define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CONTACTS  0x30
 //软件测试 子模式ID  支付宝
index 6db2a03..052976c 100644 (file)
@@ -264,11 +264,11 @@ static void custom_cmd_service_check_task(void const *arg)
         case CUSTOM_CMD_MSG_TYPE_TP_TEST:
             if(mail.data[0] == 1)
             {
-                //uapi_set_screen_on_api();
-                //uapi_factorytest_enter_test_view(1);
-                //uapi_factorytest_enter_test_tp_view();
-                HandleUpdatelcdMode(2);
-                //uapi_factorytest_hide_test_tp_button();
+                uapi_set_screen_on_api();
+                uapi_factorytest_enter_test_view(1);
+                uapi_factorytest_enter_test_tp_view();
+                // HandleUpdatelcdMode(2);
+                uapi_factorytest_hide_test_tp_button();
             }
             else
             {
index 9e12fc3..5d81c5c 100644 (file)
@@ -92,7 +92,12 @@ void system_init_uart(void){}
 #ifdef FD230
 #include "bluetooth/include/BluetoothModelC.h"
 #endif
-
+#ifdef PPG_VC9202
+#include "vc9202_user.h"
+#endif
+#ifdef TPTYPE_CST86XX
+#include "cst86xx_touch1.h"
+#endif
 errcode_t uapi_create_osThread_custom(app_task_definition_t *task_cfg)
 {
     if (task_cfg==NULL)
@@ -1960,9 +1965,16 @@ void get_tp_info(int16_t *x,int16_t *y)
     }
 }
 
+#else
+void get_tp_info(int16_t *x,int16_t *y)
+{
+    
+}
+#endif
 
 void touch_getid(uint16_t *id)
 {
+#ifdef TPTYPE_FT6X46
     ext_errno ret;
     uint8_t chip_id[2] = { 0 };
     /*get chip id*/
@@ -1980,19 +1992,11 @@ void touch_getid(uint16_t *id)
             //sprintf(id,"0x%02x%02x",  chip_id[0], chip_id[1]);
         }
     }
-}
-
-#else
-void get_tp_info(int16_t *x,int16_t *y)
-{
-    
-}
-void touch_getid(uint16_t *id)
-{
-
-}
+#elif defined TPTYPE_CST86XX
+    cst86xx_get_chip_id(id);
 
 #endif
+}
 
 void touch_getstate(void)
 {
@@ -2006,38 +2010,15 @@ void touch_getstate(void)
 #include "mag_service.h"
 void mmc5603_getid(unsigned char *id)
 {
+    mmc5603_poweron();
     CUSTOM_MMC5603_GETID(id);
+    mmc5603_poweroff();
 }
 
-void mmc5603_getdata(float *fAzimuth,float *fPitch,float *fRoll)
+void mmc5603_getdata(float *fAzimuth)
 {
-    mmc5603_check();
     *fAzimuth = mag_service_get_fAzimuth();
-    *fPitch = mag_service_get_fPitch();
-    *fRoll = mag_service_get_fRoll();
-    PRINT("Azimuth : %f, fPitch : %f , fRoll : %f \r\n",*fAzimuth,*fPitch,*fRoll);
-}
-
-
-#include "battery_hal.h"
-void charge_getstate(void)
-{
-    if(get_charge_stat())
-        PRINT("charging\r\n");
-    else
-        PRINT("uncharged\r\n");
-}
-
-
-void battery_getvolpower(uint8_t *power)
-{
-    float voltage;
-    *power = battery_get_voltage(&voltage);
-}
-
-void battery_getvoltage(float *voltage)
-{
-    battery_get_voltage(voltage);
+    PRINT("Azimuth : %f\n",*fAzimuth);
 }
 
 
@@ -2059,27 +2040,25 @@ void flash_erase(void)
 
 
 
-void get_gsensor_single(uint8_t *databuf)
-{
+void get_gsensor_single(uint8_t *databuf) {
     gsenson_t t;
     get_gsonsen_xyz(&t);
-    uint16_t x,y,z;
-    x = t.x*2048;
-    y = t.y*2048;
-    z = t.z*2048;
+    int16_t x, y, z;
+    x = t.x * 2048;
+    y = t.y * 2048;
+    z = t.z * 2048;
 
     databuf[0] = (uint8_t)((x & 0xFF00) >> 8);
     databuf[1] = (uint8_t)(x & 0x00FF);
 
     databuf[2] = (uint8_t)((y & 0xFF00) >> 8);
     databuf[3] = (uint8_t)(y & 0x00FF);
-
     databuf[4] = (uint8_t)((z & 0xFF00) >> 8);
     databuf[5] = (uint8_t)(z & 0x00FF);
 
     PRINT("x : %.2f, y : %.2f, z : %.2f \r\n",t.x,t.y,t.z);
-    PRINT("GSENSOR: %2X %2X %2X %2X %2X %2X\r\n",databuf[0],databuf[1],databuf[2],databuf[3],databuf[4],databuf[5]);
-
+    PRINT("x : %d, y : %d, z : %d \r\n", x, y, z);
+    PRINT("GSENSOR: %02X %02X %02X %02X %02X %02X\r\n", databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]);
 }
 
 void gsensor_get_single_data(gsenson_t *t)
@@ -2467,6 +2446,10 @@ void uapi_ppg_get_id(uint8_t *chip_id)
 #ifdef PPG_HX3695
     hx3695_get_id(chip_id);
 #endif
+#ifdef PPG_VC9202
+    uint8_t id = 0;
+    vc9202_usr_get_chip_id(chip_id,&id);
+#endif
 }
 
 #include "hal_i2c.h"
index 1bff5fd..f119a67 100644 (file)
@@ -183,14 +183,7 @@ void touch_getstate(void);
 
 //获取MMC5063 ID
 void mmc5603_getid(unsigned char *id);
-void mmc5603_getdata(float *fAzimuth,float *fPitch,float *fRoll);
-
-//获取充电状态
-void charge_getstate(void);
-
-//获取电压
-void battery_getvoltage(float *voltage);
-void battery_getvolpower(uint8_t *power);
+void mmc5603_getdata(float *fAzimuth);
 
 //flash整片擦除
 void flash_getid(uint32_t *id);
index b4b1865..0f1f7af 100644 (file)
@@ -366,8 +366,8 @@ static uint32_t custom_mmc5603_getdata(uint8_t *para, uint32_t paraLen, char *st
 
     UNUSED(strCommonCmd);
 
-    float fAzimuth,fPitch,fRoll;
-    mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);
+    // float fAzimuth,fPitch,fRoll;
+    // mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);
 
     return ERRCODE_SUCC;
 }