blob: eb7acb953dc2689f3978b041bbf2d5014589a560 [file]
/*
* Copyright (c) 2025 Konrad Sikora
* Copyright (c) 2025 TOKITA Hiroshi
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_LITEON_LTR55X_LTR55X_H_
#define ZEPHYR_DRIVERS_SENSOR_LITEON_LTR55X_LTR55X_H_
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/util.h>
/* Register addresses */
#define LTR55X_ALS_CONTR 0x80
#define LTR55X_PS_CONTR 0x81
#define LTR55X_PS_LED 0x82
#define LTR55X_PS_N_PULSES 0x83
#define LTR55X_PS_MEAS_RATE 0x84
#define LTR55X_MEAS_RATE 0x85
#define LTR55X_PART_ID 0x86
#define LTR55X_MANUFAC_ID 0x87
#define LTR55X_ALS_DATA_CH1_0 0x88
#define LTR55X_ALS_DATA_CH1_1 0x89
#define LTR55X_ALS_DATA_CH0_0 0x8A
#define LTR55X_ALS_DATA_CH0_1 0x8B
#define LTR55X_ALS_PS_STATUS 0x8C
#define LTR55X_PS_DATA0 0x8D
#define LTR55X_PS_DATA1 0x8E
#define LTR55X_INTERRUPT 0x8F
#define LTR55X_PS_THRES_UP_0 0x90
#define LTR55X_PS_THRES_UP_1 0x91
#define LTR55X_PS_THRES_LOW_0 0x92
#define LTR55X_PS_THRES_LOW_1 0x93
#define LTR55X_PS_OFFSET_1 0x94
#define LTR55X_PS_OFFSET_0 0x95
#define LTR55X_ALS_THRES_UP_0 0x97
#define LTR55X_ALS_THRES_UP_1 0x98
#define LTR55X_ALS_THRES_LOW_0 0x99
#define LTR55X_ALS_THRES_LOW_1 0x9A
#define LTR55X_INTERRUPT_PERSIST 0x9E
/* Bit masks and shifts for ALS_CONTR register */
#define LTR55X_ALS_CONTR_MODE_MASK BIT(0)
#define LTR55X_ALS_CONTR_MODE_SHIFT 0
#define LTR55X_ALS_CONTR_SW_RESET_MASK BIT(1)
#define LTR55X_ALS_CONTR_SW_RESET_SHIFT 1
#define LTR55X_ALS_CONTR_GAIN_MASK GENMASK(4, 2)
#define LTR55X_ALS_CONTR_GAIN_SHIFT 2
/* Bit masks and shifts for MEAS_RATE register */
#define LTR55X_MEAS_RATE_REPEAT_MASK GENMASK(2, 0)
#define LTR55X_MEAS_RATE_REPEAT_SHIFT 0
#define LTR55X_MEAS_RATE_INT_TIME_MASK GENMASK(5, 3)
#define LTR55X_MEAS_RATE_INT_TIME_SHIFT 3
/* Bit masks and shift for PS_CONTR register */
#define LTR55X_PS_CONTR_MODE_MASK GENMASK(1, 0)
#define LTR55X_PS_CONTR_MODE_SHIFT 0
#define LTR55X_PS_CONTR_SAT_IND_MASK BIT(5)
#define LTR55X_PS_CONTR_SAT_IND_SHIFT 5
/* Bit masks and shift for PS_LED register */
#define LTR55X_PS_LED_PULSE_FREQ_MASK GENMASK(7, 5)
#define LTR55X_PS_LED_PULSE_FREQ_SHIFT 5
#define LTR55X_PS_LED_DUTY_CYCLE_MASK GENMASK(4, 3)
#define LTR55X_PS_LED_DUTY_CYCLE_SHIFT 3
#define LTR55X_PS_LED_CURRENT_MASK GENMASK(2, 0)
#define LTR55X_PS_LED_CURRENT_SHIFT 0
/* Bit masks and shift for PS_N_PULSES register */
#define LTR55X_PS_N_PULSES_COUNT_MASK GENMASK(3, 0)
#define LTR55X_PS_N_PULSES_COUNT_SHIFT 0
/* Bit masks and shift for PS_MEAS_RATE register */
#define LTR55X_PS_MEAS_RATE_RATE_MASK GENMASK(3, 0)
#define LTR55X_PS_MEAS_RATE_RATE_SHIFT 0
/* Bit masks and shifts for PART_ID register */
#define LTR55X_PART_ID_REVISION_MASK GENMASK(3, 0)
#define LTR55X_PART_ID_REVISION_SHIFT 0
#define LTR55X_PART_ID_NUMBER_MASK GENMASK(7, 4)
#define LTR55X_PART_ID_NUMBER_SHIFT 4
/* Bit masks and shifts for MANUFAC_ID register */
#define LTR55X_MANUFAC_ID_IDENTIFICATION_MASK GENMASK(7, 0)
#define LTR55X_MANUFAC_ID_IDENTIFICATION_SHIFT 0
/* Bit masks and shifts for ALS_STATUS register */
#define LTR55X_ALS_PS_STATUS_PS_DATA_STATUS_MASK BIT(0)
#define LTR55X_ALS_PS_STATUS_PS_DATA_STATUS_SHIFT 0
#define LTR55X_ALS_PS_STATUS_PS_INTR_STATUS_MASK BIT(1)
#define LTR55X_ALS_PS_STATUS_PS_INTR_STATUS_SHIFT 1
#define LTR55X_ALS_PS_STATUS_ALS_DATA_STATUS_MASK BIT(2)
#define LTR55X_ALS_PS_STATUS_ALS_DATA_STATUS_SHIFT 2
#define LTR55X_ALS_PS_STATUS_ALS_INTR_STATUS_MASK BIT(3)
#define LTR55X_ALS_PS_STATUS_ALS_INTR_STATUS_SHIFT 3
#define LTR55X_ALS_PS_STATUS_ALS_GAIN_MASK GENMASK(6, 4)
#define LTR55X_ALS_PS_STATUS_ALS_GAIN_SHIFT 4
#define LTR55X_ALS_PS_STATUS_ALS_DATA_VALID_MASK BIT(7)
#define LTR55X_ALS_PS_STATUS_ALS_DATA_VALID_SHIFT 7
/* Bit masks for LTR55X-specific registers */
#define LTR55X_INTERRUPT_PS_MASK BIT(0)
#define LTR55X_INTERRUPT_PS_SHIFT 0
#define LTR55X_INTERRUPT_ALS_MASK BIT(1)
#define LTR55X_INTERRUPT_ALS_SHIFT 1
#define LTR55X_INTERRUPT_POLARITY_MASK BIT(2)
#define LTR55X_INTERRUPT_POLARITY_SHIFT 2
#define LTR55X_INTERRUPT_PERSIST_ALS_MASK GENMASK(3, 0)
#define LTR55X_INTERRUPT_PERSIST_ALS_SHIFT 0
#define LTR55X_INTERRUPT_PERSIST_PS_MASK GENMASK(7, 4)
#define LTR55X_INTERRUPT_PERSIST_PS_SHIFT 4
#define LTR55X_PS_DATA_MASK 0x07FF
#define LTR55X_PS_DATA_MAX LTR55X_PS_DATA_MASK
#define LTR55X_ALS_CONTR_MODE_ACTIVE 0x1
#define LTR55X_PS_CONTR_MODE_ACTIVE 0x02
/* Expected sensor IDs */
#define LTR329_PART_ID_VALUE 0xA0
#define LTR55X_PART_ID_VALUE 0x92
#define LTR55X_MANUFACTURER_ID_VALUE 0x05
/* Timing definitions - refer to LTR-329ALS-01 datasheet */
#define LTR55X_INIT_STARTUP_MS 100
#define LTR55X_WAKEUP_FROM_STANDBY_MS 10
/* Convert als-gain value in device-tree to register values */
#define LTR55X_ALS_GAIN_VALUE_1 0
#define LTR55X_ALS_GAIN_VALUE_2 1
#define LTR55X_ALS_GAIN_VALUE_4 2
#define LTR55X_ALS_GAIN_VALUE_8 3
#define LTR55X_ALS_GAIN_VALUE_48 6
#define LTR55X_ALS_GAIN_VALUE_96 7
/* Convert ps-measurement value in device-tree to register values */
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_50 0
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_70 1
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_100 2
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_200 3
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_500 4
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_1000 5
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_2000 6
#define LTR55X_PS_MEASUREMENT_RATE_VALUE_10 8
/* Macros to set and get register fields */
#define LTR55X_REG_SET(reg, field, value) \
(((value) << LTR55X_##reg##_##field##_SHIFT) & LTR55X_##reg##_##field##_MASK)
#define LTR55X_REG_GET(reg, field, value) \
(((value) & LTR55X_##reg##_##field##_MASK) >> LTR55X_##reg##_##field##_SHIFT)
struct ltr55x_config {
const struct i2c_dt_spec bus;
uint8_t part_id;
uint8_t als_gain;
uint8_t als_integration_time;
uint8_t als_measurement_rate;
uint8_t ps_led_pulse_freq;
uint8_t ps_led_duty_cycle;
uint8_t ps_led_current;
uint8_t ps_n_pulses;
uint8_t ps_measurement_rate;
bool ps_saturation_indicator;
};
struct ltr55x_data {
uint16_t als_ch0;
uint16_t als_ch1;
uint16_t ps_ch0;
uint16_t ps_offset;
uint16_t ps_upper_threshold;
uint16_t ps_lower_threshold;
bool proximity_state;
};
#endif /* ZEPHYR_DRIVERS_SENSOR_LITEON_LTR55X_LTR55X_H_ */