KT24-1110_65E-HA-651B/apps/common/device/gSensor/da230.c

394 lines
8.1 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#include "gSensor/EPMotion.h"
#include "gSensor/da230.h"
#include "gSensor/gSensor_manage.h"
#include "app_config.h"
#if TCFG_DA230_EN
#define LOG_TAG "[DA230]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
static u8 da230_init_ok = 0;
static u8 tap_data = 0;
static u8 tap_start = 0;
static u8 event_ocur = 0;
static u8 da230_is_idle = 1;
void da230_set_idle_flag(u8 flag)
{
da230_is_idle = flag;
}
u32 da230_register_read(u8 addr, u8 *data)
{
_gravity_sensor_get_ndata(I2C_ADDR_DA230_R, addr, data, 1);
return 0;
}
s8_m da230_register_write(u8_m addr, u8_m data)
{
gravity_sensor_command(I2C_ADDR_DA230_W, addr, data);
return 0;
}
s8_m da230_read_nbyte_data(u8_m addr, u8_m *data, u8_m len)
{
_gravity_sensor_get_ndata(I2C_ADDR_DA230_R, addr, data, len);
return 0;
}
s8_m da230_register_mask_write(unsigned char addr, unsigned char mask, unsigned char data)
{
int res = 0;
unsigned char tmp_data;
/* iic_readn(I2C_ADDR_DA230_R, addr, &tmp_data, 1); */
da230_read_nbyte_data(addr, &tmp_data, 1);
tmp_data &= ~mask;
tmp_data |= data & mask;
/* iic_write(I2C_ADDR_DA230_W, addr, &tmp_data, 1); */
da230_register_write(addr, tmp_data);
return 1;
}
s8_m handleEvent(EPMotion_EVENT event, u8 data)
{
event_ocur = 0;
tap_start = 0;
da230_set_idle_flag(1);
log_info("da230_set_idle_flag:1");
switch (event) {
case TEVENT_TAP_NOTIFY: {
tap_data = data;
printf("*******DATA:%d \n", data);
}
break;
default:
break;
}
return 0;
}
u32 da230_register_write_bit(u8 addr, u8 start, u8 len, u8 data)
{
u32 res = 0;
u8 tmp_data;
res = da230_register_read(addr, &tmp_data);
if (res) {
return res;
}
SFR(tmp_data, start, len, data);
res = da230_register_write(addr, tmp_data);
return res;
}
u32 da230_close_i2c_pullup(void)
{
u32 res = 0;
res |= da230_register_write(0x7f, 0x83);
res |= da230_register_write(0x7f, 0x69);
res |= da230_register_write(0x7f, 0xBD);
/**********将0x8f bit1写0去掉da230内部i2c弱上拉*********/
res |= da230_register_write_bit(0x8f, 1, 1, 0);
return res;
}
#if 0
u32 da230_read_block_data(u8 base_addr, u8 count, u8 *data)
{
u32 i = 0;
for (i = 0; i < count; i++) {
if (da230_register_read(base_addr + i, (data + i))) {
return -1;
}
}
return count;
}
u32 da230_register_read_continuously(u8 addr, u8 count, u8 *data)
{
u32 res = 0;
res = (count == da230_read_block_data(addr, count, data)) ? 0 : 1;
return res;
}
u32 da230_open_step_counter(void)
{
u32 res = 0;
res |= da230_register_write(NSA_REG_STEP_CONGIF1, 0x01);
res |= da230_register_write(NSA_REG_STEP_CONGIF2, 0x62);
res |= da230_register_write(NSA_REG_STEP_CONGIF3, 0x46);
res |= da230_register_write(NSA_REG_STEP_CONGIF4, 0x32);
res |= da230_register_write(NSA_REG_STEP_FILTER, 0xa2);
return res;
}
u16 da230_get_step(void)
{
u8 tmp_data[4] = {0};
u16 f_step = 0;
if (da230_register_read_continuously(NSA_REG_STEPS_MSB, 4, tmp_data) == 0) {
if (0x40 == tmp_data[2] && 0x07 == tmp_data[3]) {
f_step = ((tmp_data[0] << 8 | tmp_data[1])) / 2;
}
}
return (f_step);
}
u32 da230_close_step_counter(void)
{
u32 res = 0;
res = da230_register_write(NSA_REG_STEP_FILTER, 0x22);
return res;
}
u32 da230_register_write_bit(u8 addr, u8 start, u8 len, u8 data)
{
u32 res = 0;
u8 tmp_data;
res = da230_register_read(addr, &tmp_data);
if (res) {
return res;
}
SFR(tmp_data, start, len, data);
res = da230_register_write(addr, tmp_data);
return res;
}
u32 da230_open_i2c_pullup(void)
{
u32 res = 0;
res |= da230_register_write(0x7f, 0x83);
res |= da230_register_write(0x7f, 0x69);
res |= da230_register_write(0x7f, 0xBD);
/**********将0x8f bit1写1开启da230内部i2c弱上拉*********/
res |= da230_register_write_bit(0x8f, 1, 1, 1);
return res;
}
#endif
struct EPMotion_op_s ops_handle = {
{PIN_ONE, PIN_LEVEL_LOW},
handleEvent,
{da230_read_nbyte_data, da230_register_write},
printf
};
u8 da230_init(void)
{
u8 data = 0;
JL_PORTB->DIR &= ~BIT(2);
JL_PORTB->DIE |= BIT(2);
JL_PORTB->OUT |= BIT(2);
da230_register_read(NSA_REG_WHO_AM_I, &data);
if (data != 0x13) {
log_e("da230 init err1!!!!!!!\n");
return -1;
}
if (EPMotion_Init(&ops_handle)) {
log_e("da230 init err2!!!!!!!\n");
return -1;
}
EPMotion_Set_Debug_level(DEBUG_ERR);
EPMotion_Tap_Set_Parma(0x0d, LATCHED_100MS, 0x00); //0x05~0x1f
//EPMotion_D_Tap_Set_Filter(1, 130);
EPMotion_M_Tap_Set_Dur(70, 500);
// EPMotion_M_Tap_Set_Dur(60,150);
da230_register_mask_write(0x10, 0xe0, 0xc0);
EPMotion_Control(M_TAP_T, ENABLE_T);
// EPMotion_Tap_Set_Parma(0x08,LATCHED_25MS,0x00); //0x05~0x1f
//close i2c pullup
da230_close_i2c_pullup();
da230_register_mask_write(0x8f, 0x02, 0x00);
da230_init_ok = 1;
log_info("da230 init success!!!\n");
return 0;
}
u32 da230_set_enable(u8 enable)
{
u32 res = 0;
if (da230_init_ok) {
if (enable) {
EPMotion_Chip_Power_On();
} else {
EPMotion_Chip_Power_Off();
}
}
return res;
}
void da230_read_XYZ(short *x, short *y, short *z)
{
if (da230_init_ok) {
EPMotion_Chip_Read_XYZ(x, y, z);
}
}
#if 0
u16 da230_open_interrupt(u16 num)
{
u16 res = 0;
res = da230_register_write(NSA_REG_INTERRUPT_SETTINGS1, 0x87);
res = da230_register_write(NSA_REG_ACTIVE_THRESHOLD, 0x05);
switch (num) {
case 0:
res = da230_register_write(NSA_REG_INTERRUPT_MAPPING1, 0x04);
break;
case 1:
res = da230_register_write(NSA_REG_INTERRUPT_MAPPING3, 0x04);
break;
}
return res;
}
#endif
void da230_check_tap_int(void)
{
static int count = 0;
if (tap_start) {
if (event_ocur == 1) {
count = 0;
}
if ((count % 5) == 0) {
//printf("====process event %d\r\n",event_ocur);
// gpio_direction_output(IO_PORT_DM, 1);
EPMotion_Process_Data(event_ocur);
// gpio_direction_output(IO_PORT_DM, 0);
}
count++;
if (count >= 300000) {
count = 0;
}
}
}
void da230_low_energy_mode(void)
{
da230_register_write(0x11, 0x04);
}
void da230_int_io_detect(u8 int_io_status)
{
static u8 int_io_status_old = 0;
/* u8 int_io_status = 0; */
if (da230_init_ok) {
/* int_io_status = gpio_read(INT_IO); */
if ((int_io_status) && (int_io_status_old == 0)) {
log_e("da230_int_io_detect\n");
if (tap_start == 0) {
tap_start = 1;
da230_set_idle_flag(0);
log_info("da230_set_idle_flag:0");
}
event_ocur = 1;
putchar('A');
} else {
event_ocur = 0;
}
int_io_status_old = int_io_status;
da230_check_tap_int();
}
}
static char da230_check_event()
{
u8 tmp_tap_data = 0;
tmp_tap_data = tap_data;
if (tap_data) {
tap_data = 0;
printf("tmp_tap_data = %d\n", tmp_tap_data);
}
return tmp_tap_data;
/* return EPMotion_Process_Data(); */
}
void da230_ctl(u8 cmd, void *arg)
{
switch (cmd) {
case GSENSOR_RESET_INT:
EPMotion_Reset_Tap_INT();
break;
case GSENSOR_RESUME_INT:
EPMotion_Resume_Tap_INT();
break;
case GSENSOR_INT_DET:
da230_int_io_detect(*(u8 *)arg);
break;
default:
break;
}
}
static u8 da230_idle_query(void)
{
return da230_is_idle;
}
REGISTER_GRAVITY_SENSOR(gSensor) = {
.logo = "da230",
.gravity_sensor_init = da230_init,
.gravity_sensor_check = da230_check_event,
.gravity_sensor_ctl = da230_ctl,
};
REGISTER_LP_TARGET(da230_lp_target) = {
.name = "da230",
.is_idle = da230_idle_query,
};
#endif