#include #include #include #include "aos/kernel.h" #include "sensor_drv_api.h" #include "sensor_hal.h" #define LTR659_I2C_SLAVE_ADDR 0x23 #define LTR659_SW_RESET 0x80 #define LTR659_PS_CONTR 0x81 /* PS operation mode */ #define LTR659_PS_LED 0x82 /* LED pulse freq, current duty, peak current */ #define LTR659_PS_N_PULSES 0x83 /* PS number of pulses */ #define LTR659_PS_MEAS_RATE 0x84 /* measurement rate*/ #define LTR659_PART_ID 0x86 #define LTR659_MANUFAC_ID 0x87 #define LTR659_PS_STATUS 0x8C #define LTR659_PS_DATA_0 0x8D #define LTR659_PS_DATA_1 0x8E #define LTR659_INTERRUPT 0x8F #define LTR659_PS_THRES_UP_0 0x90 /* PS interrupt upper threshold, lower byte */ #define LTR659_PS_THRES_UP_1 0x91 /* PS interrupt upper threshold, upper byte */ #define LTR659_PS_THRES_LOW_0 0x92 /* PS interrupt lower threshold, lower byte */ #define LTR659_PS_THRES_LOW_1 0x93 /* PS interrupt lower threshold, upper byte */ #define LTR659_PS_OFFSET_1 0x94 /* PS offset, upper byte */ #define LTR659_PS_OFFSET_0 0x95 /* PS offset, lower byte */ #define LTR659_INTR_PRST 0x9E /* PS interrupt persist setting */ #define LTR659_ADDR_TRANS(n) ((n) << 1) #define LTR659_I2C_ADDR LTR659_ADDR_TRANS(LTR659_I2C_SLAVE_ADDR) #define LTR659_PART_ID_VAL 0x92 #define LTR659_MANUFAC_ID_VAL 0x05 #define LTR659_SW_RESET_REG_SW_RESET__POS (1) #define LTR659_SW_RESET_REG_SW_RESET__MSK (0x02) #define LTR659_SW_RESET_REG_SW_RESET__REG (LTR659_SW_RESET) #define LTR659_PS_CONTR_REG_PS_MODE__POS (0) #define LTR659_PS_CONTR_REG_PS_MODE__MSK (0x03) #define LTR659_PS_CONTR_REG_PS_MODE__REG (LTR659_PS_CONTR) #define LTR659_PS_CONTR_REG_PS_GAIN__POS (2) #define LTR659_PS_CONTR_REG_PS_GAIN__MSK (0x0C) #define LTR659_PS_CONTR_REG_PS_GAIN__REG (LTR659_PS_CONTR) #define LTR659_PS_CONTR_REG_PS_SAT_IND_EN__POS (5) #define LTR659_PS_CONTR_REG_PS_SAT_IND_EN__MSK (0x20) #define LTR659_PS_CONTR_REG_PS_SAT_IND_EN__REG (LTR659_PS_CONTR) #define LTR659_PS_LED_REG_LED_CURR__POS (0) #define LTR659_PS_LED_REG_LED_CURR__MSK (0x07) #define LTR659_PS_LED_REG_LED_CURR__REG (LTR659_PS_LED) #define LTR659_PS_LED_REG_LED_DUTY__POS (3) #define LTR659_PS_LED_REG_LED_DUTY__MSK (0x18) #define LTR659_PS_LED_REG_LED_DUTY__REG (LTR659_PS_LED) #define LTR659_PS_LED_REG_LED_PULSE__POS (5) #define LTR659_PS_LED_REG_LED_PULSE__MSK (0xE0) #define LTR659_PS_LED_REG_LED_PULSE__REG (LTR659_PS_LED) #define LTR659_PS_N_PULSES_REG_PULSES__POS (0) #define LTR659_PS_N_PULSES_REG_PULSES__MSK (0x0F) #define LTR659_PS_N_PULSES_REG_PULSES__REG (LTR659_PS_N_PULSES) #define LTR659_PS_MEAS_RATE_REG_MEAS_RPT_RATE__POS (0) #define LTR659_PS_MEAS_RATE_REG_MEAS_RPT_RATE__MSK (0x0F) #define LTR659_PS_MEAS_RATE_REG_MEAS_RPT_RATE__REG (LTR659_PS_MEAS_RATE) #define LTR659_PS_STATUS_REG_PS_DATA_STATUS__POS (0) #define LTR659_PS_STATUS_REG_PS_DATA_STATUS__MSK (0x01) #define LTR659_PS_STATUS_REG_PS_DATA_STATUS__REG (LTR659_PS_STATUS) #define LTR659_PS_STATUS_REG_PS_INT_STATUS__POS (1) #define LTR659_PS_STATUS_REG_PS_INT_STATUS__MSK (0x02) #define LTR659_PS_STATUS_REG_PS_INT_STATUS__REG (LTR659_PS_STATUS) #define LTR659_INTERRUPT_REG_INT_MODE__POS (0) #define LTR659_INTERRUPT_REG_INT_MODE__MSK (0x01) #define LTR659_INTERRUPT_REG_INT_MODE__REG (LTR659_INTERRUPT) #define LTR659_INTERRUPT_REG_INT_POLARITY__POS (2) #define LTR659_INTERRUPT_REG_INT_POLARITY__MSK (0x04) #define LTR659_INTERRUPT_REG_INT_POLARITY__REG (LTR659_INTERRUPT) #define LTR659_INTR_PRST_REG_PS_PERSIST__POS (4) #define LTR659_INTR_PRST_REG_PS_PERSIST__MSK (0xF0) #define LTR659_INTR_PRST_REG_PS_PERSIST__REG (LTR659_INTR_PRST) #define LTR659_GET_BITSLICE(regvar, bitname) ((regvar & LTR659_##bitname##__MSK) >> LTR659_##bitname##__POS) #define LTR659_SET_BITSLICE(regvar, bitname, val) ((regvar & ~LTR659_##bitname##__MSK) | ((val<present = (((uint32_t) (reg_data[1] & 0x07) << 8) | reg_data[0]); pdata->timestamp = aos_now_ms(); return (int) size; } static int drv_ps_liteon_ltr659_write(const void *buf, size_t len) { (void) buf; (void) len; return 0; } static int drv_ps_liteon_ltr659_ioctl(int cmd, unsigned long arg) { int ret = 0; switch (cmd) { case SENSOR_IOCTL_SET_POWER: { ret = drv_ps_liteon_ltr659_set_power_mode(<r659_ctx, arg); if (unlikely(ret)) { return -1; } } break; case SENSOR_IOCTL_GET_INFO: { /* fill the dev info here */ dev_sensor_info_t *info = (dev_sensor_info_t *) arg; info->vendor = DEV_SENSOR_VENDOR_LITEON; info->model = "LTR659"; info->unit = cm; } break; default: return -1; } LOG("%s %s successfully \n", SENSOR_STR, __func__); return 0; } int drv_ps_liteon_ltr659_init(void) { int ret = 0; sensor_obj_t sensor_ps; memset(&sensor_ps, 0, sizeof(sensor_ps)); if (!g_init_bitwise) { ret = drv_ps_liteon_ltr659_validate_id(<r659_ctx, LTR659_PART_ID_VAL, LTR659_MANUFAC_ID_VAL); if (unlikely(ret)) { return -1; } } if (!g_init_bitwise) { /* fill the sensor_ps obj parameters here */ sensor_ps.tag = TAG_DEV_PS; sensor_ps.path = dev_ps_path; sensor_ps.io_port = I2C_PORT; sensor_ps.mode = DEV_POLLING; sensor_ps.power = DEV_POWER_OFF; sensor_ps.open = drv_ps_liteon_ltr659_open; sensor_ps.close = drv_ps_liteon_ltr659_close; sensor_ps.read = drv_ps_liteon_ltr659_read; sensor_ps.write = drv_ps_liteon_ltr659_write; sensor_ps.ioctl = drv_ps_liteon_ltr659_ioctl; sensor_ps.irq_handle = drv_ps_liteon_ltr659_irq_handle; ret = sensor_create_obj(&sensor_ps); if (unlikely(ret)) { return -1; } ret = drv_ps_liteon_ltr659_set_default_config(<r659_ctx); if (unlikely(ret)) { return -1; } g_init_bitwise = 1; } LOG("%s %s successfully \n", SENSOR_STR, __func__); return 0; } SENSOR_DRV_ADD(drv_ps_liteon_ltr659_init);