BUTTON1_LONGPRESS_9S_OVER,
BUTTON1_INVALID,
-#ifdef BOARD_U8
BUTTON2_START,
BUTTON2_PRESS,
BUTTON2_CLICKUP,
BUTTON2_LONGPRESS_8S_OVER,
BUTTON2_LONGPRESS_9S_OVER,
BUTTON2_INVALID,
-#endif
-
+
BUTTON_BUTT
} event_button_t;
#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
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
#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
'PPG_VC9202',
#'ROTARYENCODER_HX3507',
'ROTARYENCODER_U8',
- 'FUNC_KEY2',
'NANDFLASH_DS35X',
'BLE_INSTRUCT',
'FACTORYTEST_SERVICE',
'SUPPORT_HID_SERVICE',
'SUPPORT_BAIDU_MAP',
'CFG_FLASH_SIZE=8',
- # 'SUPPORT_BLE_SERVICE',
+ 'SUPPORT_BLE_SERVICE',
# 'FD230',
#"MEM_CHECK",
#'ENABLE_WEBSOCKET',
'TPTYPE_CST86XX',
'TEST_4G_UI',
'TEST_GPS_UI',
- 'NANDFLASH_F35UQA'
+ 'NANDFLASH_F35UQA',
+ #'BLE_INSTRUCT',
+ 'FACTORYTEST_SERVICE',
],
'ram_component': [
#'baidumapsdk',
"slip",
"cat1_service",
"audio_manager",
- # "CustomUIcomponentTool",
+ #"CustomUIcomponentTool",
"custom_utils",
"custom_utilscpp",
"custom_config",
"gnss_sample",
# "acc_sensor",
"batterry_service",
- # "bleservice",
- # "ppgBleService",
- # "blemoder",
- # "factorytest_service",
- # "hid_service",
+ "bleservice",
+ "ppgBleService",
+ #"blemoder",
+ "factorytest_service",
+ "hid_service",
"producttest",
"cywee"
],
{ 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)
{ 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
{ 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
// { 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
};
/**
* @}
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
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
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
\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
#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"
{
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();
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]);
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;
buttonconfig.ALIGN=TEXT_ALIGNMENT_LEFT;
button[2]=SetTheButton_ext(buttonconfig);
testBUTTONScrollView->Add(button[2]);
+#endif
+
add_subdirectory_if_exist(barometer)
add_subdirectory_if_exist(charge)
add_subdirectory_if_exist(charge/hp4570)
+add_subdirectory_if_exist(gyro)
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
//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
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
\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
{\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
* @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
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
// 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
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
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
--- /dev/null
+#===============================================================================
+# @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
--- /dev/null
+/*
+ * @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;
+}
--- /dev/null
+/*
+ * @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
--- /dev/null
+
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+/******************************************************************\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, ®Data);\r
+ regData = 0x73;\r
+ SH5001_write(SH5001_ADDRESS, 0x00, 1, ®Data);\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, ®Data);\r
+\r
+ delay_ms(2);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0x2B, 1, ®Data);\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, ®Data);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0xD2, 1, ®Data);\r
+\r
+ regData = 0x6B;\r
+ SH5001_write(SH5001_ADDRESS, 0xD1, 1, ®Data);\r
+\r
+ regData = 0x02;\r
+ SH5001_write(SH5001_ADDRESS, 0xD5, 1, ®Data);\r
+ delay_ms(5);\r
+\r
+ regData = 0x68;\r
+ SH5001_write(SH5001_ADDRESS, 0xD1, 1, ®Data);\r
+ delay_ms(2);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0xD5, 1, ®Data);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0x30, 1, ®Data);\r
+\r
+ regData = 0x08;\r
+ SH5001_write(SH5001_ADDRESS, 0x30, 1, ®Data);\r
+\r
+ regData = 0xE0;\r
+ SH5001_write(SH5001_ADDRESS, 0xD8, 1, ®Data);\r
+\r
+ delay_ms(5);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0xD8, 1, ®Data);\r
+\r
+ regData = 0x00;\r
+ SH5001_write(SH5001_ADDRESS, 0x30, 1, ®Data);\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, ®Data);\r
+ regData = 0x12;\r
+ SH5001_write(SH5001_ADDRESS, 0xCE, 1, ®Data);\r
+ regData = 0x12;\r
+ SH5001_write(SH5001_ADDRESS, 0xCF, 1, ®Data);\r
+\r
+ delay_ms(1);\r
+\r
+ regData = 0x2;\r
+ SH5001_write(SH5001_ADDRESS, 0xCD, 1, ®Data);\r
+ regData = 0x2;\r
+ SH5001_write(SH5001_ADDRESS, 0xCE, 1, ®Data);\r
+ regData = 0x2;\r
+ SH5001_write(SH5001_ADDRESS, 0xCF, 1, ®Data);\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, ®Data);\r
+ regData = (regData & 0xFCU) | accFilter | accByPass;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, ®Data);\r
+ \r
+ // set acc ODR range\r
+ SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, ®Data);\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, ®Data);\r
+ \r
+ // set acc low pass filter cut-off frequency\r
+ SH5001_read(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\r
+ regData = (regData & 0xF0U) | accCutOffFreq;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\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, ®Data);\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, ®Data);\r
+ regData = (regData & 0x7CU) | gyroFilter | gyroByPass | gyroOnOff;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, ®Data);\r
+ \r
+ // set gyro ODR\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, ®Data);\r
+ regData = (regData & 0xF0U) | gyroODR;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, ®Data);\r
+ \r
+ // set gyro low pass filter cut-off frequency\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, ®Data);\r
+ regData = (regData & 0xFCU) | gyroCutOffFreq;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, ®Data);\r
+ \r
+\r
+ // set gyro range\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF3, 1, ®Data);\r
+ regData = (regData & 0xF8U) | gyroRange;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF3, 1, ®Data); \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, ®Data);\r
+ regData = (regData & 0x7CU) | gyroFilter | gyroByPass;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, ®Data);\r
+\r
+ // set gyro ODR Range\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, ®Data);\r
+ regData = (regData & 0x80U) | gyroODR | gyroRange;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF1, 1, ®Data);\r
+\r
+ // set gyro low pass filter cut-off frequency\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, ®Data);\r
+ regData = (regData & 0xF0U) | gyroCutOffFreq;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF2, 1, ®Data);\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, ®Data);\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, ®Data);\r
+ regData = (regData & 0x9FU) | timeStampODR | timeStampEnable;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_TIMESTAMP_CONF, 1, ®Data);\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, ®Data);\r
+ regData = (regData & 0xF8U) | tempODR | tempEnable;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_TEMP_CONF0, 1, ®Data);\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, ®Data[0]);\r
+ tempref[0] = ((unsigned short int)(regData[1] & 0x0FU) << 8U) | regData[0];\r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_TEMP_ZL, 2, ®Data[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, ®Data[0]);\r
+ regData[0] = (intEnable == SH5001_INT_EN) \\r
+ ? (regData[0] & 0xBFU) : (regData[0] | 0x40U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, ®Data[0]);\r
+ } \r
+ \r
+ if(intType & 0xFF3FU)\r
+ { \r
+ // enable or disable INT\r
+ SH5001_read(SH5001_ADDRESS, SH5001_INT_ENABLE0, 2, ®Data[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, ®Data[0]);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INT_ENABLE0, 1, ®Data[0]);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INT_ENABLE1, 1, ®Data[1]);\r
+ \r
+ // mapping interrupt to INT0 pin or INT1 pin\r
+ SH5001_read(SH5001_ADDRESS, SH5001_INT_PIN_MAP0, 2, ®Data[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, ®Data[0]);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INT_PIN_MAP1, 1, ®Data[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, ®Data);\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, ®Data);\r
+\r
+ if(intLatch == SH5001_INT_NO_LATCH)\r
+ {\r
+ regData = intTime;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INT_LIMIT, 1, ®Data);\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, ®Data);\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, ®Data); \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, ®Data[0]);\r
+ regData[0] |= (regData[0] & 0xC0U) | (orientTheta & 0x3FU); \r
+ SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF0, 1, ®Data[0]);\r
+\r
+ SH5001_read(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, ®Data[0]);\r
+ regData[0] |= (regData[0] & 0xF0U) | (orientBlockMode & 0x0CU) | (orientMode & 0x03U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, ®Data[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, ®Data[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, ®Data[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, ®Data[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, ®Data); \r
+ regData = (regData & 0xF3U) | SH5001_ORIENT_BLOCK_MODE1;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ORIEN_INTCONF1, 1, ®Data); \r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_FLAT_INT_CONF, 1, ®Data); \r
+ regData = (flatTimeTH & 0xC0U) | (flatTanHeta2 & 0x3FU);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FLAT_INT_CONF, 1, ®Data); \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, ®Data[0]); \r
+ regData[0] |= (regData[0] & 0x8FU) | actEnDisIntX | actEnDisIntY | actEnDisIntZ;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, ®Data[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, ®Data[0]);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_THRESHOLDL, 1, ®Data[0]);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_THRESHOLDH, 1, ®Data[1]);\r
+\r
+ regData[0] = actTimeNum;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INT_TIME, 1, ®Data[0]);\r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, ®Data[0]); \r
+ regData[0] |= (regData[0] & 0x7EU) | actLinkStatus | actIntClear;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, ®Data[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, ®Data); \r
+ regData |= (regData & 0xF8U) | inactEnDisIntX | inactEnDisIntY | inactEnDisIntZ;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_CONF, 1, ®Data); \r
+ \r
+ regData = (unsigned char)inactIntThres;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_THRESHOLDL, 1, ®Data);\r
+ regData = (unsigned char)(inactIntThres >> 8U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_THRESHOLDH, 1, ®Data); \r
+ \r
+ regData = inactTimeMs;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_TIME, 1, ®Data); \r
+ \r
+ /*\r
+ regData = (unsigned char)inactG1;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_1G_REFL, 1, ®Data);\r
+ regData = (unsigned char)(inactG1 >> 8U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_INACT_INT_1G_REFH, 1, ®Data); \r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, ®Data); \r
+ regData |= (regData & 0x7EU) | inactLinkStatus | inactIntClear;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, ®Data); \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, ®Data); \r
+ regData |= (regData & 0xF1U) | tapEnDisIntX | tapEnDisIntY | tapEnDisIntZ;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACT_INACT_INT_LINK, 1, ®Data); \r
+ \r
+ regData = (unsigned char)tapIntThres; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDL, 1, ®Data);\r
+ SH5001_read(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDH, 1, ®Data);\r
+ regData = ((unsigned char)(tapIntThres >> 8U) & 0x1FU) | (regData & 0xE0U); \r
+ SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_THRESHOLDH, 1, ®Data);\r
+ \r
+ regData = tapTimeMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_DURATION, 1, ®Data); \r
+ \r
+ regData = tapWaitTimeMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_TAP_INT_LATENCY, 1, ®Data); \r
+\r
+ regData = tapWaitTimeWindowMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_DTAP_INT_WINDOW, 1, ®Data); \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, ®Data[0]); \r
+\r
+ regData[0] |= (unsigned char)((smdBlockTimeS & 0xF0U) << 4U) | (smdProofTimeS & 0xF0U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, ®Data[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, ®Data[0]); \r
+ regData[0] |= (regData[0] & 0x0FU) | highGEnDisIntX | highGEnDisIntY | highGEnDisIntZ | highGEnDisIntAll;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, ®Data[0]); \r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_HIGHG_INT_THRESHOLDL, 2, ®Data[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, ®Data[0]); \r
+ \r
+ regData[0] = highGTimeMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_TIME, 1, ®Data[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, ®Data[0]); \r
+ regData[0] |= (regData[0] & 0xFEU) | lowGEnDisIntAll;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_HIGHG_INT_CONF, 1, ®Data[0]); \r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_LOWG_INT_THRESHOLDL, 2, ®Data[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, ®Data[0]); \r
+ \r
+ regData[0] = lowGTimeMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_LOWG_INT_TIME, 1, ®Data[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, ®Data); \r
+ \r
+ regData = freeFallTimeMs; \r
+ SH5001_write(SH5001_ADDRESS, SH5001_FREEFALL_INT_TIME, 1, ®Data); \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, ®Data[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, ®Data); \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, ®Data); \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, ®Data); \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, ®Data);\r
+ regData &= 0x7F;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, ®Data);\r
+ \r
+ regData = fifoMode & 0x03;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, ®Data);\r
+}\r
+\r
+void SH5001_FIFO_Reset(void)\r
+{\r
+ unsigned char regData = 0;\r
+\r
+ SH5001_read(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, ®Data);\r
+ regData |= 0x80;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF0, 1, ®Data);\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, ®Data); \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, ®Data);\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, ®Data);\r
+\r
+ regData = (unsigned char)fifoMode;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF3, 1, ®Data);\r
+ \r
+ regData = (unsigned char)fifoWaterMarkLevel;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_FIFO_CONF1, 1, ®Data); \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, ®Data[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, ®Data);\r
+ regData |= 0x80U;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ regData &= 0x7FU;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data); \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, ®Data);\r
+ regData = (regData & 0xC0U) | (mi2cODR & 0x30U) | mi2cFreq;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF1, 1, ®Data); \r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ regData = (regData & 0xBFU) | mi2cReadMode;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data); \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, ®Data);\r
+ regData = (regData & 0xBFU) | mi2cReadMode;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ \r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CMD0, 1, ®Data);\r
+ regData |= (mi2cSlaveAddr << 1U);\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CMD0, 1, ®Data);\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, ®Data);\r
+ regData = (regData & 0xFCU) | 0x02U;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ \r
+ // wait write-operation to end\r
+ while(i++ < 20U)\r
+ { \r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\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, ®Data);\r
+ if((regData & 0x40U) == 0)\r
+ { \r
+ //Master I2C enable, read-operation\r
+ regData |= 0x03U;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ }\r
+ \r
+ // wait read-operation to end\r
+ while(i++ < 20U)\r
+ { \r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ if(regData & 0x30U)\r
+ break;\r
+ } \r
+\r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_CONF0, 1, ®Data);\r
+ if((regData & 0x30U) == SH5001_MI2C_SUCCESS)\r
+ {\r
+ SH5001_read(SH5001_ADDRESS, SH5001_MI2C_RD, 1, ®Data);\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, ®Data); \r
+ regData = (regData & 0xDFU) | spiInterfaceMode;\r
+ #endif\r
+ unsigned char regData = spiInterfaceMode;\r
+\r
+ SH5001_write(SH5001_ADDRESS, SH5001_SPI_CONF, 1, ®Data);\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, ®Data); \r
+ regData = (regData & 0x7FU) | i2cInterfaceEnDis;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_I2C_CONF, 1, ®Data);\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, ®Data); \r
+ regData = (regData & 0xF8U) | i2cReadLoopMode;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_I2C_CONF, 1, ®Data);\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, ®Data);\r
+ regData = (regData & 0xEFU) | oisSpiInterfaceEnDis;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_OIS_SPI_CONF, 1, ®Data);\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, ®Data);\r
+ regData = regData & 0x7F;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\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, ®_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, ®Data);\r
+ regData = regData | 0x80;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\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, ®_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, ®Data);\r
+ regData = regData & 0x7F;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\r
+\r
+ regData = (storeAccODR & 0xF0) | accODR;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF1, 1, ®Data);\r
+ for(i = 0; i < SH5001_POWMODE_REG_NUM; i++)\r
+ {\r
+ SH5001_write(SH5001_ADDRESS, reg_addr[i], 1, ®_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, ®_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, ®Data);\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, ®Data);\r
+ regData = regData & 0x7F;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF2, 1, ®Data);\r
+\r
+ SH5001_read(SH5001_ADDRESS, 0xBD, 1, ®Data);\r
+ regData = (regData & 0x7F);\r
+ SH5001_write(SH5001_ADDRESS, 0xBD, 1, ®Data);\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, ®Data);\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, ®Data);\r
+ regData &= 0xFE;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, ®Data);\r
+ regData |= 0x1;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_ACC_CONF0, 1, ®Data);\r
+\r
+\r
+ //gyro\r
+ SH5001_read(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, ®Data);\r
+ regData &= 0xFE;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, ®Data);\r
+ regData |= 0x1;\r
+ SH5001_write(SH5001_ADDRESS, SH5001_GYRO_CONF0, 1, ®Data);\r
+}\r
+\r
+static void SH5001_OSC_FREQ(void)\r
+{\r
+ unsigned char regData = 0;\r
+\r
+ SH5001_read(SH5001_ADDRESS, 0xDA, 1, ®Data);\r
+ if((regData & 0x07) != 0x07)\r
+ {\r
+ regData |= 0x07;\r
+ SH5001_write(SH5001_ADDRESS, 0xDA, 1, ®Data);\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, ®Data); \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, ®Back[i]);\r
+ }\r
+\r
+ for(i=0; i<SH5001_ACC_SELFTEST_REGNUM; i++)\r
+ {\r
+ SH5001_write(SH5001_ADDRESS, regAddr[i], 1, ®Init[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, ®Back[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, ®Back[i]);\r
+ }\r
+\r
+ for(i=0; i<SH5001_GYRO_SELFTEST_REGNUM; i++)\r
+ {\r
+ SH5001_write(SH5001_ADDRESS, regAddr[i], 1, ®Init[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, ®Back[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, ®Data);\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, ®Data);\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, ®BackS1[i]);\r
+ }\r
+\r
+ for(i=0; i<SH5001_GYRO_ADC_S1_REGNUM; i++)\r
+ {\r
+ SH5001_write(SH5001_ADDRESS, regAddrS1[i], 1, ®InitS1[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, ®InitS2[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, ®BackS1[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
--- /dev/null
+#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
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
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
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 )
#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 )
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)
* @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:
*
#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);
* @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
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
}\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
*/\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
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
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
/* 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
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
{\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
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
#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
#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
*/\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
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
{\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
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
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
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
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
/* 根据佩戴状态添加对应的处理代码 */\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
}\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
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
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
* @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
*/
#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 逆时针
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);
{
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)
{
* 获取表冠的数据结果接口函数
* @param NULL
*/
-int16_t crown_get_crown_result(void)
+int16_t crown_get_result(void)
{
int16_t resulttemp;
resulttemp=crown_result;
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;
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;
}
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);
+ }
+
}
{
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
* @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
*/
--- /dev/null
+#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
--- /dev/null
+/*
+ * @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
static int16_t stand_still = 1; //静止标志 1 静止,0 转动
/*----------------------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-------------------------------*/
-int16_t get_stand_still(void)
+int16_t hx3507_get_stand_still(void)
{
return stand_still;
}
* 获取表冠的数据结果接口函数
* @param NULL
*/
-int16_t get_crown_result(void)
+int16_t hx3507_get_crown_result(void)
{
int16_t resulttemp;
resulttemp=crown_result;
+/*
+ * @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, 南京天易合芯电子有限公司
*
//把读出的数据转换为大概角度函数
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_
* @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
*/
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 )
{
--- /dev/null
+/*
+ * @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;
+}
--- /dev/null
+/*
+ * @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
--- /dev/null
+/*
+ * @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, ®Addr, 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, ®StartAddr, 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, ®Data, 1,MIXO_OTS_I2C_BUS);
+}
+
--- /dev/null
+/*
+ * 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_
--- /dev/null
+#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;
+}
+
--- /dev/null
+/*
+ * 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_
#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"
#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();
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;
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;
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);
* @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
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
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
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
return;\r
}\r
uapi_get_timestampe_ss(¤t_time);\r
- mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);\r
+ mmc5603_getdata(&fAzimuth);\r
if(fAzimuth < 0)\r
{\r
aging_t.mag_error++;\r
\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
//打开马达\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
//关闭马达\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
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
{\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
&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
//获取 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
} 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
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
} 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
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
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
} 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
} 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
//获取电压\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
\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
\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
#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 支付宝
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
{
#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)
}
}
+#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*/
//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)
{
#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);
}
-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)
#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"
//获取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);
UNUSED(strCommonCmd);
- float fAzimuth,fPitch,fRoll;
- mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);
+ // float fAzimuth,fPitch,fRoll;
+ // mmc5603_getdata(&fAzimuth,&fPitch,&fRoll);
return ERRCODE_SUCC;
}