Files
99_7018_lmx/apps/common/device/gSensor/STK8321.c
2025-10-29 13:10:02 +08:00

142 lines
3.7 KiB
C

#include "gSensor/STK8321.h"
#include "gSensor/gSensor_manage.h"
#include "app_config.h"
#if TCFG_STK8321_EN
static u8 stk8321_timeout_start = 0;
u8 STK8321_Read(u8 addr)
{
u8 data = 0;
_gravity_sensor_get_ndata(I2C_ADDR_STK8321_R, addr, &data, 1);
return data;
}
void STK8321_Write(u8 addr, u8 data)
{
//g_sensor_write(G_SlaveAddr,addr,data);
gravity_sensor_command(I2C_ADDR_STK8321_W, addr, data);
}
u8 STK8321_init(void)
{
u8 k = 0, init_cnt = 10;
u8 chip_id = 0;
printf("\n###############>> [ init STK8321 start] <<################\n");
do {
chip_id = STK8321_Read(0x00);
printf("\n STK8321 ID = [%x]\n", chip_id);
init_cnt--;
} while ((chip_id != 0x86) && (init_cnt));
STK8321_Write(0x14, 0xB6); //software reset
delay(1000);
if (chip_id != 0x86) {
return -1;
}
STK8321_Write(0x14, 0xB6); //software reset
delay(100);
// mode settings
STK8321_Write(0x11, 0x00); //active mode
STK8321_Write(0x0F, 0x08); //range = +-8g
STK8321_Write(0x10, 0x0D); //BW = 250Hz or ODR = 500Hz
STK8321_Write(0x34, 0x04); //Enable I2C WatchDog
// INT mode
STK8321_Write(0x20, 0x00); //INT1 and INT2 active high
STK8321_Write(0x21, 0x8F); //latched & clear
// slope settings
STK8321_Write(0x16, 0x04); // enable slope on Z-axis
STK8321_Write(0x19, 0x01); // map sig-motion to INT 1
STK8321_Write(0x27, 0x01); // The actual number of samples SLP_DUR[1:0]+1
STK8321_Write(0x28, 0x25); // SLP_THD[7:0]*15.64_mg
STK8321_Write(0x2A, 0x06); //Enable significant and any-motion interrupt
STK8321_Write(0x29, 0x05); //skip_time 1LSB=20ms
STK8321_Write(0x2B, 0x0A); //proof_time 1LSB=20ms
printf("\n###############>> [ init STK8321 end ] <<################\n");
return 0;
}
static char STK8321_check_event()
{
static u16 timeout_cnt = 125; //需要等250ms
u8 click_cnt = 0;
if (stk8321_timeout_start) {
if (timeout_cnt) {
timeout_cnt --;
} else {
u8 RegReadValue = 0;
g_printf("stk8321_timeout");
RegReadValue = STK8321_Read(0x09);
if ((RegReadValue & 0x04) == 0x00) {
g_printf("Double Tap");
click_cnt = 2;
} else if ((RegReadValue & 0x04) == 0x04) {
g_printf("Triple Tap");
click_cnt = 3;
} else {
g_printf("NO Tap");
click_cnt = 0;
}
STK8321_Write(0x2A, 0x02);
STK8321_Write(0x21, 0x8F);
stk8321_timeout_start = 0;
timeout_cnt = 125;
}
}
return click_cnt;
}
void STK8321_int_io_detect(u8 int_io_status)
{
static u8 int_io_status_old;
if (!stk8321_timeout_start) {
if (!(int_io_status) && (int_io_status_old == 1)) {
g_printf("STK8321_int_io_detect\n");
stk8321_timeout_start = 1;
STK8321_Write(0x2A, 0x04);
STK8321_Write(0x21, 0x8F);
}
int_io_status_old = int_io_status;
}
}
void STK8321_ctl(u8 cmd, void *arg)
{
switch (cmd) {
case GSENSOR_RESET_INT:
break;
case GSENSOR_RESUME_INT:
break;
case GSENSOR_INT_DET:
STK8321_int_io_detect(*(u8 *)arg);
break;
default:
break;
}
}
static u8 STK8321_idle_query(void)
{
return !stk8321_timeout_start;
}
REGISTER_GRAVITY_SENSOR(gSensor) = {
.logo = "STK8321",
.gravity_sensor_init = STK8321_init,
.gravity_sensor_check = STK8321_check_event,
.gravity_sensor_ctl = STK8321_ctl,
};
REGISTER_LP_TARGET(da230_lp_target) = {
.name = "STK8321",
.is_idle = STK8321_idle_query,
};
#endif